| /* |
| * Copyright (C) 2017 Igalia S.L. |
| * |
| * This library is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU Library 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 |
| * Library General Public License for more details. |
| * |
| * You should have received a copy of the GNU Library General Public License |
| * along with this library; see the file COPYING.LIB. If not, write to |
| * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
| * Boston, MA 02110-1301, USA. |
| */ |
| |
| #include "config.h" |
| #include "WebKitOptionMenu.h" |
| |
| #include "WebKitOptionMenuItemPrivate.h" |
| #include "WebKitOptionMenuPrivate.h" |
| #include <wtf/glib/WTFGType.h> |
| |
| using namespace WebKit; |
| |
| /** |
| * SECTION: WebKitOptionMenu |
| * @Short_description: |
| * @Title: WebKitOptionMenu |
| * |
| * WebKitOptionMenu represents the dropdown menu of a select element in a #WebKitWebView. |
| * |
| * When a select element in a #WebKitWebView needs to display a dropdown menu, the signal |
| * #WebKitWebView::show-option-menu is emitted, providing a WebKitOptionMenu with the |
| * #WebKitOptionMenuItem<!-- -->s that should be displayed. |
| * |
| * Since: 2.18 |
| */ |
| |
| struct _WebKitOptionMenuPrivate { |
| Vector<WebKitOptionMenuItem> items; |
| RefPtr<WebKitPopupMenu> popupMenu; |
| }; |
| |
| enum { |
| CLOSE, |
| |
| LAST_SIGNAL |
| }; |
| |
| static guint signals[LAST_SIGNAL] = { 0, }; |
| |
| WEBKIT_DEFINE_TYPE(WebKitOptionMenu, webkit_option_menu, G_TYPE_OBJECT) |
| |
| static void webkit_option_menu_class_init(WebKitOptionMenuClass* optionMenuClass) |
| { |
| /** |
| * WebKitOptionMenu::close: |
| * @menu: the #WebKitOptionMenu on which the signal is emitted |
| * |
| * Emitted when closing a #WebKitOptionMenu is requested. This can happen |
| * when the user explicitly calls webkit_option_menu_close() or when the |
| * element is detached from the current page. |
| * |
| * Since: 2.18 |
| */ |
| signals[CLOSE] = |
| g_signal_new("close", |
| G_TYPE_FROM_CLASS(optionMenuClass), |
| G_SIGNAL_RUN_LAST, |
| 0, nullptr, nullptr, |
| g_cclosure_marshal_VOID__VOID, |
| G_TYPE_NONE, 0); |
| } |
| |
| WebKitOptionMenu* webkitOptionMenuCreate(WebKitPopupMenu& popupMenu, const Vector<WebPopupItem>& items, int32_t selectedIndex) |
| { |
| auto* menu = WEBKIT_OPTION_MENU(g_object_new(WEBKIT_TYPE_OPTION_MENU, nullptr)); |
| menu->priv->popupMenu = &popupMenu; |
| menu->priv->items.reserveInitialCapacity(items.size()); |
| for (const auto& item : items) |
| menu->priv->items.uncheckedAppend(WebKitOptionMenuItem(item)); |
| if (selectedIndex >= 0) { |
| ASSERT(static_cast<unsigned>(selectedIndex) < menu->priv->items.size()); |
| menu->priv->items[selectedIndex].isSelected = true; |
| } |
| return menu; |
| } |
| |
| /** |
| * webkit_option_menu_get_n_items: |
| * @menu: a #WebKitOptionMenu |
| * |
| * Gets the length of the @menu. |
| * |
| * Returns: the number of #WebKitOptionMenuItem<!-- -->s in @menu |
| * |
| * Since: 2.18 |
| */ |
| guint webkit_option_menu_get_n_items(WebKitOptionMenu* menu) |
| { |
| g_return_val_if_fail(WEBKIT_IS_OPTION_MENU(menu), 0); |
| |
| return menu->priv->items.size(); |
| } |
| |
| /** |
| * webkit_option_menu_get_item: |
| * @menu: a #WebKitOptionMenu |
| * @index: the index of the item |
| * |
| * Returns the #WebKitOptionMenuItem at @index in @menu. |
| * |
| * Returns: (transfer none): a #WebKitOptionMenuItem of @menu. |
| * |
| * Since: 2.18 |
| */ |
| WebKitOptionMenuItem* webkit_option_menu_get_item(WebKitOptionMenu* menu, guint index) |
| { |
| g_return_val_if_fail(WEBKIT_IS_OPTION_MENU(menu), nullptr); |
| g_return_val_if_fail(index < menu->priv->items.size(), nullptr); |
| |
| return &menu->priv->items[index]; |
| } |
| |
| /** |
| * webkit_option_menu_select_item: |
| * @menu: a #WebKitOptionMenu |
| * @index: the index of the item |
| * |
| * Selects the #WebKitOptionMenuItem at @index in @menu. Selecting an item changes the |
| * text shown by the combo button, but it doesn't change the value of the element. You need to |
| * explicitly activate the item with webkit_option_menu_select_item() or close the menu with |
| * webkit_option_menu_close() in which case the currently selected item will be activated. |
| * |
| * Since: 2.18 |
| */ |
| void webkit_option_menu_select_item(WebKitOptionMenu* menu, guint index) |
| { |
| g_return_if_fail(WEBKIT_IS_OPTION_MENU(menu)); |
| g_return_if_fail(index < menu->priv->items.size()); |
| |
| menu->priv->popupMenu->selectItem(index); |
| } |
| |
| /** |
| * webkit_option_menu_activate_item: |
| * @menu: a #WebKitOptionMenu |
| * @index: the index of the item |
| * |
| * Activates the #WebKitOptionMenuItem at @index in @menu. Activating an item changes the value |
| * of the element making the item the active one. You are expected to close the menu with |
| * webkit_option_menu_close() after activating an item, calling this function again will have no |
| * effect. |
| * |
| * Since: 2.18 |
| */ |
| void webkit_option_menu_activate_item(WebKitOptionMenu* menu, guint index) |
| { |
| g_return_if_fail(WEBKIT_IS_OPTION_MENU(menu)); |
| g_return_if_fail(index < menu->priv->items.size()); |
| |
| menu->priv->popupMenu->activateItem(index); |
| } |
| |
| /** |
| * webkit_option_menu_close: |
| * @menu: a #WebKitOptionMenu |
| * |
| * Request to close a #WebKitOptionMenu. This emits WebKitOptionMenu::close signal. |
| * This function should always be called to notify WebKit that the associated |
| * menu has been closed. If the menu is closed and neither webkit_option_menu_select_item() |
| * nor webkit_option_menu_activate_item() have been called, the element value remains |
| * unchanged. |
| * |
| * Since: 2.18 |
| */ |
| void webkit_option_menu_close(WebKitOptionMenu* menu) |
| { |
| g_return_if_fail(WEBKIT_IS_OPTION_MENU(menu)); |
| |
| g_signal_emit(menu, signals[CLOSE], 0, nullptr); |
| } |