diff options
Diffstat (limited to 'Source/WebKit/gtk/WebCoreSupport/ContextMenuClientGtk.cpp')
-rw-r--r-- | Source/WebKit/gtk/WebCoreSupport/ContextMenuClientGtk.cpp | 207 |
1 files changed, 207 insertions, 0 deletions
diff --git a/Source/WebKit/gtk/WebCoreSupport/ContextMenuClientGtk.cpp b/Source/WebKit/gtk/WebCoreSupport/ContextMenuClientGtk.cpp new file mode 100644 index 0000000..d9c59d0 --- /dev/null +++ b/Source/WebKit/gtk/WebCoreSupport/ContextMenuClientGtk.cpp @@ -0,0 +1,207 @@ +/* + * Copyright (C) 2008 Nuanti Ltd. + * Copyright (C) 2009 Gustavo Noronha Silva <gns@gnome.org> + * + * 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 "ContextMenuClientGtk.h" + +#include "ContextMenu.h" +#include "ContextMenuController.h" +#include "HitTestResult.h" +#include "KURL.h" +#include "NotImplemented.h" +#include "Page.h" +#include "webkitwebviewprivate.h" +#include <glib-object.h> +#include <glib/gi18n-lib.h> +#include <gtk/gtk.h> +#include <wtf/text/CString.h> + +using namespace WebCore; + +namespace WebKit { + +ContextMenuClient::ContextMenuClient(WebKitWebView *webView) + : m_webView(webView) +{ +} + +void ContextMenuClient::contextMenuDestroyed() +{ + delete this; +} + +static GtkWidget* inputMethodsMenuItem (WebKitWebView* webView) +{ + if (gtk_major_version > 2 || (gtk_major_version == 2 && gtk_minor_version >= 10)) { + GtkSettings* settings = webView ? gtk_widget_get_settings(GTK_WIDGET(webView)) : gtk_settings_get_default(); + + gboolean showMenu = TRUE; + if (settings) + g_object_get(settings, "gtk-show-input-method-menu", &showMenu, NULL); + if (!showMenu) + return 0; + } + + GtkWidget* menuitem = gtk_image_menu_item_new_with_mnemonic( + _("Input _Methods")); + + WebKitWebViewPrivate* priv = webView->priv; + GtkWidget* imContextMenu = gtk_menu_new(); + gtk_im_multicontext_append_menuitems(GTK_IM_MULTICONTEXT(priv->imContext.get()), GTK_MENU_SHELL(imContextMenu)); + + gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), imContextMenu); + + return menuitem; +} + +// Values taken from gtktextutil.c +typedef struct { + const char *label; + gunichar ch; +} GtkUnicodeMenuEntry; +static const GtkUnicodeMenuEntry bidi_menu_entries[] = { + { N_("LRM _Left-to-right mark"), 0x200E }, + { N_("RLM _Right-to-left mark"), 0x200F }, + { N_("LRE Left-to-right _embedding"), 0x202A }, + { N_("RLE Right-to-left e_mbedding"), 0x202B }, + { N_("LRO Left-to-right _override"), 0x202D }, + { N_("RLO Right-to-left o_verride"), 0x202E }, + { N_("PDF _Pop directional formatting"), 0x202C }, + { N_("ZWS _Zero width space"), 0x200B }, + { N_("ZWJ Zero width _joiner"), 0x200D }, + { N_("ZWNJ Zero width _non-joiner"), 0x200C } +}; + +static void insertControlCharacter(GtkWidget* widget) +{ + // GtkUnicodeMenuEntry* entry = (GtkUnicodeMenuEntry*)g_object_get_data(G_OBJECT(widget), "gtk-unicode-menu-entry"); + notImplemented(); +} + +static GtkWidget* unicodeMenuItem(WebKitWebView* webView) +{ + if (gtk_major_version > 2 || (gtk_major_version == 2 && gtk_minor_version >= 10)) { + GtkSettings* settings = webView ? gtk_widget_get_settings(GTK_WIDGET(webView)) : gtk_settings_get_default(); + + gboolean showMenu = TRUE; + if (settings) + g_object_get(settings, "gtk-show-unicode-menu", &showMenu, NULL); + if (!showMenu) + return 0; + } + + GtkWidget* menuitem = gtk_image_menu_item_new_with_mnemonic( + _("_Insert Unicode Control Character")); + + GtkWidget* unicodeContextMenu = gtk_menu_new(); + unsigned i; + for (i = 0; i < G_N_ELEMENTS(bidi_menu_entries); i++) { + GtkWidget* menuitem = gtk_menu_item_new_with_mnemonic(_(bidi_menu_entries[i].label)); + g_object_set_data(G_OBJECT(menuitem), "gtk-unicode-menu-entry", (gpointer)&bidi_menu_entries[i]); + g_signal_connect(menuitem, "activate", G_CALLBACK(insertControlCharacter), 0); + gtk_widget_show(menuitem); + gtk_menu_shell_append(GTK_MENU_SHELL(unicodeContextMenu), menuitem); + // FIXME: Make the item sensitive as insertControlCharacter() is implemented + gtk_widget_set_sensitive(menuitem, FALSE); + } + + gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), unicodeContextMenu); + + return menuitem; +} + +PlatformMenuDescription ContextMenuClient::getCustomMenuFromDefaultItems(ContextMenu* menu) +{ + GtkMenu* gtkmenu = menu->releasePlatformDescription(); + + WebKitWebView* webView = m_webView; + HitTestResult result = core(webView)->contextMenuController()->hitTestResult(); + + if (result.isContentEditable()) { + + GtkWidget* imContextMenu = inputMethodsMenuItem(webView); + GtkWidget* unicodeContextMenu = unicodeMenuItem(webView); + + if (imContextMenu || unicodeContextMenu) { + GtkWidget* separator = gtk_separator_menu_item_new(); + gtk_menu_shell_append(GTK_MENU_SHELL(gtkmenu), separator); + gtk_widget_show(separator); + } + + if (imContextMenu) { + gtk_menu_shell_append(GTK_MENU_SHELL(gtkmenu), imContextMenu); + gtk_widget_show(imContextMenu); + } + + if (unicodeContextMenu) { + gtk_menu_shell_append(GTK_MENU_SHELL(gtkmenu), unicodeContextMenu); + gtk_widget_show(unicodeContextMenu); + } + + } + + return gtkmenu; +} + +void ContextMenuClient::contextMenuItemSelected(ContextMenuItem*, const ContextMenu*) +{ + notImplemented(); +} + +void ContextMenuClient::downloadURL(const KURL& url) +{ + WebKitNetworkRequest* networkRequest = webkit_network_request_new(url.string().utf8().data()); + + webkit_web_view_request_download(m_webView, networkRequest); + g_object_unref(networkRequest); +} + +void ContextMenuClient::copyImageToClipboard(const HitTestResult&) +{ + notImplemented(); +} + +void ContextMenuClient::searchWithGoogle(const Frame*) +{ + notImplemented(); +} + +void ContextMenuClient::lookUpInDictionary(Frame*) +{ + notImplemented(); +} + +void ContextMenuClient::speak(const String&) +{ + notImplemented(); +} + +void ContextMenuClient::stopSpeaking() +{ + notImplemented(); +} + +bool ContextMenuClient::isSpeaking() +{ + notImplemented(); + return false; +} + +} + |