[Task-mgr] Fixed scale and long size name issues
[apps/core/preloaded/taskmanager.git] / src / item.c
1 /*
2  *  Task Manager
3  *
4  * Copyright (c) 2000 - 2015 Samsung Electronics Co., Ltd. All rights reserved.
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  */
19
20 #include <Elementary.h>
21 #include <app_manager.h>
22 #include <stdbool.h>
23 #include <rua.h>
24
25 #include "conf.h"
26 #include "item.h"
27 #include "list.h"
28 #include "log.h"
29 #include "main.h"
30 #include "scroller.h"
31 #include "util.h"
32
33 #define PRIVATE_DATA_KEY_CLEAR "p_clr"
34 #define PRIVATE_DATA_KEY_NEXT_ITEM "p_n_it"
35 #define PRIVATE_DATA_KEY_ITEM_INNER_FOR_MOVING "p_in_mv"
36 #define PRIVATE_DATA_KEY_ITEM_ANIM_FOR_MOVING "p_an_mv"
37 #define PRIVATE_DATA_KEY_ITEM_X "p_it_x"
38 #define PRIVATE_DATA_KEY_ITEM_Y "p_it_y"
39 #define PRIVATE_DATA_KEY_ITEM_W "p_it_w"
40 #define PRIVATE_DATA_KEY_ITEM_H "p_it_h"
41 #define PRIVATE_DATA_KEY_DOWN_X "p_dw_x"
42 #define PRIVATE_DATA_KEY_DOWN_Y "p_dw_y"
43 #define PRIVATE_DATA_KEY_DOWN_TIME "p_dw_t"
44 #define PRIVATE_DATA_KEY_SCROLLED "p_sc"
45 #define PRIVATE_DATA_KEY_PRESSED "p_pre"
46 #define PRIVATE_DATA_KEY_ITEM_MOVED "p_it_mv"
47
48 #define PRIVATE_MOVE_THRESHOLD 30
49 #define PRIVATE_FLICK_TIME 100
50 #define PRIVATE_ITEM_ALPHA 0.8
51 #define PRIVATE_ITEM_ALPHA_MAX 100
52
53
54
55 extern list_type_default_s *item_get_info(Evas_Object *item)
56 {
57         retv_if(!item, NULL);
58         list_type_default_s *info = NULL;
59
60         info = evas_object_data_get(item, DATA_KEY_ITEM_INFO);
61
62         return info;
63 }
64
65
66
67 extern void item_clear_set_disable(Evas_Object *scroller)
68 {
69         Evas_Object *clear_item = NULL;
70         ret_if(!scroller);
71
72         clear_item = evas_object_data_get(scroller, PRIVATE_DATA_KEY_CLEAR);
73         ret_if(!clear_item);
74         elm_layout_signal_emit(main_get_info()->layout, "no,apps,txt,show", "no,apps,txt");
75         elm_layout_signal_emit(clear_item, "no,apps", "clear");
76
77 }
78
79
80
81 static void _clear_all_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
82 {
83         Evas_Object *scroller = data;
84         ret_if(!scroller);
85         _D("clear all item is clicked");
86         scroller_pop_all_item(scroller, 1);
87 }
88
89
90
91 extern Evas_Object *item_clear_all_create(Evas_Object *scroller)
92 {
93         retv_if(!scroller, NULL);
94
95         Evas_Object *clear_item = NULL;
96
97         clear_item = elm_layout_add(scroller);
98         retv_if(!clear_item, NULL);
99
100         if (!elm_layout_file_set(clear_item, ITEM_LAYOUT, "clear_item")) {
101                 _E("Failed to set the layout");
102                 evas_object_del(clear_item);
103                 return NULL;
104         }
105
106         elm_object_part_text_set(clear_item, "name", _("IDS_TASKMGR_BUTTON_CLEAR_ALL"));
107
108         elm_object_signal_callback_add(clear_item, "mouse,clicked,1", "event", _clear_all_clicked_cb, scroller);
109         evas_object_data_set(scroller, PRIVATE_DATA_KEY_CLEAR, clear_item);
110
111         evas_object_size_hint_weight_set(clear_item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
112         evas_object_show(clear_item);
113
114         return clear_item;
115
116 }
117
118
119
120 extern void item_clear_all_destroy(Evas_Object *scroller)
121 {
122         ret_if(!scroller);
123
124         Evas_Object *clear_item = NULL;
125
126         clear_item = evas_object_data_del(scroller, PRIVATE_DATA_KEY_CLEAR);
127         if (clear_item) evas_object_del(clear_item);
128 }
129
130
131
132 static Evas_Object *_content_set_item_inner(Evas_Object *item_outer)
133 {
134         Evas_Object *box = NULL;
135         Evas_Object *item_inner = NULL;
136         Evas_Object *next_item = NULL;
137
138         box = main_get_info()->box;
139         retv_if(!box, NULL);
140
141         item_inner = evas_object_data_get(item_outer, PRIVATE_DATA_KEY_ITEM_INNER_FOR_MOVING);
142         retv_if(!item_inner, NULL);
143
144         next_item = evas_object_data_del(item_outer, PRIVATE_DATA_KEY_NEXT_ITEM);
145
146         elm_box_unpack(box, item_outer);
147         elm_object_part_content_set(item_outer, "inner", item_inner);
148
149         if (!next_item) {
150                 elm_box_pack_end(box, item_outer);
151         } else {
152                 elm_box_pack_before(box, item_outer, next_item);
153         }
154         return item_outer;
155 }
156
157
158
159 static Evas_Object *_content_unset_item_inner(Evas_Object *item_outer)
160 {
161         Evas_Object *box = NULL;
162         Evas_Object *item_inner = NULL;
163         Evas_Object *tmp_item = NULL;
164         Eina_List *list = NULL;
165         const Eina_List *l = NULL;
166         const Eina_List *ln = NULL;
167
168
169         box = main_get_info()->box;
170         retv_if(!box, NULL);
171
172         item_inner = elm_object_part_content_unset(item_outer, "inner");
173         retv_if(!item_inner, NULL);
174         evas_object_data_set(item_outer, PRIVATE_DATA_KEY_ITEM_INNER_FOR_MOVING, item_inner);
175
176         list = elm_box_children_get(box);
177         retv_if(!list, NULL);
178
179         EINA_LIST_FOREACH_SAFE(list, l, ln, tmp_item) {
180                 if (item_outer != tmp_item) continue;
181                 Evas_Object *next_item = eina_list_data_get(ln);
182                 evas_object_data_set(item_outer, PRIVATE_DATA_KEY_NEXT_ITEM, next_item);
183                 break;
184         }
185         eina_list_free(list);
186
187         return item_outer;
188 }
189
190
191
192 #define ANIM_RATE 5
193 #define ANIM_RATE_SPARE ANIM_RATE - 1
194 static Eina_Bool _anim_move_item(void *data)
195 {
196         Evas_Object *scroller = NULL;
197         Evas_Object *item_inner = NULL;
198         Evas_Object *item_outer = NULL;
199
200         int cur_x, cur_y;
201         int end_x, end_y;
202         int end_pos, cur_pos;
203         int vec_pos;
204
205         item_outer = data;
206         goto_if(!data, ERROR);
207
208         scroller = main_get_info()->scroller;
209         goto_if(!scroller, ERROR);
210
211         item_inner = evas_object_data_get(item_outer, PRIVATE_DATA_KEY_ITEM_INNER_FOR_MOVING);
212         goto_if(!item_inner, ERROR);
213
214         evas_object_geometry_get(item_inner, &cur_x, &cur_y, NULL, NULL);
215         evas_object_geometry_get(item_outer, &end_x, &end_y, NULL, NULL);
216
217         end_pos = end_x;
218         vec_pos = (end_x - cur_x)/ANIM_RATE;
219         cur_x += vec_pos;
220         cur_pos = cur_x;
221
222         if ((end_pos - cur_pos) < 0) { // Move : Right -> Left
223                 evas_object_move(item_inner, cur_x, cur_y);
224                 int alp = 255 - ((cur_pos - end_pos) * PRIVATE_ITEM_ALPHA) - 1;
225                 if (alp < PRIVATE_ITEM_ALPHA_MAX) alp = PRIVATE_ITEM_ALPHA_MAX;
226                 evas_object_color_set(item_inner, alp, alp, alp, alp);
227
228                 if (cur_pos - ANIM_RATE_SPARE <= end_pos) {
229                         evas_object_move(item_inner, end_x, end_y);
230                         goto_if (! _content_set_item_inner(item_outer), ERROR);
231                         /* unfreeze the scroller after setting the content */
232                         scroller_unfreeze(scroller);
233                         evas_object_data_del(item_outer, PRIVATE_DATA_KEY_ITEM_INNER_FOR_MOVING);
234                         evas_object_data_del(item_outer, PRIVATE_DATA_KEY_ITEM_ANIM_FOR_MOVING);
235                         return ECORE_CALLBACK_CANCEL;
236                 }
237         }
238         else { // Move : Left -> Right
239                 evas_object_move(item_inner, cur_x, cur_y);
240                 int alp = 255 - ((end_pos - cur_pos) * PRIVATE_ITEM_ALPHA) - 1;
241                 if (alp < PRIVATE_ITEM_ALPHA_MAX) alp = PRIVATE_ITEM_ALPHA_MAX;
242                 evas_object_color_set(item_inner, alp, alp, alp, alp);
243
244                 if (cur_pos + ANIM_RATE_SPARE >= end_pos) {
245                         evas_object_move(item_inner, end_x, end_y);
246                         goto_if (NULL == _content_set_item_inner(item_outer), ERROR);
247                         /* unfreeze the scroller after setting the content */
248                         scroller_unfreeze(scroller);
249                         evas_object_data_del(item_outer, PRIVATE_DATA_KEY_ITEM_INNER_FOR_MOVING);
250                         evas_object_data_del(item_outer, PRIVATE_DATA_KEY_ITEM_ANIM_FOR_MOVING);
251                         return ECORE_CALLBACK_CANCEL;
252                 }
253         }
254         return ECORE_CALLBACK_RENEW;
255
256 ERROR:
257         if (item_outer) {
258                 scroller_unfreeze(scroller);
259                 evas_object_data_del(item_outer, PRIVATE_DATA_KEY_ITEM_INNER_FOR_MOVING);
260                 evas_object_data_del(item_outer, PRIVATE_DATA_KEY_ITEM_ANIM_FOR_MOVING);
261         }
262         return ECORE_CALLBACK_CANCEL;
263 }
264
265
266
267 #define SLIPPED_LENGTH 40
268 static Eina_Bool _anim_slipped_item(void *data)
269 {
270         Evas_Object *scroller = NULL;
271         Evas_Object *item_outer = data;
272
273         int item_outer_w, item_outer_h;
274
275         goto_if(!item_outer, ERROR);
276
277         scroller = main_get_info()->scroller;
278         goto_if(!scroller, ERROR);
279
280         item_outer_w = (int)evas_object_data_get(item_outer, PRIVATE_DATA_KEY_ITEM_W);
281         item_outer_h = (int)evas_object_data_get(item_outer, PRIVATE_DATA_KEY_ITEM_H);
282
283         item_outer_h -= SLIPPED_LENGTH;
284         evas_object_size_hint_min_set(item_outer, ELM_SCALE_SIZE(item_outer_w), ELM_SCALE_SIZE(item_outer_h));
285         evas_object_data_set(item_outer, PRIVATE_DATA_KEY_ITEM_H, (void *)item_outer_h);
286
287         if (item_outer_h <= 0) {
288                 scroller_pop_item(scroller, item_outer, 1);
289
290                 if (scroller_count(scroller) < 2) {
291                         item_clear_set_disable(scroller);
292                 }
293                 goto ERROR;
294         }
295
296         return ECORE_CALLBACK_RENEW;
297
298 ERROR:
299         if (item_outer) {
300                 evas_object_data_del(item_outer, PRIVATE_DATA_KEY_ITEM_W);
301                 evas_object_data_del(item_outer, PRIVATE_DATA_KEY_ITEM_H);
302                 evas_object_data_del(item_outer, PRIVATE_DATA_KEY_ITEM_ANIM_FOR_MOVING);
303         }
304         return ECORE_CALLBACK_CANCEL;
305 }
306
307
308
309 #define TERMINATE_LENGTH 60
310 static Eina_Bool _anim_terminate_item(void *data)
311 {
312         Evas_Object *item_outer = data;
313         Evas_Object *item_inner = NULL;
314
315         int item_x, item_y, item_w, item_h, is_boundary = 0;
316         int outer_x, outer_y;
317
318         goto_if(!item_outer, ERROR);
319
320         item_inner = evas_object_data_get(item_outer, PRIVATE_DATA_KEY_ITEM_INNER_FOR_MOVING);
321         if(!item_inner) {
322                 item_inner = elm_object_part_content_unset(item_outer, "inner");
323                 retv_if(!item_inner, ECORE_CALLBACK_CANCEL);
324                 evas_object_data_set(item_outer, PRIVATE_DATA_KEY_ITEM_INNER_FOR_MOVING, item_inner);
325         }
326
327         evas_object_geometry_get(item_inner, &item_x, &item_y, &item_w, &item_h);
328         evas_object_geometry_get(item_outer, &outer_x, &outer_y, NULL, NULL);
329
330         if (item_x >= outer_x) {
331                 item_x += TERMINATE_LENGTH;
332         } else {
333                 item_x -= TERMINATE_LENGTH;
334         }
335
336         if (item_x >= main_get_info()->root_w || (item_x + item_w) <= 0) {
337                 is_boundary = 1;
338         }
339
340         evas_object_move(item_inner, item_x, item_y);
341
342         if (is_boundary) {
343                 Evas_Object *scroller = NULL;
344                 Ecore_Animator *anim = NULL;
345
346                 scroller = main_get_info()->scroller;
347                 goto_if(!scroller, ERROR);
348
349                 /* unfreeze the scroller after setting the content */
350                 scroller_unfreeze(scroller);
351                 evas_object_data_del(item_outer, PRIVATE_DATA_KEY_ITEM_INNER_FOR_MOVING);
352                 evas_object_data_del(item_outer, PRIVATE_DATA_KEY_ITEM_ANIM_FOR_MOVING);
353                 evas_object_color_set(item_inner, 255, 255, 255, 0);
354                 elm_object_part_content_set(item_outer, "inner", item_inner);
355
356                 anim = evas_object_data_get(item_outer, PRIVATE_DATA_KEY_ITEM_ANIM_FOR_MOVING);
357                 if (anim) {
358                         ecore_animator_del(anim);
359                         anim = NULL;
360                         evas_object_data_del(item_outer, PRIVATE_DATA_KEY_ITEM_ANIM_FOR_MOVING);
361                 }
362                 anim = ecore_animator_add(_anim_slipped_item, item_outer);
363                 goto_if(!anim, ERROR);
364                 evas_object_data_set(item_outer, PRIVATE_DATA_KEY_ITEM_ANIM_FOR_MOVING, anim);
365                 return ECORE_CALLBACK_CANCEL;
366         }
367         return ECORE_CALLBACK_RENEW;
368
369 ERROR:
370         if (item_outer) {
371                 evas_object_data_del(item_outer, PRIVATE_DATA_KEY_ITEM_INNER_FOR_MOVING);
372                 evas_object_data_del(item_outer, PRIVATE_DATA_KEY_ITEM_ANIM_FOR_MOVING);
373         }
374         return ECORE_CALLBACK_CANCEL;
375 }
376
377
378
379 static void _down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
380 {
381         Evas_Event_Mouse_Down *ei = event_info;
382         Evas_Object *item_outer = data;
383         Evas_Object *item_inner = NULL;
384
385         int x = ei->output.x;
386         int y = ei->output.y;
387         int down_time = ei->timestamp;
388         int rect_x, rect_y, rect_w, rect_h;
389
390         ret_if(!item_outer);
391
392         _D("Down (%d, %d)", x, y);
393
394         item_inner = elm_object_part_content_get(item_outer, "inner");
395         if (!item_inner) {
396                 item_inner = evas_object_data_del(item_outer, PRIVATE_DATA_KEY_ITEM_INNER_FOR_MOVING);
397                 ret_if(!item_inner);
398                 elm_object_part_content_set(item_outer, "inner", item_inner);
399         }
400
401         evas_object_data_set(item_outer, PRIVATE_DATA_KEY_PRESSED, (void *) 1);
402         evas_object_data_set(item_outer, PRIVATE_DATA_KEY_DOWN_X, (void *) x);
403         evas_object_data_set(item_outer, PRIVATE_DATA_KEY_DOWN_Y, (void *) y);
404         evas_object_data_set(item_outer, PRIVATE_DATA_KEY_DOWN_TIME, (void *)down_time);
405
406         evas_object_geometry_get(item_outer, &rect_x, &rect_y, &rect_w, &rect_h);
407         evas_object_data_set(item_outer, PRIVATE_DATA_KEY_ITEM_X, (void *) rect_x);
408         evas_object_data_set(item_outer, PRIVATE_DATA_KEY_ITEM_Y, (void *) rect_y);
409         evas_object_data_set(item_outer, PRIVATE_DATA_KEY_ITEM_W, (void *) rect_w);
410         evas_object_data_set(item_outer, PRIVATE_DATA_KEY_ITEM_H, (void *) rect_h);
411 }
412
413
414
415 #define LAUNCHING_LENGTH 60
416 #define SCROLLER_THRESHOLD 15
417 static void _move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
418 {
419         Evas_Event_Mouse_Move *ei = event_info;
420         Evas_Object *item_outer = data;
421
422         Evas_Object *layout = NULL;
423         Evas_Object *item_inner = NULL;
424         Evas_Object *scroller = NULL;
425         Ecore_Animator *anim = NULL;
426
427         int down_x, down_y;
428         int outer_x, outer_y;
429         int cur_x, cur_y, vec_x, vec_y;
430         int alpha = 0;
431
432         if (!item_outer) return;
433         if (!evas_object_data_get(item_outer, PRIVATE_DATA_KEY_PRESSED)) return;
434
435         scroller = main_get_info()->scroller;
436         ret_if(!scroller);
437         if (scroller_is_scrolling(scroller)) {
438                 evas_object_data_set(item_outer, PRIVATE_DATA_KEY_SCROLLED, (void *)1);
439                 evas_object_data_del(item_outer, PRIVATE_DATA_KEY_PRESSED);
440
441                 return;
442         }
443
444         layout = main_get_info()->layout;
445         ret_if(!layout);
446
447         anim = evas_object_data_get(item_outer, PRIVATE_DATA_KEY_ITEM_ANIM_FOR_MOVING);
448         if (anim) return;
449
450         down_x = (int) evas_object_data_get(item_outer, PRIVATE_DATA_KEY_DOWN_X);
451         down_y = (int) evas_object_data_get(item_outer, PRIVATE_DATA_KEY_DOWN_Y);
452
453         outer_x = (int)evas_object_data_get(item_outer, PRIVATE_DATA_KEY_ITEM_X);
454         outer_y = (int)evas_object_data_get(item_outer, PRIVATE_DATA_KEY_ITEM_Y);
455
456         cur_x = ei->cur.output.x;
457         cur_y = ei->cur.output.y;
458
459         vec_x = cur_x - down_x;
460         vec_y = cur_y - down_y;
461
462         outer_x += vec_x;
463
464         if (!evas_object_data_get(item_outer, PRIVATE_DATA_KEY_ITEM_MOVED)) {
465                 if (abs(vec_y) > abs(vec_x) + SCROLLER_THRESHOLD) {
466                         evas_object_data_set(item_outer, PRIVATE_DATA_KEY_SCROLLED, (void *)1);
467                         return;
468                 }
469                 if (abs(vec_x) <= PRIVATE_MOVE_THRESHOLD) return;
470                 if (abs(vec_y) >= SCROLLER_THRESHOLD) return;
471         }
472
473         evas_object_data_set(item_outer, PRIVATE_DATA_KEY_ITEM_MOVED, (void *) 1);
474         item_inner = evas_object_data_get(item_outer, PRIVATE_DATA_KEY_ITEM_INNER_FOR_MOVING);
475         if (!item_inner) {
476                 /* freeze the scroller before unsetting the content */
477                 scroller_freeze(scroller);
478                 ret_if(!_content_unset_item_inner(item_outer));
479         }
480
481         alpha = 255 -(abs(vec_x) * PRIVATE_ITEM_ALPHA);
482         if (alpha < PRIVATE_ITEM_ALPHA_MAX) {
483                 alpha = PRIVATE_ITEM_ALPHA_MAX;
484         }
485
486         evas_object_color_set(item_inner, alpha, alpha, alpha, alpha);
487         evas_object_move(item_inner, outer_x, outer_y);
488 }
489
490
491
492 static void _item_terminate_anim(Evas_Object *item_outer)
493 {
494         Ecore_Animator *anim = NULL;
495
496         anim = evas_object_data_get(item_outer, PRIVATE_DATA_KEY_ITEM_ANIM_FOR_MOVING);
497         if (anim) {
498                 ecore_animator_del(anim);
499                 anim = NULL;
500                 evas_object_data_del(item_outer, PRIVATE_DATA_KEY_ITEM_ANIM_FOR_MOVING);
501         }
502
503         anim = ecore_animator_add(_anim_terminate_item, item_outer);
504         ret_if(!anim);
505         evas_object_data_set(item_outer, PRIVATE_DATA_KEY_ITEM_ANIM_FOR_MOVING, anim);
506 }
507
508
509
510 static void _up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
511 {
512         Evas_Event_Mouse_Up *ei = event_info;
513         Evas_Object *item_outer = data;
514
515         Evas_Object *scroller = NULL;
516
517         int x = ei->output.x;
518         int y = ei->output.y;
519         int up_time = ei->timestamp;
520         int down_time = 0;
521         int init_pos, item_pos, item_size, tm_threshold;
522
523         _D("Up (%d, %d)", x, y);
524
525         ret_if (!item_outer);
526
527         scroller = main_get_info()->scroller;
528         ret_if(!scroller);
529
530         evas_object_data_del(item_outer, PRIVATE_DATA_KEY_PRESSED);
531         evas_object_data_del(item_outer, PRIVATE_DATA_KEY_DOWN_Y);
532         evas_object_data_del(item_outer, PRIVATE_DATA_KEY_DOWN_X);
533         evas_object_data_del(item_outer, PRIVATE_DATA_KEY_ITEM_MOVED);
534         evas_object_data_del(item_outer, PRIVATE_DATA_KEY_SCROLLED);
535
536         down_time = (int) evas_object_data_del(item_outer, PRIVATE_DATA_KEY_DOWN_TIME);
537
538         /* This means the inner item has not been moved */
539         Evas_Object *item_inner = evas_object_data_get(item_outer, PRIVATE_DATA_KEY_ITEM_INNER_FOR_MOVING);
540         if (!item_inner) return;
541
542         init_pos = (int) evas_object_data_del(item_outer, PRIVATE_DATA_KEY_ITEM_X);
543         evas_object_data_del(item_outer, PRIVATE_DATA_KEY_ITEM_Y);
544         evas_object_geometry_get(item_inner, &item_pos, NULL, &item_size, NULL);
545         tm_threshold = main_get_info()->root_w - 100;
546
547         if (item_pos > tm_threshold || item_pos < 10 || (up_time - down_time < PRIVATE_FLICK_TIME && abs(item_pos - init_pos) > 0)) {
548                 _item_terminate_anim(item_outer);
549
550         } else if (item_pos != init_pos) {
551                 Ecore_Animator *anim = NULL;
552                 anim = evas_object_data_get(item_outer, PRIVATE_DATA_KEY_ITEM_ANIM_FOR_MOVING);
553                 if (anim) {
554                         ecore_animator_del(anim);
555                         anim = NULL;
556                         evas_object_data_del(item_outer, PRIVATE_DATA_KEY_ITEM_ANIM_FOR_MOVING);
557                 }
558
559                 anim = ecore_animator_add(_anim_move_item, item_outer);
560                 ret_if(NULL == anim);
561                 evas_object_data_set(item_outer, PRIVATE_DATA_KEY_ITEM_ANIM_FOR_MOVING, anim);
562         }
563 }
564
565
566
567 static void _clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
568 {
569         _D("Clicked");
570
571         ret_if(!data);
572         Evas_Object *item = data;
573         Evas_Object *item_inner = NULL;
574
575         const char *appid = NULL;
576
577         list_type_default_s *info = NULL;
578
579         item_inner = elm_object_part_content_get(item, "inner");
580         if (!item_inner) return;
581
582         info = item_get_info(item);
583         ret_if(!info);
584
585         appid = info->appid;
586         ret_if(!appid);
587
588         elm_object_signal_emit(item_inner, "clicked", "event");
589
590         util_launch_app(appid);
591         //layout_hide_with_timer();
592 }
593
594
595
596 extern Evas_Object *item_create(Evas_Object *scroller, list_type_default_s *info)
597 {
598         retv_if(NULL == scroller, NULL);
599         retv_if(NULL == info, NULL);
600
601         Evas_Object *icon = NULL;
602         Evas_Object *item = NULL;
603         Evas_Object *item_inner = NULL;
604
605         item = elm_layout_add(scroller);
606         retv_if(NULL == item, NULL);
607         elm_layout_file_set(item, ITEM_LAYOUT, "item");
608         evas_object_size_hint_weight_set(item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
609         evas_object_show(item);
610
611         item_inner = elm_layout_add(scroller);
612         goto_if(NULL == item_inner, ERROR);
613         elm_layout_file_set(item_inner, ITEM_LAYOUT, "item_inner");
614         evas_object_size_hint_weight_set(item_inner, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
615         evas_object_show(item_inner);
616         elm_object_part_content_set(item, "inner", item_inner);
617         evas_object_event_callback_add(item_inner, EVAS_CALLBACK_MOUSE_DOWN, _down_cb, item);
618         evas_object_event_callback_add(item_inner, EVAS_CALLBACK_MOUSE_MOVE, _move_cb, item);
619         evas_object_event_callback_add(item_inner, EVAS_CALLBACK_MOUSE_UP, _up_cb, item);
620
621         icon = evas_object_image_add(main_get_info()->e);
622         goto_if(NULL == icon, ERROR);
623         evas_object_image_file_set(icon, info->icon, NULL);
624         evas_object_image_filled_set(icon, EINA_TRUE);
625         evas_object_show(icon);
626         elm_object_part_content_set(item_inner, "icon", icon);
627         elm_object_part_text_set(item_inner, "name", info->name);
628
629         elm_object_signal_callback_add(item_inner, "mouse,clicked,1", "event", _clicked_cb, item);
630
631         evas_object_data_set(item, DATA_KEY_ITEM_INFO, info);
632
633         return item;
634
635 ERROR:
636         item_destroy(item);
637         return NULL;
638 }
639
640
641
642 extern void item_destroy(Evas_Object *item)
643 {
644         ret_if(!item);
645
646         Evas_Object *icon = NULL;
647         Evas_Object *item_inner = NULL;
648
649         item_inner = elm_object_part_content_unset(item, "inner");
650         if (!item_inner) {
651                 _E("cannot get the object");
652                 evas_object_del(item);
653                 return;
654         }
655
656         icon = elm_object_part_content_unset(item_inner, "icon");
657         if (icon) {
658                 evas_object_del(icon);
659         } else {
660                 _E("cannot get the object");
661         }
662
663         evas_object_data_del(item, DATA_KEY_ITEM_INFO);
664
665         evas_object_del(item_inner);
666         evas_object_del(item);
667 }
668
669
670
671 extern void item_terminate(Evas_Object *item)
672 {
673         char *appid = NULL;
674         int ret;
675         bool running = false;
676
677         ret_if(!item);
678         ret_if(!item_get_info(item));
679         appid = item_get_info(item)->appid;
680         ret_if(!appid);
681
682         ret = app_manager_is_running(appid, &running);
683         ret_if(APP_MANAGER_ERROR_NONE != ret);
684
685         _D("Terminate: %s(%d)", appid, running);
686         if (running) {
687                 util_kill_app(appid);
688         }
689
690         if (0 != rua_delete_history_with_pkgname(appid)) {
691                 _E("Cannot delete history for package(%s)", appid);
692         }
693 }
694
695
696
697 //End of a file