aboutsummaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
authormltownsend <mltownsend@gmail.com>2010-06-01 22:09:47 +0000
committermltownsend <mltownsend@gmail.com>2010-06-01 22:09:47 +0000
commitf65e0fe8e01e81ec282347088f4cc8f43e12dc2e (patch)
tree359138b723c3bb1cd9de98377de14b80d5689073 /Source
parent7b8d1a80de102fd0ed4a3f68547d499e66e2595c (diff)
downloadsequelpro-f65e0fe8e01e81ec282347088f4cc8f43e12dc2e.tar.gz
sequelpro-f65e0fe8e01e81ec282347088f4cc8f43e12dc2e.tar.bz2
sequelpro-f65e0fe8e01e81ec282347088f4cc8f43e12dc2e.zip
Added sorting of the favorites in the connection panel. Will use the same sort order as what is set in preferences as well. Fix for Issue#664
Diffstat (limited to 'Source')
-rw-r--r--Source/SPConnectionController.h9
-rw-r--r--Source/SPConnectionController.m161
2 files changed, 167 insertions, 3 deletions
diff --git a/Source/SPConnectionController.h b/Source/SPConnectionController.h
index 6a47f9ac..aa45b74d 100644
--- a/Source/SPConnectionController.h
+++ b/Source/SPConnectionController.h
@@ -29,6 +29,7 @@
#import "SPDatabaseDocument.h"
#import "SPKeychain.h"
#import "SPSSHTunnel.h"
+#import "SPConstants.h"
@class BWAnchoredButtonBar;
@@ -73,6 +74,7 @@
NSString *sshUser;
NSString *sshPassword;
NSString *sshPort;
+@private NSString *favoritesPBoardType;
NSString *connectionKeychainItemName;
NSString *connectionKeychainItemAccount;
@@ -106,6 +108,10 @@
IBOutlet NSButton *helpButton;
IBOutlet NSProgressIndicator *progressIndicator;
IBOutlet NSTextField *progressIndicatorText;
+
+ BOOL reverseFavoritesSort;
+ SPFavoritesSortItem previousSortItem, currentSortItem;
+
}
@property (readwrite, assign) id delegate;
@@ -126,6 +132,7 @@
@property (readwrite, retain) NSString *connectionKeychainItemAccount;
@property (readwrite, retain) NSString *connectionSSHKeychainItemName;
@property (readwrite, retain) NSString *connectionSSHKeychainItemAccount;
+@property (readonly, assign) NSString *favoritesPBoardType;
- (id)initWithDocument:(SPDatabaseDocument *)theTableDocument;
@@ -142,6 +149,8 @@
- (IBAction)editFavorites:(id)sender;
- (IBAction)showHelp:(id)sender;
- (void)resizeTabViewToConnectionType:(NSUInteger)theType animating:(BOOL)animate;
+- (IBAction)sortFavorites:(id)sender;
+- (IBAction)reverseSortFavorites:(id)sender;
// Connection details interaction
- (BOOL)checkHost;
diff --git a/Source/SPConnectionController.m b/Source/SPConnectionController.m
index 631cb2ed..7e9844e3 100644
--- a/Source/SPConnectionController.m
+++ b/Source/SPConnectionController.m
@@ -31,6 +31,12 @@
#import "SPConstants.h"
#import "SPAlertSheets.h"
+@interface SPConnectionController (PrivateAPI)
+
+- (void)_sortFavorites;
+
+@end
+
@implementation SPConnectionController
@synthesize delegate;
@@ -69,6 +75,7 @@
mySQLConnection = nil;
sshTunnel = nil;
cancellingConnection = NO;
+ favoritesPBoardType = @"FavoritesPBoardType";
// Load the connection nib, keeping references to the top-level objects for later release
nibObjectsToRelease = [[NSMutableArray alloc] init];
@@ -90,14 +97,19 @@
prefs = [[NSUserDefaults standardUserDefaults] retain];
favorites = nil;
[self updateFavorites];
-
+
// Register an observer for changes within the favorites
[prefs addObserver:self forKeyPath:SPFavorites options:NSKeyValueObservingOptionNew context:NULL];
+ // Set sort items
+ currentSortItem = [prefs integerForKey:SPFavoritesSortedBy];
+ reverseFavoritesSort = [prefs boolForKey:SPFavoritesSortedInReverse];
+
// Register double click for the favorites view (double click favorite to connect)
[favoritesTable setTarget:self];
[favoritesTable setDoubleAction:@selector(initiateConnection:)];
-
+ [favoritesTable registerForDraggedTypes:[NSArray arrayWithObject:favoritesPBoardType]];
+ [favoritesTable setDraggingSourceOperationMask:NSDragOperationMove forLocal:YES];
// Set the focus to the favorites table and select the appropriate row
[[tableDocument parentWindow] setInitialFirstResponder:favoritesTable];
NSInteger tableRow;
@@ -116,7 +128,7 @@
[self resizeTabViewToConnectionType:SPTCPIPConnection animating:NO];
}
}
-
+ [self _sortFavorites];
return self;
}
@@ -655,6 +667,69 @@
#pragma mark -
#pragma mark Favorites interaction
+- (void)sortFavorites:(id)sender
+{
+ previousSortItem = currentSortItem;
+ currentSortItem = [[sender menu] indexOfItem:sender];
+
+ [prefs setInteger:currentSortItem forKey:SPFavoritesSortedBy];
+
+ // Perform sorting
+ [self _sortFavorites];
+
+ [[[sender menu] itemAtIndex:previousSortItem] setState:NSOffState];
+ [[[sender menu] itemAtIndex:currentSortItem] setState:NSOnState];
+
+}
+
+- (void)reverseSortFavorites:(id)sender
+{
+ reverseFavoritesSort = (![sender state]);
+
+ [prefs setBool:reverseFavoritesSort forKey:SPFavoritesSortedInReverse];
+
+ // Perform re-sorting
+ [self _sortFavorites];
+
+ [sender setState:reverseFavoritesSort];
+}
+
+- (void)_sortFavorites
+{
+ NSString *sortKey = @"";
+
+ switch (currentSortItem)
+ {
+ case SPFavoritesSortNameItem:
+ sortKey = @"name";
+ break;
+ case SPFavoritesSortHostItem:
+ sortKey = @"host";
+ break;
+ case SPFavoritesSortTypeItem:
+ sortKey = @"type";
+ break;
+ default:
+ sortKey = @"name";
+ break;
+ }
+
+ NSSortDescriptor *sortDescriptor = nil;
+
+ if (currentSortItem == SPFavoritesSortTypeItem) {
+ sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:sortKey ascending:(!reverseFavoritesSort)] autorelease];
+ }
+ else {
+ sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:sortKey ascending:(!reverseFavoritesSort) selector:@selector(caseInsensitiveCompare:)] autorelease];
+ }
+ NSDictionary *first = [[favorites objectAtIndex:0] retain];
+ [favorites removeObjectAtIndex:0];
+ [favorites sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
+ [favorites insertObject:first atIndex:0];
+ [favoritesTable reloadData];
+ [first release];
+
+}
/**
* Updates the local favorites array from the user defaults
*/
@@ -865,6 +940,62 @@
return [[favorites objectAtIndex:rowIndex] objectForKey:@"name"];
}
+- (BOOL)tableView:(NSTableView *)aTableView acceptDrop:(id < NSDraggingInfo >)info
+ row:(NSInteger)row dropOperation:(NSTableViewDropOperation)operation
+{
+ BOOL acceptedDrop = NO;
+ if ((row == 0) || ([info draggingSource] != aTableView)) return acceptedDrop;
+ NSPasteboard* pboard = [info draggingPasteboard];
+ NSData* rowData = [pboard dataForType:favoritesPBoardType];
+ NSIndexSet* rowIndexes = [NSKeyedUnarchiver unarchiveObjectWithData:rowData];
+ NSInteger dragRow = [rowIndexes firstIndex];
+ NSInteger defaultConnectionRow = [prefs integerForKey:SPLastFavoriteIndex];
+ if (defaultConnectionRow == dragRow)
+ {
+ [prefs setInteger:row forKey:SPLastFavoriteIndex];
+ }
+ NSMutableDictionary *draggedFavorite = [favorites objectAtIndex:dragRow];
+ [favorites removeObjectAtIndex:dragRow];
+ if (row > [favorites count])
+ {
+ row--;
+ }
+ [favorites insertObject:draggedFavorite atIndex:row];
+ [aTableView reloadData];
+ [aTableView selectRowIndexes:[NSIndexSet indexSetWithIndex:row] byExtendingSelection:NO];
+ // reset the prefs with the new order
+ NSMutableArray *reorderedFavorites = [[NSMutableArray alloc] initWithArray:favorites];
+ [reorderedFavorites removeObjectAtIndex:0];
+ [prefs setObject:reorderedFavorites forKey:SPFavorites];
+ [[[NSApp delegate] preferenceController] updateDefaultFavoritePopup];
+ [reorderedFavorites release];
+ [self updateFavorites];
+ acceptedDrop = YES;
+ return acceptedDrop;
+
+}
+
+- (BOOL)tableView:(NSTableView *)aTableView writeRowsWithIndexes:(NSIndexSet *)rowIndexes
+ toPasteboard:(NSPasteboard *)pboard
+{
+ NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject:rowIndexes];
+ [pboard declareTypes:[NSArray arrayWithObject:favoritesPBoardType] owner:self];
+ [pboard setData:archivedData forType:favoritesPBoardType];
+ return YES;
+}
+
+- (NSDragOperation)tableView:(NSTableView *)aTableView validateDrop:(id < NSDraggingInfo >)info
+ proposedRow:(NSInteger)row proposedDropOperation:(NSTableViewDropOperation)operation
+{
+ if (row == 0) return NSDragOperationNone;
+ if ([info draggingSource] == aTableView)
+ {
+ [aTableView setDropRow:row dropOperation:NSTableViewDropAbove];
+ return NSDragOperationMove;
+ }
+ return NSDragOperationNone;
+}
+
/**
* Loads a favorite, if any are selected.
*/
@@ -919,6 +1050,7 @@
[(ImageAndTextCell *)aCell setTextColor:[NSColor grayColor]];
}
+
#pragma mark -
#pragma mark NSSplitView delegate methods
@@ -950,6 +1082,27 @@
return (proposedMin + 80);
}
+#pragma mark -
+#pragma mark Menu Validation
+-(BOOL)validateMenuItem:(NSMenuItem *)menuItem
+{
+ SEL action = [menuItem action];
+ if ((action == @selector(sortFavorites:)) || (action == @selector(reverseSortFavorites:))) {
+
+ // Loop all the items in the sort by menu only checking the currently selected one
+ for (NSMenuItem *item in [[menuItem menu] itemArray])
+ {
+ [item setState:([[menuItem menu] indexOfItem:item] == currentSortItem) ? NSOnState : NSOffState];
+ }
+
+ // Check or uncheck the reverse sort item
+ if (action == @selector(reverseFavoritesSortOrder:)) {
+ [menuItem setState:reverseFavoritesSort];
+ }
+ }
+ return YES;
+
+}
@end
#pragma mark -
@@ -965,4 +1118,6 @@
return YES;
}
+
+
@end