Merged the latest code
[apps/core/preloaded/email.git] / composer / src / email-composer-contents.c
1 /*
2  * Copyright 2012  Samsung Electronics Co., Ltd
3  *
4  * Licensed under the Flora License, Version 1.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *    http://www.tizenopensource.org/license
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #include <string.h>
18 #include <Ecore_X.h>
19
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"
28
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
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);
35
36 void _composer_webkit_loadFinished_cb(void *data, Evas_Object *obj, void *event_info);
37
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);
45
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);
53
54
55 static void _changed_cb(void *data, Evas_Object *obj, void *event_info) // This callback is for showing(hiding) X marked button.
56 {
57         debug_log("");
58
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");
62                 else
63                         elm_object_signal_emit(data, "elm,state,eraser,show", "elm");
64         }
65 }
66
67 static void _focused_cb(void *data, Evas_Object *obj, void *event_info) // Focused callback will show X marked button and hide guidetext.
68 {
69         debug_log("");
70
71         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
72
73         debug_log("ugd->focus_status = %d", ugd->focus_status);
74
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");
79
80                 _composer_attachment_contract_items(ugd);
81
82                 elm_entry_input_panel_show(obj);
83
84                 ugd->selected_entry = ugd->subject_entry;
85                 elm_layout_sizing_eval(ugd->c_layout);
86         } else {
87                 if (ugd->selected_entry == ugd->body_ewkview) {
88                         elm_object_focus_set(ugd->subject_entry, EINA_FALSE);
89                 }
90         }
91 }
92
93 static void _unfocused_cb(void *data, Evas_Object *obj, void *event_info) // Unfocused callback will show guidetext and hide X marked button.
94 {
95         debug_log("");
96         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
97
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;
101                 return;
102         }
103
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");
107
108         elm_entry_input_panel_hide(obj);
109 }
110
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.
112 {
113         debug_log("");
114
115         elm_entry_entry_set(data, "");
116 }
117
118 void _composer_content_create_content_field(Evas_Object *parent, EmailComposerUGD *ugd)
119 {
120         debug_log("");
121
122         /* Create Subject field */
123         _composer_create_subject_field(parent, ugd);
124
125         /* Create Body field */
126         _composer_create_body_field(parent, ugd);
127 }
128
129 void _composer_create_subject_field(Evas_Object *parent, EmailComposerUGD *ugd)
130 {
131         debug_log("");
132
133         Evas_Object *ly;
134
135         ly = _composer_create_subject_editfield(parent, dgettext("sys_string", "IDS_COM_BODY_SUBJECT"), ugd);
136
137         _composer_register_editfield_entry_callback(ugd->subject_entry, ugd);
138
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);
143
144         elm_object_part_content_set(parent, "subject_field", ly);
145
146         ugd->subject_ly = ly;
147 }
148
149 Evas_Object *_composer_create_subject_editfield(Evas_Object *parent, char *title, EmailComposerUGD *ugd)
150 {
151         debug_log("");
152
153         Evas_Object *ly;
154         Evas_Object *ef;
155         Evas_Object *entry = NULL;
156
157         ly = elm_layout_add(parent);
158
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);
163
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);
169
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;
173
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'");
183
184         elm_object_part_content_set(ef, "elm.swallow.content", entry);
185         ugd->subject_entry = entry;
186
187         return ly;
188 }
189
190 void _composer_create_body_field(Evas_Object *parent, EmailComposerUGD *ugd)
191 {
192         debug_log("");
193
194         Evas_Object *body_ly;
195
196         body_ly = _composer_create_body_webview(parent, NULL, ugd);
197
198         elm_object_part_content_set(parent, "content_field", body_ly);
199
200         ugd->webkit_ly = body_ly;
201 }
202
203 void _composer_register_editfield_entry_callback(Evas_Object *obj, EmailComposerUGD *ugd)
204 {
205         debug_log("");
206
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);
209
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);
214 }
215
216 void _composer_webkit_set_body_script(void *data)
217 {
218         debug_log("");
219         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
220
221         if (ugd == NULL)
222                 return;
223
224         _composer_webkit_script_executed_cb(NULL, NULL, ugd);
225 }
226
227 Evas_Object *_composer_create_body_webview(Evas_Object *parent, char *title, EmailComposerUGD *ugd)
228 {
229         debug_log("");
230
231         Evas_Object *ly;
232
233         ly = elm_layout_add(parent);
234
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);
239
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);
244
245         elm_object_part_content_set(ly, "webkit.swallow", ugd->body_ewkview);
246
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);
249
250         evas_object_event_callback_add(ugd->body_ewkview, EVAS_CALLBACK_MOUSE_DOWN, _composer_webview_mouse_down_cb, ugd);
251
252         Ewk_Settings *ewkSetting = NULL;
253         ewkSetting = ewk_view_settings_get(ugd->body_ewkview);
254
255         if (NULL == ewkSetting)
256                 debug_log("ewkSetting is NULL.");
257
258         ewk_settings_uses_encoding_detector_set(ewkSetting, EINA_TRUE);
259
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);
270
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);
273
274         return ly;
275 }
276
277 void _composer_webview_mouse_down_cb(void *data, Evas * evas, Evas_Object *obj, void *event_info)
278 {
279         debug_log("");
280 }
281
282 void _composer_webview_mouse_move_cb(void *data, Evas * evas, Evas_Object *obj, void *event_info)
283 {
284         debug_log("");
285 }
286
287 void _composer_webview_mouse_up_cb(void *data, Evas * evas, Evas_Object *obj, void *event_info)
288 {
289         debug_log("");
290 }
291
292 static void _composer_webkit_script_executed_cb(Evas_Object *o, const char *result, void *data)
293 {
294         debug_log("");
295
296         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
297
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.");
304         }
305 }
306
307 void _composer_webkit_loadFinished_cb(void *data, Evas_Object *obj, void *event_info)
308 {
309         debug_log("");
310
311         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
312
313         _composer_webkit_set_body_script(data);
314
315         Ewk_Settings *ewkSetting = NULL;
316         ewkSetting = ewk_view_settings_get(ugd->body_ewkview);
317
318         if (ewkSetting == NULL)
319                 debug_log("ewkSetting is NULL.");
320
321         ewk_settings_auto_fitting_set(ewkSetting, EINA_TRUE);
322         ewk_settings_editable_link_behavior_set(ewkSetting, EWK_EDITABLE_LINK_BEHAVIOR_NEVER_LIVE);
323
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);
327         }
328
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;
332
333         _composer_attachment_contract_items(ugd);
334 }
335
336 static void _composer_webkit_focused_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
337 {
338         debug_enter();
339
340         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
341
342         debug_log("Webkit focused");
343
344         // recipients
345         if (ugd->ps_list) {
346                 _composer_ps_stop(ugd);
347                 ugd->sc_timer = ecore_timer_add(0.5, _composer_ps_scroll_pop, ugd);
348         }
349
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);
352
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);
354
355         if (EINA_TRUE == elm_object_focus_get(ugd->to_mbe)) {
356                 debug_log("to_mbe");
357                 elm_object_focus_set(ugd->to_mbe, EINA_FALSE);
358         }
359         else if (EINA_TRUE == elm_object_focus_get(ugd->cc_mbe)) {
360                 debug_log("cc_mbe");
361                 elm_object_focus_set(ugd->cc_mbe, EINA_FALSE);
362         }
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);
366         }
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);
370         }
371
372         ugd->selected_entry = ugd->body_ewkview;
373         evas_object_focus_set(ugd->body_ewkview, EINA_TRUE);
374
375         ugd->focus_status = COMPOSER_FOCUS_STATUS_NONE; // focus handling when rte is clicked
376         _composer_attachment_contract_items(ugd);
377
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.");
381 }
382
383 static void _composer_webkit_unfocused_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
384 {
385         debug_enter();
386
387         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
388
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);
391
392         if (ugd->selected_entry == ugd->body_ewkview) {
393                 debug_log("Webkit unfocused");
394                 evas_object_focus_set(ugd->body_ewkview, EINA_FALSE);
395
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.
398                 }
399         }
400 }
401
402 void _composer_webview_reach_top_cb(void *data, Evas_Object *obj, void *event_info)
403 {
404         debug_log("");
405
406         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
407
408         if (ugd->is_webview_scrolling) {
409                 debug_log("main scroller start");
410                 ewk_view_vertical_panning_hold_set(ugd->body_ewkview, EINA_TRUE);
411
412                 if (elm_widget_scroll_freeze_get(ugd->main_scroller) > 0)
413                         elm_object_scroll_freeze_pop(ugd->main_scroller);
414
415                 /* WORKAROUND. To fix scrolling problem when screen is on the bottom of webview. (Do panning to top fast) */
416                 int x, y, w, h;
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);
420
421                 ugd->is_main_scroller_scrolling = EINA_TRUE;
422                 ugd->is_webview_scrolling = EINA_FALSE;
423         }
424
425         if (ugd->temporary_fix_for_rotation)
426                 ugd->temporary_fix_for_rotation = false;
427 }
428
429 void _composer_webview_reach_bottom_cb(void *data, Evas_Object *obj, void *event_info)
430 {
431         debug_log("");
432
433         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
434
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;
439         }
440 }
441
442 static void _composer_set_original_html_content_cb(Evas_Object *o, const char *result, void *data)
443 {
444         debug_log("");
445
446         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
447
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);
451         }
452
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.");
455 }
456
457 static void _composer_set_original_info_content_cb(Evas_Object *o, const char *result, void *data)
458 {
459         debug_log("");
460
461         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
462
463         if (result != NULL) {
464                 if (ugd->original_info_content) {
465                         g_free(ugd->original_info_content);
466                         ugd->original_info_content = NULL;
467                 }
468                 ugd->original_info_content = g_strdup(result);
469                 debug_log("ugd->original_info_content => \n%s", ugd->original_info_content);
470         }
471 }
472
473 static void _composer_webkit_scroll_up_cb(void *data, Evas_Object *obj, void *event_info)
474 {
475         //debug_log("");
476 }
477
478 static void _composer_webkit_scroll_down_cb(void *data, Evas_Object *obj, void *event_info)
479 {
480         //debug_log("");
481 }
482
483 static void _composer_webkit_ime_closed_cb(void *data, Evas_Object *obj, void *event_info)
484 {
485         debug_log("");
486
487         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
488         _composer_resize_body_webview(ugd, 0);
489
490         elm_object_item_signal_emit(ugd->navi_item, "elm,state,sip,hidden", "");
491         ugd->is_ime_hided = true;
492 }
493
494 static void _composer_webkit_ime_opened_cb(void *data, Evas_Object *obj, void *event_info)
495 {
496         debug_log("");
497         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
498
499         if (ugd->isRotated == true) {
500                 _composer_region_show_cb(ugd);
501                 ugd->isRotated = false;
502         }
503
504         elm_object_item_signal_emit(ugd->navi_item, "elm,state,sip,shown", "");
505         ugd->is_ime_hided = false;
506 }
507
508 static void _composer_webkit_get_ime_rect_cb(void *data, Evas_Object *obj, void *event_info)
509 {
510         debug_log("");
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);
514
515         _composer_resize_body_webview(ugd, rect->h);
516 }
517
518 static void _composer_webview_policy_navigation_decide_cb(void *data, Evas_Object *obj, void *event_info)
519 {
520         debug_log("");
521
522         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
523
524         const char *uri = NULL;
525         uri = ewk_view_url_get(ugd->body_ewkview);
526         debug_log("ewk_view_url_get(%s)", uri);
527
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);
531
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));
537
538                 char *url = (char *)ewk_policy_decision_url_get(policy_decision);
539
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)) {
547                         int ret;
548                         service_h service = NULL;
549                         ret = service_create(&service);
550                         debug_log("service_create: %d", ret);
551                         if (!service) {
552                                 debug_log("service create failed");
553                                 return;
554                         }
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);
563                 }
564         }
565 }
566
567 static void _composer_webview_contextmenu_customize_cb(void *data, Evas_Object *webview, void *event_info)
568 {
569         debug_log("");
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;
575
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);
580
581         switch (menu_item_tag) {
582                 case EWK_CONTEXT_MENU_ITEM_TAG_CUT: // selection
583                 case EWK_CONTEXT_MENU_ITEM_TAG_SEARCH_WEB:
584                         sel = EINA_TRUE;
585                 break;
586                 case EWK_CONTEXT_MENU_ITEM_TAG_PASTE:   // no selection
587                 case EWK_CONTEXT_MENU_ITEM_TAG_SELECT_ALL:
588                         sel = EINA_FALSE;
589                 break;
590                 default:
591                         debug_log("No context menu");
592                         return;
593         }
594
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;
601                 }
602                 ewk_context_menu_item_remove(contextmenu, menu_item);
603         }
604
605         debug_log("Sel = %d, Content = %d", sel, has_content);
606
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);
613                 } else {
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);
619                 }
620         } else {
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);
626                 } else {
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);
632                 }
633         }
634 }
635
636 static void _composer_webview_contextmenu_selected_cb(void *data, Evas_Object *webview, void *event_info)
637 {
638         debug_log("");
639
640         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
641
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;
644
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);
648
649         switch (menu_item_tag) {
650         case EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG : //Smart search
651         {
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);
656
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);
662         }
663         break;
664         default:
665                 debug_log("Never here!");
666         }
667 }
668
669 static void _composer_webkit_get_text_status_cb(void *data, Evas_Object *obj, void *event_info)
670 {
671         debug_log("");
672
673         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
674         Ewk_Text_Style* textStyle = (Ewk_Text_Style *)event_info;
675
676         if ((ugd == NULL) || (textStyle == NULL)) {
677                 return;
678         }
679
680         int ms_x, ms_y, ms_w, ms_h;
681         Evas_Point sp, ep;
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("=================================================");
687
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);
690
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);
696
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);
699
700         if (ugd->isHorizontal == true) {
701                 visible_area = 397;
702         } else {
703                 visible_area = 830;
704         }
705
706         if (ugd->is_prediction == EINA_TRUE) {
707                 visible_area = visible_area - COMPOSER_IME_PREDICTION_H;
708         }
709
710         debug_log("ugd->is_prediction : %d", ugd->is_prediction);
711
712         if (ms_y < 311 + COMPOSER_IME_PREDICTION_H) {
713                 if (ep.y > visible_area) {
714                         if (ewk_sc_y > 0) {
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);
717                         } else {
718                                 elm_scroller_region_bring_in(ugd->main_scroller, ms_x, ep.y - visible_area + ms_y, ms_w, ms_h);
719                         }
720                 }
721         } else {
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);
725                 }
726         }
727 }
728