diff options
-rw-r--r-- | Source/SPBundleHTMLOutputController.m | 74 | ||||
-rw-r--r-- | Source/SPContentFilterManager.m | 67 | ||||
-rw-r--r-- | Source/SPQueryFavoriteManager.m | 35 |
3 files changed, 105 insertions, 71 deletions
diff --git a/Source/SPBundleHTMLOutputController.m b/Source/SPBundleHTMLOutputController.m index e3def2db..773d737e 100644 --- a/Source/SPBundleHTMLOutputController.m +++ b/Source/SPBundleHTMLOutputController.m @@ -36,6 +36,8 @@ #import "SPAppController.h" #import "SPBundleCommandRunner.h" +static NSString *SPSaveDocumentAction = @"SPSaveDocument"; + @class WebScriptCallFrame; #pragma mark - @@ -176,14 +178,13 @@ */ - (void)sheetDidEnd:(id)sheet returnCode:(NSInteger)returnCode contextInfo:(NSString *)contextInfo { - // Order out current sheet to suppress overlapping of sheets if ([sheet respondsToSelector:@selector(orderOut:)]) [sheet orderOut:nil]; else if ([sheet respondsToSelector:@selector(window)]) [[sheet window] orderOut:nil]; - if([contextInfo isEqualToString:@"saveDocument"]) { + if ([contextInfo isEqualToString:SPSaveDocumentAction]) { if (returnCode == NSOKButton) { NSString *sourceCode = [webView stringByEvaluatingJavaScriptFromString:@"document.getElementsByTagName('html')[0].outerHTML"]; NSError *err = nil; @@ -191,11 +192,10 @@ atomically:YES encoding:NSUTF8StringEncoding error:&err]; - if(err != nil) { + if (err != nil) { SPBeginAlertSheet(NSLocalizedString(@"Error", @"error"), NSLocalizedString(@"OK", @"OK button"), nil, nil, [self window], self, nil, nil, [NSString stringWithFormat:@"%@", [err localizedDescription]]); } - } } } @@ -252,42 +252,52 @@ delegate:self didRunSelector:nil contextInfo:nil]; - } - (void)showSourceCode { NSString *sourceCode = [webView stringByEvaluatingJavaScriptFromString:@"document.getElementsByTagName('html')[0].outerHTML"]; + SPBundleHTMLOutputController *c = [[SPBundleHTMLOutputController alloc] init]; + [c displayHTMLContent:[NSString stringWithFormat:@"<pre>%@</pre>", [sourceCode HTMLEscapeString]] withOptions:nil]; + [[NSApp delegate] addHTMLOutputController:c]; } - (void)saveDocument { NSSavePanel *panel = [NSSavePanel savePanel]; - - [panel setAllowedFileTypes:[NSArray arrayWithObject:@"html"]]; + + [panel setNameFieldStringValue:@"output"]; + [panel setAllowedFileTypes:@[@"html"]]; [panel setExtensionHidden:NO]; [panel setAllowsOtherFileTypes:YES]; [panel setCanSelectHiddenExtension:YES]; [panel setCanCreateDirectories:YES]; - [panel beginSheetForDirectory:nil file:@"output" modalForWindow:[self window] modalDelegate:self didEndSelector:@selector(sheetDidEnd:returnCode:contextInfo:) contextInfo:@"saveDocument"]; + [panel beginSheetModalForWindow:[self window] completionHandler:^(NSInteger returnCode) + { + [self sheetDidEnd:panel returnCode:returnCode contextInfo:SPSaveDocumentAction]; + }]; } - #pragma mark - - (void)windowWillClose:(NSNotification *)notification { [[webView mainFrame] loadHTMLString:@"<html></html>" baseURL:nil]; + [webView close]; + [self setInitHTMLSourceString:@""]; + windowUUID = @""; docUUID = @""; + [[NSApp delegate] removeHTMLOutputController:self]; + [self release]; } @@ -333,12 +343,12 @@ - (void)webViewShow:(WebView *)sender { id newWebView = [[NSDocumentController sharedDocumentController] documentForWindow:[sender window]]; + [newWebView showWindows]; } - (void)webView:(WebView *)aWebView decidePolicyForNavigationAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id<WebPolicyDecisionListener>)listener { - NSInteger navigationType = [[actionInformation objectForKey:WebActionNavigationTypeKey] integerValue]; // sequelpro:// handler @@ -369,9 +379,7 @@ default: [listener use]; } - } - } - (void)webView:(WebView *)sender didReceiveTitle:(NSString *)title forFrame:(WebFrame *)frame @@ -436,7 +444,6 @@ - (void)webView:(WebView *)sender windowScriptObjectAvailable:(WebScriptObject *)windowScriptObject { - [windowScriptObject setValue:self forKey:@"system"]; [webView setScriptDebugDelegate:self]; } @@ -462,53 +469,68 @@ return @""; } -+ (BOOL)isSelectorExcludedFromWebScript:(SEL)selector { ++ (BOOL)isSelectorExcludedFromWebScript:(SEL)selector +{ if (selector == @selector(run:)) { return NO; } + if (selector == @selector(getShellEnvironmentForName:)) { return NO; } + if (selector == @selector(insertText:)) { return NO; } + if (selector == @selector(setText:)) { return NO; } + if (selector == @selector(setSelectedTextRange:)) { return NO; } + if (selector == @selector(makeHTMLOutputWindowKeyWindow)) { return NO; } + if (selector == @selector(closeHTMLOutputWindow)) { return NO; } + if (selector == @selector(suppressExceptionAlert)) { return NO; } + return YES; } -+ (BOOL)isKeyExcludedFromWebScript:(const char *)property { ++ (BOOL)isKeyExcludedFromWebScript:(const char *)property +{ if (strcmp(property, "run") == 0) { return NO; } + if (strcmp(property, "getShellEnvironmentForName") == 0) { return NO; } + if (strcmp(property, "insertText") == 0) { return NO; } + if (strcmp(property, "setText") == 0) { return NO; } + if (strcmp(property, "setSelectedTextRange") == 0) { return NO; } if (strcmp(property, "makeHTMLOutputWindowKeyWindow") == 0) { return NO; } + return YES; } @@ -579,10 +601,12 @@ - (void)insertText:(NSString*)text { id firstResponder = [[NSApp keyWindow] firstResponder]; - if([firstResponder isKindOfClass:[NSTextView class]]) { + + if ([firstResponder isKindOfClass:[NSTextView class]]) { [firstResponder insertText:text]; return; } + NSBeep(); } @@ -593,11 +617,13 @@ - (void)setText:(NSString*)text { id firstResponder = [[NSApp keyWindow] firstResponder]; - if([firstResponder isKindOfClass:[NSTextView class]]) { + + if ([firstResponder isKindOfClass:[NSTextView class]]) { [firstResponder setSelectedRange:NSMakeRange(0, [[firstResponder string] length])]; [firstResponder insertText:text]; return; } + NSBeep(); } @@ -608,13 +634,15 @@ - (void)setSelectedTextRange:(NSString*)range { id firstResponder = [[NSApp keyWindow] firstResponder]; - if([firstResponder isKindOfClass:[NSTextView class]]) { + + if ([firstResponder isKindOfClass:[NSTextView class]]) { NSRange theRange = NSIntersectionRange(NSRangeFromString(range), NSMakeRange(0, [[firstResponder string] length])); if(theRange.location != NSNotFound) { [firstResponder setSelectedRange:theRange]; } return; } + NSBeep(); } @@ -633,7 +661,6 @@ */ - (NSString *)run:(id)call { - NSError *err = nil; NSString *command = nil; NSString *uuid = nil; @@ -703,21 +730,22 @@ NSBeep(); return @""; } - } #pragma mark - -#pragma mark multi-touch trackpad support +#pragma mark Multi-touch trackpad support /** * Trackpad two-finger zooming gesture for in/decreasing the font size */ - (void)magnifyWithEvent:(NSEvent *)anEvent { - if([anEvent deltaZ]>2.0) + if ([anEvent deltaZ] > 2.0) { [webView makeTextLarger:nil]; - else if([anEvent deltaZ]<-2.0) + } + else if ([anEvent deltaZ] < -2.0) { [webView makeTextSmaller:nil]; + } } @end diff --git a/Source/SPContentFilterManager.m b/Source/SPContentFilterManager.m index 515dead0..0b4a376e 100644 --- a/Source/SPContentFilterManager.m +++ b/Source/SPContentFilterManager.m @@ -40,6 +40,8 @@ #import "SPConnectionController.h" #import "SPSplitView.h" +static NSString *SPExportFilterAction = @"SPExportFilterAction"; + #define SP_MULTIPLE_SELECTION_PLACEHOLDER_STRING NSLocalizedString(@"[multiple selection]", @"[multiple selection]") #define SP_NO_SELECTION_PLACEHOLDER_STRING NSLocalizedString(@"[no selection]", @"[no selection]") #define SP_NAME_REQUIRED_PLACEHOLDER_STRING NSLocalizedString(@"[name required]", @"displayed when new content filter has empty Name field (ContentFilterManager)") @@ -63,6 +65,7 @@ if (managerDelegate == nil) { NSBeep(); NSLog(@"ContentFilterManager was called without a delegate."); + return nil; } @@ -82,7 +85,6 @@ */ - (void)awakeFromNib { - // Set up the split view [contentFilterSplitView setMinSize:120.f ofSubviewAtIndex:0]; [contentFilterSplitView setMaxSize:245.f ofSubviewAtIndex:0]; @@ -98,11 +100,15 @@ #ifndef SP_CODA /* prefs access */ // Build data source for global content filter (as mutable copy! otherwise each // change will be stored in the prefs at once) - if([[prefs objectForKey:SPContentFilters] objectForKey:filterType]) { - for(id fav in [[prefs objectForKey:SPContentFilters] objectForKey:filterType]) { + if ([[prefs objectForKey:SPContentFilters] objectForKey:filterType]) { + for (id fav in [[prefs objectForKey:SPContentFilters] objectForKey:filterType]) + { id f = [[fav mutableCopy] autorelease]; - if([f objectForKey:@"ConjunctionLabels"]) + + if ([f objectForKey:@"ConjunctionLabels"]) { [f setObject:[[f objectForKey:@"ConjunctionLabels"] objectAtIndex:0] forKey:@"ConjunctionLabel"]; + } + [contentFilters addObject:f]; } } @@ -114,7 +120,7 @@ @"", @"Clause", nil]]; - if([[SPQueryController sharedQueryController] contentFilterForFileURL:delegatesFileURL]) { + if ([[SPQueryController sharedQueryController] contentFilterForFileURL:delegatesFileURL]) { id filters = [[SPQueryController sharedQueryController] contentFilterForFileURL:delegatesFileURL]; if([filters objectForKey:filterType]) for(id fav in [filters objectForKey:filterType]) @@ -122,7 +128,6 @@ } #endif - // Select the first query if any NSUInteger i = 0; @@ -162,19 +167,17 @@ - (NSMutableArray *)contentFilterForFileURL:(NSURL *)fileURL { NSMutableArray *filters = [NSMutableArray array]; - NSString *fileURLstring; - if(fileURL == nil) - fileURLstring = @""; - else - fileURLstring = [fileURL absoluteString]; + NSString *fileURLstring = (fileURL == nil) ? @"" : [fileURL absoluteString]; NSUInteger i = 0; // Look for the header specified by fileURL - while(i<[contentFilters count]) { - if ([[contentFilters objectAtIndex:i] objectForKey:@"headerOfFileURL"] - && [[[contentFilters objectAtIndex:i] objectForKey:@"headerOfFileURL"] isEqualToString:fileURLstring]) { + while (i<[contentFilters count]) + { + if ([[contentFilters objectAtIndex:i] objectForKey:@"headerOfFileURL"] && + [[[contentFilters objectAtIndex:i] objectForKey:@"headerOfFileURL"] isEqualToString:fileURLstring]) + { i++; break; } @@ -185,8 +188,8 @@ // Take all content filters until the next header or end of all content filters NSUInteger numOfArgs; - for ( ; i<[contentFilters count]; i++) { - + for (; i < [contentFilters count]; i++) + { if(![[contentFilters objectAtIndex:i] objectForKey:@"headerOfFileURL"]) { NSMutableDictionary *d = [[NSMutableDictionary alloc] init]; [d setDictionary:[contentFilters objectAtIndex:i]]; @@ -205,9 +208,10 @@ [d setObject:[NSNumber numberWithInteger:numOfArgs] forKey:@"NumberOfArguments"]; [filters addObject:d]; [d release]; - } else + } + else { break; - + } } return filters; @@ -337,7 +341,10 @@ [panel setCanSelectHiddenExtension:YES]; [panel setCanCreateDirectories:YES]; - [panel beginSheetForDirectory:nil file:nil modalForWindow:[self window] modalDelegate:self didEndSelector:@selector(savePanelDidEnd:returnCode:contextInfo:) contextInfo:@"exportFilter"]; + [panel beginSheetModalForWindow:[self window] completionHandler:^(NSInteger returnCode) + { + [self savePanelDidEnd:panel returnCode:returnCode contextInfo:SPExportFilterAction]; + }]; #endif } @@ -348,19 +355,18 @@ { #ifndef SP_CODA NSOpenPanel *panel = [NSOpenPanel openPanel]; + [panel setCanSelectHiddenExtension:YES]; [panel setDelegate:self]; [panel setCanChooseDirectories:NO]; [panel setAllowsMultipleSelection:NO]; - // [panel setResolvesAliases:YES]; - - [panel beginSheetForDirectory:nil - file:@"" - types:[NSArray arrayWithObjects:SPFileExtensionDefault, nil] - modalForWindow:[self window] - modalDelegate:self - didEndSelector:@selector(importPanelDidEnd:returnCode:contextInfo:) - contextInfo:NULL]; + + [panel setAllowedFileTypes:@[SPFileExtensionDefault]]; + + [panel beginSheetModalForWindow:[self window] completionHandler:^(NSInteger returnCode) + { + [self importPanelDidEnd:panel returnCode:returnCode contextInfo:nil]; + }]; #endif } @@ -377,7 +383,6 @@ */ - (IBAction)closeContentFilterManagerSheet:(id)sender { - [NSApp endSheet:[self window] returnCode:0]; [[self window] orderOut:self]; @@ -404,11 +409,9 @@ for(id doc in [[NSApp delegate] orderedDocuments]) if([[doc valueForKeyPath:@"tableContentInstance"] respondsToSelector:@selector(setCompareTypes:)]) [[doc valueForKeyPath:@"tableContentInstance"] setCompareTypes:nil]; - #endif } - } /** @@ -919,7 +922,7 @@ { #ifndef SP_CODA - if([contextInfo isEqualToString:@"exportFilter"]) { + if([contextInfo isEqualToString:SPExportFilterAction]) { if (returnCode == NSOKButton) { // Build a SPF with format = "content filters" diff --git a/Source/SPQueryFavoriteManager.m b/Source/SPQueryFavoriteManager.m index 32563964..0f5b68ff 100644 --- a/Source/SPQueryFavoriteManager.m +++ b/Source/SPQueryFavoriteManager.m @@ -321,8 +321,13 @@ [panel setAccessoryView:[SPEncodingPopupAccessory encodingAccessory:[prefs integerForKey:SPLastSQLFileEncoding] includeDefaultEntry:NO encodingPopUp:&encodingPopUp]]; [encodingPopUp setEnabled:YES]; - - [panel beginSheetForDirectory:nil file:[favoriteNameTextField stringValue] modalForWindow:[self window] modalDelegate:self didEndSelector:@selector(savePanelDidEnd:returnCode:contextInfo:) contextInfo:@"saveQuery"]; + + [panel setNameFieldStringValue:[favoriteNameTextField stringValue]]; + + [panel beginSheetModalForWindow:[self window] completionHandler:^(NSInteger returnCode) + { + [self savePanelDidEnd:panel returnCode:returnCode contextInfo:@"saveQuery"]; + }]; #endif } @@ -338,7 +343,10 @@ [panel setCanSelectHiddenExtension:YES]; [panel setCanCreateDirectories:YES]; - [panel beginSheetForDirectory:nil file:nil modalForWindow:[self window] modalDelegate:self didEndSelector:@selector(savePanelDidEnd:returnCode:contextInfo:) contextInfo:@"exportFavorites"]; + [panel beginSheetModalForWindow:[self window] completionHandler:^(NSInteger returnCode) + { + [self savePanelDidEnd:panel returnCode:returnCode contextInfo:@"exportFavorites"]; + }]; #endif } @@ -346,19 +354,18 @@ { #ifndef SP_CODA NSOpenPanel *panel = [NSOpenPanel openPanel]; + [panel setCanSelectHiddenExtension:YES]; [panel setDelegate:self]; [panel setCanChooseDirectories:NO]; [panel setAllowsMultipleSelection:NO]; - // [panel setResolvesAliases:YES]; - - [panel beginSheetForDirectory:nil - file:@"" - types:[NSArray arrayWithObjects:SPFileExtensionDefault, SPFileExtensionSQL, nil] - modalForWindow:[self window] - modalDelegate:self - didEndSelector:@selector(importPanelDidEnd:returnCode:contextInfo:) - contextInfo:NULL]; + + [panel setAllowedFileTypes:@[SPFileExtensionDefault, SPFileExtensionSQL]]; + + [panel beginSheetModalForWindow:[self window] completionHandler:^(NSInteger returnCode) + { + [self importPanelDidEnd:panel returnCode:returnCode contextInfo:NULL]; + }]; #endif } @@ -372,7 +379,6 @@ */ - (IBAction)insertPlaceholder:(id)sender { - // Look up the sender's tag to determine the placeholder to insert. // Note that tag values alter behaviour slightly - see below. NSDictionary *lookupTable = [NSDictionary dictionaryWithObjectsAndKeys: @@ -476,8 +482,6 @@ for(id doc in [[NSApp delegate] orderedDocuments]) if([[doc valueForKeyPath:@"customQueryInstance"] respondsToSelector:@selector(queryFavoritesHaveBeenUpdated:)]) [[doc valueForKeyPath:@"customQueryInstance"] queryFavoritesHaveBeenUpdated:self]; - - } #endif @@ -888,7 +892,6 @@ #endif } - /** * Save panel did end method. */ |