Merged with 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 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_focused_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
38 static void _composer_webkit_unfocused_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
39 static void _composer_get_html_content_cb(Evas_Object *o, const char *result, void *data);
40
41 static void _composer_webkit_scroll_up_cb(void *data, Evas_Object *obj, void *event_info);
42 static void _composer_webkit_scroll_down_cb(void *data, Evas_Object *obj, void *event_info);
43
44 static void _composer_webkit_get_ime_rect_cb(void *data, Evas_Object *obj, void *event_info);
45 static void _composer_webkit_ime_closed_cb(void *data, Evas_Object *obj, void *event_info);
46 static void _composer_webkit_ime_opened_cb(void *data, Evas_Object *obj, void *event_info);
47 static void _composer_webview_policy_navigation_decide_cb(void *data, Evas_Object *obj, void *event_info);
48 static void _composer_webview_contextmenu_customize_cb(void *data, Evas_Object *webview, void *event_info);
49 static void _composer_webview_contextmenu_selected_cb(void *data, Evas_Object *webview, void *event_info);
50 static void _composer_webkit_get_text_status_cb(void *data, Evas_Object *obj, void *event_info);
51
52
53 static void _changed_cb(void *data, Evas_Object *obj, void *event_info) // This callback is for showing(hiding) X marked button.
54 {
55         debug_log("");
56
57         if (elm_object_focus_get(data)) {
58                 if (elm_entry_is_empty(obj))
59                         elm_object_signal_emit(data, "elm,state,eraser,hide", "elm");
60                 else
61                         elm_object_signal_emit(data, "elm,state,eraser,show", "elm");
62         }
63 }
64
65 static void _focused_cb(void *data, Evas_Object *obj, void *event_info) // Focused callback will show X marked button and hide guidetext.
66 {
67         debug_log("");
68
69         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
70
71         debug_log("ugd->focus_status = %d", ugd->focus_status);
72
73         if (COMPOSER_FOCUS_STATUS_NONE == ugd->focus_status) {
74                 if (!elm_entry_is_empty(obj))
75                         elm_object_signal_emit(ugd->subject_editfield, "elm,state,eraser,show", "elm");
76                 elm_object_signal_emit(ugd->subject_editfield, "elm,state,guidetext,hide", "elm");
77
78                 _composer_attachment_contract_items(ugd);
79
80                 elm_entry_input_panel_show(obj);
81
82                 ugd->selected_entry = ugd->subject_entry;
83                 elm_layout_sizing_eval(ugd->c_layout);
84         } else {
85                 if (ugd->selected_entry == ugd->body_ewkview) {
86                         elm_object_focus_set(ugd->subject_entry, EINA_FALSE);
87                 }
88         }
89 }
90
91 static void _unfocused_cb(void *data, Evas_Object *obj, void *event_info) // Unfocused callback will show guidetext and hide X marked button.
92 {
93         debug_log("");
94         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
95
96         if (ugd->focus_status == COMPOSER_FOCUS_STATUS_SELECTED) {
97                 elm_object_tree_focus_allow_set(ugd->c_layout, EINA_FALSE); // block the focus not to open IME.
98                 ugd->focus_status = COMPOSER_FOCUS_STATUS_NONE;
99                 return;
100         }
101
102         if (elm_entry_is_empty(obj))
103                 elm_object_signal_emit(ugd->subject_editfield, "elm,state,guidetext,show", "elm");
104         elm_object_signal_emit(ugd->subject_editfield, "elm,state,eraser,hide", "elm");
105
106         elm_entry_input_panel_hide(obj);
107 }
108
109 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.
110 {
111         debug_log("");
112
113         elm_entry_entry_set(data, "");
114 }
115
116 void _composer_content_create_content_field(Evas_Object *parent, EmailComposerUGD *ugd)
117 {
118         debug_log("");
119
120         /* Create Subject field */
121         _composer_create_subject_field(parent, ugd);
122
123         /* Create Body field */
124         _composer_create_body_field(parent, ugd);
125 }
126
127 void _composer_create_subject_field(Evas_Object *parent, EmailComposerUGD *ugd)
128 {
129         debug_log("");
130
131         Evas_Object *ly;
132
133         ly = _composer_create_subject_editfield(parent, dgettext("sys_string", "IDS_COM_BODY_SUBJECT"), ugd);
134
135         _composer_register_editfield_entry_callback(ugd->subject_entry, ugd);
136
137         evas_object_smart_callback_add(ugd->subject_entry, "changed", _changed_cb, ugd->subject_editfield);
138         evas_object_smart_callback_add(ugd->subject_entry, "focused", _focused_cb, ugd);
139         evas_object_smart_callback_add(ugd->subject_entry, "unfocused", _unfocused_cb, ugd);
140         elm_object_signal_callback_add(ugd->subject_editfield, "elm,eraser,clicked", "elm", _eraser_clicked_cb, ugd->subject_entry);
141
142         elm_object_part_content_set(parent, "subject_field", ly);
143
144         ugd->subject_ly = ly;
145 }
146
147 Evas_Object *_composer_create_subject_editfield(Evas_Object *parent, char *title, EmailComposerUGD *ugd)
148 {
149         debug_log("");
150
151         Evas_Object *ly;
152         Evas_Object *ef;
153         Evas_Object *entry = NULL;
154
155         ly = elm_layout_add(parent);
156
157         elm_layout_file_set(ly, COMPOSER_EDJ_NAME, "layout.subject");
158         evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
159         evas_object_size_hint_align_set(ly, EVAS_HINT_FILL, EVAS_HINT_FILL);
160         evas_object_show(ly);
161
162         ef = elm_layout_add(parent);
163         elm_layout_theme_set(ef, "layout", "editfield", "default");
164         evas_object_size_hint_weight_set(ef, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
165         evas_object_size_hint_align_set(ef, EVAS_HINT_FILL, EVAS_HINT_FILL);
166         evas_object_show(ef);
167
168         elm_object_part_text_set(ef, "elm.guidetext", title);
169         elm_object_part_content_set(ly, "subject.editfield", ef);
170         ugd->subject_editfield = ef;
171
172         entry = elm_entry_add(ef);
173         elm_entry_scrollable_set(entry, EINA_TRUE);
174         elm_entry_single_line_set(entry, EINA_TRUE);
175         elm_entry_input_panel_layout_set(entry, ELM_INPUT_PANEL_LAYOUT_NORMAL);
176         elm_entry_cnp_mode_set(entry, ELM_CNP_MODE_PLAINTEXT);
177         evas_object_show(entry);
178         elm_entry_text_style_user_push(entry, "DEFAULT='font_size=32 color=#000000'");
179
180         elm_object_part_content_set(ef, "elm.swallow.content", entry);
181         ugd->subject_entry = entry;
182
183         return ly;
184 }
185
186 void _composer_create_body_field(Evas_Object *parent, EmailComposerUGD *ugd)
187 {
188         debug_log("");
189
190         Evas_Object *body_ly;
191
192         body_ly = _composer_create_body_webview(parent, NULL, ugd);
193
194         elm_object_part_content_set(parent, "content_field", body_ly);
195
196         ugd->webkit_ly = body_ly;
197 }
198
199 void _composer_register_editfield_entry_callback(Evas_Object *obj, EmailComposerUGD *ugd)
200 {
201         debug_log("");
202
203         evas_object_smart_callback_add(obj, "changed", _composer_edit_field_changed_cb, ugd);
204         evas_object_smart_callback_add(obj, "preedit,changed", _composer_edit_field_changed_cb, ugd);
205
206         Ecore_IMF_Context *imf_context = elm_entry_imf_context_get(obj);
207         ecore_imf_context_input_panel_event_callback_add (imf_context, ECORE_IMF_INPUT_PANEL_GEOMETRY_EVENT, _composer_input_panel_resize_cb, ugd);
208         ecore_imf_context_input_panel_event_callback_add(imf_context, ECORE_IMF_INPUT_PANEL_STATE_EVENT, _composer_input_panel_state_changed_cb, ugd);
209         debug_log("ugd->is_prediction: %d", ugd->is_prediction);
210 }
211
212 void _composer_webkit_set_body_script(void *data)
213 {
214         debug_log("");
215         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
216
217         if (ugd == NULL)
218                 return;
219
220         if (ewk_view_script_execute(ugd->body_ewkview, COMPOSER_JS_ENABLE_EDITABLE, _composer_script_executed_cb, NULL) == EINA_FALSE)
221                 debug_log("COMPOSER_JS_ENABLE_EDITABLE failed.");
222
223         if (ewk_view_script_execute(ugd->body_ewkview, COMPOSER_JS_GET_HTML_CONTENT, _composer_get_html_content_cb, (void *)ugd) == EINA_FALSE)
224                 debug_log("COMPOSER_JS_GET_HTML_CONTENT failed.");
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 void _composer_webkit_loadFinished_cb(void *data, Evas_Object *obj, void *event_info)
293 {
294         debug_log("");
295
296         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
297
298         _composer_webkit_set_body_script(data);
299
300         Ewk_Settings *ewkSetting = NULL;
301         ewkSetting = ewk_view_settings_get(ugd->body_ewkview);
302
303         if (ewkSetting == NULL)
304                 debug_log("ewkSetting is NULL.");
305
306         ewk_settings_auto_fitting_set(ewkSetting, EINA_TRUE);
307         ewk_settings_editable_link_behavior_set(ewkSetting, EWK_EDITABLE_LINK_BEHAVIOR_NEVER_LIVE);
308
309         if (ugd->selected_entry == ugd->body_ewkview) {
310                 // focus to the body field when reply the email.
311                 evas_object_focus_set(ugd->body_ewkview, EINA_TRUE);
312         }
313
314         elm_object_disabled_set(ugd->cancel_btn, EINA_FALSE);
315         elm_object_disabled_set(ugd->cancel_btm_btn, EINA_FALSE);
316         ugd->b_load_finished = EINA_TRUE;
317 }
318
319 static void _composer_webkit_focused_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
320 {
321         debug_enter();
322
323         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
324
325         debug_log("Webkit focused");
326
327         // recipients
328         if (ugd->ps_list) {
329                 _composer_ps_stop(ugd);
330                 ugd->sc_timer = ecore_timer_add(0.5, _composer_ps_scroll_pop, ugd);
331         }
332
333         debug_log("selected_entry = %x, to_mbe_entry = %x, cc_mbe_entry = %x, bcc_mbe_entry = %x, subject_entry = %x, body_ewkview = %x",
334                 ugd->selected_entry, ugd->to_mbe_entry, ugd->cc_mbe_entry, ugd->bcc_mbe_entry, ugd->subject_entry, ugd->body_ewkview);
335
336         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);
337
338         if (EINA_TRUE == elm_object_focus_get(ugd->to_mbe)) {
339                 debug_log("to_mbe");
340                 elm_object_focus_set(ugd->to_mbe, EINA_FALSE);
341         }
342         else if (EINA_TRUE == elm_object_focus_get(ugd->cc_mbe)) {
343                 debug_log("cc_mbe");
344                 elm_object_focus_set(ugd->cc_mbe, EINA_FALSE);
345         }
346         else if (EINA_TRUE == elm_object_focus_get(ugd->bcc_mbe)) {
347                 debug_log("bcc_mbe");
348                 elm_object_focus_set(ugd->bcc_mbe, EINA_FALSE);
349         }
350         else if (EINA_TRUE == elm_object_focus_get(ugd->subject_entry)) {
351                 debug_log("subject_entry");
352                 elm_object_focus_set(ugd->subject_entry, EINA_FALSE);
353         }
354
355         ugd->selected_entry = ugd->body_ewkview;
356         evas_object_focus_set(ugd->body_ewkview, EINA_TRUE);
357
358         ugd->focus_status = COMPOSER_FOCUS_STATUS_NONE; // focus handling when rte is clicked
359         _composer_attachment_contract_items(ugd);
360
361         elm_layout_sizing_eval(ugd->c_layout);
362         if (ewk_view_script_execute(ugd->body_ewkview, COMPOSER_JS_SET_FOCUS, _composer_script_executed_cb, NULL) == EINA_FALSE)
363                 debug_log("COMPOSER_JS_SET_FOCUS failed.");
364 }
365
366 static void _composer_webkit_unfocused_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
367 {
368         debug_enter();
369
370         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
371
372         debug_log("selected_entry = %x, to_mbe_entry = %x, cc_mbe_entry = %x, bcc_mbe_entry = %x, subject_entry = %x, body_ewkview = %x",
373                 ugd->selected_entry, ugd->to_mbe_entry, ugd->cc_mbe_entry, ugd->bcc_mbe_entry, ugd->subject_entry, ugd->body_ewkview);
374
375         if (ugd->selected_entry == ugd->body_ewkview) {
376                 debug_log("Webkit unfocused");
377                 evas_object_focus_set(ugd->body_ewkview, EINA_FALSE);
378
379                 if (ugd->focus_status == COMPOSER_FOCUS_STATUS_SELECTED) {
380                         elm_object_tree_focus_allow_set(ugd->c_layout, EINA_FALSE); // block the focus not to open IME.
381                         ugd->focus_status = COMPOSER_FOCUS_STATUS_NONE;
382                 }
383         }
384 }
385
386 void _composer_webview_reach_top_cb(void *data, Evas_Object *obj, void *event_info)
387 {
388         debug_log("");
389
390         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
391
392         if (ugd->is_webview_scrolling) {
393                 debug_log("main scroller start");
394                 ewk_view_vertical_panning_hold_set(ugd->body_ewkview, EINA_TRUE);
395
396                 if (elm_widget_scroll_freeze_get(ugd->main_scroller) > 0)
397                         elm_object_scroll_freeze_pop(ugd->main_scroller);
398
399                 /* WORKAROUND. To fix scrolling problem when screen is on the bottom of webview. (Do panning to top fast) */
400                 int x, y, w, h;
401                 elm_scroller_region_get(ugd->main_scroller, &x, &y, &w, &h);
402                 debug_log("main_scroller(x:%d, y:%d, w:%d, h:%d)", x, y, w, h);
403                 elm_scroller_region_bring_in(ugd->main_scroller, x, 0, w, h);
404
405                 ugd->is_main_scroller_scrolling = EINA_TRUE;
406                 ugd->is_webview_scrolling = EINA_FALSE;
407         }
408
409         if (ugd->temporary_fix_for_rotation)
410                 ugd->temporary_fix_for_rotation = false;
411 }
412
413 void _composer_webview_reach_bottom_cb(void *data, Evas_Object *obj, void *event_info)
414 {
415         debug_log("");
416
417         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
418
419         if (ugd->temporary_fix_for_rotation) {
420                 if (elm_widget_scroll_freeze_get(ugd->main_scroller) > 0)
421                         elm_object_scroll_freeze_pop(ugd->main_scroller);
422                 ugd->temporary_fix_for_rotation = false;
423         }
424 }
425
426 static void _composer_get_html_content_cb(Evas_Object *o, const char *result, void *data)
427 {
428         debug_log("");
429
430         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
431
432         if (result != NULL) {
433                 ugd->saved_html_content = g_strdup(result);
434                 debug_log("ugd->saved_html_content => %s", ugd->saved_html_content);
435         }
436 }
437
438 static void _composer_webkit_scroll_up_cb(void *data, Evas_Object *obj, void *event_info)
439 {
440         //debug_log("");
441 }
442
443 static void _composer_webkit_scroll_down_cb(void *data, Evas_Object *obj, void *event_info)
444 {
445         //debug_log("");
446 }
447
448 static void _composer_webkit_ime_closed_cb(void *data, Evas_Object *obj, void *event_info)
449 {
450         debug_log("");
451
452         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
453         _composer_resize_body_webview(ugd, 0);
454
455         elm_object_item_signal_emit(ugd->navi_item, "elm,state,sip,hidden", "");
456         ugd->is_ime_hided = true;
457 }
458
459 static void _composer_webkit_ime_opened_cb(void *data, Evas_Object *obj, void *event_info)
460 {
461         debug_log("");
462         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
463
464         if (ugd->isRotated == true) {
465                 _composer_region_show_cb(ugd);
466                 ugd->isRotated = false;
467         }
468
469         elm_object_item_signal_emit(ugd->navi_item, "elm,state,sip,shown", "");
470         ugd->is_ime_hided = false;
471 }
472
473 static void _composer_webkit_get_ime_rect_cb(void *data, Evas_Object *obj, void *event_info)
474 {
475         debug_log("");
476         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
477         Eina_Rectangle *rect = (Eina_Rectangle*)event_info;
478         debug_log("inputmethod,changed (x:%d,y:%d,w:%d,h:%d)\n", rect->x, rect->y, rect->w, rect->h);
479
480         _composer_resize_body_webview(ugd, rect->h);
481 }
482
483 static void _composer_webview_policy_navigation_decide_cb(void *data, Evas_Object *obj, void *event_info)
484 {
485         debug_log("");
486
487         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
488
489         const char *uri = NULL;
490         uri = ewk_view_url_get(ugd->body_ewkview);
491         debug_log("ewk_view_url_get(%s)", uri);
492
493         if (ugd->b_load_finished == EINA_TRUE) {
494                 Ewk_Policy_Decision *policy_decision = (Ewk_Policy_Decision *)event_info;
495                 ewk_policy_decision_ignore(policy_decision);
496
497                 debug_log("url:%s", ewk_policy_decision_url_get(policy_decision));
498                 debug_log("scheme:%s", ewk_policy_decision_scheme_get(policy_decision));
499                 debug_log("cookie:%s", ewk_policy_decision_cookie_get(policy_decision));
500                 debug_log("host:%s", ewk_policy_decision_host_get(policy_decision));
501                 debug_log("response_mime:%s", ewk_policy_decision_response_mime_get(policy_decision));
502
503                 char *url = (char *)ewk_policy_decision_url_get(policy_decision);
504
505                 if ((strncmp(url, "http://", 7) == 0) ||
506                         (strncmp(url, "https://", 8) == 0) ||
507                         (strncmp(url, "ftp://", 6) == 0) ||
508                         (strncmp(url, "mms://", 6) == 0) ||
509                         (strncmp(url, "file://", 7) == 0) ||
510                         (strncmp(url, "rtsp://", 7) == 0) ||
511                         (strncmp(url, "wap://", 6) == 0)) {
512                         int ret;
513                         service_h service = NULL;
514                         ret = service_create(&service);
515                         debug_log("service_create: %d", ret);
516                         if (!service) {
517                                 debug_log("service create failed");
518                                 return;
519                         }
520                         ret = service_set_operation(service, SERVICE_OPERATION_VIEW);
521                         debug_log("service_set_operation: %d", ret);
522                         ret = service_set_uri(service, url);
523                         debug_log("service_set_uri: %d", ret);
524                         ret = service_send_launch_request(service, NULL, NULL);
525                         debug_log("service_send_launch_request: %d", ret);
526                         ret = service_destroy(service);
527                         debug_log("service_destroy: %d", ret);
528                 }
529         }
530 }
531
532 static void _composer_webview_contextmenu_customize_cb(void *data, Evas_Object *webview, void *event_info)
533 {
534         debug_log("");
535         int i = 0, count = 0;
536         Eina_Bool sel = EINA_FALSE, has_content = EINA_FALSE;
537         Ewk_Context_Menu* contextmenu = (Ewk_Context_Menu*)event_info;
538         Ewk_Context_Menu_Item* menu_item = NULL;
539         Ewk_Context_Menu_Item_Tag menu_item_tag = EWK_CONTEXT_MENU_ITEM_TAG_NO_ACTION;
540
541         count = ewk_context_menu_item_count(contextmenu);
542         menu_item = ewk_context_menu_nth_item_get(contextmenu, 0);
543         menu_item_tag = ewk_context_menu_item_tag_get(menu_item);
544         debug_log("menu_item_tag : %d", menu_item_tag);
545
546         switch (menu_item_tag) {
547                 case EWK_CONTEXT_MENU_ITEM_TAG_CUT: // selection
548                 case EWK_CONTEXT_MENU_ITEM_TAG_SEARCH_WEB:
549                         sel = EINA_TRUE;
550                 break;
551                 case EWK_CONTEXT_MENU_ITEM_TAG_PASTE:   // no selection
552                 case EWK_CONTEXT_MENU_ITEM_TAG_SELECT_ALL:
553                         sel = EINA_FALSE;
554                 break;
555                 default:
556                         debug_log("No context menu");
557                         return;
558         }
559
560         for (i = 0; i < count; i++) {
561                 menu_item = ewk_context_menu_nth_item_get(contextmenu, 0);
562                 menu_item_tag = ewk_context_menu_item_tag_get(menu_item);
563                 debug_log("menu_item_tag in for: %d", menu_item_tag);
564                 if (menu_item_tag == EWK_CONTEXT_MENU_ITEM_TAG_SELECT_ALL) { // has content
565                         has_content = EINA_TRUE;
566                 }
567                 ewk_context_menu_item_remove(contextmenu, menu_item);
568         }
569
570         debug_log("Sel = %d, Content = %d", sel, has_content);
571
572         if (sel == EINA_FALSE) {
573                 if (has_content == EINA_FALSE) {
574                         debug_log("no contents");
575                         ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_PASTE, _("IDS_EMAIL_OPT_PASTE"), EINA_TRUE);
576                         ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_CLIPBOARD, _("IDS_EMAIL_OPT_CLIPBOARD"), EINA_TRUE); // for Clipboard
577                         ewk_context_menu_item_append(contextmenu, EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG, NULL, IMGDIR"/icon_search.png", EINA_TRUE);
578                 } else {
579                         ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_SELECT_WORD, _("IDS_EMAIL_OPT_SELECT"), EINA_TRUE);
580                         ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_SELECT_ALL, _("IDS_EMAIL_OPT_SELECT_ALL"), EINA_TRUE);
581                         ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_PASTE, _("IDS_EMAIL_OPT_PASTE"), EINA_TRUE);
582                         ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_CLIPBOARD, _("IDS_EMAIL_OPT_CLIPBOARD"), EINA_TRUE); // for Clipboard
583                         ewk_context_menu_item_append(contextmenu, EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG, NULL, IMGDIR"/icon_search.png", EINA_TRUE);
584                 }
585         } else {
586                 if (has_content == EINA_FALSE) {
587                         ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_COPY, _("IDS_EMAIL_OPT_COPY"), EINA_TRUE);
588                         ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_CUT, _("IDS_EMAIL_OPT_CUT"), EINA_TRUE);
589                         ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_CLIPBOARD, _("IDS_EMAIL_OPT_CLIPBOARD"), EINA_TRUE); // for Clipboard
590                         ewk_context_menu_item_append(contextmenu, EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG, NULL, IMGDIR"/icon_search.png", EINA_TRUE);
591                 } else {
592                         ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_COPY, _("IDS_EMAIL_OPT_COPY"), EINA_TRUE);
593                         ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_CUT, _("IDS_EMAIL_OPT_CUT"), EINA_TRUE);
594                         ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_PASTE, _("IDS_EMAIL_OPT_PASTE"), EINA_TRUE);
595                         ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_CLIPBOARD, _("IDS_EMAIL_OPT_CLIPBOARD"), EINA_TRUE); // for Clipboard
596                         ewk_context_menu_item_append(contextmenu, EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG, NULL, IMGDIR"/icon_search.png", EINA_TRUE);
597                 }
598         }
599 }
600
601 static void _composer_webview_contextmenu_selected_cb(void *data, Evas_Object *webview, void *event_info)
602 {
603         debug_log("");
604
605         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
606
607         Ewk_Context_Menu_Item* menu_item = (Ewk_Context_Menu_Item*)event_info;
608         Ewk_Context_Menu_Item_Tag menu_item_tag = EWK_CONTEXT_MENU_ITEM_TAG_NO_ACTION;
609
610         debug_log("menu_item : %d", menu_item);
611         menu_item_tag = ewk_context_menu_item_tag_get(menu_item);
612         debug_log("menu_item_tag : %d", menu_item_tag);
613
614         switch (menu_item_tag) {
615         case EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG : //Smart search
616         {
617                 service_h service = NULL;
618                 const char *keyword = NULL;
619                 keyword = ewk_view_text_selection_text_get(ugd->body_ewkview);
620                 debug_log("keyword : %s", keyword);
621
622                 service_create(&service);
623                 service_set_operation(service, SERVICE_OPERATION_SEARCH);
624                 service_add_extra_data(service, "http://tizen.org/appcontrol/data/keyword", keyword);
625                 service_send_launch_request(service, NULL, NULL);
626                 service_destroy(service);
627         }
628         break;
629         default:
630                 debug_log("Never here!");
631         }
632 }
633
634 static void _composer_webkit_get_text_status_cb(void *data, Evas_Object *obj, void *event_info)
635 {
636         debug_log("");
637
638         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
639         Ewk_Text_Style* textStyle = (Ewk_Text_Style *)event_info;
640
641         if ((ugd == NULL) || (textStyle == NULL)) {
642                 return;
643         }
644
645         int ms_x, ms_y, ms_w, ms_h;
646         Evas_Point sp, ep;
647         ewk_text_style_position_get(textStyle, &sp, &ep);
648         debug_log("=================================================");
649         debug_log("1. Start Point : sp.x(%d), sp.y(%d)", sp.x, sp.y);
650         debug_log("1. End Point : ep.x(%d), ep.y(%d)", ep.x, ep.y);
651         debug_log("=================================================");
652
653         elm_scroller_region_get(ugd->main_scroller, &ms_x, &ms_y, &ms_w, &ms_h);
654         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);
655
656         int visible_area = 0;
657         int ewk_sc_x, ewk_sc_y;
658         Evas_Coord ewk_ct_w,ewk_ct_h;
659         ewk_view_scroll_pos_get(ugd->body_ewkview, &ewk_sc_x, &ewk_sc_y);
660         debug_log("ewk_view_scroll_pos_get(ewk_sc_x:%d, ewk_sc_y:%d)", ewk_sc_x, ewk_sc_y);
661
662         ewk_view_contents_size_get(ugd->body_ewkview, &ewk_ct_w, &ewk_ct_h);
663         debug_log("ewk_view_contents_size_get(ewk_ct_w:%d, ewk_ct_h:%d)", ewk_ct_w, ewk_ct_h);
664
665         if (ugd->isHorizontal == true) {
666                 visible_area = 397;
667         } else {
668                 visible_area = 830;
669         }
670
671         if (ugd->is_prediction == EINA_TRUE) {
672                 visible_area = visible_area - COMPOSER_IME_PREDICTION_H;
673         }
674
675         debug_log("ugd->is_prediction : %d", ugd->is_prediction);
676
677         if (ms_y < 311 + COMPOSER_IME_PREDICTION_H) {
678                 if (ep.y > visible_area) {
679                         if (ewk_sc_y > 0) {
680                                 elm_scroller_region_show(ugd->main_scroller, ms_x, 10000, ms_w, ms_h);
681                                 ewk_view_scroll_set(ugd->body_ewkview, 0, ep.y - visible_area + ewk_sc_y);
682                         } else {
683                                 elm_scroller_region_bring_in(ugd->main_scroller, ms_x, ep.y - visible_area + ms_y, ms_w, ms_h);
684                         }
685                 }
686         } else {
687                 if (ep.y > visible_area) {
688                         elm_scroller_region_show(ugd->main_scroller, ms_x, 10000, ms_w, ms_h);
689                         ewk_view_scroll_set(ugd->body_ewkview, 0, ep.y - visible_area + ewk_sc_y);
690                 }
691         }
692 }
693