From 6d5927b835706d28ee8ec24254d7b5c19bf6e5fe Mon Sep 17 00:00:00 2001 From: rowanbeentje Date: Wed, 3 Nov 2010 01:42:32 +0000 Subject: Add a new category to SPDatabaseDocument, allowing code cleanup and moving central functionality out of SPTablesList: - Centralise control over table loading, moving it away from SPTablesList and into SPDatabaseDocument and the new SPDatabaseViewController category - Centralise control over the main tab view, moving control away from SPTablesList and into SPDatabaseDocument and the new SPDatabaseViewController category - Simplify and clean up view loading logic - Improve thread safety - Update localisable strings --- Interfaces/English.lproj/DBView.xib | 223 ++++++----- Resources/English.lproj/DBView.strings | Bin 100836 -> 99710 bytes Resources/English.lproj/FieldEditorSheet.strings | Bin 11500 -> 11502 bytes Resources/English.lproj/Localizable.strings | Bin 183032 -> 183004 bytes Resources/English.lproj/MainMenu.strings | Bin 41002 -> 42638 bytes Source/SPConnectionController.m | 2 +- Source/SPDataImport.m | 6 +- Source/SPDatabaseDocument.h | 18 +- Source/SPDatabaseDocument.m | 157 +------- Source/SPDatabaseViewController.h | 53 +++ Source/SPDatabaseViewController.m | 485 +++++++++++++++++++++++ Source/SPExtendedTableInfo.m | 2 +- Source/SPHistoryController.m | 2 +- Source/SPIndexesController.m | 4 +- Source/SPTableContent.m | 8 +- Source/SPTableStructure.m | 14 +- Source/SPTableStructureDelegate.m | 4 +- Source/SPTablesList.h | 11 +- Source/SPTablesList.m | 343 ++-------------- Source/SPWindowController.m | 2 +- sequel-pro.xcodeproj/project.pbxproj | 7 +- 21 files changed, 739 insertions(+), 602 deletions(-) create mode 100644 Source/SPDatabaseViewController.h create mode 100644 Source/SPDatabaseViewController.m diff --git a/Interfaces/English.lproj/DBView.xib b/Interfaces/English.lproj/DBView.xib index 3a32ac16..e8ba4357 100644 --- a/Interfaces/English.lproj/DBView.xib +++ b/Interfaces/English.lproj/DBView.xib @@ -23,12 +23,13 @@ YES + YES com.brandonwalkin.BWToolkit - com.apple.WebKitIBPlugin com.apple.InterfaceBuilder.CocoaPlugin + com.apple.WebKitIBPlugin PluginDependencyRecalculationVersion @@ -46,7 +47,7 @@ NSApplication - + 274 YES @@ -221,7 +222,7 @@ controlColor 3 - MC42NjY2NjY2ODY1AA + MC42NjY2NjY2NjY3AA @@ -266,6 +267,7 @@ {{1, 1}, {218, 38}} + 6 @@ -297,6 +299,7 @@ {{-1, -13}, {220, 40}} + 2 @@ -394,6 +397,7 @@ {214, 354} + 4 @@ -421,6 +425,7 @@ {214, 354} + 528 @@ -556,6 +561,7 @@ {214, 145} + 6 @@ -583,6 +589,7 @@ {214, 145} + 512 @@ -1659,6 +1666,7 @@ {{1, 17}, {694, 289}} + 4 @@ -1692,6 +1700,7 @@ {{1, 0}, {694, 17}} + 4 @@ -1700,6 +1709,7 @@ {{-1, 22}, {696, 307}} + 562 @@ -2246,6 +2256,7 @@ {{1, 17}, {694, 140}} + 4 @@ -2278,6 +2289,7 @@ {{1, 0}, {694, 17}} + 4 @@ -2286,6 +2298,7 @@ {{-1, 23}, {696, 158}} + 562 @@ -6170,6 +6183,7 @@ {943, 549} + NSView @@ -6892,10 +6906,10 @@ View - {3.40282e+38, 3.40282e+38} + {1.79769e+308, 1.79769e+308} {213, 107} - + 256 YES @@ -6904,7 +6918,6 @@ 256 {{17, 74}, {272, 28}} - YES 67239424 @@ -6922,7 +6935,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8 256 {{74, 45}, {162, 22}} - YES -2076049856 @@ -7004,7 +7016,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8 256 {{154, 17}, {84, 28}} - 1 YES @@ -7028,7 +7039,6 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8 256 {{72, 17}, {84, 28}} - YES 67239424 @@ -7047,12 +7057,10 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8 {306, 122} - - {{0, 0}, {1440, 878}} {213, 129} - {3.40282e+38, 3.40282e+38} + {1.79769e+308, 1.79769e+308} 7 @@ -7062,7 +7070,7 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8 Reset Auto Increment NSWindow - {3.40282e+38, 3.40282e+38} + {1.79769e+308, 1.79769e+308} {255, 95} @@ -7225,7 +7233,7 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8 {{0, 0}, {1280, 1002}} {255, 117} - {3.40282e+38, 3.40282e+38} + {1.79769e+308, 1.79769e+308} 1 @@ -7235,7 +7243,7 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8 New Relation NSPanel - {3.40282e+38, 3.40282e+38} + {1.79769e+308, 1.79769e+308} 256 @@ -7836,7 +7844,7 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8 {302, 307} {{0, 0}, {1440, 878}} - {3.40282e+38, 3.40282e+38} + {1.79769e+308, 1.79769e+308} 9 @@ -7846,7 +7854,7 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8 New Trigger NSPanel - {3.40282e+38, 3.40282e+38} + {1.79769e+308, 1.79769e+308} {360, 348} @@ -8253,7 +8261,7 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8 {{0, 0}, {1680, 1028}} {360, 370} - {3.40282e+38, 3.40282e+38} + {1.79769e+308, 1.79769e+308} 3 @@ -8265,7 +8273,7 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8 View - {3.40282e+38, 3.40282e+38} + {1.79769e+308, 1.79769e+308} {213, 50} @@ -8385,7 +8393,7 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8 {{0, 0}, {1920, 1178}} {213, 72} - {3.40282e+38, 3.40282e+38} + {1.79769e+308, 1.79769e+308} 9 @@ -8397,7 +8405,7 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8 View - {3.40282e+38, 3.40282e+38} + {1.79769e+308, 1.79769e+308} {213, 107} @@ -8532,7 +8540,7 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8 {{0, 0}, {1440, 878}} {213, 129} - {3.40282e+38, 3.40282e+38} + {1.79769e+308, 1.79769e+308} 15 @@ -8544,7 +8552,7 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8 View - {3.40282e+38, 3.40282e+38} + {1.79769e+308, 1.79769e+308} {350, 200} @@ -8767,7 +8775,7 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8 {{0, 0}, {1680, 1028}} {350, 222} - {3.40282e+38, 3.40282e+38} + {1.79769e+308, 1.79769e+308} SPCreateSyntaxSheet @@ -8780,7 +8788,7 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8 View - {3.40282e+38, 3.40282e+38} + {1.79769e+308, 1.79769e+308} {213, 107} @@ -8950,7 +8958,7 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8 {{0, 0}, {1440, 878}} {213, 129} - {3.40282e+38, 3.40282e+38} + {1.79769e+308, 1.79769e+308} 31 @@ -8960,7 +8968,7 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8 MySQL Help NSPanel - {3.40282e+38, 3.40282e+38} + {1.79769e+308, 1.79769e+308} {351, 120} @@ -9358,7 +9366,7 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8 {{0, 0}, {1280, 1002}} {351, 136} - {3.40282e+38, 3.40282e+38} + {1.79769e+308, 1.79769e+308} MYSQL_HELP_WINDOW @@ -9369,7 +9377,7 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8 Filter NSPanel - {3.40282e+38, 3.40282e+38} + {1.79769e+308, 1.79769e+308} {380, 170} @@ -10014,7 +10022,7 @@ IGRvIHlvdSB3YW50IHRvIGFkZCBmb3IgdGhpcyBmaWVsZD8 {{0, 0}, {1280, 778}} {380, 192} - {3.40282e+38, 3.40282e+38} + {1.79769e+308, 1.79769e+308} SPTableFilterPanel @@ -10514,7 +10522,7 @@ bGQgTmFtZQkgID0gQAoJCQkJICBMRU5HVEgoYEBgKSA+IEA Secure Text Input Sheet NSPanel - {3.40282e+38, 3.40282e+38} + {1.79769e+308, 1.79769e+308} 256 @@ -10618,7 +10626,7 @@ bGQgTmFtZQkgID0gQAoJCQkJICBMRU5HVEgoYEBgKSA+IEA {338, 150} {{0, 0}, {1280, 778}} - {3.40282e+38, 3.40282e+38} + {1.79769e+308, 1.79769e+308} @@ -10801,7 +10809,7 @@ bGQgTmFtZQkgID0gQAoJCQkJICBMRU5HVEgoYEBgKSA+IEA disabledControlTextColor 3 - MC4zMzMzMzMzNDMzAA + MC4zMzMzMzMzMzMzAA @@ -11788,22 +11796,6 @@ bGQgTmFtZQkgID0gQAoJCQkJICBMRU5HVEgoYEBgKSA+IEA 587 - - - tabView - - - - 600 - - - - delegate - - - - 601 - tableDumpInstance @@ -16157,6 +16149,14 @@ bGQgTmFtZQkgID0gQAoJCQkJICBMRU5HVEgoYEBgKSA+IEA 7672 + + + delegate + + + + 7673 + @@ -25803,7 +25803,7 @@ bGQgTmFtZQkgID0gQAoJCQkJICBMRU5HVEgoYEBgKSA+IEA - 7672 + 7673 @@ -27087,12 +27087,6 @@ bGQgTmFtZQkgID0gQAoJCQkJICBMRU5HVEgoYEBgKSA+IEA toggleNavigator: updateWindowTitle: validateSaveConnectionAccessory: - viewContent: - viewQuery: - viewRelations: - viewStatus: - viewStructure: - viewTriggers: YES @@ -27139,12 +27133,6 @@ bGQgTmFtZQkgID0gQAoJCQkJICBMRU5HVEgoYEBgKSA+IEA id id id - id - id - id - id - id - id @@ -27194,12 +27182,6 @@ bGQgTmFtZQkgID0gQAoJCQkJICBMRU5HVEgoYEBgKSA+IEA toggleNavigator: updateWindowTitle: validateSaveConnectionAccessory: - viewContent: - viewQuery: - viewRelations: - viewStatus: - viewStructure: - viewTriggers: YES @@ -27375,30 +27357,6 @@ bGQgTmFtZQkgID0gQAoJCQkJICBMRU5HVEgoYEBgKSA+IEA validateSaveConnectionAccessory: id - - viewContent: - id - - - viewQuery: - id - - - viewRelations: - id - - - viewStatus: - id - - - viewStructure: - id - - - viewTriggers: - id - @@ -27900,6 +27858,73 @@ bGQgTmFtZQkgID0gQAoJCQkJICBMRU5HVEgoYEBgKSA+IEA Source/SPDatabaseDocument.h + + SPDatabaseDocument + + YES + + YES + viewContent: + viewQuery: + viewRelations: + viewStatus: + viewStructure: + viewTriggers: + + + YES + id + id + id + id + id + id + + + + YES + + YES + viewContent: + viewQuery: + viewRelations: + viewStatus: + viewStructure: + viewTriggers: + + + YES + + viewContent: + id + + + viewQuery: + id + + + viewRelations: + id + + + viewStatus: + id + + + viewStructure: + id + + + viewTriggers: + id + + + + + IBProjectSource + Source/SPDatabaseViewController.h + + SPDatabaseDocument @@ -30254,7 +30279,6 @@ bGQgTmFtZQkgID0gQAoJCQkJICBMRU5HVEgoYEBgKSA+IEA YES addField: - closeKeySheet: closeSheet: copyField: reloadTable: @@ -30275,7 +30299,6 @@ bGQgTmFtZQkgID0gQAoJCQkJICBMRU5HVEgoYEBgKSA+IEA id id id - id @@ -30283,7 +30306,6 @@ bGQgTmFtZQkgID0gQAoJCQkJICBMRU5HVEgoYEBgKSA+IEA YES addField: - closeKeySheet: closeSheet: copyField: reloadTable: @@ -30299,10 +30321,6 @@ bGQgTmFtZQkgID0gQAoJCQkJICBMRU5HVEgoYEBgKSA+IEA addField: id - - closeKeySheet: - id - closeSheet: id @@ -30889,7 +30907,6 @@ bGQgTmFtZQkgID0gQAoJCQkJICBMRU5HVEgoYEBgKSA+IEA showCreateSyntaxContextMenuItem showCreateSyntaxMenuItem spHistoryControllerInstance - tabView tableContentInstance tableDataInstance tableDocumentInstance @@ -30941,7 +30958,6 @@ bGQgTmFtZQkgID0gQAoJCQkJICBMRU5HVEgoYEBgKSA+IEA id id id - id NSButton id NSSplitView @@ -30986,7 +31002,6 @@ bGQgTmFtZQkgID0gQAoJCQkJICBMRU5HVEgoYEBgKSA+IEA showCreateSyntaxContextMenuItem showCreateSyntaxMenuItem spHistoryControllerInstance - tabView tableContentInstance tableDataInstance tableDocumentInstance @@ -31102,10 +31117,6 @@ bGQgTmFtZQkgID0gQAoJCQkJICBMRU5HVEgoYEBgKSA+IEA spHistoryControllerInstance SPHistoryController - - tabView - id - tableContentInstance id diff --git a/Resources/English.lproj/DBView.strings b/Resources/English.lproj/DBView.strings index 3573001b..440d66bb 100644 Binary files a/Resources/English.lproj/DBView.strings and b/Resources/English.lproj/DBView.strings differ diff --git a/Resources/English.lproj/FieldEditorSheet.strings b/Resources/English.lproj/FieldEditorSheet.strings index 84f66d66..f6f508dd 100644 Binary files a/Resources/English.lproj/FieldEditorSheet.strings and b/Resources/English.lproj/FieldEditorSheet.strings differ diff --git a/Resources/English.lproj/Localizable.strings b/Resources/English.lproj/Localizable.strings index ac4a1524..5a482a5d 100644 Binary files a/Resources/English.lproj/Localizable.strings and b/Resources/English.lproj/Localizable.strings differ diff --git a/Resources/English.lproj/MainMenu.strings b/Resources/English.lproj/MainMenu.strings index ff2e820a..e2be88de 100644 Binary files a/Resources/English.lproj/MainMenu.strings and b/Resources/English.lproj/MainMenu.strings differ diff --git a/Source/SPConnectionController.m b/Source/SPConnectionController.m index 241a6e1d..1128b822 100644 --- a/Source/SPConnectionController.m +++ b/Source/SPConnectionController.m @@ -84,7 +84,7 @@ { if (self = [super init]) { tableDocument = theTableDocument; - databaseConnectionSuperview = [tableDocument parentView]; + databaseConnectionSuperview = [tableDocument databaseView]; databaseConnectionView = [tableDocument valueForKey:@"contentViewSplitter"]; connectionKeychainItemName = nil; connectionKeychainItemAccount = nil; diff --git a/Source/SPDataImport.m b/Source/SPDataImport.m index f7f3eb4c..dff20466 100644 --- a/Source/SPDataImport.m +++ b/Source/SPDataImport.m @@ -1120,11 +1120,7 @@ // If import was done into a new table or the table selected for import is also selected in the content view, // update the content view - on the main thread to avoid crashes. if ([tablesListInstance tableName] && [selectedTableTarget isEqualToString:[tablesListInstance tableName]]) { - if ([[tableDocumentInstance selectedToolbarItemIdentifier] isEqualToString:SPMainToolbarTableContent]) { - [tableContentInstance performSelectorOnMainThread:@selector(reloadTable:) withObject:nil waitUntilDone:YES]; - } else { - [tablesListInstance setContentRequiresReload:YES]; - } + [tableDocumentInstance setContentRequiresReload:YES]; } } diff --git a/Source/SPDatabaseDocument.h b/Source/SPDatabaseDocument.h index f01abe63..35681506 100644 --- a/Source/SPDatabaseDocument.h +++ b/Source/SPDatabaseDocument.h @@ -139,6 +139,16 @@ MCPConnection *mySQLConnection; + NSInteger currentTabIndex; + + NSString *selectedTableName; + NSInteger selectedTableType; + + BOOL structureLoaded; + BOOL contentLoaded; + BOOL statusLoaded; + BOOL triggersLoaded; + NSString *selectedDatabase; NSString *mySQLVersion; NSUserDefaults *prefs; @@ -292,11 +302,9 @@ - (IBAction)toggleNavigator:(id)sender; // Accessor methods -- (NSView *)parentView; - (NSString *)host; - (NSString *)name; - (NSString *)database; -- (NSString *)table; - (NSString *)port; - (NSString *)mySQLVersion; - (NSString *)user; @@ -315,12 +323,6 @@ - (IBAction)saveConnectionSheet:(id)sender; - (IBAction)import:(id)sender; - (IBAction)importFromClipboard:(id)sender; -- (IBAction)viewStructure:(id)sender; -- (IBAction)viewContent:(id)sender; -- (IBAction)viewQuery:(id)sender; -- (IBAction)viewStatus:(id)sender; -- (IBAction)viewRelations:(id)sender; -- (IBAction)viewTriggers:(id)sender; - (IBAction)addConnectionToFavorites:(id)sender; - (BOOL)isCustomQuerySelected; diff --git a/Source/SPDatabaseDocument.m b/Source/SPDatabaseDocument.m index beb8ab5a..75a16e73 100644 --- a/Source/SPDatabaseDocument.m +++ b/Source/SPDatabaseDocument.m @@ -87,6 +87,15 @@ chooseDatabaseButton = nil; chooseDatabaseToolbarItem = nil; connectionController = nil; + + selectedTableName = nil; + selectedTableType = SPTableTypeNone; + + structureLoaded = NO; + contentLoaded = NO; + statusLoaded = NO; + triggersLoaded = NO; + selectedDatabase = nil; mySQLConnection = nil; mySQLVersion = nil; @@ -1218,12 +1227,12 @@ if (selectedDatabase) [selectedDatabase release], selectedDatabase = nil; selectedDatabase = [[NSString alloc] initWithString:dbName]; [chooseDatabaseButton selectItemWithTitle:selectedDatabase]; - [self updateWindowTitle:self]; + [[self onMainThread] updateWindowTitle:self]; } } else { if (selectedDatabase) [selectedDatabase release], selectedDatabase = nil; [chooseDatabaseButton selectItemAtIndex:0]; - [self updateWindowTitle:self]; + [[self onMainThread] updateWindowTitle:self]; } } @@ -1634,19 +1643,19 @@ // Update the selected menu item if (useLatin1Transport) { - [self updateEncodingMenuWithSelectedEncoding:[self encodingTagFromMySQLEncoding:[NSString stringWithFormat:@"%@-", mysqlEncoding]]]; + [[self onMainThread] updateEncodingMenuWithSelectedEncoding:[self encodingTagFromMySQLEncoding:[NSString stringWithFormat:@"%@-", mysqlEncoding]]]; } else { - [self updateEncodingMenuWithSelectedEncoding:[self encodingTagFromMySQLEncoding:mysqlEncoding]]; + [[self onMainThread] updateEncodingMenuWithSelectedEncoding:[self encodingTagFromMySQLEncoding:mysqlEncoding]]; } // Update the stored connection encoding to prevent switches [mySQLConnection storeEncodingForRestoration]; - // Reload stuff as appropriate + // Reload views as appropriate if (reloadViews) { - if ([tablesListInstance structureLoaded]) [tableSourceInstance reloadTable:self]; - if ([tablesListInstance contentLoaded]) [tableContentInstance reloadTable:self]; - if ([tablesListInstance statusLoaded]) [extendedTableInfoInstance reloadTable:self]; + [self setStructureRequiresReload:YES]; + [self setContentRequiresReload:YES]; + [self setStatusRequiresReload:YES]; } } @@ -2617,16 +2626,6 @@ #pragma mark - #pragma mark Accessor methods - -/** - * Returns the parent view, which in its turn contains the database view for this - * connection. - */ -- (NSView *)parentView -{ - return parentView; -} - /** * Returns the host */ @@ -2733,14 +2732,6 @@ return selectedDatabase; } -/** - * Returns the currently selected table (passing the request to SPTablesList) - */ -- (NSString *)table -{ - return [tablesListInstance tableName]; -} - /** * Returns the MySQL version */ @@ -3711,113 +3702,6 @@ return YES; } -- (IBAction)viewStructure:(id)sender -{ - // Cancel the selection if currently editing a view and unable to save - if (![self couldCommitCurrentViewActions]) { - [mainToolbar setSelectedItemIdentifier:*SPViewModeToMainToolbarMap[[prefs integerForKey:SPLastViewMode]]]; - return; - } - - [tableTabView selectTabViewItemAtIndex:0]; - [mainToolbar setSelectedItemIdentifier:SPMainToolbarTableStructure]; - [spHistoryControllerInstance updateHistoryEntries]; - - [prefs setInteger:SPStructureViewMode forKey:SPLastViewMode]; -} - -- (IBAction)viewContent:(id)sender -{ - - // Cancel the selection if currently editing a view and unable to save - if (![self couldCommitCurrentViewActions]) { - [mainToolbar setSelectedItemIdentifier:*SPViewModeToMainToolbarMap[[prefs integerForKey:SPLastViewMode]]]; - return; - } - - [tableTabView selectTabViewItemAtIndex:1]; - [mainToolbar setSelectedItemIdentifier:SPMainToolbarTableContent]; - [spHistoryControllerInstance updateHistoryEntries]; - - [prefs setInteger:SPContentViewMode forKey:SPLastViewMode]; -} - -- (IBAction)viewQuery:(id)sender -{ - - // Cancel the selection if currently editing a view and unable to save - if (![self couldCommitCurrentViewActions]) { - [mainToolbar setSelectedItemIdentifier:*SPViewModeToMainToolbarMap[[prefs integerForKey:SPLastViewMode]]]; - return; - } - - [tableTabView selectTabViewItemAtIndex:2]; - [mainToolbar setSelectedItemIdentifier:SPMainToolbarCustomQuery]; - [spHistoryControllerInstance updateHistoryEntries]; - - // Set the focus on the text field - [parentWindow makeFirstResponder:customQueryTextView]; - - [prefs setInteger:SPQueryEditorViewMode forKey:SPLastViewMode]; -} - -- (IBAction)viewStatus:(id)sender -{ - - // Cancel the selection if currently editing a view and unable to save - if (![self couldCommitCurrentViewActions]) { - [mainToolbar setSelectedItemIdentifier:*SPViewModeToMainToolbarMap[[prefs integerForKey:SPLastViewMode]]]; - return; - } - - [tableTabView selectTabViewItemAtIndex:3]; - [mainToolbar setSelectedItemIdentifier:SPMainToolbarTableInfo]; - [spHistoryControllerInstance updateHistoryEntries]; - - // Refresh data - if([self table] && [[self table] length]) { - [tableDataInstance resetAllData]; - [extendedTableInfoInstance loadTable:[self table]]; - } - - [parentWindow makeFirstResponder:[extendedTableInfoInstance valueForKeyPath:@"tableCreateSyntaxTextView"]]; - - [prefs setInteger:SPTableInfoViewMode forKey:SPLastViewMode]; -} - -- (IBAction)viewRelations:(id)sender -{ - - // Cancel the selection if currently editing a view and unable to save - if (![self couldCommitCurrentViewActions]) { - [mainToolbar setSelectedItemIdentifier:*SPViewModeToMainToolbarMap[[prefs integerForKey:SPLastViewMode]]]; - return; - } - - [tableTabView selectTabViewItemAtIndex:4]; - [mainToolbar setSelectedItemIdentifier:SPMainToolbarTableRelations]; - [spHistoryControllerInstance updateHistoryEntries]; - - [prefs setInteger:SPRelationsViewMode forKey:SPLastViewMode]; -} - -- (IBAction)viewTriggers:(id)sender -{ - - // Cancel the selection if currently editing a view and unable to save - if (![self couldCommitCurrentViewActions]) { - [mainToolbar setSelectedItemIdentifier:*SPViewModeToMainToolbarMap[[prefs integerForKey:SPLastViewMode]]]; - return; - } - - [tableTabView selectTabViewItemAtIndex:5]; - [mainToolbar setSelectedItemIdentifier:SPMainToolbarTableTriggers]; - [spHistoryControllerInstance updateHistoryEntries]; - - [prefs setInteger:SPTriggersViewMode forKey:SPLastViewMode]; -} - - /** * Adds the current database connection details to the user's favorites if it doesn't already exist. */ @@ -4491,7 +4375,7 @@ - (void)connectionControllerConnectAttemptFailed:(id)controller { // Reset the window title - [self updateWindowTitle:self]; + [[self onMainThread] updateWindowTitle:self]; } #pragma mark - @@ -4721,6 +4605,7 @@ [printWebView release]; [taskProgressWindow close]; + if (selectedTableName) [selectedTableName release]; if (connectionController) [connectionController release]; if (processListController) [processListController release]; if (serverVariablesController) [serverVariablesController release]; @@ -4854,7 +4739,7 @@ [tablesListInstance setConnection:mySQLConnection]; [tableDumpInstance setConnection:mySQLConnection]; - [self updateWindowTitle:self]; + [[self onMainThread] updateWindowTitle:self]; } /** @@ -4893,7 +4778,7 @@ [tablesListInstance setConnection:mySQLConnection]; [tableDumpInstance setConnection:mySQLConnection]; - [self updateWindowTitle:self]; + [[self onMainThread] updateWindowTitle:self]; } /** diff --git a/Source/SPDatabaseViewController.h b/Source/SPDatabaseViewController.h new file mode 100644 index 00000000..14dd5e88 --- /dev/null +++ b/Source/SPDatabaseViewController.h @@ -0,0 +1,53 @@ +// +// $Id$ +// +// SPDatabaseViewController.h +// sequel-pro +// +// Created by Rowan Beentje on 31/10/2010. +// Copyright 2010 Arboreal. All rights reserved. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// More info at + +#import "SPDatabaseDocument.h" + + +@interface SPDatabaseDocument (SPDatabaseViewController) + +// Getters +- (NSView *)parentView; +- (NSString *)table; +- (NSInteger)tableType; +- (BOOL)structureLoaded; +- (BOOL)contentLoaded; +- (BOOL)statusLoaded; + +// Tab view control +- (IBAction)viewStructure:(id)sender; +- (IBAction)viewContent:(id)sender; +- (IBAction)viewQuery:(id)sender; +- (IBAction)viewStatus:(id)sender; +- (IBAction)viewRelations:(id)sender; +- (IBAction)viewTriggers:(id)sender; +- (void)setStructureRequiresReload:(BOOL)reload; +- (void)setContentRequiresReload:(BOOL)reload; +- (void)setStatusRequiresReload:(BOOL)reload; + +// Table control +- (void)loadTable:(NSString *)aTable ofType:(NSInteger)aTableType; + +@end diff --git a/Source/SPDatabaseViewController.m b/Source/SPDatabaseViewController.m new file mode 100644 index 00000000..cb5b5bb2 --- /dev/null +++ b/Source/SPDatabaseViewController.m @@ -0,0 +1,485 @@ +// +// $Id$ +// +// SPDatabaseViewController.m +// sequel-pro +// +// Created by Rowan Beentje on 31/10/2010. +// Copyright 2010 Arboreal. All rights reserved. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// More info at + +#import "SPDatabaseViewController.h" +#import "SPTableData.h" + +@interface SPDatabaseDocument (SPDatabaseViewControllerPrivateAPI) + +- (void)_loadTabTask:(NSTabViewItem *)tabViewItem; +- (void)_loadTableTask; + +@end + + +@implementation SPDatabaseDocument (SPDatabaseViewController) + +#pragma mark - +#pragma mark Getters + +/** + * Returns the master database view, containing the tables list and views for + * table setup and contents. + */ +- (NSView *)databaseView +{ + return parentView; +} + +/** + * Returns the name of the currently selected table/view/procedure/function. + */ +- (NSString *)table +{ + return selectedTableName; +} + +/** + * Returns the currently selected table type, or -1 if no table or multiple tables are selected + */ +- (NSInteger)tableType +{ + return selectedTableType; +} + +/** + * Returns YES if table source has already been loaded + */ +- (BOOL)structureLoaded +{ + return structureLoaded; +} + +/** + * Returns YES if table content has already been loaded + */ +- (BOOL)contentLoaded +{ + return contentLoaded; +} + +/** + * Returns YES if table status has already been loaded + */ +- (BOOL)statusLoaded +{ + return statusLoaded; +} + + +#pragma mark - +#pragma mark Tab view control and delegate methods + +- (IBAction)viewStructure:(id)sender +{ + // Cancel the selection if currently editing a view and unable to save + if (![self couldCommitCurrentViewActions]) { + [mainToolbar setSelectedItemIdentifier:*SPViewModeToMainToolbarMap[[prefs integerForKey:SPLastViewMode]]]; + return; + } + + [tableTabView selectTabViewItemAtIndex:0]; + [mainToolbar setSelectedItemIdentifier:SPMainToolbarTableStructure]; + [spHistoryControllerInstance updateHistoryEntries]; + + [prefs setInteger:SPStructureViewMode forKey:SPLastViewMode]; +} + +- (IBAction)viewContent:(id)sender +{ + + // Cancel the selection if currently editing a view and unable to save + if (![self couldCommitCurrentViewActions]) { + [mainToolbar setSelectedItemIdentifier:*SPViewModeToMainToolbarMap[[prefs integerForKey:SPLastViewMode]]]; + return; + } + + [tableTabView selectTabViewItemAtIndex:1]; + [mainToolbar setSelectedItemIdentifier:SPMainToolbarTableContent]; + [spHistoryControllerInstance updateHistoryEntries]; + + [prefs setInteger:SPContentViewMode forKey:SPLastViewMode]; +} + +- (IBAction)viewQuery:(id)sender +{ + + // Cancel the selection if currently editing a view and unable to save + if (![self couldCommitCurrentViewActions]) { + [mainToolbar setSelectedItemIdentifier:*SPViewModeToMainToolbarMap[[prefs integerForKey:SPLastViewMode]]]; + return; + } + + [tableTabView selectTabViewItemAtIndex:2]; + [mainToolbar setSelectedItemIdentifier:SPMainToolbarCustomQuery]; + [spHistoryControllerInstance updateHistoryEntries]; + + // Set the focus on the text field + [parentWindow makeFirstResponder:customQueryTextView]; + + [prefs setInteger:SPQueryEditorViewMode forKey:SPLastViewMode]; +} + +- (IBAction)viewStatus:(id)sender +{ + + // Cancel the selection if currently editing a view and unable to save + if (![self couldCommitCurrentViewActions]) { + [mainToolbar setSelectedItemIdentifier:*SPViewModeToMainToolbarMap[[prefs integerForKey:SPLastViewMode]]]; + return; + } + + [tableTabView selectTabViewItemAtIndex:3]; + [mainToolbar setSelectedItemIdentifier:SPMainToolbarTableInfo]; + [spHistoryControllerInstance updateHistoryEntries]; + + // Refresh data + if([self table] && [[self table] length]) { + [tableDataInstance resetAllData]; + [extendedTableInfoInstance loadTable:[self table]]; + } + + [parentWindow makeFirstResponder:[extendedTableInfoInstance valueForKeyPath:@"tableCreateSyntaxTextView"]]; + + [prefs setInteger:SPTableInfoViewMode forKey:SPLastViewMode]; +} + +- (IBAction)viewRelations:(id)sender +{ + + // Cancel the selection if currently editing a view and unable to save + if (![self couldCommitCurrentViewActions]) { + [mainToolbar setSelectedItemIdentifier:*SPViewModeToMainToolbarMap[[prefs integerForKey:SPLastViewMode]]]; + return; + } + + [tableTabView selectTabViewItemAtIndex:4]; + [mainToolbar setSelectedItemIdentifier:SPMainToolbarTableRelations]; + [spHistoryControllerInstance updateHistoryEntries]; + + [prefs setInteger:SPRelationsViewMode forKey:SPLastViewMode]; +} + +- (IBAction)viewTriggers:(id)sender +{ + + // Cancel the selection if currently editing a view and unable to save + if (![self couldCommitCurrentViewActions]) { + [mainToolbar setSelectedItemIdentifier:*SPViewModeToMainToolbarMap[[prefs integerForKey:SPLastViewMode]]]; + return; + } + + [tableTabView selectTabViewItemAtIndex:5]; + [mainToolbar setSelectedItemIdentifier:SPMainToolbarTableTriggers]; + [spHistoryControllerInstance updateHistoryEntries]; + + [prefs setInteger:SPTriggersViewMode forKey:SPLastViewMode]; +} + +/** + * Mark the structure tab for refresh when it's next switched to, + * or reload the view if it's currently active + */ +- (void)setStructureRequiresReload:(BOOL)reload +{ + if (reload && selectedTableName && [tableTabView indexOfTabViewItem:[tableTabView selectedTabViewItem]] == SPTableViewStructure) { + [tableSourceInstance loadTable:selectedTableName]; + } else { + structureLoaded = !reload; + } +} + +/** + * Mark the content tab for refresh when it's next switched to, + * or reload the view if it's currently active + */ +- (void)setContentRequiresReload:(BOOL)reload +{ + if (reload && selectedTableName && [tableTabView indexOfTabViewItem:[tableTabView selectedTabViewItem]] == SPTableViewContent) { + [tableContentInstance loadTable:selectedTableName]; + } else { + contentLoaded = !reload; + } +} + +/** + * Mark the extended tab info for refresh when it's next switched to, + * or reload the view if it's currently active + */ +- (void)setStatusRequiresReload:(BOOL)reload +{ + if (reload && selectedTableName && [tableTabView indexOfTabViewItem:[tableTabView selectedTabViewItem]] == SPTableViewStatus) { + [[extendedTableInfoInstance onMainThread] loadTable:selectedTableName]; + } else { + statusLoaded = !reload; + } +} + + +/** + * Triggers a task to update the newly selected tab view, ensuring + * the data is fully loaded and up-to-date. + */ +- (void)tabView:(NSTabView *)aTabView didSelectTabViewItem:(NSTabViewItem *)tabViewItem +{ + [self startTaskWithDescription:[NSString stringWithFormat:NSLocalizedString(@"Loading %@...", @"Loading table task string"), [self table]]]; + if ([NSThread isMainThread]) { + [NSThread detachNewThreadSelector:@selector(_loadTabTask:) toTarget:self withObject:tabViewItem]; + } else { + [self _loadTabTask:tabViewItem]; + } +} + +#pragma mark - +#pragma mark Table control + +/** + * Loads a specified table into the database view, and ensures it's selected in + * the tables list. Passing a table name of nil will deselect any currently selected + * table, but will leave multiple selections intact. + * If this method is supplied with the currently selected name, a reload rather than + * a load will be triggered. + */ +- (void)loadTable:(NSString *)aTable ofType:(NSInteger)aTableType +{ + + // Ensure a connection is still present + if (![mySQLConnection isConnected]) return; + + // If the supplied table name was nil, clear the views. + if (!aTable) { + + // Update the selected table name and type + if (selectedTableName) [selectedTableName release], selectedTableName = nil; + selectedTableType = SPTableTypeNone; + + // Clear the views + if ([[tablesListInstance selectedTableNames] count] == 1) { + [[tablesListInstance onMainThread] setSelection:nil]; + } + [tableSourceInstance loadTable:nil]; + [tableContentInstance loadTable:nil]; + [[extendedTableInfoInstance onMainThread] loadTable:nil]; + [[tableTriggersInstance onMainThread] loadTriggers]; + structureLoaded = NO; + contentLoaded = NO; + statusLoaded = NO; + triggersLoaded = NO; + + // Update the window title + [[self onMainThread] updateWindowTitle:self]; + + // Add a history entry + [spHistoryControllerInstance updateHistoryEntries]; + + // Notify listeners of the table change + [[NSNotificationCenter defaultCenter] postNotificationOnMainThreadWithName:SPTableChangedNotification object:self]; + + return; + } + + BOOL isReloading = (selectedTableName && [selectedTableName isEqualToString:aTable]); + + // Store the new name + if (selectedTableName) [selectedTableName release]; + selectedTableName = [[NSString alloc] initWithString:aTable]; + selectedTableType = aTableType; + + // Start a task + if (isReloading) { + [self startTaskWithDescription:NSLocalizedString(@"Reloading...", @"Reloading table task string")]; + } else { + [self startTaskWithDescription:[NSString stringWithFormat:NSLocalizedString(@"Loading %@...", @"Loading table task string"), aTable]]; + } + + // Update the tables list interface - also updates menus to reflect the selected table type + [[tablesListInstance onMainThread] setSelection:[NSDictionary dictionaryWithObjectsAndKeys:aTable, @"name", [NSNumber numberWithInteger:aTableType], @"type", nil]]; + + // If on the main thread, fire up a thread to deal with view changes and data loading; + // if already on a background thread, make the changes on the existing thread. + if ([NSThread isMainThread]) { + [NSThread detachNewThreadSelector:@selector(_loadTableTask) toTarget:self withObject:nil]; + } else { + [self _loadTableTask]; + } +} + +@end + +#pragma mark - + +@implementation SPDatabaseDocument (SPDatabaseViewControllerPrivateAPI) + +/** + * In a threaded task, ensure that the supplied tab is loaded - + * usually as a result of switching to it. + */ +- (void)_loadTabTask:(NSTabViewItem *)tabViewItem +{ + NSAutoreleasePool *tabLoadPool = [[NSAutoreleasePool alloc] init]; + + // If anything other than a single table or view is selected, don't proceed. + if (![self table] + || ([tablesListInstance tableType] != SPTableTypeTable && [tablesListInstance tableType] != SPTableTypeView)) + { + [self endTask]; + [tabLoadPool drain]; + return; + } + + // Get the tab view index and ensure the associated view is loaded + NSInteger selectedTabViewIndex = [[tabViewItem tabView] indexOfTabViewItem:tabViewItem]; + + switch (selectedTabViewIndex) { + case SPTableViewStructure: + if (!structureLoaded) { + [tableSourceInstance loadTable:selectedTableName]; + structureLoaded = YES; + } + break; + case SPTableViewContent: + if (!contentLoaded) { + [tableContentInstance loadTable:selectedTableName]; + contentLoaded = YES; + } + break; + case SPTableViewStatus: + if (!statusLoaded) { + [[extendedTableInfoInstance onMainThread] loadTable:selectedTableName]; + statusLoaded = YES; + } + break; + case SPTableViewTriggers: + if (!triggersLoaded) { + [[tableTriggersInstance onMainThread] loadTriggers]; + triggersLoaded = YES; + } + break; + } + + [self endTask]; + [tabLoadPool drain]; +} + + +/** + * In a threaded task, load the currently selected table/view/proc/function. + */ +- (void)_loadTableTask +{ + NSAutoreleasePool *loadPool = [[NSAutoreleasePool alloc] init]; + NSString *tableEncoding = nil; + + // Update the window title + [[self onMainThread] updateWindowTitle:self]; + + // Reset table information caches + [tableDataInstance resetAllData]; + + // Ensure status and details are fetched using UTF8 + NSString *previousEncoding = [mySQLConnection encoding]; + BOOL changeEncoding = ![previousEncoding isEqualToString:@"utf8"]; + if (changeEncoding) { + [mySQLConnection storeEncodingForRestoration]; + [mySQLConnection setEncoding:@"utf8"]; + } + + // Cache status information on the working thread + [tableDataInstance updateStatusInformationForCurrentTable]; + + // Check the current encoding against the table encoding to see whether + // an encoding change and reset is required + if( selectedTableType == SPTableTypeView || selectedTableType == SPTableTypeTable) { + + // tableEncoding == nil indicates that there was an error while retrieving table data + tableEncoding = [tableDataInstance tableEncoding]; + + // If encoding is set to Autodetect, update the connection character set encoding + // based on the newly selected table's encoding - but only if it differs from the current encoding. + if ([[[NSUserDefaults standardUserDefaults] objectForKey:SPDefaultEncoding] intValue] == SPEncodingAutodetect) { + if (tableEncoding != nil && ![tableEncoding isEqualToString:previousEncoding]) { + [self setConnectionEncoding:tableEncoding reloadingViews:NO]; + changeEncoding = NO; + } + } + } + + if (changeEncoding) [mySQLConnection restoreStoredEncoding]; + + // Notify listeners of the table change now that the state is fully set up. + [[NSNotificationCenter defaultCenter] postNotificationOnMainThreadWithName:SPTableChangedNotification object:self]; + + // Restore view states as appropriate + [spHistoryControllerInstance restoreViewStates]; + + // Reset all loaded views + structureLoaded = NO; + contentLoaded = NO; + statusLoaded = NO; + triggersLoaded = NO; + [tableSourceInstance loadTable:nil]; + [tableContentInstance loadTable:nil]; + [[extendedTableInfoInstance onMainThread] loadTable:nil]; + [[tableTriggersInstance onMainThread] loadTriggers]; + + // Load the currently selected view if looking at a table or view + if (tableEncoding && (selectedTableType == SPTableTypeView || selectedTableType == SPTableTypeTable)) + { + NSInteger selectedTabViewIndex = [tableTabView indexOfTabViewItem:[tableTabView selectedTabViewItem]]; + + switch (selectedTabViewIndex) { + case SPTableViewStructure: + [tableSourceInstance loadTable:selectedTableName]; + structureLoaded = YES; + break; + case SPTableViewContent: + [tableContentInstance loadTable:selectedTableName]; + contentLoaded = YES; + break; + case SPTableViewStatus: + [[extendedTableInfoInstance onMainThread] loadTable:selectedTableName]; + statusLoaded = YES; + break; + case SPTableViewTriggers: + [[tableTriggersInstance onMainThread] loadTriggers]; + triggersLoaded = YES; + break; + } + } + + // Update the "Show Create Syntax" window if it's already opened + // according to the selected table/view/proc/func + if([[[self onMainThread] getCreateTableSyntaxWindow] isVisible]) + [[self onMainThread] showCreateTableSyntax:self]; + + // Add a history entry + [spHistoryControllerInstance updateHistoryEntries]; + + // Empty the loading pool and exit the thread + [self endTask]; + [loadPool drain]; +} + +@end \ No newline at end of file diff --git a/Source/SPExtendedTableInfo.m b/Source/SPExtendedTableInfo.m index bcf726c7..1f67b95d 100644 --- a/Source/SPExtendedTableInfo.m +++ b/Source/SPExtendedTableInfo.m @@ -102,7 +102,7 @@ if ([connection getLastErrorID] == 0) { // Reload the table's data - [tablesListInstance updateSelectionWithTaskString:NSLocalizedString(@"Reloading data...", @"Reloading data task description")]; + [tableDocumentInstance loadTable:selectedTable ofType:[tableDocumentInstance tableType]]; } else { [sender selectItemWithTitle:currentType]; diff --git a/Source/SPHistoryController.m b/Source/SPHistoryController.m index 3d7f00d0..3fb0e100 100644 --- a/Source/SPHistoryController.m +++ b/Source/SPHistoryController.m @@ -413,7 +413,7 @@ // If the same table was selected, mark the content as requiring a reload if ([historyEntry objectForKey:@"table"] && [[theDocument table] isEqualToString:[historyEntry objectForKey:@"table"]]) { - [tablesListInstance setContentRequiresReload:YES]; + [theDocument setContentRequiresReload:YES]; } // Update the database and table name if necessary diff --git a/Source/SPIndexesController.m b/Source/SPIndexesController.m index 09f1a3d8..a19480e6 100644 --- a/Source/SPIndexesController.m +++ b/Source/SPIndexesController.m @@ -716,7 +716,7 @@ static const NSString *SPNewIndexKeyBlockSize = @"IndexKeyBlockSize"; } else { [tableData resetAllData]; - [tablesList setStatusRequiresReload:YES]; + [dbDocument setStatusRequiresReload:YES]; [tableStructure loadTable:table]; } @@ -795,7 +795,7 @@ static const NSString *SPNewIndexKeyBlockSize = @"IndexKeyBlockSize"; } else { [tableData resetAllData]; - [tablesList setStatusRequiresReload:YES]; + [dbDocument setStatusRequiresReload:YES]; [tableStructure loadTable:table]; } diff --git a/Source/SPTableContent.m b/Source/SPTableContent.m index fe9e37ec..3c44b980 100644 --- a/Source/SPTableContent.m +++ b/Source/SPTableContent.m @@ -2005,8 +2005,8 @@ NSUInteger i; // Load table if not already done - if ( ![tablesListInstance contentLoaded] ) { - [self loadTable:[tablesListInstance tableName]]; + if ( ![tableDocumentInstance contentLoaded] ) { + [self loadTable:[tableDocumentInstance table]]; } tableColumns = [tableContentView tableColumns]; @@ -2060,8 +2060,8 @@ NSUInteger i; // Load the table if not already loaded - if ( ![tablesListInstance contentLoaded] ) { - [self loadTable:[tablesListInstance tableName]]; + if ( ![tableDocumentInstance contentLoaded] ) { + [self loadTable:[tableDocumentInstance table]]; } tableColumns = [tableContentView tableColumns]; diff --git a/Source/SPTableStructure.m b/Source/SPTableStructure.m index 86b4a84a..79a0a0a2 100644 --- a/Source/SPTableStructure.m +++ b/Source/SPTableStructure.m @@ -352,7 +352,7 @@ - (IBAction)reloadTable:(id)sender { [tableDataInstance resetAllData]; - [tablesListInstance setStatusRequiresReload:YES]; + [tableDocumentInstance setStatusRequiresReload:YES]; // Query the structure of all databases in the background (mainly for completion) [NSThread detachNewThreadSelector:@selector(queryDbStructureWithUserInfo:) toTarget:mySQLConnection withObject:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], @"forceUpdate", nil]]; @@ -1100,11 +1100,11 @@ currentlyEditingRow = -1; [tableDataInstance resetAllData]; - [tablesListInstance setStatusRequiresReload:YES]; + [tableDocumentInstance setStatusRequiresReload:YES]; [self loadTable:selectedTable]; // Mark the content table for refresh - [tablesListInstance setContentRequiresReload:YES]; + [tableDocumentInstance setContentRequiresReload:YES]; // Query the structure of all databases in the background [NSThread detachNewThreadSelector:@selector(queryDbStructureWithUserInfo:) toTarget:mySQLConnection withObject:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], @"forceUpdate", selectedTable, @"affectedItem", [NSNumber numberWithInt:[tablesListInstance tableType]], @"affectedItemType", nil]]; @@ -1322,8 +1322,8 @@ id field; //load table if not already done - if ( ![tablesListInstance structureLoaded] ) { - [self loadTable:[tablesListInstance tableName]]; + if ( ![tableDocumentInstance structureLoaded] ) { + [self loadTable:[tableDocumentInstance table]]; } //get field names @@ -1525,11 +1525,11 @@ } else { [tableDataInstance resetAllData]; - [tablesListInstance setStatusRequiresReload:YES]; + [tableDocumentInstance setStatusRequiresReload:YES]; [self loadTable:selectedTable]; // Mark the content table cache for refresh - [tablesListInstance setContentRequiresReload:YES]; + [tableDocumentInstance setContentRequiresReload:YES]; } [tableDocumentInstance endTask]; diff --git a/Source/SPTableStructureDelegate.m b/Source/SPTableStructureDelegate.m index 84c0a80c..049e2507 100644 --- a/Source/SPTableStructureDelegate.m +++ b/Source/SPTableStructureDelegate.m @@ -338,11 +338,11 @@ } else { [tableDataInstance resetAllData]; - [tablesListInstance setStatusRequiresReload:YES]; + [tableDocumentInstance setStatusRequiresReload:YES]; [self loadTable:selectedTable]; // Mark the content table cache for refresh - [tablesListInstance setContentRequiresReload:YES]; + [tableDocumentInstance setContentRequiresReload:YES]; if ( originalRowIndex < destinationRowIndex ) { [tableSourceView selectRowIndexes:[NSIndexSet indexSetWithIndex:destinationRowIndex-1] byExtendingSelection:NO]; diff --git a/Source/SPTablesList.h b/Source/SPTablesList.h index f0b0bed4..1ae4eecd 100644 --- a/Source/SPTablesList.h +++ b/Source/SPTablesList.h @@ -56,7 +56,6 @@ IBOutlet id copyTableNameField; IBOutlet id copyTableMessageField; IBOutlet id copyTableContentSwitch; - IBOutlet id tabView; IBOutlet id tableSheet; IBOutlet id tableNameField; IBOutlet id tableEncodingButton; @@ -101,7 +100,7 @@ BOOL tableListIsSelectable; BOOL tableListContainsViews; - BOOL structureLoaded, contentLoaded, statusLoaded, triggersLoaded, alertSheetOpened; + BOOL alertSheetOpened; } // IBAction methods @@ -117,8 +116,6 @@ // Additional methods - (void)setConnection:(MCPConnection *)theConnection; - (void)doPerformQueryService:(NSString *)query; -- (void)updateSelectionWithTaskString:(NSString *)taskString; -- (void)updateSelectionTask; - (void)setSelection:(NSDictionary *)selectionDetails; - (void)selectTableAtIndex:(NSNumber *)row; - (void)makeTableListFilterHaveFocus; @@ -139,18 +136,12 @@ - (NSArray *)allDatabaseNames; - (NSArray *)allSystemDatabaseNames; - (NSString *)selectedDatabase; -- (BOOL)structureLoaded; -- (BOOL)contentLoaded; -- (BOOL)statusLoaded; // Setters - (void)setContentRequiresReload:(BOOL)reload; - (void)setStatusRequiresReload:(BOOL)reload; - (BOOL)selectItemWithName:(NSString *)theName; -// Tabview delegate methods -- (void)loadTabTask:(NSTabViewItem *)tabViewItem; - // Table list filter interaction - (void) showFilter; - (void) hideFilter; diff --git a/Source/SPTablesList.m b/Source/SPTablesList.m index 722c3242..fc7be0f8 100644 --- a/Source/SPTablesList.m +++ b/Source/SPTablesList.m @@ -619,15 +619,6 @@ [self updateTables:self]; } -/** - * Selects customQuery tab and passes query to customQueryInstance - */ -- (void)doPerformQueryService:(NSString *)query -{ - [tabView selectTabViewItemAtIndex:2]; - [customQueryInstance doPerformQueryService:query]; -} - /** * Performs interface validation for various controls. */ @@ -664,135 +655,6 @@ } } -/** - * Updates the current table selection. Triggered most times tableViewSelectionDidChange: - * fires, and also as a result of certain table actions. - */ -- (void)updateSelectionWithTaskString:(NSString *)taskString -{ - if (![mySQLConnection isConnected] || [tablesListView selectedRow] < 0) { - return; - } - id selectedItem = [filteredTables objectAtIndex:[tablesListView selectedRow]]; - if(![selectedItem isKindOfClass:[NSString class]]) { - return; - } - - // If there is a multiple or blank selection, clear all views directly. - if ( [tablesListView numberOfSelectedRows] != 1 || ![(NSString *)selectedItem length] ) { - - // Update the selection variables and the interface - [self performSelectorOnMainThread:@selector(setSelection:) withObject:nil waitUntilDone:YES]; - - // Add a history entry - [spHistoryControllerInstance updateHistoryEntries]; - - // Notify listeners of the table change now that the state is fully set up - [[NSNotificationCenter defaultCenter] postNotificationOnMainThreadWithName:SPTableChangedNotification object:tableDocumentInstance]; - - return; - } - - // Otherwise, set up a task - [tableDocumentInstance startTaskWithDescription:taskString]; - - // If on the main thread, fire up a thread to deal with view changes and data loading, else perform inline - if ([NSThread isMainThread]) { - [NSThread detachNewThreadSelector:@selector(updateSelectionTask) toTarget:self withObject:nil]; - } else { - [self updateSelectionTask]; - } -} - -- (void) updateSelectionTask -{ - NSAutoreleasePool *selectionChangePool = [[NSAutoreleasePool alloc] init]; - NSString *tableEncoding = nil; - NSString *previousEncoding = [mySQLConnection encoding]; - BOOL changeEncoding = ![previousEncoding isEqualToString:@"utf8"]; - if (changeEncoding) { - [mySQLConnection storeEncodingForRestoration]; - [mySQLConnection setEncoding:@"utf8"]; - } - - // Update selection variables and interface - NSDictionary *selectionDetails = [NSDictionary dictionaryWithObjectsAndKeys: - [filteredTables objectAtIndex:[tablesListView selectedRow]], @"name", - [filteredTableTypes objectAtIndex:[tablesListView selectedRow]], @"type", - nil]; - [self performSelectorOnMainThread:@selector(setSelection:) withObject:selectionDetails waitUntilDone:YES]; - - // Ensure status information is cached on the working thread - [tableDataInstance updateStatusInformationForCurrentTable]; - - // Check the encoding if appropriate to determine if an encoding change is required - if( selectedTableType == SPTableTypeView || selectedTableType == SPTableTypeTable) { - - // tableEncoding == nil indicates that there was an error while retrieving table data - tableEncoding = [tableDataInstance tableEncoding]; - - // If encoding is set to Autodetect, update the connection character set encoding - // based on the newly selected table's encoding - but only if it differs from the current encoding. - if ([[[NSUserDefaults standardUserDefaults] objectForKey:SPDefaultEncoding] intValue] == SPEncodingAutodetect) { - if (tableEncoding != nil && ![tableEncoding isEqualToString:previousEncoding]) { - [tableDocumentInstance setConnectionEncoding:tableEncoding reloadingViews:NO]; - changeEncoding = NO; - } - } - } - - if (changeEncoding) [mySQLConnection restoreStoredEncoding]; - - // Notify listeners of the table change now that the state is fully set up. - [[NSNotificationCenter defaultCenter] postNotificationOnMainThreadWithName:SPTableChangedNotification object:tableDocumentInstance]; - - // Restore view states as appropriate - [spHistoryControllerInstance restoreViewStates]; - - structureLoaded = NO; - contentLoaded = NO; - statusLoaded = NO; - triggersLoaded = NO; - if( selectedTableType == SPTableTypeView || selectedTableType == SPTableTypeTable) { - if ( [tabView indexOfTabViewItem:[tabView selectedTabViewItem]] == SPTableViewStructure ) { - [tableSourceInstance loadTable:selectedTableName]; - structureLoaded = YES; - } else if ( [tabView indexOfTabViewItem:[tabView selectedTabViewItem]] == SPTableViewContent ) { - if(tableEncoding == nil) { - [tableContentInstance loadTable:nil]; - } else { - [tableContentInstance loadTable:selectedTableName]; - } - contentLoaded = YES; - } else if ( [tabView indexOfTabViewItem:[tabView selectedTabViewItem]] == SPTableViewStatus ) { - [[extendedTableInfoInstance onMainThread] loadTable:selectedTableName]; - statusLoaded = YES; - } else if ( [tabView indexOfTabViewItem:[tabView selectedTabViewItem]] == SPTableViewTriggers ) { - [[tableTriggersInstance onMainThread] loadTriggers]; - triggersLoaded = YES; - } - } else { - - // if we are not looking at a table or view, clear these - [tableSourceInstance loadTable:nil]; - [tableContentInstance loadTable:nil]; - [[extendedTableInfoInstance onMainThread] loadTable:nil]; - [[tableTriggersInstance onMainThread] loadTriggers]; - } - - // Update the "Show Create Syntax" window if it's already opened - // according to the selected table/view/proc/func - if([[tableDocumentInstance getCreateTableSyntaxWindow] isVisible]) - [tableDocumentInstance performSelectorOnMainThread:@selector(showCreateTableSyntax:) withObject:self waitUntilDone:YES]; - - // Add a history entry - [spHistoryControllerInstance updateHistoryEntries]; - - // Empty the loading pool and exit the thread - [tableDocumentInstance endTask]; - [selectionChangePool drain]; -} - /** * Takes a dictionary of selection details, containing the selection name * and type, and updates stored variables and the table list interface to @@ -815,18 +677,6 @@ selectedTableName = nil; } - selectedTableType = SPTableTypeNone; - - [tableSourceInstance loadTable:nil]; - [tableContentInstance loadTable:nil]; - [extendedTableInfoInstance loadTable:nil]; - [tableTriggersInstance loadTriggers]; - - structureLoaded = NO; - contentLoaded = NO; - statusLoaded = NO; - triggersLoaded = NO; - // Set gear menu items Remove/Duplicate table/view according to the table types // if at least one item is selected if ([indexes count]) { @@ -922,9 +772,6 @@ [[tableSubMenu itemAtIndex:9] setHidden:NO]; [[tableSubMenu itemAtIndex:10] setHidden:NO]; - // set window title - [tableDocumentInstance updateWindowTitle:self]; - return; } @@ -947,10 +794,7 @@ [tablesListView reloadData]; } - // Reset the table information caches - [tableDataInstance resetAllData]; - - // Show menu separatoes + // Show menu separators [separatorTableMenuItem setHidden:NO]; [separatorTableContextMenuItem setHidden:NO]; [separatorTableMenuItem2 setHidden:NO]; @@ -1094,9 +938,6 @@ [showCreateSyntaxContextMenuItem setHidden:NO]; [showCreateSyntaxContextMenuItem setTitle:NSLocalizedString(@"Show Create Function Syntax...", @"show create func syntax menu item")]; } - - // set window title - [tableDocumentInstance updateWindowTitle:self]; } #pragma mark - @@ -1259,48 +1100,10 @@ return tableTypes; } -/** - * Returns YES if table source has already been loaded - */ -- (BOOL)structureLoaded -{ - return structureLoaded; -} - -/** - * Returns YES if table content has already been loaded - */ -- (BOOL)contentLoaded -{ - return contentLoaded; -} - -/** - * Returns YES if table status has already been loaded - */ -- (BOOL)statusLoaded -{ - return statusLoaded; -} #pragma mark - #pragma mark Setter methods -/** - * Mark the content table for refresh when it's next switched to - */ -- (void)setContentRequiresReload:(BOOL)reload -{ - contentLoaded = !reload; -} - -/** - * Mark the exteded table info for refresh when it's next switched to - */ -- (void)setStatusRequiresReload:(BOOL)reload -{ - statusLoaded = !reload; -} /** * Select an item using the provided name; returns YES if the @@ -1343,7 +1146,7 @@ selectedTableName = [[NSString alloc] initWithString:[tables objectAtIndex:itemIndex]]; selectedTableType = [[tableTypes objectAtIndex:itemIndex] integerValue]; [self updateFilter:self]; - [self updateSelectionWithTaskString:[NSString stringWithFormat:NSLocalizedString(@"Loading %@...", @"Loading table task string"), theName]]; + [tableDocumentInstance loadTable:selectedTableName ofType:selectedTableType]; } } @@ -1428,31 +1231,10 @@ if (selectedTableName) [selectedTableName release]; selectedTableName = [[NSString alloc] initWithString:newTableName]; - // if the 'table' is a view or a table, reload the currently selected view + // if the 'table' is a view or a table, ensure data is reloaded if (selectedTableType == SPTableTypeTable || selectedTableType == SPTableTypeView) { - statusLoaded = NO; - structureLoaded = NO; - contentLoaded = NO; - triggersLoaded = NO; - switch ([tabView indexOfTabViewItem:[tabView selectedTabViewItem]]) { - case SPTableViewStructure: - [tableSourceInstance loadTable:newTableName]; - structureLoaded = YES; - break; - case SPTableViewContent: - [tableContentInstance loadTable:newTableName]; - contentLoaded = YES; - break; - case SPTableViewStatus: - [extendedTableInfoInstance loadTable:newTableName]; - statusLoaded = YES; - break; - case SPTableViewTriggers: - [tableTriggersInstance loadTriggers]; - triggersLoaded = YES; - break; - } + [tableDocumentInstance loadTable:selectedTableName ofType:selectedTableType]; } } @catch (NSException * myException) { @@ -1516,28 +1298,18 @@ */ - (void)tableViewSelectionDidChange:(NSNotification *)aNotification { + if ([tablesListView numberOfSelectedRows] != 1) { - if([tablesListView selectedRow] < 0) { - // Reset all - if (selectedTableName) [selectedTableName release]; - selectedTableName = nil; + // Ensure the state is cleared + if ([tableDocumentInstance table]) [tableDocumentInstance loadTable:nil ofType:SPTableTypeNone]; + if (selectedTableName) [selectedTableName release], selectedTableName = nil; selectedTableType = SPTableTypeNone; - [tableSourceInstance loadTable:nil]; - [tableContentInstance loadTable:nil]; - [extendedTableInfoInstance loadTable:nil]; - [tableTriggersInstance loadTriggers]; - structureLoaded = NO; - contentLoaded = NO; - statusLoaded = NO; - triggersLoaded = NO; - [self updateSelectionWithTaskString:NSLocalizedString(@"Reloading...", @"Reloading table task string")]; return; } - id selectedItem = [filteredTables objectAtIndex:[tablesListView selectedRow]]; + NSInteger selectedRowIndex = [tablesListView selectedRow]; - if(![selectedItem isKindOfClass:[NSString class]]) { - [self updateSelectionWithTaskString:NSLocalizedString(@"Reloading...", @"Reloading table task string")]; + if (![[filteredTables objectAtIndex:selectedRowIndex] isKindOfClass:[NSString class]]) { return; } @@ -1545,32 +1317,28 @@ if ([tableDocumentInstance isWorking]) tableListIsSelectable = NO; // Perform no action if the selected table hasn't actually changed - reselection etc - if ([tablesListView numberOfSelectedRows] == 1 - && [(NSString *)selectedItem length] - && [selectedTableName isEqualToString:(NSString *)selectedItem] - && selectedTableType == [[filteredTableTypes objectAtIndex:[tablesListView selectedRow]] integerValue]) - { + NSString *newName = [filteredTables objectAtIndex:selectedRowIndex]; + NSInteger newType = [[filteredTableTypes objectAtIndex:selectedRowIndex] integerValue]; + if ([selectedTableName isEqualToString:newName] && selectedTableType == newType) { return; } // Save existing scroll position and details [spHistoryControllerInstance updateHistoryEntries]; - NSString *tableName = @"data"; - if ([tablesListView numberOfSelectedRows] == 1 && [selectedItem isKindOfClass:[NSString class]] && [(NSString *)selectedItem length]) - tableName = [filteredTables objectAtIndex:[tablesListView selectedRow]]; - [self updateSelectionWithTaskString:[NSString stringWithFormat:NSLocalizedString(@"Loading %@...", @"Loading table task string"), tableName]]; + if (selectedTableName) [selectedTableName release], selectedTableName = nil; + selectedTableName = [[NSString alloc] initWithString:newName]; + selectedTableType = newType; + [tableDocumentInstance loadTable:selectedTableName ofType:selectedTableType]; - if([[SPNavigatorController sharedNavigatorController] syncMode] && [tablesListView numberOfSelectedRows] == 1) { + if([[SPNavigatorController sharedNavigatorController] syncMode]) { NSMutableString *schemaPath = [NSMutableString string]; [schemaPath setString:[tableDocumentInstance connectionID]]; if([tableDocumentInstance database] && [[tableDocumentInstance database] length]) { [schemaPath appendString:SPUniqueSchemaDelimiter]; [schemaPath appendString:[tableDocumentInstance database]]; - if(tableName && [tableName length]) { - [schemaPath appendString:SPUniqueSchemaDelimiter]; - [schemaPath appendString:tableName]; - } + [schemaPath appendString:SPUniqueSchemaDelimiter]; + [schemaPath appendString:selectedTableName]; } [[SPNavigatorController sharedNavigatorController] selectPath:schemaPath]; } @@ -1682,57 +1450,7 @@ } #pragma mark - -#pragma mark TabView delegate methods - -/** - * Loads structure or source if tab selected the first time, - * using a threaded load if currently on the main thread. - */ -- (void)tabView:(NSTabView *)aTabView didSelectTabViewItem:(NSTabViewItem *)tabViewItem -{ - [tableDocumentInstance startTaskWithDescription:[NSString stringWithFormat:NSLocalizedString(@"Loading %@...", @"Loading table task string"), selectedTableName]]; - if ([NSThread isMainThread]) { - [NSThread detachNewThreadSelector:@selector(loadTabTask:) toTarget:self withObject:tabViewItem]; - } else { - [self loadTabTask:tabViewItem]; - } -} -- (void)loadTabTask:(NSTabViewItem *)tabViewItem -{ - NSAutoreleasePool *tabLoadPool = [[NSAutoreleasePool alloc] init]; - - if ([tablesListView numberOfSelectedRows] == 1 - && ([self tableType] == SPTableTypeTable || [self tableType] == SPTableTypeView) ) - { - - if ( ([tabView indexOfTabViewItem:[tabView selectedTabViewItem]] == SPTableViewStructure) && !structureLoaded ) { - [tableSourceInstance loadTable:selectedTableName]; - structureLoaded = YES; - } - - if ( ([tabView indexOfTabViewItem:[tabView selectedTabViewItem]] == SPTableViewContent) && !contentLoaded ) { - [tableContentInstance loadTable:selectedTableName]; - contentLoaded = YES; - } - - if ( ([tabView indexOfTabViewItem:[tabView selectedTabViewItem]] == SPTableViewStatus) && !statusLoaded ) { - [[extendedTableInfoInstance onMainThread] loadTable:selectedTableName]; - statusLoaded = YES; - } - - if ( ([tabView indexOfTabViewItem:[tabView selectedTabViewItem]] == SPTableViewTriggers) && !triggersLoaded ) { - [[tableTriggersInstance onMainThread] loadTriggers]; - triggersLoaded = YES; - } - } - else { - [tableSourceInstance loadTable:nil]; - [tableContentInstance loadTable:nil]; - } - - [tableDocumentInstance endTask]; - [tabLoadPool drain]; -} +#pragma mark Interface validation /** * Menu item interface validation @@ -1949,10 +1667,6 @@ filteredTables = tables; tableTypes = [[NSMutableArray alloc] init]; filteredTableTypes = tableTypes; - structureLoaded = NO; - contentLoaded = NO; - statusLoaded = NO; - triggersLoaded = NO; isTableListFiltered = NO; tableListIsSelectable = YES; tableListContainsViews = NO; @@ -2159,11 +1873,7 @@ } // Ensure the the table's content view is updated to show that it has been truncated - if ([tabView indexOfTabViewItem:[tabView selectedTabViewItem]] == SPTableViewContent) { - [tableContentInstance reloadTable:self]; - } else { - [self setContentRequiresReload:YES]; - } + [tableDocumentInstance setContentRequiresReload:YES]; [tableDataInstance resetStatusData]; } @@ -2233,17 +1943,16 @@ [tableTypes insertObject:[NSNumber numberWithInteger:SPTableTypeTable] atIndex:addItemAtIndex]; } - // Set the selected table name and type, and then use updateFilter and updateSelection to update the filter list and selection. + // Set the selected table name and type, and then update the filter list and the + // selection. if (selectedTableName) [selectedTableName release]; - selectedTableName = [[NSString alloc] initWithString:tableName]; selectedTableType = SPTableTypeTable; [self updateFilter:self]; - [tablesListView scrollRowToVisible:[tablesListView selectedRow]]; - [self updateSelectionWithTaskString:[NSString stringWithFormat:NSLocalizedString(@"Loading %@...", @"Loading table task string"), selectedTableName]]; + [tableDocumentInstance loadTable:selectedTableName ofType:selectedTableType]; // Query the structure of all databases in the background (mainly for completion) [NSThread detachNewThreadSelector:@selector(queryDbStructureWithUserInfo:) toTarget:mySQLConnection withObject:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], @"forceUpdate", nil]]; @@ -2439,7 +2148,7 @@ selectedTableType = tblType; [self updateFilter:self]; [tablesListView scrollRowToVisible:[tablesListView selectedRow]]; - [self updateSelectionWithTaskString:[NSString stringWithFormat:NSLocalizedString(@"Loading %@...", @"Loading table task string"), selectedTableName]]; + [tableDocumentInstance loadTable:selectedTableName ofType:selectedTableType]; // Query the structure of all databases in the background (mainly for completion) [NSThread detachNewThreadSelector:@selector(queryDbStructureWithUserInfo:) toTarget:mySQLConnection withObject:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], @"forceUpdate", nil]]; diff --git a/Source/SPWindowController.m b/Source/SPWindowController.m index 22b7c13d..b22248fe 100644 --- a/Source/SPWindowController.m +++ b/Source/SPWindowController.m @@ -106,7 +106,7 @@ // Set up a new tab with the connection view as the identifier, add the view, and add it to the tab view NSTabViewItem *newItem = [[[NSTabViewItem alloc] initWithIdentifier:newTableDocument] autorelease]; - [newItem setView:[newTableDocument parentView]]; + [newItem setView:[newTableDocument databaseView]]; [tabView addTabViewItem:newItem]; [tabView selectTabViewItem:newItem]; [newTableDocument setParentTabViewItem:newItem]; diff --git a/sequel-pro.xcodeproj/project.pbxproj b/sequel-pro.xcodeproj/project.pbxproj index c61ac93c..def9b39d 100644 --- a/sequel-pro.xcodeproj/project.pbxproj +++ b/sequel-pro.xcodeproj/project.pbxproj @@ -231,6 +231,7 @@ 588B2CCA0FE5641E00EC5FC0 /* ssh-disconnected.png in Resources */ = {isa = PBXBuildFile; fileRef = 588B2CC70FE5641E00EC5FC0 /* ssh-disconnected.png */; }; 589235321020C1230011DE00 /* SPHistoryController.m in Sources */ = {isa = PBXBuildFile; fileRef = 589235301020C1230011DE00 /* SPHistoryController.m */; }; 589582151154F8F400EDCC28 /* SPMainThreadTrampoline.m in Sources */ = {isa = PBXBuildFile; fileRef = 589582141154F8F400EDCC28 /* SPMainThreadTrampoline.m */; }; + 5897FE4F127DE86D0047897C /* SPDatabaseViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5897FE4E127DE86D0047897C /* SPDatabaseViewController.m */; }; 589ED05B11E0ACD100C1DCEA /* DMLocalizedNib.m in Sources */ = {isa = PBXBuildFile; fileRef = 589ED05A11E0ACD100C1DCEA /* DMLocalizedNib.m */; }; 58A137CD123ED5E6000B1B75 /* titlebarlock.png in Resources */ = {isa = PBXBuildFile; fileRef = 58A137CC123ED5E6000B1B75 /* titlebarlock.png */; }; 58A8A72711A0149100B95749 /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 58A8A72611A0149100B95749 /* MainWindow.xib */; }; @@ -866,6 +867,8 @@ 589235311020C1230011DE00 /* SPHistoryController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPHistoryController.h; sourceTree = ""; }; 589582131154F8F400EDCC28 /* SPMainThreadTrampoline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPMainThreadTrampoline.h; sourceTree = ""; }; 589582141154F8F400EDCC28 /* SPMainThreadTrampoline.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPMainThreadTrampoline.m; sourceTree = ""; }; + 5897FE4D127DE86D0047897C /* SPDatabaseViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPDatabaseViewController.h; sourceTree = ""; }; + 5897FE4E127DE86D0047897C /* SPDatabaseViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPDatabaseViewController.m; sourceTree = ""; }; 589ED05A11E0ACD100C1DCEA /* DMLocalizedNib.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DMLocalizedNib.m; sourceTree = ""; }; 58A137CC123ED5E6000B1B75 /* titlebarlock.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = titlebarlock.png; sourceTree = ""; }; 58A8A72411A0148400B95749 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/MainWindow.xib; sourceTree = ""; }; @@ -1356,6 +1359,8 @@ 29FA88221114619E00D1AF3D /* SPTableTriggers.m */, 17E6414E0EF01EF6001BC333 /* SPTableContent.h */, 17E6414F0EF01EF6001BC333 /* SPTableContent.m */, + 5897FE4D127DE86D0047897C /* SPDatabaseViewController.h */, + 5897FE4E127DE86D0047897C /* SPDatabaseViewController.m */, 17E641500EF01EF6001BC333 /* SPDatabaseDocument.h */, 17E641510EF01EF6001BC333 /* SPDatabaseDocument.m */, 17D38FC2127B0C9500672B13 /* Connection View */, @@ -2513,7 +2518,6 @@ isa = PBXProject; buildConfigurationList = C05733CB08A9546B00998B17 /* Build configuration list for PBXProject "sequel-pro" */; compatibilityVersion = "Xcode 3.1"; - developmentRegion = English; hasScannedForEncodings = 1; knownRegions = ( English, @@ -2956,6 +2960,7 @@ 175EC63512733B36009A7C0F /* SPExportControllerDelegate.m in Sources */, 17D38EBC12771A1C00672B13 /* SPTableStructureDelegate.m in Sources */, 17D38F701279E23A00672B13 /* SPTableFieldValidation.m in Sources */, + 5897FE4F127DE86D0047897C /* SPDatabaseViewController.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; -- cgit v1.2.3