| /* |
| * Copyright (C) 2012 Samsung Electronics. All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * 1. Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * 2. Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in the |
| * documentation and/or other materials provided with the distribution. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, |
| * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR |
| * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
| * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
| * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
| * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY |
| * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
| * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| */ |
| |
| #include "config.h" |
| #include "ewk_context_menu.h" |
| |
| #include "APIObject.h" |
| #include "EwkView.h" |
| #include "WKArray.h" |
| #include "WKContextMenuItem.h" |
| #include "WKString.h" |
| #include "ewk_context_menu_item.h" |
| #include "ewk_context_menu_item_private.h" |
| #include "ewk_context_menu_private.h" |
| |
| using namespace WebKit; |
| |
| static WKContextMenuItemTag getWKTagFromEwkAction(Ewk_Context_Menu_Item_Action action); |
| |
| EwkContextMenu::EwkContextMenu(EwkView* view, WKArrayRef items) |
| : m_viewImpl(view) |
| , m_contextMenuItems(0) |
| { |
| size_t size = WKArrayGetSize(items); |
| for (size_t i = 0; i < size; ++i) |
| m_contextMenuItems = eina_list_append(m_contextMenuItems, Ewk_Context_Menu_Item::create(static_cast<WKContextMenuItemRef>(WKArrayGetItemAtIndex(items, i)), this).leakPtr()); |
| } |
| |
| EwkContextMenu::EwkContextMenu() |
| : m_viewImpl(0) |
| , m_contextMenuItems(0) |
| { |
| } |
| |
| EwkContextMenu::EwkContextMenu(Eina_List* items) |
| : m_viewImpl(0) |
| , m_contextMenuItems(0) |
| { |
| Eina_List* l; |
| void* data; |
| EINA_LIST_FOREACH(items, l, data) { |
| if (EwkContextMenuItem* item = static_cast<EwkContextMenuItem*>(data)) { |
| item->setParentMenu(this); |
| m_contextMenuItems = eina_list_append(m_contextMenuItems, item); |
| } |
| } |
| } |
| |
| EwkContextMenu::~EwkContextMenu() |
| { |
| void* data; |
| EINA_LIST_FREE(m_contextMenuItems, data) |
| delete static_cast<Ewk_Context_Menu_Item*>(data); |
| } |
| |
| void EwkContextMenu::hide() |
| { |
| m_viewImpl->hideContextMenu(); |
| } |
| |
| void Ewk_Context_Menu::appendItem(EwkContextMenuItem* item) |
| { |
| m_contextMenuItems = eina_list_append(m_contextMenuItems, item); |
| } |
| |
| void Ewk_Context_Menu::removeItem(EwkContextMenuItem* item) |
| { |
| m_contextMenuItems = eina_list_remove(m_contextMenuItems, item); |
| } |
| |
| void EwkContextMenu::contextMenuItemSelected(WKContextMenuItemRef item) |
| { |
| WKPageSelectContextMenuItem(m_viewImpl->wkPage(), item); |
| } |
| |
| Ewk_Context_Menu* ewk_context_menu_new() |
| { |
| return EwkContextMenu::create().leakPtr(); |
| } |
| |
| Ewk_Context_Menu* ewk_context_menu_new_with_items(Eina_List* items) |
| { |
| return EwkContextMenu::create(items).leakPtr(); |
| } |
| |
| Eina_Bool ewk_context_menu_item_append(Ewk_Context_Menu* menu, Ewk_Context_Menu_Item* item) |
| { |
| EINA_SAFETY_ON_NULL_RETURN_VAL(menu, false); |
| |
| menu->appendItem(item); |
| |
| return true; |
| } |
| |
| Eina_Bool ewk_context_menu_item_remove(Ewk_Context_Menu* menu, Ewk_Context_Menu_Item* item) |
| { |
| EINA_SAFETY_ON_NULL_RETURN_VAL(menu, false); |
| |
| menu->removeItem(item); |
| |
| return true; |
| } |
| |
| Eina_Bool ewk_context_menu_hide(Ewk_Context_Menu* menu) |
| { |
| EINA_SAFETY_ON_NULL_RETURN_VAL(menu, false); |
| |
| menu->hide(); |
| |
| return true; |
| } |
| |
| const Eina_List* ewk_context_menu_items_get(const Ewk_Context_Menu* menu) |
| { |
| EINA_SAFETY_ON_NULL_RETURN_VAL(menu, 0); |
| |
| return menu->items(); |
| } |
| |
| Eina_Bool ewk_context_menu_item_select(Ewk_Context_Menu* menu, Ewk_Context_Menu_Item* item) |
| { |
| EINA_SAFETY_ON_NULL_RETURN_VAL(menu, false); |
| EINA_SAFETY_ON_NULL_RETURN_VAL(item, false); |
| |
| WKContextMenuItemRef wkItem; |
| |
| switch (item->type()) { |
| case EWK_ACTION_TYPE: |
| wkItem = WKContextMenuItemCreateAsAction(getWKTagFromEwkAction(item->action()), adoptWK(WKStringCreateWithUTF8CString(item->title())).get(), item->enabled()); |
| break; |
| case EWK_CHECKABLE_ACTION_TYPE: |
| wkItem = WKContextMenuItemCreateAsCheckableAction(getWKTagFromEwkAction(item->action()), adoptWK(WKStringCreateWithUTF8CString(item->title())).get(), item->enabled(), item->checked()); |
| break; |
| default: |
| ASSERT_NOT_REACHED(); |
| return false; |
| } |
| |
| menu->contextMenuItemSelected(wkItem); |
| |
| return true; |
| } |
| |
| static WKContextMenuItemTag getWKTagFromEwkAction(Ewk_Context_Menu_Item_Action action) |
| { |
| switch (action) { |
| case EWK_CONTEXT_MENU_ITEM_TAG_NO_ACTION: |
| return kWKContextMenuItemTagNoAction; |
| case EWK_CONTEXT_MENU_ITEM_TAG_OPEN_LINK_IN_NEW_WINDOW: |
| return kWKContextMenuItemTagOpenLinkInNewWindow; |
| case EWK_CONTEXT_MENU_ITEM_TAG_DOWNLOAD_LINK_TO_DISK: |
| return kWKContextMenuItemTagDownloadLinkToDisk; |
| case EWK_CONTEXT_MENU_ITEM_TAG_COPY_LINK_TO_CLIPBOARD: |
| return kWKContextMenuItemTagCopyLinkToClipboard; |
| case EWK_CONTEXT_MENU_ITEM_TAG_OPEN_IMAGE_IN_NEW_WINDOW: |
| return kWKContextMenuItemTagOpenImageInNewWindow; |
| case EWK_CONTEXT_MENU_ITEM_TAG_DOWNLOAD_IMAGE_TO_DISK: |
| return kWKContextMenuItemTagDownloadImageToDisk; |
| case EWK_CONTEXT_MENU_ITEM_TAG_COPY_IMAGE_TO_CLIPBOARD: |
| return kWKContextMenuItemTagCopyImageToClipboard; |
| case EWK_CONTEXT_MENU_ITEM_TAG_COPY_IMAGE_URL_TO_CLIPBOARD: |
| return kWKContextMenuItemTagCopyImageUrlToClipboard; |
| case EWK_CONTEXT_MENU_ITEM_TAG_OPEN_FRAME_IN_NEW_WINDOW: |
| return kWKContextMenuItemTagOpenFrameInNewWindow; |
| case EWK_CONTEXT_MENU_ITEM_TAG_COPY: |
| return kWKContextMenuItemTagCopy; |
| case EWK_CONTEXT_MENU_ITEM_TAG_GO_BACK: |
| return kWKContextMenuItemTagGoBack; |
| case EWK_CONTEXT_MENU_ITEM_TAG_GO_FORWARD: |
| return kWKContextMenuItemTagGoForward; |
| case EWK_CONTEXT_MENU_ITEM_TAG_STOP: |
| return kWKContextMenuItemTagStop; |
| case EWK_CONTEXT_MENU_ITEM_TAG_RELOAD: |
| return kWKContextMenuItemTagReload; |
| case EWK_CONTEXT_MENU_ITEM_TAG_CUT: |
| return kWKContextMenuItemTagCut; |
| case EWK_CONTEXT_MENU_ITEM_TAG_PASTE: |
| return kWKContextMenuItemTagPaste; |
| case EWK_CONTEXT_MENU_ITEM_TAG_SELECT_ALL: |
| return kWKContextMenuItemTagSelectAll; |
| case EWK_CONTEXT_MENU_ITEM_TAG_SPELLING_GUESS: |
| return kWKContextMenuItemTagSpellingGuess; |
| case EWK_CONTEXT_MENU_ITEM_TAG_NO_GUESSES_FOUND: |
| return kWKContextMenuItemTagNoGuessesFound; |
| case EWK_CONTEXT_MENU_ITEM_TAG_IGNORE_SPELLING: |
| return kWKContextMenuItemTagIgnoreSpelling; |
| case EWK_CONTEXT_MENU_ITEM_TAG_LEARN_SPELLING: |
| return kWKContextMenuItemTagLearnSpelling; |
| case EWK_CONTEXT_MENU_ITEM_TAG_OTHER: |
| return kWKContextMenuItemTagOther; |
| case EWK_CONTEXT_MENU_ITEM_TAG_SEARCH_IN_SPOTLIGHT: |
| return kWKContextMenuItemTagSearchInSpotlight; |
| case EWK_CONTEXT_MENU_ITEM_TAG_SEARCH_WEB: |
| return kWKContextMenuItemTagSearchWeb; |
| case EWK_CONTEXT_MENU_ITEM_TAG_LOOK_UP_IN_DICTIONARY: |
| return kWKContextMenuItemTagLookUpInDictionary; |
| case EWK_CONTEXT_MENU_ITEM_TAG_OPEN_WITH_DEFAULT_APPLICATION: |
| return kWKContextMenuItemTagOpenWithDefaultApplication; |
| case EWK_CONTEXT_MENU_ITEM_PDFACTUAL_SIZE: |
| return kWKContextMenuItemTagPDFActualSize; |
| case EWK_CONTEXT_MENU_ITEM_PDFZOOM_IN: |
| return kWKContextMenuItemTagPDFZoomIn; |
| case EWK_CONTEXT_MENU_ITEM_PDFZOOM_OUT: |
| return kWKContextMenuItemTagPDFZoomOut; |
| case EWK_CONTEXT_MENU_ITEM_PDFAUTO_SIZE: |
| return kWKContextMenuItemTagPDFAutoSize; |
| case EWK_CONTEXT_MENU_ITEM_PDFSINGLE_PAGE: |
| return kWKContextMenuItemTagPDFSinglePage; |
| case EWK_CONTEXT_MENU_ITEM_PDFFACING_PAGES: |
| return kWKContextMenuItemTagPDFFacingPages; |
| case EWK_CONTEXT_MENU_ITEM_PDFCONTINUOUS: |
| return kWKContextMenuItemTagPDFContinuous; |
| case EWK_CONTEXT_MENU_ITEM_PDFNEXT_PAGE: |
| return kWKContextMenuItemTagPDFNextPage; |
| case EWK_CONTEXT_MENU_ITEM_PDFPREVIOUS_PAGE: |
| return kWKContextMenuItemTagPDFPreviousPage; |
| case EWK_CONTEXT_MENU_ITEM_TAG_OPEN_LINK: |
| return kWKContextMenuItemTagOpenLink; |
| case EWK_CONTEXT_MENU_ITEM_TAG_IGNORE_GRAMMAR: |
| return kWKContextMenuItemTagIgnoreGrammar; |
| case EWK_CONTEXT_MENU_ITEM_TAG_SPELLING_MENU: |
| return kWKContextMenuItemTagSpellingMenu; |
| case EWK_CONTEXT_MENU_ITEM_TAG_SHOW_SPELLING_PANEL: |
| return kWKContextMenuItemTagShowSpellingPanel; |
| case EWK_CONTEXT_MENU_ITEM_TAG_CHECK_SPELLING: |
| return kWKContextMenuItemTagCheckSpelling; |
| case EWK_CONTEXT_MENU_ITEM_TAG_CHECK_SPELLING_WHILE_TYPING: |
| return kWKContextMenuItemTagCheckSpellingWhileTyping; |
| case EWK_CONTEXT_MENU_ITEM_TAG_CHECK_GRAMMAR_WITH_SPELLING: |
| return kWKContextMenuItemTagCheckGrammarWithSpelling; |
| case EWK_CONTEXT_MENU_ITEM_TAG_FONT_MENU: |
| return kWKContextMenuItemTagFontMenu; |
| case EWK_CONTEXT_MENU_ITEM_TAG_SHOW_FONTS: |
| return kWKContextMenuItemTagShowFonts; |
| case EWK_CONTEXT_MENU_ITEM_TAG_BOLD: |
| return kWKContextMenuItemTagBold; |
| case EWK_CONTEXT_MENU_ITEM_TAG_ITALIC: |
| return kWKContextMenuItemTagItalic; |
| case EWK_CONTEXT_MENU_ITEM_TAG_UNDERLINE: |
| return kWKContextMenuItemTagUnderline; |
| case EWK_CONTEXT_MENU_ITEM_TAG_OUTLINE: |
| return kWKContextMenuItemTagOutline; |
| case EWK_CONTEXT_MENU_ITEM_TAG_STYLES: |
| return kWKContextMenuItemTagStyles; |
| case EWK_CONTEXT_MENU_ITEM_TAG_SHOW_COLORS: |
| return kWKContextMenuItemTagShowColors; |
| case EWK_CONTEXT_MENU_ITEM_TAG_SPEECH_MENU: |
| return kWKContextMenuItemTagSpeechMenu; |
| case EWK_CONTEXT_MENU_ITEM_TAG_START_SPEAKING: |
| return kWKContextMenuItemTagStartSpeaking; |
| case EWK_CONTEXT_MENU_ITEM_TAG_STOP_SPEAKING: |
| return kWKContextMenuItemTagStopSpeaking; |
| case EWK_CONTEXT_MENU_ITEM_TAG_WRITING_DIRECTION_MENU: |
| return kWKContextMenuItemTagWritingDirectionMenu; |
| case EWK_CONTEXT_MENU_ITEM_TAG_DEFAULT_DIRECTION: |
| return kWKContextMenuItemTagDefaultDirection; |
| case EWK_CONTEXT_MENU_ITEM_TAG_LEFT_TO_RIGHT: |
| return kWKContextMenuItemTagLeftToRight; |
| case EWK_CONTEXT_MENU_ITEM_TAG_RIGHT_TO_LEFT: |
| return kWKContextMenuItemTagRightToLeft; |
| case EWK_CONTEXT_MENU_ITEM_TAG_PDFSINGLE_PAGE_SCROLLING: |
| return kWKContextMenuItemTagPDFSinglePageScrolling; |
| case EWK_CONTEXT_MENU_ITEM_TAG_PDFFACING_PAGES_SCROLLING: |
| return kWKContextMenuItemTagPDFFacingPagesScrolling; |
| case EWK_CONTEXT_MENU_ITEM_TAG_INSPECT_ELEMENT: |
| return kWKContextMenuItemTagInspectElement; |
| case EWK_CONTEXT_MENU_ITEM_TAG_TEXT_DIRECTION_MENU: |
| return kWKContextMenuItemTagTextDirectionMenu; |
| case EWK_CONTEXT_MENU_ITEM_TAG_TEXT_DIRECTION_DEFAULT: |
| return kWKContextMenuItemTagTextDirectionDefault; |
| case EWK_CONTEXT_MENU_ITEM_TAG_TEXT_DIRECTION_LEFT_TO_RIGHT: |
| return kWKContextMenuItemTagTextDirectionLeftToRight; |
| case EWK_CONTEXT_MENU_ITEM_TAG_TEXT_DIRECTION_RIGHT_TO_LEFT: |
| return kWKContextMenuItemTagTextDirectionRightToLeft; |
| case EWK_CONTEXT_MENU_ITEM_OPEN_MEDIA_IN_NEW_WINDOW: |
| return kWKContextMenuItemTagOpenMediaInNewWindow; |
| case EWK_CONTEXT_MENU_ITEM_TAG_COPY_MEDIA_LINK_TO_CLIPBOARD: |
| return kWKContextMenuItemTagCopyMediaLinkToClipboard; |
| case EWK_CONTEXT_MENU_ITEM_TAG_TOGGLE_MEDIA_CONTROLS: |
| return kWKContextMenuItemTagToggleMediaControls; |
| case EWK_CONTEXT_MENU_ITEM_TAG_TOGGLE_MEDIA_LOOP: |
| return kWKContextMenuItemTagToggleMediaLoop; |
| case EWK_CONTEXT_MENU_ITEM_TAG_ENTER_VIDEO_FULLSCREEN: |
| return kWKContextMenuItemTagEnterVideoFullscreen; |
| case EWK_CONTEXT_MENU_ITEM_TAG_MEDIA_PLAY_PAUSE: |
| return kWKContextMenuItemTagMediaPlayPause; |
| case EWK_CONTEXT_MENU_ITEM_TAG_MEDIA_MUTE: |
| return kWKContextMenuItemTagMediaMute; |
| case EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG: |
| return kWKContextMenuItemBaseApplicationTag; |
| default: |
| return static_cast<WKContextMenuItemTag>(action); |
| } |
| } |