aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Source/SPAppController.h6
-rw-r--r--Source/SPAppController.m148
-rw-r--r--Source/SPAppleScriptSupport.m1
-rw-r--r--Source/SPDatabaseDocument.m1
-rw-r--r--Source/SPTextViewAdditions.m1
-rw-r--r--Source/SPWindowManagement.h49
-rw-r--r--Source/SPWindowManagement.m160
-rw-r--r--sequel-pro.xcodeproj/project.pbxproj6
8 files changed, 238 insertions, 134 deletions
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 <PSMTabBar/PSMTabBarControl.h>
#import <Sparkle/Sparkle.h>
@@ -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);
@@ -1221,121 +1226,6 @@ YY_BUFFER_STATE yy_scan_string (const char *);
}
#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 = "<group>"; };
1748D50A15A4444F003562F2 /* SPTableStructureLoading.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPTableStructureLoading.h; sourceTree = "<group>"; };
1748D50B15A4444F003562F2 /* SPTableStructureLoading.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPTableStructureLoading.m; sourceTree = "<group>"; };
+ 1748D58415A83E54003562F2 /* SPWindowManagement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPWindowManagement.h; sourceTree = "<group>"; };
+ 1748D58515A83E54003562F2 /* SPWindowManagement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPWindowManagement.m; sourceTree = "<group>"; };
174A345112DA4ED000DB0ADE /* create-test-stubs.pl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.perl; path = "create-test-stubs.pl"; sourceTree = "<group>"; };
174CE11D10AB80B5008F892B /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = Interfaces/English.lproj/DatabaseProcessList.xib; sourceTree = "<group>"; };
174CE14010AB9281008F892B /* SPProcessListController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPProcessListController.h; sourceTree = "<group>"; };
@@ -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;
};