2 * Copyright 2012 Samsung Electronics Co., Ltd
4 * Licensed under the Flora License, Version 1.1 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://floralicense.org/license/
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include <efl_extension.h>
19 #include "homescreen-efl.h"
20 #include "cluster_view.h"
24 #include "page_indicator.h"
25 #include "widget_viewer.h"
28 #include "cluster_page.h"
29 #include "cluster_data.h"
30 #include "add_widget_viewer/add_widget_viewer.h"
32 #include "screen_reader_handler.h"
34 #define SCROLL_STOP_TIME 0.05
38 Evas_Object *scroller;
41 Evas_Object *allpage_add_page;
42 Evas_Object *allpage_grid;
43 page_indicator_t *indicator;
46 view_state_t view_state;
48 cluster_page_t *picked_page;
49 widget_data_t *picked_widget;
50 Ecore_Timer *edit_mode_scroll_timer;
51 Ecore_Timer *scroll_stop_timer;
53 Ecore_Animator *edit_animator;
62 .allpage_add_page = NULL,
66 .current_page = INIT_VALUE,
67 .view_state = VIEW_STATE_NORMAL,
70 .picked_widget = NULL,
71 .edit_mode_scroll_timer = NULL,
72 .scroll_stop_timer = NULL,
74 .edit_animator = NULL,
75 .animation_from_x = INIT_VALUE,
76 .animation_from_y = INIT_VALUE,
77 .animation_to_x = INIT_VALUE,
78 .animation_to_y = INIT_VALUE,
81 static int cluster_menu_list[4] = {
83 MENU_CLUSTER_ADD_WIDGET,
84 MENU_CLUSTER_CHANGE_WALLPAPER,
85 MENU_CLUSTER_ALL_PAGES
88 static mouse_info_t cluster_mouse_info = {
90 .long_pressed = false,
97 .long_press_timer = NULL,
103 //#define SCROLL_TIMING_ISSUE
104 #ifdef SCROLL_TIMING_ISSUE
105 #define SCROLL_TIMING_INTERVAL 0.001
107 static Ecore_Timer *__scroll_timing_timer = NULL;
110 static Eina_Hash *cluster_menu_table = NULL;
112 Evas_Object *__cluster_view_create_base_gui(Evas_Object *win);
114 static void __clsuter_view_scroller_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
115 static void __clsuter_view_scroller_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
116 static void __clsuter_view_scroller_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
117 static Eina_Bool __cluster_view_scroller_long_press_time_cb(void *data);
119 static void __cluster_view_create_cluster(void);
120 static void __cluster_view_create_menu(void);
121 static void __cluster_view_menu_edit_cb(void *data, Evas_Object *obj, void *event_info);
122 static void __cluster_view_menu_add_widget_cb(void *data, Evas_Object *obj, void *event_info);
123 static void __cluster_view_menu_change_wallpaper_cb(void *data, Evas_Object *obj, void *event_info);
124 static void __cluster_view_menu_all_pages_cb(void *data, Evas_Object *obj, void *event_info);
125 static void __cluster_view_app_launch_request_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *data);
126 static void __cluster_view_scroll_to_home(void);
127 static void __cluster_view_scroll_to_page(int page_idx, bool animation);
128 static void __cluster_view_add_widget_content(widget_data_t *item);
129 static void __cluster_view_create_all_page(void);
130 static void __cluster_view_destroy_all_page(void);
131 static cluster_page_t * __cluster_view_page_new(void);
132 static void __cluster_view_page_delete(cluster_page_t *page);
133 static void __cluster_view_allpage_delete_clicked(void *data, Evas_Object *obj, const char *emission, const char *source);
134 static void __cluster_view_allpage_add_clicked(void *data, Evas_Object *obj, const char *emission, const char *source);
135 static void __cluster_view_allpage_delete_page_cb(void *data, Evas_Object *obj, void *event_info);
137 static void __clsuter_view_thumbnail_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
138 static void __clsuter_view_thumbnail_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
139 static void __clsuter_view_thumbnail_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
140 static Eina_Bool __cluster_view_thumbnail_long_press_time_cb(void *data);
141 static void __cluster_view_allpage_drag_page(void *data);
142 static void __cluster_view_allpage_pick_up_page(void *data);
143 static void __cluster_view_allpage_drop_page(void *data);
144 static void __cluster_view_allpage_clicked_page(void *data, Evas_Object *obj, const char *emission, const char *source);
146 static void __clsuter_view_widget_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
147 static void __clsuter_view_widget_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
148 static void __clsuter_view_widget_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
149 static Eina_Bool __cluster_view_widget_long_press_time_cb(void *data);
151 static void __cluster_view_edit_pick_up_widget(void *data);
152 static void __cluster_view_edit_drag_widget(void *data);
153 static void __cluster_view_edit_drop_widget(void *data);
154 static Eina_Bool __cluster_view_edit_move_anim(void *data, double pos);
155 static void __cluster_view_edit_move_anim_done(void *data);
157 static Eina_Bool __cluster_view_scroll_timer_cb(void *data);
159 static void __cluster_view_scroll_drag_start_cb(void *data, Evas_Object *obj, void *event_info);
160 static void __cluster_view_scroll_drag_stop_cb(void *data, Evas_Object *obj, void *event_info);
161 static void __cluster_view_scroll_anim_start_cb(void *data, Evas_Object *obj, void *event_info);
162 static void __cluster_view_scroll_anim_stop_cb(void *data, Evas_Object *obj, void *event_info);
163 static void __cluster_view_scroll_start(void);
164 static Eina_Bool __cluster_view_scroll_stop(void *data);
165 static void __cluster_view_allpage_get_page_pos(int page_idx, int *w, int *h);
166 static int __cluster_view_allpage_get_page_index(int x, int y);
167 static void __cluster_view_allpage_reposition(void);
168 static int __cluster_view_page_sort_cb(const void *a , const void *b);
170 static void __cluster_view_get_access_page_thumbnail(Eina_List **list);
171 static void __cluster_view_get_access_page_delete_button(Eina_List **list);
172 static void __cluster_view_get_access_add_page(Eina_List **list);
174 Evas_Object *cluster_view_create(Evas_Object *win)
176 cluster_view_s.win = win;
178 Evas_Object *base_layout = __cluster_view_create_base_gui(win);
180 if (base_layout == NULL) {
181 LOGE("[FAILED][base_layout == NULL]");
185 cluster_view_s.indicator = page_indictor_create(cluster_view_s.scroller);
186 page_indicator_scroller_resize(cluster_view_s.indicator, CLUSTER_VIEW_W , CLUSTER_VIEW_H);
191 void cluster_view_init(void)
193 widget_viewer_init(cluster_view_s.win);
196 __cluster_view_create_cluster();
197 __cluster_view_create_menu();
200 void cluster_view_app_terminate(void)
202 evas_object_smart_callback_del(cluster_view_s.scroller, "scroll,drag,start", __cluster_view_scroll_drag_start_cb);
203 evas_object_smart_callback_del(cluster_view_s.scroller, "scroll,drag,stop", __cluster_view_scroll_drag_stop_cb);
204 evas_object_smart_callback_del(cluster_view_s.scroller, "scroll,anim,start", __cluster_view_scroll_anim_start_cb);
205 evas_object_smart_callback_del(cluster_view_s.scroller, "scroll,anim,stop", __cluster_view_scroll_anim_stop_cb);
207 evas_object_event_callback_del(cluster_view_s.scroller, EVAS_CALLBACK_MOUSE_DOWN, __clsuter_view_scroller_down_cb);
208 evas_object_event_callback_del(cluster_view_s.scroller, EVAS_CALLBACK_MOUSE_MOVE, __clsuter_view_scroller_move_cb);
209 evas_object_event_callback_del(cluster_view_s.scroller, EVAS_CALLBACK_MOUSE_UP, __clsuter_view_scroller_up_cb);
211 eina_hash_free(cluster_menu_table);
212 widget_viewer_fini();
215 void cluster_view_show(void)
217 page_indicator_show(cluster_view_s.indicator);
220 void cluster_view_hide(void)
222 page_indicator_hide(cluster_view_s.indicator);
225 void cluster_view_show_anim(double pos)
227 evas_object_color_set(cluster_view_s.box, 255, 255, 255, pos*255);
228 if (pos >= (1.0 - (1e-10))) {
229 evas_object_color_set(cluster_view_s.box, 255, 255, 255, 255);
233 void cluster_view_hide_anim(double pos)
235 evas_object_color_set(cluster_view_s.box, 255, 255, 255, (1-pos)*255);
236 if (pos >= (1.0 - (1e-10))) {
237 evas_object_color_set(cluster_view_s.box, 255, 255, 255, 0);
241 Evas_Object *__cluster_view_create_base_gui(Evas_Object *win)
243 cluster_view_s.scroller = elm_scroller_add(win);
244 if (cluster_view_s.scroller == NULL) {
247 elm_scroller_content_min_limit(cluster_view_s.scroller, EINA_FALSE, EINA_FALSE);
248 elm_scroller_bounce_set(cluster_view_s.scroller, EINA_FALSE, EINA_FALSE);
249 elm_scroller_policy_set(cluster_view_s.scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
250 elm_scroller_page_scroll_limit_set(cluster_view_s.scroller, 1, 0);
251 evas_object_size_hint_weight_set(cluster_view_s.scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
252 evas_object_resize(cluster_view_s.scroller, CLUSTER_VIEW_W, CLUSTER_VIEW_H);
254 elm_scroller_loop_set(cluster_view_s.scroller, EINA_FALSE, EINA_FALSE);
255 elm_scroller_page_size_set(cluster_view_s.scroller, CLUSTER_VIEW_W , CLUSTER_VIEW_H);
257 evas_object_event_callback_add(cluster_view_s.scroller, EVAS_CALLBACK_MOUSE_DOWN, __clsuter_view_scroller_down_cb, NULL);
258 evas_object_event_callback_add(cluster_view_s.scroller, EVAS_CALLBACK_MOUSE_MOVE, __clsuter_view_scroller_move_cb, NULL);
259 evas_object_event_callback_add(cluster_view_s.scroller, EVAS_CALLBACK_MOUSE_UP, __clsuter_view_scroller_up_cb, NULL);
261 evas_object_smart_callback_add(cluster_view_s.scroller, "scroll,drag,start", __cluster_view_scroll_drag_start_cb, NULL);
262 evas_object_smart_callback_add(cluster_view_s.scroller, "scroll,drag,stop", __cluster_view_scroll_drag_stop_cb, NULL);
263 evas_object_smart_callback_add(cluster_view_s.scroller, "scroll,anim,start", __cluster_view_scroll_anim_start_cb, NULL);
264 evas_object_smart_callback_add(cluster_view_s.scroller, "scroll,anim,stop", __cluster_view_scroll_anim_stop_cb, NULL);
266 cluster_view_s.box = elm_box_add(cluster_view_s.scroller);
267 elm_box_horizontal_set(cluster_view_s.box, EINA_TRUE);
268 evas_object_size_hint_weight_set(cluster_view_s.box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
269 evas_object_size_hint_align_set(cluster_view_s.box, 0, 0);
270 evas_object_show(cluster_view_s.box);
272 elm_object_content_set(cluster_view_s.scroller, cluster_view_s.box);
274 return cluster_view_s.scroller;
277 static void __cluster_view_create_cluster(void)
279 Eina_List *widget_list = cluster_data_get_widget_list();
280 int page_count = cluster_data_get_page_count();
281 cluster_view_s.current_page = CLUSTER_HOME_PAGE;
283 while (page_count--) {
284 __cluster_view_page_new();
287 Eina_List *find_list;
288 widget_data_t *item = NULL;
289 EINA_LIST_FOREACH(widget_list, find_list, item) {
290 __cluster_view_add_widget_content(item);
291 cluster_page_t *page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, item->page_idx);
293 LOGE("page is NULL");
295 if (!cluster_page_set_widget(page, item)) {
296 LOGE("failed cluster_page_set_widget page %d", item->page_idx);
301 page_indicator_set_current_page(cluster_view_s.indicator, cluster_view_s.current_page);
304 static void __cluster_view_create_menu(void)
306 cluster_menu_table = eina_hash_int32_new(NULL);
307 eina_hash_add(cluster_menu_table, &cluster_menu_list[0], __cluster_view_menu_edit_cb);
308 eina_hash_add(cluster_menu_table, &cluster_menu_list[1], __cluster_view_menu_add_widget_cb);
309 eina_hash_add(cluster_menu_table, &cluster_menu_list[2], __cluster_view_menu_change_wallpaper_cb);
310 eina_hash_add(cluster_menu_table, &cluster_menu_list[3], __cluster_view_menu_all_pages_cb);
313 static void __cluster_view_menu_edit_cb(void *data, Evas_Object *obj, void *event_info)
317 cluster_view_set_state(VIEW_STATE_EDIT);
320 static void __cluster_view_menu_add_widget_cb(void *data, Evas_Object *obj, void *event_info)
324 cluster_view_set_state(VIEW_STATE_ADD_VIEWER);
327 static void __cluster_view_menu_change_wallpaper_cb(void *data, Evas_Object *obj, void *event_info)
329 const char *appid = "org.tizen.wallpaper-ui-service";
330 app_control_h app_control_handle = NULL;
332 if (app_control_create(&app_control_handle) != APP_CONTROL_ERROR_NONE) {
333 LOGE("[FAILED][app_control_create]");
337 app_control_add_extra_data(app_control_handle, "from", "Homescreen-efl");
338 app_control_add_extra_data(app_control_handle, "popup_type", "selection_popup");
339 app_control_add_extra_data(app_control_handle, "setas-type", "Homescreen");
341 if (app_control_set_app_id(app_control_handle, appid) != APP_CONTROL_ERROR_NONE) {
342 LOGE("[FAILED][app_control_set_app_id]");
343 app_control_destroy(app_control_handle);
347 if (app_control_set_operation(app_control_handle, APP_CONTROL_OPERATION_MAIN) != APP_CONTROL_ERROR_NONE) {
348 LOGE("[FAILED][app_control_set_operation]");
349 app_control_destroy(app_control_handle);
353 if (app_control_send_launch_request(app_control_handle, __cluster_view_app_launch_request_cb, NULL) != APP_CONTROL_ERROR_NONE) {
354 LOGE("[FAILED][app_control_send_launch_request]");
355 app_control_destroy(app_control_handle);
359 app_control_destroy(app_control_handle);
364 static void __cluster_view_menu_all_pages_cb(void *data, Evas_Object *obj, void *event_info)
368 cluster_view_set_state(VIEW_STATE_ALL_PAGE);
371 void cluster_view_hw_menu_key(void)
373 if (cluster_view_s.view_state == VIEW_STATE_NORMAL)
374 menu_change_state_on_hw_menu_key(cluster_menu_table);
377 bool cluster_view_hw_home_key(void)
379 if (cluster_view_s.view_state == VIEW_STATE_NORMAL) {
380 __cluster_view_scroll_to_home();
381 } else if (cluster_view_s.view_state == VIEW_STATE_EDIT) {
382 cluster_view_set_state(VIEW_STATE_NORMAL);
383 } else if (cluster_view_s.view_state == VIEW_STATE_ADD_VIEWER) {
384 cluster_view_set_state(VIEW_STATE_NORMAL);
385 } else if (cluster_view_s.view_state == VIEW_STATE_ALL_PAGE) {
386 cluster_view_set_state(VIEW_STATE_NORMAL);
392 bool cluster_view_hw_back_key(void)
394 if (cluster_view_s.view_state == VIEW_STATE_EDIT) {
395 cluster_view_set_state(VIEW_STATE_NORMAL);
396 } else if (cluster_view_s.view_state == VIEW_STATE_ADD_VIEWER) {
397 cluster_view_set_state(VIEW_STATE_NORMAL);
398 } else if (cluster_view_s.view_state == VIEW_STATE_ALL_PAGE) {
399 cluster_view_set_state(VIEW_STATE_NORMAL);
405 void cluster_view_lang_changed(homescreen_view_t view_type)
407 if (view_type == HOMESCREEN_VIEW_HOME) {
408 cluster_view_set_state(VIEW_STATE_NORMAL);
412 view_state_t cluster_view_get_state(void)
414 return cluster_view_s.view_state;
417 bool cluster_view_set_state(view_state_t state)
419 if (cluster_view_s.is_srolling) {
420 LOGE("cannot change view-state");
424 if (cluster_view_s.edit_animator) {
425 ecore_animator_del(cluster_view_s.edit_animator);
426 cluster_view_s.edit_animator = NULL;
427 __cluster_view_edit_move_anim_done(cluster_view_s.picked_widget);
430 if (state == VIEW_STATE_EDIT) {
431 homescreen_efl_btn_hide(HOMESCREEN_VIEW_HOME);
433 Eina_List *data_list = cluster_data_get_widget_list();
434 Eina_List *find_list = NULL;
436 widget_data_t *item = NULL;
437 EINA_LIST_FOREACH(data_list, find_list, item) {
438 if (item->widget_layout) {
439 if (!cluster_view_s.picked_widget || item->widget_layout != cluster_view_s.picked_widget->widget_layout) {
440 elm_object_signal_emit(item->widget_layout, SIGNAL_DELETE_BUTTON_SHOW_ANI, SIGNAL_SOURCE);
442 evas_object_event_callback_add(item->widget_content, EVAS_CALLBACK_MOUSE_DOWN, __clsuter_view_widget_down_cb, item);
443 evas_object_event_callback_add(item->widget_content, EVAS_CALLBACK_MOUSE_MOVE, __clsuter_view_widget_move_cb, item);
444 evas_object_event_callback_add(item->widget_content, EVAS_CALLBACK_MOUSE_UP, __clsuter_view_widget_up_cb, item);
446 widget_viewer_thumbnail_add(item);
447 widget_viewer_pause_widget(item);
448 elm_object_signal_emit(item->widget_layout, SIGNAL_CLUSTER_EDIT_STATE, SIGNAL_SOURCE);
452 cluster_page_t *page_item = NULL;
453 EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) {
454 if (page_item->page_layout) {
455 elm_object_signal_emit(page_item->page_layout, SIGNAL_EDIT_MODE_ON, SIGNAL_SOURCE);
458 } else if (state == VIEW_STATE_NORMAL) {
459 if (cluster_view_s.view_state == VIEW_STATE_EDIT) {
460 homescreen_efl_btn_show(HOMESCREEN_VIEW_HOME);
462 if (cluster_view_s.picked_widget) {
463 cluster_page_t *page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, cluster_view_s.picked_widget->page_idx);
464 cluster_page_set_widget(page, cluster_view_s.picked_widget);
466 cluster_view_s.picked_widget = NULL;
468 page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, cluster_view_s.current_page);
469 cluster_page_drag_cancel(page);
472 Eina_List *data_list = cluster_data_get_widget_list();
473 Eina_List *find_list = NULL;
474 cluster_page_t *page_item = NULL;
475 EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) {
476 if (page_item->page_layout) {
477 elm_object_signal_emit(page_item->page_layout, SIGNAL_EDIT_MODE_OFF, SIGNAL_SOURCE);
481 widget_data_t *item = NULL;
482 EINA_LIST_FOREACH(data_list, find_list, item) {
483 if (item->widget_layout) {
484 elm_object_signal_emit(item->widget_layout, SIGNAL_DELETE_BUTTON_HIDE_ANI, SIGNAL_SOURCE);
485 elm_object_signal_emit(item->widget_layout, SIGNAL_CLUSTER_NORMAL_STATE, SIGNAL_SOURCE);
486 widget_viewer_resume_widget(item);
489 } else if (cluster_view_s.view_state == VIEW_STATE_ADD_VIEWER) {
490 add_widget_viewer_win_destroy();
491 } else if (cluster_view_s.view_state == VIEW_STATE_ALL_PAGE) {
492 elm_win_indicator_mode_set(homescreen_efl_get_win(), ELM_WIN_INDICATOR_SHOW);
493 homescreen_efl_btn_show(HOMESCREEN_VIEW_HOME);
494 page_indicator_show(cluster_view_s.indicator);
495 evas_object_show(cluster_view_s.scroller);
496 __cluster_view_destroy_all_page();
498 Eina_List *find_list = NULL;
500 cluster_page_t *page_item = NULL;
501 elm_box_unpack_all(cluster_view_s.box);
502 EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) {
503 if (page_item->page_layout) {
504 elm_box_pack_end(cluster_view_s.box, page_item->page_layout);
508 Eina_List *data_list = cluster_data_get_widget_list();
509 widget_data_t *item = NULL;
510 EINA_LIST_FOREACH(data_list, find_list, item) {
511 if (item->widget_layout) {
512 widget_viewer_resume_widget(item);
516 if (cluster_view_s.current_page >= cluster_view_s.page_count) {
517 cluster_view_s.current_page = CLUSTER_HOME_PAGE;
519 __cluster_view_scroll_to_page(cluster_view_s.current_page, false);
521 } else if (state == VIEW_STATE_ADD_VIEWER) {
522 add_widget_viewer_win_create();
523 } else if (state == VIEW_STATE_ALL_PAGE) {
524 elm_win_indicator_mode_set(homescreen_efl_get_win(), ELM_WIN_INDICATOR_HIDE);
525 homescreen_efl_btn_hide(HOMESCREEN_VIEW_HOME);
526 page_indicator_hide(cluster_view_s.indicator);
528 __cluster_view_create_all_page();
530 Eina_List *data_list = cluster_data_get_widget_list();
531 Eina_List *find_list = NULL;
532 widget_data_t *item = NULL;
533 EINA_LIST_FOREACH(data_list, find_list, item) {
534 if (item->widget_layout) {
535 widget_viewer_pause_widget(item);
540 cluster_view_s.view_state = state;
541 screen_reader_update(HOME);
546 bool cluster_view_add_widget(widget_data_t *item, bool scroll)
550 cluster_page_t *page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, cluster_view_s.current_page);
551 if (cluster_page_find_empty_space(page, item->type, &item->pos_x, &item->pos_y)) {
552 item->page_idx = cluster_view_s.current_page;
557 Eina_List *find_list = NULL;
558 cluster_page_t *page_item = NULL;
559 EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) {
560 if (cluster_page_find_empty_space(page_item, item->type, &item->pos_x, &item->pos_y)) {
561 item->page_idx = page_item->page_index;
570 if (cluster_view_s.page_count >= CLUSTER_MAX_PAGE) {
571 LOGE("cluster page is max.");
573 Evas_Smart_Cb func[3] = { NULL, NULL, NULL };
574 void *data[3] = { NULL, NULL, NULL };
575 char btn_text[3][STR_MAX] = { "", "", "" };
576 char title_text[STR_MAX] = { "" };
577 char popup_text[STR_MAX] = { "" };
578 snprintf(btn_text[0], sizeof(btn_text[0]), "%s", _("IDS_CAM_SK_OK"));
579 snprintf(title_text, sizeof(title_text), "%s", _("IDS_HS_HEADER_UNABLE_TO_ADD_WIDGET_ABB"));
580 snprintf(popup_text, sizeof(popup_text), "%s", _("IDS_HS_POP_UNABLE_TO_ADD_THIS_HOME_BOX_TO_THE_HOME_SCREEN_THERE_IS_NOT_ENOUGH_SPACE_ON_THE_HOME_SCREEN_MSG"));
581 popup_show(1, func, data, btn_text, title_text, popup_text);
585 cluster_page_t *page_t = __cluster_view_page_new();
587 LOGE("Cannot add widget");
591 if (!cluster_page_find_empty_space(page_t, item->type, &item->pos_x, &item->pos_y)) {
595 item->page_idx = page_t->page_index;
599 if (!item->widget_layout) {
600 __cluster_view_add_widget_content(item);
603 if (!cluster_page_set_widget(page, item)) {
604 LOGE("cluster_page_set_widget is failed!!!");
609 cluster_view_s.current_page = item->page_idx;
610 __cluster_view_scroll_to_page(cluster_view_s.current_page, true);
616 void cluster_view_delete_widget(widget_data_t *item)
621 cluster_page_t *page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, item->page_idx);
623 cluster_page_unset(page, item);
625 LOGE("Page is NULL");
627 if (item->widget_layout) {
628 evas_object_event_callback_del(item->widget_layout, EVAS_CALLBACK_MOUSE_DOWN, __clsuter_view_widget_down_cb);
629 evas_object_event_callback_del(item->widget_layout, EVAS_CALLBACK_MOUSE_MOVE, __clsuter_view_widget_move_cb);
630 evas_object_event_callback_del(item->widget_layout, EVAS_CALLBACK_MOUSE_UP, __clsuter_view_widget_up_cb);
632 evas_object_del(item->widget_layout);
633 item->widget_layout = NULL;
636 screen_reader_update(HOME);
639 void cluster_view_edit_on_done(cluster_page_t *page)
641 if (cluster_view_s.picked_widget) {
642 if (page->page_index == cluster_view_s.picked_widget->page_idx) {
643 cluster_page_unset(page, cluster_view_s.picked_widget);
644 cluster_mouse_info.offset_x *= 0.9;
645 cluster_mouse_info.offset_y *= 0.9;
650 void cluster_view_get_access_object_list(Eina_List **list)
652 if (cluster_view_s.view_state == VIEW_STATE_NORMAL) {
653 cluster_page_t *page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, cluster_view_s.current_page);
654 cluster_page_get_access_widget_list(page, list, EINA_FALSE);
656 homescreen_efl_get_access_menu_btn(list);
657 homescreen_efl_get_access_apps_btn(list);
658 } else if (cluster_view_s.view_state == VIEW_STATE_EDIT) {
659 cluster_page_t *page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, cluster_view_s.current_page);
660 cluster_page_get_access_widget_list(page, list, EINA_TRUE);
661 } else if (cluster_view_s.view_state == VIEW_STATE_ALL_PAGE) {
662 __cluster_view_get_access_page_thumbnail(list);
663 __cluster_view_get_access_page_delete_button(list);
665 __cluster_view_get_access_add_page(list);
669 static void __cluster_view_get_access_page_thumbnail(Eina_List **list)
671 Eina_List *find_list = NULL;
672 cluster_page_t *page_item = NULL;
673 EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) {
674 if (page_item->thumbnail_ly) {
675 char buf[STR_MAX] = { 0, };
676 snprintf(buf, sizeof(buf), _("IDS_HS_TBOPT_PAGE_P1SD_OF_P2SD"), page_item->page_index + 1, cluster_view_s.page_count);
677 access_info_t *info = (access_info_t *)malloc(sizeof(access_info_t));
678 info->is_access_obj = EINA_FALSE;
679 info->target = page_item->thumbnail_ly;
680 info->parent = page_item->page_layout;
681 info->name = strdup(buf);
682 info->description = strdup(_("IDS_BR_BODY_DOUBLE_TAP_AND_HOLD_THEN_DRAG_TO_REORDER_TTS"));
683 info->role = ELM_ATSPI_ROLE_UNKNOWN;
684 info->clicked_cb = __cluster_view_allpage_clicked_page;
685 info->cb_data = page_item;
686 info->priority = (page_item->page_index + 1) * ACCESS_PRIORITY_ALL_PAGE;
688 *list = eina_list_append(*list, info);
693 static void __cluster_view_get_access_page_delete_button(Eina_List **list)
695 if (eina_list_count(cluster_view_s.page_list) > 1) {
696 Eina_List *find_list = NULL;
697 cluster_page_t *page_item = NULL;
698 EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) {
699 if (page_item->thumbnail_ly) {
700 access_info_t *info = (access_info_t *)malloc(sizeof(access_info_t));
701 info->is_access_obj = EINA_FALSE;
702 info->target = (Evas_Object *)edje_object_part_object_get(elm_layout_edje_get(page_item->thumbnail_ly), CLUSTER_ALLPAGE_DELETE_BUTTON);
703 info->parent = page_item->thumbnail_ly;
704 info->name = strdup(_("IDS_HS_HEADER_DELETE_PAGE_ABB2"));
705 info->description = strdup(_("IDS_ACCS_BODY_BUTTON_TTS"));
706 info->role = ELM_ATSPI_ROLE_UNKNOWN;
707 info->clicked_cb = __cluster_view_allpage_delete_clicked;
708 info->cb_data = page_item;
709 info->priority = (page_item->page_index + 1) * ACCESS_PRIORITY_ALL_PAGE + ACCESS_PRIORITY_ALL_PAGE / 2;
711 *list = eina_list_append(*list, info);
717 static void __cluster_view_get_access_add_page(Eina_List **list)
719 if (cluster_view_s.allpage_add_page) {
720 access_info_t *info = (access_info_t *)malloc(sizeof(access_info_t));
721 info->is_access_obj = EINA_FALSE;
722 info->target = cluster_view_s.allpage_add_page;
723 info->parent = cluster_view_s.allpage_grid;
724 info->name = strdup(_("IDS_HS_BODY_CREATE_PAGE"));
725 info->description = strdup(_("IDS_ACCS_BODY_BUTTON_TTS"));
726 info->role = ELM_ATSPI_ROLE_UNKNOWN;
727 info->clicked_cb = __cluster_view_allpage_add_clicked;
728 info->cb_data = NULL;
729 info->priority = (CLUSTER_MAX_PAGE + 1) * ACCESS_PRIORITY_ALL_PAGE;
731 *list = eina_list_append(*list, info);
735 static void __cluster_view_scroll_to_home(void)
737 __cluster_view_scroll_to_page(CLUSTER_HOME_PAGE, true);
740 #ifdef SCROLL_TIMING_ISSUE
741 static Eina_Bool __cluster_view_scroll_show_page(void *data)
743 int page_idx = *((int*)data);
744 page_indicator_set_current_page(cluster_view_s.indicator, page_idx);
745 LOGD("show %d page", page_idx);
746 elm_scroller_page_show(cluster_view_s.scroller, page_idx, 0);
747 __cluster_view_scroll_stop(NULL);
749 return ECORE_CALLBACK_CANCEL;
753 static void __cluster_view_scroll_to_page(int page_idx, bool animation)
755 __cluster_view_scroll_start();
758 LOGD("bring in %d page", page_idx);
759 elm_scroller_page_bring_in(cluster_view_s.scroller, page_idx, 0);
761 #ifdef SCROLL_TIMING_ISSUE
762 static int __page_idx = 0;
763 __page_idx = page_idx;
765 if (__scroll_timing_timer) {
766 ecore_timer_del(__scroll_timing_timer);
767 __scroll_timing_timer = NULL;
769 __scroll_timing_timer = ecore_timer_add(SCROLL_TIMING_INTERVAL, __cluster_view_scroll_show_page, &__page_idx);
771 page_indicator_set_current_page(cluster_view_s.indicator, page_idx);
772 LOGD("show %d page", page_idx);
773 elm_scroller_page_show(cluster_view_s.scroller, page_idx, 0);
774 __cluster_view_scroll_stop(NULL);
779 static void __cluster_view_app_launch_request_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *data)
782 case APP_CONTROL_RESULT_CANCELED:
783 LOGE("[APP_CONTROL_RESULT_CANCELED]");
785 case APP_CONTROL_RESULT_FAILED:
786 LOGE("[APP_CONTROL_RESULT_FAILED]");
788 case APP_CONTROL_RESULT_SUCCEEDED:
789 LOGD("[APP_CONTROL_RESULT_SUCCEEDED]");
792 LOGE("UNKNOWN ERROR");
797 static void __cluster_view_add_widget_content(widget_data_t *item)
800 LOGD("Create Widget: pkg[%s], type[%d]", item->pkg_name, item->type);
801 widget_viewer_add_widget(cluster_view_s.win, item, &w, &h);
802 evas_object_event_callback_add(item->widget_layout, EVAS_CALLBACK_MOUSE_DOWN, __clsuter_view_widget_down_cb, item);
803 evas_object_event_callback_add(item->widget_layout, EVAS_CALLBACK_MOUSE_MOVE, __clsuter_view_widget_move_cb, item);
804 evas_object_event_callback_add(item->widget_layout, EVAS_CALLBACK_MOUSE_UP, __clsuter_view_widget_up_cb, item);
805 LOGD("widget size : %d %d", w, h);
808 static void __cluster_view_create_all_page(void)
810 cluster_view_s.allpage = elm_layout_add(homescreen_efl_get_win());
811 elm_layout_file_set(cluster_view_s.allpage, util_get_res_file_path(EDJE_DIR"/cluster_allpage.edj"), GROUP_CLUSTER_ALLPAGE_LY);
813 evas_object_size_hint_align_set(cluster_view_s.allpage, EVAS_HINT_FILL, EVAS_HINT_FILL);
814 evas_object_size_hint_weight_set(cluster_view_s.allpage, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
815 evas_object_resize(cluster_view_s.allpage, WINDOW_W, WINDOW_H);
816 evas_object_move(cluster_view_s.allpage, 0, 0);
817 evas_object_show(cluster_view_s.allpage);
819 Evas_Object *page_bg = evas_object_rectangle_add(evas_object_evas_get(cluster_view_s.allpage));
820 evas_object_size_hint_min_set(page_bg, WINDOW_W, WINDOW_H);
821 evas_object_size_hint_align_set(page_bg, EVAS_HINT_FILL, EVAS_HINT_FILL);
822 evas_object_size_hint_weight_set(page_bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
823 evas_object_color_set(page_bg, 0, 0, 0, 50);
824 evas_object_show(page_bg);
825 elm_object_part_content_set(cluster_view_s.allpage, SIZE_SETTER, page_bg);
827 Evas_Object *grid = elm_grid_add(cluster_view_s.allpage);
828 evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
829 evas_object_size_hint_align_set(grid, EVAS_HINT_FILL, EVAS_HINT_FILL);
830 elm_grid_size_set(grid, WINDOW_W, WINDOW_H);
831 evas_object_show(grid);
832 elm_layout_content_set(cluster_view_s.allpage, CLUSTER_ALLPAGE_GRID, grid);
833 cluster_view_s.allpage_grid = grid;
835 Eina_List *find_list = NULL;
836 cluster_page_t *page_item = NULL;
837 elm_box_unpack_all(cluster_view_s.box);
838 EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) {
839 evas_object_move(page_item->page_layout, -WINDOW_W, -WINDOW_H);
840 if (page_item->page_layout) {
841 page_item->thumbnail_ly = elm_layout_add(page_item->page_layout);
842 elm_layout_file_set(page_item->thumbnail_ly, util_get_res_file_path(EDJE_DIR"/cluster_allpage_thumbnail.edj"), GROUP_CLUSTER_ALLPAGE_THUMBNAIL_LY);
844 evas_object_size_hint_align_set(page_item->thumbnail_ly, EVAS_HINT_FILL, EVAS_HINT_FILL);
845 evas_object_size_hint_weight_set(page_item->thumbnail_ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
846 evas_object_show(page_item->thumbnail_ly);
848 Evas_Object *thumbnail = cluster_page_thumbnail(page_item);
849 elm_object_part_content_set(page_item->thumbnail_ly, CLUSTER_ALLPAGE_THUMBNAIL_IMAGE, thumbnail);
850 elm_object_signal_callback_add(page_item->thumbnail_ly,
851 SIGNAL_ALLPAGE_DELETE_BUTTON_CLICKED, SIGNAL_SOURCE,
852 __cluster_view_allpage_delete_clicked, page_item);
854 evas_object_event_callback_add(thumbnail, EVAS_CALLBACK_MOUSE_DOWN, __clsuter_view_thumbnail_down_cb, page_item);
855 evas_object_event_callback_add(thumbnail, EVAS_CALLBACK_MOUSE_MOVE, __clsuter_view_thumbnail_move_cb, page_item);
856 evas_object_event_callback_add(thumbnail, EVAS_CALLBACK_MOUSE_UP, __clsuter_view_thumbnail_up_cb, page_item);
860 __cluster_view_allpage_reposition();
862 if (cluster_view_s.page_count < CLUSTER_MAX_PAGE) {
864 cluster_view_s.allpage_add_page = elm_layout_add(cluster_view_s.allpage_grid);
865 elm_layout_file_set(cluster_view_s.allpage_add_page, util_get_res_file_path(EDJE_DIR"/cluster_allpage_thumbnail.edj"), GROUP_CLUSTER_ALLPAGE_THUMBNAIL_LY);
867 evas_object_size_hint_align_set(cluster_view_s.allpage_add_page, EVAS_HINT_FILL, EVAS_HINT_FILL);
868 evas_object_size_hint_weight_set(cluster_view_s.allpage_add_page, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
869 evas_object_show(cluster_view_s.allpage_add_page);
871 elm_object_signal_emit(cluster_view_s.allpage_add_page, SIGNAL_ALLPAGE_ADD_BUTTON_SHOW, SIGNAL_SOURCE);
872 elm_object_signal_callback_add(cluster_view_s.allpage_add_page,
873 SIGNAL_ALLPAGE_ADD_BUTTON_CLICKED, SIGNAL_SOURCE,
874 __cluster_view_allpage_add_clicked, NULL);
876 __cluster_view_allpage_get_page_pos(cluster_view_s.page_count, &x, &y);
877 elm_grid_pack(cluster_view_s.allpage_grid, cluster_view_s.allpage_add_page, x, y, CLUSTER_ALL_PAGE_W, CLUSTER_ALL_PAGE_H);
881 static void __cluster_view_allpage_reposition(void)
883 Eina_List *find_list = NULL;
884 cluster_page_t *page_item = NULL;
885 EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) {
887 __cluster_view_allpage_get_page_pos(page_item->page_index, &x, &y);
888 elm_grid_pack(cluster_view_s.allpage_grid, page_item->thumbnail_ly, x, y, CLUSTER_ALL_PAGE_W, CLUSTER_ALL_PAGE_H);
889 if (cluster_view_s.page_count > 1)
890 elm_object_signal_emit(page_item->thumbnail_ly, SIGNAL_ALLPAGE_DELETE_BUTTON_SHOW, SIGNAL_SOURCE);
892 elm_object_signal_emit(page_item->thumbnail_ly, SIGNAL_ALLPAGE_DELETE_BUTTON_HIDE, SIGNAL_SOURCE);
897 static void __cluster_view_allpage_get_page_pos(int page_idx, int *w, int *h)
901 if (cluster_view_s.page_count < 2) {
902 start_y = (WINDOW_H - CLUSTER_ALL_PAGE_H) / 2;
903 } else if (cluster_view_s.page_count < 4) {
904 start_y = (WINDOW_H - (CLUSTER_ALL_PAGE_H * 2 + CLUSTER_ALL_PAGE_GAP_H)) / 2;
906 start_y = (WINDOW_H - (CLUSTER_ALL_PAGE_H * 3 + CLUSTER_ALL_PAGE_GAP_H * 2)) / 2;
911 *w = CLUSTER_ALL_PAGE_PADDING_SIDE + (col * (CLUSTER_ALL_PAGE_W + CLUSTER_ALL_PAGE_GAP_W));
912 *h = start_y + (row * (CLUSTER_ALL_PAGE_H + CLUSTER_ALL_PAGE_GAP_H));
915 static int __cluster_view_allpage_get_page_index(int x, int y)
918 int sx = CLUSTER_ALL_PAGE_PADDING_SIDE;
920 if (cluster_view_s.page_count < 2) {
921 sy = (WINDOW_H - CLUSTER_ALL_PAGE_H) / 2;
922 } else if (cluster_view_s.page_count < 4) {
923 sy = (WINDOW_H - (CLUSTER_ALL_PAGE_H * 2 + CLUSTER_ALL_PAGE_GAP_H)) / 2;
925 sy = (WINDOW_H - (CLUSTER_ALL_PAGE_H * 3 + CLUSTER_ALL_PAGE_GAP_H * 2)) / 2;
927 int w = CLUSTER_ALL_PAGE_W + CLUSTER_ALL_PAGE_GAP_W;
928 int h = CLUSTER_ALL_PAGE_H + CLUSTER_ALL_PAGE_GAP_H;
930 for (idx = 0; idx < cluster_view_s.page_count; idx++) {
933 int ny = sy + (row * h) + (CLUSTER_ALL_PAGE_H / 2);
934 int nx = sx + (col * w) + (CLUSTER_ALL_PAGE_W / 2);
936 int d = (ny - y) * (ny - y) + (nx - x) * (nx - x);
937 if (d < CLUSTER_VIEW_ALLPAGE_MOVE_GAP) {
938 return (row * 2) + col;
945 static void __cluster_view_destroy_all_page(void)
947 Eina_List *find_list = NULL;
948 cluster_page_t *page_item = NULL;
949 EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) {
951 Evas_Object *image = elm_object_part_content_get(page_item->thumbnail_ly, CLUSTER_ALLPAGE_THUMBNAIL_IMAGE);
952 evas_object_event_callback_del(image, EVAS_CALLBACK_MOUSE_DOWN, __clsuter_view_thumbnail_down_cb);
953 evas_object_event_callback_del(image, EVAS_CALLBACK_MOUSE_MOVE, __clsuter_view_thumbnail_move_cb);
954 evas_object_event_callback_del(image, EVAS_CALLBACK_MOUSE_UP, __clsuter_view_thumbnail_up_cb);
956 evas_object_del(page_item->thumbnail_ly);
957 page_item->thumbnail_ly = NULL;
960 if (cluster_view_s.allpage_add_page)
961 evas_object_del(cluster_view_s.allpage_add_page);
962 if (cluster_view_s.allpage)
963 evas_object_del(cluster_view_s.allpage);
965 cluster_view_s.allpage_add_page = NULL;
966 cluster_view_s.allpage = NULL;
969 static cluster_page_t *__cluster_view_page_new(void)
971 if (cluster_view_s.page_count >= CLUSTER_MAX_PAGE) {
972 LOGE("cluster page is max.");
976 cluster_page_t *page_t = cluster_page_new(cluster_view_s.box);
977 cluster_view_s.page_list = eina_list_append(cluster_view_s.page_list, page_t);
978 elm_box_pack_end(cluster_view_s.box, page_t->page_layout);
979 cluster_view_s.page_count = eina_list_count(cluster_view_s.page_list);
980 page_t->page_index = cluster_view_s.page_count - 1;
981 cluster_data_set_page_count(cluster_view_s.page_count);
983 page_indicator_set_page_count(cluster_view_s.indicator, cluster_view_s.page_count);
988 static void __cluster_view_page_delete(cluster_page_t *page)
990 elm_grid_unpack(cluster_view_s.allpage_grid, page->thumbnail_ly);
992 cluster_view_s.page_list = eina_list_remove(cluster_view_s.page_list, page);
993 elm_box_unpack(cluster_view_s.box, page->page_layout);
995 Eina_List *find_list = NULL;
996 widget_data_t *widget = NULL;
997 EINA_LIST_FOREACH(page->widget_list, find_list, widget) {
998 cluster_data_delete(widget);
1000 cluster_page_delete(page);
1002 cluster_view_s.page_count--;
1004 cluster_data_set_page_count(cluster_view_s.page_count);
1005 page_indicator_set_page_count(cluster_view_s.indicator, cluster_view_s.page_count);
1008 static void __cluster_view_allpage_delete_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
1010 if (cluster_view_s.page_count <= 1)
1013 cluster_page_t *page_item = (cluster_page_t *)data;
1014 if (eina_list_count(page_item->widget_list) > 0) {
1015 Evas_Smart_Cb func[3] = { __cluster_view_allpage_delete_page_cb, NULL, NULL };
1016 void *data[3] = { page_item, NULL, NULL };
1017 char btn_text[3][STR_MAX] = { "", "", "" };
1018 char title_text[STR_MAX] = { "" };
1019 char popup_text[STR_MAX] = { "" };
1020 snprintf(btn_text[0], sizeof(btn_text[0]), "%s", _("IDS_HS_OPT_DELETE"));
1021 snprintf(btn_text[1], sizeof(btn_text[1]), "%s", _("IDS_CAM_SK_CANCEL"));
1022 snprintf(title_text, sizeof(title_text), "%s", _("IDS_HS_HEADER_DELETE_PAGE_ABB2"));
1023 snprintf(popup_text, sizeof(popup_text), "%s", _("IDS_HS_POP_THIS_PAGE_AND_ALL_THE_ITEMS_IT_CONTAINS_WILL_BE_DELETED"));
1024 popup_show(2, func, data, btn_text, title_text, popup_text);
1026 __cluster_view_allpage_delete_page_cb(page_item, NULL, NULL);
1030 static void __cluster_view_allpage_add_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
1032 cluster_page_t *page_t = __cluster_view_page_new();
1034 LOGE("cluster page is max.");
1038 elm_grid_unpack(cluster_view_s.allpage_grid, cluster_view_s.allpage_add_page);
1040 page_t->thumbnail_ly = elm_layout_add(page_t->page_layout);
1041 elm_layout_file_set(page_t->thumbnail_ly, util_get_res_file_path(EDJE_DIR"/cluster_allpage_thumbnail.edj"), GROUP_CLUSTER_ALLPAGE_THUMBNAIL_LY);
1043 evas_object_size_hint_align_set(page_t->thumbnail_ly, EVAS_HINT_FILL, EVAS_HINT_FILL);
1044 evas_object_size_hint_weight_set(page_t->thumbnail_ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1045 evas_object_show(page_t->thumbnail_ly);
1047 Evas_Object *thumbnail = cluster_page_thumbnail(page_t);
1048 elm_object_part_content_set(page_t->thumbnail_ly, CLUSTER_ALLPAGE_THUMBNAIL_IMAGE, thumbnail);
1049 elm_object_signal_emit(page_t->thumbnail_ly, SIGNAL_ALLPAGE_DELETE_BUTTON_SHOW, SIGNAL_SOURCE);
1050 elm_object_signal_callback_add(page_t->thumbnail_ly,
1051 SIGNAL_ALLPAGE_DELETE_BUTTON_CLICKED, SIGNAL_SOURCE,
1052 __cluster_view_allpage_delete_clicked, page_t);
1054 evas_object_event_callback_add(thumbnail, EVAS_CALLBACK_MOUSE_DOWN, __clsuter_view_thumbnail_down_cb, page_t);
1055 evas_object_event_callback_add(thumbnail, EVAS_CALLBACK_MOUSE_MOVE, __clsuter_view_thumbnail_move_cb, page_t);
1056 evas_object_event_callback_add(thumbnail, EVAS_CALLBACK_MOUSE_UP, __clsuter_view_thumbnail_up_cb, page_t);
1058 __cluster_view_allpage_reposition();
1060 if (cluster_view_s.page_count < CLUSTER_MAX_PAGE) {
1062 __cluster_view_allpage_get_page_pos(cluster_view_s.page_count, &x, &y);
1063 elm_grid_pack(cluster_view_s.allpage_grid, cluster_view_s.allpage_add_page, x, y, CLUSTER_ALL_PAGE_W, CLUSTER_ALL_PAGE_H);
1065 evas_object_del(cluster_view_s.allpage_add_page);
1066 cluster_view_s.allpage_add_page = NULL;
1069 screen_reader_update(HOME);
1072 static void __cluster_view_allpage_delete_page_cb(void *data, Evas_Object *obj, void *event_info)
1074 cluster_page_t *page = (cluster_page_t *)data;
1076 Eina_List *find_list = NULL;
1077 cluster_page_t *page_item = NULL;
1078 EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) {
1079 if (page_item->page_index > page->page_index) {
1080 page_item->page_index -= 1;
1085 Eina_List *widget_list = NULL;
1086 widget_data_t *widget_item = NULL;
1087 EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) {
1088 EINA_LIST_FOREACH(page_item->widget_list, widget_list, widget_item) {
1089 if (page_item == page)
1090 widget_item->page_idx = -1;
1092 widget_item->page_idx = page_item->page_index;
1093 cluster_data_update(widget_item);
1097 __cluster_view_page_delete(page);
1098 __cluster_view_allpage_reposition();
1101 if (cluster_view_s.page_count < CLUSTER_MAX_PAGE) {
1102 if (cluster_view_s.allpage_add_page == NULL) {
1103 cluster_view_s.allpage_add_page = elm_layout_add(cluster_view_s.allpage);
1104 elm_layout_file_set(cluster_view_s.allpage_add_page, util_get_res_file_path(EDJE_DIR"/cluster_allpage_thumbnail.edj"), GROUP_CLUSTER_ALLPAGE_THUMBNAIL_LY);
1106 evas_object_size_hint_align_set(cluster_view_s.allpage_add_page, EVAS_HINT_FILL, EVAS_HINT_FILL);
1107 evas_object_size_hint_weight_set(cluster_view_s.allpage_add_page, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1108 evas_object_show(cluster_view_s.allpage_add_page);
1110 elm_object_signal_emit(cluster_view_s.allpage_add_page, SIGNAL_ALLPAGE_ADD_BUTTON_SHOW, SIGNAL_SOURCE);
1111 elm_object_signal_callback_add(cluster_view_s.allpage_add_page,
1112 SIGNAL_ALLPAGE_ADD_BUTTON_CLICKED, SIGNAL_SOURCE,
1113 __cluster_view_allpage_add_clicked, NULL);
1116 __cluster_view_allpage_get_page_pos(cluster_view_s.page_count, &x, &y);
1117 elm_grid_pack(cluster_view_s.allpage_grid, cluster_view_s.allpage_add_page, x, y, CLUSTER_ALL_PAGE_W, CLUSTER_ALL_PAGE_H);
1120 screen_reader_update(HOME);
1123 static void __clsuter_view_thumbnail_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1125 Evas_Event_Mouse_Down* ev = event_info;
1126 LOGD("DOWN: (%d,%d)", ev->output.x, ev->output.y);
1128 cluster_mouse_info.pressed = true;
1129 cluster_mouse_info.pressed_obj = obj;
1131 cluster_mouse_info.down_x = cluster_mouse_info.move_x = ev->output.x;
1132 cluster_mouse_info.down_y = cluster_mouse_info.move_y = ev->output.y;
1134 if (cluster_mouse_info.long_press_timer) {
1135 ecore_timer_del(cluster_mouse_info.long_press_timer);
1136 cluster_mouse_info.long_press_timer = NULL;
1139 cluster_mouse_info.long_press_timer = ecore_timer_add(LONG_PRESS_TIME,
1140 __cluster_view_thumbnail_long_press_time_cb, data);
1143 static void __clsuter_view_thumbnail_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1145 cluster_page_t *page_t = (cluster_page_t *) data;
1146 Evas_Event_Mouse_Up* ev = event_info;
1147 LOGD("UP: (%d,%d)", ev->output.x, ev->output.y);
1149 if (!cluster_mouse_info.pressed)
1152 cluster_mouse_info.pressed = false;
1153 cluster_mouse_info.pressed_obj = NULL;
1155 if (cluster_mouse_info.long_press_timer) {
1156 ecore_timer_del(cluster_mouse_info.long_press_timer);
1157 cluster_mouse_info.long_press_timer = NULL;
1160 cluster_mouse_info.up_x = ev->output.x;
1161 cluster_mouse_info.up_y = ev->output.y;
1163 if (!cluster_mouse_info.long_pressed) {
1164 int distance = (cluster_mouse_info.down_x - cluster_mouse_info.up_x) * (cluster_mouse_info.down_x - cluster_mouse_info.up_x);
1165 distance += (cluster_mouse_info.down_y - cluster_mouse_info.up_y) * (cluster_mouse_info.down_y - cluster_mouse_info.up_y);
1167 if (distance <= MOUSE_MOVE_MIN_DISTANCE) {
1168 cluster_view_s.current_page = page_t->page_index;
1169 cluster_view_set_state(VIEW_STATE_NORMAL);
1175 cluster_mouse_info.long_pressed = false;
1177 if (cluster_view_s.picked_page) {
1178 __cluster_view_allpage_drop_page(data);
1182 static int __cluster_view_page_sort_cb(const void *a , const void *b)
1184 cluster_page_t *item1 = (cluster_page_t *)a;
1185 cluster_page_t *item2 = (cluster_page_t *)b;
1187 return item1->page_index - item2->page_index;
1190 static void __clsuter_view_thumbnail_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1192 Evas_Event_Mouse_Move* ev = event_info;
1194 if (!cluster_mouse_info.pressed)
1197 cluster_mouse_info.move_x = ev->cur.output.x;
1198 cluster_mouse_info.move_y = ev->cur.output.y;
1200 if (!cluster_mouse_info.long_pressed) {
1201 int distance = (cluster_mouse_info.move_x - cluster_mouse_info.down_x) * (cluster_mouse_info.move_x - cluster_mouse_info.down_x);
1202 distance += (cluster_mouse_info.move_y - cluster_mouse_info.down_y) * (cluster_mouse_info.move_y - cluster_mouse_info.down_y);
1204 if (distance > MOUSE_MOVE_MIN_DISTANCE) {
1205 if (cluster_mouse_info.long_press_timer) {
1206 ecore_timer_del(cluster_mouse_info.long_press_timer);
1207 cluster_mouse_info.long_press_timer = NULL;
1214 if (cluster_view_s.picked_page) {
1215 __cluster_view_allpage_drag_page(data);
1219 static Eina_Bool __cluster_view_thumbnail_long_press_time_cb(void *data)
1221 if (!cluster_mouse_info.pressed)
1222 return ECORE_CALLBACK_CANCEL;
1224 cluster_mouse_info.long_pressed = true;
1226 if (cluster_mouse_info.long_press_timer) {
1227 ecore_timer_del(cluster_mouse_info.long_press_timer);
1228 cluster_mouse_info.long_press_timer = NULL;
1231 __cluster_view_allpage_pick_up_page(data);
1233 return ECORE_CALLBACK_CANCEL;
1236 static void __cluster_view_allpage_clicked_page(void *data, Evas_Object *obj, const char *emission, const char *source)
1238 cluster_page_t *page_t = (cluster_page_t *)data;
1240 cluster_view_s.current_page = page_t->page_index;
1241 cluster_view_set_state(VIEW_STATE_NORMAL);
1244 static void __cluster_view_allpage_drag_page(void *data)
1246 if (cluster_view_s.picked_page) {
1247 int move_x = cluster_mouse_info.move_x - cluster_mouse_info.offset_x;
1248 int move_y = cluster_mouse_info.move_y - cluster_mouse_info.offset_y;
1249 int new_index = INIT_VALUE;
1250 evas_object_move(cluster_view_s.picked_page->thumbnail_ly, move_x, move_y);
1251 new_index = __cluster_view_allpage_get_page_index(MIRRORING_X(move_x + CLUSTER_ALL_PAGE_W / 2, WINDOW_W), move_y + CLUSTER_ALL_PAGE_H / 2);
1255 if (new_index != cluster_view_s.picked_page->page_index && new_index != INIT_VALUE) {
1256 if (cluster_view_s.picked_page->page_index < new_index) {
1258 start = cluster_view_s.picked_page->page_index;
1260 } else if (cluster_view_s.picked_page->page_index > new_index) {
1262 end = cluster_view_s.picked_page->page_index;
1266 Eina_List *find_list = NULL;
1267 cluster_page_t *page_item = NULL;
1268 EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) {
1269 if (page_item == cluster_view_s.picked_page) {
1270 page_item->page_index = new_index;
1271 } else if (page_item->page_index >= start && page_item->page_index <= end) {
1272 page_item->page_index += move;
1274 elm_grid_unpack(cluster_view_s.allpage_grid, page_item->thumbnail_ly);
1278 EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) {
1279 if (page_item != cluster_view_s.picked_page) {
1280 __cluster_view_allpage_get_page_pos(page_item->page_index, &x, &y);
1281 elm_grid_pack(cluster_view_s.allpage_grid, page_item->thumbnail_ly, x, y, CLUSTER_ALL_PAGE_W, CLUSTER_ALL_PAGE_H);
1288 static void __cluster_view_allpage_pick_up_page(void *data)
1290 screen_reader_update(CLEAR);
1292 cluster_view_s.picked_page = (cluster_page_t *)data;
1293 elm_grid_unpack(cluster_view_s.allpage_grid, cluster_view_s.picked_page->thumbnail_ly);
1295 elm_object_signal_emit(cluster_view_s.picked_page->thumbnail_ly, SIGNAL_ALLPAGE_DELETE_BUTTON_HIDE, SIGNAL_SOURCE);
1296 elm_object_signal_emit(cluster_view_s.picked_page->thumbnail_ly, SIGNAL_ALLPAGE_DRAG_BG_SHOW, SIGNAL_SOURCE);
1298 int cx = -1, cy = -1;
1299 int gx = -1, gy = -1, gw = 0, gh = 0;
1302 Evas_Object *page = cluster_view_s.picked_page->thumbnail_ly;
1303 e = evas_object_evas_get(page);
1304 evas_pointer_canvas_xy_get(e, &cx, &cy);
1305 evas_object_geometry_get(page, &gx, &gy, &gw, &gh);
1307 cluster_mouse_info.offset_x = cx - gx;
1308 cluster_mouse_info.offset_y = cy - gy;
1311 static void __cluster_view_allpage_drop_page(void *data)
1313 if (cluster_view_s.picked_page) {
1314 if (cluster_view_s.page_count > 1)
1315 elm_object_signal_emit(cluster_view_s.picked_page->thumbnail_ly, SIGNAL_ALLPAGE_DELETE_BUTTON_SHOW, SIGNAL_SOURCE);
1316 elm_object_signal_emit(cluster_view_s.picked_page->thumbnail_ly, SIGNAL_ALLPAGE_DRAG_BG_HIDE, SIGNAL_SOURCE);
1319 __cluster_view_allpage_get_page_pos(cluster_view_s.picked_page->page_index, &x, &y);
1320 elm_grid_pack(cluster_view_s.allpage_grid, cluster_view_s.picked_page->thumbnail_ly, x, y, CLUSTER_ALL_PAGE_W, CLUSTER_ALL_PAGE_H);
1321 cluster_view_s.picked_page = NULL;
1323 cluster_view_s.page_list = eina_list_sort(cluster_view_s.page_list,
1324 eina_list_count(cluster_view_s.page_list), __cluster_view_page_sort_cb);
1326 Eina_List *find_list = NULL, *widget_list = NULL;
1327 cluster_page_t *page_item = NULL;
1328 widget_data_t *widget_item = NULL;
1329 EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) {
1330 EINA_LIST_FOREACH(page_item->widget_list, widget_list, widget_item) {
1331 widget_item->page_idx = page_item->page_index;
1332 cluster_data_update(widget_item);
1336 screen_reader_update(HOME);
1339 static void __clsuter_view_widget_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1341 Evas_Event_Mouse_Down* ev = event_info;
1342 LOGD("DOWN: (%d,%d)", ev->output.x, ev->output.y);
1344 if (cluster_view_s.edit_animator) {
1345 LOGE("edit animator is running");
1349 cluster_mouse_info.pressed = true;
1350 cluster_mouse_info.pressed_obj = obj;
1352 cluster_mouse_info.down_x = cluster_mouse_info.move_x = ev->output.x;
1353 cluster_mouse_info.down_y = cluster_mouse_info.move_y = ev->output.y;
1355 if (cluster_mouse_info.long_press_timer) {
1356 ecore_timer_del(cluster_mouse_info.long_press_timer);
1357 cluster_mouse_info.long_press_timer = NULL;
1360 cluster_mouse_info.long_press_timer = ecore_timer_add(LONG_PRESS_TIME,
1361 __cluster_view_widget_long_press_time_cb, data);
1364 static void __clsuter_view_widget_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1366 Evas_Event_Mouse_Up* ev = event_info;
1367 LOGD("UP: (%d,%d)", ev->output.x, ev->output.y);
1369 if (!cluster_mouse_info.pressed)
1372 cluster_mouse_info.pressed = false;
1373 cluster_mouse_info.pressed_obj = NULL;
1375 if (cluster_mouse_info.long_press_timer) {
1376 ecore_timer_del(cluster_mouse_info.long_press_timer);
1377 cluster_mouse_info.long_press_timer = NULL;
1380 cluster_mouse_info.up_x = ev->output.x;
1381 cluster_mouse_info.up_y = ev->output.y;
1383 if (!cluster_mouse_info.long_pressed)
1386 cluster_mouse_info.long_pressed = false;
1388 elm_scroller_movement_block_set(cluster_view_s.scroller, ELM_SCROLLER_MOVEMENT_NO_BLOCK);
1390 if (cluster_view_s.picked_widget) {
1391 __cluster_view_edit_drop_widget(data);
1395 static void __clsuter_view_widget_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1397 Evas_Event_Mouse_Move* ev = event_info;
1399 if (!cluster_mouse_info.pressed)
1402 cluster_mouse_info.move_x = ev->cur.output.x;
1403 cluster_mouse_info.move_y = ev->cur.output.y;
1405 if (!cluster_mouse_info.long_pressed) {
1406 int distance = (cluster_mouse_info.move_x - cluster_mouse_info.down_x) * (cluster_mouse_info.move_x - cluster_mouse_info.down_x);
1407 distance += (cluster_mouse_info.move_y - cluster_mouse_info.down_y) * (cluster_mouse_info.move_y - cluster_mouse_info.down_y);
1409 if (distance > MOUSE_MOVE_MIN_DISTANCE) {
1410 if (cluster_mouse_info.long_press_timer) {
1411 ecore_timer_del(cluster_mouse_info.long_press_timer);
1412 cluster_mouse_info.long_press_timer = NULL;
1419 if (cluster_view_s.picked_widget) {
1420 __cluster_view_edit_drag_widget(data);
1424 static Eina_Bool __cluster_view_widget_long_press_time_cb(void *data)
1426 widget_data_t *widget = (widget_data_t *)data;
1427 if (!cluster_mouse_info.pressed)
1428 return ECORE_CALLBACK_CANCEL;
1430 cluster_mouse_info.long_pressed = true;
1432 elm_scroller_movement_block_set(cluster_view_s.scroller, ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL);
1434 widget_viewer_send_cancel_click_event(widget);
1436 __cluster_view_edit_pick_up_widget(data);
1438 return ECORE_CALLBACK_CANCEL;
1441 static void __cluster_view_edit_pick_up_widget(void *data)
1443 int cx = -1, cy = -1;
1444 int gx = -1, gy = -1, gw = 0, gh = 0;
1447 screen_reader_update(CLEAR);
1449 cluster_view_s.picked_widget = (widget_data_t *)data;
1451 Evas_Object *widget_layout = cluster_view_s.picked_widget->widget_layout;
1453 e = evas_object_evas_get(widget_layout);
1455 evas_pointer_canvas_xy_get(e, &cx, &cy);
1456 evas_object_geometry_get(widget_layout, &gx, &gy, &gw, &gh);
1457 LOGD("cx, cy (%d, %d )", cx, cy);
1458 LOGD("gx, gy, gw, gh (%d, %d, %d, %d)", gx, gy, gw, gh);
1460 cluster_mouse_info.offset_x = cx - gx;
1461 cluster_mouse_info.offset_y = cy - gy;
1463 cluster_page_t *page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, cluster_view_s.picked_widget->page_idx);
1465 if (cluster_view_s.view_state == VIEW_STATE_NORMAL) {
1466 cluster_view_set_state(VIEW_STATE_EDIT);
1468 cluster_page_unset(page, cluster_view_s.picked_widget);
1471 elm_object_signal_emit(widget_layout, SIGNAL_DELETE_BUTTON_HIDE_ANI, SIGNAL_SOURCE);
1472 elm_object_signal_emit(widget_layout, SIGNAL_CLUSTER_PICKUP_STATE, SIGNAL_SOURCE);
1474 evas_object_move(widget_layout, cluster_mouse_info.move_x - cluster_mouse_info.offset_x,
1475 cluster_mouse_info.move_y - cluster_mouse_info.offset_y);
1478 static void __cluster_view_edit_drag_widget(void *data)
1480 cluster_view_s.picked_widget = (widget_data_t *)data;
1482 if (!cluster_view_s.picked_widget)
1485 Evas_Object *widget_layout = cluster_view_s.picked_widget->widget_layout;
1486 evas_object_move(widget_layout, cluster_mouse_info.move_x - cluster_mouse_info.offset_x,
1487 cluster_mouse_info.move_y - cluster_mouse_info.offset_y);
1489 if ((cluster_mouse_info.move_x > CLUSTER_EDIT_RIGHT_SCROLL_REGION) && (cluster_view_s.page_count > 1)) {
1490 if (!cluster_view_s.edit_mode_scroll_timer)
1491 cluster_view_s.edit_mode_scroll_timer = ecore_timer_add(HOME_EDIT_SCROLL_MOVE_TIME, __cluster_view_scroll_timer_cb, NULL);
1493 } else if ((cluster_mouse_info.move_x < CLUSTER_EDIT_LEFT_SCROLL_REGION) && (cluster_view_s.page_count > 1)) {
1494 if (!cluster_view_s.edit_mode_scroll_timer)
1495 cluster_view_s.edit_mode_scroll_timer = ecore_timer_add(HOME_EDIT_SCROLL_MOVE_TIME, __cluster_view_scroll_timer_cb, NULL);
1497 int page_x, page_y, page_w, page_h;
1498 int widget_x, widget_y;
1500 cluster_page_t *page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, cluster_view_s.current_page);
1501 evas_object_geometry_get(page->grid, &page_x, &page_y, &page_w, &page_h);
1502 evas_object_geometry_get(widget_layout, &widget_x, &widget_y, NULL, NULL);
1506 if (cluster_view_s.edit_mode_scroll_timer) {
1507 ecore_timer_del(cluster_view_s.edit_mode_scroll_timer);
1508 cluster_view_s.edit_mode_scroll_timer = NULL;
1511 if (!cluster_view_s.is_srolling) {
1512 int block_w = (page_w / CLUSTER_COL);
1513 int block_h = (page_h / CLUSTER_ROW);
1514 double pos_x = (double)widget_x / block_w + 0.5;
1515 double pos_y = (double)widget_y / block_h + 0.5;
1517 cluster_page_drag_widget(page, cluster_view_s.picked_widget->type, pos_x < 0.0 ? -1 : (int)pos_x, pos_y < 0.0 ? -1 : (int)pos_y);
1522 static void __cluster_view_edit_drop_widget(void *data)
1524 if (cluster_view_s.edit_mode_scroll_timer) {
1525 ecore_timer_del(cluster_view_s.edit_mode_scroll_timer);
1526 cluster_view_s.edit_mode_scroll_timer = NULL;
1529 if (cluster_view_s.edit_animator) {
1530 ecore_animator_del(cluster_view_s.edit_animator);
1531 cluster_view_s.edit_animator = NULL;
1535 cluster_view_s.animation_from_x = cluster_mouse_info.move_x - cluster_mouse_info.offset_x;
1536 cluster_view_s.animation_from_y = cluster_mouse_info.move_y - cluster_mouse_info.offset_y;
1538 cluster_page_t *page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, cluster_view_s.picked_widget->page_idx);
1539 cluster_page_unset(page, cluster_view_s.picked_widget);
1541 page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, cluster_view_s.current_page);
1542 cluster_page_get_highlight_xy(page, &to_x, &to_y);
1543 if (to_x == INIT_VALUE || to_y == INIT_VALUE) {
1545 evas_object_geometry_get(page->grid, &gx, &gy, &w, &h);
1546 to_x = gx + cluster_view_s.picked_widget->pos_x * (w / CLUSTER_COL);
1547 to_y = gy + cluster_view_s.picked_widget->pos_y * (h / CLUSTER_ROW);
1550 cluster_view_s.animation_to_x = to_x;
1551 cluster_view_s.animation_to_y = to_y;
1553 cluster_view_s.edit_animator = ecore_animator_timeline_add(HOME_ANIMATION_TIME, __cluster_view_edit_move_anim, NULL);
1555 evas_object_event_callback_del(cluster_view_s.picked_widget->widget_content, EVAS_CALLBACK_MOUSE_DOWN, __clsuter_view_widget_down_cb);
1556 evas_object_event_callback_del(cluster_view_s.picked_widget->widget_content, EVAS_CALLBACK_MOUSE_MOVE, __clsuter_view_widget_move_cb);
1557 evas_object_event_callback_del(cluster_view_s.picked_widget->widget_content, EVAS_CALLBACK_MOUSE_UP, __clsuter_view_widget_up_cb);
1560 static Eina_Bool __cluster_view_edit_move_anim(void *data, double pos)
1562 evas_object_move(cluster_view_s.picked_widget->widget_layout,
1563 (cluster_view_s.animation_to_x - cluster_view_s.animation_from_x) * pos + cluster_view_s.animation_from_x,
1564 (cluster_view_s.animation_to_y - cluster_view_s.animation_from_y) * pos + cluster_view_s.animation_from_y);
1566 if (pos >= 1.0 - (1e-10)) {
1567 __cluster_view_edit_move_anim_done(data);
1569 cluster_view_s.edit_animator = NULL;
1570 return ECORE_CALLBACK_DONE;
1573 return ECORE_CALLBACK_RENEW;
1576 static void __cluster_view_edit_move_anim_done(void *data)
1578 Evas_Object *widget_layout = cluster_view_s.picked_widget->widget_layout;
1579 elm_object_signal_emit(widget_layout, SIGNAL_DELETE_BUTTON_SHOW_ANI, SIGNAL_SOURCE);
1580 elm_object_signal_emit(widget_layout, SIGNAL_CLUSTER_EDIT_STATE, SIGNAL_SOURCE);
1582 cluster_page_t *page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, cluster_view_s.current_page);
1584 if (!cluster_page_drop_widget(page, cluster_view_s.picked_widget)) {
1585 if (cluster_view_s.picked_widget->page_idx != cluster_view_s.current_page) {
1586 cluster_view_s.current_page = cluster_view_s.picked_widget->page_idx;
1587 __cluster_view_scroll_to_page(cluster_view_s.current_page, true);
1590 page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, cluster_view_s.current_page);
1591 if (!cluster_page_set_widget(page, cluster_view_s.picked_widget)) {
1592 cluster_view_add_widget(cluster_view_s.picked_widget, true);
1596 cluster_view_s.picked_widget = NULL;
1597 screen_reader_update(HOME);
1600 static void __clsuter_view_scroller_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1602 Evas_Event_Mouse_Down* ev = event_info;
1604 if (cluster_view_s.view_state != VIEW_STATE_NORMAL)
1607 if (cluster_view_s.edit_animator) {
1608 LOGE("edit animator is running");
1612 LOGD("DOWN: (%d,%d)", ev->output.x, ev->output.y);
1614 cluster_mouse_info.pressed = true;
1615 cluster_mouse_info.pressed_obj = obj;
1617 cluster_mouse_info.down_x = cluster_mouse_info.move_x = ev->output.x;
1618 cluster_mouse_info.down_y = cluster_mouse_info.move_y = ev->output.y;
1620 if (cluster_mouse_info.long_press_timer) {
1621 ecore_timer_del(cluster_mouse_info.long_press_timer);
1622 cluster_mouse_info.long_press_timer = NULL;
1625 cluster_mouse_info.long_press_timer = ecore_timer_add(LONG_PRESS_TIME,
1626 __cluster_view_scroller_long_press_time_cb, obj);
1629 static void __clsuter_view_scroller_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1631 Evas_Event_Mouse_Up* ev = event_info;
1633 if (!cluster_mouse_info.pressed || cluster_mouse_info.pressed_obj != obj)
1636 LOGD("UP: (%d,%d)", ev->output.x, ev->output.y);
1638 cluster_mouse_info.pressed = false;
1640 if (cluster_mouse_info.long_press_timer) {
1641 ecore_timer_del(cluster_mouse_info.long_press_timer);
1642 cluster_mouse_info.long_press_timer = NULL;
1645 cluster_mouse_info.up_x = ev->output.x;
1646 cluster_mouse_info.up_y = ev->output.y;
1648 cluster_mouse_info.long_pressed = false;
1651 static void __clsuter_view_scroller_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1653 Evas_Event_Mouse_Move* ev = event_info;
1655 if (!cluster_mouse_info.pressed || cluster_mouse_info.pressed_obj != obj)
1658 cluster_mouse_info.move_x = ev->cur.output.x;
1659 cluster_mouse_info.move_y = ev->cur.output.y;
1661 if (!cluster_mouse_info.long_pressed) {
1662 int distance = (cluster_mouse_info.move_x - cluster_mouse_info.down_x) * (cluster_mouse_info.move_x - cluster_mouse_info.down_x);
1663 distance += (cluster_mouse_info.move_y - cluster_mouse_info.down_y) * (cluster_mouse_info.move_y - cluster_mouse_info.down_y);
1665 if (distance > MOUSE_MOVE_MIN_DISTANCE) {
1666 if (cluster_mouse_info.long_press_timer) {
1667 ecore_timer_del(cluster_mouse_info.long_press_timer);
1668 cluster_mouse_info.long_press_timer = NULL;
1676 static Eina_Bool __cluster_view_scroller_long_press_time_cb(void *data)
1678 if (!cluster_mouse_info.pressed || cluster_mouse_info.pressed_obj != data)
1679 return ECORE_CALLBACK_CANCEL;
1681 cluster_mouse_info.long_pressed = true;
1683 cluster_view_set_state(VIEW_STATE_EDIT);
1685 return ECORE_CALLBACK_CANCEL;
1688 static void __cluster_view_scroll_drag_start_cb(void *data, Evas_Object *obj, void *event_info)
1690 __cluster_view_scroll_start();
1693 static void __cluster_view_scroll_drag_stop_cb(void *data, Evas_Object *obj, void *event_info)
1695 if (cluster_view_s.scroll_stop_timer) {
1696 ecore_timer_del(cluster_view_s.scroll_stop_timer);
1697 cluster_view_s.scroll_stop_timer = NULL;
1700 cluster_view_s.scroll_stop_timer = ecore_timer_add(SCROLL_STOP_TIME, __cluster_view_scroll_stop, NULL);
1703 static void __cluster_view_scroll_anim_start_cb(void *data, Evas_Object *obj, void *event_info)
1705 if (cluster_view_s.scroll_stop_timer) {
1706 ecore_timer_del(cluster_view_s.scroll_stop_timer);
1707 cluster_view_s.scroll_stop_timer = NULL;
1711 static void __cluster_view_scroll_anim_stop_cb(void *data, Evas_Object *obj, void *event_info)
1713 __cluster_view_scroll_stop(NULL);
1716 static void __cluster_view_scroll_start(void)
1718 screen_reader_update(CLEAR);
1720 cluster_view_s.is_srolling = true;
1722 cluster_page_t *current_page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, cluster_view_s.current_page);
1723 Eina_List *find_list = NULL;
1724 widget_data_t *item;
1725 LOGD("Current Page : %d", cluster_view_s.current_page);
1726 EINA_LIST_FOREACH(current_page->widget_list, find_list, item) {
1727 widget_viewer_send_cancel_click_event(item);
1731 static Eina_Bool __cluster_view_scroll_stop(void *data)
1733 if (!cluster_view_s.is_srolling) {
1734 LOGE("scroll is already stopped");
1735 return ECORE_CALLBACK_CANCEL;
1738 cluster_view_s.is_srolling = false;
1740 elm_scroller_current_page_get(cluster_view_s.scroller, &cluster_view_s.current_page, NULL);
1741 cluster_view_s.current_page = cluster_view_s.current_page % cluster_view_s.page_count;
1742 LOGD("current page %d", cluster_view_s.current_page);
1744 char buf[STR_MAX] = { 0 , };
1745 snprintf(buf, sizeof(buf), _("IDS_HS_TBOPT_PAGE_P1SD_OF_P2SD"), cluster_view_s.current_page + 1, cluster_view_s.page_count);
1746 screen_reader_read(buf);
1747 screen_reader_update(HOME);
1749 return ECORE_CALLBACK_CANCEL;
1752 static Eina_Bool __cluster_view_scroll_timer_cb(void *data)
1754 cluster_page_t *current_page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, cluster_view_s.current_page);
1756 int next_page_idx = 0;
1757 if (MIRRORING_X(cluster_mouse_info.move_x, CLUSTER_VIEW_W) > CLUSTER_EDIT_RIGHT_SCROLL_REGION) {
1758 next_page_idx = current_page->page_index + 1;
1759 } else if (MIRRORING_X(cluster_mouse_info.move_x, CLUSTER_VIEW_W) < CLUSTER_EDIT_LEFT_SCROLL_REGION) {
1760 next_page_idx = current_page->page_index - 1;
1762 cluster_view_s.edit_mode_scroll_timer = NULL;
1763 return ECORE_CALLBACK_CANCEL;
1766 if (next_page_idx < 0 || next_page_idx >= cluster_view_s.page_count) {
1767 return ECORE_CALLBACK_RENEW;
1770 cluster_page_drag_cancel(current_page);
1771 __cluster_view_scroll_to_page(next_page_idx, true);
1772 return ECORE_CALLBACK_RENEW;