migrate to Tizen 3.0 SDK
[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
24 #include "conf.h"
25 #include "item.h"
26 #include "list.h"
27 #include "log.h"
28 #include "main.h"
29 #include "scroller.h"
30 #include "util.h"
31
32 #define PRIVATE_DATA_KEY_CLEAR "p_clr"
33 #define PRIVATE_DATA_KEY_NEXT_ITEM "p_n_it"
34 #define PRIVATE_DATA_KEY_ITEM_INNER_FOR_MOVING "p_in_mv"
35 #define PRIVATE_DATA_KEY_ITEM_ANIM_FOR_MOVING "p_an_mv"
36 #define PRIVATE_DATA_KEY_ITEM_X "p_it_x"
37 #define PRIVATE_DATA_KEY_ITEM_Y "p_it_y"
38 #define PRIVATE_DATA_KEY_ITEM_W "p_it_w"
39 #define PRIVATE_DATA_KEY_ITEM_H "p_it_h"
40 #define PRIVATE_DATA_KEY_DOWN_X "p_dw_x"
41 #define PRIVATE_DATA_KEY_DOWN_Y "p_dw_y"
42 #define PRIVATE_DATA_KEY_DOWN_TIME "p_dw_t"
43 #define PRIVATE_DATA_KEY_SCROLLED "p_sc"
44 #define PRIVATE_DATA_KEY_PRESSED "p_pre"
45 #define PRIVATE_DATA_KEY_ITEM_MOVED "p_it_mv"
46
47 #define PRIVATE_MOVE_THRESHOLD 30
48 #define PRIVATE_FLICK_TIME 100
49 #define PRIVATE_ITEM_TERMINATE_THRESHOLD 2.0
50 #define PRIVATE_ITEM_ALPHA 0.8
51 #define PRIVATE_ITEM_ALPHA_MAX 100
52
53
54
55 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 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("");
86         scroller_pop_all_item(scroller, 1);
87 }
88
89
90
91 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, util_get_file_path(APP_DIR_RESOURCE, ITEM_LAYOUT_EDJ), "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, "click", "clear_item", _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 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, item_outer_w, 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 = item_size * PRIVATE_ITEM_TERMINATE_THRESHOLD;
546
547         if (abs(item_pos - init_pos) > tm_threshold || (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, void *event_info)
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         util_launch_app(appid);
589         //layout_hide_with_timer();
590 }
591
592
593
594 Evas_Object *item_create(Evas_Object *scroller, list_type_default_s *info)
595 {
596         retv_if(NULL == scroller, NULL);
597         retv_if(NULL == info, NULL);
598
599         Evas_Object *focus = NULL;
600         Evas_Object *icon = NULL;
601         Evas_Object *item = NULL;
602         Evas_Object *item_inner = NULL;
603
604         item = elm_layout_add(scroller);
605         retv_if(NULL == item, NULL);
606         elm_layout_file_set(item, util_get_file_path(APP_DIR_RESOURCE, ITEM_LAYOUT_EDJ), "item");
607         evas_object_size_hint_weight_set(item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
608         evas_object_show(item);
609
610         item_inner = elm_layout_add(scroller);
611         goto_if(NULL == item_inner, ERROR);
612         elm_layout_file_set(item_inner, util_get_file_path(APP_DIR_RESOURCE, ITEM_LAYOUT_EDJ), "item_inner");
613         evas_object_size_hint_weight_set(item_inner, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
614         evas_object_show(item_inner);
615         elm_object_part_content_set(item, "inner", item_inner);
616         evas_object_event_callback_add(item_inner, EVAS_CALLBACK_MOUSE_DOWN, _down_cb, item);
617         evas_object_event_callback_add(item_inner, EVAS_CALLBACK_MOUSE_MOVE, _move_cb, item);
618         evas_object_event_callback_add(item_inner, EVAS_CALLBACK_MOUSE_UP, _up_cb, item);
619
620         icon = evas_object_image_add(main_get_info()->e);
621         goto_if(NULL == icon, ERROR);
622         evas_object_image_file_set(icon, info->icon, NULL);
623         evas_object_image_filled_set(icon, EINA_TRUE);
624         evas_object_show(icon);
625         elm_object_part_content_set(item_inner, "icon", icon);
626         elm_object_part_text_set(item_inner, "name", info->name);
627
628         focus = elm_button_add(scroller);
629         goto_if(NULL == focus, ERROR);
630         elm_object_style_set(focus, "focus");
631         elm_object_part_content_set(item, "focus", focus);
632         evas_object_smart_callback_add(focus, "clicked", _clicked_cb, item);
633
634         evas_object_data_set(item, DATA_KEY_ITEM_INFO, info);
635
636         return item;
637
638 ERROR:
639         item_destroy(item);
640         return NULL;
641 }
642
643
644
645 void item_destroy(Evas_Object *item)
646 {
647         ret_if(!item);
648
649         Evas_Object *focus = NULL;
650         Evas_Object *icon = NULL;
651         Evas_Object *item_inner = NULL;
652
653         focus = elm_object_part_content_unset(item, "focus");
654         if (focus) {
655                 evas_object_del(focus);
656         }
657
658         item_inner = elm_object_part_content_unset(item, "inner");
659         if (!item_inner) {
660                 _E("cannot get the object");
661                 evas_object_del(item);
662                 return;
663         }
664
665         icon = elm_object_part_content_unset(item_inner, "icon");
666         if (icon) {
667                 evas_object_del(icon);
668         } else {
669                 _E("cannot get the object");
670         }
671
672         evas_object_data_del(item, DATA_KEY_ITEM_INFO);
673
674         evas_object_del(item_inner);
675         evas_object_del(item);
676 }
677
678
679
680 void item_terminate(Evas_Object *item)
681 {
682         char *appid = NULL;
683         int ret;
684         bool running = false;
685
686         ret_if(!item);
687         ret_if(!item_get_info(item));
688         appid = item_get_info(item)->appid;
689         ret_if(!appid);
690
691         ret = app_manager_is_running(appid, &running);
692         ret_if(APP_MANAGER_ERROR_NONE != ret);
693
694         _D("Terminate: %s(%d)", appid, running);
695         if (running) {
696                 util_kill_app(appid);
697         }
698 }
699
700
701
702 //End of a file