1ef6ece515d891b29652131cf66e04be69f7f450
[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 void _composer_webview_mouse_down_cb(void *data, Evas * evas, Evas_Object *obj, void *event_info);
32
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);
36
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);
44
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);
52
53
54 static void _changed_cb(void *data, Evas_Object *obj, void *event_info) // This callback is for showing(hiding) X marked button.
55 {
56         debug_log("");
57
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");
61                 else
62                         elm_object_signal_emit(data, "elm,state,eraser,show", "elm");
63         }
64 }
65
66 static void _focused_cb(void *data, Evas_Object *obj, void *event_info) // Focused callback will show X marked button and hide guidetext.
67 {
68         debug_log("");
69
70         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
71
72         debug_log("ugd->focus_status = %d", ugd->focus_status);
73
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");
78
79                 _composer_attachment_contract_items(ugd);
80
81                 elm_entry_input_panel_show(obj);
82
83                 ugd->selected_entry = ugd->subject_entry;
84                 elm_layout_sizing_eval(ugd->c_layout);
85         } else {
86                 if (ugd->selected_entry == ugd->body_ewkview) {
87                         elm_object_focus_set(ugd->subject_entry, EINA_FALSE);
88                 }
89         }
90 }
91
92 static void _unfocused_cb(void *data, Evas_Object *obj, void *event_info) // Unfocused callback will show guidetext and hide X marked button.
93 {
94         debug_log("");
95         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
96
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;
100                 return;
101         }
102
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");
106
107         elm_entry_input_panel_hide(obj);
108 }
109
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.
111 {
112         debug_log("");
113
114         elm_entry_entry_set(data, "");
115 }
116
117 void _composer_content_create_content_field(Evas_Object *parent, EmailComposerUGD *ugd)
118 {
119         debug_log("");
120
121         /* Create Subject field */
122         _composer_create_subject_field(parent, ugd);
123
124         /* Create Body field */
125         _composer_create_body_field(parent, ugd);
126 }
127
128 void _composer_create_subject_field(Evas_Object *parent, EmailComposerUGD *ugd)
129 {
130         debug_log("");
131
132         Evas_Object *ly;
133
134         ly = _composer_create_subject_editfield(parent, dgettext("sys_string", "IDS_COM_BODY_SUBJECT"), ugd);
135
136         _composer_register_editfield_entry_callback(ugd->subject_entry, ugd);
137
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);
142
143         elm_object_part_content_set(parent, "subject_field", ly);
144
145         ugd->subject_ly = ly;
146 }
147
148 Evas_Object *_composer_create_subject_editfield(Evas_Object *parent, char *title, EmailComposerUGD *ugd)
149 {
150         debug_log("");
151
152         Evas_Object *ly;
153         Evas_Object *ef;
154         Evas_Object *entry = NULL;
155
156         ly = elm_layout_add(parent);
157
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);
162
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);
168
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;
172
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'");
180
181         elm_object_part_content_set(ef, "elm.swallow.content", entry);
182         ugd->subject_entry = entry;
183
184         return ly;
185 }
186
187 void _composer_create_body_field(Evas_Object *parent, EmailComposerUGD *ugd)
188 {
189         debug_log("");
190
191         Evas_Object *body_ly;
192
193         body_ly = _composer_create_body_webview(parent, NULL, ugd);
194
195         elm_object_part_content_set(parent, "content_field", body_ly);
196
197         ugd->webkit_ly = body_ly;
198 }
199
200 void _composer_register_editfield_entry_callback(Evas_Object *obj, EmailComposerUGD *ugd)
201 {
202         debug_log("");
203
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);
206
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);
211 }
212
213 void _composer_webkit_set_body_script(void *data)
214 {
215         debug_log("");
216         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
217
218         if (ugd == NULL)
219                 return;
220
221         _composer_webkit_script_executed_cb(NULL, NULL, ugd);
222 }
223
224 Evas_Object *_composer_create_body_webview(Evas_Object *parent, char *title, EmailComposerUGD *ugd)
225 {
226         debug_log("");
227
228         Evas_Object *ly;
229
230         ly = elm_layout_add(parent);
231
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);
236
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);
241
242         elm_object_part_content_set(ly, "webkit.swallow", ugd->body_ewkview);
243
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);
246
247         evas_object_event_callback_add(ugd->body_ewkview, EVAS_CALLBACK_MOUSE_DOWN, _composer_webview_mouse_down_cb, ugd);
248
249         Ewk_Settings *ewkSetting = NULL;
250         ewkSetting = ewk_view_settings_get(ugd->body_ewkview);
251
252         if (NULL == ewkSetting)
253                 debug_log("ewkSetting is NULL.");
254
255         ewk_settings_uses_encoding_detector_set(ewkSetting, EINA_TRUE);
256
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);
267
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);
270
271         return ly;
272 }
273
274 void _composer_webview_mouse_down_cb(void *data, Evas * evas, Evas_Object *obj, void *event_info)
275 {
276         debug_log("");
277 }
278
279 void _composer_webview_mouse_move_cb(void *data, Evas * evas, Evas_Object *obj, void *event_info)
280 {
281         debug_log("");
282 }
283
284 void _composer_webview_mouse_up_cb(void *data, Evas * evas, Evas_Object *obj, void *event_info)
285 {
286         debug_log("");
287 }
288
289 static void _composer_webkit_script_executed_cb(Evas_Object *o, const char *result, void *data)
290 {
291         debug_log("");
292
293         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
294
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.");
299 }
300
301 void _composer_webkit_loadFinished_cb(void *data, Evas_Object *obj, void *event_info)
302 {
303         debug_log("");
304
305         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
306
307         _composer_webkit_set_body_script(data);
308
309         Ewk_Settings *ewkSetting = NULL;
310         ewkSetting = ewk_view_settings_get(ugd->body_ewkview);
311
312         if (ewkSetting == NULL)
313                 debug_log("ewkSetting is NULL.");
314
315         ewk_settings_auto_fitting_set(ewkSetting, EINA_TRUE);
316         ewk_settings_editable_link_behavior_set(ewkSetting, EWK_EDITABLE_LINK_BEHAVIOR_NEVER_LIVE);
317
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);
321         }
322
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;
326 }
327
328 static void _composer_webkit_focused_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
329 {
330         debug_enter();
331
332         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
333
334         debug_log("Webkit focused");
335
336         // recipients
337         if (ugd->ps_list) {
338                 _composer_ps_stop(ugd);
339                 ugd->sc_timer = ecore_timer_add(0.5, _composer_ps_scroll_pop, ugd);
340         }
341
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);
344
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);
346
347         if (EINA_TRUE == elm_object_focus_get(ugd->to_mbe)) {
348                 debug_log("to_mbe");
349                 elm_object_focus_set(ugd->to_mbe, EINA_FALSE);
350         }
351         else if (EINA_TRUE == elm_object_focus_get(ugd->cc_mbe)) {
352                 debug_log("cc_mbe");
353                 elm_object_focus_set(ugd->cc_mbe, EINA_FALSE);
354         }
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);
358         }
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);
362         }
363
364         ugd->selected_entry = ugd->body_ewkview;
365         evas_object_focus_set(ugd->body_ewkview, EINA_TRUE);
366
367         ugd->focus_status = COMPOSER_FOCUS_STATUS_NONE; // focus handling when rte is clicked
368         _composer_attachment_contract_items(ugd);
369
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.");
373 }
374
375 static void _composer_webkit_unfocused_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
376 {
377         debug_enter();
378
379         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
380
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);
383
384         if (ugd->selected_entry == ugd->body_ewkview) {
385                 debug_log("Webkit unfocused");
386                 evas_object_focus_set(ugd->body_ewkview, EINA_FALSE);
387
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.
390                 }
391         }
392 }
393
394 void _composer_webview_reach_top_cb(void *data, Evas_Object *obj, void *event_info)
395 {
396         debug_log("");
397
398         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
399
400         if (ugd->is_webview_scrolling) {
401                 debug_log("main scroller start");
402                 ewk_view_vertical_panning_hold_set(ugd->body_ewkview, EINA_TRUE);
403
404                 if (elm_widget_scroll_freeze_get(ugd->main_scroller) > 0)
405                         elm_object_scroll_freeze_pop(ugd->main_scroller);
406
407                 /* WORKAROUND. To fix scrolling problem when screen is on the bottom of webview. (Do panning to top fast) */
408                 int x, y, w, h;
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);
412
413                 ugd->is_main_scroller_scrolling = EINA_TRUE;
414                 ugd->is_webview_scrolling = EINA_FALSE;
415         }
416
417         if (ugd->temporary_fix_for_rotation)
418                 ugd->temporary_fix_for_rotation = false;
419 }
420
421 void _composer_webview_reach_bottom_cb(void *data, Evas_Object *obj, void *event_info)
422 {
423         debug_log("");
424
425         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
426
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;
431         }
432 }
433
434 static void _composer_set_original_html_content_cb(Evas_Object *o, const char *result, void *data)
435 {
436         debug_log("");
437
438         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
439
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);
443         }
444
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.");
447 }
448
449 static void _composer_set_original_info_content_cb(Evas_Object *o, const char *result, void *data)
450 {
451         debug_log("");
452
453         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
454
455         if (result != NULL) {
456                 if (ugd->original_info_content) {
457                         g_free(ugd->original_info_content);
458                         ugd->original_info_content = NULL;
459                 }
460                 ugd->original_info_content = g_strdup(result);
461                 debug_log("ugd->original_info_content => \n%s", ugd->original_info_content);
462         }
463 }
464
465 static void _composer_webkit_scroll_up_cb(void *data, Evas_Object *obj, void *event_info)
466 {
467         //debug_log("");
468 }
469
470 static void _composer_webkit_scroll_down_cb(void *data, Evas_Object *obj, void *event_info)
471 {
472         //debug_log("");
473 }
474
475 static void _composer_webkit_ime_closed_cb(void *data, Evas_Object *obj, void *event_info)
476 {
477         debug_log("");
478
479         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
480         _composer_resize_body_webview(ugd, 0);
481
482         elm_object_item_signal_emit(ugd->navi_item, "elm,state,sip,hidden", "");
483         ugd->is_ime_hided = true;
484 }
485
486 static void _composer_webkit_ime_opened_cb(void *data, Evas_Object *obj, void *event_info)
487 {
488         debug_log("");
489         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
490
491         if (ugd->isRotated == true) {
492                 _composer_region_show_cb(ugd);
493                 ugd->isRotated = false;
494         }
495
496         elm_object_item_signal_emit(ugd->navi_item, "elm,state,sip,shown", "");
497         ugd->is_ime_hided = false;
498 }
499
500 static void _composer_webkit_get_ime_rect_cb(void *data, Evas_Object *obj, void *event_info)
501 {
502         debug_log("");
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);
506
507         _composer_resize_body_webview(ugd, rect->h);
508 }
509
510 static void _composer_webview_policy_navigation_decide_cb(void *data, Evas_Object *obj, void *event_info)
511 {
512         debug_log("");
513
514         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
515
516         const char *uri = NULL;
517         uri = ewk_view_url_get(ugd->body_ewkview);
518         debug_log("ewk_view_url_get(%s)", uri);
519
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);
523
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));
529
530                 char *url = (char *)ewk_policy_decision_url_get(policy_decision);
531
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)) {
539                         int ret;
540                         service_h service = NULL;
541                         ret = service_create(&service);
542                         debug_log("service_create: %d", ret);
543                         if (!service) {
544                                 debug_log("service create failed");
545                                 return;
546                         }
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);
555                 }
556         }
557 }
558
559 static void _composer_webview_contextmenu_customize_cb(void *data, Evas_Object *webview, void *event_info)
560 {
561         debug_log("");
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;
567
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);
572
573         switch (menu_item_tag) {
574                 case EWK_CONTEXT_MENU_ITEM_TAG_CUT: // selection
575                 case EWK_CONTEXT_MENU_ITEM_TAG_SEARCH_WEB:
576                         sel = EINA_TRUE;
577                 break;
578                 case EWK_CONTEXT_MENU_ITEM_TAG_PASTE:   // no selection
579                 case EWK_CONTEXT_MENU_ITEM_TAG_SELECT_ALL:
580                         sel = EINA_FALSE;
581                 break;
582                 default:
583                         debug_log("No context menu");
584                         return;
585         }
586
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;
593                 }
594                 ewk_context_menu_item_remove(contextmenu, menu_item);
595         }
596
597         debug_log("Sel = %d, Content = %d", sel, has_content);
598
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);
605                 } else {
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);
611                 }
612         } else {
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);
618                 } else {
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);
624                 }
625         }
626 }
627
628 static void _composer_webview_contextmenu_selected_cb(void *data, Evas_Object *webview, void *event_info)
629 {
630         debug_log("");
631
632         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
633
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;
636
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);
640
641         switch (menu_item_tag) {
642         case EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG : //Smart search
643         {
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);
648
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);
654         }
655         break;
656         default:
657                 debug_log("Never here!");
658         }
659 }
660
661 static void _composer_webkit_get_text_status_cb(void *data, Evas_Object *obj, void *event_info)
662 {
663         debug_log("");
664
665         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
666         Ewk_Text_Style* textStyle = (Ewk_Text_Style *)event_info;
667
668         if ((ugd == NULL) || (textStyle == NULL)) {
669                 return;
670         }
671
672         int ms_x, ms_y, ms_w, ms_h;
673         Evas_Point sp, ep;
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("=================================================");
679
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);
682
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);
688
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);
691
692         if (ugd->isHorizontal == true) {
693                 visible_area = 397;
694         } else {
695                 visible_area = 830;
696         }
697
698         if (ugd->is_prediction == EINA_TRUE) {
699                 visible_area = visible_area - COMPOSER_IME_PREDICTION_H;
700         }
701
702         debug_log("ugd->is_prediction : %d", ugd->is_prediction);
703
704         if (ms_y < 311 + COMPOSER_IME_PREDICTION_H) {
705                 if (ep.y > visible_area) {
706                         if (ewk_sc_y > 0) {
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);
709                         } else {
710                                 elm_scroller_region_bring_in(ugd->main_scroller, ms_x, ep.y - visible_area + ms_y, ms_w, ms_h);
711                         }
712                 }
713         } else {
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);
717                 }
718         }
719 }
720