10bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/* 20bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * Copyright (C) 2006 Zack Rusin <zack@kde.org> 30bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * Copyright (C) 2007 Ryan Leavengood <leavengood@gmail.com> 40bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * 50bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * Redistribution and use in source and binary forms, with or without 60bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * modification, are permitted provided that the following conditions 70bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * are met: 80bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * 1. Redistributions of source code must retain the above copyright 90bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * notice, this list of conditions and the following disclaimer. 100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * 2. Redistributions in binary form must reproduce the above copyright 110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * notice, this list of conditions and the following disclaimer in the 120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * documentation and/or other materials provided with the distribution. 130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * 140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch */ 260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "config.h" 280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "ContextMenu.h" 290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 30058ccc7ba0a4d59b9f6e92808332aa9895425fc7Andrei Popescu#include "ContextMenuController.h" 31231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "ContextMenuItem.h" 32231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "Document.h" 330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "Frame.h" 340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "FrameView.h" 350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <Looper.h> 360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <Menu.h> 370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <Message.h> 38231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include <wtf/Assertions.h> 390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochnamespace WebCore { 420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// FIXME: This class isn't used yet 44231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockclass ContextMenuReceiver : public BLooper { 450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochpublic: 460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch ContextMenuReceiver(ContextMenu* menu) 470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch : BLooper("context_menu_receiver") 480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch , m_menu(menu) 49231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block , m_result(-1) 500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch { 510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void HandleMessage(BMessage* msg) 540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch { 550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch m_result = msg->what; 560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (m_result != -1) { 570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch BMenuItem* item = m_menu->platformDescription()->FindItem(m_result); 580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!item) { 590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch printf("Error: Context menu item with code %i not found!\n", m_result); 600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return; 610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch ContextMenuItem cmItem(item); 630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch m_menu->controller()->contextMenuItemSelected(&cmItem); 640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch cmItem.releasePlatformDescription(); 650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch int Result() 690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch { 700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return m_result; 710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochprivate: 740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch ContextMenu* m_menu; 750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch int m_result; 760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}; 770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 78f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochContextMenu::ContextMenu() 79f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch : m_platformDescription(new BMenu("context_menu")) 800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochContextMenu::~ContextMenu() 840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch delete m_platformDescription; 860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid ContextMenu::appendItem(ContextMenuItem& item) 890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 90231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block BMenuItem* menuItem = item.releasePlatformDescription(); 91231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (menuItem) 92231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_platformDescription->AddItem(menuItem); 930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochunsigned ContextMenu::itemCount() const 960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return m_platformDescription->CountItems(); 980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid ContextMenu::insertItem(unsigned position, ContextMenuItem& item) 1010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 102231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block BMenuItem* menuItem = item.releasePlatformDescription(); 103231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (menuItem) 104231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_platformDescription->AddItem(menuItem, position); 1050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 1060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochPlatformMenuDescription ContextMenu::platformDescription() const 1080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 1090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return m_platformDescription; 1100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 1110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid ContextMenu::setPlatformDescription(PlatformMenuDescription menu) 1130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 1140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (static_cast<BMenu*>(menu) == m_platformDescription) 1150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return; 1160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch delete m_platformDescription; 1180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch m_platformDescription = static_cast<BMenu*>(menu); 1190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 1200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} // namespace WebCore 1220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 123