From 28734c995b3f97d8eb50610cfd6d7ad62697d2cb Mon Sep 17 00:00:00 2001 From: rowanbeentje Date: Thu, 30 Aug 2012 00:28:56 +0000 Subject: - Fix the SPSplitView helper to correctly restore focus to focussed responders in an expanding view at the end of the animation - On initial launch, and when changing database, ensure that the window focus is set to the table list or the table list filter or the table list as appropriate. This addresses Issue #1437. - Clean up some logic --- Source/SPDatabaseDocument.h | 1 - Source/SPDatabaseDocument.m | 53 ++++++++++++++++++--------------------------- Source/SPSplitView.m | 2 +- Source/SPTablesList.h | 1 + Source/SPTablesList.m | 41 +++++++++++++++-------------------- 5 files changed, 41 insertions(+), 57 deletions(-) diff --git a/Source/SPDatabaseDocument.h b/Source/SPDatabaseDocument.h index f84e8826..73a322d7 100644 --- a/Source/SPDatabaseDocument.h +++ b/Source/SPDatabaseDocument.h @@ -377,7 +377,6 @@ - (IBAction)saveCreateSyntax:(id)sender; - (IBAction)copyCreateTableSyntaxFromSheet:(id)sender; - (IBAction)focusOnTableContentFilter:(id)sender; -- (IBAction)focusOnTableListFilter:(id)sender; - (IBAction)export:(id)sender; - (IBAction)exportSelectedTablesAs:(id)sender; diff --git a/Source/SPDatabaseDocument.m b/Source/SPDatabaseDocument.m index c296fba6..9bcb9733 100644 --- a/Source/SPDatabaseDocument.m +++ b/Source/SPDatabaseDocument.m @@ -535,10 +535,6 @@ static NSString *SPRenameDatabaseAction = @"SPRenameDatabase"; queryEditorInitString = nil; } - // Set focus to table list filter field if visible - // otherwise set focus to Table List view - [self focusOnTableListFilter:self]; - if (spfSession != nil) { // Restore vertical split view divider for tables' list and right view (Structure, Content, etc.) @@ -578,6 +574,10 @@ static NSString *SPRenameDatabaseAction = @"SPRenameDatabase"; } if ([self database]) [self detectDatabaseEncoding]; + + // Set focus to table list filter field if visible + // otherwise set focus to Table List view + [[tablesListInstance onMainThread] makeTableListFilterHaveFocus]; #endif #ifdef SP_REFACTOR /* glue */ if ( delegate && [delegate respondsToSelector:@selector(databaseDocumentDidConnect:)] ) @@ -2297,14 +2297,6 @@ static NSString *SPRenameDatabaseAction = @"SPRenameDatabase"; [tableContentInstance performSelector:@selector(makeContentFilterHaveFocus) withObject:nil afterDelay:0.1]; } -/** - * Makes the tables list filter field the first responder. - */ -- (IBAction)focusOnTableListFilter:(id)sender -{ - [[tablesListInstance onMainThread] performSelector:@selector(makeTableListFilterHaveFocus) withObject:nil afterDelay:0.25]; -} - /** * Exports the selected tables in the chosen file format. */ @@ -6045,13 +6037,7 @@ static NSString *SPRenameDatabaseAction = @"SPRenameDatabase"; selectedDatabase = [[NSString alloc] initWithString:targetDatabaseName]; #endif -#ifndef SP_REFACTOR /* clear SPTablesList selection */ - // If the item has changed, clear the item selection for cleaner loading - if (![targetItemName isEqualToString:[self table]]) { - [[tablesListInstance onMainThread] setTableListSelectability:YES]; - [[[tablesListInstance valueForKey:@"tablesListView"] onMainThread] deselectAll:self]; - [[tablesListInstance onMainThread] setTableListSelectability:NO]; - } +#ifndef SP_REFACTOR /* update database encoding */ // Update the stored database encoding, used for views, "default" table encodings, and to allow // or disallow use of the "View using encoding" menu @@ -6071,25 +6057,28 @@ static NSString *SPRenameDatabaseAction = @"SPRenameDatabase"; [spHistoryControllerInstance setModifyingState:NO]; [spHistoryControllerInstance updateHistoryEntries]; } - - // Set focus to table list filter field if visible - // otherwise set focus to Table List view - [self focusOnTableListFilter:self]; #endif } #ifndef SP_REFACTOR /* update selected table in SPTablesList */ + + BOOL focusOnFilter = YES; + if (targetItemName) focusOnFilter = NO; + // If a the table has changed, update the selection - if (![targetItemName isEqualToString:[self table]]) { - if (targetItemName) { - [tablesListInstance selectItemWithName:targetItemName]; - } - else { - [[tablesListInstance onMainThread] setTableListSelectability:YES]; - [[[tablesListInstance valueForKey:@"tablesListView"] onMainThread] deselectAll:self]; - [[tablesListInstance onMainThread] setTableListSelectability:NO]; - } + if (![targetItemName isEqualToString:[self table]] && targetItemName) { + focusOnFilter = ![tablesListInstance selectItemWithName:targetItemName]; + } + + // Ensure the window focus is on the table list or the filter as appropriate + [[tablesListInstance onMainThread] setTableListSelectability:YES]; + if (focusOnFilter) { + [[tablesListInstance onMainThread] makeTableListFilterHaveFocus]; + } else { + [[tablesListInstance onMainThread] makeTableListHaveFocus]; } + [[tablesListInstance onMainThread] setTableListSelectability:NO]; + #endif [self endTask]; #ifndef SP_REFACTOR /* triggered commands */ diff --git a/Source/SPSplitView.m b/Source/SPSplitView.m index 49097d41..2793fd87 100644 --- a/Source/SPSplitView.m +++ b/Source/SPSplitView.m @@ -1106,7 +1106,7 @@ // Restore the first responder if appropriate if (firstResponderToRestore) { - [[self window] makeFirstResponder:firstResponderToRestore]; + [[wrappedView window] makeFirstResponder:firstResponderToRestore]; } [wrappedView release], wrappedView = nil; diff --git a/Source/SPTablesList.h b/Source/SPTablesList.h index 172fff67..8d267c71 100644 --- a/Source/SPTablesList.h +++ b/Source/SPTablesList.h @@ -162,6 +162,7 @@ #ifndef SP_REFACTOR /* method decls */ - (void)selectTableAtIndex:(NSNumber *)row; - (void)makeTableListFilterHaveFocus; +- (void)makeTableListHaveFocus; #endif // Getters diff --git a/Source/SPTablesList.m b/Source/SPTablesList.m index cbe4d4da..30e22eab 100644 --- a/Source/SPTablesList.m +++ b/Source/SPTablesList.m @@ -264,29 +264,18 @@ static NSString *SPDuplicateTable = @"SPDuplicateTable"; // Check for mysql errors - if information_schema is not accessible for some reasons // omit adding procedures and functions - if(![mySQLConnection queryErrored] && theResult != nil && [theResult numberOfRows] ) { + if(![mySQLConnection queryErrored] && theResult != nil && [theResult numberOfRows] && [theResult numberOfFields] > 3) { // Add the header row [tables addObject:NSLocalizedString(@"PROCS & FUNCS",@"header for procs & funcs list")]; [tableTypes addObject:[NSNumber numberWithInteger:SPTableTypeNone]]; - if( [theResult numberOfFields] == 1 ) { - for (NSArray *eachRow in theResult) { - [tables addObject:NSArrayObjectAtIndex(eachRow, 3)]; - if ([NSArrayObjectAtIndex(eachRow, 4) isEqualToString:@"PROCEDURE"]) { - [tableTypes addObject:[NSNumber numberWithInteger:SPTableTypeProc]]; - } else { - [tableTypes addObject:[NSNumber numberWithInteger:SPTableTypeFunc]]; - } - } - } else { - for (NSArray *eachRow in theResult) { - [tables addObject:NSArrayObjectAtIndex(eachRow, 3)]; - if ([NSArrayObjectAtIndex(eachRow, 4) isEqualToString:@"PROCEDURE"]) { - [tableTypes addObject:[NSNumber numberWithInteger:SPTableTypeProc]]; - } else { - [tableTypes addObject:[NSNumber numberWithInteger:SPTableTypeFunc]]; - } + for (NSArray *eachRow in theResult) { + [tables addObject:NSArrayObjectAtIndex(eachRow, 3)]; + if ([NSArrayObjectAtIndex(eachRow, 4) isEqualToString:@"PROCEDURE"]) { + [tableTypes addObject:[NSNumber numberWithInteger:SPTableTypeProc]]; + } else { + [tableTypes addObject:[NSNumber numberWithInteger:SPTableTypeFunc]]; } } } @@ -1830,20 +1819,26 @@ static NSString *SPDuplicateTable = @"SPDuplicateTable"; } /** - * Set focus to table list filter search field + * Set focus to table list filter search field, or the table list if the filter + * field is not visible. */ - (void) makeTableListFilterHaveFocus { if([tables count] > 20) { [[tableDocumentInstance parentWindow] makeFirstResponder:listFilterField]; } - else if([tables count] > 2) { + else { [[tableDocumentInstance parentWindow] makeFirstResponder:tablesListView]; - if([tablesListView numberOfSelectedRows] < 1) - [tablesListView selectRowIndexes:[NSIndexSet indexSetWithIndex:1] byExtendingSelection:NO]; - } } + +/** + * Set focus to the table list. + */ +- (void) makeTableListHaveFocus +{ + [[tableDocumentInstance parentWindow] makeFirstResponder:tablesListView]; +} #endif /** -- cgit v1.2.3