Home | History | Annotate | Download | only in haiku
      1 /*
      2  * Copyright (C) 2006 Zack Rusin <zack (at) kde.org>
      3  * Copyright (C) 2007 Ryan Leavengood <leavengood (at) gmail.com>
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions
      7  * are met:
      8  * 1. Redistributions of source code must retain the above copyright
      9  *    notice, this list of conditions and the following disclaimer.
     10  * 2. Redistributions in binary form must reproduce the above copyright
     11  *    notice, this list of conditions and the following disclaimer in the
     12  *    documentation and/or other materials provided with the distribution.
     13  *
     14  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
     15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     17  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
     18  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     19  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     20  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     21  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     22  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     25  */
     26 
     27 #include "config.h"
     28 #include "ContextMenu.h"
     29 
     30 #include "ContextMenuController.h"
     31 #include "ContextMenuItem.h"
     32 #include "Document.h"
     33 #include "Frame.h"
     34 #include "FrameView.h"
     35 #include <Looper.h>
     36 #include <Menu.h>
     37 #include <Message.h>
     38 #include <wtf/Assertions.h>
     39 
     40 
     41 namespace WebCore {
     42 
     43 // FIXME: This class isn't used yet
     44 class ContextMenuReceiver : public BLooper {
     45 public:
     46     ContextMenuReceiver(ContextMenu* menu)
     47         : BLooper("context_menu_receiver")
     48         , m_menu(menu)
     49         , m_result(-1)
     50     {
     51     }
     52 
     53     void HandleMessage(BMessage* msg)
     54     {
     55         m_result = msg->what;
     56         if (m_result != -1) {
     57             BMenuItem* item = m_menu->platformDescription()->FindItem(m_result);
     58             if (!item) {
     59                 printf("Error: Context menu item with code %i not found!\n", m_result);
     60                 return;
     61             }
     62             ContextMenuItem cmItem(item);
     63             m_menu->controller()->contextMenuItemSelected(&cmItem);
     64             cmItem.releasePlatformDescription();
     65         }
     66     }
     67 
     68     int Result()
     69     {
     70         return m_result;
     71     }
     72 
     73 private:
     74     ContextMenu* m_menu;
     75     int m_result;
     76 };
     77 
     78 ContextMenu::ContextMenu()
     79     : m_platformDescription(new BMenu("context_menu"))
     80 {
     81 }
     82 
     83 ContextMenu::~ContextMenu()
     84 {
     85     delete m_platformDescription;
     86 }
     87 
     88 void ContextMenu::appendItem(ContextMenuItem& item)
     89 {
     90     BMenuItem* menuItem = item.releasePlatformDescription();
     91     if (menuItem)
     92         m_platformDescription->AddItem(menuItem);
     93 }
     94 
     95 unsigned ContextMenu::itemCount() const
     96 {
     97     return m_platformDescription->CountItems();
     98 }
     99 
    100 void ContextMenu::insertItem(unsigned position, ContextMenuItem& item)
    101 {
    102     BMenuItem* menuItem = item.releasePlatformDescription();
    103     if (menuItem)
    104         m_platformDescription->AddItem(menuItem, position);
    105 }
    106 
    107 PlatformMenuDescription ContextMenu::platformDescription() const
    108 {
    109     return m_platformDescription;
    110 }
    111 
    112 void ContextMenu::setPlatformDescription(PlatformMenuDescription menu)
    113 {
    114     if (static_cast<BMenu*>(menu) == m_platformDescription)
    115         return;
    116 
    117     delete m_platformDescription;
    118     m_platformDescription = static_cast<BMenu*>(menu);
    119 }
    120 
    121 } // namespace WebCore
    122 
    123