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"
66 enum SETTING_ITEM_ID {
67 SETTING_ITEM_ID_INPUT_LANGUAGE_TITLE,
68 SETTING_ITEM_ID_CUR_LANGUAGE,
69 SETTING_ITEM_ID_SELECT_INPUT_LANGUAGE,
70 SETTING_ITEM_ID_SMART_INPUT_TITLE,
71 SETTING_ITEM_ID_AUTO_CAPITALISE,
72 SETTING_ITEM_ID_AUTO_PUNCTUATE,
73 SETTING_ITEM_ID_KEY_TAP_TITLE,
74 SETTING_ITEM_ID_SOUND,
75 SETTING_ITEM_ID_VIBRATION,
76 SETTING_ITEM_ID_CHARACTER_PRE,
77 SETTING_ITEM_ID_MORE_SETTINGS_TITLE,
78 SETTING_ITEM_ID_RESET,
79 SETTING_ITEM_ID_CLEAR,
80 SETTING_ITEM_ID_PREDICTION,
81 SETTING_ITEM_ID_VOICE_LANGUAGE,
86 enum LANGUAGE_VIEW_MODE {
87 LANGUAGE_VIEW_MODE_LANGUAGE,
88 LANGUAGE_VIEW_MODE_INPUT_MODE,
91 static ITEMDATA main_itemdata[SETTING_ITEM_ID_MAX];
92 static ITEMDATA language_itemdata[OPTION_MAX_LANGUAGES];
94 struct OPTION_ELEMENTS
100 circle_genlist = NULL;
101 language_genlist = NULL;
106 option_layout = NULL;
111 itc_main_item = NULL;
112 itc_multi_item = NULL;
113 itc_1text_main_item = NULL;
115 itc_language_subitems = NULL;
117 languages_item = NULL;
119 memset(language_item, 0x00, sizeof(language_item));
120 memset(selected_language_item, 0x00, sizeof(selected_language_item));
122 itc_group_title = NULL;
124 circle_surface = NULL;
128 Elm_Theme * list_theme;
130 Evas_Object *option_window;
131 Evas_Object *naviframe;
132 Evas_Object *genlist;
133 Evas_Object *circle_genlist;
134 Evas_Object *language_genlist;
135 Evas_Object *lang_popup;
136 Evas_Object *back_button;
137 Evas_Object *conformant;
138 Evas_Object *option_bg;
139 Evas_Object *option_layout;
141 Elm_Genlist_Item_Class *itc_main_item;
142 Elm_Genlist_Item_Class *itc_multi_item;
143 Elm_Genlist_Item_Class *itc_1text_main_item;
145 Elm_Genlist_Item_Class *itc_language_subitems;
147 Elm_Object_Item *languages_item;
149 Elm_Object_Item *language_item[OPTION_MAX_LANGUAGES];
150 Elm_Object_Item *selected_language_item[OPTION_MAX_LANGUAGES];
152 Elm_Genlist_Item_Class *itc_group_title;
155 Eext_Circle_Surface *circle_surface;
159 static LAUNCH_MODE g_launch_mode = LAUNCH_MODE_OTHER;
160 static OPTION_ELEMENTS option_elements[OPTION_WINDOW_TYPE_MAX];
161 extern CONFIG_VALUES g_config_values;
163 static Evas_Object* create_option_language_view(Evas_Object *naviframe);
164 static Evas_Object *_create_check_button(Evas_Object *parent, sclboolean state);
165 static void read_options(Evas_Object *naviframe);
168 static Evas_Object* create_smart_typing_view(Evas_Object *naviframe);
169 static Evas_Object* create_feedback_view(Evas_Object *naviframe);
172 /* This function is called by setup_module.cpp : create_ise_setup_eo() also */
173 Evas_Object* create_option_main_view(Evas_Object *parent, Evas_Object *naviframe, SCLOptionWindowType type);
175 static void language_selected(void *data, Evas_Object *obj, void *event_info);
177 static void navi_back_cb(void *data, Evas_Object *obj, void *event_info);
179 static void check_autocapitalise_change_callback(void *data, Evas_Object *obj, void *event_info);
180 static void check_autopunctuate_change_callback(void *data, Evas_Object *obj, void *event_info);
181 static void check_sound_change_callback(void *data, Evas_Object *obj, void *event_info);
182 static void check_prediction_change_callback(void *data, Evas_Object *obj, void *event_info);
183 static void check_voice_language_callback(void *data, Evas_Object *obj, void *event_info);
184 static void check_vibration_change_callback(void *data, Evas_Object *obj, void *event_info);
185 static void check_character_pre_change_callback(void *data, Evas_Object *obj, void *event_info);
188 static char* _accessible_body_name_cb(void *data, Evas_Object *obj);
189 static void _screen_reader_information_set(Evas_Object *obj);
192 std::vector<ILanguageOption*> LanguageOptionManager::language_option_vector;
193 void LanguageOptionManager::add_language_option(ILanguageOption *language_option) {
194 language_option_vector.push_back(language_option);
196 scluint LanguageOptionManager::get_language_options_num() {
197 return language_option_vector.size();
199 ILanguageOption* LanguageOptionManager::get_language_option_info(scluint index) {
200 return ((index < language_option_vector.size()) ? language_option_vector.at(index) : NULL);
203 SCLOptionWindowType find_option_window_type(Evas_Object *obj)
205 for (int loop = 0;loop < OPTION_WINDOW_TYPE_MAX;loop++) {
206 if (option_elements[loop].option_window == obj ||
207 option_elements[loop].naviframe == obj ||
208 option_elements[loop].genlist == obj ||
209 option_elements[loop].language_genlist == obj ||
210 option_elements[loop].lang_popup == obj ||
211 option_elements[loop].back_button == obj) {
212 return static_cast<SCLOptionWindowType>(loop);
215 LOGD("OPTION_WINDOW_TYPE_MAX=%d\n", OPTION_WINDOW_TYPE_MAX);
216 return OPTION_WINDOW_TYPE_MAX;
219 static void reset_settings_popup_response_ok_cb(void *data, Evas_Object *obj, void *event_info)
221 reset_ise_config_values();
222 _language_manager.set_enabled_languages(g_config_values.enabled_languages);
224 Evas_Object *genlist = static_cast<Evas_Object*>(evas_object_data_get(obj, "parent_object"));
225 SCLOptionWindowType type = find_option_window_type(genlist);
227 if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) {
228 read_options(option_elements[type].naviframe);
231 vconf_set_bool(VCONFKEY_AUTOCAPITAL_ALLOW_BOOL, g_config_values.auto_capitalise);
232 vconf_set_bool(VCONFKEY_AUTOPERIOD_ALLOW_BOOL, g_config_values.auto_punctuate);
236 Evas_Object *popup = (Evas_Object *)data;
238 evas_object_del(popup);
241 static void popup_response_cancel_cb(void *data, Evas_Object *obj, void *event_info)
243 Evas_Object *popup = (Evas_Object *)data;
245 evas_object_del(popup);
248 static void clear_data_popup_response_ok_cb(void *data, Evas_Object *obj, void *event_info)
250 clear_ise_data_values();
251 Evas_Object *popup = (Evas_Object *)data;
253 evas_object_del(popup);
256 static Evas_Object *create_popup_button(Evas_Object *parent, const char *style, const char *icon_path, const char *string)
258 Evas_Object *btn = elm_button_add(parent);
260 elm_object_style_set(btn, style);
263 Evas_Object *icon = elm_image_add(btn);
264 elm_image_file_set(icon, icon_path, NULL);
265 evas_object_size_hint_weight_set(icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
266 elm_object_part_content_set(btn, "elm.swallow.content", icon);
267 evas_object_show(icon);
269 elm_atspi_accessible_name_set(btn, string);
270 elm_atspi_accessible_translation_domain_set(btn, PACKAGE);
272 elm_object_style_set(btn, "popup");
273 elm_object_domain_translatable_text_set(btn, PACKAGE, string);
281 _accessible_body_name_cb(void *data, Evas_Object *obj)
283 Evas_Object *layout = (Evas_Object *)data;
284 const char *text = elm_object_part_text_get(layout, "elm.text");
285 return text ? strdup(text) : NULL;
289 _screen_reader_information_set(Evas_Object *obj)
291 Evas_Object *to, *ao;
292 to = (Evas_Object *)edje_object_part_object_get(elm_layout_edje_get(obj), "elm.text");
294 ao = elm_access_object_register(to, obj);
295 elm_atspi_accessible_name_cb_set(ao, _accessible_body_name_cb, obj);
296 elm_atspi_accessible_reading_info_type_set(ao, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME);
301 static Evas_Object *show_popup(Evas_Object *parent, const char *message, const char *cancel_text, Evas_Smart_Cb cancel_cb, const char *ok_text, Evas_Smart_Cb ok_cb)
303 const char *icon_path = NULL;
305 Evas_Object *popup = elm_popup_add(elm_object_top_widget_get(parent));
306 elm_popup_align_set(popup, ELM_NOTIFY_ALIGN_FILL, 1.0);
308 elm_popup_orient_set(popup, ELM_POPUP_ORIENT_CENTER);
310 eext_object_event_callback_add(popup, EEXT_CALLBACK_BACK, eext_popup_back_cb, NULL);
311 evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
314 elm_object_style_set(popup, "circle");
316 Evas_Object *layout = elm_layout_add(popup);
317 elm_layout_theme_set(layout, "layout", "popup", "content/circle/buttons2");
318 elm_object_domain_translatable_part_text_set(layout, "elm.text", PACKAGE, message);
319 elm_object_content_set(popup, layout);
322 _screen_reader_information_set(layout);
324 elm_object_domain_translatable_text_set(popup, PACKAGE, message);
325 elm_object_domain_translatable_part_text_set(popup, "title,text", PACKAGE, RESET_SETTINGS_POPUP_TITLE_TEXT);
330 icon_path = ICON_DIR"/tw_ic_popup_btn_delete.png";
332 Evas_Object *btn_cancel = create_popup_button(popup, "popup/circle/left", icon_path, cancel_text);
333 elm_object_part_content_set(popup, "button1", btn_cancel);
334 evas_object_smart_callback_add(btn_cancel, "clicked", cancel_cb, popup);
336 elm_object_focus_set(btn_cancel, EINA_TRUE);
341 icon_path = ICON_DIR"/tw_ic_popup_btn_check.png";
343 Evas_Object *btn_ok = create_popup_button(popup, "popup/circle/right", icon_path, ok_text);
344 evas_object_data_set(btn_ok, "parent_object", parent);
345 elm_object_part_content_set(popup, "button2", btn_ok);
346 evas_object_smart_callback_add(btn_ok, "clicked", ok_cb, popup);
347 evas_object_show(popup);
352 static void reset_settings_popup(void *data, Evas_Object *obj, void *event_info)
354 show_popup(obj, RESET_SETTINGS_POPUP_TEXT, POPUP_CANCEL_BTN, popup_response_cancel_cb, POPUP_OK_BTN, reset_settings_popup_response_ok_cb);
357 static void clear_personalized_data_popup(void *data, Evas_Object *obj, void *event_info)
359 show_popup(obj, CLEAR_PERSONLIZED_DATA_POPUP_TEXT, POPUP_CANCEL_BTN, popup_response_cancel_cb, POPUP_OK_BTN, clear_data_popup_response_ok_cb);
362 static char *_main_gl_text_get(void *data, Evas_Object *obj, const char *part)
364 ITEMDATA *item_data = (ITEMDATA*)data;
366 if (!strcmp(part, "elm.text.main.left.top") ||
367 !strcmp(part, "elm.text.main.left") ||
368 !strcmp(part, "elm.text.main") ||
369 !strcmp(part, "elm.text")) {
370 if (strlen(item_data->main_text)) {
371 return strdup(item_data->main_text);
374 if (!strcmp(part, "elm.text.sub.left.bottom") ||
375 !strcmp(part, "elm.text.multiline") ||
376 !strcmp(part, "elm.text.sub") ||
377 !strcmp(part, "elm.text.1") ||
378 !strcmp(part, "elm.text.2")) {
379 if (strlen(item_data->sub_text) > 0) {
380 return strdup(item_data->sub_text);
389 static Eina_Bool tv_check_state_get(Evas_Object *label)
391 LOGD("tv_check_state_get in");
393 state = (long)evas_object_data_get(label, CHECK_STATE);
394 return (state == 1)? EINA_TRUE:EINA_FALSE;
397 static void tv_switch_check_state(Evas_Object *label, Eina_Bool state)
399 LOGD("tv_switch_check_state, state = [%d]", state);
401 char text[BUF_SIZE] = {0, };
403 snprintf(text, sizeof(text), "<font_size=28 color=#0081C6FF><align=center>%s</left></font>", SWITCH_ON);
404 elm_object_text_set(label, text);
405 evas_object_data_set(label, CHECK_STATE, (void*)1);
407 snprintf(text, sizeof(text), "<font_size=28 color=#000000CC><align=center>%s</left></font>", SWITCH_OFF);
408 elm_object_text_set(label, text);
409 evas_object_data_set(label, CHECK_STATE, (void*)0);
413 static void _gl_pressed_cb(void *data, Evas_Object *obj, void *event_info)
415 LOGD("_gl_pressed_cb in!");
417 LOGE("event_info is NULL!");
421 Elm_Object_Item *item = (Elm_Object_Item *)event_info;
422 Evas_Object *label = elm_object_item_part_content_get(item, "elm.swallow.end");
424 LOGD("item no label, not need to update!");
427 Eina_Bool state = tv_check_state_get(label);
428 char text[BUF_SIZE] = {0, };
429 snprintf(text, sizeof(text), "<font_size=28 color=#FFFFFFFF><align=center>%s</left></font>", state? SWITCH_ON : SWITCH_OFF);
430 elm_object_text_set(label, text);
434 static void _gl_relesed_cb(void *data, Evas_Object *obj, void *event_info)
436 LOGD("_gl_relesed_cb in!");
438 LOGE("event_info is NULL!");
442 Elm_Object_Item *item = (Elm_Object_Item *)event_info;
443 Evas_Object *label = elm_object_item_part_content_get(item, "elm.swallow.end");
445 LOGD("item no label, not need to update!");
448 Eina_Bool state = tv_check_state_get(label);
449 char text[BUF_SIZE] = {0, };
451 snprintf(text, sizeof(text), "<font_size=28 color=#0081C6FF><align=center>%s</left></font>", SWITCH_ON);
452 elm_object_text_set(label, text);
454 snprintf(text, sizeof(text), "<font_size=28 color=#000000CC><align=center>%s</left></font>", SWITCH_OFF);
455 elm_object_text_set(label, text);
461 static Evas_Object *get_check(Elm_Object_Item *item)
464 ck = elm_object_item_part_content_get(item, "elm.swallow.end");
466 ck = elm_object_item_part_content_get(item, "elm.icon");
471 static Eina_Bool _update_check_button_state(Elm_Object_Item *item, Evas_Object *obj)
473 Eina_Bool state = EINA_FALSE;
475 elm_genlist_item_selected_set(item, EINA_FALSE);
476 /* Update check button */
477 Evas_Object *ck = get_check(item);
478 evas_object_data_set(ck, "parent_object", obj);
479 state = !elm_check_state_get(ck);
481 elm_check_state_set(ck, state);
483 tv_switch_check_state(ck, state);
489 static void _main_gl_sel(void *data, Evas_Object *obj, void *event_info)
491 Elm_Object_Item *item = (Elm_Object_Item*)event_info;
494 int id = (int)reinterpret_cast<long>(data);
495 Eina_Bool state = EINA_FALSE;
498 case SETTING_ITEM_ID_SELECT_INPUT_LANGUAGE: {
499 SCLOptionWindowType type = find_option_window_type(obj);
501 if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) {
502 create_option_language_view(option_elements[type].naviframe);
507 case SETTING_ITEM_ID_SMART_INPUT_TITLE: {
508 SCLOptionWindowType type = find_option_window_type(obj);
510 if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) {
511 create_smart_typing_view(option_elements[type].naviframe);
515 case SETTING_ITEM_ID_KEY_TAP_TITLE: {
516 SCLOptionWindowType type = find_option_window_type(obj);
518 if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) {
519 create_feedback_view(option_elements[type].naviframe);
524 case SETTING_ITEM_ID_AUTO_CAPITALISE: {
526 state = _update_check_button_state(item, obj);
527 check_autocapitalise_change_callback((void *)(intptr_t)(state), NULL, NULL);
531 case SETTING_ITEM_ID_AUTO_PUNCTUATE: {
533 state = _update_check_button_state(item, obj);
534 check_autopunctuate_change_callback((void *)(intptr_t)(state), NULL, NULL);
538 case SETTING_ITEM_ID_SOUND: {
540 state = _update_check_button_state(item, obj);
541 check_sound_change_callback((void *)(intptr_t)(state), NULL, NULL);
545 case SETTING_ITEM_ID_PREDICTION: {
547 state = _update_check_button_state(item, obj);
548 check_prediction_change_callback((void *)(intptr_t)(state), NULL, NULL);
552 case SETTING_ITEM_ID_VOICE_LANGUAGE: {
554 check_voice_language_callback((void *)(intptr_t)(state), NULL, NULL);
558 case SETTING_ITEM_ID_VIBRATION: {
560 state = _update_check_button_state(item, obj);
561 check_vibration_change_callback((void *)(intptr_t)(state), NULL, NULL);
565 case SETTING_ITEM_ID_CHARACTER_PRE: {
567 state = _update_check_button_state(item, obj);
568 check_character_pre_change_callback((void *)(intptr_t)(state), NULL, NULL);
572 case SETTING_ITEM_ID_RESET: {
573 LOGD("reset keyboard settings\n");
574 reset_settings_popup(data, obj, event_info);
577 case SETTING_ITEM_ID_CLEAR: {
578 LOGD("Clear personalized data\n");
579 clear_personalized_data_popup(data, obj, event_info);
588 elm_genlist_item_selected_set(item, EINA_FALSE);
592 static Eina_Bool _main_gl_state_get(void *data, Evas_Object *obj, const char *part)
597 static void _main_gl_del(void *data, Evas_Object *obj)
602 static void _main_gl_con(void *data, Evas_Object *obj, void *event_info)
604 Elm_Object_Item *item = (Elm_Object_Item*)event_info;
605 elm_genlist_item_subitems_clear(item);
608 static Evas_Object *_language_gl_content_get(void *data, Evas_Object *obj, const char *part)
610 Evas_Object *item = NULL;
611 ITEMDATA *item_data = (ITEMDATA*)data;
614 if (!strcmp(part, "elm.icon.right") ||
615 !strcmp(part, "elm.icon") ||
616 !strcmp(part, "elm.swallow.end")) {
617 if (item_data->mode >= 0 && item_data->mode < OPTION_MAX_LANGUAGES) {
618 LANGUAGE_INFO *info = _language_manager.get_language_info(item_data->mode);
620 Evas_Object *ck = _create_check_button(obj, info->enabled);
621 evas_object_data_set(ck, "parent_object", obj);
622 evas_object_smart_callback_add(ck, "changed", language_selected, data);
623 evas_object_show(ck);
626 elm_atspi_accessible_relationship_append(ck, ELM_ATSPI_RELATION_CONTROLLED_BY, item_data->item);
627 elm_atspi_accessible_relationship_append(item_data->item, ELM_ATSPI_RELATION_CONTROLLER_FOR, ck);
628 elm_atspi_accessible_relationship_append(item_data->item, ELM_ATSPI_RELATION_DESCRIBED_BY, ck);
637 static void _language_gl_sel(void *data, Evas_Object *obj, void *event_info)
639 Elm_Object_Item *item = (Elm_Object_Item*)event_info;
640 ITEMDATA * item_data = (ITEMDATA*)elm_object_item_data_get(item);
642 elm_genlist_item_selected_set(item, EINA_FALSE);
644 // Update check button
645 Evas_Object *ck = get_check(item);
647 evas_object_data_set(ck, "parent_object", obj);
648 Eina_Bool state = elm_check_state_get(ck);
649 elm_check_state_set(ck, !state);
650 language_selected(item_data, ck, NULL);
655 static void check_autocapitalise_change_callback(void *data, Evas_Object *obj, void *event_info)
657 Eina_Bool state = EINA_FALSE;
660 state = tv_check_state_get(obj);
662 state = elm_check_state_get(obj);
665 state = (int)reinterpret_cast<long>(data);
667 g_config_values.auto_capitalise = state;
668 write_ise_config_values();
669 if (vconf_set_bool(VCONFKEY_AUTOCAPITAL_ALLOW_BOOL, state) == -1)
670 LOGE("Failed to set vconf autocapital\n");
673 static void check_autopunctuate_change_callback(void *data, Evas_Object *obj, void *event_info)
675 Eina_Bool state = EINA_FALSE;
678 state = tv_check_state_get(obj);
680 state = elm_check_state_get(obj);
683 state = (int)reinterpret_cast<long>(data);
685 g_config_values.auto_punctuate = state;
686 write_ise_config_values();
687 if (vconf_set_bool(VCONFKEY_AUTOPERIOD_ALLOW_BOOL, state) == -1)
688 LOGE("Failed to set vconf autoperiod\n");
691 static void check_sound_change_callback(void *data, Evas_Object *obj, void *event_info)
693 Eina_Bool state = EINA_FALSE;
696 state = tv_check_state_get(obj);
698 state = elm_check_state_get(obj);
701 state = (int)reinterpret_cast<long>(data);
703 g_config_values.sound_on = state;
704 write_ise_config_values();
707 static void check_prediction_change_callback(void *data, Evas_Object *obj, void *event_info)
709 Eina_Bool state = EINA_FALSE;
712 state = tv_check_state_get(obj);
714 state = elm_check_state_get(obj);
717 state = (int)reinterpret_cast<long>(data);
719 g_config_values.prediction_on = state;
720 write_ise_config_values();
723 static void check_voice_language_callback(void *data, Evas_Object *obj, void *event_info)
725 create_setting_window();
728 static void check_vibration_change_callback(void *data, Evas_Object *obj, void *event_info)
730 Eina_Bool state = EINA_FALSE;
732 state = elm_check_state_get(obj);
734 state = (int)reinterpret_cast<long>(data);
736 g_config_values.vibration_on = state;
737 write_ise_config_values();
740 static void check_character_pre_change_callback(void *data, Evas_Object *obj, void *event_info)
742 Eina_Bool state = EINA_FALSE;
744 state = elm_check_state_get(obj);
746 state = (int)reinterpret_cast<long>(data);
748 g_config_values.preview_on = state;
749 write_ise_config_values();
752 static Evas_Object *_create_check_button(Evas_Object *parent, sclboolean state)
754 Evas_Object *ck = NULL;
757 ck = elm_check_add(parent);
758 elm_object_style_set(ck, "on&off");
759 elm_check_state_set(ck, state);
760 elm_object_focus_allow_set(ck, EINA_FALSE);
761 evas_object_propagate_events_set(ck, EINA_FALSE);
762 evas_object_show(ck);
764 ck = elm_label_add(parent);
765 char text[BUF_SIZE] = {0, };
767 snprintf(text, sizeof(text), "<font_size=28 color=#0081C6FF><align=center>%s</left></font>", SWITCH_ON);
768 elm_object_text_set(ck, text);
769 evas_object_data_set(ck, CHECK_STATE, (void*)1);
771 snprintf(text, sizeof(text), "<font_size=28 color=#000000CC><align=center>%s</left></font>", SWITCH_OFF);
772 elm_object_text_set(ck, text);
773 evas_object_data_set(ck, CHECK_STATE, (void*)0);
775 evas_object_show(ck);
781 static Evas_Object *_main_radio_gl_content_get(void *data, Evas_Object *obj, const char *part)
783 Evas_Object *ck = NULL;
785 ITEMDATA *item_data = (ITEMDATA *)data;
786 if (!strcmp(part, "elm.swallow.end") ||
787 !strcmp(part, "elm.icon.right") ||
788 !strcmp(part, "elm.icon")) {
789 switch (item_data->mode) {
790 case SETTING_ITEM_ID_AUTO_CAPITALISE:
791 ck = _create_check_button(obj, g_config_values.auto_capitalise);
793 evas_object_smart_callback_add(ck, "changed", check_autocapitalise_change_callback,
794 reinterpret_cast<void*>(item_data->mode));
797 case SETTING_ITEM_ID_AUTO_PUNCTUATE:
798 ck = _create_check_button(obj, g_config_values.auto_punctuate);
800 evas_object_smart_callback_add(ck, "changed", check_autopunctuate_change_callback,
801 reinterpret_cast<void*>(item_data->mode));
804 case SETTING_ITEM_ID_SOUND:
805 ck = _create_check_button(obj, g_config_values.sound_on);
807 evas_object_smart_callback_add(ck, "changed", check_sound_change_callback,
808 reinterpret_cast<void*>(item_data->mode));
811 case SETTING_ITEM_ID_PREDICTION:
812 ck = _create_check_button(obj, g_config_values.prediction_on);
814 evas_object_smart_callback_add(ck, "changed", check_prediction_change_callback,
815 reinterpret_cast<void*>(item_data->mode));
818 case SETTING_ITEM_ID_VOICE_LANGUAGE:
819 evas_object_smart_callback_add(ck, "changed", check_voice_language_callback,
820 reinterpret_cast<void*>(item_data->mode));
822 case SETTING_ITEM_ID_VIBRATION:
823 ck = _create_check_button(obj, g_config_values.vibration_on);
824 evas_object_smart_callback_add(ck, "changed", check_vibration_change_callback,
825 reinterpret_cast<void*>(item_data->mode));
827 case SETTING_ITEM_ID_CHARACTER_PRE:
828 ck = _create_check_button(obj, g_config_values.preview_on);
829 evas_object_smart_callback_add(ck, "changed", check_character_pre_change_callback,
830 reinterpret_cast<void*>(item_data->mode));
835 elm_atspi_accessible_relationship_append(ck, ELM_ATSPI_RELATION_CONTROLLED_BY, item_data->item);
836 elm_atspi_accessible_relationship_append(item_data->item, ELM_ATSPI_RELATION_CONTROLLER_FOR, ck);
837 elm_atspi_accessible_relationship_append(item_data->item, ELM_ATSPI_RELATION_DESCRIBED_BY, ck);
845 static void destroy_genlist_item_classes(SCLOptionWindowType type)
847 if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) {
848 if (option_elements[type].itc_main_item) {
849 elm_genlist_item_class_free(option_elements[type].itc_main_item);
850 option_elements[type].itc_main_item = NULL;
852 if (option_elements[type].itc_multi_item) {
853 elm_genlist_item_class_free(option_elements[type].itc_multi_item);
854 option_elements[type].itc_multi_item = NULL;
856 if (option_elements[type].itc_1text_main_item) {
857 elm_genlist_item_class_free(option_elements[type].itc_1text_main_item);
858 option_elements[type].itc_1text_main_item = NULL;
860 if (option_elements[type].itc_language_subitems) {
861 elm_genlist_item_class_free(option_elements[type].itc_language_subitems);
862 option_elements[type].itc_language_subitems = NULL;
864 if (option_elements[type].itc_group_title) {
865 elm_genlist_item_class_free(option_elements[type].itc_group_title);
866 option_elements[type].itc_group_title = NULL;
871 static void create_genlist_item_classes(SCLOptionWindowType type)
873 if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) {
874 option_elements[type].itc_main_item = elm_genlist_item_class_new();
875 if (option_elements[type].itc_main_item) {
877 option_elements[type].itc_main_item->item_style = "2text.1icon.1";
879 option_elements[type].itc_main_item->item_style = "cus_style";
881 option_elements[type].itc_main_item->item_style = "type1";
883 option_elements[type].itc_main_item->func.text_get = _main_gl_text_get;
884 option_elements[type].itc_main_item->func.content_get = _main_radio_gl_content_get;
885 option_elements[type].itc_main_item->func.state_get = _main_gl_state_get;
886 option_elements[type].itc_main_item->func.del = _main_gl_del;
889 option_elements[type].itc_multi_item = elm_genlist_item_class_new();
890 if (option_elements[type].itc_multi_item) {
892 option_elements[type].itc_multi_item->item_style = "2text.1icon.1";
894 option_elements[type].itc_multi_item->item_style = "cus_style";
896 option_elements[type].itc_multi_item->item_style = "multiline";
898 option_elements[type].itc_multi_item->func.text_get = _main_gl_text_get;
899 option_elements[type].itc_multi_item->func.content_get = _main_radio_gl_content_get;
900 option_elements[type].itc_multi_item->func.state_get = _main_gl_state_get;
901 option_elements[type].itc_multi_item->func.del = _main_gl_del;
904 option_elements[type].itc_1text_main_item = elm_genlist_item_class_new();
905 if (option_elements[type].itc_1text_main_item) {
907 option_elements[type].itc_1text_main_item->item_style = "1text.1icon.1";
909 option_elements[type].itc_1text_main_item->item_style = "cus_style";
911 option_elements[type].itc_1text_main_item->item_style = "type1";
913 option_elements[type].itc_1text_main_item->func.text_get = _main_gl_text_get;
914 option_elements[type].itc_1text_main_item->func.content_get = _main_radio_gl_content_get;
915 option_elements[type].itc_1text_main_item->func.state_get = _main_gl_state_get;
916 option_elements[type].itc_1text_main_item->func.del = _main_gl_del;
919 option_elements[type].itc_language_subitems = elm_genlist_item_class_new();
920 if (option_elements[type].itc_language_subitems) {
922 option_elements[type].itc_language_subitems->item_style = "1text.1icon.1";
924 option_elements[type].itc_language_subitems->item_style = "cus_style";
926 option_elements[type].itc_language_subitems->item_style = "type1";
928 option_elements[type].itc_language_subitems->func.text_get = _main_gl_text_get;
929 option_elements[type].itc_language_subitems->func.content_get = _language_gl_content_get;
930 option_elements[type].itc_language_subitems->func.state_get = _main_gl_state_get;
931 option_elements[type].itc_language_subitems->func.del = _main_gl_del;
934 option_elements[type].itc_group_title = elm_genlist_item_class_new();
935 if (option_elements[type].itc_group_title) {
937 option_elements[type].itc_group_title->item_style = "groupindex";
939 option_elements[type].itc_group_title->item_style = "cus_style";
941 option_elements[type].itc_group_title->item_style = "group_index";
943 option_elements[type].itc_group_title->func.text_get = _main_gl_text_get;
944 option_elements[type].itc_group_title->func.content_get = NULL;
945 option_elements[type].itc_group_title->func.state_get = _main_gl_state_get;
946 option_elements[type].itc_group_title->func.del = _main_gl_del;
951 static void language_selection_finished_cb(void *data, Evas_Object *obj, void *event_info)
953 if (_language_manager.get_enabled_languages_num() == 0) {
954 read_ise_config_values();
955 _language_manager.set_enabled_languages(g_config_values.enabled_languages);
958 SCLOptionWindowType type = find_option_window_type(obj);
960 if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) {
961 elm_genlist_item_update(option_elements[type].languages_item);
965 evas_object_smart_callback_del(obj, "clicked", language_selection_finished_cb);
966 Evas_Object *naviframe = (Evas_Object *)data;
968 elm_naviframe_item_pop(naviframe);
969 read_options(naviframe);
974 static void _popup_timeout_cb(void *data, Evas_Object * obj, void *event_info)
977 SCLOptionWindowType type = find_option_window_type(obj);
979 evas_object_smart_callback_del(obj, "timeout", _popup_timeout_cb);
980 evas_object_del(obj);
982 if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) {
983 option_elements[type].lang_popup = NULL;
988 static Eina_Bool _pop_cb(void *data, Elm_Object_Item *it)
990 Evas_Object *naviframe = static_cast<Evas_Object*>(data);
991 SCLOptionWindowType type = find_option_window_type(naviframe);
992 language_selection_finished_cb(NULL, NULL, NULL);
994 if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) {
995 if (option_elements[type].lang_popup) {
996 _popup_timeout_cb(NULL, option_elements[type].lang_popup, NULL);
1000 if (option_elements[type].circle_genlist) {
1001 eext_rotary_object_event_activated_set(option_elements[type].circle_genlist, EINA_TRUE);
1009 static void close_option_window(SCLOptionWindowType type)
1011 destroy_genlist_item_classes(type);
1013 if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) {
1014 if (option_elements[type].list_theme) {
1015 elm_theme_extension_del(option_elements[type].list_theme, EDJ_FILE);
1016 elm_theme_free(option_elements[type].list_theme);
1020 if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) {
1021 option_elements[type].option_window = NULL;
1027 static void _naviframe_back_cb(void *data, Evas_Object *obj, void *event_info)
1029 SCLOptionWindowType type = find_option_window_type(obj);
1030 Elm_Object_Item *top_it = elm_naviframe_top_item_get(obj);
1031 Elm_Object_Item *bottom_it = elm_naviframe_bottom_item_get(obj);
1032 if (top_it && bottom_it &&
1033 (elm_object_item_content_get(top_it) == elm_object_item_content_get(bottom_it))) {
1034 if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX))
1035 close_option_window(type);
1037 elm_naviframe_item_pop(obj);
1043 static void add_padding_area(Evas_Object *genlist)
1045 /* Add padding area in wearable circle profile */
1046 Elm_Genlist_Item_Class *ptc = elm_genlist_item_class_new();
1047 Elm_Object_Item *item;
1049 ptc->item_style = "padding";
1050 item = elm_genlist_item_append(genlist, ptc, NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
1051 elm_atspi_accessible_role_set(item, ELM_ATSPI_ROLE_REDUNDANT_OBJECT);
1052 elm_genlist_item_class_free(ptc);
1057 static Elm_Object_Item * append_item(Evas_Object *genlist, enum SETTING_ITEM_ID id, const char *main_text, const char *sub_text, void *cb_data, Elm_Genlist_Item_Class *itc, Elm_Genlist_Item_Type type, Eina_Bool display_only)
1059 Elm_Object_Item *item = NULL;
1062 strncpy(main_itemdata[id].main_text, main_text, ITEM_DATA_STRING_LEN - 1);
1065 strncpy(main_itemdata[id].sub_text, sub_text, ITEM_DATA_STRING_LEN - 1);
1067 main_itemdata[id].mode = id;
1068 item = elm_genlist_item_append(genlist, itc, &main_itemdata[id],
1069 NULL, type, _main_gl_sel, cb_data);
1072 elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
1074 main_itemdata[id].item = item;
1079 Evas_Object* create_option_main_view(Evas_Object *parent, Evas_Object *naviframe, SCLOptionWindowType type)
1081 Evas_Object *genlist = NULL;
1082 if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) {
1083 create_genlist_item_classes(type);
1085 genlist = create_genlist(naviframe);
1086 option_elements[type].genlist = genlist;
1088 elm_object_theme_set(genlist, option_elements[type].list_theme);
1089 evas_object_smart_callback_add(genlist, "pressed", _gl_pressed_cb, NULL);
1090 evas_object_smart_callback_add(genlist, "released", _gl_relesed_cb, NULL);
1094 /* Circle Surface Creation */
1095 option_elements[type].circle_surface = eext_circle_surface_conformant_add(option_elements[type].conformant);
1096 Evas_Object *circle_genlist = eext_circle_object_genlist_add(genlist, option_elements[type].circle_surface);
1097 eext_rotary_object_event_activated_set(circle_genlist, EINA_TRUE);
1099 option_elements[type].circle_genlist = circle_genlist;
1103 add_scrollable_title_area(genlist, OPTIONS, EINA_TRUE);
1107 /* Input languages */
1108 append_item(genlist, SETTING_ITEM_ID_INPUT_LANGUAGE_TITLE, INPUT_LANGUAGE, NULL, NULL, option_elements[type].itc_group_title, ELM_GENLIST_ITEM_GROUP, EINA_TRUE);
1110 for (unsigned int loop = 0; loop < OPTION_MAX_LANGUAGES && loop < _language_manager.get_languages_num(); loop++)
1112 /* Current languages */
1113 LANGUAGE_INFO *info = _language_manager.get_language_info(loop);
1114 if (info && info->enabled) {
1115 strncpy(language_itemdata[loop].main_text, info->display_name.c_str(), ITEM_DATA_STRING_LEN - 1);
1117 if (info->input_modes.size() > 0) {
1118 INPUT_MODE_INFO input_mode = info->input_modes.at(0);
1119 strncpy(language_itemdata[loop].sub_text, input_mode.display_name.c_str(), ITEM_DATA_STRING_LEN - 1);
1122 language_itemdata[loop].mode = SETTING_ITEM_ID_CUR_LANGUAGE;
1123 option_elements[type].selected_language_item[loop] =
1124 elm_genlist_item_append(genlist, option_elements[type].itc_main_item, &language_itemdata[loop],
1125 NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
1126 elm_genlist_item_select_mode_set(option_elements[type].selected_language_item[loop], ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
1128 option_elements[type].selected_language_item[loop] = NULL;
1132 if (_language_manager.get_languages_num() > 1) {
1133 /* Select input languages */
1134 option_elements[type].languages_item = append_item(genlist, SETTING_ITEM_ID_SELECT_INPUT_LANGUAGE, SELECT_LANGUAGES, NULL, (void *)SETTING_ITEM_ID_SELECT_INPUT_LANGUAGE, option_elements[type].itc_1text_main_item, ELM_GENLIST_ITEM_NONE, EINA_FALSE);
1140 /* Smart input functions */
1141 append_item(genlist, SETTING_ITEM_ID_SMART_INPUT_TITLE, SMART_FUNCTIONS, NULL, NULL, option_elements[type].itc_group_title, ELM_GENLIST_ITEM_GROUP, EINA_TRUE);
1144 /* Auto capitalize */
1145 append_item(genlist, SETTING_ITEM_ID_AUTO_CAPITALISE, AUTO_CAPITALISE, CAPITALISE_DESC, (void *)SETTING_ITEM_ID_AUTO_CAPITALISE, option_elements[type].itc_multi_item, ELM_GENLIST_ITEM_NONE, EINA_FALSE);
1147 /* Auto punctuate */
1148 append_item(genlist, SETTING_ITEM_ID_AUTO_PUNCTUATE, AUTO_PUNCTUATE, PUNCTUATE_DESC, (void *)SETTING_ITEM_ID_AUTO_PUNCTUATE, option_elements[type].itc_multi_item, ELM_GENLIST_ITEM_NONE, EINA_FALSE);
1151 /* Key-tap feedback */
1152 append_item(genlist, SETTING_ITEM_ID_KEY_TAP_TITLE, KEY_FEEDBACK, NULL, NULL, option_elements[type].itc_group_title, ELM_GENLIST_ITEM_GROUP, EINA_TRUE);
1156 append_item(genlist, SETTING_ITEM_ID_SOUND, SOUND, NULL, (void *)SETTING_ITEM_ID_SOUND, option_elements[type].itc_main_item, ELM_GENLIST_ITEM_NONE, EINA_FALSE);
1159 append_item(genlist, SETTING_ITEM_ID_PREDICTION, PREDICTION, NULL, (void *)SETTING_ITEM_ID_PREDICTION, option_elements[type].itc_main_item, ELM_GENLIST_ITEM_NONE, EINA_FALSE);
1162 /* voice language */
1163 append_item(genlist, SETTING_ITEM_ID_VOICE_LANGUAGE, VOICE_LANGUAGE, NULL, (void *)SETTING_ITEM_ID_VOICE_LANGUAGE, option_elements[type].itc_main_item, ELM_GENLIST_ITEM_NONE, EINA_FALSE);
1166 /* Character preview */
1167 append_item(genlist, SETTING_ITEM_ID_CHARACTER_PRE, CHARACTER_PREVIEW, PREVIEW_DESC, (void *)SETTING_ITEM_ID_CHARACTER_PRE, option_elements[type].itc_multi_item, ELM_GENLIST_ITEM_NONE, EINA_FALSE);
1172 const char *more_setting_text = NULL;
1176 more_setting_text = MORE_SETTINGS;
1178 /* Other settings */
1179 more_setting_text = OTHER_SETTINGS;
1182 append_item(genlist, SETTING_ITEM_ID_MORE_SETTINGS_TITLE, more_setting_text, NULL, NULL, option_elements[type].itc_group_title, ELM_GENLIST_ITEM_GROUP, EINA_TRUE);
1187 append_item(genlist, SETTING_ITEM_ID_SMART_INPUT_TITLE, SMART_TYPING, NULL, (void *)SETTING_ITEM_ID_SMART_INPUT_TITLE, option_elements[type].itc_1text_main_item, ELM_GENLIST_ITEM_NONE, EINA_FALSE);
1189 /* Key-tap feedback */
1190 append_item(genlist, SETTING_ITEM_ID_KEY_TAP_TITLE, KEY_FEEDBACK, NULL, (void *)SETTING_ITEM_ID_KEY_TAP_TITLE, option_elements[type].itc_1text_main_item, ELM_GENLIST_ITEM_NONE, EINA_FALSE);
1194 append_item(genlist, SETTING_ITEM_ID_RESET, RESET, NULL, (void *)SETTING_ITEM_ID_RESET, option_elements[type].itc_1text_main_item, ELM_GENLIST_ITEM_NONE, EINA_FALSE);
1196 /* Clear personalized data */
1197 append_item(genlist, SETTING_ITEM_ID_CLEAR, CLEAR, NULL, (void *)SETTING_ITEM_ID_CLEAR, option_elements[type].itc_1text_main_item, ELM_GENLIST_ITEM_NONE, EINA_FALSE);
1199 evas_object_smart_callback_add(genlist, "contracted", _main_gl_con, genlist);
1202 add_padding_area(genlist);
1209 static Evas_Object* create_option_language_view(Evas_Object *naviframe)
1211 Evas_Object *genlist = create_genlist(naviframe);
1213 SCLOptionWindowType type = find_option_window_type(naviframe);
1215 if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) {
1216 option_elements[type].language_genlist = genlist;
1219 /* Circle Surface Creation */
1220 if (option_elements[type].circle_surface) {
1221 Evas_Object *circle_genlist = eext_circle_object_genlist_add(genlist, option_elements[type].circle_surface);
1222 eext_rotary_object_event_activated_set(circle_genlist, EINA_TRUE);
1227 add_scrollable_title_area(genlist, LANGUAGE, EINA_FALSE);
1230 for (unsigned int loop = 0; loop < OPTION_MAX_LANGUAGES && loop < _language_manager.get_languages_num(); loop++)
1232 LANGUAGE_INFO *info = _language_manager.get_language_info(loop);
1234 strncpy(language_itemdata[loop].main_text, info->display_name.c_str(), ITEM_DATA_STRING_LEN - 1);
1236 if (info->input_modes.size() > 0) {
1237 INPUT_MODE_INFO input_mode = info->input_modes.at(0);
1238 strncpy(language_itemdata[loop].sub_text, input_mode.display_name.c_str(), ITEM_DATA_STRING_LEN - 1);
1241 language_itemdata[loop].mode = loop;
1242 option_elements[type].language_item[loop] =
1243 elm_genlist_item_append(genlist, option_elements[type].itc_language_subitems,
1244 &language_itemdata[loop], NULL, ELM_GENLIST_ITEM_NONE,
1245 _language_gl_sel, reinterpret_cast<void*>(language_itemdata[loop].mode));
1247 language_itemdata[loop].item = option_elements[type].language_item[loop];
1249 option_elements[type].language_item[loop] = NULL;
1254 add_padding_area(genlist);
1258 evas_object_show(genlist);
1260 naviframe_item_push(naviframe, LANGUAGE, genlist, _pop_cb, naviframe, language_selection_finished_cb, naviframe);
1266 static Evas_Object* create_smart_typing_view(Evas_Object *naviframe)
1268 Evas_Object *genlist = create_genlist(naviframe);
1269 SCLOptionWindowType type = find_option_window_type(naviframe);
1271 if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) {
1272 //option_elements[type].language_genlist = genlist;
1275 if (option_elements[type].circle_surface) {
1276 Evas_Object *circle_genlist = eext_circle_object_genlist_add(genlist, option_elements[type].circle_surface);
1277 eext_rotary_object_event_activated_set(circle_genlist, EINA_TRUE);
1282 add_scrollable_title_area(genlist, SMART_TYPING, EINA_FALSE);
1286 append_item(genlist, SETTING_ITEM_ID_PREDICTION, PREDICTION, NULL, (void *)SETTING_ITEM_ID_PREDICTION, option_elements[type].itc_1text_main_item, ELM_GENLIST_ITEM_NONE, EINA_FALSE);
1288 /* Auto capitalize */
1289 append_item(genlist, SETTING_ITEM_ID_AUTO_CAPITALISE, AUTO_CAPITALISE, NULL, (void *)SETTING_ITEM_ID_AUTO_CAPITALISE, option_elements[type].itc_1text_main_item, ELM_GENLIST_ITEM_NONE, EINA_FALSE);
1291 /* Auto punctuate */
1292 append_item(genlist, SETTING_ITEM_ID_AUTO_PUNCTUATE, AUTO_PUNCTUATE, NULL, (void *)SETTING_ITEM_ID_AUTO_PUNCTUATE, option_elements[type].itc_1text_main_item, ELM_GENLIST_ITEM_NONE, EINA_FALSE);
1295 add_padding_area(genlist);
1299 evas_object_show(genlist);
1301 naviframe_item_push(naviframe, SMART_TYPING, genlist, _pop_cb, naviframe, NULL, NULL);
1306 static Evas_Object* create_feedback_view(Evas_Object *naviframe)
1308 Evas_Object *genlist = create_genlist(naviframe);
1309 SCLOptionWindowType type = find_option_window_type(naviframe);
1311 if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) {
1312 //option_elements[type].language_genlist = genlist;
1315 if (option_elements[type].circle_surface) {
1316 Evas_Object *circle_genlist = eext_circle_object_genlist_add(genlist, option_elements[type].circle_surface);
1317 eext_rotary_object_event_activated_set(circle_genlist, EINA_TRUE);
1322 add_scrollable_title_area(genlist, KEY_FEEDBACK, EINA_FALSE);
1326 append_item(genlist, SETTING_ITEM_ID_SOUND, SOUND, NULL, (void *)SETTING_ITEM_ID_SOUND, option_elements[type].itc_1text_main_item, ELM_GENLIST_ITEM_NONE, EINA_FALSE);
1329 append_item(genlist, SETTING_ITEM_ID_VIBRATION, VIBRATION, NULL, (void *)SETTING_ITEM_ID_VIBRATION, option_elements[type].itc_1text_main_item, ELM_GENLIST_ITEM_NONE, EINA_FALSE);
1332 add_padding_area(genlist);
1336 evas_object_show(genlist);
1338 naviframe_item_push(naviframe, KEY_FEEDBACK, genlist, _pop_cb, naviframe, NULL, NULL);
1344 static void read_options(Evas_Object *naviframe)
1346 SCLOptionWindowType type = find_option_window_type(naviframe);
1348 if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) {
1349 for (unsigned int loop = 0; loop < OPTION_MAX_LANGUAGES && loop < _language_manager.get_languages_num(); loop++)
1351 if (option_elements[type].selected_language_item[loop] != NULL) {
1352 elm_object_item_del(option_elements[type].selected_language_item[loop]);
1353 option_elements[type].selected_language_item[loop] = NULL;
1356 LANGUAGE_INFO *info = _language_manager.get_language_info(loop);
1357 if (info && info->enabled) {
1358 strncpy(language_itemdata[loop].main_text, info->display_name.c_str(), ITEM_DATA_STRING_LEN - 1);
1360 if (info->input_modes.size() > 0) {
1361 INPUT_MODE_INFO input_mode = info->input_modes.at(0);
1362 strncpy(language_itemdata[loop].sub_text, input_mode.display_name.c_str(), ITEM_DATA_STRING_LEN - 1);
1365 language_itemdata[loop].mode = SETTING_ITEM_ID_CUR_LANGUAGE;
1366 option_elements[type].selected_language_item[loop] =
1367 elm_genlist_item_insert_before(option_elements[type].genlist, option_elements[type].itc_main_item, &language_itemdata[loop],
1368 NULL, option_elements[type].languages_item, ELM_GENLIST_ITEM_NONE, NULL, NULL);
1370 elm_genlist_item_select_mode_set(option_elements[type].selected_language_item[loop], ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
1375 Elm_Object_Item *top_it = elm_naviframe_top_item_get(naviframe);
1377 Evas_Object *content = elm_object_item_content_get(top_it);
1379 Elm_Object_Item *item = elm_genlist_first_item_get(content);
1381 elm_genlist_item_update(item);
1382 item = elm_genlist_item_next_get(item);
1388 static void set_option_values()
1392 static void language_view_popup_show(Evas_Object *obj, SCLOptionWindowType type, const char *content_text, const char *btn_text)
1394 if (content_text == NULL)
1397 if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) {
1398 Evas_Object *top_level = elm_object_top_widget_get(obj);
1399 option_elements[type].lang_popup = elm_popup_add(top_level);
1401 elm_object_style_set(option_elements[type].lang_popup, "circle");
1403 elm_object_text_set(option_elements[type].lang_popup, content_text);
1404 elm_popup_align_set(option_elements[type].lang_popup, ELM_NOTIFY_ALIGN_FILL, 1.0);
1405 elm_popup_timeout_set(option_elements[type].lang_popup, 3.0);
1406 evas_object_smart_callback_add(option_elements[type].lang_popup, "timeout", _popup_timeout_cb, obj);
1407 elm_object_focus_allow_set(option_elements[type].lang_popup, EINA_TRUE);
1408 evas_object_show(option_elements[type].lang_popup);
1409 evas_object_raise(option_elements[type].lang_popup);
1410 eext_object_event_callback_add(option_elements[type].lang_popup, EEXT_CALLBACK_BACK, _popup_timeout_cb, NULL);
1414 static void language_selected(void *data, Evas_Object *obj, void *event_info)
1416 Evas_Object *genlist = static_cast<Evas_Object*>(evas_object_data_get(obj, "parent_object"));
1417 SCLOptionWindowType type = find_option_window_type(genlist);
1418 LOGD("type=%d\n", type);
1419 ITEMDATA *item_data = (ITEMDATA*)data;
1421 LANGUAGE_INFO *info = _language_manager.get_language_info(item_data->mode);
1423 sclboolean language_changed = TRUE;
1424 info->enabled = elm_check_state_get(obj);
1425 if (!elm_check_state_get(obj)) {
1426 if (_language_manager.get_enabled_languages_num() < MIN_SELECTED_LANGUAGES) {
1427 info->enabled = TRUE;
1428 elm_check_state_set(obj, EINA_TRUE);
1429 language_view_popup_show(obj, type, MSG_NONE_SELECTED, NULL);
1430 language_changed = FALSE;
1433 if (_language_manager.get_enabled_languages_num() > MAX_SELECTED_LANGUAGES) {
1434 info->enabled = FALSE;
1435 elm_check_state_set(obj, EINA_FALSE);
1437 char buf[256] = { 0 };
1438 const sclchar *suppoted_max_languages = SUPPORTED_MAX_LANGUAGES;
1439 snprintf(buf, sizeof(buf), suppoted_max_languages, MAX_SELECTED_LANGUAGES);
1440 language_view_popup_show(obj, type, buf, NULL);
1441 language_changed = FALSE;
1445 if (language_changed) {
1446 // Update enabled_languages
1447 sclboolean selected_language_found = FALSE;
1448 std::vector<std::string> enabled_languages;
1450 for (unsigned int loop = 0;loop < OPTION_MAX_LANGUAGES && loop < _language_manager.get_languages_num();loop++) {
1451 LANGUAGE_INFO *info = _language_manager.get_language_info(loop);
1453 if (info->enabled) {
1454 enabled_languages.push_back(info->name);
1455 LOGD("Enabled language:%s\n", info->name.c_str());
1456 if (info->name.compare(g_config_values.selected_language) == 0) {
1457 selected_language_found = TRUE;
1462 if (enabled_languages.size() > 0) {
1463 g_config_values.enabled_languages = enabled_languages;
1464 LOGD("Enabled languages size:%d\n", g_config_values.enabled_languages.size());
1465 if (!selected_language_found) {
1466 if (!(g_config_values.enabled_languages.at(0).empty())) {
1467 g_config_values.selected_language = g_config_values.enabled_languages.at(0);
1471 write_ise_config_values();
1478 static void navi_back_cb(void *data, Evas_Object *obj, void *event_info)
1480 SCLOptionWindowType type = find_option_window_type(obj);
1481 evas_object_smart_callback_del(obj, "clicked", navi_back_cb);
1482 if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX))
1483 close_option_window(type);
1487 option_window_created(Evas_Object *window, SCLOptionWindowType type)
1489 LOGD("option_window_created(%d) start \n", type);
1490 if (window == NULL) return;
1491 if (!CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) return;
1495 ISE_LANG_TABLE *table = NULL;
1496 ISELangTableMgr *lang_table_mgr = ISELangTableMgr::get_instance();
1497 if (lang_table_mgr) table = lang_table_mgr->get_lang_table();
1499 if (lang_table_mgr && table) {
1500 for (loop = 0;loop < lang_table_mgr->get_lang_table_size();loop++) {
1501 INPUT_MODE_INFO input_mode_QTY;
1502 input_mode_QTY.name = table[loop].inputmode_QTY;
1503 input_mode_QTY.display_name = table[loop].inputmode_QTY_name;
1504 LANGUAGE_INFO language;
1505 language.name = table[loop].language;
1506 language.display_name = table[loop].language_name;
1507 if (table[loop].locale_string) {
1508 language.locale_string = table[loop].locale_string;
1510 language.input_modes.push_back(input_mode_QTY);
1511 language.priority = LANGAUGE_PRIORITY_DEFAULT;
1512 language.resource_file = MAIN_ENTRY_XML_PATH;
1513 language.is_latin_language = table[loop].is_latin_language;
1514 language.accepts_caps_mode = table[loop].accepts_caps_mode;
1516 /* These variable should be read from stored setting values */
1517 language.enabled = FALSE;
1518 language.selected_input_mode = input_mode_QTY.name;
1520 _language_manager.add_language(language);
1524 read_ise_config_values();
1526 /* To make sure there is no temporary language in the enabled language list */
1527 _language_manager.set_enabled_languages(g_config_values.enabled_languages);
1529 set_option_values();
1530 option_elements[type].option_window = window;
1532 elm_win_indicator_mode_set(window, ELM_WIN_INDICATOR_SHOW);
1533 elm_win_indicator_opacity_set(window, ELM_WIN_INDICATOR_OPAQUE);
1535 elm_win_indicator_mode_set(window, ELM_WIN_INDICATOR_HIDE);
1539 option_elements[type].list_theme = elm_theme_new();
1540 elm_theme_ref_set(option_elements[type].list_theme, NULL);
1541 elm_theme_extension_add(option_elements[type].list_theme, EDJ_FILE);
1543 Evas_Object *conformant = elm_conformant_add(window);
1544 evas_object_size_hint_weight_set(conformant, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1545 elm_win_resize_object_add(window, conformant);
1546 elm_win_conformant_set(window, EINA_TRUE);
1547 evas_object_show(conformant);
1549 Evas_Object *blayout = elm_layout_add(conformant);
1550 elm_layout_theme_set(blayout, "layout", "application", "default");
1551 evas_object_size_hint_weight_set(blayout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1552 evas_object_show(blayout);
1553 elm_object_content_set(conformant, blayout);
1555 Evas_Object *naviframe = elm_naviframe_add(blayout);
1556 option_elements[type].naviframe = naviframe;
1557 elm_object_part_content_set(blayout, "elm.swallow.content", naviframe);
1558 Evas_Object *mlayout = NULL;
1559 mlayout = elm_layout_add(naviframe);
1560 evas_object_size_hint_weight_set(mlayout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1561 elm_layout_theme_set(mlayout, "layout", "application", "default");
1562 option_elements[type].option_bg = mlayout;
1563 evas_object_show(mlayout);
1564 option_elements[type].option_layout = mlayout;
1565 edje_object_file_set(mlayout, EDJ_FILE, "keyboard");
1567 Evas_Object *image = elm_image_add(mlayout);
1568 elm_image_file_set(image, IMG_POPUP_DIM_BG, NULL);
1569 elm_object_part_content_set(mlayout, "bg_image", image);
1570 Evas_Object *playout = elm_layout_add(mlayout);
1571 evas_object_size_hint_weight_set(mlayout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1572 elm_object_part_content_set(mlayout, "part.popup", playout);
1573 evas_object_show(playout);
1575 elm_object_part_text_set(mlayout, "elm.text", OPTIONS);
1576 Evas_Object *bar_line = elm_image_add(mlayout);
1577 elm_image_file_set(bar_line, IMG_POPUP_BAR_LINE, NULL);
1578 evas_object_color_set(bar_line, 255, 255, 255, 80); //255 255 255 80 GUI
1579 elm_object_part_content_set(mlayout, "bar_line", bar_line);
1581 Evas_Object *bar_shadow = elm_image_add(mlayout);
1582 elm_image_file_set(bar_shadow, IMG_POPUP_BAR_SHADOW, NULL);
1583 evas_object_color_set(bar_shadow, 0, 0, 255, 255); //0 0 0 100 GUI
1584 elm_object_part_content_set(mlayout, "bar_shadow", bar_shadow);
1586 Evas_Object *list = create_option_main_view(mlayout, mlayout, type);
1587 elm_scroller_policy_set(list, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
1588 elm_object_part_content_set(mlayout, "part.list", list);
1590 Evas_Object *conformant = elm_conformant_add(window);
1591 evas_object_size_hint_weight_set(conformant, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1592 evas_object_size_hint_align_set(conformant, EVAS_HINT_FILL, EVAS_HINT_FILL);
1593 elm_win_resize_object_add(window, conformant);
1594 elm_win_conformant_set(window, EINA_TRUE);
1595 evas_object_show(conformant);
1598 option_elements[type].conformant = conformant;
1601 /* Create header bg */
1602 Evas_Object *bg = elm_bg_add(conformant);
1603 elm_object_style_set(bg, "indicator/headerbg");
1604 elm_object_part_content_set(conformant, "elm.swallow.indicator_bg", bg);
1605 evas_object_show(bg);
1609 Evas_Object *naviframe = elm_naviframe_add(conformant);
1610 option_elements[type].naviframe = naviframe;
1612 elm_naviframe_prev_btn_auto_pushed_set(naviframe, EINA_FALSE);
1613 eext_object_event_callback_add(naviframe, EEXT_CALLBACK_BACK, _naviframe_back_cb, NULL);
1614 evas_object_size_hint_weight_set(naviframe, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1615 evas_object_size_hint_align_set(naviframe, EVAS_HINT_FILL, EVAS_HINT_FILL);
1618 option_elements[type].back_button = naviframe_item_push(naviframe, OPTIONS, mlayout, NULL, NULL, navi_back_cb, NULL, EINA_FALSE);
1620 Evas_Object *list = create_option_main_view(conformant, naviframe, type);
1621 option_elements[type].back_button = naviframe_item_push(naviframe, OPTIONS, list, NULL, NULL, navi_back_cb, NULL);
1622 elm_object_content_set(conformant, naviframe);
1625 evas_object_show(naviframe);
1626 evas_object_show(window);
1630 option_window_destroyed(Evas_Object *window)
1632 SCLOptionWindowType type = find_option_window_type(window);
1634 if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) {
1635 if (option_elements[type].option_window == window) {
1637 if (option_elements[type].circle_surface) {
1638 eext_circle_surface_del(option_elements[type].circle_surface);
1639 option_elements[type].circle_surface = NULL;
1643 option_elements[type].option_window = NULL;
1644 option_elements[type].naviframe = NULL;
1645 option_elements[type].genlist = NULL;
1646 option_elements[type].circle_genlist = NULL;
1647 option_elements[type].language_genlist = NULL;
1648 option_elements[type].lang_popup = NULL;
1649 option_elements[type].back_button = NULL;
1650 option_elements[type].conformant = NULL;
1652 option_elements[type].itc_main_item = NULL;
1653 option_elements[type].itc_multi_item = NULL;
1654 option_elements[type].itc_1text_main_item = NULL;
1655 option_elements[type].itc_language_subitems = NULL;
1656 option_elements[type].itc_group_title = NULL;
1658 option_elements[type].languages_item = NULL;
1664 option_window_is_available(SCLOptionWindowType type)
1666 LOGD("OptionWindowType = %d \n", type);
1667 if (CHECK_ARRAY_INDEX(type, OPTION_WINDOW_TYPE_MAX)) {
1668 if (option_elements[type].option_window != NULL) {
1676 app_create(void *data)
1680 bindtextdomain(PACKAGE, LOCALEDIR);
1681 textdomain(PACKAGE);
1683 /* Hook to take necessary actions before main event loop starts
1684 Initialize UI resources and application's data
1685 If this function returns true, the main loop of application starts
1686 If this function returns false, the application is terminated */
1691 app_control(app_control_h app_control, void *data)
1693 /* Handle the launch request. */
1694 char *caller = NULL;
1695 g_launch_mode = LAUNCH_MODE_OTHER;
1696 Evas_Object *window = elm_win_util_standard_add("Option window", "Option window");
1697 if (!window) return;
1699 int rots[] = { 0, 90, 180, 270 };
1700 elm_win_wm_rotation_available_rotations_set(window, rots, (sizeof(rots) / sizeof(int)));
1701 elm_win_indicator_mode_set(window, ELM_WIN_INDICATOR_SHOW);
1703 app_control_get_extra_data(app_control, "caller", &caller);
1706 if (strcmp(caller, "ise-default") == 0)
1707 g_launch_mode = LAUNCH_MODE_IME;
1712 option_window_created(window, OPTION_WINDOW_TYPE_SETTING_APPLICATION);
1716 app_pause(void *data)
1719 /* Take necessary actions when application becomes invisible. */
1720 if (g_launch_mode == LAUNCH_MODE_IME) {
1726 app_resume(void *data)
1732 app_terminate(void *data)
1738 main(int argc, char *argv[])
1742 ui_app_lifecycle_callback_s event_callback = {0, };
1744 event_callback.create = app_create;
1745 event_callback.terminate = app_terminate;
1746 event_callback.pause = app_pause;
1747 event_callback.resume = app_resume;
1748 event_callback.app_control = app_control;
1750 ret = ui_app_main(argc, argv, &event_callback, NULL);
1751 if (ret != APP_ERROR_NONE) {
1752 LOGW("ui_app_main failed, Err=%d\n", ret);