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_script_executed_cb(Evas_Object *o, const char *result, void *data);
38 static void _composer_webkit_focused_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
39 static void _composer_webkit_unfocused_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
40 static void _composer_set_original_html_content_cb(Evas_Object *o, const char *result, void *data);
41 static void _composer_set_original_info_content_cb(Evas_Object *o, const char *result, void *data);
42 static void _composer_webkit_scroll_up_cb(void *data, Evas_Object *obj, void *event_info);
43 static void _composer_webkit_scroll_down_cb(void *data, Evas_Object *obj, void *event_info);
45 static void _composer_webkit_get_ime_rect_cb(void *data, Evas_Object *obj, void *event_info);
46 static void _composer_webkit_ime_closed_cb(void *data, Evas_Object *obj, void *event_info);
47 static void _composer_webkit_ime_opened_cb(void *data, Evas_Object *obj, void *event_info);
48 static void _composer_webview_policy_navigation_decide_cb(void *data, Evas_Object *obj, void *event_info);
49 static void _composer_webview_contextmenu_customize_cb(void *data, Evas_Object *webview, void *event_info);
50 static void _composer_webview_contextmenu_selected_cb(void *data, Evas_Object *webview, void *event_info);
51 static void _composer_webkit_get_text_status_cb(void *data, Evas_Object *obj, void *event_info);
54 static void _changed_cb(void *data, Evas_Object *obj, void *event_info) // This callback is for showing(hiding) X marked button.
58 if (elm_object_focus_get(data)) {
59 if (elm_entry_is_empty(obj))
60 elm_object_signal_emit(data, "elm,state,eraser,hide", "elm");
62 elm_object_signal_emit(data, "elm,state,eraser,show", "elm");
66 static void _focused_cb(void *data, Evas_Object *obj, void *event_info) // Focused callback will show X marked button and hide guidetext.
70 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
72 debug_log("ugd->focus_status = %d", ugd->focus_status);
74 if (COMPOSER_FOCUS_STATUS_NONE == ugd->focus_status) {
75 if (!elm_entry_is_empty(obj))
76 elm_object_signal_emit(ugd->subject_editfield, "elm,state,eraser,show", "elm");
77 elm_object_signal_emit(ugd->subject_editfield, "elm,state,guidetext,hide", "elm");
79 _composer_attachment_contract_items(ugd);
81 elm_entry_input_panel_show(obj);
83 ugd->selected_entry = ugd->subject_entry;
84 elm_layout_sizing_eval(ugd->c_layout);
86 if (ugd->selected_entry == ugd->body_ewkview) {
87 elm_object_focus_set(ugd->subject_entry, EINA_FALSE);
92 static void _unfocused_cb(void *data, Evas_Object *obj, void *event_info) // Unfocused callback will show guidetext and hide X marked button.
95 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
97 if (ugd->focus_status == COMPOSER_FOCUS_STATUS_SELECTED) {
98 elm_object_tree_focus_allow_set(ugd->c_layout, EINA_FALSE); // block the focus not to open IME.
99 ugd->focus_status = COMPOSER_FOCUS_STATUS_NONE;
103 if (elm_entry_is_empty(obj))
104 elm_object_signal_emit(ugd->subject_editfield, "elm,state,guidetext,show", "elm");
105 elm_object_signal_emit(ugd->subject_editfield, "elm,state,eraser,hide", "elm");
107 elm_entry_input_panel_hide(obj);
110 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.
114 elm_entry_entry_set(data, "");
117 void _composer_content_create_content_field(Evas_Object *parent, EmailComposerUGD *ugd)
121 /* Create Subject field */
122 _composer_create_subject_field(parent, ugd);
124 /* Create Body field */
125 _composer_create_body_field(parent, ugd);
128 void _composer_create_subject_field(Evas_Object *parent, EmailComposerUGD *ugd)
134 ly = _composer_create_subject_editfield(parent, dgettext("sys_string", "IDS_COM_BODY_SUBJECT"), ugd);
136 _composer_register_editfield_entry_callback(ugd->subject_entry, ugd);
138 evas_object_smart_callback_add(ugd->subject_entry, "changed", _changed_cb, ugd->subject_editfield);
139 evas_object_smart_callback_add(ugd->subject_entry, "focused", _focused_cb, ugd);
140 evas_object_smart_callback_add(ugd->subject_entry, "unfocused", _unfocused_cb, ugd);
141 elm_object_signal_callback_add(ugd->subject_editfield, "elm,eraser,clicked", "elm", _eraser_clicked_cb, ugd->subject_entry);
143 elm_object_part_content_set(parent, "subject_field", ly);
145 ugd->subject_ly = ly;
148 Evas_Object *_composer_create_subject_editfield(Evas_Object *parent, char *title, EmailComposerUGD *ugd)
154 Evas_Object *entry = NULL;
156 ly = elm_layout_add(parent);
158 elm_layout_file_set(ly, COMPOSER_EDJ_NAME, "layout.subject");
159 evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
160 evas_object_size_hint_align_set(ly, EVAS_HINT_FILL, EVAS_HINT_FILL);
161 evas_object_show(ly);
163 ef = elm_layout_add(parent);
164 elm_layout_theme_set(ef, "layout", "editfield", "default");
165 evas_object_size_hint_weight_set(ef, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
166 evas_object_size_hint_align_set(ef, EVAS_HINT_FILL, EVAS_HINT_FILL);
167 evas_object_show(ef);
169 elm_object_part_text_set(ef, "elm.guidetext", title);
170 elm_object_part_content_set(ly, "subject.editfield", ef);
171 ugd->subject_editfield = ef;
173 entry = elm_entry_add(ef);
174 elm_entry_scrollable_set(entry, EINA_TRUE);
175 elm_entry_single_line_set(entry, EINA_TRUE);
176 elm_entry_input_panel_layout_set(entry, ELM_INPUT_PANEL_LAYOUT_NORMAL);
177 elm_entry_cnp_mode_set(entry, ELM_CNP_MODE_PLAINTEXT);
178 evas_object_show(entry);
179 elm_entry_text_style_user_push(entry, "DEFAULT='font_size=32 color=#000000'");
181 elm_object_part_content_set(ef, "elm.swallow.content", entry);
182 ugd->subject_entry = entry;
187 void _composer_create_body_field(Evas_Object *parent, EmailComposerUGD *ugd)
191 Evas_Object *body_ly;
193 body_ly = _composer_create_body_webview(parent, NULL, ugd);
195 elm_object_part_content_set(parent, "content_field", body_ly);
197 ugd->webkit_ly = body_ly;
200 void _composer_register_editfield_entry_callback(Evas_Object *obj, EmailComposerUGD *ugd)
204 evas_object_smart_callback_add(obj, "changed", _composer_edit_field_changed_cb, ugd);
205 evas_object_smart_callback_add(obj, "preedit,changed", _composer_edit_field_changed_cb, ugd);
207 Ecore_IMF_Context *imf_context = elm_entry_imf_context_get(obj);
208 ecore_imf_context_input_panel_event_callback_add (imf_context, ECORE_IMF_INPUT_PANEL_GEOMETRY_EVENT, _composer_input_panel_resize_cb, ugd);
209 ecore_imf_context_input_panel_event_callback_add(imf_context, ECORE_IMF_INPUT_PANEL_STATE_EVENT, _composer_input_panel_state_changed_cb, ugd);
210 debug_log("ugd->is_prediction: %d", ugd->is_prediction);
213 void _composer_webkit_set_body_script(void *data)
216 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
221 _composer_webkit_script_executed_cb(NULL, NULL, ugd);
224 Evas_Object *_composer_create_body_webview(Evas_Object *parent, char *title, EmailComposerUGD *ugd)
230 ly = elm_layout_add(parent);
232 elm_layout_file_set(ly, COMPOSER_EDJ_NAME, "layout.webkit");
233 evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
234 evas_object_size_hint_align_set(ly, EVAS_HINT_FILL, EVAS_HINT_FILL);
235 evas_object_show(ly);
237 ugd->body_ewkview = ewk_view_add(evas_object_evas_get(parent));
238 evas_object_size_hint_weight_set(ugd->body_ewkview, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
239 evas_object_size_hint_align_set(ugd->body_ewkview, EVAS_HINT_FILL, EVAS_HINT_FILL);
240 ewk_view_vertical_panning_hold_set(ugd->body_ewkview, EINA_TRUE);
242 elm_object_part_content_set(ly, "webkit.swallow", ugd->body_ewkview);
244 evas_object_smart_callback_add(ugd->body_ewkview, "edge,top", _composer_webview_reach_top_cb, ugd);
245 evas_object_smart_callback_add(ugd->body_ewkview, "edge,bottom", _composer_webview_reach_bottom_cb, ugd);
247 evas_object_event_callback_add(ugd->body_ewkview, EVAS_CALLBACK_MOUSE_DOWN, _composer_webview_mouse_down_cb, ugd);
249 Ewk_Settings *ewkSetting = NULL;
250 ewkSetting = ewk_view_settings_get(ugd->body_ewkview);
252 if (NULL == ewkSetting)
253 debug_log("ewkSetting is NULL.");
255 ewk_settings_uses_encoding_detector_set(ewkSetting, EINA_TRUE);
257 evas_object_smart_callback_add(ugd->body_ewkview, "load,finished", _composer_webkit_loadFinished_cb, ugd);
258 evas_object_smart_callback_add(ugd->body_ewkview, "policy,navigation,decide", _composer_webview_policy_navigation_decide_cb, ugd);
259 evas_object_smart_callback_add(ugd->body_ewkview, "scroll,up", _composer_webkit_scroll_up_cb, ugd);
260 evas_object_smart_callback_add(ugd->body_ewkview, "scroll,down", _composer_webkit_scroll_down_cb, ugd);
261 evas_object_smart_callback_add(ugd->body_ewkview, "contextmenu,customize", _composer_webview_contextmenu_customize_cb, ugd);
262 evas_object_smart_callback_add(ugd->body_ewkview, "contextmenu,selected", _composer_webview_contextmenu_selected_cb, ugd);
263 evas_object_smart_callback_add(ugd->body_ewkview, "editorclient,ime,closed", _composer_webkit_ime_closed_cb, ugd);
264 evas_object_smart_callback_add(ugd->body_ewkview, "editorclient,ime,opened", _composer_webkit_ime_opened_cb, ugd);
265 evas_object_smart_callback_add(ugd->body_ewkview, "text,style,state", _composer_webkit_get_text_status_cb, ugd);
266 evas_object_smart_callback_add(ugd->body_ewkview, "inputmethod,changed", _composer_webkit_get_ime_rect_cb, ugd);
268 evas_object_event_callback_add(ugd->body_ewkview, EVAS_CALLBACK_FOCUS_IN, _composer_webkit_focused_cb, ugd);
269 evas_object_event_callback_add(ugd->body_ewkview, EVAS_CALLBACK_FOCUS_OUT, _composer_webkit_unfocused_cb, ugd);
274 void _composer_webview_mouse_down_cb(void *data, Evas * evas, Evas_Object *obj, void *event_info)
279 void _composer_webview_mouse_move_cb(void *data, Evas * evas, Evas_Object *obj, void *event_info)
284 void _composer_webview_mouse_up_cb(void *data, Evas * evas, Evas_Object *obj, void *event_info)
289 static void _composer_webkit_script_executed_cb(Evas_Object *o, const char *result, void *data)
293 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
295 if (ewk_view_script_execute(ugd->body_ewkview, COMPOSER_JS_GET_LATEST_HTML_CONTENT, _composer_set_original_html_content_cb, (void *)ugd) == EINA_FALSE)
296 debug_log("COMPOSER_JS_GET_ORIGINAL_HTML_CONTENT failed.");
297 if (ewk_view_script_execute(ugd->body_ewkview, COMPOSER_JS_GET_LATEST_INFO_CONTENT, _composer_set_original_info_content_cb, (void *)ugd) == EINA_FALSE)
298 debug_log("COMPOSER_JS_GET_ORIGINAL_INFO_CONTENT failed.");
301 void _composer_webkit_loadFinished_cb(void *data, Evas_Object *obj, void *event_info)
305 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
307 _composer_webkit_set_body_script(data);
309 Ewk_Settings *ewkSetting = NULL;
310 ewkSetting = ewk_view_settings_get(ugd->body_ewkview);
312 if (ewkSetting == NULL)
313 debug_log("ewkSetting is NULL.");
315 ewk_settings_auto_fitting_set(ewkSetting, EINA_TRUE);
316 ewk_settings_editable_link_behavior_set(ewkSetting, EWK_EDITABLE_LINK_BEHAVIOR_NEVER_LIVE);
318 if (ugd->selected_entry == ugd->body_ewkview) {
319 // focus to the body field when reply the email.
320 evas_object_focus_set(ugd->body_ewkview, EINA_TRUE);
323 elm_object_disabled_set(ugd->cancel_btn, EINA_FALSE);
324 elm_object_disabled_set(ugd->cancel_btm_btn, EINA_FALSE);
325 ugd->b_load_finished = EINA_TRUE;
328 static void _composer_webkit_focused_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
332 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
334 debug_log("Webkit focused");
338 _composer_ps_stop(ugd);
339 ugd->sc_timer = ecore_timer_add(0.5, _composer_ps_scroll_pop, ugd);
342 debug_log("selected_entry = %x, to_mbe_entry = %x, cc_mbe_entry = %x, bcc_mbe_entry = %x, subject_entry = %x, body_ewkview = %x",
343 ugd->selected_entry, ugd->to_mbe_entry, ugd->cc_mbe_entry, ugd->bcc_mbe_entry, ugd->subject_entry, ugd->body_ewkview);
345 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);
347 if (EINA_TRUE == elm_object_focus_get(ugd->to_mbe)) {
349 elm_object_focus_set(ugd->to_mbe, EINA_FALSE);
351 else if (EINA_TRUE == elm_object_focus_get(ugd->cc_mbe)) {
353 elm_object_focus_set(ugd->cc_mbe, EINA_FALSE);
355 else if (EINA_TRUE == elm_object_focus_get(ugd->bcc_mbe)) {
356 debug_log("bcc_mbe");
357 elm_object_focus_set(ugd->bcc_mbe, EINA_FALSE);
359 else if (EINA_TRUE == elm_object_focus_get(ugd->subject_entry)) {
360 debug_log("subject_entry");
361 elm_object_focus_set(ugd->subject_entry, EINA_FALSE);
364 ugd->selected_entry = ugd->body_ewkview;
365 evas_object_focus_set(ugd->body_ewkview, EINA_TRUE);
367 ugd->focus_status = COMPOSER_FOCUS_STATUS_NONE; // focus handling when rte is clicked
368 _composer_attachment_contract_items(ugd);
370 elm_layout_sizing_eval(ugd->c_layout);
371 if (ewk_view_script_execute(ugd->body_ewkview, COMPOSER_JS_SET_FOCUS, _composer_script_executed_cb, NULL) == EINA_FALSE)
372 debug_log("COMPOSER_JS_SET_FOCUS failed.");
375 static void _composer_webkit_unfocused_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
379 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
381 debug_log("selected_entry = %x, to_mbe_entry = %x, cc_mbe_entry = %x, bcc_mbe_entry = %x, subject_entry = %x, body_ewkview = %x",
382 ugd->selected_entry, ugd->to_mbe_entry, ugd->cc_mbe_entry, ugd->bcc_mbe_entry, ugd->subject_entry, ugd->body_ewkview);
384 if (ugd->selected_entry == ugd->body_ewkview) {
385 debug_log("Webkit unfocused");
386 evas_object_focus_set(ugd->body_ewkview, EINA_FALSE);
388 if (ugd->focus_status == COMPOSER_FOCUS_STATUS_SELECTED) {
389 elm_object_tree_focus_allow_set(ugd->c_layout, EINA_FALSE); // block the focus not to open IME.
394 void _composer_webview_reach_top_cb(void *data, Evas_Object *obj, void *event_info)
398 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
400 if (ugd->is_webview_scrolling) {
401 debug_log("main scroller start");
402 ewk_view_vertical_panning_hold_set(ugd->body_ewkview, EINA_TRUE);
404 if (elm_widget_scroll_freeze_get(ugd->main_scroller) > 0)
405 elm_object_scroll_freeze_pop(ugd->main_scroller);
407 /* WORKAROUND. To fix scrolling problem when screen is on the bottom of webview. (Do panning to top fast) */
409 elm_scroller_region_get(ugd->main_scroller, &x, &y, &w, &h);
410 debug_log("main_scroller(x:%d, y:%d, w:%d, h:%d)", x, y, w, h);
411 elm_scroller_region_bring_in(ugd->main_scroller, x, 0, w, h);
413 ugd->is_main_scroller_scrolling = EINA_TRUE;
414 ugd->is_webview_scrolling = EINA_FALSE;
417 if (ugd->temporary_fix_for_rotation)
418 ugd->temporary_fix_for_rotation = false;
421 void _composer_webview_reach_bottom_cb(void *data, Evas_Object *obj, void *event_info)
425 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
427 if (ugd->temporary_fix_for_rotation) {
428 if (elm_widget_scroll_freeze_get(ugd->main_scroller) > 0)
429 elm_object_scroll_freeze_pop(ugd->main_scroller);
430 ugd->temporary_fix_for_rotation = false;
434 static void _composer_set_original_html_content_cb(Evas_Object *o, const char *result, void *data)
438 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
440 if (result != NULL) {
441 ugd->original_html_content = g_strdup(result);
442 debug_log("ugd->original_html_content => \n%s", ugd->original_html_content);
445 if (ewk_view_script_execute(ugd->body_ewkview, COMPOSER_JS_ENABLE_EDITABLE, _composer_script_executed_cb, NULL) == EINA_FALSE)
446 debug_log("COMPOSER_JS_ENABLE_EDITABLE failed.");
449 static void _composer_set_original_info_content_cb(Evas_Object *o, const char *result, void *data)
453 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
455 if (result != NULL) {
456 if (ugd->original_info_content) {
457 g_free(ugd->original_info_content);
458 ugd->original_info_content = NULL;
460 ugd->original_info_content = g_strdup(result);
461 debug_log("ugd->original_info_content => \n%s", ugd->original_info_content);
465 static void _composer_webkit_scroll_up_cb(void *data, Evas_Object *obj, void *event_info)
470 static void _composer_webkit_scroll_down_cb(void *data, Evas_Object *obj, void *event_info)
475 static void _composer_webkit_ime_closed_cb(void *data, Evas_Object *obj, void *event_info)
479 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
480 _composer_resize_body_webview(ugd, 0);
482 elm_object_item_signal_emit(ugd->navi_item, "elm,state,sip,hidden", "");
483 ugd->is_ime_hided = true;
486 static void _composer_webkit_ime_opened_cb(void *data, Evas_Object *obj, void *event_info)
489 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
491 if (ugd->isRotated == true) {
492 _composer_region_show_cb(ugd);
493 ugd->isRotated = false;
496 elm_object_item_signal_emit(ugd->navi_item, "elm,state,sip,shown", "");
497 ugd->is_ime_hided = false;
500 static void _composer_webkit_get_ime_rect_cb(void *data, Evas_Object *obj, void *event_info)
503 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
504 Eina_Rectangle *rect = (Eina_Rectangle*)event_info;
505 debug_log("inputmethod,changed (x:%d,y:%d,w:%d,h:%d)\n", rect->x, rect->y, rect->w, rect->h);
507 _composer_resize_body_webview(ugd, rect->h);
510 static void _composer_webview_policy_navigation_decide_cb(void *data, Evas_Object *obj, void *event_info)
514 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
516 const char *uri = NULL;
517 uri = ewk_view_url_get(ugd->body_ewkview);
518 debug_log("ewk_view_url_get(%s)", uri);
520 if (ugd->b_load_finished == EINA_TRUE) {
521 Ewk_Policy_Decision *policy_decision = (Ewk_Policy_Decision *)event_info;
522 ewk_policy_decision_ignore(policy_decision);
524 debug_log("url:%s", ewk_policy_decision_url_get(policy_decision));
525 debug_log("scheme:%s", ewk_policy_decision_scheme_get(policy_decision));
526 debug_log("cookie:%s", ewk_policy_decision_cookie_get(policy_decision));
527 debug_log("host:%s", ewk_policy_decision_host_get(policy_decision));
528 debug_log("response_mime:%s", ewk_policy_decision_response_mime_get(policy_decision));
530 char *url = (char *)ewk_policy_decision_url_get(policy_decision);
532 if ((strncmp(url, "http://", 7) == 0) ||
533 (strncmp(url, "https://", 8) == 0) ||
534 (strncmp(url, "ftp://", 6) == 0) ||
535 (strncmp(url, "mms://", 6) == 0) ||
536 (strncmp(url, "file://", 7) == 0) ||
537 (strncmp(url, "rtsp://", 7) == 0) ||
538 (strncmp(url, "wap://", 6) == 0)) {
540 service_h service = NULL;
541 ret = service_create(&service);
542 debug_log("service_create: %d", ret);
544 debug_log("service create failed");
547 ret = service_set_operation(service, SERVICE_OPERATION_VIEW);
548 debug_log("service_set_operation: %d", ret);
549 ret = service_set_uri(service, url);
550 debug_log("service_set_uri: %d", ret);
551 ret = service_send_launch_request(service, NULL, NULL);
552 debug_log("service_send_launch_request: %d", ret);
553 ret = service_destroy(service);
554 debug_log("service_destroy: %d", ret);
559 static void _composer_webview_contextmenu_customize_cb(void *data, Evas_Object *webview, void *event_info)
562 int i = 0, count = 0;
563 Eina_Bool sel = EINA_FALSE, has_content = EINA_FALSE;
564 Ewk_Context_Menu* contextmenu = (Ewk_Context_Menu*)event_info;
565 Ewk_Context_Menu_Item* menu_item = NULL;
566 Ewk_Context_Menu_Item_Tag menu_item_tag = EWK_CONTEXT_MENU_ITEM_TAG_NO_ACTION;
568 count = ewk_context_menu_item_count(contextmenu);
569 menu_item = ewk_context_menu_nth_item_get(contextmenu, 0);
570 menu_item_tag = ewk_context_menu_item_tag_get(menu_item);
571 debug_log("menu_item_tag : %d", menu_item_tag);
573 switch (menu_item_tag) {
574 case EWK_CONTEXT_MENU_ITEM_TAG_CUT: // selection
575 case EWK_CONTEXT_MENU_ITEM_TAG_SEARCH_WEB:
578 case EWK_CONTEXT_MENU_ITEM_TAG_PASTE: // no selection
579 case EWK_CONTEXT_MENU_ITEM_TAG_SELECT_ALL:
583 debug_log("No context menu");
587 for (i = 0; i < count; i++) {
588 menu_item = ewk_context_menu_nth_item_get(contextmenu, 0);
589 menu_item_tag = ewk_context_menu_item_tag_get(menu_item);
590 debug_log("menu_item_tag in for: %d", menu_item_tag);
591 if (menu_item_tag == EWK_CONTEXT_MENU_ITEM_TAG_SELECT_ALL) { // has content
592 has_content = EINA_TRUE;
594 ewk_context_menu_item_remove(contextmenu, menu_item);
597 debug_log("Sel = %d, Content = %d", sel, has_content);
599 if (sel == EINA_FALSE) {
600 if (has_content == EINA_FALSE) {
601 debug_log("no contents");
602 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_PASTE, _("IDS_EMAIL_OPT_PASTE"), EINA_TRUE);
603 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_CLIPBOARD, _("IDS_EMAIL_OPT_CLIPBOARD"), EINA_TRUE); // for Clipboard
604 ewk_context_menu_item_append(contextmenu, EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG, NULL, IMGDIR"/icon_search.png", EINA_TRUE);
606 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_SELECT_WORD, _("IDS_EMAIL_OPT_SELECT"), EINA_TRUE);
607 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_SELECT_ALL, _("IDS_EMAIL_OPT_SELECT_ALL"), EINA_TRUE);
608 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_PASTE, _("IDS_EMAIL_OPT_PASTE"), EINA_TRUE);
609 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_CLIPBOARD, _("IDS_EMAIL_OPT_CLIPBOARD"), EINA_TRUE); // for Clipboard
610 ewk_context_menu_item_append(contextmenu, EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG, NULL, IMGDIR"/icon_search.png", EINA_TRUE);
613 if (has_content == EINA_FALSE) {
614 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_COPY, _("IDS_EMAIL_OPT_COPY"), EINA_TRUE);
615 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_CUT, _("IDS_EMAIL_OPT_CUT"), EINA_TRUE);
616 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_CLIPBOARD, _("IDS_EMAIL_OPT_CLIPBOARD"), EINA_TRUE); // for Clipboard
617 ewk_context_menu_item_append(contextmenu, EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG, NULL, IMGDIR"/icon_search.png", EINA_TRUE);
619 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_COPY, _("IDS_EMAIL_OPT_COPY"), EINA_TRUE);
620 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_CUT, _("IDS_EMAIL_OPT_CUT"), EINA_TRUE);
621 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_PASTE, _("IDS_EMAIL_OPT_PASTE"), EINA_TRUE);
622 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_CLIPBOARD, _("IDS_EMAIL_OPT_CLIPBOARD"), EINA_TRUE); // for Clipboard
623 ewk_context_menu_item_append(contextmenu, EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG, NULL, IMGDIR"/icon_search.png", EINA_TRUE);
628 static void _composer_webview_contextmenu_selected_cb(void *data, Evas_Object *webview, void *event_info)
632 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
634 Ewk_Context_Menu_Item* menu_item = (Ewk_Context_Menu_Item*)event_info;
635 Ewk_Context_Menu_Item_Tag menu_item_tag = EWK_CONTEXT_MENU_ITEM_TAG_NO_ACTION;
637 debug_log("menu_item : %d", menu_item);
638 menu_item_tag = ewk_context_menu_item_tag_get(menu_item);
639 debug_log("menu_item_tag : %d", menu_item_tag);
641 switch (menu_item_tag) {
642 case EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG : //Smart search
644 service_h service = NULL;
645 const char *keyword = NULL;
646 keyword = ewk_view_text_selection_text_get(ugd->body_ewkview);
647 debug_log("keyword : %s", keyword);
649 service_create(&service);
650 service_set_operation(service, SERVICE_OPERATION_SEARCH);
651 service_add_extra_data(service, "http://tizen.org/appcontrol/data/keyword", keyword);
652 service_send_launch_request(service, NULL, NULL);
653 service_destroy(service);
657 debug_log("Never here!");
661 static void _composer_webkit_get_text_status_cb(void *data, Evas_Object *obj, void *event_info)
665 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
666 Ewk_Text_Style* textStyle = (Ewk_Text_Style *)event_info;
668 if ((ugd == NULL) || (textStyle == NULL)) {
672 int ms_x, ms_y, ms_w, ms_h;
674 ewk_text_style_position_get(textStyle, &sp, &ep);
675 debug_log("=================================================");
676 debug_log("1. Start Point : sp.x(%d), sp.y(%d)", sp.x, sp.y);
677 debug_log("1. End Point : ep.x(%d), ep.y(%d)", ep.x, ep.y);
678 debug_log("=================================================");
680 elm_scroller_region_get(ugd->main_scroller, &ms_x, &ms_y, &ms_w, &ms_h);
681 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);
683 int visible_area = 0;
684 int ewk_sc_x, ewk_sc_y;
685 Evas_Coord ewk_ct_w,ewk_ct_h;
686 ewk_view_scroll_pos_get(ugd->body_ewkview, &ewk_sc_x, &ewk_sc_y);
687 debug_log("ewk_view_scroll_pos_get(ewk_sc_x:%d, ewk_sc_y:%d)", ewk_sc_x, ewk_sc_y);
689 ewk_view_contents_size_get(ugd->body_ewkview, &ewk_ct_w, &ewk_ct_h);
690 debug_log("ewk_view_contents_size_get(ewk_ct_w:%d, ewk_ct_h:%d)", ewk_ct_w, ewk_ct_h);
692 if (ugd->isHorizontal == true) {
698 if (ugd->is_prediction == EINA_TRUE) {
699 visible_area = visible_area - COMPOSER_IME_PREDICTION_H;
702 debug_log("ugd->is_prediction : %d", ugd->is_prediction);
704 if (ms_y < 311 + COMPOSER_IME_PREDICTION_H) {
705 if (ep.y > visible_area) {
707 elm_scroller_region_show(ugd->main_scroller, ms_x, 10000, ms_w, ms_h);
708 ewk_view_scroll_set(ugd->body_ewkview, 0, ep.y - visible_area + ewk_sc_y);
710 elm_scroller_region_bring_in(ugd->main_scroller, ms_x, ep.y - visible_area + ms_y, ms_w, ms_h);
714 if (ep.y > visible_area) {
715 elm_scroller_region_show(ugd->main_scroller, ms_x, 10000, ms_w, ms_h);
716 ewk_view_scroll_set(ugd->body_ewkview, 0, ep.y - visible_area + ewk_sc_y);