From a434272a852db341a6ea4421e388ef924b6a99d7 Mon Sep 17 00:00:00 2001 From: stuconnolly Date: Sat, 7 Jul 2012 10:12:12 +0000 Subject: Add a new SPAppController SPWindowManagement. --- Source/SPAppController.h | 6 -- Source/SPAppController.m | 148 +++++--------------------------- Source/SPAppleScriptSupport.m | 1 + Source/SPDatabaseDocument.m | 1 + Source/SPTextViewAdditions.m | 1 + Source/SPWindowManagement.h | 49 +++++++++++ Source/SPWindowManagement.m | 160 +++++++++++++++++++++++++++++++++++ sequel-pro.xcodeproj/project.pbxproj | 6 ++ 8 files changed, 238 insertions(+), 134 deletions(-) create mode 100644 Source/SPWindowManagement.h create mode 100644 Source/SPWindowManagement.m diff --git a/Source/SPAppController.h b/Source/SPAppController.h index 20961ac5..798aca4c 100644 --- a/Source/SPAppController.h +++ b/Source/SPAppController.h @@ -63,12 +63,6 @@ - (IBAction)bundleCommandDispatcher:(id)sender; -// Window management -- (IBAction)newWindow:(id)sender; -- (IBAction)newTab:(id)sender; -- (IBAction)duplicateTab:(id)sender; -- (NSWindow *) frontDocumentWindow; - // IBAction methods - (IBAction)openAboutPanel:(id)sender; - (IBAction)openPreferences:(id)sender; diff --git a/Source/SPAppController.m b/Source/SPAppController.m index fa9dbc4a..d251222d 100644 --- a/Source/SPAppController.m +++ b/Source/SPAppController.m @@ -41,6 +41,7 @@ #import "SPFavoritesController.h" #import "SPEditorTokens.h" #import "SPBundleCommandRunner.h" +#import "SPWindowManagement.h" #import #import @@ -60,6 +61,9 @@ YY_BUFFER_STATE yy_scan_string (const char *); @synthesize lastBundleBlobFilesDirectory; +#pragma mark - +#pragma mark Initialisation + /** * Initialise the application's main controller, setting itself as the app delegate. */ @@ -150,17 +154,18 @@ YY_BUFFER_STATE yy_scan_string (const char *); */ - (BOOL)validateMenuItem:(NSMenuItem *)menuItem { - if ([menuItem action] == @selector(openCurrentConnectionInNewWindow:)) { [menuItem setTitle:NSLocalizedString(@"Open in New Window", @"menu item open in new window")]; return NO; } + if ([menuItem action] == @selector(newTab:)) { return ([[self frontDocumentWindow] attachedSheet] == nil); } + if ([menuItem action] == @selector(duplicateTab:)) { return ([[self frontDocument] getConnection] != nil); @@ -1220,121 +1225,6 @@ YY_BUFFER_STATE yy_scan_string (const char *); return (NSArray*)runningActivitiesArray; } -#pragma mark - -#pragma mark Window management - -/** - * Create a new window, containing a single tab. - */ -- (IBAction)newWindow:(id)sender -{ - static NSPoint cascadeLocation = {.x = 0, .y = 0}; - - // Create a new window controller, and set up a new connection view within it. - SPWindowController *newWindowController = [[SPWindowController alloc] initWithWindowNibName:@"MainWindow"]; - NSWindow *newWindow = [newWindowController window]; - - // Cascading defaults to on - retrieve the window origin automatically assigned by cascading, - // and convert to a top left point. - NSPoint topLeftPoint = [newWindow frame].origin; - topLeftPoint.y += [newWindow frame].size.height; - - // The first window should use autosaving; subsequent windows should cascade. - // So attempt to set the frame autosave name; this will succeed for the very - // first window, and fail for others. - BOOL usedAutosave = [newWindow setFrameAutosaveName:@"DBView"]; - if (!usedAutosave) { - [newWindow setFrameUsingName:@"DBView"]; - } - - // Add the connection view - [newWindowController addNewConnection:self]; - - // Cascade according to the statically stored cascade location. - cascadeLocation = [newWindow cascadeTopLeftFromPoint:cascadeLocation]; - - // Set the window controller as the window's delegate - [newWindow setDelegate:newWindowController]; - - // Show the window, and perform frontmost tasks again once the window has drawn - [newWindowController showWindow:self]; - [[newWindowController selectedTableDocument] didBecomeActiveTabInWindow]; -} - -/** - * Create a new tab in the frontmost window. - */ -- (IBAction)newTab:(id)sender -{ - SPWindowController *frontController = nil; - - for (NSWindow *aWindow in [NSApp orderedWindows]) { - if ([[aWindow windowController] isMemberOfClass:[SPWindowController class]]) { - frontController = [aWindow windowController]; - break; - } - } - - // If no window was found, create a new one - if (!frontController) { - [self newWindow:self]; - } else { - if ([[frontController window] isMiniaturized]) [[frontController window] deminiaturize:self]; - [frontController addNewConnection:self]; - } -} - -/** - * Duplicate the current connection tab - */ -- (IBAction)duplicateTab:(id)sender -{ - SPDatabaseDocument *theFrontDocument = [self frontDocument]; - if (!theFrontDocument) return [self newTab:sender]; - - // Add a new tab to the window - if ([[self frontDocumentWindow] isMiniaturized]) [[self frontDocumentWindow] deminiaturize:self]; - [[[self frontDocumentWindow] windowController] addNewConnection:self]; - - // Get the state of the previously-frontmost document - NSDictionary *allStateDetails = [NSDictionary dictionaryWithObjectsAndKeys: - [NSNumber numberWithBool:YES], @"connection", - [NSNumber numberWithBool:YES], @"history", - [NSNumber numberWithBool:YES], @"session", - [NSNumber numberWithBool:YES], @"query", - [NSNumber numberWithBool:YES], @"password", - nil]; - NSMutableDictionary *theFrontState = [NSMutableDictionary dictionaryWithDictionary:[theFrontDocument stateIncludingDetails:allStateDetails]]; - - // Ensure it's set to autoconnect - [theFrontState setObject:[NSNumber numberWithBool:YES] forKey:@"auto_connect"]; - - // Set the connection on the new tab - [[self frontDocument] setState:theFrontState]; -} - -/** - * Retrieve the frontmost document window; returns nil if not found. - */ -- (NSWindow *) frontDocumentWindow -{ - for (NSWindow *aWindow in [NSApp orderedWindows]) { - if ([[aWindow windowController] isMemberOfClass:[SPWindowController class]]) { - return aWindow; - } - } - - return nil; -} - -/** - * When tab drags start, bring all the windows in front of other applications. - */ -- (void)tabDragStarted:(id)sender -{ - [NSApp arrangeInFront:self]; -} - #pragma mark - #pragma mark IBAction methods @@ -2075,18 +1965,20 @@ YY_BUFFER_STATE yy_scan_string (const char *); */ - (NSMutableDictionary*)anonymizePreferencesForFeedbackReport:(NSMutableDictionary *)preferences { - [preferences removeObjectsForKeys:[NSArray arrayWithObjects:@"ContentFilters", - @"favorites", - @"lastSqlFileName", - @"NSNavLastRootDirectory", - @"openPath", - @"queryFavorites", - @"queryHistory", - @"tableColumnWidths", - @"savePath", - @"NSRecentDocumentRecords", - nil]]; - + [preferences removeObjectsForKeys: + [NSArray arrayWithObjects: + @"ContentFilters", + @"favorites", + @"lastSqlFileName", + @"NSNavLastRootDirectory", + @"openPath", + @"queryFavorites", + @"queryHistory", + @"tableColumnWidths", + @"savePath", + @"NSRecentDocumentRecords", + nil]]; + return preferences; } diff --git a/Source/SPAppleScriptSupport.m b/Source/SPAppleScriptSupport.m index 337a14dc..9225ea61 100644 --- a/Source/SPAppleScriptSupport.m +++ b/Source/SPAppleScriptSupport.m @@ -28,6 +28,7 @@ #import "SPAppController.h" #import "SPPrintController.h" #import "SPDatabaseDocument.h" +#import "SPWindowManagement.h" @implementation SPAppController (SPAppleScriptSupport) diff --git a/Source/SPDatabaseDocument.m b/Source/SPDatabaseDocument.m index e5cc23b8..5f7cb49a 100644 --- a/Source/SPDatabaseDocument.m +++ b/Source/SPDatabaseDocument.m @@ -63,6 +63,7 @@ enum { #import "SPDatabaseStructure.h" #ifndef SP_REFACTOR /* headers */ #import "SPAppController.h" +#import "SPWindowManagement.h" #import "SPExtendedTableInfo.h" #import "SPHistoryController.h" #import "SPPreferenceController.h" diff --git a/Source/SPTextViewAdditions.m b/Source/SPTextViewAdditions.m index e8eb838e..33e0a1f9 100644 --- a/Source/SPTextViewAdditions.m +++ b/Source/SPTextViewAdditions.m @@ -30,6 +30,7 @@ #import "SPCustomQuery.h" #ifndef SP_REFACTOR /* headers */ #import "SPAppController.h" +#import "SPWindowManagement.h" #endif #import "SPFieldEditorController.h" #import "SPTextView.h" diff --git a/Source/SPWindowManagement.h b/Source/SPWindowManagement.h new file mode 100644 index 00000000..e9938d63 --- /dev/null +++ b/Source/SPWindowManagement.h @@ -0,0 +1,49 @@ +// +// $Id$ +// +// SPWindowManagement.h +// Sequel Pro +// +// Created by Stuart Connolly (stuconnolly.com) on July 7, 2012 +// Copyright (c) 2012 Stuart Connolly. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. + +#import "SPAppController.h" + +/** + * @category SPWindowManagement SPWindowManagement.h + * + * @author Stuart Connolly http://stuconnolly.com/ + * + * Contains all of the main window management methods. + */ +@interface SPAppController (SPWindowManagement) + +- (IBAction)newWindow:(id)sender; +- (IBAction)newTab:(id)sender; +- (IBAction)duplicateTab:(id)sender; + +- (NSWindow *)frontDocumentWindow; +- (void)tabDragStarted:(id)sender; + +@end diff --git a/Source/SPWindowManagement.m b/Source/SPWindowManagement.m new file mode 100644 index 00000000..40ec9d16 --- /dev/null +++ b/Source/SPWindowManagement.m @@ -0,0 +1,160 @@ +// +// $Id$ +// +// SPWindowManagement.m +// Sequel Pro +// +// Created by Stuart Connolly (stuconnolly.com) on July 7, 2012 +// Copyright (c) 2012 Stuart Connolly. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. + +#import "SPWindowManagement.h" +#import "SPWindowController.h" +#import "SPDatabaseDocument.h" + +@implementation SPAppController (SPWindowManagement) + +/** + * Create a new window, containing a single tab. + */ +- (IBAction)newWindow:(id)sender +{ + static NSPoint cascadeLocation = {.x = 0, .y = 0}; + + // Create a new window controller, and set up a new connection view within it. + SPWindowController *newWindowController = [[SPWindowController alloc] initWithWindowNibName:@"MainWindow"]; + NSWindow *newWindow = [newWindowController window]; + + // Cascading defaults to on - retrieve the window origin automatically assigned by cascading, + // and convert to a top left point. + NSPoint topLeftPoint = [newWindow frame].origin; + topLeftPoint.y += [newWindow frame].size.height; + + // The first window should use autosaving; subsequent windows should cascade. + // So attempt to set the frame autosave name; this will succeed for the very + // first window, and fail for others. + BOOL usedAutosave = [newWindow setFrameAutosaveName:@"DBView"]; + + if (!usedAutosave) { + [newWindow setFrameUsingName:@"DBView"]; + } + + // Add the connection view + [newWindowController addNewConnection:self]; + + // Cascade according to the statically stored cascade location. + cascadeLocation = [newWindow cascadeTopLeftFromPoint:cascadeLocation]; + + // Set the window controller as the window's delegate + [newWindow setDelegate:newWindowController]; + + // Show the window, and perform frontmost tasks again once the window has drawn + [newWindowController showWindow:self]; + [[newWindowController selectedTableDocument] didBecomeActiveTabInWindow]; +} + +/** + * Create a new tab in the frontmost window. + */ +- (IBAction)newTab:(id)sender +{ + SPWindowController *frontController = nil; + + for (NSWindow *aWindow in [NSApp orderedWindows]) + { + if ([[aWindow windowController] isMemberOfClass:[SPWindowController class]]) { + frontController = [aWindow windowController]; + break; + } + } + + // If no window was found, create a new one + if (!frontController) { + [self newWindow:self]; + } + else { + if ([[frontController window] isMiniaturized]) { + [[frontController window] deminiaturize:self]; + } + + [frontController addNewConnection:self]; + } +} + +/** + * Duplicate the current connection tab + */ +- (IBAction)duplicateTab:(id)sender +{ + SPDatabaseDocument *theFrontDocument = [self frontDocument]; + + if (!theFrontDocument) return [self newTab:sender]; + + // Add a new tab to the window + if ([[self frontDocumentWindow] isMiniaturized]) { + [[self frontDocumentWindow] deminiaturize:self]; + } + + [[[self frontDocumentWindow] windowController] addNewConnection:self]; + + // Get the state of the previously-frontmost document + NSDictionary *allStateDetails = [NSDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithBool:YES], @"connection", + [NSNumber numberWithBool:YES], @"history", + [NSNumber numberWithBool:YES], @"session", + [NSNumber numberWithBool:YES], @"query", + [NSNumber numberWithBool:YES], @"password", + nil]; + + NSMutableDictionary *frontState = [NSMutableDictionary dictionaryWithDictionary:[theFrontDocument stateIncludingDetails:allStateDetails]]; + + // Ensure it's set to autoconnect + [frontState setObject:[NSNumber numberWithBool:YES] forKey:@"auto_connect"]; + + // Set the connection on the new tab + [[self frontDocument] setState:frontState]; +} + +/** + * Retrieve the frontmost document window; returns nil if not found. + */ +- (NSWindow *)frontDocumentWindow +{ + for (NSWindow *aWindow in [NSApp orderedWindows]) { + if ([[aWindow windowController] isMemberOfClass:[SPWindowController class]]) { + return aWindow; + } + } + + return nil; +} + +/** + * When tab drags start, bring all the windows in front of other applications. + */ +- (void)tabDragStarted:(id)sender +{ + [NSApp arrangeInFront:self]; +} + +@end diff --git a/sequel-pro.xcodeproj/project.pbxproj b/sequel-pro.xcodeproj/project.pbxproj index 05c9dc00..43007b76 100644 --- a/sequel-pro.xcodeproj/project.pbxproj +++ b/sequel-pro.xcodeproj/project.pbxproj @@ -58,6 +58,7 @@ 173C839511AAD32A00B8B084 /* SPXMLExporterDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 173C838F11AAD32A00B8B084 /* SPXMLExporterDelegate.m */; }; 1740FABB0FC4372F00CF3699 /* SPDatabaseData.m in Sources */ = {isa = PBXBuildFile; fileRef = 1740FABA0FC4372F00CF3699 /* SPDatabaseData.m */; }; 1748D50C15A4444F003562F2 /* SPTableStructureLoading.m in Sources */ = {isa = PBXBuildFile; fileRef = 1748D50B15A4444F003562F2 /* SPTableStructureLoading.m */; }; + 1748D58615A83E54003562F2 /* SPWindowManagement.m in Sources */ = {isa = PBXBuildFile; fileRef = 1748D58515A83E54003562F2 /* SPWindowManagement.m */; }; 174CE11E10AB80B5008F892B /* DatabaseProcessList.xib in Resources */ = {isa = PBXBuildFile; fileRef = 174CE11C10AB80B5008F892B /* DatabaseProcessList.xib */; }; 174CE14210AB9281008F892B /* SPProcessListController.m in Sources */ = {isa = PBXBuildFile; fileRef = 174CE14110AB9281008F892B /* SPProcessListController.m */; }; 175EC63512733B36009A7C0F /* SPExportControllerDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 175EC63412733B36009A7C0F /* SPExportControllerDelegate.m */; }; @@ -657,6 +658,8 @@ 1740FABA0FC4372F00CF3699 /* SPDatabaseData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPDatabaseData.m; sourceTree = ""; }; 1748D50A15A4444F003562F2 /* SPTableStructureLoading.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPTableStructureLoading.h; sourceTree = ""; }; 1748D50B15A4444F003562F2 /* SPTableStructureLoading.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPTableStructureLoading.m; sourceTree = ""; }; + 1748D58415A83E54003562F2 /* SPWindowManagement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPWindowManagement.h; sourceTree = ""; }; + 1748D58515A83E54003562F2 /* SPWindowManagement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPWindowManagement.m; sourceTree = ""; }; 174A345112DA4ED000DB0ADE /* create-test-stubs.pl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.perl; path = "create-test-stubs.pl"; sourceTree = ""; }; 174CE11D10AB80B5008F892B /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = Interfaces/English.lproj/DatabaseProcessList.xib; sourceTree = ""; }; 174CE14010AB9281008F892B /* SPProcessListController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPProcessListController.h; sourceTree = ""; }; @@ -1957,6 +1960,8 @@ 17E6414B0EF01EF6001BC333 /* SPAppController.m */, 1798AB8F1267924D000D946A /* SPAppleScriptSupport.h */, 1798AB901267924D000D946A /* SPAppleScriptSupport.m */, + 1748D58415A83E54003562F2 /* SPWindowManagement.h */, + 1748D58515A83E54003562F2 /* SPWindowManagement.m */, 17D3583C1533766800A654D7 /* Window */, 173567BA12AC1306000DCCEF /* Bundle Support */, 173E70A6107FF61D008733C9 /* Main View Controllers */, @@ -3243,6 +3248,7 @@ 17D5B49E1553059F00EF3BB3 /* SPViewCopy.m in Sources */, 176E14D115570FE300FAF326 /* SPBundleCommandRunner.m in Sources */, 1748D50C15A4444F003562F2 /* SPTableStructureLoading.m in Sources */, + 1748D58615A83E54003562F2 /* SPWindowManagement.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; -- cgit v1.2.3