aboutsummaryrefslogtreecommitdiffstats
path: root/Source/SPFavoritesImporter.m
diff options
context:
space:
mode:
authorstuconnolly <stuart02@gmail.com>2012-05-02 13:12:38 +0000
committerstuconnolly <stuart02@gmail.com>2012-05-02 13:12:38 +0000
commit5d87f0f50fc90c7ed47ff82b35f07b2749262132 (patch)
tree37ab959b7385c8f5aaf2d1465e1f19fbd47247c7 /Source/SPFavoritesImporter.m
parentdea294a90f9bf6017986f9c950991a7fc7c9645e (diff)
parentfe555b6d511a51f3bdfb5c0a2b00a3206993076b (diff)
downloadsequelpro-5d87f0f50fc90c7ed47ff82b35f07b2749262132.tar.gz
sequelpro-5d87f0f50fc90c7ed47ff82b35f07b2749262132.tar.bz2
sequelpro-5d87f0f50fc90c7ed47ff82b35f07b2749262132.zip
Merge outline view branch into trunk.
Adds support for managing and grouping favorites into folders in the connection view and removes the associated favorites management from the preferences window. NOTE: On first launch your connection favorites will be migrated from Sequel Pro's preference file to a new file in ~/Application Support/Sequel Pro/Data. Your old favorites will remain in the preference file until removed in a future version. Outstanding known issues: - Removing a group node with no child favorites presents a warning about also removing the non-existent favorites. - Starting the application with no favorites, creating a group node then selecting, hides the connection details input. Doesn't support emoty selection. - Setting the name of a connection, adding it to the favorites and then swicthing to a different connection type, screws with the favorite name. - The preservation between launches of whether group nodes are collapsed or not is currently not supported.
Diffstat (limited to 'Source/SPFavoritesImporter.m')
-rw-r--r--Source/SPFavoritesImporter.m123
1 files changed, 123 insertions, 0 deletions
diff --git a/Source/SPFavoritesImporter.m b/Source/SPFavoritesImporter.m
new file mode 100644
index 00000000..5ec0c433
--- /dev/null
+++ b/Source/SPFavoritesImporter.m
@@ -0,0 +1,123 @@
+//
+// $Id$
+//
+// SPFavoritesImporter.m
+// sequel-pro
+//
+// Created by Stuart Connolly (stuconnolly.com) on May 14, 2011
+// Copyright (c) 2011 Stuart Connolly. 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 <http://code.google.com/p/sequel-pro/>
+
+#import "SPFavoritesImporter.h"
+
+@interface SPFavoritesImporter ()
+
+- (void)_importFavoritesInBackground;
+- (void)_informDelegateOfImportCompletion:(NSError *)error;
+- (void)_informDelegateOfImportDataAvailable:(NSArray *)data;
+- (void)_informDelegateOfErrorCode:(NSUInteger)code description:(NSString *)description;
+
+@end
+
+@implementation SPFavoritesImporter
+
+@synthesize delegate;
+@synthesize importPath;
+
+/**
+ * Imports the favorites from the file at the supplied path.
+ *
+ * @param path The path of the file to import
+ */
+- (void)importFavoritesFromFileAtPath:(NSString *)path
+{
+ [self setImportPath:path];
+
+ [NSThread detachNewThreadSelector:@selector(_importFavoritesInBackground) toTarget:self withObject:nil];
+}
+
+#pragma mark -
+#pragma mark Private API
+
+/**
+ * Starts the import process on a separate thread.
+ */
+- (void)_importFavoritesInBackground
+{
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+
+ NSDictionary *importData;
+ NSFileManager *fileManager = [NSFileManager defaultManager];
+
+ if ([fileManager fileExistsAtPath:[self importPath]]) {
+ importData = [[NSDictionary alloc] initWithContentsOfFile:[self importPath]];
+
+ NSArray *favorites = [importData valueForKey:SPFavoritesDataRootKey];
+
+ if (favorites) {
+ [self _informDelegateOfImportDataAvailable:favorites];
+ }
+ else {
+ [self _informDelegateOfErrorCode:NSFileReadUnknownError
+ description:NSLocalizedString(@"Error reading import file.", @"error reading import file")];
+ }
+ }
+ else {
+ [self _informDelegateOfErrorCode:NSFileReadNoSuchFileError
+ description:NSLocalizedString(@"Import file does not exist.", @"import file does not exist message")];
+ }
+
+ [pool release];
+}
+
+/**
+ * Informs the delegate that the import process has completed.
+ */
+- (void)_informDelegateOfImportCompletion:(NSError *)error
+{
+ if ([self delegate] && [[self delegate] respondsToSelector:@selector(favoritesExportCompletedWithError:)]) {
+ [[self delegate] performSelectorOnMainThread:@selector(favoritesExportCompletedWithError:) withObject:error waitUntilDone:NO];
+ }
+}
+
+/**
+ * Informs the delegate that the imported data is available.
+ */
+- (void)_informDelegateOfImportDataAvailable:(NSArray *)data
+{
+ if ([self delegate] && [[self delegate] respondsToSelector:@selector(favoritesImportData:)]) {
+ [[self delegate] performSelectorOnMainThread:@selector(favoritesImportData:) withObject:data waitUntilDone:NO];
+ }
+}
+
+/**
+ * Informs the delegate that an error occurred during the import.
+ *
+ * @param code The error code
+ * @param description A short description of the error
+ */
+- (void)_informDelegateOfErrorCode:(NSUInteger)code description:(NSString *)description
+{
+ NSError *error = [NSError errorWithDomain:NSCocoaErrorDomain
+ code:code
+ userInfo:[NSDictionary dictionaryWithObject:description forKey:NSLocalizedDescriptionKey]];
+
+ [self _informDelegateOfImportCompletion:error];
+}
+
+@end