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