From 497a0c7c9d30fe60763f54982b96b2cec8fa649a Mon Sep 17 00:00:00 2001 From: Bibiko Date: Fri, 29 Oct 2010 12:50:12 +0000 Subject: =?UTF-8?q?=E2=80=A2=20Field=20Editor=20sheet=20-=20fixed=20some?= =?UTF-8?q?=20inconsistencies=20regarding=20window=20-=20first=20humble=20?= =?UTF-8?q?trials=20to=20get=20rid=20of=20the=20Find=20Panel=20inside=20th?= =?UTF-8?q?e=20editTextView=20--=20it=20seems=20that=20the=20problem=20is?= =?UTF-8?q?=20that=20NSTextFinder=20internally=20validates=20all=20buttons?= =?UTF-8?q?=20against=20[[NSApp=20mainWindow]=20firstResponder]=20=3D=3D?= =?UTF-8?q?=20NSTextView=20;=20in=20our=20case=20the=20[[NSApp=20mainWindo?= =?UTF-8?q?w]=20firstResponder]=20is=20the=20calling=20SPCopyTable=20objec?= =?UTF-8?q?t=20--=20set=20a=20possible=20visible=20Find=20Panel=20to=20[te?= =?UTF-8?q?xtFinderPanel=20setWorksWhenModal:YES]=20inside=20the=20modal?= =?UTF-8?q?=20session=20;=20by=20doing=20so=20the=20controls=20are=20avail?= =?UTF-8?q?able=20via=20keyboard=20and=20mouse=20but=20NOT=20the=20buttons?= =?UTF-8?q?=20--=20work=20on=20it=20will=20be=20continued?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Interfaces/English.lproj/FieldEditorSheet.xib | 14 ++++++-- Source/SPFieldEditorController.h | 2 ++ Source/SPFieldEditorController.m | 48 +++++++++++++++++++-------- 3 files changed, 48 insertions(+), 16 deletions(-) diff --git a/Interfaces/English.lproj/FieldEditorSheet.xib b/Interfaces/English.lproj/FieldEditorSheet.xib index cb389882..a46ac1a8 100644 --- a/Interfaces/English.lproj/FieldEditorSheet.xib +++ b/Interfaces/English.lproj/FieldEditorSheet.xib @@ -45,7 +45,7 @@ {{364, 183}, {667, 428}} 544735232 Field Editor - NSPanel + NSWindow View @@ -516,7 +516,7 @@ 1 - 4067 + 12259 0 @@ -4893,6 +4893,14 @@ 528 + + + initialFirstResponder + + + + 529 + @@ -7248,7 +7256,7 @@ - 528 + 529 diff --git a/Source/SPFieldEditorController.h b/Source/SPFieldEditorController.h index 12342fea..af914f82 100644 --- a/Source/SPFieldEditorController.h +++ b/Source/SPFieldEditorController.h @@ -130,6 +130,8 @@ IBOutlet NSTextField *bitSheetBitLabel48; IBOutlet NSTextField *bitSheetBitLabel56; + id usedSheet; + id sheetEditData; BOOL editSheetWillBeInitialized; BOOL _isBlob; diff --git a/Source/SPFieldEditorController.m b/Source/SPFieldEditorController.m index 16823fed..56f2407d 100644 --- a/Source/SPFieldEditorController.m +++ b/Source/SPFieldEditorController.m @@ -29,6 +29,7 @@ #import "SPDataCellFormatter.h" #import "SPTooltip.h" #import "SPGeometryDataView.h" +#include @implementation SPFieldEditorController @@ -196,7 +197,7 @@ isObjectBlob:(BOOL)isFieldBlob isEditable:(BOOL)isEditable withWindow:(NSWindow *)theWindow { - id usedSheet; + usedSheet = nil; _isEditable = isEditable; @@ -304,11 +305,11 @@ // Set window's min size since no segment and quicklook buttons are hidden if (_isBlob || _isBINARY) { - [editSheet setFrameAutosaveName:@"SPFieldEditorBlobSheet"]; - [editSheet setMinSize:NSMakeSize(560, 200)]; + [usedSheet setFrameAutosaveName:@"SPFieldEditorBlobSheet"]; + [usedSheet setMinSize:NSMakeSize(560, 200)]; } else { - [editSheet setFrameAutosaveName:@"SPFieldEditorTextSheet"]; - [editSheet setMinSize:NSMakeSize(340, 150)]; + [usedSheet setFrameAutosaveName:@"SPFieldEditorTextSheet"]; + [usedSheet setMinSize:NSMakeSize(340, 150)]; } [editTextView setEditable:_isEditable]; @@ -398,9 +399,9 @@ // Set focus if(image == nil || _isGeometry) - [editSheet makeFirstResponder:editTextView]; + [usedSheet makeFirstResponder:editTextView]; else - [editSheet makeFirstResponder:editImage]; + [usedSheet makeFirstResponder:editImage]; [stringValue release], stringValue = nil; } @@ -415,8 +416,14 @@ NSModalSession session = [NSApp beginModalSessionForWindow:usedSheet]; NSInteger cycleCounter = 0; BOOL doGroupDueToChars = NO; + BOOL findPanelIsOpen = NO; + + id textFinder = [objc_getClass("NSTextFinder") sharedTextFinder]; + id textFinderPanel = nil; + for (;;) { + // Break the run loop if editSheet was closed if ([NSApp runModalSession:session] != NSRunContinuesResponse || ![usedSheet isVisible]) @@ -426,6 +433,16 @@ [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]; + + if([[textFinder findPanel:NO] isVisible]) { + textFinderPanel = [textFinder findPanel:NO]; + [textFinderPanel setWorksWhenModal:YES]; + // [textFinderPanel setLevel:NSDockWindowLevel]; + findPanelIsOpen = YES; + } else { + findPanelIsOpen = NO; + } + // Allow undo grouping if user typed a ' ' (for word level undo) // or a RETURN but not for each char due to writing speed if([[NSApp currentEvent] type] == NSKeyDown @@ -466,6 +483,11 @@ // Remember spell cheecker status [prefs setBool:[editTextView isContinuousSpellCheckingEnabled] forKey:SPBlobTextEditorSpellCheckingEnabled]; + // Close findPanel for convenience + if(findPanelIsOpen && textFinderPanel) { + [textFinderPanel close]; + } + return ( editSheetReturnCode && _isEditable ) ? (_isGeometry) ? [editTextView string] : sheetEditData : nil; } @@ -535,7 +557,7 @@ { [[NSOpenPanel openPanel] beginSheetForDirectory:nil file:@"" - modalForWindow:[self window] + modalForWindow:usedSheet modalDelegate:self didEndSelector:@selector(openPanelDidEnd:returnCode:contextInfo:) contextInfo:NULL]; } @@ -552,7 +574,7 @@ [editImage setHidden:YES]; [hexTextView setHidden:YES]; [hexTextScrollView setHidden:YES]; - [[self window] makeFirstResponder:editTextView]; + [usedSheet makeFirstResponder:editTextView]; break; case 1: // image [editTextView setHidden:YES]; @@ -560,10 +582,10 @@ [editImage setHidden:NO]; [hexTextView setHidden:YES]; [hexTextScrollView setHidden:YES]; - [[self window] makeFirstResponder:editImage]; + [usedSheet makeFirstResponder:editImage]; break; case 2: // hex - load on demand - [[self window] makeFirstResponder:hexTextView]; + [usedSheet makeFirstResponder:hexTextView]; if([[hexTextView string] isEqualToString:@""]) { [editSheetProgressBar startAnimation:self]; if([sheetEditData isKindOfClass:[NSData class]]) { @@ -602,7 +624,7 @@ [panel beginSheetForDirectory:nil file:fileDefault - modalForWindow:[self window] + modalForWindow:usedSheet modalDelegate:self didEndSelector:@selector(savePanelDidEnd:returnCode:contextInfo:) contextInfo:NULL]; @@ -1191,7 +1213,7 @@ */ - (IBAction)bitSheetSelectBit0:(id)sender { - [[self window] makeFirstResponder:[self valueForKeyPath:@"bitSheetBitButton0"]]; + [usedSheet makeFirstResponder:[self valueForKeyPath:@"bitSheetBitButton0"]]; } /** -- cgit v1.2.3