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