[haiku-webkit-commits] r293 - webkit/trunk/WebCore/platform/haiku

  • From: webkit@xxxxxxxxxxxxxxx
  • To: haiku-webkit-commits@xxxxxxxxxxxxx
  • Date: Fri, 05 Mar 2010 21:40:55 +0000

Author: stippi
Date: Fri Mar  5 21:40:55 2010
New Revision: 293
URL: http://mmlr.dyndns.org/changeset/293

Log:
ContextMenuHaiku:
 * Set the target messenger recursively when appending items, whis makes sure
   items from submenus get invoked properly.
 * Use a much more robust way to create the temporary ContextMenuItem when
   receiving the invokation message, the platformDescription of the ContextMenu
   may be gone and not even contain the item (sub menus).

ContextMenuItemHaiku:
 * When asked to create sub menu type menu items, but without passing the
   submenu, still create the BMenu instance.
 * Handle CheckableActionType at all.
 * Fixed ContextMenuItem::title()'s NULL check.

... Fixes remaining issues with editing context menus. All that is left now is
disabling menu items for features that don't exist, like spell checker GUI...

Modified:
   webkit/trunk/WebCore/platform/haiku/ContextMenuHaiku.cpp
   webkit/trunk/WebCore/platform/haiku/ContextMenuItemHaiku.cpp

Modified: webkit/trunk/WebCore/platform/haiku/ContextMenuHaiku.cpp
==============================================================================
--- webkit/trunk/WebCore/platform/haiku/ContextMenuHaiku.cpp    Fri Mar  5 
20:36:33 2010        (r292)
+++ webkit/trunk/WebCore/platform/haiku/ContextMenuHaiku.cpp    Fri Mar  5 
21:40:55 2010        (r293)
@@ -39,7 +39,6 @@
 #include <Message.h>
 #include <Messenger.h>
 #include <wtf/Assertions.h>
-#include <stdio.h>
 
 namespace WebCore {
 
@@ -53,16 +52,13 @@
 
     virtual void MessageReceived(BMessage* message)
     {
-        int result = message->what;
-        if (result != -1) {
-            BMenuItem* item = m_menu->platformDescription()->FindItem(result);
-            if (!item) {
-                printf("Error: Context menu item with code %i not found!\n", 
result);
-                return;
-            }
-            ContextMenuItem cmItem(item);
-            m_menu->controller()->contextMenuItemSelected(&cmItem);
-            cmItem.releasePlatformDescription();
+        if (message->what != ContextMenuItemTagNoAction) {
+               // Create a temporary ContextMenuItem with a clone of the
+               // message. The BMenuItem instance from which this message
+               // originates may long be attached to another menu, and doing
+               // it this way makes us completely independent of that.
+            ContextMenuItem item(new BMenuItem("", new BMessage(*message)));
+            m_menu->controller()->contextMenuItemSelected(&item);
         }
     }
 
@@ -101,6 +97,16 @@
     return m_platformDescription->CountItems();
 }
 
+static void setTargetForItemsRecursive(BMenu* menu, const BMessenger& target)
+{
+    if (!menu)
+        return;
+    for (int32 i = 0; BMenuItem* item = menu->ItemAt(i); i++) {
+        item->SetTarget(target);
+        setTargetForItemsRecursive(item->Submenu(), target);
+    }
+}
+
 void ContextMenu::insertItem(unsigned position, ContextMenuItem& item)
 {
     checkOrEnableIfNeeded(item);
@@ -108,7 +114,9 @@
     BMenuItem* menuItem = item.releasePlatformDescription();
     if (menuItem) {
         m_platformDescription->AddItem(menuItem, position);
-        menuItem->SetTarget(BMessenger(m_menuHandler));
+        BMessenger target(m_menuHandler);
+        menuItem->SetTarget(target);
+        setTargetForItemsRecursive(menuItem->Submenu(), target);
     }
 }
 

Modified: webkit/trunk/WebCore/platform/haiku/ContextMenuItemHaiku.cpp
==============================================================================
--- webkit/trunk/WebCore/platform/haiku/ContextMenuItemHaiku.cpp        Fri Mar 
 5 20:36:33 2010        (r292)
+++ webkit/trunk/WebCore/platform/haiku/ContextMenuItemHaiku.cpp        Fri Mar 
 5 21:40:55 2010        (r293)
@@ -28,14 +28,11 @@
 #include "ContextMenuItem.h"
 
 #include "ContextMenu.h"
-#include "NotImplemented.h"
-
 #include <Menu.h>
 #include <MenuItem.h>
 #include <Message.h>
 #include <String.h>
 
-
 using namespace WebCore;
 
 ContextMenuItem::ContextMenuItem(PlatformMenuItemDescription item)
@@ -55,16 +52,19 @@
 ContextMenuItem::ContextMenuItem(ContextMenuItemType type, ContextMenuAction 
action,
                                  const String& title, ContextMenu* subMenu)
 {
-    if (type == ActionType)
+    if (type == ActionType || type == CheckableActionType)
         m_platformDescription = new BMenuItem(BString(title).String(), new 
BMessage(action));
     else if (type == SeparatorType)
         m_platformDescription = new BSeparatorItem();
-    else if (subMenu) {
-        m_platformDescription = new 
BMenuItem(subMenu->releasePlatformDescription(),
-            new BMessage(action));
+    else {
+       BMenu* menu;
+       if (subMenu)
+           menu = subMenu->releasePlatformDescription();
+       else
+           menu = new BMenu("");
+        m_platformDescription = new BMenuItem(menu, new BMessage(action));
         m_platformDescription->SetLabel(BString(title).String());
-    } else
-        m_platformDescription = 0;
+    }
 }
 
 ContextMenuItem::~ContextMenuItem()
@@ -95,7 +95,7 @@
     BMenu* subMenu = platformSubMenu();
     delete m_platformDescription;
 
-    if (type == ActionType)
+    if (type == ActionType || type == CheckableActionType)
         m_platformDescription = new BMenuItem(BString(theTitle).String(), new 
BMessage(theAction));
     else if (type == SeparatorType)
         m_platformDescription = new BSeparatorItem();
@@ -123,7 +123,7 @@
 
 String ContextMenuItem::title() const
 {
-    if (m_platformDescription)
+    if (!m_platformDescription)
         return "";
     return BString(m_platformDescription->Label());
 }

Other related posts:

  • » [haiku-webkit-commits] r293 - webkit/trunk/WebCore/platform/haiku - webkit