0b37e23d97b98b92047aefd6dd67e6bd92bf3ed3
[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 }
303
304 void _composer_webkit_loadFinished_cb(void *data, Evas_Object *obj, void *event_info)
305 {
306         debug_log("");
307
308         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
309
310         _composer_webkit_set_body_script(data);
311
312         Ewk_Settings *ewkSetting = NULL;
313         ewkSetting = ewk_view_settings_get(ugd->body_ewkview);
314
315         if (ewkSetting == NULL)
316                 debug_log("ewkSetting is NULL.");
317
318         ewk_settings_auto_fitting_set(ewkSetting, EINA_TRUE);
319         ewk_settings_editable_link_behavior_set(ewkSetting, EWK_EDITABLE_LINK_BEHAVIOR_NEVER_LIVE);
320
321         if (ugd->selected_entry == ugd->body_ewkview) {
322                 // focus to the body field when reply the email.
323                 evas_object_focus_set(ugd->body_ewkview, EINA_TRUE);
324         }
325
326         elm_object_disabled_set(ugd->cancel_btn, EINA_FALSE);
327         elm_object_disabled_set(ugd->cancel_btm_btn, EINA_FALSE);
328         ugd->b_load_finished = EINA_TRUE;
329
330         _composer_attachment_contract_items(ugd);
331 }
332
333 static void _composer_webkit_focused_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
334 {
335         debug_enter();
336
337         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
338
339         debug_log("Webkit focused");
340
341         // recipients
342         if (ugd->ps_list) {
343                 _composer_ps_stop(ugd);
344                 ugd->sc_timer = ecore_timer_add(0.5, _composer_ps_scroll_pop, ugd);
345         }
346
347         debug_log("selected_entry = %x, to_mbe_entry = %x, cc_mbe_entry = %x, bcc_mbe_entry = %x, subject_entry = %x, body_ewkview = %x",
348                 ugd->selected_entry, ugd->to_mbe_entry, ugd->cc_mbe_entry, ugd->bcc_mbe_entry, ugd->subject_entry, ugd->body_ewkview);
349
350         debug_log("obj = %x, to_mbe = %x, cc_mbe = %x, bcc_mbe = %x, subject_editfield = %x", obj, ugd->to_mbe, ugd->cc_mbe, ugd->bcc_mbe, ugd->subject_editfield);
351
352         if (EINA_TRUE == elm_object_focus_get(ugd->to_mbe)) {
353                 debug_log("to_mbe");
354                 elm_object_focus_set(ugd->to_mbe, EINA_FALSE);
355         }
356         else if (EINA_TRUE == elm_object_focus_get(ugd->cc_mbe)) {
357                 debug_log("cc_mbe");
358                 elm_object_focus_set(ugd->cc_mbe, EINA_FALSE);
359         }
360         else if (EINA_TRUE == elm_object_focus_get(ugd->bcc_mbe)) {
361                 debug_log("bcc_mbe");
362                 elm_object_focus_set(ugd->bcc_mbe, EINA_FALSE);
363         }
364         else if (EINA_TRUE == elm_object_focus_get(ugd->subject_entry)) {
365                 debug_log("subject_entry");
366                 elm_object_focus_set(ugd->subject_entry, EINA_FALSE);
367         }
368
369         ugd->selected_entry = ugd->body_ewkview;
370         evas_object_focus_set(ugd->body_ewkview, EINA_TRUE);
371
372         ugd->focus_status = COMPOSER_FOCUS_STATUS_NONE; // focus handling when rte is clicked
373         _composer_attachment_contract_items(ugd);
374
375         elm_layout_sizing_eval(ugd->c_layout);
376         if (ewk_view_script_execute(ugd->body_ewkview, COMPOSER_JS_SET_FOCUS, _composer_script_executed_cb, NULL) == EINA_FALSE)
377                 debug_log("COMPOSER_JS_SET_FOCUS failed.");
378 }
379
380 static void _composer_webkit_unfocused_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
381 {
382         debug_enter();
383
384         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
385
386         debug_log("selected_entry = %x, to_mbe_entry = %x, cc_mbe_entry = %x, bcc_mbe_entry = %x, subject_entry = %x, body_ewkview = %x",
387                 ugd->selected_entry, ugd->to_mbe_entry, ugd->cc_mbe_entry, ugd->bcc_mbe_entry, ugd->subject_entry, ugd->body_ewkview);
388
389         if (ugd->selected_entry == ugd->body_ewkview) {
390                 debug_log("Webkit unfocused");
391                 evas_object_focus_set(ugd->body_ewkview, EINA_FALSE);
392
393                 if (ugd->focus_status == COMPOSER_FOCUS_STATUS_SELECTED) {
394                         elm_object_tree_focus_allow_set(ugd->c_layout, EINA_FALSE); // block the focus not to open IME.
395                 }
396         }
397 }
398
399 void _composer_webview_reach_top_cb(void *data, Evas_Object *obj, void *event_info)
400 {
401         debug_log("");
402
403         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
404
405         if (ugd->is_webview_scrolling) {
406                 debug_log("main scroller start");
407                 ewk_view_vertical_panning_hold_set(ugd->body_ewkview, EINA_TRUE);
408
409                 if (elm_widget_scroll_freeze_get(ugd->main_scroller) > 0)
410                         elm_object_scroll_freeze_pop(ugd->main_scroller);
411
412                 /* WORKAROUND. To fix scrolling problem when screen is on the bottom of webview. (Do panning to top fast) */
413                 int x, y, w, h;
414                 elm_scroller_region_get(ugd->main_scroller, &x, &y, &w, &h);
415                 debug_log("main_scroller(x:%d, y:%d, w:%d, h:%d)", x, y, w, h);
416                 elm_scroller_region_bring_in(ugd->main_scroller, x, 0, w, h);
417
418                 ugd->is_main_scroller_scrolling = EINA_TRUE;
419                 ugd->is_webview_scrolling = EINA_FALSE;
420         }
421
422         if (ugd->temporary_fix_for_rotation)
423                 ugd->temporary_fix_for_rotation = false;
424 }
425
426 void _composer_webview_reach_bottom_cb(void *data, Evas_Object *obj, void *event_info)
427 {
428         debug_log("");
429
430         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
431
432         if (ugd->temporary_fix_for_rotation) {
433                 if (elm_widget_scroll_freeze_get(ugd->main_scroller) > 0)
434                         elm_object_scroll_freeze_pop(ugd->main_scroller);
435                 ugd->temporary_fix_for_rotation = false;
436         }
437 }
438
439 static void _composer_set_original_html_content_cb(Evas_Object *o, const char *result, void *data)
440 {
441         debug_log("");
442
443         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
444
445         if (result != NULL) {
446                 ugd->original_html_content = g_strdup(result);
447                 debug_log("ugd->original_html_content => \n%s", ugd->original_html_content);
448         }
449
450         if (ewk_view_script_execute(ugd->body_ewkview, COMPOSER_JS_ENABLE_EDITABLE, _composer_script_executed_cb, NULL) == EINA_FALSE)
451                 debug_log("COMPOSER_JS_ENABLE_EDITABLE failed.");
452 }
453
454 static void _composer_set_original_info_content_cb(Evas_Object *o, const char *result, void *data)
455 {
456         debug_log("");
457
458         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
459
460         if (result != NULL) {
461                 if (ugd->original_info_content) {
462                         g_free(ugd->original_info_content);
463                         ugd->original_info_content = NULL;
464                 }
465                 ugd->original_info_content = g_strdup(result);
466                 debug_log("ugd->original_info_content => \n%s", ugd->original_info_content);
467         }
468 }
469
470 static void _composer_webkit_scroll_up_cb(void *data, Evas_Object *obj, void *event_info)
471 {
472         //debug_log("");
473 }
474
475 static void _composer_webkit_scroll_down_cb(void *data, Evas_Object *obj, void *event_info)
476 {
477         //debug_log("");
478 }
479
480 static void _composer_webkit_ime_closed_cb(void *data, Evas_Object *obj, void *event_info)
481 {
482         debug_log("");
483
484         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
485         _composer_resize_body_webview(ugd, 0);
486
487         elm_object_item_signal_emit(ugd->navi_item, "elm,state,sip,hidden", "");
488         ugd->is_ime_hided = true;
489 }
490
491 static void _composer_webkit_ime_opened_cb(void *data, Evas_Object *obj, void *event_info)
492 {
493         debug_log("");
494         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
495
496         if (ugd->isRotated == true) {
497                 _composer_region_show_cb(ugd);
498                 ugd->isRotated = false;
499         }
500
501         elm_object_item_signal_emit(ugd->navi_item, "elm,state,sip,shown", "");
502         ugd->is_ime_hided = false;
503 }
504
505 static void _composer_webkit_get_ime_rect_cb(void *data, Evas_Object *obj, void *event_info)
506 {
507         debug_log("");
508         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
509         Eina_Rectangle *rect = (Eina_Rectangle*)event_info;
510         debug_log("inputmethod,changed (x:%d,y:%d,w:%d,h:%d)\n", rect->x, rect->y, rect->w, rect->h);
511
512         _composer_resize_body_webview(ugd, rect->h);
513 }
514
515 static void _composer_webview_policy_navigation_decide_cb(void *data, Evas_Object *obj, void *event_info)
516 {
517         debug_log("");
518
519         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
520
521         const char *uri = NULL;
522         uri = ewk_view_url_get(ugd->body_ewkview);
523         debug_log("ewk_view_url_get(%s)", uri);
524
525         if (ugd->b_load_finished == EINA_TRUE) {
526                 Ewk_Policy_Decision *policy_decision = (Ewk_Policy_Decision *)event_info;
527                 ewk_policy_decision_ignore(policy_decision);
528
529                 debug_log("url:%s", ewk_policy_decision_url_get(policy_decision));
530                 debug_log("scheme:%s", ewk_policy_decision_scheme_get(policy_decision));
531                 debug_log("cookie:%s", ewk_policy_decision_cookie_get(policy_decision));
532                 debug_log("host:%s", ewk_policy_decision_host_get(policy_decision));
533                 debug_log("response_mime:%s", ewk_policy_decision_response_mime_get(policy_decision));
534
535                 char *url = (char *)ewk_policy_decision_url_get(policy_decision);
536
537                 if ((strncmp(url, "http://", 7) == 0) ||
538                         (strncmp(url, "https://", 8) == 0) ||
539                         (strncmp(url, "ftp://", 6) == 0) ||
540                         (strncmp(url, "mms://", 6) == 0) ||
541                         (strncmp(url, "file://", 7) == 0) ||
542                         (strncmp(url, "rtsp://", 7) == 0) ||
543                         (strncmp(url, "wap://", 6) == 0)) {
544                         int ret;
545                         service_h service = NULL;
546                         ret = service_create(&service);
547                         debug_log("service_create: %d", ret);
548                         if (!service) {
549                                 debug_log("service create failed");
550                                 return;
551                         }
552                         ret = service_set_operation(service, SERVICE_OPERATION_VIEW);
553                         debug_log("service_set_operation: %d", ret);
554                         ret = service_set_uri(service, url);
555                         debug_log("service_set_uri: %d", ret);
556                         ret = service_send_launch_request(service, NULL, NULL);
557                         debug_log("service_send_launch_request: %d", ret);
558                         ret = service_destroy(service);
559                         debug_log("service_destroy: %d", ret);
560                 }
561         }
562 }
563
564 static void _composer_webview_contextmenu_customize_cb(void *data, Evas_Object *webview, void *event_info)
565 {
566         debug_log("");
567         int i = 0, count = 0;
568         Eina_Bool sel = EINA_FALSE, has_content = EINA_FALSE;
569         Ewk_Context_Menu* contextmenu = (Ewk_Context_Menu*)event_info;
570         Ewk_Context_Menu_Item* menu_item = NULL;
571         Ewk_Context_Menu_Item_Tag menu_item_tag = EWK_CONTEXT_MENU_ITEM_TAG_NO_ACTION;
572
573         count = ewk_context_menu_item_count(contextmenu);
574         menu_item = ewk_context_menu_nth_item_get(contextmenu, 0);
575         menu_item_tag = ewk_context_menu_item_tag_get(menu_item);
576         debug_log("menu_item_tag : %d", menu_item_tag);
577
578         switch (menu_item_tag) {
579                 case EWK_CONTEXT_MENU_ITEM_TAG_CUT: // selection
580                 case EWK_CONTEXT_MENU_ITEM_TAG_SEARCH_WEB:
581                         sel = EINA_TRUE;
582                 break;
583                 case EWK_CONTEXT_MENU_ITEM_TAG_PASTE:   // no selection
584                 case EWK_CONTEXT_MENU_ITEM_TAG_SELECT_ALL:
585                         sel = EINA_FALSE;
586                 break;
587                 default:
588                         debug_log("No context menu");
589                         return;
590         }
591
592         for (i = 0; i < count; i++) {
593                 menu_item = ewk_context_menu_nth_item_get(contextmenu, 0);
594                 menu_item_tag = ewk_context_menu_item_tag_get(menu_item);
595                 debug_log("menu_item_tag in for: %d", menu_item_tag);
596                 if (menu_item_tag == EWK_CONTEXT_MENU_ITEM_TAG_SELECT_ALL) { // has content
597                         has_content = EINA_TRUE;
598                 }
599                 ewk_context_menu_item_remove(contextmenu, menu_item);
600         }
601
602         debug_log("Sel = %d, Content = %d", sel, has_content);
603
604         if (sel == EINA_FALSE) {
605                 if (has_content == EINA_FALSE) {
606                         debug_log("no contents");
607                         ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_PASTE, _("IDS_EMAIL_OPT_PASTE"), EINA_TRUE);
608                         ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_CLIPBOARD, _("IDS_EMAIL_OPT_CLIPBOARD"), EINA_TRUE); // for Clipboard
609                         ewk_context_menu_item_append(contextmenu, EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG, NULL, IMGDIR"/icon_search.png", EINA_TRUE);
610                 } else {
611                         ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_SELECT_WORD, _("IDS_EMAIL_OPT_SELECT"), EINA_TRUE);
612                         ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_SELECT_ALL, _("IDS_EMAIL_OPT_SELECT_ALL"), EINA_TRUE);
613                         ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_PASTE, _("IDS_EMAIL_OPT_PASTE"), EINA_TRUE);
614                         ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_CLIPBOARD, _("IDS_EMAIL_OPT_CLIPBOARD"), EINA_TRUE); // for Clipboard
615                         ewk_context_menu_item_append(contextmenu, EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG, NULL, IMGDIR"/icon_search.png", EINA_TRUE);
616                 }
617         } else {
618                 if (has_content == EINA_FALSE) {
619                         ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_COPY, _("IDS_EMAIL_OPT_COPY"), EINA_TRUE);
620                         ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_CUT, _("IDS_EMAIL_OPT_CUT"), EINA_TRUE);
621                         ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_CLIPBOARD, _("IDS_EMAIL_OPT_CLIPBOARD"), EINA_TRUE); // for Clipboard
622                         ewk_context_menu_item_append(contextmenu, EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG, NULL, IMGDIR"/icon_search.png", EINA_TRUE);
623                 } else {
624                         ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_COPY, _("IDS_EMAIL_OPT_COPY"), EINA_TRUE);
625                         ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_CUT, _("IDS_EMAIL_OPT_CUT"), EINA_TRUE);
626                         ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_PASTE, _("IDS_EMAIL_OPT_PASTE"), EINA_TRUE);
627                         ewk_context_menu_item_append_as_action(contextmenu, EWK_CONTEXT_MENU_ITEM_TAG_CLIPBOARD, _("IDS_EMAIL_OPT_CLIPBOARD"), EINA_TRUE); // for Clipboard
628                         ewk_context_menu_item_append(contextmenu, EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG, NULL, IMGDIR"/icon_search.png", EINA_TRUE);
629                 }
630         }
631 }
632
633 static void _composer_webview_contextmenu_selected_cb(void *data, Evas_Object *webview, void *event_info)
634 {
635         debug_log("");
636
637         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
638
639         Ewk_Context_Menu_Item* menu_item = (Ewk_Context_Menu_Item*)event_info;
640         Ewk_Context_Menu_Item_Tag menu_item_tag = EWK_CONTEXT_MENU_ITEM_TAG_NO_ACTION;
641
642         debug_log("menu_item : %d", menu_item);
643         menu_item_tag = ewk_context_menu_item_tag_get(menu_item);
644         debug_log("menu_item_tag : %d", menu_item_tag);
645
646         switch (menu_item_tag) {
647         case EWK_CONTEXT_MENU_ITEM_BASE_APPLICATION_TAG : //Smart search
648         {
649                 service_h service = NULL;
650                 const char *keyword = NULL;
651                 keyword = ewk_view_text_selection_text_get(ugd->body_ewkview);
652                 debug_log("keyword : %s", keyword);
653
654                 service_create(&service);
655                 service_set_operation(service, SERVICE_OPERATION_SEARCH);
656                 service_add_extra_data(service, "http://tizen.org/appcontrol/data/keyword", keyword);
657                 service_send_launch_request(service, NULL, NULL);
658                 service_destroy(service);
659         }
660         break;
661         default:
662                 debug_log("Never here!");
663         }
664 }
665
666 static void _composer_webkit_get_text_status_cb(void *data, Evas_Object *obj, void *event_info)
667 {
668         debug_log("");
669
670         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
671         Ewk_Text_Style* textStyle = (Ewk_Text_Style *)event_info;
672
673         if ((ugd == NULL) || (textStyle == NULL)) {
674                 return;
675         }
676
677         int ms_x, ms_y, ms_w, ms_h;
678         Evas_Point sp, ep;
679         ewk_text_style_position_get(textStyle, &sp, &ep);
680         debug_log("=================================================");
681         debug_log("1. Start Point : sp.x(%d), sp.y(%d)", sp.x, sp.y);
682         debug_log("1. End Point : ep.x(%d), ep.y(%d)", ep.x, ep.y);
683         debug_log("=================================================");
684
685         elm_scroller_region_get(ugd->main_scroller, &ms_x, &ms_y, &ms_w, &ms_h);
686         debug_log("1. main_scroller(ms_x:%d, ms_y:%d, ms_w:%d, ms_h:%d)", ms_x, ms_y, ms_w, ms_h);
687
688         int visible_area = 0;
689         int ewk_sc_x, ewk_sc_y;
690         Evas_Coord ewk_ct_w,ewk_ct_h;
691         ewk_view_scroll_pos_get(ugd->body_ewkview, &ewk_sc_x, &ewk_sc_y);
692         debug_log("ewk_view_scroll_pos_get(ewk_sc_x:%d, ewk_sc_y:%d)", ewk_sc_x, ewk_sc_y);
693
694         ewk_view_contents_size_get(ugd->body_ewkview, &ewk_ct_w, &ewk_ct_h);
695         debug_log("ewk_view_contents_size_get(ewk_ct_w:%d, ewk_ct_h:%d)", ewk_ct_w, ewk_ct_h);
696
697         if (ugd->isHorizontal == true) {
698                 visible_area = 397;
699         } else {
700                 visible_area = 830;
701         }
702
703         if (ugd->is_prediction == EINA_TRUE) {
704                 visible_area = visible_area - COMPOSER_IME_PREDICTION_H;
705         }
706
707         debug_log("ugd->is_prediction : %d", ugd->is_prediction);
708
709         if (ms_y < 311 + COMPOSER_IME_PREDICTION_H) {
710                 if (ep.y > visible_area) {
711                         if (ewk_sc_y > 0) {
712                                 elm_scroller_region_show(ugd->main_scroller, ms_x, 10000, ms_w, ms_h);
713                                 ewk_view_scroll_set(ugd->body_ewkview, 0, ep.y - visible_area + ewk_sc_y);
714                         } else {
715                                 elm_scroller_region_bring_in(ugd->main_scroller, ms_x, ep.y - visible_area + ms_y, ms_w, ms_h);
716                         }
717                 }
718         } else {
719                 if (ep.y > visible_area) {
720                         elm_scroller_region_show(ugd->main_scroller, ms_x, 10000, ms_w, ms_h);
721                         ewk_view_scroll_set(ugd->body_ewkview, 0, ep.y - visible_area + ewk_sc_y);
722                 }
723         }
724 }
725