4 * Copyright (c) 2009-2014 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>
23 #include "item_badge.h"
27 #include "item_event.h"
31 #include "menu_screen.h"
33 #include "page_scroller.h"
38 #define PAGE_SCROLL_SENSITIVE 0.2
39 #define PROP_PORTRAIT_HEIGHT (PAGE_PORTRAIT_HEIGHT / BASE_HEIGHT)
43 static int _count_pages(Evas_Object *scroller)
45 const Eina_List *children;
48 box = evas_object_data_get(scroller, "box");
49 retv_if(NULL == box, 0);
51 children = elm_box_children_get(box);
52 return eina_list_count(children);
57 HAPI void page_scroller_bring_in(Evas_Object *scroller, int idx)
62 _D("BRING IN TO %d", idx);
64 evas_object_data_set(scroller, "current_idx", (void *) idx);
66 evas_object_geometry_get(scroller, NULL, NULL, &w, &h);
67 elm_scroller_region_bring_in(scroller, idx * w, 0, w, h);
69 index = evas_object_data_get(scroller, "index");
71 _E("cannot find index.");
73 _D("page index bring in to %d", idx);
74 index_bring_in(index, idx);
79 HAPI void page_scroller_show_region(Evas_Object *scroller, int idx)
84 evas_object_geometry_get(scroller, NULL, NULL, &w, &h);
85 elm_scroller_region_show(scroller, idx * w, 0, w, h);
87 index = evas_object_data_get(scroller, "index");
89 _E("cannot find index.");
91 _D("page index bring in to %d", idx);
92 index_bring_in(index, idx);
97 static void _anim_stop_cb(void *data, Evas_Object *scroller, void *event_info)
104 static void _anim_start_cb(void *data, Evas_Object *scroller, void *event_info)
111 Elm_Object_Item *idx_it;
120 drag_start = (int) evas_object_data_get(scroller, "drag_start");
121 previous_x = (int) evas_object_data_get(scroller, "previous_x");
122 index = evas_object_data_get(scroller, "index");
124 ret_if(drag_start == 0);
125 evas_object_data_set(scroller, "drag_start", (void *) 0);
127 elm_scroller_region_get(scroller, &x, &y, &w, &h);
128 threshold = w * PAGE_SCROLL_SENSITIVE;
130 idx_it = elm_index_selected_item_get(index, 0);
131 idx = (int) elm_object_item_data_get(idx_it);
133 if (abs(previous_x - x) > threshold) {
134 if (x > previous_x) idx ++;
135 else if ((x < previous_x) && (idx != 0)) idx --;
138 ret_if(idx >= _count_pages(scroller) || idx < 0);
140 page_scroller_bring_in(scroller, idx);
145 static void _drag_start_cb(void *data, Evas_Object *scroller, void *event_info)
151 elm_scroller_region_get(scroller, &previous_x, NULL, NULL, NULL);
152 evas_object_data_set(scroller, "previous_x", (void *) previous_x);
153 evas_object_data_set(scroller, "drag_start", (void *) 1);
158 static void _drag_stop_cb(void *data, Evas_Object *scroller, void *event_info)
168 elm_scroller_region_get(scroller, &x, &y, &w, &h);
169 previous_x = (int) evas_object_data_get(scroller, "previous_x");
170 if (x == previous_x) {
171 _D("
\e[33mHold scroller (previous) %d (current) %d
\e[0m", previous_x, x);
177 static void _scroller_register(Evas_Object *scroller)
179 evas_object_smart_callback_add(scroller, "scroll,anim,start", _anim_start_cb, NULL);
180 evas_object_smart_callback_add(scroller, "scroll,anim,stop", _anim_stop_cb, NULL);
181 evas_object_smart_callback_add(scroller, "scroll,drag,start", _drag_start_cb, NULL);
182 evas_object_smart_callback_add(scroller, "scroll,drag,stop", _drag_stop_cb, NULL);
187 static void _scroller_unregister(Evas_Object *scroller)
189 evas_object_smart_callback_del(scroller, "scroll,anim,start", _anim_start_cb);
190 evas_object_smart_callback_del(scroller, "scroll,anim,stop", _anim_stop_cb);
191 evas_object_smart_callback_del(scroller, "scroll,drag,start", _drag_start_cb);
192 evas_object_smart_callback_del(scroller, "scroll,drag,stop", _drag_stop_cb);
197 static menu_screen_error_e _find_position_by_default(Evas_Object *scroller, int *candidate_page, int *candidate_pos, void *data)
201 register unsigned int page_no;
202 register unsigned int position_no;
203 unsigned int nr_of_pages;
206 retv_if(NULL == scroller, MENU_SCREEN_ERROR_INVALID_PARAMETER);
207 retv_if(NULL == candidate_page, MENU_SCREEN_ERROR_INVALID_PARAMETER);
208 retv_if(NULL == candidate_pos, MENU_SCREEN_ERROR_INVALID_PARAMETER);
212 nr_of_pages = page_scroller_count_page(scroller);
213 page_max_app = (int) evas_object_data_get(scroller, "page_max_app");
214 for (page_no = 0; page_no < nr_of_pages; page_no ++) {
215 page = page_scroller_get_page_at(scroller, page_no);
217 _D("Page is not found at %d", page_no);
218 return MENU_SCREEN_ERROR_FAIL;
221 for (position_no = 0; position_no < page_max_app; position_no ++) {
222 item = page_get_item_at(page, position_no);
224 *candidate_page = page_no;
225 *candidate_pos = position_no;
226 return MENU_SCREEN_ERROR_OK;
231 *candidate_page = page_no;
234 return MENU_SCREEN_ERROR_OK;
239 static menu_screen_error_e _find_position_by_package(Evas_Object *scroller, int *candidate_page, int *candidate_pos, void *data)
243 register int page_no;
244 register int position_no;
245 unsigned int nr_of_pages;
247 app_info_t *ai = data;
249 retv_if(NULL == scroller, MENU_SCREEN_ERROR_INVALID_PARAMETER);
250 retv_if(NULL == candidate_page, MENU_SCREEN_ERROR_INVALID_PARAMETER);
251 retv_if(NULL == candidate_pos, MENU_SCREEN_ERROR_INVALID_PARAMETER);
252 retv_if(NULL == data, MENU_SCREEN_ERROR_INVALID_PARAMETER);
253 retv_if(NULL == ai->package, MENU_SCREEN_ERROR_INVALID_PARAMETER);
257 nr_of_pages = page_scroller_count_page(scroller);
258 page_max_app = (int) evas_object_data_get(scroller, "page_max_app");
259 for (page_no = 0; page_no < nr_of_pages; page_no ++) {
260 page = page_scroller_get_page_at(scroller, page_no);
262 _D("Page is not found at %d", page_no);
263 return MENU_SCREEN_ERROR_FAIL;
266 for (position_no = 0; position_no < page_max_app; position_no ++) {
269 item = page_get_item_at(page, position_no);
271 *candidate_page = page_no;
272 *candidate_pos = position_no;
273 return MENU_SCREEN_ERROR_OK;
274 } else if ((package = item_get_package(item)) && strcmp(package, ai->package) > 0) {
275 *candidate_page = page_no;
276 *candidate_pos = position_no;
277 return MENU_SCREEN_ERROR_OK;
282 return MENU_SCREEN_ERROR_OK;
287 static menu_screen_error_e _find_position_by_name(Evas_Object *scroller, int *candidate_page, int *candidate_pos, void *data)
291 register int page_no;
292 register int position_no;
293 unsigned int nr_of_pages;
295 app_info_t *ai = data;
297 retv_if(NULL == scroller, MENU_SCREEN_ERROR_INVALID_PARAMETER);
298 retv_if(NULL == candidate_page, MENU_SCREEN_ERROR_INVALID_PARAMETER);
299 retv_if(NULL == candidate_pos, MENU_SCREEN_ERROR_INVALID_PARAMETER);
300 retv_if(NULL == data, MENU_SCREEN_ERROR_INVALID_PARAMETER);
301 retv_if(NULL == ai->name, MENU_SCREEN_ERROR_INVALID_PARAMETER);
305 nr_of_pages = page_scroller_count_page(scroller);
306 page_max_app = (int) evas_object_data_get(scroller, "page_max_app");
307 for (page_no = 0; page_no < nr_of_pages; page_no ++) {
308 page = page_scroller_get_page_at(scroller, page_no);
310 _D("Page is not found at %d", page_no);
311 return MENU_SCREEN_ERROR_FAIL;
314 for (position_no = 0; position_no < page_max_app; position_no ++) {
317 item = page_get_item_at(page, position_no);
319 *candidate_page = page_no;
320 *candidate_pos = position_no;
321 return MENU_SCREEN_ERROR_OK;
322 } else if ((name = item_get_name(item)) && strcmp(name, ai->name) > 0) {
323 *candidate_page = page_no;
324 *candidate_pos = position_no;
325 return MENU_SCREEN_ERROR_OK;
330 return MENU_SCREEN_ERROR_OK;
335 static menu_screen_error_e _animated_pack_item(Evas_Object *item, Evas_Object *scroller, Evas_Object *page, int from)
337 Evas_Object *item_out_page = NULL;
342 retv_if(NULL == item, MENU_SCREEN_ERROR_INVALID_PARAMETER);
343 retv_if(NULL == scroller, MENU_SCREEN_ERROR_INVALID_PARAMETER);
344 retv_if(NULL == page, MENU_SCREEN_ERROR_INVALID_PARAMETER);
346 page_no = page_scroller_get_page_no(scroller, page);
348 to = page_find_empty_near(page, from);
351 page_max_app = (int) evas_object_data_get(page, "page_max_app");
352 to = page_max_app - 1;
353 item_out_page = page_unpack_item_at(page, to);
356 for (to --; to >= from; to --) {
357 Evas_Object *item_in_page;
358 item_in_page = page_unpack_item_at(page, to);
359 page_pack_item(page, to + 1, item_in_page);
360 snprintf(buf, 32, "menu%d", to + 1);
361 edje_object_signal_emit(_EDJ(page), STR_MOVE_PREV, buf);
362 edje_object_signal_emit(_EDJ(page), STR_ANI_RETURN, buf);
365 page_pack_item(page, from, item);
367 if (!item_out_page) break;
370 page = page_scroller_get_page_at(scroller, page_no);
373 rotate = (int) evas_object_data_get(scroller, "rotate");
374 page = page_create(scroller, page_no, rotate);
375 retv_if(NULL == page, MENU_SCREEN_ERROR_FAIL);
376 mapbuf_enable(page, 0);
380 item = item_out_page;
381 item_out_page = NULL;
382 } while (page && item);
384 return MENU_SCREEN_ERROR_OK;
389 static Evas_Object *_animated_unpack_item(Evas_Object *scroller, Evas_Object *page, unsigned int pos)
391 Evas_Object *out = NULL;
393 Evas_Object *next_page;
396 unsigned int page_max_app;
397 unsigned int page_no;
398 page_scroller_sort_type_e sort_type;
400 out = page_unpack_item_at(page, pos);
401 retv_if(NULL == out, NULL);
403 page_no = page_scroller_get_page_no(scroller, page);
404 page_max_app = (unsigned int) evas_object_data_get(scroller, "page_max_app");
405 sort_type = (page_scroller_sort_type_e) evas_object_data_get(scroller, "sort_type");
408 while (page && page_no < MAX_PAGE_NO) {
409 if (0 == page_count_item(page)) {
410 page_destroy(scroller, page);
414 for (; pos < page_max_app; pos ++) {
415 item = page_unpack_item_at(page, pos);
416 if (NULL == item) continue;
418 page_pack_item(page, pos - 1, item);
419 snprintf(buf, 32, "menu%d", pos - 1);
420 edje_object_signal_emit(_EDJ(page), STR_MOVE_NEXT, buf);
421 edje_object_signal_emit(_EDJ(page), STR_ANI_RETURN, buf);
424 if (sort_type == PAGE_SCROLLER_SORT_MAX) {
429 next_page = page_scroller_get_page_at(scroller, page_no);
431 item = page_unpack_item_at(next_page, 0);
432 if (NULL == item) continue;
434 page_pack_item(page, page_max_app - 1, item);
446 HAPI Evas_Object *page_scroller_push_item(Evas_Object *scroller, app_info_t *ai)
450 unsigned int nr_of_pages;
451 int candidate_page = -1;
452 int candidate_pos = 0;
457 page_scroller_sort_type_e sort_type;
458 menu_screen_error_e (*sort_func)(Evas_Object *scroller, int *candidate_page, int *candidate_pos, void *data);
459 } sort_type_map[] = {
461 .sort_type = PAGE_SCROLLER_SORT_BY_DEFAULT,
462 .sort_func = _find_position_by_default,
465 .sort_type = PAGE_SCROLLER_SORT_BY_PACKAGE,
466 .sort_func = _find_position_by_package,
469 .sort_type = PAGE_SCROLLER_SORT_BY_NAME,
470 .sort_func = _find_position_by_name,
473 .sort_type = PAGE_SCROLLER_SORT_MAX,
478 sort_type = (int) evas_object_data_get(scroller, "sort_type");
479 sort_type_map[sort_type].sort_func(scroller, &candidate_page, &candidate_pos, ai);
481 nr_of_pages = page_scroller_count_page(scroller);
483 for (i = nr_of_pages; i <= candidate_page; i ++) {
484 Evas_Object *new_page;
487 rotate = (int) evas_object_data_get(scroller, "rotate");
488 new_page = page_create(scroller, nr_of_pages, rotate);
489 retv_if(NULL == new_page, NULL);
490 mapbuf_enable(new_page, 0);
493 item = item_create(scroller, ai);
494 retv_if(NULL == item, NULL);
496 page = page_scroller_get_page_at(scroller, candidate_page);
498 _D("Impossible, page is not found");
503 retv_if(MENU_SCREEN_ERROR_OK !=
504 _animated_pack_item(item, scroller, page, candidate_pos),
512 static inline menu_screen_error_e _create_cb(const char *package, void *data)
514 app_info_t ai = {0,};
516 Evas_Object *scroller = data;
518 if (MENU_SCREEN_ERROR_FAIL == list_get_values(package, &ai)) {
519 list_free_values(&ai);
520 return MENU_SCREEN_ERROR_FAIL;
525 _D("Scroller is NULL.");
529 if (ai.nodisplay || !ai.enabled)
533 _D("package %s is not visible", package);
534 item = pkgmgr_find_pended_object(ai.package, 1, scroller, &page);
537 page_unpack_item(page, item);
538 page_scroller_trim_items(scroller);
547 item = pkgmgr_find_pended_object(ai.package, 1, scroller, NULL);
549 item = page_scroller_find_item_by_package(scroller, ai.package, NULL);
552 _D("package %s is installed directly", package);
553 item = page_scroller_push_item(scroller, &ai);
557 list_free_values(&ai);
558 retv_if(1, MENU_SCREEN_ERROR_FAIL);
563 _D("Package %s is found, update it!", package);
564 item_update(item, &ai);
567 list_free_values(&ai);
568 return MENU_SCREEN_ERROR_OK;
573 static inline menu_screen_error_e _update_cb(const char *package, void *data)
575 Evas_Object *scroller = data;
578 app_info_t ai = {0,};
580 if (MENU_SCREEN_ERROR_FAIL == list_get_values(package, &ai)) {
581 list_free_values(&ai);
582 return MENU_SCREEN_ERROR_FAIL;
587 _D("Scroller is NULL.");
591 item = page_scroller_find_item_by_package(scroller, package, &page_no);
594 _D("There is no loaded item is found");
595 item = pkgmgr_find_pended_object(package, 1, scroller, &page);
597 if (!ai.nodisplay && ai.enabled) {
598 _D("Item is found for updating from the install list, Ignore this.");
599 item_update(item, &ai);
601 _D("Item is found for updating from the install list, But nodisplay");
603 page_unpack_item(page, item);
604 page_scroller_trim_items(scroller);
610 _D("Item is not found. Create a new one");
611 item = ((!ai.nodisplay && ai.enabled) ? page_scroller_push_item(scroller, &ai) : NULL);
615 list_free_values(&ai);
616 retv_if(1, MENU_SCREEN_ERROR_FAIL);
621 Evas_Object *pended_item;
623 pended_item = pkgmgr_find_pended_object(package, 1, scroller, &page);
625 _D("Cannot find package in the install list");
628 if (!ai.nodisplay && ai.enabled) {
629 item_update(item, &ai);
633 page = page_scroller_get_page_at(scroller, page_no);
635 page_unpack_item(page, item);
636 page_scroller_trim_items(scroller);
642 list_free_values(&ai);
643 return MENU_SCREEN_ERROR_OK;
648 static inline menu_screen_error_e _delete_cb(const char *package, void *data)
652 Evas_Object *scroller = data;
655 register unsigned int i;
656 unsigned int page_max_app;
660 _D("Scroller is NULL.");
664 tmp = pkgmgr_find_pended_object(package, 1, scroller, NULL);
666 item = page_scroller_find_item_by_package(scroller, package, &page_no);
667 retv_if(NULL == item, MENU_SCREEN_ERROR_FAIL);
670 _D("Pended item is %p, Found item is %p", tmp, item);
673 page = page_scroller_get_page_at(scroller, page_no);
674 retv_if(NULL == page, MENU_SCREEN_ERROR_FAIL);
676 page_max_app = (unsigned int) evas_object_data_get(scroller, "page_max_app");
677 for (i = 0; i < page_max_app; i++) {
678 if (item == page_get_item_at(page, i)) {
683 item = _animated_unpack_item(scroller, page, i);
684 retv_if(NULL == item, MENU_SCREEN_ERROR_FAIL);
688 return MENU_SCREEN_ERROR_OK;
693 static struct pkg_event_handler {
694 const char *event_name;
695 int (*event_handler)(const char *package, void *data);
698 .event_name = "create",
699 .event_handler = _create_cb,
702 .event_name = "update",
703 .event_handler = _update_cb,
706 .event_name = "delete",
707 .event_handler = _delete_cb,
711 .event_handler = NULL,
717 static void _desktop_cb(keynode_t *node, void *data)
721 char package[BUFSZE];
724 event = vconf_get_str(vconf_keynode_get_name(node));
725 ret_if(NULL == event);
727 if (sscanf(event, "%10[^:]:%1023s", type, package) != 2) {
728 _D("Failed to parse the event format : [%s], [%s]", type, package);
731 _D("command[%s], package[%s]", type, package);
733 for (i = 0; event_table[i].event_name; i ++) {
734 if (!strcasecmp(type, event_table[i].event_name)) {
735 if (event_table[i].event_handler(package, data) == MENU_SCREEN_ERROR_FAIL) {
736 _E("Failed to handles the desktop notification event");
744 _E("Failed to find a proper event handler");
750 static void _mapbuf_cb(keynode_t *node, void *data)
757 if (vconf_get_int("memory/menuscreen/mapbuf", &value) < 0) {
758 _D("Failed to get mapbuf status");
762 nr_of_pages = page_scroller_count_page(data);
764 for (i = 0; i < nr_of_pages; i ++) {
765 page = page_scroller_get_page_at(data, i);
768 if (!mapbuf_is_enabled(page)) {
769 _D("Enable mapbuf %d", i);
770 mapbuf_enable(page, 1);
774 for (i = 0; i < nr_of_pages; i ++) {
775 page = page_scroller_get_page_at(data, i);
778 if (mapbuf_is_enabled(page)) {
779 _D("Disable mapbuf %d", i);
780 mapbuf_disable(page, 1);
788 static void _mouse_wheel_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
790 Evas_Event_Mouse_Wheel *ei = event_info;
791 Evas_Object *scroller = data;
795 _D("Wheel's up or down(%d)", ei->z);
797 elm_scroller_region_get(scroller, &x, &y, &w, &h);
798 if (ei->z > 0) { // Wheel's up
801 } else if (ei->z < 0) { // Wheel's down
802 idx = x / w; // Scroller got ECORE events at first, then Menu-screen gets EVAS events.
803 } else { // Wheel's not moving.
804 _D("Wheel's not moving");
807 if (idx >= page_scroller_count_page(scroller) || idx < 0) return;
808 page_scroller_bring_in(scroller, idx);
813 HAPI Evas_Object *page_scroller_create(Evas_Object *tab, Evas_Object *index, page_scroller_sort_type_e sort_type, int rotate)
816 Evas_Object *scroller;
820 scroller = elm_scroller_add(tab);
821 retv_if(NULL == scroller, NULL);
823 elm_scroller_content_min_limit(scroller, EINA_FALSE, EINA_FALSE);
824 elm_scroller_bounce_set(scroller, EINA_TRUE, EINA_FALSE);
825 elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
827 width = menu_screen_get_root_width();
828 height = (int) ((double) PROP_PORTRAIT_HEIGHT * ((double) menu_screen_get_root_height()));
829 elm_scroller_page_size_set(scroller, width, height);
831 evas_object_size_hint_weight_set(scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
832 evas_object_size_hint_align_set(scroller, EVAS_HINT_FILL, EVAS_HINT_FILL);
833 evas_object_size_hint_min_set(scroller, width, height);
834 evas_object_size_hint_max_set(scroller, width, height);
836 _scroller_register(scroller);
838 box = elm_box_add(scroller);
840 _D("Failed to create box");
841 evas_object_del(scroller);
844 elm_box_horizontal_set(box, 1);
845 evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
847 evas_object_data_set(scroller, "win", evas_object_data_get(tab, "win"));
848 evas_object_data_set(scroller, "layout", evas_object_data_get(tab, "layout"));
849 evas_object_data_set(scroller, "controlbar", evas_object_data_get(tab, "controlbar"));
850 evas_object_data_set(scroller, "tab", tab);
851 evas_object_data_set(scroller, "page_edje", evas_object_data_get(tab, "page_edje"));
852 evas_object_data_set(scroller, "page_max_app", evas_object_data_get(tab, "page_max_app"));
853 evas_object_data_set(scroller, "item_edje", evas_object_data_get(tab, "item_edje"));
854 evas_object_data_set(scroller, "item_width", evas_object_data_get(tab, "item_width"));
855 evas_object_data_set(scroller, "item_height", evas_object_data_get(tab, "item_height"));
856 evas_object_data_set(scroller, "item_enable_long_press", evas_object_data_get(tab, "item_enable_long_press"));
857 evas_object_data_set(scroller, "item_text_dual_line", evas_object_data_get(tab, "item_text_dual_line"));
858 evas_object_data_set(scroller, "enable_bg_image", evas_object_data_get(tab, "enable_bg_image"));
859 evas_object_data_set(scroller, "box", box);
860 evas_object_data_set(scroller, "drag_start", (void *) 0);
861 evas_object_data_set(scroller, "previous_x", (void *) 0);
862 evas_object_data_set(scroller, "index", index);
863 evas_object_data_set(scroller, "sort_type", (void *) sort_type);
864 evas_object_data_set(scroller, "install_list", (void *) 0);
865 evas_object_data_set(scroller, "rotate", (void *) rotate);
866 evas_object_data_set(scroller, "is_edited", (void *) false);
867 elm_object_content_set(scroller, box);
869 evas_object_event_callback_add(box, EVAS_CALLBACK_DEL, _evas_object_event_del_cb, "BOX");
870 evas_object_event_callback_add(scroller, EVAS_CALLBACK_MOUSE_WHEEL, _mouse_wheel_cb, scroller);
872 evas_object_show(box);
873 evas_object_show(scroller);
875 if (vconf_notify_key_changed(VCONFKEY_AIL_INFO_STATE, _desktop_cb, scroller) < 0) {
876 _E("Failed to register a desktop change event handler");
879 if (vconf_notify_key_changed("memory/menuscreen/mapbuf", _mapbuf_cb, scroller) < 0) {
880 _E("Failed to register a vconf cb for %s", "memory/menuscreen/mapbuf");
883 // FIXME : This will be enabled after rebuilding the routine for appid <-> pkgid.
884 //pkgmgr_init(scroller);
885 item_badge_register_changed_cb(scroller);
892 HAPI void page_scroller_destroy(Evas_Object *scroller)
898 const Eina_List *page_list;
902 ret_if(NULL == scroller);
903 ret_if(NULL == (box = evas_object_data_get(scroller, "box")));
904 ret_if(NULL == (page_list = elm_box_children_get(box)));
906 item_badge_unregister_changed_cb();
908 // FIXME : This will be enabled after rebuilding the routine for appid <-> pkgid.
911 EINA_LIST_FOREACH_SAFE(page_list, l, ln, page) {
915 _D("page list contains nil item");
919 count = eina_list_count(page_list);
920 _D("page_list count : %d", count);
922 elm_box_unpack(box, page);
925 tmp = mapbuf_get_page(page);
928 page_destroy(scroller, page);
931 box = elm_object_content_unset(scroller);
932 evas_object_del(box);
934 _scroller_unregister(scroller);
935 evas_object_data_del(scroller, "win");
936 evas_object_data_del(scroller, "layout");
937 evas_object_data_del(scroller, "controlbar");
938 evas_object_data_del(scroller, "tab");
939 evas_object_data_del(scroller, "page_edje");
940 evas_object_data_del(scroller, "page_max_app");
941 evas_object_data_del(scroller, "item_edje");
942 evas_object_data_del(scroller, "item_width");
943 evas_object_data_del(scroller, "item_height");
944 evas_object_data_del(scroller, "item_enable_long_press");
945 evas_object_data_del(scroller, "item_text_dual_line");
946 evas_object_data_del(scroller, "enable_bg_image");
947 evas_object_data_del(scroller, "box");
948 evas_object_data_del(scroller, "drag_start");
949 evas_object_data_del(scroller, "previous_x");
950 evas_object_data_del(scroller, "index");
951 evas_object_data_del(scroller, "sort_type");
952 evas_object_data_del(scroller, "rotate");
953 evas_object_data_del(scroller, "is_edited");
954 evas_object_data_del(scroller, "install_list");
956 evas_object_del(scroller);
957 evas_object_event_callback_del(box, EVAS_CALLBACK_DEL, _evas_object_event_del_cb);
958 evas_object_event_callback_del(scroller, EVAS_CALLBACK_MOUSE_WHEEL, _mouse_wheel_cb);
960 if (vconf_ignore_key_changed(VCONFKEY_AIL_INFO_STATE, _desktop_cb) < 0) {
961 _E("Failed to ignore the desktop event");
964 if (vconf_ignore_key_changed("memory/menuscreen/mapbuf", _mapbuf_cb) < 0) {
965 _E("Failed to remove vconf %s", "memory/menuscreen/mapbuf");
971 HAPI void page_scroller_clean(Evas_Object *scroller)
976 register unsigned int i;
977 unsigned int page_max_app;
980 count = page_scroller_count_page(scroller);
981 if (count == 0) return;
983 for (i = 1; i < MAX_PAGE_NO; i++) {
984 page = page_scroller_get_page_at(scroller, i);
985 if (NULL == page) break;
987 page_destroy(scroller, page);
990 page = page_scroller_get_page_at(scroller, 0);
991 ret_if(NULL == page);
993 page_max_app = (unsigned int) evas_object_data_get(scroller, "page_max_app");
994 for (i = 0; i < page_max_app; i++) {
995 item = page_get_item_at(page, i);
1004 HAPI Evas_Object *page_scroller_get_page_at(Evas_Object *scroller, unsigned int idx)
1006 const Eina_List *page_list;
1010 retv_if(idx >= MAX_PAGE_NO, NULL);
1012 box = evas_object_data_get(scroller, "box");
1013 retv_if(NULL == box, NULL);
1015 page_list = elm_box_children_get(box);
1016 retv_if(NULL == page_list, NULL);
1018 item = eina_list_nth(page_list, idx);
1020 item = mapbuf_get_page(item);
1028 HAPI unsigned int page_scroller_count_page(Evas_Object *scroller)
1030 const Eina_List *page_list;
1033 box = evas_object_data_get(scroller, "box");
1034 retv_if(NULL == box, 0);
1036 page_list = elm_box_children_get(box);
1037 retv_if(NULL == page_list, 0);
1039 return eina_list_count(page_list);
1044 HAPI int page_scroller_get_page_no(Evas_Object* scroller, Evas_Object *page)
1048 register int idx = 0;
1049 const Eina_List *page_list;
1050 const Eina_List *pos;
1052 box = evas_object_data_get(scroller, "box");
1053 retv_if(NULL == box, 0);
1055 page_list = elm_box_children_get(box);
1056 EINA_LIST_FOREACH(page_list, pos, item) {
1058 _D("page list contains nil item");
1062 item = mapbuf_get_page(item);
1075 HAPI Evas_Object *page_scroller_find_item_by_package(Evas_Object *scroller, const char *package, int *page_no)
1085 if (!page_no) page_no = &local_page_no;
1087 retv_if(NULL == package, NULL);
1089 page_max_app = (int) evas_object_data_get(scroller, "page_max_app");
1090 for (i = 0; i < page_scroller_count_page(scroller); i ++) {
1091 page = page_scroller_get_page_at(scroller, i);
1092 if (!page) continue;
1094 for (j = 0; j < page_max_app; j ++) {
1095 item = page_get_item_at(page, j);
1096 if (!item) continue;
1098 tmp = item_get_package(item);
1100 _D("Something goes wrong, this package has no name?");
1104 if (!strcmp(tmp, package)) {
1116 HAPI void page_scroller_trim_items(Evas_Object *scroller)
1118 register unsigned int i;
1119 register unsigned int j;
1125 Eina_List *list = NULL;
1127 page_max_app = (int) evas_object_data_get(scroller, "page_max_app");
1128 for (i = 0; i < MAX_PAGE_NO; i ++) {
1129 page = page_scroller_get_page_at(scroller, i);
1132 for (j = 0; j < page_max_app; j++) {
1133 item = page_unpack_item_at(page, j);
1135 list = eina_list_append(list, item);
1136 _D("LIST APPEND : %s", item_get_package(item));
1142 for (i = 0; i < eina_list_count(list); i++) {
1143 if (i % page_max_app == 0) {
1144 page = page_scroller_get_page_at(scroller, i / page_max_app);
1145 _D("PAGE GET : 0x%x", page);
1147 _E("Cannot get page");
1152 item = eina_list_nth(list, i);
1154 _E("Cannot get item");
1157 _D("LIST GET : [%d] %s", pos, item_get_package(item));
1159 page_pack_item(page, pos % page_max_app, item);
1163 for (i = pos / page_max_app; i < MAX_PAGE_NO; i++) {
1166 page = page_scroller_get_page_at(scroller, i);
1170 count = page_count_item(page);
1175 _D("PAGE IS EMPTY : 0x%x", page);
1177 page_destroy(scroller, page);
1178 evas_object_geometry_get(scroller, NULL, NULL, &w, &h);
1179 elm_scroller_region_show(scroller, 0, 0, w, h);
1183 eina_list_free(list);
1188 HAPI void page_scroller_edit(Evas_Object *scroller)
1192 register unsigned int page_no;
1193 register unsigned int position_no;
1194 unsigned int nr_of_pages;
1197 nr_of_pages = page_scroller_count_page(scroller);
1198 page_max_app = (int) evas_object_data_get(scroller, "page_max_app");
1199 for (page_no = 0; page_no < nr_of_pages; page_no ++) {
1200 page = page_scroller_get_page_at(scroller, page_no);
1201 ret_if(NULL == page);
1203 for (position_no = 0; position_no < page_max_app; position_no ++) {
1204 item = page_get_item_at(page, position_no);
1212 evas_object_data_set(scroller, "is_edited", (void *) true);
1217 HAPI void page_scroller_unedit(Evas_Object *scroller)
1219 Evas_Object *all_apps;
1222 register int page_no;
1223 register unsigned int position_no;
1224 unsigned int nr_of_pages;
1227 ret_if(NULL == scroller);
1229 all_apps = evas_object_data_get(scroller, "tab");
1230 ret_if(NULL == all_apps);
1232 nr_of_pages = page_scroller_count_page(scroller);
1233 page_max_app = (int) evas_object_data_get(scroller, "page_max_app");
1235 for (page_no = nr_of_pages - 1; page_no >= 0; page_no --) {
1238 page = page_scroller_get_page_at(scroller, page_no);
1239 if (NULL == page) break;
1240 count = page_count_item(page);
1242 page_scroller_trim_items(scroller);
1244 for (position_no = 0; position_no < page_max_app; position_no ++) {
1245 item = page_get_item_at(page, position_no);
1254 evas_object_data_set(scroller, "is_edited", (void *) false);
1259 HAPI bool page_scroller_is_edited(Evas_Object *scroller)
1261 return (bool) evas_object_data_get(scroller, "is_edited");