Remove global variables
[platform/core/uifw/ise-default.git] / src / ise-language-change.cpp
1 /*
2  * Copyright (c) 2012 - 2015 Samsung Electronics Co., Ltd All Rights Reserved
3  *
4  * Licensed under the Apache License, Version 2.0 (the License);
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an AS IS BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17
18 #include "ise-language-change.h"
19 #include "ise.h"
20 #include <dlog.h>
21 #include <inputmethod.h>
22 #undef LOG_TAG
23 #define LOG_TAG "ISE_DEFAULT"
24
25 #define USE_EFL
26
27 static short int space_popup_width = NOT_USED;
28 static short int space_popup_height = NOT_USED;
29
30 static short int scroller_area_width = NOT_USED;
31 static short int scroller_area_height = NOT_USED;
32 static short int scroller_x = NOT_USED;
33 static short int scroller_y = NOT_USED;
34 static short int space_popup_width_padding = NOT_USED;
35
36 static short int arrow_image_width = NOT_USED;
37 static short int arrow_image_height = NOT_USED;
38 static short int arrow_image_x_padding = NOT_USED;
39 static short int arrow_image_y_padding = NOT_USED;
40 #ifdef _WEARABLE
41 #include <sclutils.h>
42 static short int space_image_width = NOT_USED;
43 static short int space_image_height = NOT_USED;
44 #endif
45
46 #ifdef _WEARABLE
47 #define IMG_ARROW_LEFT                  LAYOUTDIR"/wearable/image/button/B09_btn_arrow_left.png"
48 #define IMG_ARROW_RIGHT                 LAYOUTDIR"/wearable/image/button/B09_btn_arrow_right.png"
49 #define IMG_POPUP_FC_BG                 LAYOUTDIR"/wearable/image/button/language_change_popup_bg.png"
50 #define IMG_SPACE_POPUP_FC_PRESS        LAYOUTDIR"/wearable/image/button/B09_icon_space_popup_fc_press.png"
51 #define EDJ_FILE                        RESDIR"/edje/wearable/popup_custom.edj"
52 #define SPACE_SIZE_HEIGHT               111
53 #define SPACE_SIZE_WIDTH                194
54 #define SPACE_PADDING_X                 10
55 #define SPACE_PADDING_Y                 10
56 #define SPACE_KEY_HEIGHT                60
57 #else
58 #define IMG_ARROW_LEFT                  LAYOUTDIR "/" PROFILE_NAME"/image/button/btn_arrow_s_left.png"
59 #define IMG_ARROW_RIGHT                 LAYOUTDIR "/" PROFILE_NAME"/image/button/btn_arrow_s_right.png"
60 #define IMG_POPUP_FC_BG                 LAYOUTDIR "/" PROFILE_NAME"/image/button/language_change_popup_bg.png"
61 #define EDJ_FILE                        RESDIR "/edje/" PROFILE_NAME"/popup_custom.edj"
62 #endif
63
64 static short int lang_popup_x = NOT_USED;
65 static short int lang_popup_y = NOT_USED;
66
67 static short int old_ev_x = NOT_USED;
68 static short int old_ev_y = NOT_USED;
69
70 static int scroller_region_x = NOT_USED;
71 static int cw = NOT_USED;
72
73 static bool lang_popup_on = false;
74
75 static Ecore_Event_Handler *_lang_popup_mouse_move_handler = NULL;
76 static Evas_Object *win = NULL;
77 static Evas_Object *image_ob = NULL;
78 #ifdef _WEARABLE
79 static Evas_Object *img_space = NULL;
80 #endif
81 static Evas_Object *scroller = NULL;
82 static Evas_Object *img_arrow_left = NULL;
83 static Evas_Object *img_arrow_right = NULL;
84
85 static ISELanguageManager _language_manager;
86
87 static Eina_Bool __ise_space_flick_lang_popup_move_cb(void *data, int type, void *event_info);
88 static void __ise_init_space_flick_lang_change_popup_variables(short int space_button_x, short int space_button_y, short int space_button_width, short int space_button_height);
89
90 void ise_show_space_flick_language_change_popup(short int space_button_x, short int space_button_y, short int space_button_width, short int space_button_height)
91 {
92 #ifdef _WEARABLE
93     int space_button_width_tmp, space_button_height_tmp;
94     CSCLUI *ui = get_ui();
95     space_button_width_tmp = ui->get_scaled_x(SPACE_SIZE_WIDTH);
96     space_button_height_tmp = ui->get_scaled_y(SPACE_SIZE_HEIGHT);
97     space_button_x = ui->get_scaled_x(space_button_x + space_button_width) - space_button_width_tmp + ui->get_scaled_x(SPACE_PADDING_X);
98     space_button_y = ui->get_scaled_y(space_button_y + space_button_height) - space_button_height_tmp + ui->get_scaled_y(SPACE_PADDING_Y + SPACE_KEY_HEIGHT);
99     space_button_width = space_button_width_tmp;
100     space_button_height = space_button_height_tmp;
101 #endif
102     std::string left_text = "left";
103     std::string center_text = "center";
104     std::string right_text = "right";
105
106     if (lang_popup_on)
107         return;
108
109     scluint num = _language_manager.get_enabled_languages_num();
110
111 #ifdef _WEARABLE
112     if (num <= 1) {
113         return;
114     } else {
115         left_text = _language_manager.get_current_language();
116         center_text = _language_manager.get_next_language();
117     }
118 #else
119     if (num <= 1) {
120         return;
121     } else if (num == 2) {
122         left_text = _language_manager.get_next_language();
123         if (!left_text.empty()) {
124             right_text = left_text;
125         } else {
126             right_text = _language_manager.get_previous_language();
127             if (!right_text.empty()) {
128                 left_text = right_text;
129             }
130         }
131         center_text = _language_manager.get_current_language();
132
133     } else {
134         left_text = _language_manager.get_next_language();
135         center_text = _language_manager.get_current_language();
136         right_text = _language_manager.get_previous_language();
137     }
138 #endif
139
140     __ise_init_space_flick_lang_change_popup_variables(space_button_x, space_button_y, space_button_width, space_button_height);
141
142     int xPos = lang_popup_x;
143     int yPos = lang_popup_y;
144
145     win = elm_bg_add(NATIVE_WINDOW_CAST(ime_get_main_window()));
146     image_ob = evas_object_image_add(evas_object_evas_get(win));
147     evas_object_image_file_set(image_ob, IMG_POPUP_FC_BG, NULL);
148     evas_object_image_border_set(image_ob, 1, 1, 1, 1);
149     Evas_Load_Error err = evas_object_image_load_error_get(image_ob);
150     if (err != EVAS_LOAD_ERROR_NONE) {
151         LOGD("Could not load image, error string is \"%s\"", evas_load_error_str(err));
152     } else {
153         evas_object_image_fill_set(image_ob, 0, 0, space_popup_width, space_popup_height);
154         evas_object_resize(image_ob, space_popup_width, space_popup_height);
155         evas_object_move(image_ob, xPos, yPos);
156 #ifdef _WEARABLE
157         evas_object_layer_set(image_ob, EVAS_LAYER_MAX);
158 #endif
159         evas_object_show(image_ob);
160     }
161 #ifdef _WEARABLE
162 #else
163     evas_object_color_set(win, 255, 255, 255, 255);
164 #endif
165     evas_object_resize(win, space_popup_width, space_popup_height);
166     evas_object_move(win, xPos, yPos);
167 #ifdef _WEARABLE
168 #else
169     evas_object_layer_set(win, EVAS_LAYER_MAX);
170 #endif
171     evas_object_show(win);
172
173 #ifdef _WEARABLE
174     img_space = evas_object_image_add(evas_object_evas_get(win));
175     evas_object_image_file_set(img_space, IMG_SPACE_POPUP_FC_PRESS, NULL);
176     evas_object_image_fill_set(img_space, 0, 0, space_image_width, space_image_height);
177     evas_object_resize(img_space, space_image_width, space_image_height);
178     evas_object_move(img_space, xPos + (space_button_width - space_image_width) / 2, yPos + (space_button_height / 2 - space_image_height) / 2 + space_button_height / 2);
179     evas_object_layer_set(img_space, EVAS_LAYER_MAX);
180     evas_object_show(img_space);
181 #endif
182
183     img_arrow_left = evas_object_image_add(evas_object_evas_get(win));
184     evas_object_image_file_set(img_arrow_left, IMG_ARROW_LEFT, NULL);
185     evas_object_image_fill_set(img_arrow_left, 0, 0, arrow_image_width, arrow_image_height);
186     evas_object_resize(img_arrow_left, arrow_image_width, arrow_image_height);
187     evas_object_move(img_arrow_left, xPos + arrow_image_x_padding, yPos + scroller_y);
188     evas_object_layer_set(img_arrow_left, EVAS_LAYER_MAX);
189
190     img_arrow_right = evas_object_image_add(evas_object_evas_get(win));
191     evas_object_image_file_set(img_arrow_right, IMG_ARROW_RIGHT, NULL);
192     evas_object_image_fill_set(img_arrow_right, 0, 0, arrow_image_width, arrow_image_height);
193     evas_object_resize(img_arrow_right, arrow_image_width, arrow_image_height);
194     evas_object_move(img_arrow_right, xPos + space_popup_width - (arrow_image_width + arrow_image_x_padding), yPos + scroller_y);
195     evas_object_layer_set(img_arrow_right, EVAS_LAYER_MAX);
196
197     cw = -1;
198     Evas_Object* _table = elm_table_add(win);
199     evas_object_size_hint_weight_set(_table, 0.0, 0.0);
200     evas_object_size_hint_align_set(_table, 0.0, 0.0);
201     elm_table_padding_set(_table, 0, 0);
202     evas_object_layer_set(_table, EVAS_LAYER_MAX);
203
204     scroller = elm_scroller_add(win);
205     elm_object_content_set(scroller, _table);
206     evas_object_resize(scroller, scroller_area_width, scroller_area_height);
207     evas_object_move(scroller, xPos + scroller_x, yPos);
208     elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
209     elm_scroller_propagate_events_set(scroller, EINA_TRUE);
210     elm_scroller_page_relative_set(scroller, 0, 0);
211     evas_object_layer_set(scroller, EVAS_LAYER_MAX);
212
213     Evas_Object *label1 = edje_object_add(evas_object_evas_get(win));
214     evas_object_show(label1);
215     evas_object_layer_set(label1, EVAS_LAYER_MAX);
216     edje_object_file_set(label1, EDJ_FILE, "language_label");
217     edje_object_part_text_set(label1, "language_name", left_text.c_str());
218     evas_object_size_hint_min_set(label1, scroller_area_width, scroller_area_height);
219     elm_table_pack(_table, label1, 0, 0, scroller_area_width, scroller_area_height);
220
221     Evas_Object *label2 = edje_object_add(evas_object_evas_get(win));
222     evas_object_show(label2);
223     evas_object_layer_set(label2, EVAS_LAYER_MAX);
224     edje_object_file_set(label2, EDJ_FILE, "language_label");
225     edje_object_part_text_set(label2, "language_name", center_text.c_str());
226     evas_object_size_hint_min_set(label2, scroller_area_width, scroller_area_height);
227     elm_table_pack(_table, label2, scroller_area_width, 0, scroller_area_width, scroller_area_height);
228
229 #ifdef _WEARABLE
230 #else
231     Evas_Object *label3 = edje_object_add(evas_object_evas_get(win));
232     evas_object_show(label3);
233     evas_object_layer_set(label3, EVAS_LAYER_MAX);
234     edje_object_file_set(label3, EDJ_FILE, "language_label");
235     edje_object_part_text_set(label3, "language_name", right_text.c_str());
236     evas_object_size_hint_min_set(label3, scroller_area_width, scroller_area_height);
237     elm_table_pack(_table, label3, scroller_area_width * 2, 0, scroller_area_width, scroller_area_height);
238 #endif
239
240     evas_object_show(img_arrow_left);
241     evas_object_show(img_arrow_right);
242     evas_object_show(_table);
243     evas_object_show(scroller);
244
245     elm_scroller_child_size_get(scroller, &cw, NULL);
246     elm_scroller_region_show(scroller, cw, 0, scroller_area_width, 0);
247
248     _lang_popup_mouse_move_handler = ecore_event_handler_add(ECORE_EVENT_MOUSE_MOVE, __ise_space_flick_lang_popup_move_cb, NULL);
249
250     lang_popup_on = true;
251 }
252
253 void ise_destroy_space_flick_language_change_popup(void)
254 {
255     if (!lang_popup_on)
256         return;
257
258     elm_scroller_page_size_set(scroller, cw, 0);
259
260     if (win) {
261         evas_object_del(win);
262         win = NULL;
263     }
264
265 #ifdef _WEARABLE
266     if (image_ob) {
267         evas_object_del(image_ob);
268         image_ob = NULL;
269     }
270
271     if (img_space) {
272         evas_object_del(img_space);
273         img_space = NULL;
274     }
275 #endif
276
277     if (img_arrow_left) {
278         evas_object_del(img_arrow_left);
279         img_arrow_left = NULL;
280     }
281
282     if (img_arrow_right) {
283         evas_object_del(img_arrow_right);
284         img_arrow_right = NULL;
285     }
286
287     if (_lang_popup_mouse_move_handler) {
288         ecore_event_handler_del(_lang_popup_mouse_move_handler);
289         _lang_popup_mouse_move_handler = NULL;
290     }
291
292     scroller = NULL;
293     lang_popup_on = false;
294     scroller_region_x = -1;
295     old_ev_x = NOT_USED;
296     old_ev_y = NOT_USED;
297 }
298
299 static void __ise_init_space_flick_lang_change_popup_variables(short int space_button_x, short int space_button_y, short int space_button_width, short int space_button_height)
300 {
301     space_popup_width = space_button_width;
302     space_popup_height = space_button_height;
303
304     arrow_image_width = space_popup_width / 15;
305     arrow_image_height = space_popup_width / 15;
306     arrow_image_x_padding = space_popup_width / 20;
307     arrow_image_y_padding = space_popup_height / 10;
308
309 #ifdef _WEARABLE
310     space_image_width = arrow_image_width * 12;
311     space_image_height = space_popup_height / 4;
312 #endif
313
314     scroller_x = (arrow_image_width + arrow_image_x_padding);
315     scroller_y = (space_popup_height - arrow_image_height) / 2;
316     space_popup_width_padding = scroller_x * 2;
317
318     scroller_area_width = space_popup_width - space_popup_width_padding;
319     scroller_area_height = space_popup_height;
320
321     lang_popup_x = space_button_x - (space_popup_width - space_button_width) / 2;
322     lang_popup_y = (space_button_y - space_popup_height - arrow_image_y_padding);
323 }
324
325 static Eina_Bool __ise_space_flick_lang_popup_move_cb(void *data, int type, void *event_info)
326 {
327     Ecore_Event_Mouse_Move *ev = (Ecore_Event_Mouse_Move *)event_info;
328
329     if (old_ev_x == NOT_USED && old_ev_y == NOT_USED) {
330         old_ev_x = ev->x;
331         old_ev_y = ev->y;
332     }
333
334     elm_scroller_region_get(scroller, &scroller_region_x, NULL, NULL, NULL);
335     elm_scroller_region_show(scroller, scroller_region_x + (old_ev_x - ev->x)*3, 0, scroller_area_width, 0);
336
337     old_ev_x = ev->x;
338     old_ev_y = ev->y;
339
340     return ECORE_CALLBACK_PASS_ON;
341 }