2 * Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 #include "input_method_setting_list.h"
18 #include "input_method_setting_list_ui.h"
19 #include "input_method_setting_list_popup_view.h"
21 #include <efl_extension.h>
23 #include <isf_control.h>
25 #include <inputmethod_manager.h>
28 #define IM_SETTING_LIST_POPUP_VIEW_TITLE "IDS_ST_HEADER_DEFAULT_KEYBOARD_ABB"
30 static std::vector<ime_info_s> g_active_ime_info_list;
31 static Elm_Genlist_Item_Class *itc_im_list = NULL;
32 static Evas_Object *group_radio = NULL;
33 static int g_active_ime_id = -1;
40 class ime_info_compare
43 bool operator()(const ime_info_s &first, const ime_info_s &sec)
45 return (strcasecmp(first.label, sec.label) < 0);
49 static int selected_index = 0;
51 static void im_setting_list_sort_ime_info(std::vector<ime_info_s> &preinstall, std::vector<ime_info_s> &user)
53 std::sort(preinstall.begin(), preinstall.end(), ime_info_compare());
54 std::sort(user.begin(), user.end(), ime_info_compare());
55 for (unsigned int i = 0; i < preinstall.size(); ++i)
57 g_active_ime_info_list.push_back(preinstall[i]);
59 for (unsigned int i = 0; i < user.size(); ++i)
61 g_active_ime_info_list.push_back(user[i]);
65 static void im_setting_list_load_active_ime_info(void)
67 std::vector<ime_info_s> active_ime_info_list_preinstall;
68 std::vector<ime_info_s> active_ime_info_list_user;
69 g_active_ime_info_list.clear();
70 char *active_ime_appid = NULL;
72 int ret = ime_manager_get_active_ime(&active_ime_appid);
73 if (ret == IME_MANAGER_ERROR_NONE)
74 LOGD("get active ime : %s\n", active_ime_appid);
76 LOGW("Failed to get active ime. error : %d\n", ret);
78 ime_info_s *info = NULL;
79 int cnt = isf_control_get_all_ime_info(&info);
82 for (int i = 0; i < cnt; ++i)
84 SECURE_LOGD("%s %s %d %d %d\n", info[i].appid, info[i].label, info[i].is_enabled, info[i].is_preinstalled, info[i].has_option);
85 if (info[i].is_enabled && info[i].is_preinstalled) {
86 active_ime_info_list_preinstall.push_back(info[i]);
87 } else if (info[i].is_enabled) {
88 active_ime_info_list_user.push_back(info[i]);
94 im_setting_list_sort_ime_info(active_ime_info_list_preinstall, active_ime_info_list_user);
95 for (unsigned int i = 0; i < g_active_ime_info_list.size(); ++i)
97 if (active_ime_appid && (!strcmp(active_ime_appid, g_active_ime_info_list[i].appid)))
103 if (active_ime_appid)
105 free(active_ime_appid);
109 static void im_setting_list_update_radio_state(Elm_Object_Item *item, Evas_Object *obj, int index)
111 if (index < 0 || index >= (int)g_active_ime_info_list.size()) {
112 LOGW("Wrong value. index : %d, g_active_ime_info_list.size() : %zu\n", index, g_active_ime_info_list.size());
117 elm_genlist_item_selected_set(item, EINA_FALSE);
118 /* Update radio button */
119 Evas_Object *radio = elm_object_item_part_content_get(item, "elm.swallow.end");
121 radio = elm_object_item_part_content_get(item, "elm.icon");
123 evas_object_data_set(radio, "parent_genlist", obj);
124 elm_radio_value_set(group_radio, index);
128 void im_setting_list_update_window_selector(void *data)
130 appdata *ad = (appdata *)data;
133 im_setting_list_load_active_ime_info();
134 im_setting_list_update_window(ad);
137 static Eina_Bool _ime_select_idler_cb(void *data)
139 appdata *ad = (appdata *)data;
140 if (!ad) return ECORE_CALLBACK_CANCEL;
142 LOGD("set active IME\n");
143 if (isf_control_set_active_ime(g_active_ime_info_list[selected_index].appid) != 0)
144 LOGW("Failed to set active IME : %s\n", g_active_ime_info_list[selected_index].appid);
146 LOGD("update window selector\n");
147 im_setting_list_update_window_selector(ad);
149 LOGD("delete popup\n");
151 evas_object_del(ad->popup);
155 if (ad->app_type == APP_TYPE_NORMAL) {
157 elm_naviframe_item_pop(ad->naviframe);
161 elm_naviframe_item_pop(ad->naviframe);
165 return ECORE_CALLBACK_CANCEL;
168 static void im_setting_list_ime_sel_cb(void *data, Evas_Object *obj, void *event_info)
170 sel_cb_data *cb_data = (sel_cb_data *)data;
174 appdata *ad = (appdata *)cb_data->data;
178 int index = cb_data->index;
179 selected_index = index;
181 Elm_Object_Item *item = (Elm_Object_Item *)event_info;
186 im_setting_list_update_radio_state(item, obj, index);
188 ecore_idler_add(_ime_select_idler_cb, ad);
191 static void gl_lang_changed(void *data, Evas_Object *obj, void *event_info)
193 im_setting_list_load_active_ime_info();
195 elm_genlist_realized_items_update(obj);
198 static Evas_Object *im_setting_list_genlist_create(appdata *ad, Evas_Object* parent, Evas_Object* conform)
202 Evas_Object *genlist = elm_genlist_add(parent);
203 elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);
205 /* Circle Surface Creation */
206 if (ad->circle_surface == NULL)
207 ad->circle_surface = eext_circle_surface_conformant_add(conform);
208 Evas_Object *circle_genlist = eext_circle_object_genlist_add(genlist, ad->circle_surface);
209 eext_rotary_object_event_activated_set(circle_genlist, EINA_TRUE);
211 evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
212 evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL);
213 elm_scroller_content_min_limit(genlist, EINA_FALSE, EINA_TRUE);
214 evas_object_smart_callback_add(genlist, "language,changed", gl_lang_changed, NULL);
215 evas_object_show(genlist);
219 static char *im_setting_list_genlist_item_label_get(void *data, Evas_Object *obj, const char *part)
221 sel_cb_data *cb_data = (sel_cb_data *)data;
225 int index = cb_data->index;
226 if (index < 0 || index >= (int)g_active_ime_info_list.size()) {
227 LOGW("Wrong value. index : %d, g_active_ime_info_list.size() : %zu\n", index, g_active_ime_info_list.size());
231 if (!strcmp(part, "elm.text") ||
232 !strcmp(part, "elm.text.main") ||
233 !strcmp(part, "elm.text.main.left")) {
234 return strdup(g_active_ime_info_list[index].label);
240 static Evas_Object *im_setting_list_genlist_item_icon_get(void *data, Evas_Object *obj, const char *part)
242 sel_cb_data *cb_data = (sel_cb_data *)data;
246 int index = cb_data->index;
247 Elm_Object_Item *it = elm_genlist_nth_item_get(obj, index);
249 if (!strcmp(part, "elm.swallow.end") ||
250 !strcmp(part, "elm.icon")) {
251 Evas_Object *radio = elm_radio_add(obj);
252 elm_object_style_set(radio, "list");
253 elm_radio_state_value_set(radio, index);
254 evas_object_propagate_events_set(radio, EINA_TRUE);
255 elm_radio_group_add(radio, group_radio);
256 evas_object_show(radio);
258 elm_atspi_accessible_relationship_append(it, ELM_ATSPI_RELATION_DESCRIBED_BY, radio);
259 elm_atspi_accessible_relationship_append(radio, ELM_ATSPI_RELATION_CONTROLLED_BY, it);
266 static void im_setting_list_genlist_item_del_cb(void *data, Evas_Object *obj)
268 sel_cb_data *cb_data = (sel_cb_data *)data;
275 static void im_setting_list_genlist_item_class_create(void)
277 itc_im_list = elm_genlist_item_class_new();
280 itc_im_list->item_style = "1text.1icon.1";
282 itc_im_list->item_style = "type1";
284 itc_im_list->func.text_get = im_setting_list_genlist_item_label_get;
285 itc_im_list->func.content_get = im_setting_list_genlist_item_icon_get;
286 itc_im_list->func.state_get = NULL;
287 itc_im_list->func.del = im_setting_list_genlist_item_del_cb;
292 static Evas_Object *im_setting_list_list_create(void *data)
294 appdata *ad = (appdata *)data;
297 im_setting_list_genlist_item_class_create();
298 Evas_Object *genlist = NULL;
299 genlist = im_setting_list_genlist_create(ad, ad->popup, ad->conform);
303 for (i = 0; i < g_active_ime_info_list.size(); i++) {
304 sel_cb_data *cb_data = new sel_cb_data;
305 cb_data->data = data;
307 elm_genlist_item_append(genlist,
311 ELM_GENLIST_ITEM_NONE,
312 im_setting_list_ime_sel_cb,
315 elm_radio_value_set(group_radio, g_active_ime_id);
321 im_setting_list_popup_block_clicked_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
323 appdata *ad = (appdata *)data;
327 evas_object_del(ad->popup);
332 static void im_setting_list_popup_view_back_cb(void *data, Evas_Object *obj, void *event_info)
334 appdata *ad = (appdata *)data;
337 eext_object_event_callback_del(obj, EEXT_CALLBACK_BACK, im_setting_list_popup_view_back_cb);
339 evas_object_del(ad->popup);
344 static Evas_Object *im_setting_list_popup_create(void *data)
346 appdata *ad = (appdata *)data;
349 Evas_Object *parentWin = ad->win;
350 if (NULL == group_radio)
352 group_radio = elm_radio_add(parentWin);
353 elm_radio_state_value_set(group_radio, -1);
356 Evas_Object *popup = elm_popup_add(parentWin);
357 elm_popup_align_set(popup, ELM_NOTIFY_ALIGN_FILL, 1.0);
358 evas_object_smart_callback_add(popup, "block,clicked", im_setting_list_popup_block_clicked_cb, data);
359 elm_object_domain_translatable_part_text_set(popup, "title,text", PACKAGE, IM_SETTING_LIST_POPUP_VIEW_TITLE);
360 elm_object_style_set(popup, "theme_bg");
361 eext_object_event_callback_add(popup, EEXT_CALLBACK_BACK, im_setting_list_popup_view_back_cb, data);
364 Evas_Object *genlist = im_setting_list_list_create(data);
365 elm_object_content_set(popup, genlist);
366 evas_object_show(popup);
372 static void _active_keyboard_changed_cb(keynode_t* node, void* data)
374 im_setting_list_load_active_ime_info();
375 if (group_radio != NULL) {
376 elm_radio_value_set(group_radio, g_active_ime_id);
381 im_setting_list_default_keyboard_title_text_get(void *data, Evas_Object *obj, const char *part)
383 return strdup(dgettext(PACKAGE, IM_SETTING_LIST_POPUP_VIEW_TITLE));
386 static Eina_Bool _pop_cb(void *data, Elm_Object_Item *it)
389 appdata *ad = (appdata *)data;
390 if (ad && ad->main_circle_genlist)
391 eext_rotary_object_event_activated_set(ad->main_circle_genlist, EINA_TRUE);
394 vconf_ignore_key_changed(VCONFKEY_ISF_ACTIVE_KEYBOARD_UUID, _active_keyboard_changed_cb);
399 static void im_setting_list_screen_create(void *data)
402 Evas_Object *genlist = NULL;
404 ad = (appdata *) data;
405 if (ad == NULL) return;
407 Elm_Genlist_Item_Class *ttc = elm_genlist_item_class_new();
410 ttc->item_style = "title";
411 ttc->func.text_get = im_setting_list_default_keyboard_title_text_get;
413 im_setting_list_genlist_item_class_create();
414 genlist = im_setting_list_genlist_create(ad, ad->win, ad->conform);
416 elm_genlist_mode_set(genlist, ELM_LIST_SCROLL);
417 elm_genlist_item_append(genlist, ttc, NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
419 if (NULL == group_radio) {
420 group_radio = elm_radio_add(ad->win);
421 elm_radio_state_value_set(group_radio, g_active_ime_id);
425 for (unsigned int i = 0; i < g_active_ime_info_list.size(); i++) {
426 sel_cb_data *cb_data = new sel_cb_data;
427 cb_data->data = data;
429 elm_genlist_item_append(genlist,
433 ELM_GENLIST_ITEM_NONE,
434 im_setting_list_ime_sel_cb,
438 elm_radio_state_value_set(group_radio, g_active_ime_id);
439 elm_radio_value_set(group_radio, g_active_ime_id);
440 elm_genlist_item_class_free(ttc);
443 im_setting_list_add_padding(genlist);
446 Elm_Object_Item *navi_it = elm_naviframe_item_push(ad->naviframe, NULL, NULL, NULL, genlist, "empty");
448 elm_atspi_accessible_name_set(navi_it, dgettext(PACKAGE, IM_SETTING_LIST_POPUP_VIEW_TITLE));
450 elm_naviframe_item_pop_cb_set(navi_it, _pop_cb, ad);
452 vconf_notify_key_changed(VCONFKEY_ISF_ACTIVE_KEYBOARD_UUID, _active_keyboard_changed_cb, data);
456 void im_setting_list_popup_view_del(void *data)
458 appdata *ad = (appdata *)data;
463 evas_object_del(ad->popup);
468 elm_naviframe_item_pop(ad->naviframe);
473 im_setting_list_popup_view_create(void *data)
475 appdata *ad = (appdata *)data;
479 im_setting_list_load_active_ime_info();
481 im_setting_list_screen_create(data);
483 im_setting_list_popup_create(data);