Reviewed by Chris.
authorsullivan <sullivan@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 25 Jan 2005 22:41:36 +0000 (22:41 +0000)
committersullivan <sullivan@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 25 Jan 2005 22:41:36 +0000 (22:41 +0000)
        - WebKit part of fix for: <rdar://problem/3970670> Text context menu
          in WebKit needs "Look Up in Dictionary" item

        * WebView.subproj/WebDefaultContextMenuDelegate.m:
        (localizedMenuTitleFromAppKit):
        return English string in the case where AppKit bundle is found but doesn't
        contain the expected string. This case will be hit by people testing with
        an older AppKit.
        (-[WebDefaultUIDelegate menuItemWithTag:]):
        create Look Up in Dictionary item
        (-[WebDefaultUIDelegate contextMenuItemsForElement:]):
        add Look Up in Dictionary item and separator
        (-[WebDefaultUIDelegate editingContextMenuItemsForElement:]):
        ditto

        * WebView.subproj/WebHTMLView.m:
        (-[WebHTMLView _lookUpInDictionaryFromMenu:]):
        new method, handles bringing up the Dictionary window. Includes FIXMEs
        for a couple of the known loose ends.
        (-[WebHTMLView validateUserInterfaceItem:]):
        handle Look Up in Dictionary item like the other new items

        * WebView.subproj/WebUIDelegatePrivate.h:
        added SPI constant for Look Up in Dictionary menu item

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

WebKit/ChangeLog
WebKit/WebView.subproj/WebDefaultContextMenuDelegate.m
WebKit/WebView.subproj/WebHTMLView.m
WebKit/WebView.subproj/WebUIDelegatePrivate.h

index ab39069f89fb8ad36cf7f8b543924f19ac655bbe..ec7598b3c5d23ac123fb823fba19d68d8c00c539 100644 (file)
@@ -1,3 +1,32 @@
+2005-01-25  John Sullivan  <sullivan@apple.com>
+
+        Reviewed by Chris.
+        
+        - WebKit part of fix for: <rdar://problem/3970670> Text context menu 
+          in WebKit needs "Look Up in Dictionary" item
+
+        * WebView.subproj/WebDefaultContextMenuDelegate.m:
+        (localizedMenuTitleFromAppKit):
+        return English string in the case where AppKit bundle is found but doesn't
+        contain the expected string. This case will be hit by people testing with
+        an older AppKit.
+        (-[WebDefaultUIDelegate menuItemWithTag:]):
+        create Look Up in Dictionary item
+        (-[WebDefaultUIDelegate contextMenuItemsForElement:]):
+        add Look Up in Dictionary item and separator
+        (-[WebDefaultUIDelegate editingContextMenuItemsForElement:]):
+        ditto
+
+        * WebView.subproj/WebHTMLView.m:
+        (-[WebHTMLView _lookUpInDictionaryFromMenu:]):
+        new method, handles bringing up the Dictionary window. Includes FIXMEs
+        for a couple of the known loose ends.
+        (-[WebHTMLView validateUserInterfaceItem:]):
+        handle Look Up in Dictionary item like the other new items
+        
+        * WebView.subproj/WebUIDelegatePrivate.h:
+        added SPI constant for Look Up in Dictionary menu item
+
 2005-01-24  Maciej Stachowiak  <mjs@apple.com>
 
         Fixed Panther build (missing ifdef)
index 80d7e02f1c233667ad2b33ba2b92e6210b73b1e7..753329b2e1fea7223b34bcde159480d44f66d6fc 100644 (file)
@@ -36,7 +36,11 @@ static NSString *localizedMenuTitleFromAppKit(NSString *key, NSString *comment)
     if (!appKitBundle) {
         return key;
     }
-    return NSLocalizedStringFromTableInBundle(key, @"MenuCommands", appKitBundle, comment);
+    NSString *result = NSLocalizedStringFromTableInBundle(key, @"MenuCommands", appKitBundle, comment);
+    if (result == nil) {
+        return key;
+    }
+    return result;
 }
 #endif
 
@@ -137,6 +141,11 @@ static NSString *localizedMenuTitleFromAppKit(NSString *key, NSString *comment)
             title = localizedMenuTitleFromAppKit(@"Search in Google", @"Search in Google menu title.");
             action = @selector(_searchWithGoogleFromMenu:);
             break;
+        case WebMenuItemTagLookUpInDictionary:
+            // FIXME: Perhaps move this string into WebKit directly when we're not in localization freeze
+            title = localizedMenuTitleFromAppKit(@"Look Up in Dictionary", @"Look Up in Dictionary menu title.");
+            action = @selector(_lookUpInDictionaryFromMenu:);
+            break;
 #endif
         default:
             return nil;
@@ -186,6 +195,8 @@ static NSString *localizedMenuTitleFromAppKit(NSString *key, NSString *comment)
             [menuItems addObject:[self menuItemWithTag:WebMenuItemTagSearchInSpotlight]];
             [menuItems addObject:[self menuItemWithTag:WebMenuItemTagSearchInGoogle]];
             [menuItems addObject:[NSMenuItem separatorItem]];
+            [menuItems addObject:[self menuItemWithTag:WebMenuItemTagLookUpInDictionary]];
+            [menuItems addObject:[NSMenuItem separatorItem]];
 #endif
             [menuItems addObject:[self menuItemWithTag:WebMenuItemTagCopy]];
         } else {
@@ -248,6 +259,12 @@ static NSString *localizedMenuTitleFromAppKit(NSString *key, NSString *comment)
     [menuItems addObject:[self menuItemWithTag:WebMenuItemTagSearchInSpotlight]];
     [menuItems addObject:[self menuItemWithTag:WebMenuItemTagSearchInGoogle]];
     [menuItems addObject:[NSMenuItem separatorItem]];
+    // FIXME: The NSTextView behavior for looking text up in the dictionary is different if
+    // there was a selection before you clicked than if the selection was created as part of
+    // the click. This is desired by the dictionary folks apparently, though it seems bizarre.
+    // It might be tricky to pull this off in WebKit.
+    [menuItems addObject:[self menuItemWithTag:WebMenuItemTagLookUpInDictionary]];
+    [menuItems addObject:[NSMenuItem separatorItem]];
 #endif
     
     // Load our NSTextView-like context menu nib.
index a426a21f8697638149ad99f5f409807b3e985c51..7f9d943629020baa24b435dd56f2da7dac707af0 100644 (file)
@@ -1377,6 +1377,38 @@ static WebHTMLView *lastHitView = nil;
 
     (void)HISearchWindowShow((CFStringRef)[self selectedString], kNilOptions);
 }
+- (void)_lookUpInDictionaryFromMenu:(id)sender
+{
+    // This should only be called when there's a selection, but play it safe.
+    if (![self _hasSelection]) {
+        return;
+    }
+    
+    // Soft link to dictionary-display function to avoid linking another framework (ApplicationServices/LangAnalysis)
+    static OSStatus (*__dictionaryServiceWindowShow)(id inWordString, NSRect inWordBoundary, UInt16 inLineDirection) = NULL;
+    static const struct mach_header *frameworkImageHeader = NULL;
+    static BOOL lookedForFunction = NO;
+    if (!lookedForFunction) {
+        __dictionaryServiceWindowShow = _NSSoftLinkingGetFrameworkFuncPtr(@"ApplicationServices", @"LangAnalysis", "_DCMDictionaryServiceWindowShow", &frameworkImageHeader);
+        lookedForFunction = YES;
+    }
+    if (!__dictionaryServiceWindowShow) {
+        ERROR("Couldn't find _DCMDictionaryServiceWindowShow"); 
+        return;
+    }
+    
+    // FIXME: must check for right-to-left here
+    NSWritingDirection writingDirection = NSWritingDirectionLeftToRight;
+    
+    NSAttributedString *attrString = [self selectedAttributedString];
+    // FIXME: the dictionary API expects the rect for the first line of selection. Passing
+    // the rect for the entire selection, as we do here, positions the pop-up window near
+    // the bottom of the selection rather than at the selected word.
+    NSRect rect = [self convertRect:[[self _bridge] visibleSelectionRect] toView:nil];
+    rect.origin = [[self window] convertBaseToScreen:rect.origin];
+    NSData *data = [attrString RTFFromRange:NSMakeRange(0, [attrString length]) documentAttributes:nil];
+    (void)__dictionaryServiceWindowShow(data, rect, (writingDirection == NSWritingDirectionRightToLeft) ? 1 : 0);
+}
 #endif
 
 #if APPKIT_CODE_FOR_REFERENCE
@@ -1697,7 +1729,8 @@ static WebHTMLView *lastHitView = nil;
         return [[self _bridge] isSelectionEditable];
 #ifndef OMIT_TIGER_FEATURES
     } else if (action == @selector(_searchWithSpotlightFromMenu:)
-               || action == @selector(_searchWithGoogleFromMenu:)) {
+               || action == @selector(_searchWithGoogleFromMenu:)
+               || action == @selector(_lookUpInDictionaryFromMenu:)) {
         return [self _hasSelection];
 #endif
     }
index 92b6dfd2376cbf61af8ab606fefd6a9fca72231a..05b8d2bc28f9d3634f609c7f2d7e8f0e80ff8477 100644 (file)
@@ -9,6 +9,7 @@
 enum {
     WebMenuItemTagSearchInSpotlight=1000,
     WebMenuItemTagSearchInGoogle,
+    WebMenuItemTagLookUpInDictionary,
 };
 
 @interface NSObject (WebUIDelegatePrivate)