Add group_feature_all_page_back
[profile/mobile/apps/native/homescreen-efl.git] / src / cluster_view.c
1 /*
2  * Copyright 2012  Samsung Electronics Co., Ltd
3  *
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
7  *
8  * http://floralicense.org/license/
9  *
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.
15  */
16
17 #include <efl_extension.h>
18
19 #include "homescreen-efl.h"
20 #include "cluster_view.h"
21 #include "conf.h"
22 #include "edc_conf.h"
23 #include "util.h"
24 #include "app_log.h"
25 #include "page_indicator.h"
26 #include "widget_viewer.h"
27 #include "menu.h"
28 #include "popup.h"
29 #include "cluster_page.h"
30 #include "cluster_data.h"
31 #include "add_widget_viewer/add_widget_viewer.h"
32 #include "mouse.h"
33 #include "screen_reader_handler.h"
34
35 #define SCROLL_STOP_TIME 0.05
36
37 static struct {
38         Evas_Object *win;
39         Evas_Object *scroller;
40         Evas_Object *box;
41         Evas_Object *allpage;
42         Evas_Object *allpage_add_page;
43         Evas_Object *allpage_grid;
44         page_indicator_t *indicator;
45         int page_count;
46         int current_page;
47         view_state_t view_state;
48         Eina_List *page_list;
49         cluster_page_t *picked_page;
50         widget_data_t *picked_widget;
51         Ecore_Timer *edit_mode_scroll_timer;
52         Ecore_Timer *scroll_stop_timer;
53         bool is_srolling;
54         Ecore_Animator *edit_animator;
55         int animation_from_x;
56         int animation_from_y;
57         int animation_to_x;
58         int animation_to_y;
59 } cluster_view_s = {
60         .scroller = NULL,
61         .box = NULL,
62         .allpage = NULL,
63         .allpage_add_page = NULL,
64         .allpage_grid = NULL,
65         .indicator = NULL,
66         .page_count = 0,
67         .current_page = INIT_VALUE,
68         .view_state = VIEW_STATE_NORMAL,
69         .page_list = NULL,
70         .picked_page = NULL,
71         .picked_widget = NULL,
72         .edit_mode_scroll_timer = NULL,
73         .scroll_stop_timer = NULL,
74         .is_srolling = false,
75         .edit_animator = NULL,
76         .animation_from_x = INIT_VALUE,
77         .animation_from_y = INIT_VALUE,
78         .animation_to_x = INIT_VALUE,
79         .animation_to_y = INIT_VALUE,
80 };
81
82 static int cluster_menu_list[4] = {
83         MENU_CLUSTER_EDIT,
84         MENU_CLUSTER_ADD_WIDGET,
85         MENU_CLUSTER_CHANGE_WALLPAPER,
86         MENU_CLUSTER_ALL_PAGES
87 };
88
89 static mouse_info_t cluster_mouse_info = {
90         .pressed = false,
91         .long_pressed = false,
92         .down_x = 0,
93         .down_y = 0,
94         .move_x = 0,
95         .move_y = 0,
96         .up_x = 0,
97         .up_y = 0,
98         .long_press_timer = NULL,
99         .offset_x = 0,
100         .offset_y = 0,
101         .pressed_obj = NULL,
102 };
103
104 #define SCROLL_TIMING_ISSUE
105 #ifdef SCROLL_TIMING_ISSUE
106 #define SCROLL_TIMING_INTERVAL 0.001
107
108 static Ecore_Timer *__scroll_timing_timer = NULL;
109 #endif
110
111 static Eina_Hash *cluster_menu_table = NULL;
112
113 Evas_Object *__cluster_view_create_base_gui(Evas_Object *win);
114
115 static void __clsuter_view_scroller_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
116 static void __clsuter_view_scroller_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
117 static void __clsuter_view_scroller_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
118 static Eina_Bool __cluster_view_scroller_long_press_time_cb(void *data);
119
120 static void __cluster_view_create_cluster(void);
121 static void __cluster_view_create_menu(void);
122 static void __cluster_view_menu_edit_cb(void *data, Evas_Object *obj, void *event_info);
123 static void __cluster_view_menu_add_widget_cb(void *data, Evas_Object *obj, void *event_info);
124 static void __cluster_view_menu_change_wallpaper_cb(void *data, Evas_Object *obj, void *event_info);
125 static void __cluster_view_menu_all_pages_cb(void *data, Evas_Object *obj, void *event_info);
126 static void __cluster_view_app_launch_request_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *data);
127 static void __cluster_view_scroll_to_home(void);
128 static void __cluster_view_scroll_to_page(int page_idx, bool animation);
129 static void __cluster_view_add_widget_content(widget_data_t *item);
130 static void __cluster_view_create_all_page(void);
131 static void __cluster_view_destroy_all_page(void);
132 static cluster_page_t * __cluster_view_page_new(void);
133 static void __cluster_view_page_delete(cluster_page_t *page);
134 static void __cluster_view_allpage_delete_clicked(void *data, Evas_Object *obj, const char *emission, const char *source);
135 static void __cluster_view_allpage_add_clicked(void *data, Evas_Object *obj, const char *emission, const char *source);
136 static void __cluster_view_allpage_delete_page_cb(void *data, Evas_Object *obj, void *event_info);
137
138 static void __clsuter_view_thumbnail_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
139 static void __clsuter_view_thumbnail_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
140 static void __clsuter_view_thumbnail_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
141 static Eina_Bool __cluster_view_thumbnail_long_press_time_cb(void *data);
142 static void __cluster_view_allpage_drag_page(void *data);
143 static void __cluster_view_allpage_pick_up_page(void *data);
144 static void __cluster_view_allpage_drop_page(void *data);
145 static void __cluster_view_allpage_clicked_page(void *data, Evas_Object *obj, const char *emission, const char *source);
146
147 static void __clsuter_view_widget_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
148 static void __clsuter_view_widget_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
149 static void __clsuter_view_widget_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
150 static Eina_Bool __cluster_view_widget_long_press_time_cb(void *data);
151
152 static void __cluster_view_edit_pick_up_widget(void *data);
153 static void __cluster_view_edit_drag_widget(void *data);
154 static void __cluster_view_edit_drop_widget(void *data);
155 static Eina_Bool __cluster_view_edit_move_anim(void *data, double pos);
156 static void __cluster_view_edit_move_anim_done(void *data);
157
158 static Eina_Bool __cluster_view_scroll_timer_cb(void *data);
159
160 static void __cluster_view_scroll_drag_start_cb(void *data, Evas_Object *obj, void *event_info);
161 static void __cluster_view_scroll_drag_stop_cb(void *data, Evas_Object *obj, void *event_info);
162 static void __cluster_view_scroll_anim_start_cb(void *data, Evas_Object *obj, void *event_info);
163 static void __cluster_view_scroll_anim_stop_cb(void *data, Evas_Object *obj, void *event_info);
164 static void __cluster_view_scroll_start(void);
165 static Eina_Bool __cluster_view_scroll_stop(void *data);
166 static void __cluster_view_allpage_get_page_pos(int page_idx, int *w, int *h);
167 static int __cluster_view_allpage_get_page_index(int x, int y);
168 static void __cluster_view_allpage_reposition(void);
169 static int __cluster_view_page_sort_cb(const void *a , const void *b);
170
171 static void __cluster_view_get_access_page_thumbnail(Eina_List **list);
172 static void __cluster_view_get_access_page_delete_button(Eina_List **list);
173 static void __cluster_view_get_access_add_page(Eina_List **list);
174
175 Evas_Object *cluster_view_create(Evas_Object *win)
176 {
177         cluster_view_s.win = win;
178
179         Evas_Object *base_layout = __cluster_view_create_base_gui(win);
180
181         if (base_layout == NULL) {
182                 LOGE("[FAILED][base_layout == NULL]");
183                 return NULL;
184         }
185
186         cluster_view_s.indicator = page_indictor_create(cluster_view_s.scroller);
187         page_indicator_scroller_resize(cluster_view_s.indicator, CLUSTER_VIEW_W , CLUSTER_VIEW_H);
188
189         return base_layout;
190 }
191
192 void cluster_view_init(void)
193 {
194         widget_viewer_init(cluster_view_s.win);
195         cluster_data_init();
196
197         __cluster_view_create_cluster();
198         __cluster_view_create_menu();
199 }
200
201 void cluster_view_app_terminate(void)
202 {
203         evas_object_smart_callback_del(cluster_view_s.scroller, "scroll,drag,start", __cluster_view_scroll_drag_start_cb);
204         evas_object_smart_callback_del(cluster_view_s.scroller, "scroll,drag,stop", __cluster_view_scroll_drag_stop_cb);
205         evas_object_smart_callback_del(cluster_view_s.scroller, "scroll,anim,start", __cluster_view_scroll_anim_start_cb);
206         evas_object_smart_callback_del(cluster_view_s.scroller, "scroll,anim,stop", __cluster_view_scroll_anim_stop_cb);
207
208         evas_object_event_callback_del(cluster_view_s.scroller, EVAS_CALLBACK_MOUSE_DOWN, __clsuter_view_scroller_down_cb);
209         evas_object_event_callback_del(cluster_view_s.scroller, EVAS_CALLBACK_MOUSE_MOVE, __clsuter_view_scroller_move_cb);
210         evas_object_event_callback_del(cluster_view_s.scroller, EVAS_CALLBACK_MOUSE_UP, __clsuter_view_scroller_up_cb);
211
212         eina_hash_free(cluster_menu_table);
213         widget_viewer_fini();
214 }
215
216 void cluster_view_show(void)
217 {
218         page_indicator_show(cluster_view_s.indicator);
219 }
220
221 void cluster_view_hide(void)
222 {
223         page_indicator_hide(cluster_view_s.indicator);
224 }
225
226 void cluster_view_show_anim(double pos)
227 {
228         evas_object_color_set(cluster_view_s.box, 255, 255, 255, pos*255);
229         if (pos >= (1.0 - (1e-10))) {
230                 evas_object_color_set(cluster_view_s.box, 255, 255, 255, 255);
231         }
232 }
233
234 void cluster_view_hide_anim(double pos)
235 {
236         evas_object_color_set(cluster_view_s.box, 255, 255, 255, (1-pos)*255);
237         if (pos >= (1.0 - (1e-10))) {
238                 evas_object_color_set(cluster_view_s.box, 255, 255, 255, 0);
239         }
240 }
241
242 Evas_Object *__cluster_view_create_base_gui(Evas_Object *win)
243 {
244         cluster_view_s.scroller = elm_scroller_add(win);
245         if (cluster_view_s.scroller == NULL) {
246                 return NULL;
247         }
248         elm_scroller_content_min_limit(cluster_view_s.scroller, EINA_FALSE, EINA_FALSE);
249         elm_scroller_bounce_set(cluster_view_s.scroller, EINA_FALSE, EINA_FALSE);
250         elm_scroller_policy_set(cluster_view_s.scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
251         elm_scroller_page_scroll_limit_set(cluster_view_s.scroller, 1, 0);
252         evas_object_size_hint_weight_set(cluster_view_s.scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
253         evas_object_resize(cluster_view_s.scroller, CLUSTER_VIEW_W, CLUSTER_VIEW_H);
254
255         elm_scroller_loop_set(cluster_view_s.scroller, EINA_FALSE, EINA_FALSE);
256         elm_scroller_page_size_set(cluster_view_s.scroller, CLUSTER_VIEW_W , CLUSTER_VIEW_H);
257
258         evas_object_event_callback_add(cluster_view_s.scroller, EVAS_CALLBACK_MOUSE_DOWN, __clsuter_view_scroller_down_cb, NULL);
259         evas_object_event_callback_add(cluster_view_s.scroller, EVAS_CALLBACK_MOUSE_MOVE, __clsuter_view_scroller_move_cb, NULL);
260         evas_object_event_callback_add(cluster_view_s.scroller, EVAS_CALLBACK_MOUSE_UP, __clsuter_view_scroller_up_cb, NULL);
261
262         evas_object_smart_callback_add(cluster_view_s.scroller, "scroll,drag,start", __cluster_view_scroll_drag_start_cb, NULL);
263         evas_object_smart_callback_add(cluster_view_s.scroller, "scroll,drag,stop", __cluster_view_scroll_drag_stop_cb, NULL);
264         evas_object_smart_callback_add(cluster_view_s.scroller, "scroll,anim,start", __cluster_view_scroll_anim_start_cb, NULL);
265         evas_object_smart_callback_add(cluster_view_s.scroller, "scroll,anim,stop", __cluster_view_scroll_anim_stop_cb, NULL);
266
267         cluster_view_s.box = elm_box_add(cluster_view_s.scroller);
268         elm_box_horizontal_set(cluster_view_s.box, EINA_TRUE);
269         evas_object_size_hint_weight_set(cluster_view_s.box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
270         evas_object_size_hint_align_set(cluster_view_s.box, 0, 0);
271         evas_object_show(cluster_view_s.box);
272
273         elm_object_content_set(cluster_view_s.scroller, cluster_view_s.box);
274
275         return cluster_view_s.scroller;
276 }
277
278 static void __cluster_view_create_cluster(void)
279 {
280         Eina_List *widget_list = cluster_data_get_widget_list();
281         int page_count = cluster_data_get_page_count();
282         cluster_view_s.current_page = CLUSTER_HOME_PAGE;
283
284         while (page_count--) {
285                 __cluster_view_page_new();
286         }
287
288         Eina_List *find_list;
289         widget_data_t *item = NULL;
290         EINA_LIST_FOREACH(widget_list, find_list, item) {
291                 __cluster_view_add_widget_content(item);
292                 cluster_page_t *page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, item->page_idx);
293                 if (page == NULL) {
294                         LOGE("page is NULL");
295                 } else {
296                         if (!cluster_page_set_widget(page, item)) {
297                                 LOGE("failed cluster_page_set_widget page %d", item->page_idx);
298                         }
299                 }
300         }
301
302         page_indicator_set_current_page(cluster_view_s.indicator, cluster_view_s.current_page);
303 }
304
305 static void __cluster_view_create_menu(void)
306 {
307         cluster_menu_table = eina_hash_int32_new(NULL);
308         eina_hash_add(cluster_menu_table, &cluster_menu_list[0], __cluster_view_menu_edit_cb);
309         eina_hash_add(cluster_menu_table, &cluster_menu_list[1], __cluster_view_menu_add_widget_cb);
310         eina_hash_add(cluster_menu_table, &cluster_menu_list[2], __cluster_view_menu_change_wallpaper_cb);
311         eina_hash_add(cluster_menu_table, &cluster_menu_list[3], __cluster_view_menu_all_pages_cb);
312 }
313
314 static void __cluster_view_menu_edit_cb(void *data, Evas_Object *obj, void *event_info)
315 {
316         menu_hide();
317
318         cluster_view_set_state(VIEW_STATE_EDIT);
319 }
320
321 static void __cluster_view_menu_add_widget_cb(void *data, Evas_Object *obj, void *event_info)
322 {
323         menu_hide();
324
325         cluster_view_set_state(VIEW_STATE_ADD_VIEWER);
326 }
327
328 static void __cluster_view_menu_change_wallpaper_cb(void *data, Evas_Object *obj, void *event_info)
329 {
330         const char *appid = "org.tizen.wallpaper-ui-service";
331         app_control_h app_control_handle = NULL;
332
333         if (app_control_create(&app_control_handle) != APP_CONTROL_ERROR_NONE) {
334                 LOGE("[FAILED][app_control_create]");
335                 return;
336         }
337
338         app_control_add_extra_data(app_control_handle, "from", "Homescreen-efl");
339         app_control_add_extra_data(app_control_handle, "popup_type", "selection_popup");
340         app_control_add_extra_data(app_control_handle, "setas-type", "Homescreen");
341
342         if (app_control_set_app_id(app_control_handle, appid) != APP_CONTROL_ERROR_NONE) {
343                 LOGE("[FAILED][app_control_set_app_id]");
344                 app_control_destroy(app_control_handle);
345                 return;
346         }
347
348         if (app_control_set_operation(app_control_handle, APP_CONTROL_OPERATION_MAIN) != APP_CONTROL_ERROR_NONE) {
349                 LOGE("[FAILED][app_control_set_operation]");
350                 app_control_destroy(app_control_handle);
351                 return;
352         }
353
354         if (app_control_send_launch_request(app_control_handle, __cluster_view_app_launch_request_cb, NULL) != APP_CONTROL_ERROR_NONE) {
355                 LOGE("[FAILED][app_control_send_launch_request]");
356                 app_control_destroy(app_control_handle);
357                 return;
358         }
359
360         app_control_destroy(app_control_handle);
361
362         menu_hide();
363 }
364
365 static void __cluster_view_menu_all_pages_cb(void *data, Evas_Object *obj, void *event_info)
366 {
367         menu_hide();
368
369         cluster_view_set_state(VIEW_STATE_ALL_PAGE);
370 }
371
372 void cluster_view_hw_menu_key(void)
373 {
374         if (cluster_view_s.view_state == VIEW_STATE_NORMAL)
375                 menu_change_state_on_hw_menu_key(cluster_menu_table);
376 }
377
378 bool cluster_view_hw_home_key(void)
379 {
380         if (cluster_view_s.view_state == VIEW_STATE_NORMAL) {
381                 __cluster_view_scroll_to_home();
382         } else if (cluster_view_s.view_state == VIEW_STATE_EDIT) {
383                 cluster_view_set_state(VIEW_STATE_NORMAL);
384         } else if (cluster_view_s.view_state == VIEW_STATE_ADD_VIEWER) {
385                 cluster_view_set_state(VIEW_STATE_NORMAL);
386         } else if (cluster_view_s.view_state == VIEW_STATE_ALL_PAGE) {
387                 cluster_view_set_state(VIEW_STATE_NORMAL);
388         }
389
390         return false;
391 }
392
393 bool cluster_view_hw_back_key(void)
394 {
395         if (cluster_view_s.view_state == VIEW_STATE_EDIT) {
396                 cluster_view_set_state(VIEW_STATE_NORMAL);
397         } else if (cluster_view_s.view_state == VIEW_STATE_ADD_VIEWER) {
398                 cluster_view_set_state(VIEW_STATE_NORMAL);
399         } else if (cluster_view_s.view_state == VIEW_STATE_ALL_PAGE) {
400                 cluster_view_set_state(VIEW_STATE_NORMAL);
401         }
402
403         return true;
404 }
405
406 void cluster_view_lang_changed(homescreen_view_t view_type)
407 {
408         if (view_type == HOMESCREEN_VIEW_HOME) {
409                 cluster_view_set_state(VIEW_STATE_NORMAL);
410         }
411 }
412
413 view_state_t cluster_view_get_state(void)
414 {
415         return cluster_view_s.view_state;
416 }
417
418 #ifdef SCROLL_TIMING_ISSUE
419 static Eina_Bool __cluster_view_close_all_page(void *data)
420 {
421         __cluster_view_destroy_all_page();
422         __cluster_view_scroll_to_page(cluster_view_s.current_page, false);
423
424         evas_object_show(cluster_view_s.scroller);
425
426         __scroll_timing_timer = NULL;
427         return ECORE_CALLBACK_CANCEL;
428 }
429 #endif
430
431 bool cluster_view_set_state(view_state_t state)
432 {
433         if (cluster_view_s.is_srolling) {
434                 LOGE("cannot change view-state");
435                 return false;
436         }
437
438         if (cluster_view_s.edit_animator) {
439                 ecore_animator_del(cluster_view_s.edit_animator);
440                 cluster_view_s.edit_animator = NULL;
441                 __cluster_view_edit_move_anim_done(cluster_view_s.picked_widget);
442         }
443
444         if (state == VIEW_STATE_EDIT) {
445                 homescreen_efl_btn_hide(HOMESCREEN_VIEW_HOME);
446
447                 Eina_List *data_list = cluster_data_get_widget_list();
448                 Eina_List *find_list = NULL;
449
450                 widget_data_t *item = NULL;
451                 EINA_LIST_FOREACH(data_list, find_list, item) {
452                         if (item->widget_layout) {
453                                 if (!cluster_view_s.picked_widget || item->widget_layout != cluster_view_s.picked_widget->widget_layout) {
454                                         elm_object_signal_emit(item->widget_layout, SIGNAL_DELETE_BUTTON_SHOW_ANI, SIGNAL_SOURCE);
455                                 } else {
456                                         evas_object_event_callback_add(item->widget_content, EVAS_CALLBACK_MOUSE_DOWN, __clsuter_view_widget_down_cb, item);
457                                         evas_object_event_callback_add(item->widget_content, EVAS_CALLBACK_MOUSE_MOVE, __clsuter_view_widget_move_cb, item);
458                                         evas_object_event_callback_add(item->widget_content, EVAS_CALLBACK_MOUSE_UP, __clsuter_view_widget_up_cb, item);
459                                 }
460                                 widget_viewer_thumbnail_add(item);
461                                 widget_viewer_pause_widget(item);
462                                 elm_object_signal_emit(item->widget_layout, SIGNAL_CLUSTER_EDIT_STATE, SIGNAL_SOURCE);
463                         }
464                 }
465
466                 cluster_page_t *page_item = NULL;
467                 EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) {
468                         if (page_item->page_layout) {
469                                 elm_object_signal_emit(page_item->page_layout, SIGNAL_EDIT_MODE_ON, SIGNAL_SOURCE);
470                         }
471                 }
472         } else if (state == VIEW_STATE_NORMAL) {
473                 if (cluster_view_s.view_state == VIEW_STATE_EDIT) {
474                         homescreen_efl_btn_show(HOMESCREEN_VIEW_HOME);
475
476                         if (cluster_view_s.picked_widget) {
477                                 cluster_page_t *page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, cluster_view_s.picked_widget->page_idx);
478                                 cluster_page_set_widget(page, cluster_view_s.picked_widget);
479
480                                 cluster_view_s.picked_widget = NULL;
481
482                                 page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, cluster_view_s.current_page);
483                                 cluster_page_drag_cancel(page);
484                         }
485
486                         Eina_List *data_list = cluster_data_get_widget_list();
487                         Eina_List *find_list = NULL;
488                         cluster_page_t *page_item = NULL;
489                         EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) {
490                                 if (page_item->page_layout) {
491                                         elm_object_signal_emit(page_item->page_layout, SIGNAL_EDIT_MODE_OFF, SIGNAL_SOURCE);
492                                 }
493                         }
494
495                         widget_data_t *item = NULL;
496                         EINA_LIST_FOREACH(data_list, find_list, item) {
497                                 if (item->widget_layout) {
498                                         elm_object_signal_emit(item->widget_layout, SIGNAL_DELETE_BUTTON_HIDE_ANI, SIGNAL_SOURCE);
499                                         elm_object_signal_emit(item->widget_layout, SIGNAL_CLUSTER_NORMAL_STATE, SIGNAL_SOURCE);
500                                         widget_viewer_resume_widget(item);
501                                 }
502                         }
503                 } else if (cluster_view_s.view_state == VIEW_STATE_ADD_VIEWER) {
504                         add_widget_viewer_win_destroy();
505                 } else if (cluster_view_s.view_state == VIEW_STATE_ALL_PAGE) {
506                         elm_win_indicator_mode_set(homescreen_efl_get_win(), ELM_WIN_INDICATOR_SHOW);
507                         homescreen_efl_btn_show(HOMESCREEN_VIEW_HOME);
508                         page_indicator_show(cluster_view_s.indicator);
509                         evas_object_hide(cluster_view_s.scroller);
510
511
512                         Eina_List *find_list = NULL;
513
514                         cluster_page_t *page_item = NULL;
515
516                         elm_box_unpack_all(cluster_view_s.box);
517                         EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) {
518                                 if (page_item->page_layout) {
519                                         elm_box_pack_end(cluster_view_s.box, page_item->page_layout);
520                                 }
521                         }
522
523                         Eina_List *data_list = cluster_data_get_widget_list();
524                         widget_data_t *item = NULL;
525                         EINA_LIST_FOREACH(data_list, find_list, item) {
526                                 if (item->widget_layout) {
527                                         widget_viewer_resume_widget(item);
528                                 }
529                         }
530
531                         if (cluster_view_s.current_page >= cluster_view_s.page_count) {
532                                 cluster_view_s.current_page = CLUSTER_HOME_PAGE;
533                         }
534
535 #ifdef SCROLL_TIMING_ISSUE
536                         if (__scroll_timing_timer) {
537                                 ecore_timer_del(__scroll_timing_timer);
538                                 __scroll_timing_timer = NULL;
539                         }
540                         __scroll_timing_timer = ecore_timer_add(SCROLL_TIMING_INTERVAL, __cluster_view_close_all_page, NULL);
541 #else
542                         __cluster_view_destroy_all_page();
543                         __cluster_view_scroll_to_page(cluster_view_s.current_page, false);
544
545                         evas_object_show(cluster_view_s.scroller);
546 #endif
547                 }
548         } else if (state == VIEW_STATE_ADD_VIEWER) {
549                 add_widget_viewer_win_create();
550         } else if (state == VIEW_STATE_ALL_PAGE) {
551                 elm_win_indicator_mode_set(homescreen_efl_get_win(), ELM_WIN_INDICATOR_HIDE);
552                 homescreen_efl_btn_hide(HOMESCREEN_VIEW_HOME);
553                 page_indicator_hide(cluster_view_s.indicator);
554
555                 __cluster_view_create_all_page();
556
557                 Eina_List *data_list = cluster_data_get_widget_list();
558                 Eina_List *find_list = NULL;
559                 widget_data_t *item = NULL;
560                 EINA_LIST_FOREACH(data_list, find_list, item) {
561                         if (item->widget_layout) {
562                                 widget_viewer_pause_widget(item);
563                         }
564                 }
565         }
566
567         cluster_view_s.view_state = state;
568         screen_reader_update(HOME);
569
570         return true;
571 }
572
573 bool cluster_view_add_widget(widget_data_t *item, bool scroll)
574 {
575         bool set_on = false;
576
577         cluster_page_t *page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, cluster_view_s.current_page);
578         if (cluster_page_find_empty_space(page, item->type, &item->pos_x, &item->pos_y)) {
579                 item->page_idx = cluster_view_s.current_page;
580                 set_on = true;
581         }
582
583         if (!set_on) {
584                 Eina_List *find_list = NULL;
585                 cluster_page_t *page_item = NULL;
586                 EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) {
587                         if (cluster_page_find_empty_space(page_item, item->type, &item->pos_x, &item->pos_y)) {
588                                 item->page_idx = page_item->page_index;
589                                 set_on = true;
590                                 page = page_item;
591                                 break;
592                         }
593                 }
594         }
595
596         if (!set_on) {
597                 if (cluster_view_s.page_count >= CLUSTER_MAX_PAGE) {
598                         LOGE("cluster page is max.");
599
600                         Evas_Smart_Cb func[3] = { NULL, NULL, NULL };
601                         void *data[3] = { NULL, NULL, NULL };
602                         char btn_text[3][STR_MAX] = { "", "", "" };
603                         char title_text[STR_MAX] = { "" };
604                         char popup_text[STR_MAX] = { "" };
605                         snprintf(btn_text[0], sizeof(btn_text[0]), "%s", _("IDS_CAM_SK_OK"));
606                         snprintf(title_text, sizeof(title_text), "%s", _("IDS_HS_HEADER_UNABLE_TO_ADD_WIDGET_ABB"));
607                         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"));
608                         popup_show(1, func, data, btn_text, title_text, popup_text);
609                         return false;
610                 }
611
612                 cluster_page_t *page_t = __cluster_view_page_new();
613                 if (!page_t) {
614                         LOGE("Cannot add widget");
615                         return false;
616                 }
617
618                 if (!cluster_page_find_empty_space(page_t, item->type, &item->pos_x, &item->pos_y)) {
619                         return false;
620                 }
621
622                 item->page_idx = page_t->page_index;
623                 page = page_t;
624         }
625
626         if (!item->widget_layout) {
627                 __cluster_view_add_widget_content(item);
628         }
629
630         if (!cluster_page_set_widget(page, item)) {
631                 LOGE("cluster_page_set_widget is failed!!!");
632                 return false;
633         }
634
635         if (scroll) {
636                 cluster_view_s.current_page = item->page_idx;
637                 __cluster_view_scroll_to_page(cluster_view_s.current_page, true);
638         }
639
640         return true;
641 }
642
643 void cluster_view_delete_widget(widget_data_t *item)
644 {
645         if (item == NULL)
646                 return ;
647
648         cluster_page_t *page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, item->page_idx);
649         if (page)
650                 cluster_page_unset(page, item);
651         else
652                 LOGE("Page is NULL");
653
654         if (item->widget_layout) {
655                 evas_object_event_callback_del(item->widget_layout, EVAS_CALLBACK_MOUSE_DOWN, __clsuter_view_widget_down_cb);
656                 evas_object_event_callback_del(item->widget_layout, EVAS_CALLBACK_MOUSE_MOVE, __clsuter_view_widget_move_cb);
657                 evas_object_event_callback_del(item->widget_layout, EVAS_CALLBACK_MOUSE_UP, __clsuter_view_widget_up_cb);
658
659                 evas_object_del(item->widget_layout);
660                 item->widget_layout = NULL;
661         }
662
663         screen_reader_update(HOME);
664 }
665
666 void cluster_view_edit_on_done(cluster_page_t *page)
667 {
668         if (cluster_view_s.picked_widget) {
669                 if (page->page_index == cluster_view_s.picked_widget->page_idx) {
670                         cluster_page_unset(page, cluster_view_s.picked_widget);
671                         cluster_mouse_info.offset_x *= 0.9;
672                         cluster_mouse_info.offset_y *= 0.9;
673                 }
674         }
675 }
676
677 void cluster_view_get_access_object_list(Eina_List **list)
678 {
679         if (cluster_view_s.view_state == VIEW_STATE_NORMAL) {
680                 cluster_page_t *page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, cluster_view_s.current_page);
681                 cluster_page_get_access_widget_list(page, list, EINA_FALSE);
682
683                 homescreen_efl_get_access_menu_btn(list);
684                 homescreen_efl_get_access_apps_btn(list);
685         } else if (cluster_view_s.view_state == VIEW_STATE_EDIT) {
686                 cluster_page_t *page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, cluster_view_s.current_page);
687                 cluster_page_get_access_widget_list(page, list, EINA_TRUE);
688         } else if (cluster_view_s.view_state == VIEW_STATE_ALL_PAGE) {
689                 __cluster_view_get_access_page_thumbnail(list);
690                 __cluster_view_get_access_page_delete_button(list);
691
692                 __cluster_view_get_access_add_page(list);
693         }
694 }
695
696 static void __cluster_view_get_access_page_thumbnail(Eina_List **list)
697 {
698         Eina_List *find_list = NULL;
699         cluster_page_t *page_item = NULL;
700         EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) {
701                 if (page_item->thumbnail_ly) {
702                         char buf[STR_MAX] = { 0, };
703                         snprintf(buf, sizeof(buf), _("IDS_HS_TBOPT_PAGE_P1SD_OF_P2SD"), page_item->page_index + 1, cluster_view_s.page_count);
704                         access_info_t *info = (access_info_t *)malloc(sizeof(access_info_t));
705                         info->is_access_obj = EINA_FALSE;
706                         info->target = page_item->thumbnail_ly;
707                         info->parent = page_item->page_layout;
708                         info->name = strdup(buf);
709                         info->description = strdup(_("IDS_BR_BODY_DOUBLE_TAP_AND_HOLD_THEN_DRAG_TO_REORDER_TTS"));
710                         info->role = ELM_ATSPI_ROLE_UNKNOWN;
711                         info->clicked_cb = __cluster_view_allpage_clicked_page;
712                         info->cb_data = page_item;
713                         info->priority = (page_item->page_index + 1) * ACCESS_PRIORITY_ALL_PAGE;
714
715                         *list = eina_list_append(*list, info);
716                 }
717         }
718 }
719
720 static void __cluster_view_get_access_page_delete_button(Eina_List **list)
721 {
722         if (eina_list_count(cluster_view_s.page_list) > 1) {
723                 Eina_List *find_list = NULL;
724                 cluster_page_t *page_item = NULL;
725                 EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) {
726                         if (page_item->thumbnail_ly) {
727                                 access_info_t *info = (access_info_t *)malloc(sizeof(access_info_t));
728                                 info->is_access_obj = EINA_FALSE;
729                                 info->target = (Evas_Object *)edje_object_part_object_get(elm_layout_edje_get(page_item->thumbnail_ly), CLUSTER_ALLPAGE_DELETE_BUTTON);
730                                 info->parent = page_item->thumbnail_ly;
731                                 info->name = strdup(_("IDS_HS_HEADER_DELETE_PAGE_ABB2"));
732                                 info->description = strdup(_("IDS_ACCS_BODY_BUTTON_TTS"));
733                                 info->role = ELM_ATSPI_ROLE_UNKNOWN;
734                                 info->clicked_cb = __cluster_view_allpage_delete_clicked;
735                                 info->cb_data = page_item;
736                                 info->priority = (page_item->page_index + 1) * ACCESS_PRIORITY_ALL_PAGE + ACCESS_PRIORITY_ALL_PAGE / 2;
737
738                                 *list = eina_list_append(*list, info);
739                         }
740                 }
741         }
742 }
743
744 static void __cluster_view_get_access_add_page(Eina_List **list)
745 {
746         if (cluster_view_s.allpage_add_page) {
747                 access_info_t *info = (access_info_t *)malloc(sizeof(access_info_t));
748                 info->is_access_obj = EINA_FALSE;
749                 info->target = cluster_view_s.allpage_add_page;
750                 info->parent = cluster_view_s.allpage_grid;
751                 info->name = strdup(_("IDS_HS_BODY_CREATE_PAGE"));
752                 info->description = strdup(_("IDS_ACCS_BODY_BUTTON_TTS"));
753                 info->role = ELM_ATSPI_ROLE_UNKNOWN;
754                 info->clicked_cb = __cluster_view_allpage_add_clicked;
755                 info->cb_data = NULL;
756                 info->priority = (CLUSTER_MAX_PAGE + 1) * ACCESS_PRIORITY_ALL_PAGE;
757
758                 *list = eina_list_append(*list, info);
759         }
760 }
761
762 static void __cluster_view_scroll_to_home(void)
763 {
764         __cluster_view_scroll_to_page(CLUSTER_HOME_PAGE, true);
765 }
766
767 static void __cluster_view_scroll_to_page(int page_idx, bool animation)
768 {
769         __cluster_view_scroll_start();
770
771         if (animation) {
772                 __D("bring in %d page", page_idx);
773                 elm_scroller_page_bring_in(cluster_view_s.scroller, page_idx, 0);
774         } else {
775                 page_indicator_set_current_page(cluster_view_s.indicator, page_idx);
776                 LOGD("show %d page", page_idx);
777
778                 elm_scroller_page_show(cluster_view_s.scroller, page_idx, 0);
779                 __cluster_view_scroll_stop(NULL);
780         }
781 }
782
783 static void __cluster_view_app_launch_request_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *data)
784 {
785         switch (result) {
786         case APP_CONTROL_RESULT_CANCELED:
787                 LOGE("[APP_CONTROL_RESULT_CANCELED]");
788                 break;
789         case APP_CONTROL_RESULT_FAILED:
790                 LOGE("[APP_CONTROL_RESULT_FAILED]");
791                 break;
792         case APP_CONTROL_RESULT_SUCCEEDED:
793                 LOGD("[APP_CONTROL_RESULT_SUCCEEDED]");
794                 break;
795         default:
796                 LOGE("UNKNOWN ERROR");
797                 break;
798         }
799 }
800
801 static void __cluster_view_add_widget_content(widget_data_t *item)
802 {
803         int w, h;
804         LOGD("Create Widget: pkg[%s], type[%d]", item->pkg_name, item->type);
805         widget_viewer_add_widget(cluster_view_s.win, item, &w, &h);
806         evas_object_event_callback_add(item->widget_layout, EVAS_CALLBACK_MOUSE_DOWN, __clsuter_view_widget_down_cb, item);
807         evas_object_event_callback_add(item->widget_layout, EVAS_CALLBACK_MOUSE_MOVE, __clsuter_view_widget_move_cb, item);
808         evas_object_event_callback_add(item->widget_layout, EVAS_CALLBACK_MOUSE_UP, __clsuter_view_widget_up_cb, item);
809         LOGD("widget size : %d %d", w, h);
810 }
811
812 static void __cluster_view_create_all_page(void)
813 {
814         cluster_view_s.allpage = elm_layout_add(homescreen_efl_get_win());
815         elm_layout_file_set(cluster_view_s.allpage, util_get_res_file_path(EDJE_DIR"/cluster_allpage.edj"), GROUP_CLUSTER_ALLPAGE_LY);
816
817         evas_object_size_hint_align_set(cluster_view_s.allpage, EVAS_HINT_FILL, EVAS_HINT_FILL);
818         evas_object_size_hint_weight_set(cluster_view_s.allpage, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
819         evas_object_resize(cluster_view_s.allpage, WINDOW_W, WINDOW_H);
820         evas_object_move(cluster_view_s.allpage, 0, 0);
821         evas_object_show(cluster_view_s.allpage);
822
823         Evas_Object *page_bg = evas_object_rectangle_add(evas_object_evas_get(cluster_view_s.allpage));
824         evas_object_size_hint_min_set(page_bg, WINDOW_W, WINDOW_H);
825         evas_object_size_hint_align_set(page_bg, EVAS_HINT_FILL, EVAS_HINT_FILL);
826         evas_object_size_hint_weight_set(page_bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
827         evas_object_color_set(page_bg, 0, 0, 0, 50);
828         evas_object_show(page_bg);
829         elm_object_part_content_set(cluster_view_s.allpage, SIZE_SETTER, page_bg);
830
831         Evas_Object *grid = elm_grid_add(cluster_view_s.allpage);
832         evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
833         evas_object_size_hint_align_set(grid, EVAS_HINT_FILL, EVAS_HINT_FILL);
834         elm_grid_size_set(grid, WINDOW_W, WINDOW_H);
835         evas_object_show(grid);
836         elm_layout_content_set(cluster_view_s.allpage, CLUSTER_ALLPAGE_GRID, grid);
837         cluster_view_s.allpage_grid = grid;
838
839         Eina_List *find_list = NULL;
840         cluster_page_t *page_item = NULL;
841         elm_box_unpack_all(cluster_view_s.box);
842         EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) {
843                 evas_object_move(page_item->page_layout, -WINDOW_W, -WINDOW_H);
844                 if (page_item->page_layout) {
845                         page_item->thumbnail_ly = elm_layout_add(page_item->page_layout);
846                         elm_layout_file_set(page_item->thumbnail_ly, util_get_res_file_path(EDJE_DIR"/cluster_allpage_thumbnail.edj"), GROUP_CLUSTER_ALLPAGE_THUMBNAIL_LY);
847
848                         evas_object_size_hint_align_set(page_item->thumbnail_ly, EVAS_HINT_FILL, EVAS_HINT_FILL);
849                         evas_object_size_hint_weight_set(page_item->thumbnail_ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
850                         evas_object_show(page_item->thumbnail_ly);
851
852                         Evas_Object *thumbnail = cluster_page_thumbnail(page_item);
853                         elm_object_part_content_set(page_item->thumbnail_ly, CLUSTER_ALLPAGE_THUMBNAIL_IMAGE, thumbnail);
854                         elm_object_signal_callback_add(page_item->thumbnail_ly,
855                                         SIGNAL_ALLPAGE_DELETE_BUTTON_CLICKED, SIGNAL_SOURCE,
856                                         __cluster_view_allpage_delete_clicked, page_item);
857
858                         evas_object_event_callback_add(thumbnail, EVAS_CALLBACK_MOUSE_DOWN, __clsuter_view_thumbnail_down_cb, page_item);
859                         evas_object_event_callback_add(thumbnail, EVAS_CALLBACK_MOUSE_MOVE, __clsuter_view_thumbnail_move_cb, page_item);
860                         evas_object_event_callback_add(thumbnail, EVAS_CALLBACK_MOUSE_UP, __clsuter_view_thumbnail_up_cb, page_item);
861                 }
862         }
863
864         __cluster_view_allpage_reposition();
865
866         if (cluster_view_s.page_count < CLUSTER_MAX_PAGE) {
867                 int x = 0, y = 0;
868                 cluster_view_s.allpage_add_page = elm_layout_add(cluster_view_s.allpage_grid);
869                 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);
870
871                 evas_object_size_hint_align_set(cluster_view_s.allpage_add_page, EVAS_HINT_FILL, EVAS_HINT_FILL);
872                 evas_object_size_hint_weight_set(cluster_view_s.allpage_add_page, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
873                 evas_object_show(cluster_view_s.allpage_add_page);
874
875                 elm_object_signal_emit(cluster_view_s.allpage_add_page, SIGNAL_ALLPAGE_ADD_BUTTON_SHOW, SIGNAL_SOURCE);
876                 elm_object_signal_callback_add(cluster_view_s.allpage_add_page,
877                                 SIGNAL_ALLPAGE_ADD_BUTTON_CLICKED, SIGNAL_SOURCE,
878                                 __cluster_view_allpage_add_clicked, NULL);
879
880                 __cluster_view_allpage_get_page_pos(cluster_view_s.page_count, &x, &y);
881                 elm_grid_pack(cluster_view_s.allpage_grid, cluster_view_s.allpage_add_page, x, y, CLUSTER_ALL_PAGE_W, CLUSTER_ALL_PAGE_H);
882         }
883 }
884
885 static void __cluster_view_allpage_reposition(void)
886 {
887         Eina_List *find_list = NULL;
888         cluster_page_t *page_item = NULL;
889         EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) {
890                 int x = 0, y = 0;
891                 __cluster_view_allpage_get_page_pos(page_item->page_index, &x, &y);
892                 elm_grid_pack(cluster_view_s.allpage_grid, page_item->thumbnail_ly, x, y, CLUSTER_ALL_PAGE_W, CLUSTER_ALL_PAGE_H);
893                 if (cluster_view_s.page_count > 1)
894                         elm_object_signal_emit(page_item->thumbnail_ly, SIGNAL_ALLPAGE_DELETE_BUTTON_SHOW, SIGNAL_SOURCE);
895                 else {
896                         elm_object_signal_emit(page_item->thumbnail_ly, SIGNAL_ALLPAGE_DELETE_BUTTON_HIDE, SIGNAL_SOURCE);
897                 }
898         }
899 }
900
901 static void __cluster_view_allpage_get_page_pos(int page_idx, int *w, int *h)
902 {
903         int row, col;
904         int start_y = 0;
905         if (cluster_view_s.page_count < 2) {
906                 start_y = (WINDOW_H - CLUSTER_ALL_PAGE_H) / 2;
907         } else if (cluster_view_s.page_count < 4) {
908                 start_y = (WINDOW_H - (CLUSTER_ALL_PAGE_H * 2 + CLUSTER_ALL_PAGE_GAP_H)) / 2;
909         } else {
910                 start_y = (WINDOW_H - (CLUSTER_ALL_PAGE_H * 3 + CLUSTER_ALL_PAGE_GAP_H * 2)) / 2;
911         }
912         row = page_idx / 2;
913         col = page_idx % 2;
914
915         *w = CLUSTER_ALL_PAGE_PADDING_SIDE + (col * (CLUSTER_ALL_PAGE_W + CLUSTER_ALL_PAGE_GAP_W));
916         *h = start_y + (row * (CLUSTER_ALL_PAGE_H + CLUSTER_ALL_PAGE_GAP_H));
917 }
918
919 static int __cluster_view_allpage_get_page_index(int x, int y)
920 {
921         int idx = 0;
922         int sx = CLUSTER_ALL_PAGE_PADDING_SIDE;
923         int sy = 0;
924         if (cluster_view_s.page_count < 2) {
925                 sy = (WINDOW_H - CLUSTER_ALL_PAGE_H) / 2;
926         } else if (cluster_view_s.page_count < 4) {
927                 sy = (WINDOW_H - (CLUSTER_ALL_PAGE_H * 2 + CLUSTER_ALL_PAGE_GAP_H)) / 2;
928         } else {
929                 sy = (WINDOW_H - (CLUSTER_ALL_PAGE_H * 3 + CLUSTER_ALL_PAGE_GAP_H * 2)) / 2;
930         }
931         int w = CLUSTER_ALL_PAGE_W + CLUSTER_ALL_PAGE_GAP_W;
932         int h = CLUSTER_ALL_PAGE_H + CLUSTER_ALL_PAGE_GAP_H;
933
934         for (idx = 0; idx < cluster_view_s.page_count; idx++) {
935                 int row = idx / 2;
936                 int col = idx % 2;
937                 int ny = sy + (row * h) + (CLUSTER_ALL_PAGE_H / 2);
938                 int nx = sx + (col * w) + (CLUSTER_ALL_PAGE_W / 2);
939
940                 int d = (ny - y) * (ny - y) + (nx - x) * (nx - x);
941                 if (d < CLUSTER_VIEW_ALLPAGE_MOVE_GAP) {
942                         return (row * 2) + col;
943                 }
944         }
945
946         return INIT_VALUE;
947 }
948
949 static void __cluster_view_destroy_all_page(void)
950 {
951         Eina_List *find_list = NULL;
952         cluster_page_t *page_item = NULL;
953         EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) {
954                 if (page_item) {
955                         Evas_Object *image = elm_object_part_content_get(page_item->thumbnail_ly, CLUSTER_ALLPAGE_THUMBNAIL_IMAGE);
956                         evas_object_event_callback_del(image, EVAS_CALLBACK_MOUSE_DOWN, __clsuter_view_thumbnail_down_cb);
957                         evas_object_event_callback_del(image, EVAS_CALLBACK_MOUSE_MOVE, __clsuter_view_thumbnail_move_cb);
958                         evas_object_event_callback_del(image, EVAS_CALLBACK_MOUSE_UP, __clsuter_view_thumbnail_up_cb);
959
960                         evas_object_del(page_item->thumbnail_ly);
961                         page_item->thumbnail_ly = NULL;
962                 }
963         }
964         if (cluster_view_s.allpage_add_page)
965                 evas_object_del(cluster_view_s.allpage_add_page);
966         if (cluster_view_s.allpage)
967                 evas_object_del(cluster_view_s.allpage);
968
969         cluster_view_s.allpage_add_page = NULL;
970         cluster_view_s.allpage = NULL;
971 }
972
973 static cluster_page_t *__cluster_view_page_new(void)
974 {
975         if (cluster_view_s.page_count >= CLUSTER_MAX_PAGE) {
976                 LOGE("cluster page is max.");
977                 return NULL;
978         }
979
980         cluster_page_t *page_t = cluster_page_new(cluster_view_s.box);
981         cluster_view_s.page_list = eina_list_append(cluster_view_s.page_list, page_t);
982         elm_box_pack_end(cluster_view_s.box, page_t->page_layout);
983         cluster_view_s.page_count = eina_list_count(cluster_view_s.page_list);
984         page_t->page_index = cluster_view_s.page_count - 1;
985         cluster_data_set_page_count(cluster_view_s.page_count);
986
987         page_indicator_set_page_count(cluster_view_s.indicator, cluster_view_s.page_count);
988
989         return page_t;
990 }
991
992 static void __cluster_view_page_delete(cluster_page_t *page)
993 {
994         elm_grid_unpack(cluster_view_s.allpage_grid, page->thumbnail_ly);
995
996         cluster_view_s.page_list = eina_list_remove(cluster_view_s.page_list, page);
997         elm_box_unpack(cluster_view_s.box, page->page_layout);
998
999         Eina_List *find_list = NULL;
1000         widget_data_t *widget = NULL;
1001         EINA_LIST_FOREACH(page->widget_list, find_list, widget) {
1002                 cluster_data_delete(widget);
1003         }
1004         cluster_page_delete(page);
1005
1006         cluster_view_s.page_count--;
1007
1008         cluster_data_set_page_count(cluster_view_s.page_count);
1009         page_indicator_set_page_count(cluster_view_s.indicator, cluster_view_s.page_count);
1010 }
1011
1012 static void __cluster_view_allpage_delete_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
1013 {
1014         if (cluster_view_s.page_count <= 1)
1015                 return ;
1016
1017         cluster_page_t *page_item = (cluster_page_t *)data;
1018         if (eina_list_count(page_item->widget_list) > 0) {
1019                 Evas_Smart_Cb func[3] = { __cluster_view_allpage_delete_page_cb, NULL, NULL };
1020                 void *data[3] = { page_item, NULL, NULL };
1021                 char btn_text[3][STR_MAX] = { "", "", "" };
1022                 char title_text[STR_MAX] = { "" };
1023                 char popup_text[STR_MAX] = { "" };
1024                 snprintf(btn_text[0], sizeof(btn_text[0]), "%s", _("IDS_HS_OPT_DELETE"));
1025                 snprintf(btn_text[1], sizeof(btn_text[1]), "%s", _("IDS_CAM_SK_CANCEL"));
1026                 snprintf(title_text, sizeof(title_text), "%s", _("IDS_HS_HEADER_DELETE_PAGE_ABB2"));
1027                 snprintf(popup_text, sizeof(popup_text), "%s", _("IDS_HS_POP_THIS_PAGE_AND_ALL_THE_ITEMS_IT_CONTAINS_WILL_BE_DELETED"));
1028                 popup_show(2, func, data, btn_text, title_text, popup_text);
1029         } else {
1030                 __cluster_view_allpage_delete_page_cb(page_item, NULL, NULL);
1031         }
1032 }
1033
1034 static void __cluster_view_allpage_add_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
1035 {
1036         cluster_page_t *page_t = __cluster_view_page_new();
1037         if (!page_t) {
1038                 LOGE("cluster page is max.");
1039                 return ;
1040         }
1041
1042         elm_grid_unpack(cluster_view_s.allpage_grid, cluster_view_s.allpage_add_page);
1043
1044         page_t->thumbnail_ly = elm_layout_add(page_t->page_layout);
1045         elm_layout_file_set(page_t->thumbnail_ly, util_get_res_file_path(EDJE_DIR"/cluster_allpage_thumbnail.edj"), GROUP_CLUSTER_ALLPAGE_THUMBNAIL_LY);
1046
1047         evas_object_size_hint_align_set(page_t->thumbnail_ly, EVAS_HINT_FILL, EVAS_HINT_FILL);
1048         evas_object_size_hint_weight_set(page_t->thumbnail_ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1049         evas_object_show(page_t->thumbnail_ly);
1050
1051         Evas_Object *thumbnail = cluster_page_thumbnail(page_t);
1052         elm_object_part_content_set(page_t->thumbnail_ly, CLUSTER_ALLPAGE_THUMBNAIL_IMAGE, thumbnail);
1053         elm_object_signal_emit(page_t->thumbnail_ly, SIGNAL_ALLPAGE_DELETE_BUTTON_SHOW, SIGNAL_SOURCE);
1054         elm_object_signal_callback_add(page_t->thumbnail_ly,
1055                         SIGNAL_ALLPAGE_DELETE_BUTTON_CLICKED, SIGNAL_SOURCE,
1056                         __cluster_view_allpage_delete_clicked, page_t);
1057
1058         evas_object_event_callback_add(thumbnail, EVAS_CALLBACK_MOUSE_DOWN, __clsuter_view_thumbnail_down_cb, page_t);
1059         evas_object_event_callback_add(thumbnail, EVAS_CALLBACK_MOUSE_MOVE, __clsuter_view_thumbnail_move_cb, page_t);
1060         evas_object_event_callback_add(thumbnail, EVAS_CALLBACK_MOUSE_UP, __clsuter_view_thumbnail_up_cb, page_t);
1061
1062         __cluster_view_allpage_reposition();
1063
1064         if (cluster_view_s.page_count < CLUSTER_MAX_PAGE) {
1065                 int x = 0, y = 0;
1066                 __cluster_view_allpage_get_page_pos(cluster_view_s.page_count, &x, &y);
1067                 elm_grid_pack(cluster_view_s.allpage_grid, cluster_view_s.allpage_add_page, x, y, CLUSTER_ALL_PAGE_W, CLUSTER_ALL_PAGE_H);
1068         } else {
1069                 evas_object_del(cluster_view_s.allpage_add_page);
1070                 cluster_view_s.allpage_add_page = NULL;
1071         }
1072
1073         screen_reader_update(HOME);
1074 }
1075
1076 static void __cluster_view_allpage_delete_page_cb(void *data, Evas_Object *obj, void *event_info)
1077 {
1078         cluster_page_t *page = (cluster_page_t *)data;
1079
1080         Eina_List *find_list = NULL;
1081         cluster_page_t *page_item = NULL;
1082         EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) {
1083                 if (page_item->page_index > page->page_index) {
1084                         page_item->page_index -= 1;
1085
1086                 }
1087         }
1088
1089         Eina_List *widget_list = NULL;
1090         widget_data_t *widget_item = NULL;
1091         EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) {
1092                 EINA_LIST_FOREACH(page_item->widget_list, widget_list, widget_item) {
1093                         if (page_item == page)
1094                                 widget_item->page_idx = -1;
1095                         else
1096                                 widget_item->page_idx = page_item->page_index;
1097                         cluster_data_update(widget_item);
1098                 }
1099         }
1100
1101         __cluster_view_page_delete(page);
1102         __cluster_view_allpage_reposition();
1103
1104
1105         if (cluster_view_s.page_count < CLUSTER_MAX_PAGE) {
1106                 if (cluster_view_s.allpage_add_page == NULL) {
1107                         cluster_view_s.allpage_add_page = elm_layout_add(cluster_view_s.allpage);
1108                         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);
1109
1110                         evas_object_size_hint_align_set(cluster_view_s.allpage_add_page, EVAS_HINT_FILL, EVAS_HINT_FILL);
1111                         evas_object_size_hint_weight_set(cluster_view_s.allpage_add_page, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1112                         evas_object_show(cluster_view_s.allpage_add_page);
1113
1114                         elm_object_signal_emit(cluster_view_s.allpage_add_page, SIGNAL_ALLPAGE_ADD_BUTTON_SHOW, SIGNAL_SOURCE);
1115                         elm_object_signal_callback_add(cluster_view_s.allpage_add_page,
1116                                         SIGNAL_ALLPAGE_ADD_BUTTON_CLICKED, SIGNAL_SOURCE,
1117                                         __cluster_view_allpage_add_clicked, NULL);
1118                 }
1119                 int x = 0, y = 0;
1120                 __cluster_view_allpage_get_page_pos(cluster_view_s.page_count, &x, &y);
1121                 elm_grid_pack(cluster_view_s.allpage_grid, cluster_view_s.allpage_add_page, x, y, CLUSTER_ALL_PAGE_W, CLUSTER_ALL_PAGE_H);
1122         }
1123         popup_hide();
1124         screen_reader_update(HOME);
1125 }
1126
1127 static void  __clsuter_view_thumbnail_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1128 {
1129         Evas_Event_Mouse_Down* ev = event_info;
1130         LOGD("DOWN: (%d,%d)", ev->output.x, ev->output.y);
1131
1132         cluster_mouse_info.pressed = true;
1133         cluster_mouse_info.pressed_obj = obj;
1134
1135         cluster_mouse_info.down_x = cluster_mouse_info.move_x = ev->output.x;
1136         cluster_mouse_info.down_y = cluster_mouse_info.move_y = ev->output.y;
1137
1138         if (cluster_mouse_info.long_press_timer) {
1139                 ecore_timer_del(cluster_mouse_info.long_press_timer);
1140                 cluster_mouse_info.long_press_timer = NULL;
1141         }
1142
1143         cluster_mouse_info.long_press_timer = ecore_timer_add(LONG_PRESS_TIME,
1144                         __cluster_view_thumbnail_long_press_time_cb, data);
1145 }
1146
1147 static void  __clsuter_view_thumbnail_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1148 {
1149         cluster_page_t *page_t = (cluster_page_t *) data;
1150         Evas_Event_Mouse_Up* ev = event_info;
1151         LOGD("UP: (%d,%d)", ev->output.x, ev->output.y);
1152
1153         if (!cluster_mouse_info.pressed)
1154                 return ;
1155
1156         cluster_mouse_info.pressed = false;
1157         cluster_mouse_info.pressed_obj = NULL;
1158
1159         if (cluster_mouse_info.long_press_timer) {
1160                 ecore_timer_del(cluster_mouse_info.long_press_timer);
1161                 cluster_mouse_info.long_press_timer = NULL;
1162         }
1163
1164         cluster_mouse_info.up_x = ev->output.x;
1165         cluster_mouse_info.up_y = ev->output.y;
1166
1167         if (!cluster_mouse_info.long_pressed) {
1168                 int distance = (cluster_mouse_info.down_x - cluster_mouse_info.up_x) * (cluster_mouse_info.down_x - cluster_mouse_info.up_x);
1169                 distance += (cluster_mouse_info.down_y - cluster_mouse_info.up_y) * (cluster_mouse_info.down_y - cluster_mouse_info.up_y);
1170
1171                 if (distance <= MOUSE_MOVE_MIN_DISTANCE) {
1172                         cluster_view_s.current_page = page_t->page_index;
1173                         cluster_view_set_state(VIEW_STATE_NORMAL);
1174                 }
1175
1176                 return ;
1177         }
1178
1179         cluster_mouse_info.long_pressed = false;
1180
1181         if (cluster_view_s.picked_page) {
1182                 __cluster_view_allpage_drop_page(data);
1183         }
1184 }
1185
1186 static int __cluster_view_page_sort_cb(const void *a , const void *b)
1187 {
1188         cluster_page_t *item1 = (cluster_page_t *)a;
1189         cluster_page_t *item2 = (cluster_page_t *)b;
1190
1191         return item1->page_index - item2->page_index;
1192 }
1193
1194 static void  __clsuter_view_thumbnail_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1195 {
1196         Evas_Event_Mouse_Move* ev = event_info;
1197
1198         if (!cluster_mouse_info.pressed)
1199                 return ;
1200
1201         cluster_mouse_info.move_x = ev->cur.output.x;
1202         cluster_mouse_info.move_y = ev->cur.output.y;
1203
1204         if (!cluster_mouse_info.long_pressed) {
1205                 int distance = (cluster_mouse_info.move_x - cluster_mouse_info.down_x) * (cluster_mouse_info.move_x - cluster_mouse_info.down_x);
1206                 distance += (cluster_mouse_info.move_y - cluster_mouse_info.down_y) * (cluster_mouse_info.move_y - cluster_mouse_info.down_y);
1207
1208                 if (distance > MOUSE_MOVE_MIN_DISTANCE) {
1209                         if (cluster_mouse_info.long_press_timer) {
1210                                 ecore_timer_del(cluster_mouse_info.long_press_timer);
1211                                 cluster_mouse_info.long_press_timer = NULL;
1212                         }
1213
1214                         return ;
1215                 }
1216         }
1217
1218         if (cluster_view_s.picked_page) {
1219                 __cluster_view_allpage_drag_page(data);
1220         }
1221 }
1222
1223 static Eina_Bool __cluster_view_thumbnail_long_press_time_cb(void *data)
1224 {
1225         if (!cluster_mouse_info.pressed)
1226                 return ECORE_CALLBACK_CANCEL;
1227
1228         cluster_mouse_info.long_pressed = true;
1229
1230         if (cluster_mouse_info.long_press_timer) {
1231                 ecore_timer_del(cluster_mouse_info.long_press_timer);
1232                 cluster_mouse_info.long_press_timer = NULL;
1233         }
1234
1235         __cluster_view_allpage_pick_up_page(data);
1236
1237         return ECORE_CALLBACK_CANCEL;
1238 }
1239
1240 static void __cluster_view_allpage_clicked_page(void *data, Evas_Object *obj, const char *emission, const char *source)
1241 {
1242         cluster_page_t *page_t = (cluster_page_t *)data;
1243
1244         cluster_view_s.current_page = page_t->page_index;
1245         cluster_view_set_state(VIEW_STATE_NORMAL);
1246 }
1247
1248 static void __cluster_view_allpage_drag_page(void *data)
1249 {
1250         if (cluster_view_s.picked_page) {
1251                 int move_x = cluster_mouse_info.move_x - cluster_mouse_info.offset_x;
1252                 int move_y = cluster_mouse_info.move_y - cluster_mouse_info.offset_y;
1253                 int new_index = INIT_VALUE;
1254                 evas_object_move(cluster_view_s.picked_page->thumbnail_ly, move_x, move_y);
1255                 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);
1256
1257                 int move = 0;
1258                 int start, end;
1259                 if (new_index != cluster_view_s.picked_page->page_index && new_index != INIT_VALUE) {
1260                         if (cluster_view_s.picked_page->page_index < new_index) {
1261                                 move = -1;
1262                                 start = cluster_view_s.picked_page->page_index;
1263                                 end = new_index;
1264                         } else if (cluster_view_s.picked_page->page_index > new_index) {
1265                                 move = +1;
1266                                 end = cluster_view_s.picked_page->page_index;
1267                                 start = new_index;
1268                         }
1269
1270                         Eina_List *find_list = NULL;
1271                         cluster_page_t *page_item = NULL;
1272                         EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) {
1273                                 if (page_item == cluster_view_s.picked_page) {
1274                                         page_item->page_index = new_index;
1275                                 } else if (page_item->page_index >= start && page_item->page_index <= end) {
1276                                         page_item->page_index += move;
1277                                 }
1278                                 elm_grid_unpack(cluster_view_s.allpage_grid, page_item->thumbnail_ly);
1279                         }
1280
1281                         int x, y;
1282                         EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) {
1283                                 if (page_item != cluster_view_s.picked_page) {
1284                                         __cluster_view_allpage_get_page_pos(page_item->page_index, &x, &y);
1285                                         elm_grid_pack(cluster_view_s.allpage_grid, page_item->thumbnail_ly, x, y, CLUSTER_ALL_PAGE_W, CLUSTER_ALL_PAGE_H);
1286                                 }
1287                         }
1288                 }
1289         }
1290 }
1291
1292 static void __cluster_view_allpage_pick_up_page(void *data)
1293 {
1294         screen_reader_update(CLEAR);
1295
1296         cluster_view_s.picked_page = (cluster_page_t *)data;
1297         elm_grid_unpack(cluster_view_s.allpage_grid, cluster_view_s.picked_page->thumbnail_ly);
1298
1299         elm_object_signal_emit(cluster_view_s.picked_page->thumbnail_ly, SIGNAL_ALLPAGE_DELETE_BUTTON_HIDE, SIGNAL_SOURCE);
1300         elm_object_signal_emit(cluster_view_s.picked_page->thumbnail_ly, SIGNAL_ALLPAGE_DRAG_BG_SHOW, SIGNAL_SOURCE);
1301
1302         int cx = -1, cy = -1;
1303         int gx = -1, gy = -1, gw = 0, gh = 0;
1304         Evas *e = NULL;
1305
1306         Evas_Object *page = cluster_view_s.picked_page->thumbnail_ly;
1307         e = evas_object_evas_get(page);
1308         evas_pointer_canvas_xy_get(e, &cx, &cy);
1309         evas_object_geometry_get(page, &gx, &gy, &gw, &gh);
1310
1311         cluster_mouse_info.offset_x = cx - gx;
1312         cluster_mouse_info.offset_y = cy - gy;
1313 }
1314
1315 static void __cluster_view_allpage_drop_page(void *data)
1316 {
1317         if (cluster_view_s.picked_page) {
1318                 if (cluster_view_s.page_count > 1)
1319                         elm_object_signal_emit(cluster_view_s.picked_page->thumbnail_ly, SIGNAL_ALLPAGE_DELETE_BUTTON_SHOW, SIGNAL_SOURCE);
1320                 elm_object_signal_emit(cluster_view_s.picked_page->thumbnail_ly, SIGNAL_ALLPAGE_DRAG_BG_HIDE, SIGNAL_SOURCE);
1321
1322                 int x, y;
1323                 __cluster_view_allpage_get_page_pos(cluster_view_s.picked_page->page_index, &x, &y);
1324                 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);
1325                 cluster_view_s.picked_page = NULL;
1326         }
1327         cluster_view_s.page_list = eina_list_sort(cluster_view_s.page_list,
1328                         eina_list_count(cluster_view_s.page_list), __cluster_view_page_sort_cb);
1329
1330         Eina_List *find_list = NULL, *widget_list = NULL;
1331         cluster_page_t *page_item = NULL;
1332         widget_data_t *widget_item = NULL;
1333         EINA_LIST_FOREACH(cluster_view_s.page_list, find_list, page_item) {
1334                 EINA_LIST_FOREACH(page_item->widget_list, widget_list, widget_item) {
1335                         widget_item->page_idx = page_item->page_index;
1336                         cluster_data_update(widget_item);
1337                 }
1338         }
1339
1340         screen_reader_update(HOME);
1341 }
1342
1343 static void __clsuter_view_widget_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1344 {
1345         Evas_Event_Mouse_Down* ev = event_info;
1346         LOGD("DOWN: (%d,%d)", ev->output.x, ev->output.y);
1347
1348         if (cluster_view_s.edit_animator) {
1349                 LOGE("edit animator is running");
1350                 return ;
1351         }
1352
1353         cluster_mouse_info.pressed = true;
1354         cluster_mouse_info.pressed_obj = obj;
1355
1356         cluster_mouse_info.down_x = cluster_mouse_info.move_x = ev->output.x;
1357         cluster_mouse_info.down_y = cluster_mouse_info.move_y = ev->output.y;
1358
1359         if (cluster_mouse_info.long_press_timer) {
1360                 ecore_timer_del(cluster_mouse_info.long_press_timer);
1361                 cluster_mouse_info.long_press_timer = NULL;
1362         }
1363
1364         cluster_mouse_info.long_press_timer = ecore_timer_add(LONG_PRESS_TIME,
1365                         __cluster_view_widget_long_press_time_cb, data);
1366 }
1367
1368 static void __clsuter_view_widget_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1369 {
1370         Evas_Event_Mouse_Up* ev = event_info;
1371         LOGD("UP: (%d,%d)", ev->output.x, ev->output.y);
1372
1373         if (!cluster_mouse_info.pressed)
1374                 return ;
1375
1376         cluster_mouse_info.pressed = false;
1377         cluster_mouse_info.pressed_obj = NULL;
1378
1379         if (cluster_mouse_info.long_press_timer) {
1380                 ecore_timer_del(cluster_mouse_info.long_press_timer);
1381                 cluster_mouse_info.long_press_timer = NULL;
1382         }
1383
1384         cluster_mouse_info.up_x = ev->output.x;
1385         cluster_mouse_info.up_y = ev->output.y;
1386
1387         if (!cluster_mouse_info.long_pressed)
1388                 return ;
1389
1390         cluster_mouse_info.long_pressed = false;
1391
1392         elm_scroller_movement_block_set(cluster_view_s.scroller, ELM_SCROLLER_MOVEMENT_NO_BLOCK);
1393
1394         if (cluster_view_s.picked_widget) {
1395                 __cluster_view_edit_drop_widget(data);
1396         }
1397 }
1398
1399 static void __clsuter_view_widget_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1400 {
1401         Evas_Event_Mouse_Move* ev = event_info;
1402
1403         if (!cluster_mouse_info.pressed)
1404                 return ;
1405
1406         cluster_mouse_info.move_x = ev->cur.output.x;
1407         cluster_mouse_info.move_y = ev->cur.output.y;
1408
1409         if (!cluster_mouse_info.long_pressed) {
1410                 int distance = (cluster_mouse_info.move_x - cluster_mouse_info.down_x) * (cluster_mouse_info.move_x - cluster_mouse_info.down_x);
1411                 distance += (cluster_mouse_info.move_y - cluster_mouse_info.down_y) * (cluster_mouse_info.move_y - cluster_mouse_info.down_y);
1412
1413                 if (distance > MOUSE_MOVE_MIN_DISTANCE) {
1414                         if (cluster_mouse_info.long_press_timer) {
1415                                 ecore_timer_del(cluster_mouse_info.long_press_timer);
1416                                 cluster_mouse_info.long_press_timer = NULL;
1417                         }
1418
1419                         return ;
1420                 }
1421         }
1422
1423         if (cluster_view_s.picked_widget) {
1424                 __cluster_view_edit_drag_widget(data);
1425         }
1426 }
1427
1428 static Eina_Bool __cluster_view_widget_long_press_time_cb(void *data)
1429 {
1430         widget_data_t *widget = (widget_data_t *)data;
1431         if (!cluster_mouse_info.pressed)
1432                 return ECORE_CALLBACK_CANCEL;
1433
1434         cluster_mouse_info.long_pressed = true;
1435
1436         elm_scroller_movement_block_set(cluster_view_s.scroller, ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL);
1437
1438         widget_viewer_send_cancel_click_event(widget);
1439
1440         __cluster_view_edit_pick_up_widget(data);
1441
1442         return ECORE_CALLBACK_CANCEL;
1443 }
1444
1445 static void __cluster_view_edit_pick_up_widget(void *data)
1446 {
1447         int cx = -1, cy = -1;
1448         int gx = -1, gy = -1, gw = 0, gh = 0;
1449         Evas *e = NULL;
1450
1451         screen_reader_update(CLEAR);
1452
1453         cluster_view_s.picked_widget = (widget_data_t *)data;
1454
1455         Evas_Object *widget_layout = cluster_view_s.picked_widget->widget_layout;
1456
1457         e = evas_object_evas_get(widget_layout);
1458
1459         evas_pointer_canvas_xy_get(e, &cx, &cy);
1460         evas_object_geometry_get(widget_layout, &gx, &gy, &gw, &gh);
1461         LOGD("cx, cy (%d, %d )", cx, cy);
1462         LOGD("gx, gy, gw, gh (%d, %d, %d, %d)", gx, gy, gw, gh);
1463
1464         cluster_mouse_info.offset_x = cx - gx;
1465         cluster_mouse_info.offset_y = cy - gy;
1466
1467         cluster_page_t *page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, cluster_view_s.picked_widget->page_idx);
1468
1469         if (cluster_view_s.view_state == VIEW_STATE_NORMAL) {
1470                 cluster_view_set_state(VIEW_STATE_EDIT);
1471         } else {
1472                 cluster_page_unset(page, cluster_view_s.picked_widget);
1473         }
1474
1475         elm_object_signal_emit(widget_layout, SIGNAL_DELETE_BUTTON_HIDE_ANI, SIGNAL_SOURCE);
1476         elm_object_signal_emit(widget_layout, SIGNAL_CLUSTER_PICKUP_STATE, SIGNAL_SOURCE);
1477
1478         evas_object_move(widget_layout, cluster_mouse_info.move_x - cluster_mouse_info.offset_x,
1479                         cluster_mouse_info.move_y - cluster_mouse_info.offset_y);
1480 }
1481
1482 static void __cluster_view_edit_drag_widget(void *data)
1483 {
1484         cluster_view_s.picked_widget = (widget_data_t *)data;
1485
1486         if (!cluster_view_s.picked_widget)
1487                 return ;
1488
1489         Evas_Object *widget_layout = cluster_view_s.picked_widget->widget_layout;
1490         evas_object_move(widget_layout, cluster_mouse_info.move_x - cluster_mouse_info.offset_x,
1491                         cluster_mouse_info.move_y - cluster_mouse_info.offset_y);
1492
1493         if ((cluster_mouse_info.move_x > CLUSTER_EDIT_RIGHT_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);
1496
1497         } else if ((cluster_mouse_info.move_x < CLUSTER_EDIT_LEFT_SCROLL_REGION) && (cluster_view_s.page_count > 1)) {
1498                 if (!cluster_view_s.edit_mode_scroll_timer)
1499                         cluster_view_s.edit_mode_scroll_timer = ecore_timer_add(HOME_EDIT_SCROLL_MOVE_TIME, __cluster_view_scroll_timer_cb, NULL);
1500         } else {
1501                 int page_x, page_y, page_w, page_h;
1502                 int widget_x, widget_y;
1503
1504                 cluster_page_t *page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, cluster_view_s.current_page);
1505                 evas_object_geometry_get(page->grid, &page_x, &page_y, &page_w, &page_h);
1506                 evas_object_geometry_get(widget_layout, &widget_x, &widget_y, NULL, NULL);
1507
1508                 widget_x -= page_x;
1509                 widget_y -= page_y;
1510                 if (cluster_view_s.edit_mode_scroll_timer) {
1511                         ecore_timer_del(cluster_view_s.edit_mode_scroll_timer);
1512                         cluster_view_s.edit_mode_scroll_timer = NULL;
1513                 }
1514
1515                 if (!cluster_view_s.is_srolling) {
1516                         int block_w = (page_w / CLUSTER_COL);
1517                         int block_h = (page_h / CLUSTER_ROW);
1518                         double pos_x = (double)widget_x / block_w + 0.5;
1519                         double pos_y = (double)widget_y / block_h + 0.5;
1520
1521                         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                 }
1523         }
1524 }
1525
1526 static void __cluster_view_edit_drop_widget(void *data)
1527 {
1528         if (cluster_view_s.edit_mode_scroll_timer) {
1529                 ecore_timer_del(cluster_view_s.edit_mode_scroll_timer);
1530                 cluster_view_s.edit_mode_scroll_timer = NULL;
1531         }
1532
1533         if (cluster_view_s.edit_animator) {
1534                 ecore_animator_del(cluster_view_s.edit_animator);
1535                 cluster_view_s.edit_animator = NULL;
1536         }
1537
1538         int to_x, to_y;
1539         cluster_view_s.animation_from_x = cluster_mouse_info.move_x - cluster_mouse_info.offset_x;
1540         cluster_view_s.animation_from_y = cluster_mouse_info.move_y - cluster_mouse_info.offset_y;
1541
1542         cluster_page_t *page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, cluster_view_s.picked_widget->page_idx);
1543         cluster_page_unset(page,  cluster_view_s.picked_widget);
1544
1545         page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, cluster_view_s.current_page);
1546         cluster_page_get_highlight_xy(page, &to_x, &to_y);
1547         if (to_x == INIT_VALUE || to_y == INIT_VALUE) {
1548                 int gx, gy, w, h;
1549                 evas_object_geometry_get(page->grid, &gx, &gy, &w, &h);
1550                 to_x = gx + cluster_view_s.picked_widget->pos_x * (w / CLUSTER_COL);
1551                 to_y = gy + cluster_view_s.picked_widget->pos_y * (h / CLUSTER_ROW);
1552         }
1553
1554         cluster_view_s.animation_to_x = to_x;
1555         cluster_view_s.animation_to_y = to_y;
1556
1557         cluster_view_s.edit_animator = ecore_animator_timeline_add(HOME_ANIMATION_TIME, __cluster_view_edit_move_anim, NULL);
1558
1559         evas_object_event_callback_del(cluster_view_s.picked_widget->widget_content, EVAS_CALLBACK_MOUSE_DOWN, __clsuter_view_widget_down_cb);
1560         evas_object_event_callback_del(cluster_view_s.picked_widget->widget_content, EVAS_CALLBACK_MOUSE_MOVE, __clsuter_view_widget_move_cb);
1561         evas_object_event_callback_del(cluster_view_s.picked_widget->widget_content, EVAS_CALLBACK_MOUSE_UP, __clsuter_view_widget_up_cb);
1562 }
1563
1564 static Eina_Bool __cluster_view_edit_move_anim(void *data, double pos)
1565 {
1566         evas_object_move(cluster_view_s.picked_widget->widget_layout,
1567                         (cluster_view_s.animation_to_x - cluster_view_s.animation_from_x) * pos + cluster_view_s.animation_from_x,
1568                         (cluster_view_s.animation_to_y - cluster_view_s.animation_from_y) * pos + cluster_view_s.animation_from_y);
1569
1570         if (pos >= 1.0 - (1e-10)) {
1571                 __cluster_view_edit_move_anim_done(data);
1572
1573                 cluster_view_s.edit_animator = NULL;
1574                 return ECORE_CALLBACK_DONE;
1575         }
1576
1577         return ECORE_CALLBACK_RENEW;
1578 }
1579
1580 static void __cluster_view_edit_move_anim_done(void *data)
1581 {
1582         Evas_Object *widget_layout = cluster_view_s.picked_widget->widget_layout;
1583         elm_object_signal_emit(widget_layout, SIGNAL_DELETE_BUTTON_SHOW_ANI, SIGNAL_SOURCE);
1584         elm_object_signal_emit(widget_layout, SIGNAL_CLUSTER_EDIT_STATE, SIGNAL_SOURCE);
1585
1586         cluster_page_t *page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, cluster_view_s.current_page);
1587
1588         if (!cluster_page_drop_widget(page, cluster_view_s.picked_widget)) {
1589                 if (cluster_view_s.picked_widget->page_idx != cluster_view_s.current_page) {
1590                         cluster_view_s.current_page = cluster_view_s.picked_widget->page_idx;
1591                         __cluster_view_scroll_to_page(cluster_view_s.current_page, true);
1592                 }
1593
1594                 page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, cluster_view_s.current_page);
1595                 if (!cluster_page_set_widget(page, cluster_view_s.picked_widget)) {
1596                         cluster_view_add_widget(cluster_view_s.picked_widget, true);
1597                 }
1598         }
1599
1600         cluster_view_s.picked_widget = NULL;
1601         screen_reader_update(HOME);
1602 }
1603
1604 static void __clsuter_view_scroller_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1605 {
1606         Evas_Event_Mouse_Down* ev = event_info;
1607
1608         if (cluster_view_s.view_state != VIEW_STATE_NORMAL)
1609                 return ;
1610
1611         if (cluster_view_s.edit_animator) {
1612                 LOGE("edit animator is running");
1613                 return ;
1614         }
1615
1616         LOGD("DOWN: (%d,%d)", ev->output.x, ev->output.y);
1617
1618         cluster_mouse_info.pressed = true;
1619         cluster_mouse_info.pressed_obj = obj;
1620
1621         cluster_mouse_info.down_x = cluster_mouse_info.move_x = ev->output.x;
1622         cluster_mouse_info.down_y = cluster_mouse_info.move_y = ev->output.y;
1623
1624         if (cluster_mouse_info.long_press_timer) {
1625                 ecore_timer_del(cluster_mouse_info.long_press_timer);
1626                 cluster_mouse_info.long_press_timer = NULL;
1627         }
1628
1629         cluster_mouse_info.long_press_timer = ecore_timer_add(LONG_PRESS_TIME,
1630                         __cluster_view_scroller_long_press_time_cb, obj);
1631 }
1632
1633 static void __clsuter_view_scroller_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1634 {
1635         Evas_Event_Mouse_Up* ev = event_info;
1636
1637         if (!cluster_mouse_info.pressed || cluster_mouse_info.pressed_obj != obj)
1638                 return ;
1639
1640         LOGD("UP: (%d,%d)", ev->output.x, ev->output.y);
1641
1642         cluster_mouse_info.pressed = false;
1643
1644         if (cluster_mouse_info.long_press_timer) {
1645                 ecore_timer_del(cluster_mouse_info.long_press_timer);
1646                 cluster_mouse_info.long_press_timer = NULL;
1647         }
1648
1649         cluster_mouse_info.up_x = ev->output.x;
1650         cluster_mouse_info.up_y = ev->output.y;
1651
1652         cluster_mouse_info.long_pressed = false;
1653 }
1654
1655 static void __clsuter_view_scroller_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1656 {
1657         Evas_Event_Mouse_Move* ev = event_info;
1658
1659         if (!cluster_mouse_info.pressed || cluster_mouse_info.pressed_obj != obj)
1660                 return ;
1661
1662         cluster_mouse_info.move_x = ev->cur.output.x;
1663         cluster_mouse_info.move_y = ev->cur.output.y;
1664
1665         if (!cluster_mouse_info.long_pressed) {
1666                 int distance = (cluster_mouse_info.move_x - cluster_mouse_info.down_x) * (cluster_mouse_info.move_x - cluster_mouse_info.down_x);
1667                 distance += (cluster_mouse_info.move_y - cluster_mouse_info.down_y) * (cluster_mouse_info.move_y - cluster_mouse_info.down_y);
1668
1669                 if (distance > MOUSE_MOVE_MIN_DISTANCE) {
1670                         if (cluster_mouse_info.long_press_timer) {
1671                                 ecore_timer_del(cluster_mouse_info.long_press_timer);
1672                                 cluster_mouse_info.long_press_timer = NULL;
1673                         }
1674
1675                         return ;
1676                 }
1677         }
1678 }
1679
1680 static Eina_Bool __cluster_view_scroller_long_press_time_cb(void *data)
1681 {
1682         if (!cluster_mouse_info.pressed || cluster_mouse_info.pressed_obj != data)
1683                 return ECORE_CALLBACK_CANCEL;
1684
1685         cluster_mouse_info.long_pressed = true;
1686
1687         cluster_view_set_state(VIEW_STATE_EDIT);
1688
1689         return ECORE_CALLBACK_CANCEL;
1690 }
1691
1692 static void __cluster_view_scroll_drag_start_cb(void *data, Evas_Object *obj, void *event_info)
1693 {
1694         __cluster_view_scroll_start();
1695 }
1696
1697 static void __cluster_view_scroll_drag_stop_cb(void *data, Evas_Object *obj, void *event_info)
1698 {
1699         if (cluster_view_s.scroll_stop_timer) {
1700                 ecore_timer_del(cluster_view_s.scroll_stop_timer);
1701                 cluster_view_s.scroll_stop_timer = NULL;
1702         }
1703
1704         cluster_view_s.scroll_stop_timer = ecore_timer_add(SCROLL_STOP_TIME, __cluster_view_scroll_stop, NULL);
1705 }
1706
1707 static void __cluster_view_scroll_anim_start_cb(void *data, Evas_Object *obj, void *event_info)
1708 {
1709         if (cluster_view_s.scroll_stop_timer) {
1710                 ecore_timer_del(cluster_view_s.scroll_stop_timer);
1711                 cluster_view_s.scroll_stop_timer = NULL;
1712         }
1713 }
1714
1715 static void __cluster_view_scroll_anim_stop_cb(void *data, Evas_Object *obj, void *event_info)
1716 {
1717         __cluster_view_scroll_stop(NULL);
1718 }
1719
1720 static void __cluster_view_scroll_start(void)
1721 {
1722         screen_reader_update(CLEAR);
1723
1724         cluster_view_s.is_srolling = true;
1725
1726         cluster_page_t *current_page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, cluster_view_s.current_page);
1727         Eina_List *find_list = NULL;
1728         widget_data_t *item;
1729         LOGD("Current Page : %d", cluster_view_s.current_page);
1730         EINA_LIST_FOREACH(current_page->widget_list, find_list, item) {
1731                 widget_viewer_send_cancel_click_event(item);
1732         }
1733 }
1734
1735 static Eina_Bool __cluster_view_scroll_stop(void *data)
1736 {
1737         if (!cluster_view_s.is_srolling) {
1738                 LOGE("scroll is already stopped");
1739                 return ECORE_CALLBACK_CANCEL;
1740         }
1741
1742         cluster_view_s.is_srolling = false;
1743
1744         elm_scroller_current_page_get(cluster_view_s.scroller, &cluster_view_s.current_page, NULL);
1745         cluster_view_s.current_page = cluster_view_s.current_page % cluster_view_s.page_count;
1746         LOGD("current page %d", cluster_view_s.current_page);
1747
1748         char buf[STR_MAX] = { 0 , };
1749         snprintf(buf, sizeof(buf), _("IDS_HS_TBOPT_PAGE_P1SD_OF_P2SD"), cluster_view_s.current_page + 1, cluster_view_s.page_count);
1750         screen_reader_read(buf);
1751         screen_reader_update(HOME);
1752
1753         return ECORE_CALLBACK_CANCEL;
1754 }
1755
1756 static Eina_Bool __cluster_view_scroll_timer_cb(void *data)
1757 {
1758         cluster_page_t *current_page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, cluster_view_s.current_page);
1759
1760         int next_page_idx = 0;
1761         if (MIRRORING_X(cluster_mouse_info.move_x, CLUSTER_VIEW_W) > CLUSTER_EDIT_RIGHT_SCROLL_REGION) {
1762                 next_page_idx = current_page->page_index + 1;
1763         } else if (MIRRORING_X(cluster_mouse_info.move_x, CLUSTER_VIEW_W) < CLUSTER_EDIT_LEFT_SCROLL_REGION) {
1764                 next_page_idx = current_page->page_index - 1;
1765         } else {
1766                 cluster_view_s.edit_mode_scroll_timer = NULL;
1767                 return ECORE_CALLBACK_CANCEL;
1768         }
1769
1770         if (next_page_idx < 0 || next_page_idx >= cluster_view_s.page_count) {
1771                 return ECORE_CALLBACK_RENEW;
1772         }
1773
1774         cluster_page_drag_cancel(current_page);
1775         __cluster_view_scroll_to_page(next_page_idx, true);
1776         return ECORE_CALLBACK_RENEW;
1777 }
1778
1779 #include "test.h"
1780 #if TEST_MODE
1781 void __t__cluster_view_scroll_to_page(int page_idx, bool animation)
1782 {
1783         __cluster_view_scroll_to_page(page_idx, animation);
1784 }
1785 int __t__cluster_view_get_current_page(void)
1786 {
1787         return cluster_view_s.current_page;
1788 }
1789 Evas_Object * __t__cluster_view_get_scroller(void)
1790 {
1791         return cluster_view_s.scroller;
1792 }
1793 cluster_page_t *__t__cluster_view_page_new(void)
1794 {
1795         __cluster_view_page_new();
1796 }
1797
1798 #endif