diff options
Diffstat (limited to 'Source')
-rw-r--r-- | Source/SPAppController.h | 2 | ||||
-rw-r--r-- | Source/SPAppController.m | 166 | ||||
-rw-r--r-- | Source/SPBundleCommandTextView.m | 21 | ||||
-rw-r--r-- | Source/SPBundleEditorController.h | 15 | ||||
-rw-r--r-- | Source/SPBundleEditorController.m | 233 | ||||
-rw-r--r-- | Source/SPCopyTable.m | 202 | ||||
-rw-r--r-- | Source/SPEditSheetTextView.m | 21 | ||||
-rw-r--r-- | Source/SPStringAdditions.m | 2 | ||||
-rw-r--r-- | Source/SPTextView.h | 2 | ||||
-rw-r--r-- | Source/SPTextView.m | 195 | ||||
-rw-r--r-- | Source/SPTextViewAdditions.m | 83 |
11 files changed, 410 insertions, 532 deletions
diff --git a/Source/SPAppController.h b/Source/SPAppController.h index 35c9ee63..9a17dcb6 100644 --- a/Source/SPAppController.h +++ b/Source/SPAppController.h @@ -97,4 +97,6 @@ - (void)handleEventWithURL:(NSURL*)url; +- (IBAction)executeBundleItemForApp:(id)sender; + @end diff --git a/Source/SPAppController.m b/Source/SPAppController.m index c5704f80..9a4e23e6 100644 --- a/Source/SPAppController.m +++ b/Source/SPAppController.m @@ -33,6 +33,9 @@ #import "SPWindowController.h" #import "SPPreferencesUpgrade.h" #import "SPBundleEditorController.h" +#import "SPTooltip.h" +#import "SPBundleHTMLOutputController.h" +#import "SPAlertSheets.h" #import <PSMTabBar/PSMTabBarControl.h> #import <Sparkle/Sparkle.h> @@ -598,6 +601,132 @@ NSLog(@"command id: %@", passedProcessID); } +- (IBAction)executeBundleItemForApp:(id)sender +{ + + NSInteger idx = [sender tag] - 1000000; + NSString *infoPath = nil; + NSArray *bundleItems = [[NSApp delegate] bundleItemsForScope:SPBundleScopeGeneral]; + if(idx >=0 && idx < [bundleItems count]) { + infoPath = [[bundleItems objectAtIndex:idx] objectForKey:SPBundleInternPathToFileKey]; + } else { + if([sender tag] == 0 && [[sender toolTip] length]) { + infoPath = [sender toolTip]; + } + } + + if(!infoPath) { + NSBeep(); + return; + } + + NSError *readError = nil; + NSString *convError = nil; + NSPropertyListFormat format; + NSDictionary *cmdData = nil; + NSData *pData = [NSData dataWithContentsOfFile:infoPath options:NSUncachedRead error:&readError]; + + cmdData = [[NSPropertyListSerialization propertyListFromData:pData + mutabilityOption:NSPropertyListImmutable format:&format errorDescription:&convError] retain]; + + if(!cmdData || readError != nil || [convError length] || !(format == NSPropertyListXMLFormat_v1_0 || format == NSPropertyListBinaryFormat_v1_0)) { + NSLog(@"“%@” file couldn't be read.", infoPath); + NSBeep(); + if (cmdData) [cmdData release]; + return; + } else { + if([cmdData objectForKey:SPBundleFileCommandKey] && [[cmdData objectForKey:SPBundleFileCommandKey] length]) { + + NSString *cmd = [cmdData objectForKey:SPBundleFileCommandKey]; + NSString *inputAction = @""; + NSString *inputFallBackAction = @""; + NSError *err = nil; + NSString *bundleInputFilePath = [NSString stringWithFormat:@"%@_%@", SPBundleTaskInputFilePath, [NSString stringWithNewUUID]]; + + [[NSFileManager defaultManager] removeItemAtPath:bundleInputFilePath error:nil]; + + if([cmdData objectForKey:SPBundleFileInputSourceKey]) + inputAction = [[cmdData objectForKey:SPBundleFileInputSourceKey] lowercaseString]; + if([cmdData objectForKey:SPBundleFileInputSourceFallBackKey]) + inputFallBackAction = [[cmdData objectForKey:SPBundleFileInputSourceFallBackKey] lowercaseString]; + + NSMutableDictionary *env = [NSMutableDictionary dictionary]; + [env setObject:[infoPath stringByDeletingLastPathComponent] forKey:@"SP_BUNDLE_PATH"]; + [env setObject:bundleInputFilePath forKey:@"SP_BUNDLE_INPUT_FILE"]; + + NSError *inputFileError = nil; + NSString *input = @""; + if([inputAction isEqualToString:SPBundleInputSourceSelectedTableRowsAsTab]) { + input = [self rowsAsTabStringWithHeaders:YES onlySelectedRows:YES]; + } + else if([inputAction isEqualToString:SPBundleInputSourceSelectedTableRowsAsCsv]) { + input = [self rowsAsCsvStringWithHeaders:YES onlySelectedRows:YES]; + } + else if([inputAction isEqualToString:SPBundleInputSourceSelectedTableRowsAsSqlInsert]) { + input = [self rowsAsSqlInsertsOnlySelectedRows:YES]; + } + else if([inputAction isEqualToString:SPBundleInputSourceTableRowsAsTab]) { + input = [self rowsAsTabStringWithHeaders:YES onlySelectedRows:NO]; + } + else if([inputAction isEqualToString:SPBundleInputSourceTableRowsAsCsv]) { + input = [self rowsAsCsvStringWithHeaders:YES onlySelectedRows:NO]; + } + else if([inputAction isEqualToString:SPBundleInputSourceTableRowsAsSqlInsert]) { + input = [self rowsAsSqlInsertsOnlySelectedRows:NO]; + } + + if(input == nil) input = @""; + [input writeToFile:bundleInputFilePath + atomically:YES + encoding:NSUTF8StringEncoding + error:&inputFileError]; + + if(inputFileError != nil) { + NSString *errorMessage = [inputFileError localizedDescription]; + SPBeginAlertSheet(NSLocalizedString(@"Bundle Error", @"bundle error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [NSApp mainWindow], self, nil, nil, + [NSString stringWithFormat:@"%@ “%@”:\n%@", NSLocalizedString(@"Error for", @"error for message"), [cmdData objectForKey:@"name"], errorMessage]); + if (cmdData) [cmdData release]; + return; + } + + NSString *output = [cmd runBashCommandWithEnvironment:env atCurrentDirectoryPath:nil error:&err]; + + [[NSFileManager defaultManager] removeItemAtPath:bundleInputFilePath error:nil]; + + if(err == nil && output && [cmdData objectForKey:SPBundleFileOutputActionKey]) { + if([[cmdData objectForKey:SPBundleFileOutputActionKey] length] + && ![[cmdData objectForKey:SPBundleFileOutputActionKey] isEqualToString:SPBundleOutputActionNone]) { + NSString *action = [[cmdData objectForKey:SPBundleFileOutputActionKey] lowercaseString]; + NSPoint pos = [NSEvent mouseLocation]; + pos.y -= 16; + + if([action isEqualToString:SPBundleOutputActionShowAsTextTooltip]) { + [SPTooltip showWithObject:output atLocation:pos]; + } + + else if([action isEqualToString:SPBundleOutputActionShowAsHTMLTooltip]) { + [SPTooltip showWithObject:output atLocation:pos ofType:@"html"]; + } + + else if([action isEqualToString:SPBundleOutputActionShowAsHTML]) { + SPBundleHTMLOutputController *c = [[SPBundleHTMLOutputController alloc] init]; + [c displayHTMLContent:output withOptions:nil]; + } + } + } else { + NSString *errorMessage = [err localizedDescription]; + SPBeginAlertSheet(NSLocalizedString(@"BASH Error", @"bash error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [NSApp mainWindow], self, nil, nil, + [NSString stringWithFormat:@"%@ “%@”:\n%@", NSLocalizedString(@"Error for", @"error for message"), [cmdData objectForKey:@"name"], errorMessage]); + } + + } + + if (cmdData) [cmdData release]; + + } + +} + #pragma mark - #pragma mark Window management @@ -1001,6 +1130,7 @@ // Rebuild Bundles main menu item + // Add default menu items NSMenuItem *anItem; anItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"Bundle Editor", @"bundle editor menu item label") action:@selector(openBundleEditor:) keyEquivalent:@"b"]; [anItem setKeyEquivalentModifierMask:(NSCommandKeyMask|NSAlternateKeyMask|NSControlKeyMask)]; @@ -1010,18 +1140,20 @@ [menu addItem:anItem]; [anItem release]; + // Bail out if no Bundle was installed if(!foundInstalledBundles) return; // Add installed Bundles + // For each scope add a submenu but not for the last one (should be General always) [menu addItem:[NSMenuItem separatorItem]]; - NSArray *scopes = [NSArray arrayWithObjects:SPBundleScopeInputField, SPBundleScopeQueryEditor, SPBundleScopeDataTable, nil]; + NSArray *scopes = [NSArray arrayWithObjects:SPBundleScopeInputField, SPBundleScopeDataTable, SPBundleScopeGeneral, nil]; NSArray *scopeTitles = [NSArray arrayWithObjects:NSLocalizedString(@"Input Fields", @"input fields menu item label"), - NSLocalizedString(@"Query Editor", @"query editor menu item label"), - NSLocalizedString(@"Data Table", @"data table menu item label"),nil]; + NSLocalizedString(@"Data Table", @"data table menu item label"), + NSLocalizedString(@"General", @"general menu item label"),nil]; NSArray *scopeSelector = [NSArray arrayWithObjects:@"executeBundleItemForInputField:", - @"executeBundleItemForEditor:", - @"executeBundleItemForDataTable:", nil]; + @"executeBundleItemForDataTable:", + @"executeBundleItemForApp:", nil]; NSInteger k = 0; for(NSString* scope in scopes) { @@ -1034,13 +1166,25 @@ continue; } - NSMenu *bundleMenu = [[[NSMenu alloc] init] autorelease]; - NSMenuItem *bundleSubMenuItem = [[NSMenuItem alloc] initWithTitle:[scopeTitles objectAtIndex:k] action:nil keyEquivalent:@""]; - [bundleSubMenuItem setTag:10000000]; + NSMenu *bundleMenu = nil; + NSMenuItem *bundleSubMenuItem = nil; + + // Add last scope (General) not as submenu + if(k < [scopes count]-1) { + bundleMenu = [[[NSMenu alloc] init] autorelease]; + + bundleSubMenuItem = [[NSMenuItem alloc] initWithTitle:[scopeTitles objectAtIndex:k] action:nil keyEquivalent:@""]; + [bundleSubMenuItem setTag:10000000]; - [menu addItem:bundleSubMenuItem]; - [menu setSubmenu:bundleMenu forItem:bundleSubMenuItem]; + [menu addItem:bundleSubMenuItem]; + [menu setSubmenu:bundleMenu forItem:bundleSubMenuItem]; + + } else { + bundleMenu = menu; + [menu addItem:[NSMenuItem separatorItem]]; + } + // Add found Category submenus NSMutableArray *categorySubMenus = [NSMutableArray array]; NSMutableArray *categoryMenus = [NSMutableArray array]; if([bundleCategories count]) { @@ -1078,7 +1222,7 @@ } } - [bundleSubMenuItem release]; + if(bundleSubMenuItem)[bundleSubMenuItem release]; k++; } diff --git a/Source/SPBundleCommandTextView.m b/Source/SPBundleCommandTextView.m index 3213eda7..b90cea43 100644 --- a/Source/SPBundleCommandTextView.m +++ b/Source/SPBundleCommandTextView.m @@ -443,27 +443,6 @@ [[self delegate] setDoGroupDueToChars]; } - - if([[[[self delegate] class] description] isEqualToString:@"SPBundleEditorController"]) { - [super keyDown: theEvent]; - return; - } - - // Check for assign key equivalents inside user-defined bundle commands - NSDictionary *keyEquivalents = [[NSApp delegate] bundleKeyEquivalentsForScope:SPBundleScopeInputField]; - if([keyEquivalents count]) { - for(NSString* key in [keyEquivalents allKeys]) { - NSArray *keyData = [keyEquivalents objectForKey:key]; - if([[keyData objectAtIndex:0] isEqualToString:charactersIgnMod] && [[[keyEquivalents objectForKey:key] objectAtIndex:1] intValue] == curFlags) { - NSMenuItem *item = [[[NSMenuItem alloc] init] autorelease]; - [item setToolTip:[[keyEquivalents objectForKey:key] objectAtIndex:2]]; - [item setTag:0]; - [self executeBundleItemForInputField:item]; - return; - } - } - } - [super keyDown: theEvent]; } diff --git a/Source/SPBundleEditorController.h b/Source/SPBundleEditorController.h index eca5659f..e07589e1 100644 --- a/Source/SPBundleEditorController.h +++ b/Source/SPBundleEditorController.h @@ -39,10 +39,7 @@ IBOutlet NSPopUpButton* inputPopupButton; IBOutlet NSPopUpButton* inputFallbackPopupButton; IBOutlet NSPopUpButton* outputPopupButton; - IBOutlet NSButton *editorScopeButton; - IBOutlet NSButton *inputFieldScopeButton; - IBOutlet NSButton *dataTableScopeButton; - IBOutlet NSButton *disableCheckBox; + IBOutlet NSPopUpButton* scopePopupButton; IBOutlet NSButton *removeButton; IBOutlet NSMenuItem *duplicateMenuItem; IBOutlet NSMenuItem *revealInFinderMenuItem; @@ -56,23 +53,21 @@ NSString *oldBundleName; BOOL isTableCellEditing; - NSMenu *inputEditorScopePopUpMenu; + NSMenu *inputGeneralScopePopUpMenu; NSMenu *inputInputFieldScopePopUpMenu; NSMenu *inputDataTableScopePopUpMenu; NSMenu *inputNonePopUpMenu; - NSMenu *outputEditorScopePopUpMenu; + NSMenu *outputGeneralScopePopUpMenu; NSMenu *outputInputFieldScopePopUpMenu; NSMenu *outputDataTableScopePopUpMenu; - NSMenu *inputFallbackEditorScopePopUpMenu; NSMenu *inputFallbackInputFieldScopePopUpMenu; - NSArray *inputEditorScopeArray; + NSArray *inputGeneralScopeArray; NSArray *inputInputFieldScopeArray; NSArray *inputDataTableScopeArray; - NSArray *outputEditorScopeArray; + NSArray *outputGeneralScopeArray; NSArray *outputInputFieldScopeArray; NSArray *outputDataTableScopeArray; - NSArray *inputFallbackEditorScopeArray; NSArray *inputFallbackInputFieldScopeArray; BOOL doGroupDueToChars; diff --git a/Source/SPBundleEditorController.m b/Source/SPBundleEditorController.m index 1f9a9732..bb628c55 100644 --- a/Source/SPBundleEditorController.m +++ b/Source/SPBundleEditorController.m @@ -56,23 +56,21 @@ - (void)dealloc { - [inputEditorScopePopUpMenu release]; + [inputGeneralScopePopUpMenu release]; [inputInputFieldScopePopUpMenu release]; [inputDataTableScopePopUpMenu release]; - [outputEditorScopePopUpMenu release]; + [outputGeneralScopePopUpMenu release]; [outputInputFieldScopePopUpMenu release]; [outputDataTableScopePopUpMenu release]; - [inputFallbackEditorScopePopUpMenu release]; [inputFallbackInputFieldScopePopUpMenu release]; [inputNonePopUpMenu release]; - [inputEditorScopeArray release]; + [inputGeneralScopeArray release]; [inputInputFieldScopeArray release]; [inputDataTableScopeArray release]; - [outputEditorScopeArray release]; + [outputGeneralScopeArray release]; [outputInputFieldScopeArray release]; [outputDataTableScopeArray release]; - [inputFallbackEditorScopeArray release]; [inputFallbackInputFieldScopeArray release]; if(commandBundleArray) [commandBundleArray release], commandBundleArray = nil; @@ -86,43 +84,40 @@ { // Init all needed menus - inputEditorScopePopUpMenu = [[NSMenu alloc] initWithTitle:@""]; + inputGeneralScopePopUpMenu = [[NSMenu alloc] initWithTitle:@""]; inputInputFieldScopePopUpMenu = [[NSMenu alloc] initWithTitle:@""]; inputDataTableScopePopUpMenu = [[NSMenu alloc] initWithTitle:@""]; inputNonePopUpMenu = [[NSMenu alloc] initWithTitle:@""]; - outputEditorScopePopUpMenu = [[NSMenu alloc] initWithTitle:@""]; + outputGeneralScopePopUpMenu = [[NSMenu alloc] initWithTitle:@""]; outputInputFieldScopePopUpMenu = [[NSMenu alloc] initWithTitle:@""]; outputDataTableScopePopUpMenu = [[NSMenu alloc] initWithTitle:@""]; - inputFallbackEditorScopePopUpMenu = [[NSMenu alloc] initWithTitle:@""]; inputFallbackInputFieldScopePopUpMenu = [[NSMenu alloc] initWithTitle:@""]; - inputEditorScopeArray = [[NSArray arrayWithObjects:SPBundleInputSourceNone, SPBundleInputSourceSelectedText, SPBundleInputSourceEntireContent, nil] retain]; + inputGeneralScopeArray = [[NSArray arrayWithObjects:SPBundleInputSourceNone, nil] retain]; inputInputFieldScopeArray = [[NSArray arrayWithObjects:SPBundleInputSourceNone, SPBundleInputSourceSelectedText, SPBundleInputSourceEntireContent, nil] retain]; inputDataTableScopeArray = [[NSArray arrayWithObjects:SPBundleInputSourceNone, SPBundleInputSourceSelectedTableRowsAsTab, SPBundleInputSourceSelectedTableRowsAsCsv, SPBundleInputSourceSelectedTableRowsAsSqlInsert, SPBundleInputSourceTableRowsAsTab, SPBundleInputSourceTableRowsAsCsv, SPBundleInputSourceTableRowsAsSqlInsert, nil] retain]; - outputEditorScopeArray = [[NSArray arrayWithObjects:SPBundleOutputActionNone, SPBundleOutputActionInsertAsText, SPBundleOutputActionInsertAsSnippet, SPBundleOutputActionReplaceSelection, SPBundleOutputActionReplaceContent, SPBundleOutputActionShowAsTextTooltip, SPBundleOutputActionShowAsHTMLTooltip, SPBundleOutputActionShowAsHTML, nil] retain]; - outputInputFieldScopeArray = [[NSArray arrayWithObjects:SPBundleOutputActionNone, SPBundleOutputActionInsertAsText, SPBundleOutputActionReplaceSelection, SPBundleOutputActionReplaceContent, SPBundleOutputActionShowAsTextTooltip, SPBundleOutputActionShowAsHTMLTooltip, SPBundleOutputActionShowAsHTML, nil] retain]; + outputInputFieldScopeArray = [[NSArray arrayWithObjects:SPBundleOutputActionNone, SPBundleOutputActionInsertAsText, SPBundleOutputActionInsertAsSnippet, SPBundleOutputActionReplaceSelection, SPBundleOutputActionReplaceContent, SPBundleOutputActionShowAsTextTooltip, SPBundleOutputActionShowAsHTMLTooltip, SPBundleOutputActionShowAsHTML, nil] retain]; + outputGeneralScopeArray = [[NSArray arrayWithObjects:SPBundleOutputActionNone, SPBundleOutputActionShowAsTextTooltip, SPBundleOutputActionShowAsHTMLTooltip, SPBundleOutputActionShowAsHTML, nil] retain]; outputDataTableScopeArray = [[NSArray arrayWithObjects:SPBundleOutputActionNone, SPBundleOutputActionShowAsTextTooltip, SPBundleOutputActionShowAsHTMLTooltip, SPBundleOutputActionShowAsHTML, nil] retain]; - inputFallbackEditorScopeArray = [[NSArray arrayWithObjects:SPBundleInputSourceNone, SPBundleInputSourceCurrentWord, SPBundleInputSourceCurrentLine, SPBundleInputSourceCurrentQuery, SPBundleInputSourceEntireContent, nil] retain]; - inputFallbackInputFieldScopeArray = [[NSArray arrayWithObjects:SPBundleInputSourceNone, SPBundleInputSourceCurrentWord, SPBundleInputSourceCurrentLine, SPBundleInputSourceEntireContent, nil] retain]; + inputFallbackInputFieldScopeArray = [[NSArray arrayWithObjects:SPBundleInputSourceNone, SPBundleInputSourceCurrentWord, SPBundleInputSourceCurrentLine, SPBundleInputSourceCurrentQuery, SPBundleInputSourceEntireContent, nil] retain]; NSMutableArray *allPopupScopeItems = [NSMutableArray array]; - [allPopupScopeItems addObjectsFromArray:inputEditorScopeArray]; + [allPopupScopeItems addObjectsFromArray:inputGeneralScopeArray]; [allPopupScopeItems addObjectsFromArray:inputInputFieldScopeArray]; [allPopupScopeItems addObjectsFromArray:inputDataTableScopeArray]; - [allPopupScopeItems addObjectsFromArray:outputEditorScopeArray]; [allPopupScopeItems addObjectsFromArray:outputInputFieldScopeArray]; + [allPopupScopeItems addObjectsFromArray:outputGeneralScopeArray]; [allPopupScopeItems addObjectsFromArray:outputDataTableScopeArray]; - [allPopupScopeItems addObjectsFromArray:inputFallbackEditorScopeArray]; [allPopupScopeItems addObjectsFromArray:inputFallbackInputFieldScopeArray]; NSDictionary *menuItemTitles = [NSDictionary dictionaryWithObjects: [NSArray arrayWithObjects: NSLocalizedString(@"None", @"none menu item label"), - NSLocalizedString(@"Selected Text", @"selected text menu item label"), - NSLocalizedString(@"Entire Content", @"entire content menu item label"), + NSLocalizedString(@"None", @"none menu item label"), NSLocalizedString(@"Selected Text", @"selected text menu item label"), NSLocalizedString(@"Entire Content", @"entire content menu item label"), + NSLocalizedString(@"None", @"none menu item label"), NSLocalizedString(@"Selected Rows (TSV)", @"selected rows (TSV) menu item label"), NSLocalizedString(@"Selected Rows (CSV)", @"selected rows (CSV) menu item label"), @@ -130,6 +125,7 @@ NSLocalizedString(@"Table Content (TSV)", @"table content (TSV) menu item label"), NSLocalizedString(@"Table Content (CSV)", @"table content (CSV) menu item label"), NSLocalizedString(@"Table Content (SQL)", @"table content (SQL) menu item label"), + NSLocalizedString(@"None", @"none menu item label"), NSLocalizedString(@"Insert as Text", @"insert as text item label"), NSLocalizedString(@"Insert as Snippet", @"insert as snippet item label"), @@ -138,33 +134,29 @@ NSLocalizedString(@"Show as Text Tooltip", @"show as text tooltip item label"), NSLocalizedString(@"Show as HTML Tooltip", @"show as html tooltip item label"), NSLocalizedString(@"Show as HTML", @"show as html item label"), + NSLocalizedString(@"None", @"none menu item label"), - NSLocalizedString(@"Insert as Text", @"insert as text item label"), - NSLocalizedString(@"Replace Selection", @"replace selection item label"), - NSLocalizedString(@"Replace Entire Content", @"replace entire content item label"), NSLocalizedString(@"Show as Text Tooltip", @"show as text tooltip item label"), NSLocalizedString(@"Show as HTML Tooltip", @"show as html tooltip item label"), NSLocalizedString(@"Show as HTML", @"show as html item label"), + NSLocalizedString(@"None", @"none menu item label"), NSLocalizedString(@"Show as Text Tooltip", @"show as text tooltip item label"), NSLocalizedString(@"Show as HTML Tooltip", @"show as html tooltip item label"), NSLocalizedString(@"Show as HTML", @"show as html item label"), + NSLocalizedString(@"None", @"none menu item label"), NSLocalizedString(@"Current Word", @"current word item label"), NSLocalizedString(@"Current Line", @"current line item label"), NSLocalizedString(@"Current Query", @"current query item label"), NSLocalizedString(@"Entire Content", @"entire content item label"), - NSLocalizedString(@"None", @"none menu item label"), - NSLocalizedString(@"Current Word", @"current word item label"), - NSLocalizedString(@"Current Line", @"current line item label"), - NSLocalizedString(@"Entire Content", @"entire content item label"), nil] forKeys:allPopupScopeItems]; NSMenuItem *anItem; - for(NSString* title in inputEditorScopeArray) { + for(NSString* title in inputGeneralScopeArray) { anItem = [[NSMenuItem alloc] initWithTitle:[menuItemTitles objectForKey:title] action:@selector(inputPopupButtonChanged:) keyEquivalent:@""]; - [inputEditorScopePopUpMenu addItem:anItem]; + [inputGeneralScopePopUpMenu addItem:anItem]; [anItem release]; } for(NSString* title in inputInputFieldScopeArray) { @@ -177,9 +169,9 @@ [inputDataTableScopePopUpMenu addItem:anItem]; [anItem release]; } - for(NSString* title in outputEditorScopeArray) { + for(NSString* title in outputGeneralScopeArray) { anItem = [[NSMenuItem alloc] initWithTitle:[menuItemTitles objectForKey:title] action:@selector(outputPopupButtonChanged:) keyEquivalent:@""]; - [outputEditorScopePopUpMenu addItem:anItem]; + [outputGeneralScopePopUpMenu addItem:anItem]; [anItem release]; } for(NSString* title in outputInputFieldScopeArray) { @@ -192,11 +184,6 @@ [outputDataTableScopePopUpMenu addItem:anItem]; [anItem release]; } - for(NSString* title in inputFallbackEditorScopeArray) { - anItem = [[NSMenuItem alloc] initWithTitle:[menuItemTitles objectForKey:title] action:@selector(inputFallbackPopupButtonChanged:) keyEquivalent:@""]; - [inputFallbackEditorScopePopUpMenu addItem:anItem]; - [anItem release]; - } for(NSString* title in inputFallbackInputFieldScopeArray) { anItem = [[NSMenuItem alloc] initWithTitle:[menuItemTitles objectForKey:title] action:@selector(inputFallbackPopupButtonChanged:) keyEquivalent:@""]; [inputFallbackInputFieldScopePopUpMenu addItem:anItem]; @@ -206,6 +193,26 @@ [inputNonePopUpMenu addItem:anItem]; [anItem release]; + [inputGeneralScopePopUpMenu removeAllItems]; + anItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"General", @"general scope menu label") action:@selector(scopeButtonChanged:) keyEquivalent:@""]; + [anItem setTag:0]; + [inputGeneralScopePopUpMenu addItem:anItem]; + [anItem release]; + anItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"Input Field", @"input field scope menu label") action:@selector(scopeButtonChanged:) keyEquivalent:@""]; + [anItem setTag:1]; + [inputGeneralScopePopUpMenu addItem:anItem]; + [anItem release]; + anItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"Data Table", @"data table scope menu label") action:@selector(scopeButtonChanged:) keyEquivalent:@""]; + [anItem setTag:2]; + [inputGeneralScopePopUpMenu addItem:anItem]; + [anItem release]; + [inputGeneralScopePopUpMenu addItem:[NSMenuItem separatorItem]]; + anItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"Disable Command", @"disable command menu label") action:@selector(scopeButtonChanged:) keyEquivalent:@""]; + [anItem setTag:10]; + [inputGeneralScopePopUpMenu addItem:anItem]; + [anItem release]; + [scopePopupButton setMenu:inputGeneralScopePopUpMenu]; + [keyEquivalentField setCanCaptureGlobalHotKeys:YES]; } @@ -221,8 +228,8 @@ NSInteger selectedIndex = [senderMenu indexOfItem:sender]; NSString *input = SPBundleInputSourceNone; - if(senderMenu == inputEditorScopePopUpMenu) - input = [inputEditorScopeArray objectAtIndex:selectedIndex]; + if(senderMenu == inputGeneralScopePopUpMenu) + input = [inputGeneralScopeArray objectAtIndex:selectedIndex]; else if(senderMenu == inputInputFieldScopePopUpMenu) input = [inputInputFieldScopeArray objectAtIndex:selectedIndex]; else if(senderMenu == inputDataTableScopePopUpMenu) @@ -245,9 +252,7 @@ NSInteger selectedIndex = [senderMenu indexOfItem:sender]; NSString *input = SPBundleInputSourceNone; - if(senderMenu == inputFallbackEditorScopePopUpMenu) - input = [inputFallbackEditorScopeArray objectAtIndex:selectedIndex]; - else if(senderMenu == inputFallbackInputFieldScopePopUpMenu) + if(senderMenu == inputFallbackInputFieldScopePopUpMenu) input = [inputFallbackInputFieldScopeArray objectAtIndex:selectedIndex]; [currentDict setObject:input forKey:SPBundleFileInputSourceFallBackKey]; @@ -263,8 +268,8 @@ NSInteger selectedIndex = [senderMenu indexOfItem:sender]; NSString *output = SPBundleOutputActionNone; - if(senderMenu == outputEditorScopePopUpMenu) - output = [outputEditorScopeArray objectAtIndex:selectedIndex]; + if(senderMenu == outputGeneralScopePopUpMenu) + output = [outputGeneralScopeArray objectAtIndex:selectedIndex]; else if(senderMenu == outputInputFieldScopePopUpMenu) output = [outputInputFieldScopeArray objectAtIndex:selectedIndex]; else if(senderMenu == outputDataTableScopePopUpMenu) @@ -278,35 +283,22 @@ { id currentDict = [commandBundleArray objectAtIndex:[commandsTableView selectedRow]]; - NSInteger inputMask = [[currentDict objectForKey:SPBundleScopeQueryEditor] intValue] * 1 + - [[currentDict objectForKey:SPBundleScopeInputField] intValue] * 2 + - [[currentDict objectForKey:SPBundleScopeDataTable] intValue] * 4; - - if(inputMask < 1 || inputMask > 7) { - inputMask = 7; - NSNumber *on = [NSNumber numberWithInt:1]; - [currentDict setObject:on forKey:SPBundleScopeQueryEditor]; - [currentDict setObject:on forKey:SPBundleScopeInputField]; - [currentDict setObject:on forKey:SPBundleScopeDataTable]; - } - - [currentDict setObject:[NSNumber numberWithInt:inputMask] forKey:@"inputMask"]; - if(inputMask > 4) { - [currentDict setObject:SPBundleInputSourceNone forKey:SPBundleFileInputSourceKey]; - [currentDict setObject:SPBundleInputSourceNone forKey:SPBundleFileInputSourceFallBackKey]; - if(![[currentDict objectForKey:SPBundleFileOutputActionKey] isEqualToString:SPBundleOutputActionShowAsTextTooltip] - && ![[currentDict objectForKey:SPBundleFileOutputActionKey] isEqualToString:SPBundleOutputActionShowAsHTMLTooltip]) { - [currentDict setObject:SPBundleOutputActionNone forKey:SPBundleFileOutputActionKey]; - } + NSInteger selectedTag = [sender tag]; + switch(selectedTag) { + case 0: + [currentDict setObject:SPBundleScopeGeneral forKey:SPBundleFileScopeKey]; + break; + case 1: + [currentDict setObject:SPBundleScopeInputField forKey:SPBundleFileScopeKey]; + break; + case 2: + [currentDict setObject:SPBundleScopeDataTable forKey:SPBundleFileScopeKey]; + break; + default: + [currentDict setObject:@"" forKey:SPBundleFileScopeKey]; } - if([[currentDict objectForKey:SPBundleFileInputSourceKey] isEqualToString:SPBundleInputSourceSelectedText]) { - if(inputMask > 1 && [[currentDict objectForKey:SPBundleFileInputSourceFallBackKey] isEqualToString:SPBundleInputSourceCurrentQuery]) - [currentDict setObject:SPBundleInputSourceNone forKey:SPBundleFileInputSourceFallBackKey]; - } - if((inputMask == 2 || inputMask == 3) && [[currentDict objectForKey:SPBundleFileOutputActionKey] isEqualToString:SPBundleOutputActionInsertAsSnippet]) - [currentDict setObject:SPBundleOutputActionInsertAsText forKey:SPBundleFileOutputActionKey]; [self _updateInputPopupButton]; @@ -376,8 +368,8 @@ } // Add a new Bundle else { - bundle = [NSMutableDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"New Bundle", @"New Name", @"", SPBundleScopeInputField, [NSNumber numberWithInt:1], nil] - forKeys:[NSArray arrayWithObjects:@"bundleName", SPBundleFileNameKey, SPBundleFileCommandKey, SPBundleFileScopeKey, SPBundleScopeInputField, nil]]; + bundle = [NSMutableDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"New Bundle", @"New Name", @"", SPBundleScopeGeneral, nil] + forKeys:[NSArray arrayWithObjects:@"bundleName", SPBundleFileNameKey, SPBundleFileCommandKey, SPBundleFileScopeKey, nil]]; } if ([commandsTableView numberOfSelectedRows] > 0) { insertIndex = [[commandsTableView selectedRowIndexes] lastIndex]+1; @@ -499,18 +491,6 @@ [bundleCommand addEntriesFromDictionary:cmdData]; [bundleCommand setObject:[bundle stringByDeletingPathExtension] forKey:@"bundleName"]; - NSInteger inputMask = 0; - - // Handle stored scopes - NSArray *scopes = [[cmdData objectForKey:SPBundleFileScopeKey] componentsSeparatedByString:@" "]; - for(NSString *scope in scopes) { - [bundleCommand setObject:[NSNumber numberWithInt:1] forKey:scope]; - if([scope isEqualToString:SPBundleScopeQueryEditor]) inputMask += 1; - if([scope isEqualToString:SPBundleScopeInputField]) inputMask += 2; - if([scope isEqualToString:SPBundleScopeDataTable]) inputMask += 4; - [bundleCommand setObject:[NSNumber numberWithInt:inputMask] forKey:@"inputMask"]; - } - [commandBundleArray addObject:bundleCommand]; } @@ -599,35 +579,9 @@ NSMutableDictionary *saveDict = [NSMutableDictionary dictionary]; [saveDict addEntriesFromDictionary:bundle]; - // Build scope key - NSMutableString *scopes = [NSMutableString string]; - if([bundle objectForKey:SPBundleScopeQueryEditor] && [[bundle objectForKey:SPBundleScopeQueryEditor] intValue]) { - if([scopes length]) [scopes appendString:@" "]; - [scopes appendString:SPBundleScopeQueryEditor]; - } - if([bundle objectForKey:SPBundleScopeInputField] && [[bundle objectForKey:SPBundleScopeInputField] intValue]) { - if([scopes length]) [scopes appendString:@" "]; - [scopes appendString:SPBundleScopeInputField]; - } - if([bundle objectForKey:SPBundleScopeDataTable] && [[bundle objectForKey:SPBundleScopeDataTable] intValue]) { - if([scopes length]) [scopes appendString:@" "]; - [scopes appendString:SPBundleScopeDataTable]; - } - if(![scopes length]) { - // For safety reasons - [scopes setString:[NSString stringWithFormat:@"%@ %@ %@", SPBundleScopeQueryEditor, SPBundleScopeInputField, SPBundleScopeDataTable]]; - [saveDict setObject:SPBundleInputSourceNone forKey:SPBundleFileInputSourceKey]; - [saveDict setObject:SPBundleOutputActionNone forKey:SPBundleFileOutputActionKey]; - } - [saveDict setObject:scopes forKey:SPBundleFileScopeKey]; - // Remove unnecessary keys [saveDict removeObjectsForKeys:[NSArray arrayWithObjects: @"bundleName", - @"inputMask", - SPBundleScopeQueryEditor, - SPBundleScopeInputField, - SPBundleScopeDataTable, nil]]; // Remove a given old command.plist file @@ -668,8 +622,8 @@ // Use a AppleScript script since NSWorkspace performFileOperation or NSFileManager moveItemAtPath // have problems probably due access rights. - NSString *moveToTrahCommand = [NSString stringWithFormat:@"osascript -e 'tell application \"Finder\" to move (POSIX file \"%@\") to the trash'", thePath]; - [moveToTrahCommand runBashCommandWithEnvironment:nil atCurrentDirectoryPath:nil error:&error]; + NSString *moveToTrashCommand = [NSString stringWithFormat:@"osascript -e 'tell application \"Finder\" to move (POSIX file \"%@\") to the trash'", thePath]; + [moveToTrashCommand runBashCommandWithEnvironment:nil atCurrentDirectoryPath:nil error:&error]; if(error != nil) { NSAlert *alert = [NSAlert alertWithMessageText:[NSString stringWithFormat:NSLocalizedString(@"Error while moving “%@” to Trash.", @"error while moving “%@” to trash"), thePath] defaultButton:NSLocalizedString(@"OK", @"OK button") @@ -1086,24 +1040,33 @@ NSString *output = [currentDict objectForKey:SPBundleFileOutputActionKey]; if(!output || ![output length]) output = SPBundleOutputActionNone; - NSInteger inputMask = [[currentDict objectForKey:@"inputMask"] intValue]; - switch(inputMask) { - case 1: - [inputPopupButton setMenu:inputEditorScopePopUpMenu]; - anIndex = [inputEditorScopeArray indexOfObject:input]; - if(anIndex == NSNotFound) anIndex = 0; - [inputPopupButton selectItemAtIndex:anIndex]; - [inputFallbackPopupButton setMenu:inputFallbackEditorScopePopUpMenu]; - anIndex = [inputFallbackEditorScopeArray indexOfObject:inputfallback]; - if(anIndex == NSNotFound) anIndex = 0; - [inputFallbackPopupButton selectItemAtIndex:anIndex]; - [outputPopupButton setMenu:outputEditorScopePopUpMenu]; - anIndex = [outputEditorScopeArray indexOfObject:output]; + NSString *scope = [currentDict objectForKey:SPBundleFileScopeKey]; + if(!scope) scope = SPBundleScopeGeneral; + + if([scope isEqualToString:SPBundleScopeGeneral]) + [scopePopupButton selectItemWithTag:0]; + else if([scope isEqualToString:SPBundleScopeInputField]) + [scopePopupButton selectItemWithTag:1]; + else if([scope isEqualToString:SPBundleScopeDataTable]) + [scopePopupButton selectItemWithTag:2]; + else + [scopePopupButton selectItemWithTag:10]; + + [currentDict setObject:[NSNumber numberWithBool:NO] forKey:SPBundleFileDisabledKey]; + + switch([[scopePopupButton selectedItem] tag]) { + case 0: // General + [inputPopupButton setMenu:inputNonePopUpMenu]; + [inputPopupButton selectItemAtIndex:0]; + [outputPopupButton setMenu:outputGeneralScopePopUpMenu]; + anIndex = [outputGeneralScopeArray indexOfObject:output]; if(anIndex == NSNotFound) anIndex = 0; [outputPopupButton selectItemAtIndex:anIndex]; + input = SPBundleInputSourceNone; + [inputFallbackPopupButton setHidden:YES]; + [fallbackLabelField setHidden:YES]; break; - case 2: - case 3: + case 1: // Input Field [inputPopupButton setMenu:inputInputFieldScopePopUpMenu]; anIndex = [inputInputFieldScopeArray indexOfObject:input]; if(anIndex == NSNotFound) anIndex = 0; @@ -1117,7 +1080,7 @@ if(anIndex == NSNotFound) anIndex = 0; [outputPopupButton selectItemAtIndex:anIndex]; break; - case 4: + case 2: // Data Table [inputPopupButton setMenu:inputDataTableScopePopUpMenu]; anIndex = [inputDataTableScopeArray indexOfObject:input]; if(anIndex == NSNotFound) anIndex = 0; @@ -1126,22 +1089,18 @@ anIndex = [outputDataTableScopeArray indexOfObject:output]; if(anIndex == NSNotFound) anIndex = 0; [outputPopupButton selectItemAtIndex:anIndex]; + input = SPBundleInputSourceNone; + [inputFallbackPopupButton setHidden:YES]; + [fallbackLabelField setHidden:YES]; break; - case 5: - case 6: - case 7: - [inputPopupButton setMenu:inputNonePopUpMenu]; - [inputPopupButton selectItemAtIndex:0]; - [outputPopupButton setMenu:outputDataTableScopePopUpMenu]; - anIndex = [outputDataTableScopeArray indexOfObject:output]; - if(anIndex == NSNotFound) anIndex = 0; - [outputPopupButton selectItemAtIndex:anIndex]; + case 10: // Disable command + [currentDict setObject:[NSNumber numberWithBool:YES] forKey:SPBundleFileDisabledKey]; break; default: [inputPopupButton setMenu:inputNonePopUpMenu]; [inputPopupButton selectItemAtIndex:0]; - [outputPopupButton setMenu:outputDataTableScopePopUpMenu]; - anIndex = [outputDataTableScopeArray indexOfObject:output]; + [outputPopupButton setMenu:outputGeneralScopePopUpMenu]; + anIndex = [outputGeneralScopeArray indexOfObject:output]; if(anIndex == NSNotFound) anIndex = 0; [outputPopupButton selectItemAtIndex:anIndex]; } diff --git a/Source/SPCopyTable.m b/Source/SPCopyTable.m index 77dd14f6..28fcb476 100644 --- a/Source/SPCopyTable.m +++ b/Source/SPCopyTable.m @@ -804,132 +804,132 @@ NSInteger MENU_EDIT_COPY_AS_SQL = 2003; - (IBAction)executeBundleItemForDataTable:(id)sender { - NSInteger idx = [sender tag] - 1000000; - NSString *infoPath = nil; - NSArray *bundleItems = [[NSApp delegate] bundleItemsForScope:SPBundleScopeDataTable]; - if(idx >=0 && idx < [bundleItems count]) { - infoPath = [[bundleItems objectAtIndex:idx] objectForKey:SPBundleInternPathToFileKey]; - } else { - if([sender tag] == 0 && [[sender toolTip] length]) { - infoPath = [sender toolTip]; - } + NSInteger idx = [sender tag] - 1000000; + NSString *infoPath = nil; + NSArray *bundleItems = [[NSApp delegate] bundleItemsForScope:SPBundleScopeDataTable]; + if(idx >=0 && idx < [bundleItems count]) { + infoPath = [[bundleItems objectAtIndex:idx] objectForKey:SPBundleInternPathToFileKey]; + } else { + if([sender tag] == 0 && [[sender toolTip] length]) { + infoPath = [sender toolTip]; } + } - if(!infoPath) { - NSBeep(); - return; - } + if(!infoPath) { + NSBeep(); + return; + } - NSError *readError = nil; - NSString *convError = nil; - NSPropertyListFormat format; - NSDictionary *cmdData = nil; - NSData *pData = [NSData dataWithContentsOfFile:infoPath options:NSUncachedRead error:&readError]; + NSError *readError = nil; + NSString *convError = nil; + NSPropertyListFormat format; + NSDictionary *cmdData = nil; + NSData *pData = [NSData dataWithContentsOfFile:infoPath options:NSUncachedRead error:&readError]; - cmdData = [[NSPropertyListSerialization propertyListFromData:pData - mutabilityOption:NSPropertyListImmutable format:&format errorDescription:&convError] retain]; + cmdData = [[NSPropertyListSerialization propertyListFromData:pData + mutabilityOption:NSPropertyListImmutable format:&format errorDescription:&convError] retain]; - if(!cmdData || readError != nil || [convError length] || !(format == NSPropertyListXMLFormat_v1_0 || format == NSPropertyListBinaryFormat_v1_0)) { - NSLog(@"“%@” file couldn't be read.", infoPath); - NSBeep(); - if (cmdData) [cmdData release]; - return; - } else { - if([cmdData objectForKey:SPBundleFileCommandKey] && [[cmdData objectForKey:SPBundleFileCommandKey] length]) { + if(!cmdData || readError != nil || [convError length] || !(format == NSPropertyListXMLFormat_v1_0 || format == NSPropertyListBinaryFormat_v1_0)) { + NSLog(@"“%@” file couldn't be read.", infoPath); + NSBeep(); + if (cmdData) [cmdData release]; + return; + } else { + if([cmdData objectForKey:SPBundleFileCommandKey] && [[cmdData objectForKey:SPBundleFileCommandKey] length]) { - NSString *cmd = [cmdData objectForKey:SPBundleFileCommandKey]; - NSString *inputAction = @""; - NSString *inputFallBackAction = @""; - NSError *err = nil; - NSString *bundleInputFilePath = [NSString stringWithFormat:@"%@_%@", SPBundleTaskInputFilePath, [NSString stringWithNewUUID]]; + NSString *cmd = [cmdData objectForKey:SPBundleFileCommandKey]; + NSString *inputAction = @""; + NSString *inputFallBackAction = @""; + NSError *err = nil; + NSString *bundleInputFilePath = [NSString stringWithFormat:@"%@_%@", SPBundleTaskInputFilePath, [NSString stringWithNewUUID]]; - [[NSFileManager defaultManager] removeItemAtPath:bundleInputFilePath error:nil]; + [[NSFileManager defaultManager] removeItemAtPath:bundleInputFilePath error:nil]; - if([cmdData objectForKey:SPBundleFileInputSourceKey]) - inputAction = [[cmdData objectForKey:SPBundleFileInputSourceKey] lowercaseString]; - if([cmdData objectForKey:SPBundleFileInputSourceFallBackKey]) - inputFallBackAction = [[cmdData objectForKey:SPBundleFileInputSourceFallBackKey] lowercaseString]; + if([cmdData objectForKey:SPBundleFileInputSourceKey]) + inputAction = [[cmdData objectForKey:SPBundleFileInputSourceKey] lowercaseString]; + if([cmdData objectForKey:SPBundleFileInputSourceFallBackKey]) + inputFallBackAction = [[cmdData objectForKey:SPBundleFileInputSourceFallBackKey] lowercaseString]; - NSMutableDictionary *env = [NSMutableDictionary dictionary]; - [env setObject:[infoPath stringByDeletingLastPathComponent] forKey:@"SP_BUNDLE_PATH"]; - [env setObject:bundleInputFilePath forKey:@"SP_BUNDLE_INPUT_FILE"]; + NSMutableDictionary *env = [NSMutableDictionary dictionary]; + [env setObject:[infoPath stringByDeletingLastPathComponent] forKey:@"SP_BUNDLE_PATH"]; + [env setObject:bundleInputFilePath forKey:@"SP_BUNDLE_INPUT_FILE"]; - if([[self delegate] respondsToSelector:@selector(usedQuery)] && [[self delegate] usedQuery]) - [env setObject:[[self delegate] usedQuery] forKey:@"SP_USED_QUERY_FOR_TABLE"]; + if([[self delegate] respondsToSelector:@selector(usedQuery)] && [[self delegate] usedQuery]) + [env setObject:[[self delegate] usedQuery] forKey:@"SP_USED_QUERY_FOR_TABLE"]; - NSError *inputFileError = nil; - NSString *input = @""; - if([inputAction isEqualToString:SPBundleInputSourceSelectedTableRowsAsTab]) { - input = [self rowsAsTabStringWithHeaders:YES onlySelectedRows:YES]; - } - else if([inputAction isEqualToString:SPBundleInputSourceSelectedTableRowsAsCsv]) { - input = [self rowsAsCsvStringWithHeaders:YES onlySelectedRows:YES]; - } - else if([inputAction isEqualToString:SPBundleInputSourceSelectedTableRowsAsSqlInsert]) { - input = [self rowsAsSqlInsertsOnlySelectedRows:YES]; - } - else if([inputAction isEqualToString:SPBundleInputSourceTableRowsAsTab]) { - input = [self rowsAsTabStringWithHeaders:YES onlySelectedRows:NO]; - } - else if([inputAction isEqualToString:SPBundleInputSourceTableRowsAsCsv]) { - input = [self rowsAsCsvStringWithHeaders:YES onlySelectedRows:NO]; - } - else if([inputAction isEqualToString:SPBundleInputSourceTableRowsAsSqlInsert]) { - input = [self rowsAsSqlInsertsOnlySelectedRows:NO]; - } - - if(input == nil) input = @""; - [input writeToFile:bundleInputFilePath - atomically:YES - encoding:NSUTF8StringEncoding - error:&inputFileError]; - - if(inputFileError != nil) { - NSString *errorMessage = [inputFileError localizedDescription]; - SPBeginAlertSheet(NSLocalizedString(@"Bundle Error", @"bundle error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [self window], self, nil, nil, - [NSString stringWithFormat:@"%@ “%@”:\n%@", NSLocalizedString(@"Error for", @"error for message"), [cmdData objectForKey:@"name"], errorMessage]); - if (cmdData) [cmdData release]; - return; - } + NSError *inputFileError = nil; + NSString *input = @""; + if([inputAction isEqualToString:SPBundleInputSourceSelectedTableRowsAsTab]) { + input = [self rowsAsTabStringWithHeaders:YES onlySelectedRows:YES]; + } + else if([inputAction isEqualToString:SPBundleInputSourceSelectedTableRowsAsCsv]) { + input = [self rowsAsCsvStringWithHeaders:YES onlySelectedRows:YES]; + } + else if([inputAction isEqualToString:SPBundleInputSourceSelectedTableRowsAsSqlInsert]) { + input = [self rowsAsSqlInsertsOnlySelectedRows:YES]; + } + else if([inputAction isEqualToString:SPBundleInputSourceTableRowsAsTab]) { + input = [self rowsAsTabStringWithHeaders:YES onlySelectedRows:NO]; + } + else if([inputAction isEqualToString:SPBundleInputSourceTableRowsAsCsv]) { + input = [self rowsAsCsvStringWithHeaders:YES onlySelectedRows:NO]; + } + else if([inputAction isEqualToString:SPBundleInputSourceTableRowsAsSqlInsert]) { + input = [self rowsAsSqlInsertsOnlySelectedRows:NO]; + } + + if(input == nil) input = @""; + [input writeToFile:bundleInputFilePath + atomically:YES + encoding:NSUTF8StringEncoding + error:&inputFileError]; + + if(inputFileError != nil) { + NSString *errorMessage = [inputFileError localizedDescription]; + SPBeginAlertSheet(NSLocalizedString(@"Bundle Error", @"bundle error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [self window], self, nil, nil, + [NSString stringWithFormat:@"%@ “%@”:\n%@", NSLocalizedString(@"Error for", @"error for message"), [cmdData objectForKey:@"name"], errorMessage]); + if (cmdData) [cmdData release]; + return; + } - NSString *output = [cmd runBashCommandWithEnvironment:env atCurrentDirectoryPath:nil error:&err]; + NSString *output = [cmd runBashCommandWithEnvironment:env atCurrentDirectoryPath:nil error:&err]; - [[NSFileManager defaultManager] removeItemAtPath:bundleInputFilePath error:nil]; + [[NSFileManager defaultManager] removeItemAtPath:bundleInputFilePath error:nil]; - if(err == nil && output && [cmdData objectForKey:SPBundleFileOutputActionKey]) { - if([[cmdData objectForKey:SPBundleFileOutputActionKey] length] - && ![[cmdData objectForKey:SPBundleFileOutputActionKey] isEqualToString:SPBundleOutputActionNone]) { - NSString *action = [[cmdData objectForKey:SPBundleFileOutputActionKey] lowercaseString]; - NSPoint pos = [NSEvent mouseLocation]; - pos.y -= 16; + if(err == nil && output && [cmdData objectForKey:SPBundleFileOutputActionKey]) { + if([[cmdData objectForKey:SPBundleFileOutputActionKey] length] + && ![[cmdData objectForKey:SPBundleFileOutputActionKey] isEqualToString:SPBundleOutputActionNone]) { + NSString *action = [[cmdData objectForKey:SPBundleFileOutputActionKey] lowercaseString]; + NSPoint pos = [NSEvent mouseLocation]; + pos.y -= 16; - if([action isEqualToString:SPBundleOutputActionShowAsTextTooltip]) { - [SPTooltip showWithObject:output atLocation:pos]; - } + if([action isEqualToString:SPBundleOutputActionShowAsTextTooltip]) { + [SPTooltip showWithObject:output atLocation:pos]; + } - else if([action isEqualToString:SPBundleOutputActionShowAsHTMLTooltip]) { - [SPTooltip showWithObject:output atLocation:pos ofType:@"html"]; - } + else if([action isEqualToString:SPBundleOutputActionShowAsHTMLTooltip]) { + [SPTooltip showWithObject:output atLocation:pos ofType:@"html"]; + } - else if([action isEqualToString:SPBundleOutputActionShowAsHTML]) { - SPBundleHTMLOutputController *c = [[SPBundleHTMLOutputController alloc] init]; - [c displayHTMLContent:output withOptions:nil]; - } + else if([action isEqualToString:SPBundleOutputActionShowAsHTML]) { + SPBundleHTMLOutputController *c = [[SPBundleHTMLOutputController alloc] init]; + [c displayHTMLContent:output withOptions:nil]; } - } else { - NSString *errorMessage = [err localizedDescription]; - SPBeginAlertSheet(NSLocalizedString(@"BASH Error", @"bash error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [self window], self, nil, nil, - [NSString stringWithFormat:@"%@ “%@”:\n%@", NSLocalizedString(@"Error for", @"error for message"), [cmdData objectForKey:@"name"], errorMessage]); } - + } else { + NSString *errorMessage = [err localizedDescription]; + SPBeginAlertSheet(NSLocalizedString(@"BASH Error", @"bash error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [self window], self, nil, nil, + [NSString stringWithFormat:@"%@ “%@”:\n%@", NSLocalizedString(@"Error for", @"error for message"), [cmdData objectForKey:@"name"], errorMessage]); } - if (cmdData) [cmdData release]; - } + if (cmdData) [cmdData release]; + } +} + /** * Only have the copy menu item enabled when row(s) are selected in * supported tables. diff --git a/Source/SPEditSheetTextView.m b/Source/SPEditSheetTextView.m index a333a850..95fcd51d 100644 --- a/Source/SPEditSheetTextView.m +++ b/Source/SPEditSheetTextView.m @@ -137,27 +137,6 @@ [[self delegate] setDoGroupDueToChars]; } - - if([[[[self delegate] class] description] isEqualToString:@"SPBundleEditorController"]) { - [super keyDown: theEvent]; - return; - } - - // Check for assign key equivalents inside user-defined bundle commands - NSDictionary *keyEquivalents = [[NSApp delegate] bundleKeyEquivalentsForScope:SPBundleScopeInputField]; - if([keyEquivalents count]) { - for(NSString* key in [keyEquivalents allKeys]) { - NSArray *keyData = [keyEquivalents objectForKey:key]; - if([[keyData objectAtIndex:0] isEqualToString:charactersIgnMod] && [[[keyEquivalents objectForKey:key] objectAtIndex:1] intValue] == curFlags) { - NSMenuItem *item = [[[NSMenuItem alloc] init] autorelease]; - [item setToolTip:[[keyEquivalents objectForKey:key] objectAtIndex:2]]; - [item setTag:0]; - [self executeBundleItemForInputField:item]; - return; - } - } - } - [super keyDown: theEvent]; } diff --git a/Source/SPStringAdditions.m b/Source/SPStringAdditions.m index ea3f6385..1f9f2738 100644 --- a/Source/SPStringAdditions.m +++ b/Source/SPStringAdditions.m @@ -535,7 +535,7 @@ if(userTerminated) { if(bashTask) [bashTask release]; NSBeep(); - NSLog(@"“%@” was terminated by user.", self); + NSLog(@"“%@” was terminated by user.", ([self length] > 50) ? [self substringToIndex:50] : self); return @""; } diff --git a/Source/SPTextView.h b/Source/SPTextView.h index 02482611..797fff34 100644 --- a/Source/SPTextView.h +++ b/Source/SPTextView.h @@ -144,6 +144,4 @@ - (BOOL)isSnippetMode; -- (IBAction)executeBundleItemForEditor:(id)sender; - @end diff --git a/Source/SPTextView.m b/Source/SPTextView.m index ef581a8f..c458e7b1 100644 --- a/Source/SPTextView.m +++ b/Source/SPTextView.m @@ -2121,21 +2121,6 @@ NSInteger alphabeticSort(id string1, id string2, void *reverse) } } - // Check for assign key equivalents inside user-defined bundle commands - NSDictionary *keyEquivalents = [[NSApp delegate] bundleKeyEquivalentsForScope:SPBundleScopeQueryEditor]; - if([keyEquivalents count]) { - for(NSString* key in [keyEquivalents allKeys]) { - NSArray *keyData = [keyEquivalents objectForKey:key]; - if([[keyData objectAtIndex:0] isEqualToString:charactersIgnMod] && [[[keyEquivalents objectForKey:key] objectAtIndex:1] intValue] == curFlags) { - NSMenuItem *item = [[[NSMenuItem alloc] init] autorelease]; - [item setToolTip:[[keyEquivalents objectForKey:key] objectAtIndex:2]]; - [item setTag:0]; - [self executeBundleItemForEditor:item]; - return; - } - } - } - // Only process for character autopairing if autopairing is enabled and a single character is being added. if ([prefs boolForKey:SPCustomQueryAutoPairCharacters] && characters && [characters length] == 1) { @@ -2928,8 +2913,8 @@ NSInteger alphabeticSort(id string1, id string2, void *reverse) [menu removeItem:bItem]; } - NSArray *bundleCategories = [[NSApp delegate] bundleCategoriesForScope:SPBundleScopeQueryEditor]; - NSArray *bundleItems = [[NSApp delegate] bundleItemsForScope:SPBundleScopeQueryEditor]; + NSArray *bundleCategories = [[NSApp delegate] bundleCategoriesForScope:SPBundleScopeInputField]; + NSArray *bundleItems = [[NSApp delegate] bundleItemsForScope:SPBundleScopeInputField]; // Add 'Bundles' sub menu for custom query editor only so far if bundles with scope 'editor' were found if(customQueryInstance && bundleItems && [bundleItems count]) { @@ -2962,7 +2947,7 @@ NSInteger alphabeticSort(id string1, id string2, void *reverse) else keyEq = @""; - NSMenuItem *mItem = [[[NSMenuItem alloc] initWithTitle:[item objectForKey:SPBundleInternLabelKey] action:@selector(executeBundleItemForEditor:) keyEquivalent:keyEq] autorelease]; + NSMenuItem *mItem = [[[NSMenuItem alloc] initWithTitle:[item objectForKey:SPBundleInternLabelKey] action:@selector(executeBundleItemForInputField:) keyEquivalent:keyEq] autorelease]; if([keyEq length]) [mItem setKeyEquivalentModifierMask:[[[item objectForKey:SPBundleFileKeyEquivalentKey] objectAtIndex:1] intValue]]; @@ -2994,15 +2979,6 @@ NSInteger alphabeticSort(id string1, id string2, void *reverse) - (BOOL)validateMenuItem:(NSMenuItem *)menuItem { - if([menuItem action] == @selector(executeBundleItemForEditor:)) - { - return YES; - } - if([menuItem action] == @selector(executeBundleItemForInputField:)) - { - return NO; - } - // Enable or disable the search in the MySQL help menu item depending on whether there is a // selection and whether it is a reasonable length. if ([menuItem action] == @selector(showMySQLHelpForCurrentWord:)) { @@ -3414,171 +3390,6 @@ NSInteger alphabeticSort(id string1, id string2, void *reverse) #pragma mark - -- (IBAction)executeBundleItemForEditor:(id)sender -{ - - NSInteger idx = [sender tag] - 1000000; - NSString *infoPath = nil; - NSArray *bundleItems = [[NSApp delegate] bundleItemsForScope:SPBundleScopeQueryEditor]; - if(idx >=0 && idx < [bundleItems count]) { - infoPath = [[bundleItems objectAtIndex:idx] objectForKey:SPBundleInternPathToFileKey]; - } else { - if([sender tag] == 0 && [[sender toolTip] length]) { - infoPath = [sender toolTip]; - } - } - - if(!infoPath) { - NSBeep(); - return; - } - - NSError *readError = nil; - NSString *convError = nil; - NSPropertyListFormat format; - NSDictionary *cmdData = nil; - NSData *pData = [NSData dataWithContentsOfFile:infoPath options:NSUncachedRead error:&readError]; - - cmdData = [[NSPropertyListSerialization propertyListFromData:pData - mutabilityOption:NSPropertyListImmutable format:&format errorDescription:&convError] retain]; - - if(!cmdData || readError != nil || [convError length] || !(format == NSPropertyListXMLFormat_v1_0 || format == NSPropertyListBinaryFormat_v1_0)) { - NSLog(@"“%@” file couldn't be read.", infoPath); - NSBeep(); - if (cmdData) [cmdData release]; - return; - } else { - if([cmdData objectForKey:SPBundleFileCommandKey] && [[cmdData objectForKey:SPBundleFileCommandKey] length]) { - - NSString *cmd = [cmdData objectForKey:SPBundleFileCommandKey]; - NSString *inputAction = @""; - NSString *inputFallBackAction = @""; - NSError *err = nil; - NSString *bundleInputFilePath = [NSString stringWithFormat:@"%@_%@", SPBundleTaskInputFilePath, [NSString stringWithNewUUID]]; - - NSRange currentWordRange, currentQueryRange, currentSelectionRange, currentLineRange; - - [[NSFileManager defaultManager] removeItemAtPath:bundleInputFilePath error:nil]; - - if([cmdData objectForKey:SPBundleFileInputSourceKey]) - inputAction = [[cmdData objectForKey:SPBundleFileInputSourceKey] lowercaseString]; - if([cmdData objectForKey:SPBundleFileInputSourceFallBackKey]) - inputFallBackAction = [[cmdData objectForKey:SPBundleFileInputSourceFallBackKey] lowercaseString]; - - currentSelectionRange = [self selectedRange]; - currentWordRange = [self getRangeForCurrentWord]; - if(customQueryInstance && [customQueryInstance currentQueryRange].length) { - currentQueryRange = [customQueryInstance currentQueryRange]; - } else { - currentQueryRange = currentSelectionRange; - } - currentLineRange = [[self string] lineRangeForRange:NSMakeRange([self selectedRange].location, 0)]; - - NSRange replaceRange = NSMakeRange(currentSelectionRange.location, 0); - if([inputAction isEqualToString:SPBundleInputSourceSelectedText]) { - if(!currentSelectionRange.length) { - if([inputFallBackAction isEqualToString:SPBundleInputSourceCurrentWord]) - replaceRange = currentWordRange; - else if([inputFallBackAction isEqualToString:SPBundleInputSourceCurrentLine]) - replaceRange = currentLineRange; - else if([inputFallBackAction isEqualToString:SPBundleInputSourceCurrentQuery]) - replaceRange = currentQueryRange; - else if([inputAction isEqualToString:SPBundleInputSourceEntireContent]) - replaceRange = NSMakeRange(0,[[self string] length]); - } else { - replaceRange = currentSelectionRange; - } - - } - else if([inputAction isEqualToString:SPBundleInputSourceEntireContent]) { - replaceRange = NSMakeRange(0, [[self string] length]); - } - - NSMutableDictionary *env = [NSMutableDictionary dictionary]; - [env setObject:[infoPath stringByDeletingLastPathComponent] forKey:@"SP_BUNDLE_PATH"]; - [env setObject:bundleInputFilePath forKey:@"SP_BUNDLE_INPUT_FILE"]; - - if(currentSelectionRange.length) - [env setObject:[[self string] substringWithRange:currentSelectionRange] forKey:@"SP_SELECTED_TEXT"]; - - if(customQueryInstance && [customQueryInstance currentQueryRange].length) - [env setObject:[[self string] substringWithRange:[customQueryInstance currentQueryRange]] forKey:@"SP_CURRENT_QUERY"]; - - if(currentWordRange.length) - [env setObject:[[self string] substringWithRange:currentWordRange] forKey:@"SP_CURRENT_WORD"]; - - if(currentLineRange.length) - [env setObject:[[self string] substringWithRange:currentLineRange] forKey:@"SP_CURRENT_LINE"]; - - NSError *inputFileError = nil; - NSString *input = [NSString stringWithString:[[self string] substringWithRange:replaceRange]]; - [input writeToFile:bundleInputFilePath - atomically:YES - encoding:NSUTF8StringEncoding - error:&inputFileError]; - - if(inputFileError != nil) { - NSString *errorMessage = [inputFileError localizedDescription]; - SPBeginAlertSheet(NSLocalizedString(@"Bundle Error", @"bundle error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [self window], self, nil, nil, - [NSString stringWithFormat:@"%@ “%@”:\n%@", NSLocalizedString(@"Error for", @"error for message"), [cmdData objectForKey:@"name"], errorMessage]); - if (cmdData) [cmdData release]; - return; - } - - NSString *output = [cmd runBashCommandWithEnvironment:env atCurrentDirectoryPath:nil error:&err]; - - [[NSFileManager defaultManager] removeItemAtPath:bundleInputFilePath error:nil]; - - if(err == nil && output && [cmdData objectForKey:SPBundleFileOutputActionKey]) { - if([[cmdData objectForKey:SPBundleFileOutputActionKey] length] - && ![[cmdData objectForKey:SPBundleFileOutputActionKey] isEqualToString:SPBundleOutputActionNone]) { - NSString *action = [[cmdData objectForKey:SPBundleFileOutputActionKey] lowercaseString]; - - if([action isEqualToString:SPBundleOutputActionInsertAsText]) { - [self insertText:output]; - } - - else if([action isEqualToString:SPBundleOutputActionInsertAsSnippet]) { - [self insertAsSnippet:output atRange:replaceRange]; - } - - else if([action isEqualToString:SPBundleOutputActionReplaceContent]) { - if([[self string] length]) - [self setSelectedRange:NSMakeRange(0, [[self string] length])]; - [self insertText:output]; - } - - else if([action isEqualToString:SPBundleOutputActionReplaceSelection]) { - [self shouldChangeTextInRange:replaceRange replacementString:output]; - [self replaceCharactersInRange:replaceRange withString:output]; - } - - else if([action isEqualToString:SPBundleOutputActionShowAsTextTooltip]) { - [SPTooltip showWithObject:output]; - } - - else if([action isEqualToString:SPBundleOutputActionShowAsHTMLTooltip]) { - [SPTooltip showWithObject:output ofType:@"html"]; - } - - else if([action isEqualToString:SPBundleOutputActionShowAsHTML]) { - SPBundleHTMLOutputController *c = [[SPBundleHTMLOutputController alloc] init]; - [c displayHTMLContent:output withOptions:nil]; - } - } - } else { - NSString *errorMessage = [err localizedDescription]; - SPBeginAlertSheet(NSLocalizedString(@"BASH Error", @"bash error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [self window], self, nil, nil, - [NSString stringWithFormat:@"%@ “%@”:\n%@", NSLocalizedString(@"Error for", @"error for message"), [cmdData objectForKey:@"name"], errorMessage]); - } - - } - - if (cmdData) [cmdData release]; - - } - -} #pragma mark - diff --git a/Source/SPTextViewAdditions.m b/Source/SPTextViewAdditions.m index a33d80e4..1bc45aad 100644 --- a/Source/SPTextViewAdditions.m +++ b/Source/SPTextViewAdditions.m @@ -25,6 +25,7 @@ #import "SPAlertSheets.h" #import "SPTooltip.h" #import "SPBundleHTMLOutputController.h" +#import "SPCustomQuery.h" @implementation NSTextView (SPTextViewAdditions) @@ -528,10 +529,12 @@ NSError *err = nil; NSString *bundleInputFilePath = [NSString stringWithFormat:@"%@_%@", SPBundleTaskInputFilePath, [NSString stringWithNewUUID]]; - NSRange currentWordRange, currentSelectionRange, currentLineRange; + NSRange currentWordRange, currentSelectionRange, currentLineRange, currentQueryRange; [[NSFileManager defaultManager] removeItemAtPath:bundleInputFilePath error:nil]; + BOOL selfIsQueryEditor = ([[[self class] description] isEqualToString:@"SPTextView"]) ; + if([cmdData objectForKey:SPBundleFileInputSourceKey]) inputAction = [[cmdData objectForKey:SPBundleFileInputSourceKey] lowercaseString]; if([cmdData objectForKey:SPBundleFileInputSourceFallBackKey]) @@ -541,6 +544,14 @@ currentWordRange = [self getRangeForCurrentWord]; currentLineRange = [[self string] lineRangeForRange:NSMakeRange([self selectedRange].location, 0)]; + if(selfIsQueryEditor) { + currentQueryRange = [[self delegate] currentQueryRange]; + } else { + currentQueryRange = currentLineRange; + } + if(!currentQueryRange.length) + currentQueryRange = currentSelectionRange; + NSRange replaceRange = NSMakeRange(currentSelectionRange.location, 0); if([inputAction isEqualToString:SPBundleInputSourceSelectedText]) { if(!currentSelectionRange.length) { @@ -548,6 +559,8 @@ replaceRange = currentWordRange; else if([inputFallBackAction isEqualToString:SPBundleInputSourceCurrentLine]) replaceRange = currentLineRange; + else if([inputFallBackAction isEqualToString:SPBundleInputSourceCurrentQuery]) + replaceRange = currentQueryRange; else if([inputAction isEqualToString:SPBundleInputSourceEntireContent]) replaceRange = NSMakeRange(0,[[self string] length]); } else { @@ -563,6 +576,9 @@ [env setObject:[infoPath stringByDeletingLastPathComponent] forKey:@"SP_BUNDLE_PATH"]; [env setObject:bundleInputFilePath forKey:@"SP_BUNDLE_INPUT_FILE"]; + if(selfIsQueryEditor && [[self delegate] currentQueryRange].length) + [env setObject:[[self string] substringWithRange:[[self delegate] currentQueryRange]] forKey:@"SP_CURRENT_QUERY"]; + if(currentSelectionRange.length) [env setObject:[[self string] substringWithRange:currentSelectionRange] forKey:@"SP_SELECTED_TEXT"]; @@ -596,26 +612,7 @@ && ![[cmdData objectForKey:SPBundleFileOutputActionKey] isEqualToString:SPBundleOutputActionNone]) { NSString *action = [[cmdData objectForKey:SPBundleFileOutputActionKey] lowercaseString]; - if([action isEqualToString:SPBundleOutputActionInsertAsText]) { - [self insertText:output]; - } - - else if([action isEqualToString:SPBundleOutputActionInsertAsSnippet]) { - [self insertAsSnippet:output atRange:replaceRange]; - } - - else if([action isEqualToString:SPBundleOutputActionReplaceContent]) { - if([[self string] length]) - [self setSelectedRange:NSMakeRange(0, [[self string] length])]; - [self insertText:output]; - } - - else if([action isEqualToString:SPBundleOutputActionReplaceSelection]) { - [self shouldChangeTextInRange:replaceRange replacementString:output]; - [self replaceCharactersInRange:replaceRange withString:output]; - } - - else if([action isEqualToString:SPBundleOutputActionShowAsTextTooltip]) { + if([action isEqualToString:SPBundleOutputActionShowAsTextTooltip]) { [SPTooltip showWithObject:output]; } @@ -627,6 +624,35 @@ SPBundleHTMLOutputController *c = [[SPBundleHTMLOutputController alloc] init]; [c displayHTMLContent:output withOptions:nil]; } + + if([self isEditable]) { + + if([action isEqualToString:SPBundleOutputActionInsertAsText]) { + [self insertText:output]; + } + + else if([action isEqualToString:SPBundleOutputActionInsertAsSnippet]) { + if([self respondsToSelector:@selector(insertAsSnippet:atRange:)]) + [self insertAsSnippet:output atRange:replaceRange]; + else + [SPTooltip showWithObject:NSLocalizedString(@"Input Field doesn't support insertion of snippets.", @"input field doesn't support insertion of snippets.")]; + } + + else if([action isEqualToString:SPBundleOutputActionReplaceContent]) { + if([[self string] length]) + [self setSelectedRange:NSMakeRange(0, [[self string] length])]; + [self insertText:output]; + } + + else if([action isEqualToString:SPBundleOutputActionReplaceSelection]) { + [self shouldChangeTextInRange:replaceRange replacementString:output]; + [self replaceCharactersInRange:replaceRange withString:output]; + } + + } else { + [SPTooltip showWithObject:NSLocalizedString(@"Input Field is not editable.", @"input field is not editable.")]; + } + } } else { NSString *errorMessage = [err localizedDescription]; @@ -722,21 +748,6 @@ } -- (BOOL)validateMenuItem:(NSMenuItem *)menuItem -{ - - if([menuItem action] == @selector(executeBundleItemForEditor:)) - { - return NO; - } - if([menuItem action] == @selector(executeBundleItemForInputField:)) - { - return YES; - } - - return YES; - -} #pragma mark - #pragma mark multi-touch trackpad support |