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.");
302 if (EINA_FALSE == ewk_view_script_execute(ugd->body_ewkview, COMPOSER_JS_GET_IMAGE_LIST, _composer_get_image_list_cb, (void *)ugd)) {
303 debug_log("COMPOSER_JS_GET_IMAGE_LIST error.");
307 void _composer_webkit_loadFinished_cb(void *data, Evas_Object *obj, void *event_info)
311 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
313 _composer_webkit_set_body_script(data);
315 Ewk_Settings *ewkSetting = NULL;
316 ewkSetting = ewk_view_settings_get(ugd->body_ewkview);
318 if (ewkSetting == NULL)
319 debug_log("ewkSetting is NULL.");
321 ewk_settings_auto_fitting_set(ewkSetting, EINA_TRUE);
322 ewk_settings_editable_link_behavior_set(ewkSetting, EWK_EDITABLE_LINK_BEHAVIOR_NEVER_LIVE);
324 if (ugd->selected_entry == ugd->body_ewkview) {
325 // focus to the body field when reply the email.
326 evas_object_focus_set(ugd->body_ewkview, EINA_TRUE);
329 elm_object_disabled_set(ugd->cancel_btn, EINA_FALSE);
330 elm_object_disabled_set(ugd->cancel_btm_btn, EINA_FALSE);
331 ugd->b_load_finished = EINA_TRUE;
333 _composer_attachment_contract_items(ugd);
336 static void _composer_webkit_focused_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
340 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
342 debug_log("Webkit focused");
346 _composer_ps_stop(ugd);
347 ugd->sc_timer = ecore_timer_add(0.5, _composer_ps_scroll_pop, ugd);
350 debug_log("selected_entry = %x, to_mbe_entry = %x, cc_mbe_entry = %x, bcc_mbe_entry = %x, subject_entry = %x, body_ewkview = %x",
351 ugd->selected_entry, ugd->to_mbe_entry, ugd->cc_mbe_entry, ugd->bcc_mbe_entry, ugd->subject_entry, ugd->body_ewkview);
353 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);
355 if (EINA_TRUE == elm_object_focus_get(ugd->to_mbe)) {
357 elm_object_focus_set(ugd->to_mbe, EINA_FALSE);
359 else if (EINA_TRUE == elm_object_focus_get(ugd->cc_mbe)) {
361 elm_object_focus_set(ugd->cc_mbe, EINA_FALSE);
363 else if (EINA_TRUE == elm_object_focus_get(ugd->bcc_mbe)) {
364 debug_log("bcc_mbe");
365 elm_object_focus_set(ugd->bcc_mbe, EINA_FALSE);
367 else if (EINA_TRUE == elm_object_focus_get(ugd->subject_entry)) {
368 debug_log("subject_entry");
369 elm_object_focus_set(ugd->subject_entry, EINA_FALSE);
372 ugd->selected_entry = ugd->body_ewkview;
373 evas_object_focus_set(ugd->body_ewkview, EINA_TRUE);
375 ugd->focus_status = COMPOSER_FOCUS_STATUS_NONE; // focus handling when rte is clicked
376 _composer_attachment_contract_items(ugd);
378 elm_layout_sizing_eval(ugd->c_layout);
379 if (ewk_view_script_execute(ugd->body_ewkview, COMPOSER_JS_SET_FOCUS, _composer_script_executed_cb, NULL) == EINA_FALSE)
380 debug_log("COMPOSER_JS_SET_FOCUS failed.");
383 static void _composer_webkit_unfocused_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
387 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
389 debug_log("selected_entry = %x, to_mbe_entry = %x, cc_mbe_entry = %x, bcc_mbe_entry = %x, subject_entry = %x, body_ewkview = %x",
390 ugd->selected_entry, ugd->to_mbe_entry, ugd->cc_mbe_entry, ugd->bcc_mbe_entry, ugd->subject_entry, ugd->body_ewkview);
392 if (ugd->selected_entry == ugd->body_ewkview) {
393 debug_log("Webkit unfocused");
394 evas_object_focus_set(ugd->body_ewkview, EINA_FALSE);
396 if (ugd->focus_status == COMPOSER_FOCUS_STATUS_SELECTED) {
397 elm_object_tree_focus_allow_set(ugd->c_layout, EINA_FALSE); // block the focus not to open IME.
402 void _composer_webview_reach_top_cb(void *data, Evas_Object *obj, void *event_info)
406 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
408 if (ugd->is_webview_scrolling) {
409 debug_log("main scroller start");
410 ewk_view_vertical_panning_hold_set(ugd->body_ewkview, EINA_TRUE);
412 if (elm_widget_scroll_freeze_get(ugd->main_scroller) > 0)
413 elm_object_scroll_freeze_pop(ugd->main_scroller);
415 /* WORKAROUND. To fix scrolling problem when screen is on the bottom of webview. (Do panning to top fast) */
417 elm_scroller_region_get(ugd->main_scroller, &x, &y, &w, &h);
418 debug_log("main_scroller(x:%d, y:%d, w:%d, h:%d)", x, y, w, h);
419 elm_scroller_region_bring_in(ugd->main_scroller, x, 0, w, h);
421 ugd->is_main_scroller_scrolling = EINA_TRUE;
422 ugd->is_webview_scrolling = EINA_FALSE;
425 if (ugd->temporary_fix_for_rotation)
426 ugd->temporary_fix_for_rotation = false;
429 void _composer_webview_reach_bottom_cb(void *data, Evas_Object *obj, void *event_info)
433 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
435 if (ugd->temporary_fix_for_rotation) {
436 if (elm_widget_scroll_freeze_get(ugd->main_scroller) > 0)
437 elm_object_scroll_freeze_pop(ugd->main_scroller);
438 ugd->temporary_fix_for_rotation = false;
442 static void _composer_set_original_html_content_cb(Evas_Object *o, const char *result, void *data)
446 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
448 if (result != NULL) {
449 ugd->original_html_content = g_strdup(result);
450 debug_log("ugd->original_html_content => \n%s", ugd->original_html_content);
453 if (ewk_view_script_execute(ugd->body_ewkview, COMPOSER_JS_ENABLE_EDITABLE, _composer_script_executed_cb, NULL) == EINA_FALSE)
454 debug_log("COMPOSER_JS_ENABLE_EDITABLE failed.");
457 static void _composer_set_original_info_content_cb(Evas_Object *o, const char *result, void *data)
461 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
463 if (result != NULL) {
464 if (ugd->original_info_content) {
465 g_free(ugd->original_info_content);
466 ugd->original_info_content = NULL;
468 ugd->original_info_content = g_strdup(result);
469 debug_log("ugd->original_info_content => \n%s", ugd->original_info_content);
473 static void _composer_webkit_scroll_up_cb(void *data, Evas_Object *obj, void *event_info)
478 static void _composer_webkit_scroll_down_cb(void *data, Evas_Object *obj, void *event_info)
483 static void _composer_webkit_ime_closed_cb(void *data, Evas_Object *obj, void *event_info)
487 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
488 _composer_resize_body_webview(ugd, 0);
490 elm_object_item_signal_emit(ugd->navi_item, "elm,state,sip,hidden", "");
491 ugd->is_ime_hided = true;
494 static void _composer_webkit_ime_opened_cb(void *data, Evas_Object *obj, void *event_info)
497 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
499 if (ugd->isRotated == true) {
500 _composer_region_show_cb(ugd);
501 ugd->isRotated = false;
504 elm_object_item_signal_emit(ugd->navi_item, "elm,state,sip,shown", "");
505 ugd->is_ime_hided = false;
508 static void _composer_webkit_get_ime_rect_cb(void *data, Evas_Object *obj, void *event_info)
511 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
512 Eina_Rectangle *rect = (Eina_Rectangle*)event_info;
513 debug_log("inputmethod,changed (x:%d,y:%d,w:%d,h:%d)\n", rect->x, rect->y, rect->w, rect->h);
515 _composer_resize_body_webview(ugd, rect->h);
518 static void _composer_webview_policy_navigation_decide_cb(void *data, Evas_Object *obj, void *event_info)
522 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
524 const char *uri = NULL;
525 uri = ewk_view_url_get(ugd->body_ewkview);
526 debug_log("ewk_view_url_get(%s)", uri);
528 if (ugd->b_load_finished == EINA_TRUE) {
529 Ewk_Policy_Decision *policy_decision = (Ewk_Policy_Decision *)event_info;
530 ewk_policy_decision_ignore(policy_decision);
532 debug_log("url:%s", ewk_policy_decision_url_get(policy_decision));
533 debug_log("scheme:%s", ewk_policy_decision_scheme_get(policy_decision));
534 debug_log("cookie:%s", ewk_policy_decision_cookie_get(policy_decision));
535 debug_log("host:%s", ewk_policy_decision_host_get(policy_decision));
536 debug_log("response_mime:%s", ewk_policy_decision_response_mime_get(policy_decision));
538 char *url = (char *)ewk_policy_decision_url_get(policy_decision);
540 if ((strncmp(url, "http://", 7) == 0) ||
541 (strncmp(url, "https://", 8) == 0) ||
542 (strncmp(url, "ftp://", 6) == 0) ||
543 (strncmp(url, "mms://", 6) == 0) ||
544 (strncmp(url, "file://", 7) == 0) ||
545 (strncmp(url, "rtsp://", 7) == 0) ||
546 (strncmp(url, "wap://", 6) == 0)) {
548 service_h service = NULL;
549 ret = service_create(&service);
550 debug_log("service_create: %d", ret);
552 debug_log("service create failed");
555 ret = service_set_operation(service, SERVICE_OPERATION_VIEW);
556 debug_log("service_set_operation: %d", ret);
557 ret = service_set_uri(service, url);
558 debug_log("service_set_uri: %d", ret);
559 ret = service_send_launch_request(service, NULL, NULL);
560 debug_log("service_send_launch_request: %d", ret);
561 ret = service_destroy(service);
562 debug_log("service_destroy: %d", ret);
567 static void _composer_webview_contextmenu_customize_cb(void *data, Evas_Object *webview, void *event_info)
570 int i = 0, count = 0;
571 Eina_Bool sel = EINA_FALSE, has_content = EINA_FALSE;
572 Ewk_Context_Menu* contextmenu = (Ewk_Context_Menu*)event_info;
573 Ewk_Context_Menu_Item* menu_item = NULL;
574 Ewk_Context_Menu_Item_Tag menu_item_tag = EWK_CONTEXT_MENU_ITEM_TAG_NO_ACTION;
576 count = ewk_context_menu_item_count(contextmenu);
577 menu_item = ewk_context_menu_nth_item_get(contextmenu, 0);
578 menu_item_tag = ewk_context_menu_item_tag_get(menu_item);
579 debug_log("menu_item_tag : %d", menu_item_tag);
581 switch (menu_item_tag) {
582 case EWK_CONTEXT_MENU_ITEM_TAG_CUT: // selection
583 case EWK_CONTEXT_MENU_ITEM_TAG_SEARCH_WEB:
586 case EWK_CONTEXT_MENU_ITEM_TAG_PASTE: // no selection
587 case EWK_CONTEXT_MENU_ITEM_TAG_SELECT_ALL:
591 debug_log("No context menu");
595 for (i = 0; i < count; i++) {
596 menu_item = ewk_context_menu_nth_item_get(contextmenu, 0);
597 menu_item_tag = ewk_context_menu_item_tag_get(menu_item);
598 debug_log("menu_item_tag in for: %d", menu_item_tag);
599 if (menu_item_tag == EWK_CONTEXT_MENU_ITEM_TAG_SELECT_ALL) { // has content
600 has_content = EINA_TRUE;
602 ewk_context_menu_item_remove(contextmenu, menu_item);
605 debug_log("Sel = %d, Content = %d", sel, has_content);
607 if (sel == EINA_FALSE) {
608 if (has_content == EINA_FALSE) {
609 debug_log("no contents");
610 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_PASTE, _("IDS_EMAIL_OPT_PASTE"), EINA_TRUE);
611 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_CLIPBOARD, _("IDS_EMAIL_OPT_CLIPBOARD"), EINA_TRUE); // for Clipboard
612 ewk_context_menu_item_append(contextmenu, EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG, NULL, IMGDIR"/icon_search.png", EINA_TRUE);
614 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_SELECT_WORD, _("IDS_EMAIL_OPT_SELECT"), EINA_TRUE);
615 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_SELECT_ALL, _("IDS_EMAIL_OPT_SELECT_ALL"), EINA_TRUE);
616 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_PASTE, _("IDS_EMAIL_OPT_PASTE"), EINA_TRUE);
617 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_CLIPBOARD, _("IDS_EMAIL_OPT_CLIPBOARD"), EINA_TRUE); // for Clipboard
618 ewk_context_menu_item_append(contextmenu, EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG, NULL, IMGDIR"/icon_search.png", EINA_TRUE);
621 if (has_content == EINA_FALSE) {
622 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_COPY, _("IDS_EMAIL_OPT_COPY"), EINA_TRUE);
623 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_CUT, _("IDS_EMAIL_OPT_CUT"), EINA_TRUE);
624 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_CLIPBOARD, _("IDS_EMAIL_OPT_CLIPBOARD"), EINA_TRUE); // for Clipboard
625 ewk_context_menu_item_append(contextmenu, EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG, NULL, IMGDIR"/icon_search.png", EINA_TRUE);
627 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_COPY, _("IDS_EMAIL_OPT_COPY"), EINA_TRUE);
628 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_CUT, _("IDS_EMAIL_OPT_CUT"), EINA_TRUE);
629 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_PASTE, _("IDS_EMAIL_OPT_PASTE"), EINA_TRUE);
630 ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_CLIPBOARD, _("IDS_EMAIL_OPT_CLIPBOARD"), EINA_TRUE); // for Clipboard
631 ewk_context_menu_item_append(contextmenu, EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG, NULL, IMGDIR"/icon_search.png", EINA_TRUE);
636 static void _composer_webview_contextmenu_selected_cb(void *data, Evas_Object *webview, void *event_info)
640 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
642 Ewk_Context_Menu_Item* menu_item = (Ewk_Context_Menu_Item*)event_info;
643 Ewk_Context_Menu_Item_Tag menu_item_tag = EWK_CONTEXT_MENU_ITEM_TAG_NO_ACTION;
645 debug_log("menu_item : %d", menu_item);
646 menu_item_tag = ewk_context_menu_item_tag_get(menu_item);
647 debug_log("menu_item_tag : %d", menu_item_tag);
649 switch (menu_item_tag) {
650 case EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG : //Smart search
652 service_h service = NULL;
653 const char *keyword = NULL;
654 keyword = ewk_view_text_selection_text_get(ugd->body_ewkview);
655 debug_log("keyword : %s", keyword);
657 service_create(&service);
658 service_set_operation(service, SERVICE_OPERATION_SEARCH);
659 service_add_extra_data(service, "http://tizen.org/appcontrol/data/keyword", keyword);
660 service_send_launch_request(service, NULL, NULL);
661 service_destroy(service);
665 debug_log("Never here!");
669 static void _composer_webkit_get_text_status_cb(void *data, Evas_Object *obj, void *event_info)
673 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
674 Ewk_Text_Style* textStyle = (Ewk_Text_Style *)event_info;
676 if ((ugd == NULL) || (textStyle == NULL)) {
680 int ms_x, ms_y, ms_w, ms_h;
682 ewk_text_style_position_get(textStyle, &sp, &ep);
683 debug_log("=================================================");
684 debug_log("1. Start Point : sp.x(%d), sp.y(%d)", sp.x, sp.y);
685 debug_log("1. End Point : ep.x(%d), ep.y(%d)", ep.x, ep.y);
686 debug_log("=================================================");
688 elm_scroller_region_get(ugd->main_scroller, &ms_x, &ms_y, &ms_w, &ms_h);
689 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);
691 int visible_area = 0;
692 int ewk_sc_x, ewk_sc_y;
693 Evas_Coord ewk_ct_w,ewk_ct_h;
694 ewk_view_scroll_pos_get(ugd->body_ewkview, &ewk_sc_x, &ewk_sc_y);
695 debug_log("ewk_view_scroll_pos_get(ewk_sc_x:%d, ewk_sc_y:%d)", ewk_sc_x, ewk_sc_y);
697 ewk_view_contents_size_get(ugd->body_ewkview, &ewk_ct_w, &ewk_ct_h);
698 debug_log("ewk_view_contents_size_get(ewk_ct_w:%d, ewk_ct_h:%d)", ewk_ct_w, ewk_ct_h);
700 if (ugd->isHorizontal == true) {
706 if (ugd->is_prediction == EINA_TRUE) {
707 visible_area = visible_area - COMPOSER_IME_PREDICTION_H;
710 debug_log("ugd->is_prediction : %d", ugd->is_prediction);
712 if (ms_y < 311 + COMPOSER_IME_PREDICTION_H) {
713 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);
718 elm_scroller_region_bring_in(ugd->main_scroller, ms_x, ep.y - visible_area + ms_y, ms_w, ms_h);
722 if (ep.y > visible_area) {
723 elm_scroller_region_show(ugd->main_scroller, ms_x, 10000, ms_w, ms_h);
724 ewk_view_scroll_set(ugd->body_ewkview, 0, ep.y - visible_area + ewk_sc_y);