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