61d026693b7d401a7f015cd2d635dceaf84cc0dd
[platform/core/uifw/ise-default.git] / src / candidate-multiline-efl.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 "candidate-multiline-efl.h"
19 #include "config.h"
20 #include "ise-dbus.h"
21 #include <vector>
22 #include <string>
23 #include <assert.h>
24 #include <algorithm>
25 #define LOG_TAG "ISE_DEFAULT"
26 #include <dlog.h>
27 #include <inputmethod_internal.h>
28 using namespace std;
29
30 #define CANDIDATE_EDJ_FILE_PATH       RESDIR"/edje/candidate-multiline.edj"
31 #define MORE_BUTTON_WIDTH             89
32 #define MORE_BUTTON_HEIGHT            64
33 #define CANDIDATE_WINDOW_HEIGHT       84
34 #define CANDIDATE_ITEMS_NUM           8
35 #define CANDIDATE_ITEM_BLANK          30
36 #define CANDIDATE_SEPARATE_WIDTH      2
37 #define CANDIDATE_SEPARATE_HEIGHT     52
38 #define CANDIDATE_HORIZON_LINE_HEIGHT 2
39
40 #if defined(_TV) || defined(_COMMON)
41 #define IME_UI_RESOLUTION_W           1920
42 #define IME_UI_RESOLUTION_H           1080
43 #else
44 #define IME_UI_RESOLUTION_W           720
45 #define IME_UI_RESOLUTION_H           1280
46 #endif
47
48 static int                _threshold                          = 15;
49 static bool               _item_click                         = true;
50 static int                _click_down_pos[2]                 = {0, 0};
51 static int                _click_up_pos[2]                   = {0, 0};
52
53 static void
54 _mouse_down(void *data, Evas *e,
55     Evas_Object *button, void *event_info)
56 {
57     _item_click = true;
58     Evas_Event_Mouse_Down *ev = (Evas_Event_Mouse_Down *)event_info;
59     _click_down_pos[0] = ev->canvas.x;
60     _click_down_pos[1] = ev->canvas.y;
61 }
62
63 static void
64 _mouse_up(void *data, Evas *e,
65     Evas_Object *button, void *event_info)
66 {
67     if (_item_click) {
68         EflMultiLineCandidate *candidate = (EflMultiLineCandidate *)data;
69         candidate->item_pressed(button);
70         _item_click = false;
71     }
72 }
73
74 static void
75 _mouse_move(void *data, Evas *e,
76     Evas_Object *button, void *event_info)
77 {
78     Evas_Event_Mouse_Down *ev = (Evas_Event_Mouse_Down *)event_info;
79     _click_up_pos[0] = ev->canvas.x;
80     _click_up_pos[1] = ev->canvas.y;
81
82     if (abs(_click_up_pos[0] - _click_down_pos[0]) >= _threshold ||
83         abs(_click_up_pos[1] - _click_down_pos[1]) >= _threshold) {
84         _item_click = false;
85     }
86 }
87
88 void
89 EflMultiLineCandidate::item_pressed(Evas_Object *item)
90 {
91     const char *str = edje_object_part_text_get(item, "candidate");
92     item_pressed(str? str : "");
93 }
94
95 void
96 EflMultiLineCandidate::item_pressed(std::string str)
97 {
98 #ifdef _TV
99     m_candidates_item.clear();
100     CSCLUI *ui = get_ui();
101     if (ui) ui->enable_highlight_ui(TRUE);
102     m_highlight_mode = false;
103 #endif
104
105     int index = -1;
106     vector<string>::const_iterator it =
107         find(cur_candidates.begin(), cur_candidates.end(), str);
108     if (it != cur_candidates.end()) {
109         index = it-cur_candidates.begin();
110     } else {
111         index = -1;
112     }
113
114     //hide_more_view();
115     // notify listeners the event happened
116     MultiEventDesc desc;
117     desc.type = MultiEventDesc::CANDIDATE_ITEM_MOUSE_DOWN;
118     desc.index = index;
119     desc.text = str;
120     notify_listeners(desc);
121 }
122
123 void
124 EflMultiLineCandidate::item_released(Evas_Object *item)
125 {
126     // notify listeners the event happend
127     MultiEventDesc desc;
128     desc.type = MultiEventDesc::CANDIDATE_ITEM_MOUSE_UP;
129     notify_listeners(desc);
130 }
131
132 void
133 EflMultiLineCandidate::item_moved(Evas_Object *item)
134 {
135     // notify listeners the event happend
136     MultiEventDesc desc;
137     desc.type = MultiEventDesc::CANDIDATE_ITEM_MOUSE_MOVE;
138     notify_listeners(desc);
139 }
140
141 Evas_Object*
142 EflMultiLineCandidate::get_candidate_item(candidate_item_size item_text_size)
143 {
144     int ret;
145     Evas_Object *edje;
146
147     edje = edje_object_add(evas_object_evas_get(m_window));
148     ret = edje_object_file_set(edje,
149         CANDIDATE_EDJ_FILE_PATH, "candidate_item");
150     if (!ret) {
151         LOGW("getting candidate edje failed.\n");
152         return NULL;
153     }
154
155     evas_object_event_callback_add(edje, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down, this);
156     evas_object_event_callback_add(edje, EVAS_CALLBACK_MOUSE_UP, _mouse_up, this);
157     evas_object_event_callback_add(edje, EVAS_CALLBACK_MOUSE_MOVE, _mouse_move, this);
158
159     evas_object_size_hint_min_set(edje, item_text_size.width, CANDIDATE_WINDOW_HEIGHT*m_screenRatio);
160     edje_object_text_class_set(edje, "candidate", m_candidateFontName.c_str(), m_candidateFontSize);
161     evas_object_show(edje);
162
163     return edje;
164 }
165
166 static void
167 ui_candidate_window_close_button_down_cb(void *data, Evas *e,
168     Evas_Object *button, void *event_info)
169 {
170     EflMultiLineCandidate *candidate =
171         (EflMultiLineCandidate *)data;
172     candidate->close_btn_clicked();
173 }
174
175 /*
176 static void
177 ui_candidate_window_more_button_up_cb(void *data, Evas *e,
178     Evas_Object *button, void *event_info)
179 {
180     EflMultiLineCandidate *candidate =
181         (EflMultiLineCandidate *)data;
182     candidate->more_btn_released();
183 }
184 */
185
186 static void
187 ui_candidate_window_more_button_down_cb(void *data, Evas *e,
188     Evas_Object *button, void *event_info)
189 {
190     EflMultiLineCandidate *candidate =
191         (EflMultiLineCandidate *)data;
192     candidate->more_btn_clicked();
193 }
194
195 void
196 EflMultiLineCandidate::more_btn_released()
197 {
198     MultiEventDesc desc;
199     desc.type = MultiEventDesc::CANDIDATE_MORE_BTN_RELEASED;
200     notify_listeners(desc);
201 }
202
203 void
204 EflMultiLineCandidate::hide_more_view()
205 {
206     evas_object_hide(m_candidateMoreScrollerBg);
207     evas_object_hide(m_candidateMoreScroller);
208     evas_object_hide(m_candidateMoreTable);
209
210     MultiEventDesc desc;
211     desc.type = MultiEventDesc::CANDIDATE_MORE_VIEW_HIDE;
212
213     notify_listeners(desc);
214 }
215
216 void
217 EflMultiLineCandidate::show_more_view()
218 {
219     evas_object_show(m_candidateMoreScrollerBg);
220     evas_object_show(m_candidateMoreScroller);
221     evas_object_show(m_candidateMoreTable);
222     MultiEventDesc desc;
223     desc.type = MultiEventDesc::CANDIDATE_MORE_VIEW_SHOW;
224
225     notify_listeners(desc);
226 }
227
228 void
229 EflMultiLineCandidate::show_view()
230 {
231     evas_object_show(m_candidateScrollerBg);
232     evas_object_show(m_candidateScroller);
233     evas_object_show(m_candidateTable);
234 }
235
236 void
237 EflMultiLineCandidate::hide_view()
238 {
239     evas_object_hide(m_candidateMoreBtn);
240     evas_object_hide(m_candidateCloseBtn);
241     evas_object_hide(m_candidateScrollerBg);
242     evas_object_hide(m_candidateTable);
243     evas_object_hide(m_candidateScroller);
244 }
245
246 void
247 EflMultiLineCandidate::more_btn_clicked()
248 {
249     evas_object_hide(m_candidateMoreBtn);
250     evas_object_show(m_candidateCloseBtn);
251     show_more_view();
252
253     MultiEventDesc desc;
254     desc.type = MultiEventDesc::CANDIDATE_MORE_BTN_CLICKED;
255     notify_listeners(desc);
256 }
257
258 void
259 EflMultiLineCandidate::close_btn_clicked()
260 {
261     evas_object_hide(m_candidateCloseBtn);
262     evas_object_show(m_candidateMoreBtn);
263     hide_more_view();
264
265     // notify listeners
266     MultiEventDesc desc;
267     desc.type = MultiEventDesc::CANDIDATE_CLOSE_BTN_CLICKED;
268     notify_listeners(desc);
269 }
270
271 Evas_Object *
272 EflMultiLineCandidate::get_candidate_separate_line_vertical()
273 {
274     int ret = -1;
275
276     Evas_Object *edje = NULL;
277
278     edje = edje_object_add(evas_object_evas_get(m_window));
279     ret = edje_object_file_set(edje, CANDIDATE_EDJ_FILE_PATH, "seperate_line_vertical");
280     if (!ret) {
281         LOGW("getting seperate line failed.\n");
282         return NULL;
283     }
284     evas_object_show(edje);
285     evas_object_size_hint_min_set(edje, CANDIDATE_SEPARATE_WIDTH, CANDIDATE_SEPARATE_HEIGHT*m_screenRatio);
286
287     return edje;
288 }
289
290 Evas_Object *
291 EflMultiLineCandidate::get_candidate_separate_line_horizon()
292 {
293     int ret;
294     Evas_Object * edje = NULL;
295     edje = edje_object_add(evas_object_evas_get(m_window));
296     ret = edje_object_file_set(edje, CANDIDATE_EDJ_FILE_PATH, "seperate_line_horizon");
297     if (!ret) {
298         LOGW("getting seperate line failed.\n");
299         return NULL;
300     }
301     evas_object_show(edje);
302     evas_object_size_hint_min_set(edje, m_screenWidth, CANDIDATE_HORIZON_LINE_HEIGHT);
303     return edje;
304 }
305
306 void
307 EflMultiLineCandidate::make_more_view()
308 {
309     m_candidateMoreScrollerBg = edje_object_add(evas_object_evas_get((Evas_Object*)m_window));
310     edje_object_file_set(m_candidateMoreScrollerBg, CANDIDATE_EDJ_FILE_PATH, "scroller_bg");
311     evas_object_size_hint_weight_set(m_candidateMoreScrollerBg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
312     evas_object_resize(m_candidateMoreScrollerBg, m_screenWidth, m_screenHeight-CANDIDATE_WINDOW_HEIGHT*m_screenRatio);
313     if (m_floating_mode) {
314         evas_object_move(m_candidateMoreScrollerBg, 0, (CANDIDATE_WINDOW_HEIGHT*m_screenRatio)+FLOATING_TITLE_BAR_HEIGHT);
315     } else {
316         evas_object_move(m_candidateMoreScrollerBg, 0, CANDIDATE_WINDOW_HEIGHT*m_screenRatio);
317     }
318
319     m_candidateMoreScroller = elm_scroller_add((Evas_Object*)m_window);
320     elm_scroller_bounce_set(m_candidateMoreScroller, EINA_TRUE, EINA_FALSE);
321     elm_scroller_policy_set(m_candidateMoreScroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
322 #ifdef _WEARABLE
323     evas_object_resize(m_candidateMoreScroller, m_screenWidth -60, m_screenHeight-CANDIDATE_WINDOW_HEIGHT*m_screenRatio);
324     if (m_floating_mode)
325         evas_object_move(m_candidateMoreScroller, 0, (CANDIDATE_WINDOW_HEIGHT*m_screenRatio)+FLOATING_TITLE_BAR_HEIGHT);
326     else
327         evas_object_move(m_candidateMoreScroller, 30, CANDIDATE_WINDOW_HEIGHT*m_screenRatio);
328 #else
329     evas_object_resize(m_candidateMoreScroller, m_screenWidth, m_screenHeight-CANDIDATE_WINDOW_HEIGHT*m_screenRatio);
330     if (m_floating_mode)
331         evas_object_move(m_candidateMoreScroller, 0, (CANDIDATE_WINDOW_HEIGHT*m_screenRatio)+FLOATING_TITLE_BAR_HEIGHT);
332     else
333         evas_object_move(m_candidateMoreScroller, 0, CANDIDATE_WINDOW_HEIGHT*m_screenRatio);
334 #endif
335
336     m_candidateMoreTable = elm_table_add((Evas_Object*)m_window);
337     evas_object_size_hint_weight_set(m_candidateMoreTable, 0.0, 0.0);
338     evas_object_size_hint_align_set(m_candidateMoreTable, 0.0, 0.0);
339     elm_table_padding_set(m_candidateMoreTable, 0, 0);
340     elm_object_content_set(m_candidateMoreScroller, m_candidateMoreTable);
341
342     evas_object_layer_set(m_candidateMoreScrollerBg, 32000);
343     evas_object_layer_set(m_candidateMoreScroller, 32001);
344     evas_object_layer_set(m_candidateMoreTable, 32000);
345 }
346
347 void
348 EflMultiLineCandidate::make_view()
349 {
350     Evas_Coord scr_w, scr_h;
351     elm_win_screen_size_get(m_window, NULL, NULL, &scr_w, &scr_h);
352     m_screenWidth = scr_w;
353     m_screenHeight = scr_h;
354     double screenRatio_w = (double)scr_w/IME_UI_RESOLUTION_W;
355     double screenRatio_h = (double)scr_h/IME_UI_RESOLUTION_H;
356
357     read_ise_config_values();
358
359     CONFIG_VALUES *config_values = get_config_values();
360     if (config_values) {
361         m_floating_mode = config_values->floating_mode;
362     }
363
364     if (m_floating_mode) {
365         m_screenRatio = FLOATING_SCALE_RATE;
366         m_screenWidth *= m_screenRatio;
367     } else {
368         m_screenRatio = MAX(screenRatio_w, screenRatio_h);
369     }
370
371     m_candidateScrollerBg = edje_object_add(evas_object_evas_get((Evas_Object*)m_window));
372     edje_object_file_set(m_candidateScrollerBg, CANDIDATE_EDJ_FILE_PATH, "candidate_bg");
373     evas_object_size_hint_weight_set(m_candidateScrollerBg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
374     evas_object_resize(m_candidateScrollerBg, m_screenWidth, CANDIDATE_WINDOW_HEIGHT*m_screenRatio);
375     if (m_floating_mode)
376         evas_object_move(m_candidateScrollerBg, 0, FLOATING_TITLE_BAR_HEIGHT);
377     else
378         evas_object_move(m_candidateScrollerBg, 0, 0);
379
380     m_candidateScroller = elm_scroller_add(m_window);
381     elm_scroller_bounce_set(m_candidateScroller, EINA_TRUE, EINA_FALSE);
382     elm_scroller_policy_set(m_candidateScroller, ELM_SCROLLER_POLICY_AUTO, ELM_SCROLLER_POLICY_OFF);
383 #ifdef _WEARABLE
384     evas_object_resize(m_candidateScroller, m_screenWidth - 60, CANDIDATE_WINDOW_HEIGHT*m_screenRatio);
385     if (m_floating_mode)
386         evas_object_move(m_candidateScroller, 0, FLOATING_TITLE_BAR_HEIGHT);
387     else
388         evas_object_move(m_candidateScroller, 30, 0);
389 #else
390     evas_object_resize(m_candidateScroller, m_screenWidth, CANDIDATE_WINDOW_HEIGHT*m_screenRatio);
391     if (m_floating_mode)
392         evas_object_move(m_candidateScroller, 0, FLOATING_TITLE_BAR_HEIGHT);
393     else
394         evas_object_move(m_candidateScroller, 0, 0);
395 #endif
396
397     m_candidateTable = elm_table_add(m_window);
398     evas_object_size_hint_weight_set(m_candidateTable, 0.0, 0.0);
399 #ifdef _WEARABLE
400     evas_object_size_hint_align_set(m_candidateTable, 30.0/360, 330.0/360);
401 #else
402     evas_object_size_hint_align_set(m_candidateTable, 0.0, 0.0);
403 #endif
404     elm_table_padding_set(m_candidateTable, 0, 0);
405     elm_object_content_set(m_candidateScroller, m_candidateTable);
406
407     m_candidateMoreBtn = edje_object_add(evas_object_evas_get(m_window));
408     edje_object_file_set(m_candidateMoreBtn, CANDIDATE_EDJ_FILE_PATH, "more_button");
409     evas_object_size_hint_min_set(m_candidateMoreBtn, MORE_BUTTON_WIDTH*m_screenRatio, MORE_BUTTON_HEIGHT*m_screenRatio);
410     evas_object_resize(m_candidateMoreBtn, MORE_BUTTON_WIDTH*m_screenRatio, MORE_BUTTON_HEIGHT*m_screenRatio);
411 #ifdef _WEARABLE
412     if (m_floating_mode)
413         evas_object_move(m_candidateMoreBtn, m_screenWidth-MORE_BUTTON_WIDTH*m_screenRatio - 30,
414                          ((CANDIDATE_WINDOW_HEIGHT-MORE_BUTTON_HEIGHT)*m_screenRatio/2) + FLOATING_TITLE_BAR_HEIGHT);
415     else
416         evas_object_move(m_candidateMoreBtn, m_screenWidth-MORE_BUTTON_WIDTH*m_screenRatio - 30,
417                          (CANDIDATE_WINDOW_HEIGHT-MORE_BUTTON_HEIGHT)*m_screenRatio/2);
418 #else
419     if (m_floating_mode)
420         evas_object_move(m_candidateMoreBtn, m_screenWidth-MORE_BUTTON_WIDTH*m_screenRatio,
421                          ((CANDIDATE_WINDOW_HEIGHT-MORE_BUTTON_HEIGHT)*m_screenRatio/2) + FLOATING_TITLE_BAR_HEIGHT);
422     else
423         evas_object_move(m_candidateMoreBtn, m_screenWidth-MORE_BUTTON_WIDTH*m_screenRatio,
424                          (CANDIDATE_WINDOW_HEIGHT-MORE_BUTTON_HEIGHT)*m_screenRatio/2);
425 #endif
426     evas_object_event_callback_add(m_candidateMoreBtn, EVAS_CALLBACK_MOUSE_DOWN,
427                                    ui_candidate_window_more_button_down_cb, this);
428
429     m_candidateCloseBtn = edje_object_add(evas_object_evas_get(m_window));
430     edje_object_file_set(m_candidateCloseBtn, CANDIDATE_EDJ_FILE_PATH, "close_button");
431     evas_object_size_hint_min_set(m_candidateCloseBtn, MORE_BUTTON_WIDTH*m_screenRatio, MORE_BUTTON_HEIGHT*m_screenRatio);
432     evas_object_resize(m_candidateCloseBtn, MORE_BUTTON_WIDTH*m_screenRatio, MORE_BUTTON_HEIGHT*m_screenRatio);
433 #ifdef _WEARABLE
434     if (m_floating_mode)
435         evas_object_move(m_candidateCloseBtn, m_screenWidth-MORE_BUTTON_WIDTH*m_screenRatio - 30,
436                          ((CANDIDATE_WINDOW_HEIGHT-MORE_BUTTON_HEIGHT)*m_screenRatio/2) + FLOATING_TITLE_BAR_HEIGHT);
437     else
438         evas_object_move(m_candidateCloseBtn, m_screenWidth-MORE_BUTTON_WIDTH*m_screenRatio - 30,
439                          (CANDIDATE_WINDOW_HEIGHT-MORE_BUTTON_HEIGHT)*m_screenRatio/2);
440 #else
441     if (m_floating_mode)
442         evas_object_move(m_candidateCloseBtn, m_screenWidth-MORE_BUTTON_WIDTH*m_screenRatio,
443                          ((CANDIDATE_WINDOW_HEIGHT-MORE_BUTTON_HEIGHT)*m_screenRatio/2) + FLOATING_TITLE_BAR_HEIGHT);
444     else
445         evas_object_move(m_candidateCloseBtn, m_screenWidth-MORE_BUTTON_WIDTH*m_screenRatio,
446                          (CANDIDATE_WINDOW_HEIGHT-MORE_BUTTON_HEIGHT)*m_screenRatio/2);
447 #endif
448     evas_object_event_callback_add(m_candidateCloseBtn, EVAS_CALLBACK_MOUSE_DOWN,
449                                    ui_candidate_window_close_button_down_cb, this);
450
451     evas_object_layer_set(m_candidateScrollerBg, 32000);
452     evas_object_layer_set(m_candidateScroller, 32000);
453     evas_object_layer_set(m_candidateMoreBtn, 32000);
454     evas_object_layer_set(m_candidateCloseBtn, 32000);
455 }
456
457 EflMultiLineCandidate::EflMultiLineCandidate(Evas_Object *window)
458 {
459     m_degree = 0;
460     m_screenWidth = 0;
461     m_screenHeight = 0;
462     m_screenRatio = 1.0;
463     m_floating_mode = false;
464     m_window = window;
465     m_candidateScrollerBg = NULL;
466     m_candidateScroller = NULL;
467     m_candidateTable = NULL;
468     m_candidateMoreBtn = NULL;
469     m_candidateCloseBtn = NULL;
470     m_candidateMoreScrollerBg = NULL;
471     m_candidateMoreScroller = NULL;
472     m_candidateMoreTable = NULL;
473
474     make_view();
475     make_more_view();
476     m_candidateFontName = string("Tizen");
477     m_candidateFontSize = 37*m_screenRatio;
478     m_stringWidthCalObj = evas_object_text_add(m_window);
479     evas_object_text_font_set(m_stringWidthCalObj, m_candidateFontName.c_str(), m_candidateFontSize);
480 #ifdef _TV
481     m_focused_candidate_index = 0;
482     m_highlight_mode = false;
483 #endif
484 }
485
486 EflMultiLineCandidate::~EflMultiLineCandidate()
487 {
488     if (m_candidateTable)
489         elm_table_clear(m_candidateTable, EINA_TRUE);
490
491     if (m_candidateMoreTable)
492         elm_table_clear(m_candidateMoreTable, EINA_TRUE);
493
494     if (m_stringWidthCalObj)
495         evas_object_del(m_stringWidthCalObj);
496
497     if (m_candidateScrollerBg)
498         evas_object_del(m_candidateScrollerBg);
499
500     if (m_candidateScroller)
501         evas_object_del(m_candidateScroller);
502
503     if (m_candidateTable)
504         evas_object_del(m_candidateTable);
505
506     if (m_candidateMoreBtn)
507         evas_object_del(m_candidateMoreBtn);
508
509     if (m_candidateCloseBtn)
510         evas_object_del(m_candidateCloseBtn);
511
512     if (m_candidateMoreScrollerBg)
513         evas_object_del(m_candidateMoreScrollerBg);
514
515     if (m_candidateMoreScroller)
516         evas_object_del(m_candidateMoreScroller);
517
518     if (m_candidateMoreTable)
519         evas_object_del(m_candidateMoreTable);
520 }
521
522 void
523 EflMultiLineCandidate::show()
524 {
525     show_view();
526     m_visible = true;
527 }
528
529 void
530 EflMultiLineCandidate::hide()
531 {
532     hide_view();
533     hide_more_view();
534     m_visible = false;
535 }
536
537 candidate_item_size
538 EflMultiLineCandidate::get_candidate_item_text_size(string srcStr)
539 {
540     evas_object_text_font_set(m_stringWidthCalObj, m_candidateFontName.c_str(), m_candidateFontSize);
541     evas_object_text_text_set(m_stringWidthCalObj, srcStr.c_str());
542     candidate_item_size item_text_size = {0, 0};
543     evas_object_geometry_get(m_stringWidthCalObj, NULL, NULL, &item_text_size.width, &item_text_size.height);
544 //    int candidate_item_min = (m_screenWidth - MORE_BUTTON_WIDTH)/CANDIDATE_ITEMS_NUM;
545     item_text_size.width += CANDIDATE_ITEM_BLANK * m_screenRatio * 2;
546     item_text_size.width = MIN(item_text_size.width, m_screenWidth-MORE_BUTTON_WIDTH*m_screenRatio);
547     return item_text_size;
548 }
549
550 static Eina_Bool
551 _item_access_action(void *data, Evas_Object *access_object, Elm_Access_Action_Info *action_info)
552 {
553     const char * name = elm_atspi_accessible_name_get(access_object);
554     LOGD("access_action callback on item: %s", name);
555     if (!name)
556         return EINA_FALSE;
557
558     EflMultiLineCandidate *candidate = (EflMultiLineCandidate *)data;
559     candidate->item_pressed(name);
560     return EINA_TRUE;
561 }
562
563 void
564 EflMultiLineCandidate::register_access_object(Evas_Object* obj, std::string name, const Elm_Access_Action_Cb access_action, const void *data)
565 {
566     Evas_Object * access_object = elm_access_object_register(obj, m_window);
567     if (!access_object)
568         return;
569     elm_atspi_accessible_name_set(access_object, name.c_str());
570     elm_atspi_accessible_role_set(access_object, ELM_ATSPI_ROLE_PUSH_BUTTON);
571     if (access_action)
572         elm_access_action_cb_set(access_object, ELM_ACCESS_ACTION_ACTIVATE, access_action, data);
573 }
574
575
576 void
577 EflMultiLineCandidate::update(const vector<string> &vec_str)
578 {
579     cur_candidates = vec_str;
580 #ifdef _TV
581     m_focused_candidate_index = 0;
582     m_candidates_item.clear();
583 #endif
584     hide_more_view();
585     evas_object_hide(m_candidateMoreBtn);
586     evas_object_hide(m_candidateCloseBtn);
587
588     elm_table_clear(m_candidateTable, EINA_TRUE);
589     elm_table_clear(m_candidateMoreTable, EINA_TRUE);
590
591     int cur_item_sum = 0;
592     //int item_num = vec_str.size();
593     int item_num = (vec_str.size() > 20 ? 20 : vec_str.size());//for fixing lagging issue of glm temporarily
594     bool multiline = false;
595     int lineCount = 0;
596     for (int i = 0; i < item_num; ++i)
597     {
598         candidate_item_size item_text_size = get_candidate_item_text_size(vec_str[i]);
599 #ifdef _WEARABLE
600         if ((!multiline) && (cur_item_sum + item_text_size.width < m_screenWidth - 60 - MORE_BUTTON_WIDTH*m_screenRatio))
601 #else
602         if ((!multiline) && (cur_item_sum + item_text_size.width < m_screenWidth - MORE_BUTTON_WIDTH*m_screenRatio))
603 #endif
604         {
605             int y_start = 0;
606             if (0 != cur_item_sum)
607             {
608                 Evas_Object *vertical_seperate = get_candidate_separate_line_vertical();
609                 y_start = (CANDIDATE_WINDOW_HEIGHT - CANDIDATE_SEPARATE_HEIGHT)*m_screenRatio / 2;
610                 elm_table_pack(m_candidateTable, vertical_seperate, cur_item_sum, y_start,
611                                CANDIDATE_SEPARATE_WIDTH, CANDIDATE_SEPARATE_HEIGHT*m_screenRatio);
612                 cur_item_sum += CANDIDATE_SEPARATE_WIDTH;
613             }
614             Evas_Object *item = get_candidate_item(item_text_size);
615             edje_object_part_text_set(item, "candidate", vec_str[i].c_str());
616             register_access_object(item, vec_str[i], _item_access_action, this);
617             y_start = (CANDIDATE_WINDOW_HEIGHT*m_screenRatio - item_text_size.height)/2;
618             elm_table_pack(m_candidateTable, item, cur_item_sum, y_start,
619                            item_text_size.width, item_text_size.height);
620             cur_item_sum += item_text_size.width;
621 #ifdef _TV
622             m_candidates_item.push_back(item);
623 #endif
624         } else if (!multiline) {
625             multiline = true;
626             cur_item_sum = 0;
627             if (0 == i)
628             {
629                 int y_start = 0;
630                 Evas_Object *item = get_candidate_item(item_text_size);
631                 edje_object_part_text_set(item, "candidate", vec_str[i].c_str());
632                 register_access_object(item, vec_str[i], _item_access_action, this);
633                 y_start = (CANDIDATE_WINDOW_HEIGHT*m_screenRatio - item_text_size.height)/2;
634                 elm_table_pack(m_candidateTable, item, cur_item_sum, y_start,
635                                item_text_size.width, item_text_size.height);
636 #ifdef _TV
637                 m_candidates_item.push_back(item);
638 #endif
639                 continue;
640             }
641         }
642
643         if (multiline)
644         {
645 #ifdef _WEARABLE
646             if (cur_item_sum + item_text_size.width > m_screenWidth - 60)
647 #else
648             if (cur_item_sum + item_text_size.width > m_screenWidth)
649 #endif
650             {
651                 cur_item_sum = 0;
652                 lineCount++;
653             }
654
655             int y_start = 0;
656             if (0 != cur_item_sum)
657             {
658                 Evas_Object *vertical_seperate = get_candidate_separate_line_vertical();
659                 y_start = (CANDIDATE_WINDOW_HEIGHT - CANDIDATE_SEPARATE_HEIGHT)*m_screenRatio / 2;
660                 elm_table_pack(m_candidateMoreTable, vertical_seperate, cur_item_sum,
661                         lineCount*CANDIDATE_WINDOW_HEIGHT*m_screenRatio+(lineCount+1)*CANDIDATE_HORIZON_LINE_HEIGHT+y_start,
662                         CANDIDATE_SEPARATE_WIDTH, CANDIDATE_SEPARATE_HEIGHT*m_screenRatio);
663                 cur_item_sum += CANDIDATE_SEPARATE_WIDTH;
664             } else {
665                 Evas_Object *horizon_seperate = get_candidate_separate_line_horizon();
666                 y_start = lineCount*(CANDIDATE_WINDOW_HEIGHT*m_screenRatio+CANDIDATE_HORIZON_LINE_HEIGHT);
667                 elm_table_pack(m_candidateMoreTable, horizon_seperate, cur_item_sum, y_start,
668                         m_screenWidth, CANDIDATE_HORIZON_LINE_HEIGHT);
669             }
670
671             Evas_Object *item = get_candidate_item(item_text_size);
672             edje_object_part_text_set(item, "candidate", vec_str[i].c_str());
673             y_start = (CANDIDATE_WINDOW_HEIGHT*m_screenRatio - item_text_size.height)/2;
674             elm_table_pack(m_candidateMoreTable, item, cur_item_sum, lineCount*CANDIDATE_WINDOW_HEIGHT*m_screenRatio+y_start,
675                            item_text_size.width, item_text_size.height);
676             cur_item_sum += item_text_size.width;
677 #ifdef _TV
678             m_candidates_item.push_back(item);
679 #endif
680         }
681     }
682
683     if (multiline)
684     {
685         evas_object_show(m_candidateMoreBtn);
686     }
687 }
688
689 void
690 EflMultiLineCandidate::rotate(int degree)
691 {
692     m_degree = degree;
693
694     Evas_Coord scr_w, scr_h;
695     elm_win_screen_size_get(m_window, NULL, NULL, &scr_w, &scr_h);
696     m_screenWidth = scr_w;
697     m_screenHeight = scr_h;
698     bool landscape_display_device = false;
699
700     if (scr_w > scr_h)
701         landscape_display_device = true;
702
703     switch (degree) {
704         case 0:
705         case 180:
706             if (landscape_display_device) {
707                 m_screenWidth = MAX(scr_w, scr_h);
708                 m_screenHeight = MIN(scr_w, scr_h);
709             }
710             else {
711                 m_screenWidth = MIN(scr_w, scr_h);
712                 m_screenHeight = MAX(scr_w, scr_h);
713             }
714             break;
715         case 90:
716         case 270:
717             if (landscape_display_device) {
718                 m_screenWidth = MIN(scr_w, scr_h);
719                 m_screenHeight = MAX(scr_w, scr_h);
720             }
721             else {
722                 m_screenWidth = MAX(scr_w, scr_h);
723                 m_screenHeight = MIN(scr_w, scr_h);
724             }
725             break;
726         default:
727             break;
728     }
729
730     if (m_floating_mode)
731         m_screenWidth *= m_screenRatio;
732
733 #ifdef _TV
734     int temp = m_screenWidth;
735     m_screenWidth = m_screenHeight;
736     m_screenHeight = temp;
737 #endif
738
739     evas_object_resize(m_candidateScrollerBg, m_screenWidth, CANDIDATE_WINDOW_HEIGHT*m_screenRatio);
740     evas_object_resize(m_candidateScroller, m_screenWidth, CANDIDATE_WINDOW_HEIGHT*m_screenRatio);
741     evas_object_resize(m_candidateMoreScrollerBg, m_screenWidth, m_screenHeight-CANDIDATE_WINDOW_HEIGHT*m_screenRatio);
742     evas_object_resize(m_candidateMoreScroller, m_screenWidth, m_screenHeight-CANDIDATE_WINDOW_HEIGHT*m_screenRatio);
743     if (m_floating_mode) {
744         evas_object_move(m_candidateMoreBtn, m_screenWidth-MORE_BUTTON_WIDTH*m_screenRatio,
745                          ((CANDIDATE_WINDOW_HEIGHT-MORE_BUTTON_HEIGHT)*m_screenRatio/2) + FLOATING_TITLE_BAR_HEIGHT);
746         evas_object_move(m_candidateCloseBtn, m_screenWidth-MORE_BUTTON_WIDTH*m_screenRatio,
747                          ((CANDIDATE_WINDOW_HEIGHT-MORE_BUTTON_HEIGHT)*m_screenRatio/2) + FLOATING_TITLE_BAR_HEIGHT);
748     } else {
749         evas_object_move(m_candidateMoreBtn, m_screenWidth-MORE_BUTTON_WIDTH*m_screenRatio,
750                          (CANDIDATE_WINDOW_HEIGHT-MORE_BUTTON_HEIGHT)*m_screenRatio/2);
751         evas_object_move(m_candidateCloseBtn, m_screenWidth-MORE_BUTTON_WIDTH*m_screenRatio,
752                          (CANDIDATE_WINDOW_HEIGHT-MORE_BUTTON_HEIGHT)*m_screenRatio/2);
753     }
754 }
755
756 int
757 EflMultiLineCandidate::get_height()
758 {
759     return CANDIDATE_WINDOW_HEIGHT*m_screenRatio;
760 }
761
762 bool
763 EflMultiLineCandidate::get_floating_mode()
764 {
765     return m_floating_mode;
766 }
767
768 #ifdef _TV
769 sclu32 EflMultiLineCandidate::soft_candidate_handle_key_event(const char *keyname)
770 {
771     int count = (cur_candidates.size() > 20 ? 20 : cur_candidates.size());//for fixing lagging issue of glm temporarily
772     int index = 0;
773     if (strcmp(keyname, "Right") == 0) {
774         if (m_highlight_mode) {
775             index = (m_focused_candidate_index + 1) %count;
776             Evas_Object *item = m_candidates_item[m_focused_candidate_index];
777             edje_object_signal_emit(item, "unhighlight", "bg");
778             item = m_candidates_item[index];
779             edje_object_signal_emit(item, "highlight", "bg");
780             m_focused_candidate_index = index;
781             return true;
782         } else {
783             return false;
784         }
785     } else if (strcmp(keyname, "Left") == 0) {
786         if (m_highlight_mode) {
787             index = (m_focused_candidate_index + count - 1) % count;
788             Evas_Object *item = m_candidates_item[m_focused_candidate_index];
789             edje_object_signal_emit(item, "unhighlight", "bg");
790             item = m_candidates_item[index];
791             edje_object_signal_emit(item, "highlight", "bg");
792             m_focused_candidate_index = index;
793             return true;
794         } else {
795             return false;
796         }
797     } else if (strcmp(keyname, "Up") == 0) {
798         int item_num = m_candidates_item.size();
799         if (item_num > 0) {
800             more_btn_clicked();
801             CSCLUI *ui = get_ui();
802             if (ui) ui->enable_highlight_ui(FALSE);
803             Evas_Object *item = m_candidates_item[m_focused_candidate_index];
804             edje_object_signal_emit(item, "highlight", "bg");
805             m_highlight_mode = true;
806         }
807             return true;
808     } else if (strcmp(keyname, "Down") == 0) {
809         if (m_highlight_mode) {
810             int item_num = m_candidates_item.size();
811             if (item_num > 0) {
812                 Evas_Object *item = m_candidates_item[m_focused_candidate_index];
813                 edje_object_signal_emit(item, "unhighlight", "bg");
814                 close_btn_clicked();
815                 CSCLUI *ui = get_ui();
816                 if (ui) ui->enable_highlight_ui(TRUE);
817                 m_highlight_mode = false;
818                 return TRUE;
819             } else {
820                 return false;
821             }
822         } else {
823             return false;
824         }
825     } else if ((strcmp(keyname, "Return") == 0) || (strcmp(keyname, "Enter") == 0)) {
826         if (m_highlight_mode) {
827             engine_loader_select_candidate(m_focused_candidate_index);
828             m_candidates_item.clear();
829             CSCLUI *ui = get_ui();
830             if (ui) ui->enable_highlight_ui(TRUE);
831             m_highlight_mode = false;
832             return true;
833         } else {
834             return false;
835         }
836     } else {
837         return false;
838     }
839 }
840 #endif