2 * Copyright 2012 Samsung Electronics Co., Ltd
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
8 * http://www.tizenopensource.org/license
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.
20 #include "email-composer.h"
21 #include "email-composer-recipient.h"
22 #include "email-composer-util.h"
23 #include "email-composer-contents.h"
24 #include "email-composer-callback.h"
25 #include "email-composer-attachment.h"
26 #include "email-composer-predictive-search.h"
27 #include "email-composer-js.h"
29 void _composer_webview_reach_top_cb(void *data, Evas_Object *obj, void *event_info);
30 void _composer_webview_reach_bottom_cb(void *data, Evas_Object *obj, void *event_info);
31 void _composer_webview_mouse_down_cb(void *data, Evas * evas, Evas_Object *obj, void *event_info);
33 void _composer_webview_mouse_move_cb(void *data, Evas * evas, Evas_Object *obj, void *event_info);
34 void _composer_webview_mouse_up_cb(void *data, Evas * evas, Evas_Object *obj, void *event_info);
35 void _composer_webkit_loadFinished_cb(void *data, Evas_Object *obj, void *event_info);
37 static void _composer_webkit_focused_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
38 static void _composer_webkit_unfocused_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
39 static void _composer_get_html_content_cb(Evas_Object *o, const char *result, void *data);
41 static void _composer_webkit_scroll_up_cb(void *data, Evas_Object *obj, void *event_info);
42 static void _composer_webkit_scroll_down_cb(void *data, Evas_Object *obj, void *event_info);
44 static void _composer_webkit_get_ime_rect_cb(void *data, Evas_Object *obj, void *event_info);
45 static void _composer_webkit_ime_closed_cb(void *data, Evas_Object *obj, void *event_info);
46 static void _composer_webkit_ime_opened_cb(void *data, Evas_Object *obj, void *event_info);
47 static void _composer_webview_policy_navigation_decide_cb(void *data, Evas_Object *obj, void *event_info);
48 static void _composer_webview_contextmenu_customize_cb(void *data, Evas_Object *webview, void *event_info);
49 static void _composer_webview_contextmenu_selected_cb(void *data, Evas_Object *webview, void *event_info);
50 static void _composer_webkit_get_text_status_cb(void *data, Evas_Object *obj, void *event_info);
53 static void _changed_cb(void *data, Evas_Object *obj, void *event_info) // This callback is for showing(hiding) X marked button.
57 if (elm_object_focus_get(data)) {
58 if (elm_entry_is_empty(obj))
59 elm_object_signal_emit(data, "elm,state,eraser,hide", "elm");
61 elm_object_signal_emit(data, "elm,state,eraser,show", "elm");
65 static void _focused_cb(void *data, Evas_Object *obj, void *event_info) // Focused callback will show X marked button and hide guidetext.
69 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
71 debug_log("ugd->focus_status = %d", ugd->focus_status);
73 if (COMPOSER_FOCUS_STATUS_NONE == ugd->focus_status) {
74 if (!elm_entry_is_empty(obj))
75 elm_object_signal_emit(ugd->subject_editfield, "elm,state,eraser,show", "elm");
76 elm_object_signal_emit(ugd->subject_editfield, "elm,state,guidetext,hide", "elm");
78 _composer_attachment_contract_items(ugd);
80 elm_entry_input_panel_show(obj);
82 ugd->selected_entry = ugd->subject_entry;
83 elm_layout_sizing_eval(ugd->c_layout);
85 if (ugd->selected_entry == ugd->body_ewkview) {
86 elm_object_focus_set(ugd->subject_entry, EINA_FALSE);
91 static void _unfocused_cb(void *data, Evas_Object *obj, void *event_info) // Unfocused callback will show guidetext and hide X marked button.
94 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
96 if (ugd->focus_status == COMPOSER_FOCUS_STATUS_SELECTED) {
97 elm_object_tree_focus_allow_set(ugd->c_layout, EINA_FALSE); // block the focus not to open IME.
98 ugd->focus_status = COMPOSER_FOCUS_STATUS_NONE;
102 if (elm_entry_is_empty(obj))
103 elm_object_signal_emit(ugd->subject_editfield, "elm,state,guidetext,show", "elm");
104 elm_object_signal_emit(ugd->subject_editfield, "elm,state,eraser,hide", "elm");
106 elm_entry_input_panel_hide(obj);
109 static void _eraser_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source) // When X marked button clicked, make string as empty.
113 elm_entry_entry_set(data, "");
116 void _composer_content_create_content_field(Evas_Object *parent, EmailComposerUGD *ugd)
120 /* Create Subject field */
121 _composer_create_subject_field(parent, ugd);
123 /* Create Body field */
124 _composer_create_body_field(parent, ugd);
127 void _composer_create_subject_field(Evas_Object *parent, EmailComposerUGD *ugd)
133 ly = _composer_create_subject_editfield(parent, dgettext("sys_string", "IDS_COM_BODY_SUBJECT"), ugd);
135 _composer_register_editfield_entry_callback(ugd->subject_entry, ugd);
137 evas_object_smart_callback_add(ugd->subject_entry, "changed", _changed_cb, ugd->subject_editfield);
138 evas_object_smart_callback_add(ugd->subject_entry, "focused", _focused_cb, ugd);
139 evas_object_smart_callback_add(ugd->subject_entry, "unfocused", _unfocused_cb, ugd);
140 elm_object_signal_callback_add(ugd->subject_editfield, "elm,eraser,clicked", "elm", _eraser_clicked_cb, ugd->subject_entry);
142 elm_object_part_content_set(parent, "subject_field", ly);
144 ugd->subject_ly = ly;
147 Evas_Object *_composer_create_subject_editfield(Evas_Object *parent, char *title, EmailComposerUGD *ugd)
153 Evas_Object *entry = NULL;
155 ly = elm_layout_add(parent);
157 elm_layout_file_set(ly, COMPOSER_EDJ_NAME, "layout.subject");
158 evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
159 evas_object_size_hint_align_set(ly, EVAS_HINT_FILL, EVAS_HINT_FILL);
160 evas_object_show(ly);
162 ef = elm_layout_add(parent);
163 elm_layout_theme_set(ef, "layout", "editfield", "default");
164 evas_object_size_hint_weight_set(ef, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
165 evas_object_size_hint_align_set(ef, EVAS_HINT_FILL, EVAS_HINT_FILL);
166 evas_object_show(ef);
168 elm_object_part_text_set(ef, "elm.guidetext", title);
169 elm_object_part_content_set(ly, "subject.editfield", ef);
170 ugd->subject_editfield = ef;
172 entry = elm_entry_add(ef);
173 elm_entry_scrollable_set(entry, EINA_TRUE);
174 elm_entry_single_line_set(entry, EINA_TRUE);
175 elm_entry_input_panel_layout_set(entry, ELM_INPUT_PANEL_LAYOUT_NORMAL);
176 elm_entry_cnp_mode_set(entry, ELM_CNP_MODE_PLAINTEXT);
177 evas_object_show(entry);
178 elm_entry_text_style_user_push(entry, "DEFAULT='font_size=32 color=#000000'");
180 elm_object_part_content_set(ef, "elm.swallow.content", entry);
181 ugd->subject_entry = entry;
186 void _composer_create_body_field(Evas_Object *parent, EmailComposerUGD *ugd)
190 Evas_Object *body_ly;
192 body_ly = _composer_create_body_webview(parent, NULL, ugd);
194 elm_object_part_content_set(parent, "content_field", body_ly);
196 ugd->webkit_ly = body_ly;
199 void _composer_register_editfield_entry_callback(Evas_Object *obj, EmailComposerUGD *ugd)
203 evas_object_smart_callback_add(obj, "changed", _composer_edit_field_changed_cb, ugd);
204 evas_object_smart_callback_add(obj, "preedit,changed", _composer_edit_field_changed_cb, ugd);
206 Ecore_IMF_Context *imf_context = elm_entry_imf_context_get(obj);
207 ecore_imf_context_input_panel_event_callback_add (imf_context, ECORE_IMF_INPUT_PANEL_GEOMETRY_EVENT, _composer_input_panel_resize_cb, ugd);
208 ecore_imf_context_input_panel_event_callback_add(imf_context, ECORE_IMF_INPUT_PANEL_STATE_EVENT, _composer_input_panel_state_changed_cb, ugd);
209 debug_log("ugd->is_prediction: %d", ugd->is_prediction);
212 void _composer_webkit_set_body_script(void *data)
215 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
220 if (ewk_view_script_execute(ugd->body_ewkview, COMPOSER_JS_ENABLE_EDITABLE, _composer_script_executed_cb, NULL) == EINA_FALSE)
221 debug_log("COMPOSER_JS_ENABLE_EDITABLE failed.");
223 if (ewk_view_script_execute(ugd->body_ewkview, COMPOSER_JS_GET_HTML_CONTENT, _composer_get_html_content_cb, (void *)ugd) == EINA_FALSE)
224 debug_log("COMPOSER_JS_GET_HTML_CONTENT failed.");
227 Evas_Object *_composer_create_body_webview(Evas_Object *parent, char *title, EmailComposerUGD *ugd)
233 ly = elm_layout_add(parent);
235 elm_layout_file_set(ly, COMPOSER_EDJ_NAME, "layout.webkit");
236 evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
237 evas_object_size_hint_align_set(ly, EVAS_HINT_FILL, EVAS_HINT_FILL);
238 evas_object_show(ly);
240 ugd->body_ewkview = ewk_view_add(evas_object_evas_get(parent));
241 evas_object_size_hint_weight_set(ugd->body_ewkview, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
242 evas_object_size_hint_align_set(ugd->body_ewkview, EVAS_HINT_FILL, EVAS_HINT_FILL);
243 ewk_view_vertical_panning_hold_set(ugd->body_ewkview, EINA_TRUE);
245 elm_object_part_content_set(ly, "webkit.swallow", ugd->body_ewkview);
247 evas_object_smart_callback_add(ugd->body_ewkview, "edge,top", _composer_webview_reach_top_cb, ugd);
248 evas_object_smart_callback_add(ugd->body_ewkview, "edge,bottom", _composer_webview_reach_bottom_cb, ugd);
250 evas_object_event_callback_add(ugd->body_ewkview, EVAS_CALLBACK_MOUSE_DOWN, _composer_webview_mouse_down_cb, ugd);
252 Ewk_Settings *ewkSetting = NULL;
253 ewkSetting = ewk_view_settings_get(ugd->body_ewkview);
255 if (NULL == ewkSetting)
256 debug_log("ewkSetting is NULL.");
258 ewk_settings_uses_encoding_detector_set(ewkSetting, EINA_TRUE);
260 evas_object_smart_callback_add(ugd->body_ewkview, "load,finished", _composer_webkit_loadFinished_cb, ugd);
261 evas_object_smart_callback_add(ugd->body_ewkview, "policy,navigation,decide", _composer_webview_policy_navigation_decide_cb, ugd);
262 evas_object_smart_callback_add(ugd->body_ewkview, "scroll,up", _composer_webkit_scroll_up_cb, ugd);
263 evas_object_smart_callback_add(ugd->body_ewkview, "scroll,down", _composer_webkit_scroll_down_cb, ugd);
264 evas_object_smart_callback_add(ugd->body_ewkview, "contextmenu,customize", _composer_webview_contextmenu_customize_cb, ugd);
265 evas_object_smart_callback_add(ugd->body_ewkview, "contextmenu,selected", _composer_webview_contextmenu_selected_cb, ugd);
266 evas_object_smart_callback_add(ugd->body_ewkview, "editorclient,ime,closed", _composer_webkit_ime_closed_cb, ugd);
267 evas_object_smart_callback_add(ugd->body_ewkview, "editorclient,ime,opened", _composer_webkit_ime_opened_cb, ugd);
268 evas_object_smart_callback_add(ugd->body_ewkview, "text,style,state", _composer_webkit_get_text_status_cb, ugd);
269 evas_object_smart_callback_add(ugd->body_ewkview, "inputmethod,changed", _composer_webkit_get_ime_rect_cb, ugd);
271 evas_object_event_callback_add(ugd->body_ewkview, EVAS_CALLBACK_FOCUS_IN, _composer_webkit_focused_cb, ugd);
272 evas_object_event_callback_add(ugd->body_ewkview, EVAS_CALLBACK_FOCUS_OUT, _composer_webkit_unfocused_cb, ugd);
277 void _composer_webview_mouse_down_cb(void *data, Evas * evas, Evas_Object *obj, void *event_info)
282 void _composer_webview_mouse_move_cb(void *data, Evas * evas, Evas_Object *obj, void *event_info)
287 void _composer_webview_mouse_up_cb(void *data, Evas * evas, Evas_Object *obj, void *event_info)
292 void _composer_webkit_loadFinished_cb(void *data, Evas_Object *obj, void *event_info)
296 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
298 _composer_webkit_set_body_script(data);
300 Ewk_Settings *ewkSetting = NULL;
301 ewkSetting = ewk_view_settings_get(ugd->body_ewkview);
303 if (ewkSetting == NULL)
304 debug_log("ewkSetting is NULL.");
306 ewk_settings_auto_fitting_set(ewkSetting, EINA_TRUE);
307 ewk_settings_editable_link_behavior_set(ewkSetting, EWK_EDITABLE_LINK_BEHAVIOR_NEVER_LIVE);
309 if (ugd->selected_entry == ugd->body_ewkview) {
310 // focus to the body field when reply the email.
311 evas_object_focus_set(ugd->body_ewkview, EINA_TRUE);
314 elm_object_disabled_set(ugd->cancel_btn, EINA_FALSE);
315 elm_object_disabled_set(ugd->cancel_btm_btn, EINA_FALSE);
316 ugd->b_load_finished = EINA_TRUE;
319 static void _composer_webkit_focused_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
323 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
325 debug_log("Webkit focused");
329 _composer_ps_stop(ugd);
330 ugd->sc_timer = ecore_timer_add(0.5, _composer_ps_scroll_pop, ugd);
333 debug_log("selected_entry = %x, to_mbe_entry = %x, cc_mbe_entry = %x, bcc_mbe_entry = %x, subject_entry = %x, body_ewkview = %x",
334 ugd->selected_entry, ugd->to_mbe_entry, ugd->cc_mbe_entry, ugd->bcc_mbe_entry, ugd->subject_entry, ugd->body_ewkview);
336 debug_log("obj = %x, to_mbe = %x, cc_mbe = %x, bcc_mbe = %x, subject_editfield = %x", obj, ugd->to_mbe, ugd->cc_mbe, ugd->bcc_mbe, ugd->subject_editfield);
338 if (EINA_TRUE == elm_object_focus_get(ugd->to_mbe)) {
340 elm_object_focus_set(ugd->to_mbe, EINA_FALSE);
342 else if (EINA_TRUE == elm_object_focus_get(ugd->cc_mbe)) {
344 elm_object_focus_set(ugd->cc_mbe, EINA_FALSE);
346 else if (EINA_TRUE == elm_object_focus_get(ugd->bcc_mbe)) {
347 debug_log("bcc_mbe");
348 elm_object_focus_set(ugd->bcc_mbe, EINA_FALSE);
350 else if (EINA_TRUE == elm_object_focus_get(ugd->subject_entry)) {
351 debug_log("subject_entry");
352 elm_object_focus_set(ugd->subject_entry, EINA_FALSE);
355 ugd->selected_entry = ugd->body_ewkview;
356 evas_object_focus_set(ugd->body_ewkview, EINA_TRUE);
358 ugd->focus_status = COMPOSER_FOCUS_STATUS_NONE; // focus handling when rte is clicked
359 _composer_attachment_contract_items(ugd);
361 elm_layout_sizing_eval(ugd->c_layout);
362 if (ewk_view_script_execute(ugd->body_ewkview, COMPOSER_JS_SET_FOCUS, _composer_script_executed_cb, NULL) == EINA_FALSE)
363 debug_log("COMPOSER_JS_SET_FOCUS failed.");
366 static void _composer_webkit_unfocused_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
370 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
372 debug_log("selected_entry = %x, to_mbe_entry = %x, cc_mbe_entry = %x, bcc_mbe_entry = %x, subject_entry = %x, body_ewkview = %x",
373 ugd->selected_entry, ugd->to_mbe_entry, ugd->cc_mbe_entry, ugd->bcc_mbe_entry, ugd->subject_entry, ugd->body_ewkview);
375 if (ugd->selected_entry == ugd->body_ewkview) {
376 debug_log("Webkit unfocused");
377 evas_object_focus_set(ugd->body_ewkview, EINA_FALSE);
379 if (ugd->focus_status == COMPOSER_FOCUS_STATUS_SELECTED) {
380 elm_object_tree_focus_allow_set(ugd->c_layout, EINA_FALSE); // block the focus not to open IME.
381 ugd->focus_status = COMPOSER_FOCUS_STATUS_NONE;
386 void _composer_webview_reach_top_cb(void *data, Evas_Object *obj, void *event_info)
390 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
392 if (ugd->is_webview_scrolling) {
393 debug_log("main scroller start");
394 ewk_view_vertical_panning_hold_set(ugd->body_ewkview, EINA_TRUE);
396 if (elm_widget_scroll_freeze_get(ugd->main_scroller) > 0)
397 elm_object_scroll_freeze_pop(ugd->main_scroller);
399 /* WORKAROUND. To fix scrolling problem when screen is on the bottom of webview. (Do panning to top fast) */
401 elm_scroller_region_get(ugd->main_scroller, &x, &y, &w, &h);
402 debug_log("main_scroller(x:%d, y:%d, w:%d, h:%d)", x, y, w, h);
403 elm_scroller_region_bring_in(ugd->main_scroller, x, 0, w, h);
405 ugd->is_main_scroller_scrolling = EINA_TRUE;
406 ugd->is_webview_scrolling = EINA_FALSE;
409 if (ugd->temporary_fix_for_rotation)
410 ugd->temporary_fix_for_rotation = false;
413 void _composer_webview_reach_bottom_cb(void *data, Evas_Object *obj, void *event_info)
417 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
419 if (ugd->temporary_fix_for_rotation) {
420 if (elm_widget_scroll_freeze_get(ugd->main_scroller) > 0)
421 elm_object_scroll_freeze_pop(ugd->main_scroller);
422 ugd->temporary_fix_for_rotation = false;
426 static void _composer_get_html_content_cb(Evas_Object *o, const char *result, void *data)
430 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
432 if (result != NULL) {
433 ugd->saved_html_content = g_strdup(result);
434 debug_log("ugd->saved_html_content => %s", ugd->saved_html_content);
438 static void _composer_webkit_scroll_up_cb(void *data, Evas_Object *obj, void *event_info)
443 static void _composer_webkit_scroll_down_cb(void *data, Evas_Object *obj, void *event_info)
448 static void _composer_webkit_ime_closed_cb(void *data, Evas_Object *obj, void *event_info)
452 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
453 _composer_resize_body_webview(ugd, 0);
455 elm_object_item_signal_emit(ugd->navi_item, "elm,state,sip,hidden", "");
456 ugd->is_ime_hided = true;
459 static void _composer_webkit_ime_opened_cb(void *data, Evas_Object *obj, void *event_info)
462 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
464 if (ugd->isRotated == true) {
465 _composer_region_show_cb(ugd);
466 ugd->isRotated = false;
469 elm_object_item_signal_emit(ugd->navi_item, "elm,state,sip,shown", "");
470 ugd->is_ime_hided = false;
473 static void _composer_webkit_get_ime_rect_cb(void *data, Evas_Object *obj, void *event_info)
476 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
477 Eina_Rectangle *rect = (Eina_Rectangle*)event_info;
478 debug_log("inputmethod,changed (x:%d,y:%d,w:%d,h:%d)\n", rect->x, rect->y, rect->w, rect->h);
480 _composer_resize_body_webview(ugd, rect->h);
483 static void _composer_webview_policy_navigation_decide_cb(void *data, Evas_Object *obj, void *event_info)
487 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
489 const char *uri = NULL;
490 uri = ewk_view_url_get(ugd->body_ewkview);
491 debug_log("ewk_view_url_get(%s)", uri);
493 if (ugd->b_load_finished == EINA_TRUE) {
494 Ewk_Policy_Decision *policy_decision = (Ewk_Policy_Decision *)event_info;
495 ewk_policy_decision_ignore(policy_decision);
497 debug_log("url:%s", ewk_policy_decision_url_get(policy_decision));
498 debug_log("scheme:%s", ewk_policy_decision_scheme_get(policy_decision));
499 debug_log("cookie:%s", ewk_policy_decision_cookie_get(policy_decision));
500 debug_log("host:%s", ewk_policy_decision_host_get(policy_decision));
501 debug_log("response_mime:%s", ewk_policy_decision_response_mime_get(policy_decision));
503 char *url = (char *)ewk_policy_decision_url_get(policy_decision);
505 if ((strncmp(url, "http://", 7) == 0) ||
506 (strncmp(url, "https://", 8) == 0) ||
507 (strncmp(url, "ftp://", 6) == 0) ||
508 (strncmp(url, "mms://", 6) == 0) ||
509 (strncmp(url, "file://", 7) == 0) ||
510 (strncmp(url, "rtsp://", 7) == 0) ||
511 (strncmp(url, "wap://", 6) == 0)) {
513 service_h service = NULL;
514 ret = service_create(&service);
515 debug_log("service_create: %d", ret);
517 debug_log("service create failed");
520 ret = service_set_operation(service, SERVICE_OPERATION_VIEW);
521 debug_log("service_set_operation: %d", ret);
522 ret = service_set_uri(service, url);
523 debug_log("service_set_uri: %d", ret);
524 ret = service_send_launch_request(service, NULL, NULL);
525 debug_log("service_send_launch_request: %d", ret);
526 ret = service_destroy(service);
527 debug_log("service_destroy: %d", ret);
532 static void _composer_webview_contextmenu_customize_cb(void *data, Evas_Object *webview, void *event_info)
535 int i = 0, count = 0;
536 Eina_Bool sel = EINA_FALSE, has_content = EINA_FALSE;
537 Ewk_Context_Menu* contextmenu = (Ewk_Context_Menu*)event_info;
538 Ewk_Context_Menu_Item* menu_item = NULL;
539 Ewk_Context_Menu_Item_Tag menu_item_tag = EWK_CONTEXT_MENU_ITEM_TAG_NO_ACTION;
541 count = ewk_context_menu_item_count(contextmenu);
542 menu_item = ewk_context_menu_nth_item_get(contextmenu, 0);
543 menu_item_tag = ewk_context_menu_item_tag_get(menu_item);
544 debug_log("menu_item_tag : %d", menu_item_tag);
546 switch (menu_item_tag) {
547 case EWK_CONTEXT_MENU_ITEM_TAG_CUT: // selection
548 case EWK_CONTEXT_MENU_ITEM_TAG_SEARCH_WEB:
551 case EWK_CONTEXT_MENU_ITEM_TAG_PASTE: // no selection
552 case EWK_CONTEXT_MENU_ITEM_TAG_SELECT_ALL:
556 debug_log("No context menu");
560 for (i = 0; i < count; i++) {
561 menu_item = ewk_context_menu_nth_item_get(contextmenu, 0);
562 menu_item_tag = ewk_context_menu_item_tag_get(menu_item);
563 debug_log("menu_item_tag in for: %d", menu_item_tag);
564 if (menu_item_tag == EWK_CONTEXT_MENU_ITEM_TAG_SELECT_ALL) { // has content
565 has_content = EINA_TRUE;
567 ewk_context_menu_item_remove(contextmenu, menu_item);
570 debug_log("Sel = %d, Content = %d", sel, has_content);
572 if (sel == EINA_FALSE) {
573 if (has_content == EINA_FALSE) {
574 debug_log("no contents");
575 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_PASTE, _("IDS_EMAIL_OPT_PASTE"), EINA_TRUE);
576 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_CLIPBOARD, _("IDS_EMAIL_OPT_CLIPBOARD"), EINA_TRUE); // for Clipboard
577 ewk_context_menu_item_append(contextmenu, EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG, NULL, IMGDIR"/icon_search.png", EINA_TRUE);
579 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_SELECT_WORD, _("IDS_EMAIL_OPT_SELECT"), EINA_TRUE);
580 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_SELECT_ALL, _("IDS_EMAIL_OPT_SELECT_ALL"), EINA_TRUE);
581 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_PASTE, _("IDS_EMAIL_OPT_PASTE"), EINA_TRUE);
582 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_CLIPBOARD, _("IDS_EMAIL_OPT_CLIPBOARD"), EINA_TRUE); // for Clipboard
583 ewk_context_menu_item_append(contextmenu, EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG, NULL, IMGDIR"/icon_search.png", EINA_TRUE);
586 if (has_content == EINA_FALSE) {
587 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_COPY, _("IDS_EMAIL_OPT_COPY"), EINA_TRUE);
588 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_CUT, _("IDS_EMAIL_OPT_CUT"), EINA_TRUE);
589 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_CLIPBOARD, _("IDS_EMAIL_OPT_CLIPBOARD"), EINA_TRUE); // for Clipboard
590 ewk_context_menu_item_append(contextmenu, EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG, NULL, IMGDIR"/icon_search.png", EINA_TRUE);
592 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_COPY, _("IDS_EMAIL_OPT_COPY"), EINA_TRUE);
593 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_CUT, _("IDS_EMAIL_OPT_CUT"), EINA_TRUE);
594 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_PASTE, _("IDS_EMAIL_OPT_PASTE"), EINA_TRUE);
595 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_CLIPBOARD, _("IDS_EMAIL_OPT_CLIPBOARD"), EINA_TRUE); // for Clipboard
596 ewk_context_menu_item_append(contextmenu, EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG, NULL, IMGDIR"/icon_search.png", EINA_TRUE);
601 static void _composer_webview_contextmenu_selected_cb(void *data, Evas_Object *webview, void *event_info)
605 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
607 Ewk_Context_Menu_Item* menu_item = (Ewk_Context_Menu_Item*)event_info;
608 Ewk_Context_Menu_Item_Tag menu_item_tag = EWK_CONTEXT_MENU_ITEM_TAG_NO_ACTION;
610 debug_log("menu_item : %d", menu_item);
611 menu_item_tag = ewk_context_menu_item_tag_get(menu_item);
612 debug_log("menu_item_tag : %d", menu_item_tag);
614 switch (menu_item_tag) {
615 case EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG : //Smart search
617 service_h service = NULL;
618 const char *keyword = NULL;
619 keyword = ewk_view_text_selection_text_get(ugd->body_ewkview);
620 debug_log("keyword : %s", keyword);
622 service_create(&service);
623 service_set_operation(service, SERVICE_OPERATION_SEARCH);
624 service_add_extra_data(service, "http://tizen.org/appcontrol/data/keyword", keyword);
625 service_send_launch_request(service, NULL, NULL);
626 service_destroy(service);
630 debug_log("Never here!");
634 static void _composer_webkit_get_text_status_cb(void *data, Evas_Object *obj, void *event_info)
638 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
639 Ewk_Text_Style* textStyle = (Ewk_Text_Style *)event_info;
641 if ((ugd == NULL) || (textStyle == NULL)) {
645 int ms_x, ms_y, ms_w, ms_h;
647 ewk_text_style_position_get(textStyle, &sp, &ep);
648 debug_log("=================================================");
649 debug_log("1. Start Point : sp.x(%d), sp.y(%d)", sp.x, sp.y);
650 debug_log("1. End Point : ep.x(%d), ep.y(%d)", ep.x, ep.y);
651 debug_log("=================================================");
653 elm_scroller_region_get(ugd->main_scroller, &ms_x, &ms_y, &ms_w, &ms_h);
654 debug_log("1. main_scroller(ms_x:%d, ms_y:%d, ms_w:%d, ms_h:%d)", ms_x, ms_y, ms_w, ms_h);
656 int visible_area = 0;
657 int ewk_sc_x, ewk_sc_y;
658 Evas_Coord ewk_ct_w,ewk_ct_h;
659 ewk_view_scroll_pos_get(ugd->body_ewkview, &ewk_sc_x, &ewk_sc_y);
660 debug_log("ewk_view_scroll_pos_get(ewk_sc_x:%d, ewk_sc_y:%d)", ewk_sc_x, ewk_sc_y);
662 ewk_view_contents_size_get(ugd->body_ewkview, &ewk_ct_w, &ewk_ct_h);
663 debug_log("ewk_view_contents_size_get(ewk_ct_w:%d, ewk_ct_h:%d)", ewk_ct_w, ewk_ct_h);
665 if (ugd->isHorizontal == true) {
671 if (ugd->is_prediction == EINA_TRUE) {
672 visible_area = visible_area - COMPOSER_IME_PREDICTION_H;
675 debug_log("ugd->is_prediction : %d", ugd->is_prediction);
677 if (ms_y < 311 + COMPOSER_IME_PREDICTION_H) {
678 if (ep.y > visible_area) {
680 elm_scroller_region_show(ugd->main_scroller, ms_x, 10000, ms_w, ms_h);
681 ewk_view_scroll_set(ugd->body_ewkview, 0, ep.y - visible_area + ewk_sc_y);
683 elm_scroller_region_bring_in(ugd->main_scroller, ms_x, ep.y - visible_area + ms_y, ms_w, ms_h);
687 if (ep.y > visible_area) {
688 elm_scroller_region_show(ugd->main_scroller, ms_x, 10000, ms_w, ms_h);
689 ewk_view_scroll_set(ugd->body_ewkview, 0, ep.y - visible_area + ewk_sc_y);