4 * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved
6 * Contact: Jin Yoon <jinny.yoon@samsung.com>
7 * Junkyu Han <junkyu.han@samsung.com>
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
13 * http://www.apache.org/licenses/LICENSE-2.0
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
23 #include <Elementary.h>
27 #include "item_badge.h"
31 #include "item_event.h"
35 #include "menu_screen.h"
37 #include "page_scroller.h"
42 #define PAGE_SCROLL_SENSITIVE 0.2
43 #define PROP_PORTRAIT_HEIGHT (PAGE_PORTRAIT_HEIGHT / BASE_HEIGHT)
47 HAPI void page_scroller_bring_in(Evas_Object *scroller, int idx)
52 _D("BRING IN TO %d", idx);
54 evas_object_data_set(scroller, "current_idx", (void *) idx);
56 evas_object_geometry_get(scroller, NULL, NULL, &w, &h);
57 elm_scroller_region_bring_in(scroller, idx * w, 0, w, h);
59 index = evas_object_data_get(scroller, "index");
61 _E("cannot find index.");
63 _D("page index bring in to %d", idx);
64 index_bring_in(index, idx);
69 HAPI void page_scroller_show_region(Evas_Object *scroller, int idx)
74 evas_object_geometry_get(scroller, NULL, NULL, &w, &h);
75 elm_scroller_region_show(scroller, idx * w, 0, w, h);
77 index = evas_object_data_get(scroller, "index");
79 _E("cannot find index.");
81 _D("page index bring in to %d", idx);
82 index_bring_in(index, idx);
87 static void _anim_stop_cb(void *data, Evas_Object *scroller, void *event_info)
89 _D("stop the scroller(%p) animation", scroller);
91 /* page_scroller_focus & index_bring_in in _drag_stop_cb & _anim_stop_cb */
92 Evas_Coord x, y, w, h;
93 elm_scroller_region_get(scroller, &x, &y, &w, &h);
97 if(evas_object_data_get(scroller, "mouse_wheel_scroller_start")) {
98 // "page_scroller_bring_in" was invoked in "_mouse_wheel_cb",
99 // so condition cur_idx == idx will be true and "page_scroller_focus" won't be executed
100 // so "page_scroller_focus" is executed here.
101 evas_object_data_set(scroller, "mouse_wheel_scroller_start", (void *) 0);
102 page_scroller_focus(scroller);
105 int cur_idx = page_scroller_get_current_page_no(scroller);
108 if (cur_idx == idx) return;
110 page_scroller_bring_in(scroller, idx);
111 page_scroller_focus(scroller);
116 static void _anim_start_cb(void *data, Evas_Object *scroller, void *event_info)
118 _D("start the scroller(%p) animation", scroller);
120 int drag_start = (int) evas_object_data_get(scroller, "drag_start");
121 if (drag_start == 0) return;
122 evas_object_data_set(scroller, "drag_start", (void *) 0);
130 static void _drag_start_cb(void *data, Evas_Object *scroller, void *event_info)
136 elm_scroller_region_get(scroller, &previous_x, NULL, NULL, NULL);
137 evas_object_data_set(scroller, "previous_x", (void *) previous_x);
138 evas_object_data_set(scroller, "drag_start", (void *) 1);
143 static void _drag_stop_cb(void *data, Evas_Object *scroller, void *event_info)
145 Evas_Coord x, y, w, h;
150 elm_scroller_region_get(scroller, &x, &y, &w, &h);
151 previous_x = (int) evas_object_data_get(scroller, "previous_x");
152 if (x == previous_x) {
153 _D("
\e[33mHold scroller (previous) %d (current) %d
\e[0m", previous_x, x);
156 /* page_scroller_focus & index_bring_in in _drag_stop_cb & _anim_stop_cb */
159 int cur_idx = page_scroller_get_current_page_no(scroller);
163 if (cur_idx == idx) return;
165 page_scroller_bring_in(scroller, idx);
166 page_scroller_focus(scroller);
170 static void _scroll_cb(void *data, Evas_Object *scroller, void *event_info)
172 _drag_stop_cb(data, scroller, event_info);
177 static menu_screen_error_e _find_position_all_page(Evas_Object *scroller, int *candidate_page, int *candidate_pos, void *data)
181 register unsigned int page_no;
182 register unsigned int position_no;
186 retv_if(NULL == scroller, MENU_SCREEN_ERROR_INVALID_PARAMETER);
187 retv_if(NULL == candidate_page, MENU_SCREEN_ERROR_INVALID_PARAMETER);
188 retv_if(NULL == candidate_pos, MENU_SCREEN_ERROR_INVALID_PARAMETER);
190 *candidate_page = -1;
192 nr_of_pages = page_scroller_count_page(scroller);
193 page_max_app = (int) evas_object_data_get(scroller, "page_max_app");
195 page = page_scroller_get_page_at(scroller, nr_of_pages-1);
196 page_no = nr_of_pages-1;
197 for (position_no = 0; position_no < page_max_app; position_no ++) {
198 item = page_get_item_at(page, position_no);
200 *candidate_page = page_no;
201 *candidate_pos = position_no;
202 return MENU_SCREEN_ERROR_OK;
206 for (page_no = 0; page_no < nr_of_pages -1; page_no ++) {
207 page = page_scroller_get_page_at(scroller, page_no);
209 return MENU_SCREEN_ERROR_FAIL;
212 for (position_no = 0; position_no < page_max_app; position_no ++) {
213 item = page_get_item_at(page, position_no);
215 *candidate_page = page_no;
216 *candidate_pos = position_no;
217 return MENU_SCREEN_ERROR_OK;
222 return MENU_SCREEN_ERROR_OK;
227 static menu_screen_error_e _find_position_by_default(Evas_Object *scroller, int *candidate_page, int *candidate_pos, void *data)
231 register unsigned int page_no;
232 register unsigned int position_no;
233 unsigned int nr_of_pages;
236 retv_if(NULL == scroller, MENU_SCREEN_ERROR_INVALID_PARAMETER);
237 retv_if(NULL == candidate_page, MENU_SCREEN_ERROR_INVALID_PARAMETER);
238 retv_if(NULL == candidate_pos, MENU_SCREEN_ERROR_INVALID_PARAMETER);
242 nr_of_pages = page_scroller_count_page(scroller);
243 page_max_app = (int) evas_object_data_get(scroller, "page_max_app");
244 for (page_no = 0; page_no < nr_of_pages; page_no ++) {
245 page = page_scroller_get_page_at(scroller, page_no);
247 _D("Page is not found at %d", page_no);
248 return MENU_SCREEN_ERROR_FAIL;
251 for (position_no = 0; position_no < page_max_app; position_no ++) {
252 item = page_get_item_at(page, position_no);
254 *candidate_page = page_no;
255 *candidate_pos = position_no;
256 return MENU_SCREEN_ERROR_OK;
261 *candidate_page = page_no;
264 return MENU_SCREEN_ERROR_OK;
269 static menu_screen_error_e _find_position_by_package(Evas_Object *scroller, int *candidate_page, int *candidate_pos, void *data)
273 register int page_no;
274 register int position_no;
275 unsigned int nr_of_pages;
277 app_info_t *ai = data;
279 retv_if(NULL == scroller, MENU_SCREEN_ERROR_INVALID_PARAMETER);
280 retv_if(NULL == candidate_page, MENU_SCREEN_ERROR_INVALID_PARAMETER);
281 retv_if(NULL == candidate_pos, MENU_SCREEN_ERROR_INVALID_PARAMETER);
282 retv_if(NULL == data, MENU_SCREEN_ERROR_INVALID_PARAMETER);
283 retv_if(NULL == ai->package, MENU_SCREEN_ERROR_INVALID_PARAMETER);
287 nr_of_pages = page_scroller_count_page(scroller);
288 page_max_app = (int) evas_object_data_get(scroller, "page_max_app");
289 for (page_no = 0; page_no < nr_of_pages; page_no ++) {
290 page = page_scroller_get_page_at(scroller, page_no);
292 _D("Page is not found at %d", page_no);
293 return MENU_SCREEN_ERROR_FAIL;
296 for (position_no = 0; position_no < page_max_app; position_no ++) {
299 item = page_get_item_at(page, position_no);
301 *candidate_page = page_no;
302 *candidate_pos = position_no;
303 return MENU_SCREEN_ERROR_OK;
304 } else if ((package = item_get_package(item)) && strcmp(package, ai->package) > 0) {
305 *candidate_page = page_no;
306 *candidate_pos = position_no;
307 return MENU_SCREEN_ERROR_OK;
312 return MENU_SCREEN_ERROR_OK;
317 static menu_screen_error_e _find_position_by_name(Evas_Object *scroller, int *candidate_page, int *candidate_pos, void *data)
321 register int page_no;
322 register int position_no;
323 unsigned int nr_of_pages;
325 app_info_t *ai = data;
327 retv_if(NULL == scroller, MENU_SCREEN_ERROR_INVALID_PARAMETER);
328 retv_if(NULL == candidate_page, MENU_SCREEN_ERROR_INVALID_PARAMETER);
329 retv_if(NULL == candidate_pos, MENU_SCREEN_ERROR_INVALID_PARAMETER);
330 retv_if(NULL == data, MENU_SCREEN_ERROR_INVALID_PARAMETER);
331 retv_if(NULL == ai->name, MENU_SCREEN_ERROR_INVALID_PARAMETER);
335 nr_of_pages = page_scroller_count_page(scroller);
336 page_max_app = (int) evas_object_data_get(scroller, "page_max_app");
337 for (page_no = 0; page_no < nr_of_pages; page_no ++) {
338 page = page_scroller_get_page_at(scroller, page_no);
340 _D("Page is not found at %d", page_no);
341 return MENU_SCREEN_ERROR_FAIL;
344 for (position_no = 0; position_no < page_max_app; position_no ++) {
347 item = page_get_item_at(page, position_no);
349 *candidate_page = page_no;
350 *candidate_pos = position_no;
351 return MENU_SCREEN_ERROR_OK;
352 } else if ((name = item_get_name(item)) && strcmp(name, ai->name) > 0) {
353 *candidate_page = page_no;
354 *candidate_pos = position_no;
355 return MENU_SCREEN_ERROR_OK;
360 return MENU_SCREEN_ERROR_OK;
365 static menu_screen_error_e _animated_pack_item(Evas_Object *item, Evas_Object *scroller, Evas_Object *page, int from)
367 Evas_Object *item_out_page = NULL;
372 retv_if(NULL == item, MENU_SCREEN_ERROR_INVALID_PARAMETER);
373 retv_if(NULL == scroller, MENU_SCREEN_ERROR_INVALID_PARAMETER);
374 retv_if(NULL == page, MENU_SCREEN_ERROR_INVALID_PARAMETER);
376 page_no = page_scroller_get_page_no(scroller, page);
378 to = page_find_empty_near(page, from);
381 page_max_app = (int) evas_object_data_get(page, "page_max_app");
382 to = page_max_app - 1;
383 item_out_page = page_unpack_item_at(page, to);
386 for (to --; to >= from; to --) {
387 Evas_Object *item_in_page;
388 item_in_page = page_unpack_item_at(page, to);
389 page_pack_item(page, to + 1, item_in_page);
390 snprintf(buf, 32, "menu%d", to + 1);
391 edje_object_signal_emit(_EDJ(page), STR_MOVE_PREV, buf);
392 edje_object_signal_emit(_EDJ(page), STR_ANI_RETURN, buf);
395 page_pack_item(page, from, item);
397 if (!item_out_page) break;
400 page = page_scroller_get_page_at(scroller, page_no);
403 rotate = (int) evas_object_data_get(scroller, "rotate");
404 page = page_create(scroller, page_no, rotate);
405 retv_if(NULL == page, MENU_SCREEN_ERROR_FAIL);
406 mapbuf_enable(page, 0);
410 item = item_out_page;
411 item_out_page = NULL;
412 } while (page && item);
414 return MENU_SCREEN_ERROR_OK;
419 HAPI Evas_Object *page_scroller_push_item(Evas_Object *scroller, app_info_t *ai)
423 unsigned int nr_of_pages;
424 int candidate_page = -1;
425 int candidate_pos = 0;
430 page_scroller_sort_type_e sort_type;
431 menu_screen_error_e (*sort_func)(Evas_Object *scroller, int *candidate_page, int *candidate_pos, void *data);
432 } sort_type_map[] = {
434 .sort_type = PAGE_SCROLLER_SORT_BY_DEFAULT,
435 .sort_func = _find_position_by_default,
438 .sort_type = PAGE_SCROLLER_SORT_BY_PACKAGE,
439 .sort_func = _find_position_by_package,
442 .sort_type = PAGE_SCROLLER_SORT_BY_NAME,
443 .sort_func = _find_position_by_name,
446 .sort_type = PAGE_SCROLLER_SORT_MAX,
451 sort_type = (int) evas_object_data_get(scroller, "sort_type");
452 sort_type_map[sort_type].sort_func(scroller, &candidate_page, &candidate_pos, ai);
454 nr_of_pages = page_scroller_count_page(scroller);
456 for (i = nr_of_pages; i <= candidate_page; i ++) {
457 Evas_Object *new_page;
460 rotate = (int) evas_object_data_get(scroller, "rotate");
461 new_page = page_create(scroller, nr_of_pages, rotate);
462 retv_if(NULL == new_page, NULL);
463 mapbuf_enable(new_page, 0);
466 item = item_create(scroller, ai);
467 retv_if(NULL == item, NULL);
469 page = page_scroller_get_page_at(scroller, candidate_page);
471 _D("Impossible, page is not found");
476 retv_if(MENU_SCREEN_ERROR_OK !=
477 _animated_pack_item(item, scroller, page, candidate_pos),
485 HAPI Evas_Object *page_scroller_push_item_by_order(Evas_Object *scroller, app_info_t *ai)
487 int candidate_page = -1;
488 int candidate_pos = -1;
489 Evas_Object *item = NULL;
491 if (MAX_PAGE_NO == page_scroller_count_page(scroller)) {
492 _find_position_all_page(scroller, &candidate_page, &candidate_pos, &ai);
493 if (-1 != candidate_page || -1 != candidate_pos) {
494 item = page_scroller_push_item(scroller, ai);
497 else item = page_scroller_push_item(scroller, ai);
504 static void _mouse_wheel_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
506 Evas_Event_Mouse_Wheel *ei = event_info;
507 Evas_Object *scroller = data;
511 _D("Wheel's up or down(%d)", ei->z);
513 elm_scroller_region_get(scroller, &x, &y, &w, &h);
514 if (ei->z > 0) { // Wheel's up
517 } else if (ei->z < 0) { // Wheel's down
518 idx = x / w; // Scroller got ECORE events at first, then Menu-screen gets EVAS events.
519 } else { // Wheel's not moving.
520 _D("Wheel's not moving");
523 if (idx >= page_scroller_count_page(scroller) || idx < 0) return;
524 evas_object_data_set(scroller, "mouse_wheel_scroller_start", (void *) 1);
525 page_scroller_bring_in(scroller, idx);
530 static inline char *_ltrim(char *str)
532 retv_if(NULL == str, NULL);
533 while (*str && (*str == ' ' || *str == '\t' || *str == '\n')) str ++;
539 static inline int _rtrim(char *str)
543 retv_if(NULL == str, 0);
546 while (--len >= 0 && (str[len] == ' ' || str[len] == '\n' || str[len] == '\t')) {
555 HAPI Evas_Object *page_scroller_create(Evas_Object *tab, Evas_Object *index, page_scroller_sort_type_e sort_type, int rotate)
558 Evas_Object *scroller;
562 scroller = elm_scroller_add(tab);
563 retv_if(NULL == scroller, NULL);
565 elm_scroller_content_min_limit(scroller, EINA_FALSE, EINA_FALSE);
566 elm_scroller_bounce_set(scroller, EINA_TRUE, EINA_FALSE);
567 elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
569 width = menu_screen_get_root_width();
570 height = (int) ((double) PROP_PORTRAIT_HEIGHT * ((double) menu_screen_get_root_height()));
571 elm_scroller_page_size_set(scroller, width, height);
572 elm_scroller_page_scroll_limit_set(scroller, 1, 1);
574 evas_object_size_hint_weight_set(scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
575 evas_object_size_hint_align_set(scroller, EVAS_HINT_FILL, EVAS_HINT_FILL);
576 evas_object_size_hint_min_set(scroller, width, height);
577 evas_object_size_hint_max_set(scroller, width, height);
579 box = elm_box_add(scroller);
581 _D("Failed to create box");
582 evas_object_del(scroller);
585 elm_box_horizontal_set(box, 1);
586 evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
588 evas_object_data_set(scroller, "win", evas_object_data_get(tab, "win"));
589 evas_object_data_set(scroller, "layout", evas_object_data_get(tab, "layout"));
590 evas_object_data_set(scroller, "controlbar", evas_object_data_get(tab, "controlbar"));
591 evas_object_data_set(scroller, "tab", tab);
592 evas_object_data_set(scroller, "page_edje", evas_object_data_get(tab, "page_edje"));
593 evas_object_data_set(scroller, "page_max_app", evas_object_data_get(tab, "page_max_app"));
594 evas_object_data_set(scroller, "item_edje", evas_object_data_get(tab, "item_edje"));
595 evas_object_data_set(scroller, "item_width", evas_object_data_get(tab, "item_width"));
596 evas_object_data_set(scroller, "item_height", evas_object_data_get(tab, "item_height"));
597 evas_object_data_set(scroller, "item_enable_long_press", evas_object_data_get(tab, "item_enable_long_press"));
598 evas_object_data_set(scroller, "item_text_dual_line", evas_object_data_get(tab, "item_text_dual_line"));
599 evas_object_data_set(scroller, "enable_bg_image", evas_object_data_get(tab, "enable_bg_image"));
600 evas_object_data_set(scroller, "box", box);
601 evas_object_data_set(scroller, "drag_start", (void *) 0);
602 evas_object_data_set(scroller, "previous_x", (void *) 0);
603 evas_object_data_set(scroller, "index", index);
604 evas_object_data_set(scroller, "sort_type", (void *) sort_type);
605 evas_object_data_set(scroller, "install_list", (void *) 0);
606 evas_object_data_set(scroller, "rotate", (void *) rotate);
607 evas_object_data_set(scroller, "is_edited", (void *) false);
608 elm_object_content_set(scroller, box);
610 evas_object_smart_callback_add(scroller, "scroll,anim,start", _anim_start_cb, NULL);
611 evas_object_smart_callback_add(scroller, "scroll,anim,stop", _anim_stop_cb, NULL);
612 evas_object_smart_callback_add(scroller, "scroll,drag,start", _drag_start_cb, NULL);
613 evas_object_smart_callback_add(scroller, "scroll,drag,stop", _drag_stop_cb, NULL);
614 evas_object_smart_callback_add(scroller, "scroll", _scroll_cb, NULL);
615 evas_object_event_callback_add(box, EVAS_CALLBACK_DEL, _evas_object_event_del_cb, "BOX");
616 evas_object_event_callback_add(scroller, EVAS_CALLBACK_MOUSE_WHEEL, _mouse_wheel_cb, scroller);
618 evas_object_show(box);
619 evas_object_show(scroller);
621 item_badge_register_changed_cb(scroller);
628 HAPI void page_scroller_destroy(Evas_Object *scroller)
634 const Eina_List *page_list;
638 ret_if(NULL == scroller);
639 ret_if(NULL == (box = evas_object_data_get(scroller, "box")));
640 ret_if(NULL == (page_list = elm_box_children_get(box)));
642 item_badge_unregister_changed_cb();
644 EINA_LIST_FOREACH_SAFE(page_list, l, ln, page) {
648 _D("page list contains nil item");
652 count = eina_list_count(page_list);
653 _D("page_list count : %d", count);
655 elm_box_unpack(box, page);
658 tmp = mapbuf_get_page(page);
661 page_destroy(scroller, page);
664 box = elm_object_content_unset(scroller);
665 evas_object_del(box);
667 evas_object_data_del(scroller, "win");
668 evas_object_data_del(scroller, "layout");
669 evas_object_data_del(scroller, "controlbar");
670 evas_object_data_del(scroller, "tab");
671 evas_object_data_del(scroller, "page_edje");
672 evas_object_data_del(scroller, "page_max_app");
673 evas_object_data_del(scroller, "item_edje");
674 evas_object_data_del(scroller, "item_width");
675 evas_object_data_del(scroller, "item_height");
676 evas_object_data_del(scroller, "item_enable_long_press");
677 evas_object_data_del(scroller, "item_text_dual_line");
678 evas_object_data_del(scroller, "enable_bg_image");
679 evas_object_data_del(scroller, "box");
680 evas_object_data_del(scroller, "drag_start");
681 evas_object_data_del(scroller, "previous_x");
682 evas_object_data_del(scroller, "index");
683 evas_object_data_del(scroller, "sort_type");
684 evas_object_data_del(scroller, "rotate");
685 evas_object_data_del(scroller, "is_edited");
686 evas_object_data_del(scroller, "install_list");
688 evas_object_smart_callback_del(scroller, "scroll,anim,start", _anim_start_cb);
689 evas_object_smart_callback_del(scroller, "scroll,anim,stop", _anim_stop_cb);
690 evas_object_smart_callback_del(scroller, "scroll,drag,start", _drag_start_cb);
691 evas_object_smart_callback_del(scroller, "scroll,drag,stop", _drag_stop_cb);
692 evas_object_smart_callback_del(scroller, "scroll", _scroll_cb);
693 evas_object_event_callback_del(box, EVAS_CALLBACK_DEL, _evas_object_event_del_cb);
694 evas_object_event_callback_del(scroller, EVAS_CALLBACK_MOUSE_WHEEL, _mouse_wheel_cb);
696 evas_object_del(scroller);
702 HAPI void page_scroller_clean(Evas_Object *scroller)
707 register unsigned int i;
708 unsigned int page_max_app;
711 count = page_scroller_count_page(scroller);
712 if (count == 0) return;
714 for (i = 1; i < MAX_PAGE_NO; i++) {
715 page = page_scroller_get_page_at(scroller, i);
716 if (NULL == page) break;
718 page_destroy(scroller, page);
721 page = page_scroller_get_page_at(scroller, 0);
722 ret_if(NULL == page);
724 page_max_app = (unsigned int) evas_object_data_get(scroller, "page_max_app");
725 for (i = 0; i < page_max_app; i++) {
726 item = page_get_item_at(page, i);
735 HAPI Evas_Object *page_scroller_get_page_at(Evas_Object *scroller, unsigned int idx)
737 const Eina_List *page_list;
741 retv_if(idx > MAX_PAGE_NO, NULL);
743 box = evas_object_data_get(scroller, "box");
744 retv_if(NULL == box, NULL);
746 page_list = elm_box_children_get(box);
747 retv_if(NULL == page_list, NULL);
749 item = eina_list_nth(page_list, idx);
751 item = mapbuf_get_page(item);
759 HAPI unsigned int page_scroller_count_page(Evas_Object *scroller)
761 const Eina_List *page_list;
764 box = evas_object_data_get(scroller, "box");
765 retv_if(NULL == box, 0);
767 page_list = elm_box_children_get(box);
768 retv_if(NULL == page_list, 0);
770 return eina_list_count(page_list);
775 HAPI int page_scroller_get_page_no(Evas_Object* scroller, Evas_Object *page)
779 register int idx = 0;
780 const Eina_List *page_list;
781 const Eina_List *pos;
783 box = evas_object_data_get(scroller, "box");
784 retv_if(NULL == box, 0);
786 page_list = elm_box_children_get(box);
787 EINA_LIST_FOREACH(page_list, pos, item) {
789 _D("page list contains nil item");
793 item = mapbuf_get_page(item);
806 HAPI int page_scroller_get_current_page_no(Evas_Object *scroller)
808 return (int) evas_object_data_get(scroller, "current_idx");
813 HAPI Evas_Object *page_scroller_find_item_by_package(Evas_Object *scroller, const char *package, int *page_no)
823 if (!page_no) page_no = &local_page_no;
825 retv_if(NULL == package, NULL);
827 page_max_app = (int) evas_object_data_get(scroller, "page_max_app");
828 for (i = 0; i < page_scroller_count_page(scroller); i ++) {
829 page = page_scroller_get_page_at(scroller, i);
832 for (j = 0; j < page_max_app; j ++) {
833 item = page_get_item_at(page, j);
836 tmp = item_get_package(item);
838 _D("Something goes wrong, this package has no name?");
842 if (!strcmp(tmp, package)) {
854 HAPI void page_scroller_trim_items(Evas_Object *scroller)
856 register unsigned int i;
857 register unsigned int j;
863 Eina_List *list = NULL;
865 page_max_app = (int) evas_object_data_get(scroller, "page_max_app");
866 ret_if (page_max_app == 0);
868 for (i = 0; i < MAX_PAGE_NO; i ++) {
869 page = page_scroller_get_page_at(scroller, i);
872 for (j = 0; j < page_max_app; j++) {
873 item = page_unpack_item_at(page, j);
875 list = eina_list_append(list, item);
876 _D("LIST APPEND : %s", item_get_package(item));
882 for (i = 0; i < eina_list_count(list); i++) {
883 if (i % page_max_app == 0) {
884 page = page_scroller_get_page_at(scroller, i / page_max_app);
885 _D("PAGE GET : 0x%x", page);
887 _E("Cannot get page");
892 item = eina_list_nth(list, i);
894 _E("Cannot get item");
897 _D("LIST GET : [%d] %s", pos, item_get_package(item));
899 page_pack_item(page, pos % page_max_app, item);
903 for (i = pos / page_max_app; i < MAX_PAGE_NO; i++) {
906 page = page_scroller_get_page_at(scroller, i);
910 count = page_count_item(page);
915 _D("PAGE IS EMPTY : 0x%x", page);
917 page_destroy(scroller, page);
918 evas_object_geometry_get(scroller, NULL, NULL, &w, &h);
919 elm_scroller_region_show(scroller, 0, 0, w, h);
923 eina_list_free(list);
928 HAPI void page_scroller_edit(Evas_Object *scroller)
932 register unsigned int page_no;
933 register unsigned int position_no;
934 unsigned int nr_of_pages;
937 nr_of_pages = page_scroller_count_page(scroller);
938 page_max_app = (int) evas_object_data_get(scroller, "page_max_app");
939 for (page_no = 0; page_no < nr_of_pages; page_no ++) {
940 page = page_scroller_get_page_at(scroller, page_no);
943 for (position_no = 0; position_no < page_max_app; position_no ++) {
944 item = page_get_item_at(page, position_no);
952 evas_object_data_set(scroller, "is_edited", (void *) true);
957 HAPI void page_scroller_unedit(Evas_Object *scroller)
959 Evas_Object *all_apps;
962 register int page_no;
963 register unsigned int position_no;
964 unsigned int nr_of_pages;
967 ret_if(NULL == scroller);
969 all_apps = evas_object_data_get(scroller, "tab");
970 ret_if(NULL == all_apps);
972 nr_of_pages = page_scroller_count_page(scroller);
973 page_max_app = (int) evas_object_data_get(scroller, "page_max_app");
975 for (page_no = nr_of_pages - 1; page_no >= 0; page_no --) {
976 page = page_scroller_get_page_at(scroller, page_no);
977 if(NULL == page) continue;
979 page_scroller_trim_items(scroller);
981 for (position_no = 0; position_no < page_max_app; position_no ++) {
982 item = page_get_item_at(page, position_no);
991 evas_object_data_set(scroller, "is_edited", (void *) false);
996 HAPI bool page_scroller_is_edited(Evas_Object *scroller)
998 return (bool) evas_object_data_get(scroller, "is_edited");
1003 HAPI void page_scroller_focus(Evas_Object *scroller)
1006 idx = page_scroller_get_current_page_no(scroller);
1008 Evas_Object *page = NULL;
1009 page = page_scroller_get_page_at(scroller, (unsigned int) idx);
1010 ret_if(NULL == page);
1012 Evas_Object *item = NULL;
1013 item = page_get_item_at(page, 0);
1014 ret_if(NULL == item);
1016 Evas_Object *focus_button = NULL;
1017 focus_button = elm_object_part_content_get(item, "focus");
1018 ret_if(NULL == focus_button);
1020 _D("Focus set scroller(%p), page:%d, item:%s", scroller, idx, item_get_name(item));
1021 elm_object_focus_set(focus_button, EINA_TRUE);
1026 HAPI void page_scroller_focus_into_vector(Evas_Object *scroller, int vector)
1029 idx = page_scroller_get_current_page_no(scroller);
1034 Evas_Object *page = NULL;
1035 page = page_scroller_get_page_at(scroller, (unsigned int) idx);
1036 ret_if(NULL == page);
1038 Evas_Object *item = NULL;
1039 item = page_get_item_at(page, 0);
1040 ret_if(NULL == item);
1042 Evas_Object *focus_button = NULL;
1043 focus_button = elm_object_part_content_get(item, "focus");
1044 ret_if(NULL == focus_button);
1046 _D("Focus set scroller(%p), page:%d, item:%s", scroller, idx, item_get_name(item));
1047 elm_object_focus_set(focus_button, EINA_TRUE);
1049 page_scroller_bring_in(scroller, idx);