diff options
Diffstat (limited to 'Source')
-rw-r--r-- | Source/CMTextView.m | 2 | ||||
-rw-r--r-- | Source/CustomQuery.h | 8 | ||||
-rw-r--r-- | Source/CustomQuery.m | 313 |
3 files changed, 167 insertions, 156 deletions
diff --git a/Source/CMTextView.m b/Source/CMTextView.m index 4ccbe16e..01037358 100644 --- a/Source/CMTextView.m +++ b/Source/CMTextView.m @@ -270,7 +270,7 @@ YY_BUFFER_STATE yy_scan_string (const char *); if(curFlags==(NSControlKeyMask)) { - [[[[self window] delegate] valueForKeyPath:@"customQueryInstance"] getHelpForCurrentWord:self]; + [[[[self window] delegate] valueForKeyPath:@"customQueryInstance"] showHelpForCurrentWord:self]; return; } diff --git a/Source/CustomQuery.h b/Source/CustomQuery.h index 42b2ae66..fd305662 100644 --- a/Source/CustomQuery.h +++ b/Source/CustomQuery.h @@ -90,7 +90,7 @@ - (IBAction)chooseQueryHistory:(id)sender; - (IBAction)closeSheet:(id)sender; - (IBAction)gearMenuItemSelected:(id)sender; -- (IBAction)getHelpForCurrentWord:(id)sender; +- (IBAction)showHelpForCurrentWord:(id)sender; - (IBAction)showHelpForSearchString:(id)sender; - (IBAction)helpSegmentDispatcher:(id)sender; - (IBAction)helpTargetDispatcher:(id)sender; @@ -117,9 +117,11 @@ - (NSArray *)currentResult; // MySQL Help -- (void)showHelpFor:(NSString *)aString setHistory:(BOOL)setHistory; -- (NSString *)getHTMLHelpFor:(NSString *)aString; +- (NSString *)getHTMLformattedMySQLHelpFor:(NSString *)aString; +- (void)showHelpFor:(NSString *)aString addToHistory:(BOOL)addToHistory; - (void)helpTargetValidation; +- (void)openMySQLonlineDocumentationWithString:(NSString *)searchString; + // Other - (void)setConnection:(CMMCPConnection *)theConnection; diff --git a/Source/CustomQuery.m b/Source/CustomQuery.m index 3ae3c718..dd0711e0 100644 --- a/Source/CustomQuery.m +++ b/Source/CustomQuery.m @@ -29,7 +29,16 @@ #import "SPTextViewAdditions.h" #import "TableDocument.h" -#define MYSQL_DEV_SEARCH_URL @"http://search.mysql.com/search?q=%@&site=refman-%@" +#define SP_MYSQL_DEV_SEARCH_URL @"http://search.mysql.com/search?q=%@&site=refman-%@" +#define SP_HELP_SEARCH_IN_MYSQL 0 +#define SP_HELP_SEARCH_IN_PAGE 1 +#define SP_HELP_SEARCH_IN_WEB 2 +#define SP_HELP_GOBACK_BUTTON 0 +#define SP_HELP_SHOW_TOC_BUTTON 1 +#define SP_HELP_GOFORWARD_BUTTON 2 +#define SP_HELP_NOT_AVAILABLE @"__no_help_available" +#define SP_HELP_TOC_SEARCH_STRING @"contents" + @implementation CustomQuery @@ -1365,110 +1374,120 @@ traps enter key and /* - * Retrieve and show the data for "HELP 'aString'". + * Show the data for "HELP 'searchString'". */ -- (void)showHelpFor:(NSString *)aString setHistory:(BOOL)setHistory +- (void)showHelpFor:(NSString *)searchString addToHistory:(BOOL)addToHistory { - NSString * helpString = [self getHTMLHelpFor:aString]; - // Order out the Help window if not visible + NSString * helpString = [self getHTMLformattedMySQLHelpFor:searchString]; + // Order out resp. init the Help window if not visible if(![helpWebViewWindow isVisible]) { + // get current MySQL version for title and online search mySQLversion = [[[(TableDocument *)[[textView window] delegate] mySQLVersion] substringToIndex:3] retain]; + [helpWebViewWindow setTitle:[NSString stringWithFormat:@"%@ (%@ %@)", NSLocalizedString(@"MySQL Help", @"mysql help"), NSLocalizedString(@"version", @"version"), mySQLversion]]; + + // init search history [helpWebView setMaintainsBackForwardList:YES]; [[helpWebView backForwardList] setCapacity:20]; + + // init goback/forward buttons if([[helpWebView backForwardList] backListCount] < 1) { - [helpNavigator setEnabled:NO forSegment:0]; - [helpNavigator setEnabled:NO forSegment:2]; + [helpNavigator setEnabled:NO forSegment:SP_HELP_GOBACK_BUTTON]; + [helpNavigator setEnabled:NO forSegment:SP_HELP_GOFORWARD_BUTTON]; } else { - [helpNavigator setEnabled:[[helpWebView backForwardList] backListCount] forSegment:0]; - [helpNavigator setEnabled:[[helpWebView backForwardList] forwardListCount] forSegment:2]; + [helpNavigator setEnabled:[[helpWebView backForwardList] backListCount] forSegment:SP_HELP_GOBACK_BUTTON]; + [helpNavigator setEnabled:[[helpWebView backForwardList] forwardListCount] forSegment:SP_HELP_GOFORWARD_BUTTON]; } - if(![helpString isEqualToString:@"__no_help_available"]) - [helpWebViewWindow orderFront:helpWebView]; - helpTarget = 2; // set default to search in MySQL help - [helpTargetSelector setSelectedSegment:2]; + + // set default to search in MySQL help + helpTarget = SP_HELP_SEARCH_IN_MYSQL; + [helpTargetSelector setSelectedSegment:SP_HELP_SEARCH_IN_MYSQL]; [self helpTargetValidation]; + + // order out Help window if Help is available + if(![helpString isEqualToString:SP_HELP_NOT_AVAILABLE]) + [helpWebViewWindow orderFront:helpWebView]; + } - if([helpString isEqualToString:@"__no_help_available"]) + + // close Help window if no Help avaiable + if([helpString isEqualToString:SP_HELP_NOT_AVAILABLE]) [helpWebViewWindow close]; if(![helpString length]) return; - if(setHistory) + // add searchString to history list + if(addToHistory) { - WebHistoryItem *aWebHistoryItem = [[WebHistoryItem alloc] initWithURLString:[NSString stringWithFormat:@"applewebdata://%@", aString] title:aString lastVisitedTimeInterval:[[NSDate date] timeIntervalSinceDate:[NSDate distantFuture]]]; + WebHistoryItem *aWebHistoryItem = [[WebHistoryItem alloc] initWithURLString:[NSString stringWithFormat:@"applewebdata://%@", searchString] title:searchString lastVisitedTimeInterval:[[NSDate date] timeIntervalSinceDate:[NSDate distantFuture]]]; [[helpWebView backForwardList] addItem:aWebHistoryItem]; } - [helpNavigator setEnabled:[[helpWebView backForwardList] backListCount] forSegment:0]; - [helpNavigator setEnabled:[[helpWebView backForwardList] forwardListCount] forSegment:2]; + + // validate goback/forward buttons + [helpNavigator setEnabled:[[helpWebView backForwardList] backListCount] forSegment:SP_HELP_GOBACK_BUTTON]; + [helpNavigator setEnabled:[[helpWebView backForwardList] forwardListCount] forSegment:SP_HELP_GOFORWARD_BUTTON]; + // load HTML formatted help into the webview [[helpWebView mainFrame] loadHTMLString:helpString baseURL:nil]; - } /* - * Retrieve and show the data for "HELP 'search word'" according to helpTarget + * Show the data for "HELP 'search word'" according to helpTarget */ - (IBAction)showHelpForSearchString:(id)sender { - NSString *searchTerm = [[helpSearchField stringValue] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; + NSString *searchString = [[helpSearchField stringValue] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; switch(helpTarget) { - case 0: // page - if(![helpWebView searchFor:searchTerm direction:YES caseSensitive:NO wrap:YES]) - if([searchTerm length]) NSBeep(); - break; - case 1: // online - // Open MySQL Documentation search in browser - if(![searchTerm length]) + case SP_HELP_SEARCH_IN_PAGE: + if(![helpWebView searchFor:searchString direction:YES caseSensitive:NO wrap:YES]) + if([searchString length]) NSBeep(); + break; + case SP_HELP_SEARCH_IN_WEB: + if(![searchString length]) + break; + [self openMySQLonlineDocumentationWithString:searchString]; + break; + case SP_HELP_SEARCH_IN_MYSQL: + [self showHelpFor:searchString addToHistory:YES]; break; - [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString: - [[NSString stringWithFormat: - MYSQL_DEV_SEARCH_URL, - searchTerm, - [mySQLversion stringByReplacingOccurrencesOfString:@"." withString:@""]] - stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]]]; - break; - case 2: // MySQL - [self showHelpFor:searchTerm setHistory:YES]; - break; } } /* - * Retrieve and show the Help for the selected text in the webview + * Show the Help for the selected text in the webview */ - (IBAction)showHelpForWebViewSelection:(id)sender { - [self showHelpFor:[[helpWebView selectedDOMRange] text] setHistory:YES]; + [self showHelpFor:[[helpWebView selectedDOMRange] text] addToHistory:YES]; } /* - * Retrieve and show MySQL's online documentation for the selected text in the webview + * Show MySQL's online documentation for the selected text in the webview */ - (IBAction)searchInDocForWebViewSelection:(id)sender { - [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString: - [[NSString stringWithFormat: - MYSQL_DEV_SEARCH_URL, - [[helpWebView selectedDOMRange] text], - [mySQLversion stringByReplacingOccurrencesOfString:@"." withString:@""]] - stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]]]; + NSString *searchString = [[[helpWebView selectedDOMRange] text] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; + if(![searchString length]) + { + NSBeep(); + return; + } + [self openMySQLonlineDocumentationWithString:searchString]; } /* - * Retrieve and show the data for "HELP 'currentWord'" + * Show the data for "HELP 'currentWord'" */ -- (IBAction)getHelpForCurrentWord:(id)sender +- (IBAction)showHelpForCurrentWord:(id)sender { - NSString *aString = [[textView string] substringWithRange:[textView getRangeForCurrentWord]]; - // if(![aString length]) return; - [self showHelpFor:aString setHistory:YES]; + NSString *searchString = [[textView string] substringWithRange:[textView getRangeForCurrentWord]]; + [self showHelpFor:searchString addToHistory:YES]; } /* @@ -1476,13 +1495,13 @@ traps enter key and */ - (IBAction)helpSearchFindNextInPage:(id)sender { - if(!helpTarget) + if(helpTarget == SP_HELP_SEARCH_IN_PAGE) if(![helpWebView searchFor:[[helpSearchField stringValue] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] direction:YES caseSensitive:NO wrap:YES]) NSBeep(); } - (IBAction)helpSearchFindPreviousInPage:(id)sender { - if(!helpTarget) + if(helpTarget == SP_HELP_SEARCH_IN_PAGE) if(![helpWebView searchFor:[[helpSearchField stringValue] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] direction:NO caseSensitive:NO wrap:YES]) NSBeep(); } @@ -1494,138 +1513,111 @@ traps enter key and { switch([helpNavigator selectedSegment]) { - case 0: - if([[helpWebView backForwardList] backListCount]) { - [self showHelpFor:[[[[helpWebView backForwardList] backItem] URLString] lastPathComponent] setHistory:NO]; - [[helpWebView backForwardList] goBack]; - } - break; - case 1: // TOC - [self showHelpFor:@"contents" setHistory:YES]; - break; - case 2: - if([[helpWebView backForwardList] forwardListCount]) { - [self showHelpFor:[[[[helpWebView backForwardList] forwardItem] URLString] lastPathComponent] setHistory:NO]; - [[helpWebView backForwardList] goForward]; - } - break; + case SP_HELP_GOBACK_BUTTON: + if([[helpWebView backForwardList] backListCount]) { + [self showHelpFor:[[[[helpWebView backForwardList] backItem] URLString] lastPathComponent] addToHistory:NO]; + [[helpWebView backForwardList] goBack]; + } + break; + case SP_HELP_SHOW_TOC_BUTTON: + [self showHelpFor:SP_HELP_TOC_SEARCH_STRING addToHistory:YES]; + break; + case SP_HELP_GOFORWARD_BUTTON: + if([[helpWebView backForwardList] forwardListCount]) { + [self showHelpFor:[[[[helpWebView backForwardList] forwardItem] URLString] lastPathComponent] addToHistory:NO]; + [[helpWebView backForwardList] goForward]; + } + break; } - [helpNavigator setEnabled:[[helpWebView backForwardList] backListCount] forSegment:0]; - [helpNavigator setEnabled:[[helpWebView backForwardList] forwardListCount] forSegment:2]; + // validate goback and goforward buttons according history + [helpNavigator setEnabled:[[helpWebView backForwardList] backListCount] forSegment:SP_HELP_GOBACK_BUTTON]; + [helpNavigator setEnabled:[[helpWebView backForwardList] forwardListCount] forSegment:SP_HELP_GOFORWARD_BUTTON]; } /* - * Set helpTarget + * Set helpTarget according user choice via mouse and keyboard short-cuts. */ - (IBAction)helpSelectHelpTargetMySQL:(id)sender { - helpTarget = 2; - [helpTargetSelector setSelectedSegment:2]; + helpTarget = SP_HELP_SEARCH_IN_MYSQL; + [helpTargetSelector setSelectedSegment:SP_HELP_SEARCH_IN_MYSQL]; [self helpTargetValidation]; } - (IBAction)helpSelectHelpTargetPage:(id)sender { - helpTarget = 0; - [helpTargetSelector setSelectedSegment:1]; + helpTarget = SP_HELP_SEARCH_IN_PAGE; + [helpTargetSelector setSelectedSegment:SP_HELP_SEARCH_IN_PAGE]; [self helpTargetValidation]; } - (IBAction)helpSelectHelpTargetWeb:(id)sender { - helpTarget = 1; - [helpTargetSelector setSelectedSegment:0]; + helpTarget = SP_HELP_SEARCH_IN_WEB; + [helpTargetSelector setSelectedSegment:SP_HELP_SEARCH_IN_WEB]; [self helpTargetValidation]; } - (IBAction)helpTargetDispatcher:(id)sender { - switch([helpTargetSelector selectedSegment]) - { - case 0: - helpTarget = 1; - break; - case 1: - helpTarget = 0; - break; - case 2: - helpTarget = 2; - break; - } + helpTarget = [helpTargetSelector selectedSegment]; [self helpTargetValidation]; } + /* - * Control search target buttons and help behaviour + * Control the help search field behaviour. */ - (void)helpTargetValidation { switch(helpTarget) { - case 0: // page - case 1: // online + case SP_HELP_SEARCH_IN_PAGE: + case SP_HELP_SEARCH_IN_WEB: [helpSearchFieldCell setSendsWholeSearchString:YES]; break; - case 2: // MySQL + case SP_HELP_SEARCH_IN_MYSQL: [helpSearchFieldCell setSendsWholeSearchString:NO]; break; } } +- (void)openMySQLonlineDocumentationWithString:(NSString *)searchString +{ + [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString: + [[NSString stringWithFormat: + SP_MYSQL_DEV_SEARCH_URL, + searchString, + [mySQLversion stringByReplacingOccurrencesOfString:@"." withString:@""]] + stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]]]; +} + /* - * Return the help string HTML formatted from executing "HELP 'aString'". + * Return the help string HTML formatted from executing "HELP 'searchString'". * If more than one help topic was found return a link list. */ -- (NSString *)getHTMLHelpFor:(NSString *)aString +- (NSString *)getHTMLformattedMySQLHelpFor:(NSString *)searchString { - if(![aString length]) return(@""); + if(![searchString length]) return @""; - CMMCPResult *theResult = nil; - NSDictionary *tableDetails; - NSRange aRange; + NSRange aRange; + CMMCPResult *theResult = nil; + NSDictionary *tableDetails; NSMutableString *theHelp = [NSMutableString string]; - [theHelp setString: - @"<html>" - @"<head>" - @" <style type='text/css' media='screen'>" - @" body {" - @" margin: 2px;" - @" padding: 10px;" - @" font-family:'Helvetica';" - @" font-size:9pt;" - @" }" - @" .internallink {" - @" color:#6A81DD;" - @" text-decoration:none;" - @" }" - @" .code {" - @" font-family:Monaco;" - @" }" - @" .example {" - @" font-family:Courier;" - @" }" - @" .searchstring {" - @" }" - @" .header {" - @" padding-bottom:5px;" - @" }" - @" </style>" - @"</head>" - @"<body>" - - ]; - - theResult = [mySQLConnection queryString:[NSString stringWithFormat:@"HELP '%@'", aString]]; + + [theHelp setString:@""]; + + // search via: HELP 'searchString' + theResult = [mySQLConnection queryString:[NSString stringWithFormat:@"HELP '%@'", searchString]]; if ( ![[mySQLConnection getLastErrorMessage] isEqualToString:@""]) { - [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString: - [[NSString stringWithFormat: - MYSQL_DEV_SEARCH_URL, - aString, - [mySQLversion stringByReplacingOccurrencesOfString:@"." withString:@""]] - stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]]]; - return @"__no_help_available"; + // if an error or HELP is not supported fall back to online search + [self openMySQLonlineDocumentationWithString:searchString]; + return SP_HELP_NOT_AVAILABLE; } + // nothing found? if(![theResult numOfRows]) { - theResult = [mySQLConnection queryString:[NSString stringWithFormat:@"HELP '%@%%'", aString]]; + // try to search via: HELP 'searchString%' + theResult = [mySQLConnection queryString:[NSString stringWithFormat:@"HELP '%@%%'", searchString]]; + // really nothing found? if(![theResult numOfRows]) return @""; } @@ -1645,7 +1637,7 @@ traps enter key and [desc setString:[[[tableDetails objectForKey:@"description"] copy] autorelease]]; - //[desc replaceOccurrencesOfString:[aString uppercaseString] withString:[NSString stringWithFormat:@"<span class='searchstring'>%@</span>", [aString uppercaseString]] options:NSLiteralSearch range:NSMakeRange(0,[desc length])]; + //[desc replaceOccurrencesOfString:[searchString uppercaseString] withString:[NSString stringWithFormat:@"<span class='searchstring'>%@</span>", [searchString uppercaseString]] options:NSLiteralSearch range:NSMakeRange(0,[desc length])]; // detect and generate http links aRange = NSMakeRange(0,0); @@ -1694,10 +1686,11 @@ traps enter key and // break; // } - [theHelp appendString:@"<pre class='code'>"]; + [theHelp appendString:@"<pre class='description'>"]; [theHelp appendString:desc]; [theHelp appendString:@"</pre>"]; } + // are examples available? if([tableDetails objectForKey:@"example"]){ NSString *examples = [[[tableDetails objectForKey:@"example"] copy] autorelease]; if([examples length]){ @@ -1710,12 +1703,13 @@ traps enter key and int i; int r = [theResult numOfRows]; if (r) [theResult dataSeek:0]; - - if(![aString isEqualToString:@"contents"]) - [theHelp appendString:[NSString stringWithFormat:@"<br><i>%@ “%@”</i><br>", NSLocalizedString(@"Help topics for", @"help topics for"), aString]]; + // check if HELP 'contents' is called + if(![searchString isEqualToString:SP_HELP_TOC_SEARCH_STRING]) + [theHelp appendString:[NSString stringWithFormat:@"<br><i>%@ “%@”</i><br>", NSLocalizedString(@"Help topics for", @"help topics for"), searchString]]; else - [theHelp appendString:[NSString stringWithFormat:@"<br><b>%@:</b><br>", NSLocalizedString(@"MySQL Help – Categories", @"mysql help categories"), aString]]; + [theHelp appendString:[NSString stringWithFormat:@"<br><b>%@:</b><br>", NSLocalizedString(@"MySQL Help – Categories", @"mysql help categories"), searchString]]; + // iterate through all found rows and print them as HTML ul/li list [theHelp appendString:@"<ul>"]; for ( i = 0 ; i < r ; i++ ) { NSArray *anArray = [theResult fetchRowAsArray]; @@ -1725,13 +1719,27 @@ traps enter key and } [theHelp appendString:@"</ul>"]; } - [theHelp appendString:@"</body></html>"]; [tableDetails release]; - return theHelp; + + NSString *helpHTMLTemplatePath = [[NSBundle mainBundle] pathForResource:@"sequel-pro-mysql-help-template" ofType:@"html"]; + NSError *error; + NSString *helpHTMLTemplate = [[NSString alloc] + initWithContentsOfFile:helpHTMLTemplatePath + encoding:NSUTF8StringEncoding + error:&error]; + // an error occurred while reading + if (helpHTMLTemplate == nil) + return [NSString stringWithFormat:@"Error reading “sequel-pro-mysql-help-template.html”!<br>%@", [error localizedFailureReason]]; + + return [NSString stringWithFormat:helpHTMLTemplate, theHelp]; } +////////////////////////////// +// WebView delegate methods // +////////////////////////////// + /* * Link detector: If user clicked at an http link open it in the default browser, * otherwise search for it in the MySQL help. Additionally handle back/forward events from @@ -1740,9 +1748,9 @@ traps enter key and - (void)webView:(WebView *)webView decidePolicyForNavigationAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id<WebPolicyDecisionListener>)listener { int navigationType = [[actionInformation objectForKey:WebActionNavigationTypeKey] intValue]; + if([[[request URL] scheme] isEqualToString:@"applewebdata"] && navigationType == WebNavigationTypeLinkClicked){ - // [self showHelpFor:[[[request URL] path] substringWithRange:NSMakeRange(1,[[[request URL] path] length]-1)] setHistory:YES]; - [self showHelpFor:[[[request URL] path] lastPathComponent] setHistory:YES]; + [self showHelpFor:[[[request URL] path] lastPathComponent] addToHistory:YES]; [listener ignore]; } else { if (navigationType == WebNavigationTypeOther) { @@ -1757,7 +1765,7 @@ traps enter key and [listener ignore]; } else if (navigationType == WebNavigationTypeBackForward) { // catch back/forward events from contextual menu - [self showHelpFor:[[[[actionInformation objectForKey:WebActionOriginalURLKey] absoluteString] lastPathComponent] stringByReplacingPercentEscapesUsingEncoding:NSASCIIStringEncoding] setHistory:NO]; + [self showHelpFor:[[[[actionInformation objectForKey:WebActionOriginalURLKey] absoluteString] lastPathComponent] stringByReplacingPercentEscapesUsingEncoding:NSASCIIStringEncoding] addToHistory:NO]; [listener ignore]; } else if (navigationType == WebNavigationTypeReload) { // just in case @@ -1771,7 +1779,8 @@ traps enter key and /* - * Manage contextual menu in helpWebView + * Manage contextual menu in helpWebView + * Ignore "Reload", "Open Link", "Open Link in new Window", "Download link". */ - (NSArray *)webView:(WebView *)sender contextMenuItemsForElement:(NSDictionary *)element defaultMenuItems:(NSArray *)defaultMenuItems { |