<rdar://problem/5395928> Need to be able to handle context menu item selectio...
authoradachan <adachan@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 7 Sep 2007 22:39:56 +0000 (22:39 +0000)
committeradachan <adachan@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 7 Sep 2007 22:39:56 +0000 (22:39 +0000)
        Reviewed by Beth.

WebCore:
        * platform/ContextMenu.h: Added method to retrieve context menu item by index
        * platform/win/ContextMenuWin.cpp:
        (WebCore::ContextMenu::ContextMenu): call setPlatformDescription() since that will handle
        adding the MNS_NOTIFYBYPOS style to the context menu.
        (WebCore::contextMenuItemByIdOrPosition): helper method so we don't have to duplicate code
        between itemWithAction() and itemAtIndex().
        (WebCore::ContextMenu::itemWithAction):
        (WebCore::ContextMenu::itemAtIndex):
        (WebCore::ContextMenu::setPlatformDescription): add MNS_NOTIFYBYPOS style to the context menu
        so we will get notified by menu position through WM_MENUCOMMAND when the item is selected.

WebKit/win:
        * WebView.cpp:
        (WebView::performContextMenuAction): performContextMenuAction() can now handle context menu
        item selection via WM_MENUCOMMAND (by specifying byPosition to be true).  In that case, we
        get the ContextMenuItem by position rather than by action id.
        (WebViewWndProc): handle WM_MENUCOMMAND
        * WebView.h:

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

WebCore/ChangeLog
WebCore/platform/ContextMenu.h
WebCore/platform/win/ContextMenuWin.cpp
WebKit/win/ChangeLog
WebKit/win/WebView.cpp
WebKit/win/WebView.h

index 46631849d17afe8115b44393ecfce6ca2a41a7ce..cf62014ccd4ec675ff8c685ba20a0f16cb147406 100644 (file)
@@ -1,3 +1,20 @@
+2007-09-07  Ada Chan  <adachan@apple.com>
+
+        <rdar://problem/5395928> Need to be able to handle context menu item selection by index
+        
+        Reviewed by Beth.
+
+        * platform/ContextMenu.h: Added method to retrieve context menu item by index
+        * platform/win/ContextMenuWin.cpp:
+        (WebCore::ContextMenu::ContextMenu): call setPlatformDescription() since that will handle
+        adding the MNS_NOTIFYBYPOS style to the context menu.
+        (WebCore::contextMenuItemByIdOrPosition): helper method so we don't have to duplicate code
+        between itemWithAction() and itemAtIndex().
+        (WebCore::ContextMenu::itemWithAction):
+        (WebCore::ContextMenu::itemAtIndex):
+        (WebCore::ContextMenu::setPlatformDescription): add MNS_NOTIFYBYPOS style to the context menu
+        so we will get notified by menu position through WM_MENUCOMMAND when the item is selected.
+
 2007-09-07  Justin Garcia  <justin.garcia@apple.com>
 
         Reviewed by Darin.
index e6b0e70c5f6b4fdb5226b75c104d3d6e1d1e53c1..f39c5f9c1d6a5b4deef693e5b048bf010eed2bff 100644 (file)
@@ -58,6 +58,7 @@ class MenuEventProxy;
         void appendItem(ContextMenuItem&);
         
         ContextMenuItem* itemWithAction(unsigned);
+        ContextMenuItem* itemAtIndex(unsigned, const PlatformMenuDescription);
 
         unsigned itemCount() const;
 
index 83606b9eb1af49471be9ddbb2945438e9face6ed..26b081a6934399c96b8e71da228f24a5e0beb743 100644 (file)
@@ -38,14 +38,16 @@ namespace WebCore {
 
 ContextMenu::ContextMenu(const HitTestResult& result)
     : m_hitTestResult(result)
-    , m_platformDescription(::CreatePopupMenu())
+    , m_platformDescription(0)
 {
+    setPlatformDescription(::CreatePopupMenu());
 }
 
 ContextMenu::ContextMenu(const HitTestResult& result, const PlatformMenuDescription menu)
     : m_hitTestResult(result)
-    , m_platformDescription(menu)
+    , m_platformDescription(0)
 {
+    setPlatformDescription(menu);
 }
 
 ContextMenu::~ContextMenu()
@@ -76,8 +78,10 @@ void ContextMenu::appendItem(ContextMenuItem& item)
     insertItem(itemCount(), item);
 }
 
-ContextMenuItem* ContextMenu::itemWithAction(unsigned action)
+static ContextMenuItem* contextMenuItemByIdOrPosition(HMENU menu, unsigned id, BOOL byPosition)
 {
+    if (!menu)
+        return 0;
     LPMENUITEMINFO info = (LPMENUITEMINFO)malloc(sizeof(MENUITEMINFO));
     if (!info)
         return 0;
@@ -88,7 +92,7 @@ ContextMenuItem* ContextMenu::itemWithAction(unsigned action)
     
     info->fMask = MIIM_FTYPE | MIIM_ID | MIIM_STRING;
 
-    if (!::GetMenuItemInfo(m_platformDescription, action, FALSE, info)) {
+    if (!::GetMenuItemInfo(menu, id, byPosition, info)) {
         free(info);
         return 0;
     }
@@ -101,12 +105,22 @@ ContextMenuItem* ContextMenu::itemWithAction(unsigned action)
             return 0;
         }
         info->dwTypeData = buffer;
-        ::GetMenuItemInfo(m_platformDescription, action, FALSE, info);
+        ::GetMenuItemInfo(menu, id, byPosition, info);
     }
     
     return new ContextMenuItem(info);
 }
 
+ContextMenuItem* ContextMenu::itemWithAction(unsigned action)
+{
+    return contextMenuItemByIdOrPosition(m_platformDescription, action, FALSE);
+}
+
+ContextMenuItem* ContextMenu::itemAtIndex(unsigned index, const PlatformMenuDescription platformDescription)
+{
+    return contextMenuItemByIdOrPosition(platformDescription, index, TRUE);
+}
+
 void ContextMenu::setPlatformDescription(HMENU menu)
 {
     if (menu == m_platformDescription)
@@ -116,6 +130,16 @@ void ContextMenu::setPlatformDescription(HMENU menu)
         ::DestroyMenu(m_platformDescription);
 
     m_platformDescription = menu;
+    if (!m_platformDescription)
+        return;
+
+    MENUINFO menuInfo = {0};
+    menuInfo.cbSize = sizeof(MENUINFO);
+    menuInfo.fMask = MIM_STYLE;
+    ::GetMenuInfo(m_platformDescription, &menuInfo);
+    menuInfo.fMask = MIM_STYLE;
+    menuInfo.dwStyle |= MNS_NOTIFYBYPOS;
+    ::SetMenuInfo(m_platformDescription, &menuInfo);
 }
 
 HMENU ContextMenu::platformDescription() const
index 63e3955b4bd4ad1e4522a532818408560f7f5074..75b92eaf317232aa071d799010be3ccd16090a42 100644 (file)
@@ -1,3 +1,16 @@
+2007-09-07  Ada Chan  <adachan@apple.com>
+
+        <rdar://problem/5395928> Need to be able to handle context menu item selection by index
+
+        Reviewed by Beth.
+
+        * WebView.cpp:
+        (WebView::performContextMenuAction): performContextMenuAction() can now handle context menu
+        item selection via WM_MENUCOMMAND (by specifying byPosition to be true).  In that case, we
+        get the ContextMenuItem by position rather than by action id.
+        (WebViewWndProc): handle WM_MENUCOMMAND
+        * WebView.h:
+
 2007-09-07  Ada Chan  <adachan@apple.com>
 
         <rdar://problem/5453494> Better lifetime management of WebDataSource and WebDocumentLoader
index 7bcfb13985d144a82752b0dd4ee79bc229b70a11..4a9f22c43859445cc3179458ffacad4f4e2829fd 100644 (file)
@@ -758,12 +758,14 @@ bool WebView::onUninitMenuPopup(WPARAM wParam, LPARAM /*lParam*/)
     return true;
 }
 
-void WebView::performContextMenuAction(WPARAM wParam, LPARAM /*lParam*/)
+void WebView::performContextMenuAction(WPARAM wParam, LPARAM lParam, bool byPosition)
 {
     ContextMenu* menu = m_page->contextMenuController()->contextMenu();
     ASSERT(menu);
 
-    ContextMenuItem* item = menu->itemWithAction((ContextMenuAction)wParam);
+    ContextMenuItem* item = byPosition ? menu->itemAtIndex((unsigned)wParam, (HMENU)lParam) : menu->itemWithAction((ContextMenuAction)wParam);
+    if (!item)
+        return;
     m_page->contextMenuController()->contextMenuItemSelected(item);
     delete item;
 }
@@ -1311,7 +1313,10 @@ static LRESULT CALLBACK WebViewWndProc(HWND hWnd, UINT message, WPARAM wParam, L
             if (HIWORD(wParam))
                 handled = webView->execCommand(wParam, lParam);
             else // If the high word of wParam is 0, the message is from a menu
-                webView->performContextMenuAction(wParam, lParam);
+                webView->performContextMenuAction(wParam, lParam, false);
+            break;
+        case WM_MENUCOMMAND:
+            webView->performContextMenuAction(wParam, lParam, true);
             break;
         case WM_CONTEXTMENU:
             handled = webView->handleContextMenuEvent(wParam, lParam);
index 9a2938e8f7d76cd4a5e5229074b386ee5da680af..3c8ab9ea4beba9cf17aabb9db257e8fe98172bfa 100644 (file)
@@ -619,7 +619,7 @@ public:
     bool onDrawItem(WPARAM, LPARAM);
     bool onInitMenuPopup(WPARAM, LPARAM);
     bool onUninitMenuPopup(WPARAM, LPARAM);
-    void performContextMenuAction(WPARAM, LPARAM);
+    void performContextMenuAction(WPARAM, LPARAM, bool byPosition);
     bool mouseWheel(WPARAM, LPARAM, bool isHorizontal);
     bool execCommand(WPARAM wParam, LPARAM lParam);
     bool keyDown(WPARAM, LPARAM, bool systemKeyDown = false);