4 * Copyright (c) 2000 - 2015 Samsung Electronics Co., Ltd. All rights reserved.
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
10 * http://www.apache.org/licenses/LICENSE-2.0
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.
20 #include <Elementary.h>
30 #define PRIVATE_DATA_KEY_DRAG "pri_drag"
31 #define PRIVATE_DATA_KEY_MOUSE_DOWN "pri_m_dw"
32 #define PRIVATE_DATA_KEY_POP_ALL_TIMER "pri_pop_tm"
33 #define PRIVATE_DATA_KEY_REVERSE_LIST "pri_re_li"
34 #define PRIVATE_DATA_KEY_TERMINATE "pri_tm"
38 task_mgr_error_e scroller_push_item(Evas_Object *scroller, Evas_Object *item)
41 retv_if(!scroller, TASK_MGR_ERROR_INVALID_PARAMETER);
42 retv_if(!item, TASK_MGR_ERROR_INVALID_PARAMETER);
44 Evas_Object *box_layout = NULL;
45 Evas_Object *box = NULL;
47 box_layout = elm_object_content_get(scroller);
48 retv_if(!box_layout, TASK_MGR_ERROR_FAIL);
50 box = elm_object_part_content_get(box_layout, BOX_GROUP_NAME);
51 retv_if(!box, TASK_MGR_ERROR_FAIL);
53 elm_box_pack_end(box, item);
55 return TASK_MGR_ERROR_NONE;
60 void scroller_pop_item(Evas_Object *scroller, Evas_Object *item, int terminate)
65 Evas_Object *box_layout = NULL;
66 Evas_Object *box = NULL;
67 Evas_Object *tmp_item = NULL;
69 Eina_List *list = NULL;
70 const Eina_List *l = NULL;
71 const Eina_List *ln = NULL;
73 box_layout = elm_object_content_get(scroller);
76 box = elm_object_part_content_get(box_layout, BOX_GROUP_NAME);
79 list = elm_box_children_get(box);
82 EINA_LIST_FOREACH_SAFE(list, l, ln, tmp_item) {
83 if (item != tmp_item) continue;
84 if (terminate) item_terminate(item);
86 elm_box_unpack(box, item);
95 task_mgr_error_e scroller_push_all_item(Evas_Object *scroller, Eina_List *list)
97 const Eina_List *l = NULL;
98 const Eina_List *ln = NULL;
99 list_type_default_s *info = NULL;
100 Evas_Object *item = NULL;
103 _D("No app in the history list");
104 return TASK_MGR_ERROR_NONE;
107 EINA_LIST_FOREACH_SAFE(list, l, ln, info) {
109 item = item_create(scroller, info);
111 scroller_push_item(scroller, item);
114 return TASK_MGR_ERROR_NONE;
119 static Eina_Bool _pop_all_item_cb(void *data)
121 Evas_Object *scroller = data;
122 Evas_Object *item = NULL;
123 Eina_List *list = NULL;
126 int terminate = (int) evas_object_data_get(scroller, PRIVATE_DATA_KEY_TERMINATE);
128 list = evas_object_data_get(scroller, PRIVATE_DATA_KEY_REVERSE_LIST);
131 count = eina_list_count(list);
132 _D("remove list count(include clear button) : %d", count);
133 if (i >= count-1) goto END;
135 item = eina_list_nth(list, i);
139 scroller_pop_item(scroller, item, terminate);
140 return ECORE_CALLBACK_RENEW;
144 eina_list_free(list);
145 evas_object_data_del(scroller, PRIVATE_DATA_KEY_REVERSE_LIST);
146 evas_object_data_del(scroller, PRIVATE_DATA_KEY_TERMINATE);
147 evas_object_data_del(scroller, PRIVATE_DATA_KEY_POP_ALL_TIMER);
148 item_clear_set_disable(scroller);
150 return ECORE_CALLBACK_CANCEL;
155 void scroller_pop_all_item(Evas_Object *scroller, int terminate)
157 Evas_Object *box_layout = NULL;
158 Evas_Object *box = NULL;
159 Eina_List *list = NULL;
160 Eina_List *reverse_list = NULL;
161 Ecore_Timer *timer = NULL;
165 timer = evas_object_data_del(scroller, PRIVATE_DATA_KEY_POP_ALL_TIMER);
167 _D("There is already a timer for popping all items.");
168 ecore_timer_del(timer);
171 /* An user tap the end all button, all items have to be terminated even if paused. */
172 if (!evas_object_data_get(scroller, PRIVATE_DATA_KEY_TERMINATE)) {
173 evas_object_data_set(scroller, PRIVATE_DATA_KEY_TERMINATE, (void *) terminate);
176 box_layout = elm_object_content_get(scroller);
179 box = elm_object_part_content_get(box_layout, BOX_GROUP_NAME);
182 list = elm_box_children_get(box);
185 /* This reverse list should be freed in the timer */
186 reverse_list = eina_list_reverse_clone(list);
187 eina_list_free(list);
188 ret_if(!reverse_list);
189 evas_object_data_set(scroller, PRIVATE_DATA_KEY_REVERSE_LIST, reverse_list);
191 timer = ecore_timer_add(0.01f, _pop_all_item_cb, scroller);
193 _E("Cannot add a timer");
194 evas_object_data_del(scroller, PRIVATE_DATA_KEY_REVERSE_LIST);
195 evas_object_data_del(scroller, PRIVATE_DATA_KEY_TERMINATE);
196 eina_list_free(reverse_list);
200 evas_object_data_set(scroller, PRIVATE_DATA_KEY_POP_ALL_TIMER, timer);
205 int scroller_count(Evas_Object *scroller)
207 Evas_Object *box_layout = NULL;
208 Evas_Object *box = NULL;
209 Eina_List *list = NULL;
211 retv_if(!scroller, 0);
213 box_layout = elm_object_content_get(scroller);
214 retv_if(!box_layout, 0);
216 box = elm_object_part_content_get(box_layout, BOX_GROUP_NAME);
219 list = elm_box_children_get(box);
225 return eina_list_count(list);
230 Eina_Bool scroller_is_scrolling(Evas_Object *scroller)
232 return evas_object_data_get(scroller, DATA_KEY_IS_SCROLLING)? EINA_TRUE:EINA_FALSE;
237 void scroller_freeze(Evas_Object *scroller)
239 Evas_Object *box_layout = NULL;
240 Evas_Object *box = NULL;
244 box_layout = elm_object_content_get(scroller);
247 box = elm_object_part_content_get(box_layout, BOX_GROUP_NAME);
250 elm_object_scroll_freeze_push(box);
255 void scroller_unfreeze(Evas_Object *scroller)
257 Evas_Object *box_layout = NULL;
258 Evas_Object *box = NULL;
262 box_layout = elm_object_content_get(scroller);
265 box = elm_object_part_content_get(box_layout, BOX_GROUP_NAME);
268 while (elm_object_scroll_freeze_get(box)) {
269 elm_object_scroll_freeze_pop(box);
275 static void _mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
278 evas_object_data_set(obj, PRIVATE_DATA_KEY_MOUSE_DOWN, (void *) 1);
283 static void _mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
286 evas_object_data_del(obj, PRIVATE_DATA_KEY_MOUSE_DOWN);
287 if (evas_object_data_get(obj, PRIVATE_DATA_KEY_DRAG)) return;
288 evas_object_data_del(obj, DATA_KEY_IS_SCROLLING);
293 static void _anim_start_cb(void *data, Evas_Object *scroller, void *event_info)
295 _D("start the scroller animation");
296 evas_object_data_set(scroller, DATA_KEY_IS_SCROLLING, (void *) 1);
301 static void _anim_stop_cb(void *data, Evas_Object *scroller, void *event_info)
303 _D("stop the scroller animation");
304 if (evas_object_data_get(scroller, PRIVATE_DATA_KEY_MOUSE_DOWN)) return;
305 evas_object_data_del(scroller, DATA_KEY_IS_SCROLLING);
310 static void _drag_start_cb(void *data, Evas_Object *scroller, void *event_info)
312 _D("start to drag the scroller animation");
313 evas_object_data_set(scroller, PRIVATE_DATA_KEY_DRAG, (void *) 1);
318 static void _drag_stop_cb(void *data, Evas_Object *scroller, void *event_info)
320 _D("stop to drag the scroller animation");
321 evas_object_data_del(scroller, PRIVATE_DATA_KEY_DRAG);
326 static void _scroll_cb(void *data, Evas_Object *scroller, void *event_info)
328 evas_object_data_set(scroller, DATA_KEY_IS_SCROLLING, (void *) 1);
333 Evas_Object *scroller_create(Evas_Object *layout)
335 retv_if(!layout, NULL);
337 Evas_Object *box = NULL;
338 Evas_Object *box_layout = NULL;
339 Evas_Object *scroller = NULL;
341 scroller = elm_scroller_add(layout);
342 retv_if(!scroller, NULL);
344 elm_scroller_bounce_set(scroller, EINA_FALSE, EINA_FALSE);
345 elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
346 //elm_object_style_set(scroller, "list_effect");
347 elm_object_focus_allow_set(scroller, EINA_FALSE);
348 elm_object_part_content_set(layout, "scroller", scroller);
349 evas_object_show(scroller);
351 evas_object_event_callback_add(scroller, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down_cb, NULL);
352 evas_object_event_callback_add(scroller, EVAS_CALLBACK_MOUSE_UP, _mouse_up_cb, NULL);
353 evas_object_smart_callback_add(scroller, "scroll,anim,start", _anim_start_cb, NULL);
354 evas_object_smart_callback_add(scroller, "scroll,anim,stop", _anim_stop_cb, NULL);
355 evas_object_smart_callback_add(scroller, "scroll,drag,start", _drag_start_cb, NULL);
356 evas_object_smart_callback_add(scroller, "scroll,drag,stop", _drag_stop_cb, NULL);
357 evas_object_smart_callback_add(scroller, "scroll", _scroll_cb, NULL);
358 /* Because change an align in box, use the layout betweein box and scroller. */
360 box_layout = elm_layout_add(scroller);
362 _E("Fail to create box layout");
363 evas_object_del(scroller);
366 elm_layout_file_set(box_layout, util_get_file_path(APP_DIR_RESOURCE, BOX_LAYOUT_EDJ), BOX_GROUP_NAME);
367 evas_object_size_hint_align_set(box_layout, 0.5, 1.0);
368 evas_object_size_hint_weight_set(box_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
369 evas_object_show(box_layout);
370 elm_object_content_set(scroller, box_layout);
372 box = elm_box_add(scroller);
374 _E("Fail to create box");
375 evas_object_del(box_layout);
376 evas_object_del(scroller);
379 elm_box_horizontal_set(box, EINA_FALSE);
380 evas_object_size_hint_align_set(box, 0.5, 1.0);
381 evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
382 elm_object_part_content_set(box_layout, BOX_GROUP_NAME, box);
383 evas_object_show(box);
384 main_get_info()->box = box;
391 void scroller_destroy(Evas_Object *scroller)
395 Evas_Object *item = NULL;
396 Evas_Object *box_layout = NULL;
397 Evas_Object *box = NULL;
398 Eina_List *list = NULL;
401 scroller_pop_all_item(scroller, 0);
403 box_layout = elm_object_content_unset(scroller);
406 box = elm_object_part_content_unset(box_layout, BOX_GROUP_NAME);
409 list = elm_box_children_get(box);
415 EINA_LIST_FREE(list, item) {
421 evas_object_del(box);
422 evas_object_del(box_layout);
424 evas_object_event_callback_del(scroller, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down_cb);
425 evas_object_event_callback_del(scroller, EVAS_CALLBACK_MOUSE_UP, _mouse_up_cb);
426 evas_object_smart_callback_del(scroller, "scroll,anim,start", _anim_start_cb);
427 evas_object_smart_callback_del(scroller, "scroll,anim,stop", _anim_stop_cb);
428 evas_object_smart_callback_del(scroller, "scroll,drag,start", _drag_start_cb);
429 evas_object_smart_callback_del(scroller, "scroll,drag,stop", _drag_stop_cb);
430 evas_object_smart_callback_del(scroller, "scroll", _scroll_cb);
432 evas_object_del(scroller);
437 /* End of the file */