Reviewed by Darin.
authorsullivan <sullivan@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 25 Jan 2005 00:46:15 +0000 (00:46 +0000)
committersullivan <sullivan@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 25 Jan 2005 00:46:15 +0000 (00:46 +0000)
        - WebKit part of fix for <rdar://problem/3960231> Text context menu in WebKit needs Spotlight and Google items

        * WebView.subproj/WebDefaultContextMenuDelegate.m:
        (localizedMenuTitleFromAppKit):
        new function, gets localized string from AppKit so we can avoid adding localized
        strings to WebKit at this late date in Tiger. Returns the non-localized English
        string if we can't find the localized string in AppKit.
        (-[WebDefaultUIDelegate menuItemWithTag:]):
        handle the two new menu items by tag name
        (-[WebDefaultUIDelegate contextMenuItemsForElement:]):
        add menu items for Search in Google and Search in Spotlight to selected-text menu item
        for the noneditable case
        (-[WebDefaultUIDelegate editingContextMenuItemsForElement:]):
        add menu items for Search in Google and Search in Spotlight to selected-text menu item
        for the editable case

        * WebView.subproj/WebHTMLView.m:
        (-[WebHTMLView _searchWithGoogleFromMenu:]):
        implement this menu item action method, using same method name and implementation as NSTextView
        (-[WebHTMLView _searchWithSpotlightFromMenu:]):
        implement this menu item action method, using same basic implementation as NSTextView
        (-[WebHTMLView validateUserInterfaceItem:]):
        validate new menu items

        * WebView.subproj/WebUIDelegatePrivate.h:
        define new tags for new menu items

        * English.lproj/StringsNotToBeLocalized.txt:
        updated for these changes

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@8443 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebKit/ChangeLog
WebKit/English.lproj/StringsNotToBeLocalized.txt
WebKit/WebView.subproj/WebDefaultContextMenuDelegate.m
WebKit/WebView.subproj/WebHTMLView.m
WebKit/WebView.subproj/WebUIDelegatePrivate.h

index 7c9edb5386074c2c98def85abc77fe5c8eccd4e3..088597b43b17230869191a18510bdb5e4af0bd52 100644 (file)
@@ -1,3 +1,37 @@
+2005-01-24  John Sullivan  <sullivan@apple.com>
+
+        Reviewed by Darin.
+        
+        - WebKit part of fix for <rdar://problem/3960231> Text context menu in WebKit needs Spotlight and Google items
+        
+        * WebView.subproj/WebDefaultContextMenuDelegate.m:
+        (localizedMenuTitleFromAppKit):
+        new function, gets localized string from AppKit so we can avoid adding localized
+        strings to WebKit at this late date in Tiger. Returns the non-localized English
+        string if we can't find the localized string in AppKit.
+        (-[WebDefaultUIDelegate menuItemWithTag:]):
+        handle the two new menu items by tag name
+        (-[WebDefaultUIDelegate contextMenuItemsForElement:]):
+        add menu items for Search in Google and Search in Spotlight to selected-text menu item
+        for the noneditable case
+        (-[WebDefaultUIDelegate editingContextMenuItemsForElement:]):
+        add menu items for Search in Google and Search in Spotlight to selected-text menu item
+        for the editable case
+
+        * WebView.subproj/WebHTMLView.m:
+        (-[WebHTMLView _searchWithGoogleFromMenu:]):
+        implement this menu item action method, using same method name and implementation as NSTextView
+        (-[WebHTMLView _searchWithSpotlightFromMenu:]):
+        implement this menu item action method, using same basic implementation as NSTextView
+        (-[WebHTMLView validateUserInterfaceItem:]):
+        validate new menu items
+        
+        * WebView.subproj/WebUIDelegatePrivate.h:
+        define new tags for new menu items
+
+        * English.lproj/StringsNotToBeLocalized.txt:
+        updated for these changes
+
 2005-01-24  Darin Adler  <darin@apple.com>
 
         * WebView.subproj/WebDataSource.m: (+[WebDataSource _repTypesAllowImageTypeOmission:]):
 2005-01-24  Darin Adler  <darin@apple.com>
 
         * WebView.subproj/WebDataSource.m: (+[WebDataSource _repTypesAllowImageTypeOmission:]):
index 914fd4da0d5bf319392b1189f2e0ca07c11f27b7..409e881c0a2edfb6fe895d4b08df4a585eb01bdb 100644 (file)
 "List count: %d items\n"
 "List total size: %d bytes\n"
 "Lucida Grande"
 "List count: %d items\n"
 "List total size: %d bytes\n"
 "Lucida Grande"
+"MenuCommands"
 "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; %@) AppleWebKit/%@ (KHTML, like Gecko) %@"
 "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; %@) AppleWebKit/%@ (KHTML, like Gecko)"
 "NP_GetEntryPoints"
 "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; %@) AppleWebKit/%@ (KHTML, like Gecko) %@"
 "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; %@) AppleWebKit/%@ (KHTML, like Gecko)"
 "NP_GetEntryPoints"
 "Quartz.framework"
 "SAMILang"
 "SAMIStyle"
 "Quartz.framework"
 "SAMILang"
 "SAMIStyle"
+"Search in Google menu title."
+"Search in Spotlight menu title."
 "Set-Cookie"
 "SpellingDot"
 "Times"
 "Set-Cookie"
 "SpellingDot"
 "Times"
 "canGoBack"
 "canGoForward"
 "com.RealNetworks.RealOne Player"
 "canGoBack"
 "canGoForward"
 "com.RealNetworks.RealOne Player"
+"com.apple.AppKit"
 "com.apple.HIWebView"
 "com.apple.JavaAppletPlugin"
 "com.apple.JavaPluginCocoa"
 "com.apple.HIWebView"
 "com.apple.JavaAppletPlugin"
 "com.apple.JavaPluginCocoa"
@@ -411,7 +415,10 @@ WebCoreSupport.subproj/WebTextRendererFactory.m:"Geeza Pro"
 WebCoreSupport.subproj/WebTextRendererFactory.m:"Pashto"
 WebCoreSupport.subproj/WebTextRendererFactory.m:"Urdu"
 WebView.subproj/WebDataSource.m:"Refresh"
 WebCoreSupport.subproj/WebTextRendererFactory.m:"Pashto"
 WebCoreSupport.subproj/WebTextRendererFactory.m:"Urdu"
 WebView.subproj/WebDataSource.m:"Refresh"
+WebView.subproj/WebDefaultContextMenuDelegate.m:"Search in Google"
+WebView.subproj/WebDefaultContextMenuDelegate.m:"Search in Spotlight"
 WebView.subproj/WebHTMLView.m:"%0.fpx"
 WebView.subproj/WebHTMLView.m:"%0.fpx"
+WebView.subproj/WebHTMLView.m:"Search With Google"
 WebView.subproj/WebHTMLView.m:"Version:"
 WebView.subproj/WebHTMLView.m:"b"
 WebView.subproj/WebHTMLView.m:"baseline"
 WebView.subproj/WebHTMLView.m:"Version:"
 WebView.subproj/WebHTMLView.m:"b"
 WebView.subproj/WebHTMLView.m:"baseline"
index 8b2118d1e1706c6784e5b9775b201f29d63a36da..e0fd4a3c57552ad14e15b88f4a5444aca5278e96 100644 (file)
@@ -19,6 +19,7 @@
 #import <WebKit/WebPolicyDelegate.h>
 #import <WebKit/WebViewPrivate.h>
 #import <WebKit/WebUIDelegate.h>
 #import <WebKit/WebPolicyDelegate.h>
 #import <WebKit/WebViewPrivate.h>
 #import <WebKit/WebUIDelegate.h>
+#import <WebKit/WebUIDelegatePrivate.h>
 
 #import <WebCore/WebCoreBridge.h>
 
 
 #import <WebCore/WebCoreBridge.h>
 
 
 @implementation WebDefaultUIDelegate (WebContextMenu)
 
 
 @implementation WebDefaultUIDelegate (WebContextMenu)
 
+static NSString *localizedMenuTitleFromAppKit(NSString *key, NSString *comment)
+{
+    NSBundle *appKitBundle = [NSBundle bundleWithIdentifier:@"com.apple.AppKit"];
+    if (!appKitBundle) {
+        return key;
+    }
+    return NSLocalizedStringFromTableInBundle(key, @"MenuCommands", appKitBundle, comment);
+}
+
 - (NSMenuItem *)menuItemWithTag:(int)tag
 {
     NSMenuItem *menuItem = [[[NSMenuItem alloc] init] autorelease];
 - (NSMenuItem *)menuItemWithTag:(int)tag
 {
     NSMenuItem *menuItem = [[[NSMenuItem alloc] init] autorelease];
             title = UI_STRING("Learn Spelling", "Learn Spelling context menu item");
             action = @selector(_learnSpellingFromMenu:);
             break;
             title = UI_STRING("Learn Spelling", "Learn Spelling context menu item");
             action = @selector(_learnSpellingFromMenu:);
             break;
+#ifndef OMIT_TIGER_FEATURES
+        case WebMenuItemTagSearchInSpotlight:
+            // FIXME: Perhaps move this string into WebKit directly when we're not in localization freeze
+            title = localizedMenuTitleFromAppKit(@"Search in Spotlight", @"Search in Spotlight menu title.");
+            action = @selector(_searchWithSpotlightFromMenu:);
+            break;
+        case WebMenuItemTagSearchInGoogle:
+            // FIXME: Perhaps move this string into WebKit directly when we're not in localization freeze
+            title = localizedMenuTitleFromAppKit(@"Search in Google", @"Search in Google menu title.");
+            action = @selector(_searchWithGoogleFromMenu:);
+            break;
+#endif
         default:
             return nil;
     }
         default:
             return nil;
     }
     
     if (!imageURL && !linkURL) {
         if ([[element objectForKey:WebElementIsSelectedKey] boolValue]) {
     
     if (!imageURL && !linkURL) {
         if ([[element objectForKey:WebElementIsSelectedKey] boolValue]) {
+#ifndef OMIT_TIGER_FEATURES
+            // Add Tiger-only items that act on selected text. Google search needn't be Tiger-only technically,
+            // but it's a new Tiger-only feature to have it in the context menu by default.
+            [menuItems addObject:[self menuItemWithTag:WebMenuItemTagSearchInSpotlight]];
+            [menuItems addObject:[self menuItemWithTag:WebMenuItemTagSearchInGoogle]];
+            [menuItems addObject:[NSMenuItem separatorItem]];
+#endif
             [menuItems addObject:[self menuItemWithTag:WebMenuItemTagCopy]];
         } else {
             WebView *wv = [webFrame webView];
             [menuItems addObject:[self menuItemWithTag:WebMenuItemTagCopy]];
         } else {
             WebView *wv = [webFrame webView];
         [menuItems addObject:[NSMenuItem separatorItem]];
     }
     
         [menuItems addObject:[NSMenuItem separatorItem]];
     }
     
+#ifndef OMIT_TIGER_FEATURES
+    // Add Tiger-only items that aren't in our nib.
+    // FIXME: When we're not building for Panther anymore we should update the nib to include these.
+    [menuItems addObject:[self menuItemWithTag:WebMenuItemTagSearchInSpotlight]];
+    [menuItems addObject:[self menuItemWithTag:WebMenuItemTagSearchInGoogle]];
+    [menuItems addObject:[NSMenuItem separatorItem]];
+#endif
+    
     // Load our NSTextView-like context menu nib.
     if (defaultMenu == nil) {
         static NSNib *textViewMenuNib = nil;
     // Load our NSTextView-like context menu nib.
     if (defaultMenu == nil) {
         static NSNib *textViewMenuNib = nil;
index 5f2a703cfc7418dbf0cccfcb80d730f5f928bf7d..a426a21f8697638149ad99f5f409807b3e985c51 100644 (file)
 // <rdar://problem/3630640>: "Calling interpretKeyEvents: in a custom text view can fail to process keys right after app startup"
 #import <AppKit/NSKeyBindingManager.h>
 
 // <rdar://problem/3630640>: "Calling interpretKeyEvents: in a custom text view can fail to process keys right after app startup"
 #import <AppKit/NSKeyBindingManager.h>
 
+// Included so usage of _NSSoftLinkingGetFrameworkFuncPtr will compile
+#import <mach-o/dyld.h> 
+
+
 // need to declare this because AppKit does not make it available as API or SPI
 extern NSString *NSMarkedClauseSegmentAttributeName; 
 
 // need to declare this because AppKit does not make it available as API or SPI
 extern NSString *NSMarkedClauseSegmentAttributeName; 
 
@@ -135,6 +139,13 @@ void _NSResetKillRingOperationFlag(void);
 
 static BOOL forceRealHitTest = NO;
 
 
 static BOOL forceRealHitTest = NO;
 
+// Used to avoid linking with ApplicationServices framework for _DCMDictionaryServiceWindowShow
+void *_NSSoftLinkingGetFrameworkFuncPtr(NSString *inUmbrellaFrameworkName,
+                                        NSString *inFrameworkName,
+                                        const char *inFuncName,
+                                        const struct mach_header **ioCachedFrameworkImageHeaderPtr);
+
+
 @interface WebHTMLView (WebTextSizing) <_web_WebDocumentTextSizing>
 @end
 
 @interface WebHTMLView (WebTextSizing) <_web_WebDocumentTextSizing>
 @end
 
@@ -1342,6 +1353,32 @@ static WebHTMLView *lastHitView = nil;
     [[NSSpellChecker sharedSpellChecker] learnWord:[self selectedString]];
 }
 
     [[NSSpellChecker sharedSpellChecker] learnWord:[self selectedString]];
 }
 
+#ifndef OMIT_TIGER_FEATURES
+- (void)_searchWithGoogleFromMenu:(id)sender
+{
+    // This should only be called when there's a selection, but play it safe.
+    if (![self _hasSelection]) {
+        return;
+    }
+    
+    NSPasteboard *pboard = [NSPasteboard pasteboardWithUniqueName];
+    if ([self writeSelectionToPasteboard:pboard types:[NSArray arrayWithObject:NSStringPboardType]]) {
+        // FIXME: seems fragile to use the service by name, but this is what AppKit does
+        NSPerformService(@"Search With Google", pboard);
+    }
+}
+
+- (void)_searchWithSpotlightFromMenu:(id)sender
+{
+    // This should only be called when there's a selection, but play it safe.
+    if (![self _hasSelection]) {
+        return;
+    }
+
+    (void)HISearchWindowShow((CFStringRef)[self selectedString], kNilOptions);
+}
+#endif
+
 #if APPKIT_CODE_FOR_REFERENCE
 
 - (void)_openLinkFromMenu:(id)sender
 #if APPKIT_CODE_FOR_REFERENCE
 
 - (void)_openLinkFromMenu:(id)sender
@@ -1658,8 +1695,13 @@ static WebHTMLView *lastHitView = nil;
                || action == @selector(changeSpelling:)
                || action == @selector(ignoreSpelling:)) {
         return [[self _bridge] isSelectionEditable];
                || action == @selector(changeSpelling:)
                || action == @selector(ignoreSpelling:)) {
         return [[self _bridge] isSelectionEditable];
+#ifndef OMIT_TIGER_FEATURES
+    } else if (action == @selector(_searchWithSpotlightFromMenu:)
+               || action == @selector(_searchWithGoogleFromMenu:)) {
+        return [self _hasSelection];
+#endif
     }
     }
-
+    
     return YES;
 }
 
     return YES;
 }
 
@@ -3328,9 +3370,7 @@ static WebHTMLView *lastHitView = nil;
         [style setVerticalAlign:@"sub"];
     else
         [style setVerticalAlign:@"baseline"];
         [style setVerticalAlign:@"sub"];
     else
         [style setVerticalAlign:@"baseline"];
-
     int underlineInt = [[dictionary objectForKey:NSUnderlineStyleAttributeName] intValue];
     int underlineInt = [[dictionary objectForKey:NSUnderlineStyleAttributeName] intValue];
-
     // FIXME: Underline wins here if we have both (see bug 3790443).
     if (strikethroughInt == NSUnderlineStyleNone && underlineInt == NSUnderlineStyleNone)
         [style setTextDecoration:@"none"];
     // FIXME: Underline wins here if we have both (see bug 3790443).
     if (strikethroughInt == NSUnderlineStyleNone && underlineInt == NSUnderlineStyleNone)
         [style setTextDecoration:@"none"];
index 2e16f6d39ec1ae171f56b6d37f33b673fcfb899b..92b6dfd2376cbf61af8ab606fefd6a9fca72231a 100644 (file)
@@ -5,6 +5,12 @@
 
 #import <WebKit/WebUIDelegate.h>
 
 
 #import <WebKit/WebUIDelegate.h>
 
+// FIXME: These should move to WebUIDelegate.h as part of the WebMenuItemTag enum there, when we're not in API freeze
+enum {
+    WebMenuItemTagSearchInSpotlight=1000,
+    WebMenuItemTagSearchInGoogle,
+};
+
 @interface NSObject (WebUIDelegatePrivate)
 
 // webViewPrint: is obsolete; delegates should respond to webView:printFrameView: instead
 @interface NSObject (WebUIDelegatePrivate)
 
 // webViewPrint: is obsolete; delegates should respond to webView:printFrameView: instead