diff options
author | rowanbeentje <rowan@beent.je> | 2010-03-24 02:30:55 +0000 |
---|---|---|
committer | rowanbeentje <rowan@beent.je> | 2010-03-24 02:30:55 +0000 |
commit | 1ddc896d2f88bea86e4b0457d63f7a53b846851d (patch) | |
tree | ddd832d0b0317905d815e30ca3c0df3b1058a12a /Source/TableDocument.m | |
parent | c2351f2220ac01cac614de93bad05022d89d7790 (diff) | |
download | sequelpro-1ddc896d2f88bea86e4b0457d63f7a53b846851d.tar.gz sequelpro-1ddc896d2f88bea86e4b0457d63f7a53b846851d.tar.bz2 sequelpro-1ddc896d2f88bea86e4b0457d63f7a53b846851d.zip |
- Add a new selectDatabase:item: method to TableDocument, to centralise code for selecting databases and tables. Clean up database selection to use this new method, and avoid reloads when re-selecting the same database.
- Convert the history controller to use this new call. This fixes history behaviour when a table list filter was active.
- Convert the (hidden) navigator to use this new call. This fixes timing issues.
- Make some thread safety tweaks to TablesList.
- Change TablesList selectTableOrViewWithName: to selectItemWithName:, including procs etc.
Diffstat (limited to 'Source/TableDocument.m')
-rw-r--r-- | Source/TableDocument.m | 144 |
1 files changed, 97 insertions, 47 deletions
diff --git a/Source/TableDocument.m b/Source/TableDocument.m index ee793689..06f5f744 100644 --- a/Source/TableDocument.m +++ b/Source/TableDocument.m @@ -60,6 +60,7 @@ - (void)_addDatabase; - (void)_removeDatabase; +- (void)_selectDatabaseAndItem:(NSDictionary *)selectionDetails; @end @@ -856,6 +857,16 @@ // Lock editability again if performing a task if (_isWorkingLevel) databaseListIsSelectable = NO; + // Select the database + [self selectDatabase:[chooseDatabaseButton titleOfSelectedItem] item:[self table]]; +} + +/** + * Select the specified database and, optionally, table. + */ +- (void)selectDatabase:(NSString *)aDatabase item:(NSString *)anItem +{ + // Do not update the navigator since nothing is changed [[SPNavigatorController sharedNavigatorController] setIgnoreUpdate:YES]; @@ -872,57 +883,16 @@ // Start a task [self startTaskWithDescription:[NSString stringWithFormat:NSLocalizedString(@"Loading database '%@'...", @"Loading database task string"), [chooseDatabaseButton titleOfSelectedItem]]]; + NSDictionary *selectionDetails = [NSDictionary dictionaryWithObjectsAndKeys: + aDatabase, @"database", + anItem, @"item", + nil]; if ([NSThread isMainThread]) { - [NSThread detachNewThreadSelector:@selector(chooseDatabaseTask) toTarget:self withObject:nil]; + [NSThread detachNewThreadSelector:@selector(_selectDatabaseAndItem:) toTarget:self withObject:selectionDetails]; } else { - [self chooseDatabaseTask]; - } -} -- (void)chooseDatabaseTask -{ - NSAutoreleasePool *taskPool = [[NSAutoreleasePool alloc] init]; - - // Save existing scroll position and details, and ensure no duplicate entries are created as table list changes - BOOL historyStateChanging = [spHistoryControllerInstance modifyingState]; - if (!historyStateChanging) { - [spHistoryControllerInstance updateHistoryEntries]; - [spHistoryControllerInstance setModifyingState:YES]; + [self _selectDatabaseAndItem:selectionDetails]; } - // show error on connection failed - if ( ![mySQLConnection selectDB:[chooseDatabaseButton titleOfSelectedItem]] ) { - if ( [mySQLConnection isConnected] ) { - SPBeginAlertSheet(NSLocalizedString(@"Error", @"error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, tableWindow, self, nil, nil, nil, [NSString stringWithFormat:NSLocalizedString(@"Unable to connect to database %@.\nBe sure that you have the necessary privileges.", @"message of panel when connection to db failed after selecting from popupbutton"), [chooseDatabaseButton titleOfSelectedItem]]); - [self setDatabases:self]; - } - [self endTask]; - [taskPool drain]; - return; - } - - //setConnection of TablesList and TablesDump to reload tables in db - if (selectedDatabase) [selectedDatabase release], selectedDatabase = nil; - selectedDatabase = [[NSString alloc] initWithString:[chooseDatabaseButton titleOfSelectedItem]]; - [tablesListInstance setConnection:mySQLConnection]; - [tableDumpInstance setConnection:mySQLConnection]; - - [[tableWindow onMainThread] setTitle:[self displaySPName]]; - - // Add a history entry - if (!historyStateChanging) { - [spHistoryControllerInstance setModifyingState:NO]; - [spHistoryControllerInstance updateHistoryEntries]; - } - - // Set focus to table list filter field if visible - // otherwise set focus to Table List view - if ( [[tablesListInstance tables] count] > 20 ) - [[tableWindow onMainThread] makeFirstResponder:listFilterField]; - else - [[tableWindow onMainThread] makeFirstResponder:[tablesListInstance valueForKeyPath:@"tablesListView"]]; - - [self endTask]; - [taskPool drain]; } /** @@ -4130,4 +4100,84 @@ [tableWindow setTitle:[self displaySPName]]; } +/** + * Select the specified database and, optionally, table. + */ +- (void)_selectDatabaseAndItem:(NSDictionary *)selectionDetails +{ + NSAutoreleasePool *taskPool = [[NSAutoreleasePool alloc] init]; + NSString *targetDatabaseName = [selectionDetails objectForKey:@"database"]; + NSString *targetItemName = [selectionDetails objectForKey:@"item"]; + + // Save existing scroll position and details, and ensure no duplicate entries are created as table list changes + BOOL historyStateChanging = [spHistoryControllerInstance modifyingState]; + if (!historyStateChanging) { + [spHistoryControllerInstance updateHistoryEntries]; + [spHistoryControllerInstance setModifyingState:YES]; + } + + if (![targetDatabaseName isEqualToString:selectedDatabase]) { + + // Attempt to select the specified database, and abort on failure + if ([chooseDatabaseButton indexOfItemWithTitle:targetDatabaseName] == NSNotFound + || ![mySQLConnection selectDB:targetDatabaseName]) + { + if ( [mySQLConnection isConnected] ) { + SPBeginAlertSheet(NSLocalizedString(@"Error", @"error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, tableWindow, self, nil, nil, nil, [NSString stringWithFormat:NSLocalizedString(@"Unable to connect to database %@.\nBe sure that you have the necessary privileges.", @"message of panel when connection to db failed after selecting from popupbutton"), targetDatabaseName]); + + // Update the database list + [self setDatabases:self]; + } + + [self endTask]; + [taskPool drain]; + return; + } + + [[chooseDatabaseButton onMainThread] selectItemWithTitle:targetDatabaseName]; + if (selectedDatabase) [selectedDatabase release], selectedDatabase = nil; + selectedDatabase = [[NSString alloc] initWithString:[chooseDatabaseButton titleOfSelectedItem]]; + + // 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]; + } + + // Set the connection of TablesList and TablesDump to reload tables in db + [tablesListInstance setConnection:mySQLConnection]; + [tableDumpInstance setConnection:mySQLConnection]; + + // Update the window title + [[tableWindow onMainThread] setTitle:[self displaySPName]]; + + // Add a history entry + if (!historyStateChanging) { + [spHistoryControllerInstance setModifyingState:NO]; + [spHistoryControllerInstance updateHistoryEntries]; + } + + // Set focus to table list filter field if visible + // otherwise set focus to Table List view + if ( [[tablesListInstance tables] count] > 20 ) + [[tableWindow onMainThread] makeFirstResponder:listFilterField]; + else + [[tableWindow onMainThread] makeFirstResponder:[tablesListInstance valueForKeyPath:@"tablesListView"]]; + } + + // 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]; + } + } + + [self endTask]; + [taskPool drain]; +} @end |