b738dd508ede40be6de926b840c528f6b2d6430d
[profile/ivi/org.tizen.browser.git] / src / browser-view / browser-context-menu.cpp
1 /*
2  * Copyright 2012  Samsung Electronics Co., Ltd
3  *
4  * Licensed under the Flora License, Version 1.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *    http://www.tizenopensource.org/license
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17
18
19 #include "browser-context-menu.h"
20 #include "browser-view.h"
21
22 Browser_Context_Menu::Browser_Context_Menu(Browser_View *browser_view)
23 :       m_browser_view(browser_view)
24         ,m_ewk_view(NULL)
25 {
26         BROWSER_LOGD("[%s]", __func__);
27 }
28
29 Browser_Context_Menu::~Browser_Context_Menu(void)
30 {
31         BROWSER_LOGD("[%s]", __func__);
32 }
33
34 void Browser_Context_Menu::init(Evas_Object *ewk_view)
35 {
36         BROWSER_LOGD("[%s]", __func__);
37
38         deinit();
39
40         m_ewk_view = ewk_view;
41
42         evas_object_smart_callback_add(ewk_view, "contextmenu,customize", __get_context_menu_from_proposed_context_menu_cb, this);
43         evas_object_smart_callback_add(ewk_view, "contextmenu,selected", __custom_context_menu_item_selected_cb, this);
44 }
45
46 void Browser_Context_Menu::deinit(void)
47 {
48         BROWSER_LOGD("[%s]", __func__);
49         if (m_ewk_view) {
50                 evas_object_smart_callback_del(m_ewk_view, "contextmenu,customize",
51                                                 __get_context_menu_from_proposed_context_menu_cb);
52                 evas_object_smart_callback_del(m_ewk_view, "contextmenu,selected",
53                                                 __custom_context_menu_item_selected_cb);
54         }
55 }
56
57 Eina_Bool Browser_Context_Menu::launch_context_menu(Ewk_Context_Menu *menu)
58 {
59         BROWSER_LOGD("[%s]", __func__);
60
61         if (!menu)
62                 return EINA_FALSE;
63
64         switch (_check_context_menu_mode(menu)) {
65         case CUSTOM_CONTEXT_MENU_TEXT_ONLY_MODE:
66                 _append_text_only_mode_context_menu(menu);
67                 break;
68
69         case CUSTOM_CONTEXT_MENU_HYPERLINK_ONLY_MODE:
70                 _append_hyperlink_only_mode_context_menu(menu);
71                 break;
72
73         case CUSTOM_CONTEXT_MENU_TEXT_WITH_HYPERLINK_MODE:
74                 _append_text_with_hyperlink_mode_context_menu(menu);
75                 break;
76
77         case CUSTOM_CONTEXT_MENU_IMAGE_ONLY_MODE:
78                 _append_image_only_mode_context_menu(menu);
79                 break;
80
81         case CUSTOM_CONTEXT_MENU_IMAGE_WITH_HYPERLINK_MODE:
82                 _append_image_with_hyperlink_mode_context_menu(menu);
83                 break;
84
85         case CUSTOM_CONTEXT_MENU_TEXT_AND_IMAGE_SELECTION_MODE:
86                 /* To do */
87                 break;
88
89         default:
90                 _append_normal_mode_context_menu(menu);
91                 break;
92         }
93 }
94
95 void Browser_Context_Menu::__get_context_menu_from_proposed_context_menu_cb(void *data, Evas_Object *obj, void *event_info)
96 {
97         BROWSER_LOGD("[%s]", __func__);
98         if (!event_info)
99                 return;
100
101         if (!data)
102                 return;
103
104         Ewk_Context_Menu *menu = static_cast<Ewk_Context_Menu*>(event_info);
105         Browser_Context_Menu *context_menu = static_cast<Browser_Context_Menu *>(data);
106         context_menu->launch_context_menu(menu);
107 }
108
109 void Browser_Context_Menu::__custom_context_menu_item_selected_cb(void *data, Evas_Object *obj, void *event_info)
110 {
111         BROWSER_LOGD("[%s]", __func__);
112         if (!event_info)
113                 return;
114
115         Ewk_Context_Menu_Item* item = static_cast<Ewk_Context_Menu_Item*>(event_info);
116         Browser_Context_Menu *context_menu = static_cast<Browser_Context_Menu *>(data);
117
118         std::string link_url_string = ewk_context_menu_item_link_url_get(item);
119         BROWSER_LOGD("link url=[%s]", link_url_string.c_str());
120         std::string image_url_string = ewk_context_menu_item_image_url_get(item);
121         BROWSER_LOGD("image url=[%s]", image_url_string.c_str());
122
123         const char *selected_text = ewk_view_text_selection_text_get(context_menu->m_ewk_view);
124
125         Ewk_Context_Menu_Item_Tag tag = ewk_context_menu_item_tag_get(item);
126         switch (tag) {
127         case CUSTOM_CONTEXT_MENU_ITEM_FIND_ON_TAG:
128                 BROWSER_LOGD("Find selected text[%s] on the page", selected_text);
129                 if (selected_text && strlen(selected_text) > 0)
130                         context_menu->find_word_with_text(selected_text);
131                 break;
132         default:
133                 break;
134         }
135 }
136
137 Eina_Bool Browser_Context_Menu::_check_context_menu_mode(Ewk_Context_Menu *menu)
138 {
139         BROWSER_LOGD("[%s]", __func__);
140
141         if (!menu)
142                 return EINA_FALSE;
143
144         int count = ewk_context_menu_item_count(menu);
145
146         Eina_Bool has_text = EINA_FALSE;
147         Eina_Bool has_image = EINA_FALSE;
148         Eina_Bool has_hyperlink = EINA_FALSE;
149
150         Ewk_Context_Menu_Item *item;
151         Ewk_Context_Menu_Item_Tag tag;
152
153         for (int i = 0; i < count; i++) {
154                 item = ewk_context_menu_nth_item_get(menu, i);
155                 tag = ewk_context_menu_item_tag_get(item);
156                 BROWSER_LOGD("tag[%d]", tag);
157
158                 if ((tag == EWK_CONTEXT_MENU_ITEM_TAG_COPY)
159                 || (tag == EWK_CONTEXT_MENU_ITEM_TAG_CUT)
160                 || (tag == EWK_CONTEXT_MENU_ITEM_TAG_PASTE)
161                 || (tag == EWK_CONTEXT_MENU_ITEM_TAG_SELECT_ALL)
162                 || (tag == EWK_CONTEXT_MENU_ITEM_TAG_SEARCH_WEB)
163                 || (tag == EWK_CONTEXT_MENU_ITEM_TAG_SELECT_WORD))
164                         has_text = EINA_TRUE;
165
166                 if ((tag == EWK_CONTEXT_MENU_ITEM_TAG_OPEN_LINK)
167                 || (tag == EWK_CONTEXT_MENU_ITEM_TAG_OPEN_LINK_IN_NEW_WINDOW)
168                 || (tag == EWK_CONTEXT_MENU_ITEM_TAG_DOWNLOAD_LINK_TO_DISK)
169                 || (tag == EWK_CONTEXT_MENU_ITEM_TAG_COPY_LINK_TO_CLIPBOARD))
170                         has_hyperlink = EINA_TRUE;
171
172                 if ((tag == EWK_CONTEXT_MENU_ITEM_TAG_COPY_IMAGE_TO_CLIPBOARD)
173                 || (tag == EWK_CONTEXT_MENU_ITEM_TAG_DOWNLOAD_IMAGE_TO_DISK)
174                 || (tag == EWK_CONTEXT_MENU_ITEM_TAG_OPEN_FRAME_IN_NEW_WINDOW)
175                 || (tag == EWK_CONTEXT_MENU_ITEM_TAG_OPEN_IMAGE_IN_NEW_WINDOW))
176                         has_image = EINA_TRUE;
177         }
178
179         if (has_text == EINA_TRUE && has_hyperlink == EINA_FALSE && has_image == EINA_FALSE) {
180                 BROWSER_LOGD("CUSTOM_CONTEXT_MENU_TEXT_ONLY_MODE");
181                 return CUSTOM_CONTEXT_MENU_TEXT_ONLY_MODE;
182         } else if (has_text == EINA_TRUE && has_hyperlink == EINA_FALSE && has_image == EINA_TRUE) {
183                 BROWSER_LOGD("CUSTOM_CONTEXT_MENU_TEXT_AND_IMAGE_SELECTION_MODE");
184                 return CUSTOM_CONTEXT_MENU_TEXT_AND_IMAGE_SELECTION_MODE;
185         } else if (has_text == EINA_TRUE && has_hyperlink == EINA_TRUE && has_image == EINA_TRUE) {
186                 BROWSER_LOGD("CUSTOM_CONTEXT_MENU_TEXT_WITH_HYPERLINK_MODE");
187                 return CUSTOM_CONTEXT_MENU_TEXT_WITH_HYPERLINK_MODE;
188         } else if (has_text == EINA_FALSE && has_hyperlink == EINA_TRUE && has_image == EINA_FALSE) {
189                 BROWSER_LOGD("CUSTOM_CONTEXT_MENU_HYPERLINK_ONLY_MODE");
190                 return CUSTOM_CONTEXT_MENU_HYPERLINK_ONLY_MODE;
191         } else if (has_text == EINA_FALSE && has_hyperlink == EINA_FALSE && has_image == EINA_TRUE){
192                 BROWSER_LOGD("CUSTOM_CONTEXT_MENU_IMAGE_ONLY_MODE");
193                 return CUSTOM_CONTEXT_MENU_IMAGE_ONLY_MODE;
194         } else if (has_text == EINA_FALSE && has_hyperlink == EINA_TRUE && has_image == EINA_TRUE){
195                 BROWSER_LOGD("CUSTOM_CONTEXT_MENU_IMAGE_WITH_HYPERLINK_MODE");
196                 return CUSTOM_CONTEXT_MENU_IMAGE_WITH_HYPERLINK_MODE;
197         } else{
198                 BROWSER_LOGD("CUSTOM_CONTEXT_MENU_MODE_INDEX_END");
199                 return CUSTOM_CONTEXT_MENU_MODE_INDEX_END;
200         }
201 }
202
203 Eina_Bool Browser_Context_Menu::_append_text_only_mode_context_menu(Ewk_Context_Menu *menu)
204 {
205         BROWSER_LOGD("[%s]", __func__);
206
207         if (!menu)
208                 return EINA_FALSE;
209
210         Ewk_Context_Menu_Item *item;
211         Ewk_Context_Menu_Item_Tag tag;
212         int index = 0;
213         int count = ewk_context_menu_item_count(menu);
214         int *custom_context_menu_array = NULL;
215
216         if (count == 0)
217                 return EINA_FALSE;
218         custom_context_menu_array = (int *)malloc(sizeof(int) * count);
219         if (!custom_context_menu_array)
220                 return EINA_FALSE;
221
222         memset(custom_context_menu_array, 0x00, sizeof(int) * count);
223
224         /* To re-arrange menu order to follow UX guideline
225                 : copy menu would be best if it's at the first in context menu */
226         for (int i = 0; i < count; i++) {
227                 item = ewk_context_menu_nth_item_get(menu, i);
228                 tag = ewk_context_menu_item_tag_get(item);
229
230                 if (tag == EWK_CONTEXT_MENU_ITEM_TAG_COPY) {
231                         custom_context_menu_array[index++] = EWK_CONTEXT_MENU_ITEM_TAG_COPY;
232                         ewk_context_menu_item_remove(menu, item);
233                 }
234         }
235 #if 0
236         for (int i = 0; i < count; i++) {
237                 item = ewk_context_menu_nth_item_get(menu, i);
238                 tag = ewk_context_menu_item_tag_get(item);
239
240                 if (tag == EWK_CONTEXT_MENU_ITEM_TAG_CUT) {
241                         custom_context_menu_array[index++] = EWK_CONTEXT_MENU_ITEM_TAG_CUT;
242                         ewk_context_menu_item_remove(menu, item);
243                 }
244         }
245 #endif
246
247         for (int i = index; i < count; i++) {
248                 item = ewk_context_menu_nth_item_get(menu, 0);
249                 tag = ewk_context_menu_item_tag_get(item);
250
251                 custom_context_menu_array[index++] = tag;
252                 ewk_context_menu_item_remove(menu, item);
253         }
254
255         for (int i = 0; i < count; i++) {
256                 tag = custom_context_menu_array[i];
257
258                 switch (tag) {
259                 case EWK_CONTEXT_MENU_ITEM_TAG_CUT:
260                         ewk_context_menu_item_append_as_action(menu, tag, BR_STRING_CTXMENU_CUT, true);
261                         break;
262                 case EWK_CONTEXT_MENU_ITEM_TAG_PASTE:
263                         ewk_context_menu_item_append_as_action(menu, tag, BR_STRING_CTXMENU_PASTE, true);
264                         break;
265                 case EWK_CONTEXT_MENU_ITEM_TAG_COPY:
266                         ewk_context_menu_item_append_as_action(menu, tag, BR_STRING_CTXMENU_COPY, true);
267                         ewk_context_menu_item_append_as_action(menu, CUSTOM_CONTEXT_MENU_ITEM_FIND_ON_TAG, BR_STRING_CTXMENU_FIND_ON_PAGE, true);
268                         break;
269                 case EWK_CONTEXT_MENU_ITEM_TAG_SELECT_ALL:
270                         ewk_context_menu_item_append_as_action(menu, tag, BR_STRING_SELECT_ALL, true);
271                         break;
272                 case EWK_CONTEXT_MENU_ITEM_TAG_SELECT_WORD:
273                         ewk_context_menu_item_append_as_action(menu, tag, BR_STRING_CTXMENU_SELECT_WORD, true);
274                         break;
275                 default:
276                         break;
277                 }
278         }
279
280         if (custom_context_menu_array)
281                 free(custom_context_menu_array);
282         custom_context_menu_array = NULL;
283
284         return EINA_TRUE;
285 }
286
287 Eina_Bool Browser_Context_Menu::_append_text_with_hyperlink_mode_context_menu(Ewk_Context_Menu *menu)
288 {
289         BROWSER_LOGD("[%s]", __func__);
290
291         if (!menu)
292                 return EINA_FALSE;
293
294         return _append_hyperlink_only_mode_context_menu(menu);
295 }
296
297 Eina_Bool Browser_Context_Menu::_append_hyperlink_only_mode_context_menu(Ewk_Context_Menu *menu)
298 {
299         BROWSER_LOGD("[%s]", __func__);
300
301         if (!menu)
302                 return EINA_FALSE;
303
304         Ewk_Context_Menu_Item *item;
305         Ewk_Context_Menu_Item_Tag tag;
306         int index = 0;
307         int count = ewk_context_menu_item_count(menu);
308         int *custom_context_menu_array = (int *)malloc(sizeof(int) * count);
309
310         if (count == 0)
311                 return EINA_FALSE;
312
313         if (!custom_context_menu_array)
314                 return EINA_FALSE;
315
316         memset(custom_context_menu_array, 0x00, sizeof(int) * count);
317
318         /* To re-arrange menu order to follow UX guideline
319                 : "Open in new window" menu would be best if it's at the first in context menu */
320         for (int i = 0; i < count; i++) {
321                 item = ewk_context_menu_nth_item_get(menu, i);
322                 tag = ewk_context_menu_item_tag_get(item);
323
324                 if (tag == EWK_CONTEXT_MENU_ITEM_TAG_OPEN_LINK) {
325                         custom_context_menu_array[index++] = EWK_CONTEXT_MENU_ITEM_TAG_OPEN_LINK;
326                         ewk_context_menu_item_remove(menu, item);
327                 }
328         }
329
330         for (int i = 0; i < count; i++) {
331                 item = ewk_context_menu_nth_item_get(menu, i);
332                 tag = ewk_context_menu_item_tag_get(item);
333
334                 if (tag == EWK_CONTEXT_MENU_ITEM_TAG_OPEN_LINK_IN_NEW_WINDOW) {
335                         custom_context_menu_array[index++] = EWK_CONTEXT_MENU_ITEM_TAG_OPEN_LINK_IN_NEW_WINDOW;
336                         ewk_context_menu_item_remove(menu, item);
337                 }
338         }
339
340         for (int i = 0; i < count; i++) {
341                 item = ewk_context_menu_nth_item_get(menu, i);
342                 tag = ewk_context_menu_item_tag_get(item);
343
344                 if (tag == EWK_CONTEXT_MENU_ITEM_TAG_COPY_LINK_TO_CLIPBOARD) {
345                         custom_context_menu_array[index++] = EWK_CONTEXT_MENU_ITEM_TAG_COPY_LINK_TO_CLIPBOARD;
346                         ewk_context_menu_item_remove(menu, item);
347                 }
348         }
349
350         for (int i = index; i < count; i++) {
351                 item = ewk_context_menu_nth_item_get(menu, 0);
352                 tag = ewk_context_menu_item_tag_get(item);
353
354                 custom_context_menu_array[index++] = tag;
355                 ewk_context_menu_item_remove(menu, item);
356         }
357
358         for (int i = 0; i < count; i++) {
359                 tag = custom_context_menu_array[i];
360
361                 switch (tag) {
362
363                 case EWK_CONTEXT_MENU_ITEM_TAG_OPEN_LINK:
364                         ewk_context_menu_item_append_as_action(menu, tag, BR_STRING_CTXMENU_OPEN, true);
365                         break;
366
367                 case EWK_CONTEXT_MENU_ITEM_TAG_OPEN_LINK_IN_NEW_WINDOW:
368                         ewk_context_menu_item_append_as_action(menu, tag, BR_STRING_CTXMENU_OPEN_LINK_IN_NEW_WINDOW, true);
369                         break;
370                 case EWK_CONTEXT_MENU_ITEM_TAG_COPY_LINK_TO_CLIPBOARD:
371                         ewk_context_menu_item_append_as_action(menu, tag, BR_STRING_CTXMENU_COPY_LINK_LOCATION, true);
372                         break;
373 #if 0
374                 case EWK_CONTEXT_MENU_ITEM_TAG_DOWNLOAD_LINK_TO_DISK:
375                         ewk_context_menu_item_append_as_action(menu, tag, BR_STRING_CTXMENU_SAVE_LINK, true);
376                         break;
377 #endif
378                 default:
379                         break;
380                 }
381         }
382
383         if (custom_context_menu_array)
384                 free(custom_context_menu_array);
385         custom_context_menu_array = NULL;
386
387         return EINA_TRUE;
388 }
389
390 Eina_Bool Browser_Context_Menu::_append_image_only_mode_context_menu(Ewk_Context_Menu *menu)
391 {
392         BROWSER_LOGD("[%s]", __func__);
393
394         if (!menu)
395                 return EINA_FALSE;
396
397         Ewk_Context_Menu_Item *item;
398         Ewk_Context_Menu_Item_Tag tag;
399         int index = 0;
400         int count = ewk_context_menu_item_count(menu);
401         int *custom_context_menu_array = (int *)malloc(sizeof(int) * count);
402
403         if (count == 0)
404                 return EINA_FALSE;
405
406         if (!custom_context_menu_array)
407                 return EINA_FALSE;
408
409         memset(custom_context_menu_array, 0x00, sizeof(int) * count);
410
411         /* To re-arrange menu order to follow UX guideline
412                 : "Copy image" menu would be best if it's at the first in context menu */
413         for (int i = 0; i < count; i++) {
414                 item = ewk_context_menu_nth_item_get(menu, i);
415                 tag = ewk_context_menu_item_tag_get(item);
416
417                 if (tag == EWK_CONTEXT_MENU_ITEM_TAG_COPY_IMAGE_TO_CLIPBOARD) {
418                         custom_context_menu_array[index++] = EWK_CONTEXT_MENU_ITEM_TAG_COPY_IMAGE_TO_CLIPBOARD;
419                         ewk_context_menu_item_remove(menu, item);
420                 }
421         }
422
423         for (int i = index; i < count; i++) {
424                 item = ewk_context_menu_nth_item_get(menu, 0);
425                 tag = ewk_context_menu_item_tag_get(item);
426
427                 custom_context_menu_array[index++] = tag;
428                 ewk_context_menu_item_remove(menu, item);
429         }
430
431         for (int i = 0; i < count; i++) {
432                 tag = custom_context_menu_array[i];
433
434                 switch (tag) {
435                 case EWK_CONTEXT_MENU_ITEM_TAG_COPY_IMAGE_TO_CLIPBOARD:
436                         ewk_context_menu_item_append_as_action(menu, tag, BR_STRING_CTXMENU_COPY_IMAGE, true);
437                         break;
438                 case EWK_CONTEXT_MENU_ITEM_TAG_OPEN_IMAGE_IN_NEW_WINDOW:
439                         ewk_context_menu_item_append_as_action(menu, tag, BR_STRING_CTXMENU_OPEN_IMAGE_IN_NEW_WINDOW, true);
440                         break;
441                 case EWK_CONTEXT_MENU_ITEM_TAG_DOWNLOAD_IMAGE_TO_DISK:
442                         ewk_context_menu_item_append_as_action(menu, tag, BR_STRING_CTXMENU_SAVE_IMAGE, true);
443                         ewk_context_menu_item_append_as_action(menu, CUSTOM_CONTEXT_MENU_ITEM_SELECTION_MODE_FROM_IMAGE_TAG, BR_STRING_CTXMENU_SELECTION_MODE, true);
444                         break;
445                 default:
446                         break;
447                 }
448         }
449
450         if (custom_context_menu_array)
451                 free(custom_context_menu_array);
452         custom_context_menu_array = NULL;
453
454         return EINA_TRUE;
455 }
456
457 Eina_Bool Browser_Context_Menu::_append_image_with_hyperlink_mode_context_menu(Ewk_Context_Menu *menu)
458 {
459         BROWSER_LOGD("[%s]", __func__);
460
461         if (!menu)
462                 return EINA_FALSE;
463
464         Ewk_Context_Menu_Item *item;
465         Ewk_Context_Menu_Item_Tag tag;
466         int index = 0;
467         int count = ewk_context_menu_item_count(menu);
468         int *custom_context_menu_array = (int *)malloc(sizeof(int) * count);
469
470         if (count == 0)
471                 return EINA_FALSE;
472
473         if (!custom_context_menu_array)
474                 return EINA_FALSE;
475
476         memset(custom_context_menu_array, 0x00, sizeof(int) * count);
477
478         /* To re-arrange menu order to follow UX guideline
479                 : "Open in new window" menu would be best if it's at the first in context menu */
480         for (int i = 0; i < count; i++) {
481                 item = ewk_context_menu_nth_item_get(menu, i);
482                 tag = ewk_context_menu_item_tag_get(item);
483
484                 if (tag == EWK_CONTEXT_MENU_ITEM_TAG_OPEN_LINK_IN_NEW_WINDOW) {
485                         custom_context_menu_array[index++] = EWK_CONTEXT_MENU_ITEM_TAG_OPEN_LINK_IN_NEW_WINDOW;
486                         ewk_context_menu_item_remove(menu, item);
487                 }
488         }
489
490         for (int i = 0; i < count; i++) {
491                 item = ewk_context_menu_nth_item_get(menu, i);
492                 tag = ewk_context_menu_item_tag_get(item);
493
494                 if (tag == EWK_CONTEXT_MENU_ITEM_TAG_COPY_LINK_TO_CLIPBOARD) {
495                         custom_context_menu_array[index++] = EWK_CONTEXT_MENU_ITEM_TAG_COPY_LINK_TO_CLIPBOARD;
496                         ewk_context_menu_item_remove(menu, item);
497                 }
498         }
499
500         for (int i = 0; i < count; i++) {
501                 item = ewk_context_menu_nth_item_get(menu, i);
502                 tag = ewk_context_menu_item_tag_get(item);
503
504                 if (tag == EWK_CONTEXT_MENU_ITEM_TAG_COPY_IMAGE_TO_CLIPBOARD) {
505                         custom_context_menu_array[index++] = EWK_CONTEXT_MENU_ITEM_TAG_COPY_IMAGE_TO_CLIPBOARD;
506                         ewk_context_menu_item_remove(menu, item);
507                 }
508         }
509
510         for (int i = index; i < count; i++) {
511                 item = ewk_context_menu_nth_item_get(menu, 0);
512                 tag = ewk_context_menu_item_tag_get(item);
513
514                 custom_context_menu_array[index++] = tag;
515                 ewk_context_menu_item_remove(menu, item);
516         }
517
518         for (int i = 0; i < count; i++) {
519                 tag = custom_context_menu_array[i];
520
521                 switch (tag) {
522                 case EWK_CONTEXT_MENU_ITEM_TAG_OPEN_LINK_IN_NEW_WINDOW:
523                         ewk_context_menu_item_append_as_action(menu, tag, BR_STRING_CTXMENU_OPEN_LINK_IN_NEW_WINDOW, true);
524                         break;
525                 case EWK_CONTEXT_MENU_ITEM_TAG_COPY_LINK_TO_CLIPBOARD:
526                         ewk_context_menu_item_append_as_action(menu, tag, BR_STRING_CTXMENU_COPY_LINK_LOCATION, true);
527                         break;
528                 case EWK_CONTEXT_MENU_ITEM_TAG_COPY_IMAGE_TO_CLIPBOARD:
529                         ewk_context_menu_item_append_as_action(menu, tag, BR_STRING_CTXMENU_COPY_IMAGE, true);
530                         break;
531                 case EWK_CONTEXT_MENU_ITEM_TAG_OPEN_IMAGE_IN_NEW_WINDOW:
532                         ewk_context_menu_item_append_as_action(menu, tag, BR_STRING_CTXMENU_OPEN_IMAGE_IN_NEW_WINDOW, true);
533                         break;
534                 case EWK_CONTEXT_MENU_ITEM_TAG_DOWNLOAD_IMAGE_TO_DISK:
535                         ewk_context_menu_item_append_as_action(menu, tag, BR_STRING_CTXMENU_SAVE_IMAGE, true);
536                         ewk_context_menu_item_append_as_action(menu, CUSTOM_CONTEXT_MENU_ITEM_SELECTION_MODE_FROM_IMAGE_TAG, BR_STRING_CTXMENU_SELECTION_MODE, true);
537                         break;
538                 default:
539                         break;
540                 }
541         }
542
543         if (custom_context_menu_array)
544                 free(custom_context_menu_array);
545         custom_context_menu_array = NULL;
546
547         return EINA_TRUE;
548 }
549
550 Eina_Bool Browser_Context_Menu::_append_text_and_image_selection_mode_context_menu(Ewk_Context_Menu *menu)
551 {
552         BROWSER_LOGD("[%s]", __func__);
553
554         if (!menu)
555                 return EINA_FALSE;
556
557         return EINA_FALSE;
558 }
559
560 Eina_Bool Browser_Context_Menu::_append_normal_mode_context_menu(Ewk_Context_Menu *menu)
561 {
562         BROWSER_LOGD("[%s]", __func__);
563
564         if (!menu)
565                 return EINA_FALSE;
566
567         Ewk_Context_Menu_Item *item;
568         Ewk_Context_Menu_Item_Tag tag;
569         bool show_hyperlink_item_flag = false;
570         bool show_imagemode_flag = false;
571         int count = ewk_context_menu_item_count(menu);
572
573         for (int i = 0; i < count; i++) {
574                 item = ewk_context_menu_nth_item_get(menu, 0);
575                 tag = ewk_context_menu_item_tag_get(item);
576                 ewk_context_menu_item_remove(menu, item);
577
578                 switch (tag) {
579                 case EWK_CONTEXT_MENU_ITEM_TAG_OPEN_LINK:
580                         ewk_context_menu_item_append_as_action(menu, tag, BR_STRING_CTXMENU_OPEN, true);
581                         break;
582                 case EWK_CONTEXT_MENU_ITEM_TAG_OPEN_LINK_IN_NEW_WINDOW:
583                         ewk_context_menu_item_append_as_action(menu, tag, BR_STRING_CTXMENU_OPEN_LINK_IN_NEW_WINDOW, true);
584                         break;
585                 case EWK_CONTEXT_MENU_ITEM_TAG_DOWNLOAD_LINK_TO_DISK:
586                         ewk_context_menu_item_append_as_action(menu, tag, BR_STRING_CTXMENU_SAVE_LINK, true);
587                         break;
588                 case EWK_CONTEXT_MENU_ITEM_TAG_OPEN_IMAGE_IN_NEW_WINDOW:
589                         ewk_context_menu_item_append_as_action(menu, tag, BR_STRING_CTXMENU_OPEN_IMAGE_IN_NEW_WINDOW, true);
590                         break;
591                 case EWK_CONTEXT_MENU_ITEM_TAG_DOWNLOAD_IMAGE_TO_DISK:
592                         ewk_context_menu_item_append_as_action(menu, tag, BR_STRING_CTXMENU_SAVE_IMAGE, true);
593                         break;
594                 case EWK_CONTEXT_MENU_ITEM_TAG_COPY_IMAGE_TO_CLIPBOARD:
595                         ewk_context_menu_item_append_as_action(menu, tag, BR_STRING_CTXMENU_COPY_IMAGE, true);
596                         break;
597                 case EWK_CONTEXT_MENU_ITEM_TAG_COPY_LINK_TO_CLIPBOARD:
598                         ewk_context_menu_item_append_as_action(menu, tag, BR_STRING_CTXMENU_COPY_IMAGE_LOCATION, true);
599                         break;
600                 case EWK_CONTEXT_MENU_ITEM_TAG_CUT:
601                         ewk_context_menu_item_append_as_action(menu, tag, BR_STRING_CTXMENU_CUT, true);
602                         break;
603                 case EWK_CONTEXT_MENU_ITEM_TAG_PASTE:
604                         ewk_context_menu_item_append_as_action(menu, tag, BR_STRING_CTXMENU_PASTE, true);
605                         break;
606                 case EWK_CONTEXT_MENU_ITEM_TAG_COPY:
607                         ewk_context_menu_item_append_as_action(menu, tag, BR_STRING_CTXMENU_COPY, true);
608                         break;
609                 case EWK_CONTEXT_MENU_ITEM_TAG_SELECT_ALL:
610                         ewk_context_menu_item_append_as_action(menu, tag, BR_STRING_SELECT_ALL, true);
611                         break;
612                 case EWK_CONTEXT_MENU_ITEM_TAG_SELECT_WORD:
613                         ewk_context_menu_item_append_as_action(menu, tag, BR_STRING_CTXMENU_SELECT_WORD, true);
614                         break;
615                 default:
616                         break;
617         }
618 }
619
620         /* if the tag is hyperlink text, show text selection mode menu */
621         if ((show_hyperlink_item_flag == true) && (show_imagemode_flag == false))
622                 ewk_context_menu_item_append_as_action(menu, CUSTOM_CONTEXT_MENU_ITEM_SELECTION_MODE_FROM_TEXT_TAG, BR_STRING_CTXMENU_SELECTION_MODE, true);
623
624         return EINA_TRUE;
625 }
626
627