WebKitContextMenu.cpp [plain text]
#include "config.h"
#include "WebKitContextMenu.h"
#include "APIArray.h"
#include "WebContextMenuItem.h"
#include "WebKitContextMenuItemPrivate.h"
#include "WebKitContextMenuPrivate.h"
#include <wtf/glib/GRefPtr.h>
using namespace WebKit;
using namespace WebCore;
struct _WebKitContextMenuPrivate {
GList* items;
WebKitContextMenuItem* parentItem;
GRefPtr<GVariant> userData;
};
WEBKIT_DEFINE_TYPE(WebKitContextMenu, webkit_context_menu, G_TYPE_OBJECT)
static void webkitContextMenuDispose(GObject* object)
{
webkit_context_menu_remove_all(WEBKIT_CONTEXT_MENU(object));
G_OBJECT_CLASS(webkit_context_menu_parent_class)->dispose(object);
}
static void webkit_context_menu_class_init(WebKitContextMenuClass* listClass)
{
GObjectClass* gObjectClass = G_OBJECT_CLASS(listClass);
gObjectClass->dispose = webkitContextMenuDispose;
}
void webkitContextMenuPopulate(WebKitContextMenu* menu, Vector<ContextMenuItem>& contextMenuItems)
{
for (GList* item = menu->priv->items; item; item = g_list_next(item)) {
WebKitContextMenuItem* menuItem = WEBKIT_CONTEXT_MENU_ITEM(item->data);
contextMenuItems.append(ContextMenuItem(webkitContextMenuItemRelease(menuItem)));
}
}
void webkitContextMenuPopulate(WebKitContextMenu* menu, Vector<WebContextMenuItemData>& contextMenuItems)
{
for (GList* item = menu->priv->items; item; item = g_list_next(item)) {
WebKitContextMenuItem* menuItem = WEBKIT_CONTEXT_MENU_ITEM(item->data);
contextMenuItems.append(WebContextMenuItemData(ContextMenuItem(webkitContextMenuItemRelease(menuItem))));
}
}
WebKitContextMenu* webkitContextMenuCreate(const Vector<WebContextMenuItemData>& items)
{
WebKitContextMenu* menu = webkit_context_menu_new();
for (const auto& item : items)
webkit_context_menu_prepend(menu, webkitContextMenuItemCreate(item));
menu->priv->items = g_list_reverse(menu->priv->items);
return menu;
}
WebKitContextMenu* webkitContextMenuCreate(const Vector<ContextMenuItem>& items)
{
WebKitContextMenu* menu = webkit_context_menu_new();
for (const auto& item : items)
webkit_context_menu_prepend(menu, webkitContextMenuItemCreate(item));
menu->priv->items = g_list_reverse(menu->priv->items);
return menu;
}
void webkitContextMenuSetParentItem(WebKitContextMenu* menu, WebKitContextMenuItem* item)
{
menu->priv->parentItem = item;
}
WebKitContextMenuItem* webkitContextMenuGetParentItem(WebKitContextMenu* menu)
{
return menu->priv->parentItem;
}
WebKitContextMenu* webkit_context_menu_new()
{
return WEBKIT_CONTEXT_MENU(g_object_new(WEBKIT_TYPE_CONTEXT_MENU, NULL));
}
WebKitContextMenu* webkit_context_menu_new_with_items(GList* items)
{
WebKitContextMenu* menu = webkit_context_menu_new();
g_list_foreach(items, reinterpret_cast<GFunc>(g_object_ref_sink), 0);
menu->priv->items = g_list_copy(items);
return menu;
}
void webkit_context_menu_prepend(WebKitContextMenu* menu, WebKitContextMenuItem* item)
{
webkit_context_menu_insert(menu, item, 0);
}
void webkit_context_menu_append(WebKitContextMenu* menu, WebKitContextMenuItem* item)
{
webkit_context_menu_insert(menu, item, -1);
}
void webkit_context_menu_insert(WebKitContextMenu* menu, WebKitContextMenuItem* item, int position)
{
g_return_if_fail(WEBKIT_IS_CONTEXT_MENU(menu));
g_return_if_fail(WEBKIT_IS_CONTEXT_MENU_ITEM(item));
g_object_ref_sink(item);
menu->priv->items = g_list_insert(menu->priv->items, item, position);
}
void webkit_context_menu_move_item(WebKitContextMenu* menu, WebKitContextMenuItem* item, int position)
{
g_return_if_fail(WEBKIT_IS_CONTEXT_MENU(menu));
g_return_if_fail(WEBKIT_IS_CONTEXT_MENU_ITEM(item));
if (!g_list_find(menu->priv->items, item))
return;
menu->priv->items = g_list_remove(menu->priv->items, item);
menu->priv->items = g_list_insert(menu->priv->items, item, position);
}
GList* webkit_context_menu_get_items(WebKitContextMenu* menu)
{
g_return_val_if_fail(WEBKIT_IS_CONTEXT_MENU(menu), 0);
return menu->priv->items;
}
guint webkit_context_menu_get_n_items(WebKitContextMenu* menu)
{
g_return_val_if_fail(WEBKIT_IS_CONTEXT_MENU(menu), 0);
return g_list_length(menu->priv->items);
}
WebKitContextMenuItem* webkit_context_menu_first(WebKitContextMenu* menu)
{
g_return_val_if_fail(WEBKIT_IS_CONTEXT_MENU(menu), 0);
return menu->priv->items ? WEBKIT_CONTEXT_MENU_ITEM(menu->priv->items->data) : 0;
}
WebKitContextMenuItem* webkit_context_menu_last(WebKitContextMenu* menu)
{
g_return_val_if_fail(WEBKIT_IS_CONTEXT_MENU(menu), 0);
GList* last = g_list_last(menu->priv->items);
return last ? WEBKIT_CONTEXT_MENU_ITEM(last->data) : 0;
}
WebKitContextMenuItem* webkit_context_menu_get_item_at_position(WebKitContextMenu* menu, unsigned position)
{
g_return_val_if_fail(WEBKIT_IS_CONTEXT_MENU(menu), 0);
gpointer item = g_list_nth_data(menu->priv->items, position);
return item ? WEBKIT_CONTEXT_MENU_ITEM(item) : 0;
}
void webkit_context_menu_remove(WebKitContextMenu* menu, WebKitContextMenuItem* item)
{
g_return_if_fail(WEBKIT_IS_CONTEXT_MENU(menu));
g_return_if_fail(WEBKIT_IS_CONTEXT_MENU_ITEM(item));
if (!g_list_find(menu->priv->items, item))
return;
menu->priv->items = g_list_remove(menu->priv->items, item);
g_object_unref(item);
}
void webkit_context_menu_remove_all(WebKitContextMenu* menu)
{
g_return_if_fail(WEBKIT_IS_CONTEXT_MENU(menu));
g_list_free_full(menu->priv->items, reinterpret_cast<GDestroyNotify>(g_object_unref));
menu->priv->items = 0;
}
void webkit_context_menu_set_user_data(WebKitContextMenu* menu, GVariant* userData)
{
g_return_if_fail(WEBKIT_IS_CONTEXT_MENU(menu));
g_return_if_fail(userData);
menu->priv->userData = userData;
}
GVariant* webkit_context_menu_get_user_data(WebKitContextMenu* menu)
{
g_return_val_if_fail(WEBKIT_IS_CONTEXT_MENU(menu), nullptr);
return menu->priv->userData.get();
}