2011-06-13 Carlos Garcia Campos <cgarcia@igalia.com>
[WebKit-https.git] / Source / WebCore / platform / gtk / ContextMenuGtk.cpp
1 /*
2  *  Copyright (C) 2007 Holger Hans Peter Freyther
3  * Portions Copyright (c) 2010 Motorola Mobility, Inc.  All rights reserved.
4  *
5  *  This library is free software; you can redistribute it and/or
6  *  modify it under the terms of the GNU Lesser General Public
7  *  License as published by the Free Software Foundation; either
8  *  version 2 of the License, or (at your option) any later version.
9  *
10  *  This library is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  *  Lesser General Public License for more details.
14  *
15  *  You should have received a copy of the GNU Lesser General Public
16  *  License along with this library; if not, write to the Free Software
17  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
18  */
19
20 #include "config.h"
21 #include "ContextMenu.h"
22
23 #include "GOwnPtr.h"
24 #include <gtk/gtk.h>
25
26 namespace WebCore {
27
28 ContextMenu::ContextMenu()
29 {
30     m_platformDescription = GTK_MENU(gtk_menu_new());
31 }
32
33 ContextMenu::ContextMenu(const PlatformMenuDescription menu)
34     : m_platformDescription(menu)
35 {
36 }
37
38 ContextMenu::~ContextMenu()
39 {
40     if (m_platformDescription)
41         gtk_widget_destroy(GTK_WIDGET(m_platformDescription));
42 }
43
44 void ContextMenu::appendItem(ContextMenuItem& item)
45 {
46     ASSERT(m_platformDescription);
47
48     GtkMenuItem* platformItem = item.releasePlatformDescription();
49     ASSERT(platformItem);
50     gtk_menu_shell_append(GTK_MENU_SHELL(m_platformDescription), GTK_WIDGET(platformItem));
51     gtk_widget_show(GTK_WIDGET(platformItem));
52 }
53
54 void ContextMenu::setPlatformDescription(PlatformMenuDescription menu)
55 {
56     ASSERT(menu);
57     if (m_platformDescription == menu)
58         return;
59     if (m_platformDescription)
60         gtk_widget_destroy(GTK_WIDGET(m_platformDescription));
61
62     m_platformDescription = menu;
63 }
64
65 PlatformMenuDescription ContextMenu::platformDescription() const
66 {
67     return m_platformDescription;
68 }
69
70 PlatformMenuDescription ContextMenu::releasePlatformDescription()
71 {
72     PlatformMenuDescription description = m_platformDescription;
73     m_platformDescription = 0;
74
75     return description;
76 }
77
78 Vector<ContextMenuItem> contextMenuItemVector(const PlatformMenuDescription menu)
79 {
80     Vector<ContextMenuItem> menuItemVector;
81
82     GOwnPtr<GList> children(gtk_container_get_children(GTK_CONTAINER(menu)));
83     int itemCount = g_list_length(children.get());
84     menuItemVector.reserveCapacity(itemCount);
85
86     for (GList* item = children.get(); item; item = g_list_next(item)) {
87         GtkWidget* widget = static_cast<GtkWidget*>(item->data);
88         if (!GTK_IS_MENU_ITEM(widget))
89             continue;
90         menuItemVector.append(ContextMenuItem(GTK_MENU_ITEM(widget)));
91     }
92
93     return menuItemVector;
94 }
95
96 PlatformMenuDescription platformMenuDescription(Vector<ContextMenuItem>& subMenuItems)
97 {
98     GtkMenu* menu = GTK_MENU(gtk_menu_new());
99     for (size_t i = 0; i < subMenuItems.size(); i++) {
100         GtkWidget* platformItem = GTK_WIDGET(subMenuItems[i].releasePlatformDescription());
101         gtk_menu_shell_append(GTK_MENU_SHELL(menu), platformItem);
102         gtk_widget_show(platformItem);
103     }
104     return menu;
105 }
106
107 }