Create string tightly when retrive string from cbhm callback event
[framework/web/webkit-efl.git] / Source / WebKit2 / UIProcess / API / efl / ewk_context_menu.cpp
1 /*
2  * Copyright (C) 2012 Samsung Electronics
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public License
15  * along with this library; see the file COPYING.LIB.  If not, write to
16  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  * Boston, MA 02110-1301, USA.
18  */
19
20 #include "config.h"
21 #include "ewk_context_menu.h"
22
23 #if OS(TIZEN)
24 #include "WKAPICast.h"
25 #include "WKArray.h"
26 #include "WKContextMenuItem.h"
27 #include "WKRetainPtr.h"
28 #include "WKString.h"
29 #include "ewk_context_menu_private.h"
30 #include <wtf/OwnArrayPtr.h>
31 #include <wtf/text/CString.h>
32
33 using namespace WebKit;
34
35 /**
36  * \struct  _Ewk_Context_Menu
37  * @brief   Contains the context menu data.
38  */
39 struct _Ewk_Context_Menu {
40     Eina_List* items; /**< the list of Ewk_Context_Menu_Item */
41 };
42
43 /**
44  * \struct  _Ewk_Context_Menu_Item
45  * @brief   Represents one item of the context menu object.
46  */
47 struct _Ewk_Context_Menu_Item {
48     WKRetainPtr<WKContextMenuItemRef> itemRef;
49     CString linkURL;
50     CString imageURL;
51 };
52
53 static Eina_Bool appendItemToContextMenu(Ewk_Context_Menu* menu, Ewk_Context_Menu_Item* item)
54 {
55     if (!menu || !item)
56         return false;
57
58     menu->items = eina_list_append(menu->items, item);
59     return true;
60 }
61
62 static Ewk_Context_Menu* createContextMenu()
63 {
64     Ewk_Context_Menu* menu = new Ewk_Context_Menu;
65     menu->items = 0;
66     return menu;
67 }
68
69 Ewk_Context_Menu* ewkContextMenuCreateFromWKArray(WKArrayRef menu)
70 {
71     if (!menu)
72         return 0;
73
74     Ewk_Context_Menu* ewkContextMenu = createContextMenu();
75     int size = WKArrayGetSize(menu);
76     WKContextMenuItemRef item;
77     for (int i = 0; i < size; i++) {
78         item = static_cast<WKContextMenuItemRef>(WKArrayGetItemAtIndex(menu, i));
79         if (WKGetTypeID(item) == WKContextMenuItemGetTypeID())
80             appendItemToContextMenu(ewkContextMenu, ewkContextMenuItemCreateFromWKContextMenuItem(item));
81     }
82
83     return ewkContextMenu;
84 }
85
86 void ewkContextMenuDelete(Ewk_Context_Menu* menu)
87 {
88     if (!menu)
89         return;
90
91     void* data = 0;
92     EINA_LIST_FREE(menu->items, data)
93         ewkContextMenuItemDelete(static_cast<Ewk_Context_Menu_Item*>(data));
94     delete menu;
95 }
96
97 WKArrayRef ewkContextMenuConvertToWKArray(Ewk_Context_Menu* menu)
98 {
99     if (!menu)
100         return 0;
101
102     unsigned count = eina_list_count(menu->items);
103     if (!count)
104         return 0;
105
106     Ewk_Context_Menu_Item* item = 0;
107     OwnArrayPtr<WKTypeRef> items = adoptArrayPtr(new WKTypeRef[count]);
108     for (unsigned i = 0; i < count; i++) {
109         item = static_cast<Ewk_Context_Menu_Item*>(eina_list_nth(menu->items, i));
110         items[i] = item->itemRef.get();
111     }
112
113     return WKArrayCreate(items.get(), count);
114 }
115
116 Ewk_Context_Menu_Item* ewkContextMenuItemCreateFromWKContextMenuItem(WKContextMenuItemRef wkContextMenuItem, WKStringRef linkURLString, WKStringRef imageURLString)
117 {
118     if (!wkContextMenuItem)
119         return 0;
120
121     Ewk_Context_Menu_Item* item = new Ewk_Context_Menu_Item;
122     item->itemRef = wkContextMenuItem;
123     if (linkURLString)
124         item->linkURL = toImpl(linkURLString)->string().utf8();
125     if (imageURLString)
126         item->imageURL = toImpl(imageURLString)->string().utf8();
127
128     return item;
129 }
130
131 void ewkContextMenuItemDelete(Ewk_Context_Menu_Item* item)
132 {
133     if (!item)
134         return;
135
136     delete item;
137 }
138
139 unsigned ewk_context_menu_item_count(Ewk_Context_Menu* menu)
140 {
141     if (!menu)
142         return 0;
143
144     return eina_list_count(menu->items);
145 }
146
147 Ewk_Context_Menu_Item* ewk_context_menu_nth_item_get(Ewk_Context_Menu* menu, unsigned int n)
148 {
149     if (!menu)
150         return 0;
151
152     return static_cast<Ewk_Context_Menu_Item*>(eina_list_nth(menu->items, n));
153 }
154
155 Eina_Bool ewk_context_menu_item_remove(Ewk_Context_Menu* menu, Ewk_Context_Menu_Item* item)
156 {
157     if (!menu || !item)
158         return false;
159
160     ewkContextMenuItemDelete(item);
161     menu->items = eina_list_remove(menu->items, static_cast<const void*>(item));
162
163     return true;
164 }
165
166 Eina_Bool ewk_context_menu_item_append_as_action(Ewk_Context_Menu* menu, Ewk_Context_Menu_Item_Tag tag, const char* title, Eina_Bool enabled)
167 {
168     if (!menu)
169         return false;
170
171     WKRetainPtr<WKStringRef> titleString(AdoptWK, WKStringCreateWithUTF8CString(title));
172     WKContextMenuItemRef item = WKContextMenuItemCreateAsAction(static_cast<WKContextMenuItemTag>(tag), titleString.get(), enabled);
173     return appendItemToContextMenu(menu, ewkContextMenuItemCreateFromWKContextMenuItem(item));
174 }
175
176 Eina_Bool ewk_context_menu_item_append(Ewk_Context_Menu* menu, Ewk_Context_Menu_Item_Tag tag, const char* title, const char* iconFile, Eina_Bool enabled)
177 {
178 #if ENABLE(TIZEN_WEBKIT2_CONTEXT_MENU_ICON_TYPE_SUPPORT)
179     if (!menu)
180         return false;
181
182     WKRetainPtr<WKStringRef> titleString(AdoptWK, WKStringCreateWithUTF8CString(title));
183     WKRetainPtr<WKStringRef> iconString(AdoptWK, WKStringCreateWithUTF8CString(iconFile));
184     WKContextMenuItemRef item = WKContextMenuItemCreateWithTitleAndIconAsAction(static_cast<WKContextMenuItemTag>(tag), titleString.get(), iconString.get(), enabled);
185     return appendItemToContextMenu(menu, ewkContextMenuItemCreateFromWKContextMenuItem(item));
186 #else
187     return false;
188 #endif
189 }
190
191 Ewk_Context_Menu_Item_Tag ewk_context_menu_item_tag_get(Ewk_Context_Menu_Item* item)
192 {
193     if (!item)
194         return EWK_CONTEXT_MENU_ITEM_TAG_NO_ACTION;
195
196     return static_cast<Ewk_Context_Menu_Item_Tag>(WKContextMenuItemGetTag(item->itemRef.get()));
197 }
198
199 Ewk_Context_Menu_Item_Type ewk_context_menu_item_type_get(Ewk_Context_Menu_Item* item)
200 {
201     if (!item)
202         return EWK_CONTEXT_MENU_ITEM_TYPE_ACTION;
203
204     return static_cast<Ewk_Context_Menu_Item_Type>(WKContextMenuItemGetType(item->itemRef.get()));
205 }
206
207 Eina_Bool ewk_context_menu_item_enabled_get(const Ewk_Context_Menu_Item* item)
208 {
209     if (!item)
210         return false;
211
212     return WKContextMenuItemGetEnabled(item->itemRef.get());
213 }
214
215 const char* ewk_context_menu_item_link_url_get(Ewk_Context_Menu_Item* item)
216 {
217     if (!item)
218         return 0;
219
220     return item->linkURL.data();
221 }
222
223 const char* ewk_context_menu_item_image_url_get(Ewk_Context_Menu_Item* item)
224 {
225     if (!item)
226         return 0;
227
228     return item->imageURL.data();
229 }
230 #endif // #if OS(TIZEN)