688237c1998ef7e5f2d03cf044ed569fd8bd7b9d
[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 Evas_Object *
348 EflMultiLineCandidate::create_candidate_button(const char *style, Evas_Object_Event_Cb mouse_down_cb)
349 {
350     Evas_Object *candidateBtn = edje_object_add(evas_object_evas_get(m_window));
351     edje_object_file_set(candidateBtn, CANDIDATE_EDJ_FILE_PATH, style);
352     evas_object_size_hint_min_set(candidateBtn, MORE_BUTTON_WIDTH*m_screenRatio, MORE_BUTTON_HEIGHT*m_screenRatio);
353     evas_object_resize(candidateBtn, MORE_BUTTON_WIDTH*m_screenRatio, MORE_BUTTON_HEIGHT*m_screenRatio);
354 #ifdef _WEARABLE
355     if (m_floating_mode)
356         evas_object_move(candidateBtn, m_screenWidth-MORE_BUTTON_WIDTH*m_screenRatio - 30,
357                          ((CANDIDATE_WINDOW_HEIGHT-MORE_BUTTON_HEIGHT)*m_screenRatio/2) + FLOATING_TITLE_BAR_HEIGHT);
358     else
359         evas_object_move(candidateBtn, m_screenWidth-MORE_BUTTON_WIDTH*m_screenRatio - 30,
360                          (CANDIDATE_WINDOW_HEIGHT-MORE_BUTTON_HEIGHT)*m_screenRatio/2);
361 #else
362     if (m_floating_mode)
363         evas_object_move(candidateBtn, m_screenWidth-MORE_BUTTON_WIDTH*m_screenRatio,
364                          ((CANDIDATE_WINDOW_HEIGHT-MORE_BUTTON_HEIGHT)*m_screenRatio/2) + FLOATING_TITLE_BAR_HEIGHT);
365     else
366         evas_object_move(candidateBtn, m_screenWidth-MORE_BUTTON_WIDTH*m_screenRatio,
367                          (CANDIDATE_WINDOW_HEIGHT-MORE_BUTTON_HEIGHT)*m_screenRatio/2);
368 #endif
369     evas_object_event_callback_add(candidateBtn, EVAS_CALLBACK_MOUSE_DOWN,
370                                    mouse_down_cb, this);
371
372     LOGD("Created candidate button (%s)", style);
373
374     return candidateBtn;
375 }
376
377 void
378 EflMultiLineCandidate::make_view()
379 {
380     Evas_Coord scr_w, scr_h;
381     elm_win_screen_size_get(m_window, NULL, NULL, &scr_w, &scr_h);
382     m_screenWidth = scr_w;
383     m_screenHeight = scr_h;
384     double screenRatio_w = (double)scr_w/IME_UI_RESOLUTION_W;
385     double screenRatio_h = (double)scr_h/IME_UI_RESOLUTION_H;
386
387     read_ise_config_values();
388
389     CONFIG_VALUES *config_values = get_config_values();
390     if (config_values) {
391         m_floating_mode = config_values->floating_mode;
392     }
393
394     if (m_floating_mode) {
395         m_screenRatio = FLOATING_SCALE_RATE;
396         m_screenWidth *= m_screenRatio;
397     } else {
398         m_screenRatio = MAX(screenRatio_w, screenRatio_h);
399     }
400
401     m_candidateScrollerBg = edje_object_add(evas_object_evas_get((Evas_Object*)m_window));
402     edje_object_file_set(m_candidateScrollerBg, CANDIDATE_EDJ_FILE_PATH, "candidate_bg");
403     evas_object_size_hint_weight_set(m_candidateScrollerBg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
404     evas_object_resize(m_candidateScrollerBg, m_screenWidth, CANDIDATE_WINDOW_HEIGHT*m_screenRatio);
405     if (m_floating_mode)
406         evas_object_move(m_candidateScrollerBg, 0, FLOATING_TITLE_BAR_HEIGHT);
407     else
408         evas_object_move(m_candidateScrollerBg, 0, 0);
409
410     m_candidateScroller = elm_scroller_add(m_window);
411     elm_scroller_bounce_set(m_candidateScroller, EINA_TRUE, EINA_FALSE);
412     elm_scroller_policy_set(m_candidateScroller, ELM_SCROLLER_POLICY_AUTO, ELM_SCROLLER_POLICY_OFF);
413 #ifdef _WEARABLE
414     evas_object_resize(m_candidateScroller, m_screenWidth - 60, CANDIDATE_WINDOW_HEIGHT*m_screenRatio);
415     if (m_floating_mode)
416         evas_object_move(m_candidateScroller, 0, FLOATING_TITLE_BAR_HEIGHT);
417     else
418         evas_object_move(m_candidateScroller, 30, 0);
419 #else
420     evas_object_resize(m_candidateScroller, m_screenWidth, CANDIDATE_WINDOW_HEIGHT*m_screenRatio);
421     if (m_floating_mode)
422         evas_object_move(m_candidateScroller, 0, FLOATING_TITLE_BAR_HEIGHT);
423     else
424         evas_object_move(m_candidateScroller, 0, 0);
425 #endif
426
427     m_candidateTable = elm_table_add(m_window);
428     evas_object_size_hint_weight_set(m_candidateTable, 0.0, 0.0);
429 #ifdef _WEARABLE
430     evas_object_size_hint_align_set(m_candidateTable, 30.0/360, 330.0/360);
431 #else
432     evas_object_size_hint_align_set(m_candidateTable, 0.0, 0.0);
433 #endif
434     elm_table_padding_set(m_candidateTable, 0, 0);
435     elm_object_content_set(m_candidateScroller, m_candidateTable);
436
437     m_candidateMoreBtn = create_candidate_button("more_button", ui_candidate_window_more_button_down_cb);
438     m_candidateCloseBtn = create_candidate_button("close_button", ui_candidate_window_close_button_down_cb);
439
440     evas_object_layer_set(m_candidateScrollerBg, 32000);
441     evas_object_layer_set(m_candidateScroller, 32000);
442     evas_object_layer_set(m_candidateMoreBtn, 32000);
443     evas_object_layer_set(m_candidateCloseBtn, 32000);
444 }
445
446 EflMultiLineCandidate::EflMultiLineCandidate(Evas_Object *window)
447 {
448     m_degree = 0;
449     m_screenWidth = 0;
450     m_screenHeight = 0;
451     m_screenRatio = 1.0;
452     m_floating_mode = false;
453     m_window = window;
454     m_candidateScrollerBg = NULL;
455     m_candidateScroller = NULL;
456     m_candidateTable = NULL;
457     m_candidateMoreBtn = NULL;
458     m_candidateCloseBtn = NULL;
459     m_candidateMoreScrollerBg = NULL;
460     m_candidateMoreScroller = NULL;
461     m_candidateMoreTable = NULL;
462
463     make_view();
464     make_more_view();
465     m_candidateFontName = string("Tizen");
466     m_candidateFontSize = 37*m_screenRatio;
467     m_stringWidthCalObj = evas_object_text_add(m_window);
468     evas_object_text_font_set(m_stringWidthCalObj, m_candidateFontName.c_str(), m_candidateFontSize);
469 #ifdef _TV
470     m_focused_candidate_index = 0;
471     m_highlight_mode = false;
472 #endif
473 }
474
475 EflMultiLineCandidate::~EflMultiLineCandidate()
476 {
477     if (m_candidateTable)
478         elm_table_clear(m_candidateTable, EINA_TRUE);
479
480     if (m_candidateMoreTable)
481         elm_table_clear(m_candidateMoreTable, EINA_TRUE);
482
483     if (m_stringWidthCalObj)
484         evas_object_del(m_stringWidthCalObj);
485
486     if (m_candidateScrollerBg)
487         evas_object_del(m_candidateScrollerBg);
488
489     if (m_candidateScroller)
490         evas_object_del(m_candidateScroller);
491
492     if (m_candidateTable)
493         evas_object_del(m_candidateTable);
494
495     if (m_candidateMoreBtn)
496         evas_object_del(m_candidateMoreBtn);
497
498     if (m_candidateCloseBtn)
499         evas_object_del(m_candidateCloseBtn);
500
501     if (m_candidateMoreScrollerBg)
502         evas_object_del(m_candidateMoreScrollerBg);
503
504     if (m_candidateMoreScroller)
505         evas_object_del(m_candidateMoreScroller);
506
507     if (m_candidateMoreTable)
508         evas_object_del(m_candidateMoreTable);
509 }
510
511 void
512 EflMultiLineCandidate::show()
513 {
514     show_view();
515     m_visible = true;
516 }
517
518 void
519 EflMultiLineCandidate::hide()
520 {
521     hide_view();
522     hide_more_view();
523     m_visible = false;
524 }
525
526 candidate_item_size
527 EflMultiLineCandidate::get_candidate_item_text_size(string srcStr)
528 {
529     evas_object_text_font_set(m_stringWidthCalObj, m_candidateFontName.c_str(), m_candidateFontSize);
530     evas_object_text_text_set(m_stringWidthCalObj, srcStr.c_str());
531     candidate_item_size item_text_size = {0, 0};
532     evas_object_geometry_get(m_stringWidthCalObj, NULL, NULL, &item_text_size.width, &item_text_size.height);
533 //    int candidate_item_min = (m_screenWidth - MORE_BUTTON_WIDTH)/CANDIDATE_ITEMS_NUM;
534     item_text_size.width += CANDIDATE_ITEM_BLANK * m_screenRatio * 2;
535     item_text_size.width = MIN(item_text_size.width, m_screenWidth-MORE_BUTTON_WIDTH*m_screenRatio);
536     return item_text_size;
537 }
538
539 static Eina_Bool
540 _item_access_action(void *data, Evas_Object *access_object, Elm_Access_Action_Info *action_info)
541 {
542     const char * name = elm_atspi_accessible_name_get(access_object);
543     LOGD("access_action callback on item: %s", name);
544     if (!name)
545         return EINA_FALSE;
546
547     EflMultiLineCandidate *candidate = (EflMultiLineCandidate *)data;
548     candidate->item_pressed(name);
549     return EINA_TRUE;
550 }
551
552 void
553 EflMultiLineCandidate::register_access_object(Evas_Object* obj, std::string name, const Elm_Access_Action_Cb access_action, const void *data)
554 {
555     Evas_Object * access_object = elm_access_object_register(obj, m_window);
556     if (!access_object)
557         return;
558     elm_atspi_accessible_name_set(access_object, name.c_str());
559     elm_atspi_accessible_role_set(access_object, ELM_ATSPI_ROLE_PUSH_BUTTON);
560     if (access_action)
561         elm_access_action_cb_set(access_object, ELM_ACCESS_ACTION_ACTIVATE, access_action, data);
562 }
563
564 void
565 EflMultiLineCandidate::update(const vector<string> &vec_str)
566 {
567     cur_candidates = vec_str;
568 #ifdef _TV
569     m_focused_candidate_index = 0;
570     m_candidates_item.clear();
571 #endif
572     hide_more_view();
573     evas_object_hide(m_candidateMoreBtn);
574     evas_object_hide(m_candidateCloseBtn);
575
576     elm_table_clear(m_candidateTable, EINA_TRUE);
577     elm_table_clear(m_candidateMoreTable, EINA_TRUE);
578
579     int cur_item_sum = 0;
580     //int item_num = vec_str.size();
581     int item_num = (vec_str.size() > 20 ? 20 : vec_str.size());//for fixing lagging issue of glm temporarily
582     bool multiline = false;
583     int lineCount = 0;
584     for (int i = 0; i < item_num; ++i)
585     {
586         candidate_item_size item_text_size = get_candidate_item_text_size(vec_str[i]);
587 #ifdef _WEARABLE
588         if ((!multiline) && (cur_item_sum + item_text_size.width < m_screenWidth - 60 - MORE_BUTTON_WIDTH*m_screenRatio))
589 #else
590         if ((!multiline) && (cur_item_sum + item_text_size.width < m_screenWidth - MORE_BUTTON_WIDTH*m_screenRatio))
591 #endif
592         {
593             int y_start = 0;
594             if (0 != cur_item_sum)
595             {
596                 Evas_Object *vertical_seperate = get_candidate_separate_line_vertical();
597                 y_start = (CANDIDATE_WINDOW_HEIGHT - CANDIDATE_SEPARATE_HEIGHT)*m_screenRatio / 2;
598                 elm_table_pack(m_candidateTable, vertical_seperate, cur_item_sum, y_start,
599                                CANDIDATE_SEPARATE_WIDTH, CANDIDATE_SEPARATE_HEIGHT*m_screenRatio);
600                 cur_item_sum += CANDIDATE_SEPARATE_WIDTH;
601             }
602             Evas_Object *item = get_candidate_item(item_text_size);
603             edje_object_part_text_set(item, "candidate", vec_str[i].c_str());
604             register_access_object(item, vec_str[i], _item_access_action, this);
605             y_start = (CANDIDATE_WINDOW_HEIGHT*m_screenRatio - item_text_size.height)/2;
606             elm_table_pack(m_candidateTable, item, cur_item_sum, y_start,
607                            item_text_size.width, item_text_size.height);
608             cur_item_sum += item_text_size.width;
609 #ifdef _TV
610             m_candidates_item.push_back(item);
611 #endif
612         } else if (!multiline) {
613             multiline = true;
614             cur_item_sum = 0;
615             if (0 == i)
616             {
617                 int y_start = 0;
618                 Evas_Object *item = get_candidate_item(item_text_size);
619                 edje_object_part_text_set(item, "candidate", vec_str[i].c_str());
620                 register_access_object(item, vec_str[i], _item_access_action, this);
621                 y_start = (CANDIDATE_WINDOW_HEIGHT*m_screenRatio - item_text_size.height)/2;
622                 elm_table_pack(m_candidateTable, item, cur_item_sum, y_start,
623                                item_text_size.width, item_text_size.height);
624 #ifdef _TV
625                 m_candidates_item.push_back(item);
626 #endif
627                 continue;
628             }
629         }
630
631         if (multiline)
632         {
633 #ifdef _WEARABLE
634             if (cur_item_sum + item_text_size.width > m_screenWidth - 60)
635 #else
636             if (cur_item_sum + item_text_size.width > m_screenWidth)
637 #endif
638             {
639                 cur_item_sum = 0;
640                 lineCount++;
641             }
642
643             int y_start = 0;
644             if (0 != cur_item_sum)
645             {
646                 Evas_Object *vertical_seperate = get_candidate_separate_line_vertical();
647                 y_start = (CANDIDATE_WINDOW_HEIGHT - CANDIDATE_SEPARATE_HEIGHT)*m_screenRatio / 2;
648                 elm_table_pack(m_candidateMoreTable, vertical_seperate, cur_item_sum,
649                         lineCount*CANDIDATE_WINDOW_HEIGHT*m_screenRatio+(lineCount+1)*CANDIDATE_HORIZON_LINE_HEIGHT+y_start,
650                         CANDIDATE_SEPARATE_WIDTH, CANDIDATE_SEPARATE_HEIGHT*m_screenRatio);
651                 cur_item_sum += CANDIDATE_SEPARATE_WIDTH;
652             } else {
653                 Evas_Object *horizon_seperate = get_candidate_separate_line_horizon();
654                 y_start = lineCount*(CANDIDATE_WINDOW_HEIGHT*m_screenRatio+CANDIDATE_HORIZON_LINE_HEIGHT);
655                 elm_table_pack(m_candidateMoreTable, horizon_seperate, cur_item_sum, y_start,
656                         m_screenWidth, CANDIDATE_HORIZON_LINE_HEIGHT);
657             }
658
659             Evas_Object *item = get_candidate_item(item_text_size);
660             edje_object_part_text_set(item, "candidate", vec_str[i].c_str());
661             y_start = (CANDIDATE_WINDOW_HEIGHT*m_screenRatio - item_text_size.height)/2;
662             elm_table_pack(m_candidateMoreTable, item, cur_item_sum, lineCount*CANDIDATE_WINDOW_HEIGHT*m_screenRatio+y_start,
663                            item_text_size.width, item_text_size.height);
664             cur_item_sum += item_text_size.width;
665 #ifdef _TV
666             m_candidates_item.push_back(item);
667 #endif
668         }
669     }
670
671     if (multiline)
672     {
673         evas_object_show(m_candidateMoreBtn);
674     }
675 }
676
677 void
678 EflMultiLineCandidate::rotate(int degree)
679 {
680     m_degree = degree;
681
682     Evas_Coord scr_w, scr_h;
683     elm_win_screen_size_get(m_window, NULL, NULL, &scr_w, &scr_h);
684     m_screenWidth = scr_w;
685     m_screenHeight = scr_h;
686     bool landscape_display_device = false;
687
688     if (scr_w > scr_h)
689         landscape_display_device = true;
690
691     switch (degree) {
692         case 0:
693         case 180:
694             if (landscape_display_device) {
695                 m_screenWidth = MAX(scr_w, scr_h);
696                 m_screenHeight = MIN(scr_w, scr_h);
697             }
698             else {
699                 m_screenWidth = MIN(scr_w, scr_h);
700                 m_screenHeight = MAX(scr_w, scr_h);
701             }
702             break;
703         case 90:
704         case 270:
705             if (landscape_display_device) {
706                 m_screenWidth = MIN(scr_w, scr_h);
707                 m_screenHeight = MAX(scr_w, scr_h);
708             }
709             else {
710                 m_screenWidth = MAX(scr_w, scr_h);
711                 m_screenHeight = MIN(scr_w, scr_h);
712             }
713             break;
714         default:
715             break;
716     }
717
718     if (m_floating_mode)
719         m_screenWidth *= m_screenRatio;
720
721 #ifdef _TV
722     int temp = m_screenWidth;
723     m_screenWidth = m_screenHeight;
724     m_screenHeight = temp;
725 #endif
726
727     evas_object_resize(m_candidateScrollerBg, m_screenWidth, CANDIDATE_WINDOW_HEIGHT*m_screenRatio);
728     evas_object_resize(m_candidateScroller, m_screenWidth, CANDIDATE_WINDOW_HEIGHT*m_screenRatio);
729     evas_object_resize(m_candidateMoreScrollerBg, m_screenWidth, m_screenHeight-CANDIDATE_WINDOW_HEIGHT*m_screenRatio);
730     evas_object_resize(m_candidateMoreScroller, m_screenWidth, m_screenHeight-CANDIDATE_WINDOW_HEIGHT*m_screenRatio);
731     if (m_floating_mode) {
732         evas_object_move(m_candidateMoreBtn, m_screenWidth-MORE_BUTTON_WIDTH*m_screenRatio,
733                          ((CANDIDATE_WINDOW_HEIGHT-MORE_BUTTON_HEIGHT)*m_screenRatio/2) + FLOATING_TITLE_BAR_HEIGHT);
734         evas_object_move(m_candidateCloseBtn, m_screenWidth-MORE_BUTTON_WIDTH*m_screenRatio,
735                          ((CANDIDATE_WINDOW_HEIGHT-MORE_BUTTON_HEIGHT)*m_screenRatio/2) + FLOATING_TITLE_BAR_HEIGHT);
736     } else {
737         evas_object_move(m_candidateMoreBtn, m_screenWidth-MORE_BUTTON_WIDTH*m_screenRatio,
738                          (CANDIDATE_WINDOW_HEIGHT-MORE_BUTTON_HEIGHT)*m_screenRatio/2);
739         evas_object_move(m_candidateCloseBtn, m_screenWidth-MORE_BUTTON_WIDTH*m_screenRatio,
740                          (CANDIDATE_WINDOW_HEIGHT-MORE_BUTTON_HEIGHT)*m_screenRatio/2);
741     }
742 }
743
744 int
745 EflMultiLineCandidate::get_height()
746 {
747     return CANDIDATE_WINDOW_HEIGHT*m_screenRatio;
748 }
749
750 bool
751 EflMultiLineCandidate::get_floating_mode()
752 {
753     return m_floating_mode;
754 }
755
756 #ifdef _TV
757 sclu32 EflMultiLineCandidate::soft_candidate_handle_key_event(const char *keyname)
758 {
759     int count = (cur_candidates.size() > 20 ? 20 : cur_candidates.size());//for fixing lagging issue of glm temporarily
760     int index = 0;
761     if (strcmp(keyname, "Right") == 0) {
762         if (m_highlight_mode) {
763             index = (m_focused_candidate_index + 1) %count;
764             Evas_Object *item = m_candidates_item[m_focused_candidate_index];
765             edje_object_signal_emit(item, "unhighlight", "bg");
766             item = m_candidates_item[index];
767             edje_object_signal_emit(item, "highlight", "bg");
768             m_focused_candidate_index = index;
769             return true;
770         } else {
771             return false;
772         }
773     } else if (strcmp(keyname, "Left") == 0) {
774         if (m_highlight_mode) {
775             index = (m_focused_candidate_index + count - 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, "Up") == 0) {
786         int item_num = m_candidates_item.size();
787         if (item_num > 0) {
788             more_btn_clicked();
789             CSCLUI *ui = get_ui();
790             if (ui) ui->enable_highlight_ui(FALSE);
791             Evas_Object *item = m_candidates_item[m_focused_candidate_index];
792             edje_object_signal_emit(item, "highlight", "bg");
793             m_highlight_mode = true;
794         }
795             return true;
796     } else if (strcmp(keyname, "Down") == 0) {
797         if (m_highlight_mode) {
798             int item_num = m_candidates_item.size();
799             if (item_num > 0) {
800                 Evas_Object *item = m_candidates_item[m_focused_candidate_index];
801                 edje_object_signal_emit(item, "unhighlight", "bg");
802                 close_btn_clicked();
803                 CSCLUI *ui = get_ui();
804                 if (ui) ui->enable_highlight_ui(TRUE);
805                 m_highlight_mode = false;
806                 return TRUE;
807             } else {
808                 return false;
809             }
810         } else {
811             return false;
812         }
813     } else if ((strcmp(keyname, "Return") == 0) || (strcmp(keyname, "Enter") == 0)) {
814         if (m_highlight_mode) {
815             engine_loader_select_candidate(m_focused_candidate_index);
816             m_candidates_item.clear();
817             CSCLUI *ui = get_ui();
818             if (ui) ui->enable_highlight_ui(TRUE);
819             m_highlight_mode = false;
820             return true;
821         } else {
822             return false;
823         }
824     } else {
825         return false;
826     }
827 }
828 #endif