No more support setup share object model
[platform/core/uifw/inputmethod-setting.git] / im_setting_list / input_method_setting_list_ui.cpp
1 /*
2  * Copyright (c) 2014 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 #include "input_method_setting_list.h"
18 #include <string>
19 #include <app.h>
20 #include <efl_extension.h>
21 #include <vector>
22 #include <algorithm>
23 #include "isf_control.h"
24
25 #define IM_SETTING_LIST_PACKAGE                      PACKAGE
26 #define IM_SETTING_LIST_LOCALE_DIR                   ("/usr/apps/"PACKAGE_NAME"/res/locale")
27 #define IM_SETTING_LIST_TITLE                   dgettext(PACKAGE, "IDS_IME_BODY_KEYBOARD")
28 #define IM_SETTING_LIST_KEYBOARD_HEADER         dgettext(PACKAGE, "IDS_ST_HEADER_KEYBOARDS")
29 #define IM_SETTING_LIST_POPUP_TITLE             dgettext(PACKAGE, "IDS_ST_BODY_ATTENTION")
30 #define IM_SETTING_LIST_POPUP_CANCEL            dgettext(PACKAGE, "IDS_COM_SK_CANCEL_ABB")
31 #define IM_SETTING_LIST_POPUP_ENABLE            dgettext(PACKAGE, "IDS_ST_BUTTON_ENABLE")
32 #define IM_SETTING_LIST_VIRTUAL_KEYBOARD        dgettext(PACKAGE, "IDS_ST_HEADER_VIRTUAL_KEYBOARD")
33 #define IM_SETTING_LIST_DEFAULT_KEYBOARD        dgettext(PACKAGE, "IDS_ST_HEADER_DEFAULT_KEYBOARD_ABB")
34 #define IM_SETTING_LIST_KEYBOARD_SETTING        dgettext(PACKAGE, "IDS_IME_HEADER_KEYBOARD_SETTINGS_ABB")
35 #define IM_SETTING_LIST_POPUP_TEXT              dgettext(PACKAGE, "IDS_ST_POP_THIS_INPUT_METHOD_MAY_BE_ABLE_TO_COLLECT_ALL_THE"\
36                                                                   "_TEXT_YOU_TYPE_INCLUDING_PERSONAL_DATA_LIKE_PASSWORDS_AND"\
37                                                                   "_CREDIT_CARD_NUMBERS_MSG")
38
39
40 typedef struct list_item_text_s
41 {
42     char main_text[255];
43     char sub_text[255];
44 }list_item_text;
45
46 typedef struct popup_cb_data_s
47 {
48     Evas_Object *popup;
49     void *data;
50 }popup_cb_data;
51
52 typedef struct gen_item_data_s
53 {
54     Elm_Object_Item *gen_item;
55     int chk_status;
56 }gen_item_data;
57
58 class ime_info_compare
59 {
60     public:
61     bool operator()(const ime_info_s &first, const ime_info_s &sec)
62     {
63         return (strcasecmp(first.label, sec.label) < 0);
64     }
65 };
66
67 typedef void (*popup_ok_cb)(void *data, Evas_Object *obj, void *event_info);
68 typedef void (*popup_cancel_cb)(void *data, Evas_Object *obj, void *event_info);
69
70 static std::vector<ime_info_s>      g_ime_info_list;
71 static Elm_Genlist_Item_Class       *itc_im_list_keyboard_list = NULL;
72 static Elm_Genlist_Item_Class       *itc_im_list_group = NULL;
73 static Elm_Genlist_Item_Class       *itc_im_list_item = NULL;
74 static Elm_Genlist_Item_Class       *itc_im_list_item_one_line = NULL;
75 static int                          g_active_ime_index = -1;
76 static list_item_text               item_text[2];
77 static std::vector<gen_item_data>   g_gen_item_data;
78
79 void im_setting_list_update_window(void *data);
80
81 static void im_setting_list_text_domain_set(void)
82 {
83    bindtextdomain(IM_SETTING_LIST_PACKAGE, IM_SETTING_LIST_LOCALE_DIR);
84    textdomain(IM_SETTING_LIST_PACKAGE);
85 }
86
87 static Evas_Object *
88 im_setting_list_main_window_create(const char *name, int app_type)
89 {
90     Evas_Object *eo = NULL;
91     eo = elm_win_add(NULL, name, ELM_WIN_BASIC);
92     if (eo) {
93         elm_win_title_set(eo, name);
94         elm_win_borderless_set(eo, EINA_TRUE);
95         elm_win_alpha_set(eo, EINA_FALSE);
96         elm_win_conformant_set(eo, EINA_TRUE);
97         elm_win_autodel_set(eo, EINA_TRUE);
98
99         if (app_type != APP_TYPE_SETTING_NO_ROTATION) {
100             int rots[4] = {0, 90, 180, 270};
101             elm_win_wm_rotation_available_rotations_set(eo, rots, 4);
102         }
103     }
104     return eo;
105 }
106
107 static Evas_Object* im_setting_list_bg_create(Evas_Object *parent)
108 {
109     Evas_Object *bg;
110     if (parent == NULL) return NULL;
111     bg = elm_bg_add(parent);
112     evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
113     elm_win_resize_object_add(parent, bg);
114     evas_object_show(bg);
115     return bg;
116 }
117
118 static void im_setting_list_sort_ime_info(std::vector<ime_info_s> &preinstall, std::vector<ime_info_s> &user)
119 {
120     std::sort(preinstall.begin(), preinstall.end(), ime_info_compare());
121     std::sort(user.begin(), user.end(), ime_info_compare());
122     for(unsigned int i=0; i<preinstall.size(); ++i)
123     {
124         g_ime_info_list.push_back(preinstall[i]);
125     }
126     for(unsigned int i=0; i<user.size(); ++i)
127     {
128         g_ime_info_list.push_back(user[i]);
129     }
130 }
131
132 static void im_setting_list_load_ime_info(void)
133 {
134     std::vector<ime_info_s>      ime_info_list_preinstall;
135     std::vector<ime_info_s>      ime_info_list_user;
136     ime_info_s *info = NULL;
137     g_ime_info_list.clear();
138     int cnt = isf_control_get_all_ime_info(&info);
139     if (info)
140     {
141         for(int i=0; i<cnt; ++i)
142         {
143             SECURE_LOGD("%s %s %d %d %d", info[i].appid, info[i].label, info[i].is_enabled, info[i].is_preinstalled, info[i].has_option);
144             if (info[i].is_preinstalled)
145             {
146                 ime_info_list_preinstall.push_back(info[i]);
147             }
148             else
149             {
150                 ime_info_list_user.push_back(info[i]);
151             }
152         }
153         free(info);
154     }
155     else
156     {
157         LOGD("isf_control_get_all_ime_info failed\n");
158     }
159     im_setting_list_sort_ime_info(ime_info_list_preinstall, ime_info_list_user);
160 }
161
162 static int im_setting_list_get_active_ime_index(void)
163 {
164     char *active_ime_appid = NULL;
165     isf_control_get_active_ime(&active_ime_appid);
166     std::vector<ime_info_s>::iterator iter = g_ime_info_list.begin();
167     std::vector<ime_info_s>::iterator end = g_ime_info_list.end();
168     for (; iter != end; ++iter)
169     {
170         if (active_ime_appid && (!strcmp(active_ime_appid, iter->appid)))
171         {
172             break;
173         }
174     }
175     if (active_ime_appid)
176     {
177         free(active_ime_appid);
178     }
179     return (iter-g_ime_info_list.begin());
180 }
181
182 static void
183 im_setting_list_app_control_reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
184 {
185     if (!request || !reply) {
186         LOGD("app_control handle is null");
187         return;
188     }
189     if (result == APP_CONTROL_RESULT_SUCCEEDED) {
190         im_setting_list_update_window(user_data);
191     }
192 }
193
194 static void im_setting_list_show_ime_selector(void *data)
195 {
196     int ret;
197     appdata *ad = (appdata *)data;
198     app_control_h app_control;
199     const char *app_id = "org.tizen.inputmethod-setting-selector";
200
201     if (!ad)
202         return;
203
204     ret = app_control_create (&app_control);
205     if (ret != APP_CONTROL_ERROR_NONE) {
206         LOGD("app_control_create returned %d", ret);
207         return;
208     }
209
210     ret = app_control_set_operation (app_control, APP_CONTROL_OPERATION_DEFAULT);
211     if (ret != APP_CONTROL_ERROR_NONE) {
212         LOGD("app_control_set_operation returned %d", ret);
213         app_control_destroy(app_control);
214         return;
215     }
216
217     ret = app_control_set_app_id (app_control, app_id);
218     if (ret != APP_CONTROL_ERROR_NONE) {
219         LOGD("app_control_set_app_id returned %d", ret);
220         app_control_destroy(app_control);
221         return;
222     }
223
224     if (ad->app_type == APP_TYPE_SETTING_NO_ROTATION)
225         app_control_add_extra_data(app_control, "caller", "settings_no_rotation");
226     else
227         app_control_add_extra_data(app_control, "caller", "settings");
228
229     ret = app_control_send_launch_request(app_control, im_setting_list_app_control_reply_cb, data);
230     if (ret != APP_CONTROL_ERROR_NONE) {
231         LOGD("app_control_send_launch_request returned %d, %s\n", ret, get_error_message(ret));
232         app_control_destroy(app_control);
233         return;
234     }
235     app_control_destroy(app_control);
236 }
237
238 static void
239 im_setting_list_check_popup_ok_cb(void *data, Evas_Object *obj, void *event_info)
240 {
241     popup_cb_data *cb_data = (popup_cb_data *)data;
242     int index = (int)reinterpret_cast<long>(cb_data->data);
243     if (index < 0 || index >= (int)g_ime_info_list.size()) {
244         LOGW("Wrong value. index : %d, g_ime_info_list.size() : %d\n", index, g_ime_info_list.size());
245         return;
246     }
247     Eina_Bool state = EINA_FALSE;
248     state = g_gen_item_data[index].chk_status;
249     isf_control_set_enable_ime(g_ime_info_list[index].appid, state);
250     evas_object_del(cb_data->popup);
251     delete cb_data;
252 }
253
254 static void
255 im_setting_list_check_popup_cancel_cb(void *data, Evas_Object *obj, void *event_info)
256 {
257     popup_cb_data *cb_data = (popup_cb_data *)data;
258     int index = (int)reinterpret_cast<long>(cb_data->data);
259     if (index < 0 || index >= (int)g_ime_info_list.size()) {
260         LOGW("Wrong value. index : %d, g_ime_info_list.size() : %d\n", index, g_ime_info_list.size());
261         return;
262     }
263
264     Eina_Bool state = g_gen_item_data[index].chk_status;
265     isf_control_set_enable_ime(g_ime_info_list[index].appid, !state);
266     g_gen_item_data[index].chk_status = !state;
267     elm_genlist_item_update(g_gen_item_data[index].gen_item);
268     evas_object_del(cb_data->popup);
269     delete cb_data;
270 }
271
272 static void _popup_back_cb(void *data, Evas_Object *obj, void *event_info)
273 {
274     eext_object_event_callback_del(obj, EEXT_CALLBACK_BACK, _popup_back_cb);
275     im_setting_list_check_popup_cancel_cb(data, NULL, NULL);
276 }
277
278 static void im_setting_list_show_popup(void *data, Evas_Object *obj, popup_ok_cb ime_setting_list_ok_callback, popup_cancel_cb ime_setting_list_cancel_callback)
279 {
280     int index = (int)reinterpret_cast<long>(data);
281     if (index < 0 || index >= (int)g_ime_info_list.size()) {
282         LOGW("Wrong value. index : %d, g_ime_info_list.size() : %d\n", index, g_ime_info_list.size());
283         return;
284     }
285
286     Evas_Object *top_widget = elm_object_top_widget_get(obj);
287     Evas_Object *popup = elm_popup_add(top_widget);
288     elm_popup_align_set (popup, ELM_NOTIFY_ALIGN_FILL, 1.0);
289     elm_object_part_text_set(popup, "title,text", IM_SETTING_LIST_POPUP_TITLE);
290
291     char chFormatMsg[255] = {'\0'};
292     char chPopupMsg[255] = {'\0'};
293     snprintf(chFormatMsg, sizeof(chFormatMsg), "%s", IM_SETTING_LIST_POPUP_TEXT);
294     snprintf(chPopupMsg, sizeof(chPopupMsg), chFormatMsg, g_ime_info_list[index].label);
295     elm_object_text_set(popup, chPopupMsg);
296
297     popup_cb_data *cb_data = new popup_cb_data;
298     cb_data->popup = popup;
299     cb_data->data = data;
300
301     Evas_Object *btn_cancel = elm_button_add(popup);
302     elm_object_text_set(btn_cancel, IM_SETTING_LIST_POPUP_CANCEL);
303     elm_object_part_content_set(popup, "button1", btn_cancel);
304     evas_object_smart_callback_add(btn_cancel, "clicked", ime_setting_list_cancel_callback, cb_data);
305
306     Evas_Object *btn_ok = elm_button_add(popup);
307     elm_object_text_set(btn_ok, IM_SETTING_LIST_POPUP_ENABLE);
308     elm_object_part_content_set(popup, "button2", btn_ok);
309     evas_object_smart_callback_add(btn_ok, "clicked", ime_setting_list_ok_callback, cb_data);
310
311     eext_object_event_callback_add (popup, EEXT_CALLBACK_BACK, _popup_back_cb, cb_data);
312     evas_object_show(popup);
313 }
314
315 static void im_setting_list_check_button_change_cb(void *data, Evas_Object *obj, void *event_info)
316 {
317     /*save the checked ime*/
318     int index = (int)reinterpret_cast<long>(data);
319     if (index < 0 || index >= (int)g_ime_info_list.size()) {
320         LOGW("Wrong value. index : %d, g_ime_info_list.size() : %d\n", index, g_ime_info_list.size());
321         return;
322     }
323
324     Eina_Bool state = g_gen_item_data[index].chk_status;
325
326     if (!state)
327     {
328         isf_control_set_enable_ime(g_ime_info_list[index].appid, state);
329     }
330     else
331     {
332         im_setting_list_show_popup(data, obj, im_setting_list_check_popup_ok_cb, im_setting_list_check_popup_cancel_cb);
333     }
334 }
335
336 static void
337 im_setting_list_popup_ok_cb(void *data, Evas_Object *obj, void *event_info)
338 {
339     popup_cb_data *cb_data = (popup_cb_data *)data;
340     int index = (int)reinterpret_cast<long>(cb_data->data);
341     if (index < 0 || index >= (int)g_ime_info_list.size()) {
342         LOGW("Wrong value. index : %d, g_ime_info_list.size() : %d\n", index, g_ime_info_list.size());
343         return;
344     }
345
346     Eina_Bool state = g_gen_item_data[index].chk_status;
347     g_gen_item_data[index].chk_status = !state;
348     isf_control_set_enable_ime(g_ime_info_list[index].appid, !state);
349     elm_genlist_item_update(g_gen_item_data[index].gen_item);
350     evas_object_del(cb_data->popup);
351     delete cb_data;
352 }
353
354 static void
355 im_setting_list_popup_cancel_cb(void *data, Evas_Object *obj, void *event_info)
356 {
357     popup_cb_data *cb_data = (popup_cb_data *)data;
358     evas_object_del(cb_data->popup);
359     delete cb_data;
360 }
361
362 static void im_setting_list_item_sel_cb(void *data, Evas_Object *obj, void *event_info)
363 {
364     Elm_Object_Item *item = (Elm_Object_Item *)event_info;
365     elm_genlist_item_selected_set (item, EINA_FALSE);
366
367     int index = (int)reinterpret_cast<long>(data);
368     if (index < 0 || index >= (int)g_ime_info_list.size()) {
369         LOGW("Wrong value. index : %d, g_ime_info_list.size() : %d\n", index, g_ime_info_list.size());
370         return;
371     }
372
373     if (g_ime_info_list[index].is_preinstalled || (index == g_active_ime_index))
374     {
375         return;
376     }
377
378     Evas_Object *ck = elm_object_item_part_content_get (item, "elm.icon.right");
379     if (ck == NULL) {
380         ck = elm_object_item_part_content_get (item, "elm.icon");
381     }
382     Eina_Bool state = g_gen_item_data[index].chk_status;
383
384     if (state)
385     {
386         g_gen_item_data[index].chk_status = !state;
387         isf_control_set_enable_ime(g_ime_info_list[index].appid, !state);
388         elm_genlist_item_update(item);
389     }
390     else
391     {
392         im_setting_list_show_popup(data, obj, im_setting_list_popup_ok_cb, im_setting_list_popup_cancel_cb);
393     }
394 }
395
396 static void im_setting_list_set_default_keyboard_item_sel_cb(void *data, Evas_Object *obj, void *event_info)
397 {
398     Elm_Object_Item *item = (Elm_Object_Item *)event_info;
399     elm_genlist_item_selected_set (item, EINA_FALSE);
400     im_setting_list_show_ime_selector(data);
401 }
402
403 static void im_setting_list_keyboard_setting_item_sel_cb(void *data, Evas_Object *obj, void *event_info)
404 {
405     Elm_Object_Item *item = (Elm_Object_Item *)event_info;
406     elm_genlist_item_selected_set (item, EINA_FALSE);
407     isf_control_open_ime_option_window();
408 }
409
410 static Evas_Object *im_setting_list_conform_create(Evas_Object *parentWin)
411 {
412     Evas_Object *conform = elm_conformant_add(parentWin);
413     elm_win_indicator_mode_set(parentWin, ELM_WIN_INDICATOR_SHOW);
414     elm_win_indicator_opacity_set(parentWin, ELM_WIN_INDICATOR_OPAQUE);
415     evas_object_size_hint_weight_set(conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
416     evas_object_size_hint_align_set(conform, EVAS_HINT_FILL, EVAS_HINT_FILL);
417     elm_win_resize_object_add(parentWin, conform);
418     evas_object_show(conform);
419     return conform;
420 }
421
422 static Evas_Object *im_setting_list_naviframe_create(Evas_Object* parent)
423 {
424     Evas_Object *naviframe = elm_naviframe_add(parent);
425     elm_naviframe_prev_btn_auto_pushed_set(naviframe, EINA_TRUE);
426     eext_object_event_callback_add(naviframe, EEXT_CALLBACK_BACK, eext_naviframe_back_cb, NULL);
427     evas_object_size_hint_weight_set(naviframe, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
428     evas_object_size_hint_align_set(naviframe, EVAS_HINT_FILL, EVAS_HINT_FILL);
429     elm_object_part_content_set(parent, "elm.swallow.content", naviframe);
430     evas_object_show(naviframe);
431     return naviframe;
432 }
433
434 static Evas_Object *im_setting_list_genlist_create(Evas_Object* parent)
435 {
436     Evas_Object *genlist = elm_genlist_add(parent);
437     evas_object_show(genlist);
438     return genlist;
439 }
440
441 static char *im_setting_list_genlist_group_label_get(void *data, Evas_Object *obj, const char *part)
442 {
443     char *text = (char *)data;
444 #ifdef _MOBILE
445     if (!strcmp(part, "elm.text.main")) {
446 #else
447     if (!strcmp(part, "elm.text")) {
448 #endif
449         return strdup(text);
450     }
451     return NULL;
452 }
453
454 static char *im_setting_list_genlist_keyboard_list_item_label_get(void *data, Evas_Object *obj, const char *part)
455 {
456     int index = (int)reinterpret_cast<long>(data);
457     if (index < 0 || index >= (int)g_ime_info_list.size()) {
458         LOGW("Wrong value. index : %d, g_ime_info_list.size() : %d\n", index, g_ime_info_list.size());
459         return NULL;
460     }
461
462     if (!strcmp(part, "elm.text.main.left.top") ||
463         !strcmp(part, "elm.text.main.left") ||
464         !strcmp(part, "elm.text.main") ||
465         !strcmp(part, "elm.text") ||
466         !strcmp(part, "elm.text.1")) {
467         return strdup(g_ime_info_list[index].label);
468     }
469     return NULL;
470 }
471
472 static Evas_Object *im_setting_list_genlist_keyboard_list_item_icon_get(void *data, Evas_Object *obj, const char *part)
473 {
474     int index = (int)reinterpret_cast<long>(data);
475     if (index < 0 || index >= (int)g_ime_info_list.size()) {
476         LOGW("Wrong value. index : %d, g_ime_info_list.size() : %d\n", index, g_ime_info_list.size());
477         return NULL;
478     }
479
480     if (!strcmp(part, "elm.icon.right") || !strcmp(part, "elm.icon")) {
481         Evas_Object *ck = elm_check_add(obj);
482         elm_object_style_set (ck, "on&off");
483         elm_object_disabled_set(ck, g_ime_info_list[index].is_preinstalled || (index == g_active_ime_index));
484         elm_check_state_set(ck, g_gen_item_data[index].chk_status);
485         evas_object_propagate_events_set (ck, EINA_FALSE);
486         evas_object_size_hint_align_set(ck, EVAS_HINT_FILL, EVAS_HINT_FILL);
487         evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
488         elm_check_state_pointer_set(ck, (Eina_Bool *)(&(g_gen_item_data[index].chk_status)));
489         evas_object_pass_events_set(ck, 1);
490         evas_object_smart_callback_add(ck, "changed", im_setting_list_check_button_change_cb, (void *)(index));
491         evas_object_show(ck);
492         return ck;
493     }
494     return NULL;
495 }
496
497 static char *im_setting_list_genlist_item_label_get(void *data, Evas_Object *obj, const char *part)
498 {
499     list_item_text *item_text = (list_item_text *)data;
500     if (!strcmp(part, "elm.text.main.left.top") ||
501         !strcmp(part, "elm.text.main.left") ||
502         !strcmp(part, "elm.text.main") ||
503         !strcmp(part, "elm.text") ||
504         !strcmp(part, "elm.text.1")) {
505         return strdup(item_text->main_text);
506     }
507
508     if (!strcmp(part, "elm.text.sub.left.bottom") ||
509         !strcmp(part, "elm.text.multiline") ||
510         !strcmp(part, "elm.text.2")) {
511         return strdup(item_text->sub_text);
512     }
513     return NULL;
514 }
515
516 static char *im_setting_list_genlist_item_one_line_label_get(void *data, Evas_Object *obj, const char *part)
517 {
518     list_item_text *item_text = (list_item_text *)data;
519     if (!strcmp(part, "elm.text.main.left.top") ||
520         !strcmp(part, "elm.text.main.left") ||
521         !strcmp(part, "elm.text.main") ||
522         !strcmp(part, "elm.text") ||
523         !strcmp(part, "elm.text.1")) {
524         return strdup(item_text->main_text);
525     }
526     return NULL;
527 }
528
529 static void im_setting_list_genlist_item_class_create(int app_type)
530 {
531     if (NULL == itc_im_list_group)
532     {
533         itc_im_list_group = elm_genlist_item_class_new();
534         if (itc_im_list_group)
535         {
536             itc_im_list_group->item_style = "groupindex";
537             itc_im_list_group->func.text_get = im_setting_list_genlist_group_label_get;
538             itc_im_list_group->func.content_get = NULL;
539             itc_im_list_group->func.state_get = NULL;
540             itc_im_list_group->func.del = NULL;
541         }
542     }
543
544     if (NULL == itc_im_list_keyboard_list)
545     {
546         itc_im_list_keyboard_list = elm_genlist_item_class_new();
547         if (itc_im_list_keyboard_list)
548         {
549 #ifdef _MOBILE
550             itc_im_list_keyboard_list->item_style = "1line";
551 #else
552             itc_im_list_keyboard_list->item_style = "1text.1icon.1";
553 #endif
554             itc_im_list_keyboard_list->func.text_get = im_setting_list_genlist_keyboard_list_item_label_get;
555             itc_im_list_keyboard_list->func.content_get = im_setting_list_genlist_keyboard_list_item_icon_get;
556             itc_im_list_keyboard_list->func.state_get = NULL;
557             itc_im_list_keyboard_list->func.del = NULL;
558         }
559     }
560
561     if (app_type == APP_TYPE_SETTING || app_type == APP_TYPE_SETTING_NO_ROTATION)
562     {
563         if (NULL == itc_im_list_item)
564         {
565             itc_im_list_item = elm_genlist_item_class_new();
566             if (itc_im_list_item)
567             {
568 #ifdef _MOBILE
569                 itc_im_list_item->item_style = "2line.top";
570 #else
571                 itc_im_list_item->item_style = "2text";
572 #endif
573                 itc_im_list_item->func.text_get = im_setting_list_genlist_item_label_get;
574                 itc_im_list_item->func.content_get = NULL;
575                 itc_im_list_item->func.state_get = NULL;
576                 itc_im_list_item->func.del = NULL;
577             }
578         }
579
580         if (NULL == itc_im_list_item_one_line)
581         {
582             itc_im_list_item_one_line = elm_genlist_item_class_new();
583             if (itc_im_list_item_one_line)
584             {
585 #ifdef _MOBILE
586                 itc_im_list_item_one_line->item_style = "1line";
587 #else
588                 itc_im_list_item_one_line->item_style = "1text";
589 #endif
590                 itc_im_list_item_one_line->func.text_get = im_setting_list_genlist_item_one_line_label_get;
591                 itc_im_list_item_one_line->func.content_get = NULL;
592                 itc_im_list_item_one_line->func.state_get = NULL;
593                 itc_im_list_item_one_line->func.del = NULL;
594             }
595         }
596     }
597 }
598
599 static void im_setting_list_add_ime(void *data) {
600     appdata *ad = (appdata *)data;
601     int i = 0;
602     im_setting_list_genlist_item_class_create(ad->app_type);
603
604     if (NULL != ad->genlist)
605     {
606         elm_genlist_clear(ad->genlist);
607     }
608
609     g_active_ime_index = im_setting_list_get_active_ime_index();
610     if (g_active_ime_index < 0 || g_active_ime_index >= (int)g_ime_info_list.size()) {
611         LOGW("Wrong value. g_active_ime_index : %d, g_ime_info_list.size() : %d\n", g_active_ime_index, g_ime_info_list.size());
612         return;
613     }
614
615     memset(&item_text, 0, sizeof(item_text));
616     Elm_Object_Item * group_header_item = NULL;
617     if (ad->app_type == APP_TYPE_SETTING || ad->app_type == APP_TYPE_SETTING_NO_ROTATION)
618     {
619         snprintf(item_text[0].main_text, sizeof(item_text[0].main_text), "%s", IM_SETTING_LIST_DEFAULT_KEYBOARD);
620         snprintf(item_text[0].sub_text, sizeof(item_text[0].sub_text), "%s", g_ime_info_list[g_active_ime_index].label);
621         elm_genlist_item_append(ad->genlist,
622             itc_im_list_item,
623             (void *)&item_text[0],
624             NULL,
625             ELM_GENLIST_ITEM_NONE,
626             im_setting_list_set_default_keyboard_item_sel_cb,
627             data);
628
629         snprintf(item_text[1].main_text, sizeof(item_text[1].main_text), "%s", IM_SETTING_LIST_KEYBOARD_SETTING);
630         Elm_Object_Item *item = elm_genlist_item_append(ad->genlist,
631             itc_im_list_item_one_line,
632             (void *)&item_text[1],
633             NULL,
634             ELM_GENLIST_ITEM_NONE,
635             im_setting_list_keyboard_setting_item_sel_cb,
636             NULL);
637
638         elm_object_item_disabled_set(item, !(g_ime_info_list[g_active_ime_index].has_option));
639     }
640
641     group_header_item = elm_genlist_item_append(ad->genlist,
642             itc_im_list_group,
643             IM_SETTING_LIST_KEYBOARD_HEADER,
644             NULL,
645             ELM_GENLIST_ITEM_NONE,
646             NULL,
647             NULL);
648     elm_genlist_item_select_mode_set(group_header_item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
649
650     /* keyboard list */
651     int info_list_size = g_ime_info_list.size();
652     for (i = 0; i < info_list_size; i++) {
653         gen_item_data item_data;
654
655         if (g_ime_info_list[i].is_preinstalled || (i == g_active_ime_index)) {
656             item_data.chk_status = EINA_TRUE;
657         }else{
658             item_data.chk_status = g_ime_info_list[i].is_enabled;
659         }
660         g_gen_item_data.push_back(item_data);
661
662         Elm_Object_Item *item = elm_genlist_item_append(ad->genlist,
663             itc_im_list_keyboard_list,
664             (void *)(i),
665             NULL,
666             ELM_GENLIST_ITEM_NONE,
667             im_setting_list_item_sel_cb,
668             (void *)(i));
669
670         if (g_ime_info_list[i].is_preinstalled || (i == g_active_ime_index)) {
671             elm_object_item_disabled_set(item, EINA_TRUE);
672         }
673
674         g_gen_item_data[i].gen_item = item;
675     }
676 }
677
678 static Eina_Bool im_setting_list_navi_item_pop_cb(void *data, Elm_Object_Item *it)
679 {
680     static bool in_exit = false;
681     if (in_exit)
682         return EINA_TRUE;
683     in_exit = true;
684     if (data == NULL)
685         return EINA_TRUE;
686     ui_app_exit();
687     return EINA_TRUE;
688 }
689
690 static void im_setting_list_navi_back_btn_call_cb(void *data, Evas_Object *obj, void *event_info)
691 {
692     evas_object_smart_callback_del(obj, "clicked", im_setting_list_navi_back_btn_call_cb);
693     ui_app_exit();
694 }
695
696 Evas_Object *im_setting_list_list_create(void *data)
697 {
698     appdata *ad = (appdata *)data;
699     ad->conform = im_setting_list_conform_create(ad->win);
700     ad->naviframe = im_setting_list_naviframe_create(ad->conform);
701     ad->genlist = im_setting_list_genlist_create(ad->naviframe);
702     im_setting_list_add_ime(ad);
703
704     /* Add genlist to naviframe */
705     Evas_Object *back_btn = elm_button_add (ad->naviframe);
706     elm_object_style_set (back_btn, "naviframe/back_btn/default");
707     evas_object_smart_callback_add(back_btn, "clicked", im_setting_list_navi_back_btn_call_cb, NULL);
708     Elm_Object_Item *nf_main_item = elm_naviframe_item_push(ad->naviframe,
709                 IM_SETTING_LIST_TITLE,
710                 back_btn,
711                 NULL,
712                 ad->genlist,
713                 NULL);
714     elm_naviframe_item_title_enabled_set(nf_main_item, EINA_TRUE, EINA_TRUE);
715     elm_naviframe_item_pop_cb_set(nf_main_item, im_setting_list_navi_item_pop_cb, ad);
716     elm_object_content_set(ad->conform, ad->naviframe);
717
718     return ad->genlist;
719 }
720
721 void im_setting_list_app_terminate(void *data)
722 {
723     g_ime_info_list.clear();
724     g_gen_item_data.clear();
725     if (NULL != itc_im_list_keyboard_list)
726     {
727         elm_genlist_item_class_free(itc_im_list_keyboard_list);
728         itc_im_list_keyboard_list = NULL;
729     }
730
731     if (NULL != itc_im_list_group)
732     {
733         elm_genlist_item_class_free(itc_im_list_group);
734         itc_im_list_group = NULL;
735     }
736
737     if (NULL != itc_im_list_item)
738     {
739         elm_genlist_item_class_free(itc_im_list_item);
740         itc_im_list_item = NULL;
741     }
742 }
743
744 void im_setting_list_update_window(void *data)
745 {
746     appdata *ad = (appdata *)data;
747     im_setting_list_load_ime_info();
748     im_setting_list_add_ime(ad);
749 }
750
751 void
752 im_setting_list_app_create(void *data)
753 {
754     appdata *ad = (appdata *)data;
755     if (!ad)
756         return;
757     im_setting_list_text_domain_set();
758     ad->win = im_setting_list_main_window_create(PACKAGE, ad->app_type);
759     im_setting_list_bg_create(ad->win);
760     im_setting_list_load_ime_info();
761
762     im_setting_list_list_create(ad);
763     evas_object_show(ad->win);
764 }
765