aboutsummaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
Diffstat (limited to 'Source')
-rw-r--r--Source/SPAppController.h9
-rw-r--r--Source/SPAppController.m23
-rw-r--r--Source/SPDatabaseDocument.m76
3 files changed, 100 insertions, 8 deletions
diff --git a/Source/SPAppController.h b/Source/SPAppController.h
index 0ae75b90..9d9a5564 100644
--- a/Source/SPAppController.h
+++ b/Source/SPAppController.h
@@ -36,6 +36,8 @@
SPPreferenceController *prefsController;
id encodingPopUp;
+
+ NSURL *_sessionURL;
}
// Window management
@@ -62,8 +64,11 @@
// Getters
- (SPPreferenceController *)preferenceController;
-- (NSArray *) orderedDatabaseConnectionWindows;
-- (SPDatabaseDocument *) frontDocument;
+- (NSArray *)orderedDatabaseConnectionWindows;
+- (SPDatabaseDocument *)frontDocument;
+- (NSURL *)sessionURL;
+
+- (void)setSessionURL:(NSString *)urlString;
// Feedback controller delegate methods
- (NSMutableDictionary*) anonymizePreferencesForFeedbackReport:(NSMutableDictionary *)preferences;
diff --git a/Source/SPAppController.m b/Source/SPAppController.m
index 7a3ec334..45deeff9 100644
--- a/Source/SPAppController.m
+++ b/Source/SPAppController.m
@@ -43,6 +43,7 @@
- (id)init
{
if ((self = [super init])) {
+ _sessionURL = nil;
[NSApp setDelegate:self];
}
@@ -295,6 +296,9 @@
[[self frontDocument] initWithConnectionFile:filename];
}
+ else if([[[filename pathExtension] lowercaseString] isEqualToString:@"spfs"]) {
+
+ }
else {
NSLog(@"Only files with the extensions ‘spf’ or ‘sql’ are allowed.");
}
@@ -435,6 +439,23 @@
return nil;
}
+/**
+ * Retrieve the session URL. Return nil if no session is opened
+ */
+- (NSURL *)sessionURL
+{
+ return _sessionURL;
+}
+
+/**
+ * Set the global session URL used for Save (As) Session.
+ */
+- (void)setSessionURL:(NSString *)urlString
+{
+ if(_sessionURL) [_sessionURL release], _sessionURL = nil;
+ _sessionURL = [[NSURL fileURLWithPath:urlString] retain];
+}
+
#pragma mark -
#pragma mark Services menu methods
@@ -768,7 +789,7 @@
{
[prefsController release], prefsController = nil;
[aboutController release], aboutController = nil;
-
+ if(_sessionURL) [_sessionURL release], _sessionURL = nil;
[super dealloc];
}
diff --git a/Source/SPDatabaseDocument.m b/Source/SPDatabaseDocument.m
index d76479b3..b463be93 100644
--- a/Source/SPDatabaseDocument.m
+++ b/Source/SPDatabaseDocument.m
@@ -2706,7 +2706,6 @@
#pragma mark -
#pragma mark Menu methods
-
/**
* Saves SP session or if Custom Query tab is active the editor's content as SQL file
* If sender == nil then the call came from [self writeSafelyToURL:ofType:forSaveOperation:error]
@@ -2797,8 +2796,36 @@
contextInfo = @"saveSPFfileAndClose";
else
contextInfo = @"saveSPFfile";
+ }
+ // Save Session or Save Session As…
+ else if (sender == nil || [sender tag] == 1020 || [sender tag] == 1021)
+ {
+ // Load accessory nib each time.
+ // Note that the top-level objects aren't released automatically, but are released when the panel ends.
+ if(![NSBundle loadNibNamed:@"SaveSPFAccessory" owner:self]) {
+ NSLog(@"SaveSPFAccessory accessory dialog could not be loaded.");
+ return;
+ }
- } else {
+ [panel setAllowedFileTypes:[NSArray arrayWithObjects:@"spfs", nil]];
+
+ // Update accessory button states
+ [self validateSaveConnectionAccessory:nil];
+
+ // TODO note: it seems that one has problems with a NSSecureTextField
+ // inside an accessory view - ask HansJB
+ [[saveConnectionEncryptString cell] setControlView:saveConnectionAccessory];
+ [panel setAccessoryView:saveConnectionAccessory];
+
+ // Set file name
+ if([[NSApp delegate] sessionURL])
+ filename = [[[NSApp delegate] sessionURL] description];
+ else
+ filename = [NSString stringWithFormat:@"%@", @"session"];
+
+ contextInfo = @"saveSession";
+ }
+ else {
return;
}
@@ -2874,6 +2901,47 @@
if(contextInfo == @"saveSPFfileAndClose")
[self closeAndDisconnect];
}
+
+ // Save all open windows including all tabs as session
+ else if(contextInfo == @"saveSession") {
+
+ // Sub-folder 'Contents' will contain all untitled connection as single window or tab.
+ // info.plist will contain the opened structure (windows and tabs for each window). Each connection
+ // is linked to a saved spf file either in 'Contents' for unTitled ones or already saved spf files.
+
+ NSFileManager *fileManager = [NSFileManager defaultManager];
+
+ [fileManager createDirectoryAtPath:fileName withIntermediateDirectories:TRUE attributes:nil error:&error];
+
+ if(error != nil) {
+ NSAlert *errorAlert = [NSAlert alertWithError:error];
+ [errorAlert runModal];
+ return;
+ }
+
+ [fileManager createDirectoryAtPath:[NSString stringWithFormat:@"%@/Contents", fileName] withIntermediateDirectories:TRUE attributes:nil error:&error];
+
+ if(error != nil) {
+ NSAlert *errorAlert = [NSAlert alertWithError:error];
+ [errorAlert runModal];
+ return;
+ }
+
+ NSString *content = @"HALLO";
+ [content writeToFile:[NSString stringWithFormat:@"%@/info.plist", fileName]
+ atomically:YES
+ encoding:NSUTF8StringEncoding
+ error:&error];
+
+ if(error != nil) {
+ NSAlert *errorAlert = [NSAlert alertWithError:error];
+ [errorAlert runModal];
+ return;
+ }
+
+ [[NSApp delegate] setSessionURL:fileName];
+
+ }
}
}
@@ -2886,7 +2954,7 @@
NSMutableDictionary *spfDocData_temp = [NSMutableDictionary dictionary];
if(fileName == nil)
- fileName = [[self fileURL] path]; //[[[self fileURL] absoluteString] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
+ fileName = [[self fileURL] path];
// Store save panel settings or take them from spfDocData
if(!saveInBackground) {
@@ -3004,7 +3072,6 @@
[spfdata setObject:[spfDocData_temp objectForKey:@"encrypted"] forKey:@"encrypted"];
- // if([[spfDocData_temp objectForKey:@"save_password"] boolValue])
[spfdata setObject:[spfDocData_temp objectForKey:@"auto_connect"] forKey:@"auto_connect"];
if([[self keyChainID] length])
@@ -3033,7 +3100,6 @@
}
[connection setObject:aString forKey:@"type"];
-
if([[spfDocData_temp objectForKey:@"save_password"] boolValue]) {
NSString *pw = [self keychainPasswordForConnection:nil];
if(![pw length]) pw = [connectionController password];