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);
32 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);
36 void _composer_webkit_loadFinished_cb(void *data, Evas_Object *obj, void *event_info);
38 static void _composer_webkit_script_executed_cb(Evas_Object *o, const char *result, void *data);
39 static void _composer_webkit_focused_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
40 static void _composer_webkit_unfocused_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
41 static void _composer_set_original_html_content_cb(Evas_Object *o, const char *result, void *data);
42 static void _composer_set_original_info_content_cb(Evas_Object *o, const char *result, void *data);
43 static void _composer_webkit_scroll_up_cb(void *data, Evas_Object *obj, void *event_info);
44 static void _composer_webkit_scroll_down_cb(void *data, Evas_Object *obj, void *event_info);
46 static void _composer_webkit_get_ime_rect_cb(void *data, Evas_Object *obj, void *event_info);
47 static void _composer_webkit_ime_closed_cb(void *data, Evas_Object *obj, void *event_info);
48 static void _composer_webkit_ime_opened_cb(void *data, Evas_Object *obj, void *event_info);
49 static void _composer_webview_policy_navigation_decide_cb(void *data, Evas_Object *obj, void *event_info);
50 static void _composer_webview_contextmenu_customize_cb(void *data, Evas_Object *webview, void *event_info);
51 static void _composer_webview_contextmenu_selected_cb(void *data, Evas_Object *webview, void *event_info);
52 static void _composer_webkit_get_text_status_cb(void *data, Evas_Object *obj, void *event_info);
55 static void _changed_cb(void *data, Evas_Object *obj, void *event_info) // This callback is for showing(hiding) X marked button.
59 if (elm_object_focus_get(data)) {
60 if (elm_entry_is_empty(obj))
61 elm_object_signal_emit(data, "elm,state,eraser,hide", "elm");
63 elm_object_signal_emit(data, "elm,state,eraser,show", "elm");
67 static void _focused_cb(void *data, Evas_Object *obj, void *event_info) // Focused callback will show X marked button and hide guidetext.
71 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
73 debug_log("ugd->focus_status = %d", ugd->focus_status);
75 if (COMPOSER_FOCUS_STATUS_NONE == ugd->focus_status) {
76 if (!elm_entry_is_empty(obj))
77 elm_object_signal_emit(ugd->subject_editfield, "elm,state,eraser,show", "elm");
78 elm_object_signal_emit(ugd->subject_editfield, "elm,state,guidetext,hide", "elm");
80 _composer_attachment_contract_items(ugd);
82 elm_entry_input_panel_show(obj);
84 ugd->selected_entry = ugd->subject_entry;
85 elm_layout_sizing_eval(ugd->c_layout);
87 if (ugd->selected_entry == ugd->body_ewkview) {
88 elm_object_focus_set(ugd->subject_entry, EINA_FALSE);
93 static void _unfocused_cb(void *data, Evas_Object *obj, void *event_info) // Unfocused callback will show guidetext and hide X marked button.
96 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
98 if (ugd->focus_status == COMPOSER_FOCUS_STATUS_SELECTED) {
99 elm_object_tree_focus_allow_set(ugd->c_layout, EINA_FALSE); // block the focus not to open IME.
100 ugd->focus_status = COMPOSER_FOCUS_STATUS_NONE;
104 if (elm_entry_is_empty(obj))
105 elm_object_signal_emit(ugd->subject_editfield, "elm,state,guidetext,show", "elm");
106 elm_object_signal_emit(ugd->subject_editfield, "elm,state,eraser,hide", "elm");
108 elm_entry_input_panel_hide(obj);
111 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.
115 elm_entry_entry_set(data, "");
118 void _composer_content_create_content_field(Evas_Object *parent, EmailComposerUGD *ugd)
122 /* Create Subject field */
123 _composer_create_subject_field(parent, ugd);
125 /* Create Body field */
126 _composer_create_body_field(parent, ugd);
129 void _composer_create_subject_field(Evas_Object *parent, EmailComposerUGD *ugd)
135 ly = _composer_create_subject_editfield(parent, dgettext("sys_string", "IDS_COM_BODY_SUBJECT"), ugd);
137 _composer_register_editfield_entry_callback(ugd->subject_entry, ugd);
139 evas_object_smart_callback_add(ugd->subject_entry, "changed", _changed_cb, ugd->subject_editfield);
140 evas_object_smart_callback_add(ugd->subject_entry, "focused", _focused_cb, ugd);
141 evas_object_smart_callback_add(ugd->subject_entry, "unfocused", _unfocused_cb, ugd);
142 elm_object_signal_callback_add(ugd->subject_editfield, "elm,eraser,clicked", "elm", _eraser_clicked_cb, ugd->subject_entry);
144 elm_object_part_content_set(parent, "subject_field", ly);
146 ugd->subject_ly = ly;
149 Evas_Object *_composer_create_subject_editfield(Evas_Object *parent, char *title, EmailComposerUGD *ugd)
155 Evas_Object *entry = NULL;
157 ly = elm_layout_add(parent);
159 elm_layout_file_set(ly, COMPOSER_EDJ_NAME, "layout.subject");
160 evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
161 evas_object_size_hint_align_set(ly, EVAS_HINT_FILL, EVAS_HINT_FILL);
162 evas_object_show(ly);
164 ef = elm_layout_add(parent);
165 elm_layout_theme_set(ef, "layout", "editfield", "default");
166 evas_object_size_hint_weight_set(ef, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
167 evas_object_size_hint_align_set(ef, EVAS_HINT_FILL, EVAS_HINT_FILL);
168 evas_object_show(ef);
170 elm_object_part_text_set(ef, "elm.guidetext", title);
171 elm_object_part_content_set(ly, "subject.editfield", ef);
172 ugd->subject_editfield = ef;
174 entry = elm_entry_add(ef);
175 elm_entry_scrollable_set(entry, EINA_TRUE);
176 elm_entry_single_line_set(entry, EINA_TRUE);
177 elm_entry_input_panel_layout_set(entry, ELM_INPUT_PANEL_LAYOUT_NORMAL);
178 elm_entry_prediction_allow_set(entry, EINA_TRUE);
179 elm_entry_autocapital_type_set(entry, ELM_AUTOCAPITAL_TYPE_SENTENCE);
180 elm_entry_cnp_mode_set(entry, ELM_CNP_MODE_PLAINTEXT);
181 evas_object_show(entry);
182 elm_entry_text_style_user_push(entry, "DEFAULT='font_size=32 color=#000000'");
184 elm_object_part_content_set(ef, "elm.swallow.content", entry);
185 ugd->subject_entry = entry;
190 void _composer_create_body_field(Evas_Object *parent, EmailComposerUGD *ugd)
194 Evas_Object *body_ly;
196 body_ly = _composer_create_body_webview(parent, NULL, ugd);
198 elm_object_part_content_set(parent, "content_field", body_ly);
200 ugd->webkit_ly = body_ly;
203 void _composer_register_editfield_entry_callback(Evas_Object *obj, EmailComposerUGD *ugd)
207 evas_object_smart_callback_add(obj, "changed", _composer_edit_field_changed_cb, ugd);
208 evas_object_smart_callback_add(obj, "preedit,changed", _composer_edit_field_changed_cb, ugd);
210 Ecore_IMF_Context *imf_context = elm_entry_imf_context_get(obj);
211 ecore_imf_context_input_panel_event_callback_add (imf_context, ECORE_IMF_INPUT_PANEL_GEOMETRY_EVENT, _composer_input_panel_resize_cb, ugd);
212 ecore_imf_context_input_panel_event_callback_add(imf_context, ECORE_IMF_INPUT_PANEL_STATE_EVENT, _composer_input_panel_state_changed_cb, ugd);
213 debug_log("ugd->is_prediction: %d", ugd->is_prediction);
216 void _composer_webkit_set_body_script(void *data)
219 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
224 _composer_webkit_script_executed_cb(NULL, NULL, ugd);
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 static void _composer_webkit_script_executed_cb(Evas_Object *o, const char *result, void *data)
296 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
298 if (ewk_view_script_execute(ugd->body_ewkview, COMPOSER_JS_GET_LATEST_HTML_CONTENT, _composer_set_original_html_content_cb, (void *)ugd) == EINA_FALSE)
299 debug_log("COMPOSER_JS_GET_ORIGINAL_HTML_CONTENT failed.");
300 if (ewk_view_script_execute(ugd->body_ewkview, COMPOSER_JS_GET_LATEST_INFO_CONTENT, _composer_set_original_info_content_cb, (void *)ugd) == EINA_FALSE)
301 debug_log("COMPOSER_JS_GET_ORIGINAL_INFO_CONTENT failed.");
304 void _composer_webkit_loadFinished_cb(void *data, Evas_Object *obj, void *event_info)
308 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
310 _composer_webkit_set_body_script(data);
312 Ewk_Settings *ewkSetting = NULL;
313 ewkSetting = ewk_view_settings_get(ugd->body_ewkview);
315 if (ewkSetting == NULL)
316 debug_log("ewkSetting is NULL.");
318 ewk_settings_auto_fitting_set(ewkSetting, EINA_TRUE);
319 ewk_settings_editable_link_behavior_set(ewkSetting, EWK_EDITABLE_LINK_BEHAVIOR_NEVER_LIVE);
321 if (ugd->selected_entry == ugd->body_ewkview) {
322 // focus to the body field when reply the email.
323 evas_object_focus_set(ugd->body_ewkview, EINA_TRUE);
326 elm_object_disabled_set(ugd->cancel_btn, EINA_FALSE);
327 elm_object_disabled_set(ugd->cancel_btm_btn, EINA_FALSE);
328 ugd->b_load_finished = EINA_TRUE;
330 _composer_attachment_contract_items(ugd);
333 static void _composer_webkit_focused_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
337 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
339 debug_log("Webkit focused");
343 _composer_ps_stop(ugd);
344 ugd->sc_timer = ecore_timer_add(0.5, _composer_ps_scroll_pop, ugd);
347 debug_log("selected_entry = %x, to_mbe_entry = %x, cc_mbe_entry = %x, bcc_mbe_entry = %x, subject_entry = %x, body_ewkview = %x",
348 ugd->selected_entry, ugd->to_mbe_entry, ugd->cc_mbe_entry, ugd->bcc_mbe_entry, ugd->subject_entry, ugd->body_ewkview);
350 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);
352 if (EINA_TRUE == elm_object_focus_get(ugd->to_mbe)) {
354 elm_object_focus_set(ugd->to_mbe, EINA_FALSE);
356 else if (EINA_TRUE == elm_object_focus_get(ugd->cc_mbe)) {
358 elm_object_focus_set(ugd->cc_mbe, EINA_FALSE);
360 else if (EINA_TRUE == elm_object_focus_get(ugd->bcc_mbe)) {
361 debug_log("bcc_mbe");
362 elm_object_focus_set(ugd->bcc_mbe, EINA_FALSE);
364 else if (EINA_TRUE == elm_object_focus_get(ugd->subject_entry)) {
365 debug_log("subject_entry");
366 elm_object_focus_set(ugd->subject_entry, EINA_FALSE);
369 ugd->selected_entry = ugd->body_ewkview;
370 evas_object_focus_set(ugd->body_ewkview, EINA_TRUE);
372 ugd->focus_status = COMPOSER_FOCUS_STATUS_NONE; // focus handling when rte is clicked
373 _composer_attachment_contract_items(ugd);
375 elm_layout_sizing_eval(ugd->c_layout);
376 if (ewk_view_script_execute(ugd->body_ewkview, COMPOSER_JS_SET_FOCUS, _composer_script_executed_cb, NULL) == EINA_FALSE)
377 debug_log("COMPOSER_JS_SET_FOCUS failed.");
380 static void _composer_webkit_unfocused_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
384 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
386 debug_log("selected_entry = %x, to_mbe_entry = %x, cc_mbe_entry = %x, bcc_mbe_entry = %x, subject_entry = %x, body_ewkview = %x",
387 ugd->selected_entry, ugd->to_mbe_entry, ugd->cc_mbe_entry, ugd->bcc_mbe_entry, ugd->subject_entry, ugd->body_ewkview);
389 if (ugd->selected_entry == ugd->body_ewkview) {
390 debug_log("Webkit unfocused");
391 evas_object_focus_set(ugd->body_ewkview, EINA_FALSE);
393 if (ugd->focus_status == COMPOSER_FOCUS_STATUS_SELECTED) {
394 elm_object_tree_focus_allow_set(ugd->c_layout, EINA_FALSE); // block the focus not to open IME.
399 void _composer_webview_reach_top_cb(void *data, Evas_Object *obj, void *event_info)
403 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
405 if (ugd->is_webview_scrolling) {
406 debug_log("main scroller start");
407 ewk_view_vertical_panning_hold_set(ugd->body_ewkview, EINA_TRUE);
409 if (elm_widget_scroll_freeze_get(ugd->main_scroller) > 0)
410 elm_object_scroll_freeze_pop(ugd->main_scroller);
412 /* WORKAROUND. To fix scrolling problem when screen is on the bottom of webview. (Do panning to top fast) */
414 elm_scroller_region_get(ugd->main_scroller, &x, &y, &w, &h);
415 debug_log("main_scroller(x:%d, y:%d, w:%d, h:%d)", x, y, w, h);
416 elm_scroller_region_bring_in(ugd->main_scroller, x, 0, w, h);
418 ugd->is_main_scroller_scrolling = EINA_TRUE;
419 ugd->is_webview_scrolling = EINA_FALSE;
422 if (ugd->temporary_fix_for_rotation)
423 ugd->temporary_fix_for_rotation = false;
426 void _composer_webview_reach_bottom_cb(void *data, Evas_Object *obj, void *event_info)
430 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
432 if (ugd->temporary_fix_for_rotation) {
433 if (elm_widget_scroll_freeze_get(ugd->main_scroller) > 0)
434 elm_object_scroll_freeze_pop(ugd->main_scroller);
435 ugd->temporary_fix_for_rotation = false;
439 static void _composer_set_original_html_content_cb(Evas_Object *o, const char *result, void *data)
443 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
445 if (result != NULL) {
446 ugd->original_html_content = g_strdup(result);
447 debug_log("ugd->original_html_content => \n%s", ugd->original_html_content);
450 if (ewk_view_script_execute(ugd->body_ewkview, COMPOSER_JS_ENABLE_EDITABLE, _composer_script_executed_cb, NULL) == EINA_FALSE)
451 debug_log("COMPOSER_JS_ENABLE_EDITABLE failed.");
454 static void _composer_set_original_info_content_cb(Evas_Object *o, const char *result, void *data)
458 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
460 if (result != NULL) {
461 if (ugd->original_info_content) {
462 g_free(ugd->original_info_content);
463 ugd->original_info_content = NULL;
465 ugd->original_info_content = g_strdup(result);
466 debug_log("ugd->original_info_content => \n%s", ugd->original_info_content);
470 static void _composer_webkit_scroll_up_cb(void *data, Evas_Object *obj, void *event_info)
475 static void _composer_webkit_scroll_down_cb(void *data, Evas_Object *obj, void *event_info)
480 static void _composer_webkit_ime_closed_cb(void *data, Evas_Object *obj, void *event_info)
484 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
485 _composer_resize_body_webview(ugd, 0);
487 elm_object_item_signal_emit(ugd->navi_item, "elm,state,sip,hidden", "");
488 ugd->is_ime_hided = true;
491 static void _composer_webkit_ime_opened_cb(void *data, Evas_Object *obj, void *event_info)
494 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
496 if (ugd->isRotated == true) {
497 _composer_region_show_cb(ugd);
498 ugd->isRotated = false;
501 elm_object_item_signal_emit(ugd->navi_item, "elm,state,sip,shown", "");
502 ugd->is_ime_hided = false;
505 static void _composer_webkit_get_ime_rect_cb(void *data, Evas_Object *obj, void *event_info)
508 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
509 Eina_Rectangle *rect = (Eina_Rectangle*)event_info;
510 debug_log("inputmethod,changed (x:%d,y:%d,w:%d,h:%d)\n", rect->x, rect->y, rect->w, rect->h);
512 _composer_resize_body_webview(ugd, rect->h);
515 static void _composer_webview_policy_navigation_decide_cb(void *data, Evas_Object *obj, void *event_info)
519 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
521 const char *uri = NULL;
522 uri = ewk_view_url_get(ugd->body_ewkview);
523 debug_log("ewk_view_url_get(%s)", uri);
525 if (ugd->b_load_finished == EINA_TRUE) {
526 Ewk_Policy_Decision *policy_decision = (Ewk_Policy_Decision *)event_info;
527 ewk_policy_decision_ignore(policy_decision);
529 debug_log("url:%s", ewk_policy_decision_url_get(policy_decision));
530 debug_log("scheme:%s", ewk_policy_decision_scheme_get(policy_decision));
531 debug_log("cookie:%s", ewk_policy_decision_cookie_get(policy_decision));
532 debug_log("host:%s", ewk_policy_decision_host_get(policy_decision));
533 debug_log("response_mime:%s", ewk_policy_decision_response_mime_get(policy_decision));
535 char *url = (char *)ewk_policy_decision_url_get(policy_decision);
537 if ((strncmp(url, "http://", 7) == 0) ||
538 (strncmp(url, "https://", 8) == 0) ||
539 (strncmp(url, "ftp://", 6) == 0) ||
540 (strncmp(url, "mms://", 6) == 0) ||
541 (strncmp(url, "file://", 7) == 0) ||
542 (strncmp(url, "rtsp://", 7) == 0) ||
543 (strncmp(url, "wap://", 6) == 0)) {
545 service_h service = NULL;
546 ret = service_create(&service);
547 debug_log("service_create: %d", ret);
549 debug_log("service create failed");
552 ret = service_set_operation(service, SERVICE_OPERATION_VIEW);
553 debug_log("service_set_operation: %d", ret);
554 ret = service_set_uri(service, url);
555 debug_log("service_set_uri: %d", ret);
556 ret = service_send_launch_request(service, NULL, NULL);
557 debug_log("service_send_launch_request: %d", ret);
558 ret = service_destroy(service);
559 debug_log("service_destroy: %d", ret);
564 static void _composer_webview_contextmenu_customize_cb(void *data, Evas_Object *webview, void *event_info)
567 int i = 0, count = 0;
568 Eina_Bool sel = EINA_FALSE, has_content = EINA_FALSE;
569 Ewk_Context_Menu* contextmenu = (Ewk_Context_Menu*)event_info;
570 Ewk_Context_Menu_Item* menu_item = NULL;
571 Ewk_Context_Menu_Item_Tag menu_item_tag = EWK_CONTEXT_MENU_ITEM_TAG_NO_ACTION;
573 count = ewk_context_menu_item_count(contextmenu);
574 menu_item = ewk_context_menu_nth_item_get(contextmenu, 0);
575 menu_item_tag = ewk_context_menu_item_tag_get(menu_item);
576 debug_log("menu_item_tag : %d", menu_item_tag);
578 switch (menu_item_tag) {
579 case EWK_CONTEXT_MENU_ITEM_TAG_CUT: // selection
580 case EWK_CONTEXT_MENU_ITEM_TAG_SEARCH_WEB:
583 case EWK_CONTEXT_MENU_ITEM_TAG_PASTE: // no selection
584 case EWK_CONTEXT_MENU_ITEM_TAG_SELECT_ALL:
588 debug_log("No context menu");
592 for (i = 0; i < count; i++) {
593 menu_item = ewk_context_menu_nth_item_get(contextmenu, 0);
594 menu_item_tag = ewk_context_menu_item_tag_get(menu_item);
595 debug_log("menu_item_tag in for: %d", menu_item_tag);
596 if (menu_item_tag == EWK_CONTEXT_MENU_ITEM_TAG_SELECT_ALL) { // has content
597 has_content = EINA_TRUE;
599 ewk_context_menu_item_remove(contextmenu, menu_item);
602 debug_log("Sel = %d, Content = %d", sel, has_content);
604 if (sel == EINA_FALSE) {
605 if (has_content == EINA_FALSE) {
606 debug_log("no contents");
607 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_PASTE, _("IDS_EMAIL_OPT_PASTE"), EINA_TRUE);
608 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_CLIPBOARD, _("IDS_EMAIL_OPT_CLIPBOARD"), EINA_TRUE); // for Clipboard
609 ewk_context_menu_item_append(contextmenu, EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG, NULL, IMGDIR"/icon_search.png", EINA_TRUE);
611 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_SELECT_WORD, _("IDS_EMAIL_OPT_SELECT"), EINA_TRUE);
612 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_SELECT_ALL, _("IDS_EMAIL_OPT_SELECT_ALL"), EINA_TRUE);
613 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_PASTE, _("IDS_EMAIL_OPT_PASTE"), EINA_TRUE);
614 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_CLIPBOARD, _("IDS_EMAIL_OPT_CLIPBOARD"), EINA_TRUE); // for Clipboard
615 ewk_context_menu_item_append(contextmenu, EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG, NULL, IMGDIR"/icon_search.png", EINA_TRUE);
618 if (has_content == EINA_FALSE) {
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_CLIPBOARD, _("IDS_EMAIL_OPT_CLIPBOARD"), EINA_TRUE); // for Clipboard
622 ewk_context_menu_item_append(contextmenu, EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG, NULL, IMGDIR"/icon_search.png", EINA_TRUE);
624 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_COPY, _("IDS_EMAIL_OPT_COPY"), EINA_TRUE);
625 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_CUT, _("IDS_EMAIL_OPT_CUT"), EINA_TRUE);
626 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_PASTE, _("IDS_EMAIL_OPT_PASTE"), EINA_TRUE);
627 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_CLIPBOARD, _("IDS_EMAIL_OPT_CLIPBOARD"), EINA_TRUE); // for Clipboard
628 ewk_context_menu_item_append(contextmenu, EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG, NULL, IMGDIR"/icon_search.png", EINA_TRUE);
633 static void _composer_webview_contextmenu_selected_cb(void *data, Evas_Object *webview, void *event_info)
637 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
639 Ewk_Context_Menu_Item* menu_item = (Ewk_Context_Menu_Item*)event_info;
640 Ewk_Context_Menu_Item_Tag menu_item_tag = EWK_CONTEXT_MENU_ITEM_TAG_NO_ACTION;
642 debug_log("menu_item : %d", menu_item);
643 menu_item_tag = ewk_context_menu_item_tag_get(menu_item);
644 debug_log("menu_item_tag : %d", menu_item_tag);
646 switch (menu_item_tag) {
647 case EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG : //Smart search
649 service_h service = NULL;
650 const char *keyword = NULL;
651 keyword = ewk_view_text_selection_text_get(ugd->body_ewkview);
652 debug_log("keyword : %s", keyword);
654 service_create(&service);
655 service_set_operation(service, SERVICE_OPERATION_SEARCH);
656 service_add_extra_data(service, "http://tizen.org/appcontrol/data/keyword", keyword);
657 service_send_launch_request(service, NULL, NULL);
658 service_destroy(service);
662 debug_log("Never here!");
666 static void _composer_webkit_get_text_status_cb(void *data, Evas_Object *obj, void *event_info)
670 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
671 Ewk_Text_Style* textStyle = (Ewk_Text_Style *)event_info;
673 if ((ugd == NULL) || (textStyle == NULL)) {
677 int ms_x, ms_y, ms_w, ms_h;
679 ewk_text_style_position_get(textStyle, &sp, &ep);
680 debug_log("=================================================");
681 debug_log("1. Start Point : sp.x(%d), sp.y(%d)", sp.x, sp.y);
682 debug_log("1. End Point : ep.x(%d), ep.y(%d)", ep.x, ep.y);
683 debug_log("=================================================");
685 elm_scroller_region_get(ugd->main_scroller, &ms_x, &ms_y, &ms_w, &ms_h);
686 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);
688 int visible_area = 0;
689 int ewk_sc_x, ewk_sc_y;
690 Evas_Coord ewk_ct_w,ewk_ct_h;
691 ewk_view_scroll_pos_get(ugd->body_ewkview, &ewk_sc_x, &ewk_sc_y);
692 debug_log("ewk_view_scroll_pos_get(ewk_sc_x:%d, ewk_sc_y:%d)", ewk_sc_x, ewk_sc_y);
694 ewk_view_contents_size_get(ugd->body_ewkview, &ewk_ct_w, &ewk_ct_h);
695 debug_log("ewk_view_contents_size_get(ewk_ct_w:%d, ewk_ct_h:%d)", ewk_ct_w, ewk_ct_h);
697 if (ugd->isHorizontal == true) {
703 if (ugd->is_prediction == EINA_TRUE) {
704 visible_area = visible_area - COMPOSER_IME_PREDICTION_H;
707 debug_log("ugd->is_prediction : %d", ugd->is_prediction);
709 if (ms_y < 311 + COMPOSER_IME_PREDICTION_H) {
710 if (ep.y > visible_area) {
712 elm_scroller_region_show(ugd->main_scroller, ms_x, 10000, ms_w, ms_h);
713 ewk_view_scroll_set(ugd->body_ewkview, 0, ep.y - visible_area + ewk_sc_y);
715 elm_scroller_region_bring_in(ugd->main_scroller, ms_x, ep.y - visible_area + ms_y, ms_w, ms_h);
719 if (ep.y > visible_area) {
720 elm_scroller_region_show(ugd->main_scroller, ms_x, 10000, ms_w, ms_h);
721 ewk_view_scroll_set(ugd->body_ewkview, 0, ep.y - visible_area + ewk_sc_y);