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