2 * Copyright (c) 2012 - 2015 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.
20 #include <vconf-keys.h>
21 #include <Elementary.h>
22 #include <efl_extension.h>
27 #include "languages.h"
29 #include "sdk/ise_lang_table.h"
30 #include "ise-stt-option.h"
34 #define LOG_TAG "ISE_DEFAULT"
38 #define ICON_DIR LAYOUTDIR"/wearable/image"
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"
49 #define OPTION_MAX_LANGUAGES 255
50 #define MIN_SELECTED_LANGUAGES 1
52 #define MAX_SELECTED_LANGUAGES 2
54 #define MAX_SELECTED_LANGUAGES 4
58 #define CHECK_STATE "check_state"
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,
81 enum LANGUAGE_VIEW_MODE {
82 LANGUAGE_VIEW_MODE_LANGUAGE,
83 LANGUAGE_VIEW_MODE_INPUT_MODE,
86 static ITEMDATA main_itemdata[SETTING_ITEM_ID_MAX];
87 static ITEMDATA language_itemdata[OPTION_MAX_LANGUAGES];
89 struct OPTION_ELEMENTS
95 circle_genlist = NULL;
96 language_genlist = NULL;
101 option_layout = NULL;
106 itc_main_item = NULL;
107 itc_multi_item = NULL;
108 itc_1text_main_item = NULL;
110 itc_language_subitems = NULL;
112 languages_item = NULL;
114 memset(language_item, 0x00, sizeof(language_item));
115 memset(selected_language_item, 0x00, sizeof(selected_language_item));
117 itc_group_title = NULL;
119 circle_surface = NULL;
123 Elm_Theme * list_theme;
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;
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;
140 Elm_Genlist_Item_Class *itc_language_subitems;
142 Elm_Object_Item *languages_item;
144 Elm_Object_Item *language_item[OPTION_MAX_LANGUAGES];
145 Elm_Object_Item *selected_language_item[OPTION_MAX_LANGUAGES];
147 Elm_Genlist_Item_Class *itc_group_title;
150 Eext_Circle_Surface *circle_surface;
154 static OPTION_ELEMENTS option_elements[OPTION_WINDOW_TYPE_MAX];
155 extern CONFIG_VALUES g_config_values;
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);
162 static Evas_Object* create_smart_typing_view(Evas_Object *naviframe);
163 static Evas_Object* create_feedback_view(Evas_Object *naviframe);
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);
169 static void language_selected(void *data, Evas_Object *obj, void *event_info);
171 static void navi_back_cb(void *data, Evas_Object *obj, void *event_info);
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);
182 static char* _accessible_body_name_cb(void *data, Evas_Object *obj);
183 static void _screen_reader_information_set(Evas_Object *obj);
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);
190 scluint LanguageOptionManager::get_language_options_num() {
191 return language_option_vector.size();
193 ILanguageOption* LanguageOptionManager::get_language_option_info(scluint index) {
194 return ((index < language_option_vector.size()) ? language_option_vector.at(index) : NULL);
197 SCLOptionWindowType find_option_window_type(Evas_Object *obj)
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);
209 LOGD("OPTION_WINDOW_TYPE_MAX=%d\n", OPTION_WINDOW_TYPE_MAX);
210 return OPTION_WINDOW_TYPE_MAX;
213 static void reset_settings_popup_response_ok_cb(void *data, Evas_Object *obj, void *event_info)
215 reset_ise_config_values();
216 _language_manager.set_enabled_languages(g_config_values.enabled_languages);
218 Evas_Object *genlist = static_cast<Evas_Object*>(evas_object_data_get(obj, "parent_object"));
219 SCLOptionWindowType type = find_option_window_type(genlist);
221 if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) {
222 read_options(option_elements[type].naviframe);
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);
230 Evas_Object *popup = (Evas_Object *)data;
232 evas_object_del(popup);
235 static void popup_response_cancel_cb(void *data, Evas_Object *obj, void *event_info)
237 Evas_Object *popup = (Evas_Object *)data;
239 evas_object_del(popup);
242 static void clear_data_popup_response_ok_cb(void *data, Evas_Object *obj, void *event_info)
244 clear_ise_data_values();
245 Evas_Object *popup = (Evas_Object *)data;
247 evas_object_del(popup);
250 static Evas_Object *create_popup_button(Evas_Object *parent, const char *style, const char *icon_path, const char *string)
252 Evas_Object *btn = elm_button_add(parent);
254 elm_object_style_set(btn, style);
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);
263 elm_atspi_accessible_name_set(btn, string);
264 elm_atspi_accessible_translation_domain_set(btn, PACKAGE);
266 elm_object_style_set(btn, "popup");
267 elm_object_domain_translatable_text_set(btn, PACKAGE, string);
275 _accessible_body_name_cb(void *data, Evas_Object *obj)
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;
283 _screen_reader_information_set(Evas_Object *obj)
285 Evas_Object *to, *ao;
286 to = (Evas_Object *)edje_object_part_object_get(elm_layout_edje_get(obj), "elm.text");
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);
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)
297 const char *icon_path = NULL;
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);
302 elm_popup_orient_set(popup, ELM_POPUP_ORIENT_CENTER);
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);
308 elm_object_style_set(popup, "circle");
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);
316 _screen_reader_information_set(layout);
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);
324 icon_path = ICON_DIR"/tw_ic_popup_btn_delete.png";
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);
330 elm_object_focus_set(btn_cancel, EINA_TRUE);
335 icon_path = ICON_DIR"/tw_ic_popup_btn_check.png";
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);
346 static void reset_settings_popup(void *data, Evas_Object *obj, void *event_info)
348 show_popup(obj, RESET_SETTINGS_POPUP_TEXT, POPUP_CANCEL_BTN, popup_response_cancel_cb, POPUP_OK_BTN, reset_settings_popup_response_ok_cb);
351 static void clear_personalized_data_popup(void *data, Evas_Object *obj, void *event_info)
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);
356 static char *_main_gl_text_get(void *data, Evas_Object *obj, const char *part)
358 ITEMDATA *item_data = (ITEMDATA*)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);
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);
383 static Eina_Bool tv_check_state_get(Evas_Object *label)
385 LOGD("tv_check_state_get in");
387 state = (long)evas_object_data_get(label, CHECK_STATE);
388 return (state == 1)? EINA_TRUE:EINA_FALSE;
391 static void tv_switch_check_state(Evas_Object *label, Eina_Bool state)
393 LOGD("tv_switch_check_state, state = [%d]", state);
395 char text[BUF_SIZE] = {0, };
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);
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);
407 static void _gl_pressed_cb(void *data, Evas_Object *obj, void *event_info)
409 LOGD("_gl_pressed_cb in!");
411 LOGE("event_info is NULL!");
415 Elm_Object_Item *item = (Elm_Object_Item *)event_info;
416 Evas_Object *label = elm_object_item_part_content_get(item, "elm.swallow.end");
418 LOGD("item no label, not need to update!");
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);
428 static void _gl_relesed_cb(void *data, Evas_Object *obj, void *event_info)
430 LOGD("_gl_relesed_cb in!");
432 LOGE("event_info is NULL!");
436 Elm_Object_Item *item = (Elm_Object_Item *)event_info;
437 Evas_Object *label = elm_object_item_part_content_get(item, "elm.swallow.end");
439 LOGD("item no label, not need to update!");
442 Eina_Bool state = tv_check_state_get(label);
443 char text[BUF_SIZE] = {0, };
445 snprintf(text, sizeof(text), "<font_size=28 color=#0081C6FF><align=center>%s</left></font>", SWITCH_ON);
446 elm_object_text_set(label, text);
448 snprintf(text, sizeof(text), "<font_size=28 color=#000000CC><align=center>%s</left></font>", SWITCH_OFF);
449 elm_object_text_set(label, text);
455 static Evas_Object *get_check(Elm_Object_Item *item)
458 ck = elm_object_item_part_content_get(item, "elm.swallow.end");
460 ck = elm_object_item_part_content_get(item, "elm.icon");
465 static Eina_Bool _update_check_button_state(Elm_Object_Item *item, Evas_Object *obj)
467 Eina_Bool state = EINA_FALSE;
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);
475 elm_check_state_set(ck, state);
477 tv_switch_check_state(ck, state);
483 static void _main_gl_sel(void *data, Evas_Object *obj, void *event_info)
485 Elm_Object_Item *item = (Elm_Object_Item*)event_info;
488 int id = (int)reinterpret_cast<long>(data);
489 Eina_Bool state = EINA_FALSE;
492 case SETTING_ITEM_ID_SELECT_INPUT_LANGUAGE: {
493 SCLOptionWindowType type = find_option_window_type(obj);
495 if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) {
496 create_option_language_view(option_elements[type].naviframe);
501 case SETTING_ITEM_ID_SMART_INPUT_TITLE: {
502 SCLOptionWindowType type = find_option_window_type(obj);
504 if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) {
505 create_smart_typing_view(option_elements[type].naviframe);
509 case SETTING_ITEM_ID_KEY_TAP_TITLE: {
510 SCLOptionWindowType type = find_option_window_type(obj);
512 if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) {
513 create_feedback_view(option_elements[type].naviframe);
518 case SETTING_ITEM_ID_AUTO_CAPITALISE: {
520 state = _update_check_button_state(item, obj);
521 check_autocapitalise_change_callback((void *)(intptr_t)(state), NULL, NULL);
525 case SETTING_ITEM_ID_AUTO_PUNCTUATE: {
527 state = _update_check_button_state(item, obj);
528 check_autopunctuate_change_callback((void *)(intptr_t)(state), NULL, NULL);
532 case SETTING_ITEM_ID_SOUND: {
534 state = _update_check_button_state(item, obj);
535 check_sound_change_callback((void *)(intptr_t)(state), NULL, NULL);
539 case SETTING_ITEM_ID_PREDICTION: {
541 state = _update_check_button_state(item, obj);
542 check_prediction_change_callback((void *)(intptr_t)(state), NULL, NULL);
546 case SETTING_ITEM_ID_VOICE_LANGUAGE: {
548 check_voice_language_callback((void *)(intptr_t)(state), NULL, NULL);
552 case SETTING_ITEM_ID_VIBRATION: {
554 state = _update_check_button_state(item, obj);
555 check_vibration_change_callback((void *)(intptr_t)(state), NULL, NULL);
559 case SETTING_ITEM_ID_CHARACTER_PRE: {
561 state = _update_check_button_state(item, obj);
562 check_character_pre_change_callback((void *)(intptr_t)(state), NULL, NULL);
566 case SETTING_ITEM_ID_RESET: {
567 LOGD("reset keyboard settings\n");
568 reset_settings_popup(data, obj, event_info);
571 case SETTING_ITEM_ID_CLEAR: {
572 LOGD("Clear personalized data\n");
573 clear_personalized_data_popup(data, obj, event_info);
582 elm_genlist_item_selected_set(item, EINA_FALSE);
586 static Eina_Bool _main_gl_state_get(void *data, Evas_Object *obj, const char *part)
591 static void _main_gl_del(void *data, Evas_Object *obj)
596 static void _main_gl_con(void *data, Evas_Object *obj, void *event_info)
598 Elm_Object_Item *item = (Elm_Object_Item*)event_info;
599 elm_genlist_item_subitems_clear(item);
602 static Evas_Object *_language_gl_content_get(void *data, Evas_Object *obj, const char *part)
604 Evas_Object *item = NULL;
605 ITEMDATA *item_data = (ITEMDATA*)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);
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);
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);
631 static void _language_gl_sel(void *data, Evas_Object *obj, void *event_info)
633 Elm_Object_Item *item = (Elm_Object_Item*)event_info;
634 ITEMDATA * item_data = (ITEMDATA*)elm_object_item_data_get(item);
636 elm_genlist_item_selected_set(item, EINA_FALSE);
638 // Update check button
639 Evas_Object *ck = get_check(item);
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);
649 static void check_autocapitalise_change_callback(void *data, Evas_Object *obj, void *event_info)
651 Eina_Bool state = EINA_FALSE;
654 state = tv_check_state_get(obj);
656 state = elm_check_state_get(obj);
659 state = (int)reinterpret_cast<long>(data);
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");
667 static void check_autopunctuate_change_callback(void *data, Evas_Object *obj, void *event_info)
669 Eina_Bool state = EINA_FALSE;
672 state = tv_check_state_get(obj);
674 state = elm_check_state_get(obj);
677 state = (int)reinterpret_cast<long>(data);
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");
685 static void check_sound_change_callback(void *data, Evas_Object *obj, void *event_info)
687 Eina_Bool state = EINA_FALSE;
690 state = tv_check_state_get(obj);
692 state = elm_check_state_get(obj);
695 state = (int)reinterpret_cast<long>(data);
697 g_config_values.sound_on = state;
698 write_ise_config_values();
701 static void check_prediction_change_callback(void *data, Evas_Object *obj, void *event_info)
703 Eina_Bool state = EINA_FALSE;
706 state = tv_check_state_get(obj);
708 state = elm_check_state_get(obj);
711 state = (int)reinterpret_cast<long>(data);
713 g_config_values.prediction_on = state;
714 write_ise_config_values();
717 static void check_voice_language_callback(void *data, Evas_Object *obj, void *event_info)
719 create_setting_window();
722 static void check_vibration_change_callback(void *data, Evas_Object *obj, void *event_info)
724 Eina_Bool state = EINA_FALSE;
726 state = elm_check_state_get(obj);
728 state = (int)reinterpret_cast<long>(data);
730 g_config_values.vibration_on = state;
731 write_ise_config_values();
734 static void check_character_pre_change_callback(void *data, Evas_Object *obj, void *event_info)
736 Eina_Bool state = EINA_FALSE;
738 state = elm_check_state_get(obj);
740 state = (int)reinterpret_cast<long>(data);
742 g_config_values.preview_on = state;
743 write_ise_config_values();
746 static Evas_Object *_create_check_button(Evas_Object *parent, sclboolean state)
748 Evas_Object *ck = NULL;
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);
758 ck = elm_label_add(parent);
759 char text[BUF_SIZE] = {0, };
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);
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);
769 evas_object_show(ck);
775 static Evas_Object *_main_radio_gl_content_get(void *data, Evas_Object *obj, const char *part)
777 Evas_Object *ck = NULL;
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);
787 evas_object_smart_callback_add(ck, "changed", check_autocapitalise_change_callback,
788 reinterpret_cast<void*>(item_data->mode));
791 case SETTING_ITEM_ID_AUTO_PUNCTUATE:
792 ck = _create_check_button(obj, g_config_values.auto_punctuate);
794 evas_object_smart_callback_add(ck, "changed", check_autopunctuate_change_callback,
795 reinterpret_cast<void*>(item_data->mode));
798 case SETTING_ITEM_ID_SOUND:
799 ck = _create_check_button(obj, g_config_values.sound_on);
801 evas_object_smart_callback_add(ck, "changed", check_sound_change_callback,
802 reinterpret_cast<void*>(item_data->mode));
805 case SETTING_ITEM_ID_PREDICTION:
806 ck = _create_check_button(obj, g_config_values.prediction_on);
808 evas_object_smart_callback_add(ck, "changed", check_prediction_change_callback,
809 reinterpret_cast<void*>(item_data->mode));
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));
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));
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));
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);
839 static void destroy_genlist_item_classes(SCLOptionWindowType type)
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;
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;
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;
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;
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;
865 static void create_genlist_item_classes(SCLOptionWindowType type)
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) {
871 option_elements[type].itc_main_item->item_style = "2text.1icon.1";
873 option_elements[type].itc_main_item->item_style = "cus_style";
875 option_elements[type].itc_main_item->item_style = "type1";
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;
883 option_elements[type].itc_multi_item = elm_genlist_item_class_new();
884 if (option_elements[type].itc_multi_item) {
886 option_elements[type].itc_multi_item->item_style = "2text.1icon.1";
888 option_elements[type].itc_multi_item->item_style = "cus_style";
890 option_elements[type].itc_multi_item->item_style = "multiline";
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;
898 option_elements[type].itc_1text_main_item = elm_genlist_item_class_new();
899 if (option_elements[type].itc_1text_main_item) {
901 option_elements[type].itc_1text_main_item->item_style = "1text.1icon.1";
903 option_elements[type].itc_1text_main_item->item_style = "cus_style";
905 option_elements[type].itc_1text_main_item->item_style = "type1";
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;
913 option_elements[type].itc_language_subitems = elm_genlist_item_class_new();
914 if (option_elements[type].itc_language_subitems) {
916 option_elements[type].itc_language_subitems->item_style = "1text.1icon.1";
918 option_elements[type].itc_language_subitems->item_style = "cus_style";
920 option_elements[type].itc_language_subitems->item_style = "type1";
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;
928 option_elements[type].itc_group_title = elm_genlist_item_class_new();
929 if (option_elements[type].itc_group_title) {
931 option_elements[type].itc_group_title->item_style = "groupindex";
933 option_elements[type].itc_group_title->item_style = "cus_style";
935 option_elements[type].itc_group_title->item_style = "group_index";
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;
945 static void language_selection_finished_cb(void *data, Evas_Object *obj, void *event_info)
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);
952 SCLOptionWindowType type = find_option_window_type(obj);
954 if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) {
955 elm_genlist_item_update(option_elements[type].languages_item);
959 evas_object_smart_callback_del(obj, "clicked", language_selection_finished_cb);
960 Evas_Object *naviframe = (Evas_Object *)data;
962 elm_naviframe_item_pop(naviframe);
963 read_options(naviframe);
968 static void _popup_timeout_cb(void *data, Evas_Object * obj, void *event_info)
971 SCLOptionWindowType type = find_option_window_type(obj);
973 evas_object_smart_callback_del(obj, "timeout", _popup_timeout_cb);
974 evas_object_del(obj);
976 if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) {
977 option_elements[type].lang_popup = NULL;
982 static Eina_Bool _pop_cb(void *data, Elm_Object_Item *it)
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);
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);
994 if (option_elements[type].circle_genlist) {
995 eext_rotary_object_event_activated_set(option_elements[type].circle_genlist, EINA_TRUE);
1003 static void close_option_window(SCLOptionWindowType type)
1005 destroy_genlist_item_classes(type);
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);
1014 if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) {
1015 option_elements[type].option_window = NULL;
1021 static void _naviframe_back_cb(void *data, Evas_Object *obj, void *event_info)
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);
1031 elm_naviframe_item_pop(obj);
1037 static void add_padding_area(Evas_Object *genlist)
1039 /* Add padding area in wearable circle profile */
1040 Elm_Genlist_Item_Class *ptc = elm_genlist_item_class_new();
1041 Elm_Object_Item *item;
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);
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)
1053 Elm_Object_Item *item = NULL;
1056 strncpy(main_itemdata[id].main_text, main_text, ITEM_DATA_STRING_LEN - 1);
1059 strncpy(main_itemdata[id].sub_text, sub_text, ITEM_DATA_STRING_LEN - 1);
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);
1066 elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
1068 main_itemdata[id].item = item;
1073 Evas_Object* create_option_main_view(Evas_Object *parent, Evas_Object *naviframe, SCLOptionWindowType type)
1075 Evas_Object *genlist = NULL;
1076 if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) {
1077 create_genlist_item_classes(type);
1079 genlist = create_genlist(naviframe);
1080 option_elements[type].genlist = genlist;
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);
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);
1093 option_elements[type].circle_genlist = circle_genlist;
1097 add_scrollable_title_area(genlist, OPTIONS, EINA_TRUE);
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);
1104 for (unsigned int loop = 0; loop < OPTION_MAX_LANGUAGES && loop < _language_manager.get_languages_num(); loop++)
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);
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);
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);
1122 option_elements[type].selected_language_item[loop] = NULL;
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);
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);
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);
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);
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);
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);
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);
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);
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);
1166 const char *more_setting_text = NULL;
1170 more_setting_text = MORE_SETTINGS;
1172 /* Other settings */
1173 more_setting_text = OTHER_SETTINGS;
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);
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);
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);
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);
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);
1193 evas_object_smart_callback_add(genlist, "contracted", _main_gl_con, genlist);
1196 add_padding_area(genlist);
1203 static Evas_Object* create_option_language_view(Evas_Object *naviframe)
1205 Evas_Object *genlist = create_genlist(naviframe);
1207 SCLOptionWindowType type = find_option_window_type(naviframe);
1209 if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) {
1210 option_elements[type].language_genlist = genlist;
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);
1221 add_scrollable_title_area(genlist, LANGUAGE, EINA_FALSE);
1224 for (unsigned int loop = 0; loop < OPTION_MAX_LANGUAGES && loop < _language_manager.get_languages_num(); loop++)
1226 LANGUAGE_INFO *info = _language_manager.get_language_info(loop);
1228 strncpy(language_itemdata[loop].main_text, info->display_name.c_str(), ITEM_DATA_STRING_LEN - 1);
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);
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));
1241 language_itemdata[loop].item = option_elements[type].language_item[loop];
1243 option_elements[type].language_item[loop] = NULL;
1248 add_padding_area(genlist);
1252 evas_object_show(genlist);
1254 naviframe_item_push(naviframe, LANGUAGE, genlist, _pop_cb, naviframe, language_selection_finished_cb, naviframe);
1260 static Evas_Object* create_smart_typing_view(Evas_Object *naviframe)
1262 Evas_Object *genlist = create_genlist(naviframe);
1263 SCLOptionWindowType type = find_option_window_type(naviframe);
1265 if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) {
1266 //option_elements[type].language_genlist = genlist;
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);
1276 add_scrollable_title_area(genlist, SMART_TYPING, EINA_FALSE);
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);
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);
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);
1289 add_padding_area(genlist);
1293 evas_object_show(genlist);
1295 naviframe_item_push(naviframe, SMART_TYPING, genlist, _pop_cb, naviframe, NULL, NULL);
1300 static Evas_Object* create_feedback_view(Evas_Object *naviframe)
1302 Evas_Object *genlist = create_genlist(naviframe);
1303 SCLOptionWindowType type = find_option_window_type(naviframe);
1305 if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) {
1306 //option_elements[type].language_genlist = genlist;
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);
1316 add_scrollable_title_area(genlist, KEY_FEEDBACK, EINA_FALSE);
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);
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);
1326 add_padding_area(genlist);
1330 evas_object_show(genlist);
1332 naviframe_item_push(naviframe, KEY_FEEDBACK, genlist, _pop_cb, naviframe, NULL, NULL);
1338 static void read_options(Evas_Object *naviframe)
1340 SCLOptionWindowType type = find_option_window_type(naviframe);
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++)
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;
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);
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);
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);
1364 elm_genlist_item_select_mode_set(option_elements[type].selected_language_item[loop], ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
1369 Elm_Object_Item *top_it = elm_naviframe_top_item_get(naviframe);
1371 Evas_Object *content = elm_object_item_content_get(top_it);
1373 Elm_Object_Item *item = elm_genlist_first_item_get(content);
1375 elm_genlist_item_update(item);
1376 item = elm_genlist_item_next_get(item);
1382 static void set_option_values()
1386 static void language_view_popup_show(Evas_Object *obj, SCLOptionWindowType type, const char *content_text, const char *btn_text)
1388 if (content_text == NULL)
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);
1395 elm_object_style_set(option_elements[type].lang_popup, "circle");
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);
1408 static void language_selected(void *data, Evas_Object *obj, void *event_info)
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;
1415 LANGUAGE_INFO *info = _language_manager.get_language_info(item_data->mode);
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;
1427 if (_language_manager.get_enabled_languages_num() > MAX_SELECTED_LANGUAGES) {
1428 info->enabled = FALSE;
1429 elm_check_state_set(obj, EINA_FALSE);
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;
1439 if (language_changed) {
1440 // Update enabled_languages
1441 sclboolean selected_language_found = FALSE;
1442 std::vector<std::string> enabled_languages;
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);
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;
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);
1465 write_ise_config_values();
1472 static void navi_back_cb(void *data, Evas_Object *obj, void *event_info)
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);
1481 option_window_created(Evas_Object *window, SCLOptionWindowType type)
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;
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();
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;
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;
1510 /* These variable should be read from stored setting values */
1511 language.enabled = FALSE;
1512 language.selected_input_mode = input_mode_QTY.name;
1514 _language_manager.add_language(language);
1518 read_ise_config_values();
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);
1523 set_option_values();
1524 option_elements[type].option_window = window;
1526 elm_win_indicator_mode_set(window, ELM_WIN_INDICATOR_SHOW);
1527 elm_win_indicator_opacity_set(window, ELM_WIN_INDICATOR_OPAQUE);
1529 elm_win_indicator_mode_set(window, ELM_WIN_INDICATOR_HIDE);
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);
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);
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);
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");
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);
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);
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);
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);
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);
1592 option_elements[type].conformant = conformant;
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);
1603 Evas_Object *naviframe = elm_naviframe_add(conformant);
1604 option_elements[type].naviframe = naviframe;
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);
1612 option_elements[type].back_button = naviframe_item_push(naviframe, OPTIONS, mlayout, NULL, NULL, navi_back_cb, NULL, EINA_FALSE);
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);
1619 evas_object_show(naviframe);
1620 evas_object_show(window);
1624 option_window_destroyed(Evas_Object *window)
1626 SCLOptionWindowType type = find_option_window_type(window);
1628 if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) {
1629 if (option_elements[type].option_window == window) {
1631 if (option_elements[type].circle_surface) {
1632 eext_circle_surface_del(option_elements[type].circle_surface);
1633 option_elements[type].circle_surface = NULL;
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;
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;
1652 option_elements[type].languages_item = NULL;
1658 option_window_is_available(SCLOptionWindowType type)
1660 LOGD("OptionWindowType = %d \n", type);
1661 if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) {
1662 if (option_elements[type].option_window != NULL) {
1670 app_create(void *data)
1674 bindtextdomain(PACKAGE, LOCALEDIR);
1675 textdomain(PACKAGE);
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 */
1685 app_control(app_control_h app_control, void *data)
1687 /* Handle the launch request. */
1688 Evas_Object *window = elm_win_util_standard_add("Option window", "Option window");
1689 if (!window) return;
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);
1695 option_window_created(window, OPTION_WINDOW_TYPE_SETTING_APPLICATION);
1699 app_pause(void *data)
1702 /* Take necessary actions when application becomes invisible. */
1706 app_resume(void *data)
1712 app_terminate(void *data)
1718 main(int argc, char *argv[])
1722 ui_app_lifecycle_callback_s event_callback = {0, };
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;
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);