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
35using namespace WebCore;
36
37typedef WTF::HashMap<int, ContextMenuAction> ItemActionMap;
38static ItemActionMap s_itemActions;
39
40ContextMenuItem* ContextMenu::itemWithId(int id)
41{
42    return new ContextMenuItem(ActionType, s_itemActions.get(id), "");
43}
44
45ContextMenu::ContextMenu()
46{
47    m_platformDescription = new wxMenu(0);
48}
49
50ContextMenu::~ContextMenu()
51{
52    if (m_platformDescription)
53        delete m_platformDescription;
54}
55
56void ContextMenu::appendItem(ContextMenuItem& item)
57{
58    if (!m_platformDescription)
59        return;
60
61    PlatformMenuItemDescription itemDescription = item.releasePlatformDescription();
62    wxItemKind menuKindWx = ( itemDescription.type == CheckableActionType ) ? wxITEM_CHECK : wxITEM_NORMAL;
63    wxString titleWx(itemDescription.title);
64    int idWx = wxID_ANY;
65    wxMenuItem * itemWx;
66
67    ItemActionMap::const_iterator end = s_itemActions.end();
68    for (ItemActionMap::const_iterator it = s_itemActions.begin();  it != end; ++it) {
69        if (it->second == itemDescription.action)
70            idWx = it->first;
71    }
72
73    if (itemDescription.subMenu) {
74        itemWx = new wxMenuItem(m_platformDescription, idWx, titleWx, wxEmptyString, wxITEM_NORMAL, itemDescription.subMenu);
75    } else if (itemDescription.type != SeparatorType) {
76        itemWx = new wxMenuItem(m_platformDescription, idWx, titleWx, wxT(""), menuKindWx);
77    } else {
78        itemWx = new wxMenuItem(m_platformDescription);
79    }
80
81    s_itemActions.add(itemWx->GetId(), item.action());
82
83    m_platformDescription->Append(itemWx);
84    m_platformDescription->Enable(itemWx->GetId(), itemDescription.enabled);
85
86    if (menuKindWx == wxITEM_CHECK)
87        m_platformDescription->Check(itemWx->GetId(), itemDescription.checked);
88}
89
90void ContextMenu::setPlatformDescription(PlatformMenuDescription menu)
91{
92    if (!menu)
93        return;
94
95    if (m_platformDescription)
96        delete m_platformDescription;
97
98    m_platformDescription = menu;
99}
100
101PlatformMenuDescription ContextMenu::platformDescription() const
102{
103    return m_platformDescription;
104}
105
106PlatformMenuDescription ContextMenu::releasePlatformDescription()
107{
108    PlatformMenuDescription description = m_platformDescription;
109    m_platformDescription = 0;
110
111    return description;
112}
113