• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2008 Apple Computer, Inc.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25 
26 #include "config.h"
27 
28 #include "ContextMenu.h"
29 #include "ContextMenuItem.h"
30 #include "PlatformMenuDescription.h"
31 #include "wx/menu.h"
32 
33 #include <wtf/HashMap.h>
34 
35 using namespace WebCore;
36 
37 typedef WTF::HashMap<int, ContextMenuAction> ItemActionMap;
38 static ItemActionMap s_itemActions;
39 
itemWithId(int id)40 ContextMenuItem* ContextMenu::itemWithId(int id)
41 {
42     return new ContextMenuItem(ActionType, s_itemActions.get(id), "");
43 }
44 
ContextMenu(const HitTestResult & result)45 ContextMenu::ContextMenu(const HitTestResult& result) : m_hitTestResult(result)
46 {
47     m_platformDescription = new wxMenu(0);
48 }
49 
~ContextMenu()50 ContextMenu::~ContextMenu()
51 {
52     if (m_platformDescription)
53         delete m_platformDescription;
54 }
55 
appendItem(ContextMenuItem & item)56 void ContextMenu::appendItem(ContextMenuItem& item)
57 {
58     if (!m_platformDescription)
59         return;
60 
61     checkOrEnableIfNeeded(item);
62 
63     PlatformMenuItemDescription itemDescription = item.releasePlatformDescription();
64     wxItemKind menuKindWx = ( itemDescription.type == CheckableActionType ) ? wxITEM_CHECK : wxITEM_NORMAL;
65     wxString titleWx(itemDescription.title);
66     int idWx = wxID_ANY;
67     wxMenuItem * itemWx;
68 
69     ItemActionMap::const_iterator end = s_itemActions.end();
70     for (ItemActionMap::const_iterator it = s_itemActions.begin();  it != end; ++it) {
71         if (it->second == itemDescription.action)
72             idWx = it->first;
73     }
74 
75     if (itemDescription.subMenu) {
76         itemWx = new wxMenuItem(m_platformDescription, idWx, titleWx, wxEmptyString, wxITEM_NORMAL, itemDescription.subMenu);
77     } else if (itemDescription.type != SeparatorType) {
78         itemWx = new wxMenuItem(m_platformDescription, idWx, titleWx, wxT(""), menuKindWx);
79     } else {
80         itemWx = new wxMenuItem(m_platformDescription);
81     }
82 
83     s_itemActions.add(itemWx->GetId(), item.action());
84 
85     m_platformDescription->Append(itemWx);
86     m_platformDescription->Enable(itemWx->GetId(), itemDescription.enabled);
87 
88     if (menuKindWx == wxITEM_CHECK)
89         m_platformDescription->Check(itemWx->GetId(), itemDescription.checked);
90 }
91 
setPlatformDescription(PlatformMenuDescription menu)92 void ContextMenu::setPlatformDescription(PlatformMenuDescription menu)
93 {
94     if (!menu)
95         return;
96 
97     if (m_platformDescription)
98         delete m_platformDescription;
99 
100     m_platformDescription = menu;
101 }
102 
platformDescription() const103 PlatformMenuDescription ContextMenu::platformDescription() const
104 {
105     return m_platformDescription;
106 }
107 
releasePlatformDescription()108 PlatformMenuDescription ContextMenu::releasePlatformDescription()
109 {
110     PlatformMenuDescription description = m_platformDescription;
111     m_platformDescription = 0;
112 
113     return description;
114 }
115