Launch IME setting as group
[platform/core/uifw/ise-default.git] / src / option.cpp
1 /*
2  * Copyright (c) 2012 - 2015 Samsung Electronics Co., Ltd All Rights Reserved
3  *
4  * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
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
18 #include <string.h>
19 #include <vconf.h>
20 #include <vconf-keys.h>
21 #include <Elementary.h>
22 #include <efl_extension.h>
23 #include <app.h>
24
25 #include "utils.h"
26 #include "option.h"
27 #include "languages.h"
28 #include "eflutil.h"
29 #include "sdk/ise_lang_table.h"
30 #include "ise-stt-option.h"
31 #include "autofill.h"
32
33 #undef LOG_TAG
34 #define LOG_TAG "ISE_DEFAULT"
35 #include <dlog.h>
36
37 #ifdef _CIRCLE
38 #define ICON_DIR LAYOUTDIR"/wearable/image"
39 #endif
40
41 static ISELanguageManager _language_manager;
42 #define EDJ_FILE                        RESDIR"/edje/tv/popup_keyboard.edj"
43 #define IMG_POPUP_FC_BG                 RESDIR"/tv/images/bg_settings_gray.9.png"
44 #define IMG_POPUP_DIM_BG                RESDIR"/tv/images/bg_dimmed_bk_95.9.png"
45 #define IMG_POPUP_BAR_LINE              RESDIR"/tv/images/img_popup_bar_line.png"
46 #define IMG_POPUP_BAR_SHADOW            RESDIR"/tv/images/img_popup_bar_shadow.png"
47
48 #define BUF_SIZE                    256
49 #define OPTION_MAX_LANGUAGES        255
50 #define MIN_SELECTED_LANGUAGES      1
51 #ifdef _WEARABLE
52 #define MAX_SELECTED_LANGUAGES      2
53 #else
54 #define MAX_SELECTED_LANGUAGES      4
55 #endif
56
57 #ifdef _TV
58 #define CHECK_STATE "check_state"
59 #endif
60
61 enum LAUNCH_MODE {
62     LAUNCH_MODE_IME,
63     LAUNCH_MODE_OTHER
64 };
65
66 enum SETTING_ITEM_ID {
67     SETTING_ITEM_ID_INPUT_LANGUAGE_TITLE,
68     SETTING_ITEM_ID_CUR_LANGUAGE,
69     SETTING_ITEM_ID_SELECT_INPUT_LANGUAGE,
70     SETTING_ITEM_ID_SMART_INPUT_TITLE,
71     SETTING_ITEM_ID_AUTO_CAPITALISE,
72     SETTING_ITEM_ID_AUTO_PUNCTUATE,
73     SETTING_ITEM_ID_KEY_TAP_TITLE,
74     SETTING_ITEM_ID_SOUND,
75     SETTING_ITEM_ID_VIBRATION,
76     SETTING_ITEM_ID_CHARACTER_PRE,
77     SETTING_ITEM_ID_MORE_SETTINGS_TITLE,
78     SETTING_ITEM_ID_RESET,
79     SETTING_ITEM_ID_CLEAR,
80     SETTING_ITEM_ID_PREDICTION,
81     SETTING_ITEM_ID_VOICE_LANGUAGE,
82
83     SETTING_ITEM_ID_MAX,
84 };
85
86 enum LANGUAGE_VIEW_MODE {
87     LANGUAGE_VIEW_MODE_LANGUAGE,
88     LANGUAGE_VIEW_MODE_INPUT_MODE,
89 };
90
91 static ITEMDATA main_itemdata[SETTING_ITEM_ID_MAX];
92 static ITEMDATA language_itemdata[OPTION_MAX_LANGUAGES];
93
94 struct OPTION_ELEMENTS
95 {
96     OPTION_ELEMENTS() {
97         option_window = NULL;
98         naviframe = NULL;
99         genlist = NULL;
100         circle_genlist = NULL;
101         language_genlist = NULL;
102         lang_popup = NULL;
103         back_button = NULL;
104         conformant = NULL;
105         option_bg = NULL;
106         option_layout = NULL;
107 #ifdef _TV
108         list_theme = NULL;
109 #endif
110
111         itc_main_item = NULL;
112         itc_multi_item = NULL;
113         itc_1text_main_item = NULL;
114
115         itc_language_subitems = NULL;
116
117         languages_item = NULL;
118
119         memset(language_item, 0x00, sizeof(language_item));
120         memset(selected_language_item, 0x00, sizeof(selected_language_item));
121
122         itc_group_title = NULL;
123 #ifdef _CIRCLE
124         circle_surface = NULL;
125 #endif
126     }
127 #ifdef _TV
128     Elm_Theme * list_theme;
129 #endif
130     Evas_Object *option_window;
131     Evas_Object *naviframe;
132     Evas_Object *genlist;
133     Evas_Object *circle_genlist;
134     Evas_Object *language_genlist;
135     Evas_Object *lang_popup;
136     Evas_Object *back_button;
137     Evas_Object *conformant;
138     Evas_Object *option_bg;
139     Evas_Object *option_layout;
140
141     Elm_Genlist_Item_Class *itc_main_item;
142     Elm_Genlist_Item_Class *itc_multi_item;
143     Elm_Genlist_Item_Class *itc_1text_main_item;
144
145     Elm_Genlist_Item_Class *itc_language_subitems;
146
147     Elm_Object_Item *languages_item;
148
149     Elm_Object_Item *language_item[OPTION_MAX_LANGUAGES];
150     Elm_Object_Item *selected_language_item[OPTION_MAX_LANGUAGES];
151
152     Elm_Genlist_Item_Class *itc_group_title;
153
154 #ifdef _CIRCLE
155     Eext_Circle_Surface *circle_surface;
156 #endif
157 };
158
159 static LAUNCH_MODE g_launch_mode = LAUNCH_MODE_OTHER;
160 static OPTION_ELEMENTS option_elements[OPTION_WINDOW_TYPE_MAX];
161 extern CONFIG_VALUES g_config_values;
162
163 static Evas_Object* create_option_language_view(Evas_Object *naviframe);
164 static Evas_Object *_create_check_button(Evas_Object *parent, sclboolean state);
165 static void read_options(Evas_Object *naviframe);
166
167 #ifdef _WEARABLE
168 static Evas_Object* create_smart_typing_view(Evas_Object *naviframe);
169 static Evas_Object* create_feedback_view(Evas_Object *naviframe);
170 #endif
171
172 /* This function is called by setup_module.cpp : create_ise_setup_eo() also */
173 Evas_Object* create_option_main_view(Evas_Object *parent, Evas_Object *naviframe, SCLOptionWindowType type);
174
175 static void language_selected(void *data, Evas_Object *obj, void *event_info);
176
177 static void navi_back_cb(void *data, Evas_Object *obj, void *event_info);
178
179 static void check_autocapitalise_change_callback(void *data, Evas_Object *obj, void *event_info);
180 static void check_autopunctuate_change_callback(void *data, Evas_Object *obj, void *event_info);
181 static void check_sound_change_callback(void *data, Evas_Object *obj, void *event_info);
182 static void check_prediction_change_callback(void *data, Evas_Object *obj, void *event_info);
183 static void check_voice_language_callback(void *data, Evas_Object *obj, void *event_info);
184 static void check_vibration_change_callback(void *data, Evas_Object *obj, void *event_info);
185 static void check_character_pre_change_callback(void *data, Evas_Object *obj, void *event_info);
186
187 #ifdef _CIRCLE
188 static char* _accessible_body_name_cb(void *data, Evas_Object *obj);
189 static void _screen_reader_information_set(Evas_Object *obj);
190 #endif
191
192 std::vector<ILanguageOption*> LanguageOptionManager::language_option_vector;
193 void LanguageOptionManager::add_language_option(ILanguageOption *language_option) {
194     language_option_vector.push_back(language_option);
195 }
196 scluint LanguageOptionManager::get_language_options_num() {
197     return language_option_vector.size();
198 }
199 ILanguageOption* LanguageOptionManager::get_language_option_info(scluint index) {
200     return ((index < language_option_vector.size()) ? language_option_vector.at(index) : NULL);
201 }
202
203 SCLOptionWindowType find_option_window_type(Evas_Object *obj)
204 {
205     for (int loop = 0;loop < OPTION_WINDOW_TYPE_MAX;loop++) {
206         if (option_elements[loop].option_window == obj ||
207             option_elements[loop].naviframe == obj ||
208             option_elements[loop].genlist == obj ||
209             option_elements[loop].language_genlist == obj ||
210             option_elements[loop].lang_popup == obj ||
211             option_elements[loop].back_button == obj) {
212                 return static_cast<SCLOptionWindowType>(loop);
213         }
214     }
215     LOGD("OPTION_WINDOW_TYPE_MAX=%d\n", OPTION_WINDOW_TYPE_MAX);
216     return OPTION_WINDOW_TYPE_MAX;
217 }
218
219 static void reset_settings_popup_response_ok_cb(void *data, Evas_Object *obj, void *event_info)
220 {
221     reset_ise_config_values();
222     _language_manager.set_enabled_languages(g_config_values.enabled_languages);
223
224     Evas_Object *genlist = static_cast<Evas_Object*>(evas_object_data_get(obj, "parent_object"));
225     SCLOptionWindowType type = find_option_window_type(genlist);
226
227     if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) {
228         read_options(option_elements[type].naviframe);
229     }
230
231     vconf_set_bool(VCONFKEY_AUTOCAPITAL_ALLOW_BOOL, g_config_values.auto_capitalise);
232     vconf_set_bool(VCONFKEY_AUTOPERIOD_ALLOW_BOOL, g_config_values.auto_punctuate);
233
234     autofill_clear();
235
236     Evas_Object *popup = (Evas_Object *)data;
237     if (popup)
238         evas_object_del(popup);
239 }
240
241 static void popup_response_cancel_cb(void *data, Evas_Object *obj, void *event_info)
242 {
243     Evas_Object *popup = (Evas_Object *)data;
244     if (popup)
245         evas_object_del(popup);
246 }
247
248 static void clear_data_popup_response_ok_cb(void *data, Evas_Object *obj, void *event_info)
249 {
250     clear_ise_data_values();
251     Evas_Object *popup = (Evas_Object *)data;
252     if (popup)
253         evas_object_del(popup);
254 }
255
256 static Evas_Object *create_popup_button(Evas_Object *parent, const char *style, const char *icon_path, const char *string)
257 {
258     Evas_Object *btn = elm_button_add(parent);
259 #ifdef _CIRCLE
260     elm_object_style_set(btn, style);
261
262     /* Create icon */
263     Evas_Object *icon = elm_image_add(btn);
264     elm_image_file_set(icon, icon_path, NULL);
265     evas_object_size_hint_weight_set(icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
266     elm_object_part_content_set(btn, "elm.swallow.content", icon);
267     evas_object_show(icon);
268
269     elm_atspi_accessible_name_set(btn, string);
270     elm_atspi_accessible_translation_domain_set(btn, PACKAGE);
271 #else
272     elm_object_style_set(btn, "popup");
273     elm_object_domain_translatable_text_set(btn, PACKAGE, string);
274 #endif
275
276     return btn;
277 }
278
279 #ifdef _CIRCLE
280 static char*
281 _accessible_body_name_cb(void *data, Evas_Object *obj)
282 {
283     Evas_Object *layout = (Evas_Object *)data;
284     const char *text = elm_object_part_text_get(layout, "elm.text");
285     return text ? strdup(text) : NULL;
286 }
287
288 static void
289 _screen_reader_information_set(Evas_Object *obj)
290 {
291     Evas_Object *to, *ao;
292     to = (Evas_Object *)edje_object_part_object_get(elm_layout_edje_get(obj), "elm.text");
293     if (to) {
294         ao = elm_access_object_register(to, obj);
295         elm_atspi_accessible_name_cb_set(ao, _accessible_body_name_cb, obj);
296         elm_atspi_accessible_reading_info_type_set(ao, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME);
297     }
298 }
299 #endif
300
301 static Evas_Object *show_popup(Evas_Object *parent, const char *message, const char *cancel_text, Evas_Smart_Cb cancel_cb, const char *ok_text, Evas_Smart_Cb ok_cb)
302 {
303     const char *icon_path = NULL;
304
305     Evas_Object *popup = elm_popup_add(elm_object_top_widget_get(parent));
306     elm_popup_align_set(popup, ELM_NOTIFY_ALIGN_FILL, 1.0);
307 #ifdef _TV
308     elm_popup_orient_set(popup, ELM_POPUP_ORIENT_CENTER);
309 #endif
310     eext_object_event_callback_add(popup, EEXT_CALLBACK_BACK, eext_popup_back_cb, NULL);
311     evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
312
313 #ifdef _CIRCLE
314     elm_object_style_set(popup, "circle");
315
316     Evas_Object *layout = elm_layout_add(popup);
317     elm_layout_theme_set(layout, "layout", "popup", "content/circle/buttons2");
318     elm_object_domain_translatable_part_text_set(layout, "elm.text", PACKAGE, message);
319     elm_object_content_set(popup, layout);
320
321     /* accessibility */
322     _screen_reader_information_set(layout);
323 #else
324     elm_object_domain_translatable_text_set(popup, PACKAGE, message);
325     elm_object_domain_translatable_part_text_set(popup, "title,text", PACKAGE, RESET_SETTINGS_POPUP_TITLE_TEXT);
326 #endif
327
328     /* Cancel button */
329 #ifdef _CIRCLE
330     icon_path = ICON_DIR"/tw_ic_popup_btn_delete.png";
331 #endif
332     Evas_Object *btn_cancel = create_popup_button(popup, "popup/circle/left", icon_path, cancel_text);
333     elm_object_part_content_set(popup, "button1", btn_cancel);
334     evas_object_smart_callback_add(btn_cancel, "clicked", cancel_cb, popup);
335 #ifdef _TV
336     elm_object_focus_set(btn_cancel, EINA_TRUE);
337 #endif
338
339     /* Ok button */
340 #ifdef _CIRCLE
341     icon_path = ICON_DIR"/tw_ic_popup_btn_check.png";
342 #endif
343     Evas_Object *btn_ok = create_popup_button(popup, "popup/circle/right", icon_path, ok_text);
344     evas_object_data_set(btn_ok, "parent_object", parent);
345     elm_object_part_content_set(popup, "button2", btn_ok);
346     evas_object_smart_callback_add(btn_ok, "clicked", ok_cb, popup);
347     evas_object_show(popup);
348
349     return popup;
350 }
351
352 static void reset_settings_popup(void *data, Evas_Object *obj, void *event_info)
353 {
354     show_popup(obj, RESET_SETTINGS_POPUP_TEXT, POPUP_CANCEL_BTN, popup_response_cancel_cb, POPUP_OK_BTN, reset_settings_popup_response_ok_cb);
355 }
356
357 static void clear_personalized_data_popup(void *data, Evas_Object *obj, void *event_info)
358 {
359     show_popup(obj, CLEAR_PERSONLIZED_DATA_POPUP_TEXT, POPUP_CANCEL_BTN, popup_response_cancel_cb, POPUP_OK_BTN, clear_data_popup_response_ok_cb);
360 }
361
362 static char *_main_gl_text_get(void *data, Evas_Object *obj, const char *part)
363 {
364     ITEMDATA *item_data = (ITEMDATA*)data;
365     if (item_data) {
366         if (!strcmp(part, "elm.text.main.left.top") ||
367             !strcmp(part, "elm.text.main.left") ||
368             !strcmp(part, "elm.text.main") ||
369             !strcmp(part, "elm.text")) {
370             if (strlen(item_data->main_text)) {
371                 return strdup(item_data->main_text);
372             }
373         }
374         if (!strcmp(part, "elm.text.sub.left.bottom") ||
375             !strcmp(part, "elm.text.multiline") ||
376             !strcmp(part, "elm.text.sub") ||
377             !strcmp(part, "elm.text.1") ||
378             !strcmp(part, "elm.text.2")) {
379             if (strlen(item_data->sub_text) > 0) {
380                 return strdup(item_data->sub_text);
381             }
382         }
383     }
384
385     return NULL;
386 }
387
388 #ifdef _TV
389 static Eina_Bool tv_check_state_get(Evas_Object *label)
390 {
391     LOGD("tv_check_state_get in");
392     long state = 0;
393     state = (long)evas_object_data_get(label, CHECK_STATE);
394     return (state == 1)? EINA_TRUE:EINA_FALSE;
395 }
396
397 static void tv_switch_check_state(Evas_Object *label, Eina_Bool state)
398 {
399     LOGD("tv_switch_check_state, state = [%d]", state);
400     if (!label) return;
401     char text[BUF_SIZE] = {0, };
402     if (state) {
403         snprintf(text, sizeof(text), "<font_size=28 color=#0081C6FF><align=center>%s</left></font>", SWITCH_ON);
404         elm_object_text_set(label, text);
405         evas_object_data_set(label, CHECK_STATE, (void*)1);
406     } else {
407         snprintf(text, sizeof(text), "<font_size=28 color=#000000CC><align=center>%s</left></font>", SWITCH_OFF);
408         elm_object_text_set(label, text);
409         evas_object_data_set(label, CHECK_STATE, (void*)0);
410     }
411 }
412
413 static void _gl_pressed_cb(void *data, Evas_Object *obj, void *event_info)
414 {
415     LOGD("_gl_pressed_cb in!");
416     if (!event_info) {
417         LOGE("event_info is NULL!");
418         return;
419     }
420
421     Elm_Object_Item *item = (Elm_Object_Item *)event_info;
422     Evas_Object *label = elm_object_item_part_content_get(item, "elm.swallow.end");
423     if (label == NULL) {
424         LOGD("item no label, not need to update!");
425         return;
426     } else {
427         Eina_Bool state = tv_check_state_get(label);
428         char text[BUF_SIZE] = {0, };
429         snprintf(text, sizeof(text), "<font_size=28 color=#FFFFFFFF><align=center>%s</left></font>", state? SWITCH_ON : SWITCH_OFF);
430         elm_object_text_set(label, text);
431     }
432 }
433
434 static void _gl_relesed_cb(void *data, Evas_Object *obj, void *event_info)
435 {
436     LOGD("_gl_relesed_cb in!");
437     if (!event_info) {
438         LOGE("event_info is NULL!");
439         return;
440     }
441
442     Elm_Object_Item *item = (Elm_Object_Item *)event_info;
443     Evas_Object *label = elm_object_item_part_content_get(item, "elm.swallow.end");
444     if (label == NULL) {
445         LOGD("item no label, not need to update!");
446         return;
447     } else {
448         Eina_Bool state = tv_check_state_get(label);
449         char text[BUF_SIZE] = {0, };
450         if (state) {
451             snprintf(text, sizeof(text), "<font_size=28 color=#0081C6FF><align=center>%s</left></font>", SWITCH_ON);
452             elm_object_text_set(label, text);
453         } else {
454             snprintf(text, sizeof(text), "<font_size=28 color=#000000CC><align=center>%s</left></font>", SWITCH_OFF);
455             elm_object_text_set(label, text);
456         }
457     }
458 }
459 #endif
460
461 static Evas_Object *get_check(Elm_Object_Item *item)
462 {
463     Evas_Object *ck;
464     ck = elm_object_item_part_content_get(item, "elm.swallow.end");
465     if (ck == NULL)
466         ck = elm_object_item_part_content_get(item, "elm.icon");
467
468     return ck;
469 }
470
471 static Eina_Bool _update_check_button_state(Elm_Object_Item *item, Evas_Object *obj)
472 {
473     Eina_Bool state = EINA_FALSE;
474     if (item && obj) {
475         elm_genlist_item_selected_set(item, EINA_FALSE);
476         /* Update check button */
477         Evas_Object *ck = get_check(item);
478         evas_object_data_set(ck, "parent_object", obj);
479         state = !elm_check_state_get(ck);
480 #ifndef _TV
481         elm_check_state_set(ck, state);
482 #else
483         tv_switch_check_state(ck, state);
484 #endif
485     }
486     return state;
487 }
488
489 static void _main_gl_sel(void *data, Evas_Object *obj, void *event_info)
490 {
491     Elm_Object_Item *item = (Elm_Object_Item*)event_info;
492
493     if (data) {
494         int id = (int)reinterpret_cast<long>(data);
495         Eina_Bool state = EINA_FALSE;
496
497         switch (id) {
498             case SETTING_ITEM_ID_SELECT_INPUT_LANGUAGE: {
499                 SCLOptionWindowType type = find_option_window_type(obj);
500
501                 if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) {
502                     create_option_language_view(option_elements[type].naviframe);
503                 }
504             }
505             break;
506 #ifdef _WEARABLE
507             case SETTING_ITEM_ID_SMART_INPUT_TITLE: {
508                 SCLOptionWindowType type = find_option_window_type(obj);
509
510                 if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) {
511                     create_smart_typing_view(option_elements[type].naviframe);
512                 }
513             }
514             break;
515             case SETTING_ITEM_ID_KEY_TAP_TITLE: {
516                 SCLOptionWindowType type = find_option_window_type(obj);
517
518                 if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) {
519                     create_feedback_view(option_elements[type].naviframe);
520                 }
521             }
522             break;
523 #endif
524             case SETTING_ITEM_ID_AUTO_CAPITALISE: {
525                 if (item) {
526                     state = _update_check_button_state(item, obj);
527                     check_autocapitalise_change_callback((void *)(intptr_t)(state), NULL, NULL);
528                 }
529             break;
530             }
531             case SETTING_ITEM_ID_AUTO_PUNCTUATE: {
532                 if (item) {
533                     state = _update_check_button_state(item, obj);
534                     check_autopunctuate_change_callback((void *)(intptr_t)(state), NULL, NULL);
535                 }
536             break;
537             }
538             case SETTING_ITEM_ID_SOUND: {
539                 if (item) {
540                     state = _update_check_button_state(item, obj);
541                     check_sound_change_callback((void *)(intptr_t)(state), NULL, NULL);
542                 }
543             break;
544             }
545             case SETTING_ITEM_ID_PREDICTION: {
546                 if (item) {
547                     state = _update_check_button_state(item, obj);
548                     check_prediction_change_callback((void *)(intptr_t)(state), NULL, NULL);
549                 }
550             break;
551             }
552             case SETTING_ITEM_ID_VOICE_LANGUAGE: {
553                 if (item) {
554                     check_voice_language_callback((void *)(intptr_t)(state), NULL, NULL);
555                 }
556             break;
557             }
558             case SETTING_ITEM_ID_VIBRATION: {
559                 if (item) {
560                     state = _update_check_button_state(item, obj);
561                     check_vibration_change_callback((void *)(intptr_t)(state), NULL, NULL);
562                 }
563             break;
564             }
565             case SETTING_ITEM_ID_CHARACTER_PRE: {
566                 if (item) {
567                     state = _update_check_button_state(item, obj);
568                     check_character_pre_change_callback((void *)(intptr_t)(state), NULL, NULL);
569                 }
570             break;
571             }
572             case SETTING_ITEM_ID_RESET: {
573                 LOGD("reset keyboard settings\n");
574                 reset_settings_popup(data, obj, event_info);
575             }
576             break;
577             case SETTING_ITEM_ID_CLEAR: {
578                 LOGD("Clear personalized data\n");
579                 clear_personalized_data_popup(data, obj, event_info);
580             }
581             break;
582             default:
583             break;
584         }
585     }
586
587     if (item) {
588         elm_genlist_item_selected_set(item, EINA_FALSE);
589     }
590 }
591
592 static Eina_Bool _main_gl_state_get(void *data, Evas_Object *obj, const char *part)
593 {
594     return EINA_FALSE;
595 }
596
597 static void _main_gl_del(void *data, Evas_Object *obj)
598 {
599     return;
600 }
601
602 static void _main_gl_con(void *data, Evas_Object *obj, void *event_info)
603 {
604     Elm_Object_Item *item = (Elm_Object_Item*)event_info;
605     elm_genlist_item_subitems_clear(item);
606 }
607
608 static Evas_Object *_language_gl_content_get(void *data, Evas_Object *obj, const char *part)
609 {
610     Evas_Object *item = NULL;
611     ITEMDATA *item_data = (ITEMDATA*)data;
612
613     if (item_data) {
614         if (!strcmp(part, "elm.icon.right") ||
615             !strcmp(part, "elm.icon") ||
616             !strcmp(part, "elm.swallow.end")) {
617             if (item_data->mode >= 0 && item_data->mode < OPTION_MAX_LANGUAGES) {
618                 LANGUAGE_INFO *info = _language_manager.get_language_info(item_data->mode);
619                 if (info) {
620                     Evas_Object *ck = _create_check_button(obj, info->enabled);
621                     evas_object_data_set(ck, "parent_object", obj);
622                     evas_object_smart_callback_add(ck, "changed", language_selected, data);
623                     evas_object_show(ck);
624                     item = ck;
625
626                     elm_atspi_accessible_relationship_append(ck, ELM_ATSPI_RELATION_CONTROLLED_BY, item_data->item);
627                     elm_atspi_accessible_relationship_append(item_data->item, ELM_ATSPI_RELATION_CONTROLLER_FOR, ck);
628                     elm_atspi_accessible_relationship_append(item_data->item, ELM_ATSPI_RELATION_DESCRIBED_BY, ck);
629                 }
630             }
631         }
632     }
633
634     return item;
635 }
636
637 static void _language_gl_sel(void *data, Evas_Object *obj, void *event_info)
638 {
639     Elm_Object_Item *item = (Elm_Object_Item*)event_info;
640     ITEMDATA * item_data = (ITEMDATA*)elm_object_item_data_get(item);
641     if (item) {
642         elm_genlist_item_selected_set(item, EINA_FALSE);
643
644         // Update check button
645         Evas_Object *ck = get_check(item);
646         if (ck) {
647             evas_object_data_set(ck, "parent_object", obj);
648             Eina_Bool state = elm_check_state_get(ck);
649             elm_check_state_set(ck, !state);
650             language_selected(item_data, ck, NULL);
651         }
652     }
653 }
654
655 static void check_autocapitalise_change_callback(void *data, Evas_Object *obj, void *event_info)
656 {
657     Eina_Bool state = EINA_FALSE;
658     if (obj) {
659 #ifdef _TV
660         state = tv_check_state_get(obj);
661 #else
662         state = elm_check_state_get(obj);
663 #endif
664     } else {
665         state = (int)reinterpret_cast<long>(data);
666     }
667     g_config_values.auto_capitalise = state;
668     write_ise_config_values();
669     if (vconf_set_bool(VCONFKEY_AUTOCAPITAL_ALLOW_BOOL, state) == -1)
670         LOGE("Failed to set vconf autocapital\n");
671 }
672
673 static void check_autopunctuate_change_callback(void *data, Evas_Object *obj, void *event_info)
674 {
675     Eina_Bool state = EINA_FALSE;
676     if (obj) {
677 #ifdef _TV
678         state = tv_check_state_get(obj);
679 #else
680         state = elm_check_state_get(obj);
681 #endif
682     } else {
683         state = (int)reinterpret_cast<long>(data);
684     }
685     g_config_values.auto_punctuate = state;
686     write_ise_config_values();
687     if (vconf_set_bool(VCONFKEY_AUTOPERIOD_ALLOW_BOOL, state) == -1)
688         LOGE("Failed to set vconf autoperiod\n");
689 }
690
691 static void check_sound_change_callback(void *data, Evas_Object *obj, void *event_info)
692 {
693     Eina_Bool state = EINA_FALSE;
694     if (obj) {
695 #ifdef _TV
696         state = tv_check_state_get(obj);
697 #else
698         state = elm_check_state_get(obj);
699 #endif
700     } else {
701         state = (int)reinterpret_cast<long>(data);
702     }
703     g_config_values.sound_on = state;
704     write_ise_config_values();
705 }
706
707 static void check_prediction_change_callback(void *data, Evas_Object *obj, void *event_info)
708 {
709     Eina_Bool state = EINA_FALSE;
710     if (obj) {
711 #ifdef _TV
712         state = tv_check_state_get(obj);
713 #else
714         state = elm_check_state_get(obj);
715 #endif
716     } else {
717         state = (int)reinterpret_cast<long>(data);
718     }
719     g_config_values.prediction_on = state;
720     write_ise_config_values();
721 }
722
723 static void check_voice_language_callback(void *data, Evas_Object *obj, void *event_info)
724 {
725    create_setting_window();
726 }
727
728 static void check_vibration_change_callback(void *data, Evas_Object *obj, void *event_info)
729 {
730     Eina_Bool state = EINA_FALSE;
731     if (obj) {
732         state = elm_check_state_get(obj);
733     } else {
734         state = (int)reinterpret_cast<long>(data);
735     }
736     g_config_values.vibration_on = state;
737     write_ise_config_values();
738 }
739
740 static void check_character_pre_change_callback(void *data, Evas_Object *obj, void *event_info)
741 {
742     Eina_Bool state = EINA_FALSE;
743     if (obj) {
744         state = elm_check_state_get(obj);
745     } else {
746         state = (int)reinterpret_cast<long>(data);
747     }
748     g_config_values.preview_on = state;
749     write_ise_config_values();
750 }
751
752 static Evas_Object *_create_check_button(Evas_Object *parent, sclboolean state)
753 {
754     Evas_Object *ck = NULL;
755     if (parent) {
756 #ifndef _TV
757         ck = elm_check_add(parent);
758         elm_object_style_set(ck, "on&off");
759         elm_check_state_set(ck, state);
760         elm_object_focus_allow_set(ck, EINA_FALSE);
761         evas_object_propagate_events_set(ck, EINA_FALSE);
762         evas_object_show(ck);
763 #else
764         ck = elm_label_add(parent);
765         char text[BUF_SIZE] = {0, };
766         if (state) {
767             snprintf(text, sizeof(text), "<font_size=28 color=#0081C6FF><align=center>%s</left></font>", SWITCH_ON);
768             elm_object_text_set(ck, text);
769             evas_object_data_set(ck, CHECK_STATE, (void*)1);
770         } else {
771             snprintf(text, sizeof(text), "<font_size=28 color=#000000CC><align=center>%s</left></font>", SWITCH_OFF);
772             elm_object_text_set(ck, text);
773             evas_object_data_set(ck, CHECK_STATE, (void*)0);
774         }
775         evas_object_show(ck);
776 #endif
777     }
778     return ck;
779 }
780
781 static Evas_Object *_main_radio_gl_content_get(void *data, Evas_Object *obj, const char *part)
782 {
783     Evas_Object *ck = NULL;
784     if (NULL != data) {
785         ITEMDATA *item_data = (ITEMDATA *)data;
786         if (!strcmp(part, "elm.swallow.end") ||
787             !strcmp(part, "elm.icon.right") ||
788             !strcmp(part, "elm.icon")) {
789             switch (item_data->mode) {
790                 case SETTING_ITEM_ID_AUTO_CAPITALISE:
791                     ck = _create_check_button(obj, g_config_values.auto_capitalise);
792 #ifndef _TV
793                     evas_object_smart_callback_add(ck, "changed", check_autocapitalise_change_callback,
794                         reinterpret_cast<void*>(item_data->mode));
795 #endif
796                     break;
797                 case SETTING_ITEM_ID_AUTO_PUNCTUATE:
798                     ck = _create_check_button(obj, g_config_values.auto_punctuate);
799 #ifndef _TV
800                     evas_object_smart_callback_add(ck, "changed", check_autopunctuate_change_callback,
801                         reinterpret_cast<void*>(item_data->mode));
802 #endif
803                     break;
804                 case SETTING_ITEM_ID_SOUND:
805                     ck = _create_check_button(obj, g_config_values.sound_on);
806 #ifndef _TV
807                     evas_object_smart_callback_add(ck, "changed", check_sound_change_callback,
808                         reinterpret_cast<void*>(item_data->mode));
809 #endif
810                     break;
811                 case SETTING_ITEM_ID_PREDICTION:
812                     ck = _create_check_button(obj, g_config_values.prediction_on);
813 #ifndef _TV
814                     evas_object_smart_callback_add(ck, "changed", check_prediction_change_callback,
815                         reinterpret_cast<void*>(item_data->mode));
816 #endif
817                 break;
818                 case SETTING_ITEM_ID_VOICE_LANGUAGE:
819                     evas_object_smart_callback_add(ck, "changed", check_voice_language_callback,
820                         reinterpret_cast<void*>(item_data->mode));
821                 break;
822                 case SETTING_ITEM_ID_VIBRATION:
823                     ck = _create_check_button(obj, g_config_values.vibration_on);
824                     evas_object_smart_callback_add(ck, "changed", check_vibration_change_callback,
825                         reinterpret_cast<void*>(item_data->mode));
826                     break;
827                 case SETTING_ITEM_ID_CHARACTER_PRE:
828                     ck = _create_check_button(obj, g_config_values.preview_on);
829                     evas_object_smart_callback_add(ck, "changed", check_character_pre_change_callback,
830                         reinterpret_cast<void*>(item_data->mode));
831                     break;
832             }
833
834             if (ck) {
835                 elm_atspi_accessible_relationship_append(ck, ELM_ATSPI_RELATION_CONTROLLED_BY, item_data->item);
836                 elm_atspi_accessible_relationship_append(item_data->item, ELM_ATSPI_RELATION_CONTROLLER_FOR, ck);
837                 elm_atspi_accessible_relationship_append(item_data->item, ELM_ATSPI_RELATION_DESCRIBED_BY, ck);
838             }
839         }
840     }
841
842     return ck;
843 }
844
845 static void destroy_genlist_item_classes(SCLOptionWindowType type)
846 {
847     if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) {
848         if (option_elements[type].itc_main_item) {
849             elm_genlist_item_class_free(option_elements[type].itc_main_item);
850             option_elements[type].itc_main_item = NULL;
851         }
852         if (option_elements[type].itc_multi_item) {
853             elm_genlist_item_class_free(option_elements[type].itc_multi_item);
854             option_elements[type].itc_multi_item = NULL;
855         }
856         if (option_elements[type].itc_1text_main_item) {
857             elm_genlist_item_class_free(option_elements[type].itc_1text_main_item);
858             option_elements[type].itc_1text_main_item = NULL;
859         }
860         if (option_elements[type].itc_language_subitems) {
861             elm_genlist_item_class_free(option_elements[type].itc_language_subitems);
862             option_elements[type].itc_language_subitems = NULL;
863         }
864         if (option_elements[type].itc_group_title) {
865             elm_genlist_item_class_free(option_elements[type].itc_group_title);
866             option_elements[type].itc_group_title = NULL;
867         }
868     }
869 }
870
871 static void create_genlist_item_classes(SCLOptionWindowType type)
872 {
873     if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) {
874         option_elements[type].itc_main_item = elm_genlist_item_class_new();
875         if (option_elements[type].itc_main_item) {
876 #ifdef _WEARABLE
877             option_elements[type].itc_main_item->item_style = "2text.1icon.1";
878 #elif _TV
879             option_elements[type].itc_main_item->item_style = "cus_style";
880 #else
881             option_elements[type].itc_main_item->item_style = "type1";
882 #endif
883             option_elements[type].itc_main_item->func.text_get = _main_gl_text_get;
884             option_elements[type].itc_main_item->func.content_get = _main_radio_gl_content_get;
885             option_elements[type].itc_main_item->func.state_get = _main_gl_state_get;
886             option_elements[type].itc_main_item->func.del = _main_gl_del;
887         }
888
889         option_elements[type].itc_multi_item = elm_genlist_item_class_new();
890         if (option_elements[type].itc_multi_item) {
891 #ifdef _WEARABLE
892             option_elements[type].itc_multi_item->item_style = "2text.1icon.1";
893 #elif _TV
894             option_elements[type].itc_multi_item->item_style = "cus_style";
895 #else
896             option_elements[type].itc_multi_item->item_style = "multiline";
897 #endif
898             option_elements[type].itc_multi_item->func.text_get = _main_gl_text_get;
899             option_elements[type].itc_multi_item->func.content_get = _main_radio_gl_content_get;
900             option_elements[type].itc_multi_item->func.state_get = _main_gl_state_get;
901             option_elements[type].itc_multi_item->func.del = _main_gl_del;
902         }
903
904         option_elements[type].itc_1text_main_item = elm_genlist_item_class_new();
905         if (option_elements[type].itc_1text_main_item) {
906 #ifdef _WEARABLE
907             option_elements[type].itc_1text_main_item->item_style = "1text.1icon.1";
908 #elif _TV
909             option_elements[type].itc_1text_main_item->item_style = "cus_style";
910 #else
911             option_elements[type].itc_1text_main_item->item_style = "type1";
912 #endif
913             option_elements[type].itc_1text_main_item->func.text_get = _main_gl_text_get;
914             option_elements[type].itc_1text_main_item->func.content_get = _main_radio_gl_content_get;
915             option_elements[type].itc_1text_main_item->func.state_get = _main_gl_state_get;
916             option_elements[type].itc_1text_main_item->func.del = _main_gl_del;
917         }
918
919         option_elements[type].itc_language_subitems = elm_genlist_item_class_new();
920         if (option_elements[type].itc_language_subitems) {
921 #ifdef _WEARABLE
922             option_elements[type].itc_language_subitems->item_style = "1text.1icon.1";
923 #elif _TV
924             option_elements[type].itc_language_subitems->item_style = "cus_style";
925 #else
926             option_elements[type].itc_language_subitems->item_style = "type1";
927 #endif
928             option_elements[type].itc_language_subitems->func.text_get = _main_gl_text_get;
929             option_elements[type].itc_language_subitems->func.content_get = _language_gl_content_get;
930             option_elements[type].itc_language_subitems->func.state_get = _main_gl_state_get;
931             option_elements[type].itc_language_subitems->func.del = _main_gl_del;
932         }
933
934         option_elements[type].itc_group_title = elm_genlist_item_class_new();
935         if (option_elements[type].itc_group_title) {
936 #ifdef _WEARABLE
937             option_elements[type].itc_group_title->item_style = "groupindex";
938 #elif _TV
939             option_elements[type].itc_group_title->item_style = "cus_style";
940 #else
941             option_elements[type].itc_group_title->item_style = "group_index";
942 #endif
943             option_elements[type].itc_group_title->func.text_get = _main_gl_text_get;
944             option_elements[type].itc_group_title->func.content_get = NULL;
945             option_elements[type].itc_group_title->func.state_get = _main_gl_state_get;
946             option_elements[type].itc_group_title->func.del = _main_gl_del;
947         }
948     }
949 }
950
951 static void language_selection_finished_cb(void *data, Evas_Object *obj, void *event_info)
952 {
953     if (_language_manager.get_enabled_languages_num() == 0) {
954         read_ise_config_values();
955         _language_manager.set_enabled_languages(g_config_values.enabled_languages);
956     }
957
958     SCLOptionWindowType type = find_option_window_type(obj);
959
960     if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) {
961         elm_genlist_item_update(option_elements[type].languages_item);
962     }
963
964     if (obj) {
965         evas_object_smart_callback_del(obj, "clicked", language_selection_finished_cb);
966         Evas_Object *naviframe = (Evas_Object *)data;
967         if (naviframe) {
968             elm_naviframe_item_pop(naviframe);
969             read_options(naviframe);
970         }
971     }
972 }
973
974 static void _popup_timeout_cb(void *data, Evas_Object * obj, void *event_info)
975 {
976     if (obj) {
977         SCLOptionWindowType type = find_option_window_type(obj);
978
979         evas_object_smart_callback_del(obj, "timeout", _popup_timeout_cb);
980         evas_object_del(obj);
981
982         if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) {
983             option_elements[type].lang_popup = NULL;
984         }
985     }
986 }
987
988 static Eina_Bool _pop_cb(void *data, Elm_Object_Item *it)
989 {
990     Evas_Object *naviframe = static_cast<Evas_Object*>(data);
991     SCLOptionWindowType type = find_option_window_type(naviframe);
992     language_selection_finished_cb(NULL, NULL, NULL);
993
994     if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) {
995         if (option_elements[type].lang_popup) {
996             _popup_timeout_cb(NULL, option_elements[type].lang_popup, NULL);
997         }
998
999 #ifdef _CIRCLE
1000         if (option_elements[type].circle_genlist) {
1001             eext_rotary_object_event_activated_set(option_elements[type].circle_genlist, EINA_TRUE);
1002         }
1003 #endif
1004     }
1005
1006     return EINA_TRUE;
1007 }
1008
1009 static void close_option_window(SCLOptionWindowType type)
1010 {
1011     destroy_genlist_item_classes(type);
1012 #ifdef _TV
1013     if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) {
1014         if (option_elements[type].list_theme) {
1015             elm_theme_extension_del(option_elements[type].list_theme, EDJ_FILE);
1016             elm_theme_free(option_elements[type].list_theme);
1017         }
1018     }
1019 #endif
1020     if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) {
1021         option_elements[type].option_window = NULL;
1022
1023         ui_app_exit();
1024     }
1025 }
1026
1027 static void _naviframe_back_cb(void *data, Evas_Object *obj, void *event_info)
1028 {
1029     SCLOptionWindowType type = find_option_window_type(obj);
1030     Elm_Object_Item *top_it = elm_naviframe_top_item_get(obj);
1031     Elm_Object_Item *bottom_it = elm_naviframe_bottom_item_get(obj);
1032     if (top_it && bottom_it &&
1033             (elm_object_item_content_get(top_it) == elm_object_item_content_get(bottom_it))) {
1034         if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX))
1035             close_option_window(type);
1036     } else {
1037         elm_naviframe_item_pop(obj);
1038         read_options(obj);
1039     }
1040 }
1041
1042 #ifdef _CIRCLE
1043 static void add_padding_area(Evas_Object *genlist)
1044 {
1045     /* Add padding area in wearable circle profile */
1046     Elm_Genlist_Item_Class *ptc = elm_genlist_item_class_new();
1047     Elm_Object_Item *item;
1048     if (ptc) {
1049         ptc->item_style = "padding";
1050         item = elm_genlist_item_append(genlist, ptc, NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
1051         elm_atspi_accessible_role_set(item, ELM_ATSPI_ROLE_REDUNDANT_OBJECT);
1052         elm_genlist_item_class_free(ptc);
1053     }
1054 }
1055 #endif
1056
1057 static Elm_Object_Item * append_item(Evas_Object *genlist, enum SETTING_ITEM_ID id, const char *main_text, const char *sub_text, void *cb_data, Elm_Genlist_Item_Class *itc, Elm_Genlist_Item_Type type, Eina_Bool display_only)
1058 {
1059     Elm_Object_Item *item = NULL;
1060
1061     if (main_text)
1062         strncpy(main_itemdata[id].main_text, main_text, ITEM_DATA_STRING_LEN - 1);
1063
1064     if (sub_text)
1065         strncpy(main_itemdata[id].sub_text, sub_text, ITEM_DATA_STRING_LEN - 1);
1066
1067     main_itemdata[id].mode = id;
1068     item = elm_genlist_item_append(genlist, itc, &main_itemdata[id],
1069             NULL, type, _main_gl_sel, cb_data);
1070
1071     if (display_only)
1072         elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
1073
1074     main_itemdata[id].item = item;
1075
1076     return item;
1077 }
1078
1079 Evas_Object* create_option_main_view(Evas_Object *parent, Evas_Object *naviframe, SCLOptionWindowType type)
1080 {
1081     Evas_Object *genlist = NULL;
1082     if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) {
1083         create_genlist_item_classes(type);
1084
1085         genlist = create_genlist(naviframe);
1086         option_elements[type].genlist = genlist;
1087 #ifdef _TV
1088         elm_object_theme_set(genlist, option_elements[type].list_theme);
1089         evas_object_smart_callback_add(genlist, "pressed", _gl_pressed_cb, NULL);
1090         evas_object_smart_callback_add(genlist, "released", _gl_relesed_cb, NULL);
1091 #endif
1092
1093 #ifdef _CIRCLE
1094         /* Circle Surface Creation */
1095         option_elements[type].circle_surface = eext_circle_surface_conformant_add(option_elements[type].conformant);
1096         Evas_Object *circle_genlist = eext_circle_object_genlist_add(genlist, option_elements[type].circle_surface);
1097         eext_rotary_object_event_activated_set(circle_genlist, EINA_TRUE);
1098
1099         option_elements[type].circle_genlist = circle_genlist;
1100 #endif
1101
1102 #ifdef _WEARABLE
1103         add_scrollable_title_area(genlist, OPTIONS, EINA_TRUE);
1104 #endif
1105
1106 #ifndef _TV
1107         /* Input languages */
1108         append_item(genlist, SETTING_ITEM_ID_INPUT_LANGUAGE_TITLE, INPUT_LANGUAGE, NULL, NULL, option_elements[type].itc_group_title, ELM_GENLIST_ITEM_GROUP, EINA_TRUE);
1109
1110         for (unsigned int loop = 0; loop < OPTION_MAX_LANGUAGES && loop < _language_manager.get_languages_num(); loop++)
1111         {
1112             /* Current languages */
1113             LANGUAGE_INFO *info = _language_manager.get_language_info(loop);
1114             if (info && info->enabled) {
1115                 strncpy(language_itemdata[loop].main_text, info->display_name.c_str(), ITEM_DATA_STRING_LEN - 1);
1116 #ifdef _WEARABLE
1117                 if (info->input_modes.size() > 0) {
1118                     INPUT_MODE_INFO input_mode = info->input_modes.at(0);
1119                     strncpy(language_itemdata[loop].sub_text, input_mode.display_name.c_str(), ITEM_DATA_STRING_LEN - 1);
1120                 }
1121 #endif
1122                 language_itemdata[loop].mode = SETTING_ITEM_ID_CUR_LANGUAGE;
1123                 option_elements[type].selected_language_item[loop] =
1124                     elm_genlist_item_append(genlist, option_elements[type].itc_main_item, &language_itemdata[loop],
1125                         NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
1126                 elm_genlist_item_select_mode_set(option_elements[type].selected_language_item[loop], ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
1127             } else {
1128                 option_elements[type].selected_language_item[loop] = NULL;
1129             }
1130         }
1131
1132         if (_language_manager.get_languages_num() > 1) {
1133             /* Select input languages */
1134             option_elements[type].languages_item = append_item(genlist, SETTING_ITEM_ID_SELECT_INPUT_LANGUAGE, SELECT_LANGUAGES, NULL, (void *)SETTING_ITEM_ID_SELECT_INPUT_LANGUAGE, option_elements[type].itc_1text_main_item, ELM_GENLIST_ITEM_NONE, EINA_FALSE);
1135         }
1136 #endif
1137
1138 #ifndef _WEARABLE
1139 #ifndef _TV
1140         /* Smart input functions */
1141         append_item(genlist, SETTING_ITEM_ID_SMART_INPUT_TITLE, SMART_FUNCTIONS, NULL, NULL, option_elements[type].itc_group_title, ELM_GENLIST_ITEM_GROUP, EINA_TRUE);
1142 #endif
1143
1144         /* Auto capitalize */
1145         append_item(genlist, SETTING_ITEM_ID_AUTO_CAPITALISE, AUTO_CAPITALISE, CAPITALISE_DESC, (void *)SETTING_ITEM_ID_AUTO_CAPITALISE, option_elements[type].itc_multi_item, ELM_GENLIST_ITEM_NONE, EINA_FALSE);
1146
1147         /* Auto punctuate */
1148         append_item(genlist, SETTING_ITEM_ID_AUTO_PUNCTUATE, AUTO_PUNCTUATE, PUNCTUATE_DESC, (void *)SETTING_ITEM_ID_AUTO_PUNCTUATE, option_elements[type].itc_multi_item, ELM_GENLIST_ITEM_NONE, EINA_FALSE);
1149
1150 #ifndef _TV
1151         /* Key-tap feedback */
1152         append_item(genlist, SETTING_ITEM_ID_KEY_TAP_TITLE, KEY_FEEDBACK, NULL, NULL, option_elements[type].itc_group_title, ELM_GENLIST_ITEM_GROUP, EINA_TRUE);
1153 #endif
1154
1155         /* Sound */
1156         append_item(genlist, SETTING_ITEM_ID_SOUND, SOUND, NULL, (void *)SETTING_ITEM_ID_SOUND, option_elements[type].itc_main_item, ELM_GENLIST_ITEM_NONE, EINA_FALSE);
1157
1158         /* Prediction */
1159         append_item(genlist, SETTING_ITEM_ID_PREDICTION, PREDICTION, NULL, (void *)SETTING_ITEM_ID_PREDICTION, option_elements[type].itc_main_item, ELM_GENLIST_ITEM_NONE, EINA_FALSE);
1160
1161 #ifdef _TV
1162         /* voice language */
1163         append_item(genlist, SETTING_ITEM_ID_VOICE_LANGUAGE, VOICE_LANGUAGE, NULL, (void *)SETTING_ITEM_ID_VOICE_LANGUAGE, option_elements[type].itc_main_item, ELM_GENLIST_ITEM_NONE, EINA_FALSE);
1164 #endif
1165 #ifndef _TV
1166         /* Character preview */
1167         append_item(genlist, SETTING_ITEM_ID_CHARACTER_PRE, CHARACTER_PREVIEW, PREVIEW_DESC, (void *)SETTING_ITEM_ID_CHARACTER_PRE, option_elements[type].itc_multi_item, ELM_GENLIST_ITEM_NONE, EINA_FALSE);
1168 #endif
1169 #endif
1170
1171 #ifndef _TV
1172         const char *more_setting_text = NULL;
1173
1174 #ifdef _WEARABLE
1175         /* More settings */
1176         more_setting_text = MORE_SETTINGS;
1177 #else
1178         /* Other settings */
1179         more_setting_text = OTHER_SETTINGS;
1180 #endif
1181
1182         append_item(genlist, SETTING_ITEM_ID_MORE_SETTINGS_TITLE, more_setting_text, NULL, NULL, option_elements[type].itc_group_title, ELM_GENLIST_ITEM_GROUP, EINA_TRUE);
1183 #endif
1184
1185 #ifdef _WEARABLE
1186         /* Smart typing */
1187         append_item(genlist, SETTING_ITEM_ID_SMART_INPUT_TITLE, SMART_TYPING, NULL, (void *)SETTING_ITEM_ID_SMART_INPUT_TITLE, option_elements[type].itc_1text_main_item, ELM_GENLIST_ITEM_NONE, EINA_FALSE);
1188
1189         /* Key-tap feedback */
1190         append_item(genlist, SETTING_ITEM_ID_KEY_TAP_TITLE, KEY_FEEDBACK, NULL, (void *)SETTING_ITEM_ID_KEY_TAP_TITLE, option_elements[type].itc_1text_main_item, ELM_GENLIST_ITEM_NONE, EINA_FALSE);
1191 #endif
1192
1193         /* Reset */
1194         append_item(genlist, SETTING_ITEM_ID_RESET, RESET, NULL, (void *)SETTING_ITEM_ID_RESET, option_elements[type].itc_1text_main_item, ELM_GENLIST_ITEM_NONE, EINA_FALSE);
1195 #ifdef _WEARABLE
1196         /* Clear personalized data */
1197         append_item(genlist, SETTING_ITEM_ID_CLEAR, CLEAR, NULL, (void *)SETTING_ITEM_ID_CLEAR, option_elements[type].itc_1text_main_item, ELM_GENLIST_ITEM_NONE, EINA_FALSE);
1198 #endif
1199         evas_object_smart_callback_add(genlist, "contracted", _main_gl_con, genlist);
1200
1201 #ifdef _CIRCLE
1202         add_padding_area(genlist);
1203 #endif
1204     }
1205
1206     return genlist;
1207 }
1208
1209 static Evas_Object* create_option_language_view(Evas_Object *naviframe)
1210 {
1211     Evas_Object *genlist = create_genlist(naviframe);
1212
1213     SCLOptionWindowType type = find_option_window_type(naviframe);
1214
1215     if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) {
1216         option_elements[type].language_genlist = genlist;
1217
1218 #ifdef _CIRCLE
1219         /* Circle Surface Creation */
1220         if (option_elements[type].circle_surface) {
1221             Evas_Object *circle_genlist = eext_circle_object_genlist_add(genlist, option_elements[type].circle_surface);
1222             eext_rotary_object_event_activated_set(circle_genlist, EINA_TRUE);
1223         }
1224 #endif
1225
1226 #ifdef _WEARABLE
1227         add_scrollable_title_area(genlist, LANGUAGE, EINA_FALSE);
1228 #endif
1229
1230         for (unsigned int loop = 0; loop < OPTION_MAX_LANGUAGES && loop < _language_manager.get_languages_num(); loop++)
1231         {
1232             LANGUAGE_INFO *info = _language_manager.get_language_info(loop);
1233             if (info) {
1234                 strncpy(language_itemdata[loop].main_text, info->display_name.c_str(), ITEM_DATA_STRING_LEN - 1);
1235 #ifdef _WEARABLE
1236                 if (info->input_modes.size() > 0) {
1237                     INPUT_MODE_INFO input_mode = info->input_modes.at(0);
1238                     strncpy(language_itemdata[loop].sub_text, input_mode.display_name.c_str(), ITEM_DATA_STRING_LEN - 1);
1239                 }
1240 #endif
1241                 language_itemdata[loop].mode = loop;
1242                 option_elements[type].language_item[loop] =
1243                     elm_genlist_item_append(genlist, option_elements[type].itc_language_subitems,
1244                             &language_itemdata[loop], NULL, ELM_GENLIST_ITEM_NONE,
1245                             _language_gl_sel, reinterpret_cast<void*>(language_itemdata[loop].mode));
1246
1247                 language_itemdata[loop].item = option_elements[type].language_item[loop];
1248             } else {
1249                 option_elements[type].language_item[loop] = NULL;
1250             }
1251         }
1252
1253 #ifdef _CIRCLE
1254         add_padding_area(genlist);
1255 #endif
1256     }
1257
1258     evas_object_show(genlist);
1259
1260     naviframe_item_push(naviframe, LANGUAGE, genlist, _pop_cb, naviframe, language_selection_finished_cb, naviframe);
1261
1262     return genlist;
1263 }
1264
1265 #ifdef _WEARABLE
1266 static Evas_Object* create_smart_typing_view(Evas_Object *naviframe)
1267 {
1268     Evas_Object *genlist = create_genlist(naviframe);
1269     SCLOptionWindowType type = find_option_window_type(naviframe);
1270
1271     if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) {
1272         //option_elements[type].language_genlist = genlist;
1273
1274 #ifdef _CIRCLE
1275         if (option_elements[type].circle_surface) {
1276             Evas_Object *circle_genlist = eext_circle_object_genlist_add(genlist, option_elements[type].circle_surface);
1277             eext_rotary_object_event_activated_set(circle_genlist, EINA_TRUE);
1278         }
1279 #endif
1280
1281 #ifdef _WEARABLE
1282         add_scrollable_title_area(genlist, SMART_TYPING, EINA_FALSE);
1283 #endif
1284
1285         /* Prediction */
1286         append_item(genlist, SETTING_ITEM_ID_PREDICTION, PREDICTION, NULL, (void *)SETTING_ITEM_ID_PREDICTION, option_elements[type].itc_1text_main_item, ELM_GENLIST_ITEM_NONE, EINA_FALSE);
1287
1288         /* Auto capitalize */
1289         append_item(genlist, SETTING_ITEM_ID_AUTO_CAPITALISE, AUTO_CAPITALISE, NULL, (void *)SETTING_ITEM_ID_AUTO_CAPITALISE, option_elements[type].itc_1text_main_item, ELM_GENLIST_ITEM_NONE, EINA_FALSE);
1290
1291         /* Auto punctuate */
1292         append_item(genlist, SETTING_ITEM_ID_AUTO_PUNCTUATE, AUTO_PUNCTUATE, NULL, (void *)SETTING_ITEM_ID_AUTO_PUNCTUATE, option_elements[type].itc_1text_main_item, ELM_GENLIST_ITEM_NONE, EINA_FALSE);
1293
1294 #ifdef _CIRCLE
1295         add_padding_area(genlist);
1296 #endif
1297     }
1298
1299     evas_object_show(genlist);
1300
1301     naviframe_item_push(naviframe, SMART_TYPING, genlist, _pop_cb, naviframe, NULL, NULL);
1302
1303     return genlist;
1304 }
1305
1306 static Evas_Object* create_feedback_view(Evas_Object *naviframe)
1307 {
1308     Evas_Object *genlist = create_genlist(naviframe);
1309     SCLOptionWindowType type = find_option_window_type(naviframe);
1310
1311     if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) {
1312         //option_elements[type].language_genlist = genlist;
1313
1314 #ifdef _CIRCLE
1315         if (option_elements[type].circle_surface) {
1316             Evas_Object *circle_genlist = eext_circle_object_genlist_add(genlist, option_elements[type].circle_surface);
1317             eext_rotary_object_event_activated_set(circle_genlist, EINA_TRUE);
1318         }
1319 #endif
1320
1321 #ifdef _WEARABLE
1322         add_scrollable_title_area(genlist, KEY_FEEDBACK, EINA_FALSE);
1323 #endif
1324
1325         /* Sound */
1326         append_item(genlist, SETTING_ITEM_ID_SOUND, SOUND, NULL, (void *)SETTING_ITEM_ID_SOUND, option_elements[type].itc_1text_main_item, ELM_GENLIST_ITEM_NONE, EINA_FALSE);
1327
1328         /* Vibration */
1329         append_item(genlist, SETTING_ITEM_ID_VIBRATION, VIBRATION, NULL, (void *)SETTING_ITEM_ID_VIBRATION, option_elements[type].itc_1text_main_item, ELM_GENLIST_ITEM_NONE, EINA_FALSE);
1330
1331 #ifdef _CIRCLE
1332         add_padding_area(genlist);
1333 #endif
1334     }
1335
1336     evas_object_show(genlist);
1337
1338     naviframe_item_push(naviframe, KEY_FEEDBACK, genlist, _pop_cb, naviframe, NULL, NULL);
1339
1340     return genlist;
1341 }
1342 #endif
1343
1344 static void read_options(Evas_Object *naviframe)
1345 {
1346     SCLOptionWindowType type = find_option_window_type(naviframe);
1347
1348     if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) {
1349         for (unsigned int loop = 0; loop < OPTION_MAX_LANGUAGES && loop < _language_manager.get_languages_num(); loop++)
1350         {
1351             if (option_elements[type].selected_language_item[loop] != NULL) {
1352                 elm_object_item_del(option_elements[type].selected_language_item[loop]);
1353                 option_elements[type].selected_language_item[loop] = NULL;
1354             }
1355
1356             LANGUAGE_INFO *info = _language_manager.get_language_info(loop);
1357             if (info && info->enabled) {
1358                 strncpy(language_itemdata[loop].main_text, info->display_name.c_str(), ITEM_DATA_STRING_LEN - 1);
1359 #ifdef _WEARABLE
1360                 if (info->input_modes.size() > 0) {
1361                     INPUT_MODE_INFO input_mode = info->input_modes.at(0);
1362                     strncpy(language_itemdata[loop].sub_text, input_mode.display_name.c_str(), ITEM_DATA_STRING_LEN - 1);
1363                 }
1364 #endif
1365                 language_itemdata[loop].mode = SETTING_ITEM_ID_CUR_LANGUAGE;
1366                 option_elements[type].selected_language_item[loop] =
1367                     elm_genlist_item_insert_before(option_elements[type].genlist, option_elements[type].itc_main_item, &language_itemdata[loop],
1368                             NULL, option_elements[type].languages_item, ELM_GENLIST_ITEM_NONE, NULL, NULL);
1369
1370                 elm_genlist_item_select_mode_set(option_elements[type].selected_language_item[loop], ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
1371             }
1372         }
1373     }
1374
1375     Elm_Object_Item *top_it = elm_naviframe_top_item_get(naviframe);
1376     if (top_it) {
1377         Evas_Object *content = elm_object_item_content_get(top_it);
1378         if (content) {
1379             Elm_Object_Item *item = elm_genlist_first_item_get(content);
1380             while (item) {
1381                 elm_genlist_item_update(item);
1382                 item = elm_genlist_item_next_get(item);
1383             }
1384         }
1385     }
1386 }
1387
1388 static void set_option_values()
1389 {
1390 }
1391
1392 static void language_view_popup_show(Evas_Object *obj, SCLOptionWindowType type, const char *content_text, const char *btn_text)
1393 {
1394     if (content_text == NULL)
1395         return;
1396
1397     if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) {
1398         Evas_Object *top_level = elm_object_top_widget_get(obj);
1399         option_elements[type].lang_popup = elm_popup_add(top_level);
1400 #ifdef _CIRCLE
1401         elm_object_style_set(option_elements[type].lang_popup, "circle");
1402 #endif
1403         elm_object_text_set(option_elements[type].lang_popup, content_text);
1404         elm_popup_align_set(option_elements[type].lang_popup, ELM_NOTIFY_ALIGN_FILL, 1.0);
1405         elm_popup_timeout_set(option_elements[type].lang_popup, 3.0);
1406         evas_object_smart_callback_add(option_elements[type].lang_popup, "timeout", _popup_timeout_cb, obj);
1407         elm_object_focus_allow_set(option_elements[type].lang_popup, EINA_TRUE);
1408         evas_object_show(option_elements[type].lang_popup);
1409         evas_object_raise(option_elements[type].lang_popup);
1410         eext_object_event_callback_add(option_elements[type].lang_popup, EEXT_CALLBACK_BACK, _popup_timeout_cb, NULL);
1411     }
1412 }
1413
1414 static void language_selected(void *data, Evas_Object *obj, void *event_info)
1415 {
1416     Evas_Object *genlist = static_cast<Evas_Object*>(evas_object_data_get(obj, "parent_object"));
1417     SCLOptionWindowType type = find_option_window_type(genlist);
1418     LOGD("type=%d\n", type);
1419     ITEMDATA *item_data = (ITEMDATA*)data;
1420     if (item_data) {
1421         LANGUAGE_INFO *info = _language_manager.get_language_info(item_data->mode);
1422         if (info) {
1423             sclboolean language_changed = TRUE;
1424             info->enabled = elm_check_state_get(obj);
1425             if (!elm_check_state_get(obj)) {
1426                 if (_language_manager.get_enabled_languages_num() < MIN_SELECTED_LANGUAGES) {
1427                     info->enabled = TRUE;
1428                     elm_check_state_set(obj, EINA_TRUE);
1429                     language_view_popup_show(obj, type, MSG_NONE_SELECTED, NULL);
1430                     language_changed = FALSE;
1431                 }
1432             } else {
1433                 if (_language_manager.get_enabled_languages_num() > MAX_SELECTED_LANGUAGES) {
1434                     info->enabled = FALSE;
1435                     elm_check_state_set(obj, EINA_FALSE);
1436
1437                     char buf[256] = { 0 };
1438                     const sclchar *suppoted_max_languages = SUPPORTED_MAX_LANGUAGES;
1439                     snprintf(buf, sizeof(buf), suppoted_max_languages, MAX_SELECTED_LANGUAGES);
1440                     language_view_popup_show(obj, type, buf, NULL);
1441                     language_changed = FALSE;
1442                 }
1443             }
1444
1445             if (language_changed) {
1446                 // Update enabled_languages
1447                 sclboolean selected_language_found = FALSE;
1448                 std::vector<std::string> enabled_languages;
1449
1450                 for (unsigned int loop = 0;loop < OPTION_MAX_LANGUAGES && loop < _language_manager.get_languages_num();loop++) {
1451                     LANGUAGE_INFO *info = _language_manager.get_language_info(loop);
1452                     if (info) {
1453                         if (info->enabled) {
1454                             enabled_languages.push_back(info->name);
1455                             LOGD("Enabled language:%s\n", info->name.c_str());
1456                             if (info->name.compare(g_config_values.selected_language) == 0) {
1457                                 selected_language_found = TRUE;
1458                             }
1459                         }
1460                     }
1461                 }
1462                 if (enabled_languages.size() > 0) {
1463                     g_config_values.enabled_languages = enabled_languages;
1464                     LOGD("Enabled languages size:%d\n", g_config_values.enabled_languages.size());
1465                     if (!selected_language_found) {
1466                         if (!(g_config_values.enabled_languages.at(0).empty())) {
1467                             g_config_values.selected_language = g_config_values.enabled_languages.at(0);
1468                         }
1469                     }
1470
1471                     write_ise_config_values();
1472                 }
1473             }
1474         }
1475     }
1476 }
1477
1478 static void navi_back_cb(void *data, Evas_Object *obj, void *event_info)
1479 {
1480     SCLOptionWindowType type = find_option_window_type(obj);
1481     evas_object_smart_callback_del(obj, "clicked", navi_back_cb);
1482     if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX))
1483         close_option_window(type);
1484 }
1485
1486 void
1487 option_window_created(Evas_Object *window, SCLOptionWindowType type)
1488 {
1489     LOGD("option_window_created(%d) start \n", type);
1490     if (window == NULL) return;
1491     if (!CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) return;
1492
1493     sclint loop;
1494
1495     ISE_LANG_TABLE *table = NULL;
1496     ISELangTableMgr *lang_table_mgr = ISELangTableMgr::get_instance();
1497     if (lang_table_mgr) table = lang_table_mgr->get_lang_table();
1498
1499     if (lang_table_mgr && table)  {
1500         for (loop = 0;loop < lang_table_mgr->get_lang_table_size();loop++) {
1501             INPUT_MODE_INFO input_mode_QTY;
1502             input_mode_QTY.name = table[loop].inputmode_QTY;
1503             input_mode_QTY.display_name = table[loop].inputmode_QTY_name;
1504             LANGUAGE_INFO language;
1505             language.name = table[loop].language;
1506             language.display_name = table[loop].language_name;
1507             if (table[loop].locale_string) {
1508                 language.locale_string = table[loop].locale_string;
1509             }
1510             language.input_modes.push_back(input_mode_QTY);
1511             language.priority = LANGAUGE_PRIORITY_DEFAULT;
1512             language.resource_file = MAIN_ENTRY_XML_PATH;
1513             language.is_latin_language = table[loop].is_latin_language;
1514             language.accepts_caps_mode = table[loop].accepts_caps_mode;
1515
1516             /* These variable should be read from stored setting values */
1517             language.enabled = FALSE;
1518             language.selected_input_mode = input_mode_QTY.name;
1519
1520             _language_manager.add_language(language);
1521         }
1522     }
1523
1524     read_ise_config_values();
1525
1526     /* To make sure there is no temporary language in the enabled language list */
1527     _language_manager.set_enabled_languages(g_config_values.enabled_languages);
1528
1529     set_option_values();
1530     option_elements[type].option_window = window;
1531 #ifdef _MOBILE
1532     elm_win_indicator_mode_set(window, ELM_WIN_INDICATOR_SHOW);
1533     elm_win_indicator_opacity_set(window, ELM_WIN_INDICATOR_OPAQUE);
1534 #else
1535     elm_win_indicator_mode_set(window, ELM_WIN_INDICATOR_HIDE);
1536 #endif
1537
1538 #ifdef _TV
1539     option_elements[type].list_theme = elm_theme_new();
1540     elm_theme_ref_set(option_elements[type].list_theme, NULL);
1541     elm_theme_extension_add(option_elements[type].list_theme, EDJ_FILE);
1542
1543     Evas_Object *conformant = elm_conformant_add(window);
1544     evas_object_size_hint_weight_set(conformant, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1545     elm_win_resize_object_add(window, conformant);
1546     elm_win_conformant_set(window, EINA_TRUE);
1547     evas_object_show(conformant);
1548
1549     Evas_Object *blayout = elm_layout_add(conformant);
1550     elm_layout_theme_set(blayout, "layout", "application", "default");
1551     evas_object_size_hint_weight_set(blayout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1552     evas_object_show(blayout);
1553     elm_object_content_set(conformant, blayout);
1554
1555     Evas_Object *naviframe = elm_naviframe_add(blayout);
1556     option_elements[type].naviframe = naviframe;
1557     elm_object_part_content_set(blayout, "elm.swallow.content", naviframe);
1558     Evas_Object *mlayout = NULL;
1559     mlayout = elm_layout_add(naviframe);
1560     evas_object_size_hint_weight_set(mlayout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1561     elm_layout_theme_set(mlayout, "layout", "application", "default");
1562     option_elements[type].option_bg = mlayout;
1563     evas_object_show(mlayout);
1564     option_elements[type].option_layout = mlayout;
1565     edje_object_file_set(mlayout, EDJ_FILE, "keyboard");
1566
1567     Evas_Object *image = elm_image_add(mlayout);
1568     elm_image_file_set(image, IMG_POPUP_DIM_BG, NULL);
1569     elm_object_part_content_set(mlayout, "bg_image", image);
1570     Evas_Object *playout = elm_layout_add(mlayout);
1571     evas_object_size_hint_weight_set(mlayout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1572     elm_object_part_content_set(mlayout, "part.popup", playout);
1573     evas_object_show(playout);
1574
1575     elm_object_part_text_set(mlayout, "elm.text", OPTIONS);
1576     Evas_Object *bar_line = elm_image_add(mlayout);
1577     elm_image_file_set(bar_line, IMG_POPUP_BAR_LINE, NULL);
1578     evas_object_color_set(bar_line, 255, 255, 255, 80); //255 255 255 80 GUI
1579     elm_object_part_content_set(mlayout, "bar_line", bar_line);
1580
1581     Evas_Object *bar_shadow = elm_image_add(mlayout);
1582     elm_image_file_set(bar_shadow, IMG_POPUP_BAR_SHADOW, NULL);
1583     evas_object_color_set(bar_shadow, 0, 0, 255, 255); //0 0 0 100 GUI
1584     elm_object_part_content_set(mlayout, "bar_shadow", bar_shadow);
1585
1586     Evas_Object *list = create_option_main_view(mlayout, mlayout, type);
1587     elm_scroller_policy_set(list, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
1588     elm_object_part_content_set(mlayout, "part.list", list);
1589 #else
1590     Evas_Object *conformant = elm_conformant_add(window);
1591     evas_object_size_hint_weight_set(conformant, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1592     evas_object_size_hint_align_set(conformant, EVAS_HINT_FILL, EVAS_HINT_FILL);
1593     elm_win_resize_object_add(window, conformant);
1594     elm_win_conformant_set(window, EINA_TRUE);
1595     evas_object_show(conformant);
1596 #endif
1597
1598     option_elements[type].conformant = conformant;
1599
1600 #ifdef _MOBILE
1601     /* Create header bg */
1602     Evas_Object *bg = elm_bg_add(conformant);
1603     elm_object_style_set(bg, "indicator/headerbg");
1604     elm_object_part_content_set(conformant, "elm.swallow.indicator_bg", bg);
1605     evas_object_show(bg);
1606 #endif
1607
1608 #ifndef _TV
1609     Evas_Object *naviframe = elm_naviframe_add(conformant);
1610     option_elements[type].naviframe = naviframe;
1611 #endif
1612     elm_naviframe_prev_btn_auto_pushed_set(naviframe, EINA_FALSE);
1613     eext_object_event_callback_add(naviframe, EEXT_CALLBACK_BACK, _naviframe_back_cb, NULL);
1614     evas_object_size_hint_weight_set(naviframe, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1615     evas_object_size_hint_align_set(naviframe, EVAS_HINT_FILL, EVAS_HINT_FILL);
1616
1617 #ifdef _TV
1618     option_elements[type].back_button = naviframe_item_push(naviframe, OPTIONS, mlayout, NULL, NULL, navi_back_cb, NULL, EINA_FALSE);
1619 #else
1620     Evas_Object *list = create_option_main_view(conformant, naviframe, type);
1621     option_elements[type].back_button = naviframe_item_push(naviframe, OPTIONS, list, NULL, NULL, navi_back_cb, NULL);
1622     elm_object_content_set(conformant, naviframe);
1623 #endif
1624
1625     evas_object_show(naviframe);
1626     evas_object_show(window);
1627 }
1628
1629 void
1630 option_window_destroyed(Evas_Object *window)
1631 {
1632     SCLOptionWindowType type = find_option_window_type(window);
1633
1634     if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) {
1635         if (option_elements[type].option_window == window) {
1636 #ifdef _CIRCLE
1637             if (option_elements[type].circle_surface) {
1638                 eext_circle_surface_del(option_elements[type].circle_surface);
1639                 option_elements[type].circle_surface = NULL;
1640             }
1641 #endif
1642
1643             option_elements[type].option_window = NULL;
1644             option_elements[type].naviframe = NULL;
1645             option_elements[type].genlist = NULL;
1646             option_elements[type].circle_genlist = NULL;
1647             option_elements[type].language_genlist = NULL;
1648             option_elements[type].lang_popup = NULL;
1649             option_elements[type].back_button = NULL;
1650             option_elements[type].conformant = NULL;
1651
1652             option_elements[type].itc_main_item = NULL;
1653             option_elements[type].itc_multi_item = NULL;
1654             option_elements[type].itc_1text_main_item = NULL;
1655             option_elements[type].itc_language_subitems = NULL;
1656             option_elements[type].itc_group_title = NULL;
1657
1658             option_elements[type].languages_item = NULL;
1659         }
1660     }
1661 }
1662
1663 bool
1664 option_window_is_available(SCLOptionWindowType type)
1665 {
1666     LOGD("OptionWindowType = %d \n", type);
1667     if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) {
1668         if (option_elements[type].option_window != NULL) {
1669             return true;
1670         }
1671     }
1672     return false;
1673 }
1674
1675 static bool
1676 app_create(void *data)
1677 {
1678     LOGD("");
1679
1680     bindtextdomain(PACKAGE, LOCALEDIR);
1681     textdomain(PACKAGE);
1682
1683     /* Hook to take necessary actions before main event loop starts
1684        Initialize UI resources and application's data
1685        If this function returns true, the main loop of application starts
1686        If this function returns false, the application is terminated */
1687     return true;
1688 }
1689
1690 static void
1691 app_control(app_control_h app_control, void *data)
1692 {
1693     /* Handle the launch request. */
1694     char *caller = NULL;
1695     g_launch_mode = LAUNCH_MODE_OTHER;
1696     Evas_Object *window = elm_win_util_standard_add("Option window", "Option window");
1697     if (!window) return;
1698
1699     int rots[] = { 0, 90, 180, 270 };
1700     elm_win_wm_rotation_available_rotations_set(window, rots, (sizeof(rots) / sizeof(int)));
1701     elm_win_indicator_mode_set(window, ELM_WIN_INDICATOR_SHOW);
1702
1703     app_control_get_extra_data(app_control, "caller", &caller);
1704
1705     if (caller) {
1706         if (strcmp(caller, "ise-default") == 0)
1707             g_launch_mode = LAUNCH_MODE_IME;
1708
1709         free(caller);
1710     }
1711
1712     option_window_created(window, OPTION_WINDOW_TYPE_SETTING_APPLICATION);
1713 }
1714
1715 static void
1716 app_pause(void *data)
1717 {
1718     LOGD("");
1719     /* Take necessary actions when application becomes invisible. */
1720     if (g_launch_mode == LAUNCH_MODE_IME) {
1721         ui_app_exit();
1722     }
1723 }
1724
1725 static void
1726 app_resume(void *data)
1727 {
1728     LOGD("");
1729 }
1730
1731 static void
1732 app_terminate(void *data)
1733 {
1734     LOGD("");
1735 }
1736
1737 EXPORTED int
1738 main(int argc, char *argv[])
1739 {
1740     int ret = 0;
1741
1742     ui_app_lifecycle_callback_s event_callback = {0, };
1743
1744     event_callback.create = app_create;
1745     event_callback.terminate = app_terminate;
1746     event_callback.pause = app_pause;
1747     event_callback.resume = app_resume;
1748     event_callback.app_control = app_control;
1749
1750     ret = ui_app_main(argc, argv, &event_callback, NULL);
1751     if (ret != APP_ERROR_NONE) {
1752        LOGW("ui_app_main failed, Err=%d\n", ret);
1753     }
1754
1755     return ret;
1756 }
1757