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()); }