summaryrefslogtreecommitdiffstats
path: root/WebCore/platform/gtk/ContextMenuItemGtk.cpp
diff options
context:
space:
mode:
authorUpstream <upstream-import@none>1970-01-12 13:46:40 +0000
committerUpstream <upstream-import@none>1970-01-12 13:46:40 +0000
commitd8543bb6618c17b12da906afa77d216f58cf4058 (patch)
treec58dc05ed86825bd0ef8d305d58c8205106b540f /WebCore/platform/gtk/ContextMenuItemGtk.cpp
downloadexternal_webkit-d8543bb6618c17b12da906afa77d216f58cf4058.zip
external_webkit-d8543bb6618c17b12da906afa77d216f58cf4058.tar.gz
external_webkit-d8543bb6618c17b12da906afa77d216f58cf4058.tar.bz2
external/webkit r30707
Diffstat (limited to 'WebCore/platform/gtk/ContextMenuItemGtk.cpp')
-rw-r--r--WebCore/platform/gtk/ContextMenuItemGtk.cpp253
1 files changed, 253 insertions, 0 deletions
diff --git a/WebCore/platform/gtk/ContextMenuItemGtk.cpp b/WebCore/platform/gtk/ContextMenuItemGtk.cpp
new file mode 100644
index 0000000..84f78c0
--- /dev/null
+++ b/WebCore/platform/gtk/ContextMenuItemGtk.cpp
@@ -0,0 +1,253 @@
+/*
+ * Copyright (C) 2007 Holger Hans Peter Freyther
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "config.h"
+#include "ContextMenu.h"
+#include "ContextMenuItem.h"
+#include "CString.h"
+#include "NotImplemented.h"
+
+#include <gtk/gtk.h>
+
+#define WEBKIT_CONTEXT_MENU_ACTION "webkit-context-menu"
+
+namespace WebCore {
+
+static const char* gtkStockIDFromContextMenuAction(const ContextMenuAction& action)
+{
+ switch (action) {
+ case ContextMenuItemTagCopyLinkToClipboard:
+ case ContextMenuItemTagCopyImageToClipboard:
+ case ContextMenuItemTagCopy:
+ return GTK_STOCK_COPY;
+ case ContextMenuItemTagOpenLinkInNewWindow:
+ case ContextMenuItemTagOpenImageInNewWindow:
+ case ContextMenuItemTagOpenFrameInNewWindow:
+ return GTK_STOCK_OPEN;
+ case ContextMenuItemTagDownloadLinkToDisk:
+ case ContextMenuItemTagDownloadImageToDisk:
+ return GTK_STOCK_SAVE;
+ case ContextMenuItemTagGoBack:
+ return GTK_STOCK_GO_BACK;
+ case ContextMenuItemTagGoForward:
+ return GTK_STOCK_GO_FORWARD;
+ case ContextMenuItemTagStop:
+ return GTK_STOCK_STOP;
+ case ContextMenuItemTagReload:
+ return GTK_STOCK_REFRESH;
+ case ContextMenuItemTagCut:
+ return GTK_STOCK_CUT;
+ case ContextMenuItemTagPaste:
+ return GTK_STOCK_PASTE;
+ case ContextMenuItemTagDelete:
+ return GTK_STOCK_DELETE;
+#if GTK_CHECK_VERSION(2, 10, 0)
+ case ContextMenuItemTagSelectAll:
+ return GTK_STOCK_SELECT_ALL;
+#endif
+ case ContextMenuItemTagSpellingGuess:
+ return GTK_STOCK_INFO;
+ case ContextMenuItemTagIgnoreSpelling:
+ return GTK_STOCK_NO;
+ case ContextMenuItemTagLearnSpelling:
+ return GTK_STOCK_OK;
+ case ContextMenuItemTagOther:
+ return GTK_STOCK_MISSING_IMAGE;
+ case ContextMenuItemTagSearchInSpotlight:
+ return GTK_STOCK_FIND;
+ case ContextMenuItemTagSearchWeb:
+ return GTK_STOCK_FIND;
+ case ContextMenuItemTagOpenWithDefaultApplication:
+ return GTK_STOCK_OPEN;
+ case ContextMenuItemPDFZoomIn:
+ return GTK_STOCK_ZOOM_IN;
+ case ContextMenuItemPDFZoomOut:
+ return GTK_STOCK_ZOOM_OUT;
+ case ContextMenuItemPDFAutoSize:
+ return GTK_STOCK_ZOOM_FIT;
+ case ContextMenuItemPDFNextPage:
+ return GTK_STOCK_GO_FORWARD;
+ case ContextMenuItemPDFPreviousPage:
+ return GTK_STOCK_GO_BACK;
+ // New tags, not part of API
+ case ContextMenuItemTagOpenLink:
+ return GTK_STOCK_OPEN;
+ case ContextMenuItemTagCheckSpelling:
+ return GTK_STOCK_SPELL_CHECK;
+ case ContextMenuItemTagFontMenu:
+ return GTK_STOCK_SELECT_FONT;
+ case ContextMenuItemTagShowFonts:
+ return GTK_STOCK_SELECT_FONT;
+ case ContextMenuItemTagBold:
+ return GTK_STOCK_BOLD;
+ case ContextMenuItemTagItalic:
+ return GTK_STOCK_ITALIC;
+ case ContextMenuItemTagUnderline:
+ return GTK_STOCK_UNDERLINE;
+ case ContextMenuItemTagShowColors:
+ return GTK_STOCK_SELECT_COLOR;
+ default:
+ return NULL;
+ }
+}
+
+// Extract the ActionType from the menu item
+ContextMenuItem::ContextMenuItem(GtkMenuItem* item)
+ : m_platformDescription()
+{
+ if (GTK_IS_SEPARATOR_MENU_ITEM(item))
+ m_platformDescription.type = SeparatorType;
+ else if (gtk_menu_item_get_submenu(item))
+ m_platformDescription.type = SubmenuType;
+ else if (GTK_IS_CHECK_MENU_ITEM(item)) {
+ m_platformDescription.type = CheckableActionType;
+ m_platformDescription.checked = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(item));
+ } else
+ m_platformDescription.type = ActionType;
+
+ m_platformDescription.action = *static_cast<ContextMenuAction*>(g_object_get_data(G_OBJECT(item), WEBKIT_CONTEXT_MENU_ACTION));
+
+ m_platformDescription.subMenu = GTK_MENU(gtk_menu_item_get_submenu(item));
+ if (m_platformDescription.subMenu)
+ g_object_ref(m_platformDescription.subMenu);
+}
+
+ContextMenuItem::ContextMenuItem(ContextMenu*)
+{
+ notImplemented();
+}
+
+ContextMenuItem::ContextMenuItem(ContextMenuItemType type, ContextMenuAction action, const String& title, ContextMenu* subMenu)
+{
+ m_platformDescription.type = type;
+ m_platformDescription.action = action;
+ m_platformDescription.title = title;
+
+ setSubMenu(subMenu);
+}
+
+ContextMenuItem::~ContextMenuItem()
+{
+ if (m_platformDescription.subMenu)
+ g_object_unref(m_platformDescription.subMenu);
+}
+
+GtkMenuItem* ContextMenuItem::createNativeMenuItem(const PlatformMenuItemDescription& menu)
+{
+ GtkMenuItem* item = 0;
+ if (menu.type == SeparatorType)
+ item = GTK_MENU_ITEM(gtk_separator_menu_item_new());
+ else {
+ if (menu.type == CheckableActionType) {
+ item = GTK_MENU_ITEM(gtk_check_menu_item_new_with_mnemonic(menu.title.utf8().data()));
+ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), menu.checked);
+ } else {
+ if (const gchar* stockID = gtkStockIDFromContextMenuAction(menu.action)) {
+ item = GTK_MENU_ITEM(gtk_image_menu_item_new_with_mnemonic(menu.title.utf8().data()));
+ GtkWidget* image = gtk_image_new_from_stock(stockID, GTK_ICON_SIZE_MENU);
+ gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), image);
+ } else
+ item = GTK_MENU_ITEM(gtk_menu_item_new_with_mnemonic(menu.title.utf8().data()));
+ }
+
+ ContextMenuAction* menuAction = static_cast<ContextMenuAction*>(malloc(sizeof(ContextMenuAction*)));
+ *menuAction = menu.action;
+ g_object_set_data(G_OBJECT(item), WEBKIT_CONTEXT_MENU_ACTION, menuAction);
+
+ gtk_widget_set_sensitive(GTK_WIDGET(item), menu.enabled);
+
+ if (menu.subMenu)
+ gtk_menu_item_set_submenu(item, GTK_WIDGET(menu.subMenu));
+ }
+
+ return item;
+}
+
+PlatformMenuItemDescription ContextMenuItem::releasePlatformDescription()
+{
+ PlatformMenuItemDescription description = m_platformDescription;
+ m_platformDescription = PlatformMenuItemDescription();
+ return description;
+}
+
+ContextMenuItemType ContextMenuItem::type() const
+{
+ return m_platformDescription.type;
+}
+
+void ContextMenuItem::setType(ContextMenuItemType type)
+{
+ m_platformDescription.type = type;
+}
+
+ContextMenuAction ContextMenuItem::action() const
+{
+ return m_platformDescription.action;
+}
+
+void ContextMenuItem::setAction(ContextMenuAction action)
+{
+ m_platformDescription.action = action;
+}
+
+String ContextMenuItem::title() const
+{
+ notImplemented();
+ return String();
+}
+
+void ContextMenuItem::setTitle(const String&)
+{
+ notImplemented();
+}
+
+PlatformMenuDescription ContextMenuItem::platformSubMenu() const
+{
+ return m_platformDescription.subMenu;
+}
+
+void ContextMenuItem::setSubMenu(ContextMenu* menu)
+{
+ if (m_platformDescription.subMenu)
+ g_object_unref(m_platformDescription.subMenu);
+
+ if (!menu)
+ return;
+
+ m_platformDescription.subMenu = menu->releasePlatformDescription();
+ m_platformDescription.type = SubmenuType;
+
+#if GLIB_CHECK_VERSION(2,10,0)
+ g_object_ref_sink(G_OBJECT(m_platformDescription.subMenu));
+#else
+ g_object_ref(G_OBJECT(m_platformDescription.subMenu));
+ gtk_object_sink(GTK_OBJECT(m_platformDescription.subMenu));
+#endif
+}
+
+void ContextMenuItem::setChecked(bool shouldCheck)
+{
+ m_platformDescription.checked = shouldCheck;
+}
+
+void ContextMenuItem::setEnabled(bool shouldEnable)
+{
+ m_platformDescription.enabled = shouldEnable;
+}
+
+}