aboutsummaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
authorBibiko <bibiko@eva.mpg.de>2010-02-05 11:37:30 +0000
committerBibiko <bibiko@eva.mpg.de>2010-02-05 11:37:30 +0000
commit64567b12a8e9449ea3e23e20f0d236a9bde24dad (patch)
treee7d96960c5c695ac3afab0fca057dc0b63c5f83c /Source
parentf880dea7369cb6ce57c552cd359f871bf7e2e414 (diff)
downloadsequelpro-64567b12a8e9449ea3e23e20f0d236a9bde24dad.tar.gz
sequelpro-64567b12a8e9449ea3e23e20f0d236a9bde24dad.tar.bz2
sequelpro-64567b12a8e9449ea3e23e20f0d236a9bde24dad.zip
• refactored the entire history logic in Custom Query
- queries which are longer than then 64 chars are truncated in title and queries which are longer than then 256 chars are truncated in tooltip to avoid processing time to load very long queries from history; this also decreases the memory usage - added "Insert Next/Previous History Query" logic bound to ^↑ and ^↓ - fixed tiny GUI spacing problem in Custom Query
Diffstat (limited to 'Source')
-rw-r--r--Source/CustomQuery.h5
-rw-r--r--Source/CustomQuery.m105
-rw-r--r--Source/SPQueryController.h2
-rw-r--r--Source/SPQueryController.m26
4 files changed, 107 insertions, 31 deletions
diff --git a/Source/CustomQuery.h b/Source/CustomQuery.h
index e92dc4f0..8994a7e3 100644
--- a/Source/CustomQuery.h
+++ b/Source/CustomQuery.h
@@ -100,6 +100,8 @@
IBOutlet NSMenuItem *autouppercaseKeywordsMenuItem;
IBOutlet NSMenuItem *commentCurrentQueryMenuItem;
IBOutlet NSMenuItem *commentLineOrSelectionMenuItem;
+ IBOutlet NSMenuItem *previousHistoryMenuItem;
+ IBOutlet NSMenuItem *nextHistoryMenuItem;
IBOutlet NSWindow *helpWebViewWindow;
IBOutlet WebView *helpWebView;
@@ -146,6 +148,9 @@
NSUInteger numberOfQueries;
NSUInteger queryTextViewStartPosition;
+
+ NSInteger currentHistoryOffsetIndex;
+ BOOL historyItemWasJustInserted;
}
// IBAction methods
diff --git a/Source/CustomQuery.m b/Source/CustomQuery.m
index 2d1dae4d..b26cf828 100644
--- a/Source/CustomQuery.m
+++ b/Source/CustomQuery.m
@@ -242,7 +242,7 @@
if(replaceContent)
[textView setSelectedRange:NSMakeRange(0,[[textView string] length])];
- [textView insertText:[queryHistoryButton titleOfSelectedItem]];
+ [textView insertText:[[[SPQueryController sharedQueryController] historyForFileURL:[tableDocumentInstance fileURL]] objectAtIndex:[queryHistoryButton indexOfSelectedItem]-7]];
}
}
@@ -262,6 +262,46 @@
- (IBAction)gearMenuItemSelected:(id)sender
{
+ if ( sender == previousHistoryMenuItem ) {
+ NSInteger numberOfHistoryItems = [[SPQueryController sharedQueryController] numberOfHistoryItemsForFileURL:[tableDocumentInstance fileURL]];
+ currentHistoryOffsetIndex++;
+ NSLog(@"%ld + %ld", numberOfHistoryItems, currentHistoryOffsetIndex);
+ if ( numberOfHistoryItems > 0 && currentHistoryOffsetIndex < numberOfHistoryItems && currentHistoryOffsetIndex >= 0) {
+ historyItemWasJustInserted = YES;
+ // if(![textView selectedRange].length)
+ // [textView setSelectedRange:currentQueryRange];
+ [textView breakUndoCoalescing];
+ NSString *historyString = [[[SPQueryController sharedQueryController] historyForFileURL:[tableDocumentInstance fileURL]] objectAtIndex:currentHistoryOffsetIndex];
+ NSRange rangeOfInsertedString = NSMakeRange([textView selectedRange].location, [historyString length]);
+ [textView insertText:historyString];
+ [textView setSelectedRange:rangeOfInsertedString];
+ } else {
+ currentHistoryOffsetIndex--;
+ NSBeep();
+ }
+ historyItemWasJustInserted = NO;
+ }
+
+ if ( sender == nextHistoryMenuItem ) {
+ NSInteger numberOfHistoryItems = [[SPQueryController sharedQueryController] numberOfHistoryItemsForFileURL:[tableDocumentInstance fileURL]];
+ currentHistoryOffsetIndex--;
+ NSLog(@"%ld - %ld", numberOfHistoryItems, currentHistoryOffsetIndex);
+ if ( numberOfHistoryItems > 0 && currentHistoryOffsetIndex < numberOfHistoryItems && currentHistoryOffsetIndex >= 0) {
+ historyItemWasJustInserted = YES;
+ // if(![textView selectedRange].length)
+ // [textView setSelectedRange:currentQueryRange];
+ [textView breakUndoCoalescing];
+ NSString *historyString = [[[SPQueryController sharedQueryController] historyForFileURL:[tableDocumentInstance fileURL]] objectAtIndex:currentHistoryOffsetIndex];
+ NSRange rangeOfInsertedString = NSMakeRange([textView selectedRange].location, [historyString length]);
+ [textView insertText:historyString];
+ [textView setSelectedRange:rangeOfInsertedString];
+ } else {
+ currentHistoryOffsetIndex++;
+ NSBeep();
+ }
+ historyItemWasJustInserted = NO;
+ }
+
// "Shift Right" menu item - indent the selection with an additional tab.
if (sender == shiftRightMenuItem) {
[textView shiftSelectionRight];
@@ -682,16 +722,13 @@
// Register new history item
[[SPQueryController sharedQueryController] addHistory:usedQuery forFileURL:[tableDocumentInstance fileURL]];
- // Add it to the document's current popup list
- if([queryHistoryButton numberOfItems] > 7)
- [queryHistoryButton insertItemWithTitle:usedQuery atIndex:7];
- else
- [queryHistoryButton addItemWithTitle:usedQuery];
-
- // Check for max history
- NSUInteger maxHistoryItems = [[prefs objectForKey:SPCustomQueryMaxHistoryItems] integerValue];
- while ( [queryHistoryButton numberOfItems] > maxHistoryItems + 7 )
+ // Refresh history popup menu
+ NSMenu* historyMenu = [queryHistoryButton menu];
+ while([queryHistoryButton numberOfItems] > 7)
[queryHistoryButton removeItemAtIndex:[queryHistoryButton numberOfItems]-1];
+
+ for(id historyMenuItem in [[SPQueryController sharedQueryController] historyMenuItemsForFileURL:[tableDocumentInstance fileURL]])
+ [historyMenu addItem:historyMenuItem];
}
@@ -1293,7 +1330,14 @@
if ( [[SPQueryController sharedQueryController] historyForFileURL:[tableDocumentInstance fileURL]] )
{
- [queryHistoryButton addItemsWithTitles:[[SPQueryController sharedQueryController] historyForFileURL:[tableDocumentInstance fileURL]]];
+ NSMenu* historyMenu = [queryHistoryButton menu];
+ // remove items up to the last separator beginning from the end
+ while([queryHistoryButton numberOfItems] > 7)
+ [queryHistoryButton removeItemAtIndex:[queryHistoryButton numberOfItems]-1];
+
+ // Add history items
+ for(id historyMenuItem in [[SPQueryController sharedQueryController] historyMenuItemsForFileURL:[tableDocumentInstance fileURL]])
+ [historyMenu addItem:historyMenuItem];
}
// Populate query favorites
@@ -2104,6 +2148,9 @@
[runSelectionMenuItem setEnabled:YES];
}
}
+
+ if(!historyItemWasJustInserted)
+ currentHistoryOffsetIndex = -1;
}
#pragma mark -
@@ -2783,16 +2830,7 @@
- (NSString *)buildHistoryString
{
- NSMutableString *history = [NSMutableString string];
- NSMenu *menu = [queryHistoryButton menu];
- NSInteger i;
-
- for (i = 7; i < [menu numberOfItems]; i++) {
- [history appendString:[[menu itemAtIndex:i] title]];
- [history appendString:@";\n"];
- }
-
- return history;
+ return [[[SPQueryController sharedQueryController] historyForFileURL:[tableDocumentInstance fileURL]] componentsJoinedByString:@";\n"];
}
/*
* This method is called as part of Key Value Observing which is used to watch for prefernce changes which effect the interface.
@@ -2828,9 +2866,9 @@
// Clear the global history list if doc is Untitled
if ([tableDocumentInstance isUntitled])
[prefs setObject:[NSArray array] forKey:SPQueryHistory];
- // otherwise remove all document-based history items from the queryController
- else
- [[SPQueryController sharedQueryController] replaceHistoryByArray:[NSMutableArray array] forFileURL:[tableDocumentInstance fileURL]];
+
+ // Remove items in the query controller
+ [[SPQueryController sharedQueryController] replaceHistoryByArray:[NSMutableArray array] forFileURL:[tableDocumentInstance fileURL]];
}
return;
@@ -2906,6 +2944,7 @@
*/
- (BOOL)validateMenuItem:(NSMenuItem *)menuItem
{
+
// Control "Save ... to Favorites"
if ( [menuItem tag] == SP_SAVE_SELECTION_FAVORTITE_MENUITEM_TAG ) {
if ([[textView string] length] < 1) return NO;
@@ -2923,12 +2962,12 @@
}
// Avoid selecting button list headers
- if ( [menuItem tag] == SP_FAVORITE_HEADER_MENUITEM_TAG ) {
+ else if ( [menuItem tag] == SP_FAVORITE_HEADER_MENUITEM_TAG ) {
return NO;
}
// Control Clear History menu item title according to isUntitled
- if ( [menuItem tag] == SP_HISTORY_CLEAR_MENUITEM_TAG ) {
+ else if ( [menuItem tag] == SP_HISTORY_CLEAR_MENUITEM_TAG ) {
if ( [tableDocumentInstance isUntitled] ) {
[menuItem setTitle:NSLocalizedString(@"Clear Global History", @"clear global history menu item title")];
[menuItem setToolTip:NSLocalizedString(@"Clear the global history list", @"clear the global history list tooltip message")];
@@ -2939,7 +2978,7 @@
}
// Check for History items
- if ( [menuItem tag] >= SP_HISTORY_COPY_MENUITEM_TAG && [menuItem tag] <= SP_HISTORY_CLEAR_MENUITEM_TAG ) {
+ else if ( [menuItem tag] >= SP_HISTORY_COPY_MENUITEM_TAG && [menuItem tag] <= SP_HISTORY_CLEAR_MENUITEM_TAG ) {
return ([queryHistoryButton numberOfItems]-7);
}
@@ -2983,6 +3022,9 @@
resultData = [[SPDataStorage alloc] init];
editedRow = -1;
+ currentHistoryOffsetIndex = -1;
+ historyItemWasJustInserted = NO;
+
prefs = [NSUserDefaults standardUserDefaults];
}
@@ -3011,13 +3053,14 @@
*/
- (IBAction)filterQueryHistory:(id)sender
{
- NSUInteger i;
NSMenu *menu = [queryHistoryButton menu];
+ NSUInteger numberOfItems = [menu numberOfItems];
+ NSUInteger i;
NSString *searchPattern = [queryHistorySearchField stringValue];
-
- for (i = 7; i < [menu numberOfItems]; i++)
+ NSArray *history = [[SPQueryController sharedQueryController] historyForFileURL:[tableDocumentInstance fileURL]];
+ for (i = 7; i < numberOfItems; i++)
{
- [[menu itemAtIndex:i] setHidden:(![[[menu itemAtIndex:i] title] isMatchedByRegex:[NSString stringWithFormat:@"(?i).*%@.*", searchPattern]])];
+ [[menu itemAtIndex:i] setHidden:(![[history objectAtIndex:i-7] isMatchedByRegex:[NSString stringWithFormat:@"(?i).*%@.*", searchPattern]])];
}
}
diff --git a/Source/SPQueryController.h b/Source/SPQueryController.h
index 2a7af9ca..a1948b4b 100644
--- a/Source/SPQueryController.h
+++ b/Source/SPQueryController.h
@@ -94,6 +94,8 @@
- (NSMutableArray *)favoritesForFileURL:(NSURL *)fileURL;
- (NSMutableArray *)historyForFileURL:(NSURL *)fileURL;
+- (NSArray *)historyMenuItemsForFileURL:(NSURL *)fileURL;
+- (NSUInteger)numberOfHistoryItemsForFileURL:(NSURL *)fileURL;
- (NSMutableDictionary *)contentFilterForFileURL:(NSURL *)fileURL;
- (NSArray *)queryFavoritesForFileURL:(NSURL *)fileURL andTabTrigger:(NSString *)tabTrigger includeGlobals:(BOOL)includeGlobals;
diff --git a/Source/SPQueryController.m b/Source/SPQueryController.m
index 9f28c226..ae83a25d 100644
--- a/Source/SPQueryController.m
+++ b/Source/SPQueryController.m
@@ -644,6 +644,32 @@ static SPQueryController *sharedQueryController = nil;
return [NSMutableArray array];
}
+- (NSArray *)historyMenuItemsForFileURL:(NSURL *)fileURL
+{
+ if([historyContainer objectForKey:[fileURL absoluteString]]) {
+ NSMutableArray *returnArray = [[NSMutableArray arrayWithCapacity:[[historyContainer objectForKey:[fileURL absoluteString]] count]] autorelease];
+ NSMenuItem *historyMenuItem;
+ for(id history in [historyContainer objectForKey:[fileURL absoluteString]]) {
+ historyMenuItem = [[[NSMenuItem alloc] initWithTitle:([history length] > 64) ? [NSString stringWithFormat:@"%@…", [history substringToIndex:63]] : history
+ action:NULL
+ keyEquivalent:@""] autorelease];
+ [historyMenuItem setToolTip:([history length] > 256) ? [NSString stringWithFormat:@"%@…", [history substringToIndex:255]] : history];
+ [returnArray addObject:historyMenuItem];
+ }
+
+ return returnArray;
+ }
+
+ return [NSArray array];
+}
+
+- (NSUInteger)numberOfHistoryItemsForFileURL:(NSURL *)fileURL
+{
+ if([historyContainer objectForKey:[fileURL absoluteString]])
+ return [[historyContainer objectForKey:[fileURL absoluteString]] count];
+ else
+ return 0;
+}
- (NSMutableDictionary *)contentFilterForFileURL:(NSURL *)fileURL
{
if([contentFilterContainer objectForKey:[fileURL absoluteString]])