1/* 2 * Copyright (C) 2012 Samsung Electronics. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 14 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 22 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 23 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#include "config.h" 27#include "ewk_context_menu_item.h" 28 29#include "ewk_context_menu_item_private.h" 30#include "ewk_context_menu_private.h" 31#include "ewk_private.h" 32#include <WebKit/WKContextMenuItemTypes.h> 33#include <wtf/text/CString.h> 34 35using namespace WebKit; 36 37static Ewk_Context_Menu_Item_Action getEwkActionFromWKTag(WKContextMenuItemTag action); 38 39EwkContextMenuItem::EwkContextMenuItem(WKContextMenuItemRef item, EwkContextMenu* parentMenu) 40 : m_type(static_cast<Ewk_Context_Menu_Item_Type>(WKContextMenuItemGetType(item))) 41 , m_action(getEwkActionFromWKTag((WKContextMenuItemGetTag(item)))) 42 , m_title(WKEinaSharedString(AdoptWK, WKContextMenuItemCopyTitle(item))) 43 , m_isChecked(WKContextMenuItemGetChecked(item)) 44 , m_isEnabled(WKContextMenuItemGetEnabled(item)) 45 , m_parentMenu(parentMenu) 46{ 47 if (WKContextMenuItemGetType(item) == kWKContextMenuItemTypeSubmenu) { 48 WKRetainPtr<WKArrayRef> menuItems = adoptWK(WKContextMenuCopySubmenuItems(item)); 49 m_subMenu = EwkContextMenu::create(m_parentMenu->ewkView(), menuItems.get()); 50 } 51} 52 53EwkContextMenuItem::EwkContextMenuItem(Ewk_Context_Menu_Item_Type type, Ewk_Context_Menu_Item_Action action, const char* title, Eina_Bool checked, Eina_Bool enabled, PassRefPtr<EwkContextMenu> subMenu, EwkContextMenu* parentMenu) 54 : m_type(type) 55 , m_action(action) 56 , m_title(title) 57 , m_isChecked(checked) 58 , m_isEnabled(enabled) 59 , m_parentMenu(parentMenu) 60 , m_subMenu(subMenu) 61{ 62} 63 64Ewk_Context_Menu_Item* ewk_context_menu_item_new(Ewk_Context_Menu_Item_Type type, Ewk_Context_Menu_Item_Action action, const char* title, Eina_Bool checked, Eina_Bool enabled) 65{ 66 return std::make_unique<Ewk_Context_Menu_Item>(type, action, title, checked, enabled).release(); 67} 68 69Ewk_Context_Menu_Item* ewk_context_menu_item_new_with_submenu(Ewk_Context_Menu_Item_Action action, const char* title, Eina_Bool enabled, Ewk_Context_Menu* subMenu) 70{ 71 EWK_OBJ_GET_IMPL_OR_RETURN(EwkContextMenu, subMenu, subMenuImpl, nullptr); 72 73 return std::make_unique<Ewk_Context_Menu_Item>(EWK_SUBMENU_TYPE, action, title, false, enabled, subMenuImpl).release(); 74} 75 76Ewk_Context_Menu_Item_Type ewk_context_menu_item_type_get(const Ewk_Context_Menu_Item* item) 77{ 78 EINA_SAFETY_ON_NULL_RETURN_VAL(item, EWK_ACTION_TYPE); 79 80 return item->type(); 81} 82 83Eina_Bool ewk_context_menu_item_type_set(Ewk_Context_Menu_Item* item, Ewk_Context_Menu_Item_Type type) 84{ 85 EINA_SAFETY_ON_NULL_RETURN_VAL(item, false); 86 87 item->setType(type); 88 89 return true; 90} 91 92Ewk_Context_Menu_Item_Action ewk_context_menu_item_action_get(const Ewk_Context_Menu_Item* item) 93{ 94 EINA_SAFETY_ON_NULL_RETURN_VAL(item, EWK_CONTEXT_MENU_ITEM_TAG_NO_ACTION); 95 96 return item->action(); 97} 98 99Eina_Bool ewk_context_menu_item_action_set(Ewk_Context_Menu_Item* item, Ewk_Context_Menu_Item_Action action) 100{ 101 EINA_SAFETY_ON_NULL_RETURN_VAL(item, false); 102 103 item->setAction(action); 104 105 return true; 106} 107 108const char* ewk_context_menu_item_title_get(const Ewk_Context_Menu_Item* item) 109{ 110 EINA_SAFETY_ON_NULL_RETURN_VAL(item, nullptr); 111 112 return item->title(); 113} 114 115Eina_Bool ewk_context_menu_item_title_set(Ewk_Context_Menu_Item* item, const char* title) 116{ 117 EINA_SAFETY_ON_NULL_RETURN_VAL(item, false); 118 119 item->setTitle(title); 120 121 return true; 122} 123 124Eina_Bool ewk_context_menu_item_checked_get(const Ewk_Context_Menu_Item* item) 125{ 126 EINA_SAFETY_ON_NULL_RETURN_VAL(item, false); 127 128 return item->checked(); 129} 130 131Eina_Bool ewk_context_menu_item_checked_set(Ewk_Context_Menu_Item* item, Eina_Bool checked) 132{ 133 EINA_SAFETY_ON_NULL_RETURN_VAL(item, false); 134 135 item->setChecked(checked); 136 137 return true; 138} 139 140Eina_Bool ewk_context_menu_item_enabled_get(const Ewk_Context_Menu_Item* item) 141{ 142 EINA_SAFETY_ON_NULL_RETURN_VAL(item, false); 143 144 return item->enabled(); 145} 146 147Eina_Bool ewk_context_menu_item_enabled_set(Ewk_Context_Menu_Item* item, Eina_Bool enabled) 148{ 149 EINA_SAFETY_ON_NULL_RETURN_VAL(item, false); 150 151 item->setEnabled(enabled); 152 153 return true; 154} 155 156Ewk_Context_Menu* ewk_context_menu_item_parent_menu_get(const Ewk_Context_Menu_Item* item) 157{ 158 EINA_SAFETY_ON_NULL_RETURN_VAL(item, nullptr); 159 160 return item->parentMenu(); 161} 162 163Ewk_Context_Menu* ewk_context_menu_item_submenu_get(const Ewk_Context_Menu_Item* item) 164{ 165 EINA_SAFETY_ON_NULL_RETURN_VAL(item, nullptr); 166 167 return item->subMenu(); 168} 169 170static Ewk_Context_Menu_Item_Action getEwkActionFromWKTag(WKContextMenuItemTag action) 171{ 172 switch (action) { 173 case kWKContextMenuItemTagNoAction: 174 return EWK_CONTEXT_MENU_ITEM_TAG_NO_ACTION; 175 case kWKContextMenuItemTagOpenLinkInNewWindow: 176 return EWK_CONTEXT_MENU_ITEM_TAG_OPEN_LINK_IN_NEW_WINDOW; 177 case kWKContextMenuItemTagDownloadLinkToDisk: 178 return EWK_CONTEXT_MENU_ITEM_TAG_DOWNLOAD_LINK_TO_DISK; 179 case kWKContextMenuItemTagCopyLinkToClipboard: 180 return EWK_CONTEXT_MENU_ITEM_TAG_COPY_LINK_TO_CLIPBOARD; 181 case kWKContextMenuItemTagOpenImageInNewWindow: 182 return EWK_CONTEXT_MENU_ITEM_TAG_OPEN_IMAGE_IN_NEW_WINDOW; 183 case kWKContextMenuItemTagDownloadImageToDisk: 184 return EWK_CONTEXT_MENU_ITEM_TAG_DOWNLOAD_IMAGE_TO_DISK; 185 case kWKContextMenuItemTagCopyImageToClipboard: 186 return EWK_CONTEXT_MENU_ITEM_TAG_COPY_IMAGE_TO_CLIPBOARD; 187 case kWKContextMenuItemTagCopyImageUrlToClipboard: 188 return EWK_CONTEXT_MENU_ITEM_TAG_COPY_IMAGE_URL_TO_CLIPBOARD; 189 case kWKContextMenuItemTagOpenFrameInNewWindow: 190 return EWK_CONTEXT_MENU_ITEM_TAG_OPEN_FRAME_IN_NEW_WINDOW; 191 case kWKContextMenuItemTagCopy: 192 return EWK_CONTEXT_MENU_ITEM_TAG_COPY; 193 case kWKContextMenuItemTagGoBack: 194 return EWK_CONTEXT_MENU_ITEM_TAG_GO_BACK; 195 case kWKContextMenuItemTagGoForward: 196 return EWK_CONTEXT_MENU_ITEM_TAG_GO_FORWARD; 197 case kWKContextMenuItemTagStop: 198 return EWK_CONTEXT_MENU_ITEM_TAG_STOP; 199 case kWKContextMenuItemTagReload: 200 return EWK_CONTEXT_MENU_ITEM_TAG_RELOAD; 201 case kWKContextMenuItemTagCut: 202 return EWK_CONTEXT_MENU_ITEM_TAG_CUT; 203 case kWKContextMenuItemTagPaste: 204 return EWK_CONTEXT_MENU_ITEM_TAG_PASTE; 205 case kWKContextMenuItemTagSelectAll: 206 return EWK_CONTEXT_MENU_ITEM_TAG_SELECT_ALL; 207 case kWKContextMenuItemTagSpellingGuess: 208 return EWK_CONTEXT_MENU_ITEM_TAG_SPELLING_GUESS; 209 case kWKContextMenuItemTagNoGuessesFound: 210 return EWK_CONTEXT_MENU_ITEM_TAG_NO_GUESSES_FOUND; 211 case kWKContextMenuItemTagIgnoreSpelling: 212 return EWK_CONTEXT_MENU_ITEM_TAG_IGNORE_SPELLING; 213 case kWKContextMenuItemTagLearnSpelling: 214 return EWK_CONTEXT_MENU_ITEM_TAG_LEARN_SPELLING; 215 case kWKContextMenuItemTagOther: 216 return EWK_CONTEXT_MENU_ITEM_TAG_OTHER; 217 case kWKContextMenuItemTagSearchInSpotlight: 218 return EWK_CONTEXT_MENU_ITEM_TAG_SEARCH_IN_SPOTLIGHT; 219 case kWKContextMenuItemTagSearchWeb: 220 return EWK_CONTEXT_MENU_ITEM_TAG_SEARCH_WEB; 221 case kWKContextMenuItemTagLookUpInDictionary: 222 return EWK_CONTEXT_MENU_ITEM_TAG_LOOK_UP_IN_DICTIONARY; 223 case kWKContextMenuItemTagOpenWithDefaultApplication: 224 return EWK_CONTEXT_MENU_ITEM_TAG_OPEN_WITH_DEFAULT_APPLICATION; 225 case kWKContextMenuItemTagPDFActualSize: 226 return EWK_CONTEXT_MENU_ITEM_PDFACTUAL_SIZE; 227 case kWKContextMenuItemTagPDFZoomIn: 228 return EWK_CONTEXT_MENU_ITEM_PDFZOOM_IN; 229 case kWKContextMenuItemTagPDFZoomOut: 230 return EWK_CONTEXT_MENU_ITEM_PDFZOOM_OUT; 231 case kWKContextMenuItemTagPDFAutoSize: 232 return EWK_CONTEXT_MENU_ITEM_PDFAUTO_SIZE; 233 case kWKContextMenuItemTagPDFSinglePage: 234 return EWK_CONTEXT_MENU_ITEM_PDFSINGLE_PAGE; 235 case kWKContextMenuItemTagPDFFacingPages: 236 return EWK_CONTEXT_MENU_ITEM_PDFFACING_PAGES; 237 case kWKContextMenuItemTagPDFContinuous: 238 return EWK_CONTEXT_MENU_ITEM_PDFCONTINUOUS; 239 case kWKContextMenuItemTagPDFNextPage: 240 return EWK_CONTEXT_MENU_ITEM_PDFNEXT_PAGE; 241 case kWKContextMenuItemTagPDFPreviousPage: 242 return EWK_CONTEXT_MENU_ITEM_PDFPREVIOUS_PAGE; 243 case kWKContextMenuItemTagOpenLink: 244 return EWK_CONTEXT_MENU_ITEM_TAG_OPEN_LINK; 245 case kWKContextMenuItemTagIgnoreGrammar: 246 return EWK_CONTEXT_MENU_ITEM_TAG_IGNORE_GRAMMAR; 247 case kWKContextMenuItemTagSpellingMenu: 248 return EWK_CONTEXT_MENU_ITEM_TAG_SPELLING_MENU; 249 case kWKContextMenuItemTagShowSpellingPanel: 250 return EWK_CONTEXT_MENU_ITEM_TAG_SHOW_SPELLING_PANEL; 251 case kWKContextMenuItemTagCheckSpelling: 252 return EWK_CONTEXT_MENU_ITEM_TAG_CHECK_SPELLING; 253 case kWKContextMenuItemTagCheckSpellingWhileTyping: 254 return EWK_CONTEXT_MENU_ITEM_TAG_CHECK_SPELLING_WHILE_TYPING; 255 case kWKContextMenuItemTagCheckGrammarWithSpelling: 256 return EWK_CONTEXT_MENU_ITEM_TAG_CHECK_GRAMMAR_WITH_SPELLING; 257 case kWKContextMenuItemTagFontMenu: 258 return EWK_CONTEXT_MENU_ITEM_TAG_FONT_MENU; 259 case kWKContextMenuItemTagShowFonts: 260 return EWK_CONTEXT_MENU_ITEM_TAG_SHOW_FONTS; 261 case kWKContextMenuItemTagBold: 262 return EWK_CONTEXT_MENU_ITEM_TAG_BOLD; 263 case kWKContextMenuItemTagItalic: 264 return EWK_CONTEXT_MENU_ITEM_TAG_ITALIC; 265 case kWKContextMenuItemTagUnderline: 266 return EWK_CONTEXT_MENU_ITEM_TAG_UNDERLINE; 267 case kWKContextMenuItemTagOutline: 268 return EWK_CONTEXT_MENU_ITEM_TAG_OUTLINE; 269 case kWKContextMenuItemTagStyles: 270 return EWK_CONTEXT_MENU_ITEM_TAG_STYLES; 271 case kWKContextMenuItemTagShowColors: 272 return EWK_CONTEXT_MENU_ITEM_TAG_SHOW_COLORS; 273 case kWKContextMenuItemTagSpeechMenu: 274 return EWK_CONTEXT_MENU_ITEM_TAG_SPEECH_MENU; 275 case kWKContextMenuItemTagStartSpeaking: 276 return EWK_CONTEXT_MENU_ITEM_TAG_START_SPEAKING; 277 case kWKContextMenuItemTagStopSpeaking: 278 return EWK_CONTEXT_MENU_ITEM_TAG_STOP_SPEAKING; 279 case kWKContextMenuItemTagWritingDirectionMenu: 280 return EWK_CONTEXT_MENU_ITEM_TAG_WRITING_DIRECTION_MENU; 281 case kWKContextMenuItemTagDefaultDirection: 282 return EWK_CONTEXT_MENU_ITEM_TAG_DEFAULT_DIRECTION; 283 case kWKContextMenuItemTagLeftToRight: 284 return EWK_CONTEXT_MENU_ITEM_TAG_LEFT_TO_RIGHT; 285 case kWKContextMenuItemTagRightToLeft: 286 return EWK_CONTEXT_MENU_ITEM_TAG_RIGHT_TO_LEFT; 287 case kWKContextMenuItemTagPDFSinglePageScrolling: 288 return EWK_CONTEXT_MENU_ITEM_TAG_PDFSINGLE_PAGE_SCROLLING; 289 case kWKContextMenuItemTagPDFFacingPagesScrolling: 290 return EWK_CONTEXT_MENU_ITEM_TAG_PDFFACING_PAGES_SCROLLING; 291 case kWKContextMenuItemTagInspectElement: 292 return EWK_CONTEXT_MENU_ITEM_TAG_INSPECT_ELEMENT; 293 case kWKContextMenuItemTagTextDirectionMenu: 294 return EWK_CONTEXT_MENU_ITEM_TAG_TEXT_DIRECTION_MENU; 295 case kWKContextMenuItemTagTextDirectionDefault: 296 return EWK_CONTEXT_MENU_ITEM_TAG_TEXT_DIRECTION_DEFAULT; 297 case kWKContextMenuItemTagTextDirectionLeftToRight: 298 return EWK_CONTEXT_MENU_ITEM_TAG_TEXT_DIRECTION_LEFT_TO_RIGHT; 299 case kWKContextMenuItemTagTextDirectionRightToLeft: 300 return EWK_CONTEXT_MENU_ITEM_TAG_TEXT_DIRECTION_RIGHT_TO_LEFT; 301 case kWKContextMenuItemTagOpenMediaInNewWindow: 302 return EWK_CONTEXT_MENU_ITEM_OPEN_MEDIA_IN_NEW_WINDOW; 303 case kWKContextMenuItemTagDownloadMediaToDisk: 304 return EWK_CONTEXT_MENU_ITEM_TAG_DOWNLOAD_MEDIA_TO_DISK; 305 case kWKContextMenuItemTagCopyMediaLinkToClipboard: 306 return EWK_CONTEXT_MENU_ITEM_TAG_COPY_MEDIA_LINK_TO_CLIPBOARD; 307 case kWKContextMenuItemTagToggleMediaControls: 308 return EWK_CONTEXT_MENU_ITEM_TAG_TOGGLE_MEDIA_CONTROLS; 309 case kWKContextMenuItemTagToggleMediaLoop: 310 return EWK_CONTEXT_MENU_ITEM_TAG_TOGGLE_MEDIA_LOOP; 311 case kWKContextMenuItemTagEnterVideoFullscreen: 312 return EWK_CONTEXT_MENU_ITEM_TAG_ENTER_VIDEO_FULLSCREEN; 313 case kWKContextMenuItemTagMediaPlayPause: 314 return EWK_CONTEXT_MENU_ITEM_TAG_MEDIA_PLAY_PAUSE; 315 case kWKContextMenuItemTagMediaMute: 316 return EWK_CONTEXT_MENU_ITEM_TAG_MEDIA_MUTE; 317 case kWKContextMenuItemBaseApplicationTag: 318 return EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG; 319 default: 320 return static_cast<Ewk_Context_Menu_Item_Action>(action); 321 } 322} 323