0f589721fdc762d0bf81b0e3e27ff8f03febd8e4
[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 "page_indicator.h"
25 #include "widget_viewer.h"
26 #include "menu.h"
27 #include "popup.h"
28 #include "cluster_page.h"
29 #include "cluster_data.h"
30 #include "add_widget_viewer/add_widget_viewer.h"
31 #include "mouse.h"
32 #include "screen_reader_handler.h"
33
34 #define SCROLL_STOP_TIME 0.05
35
36 static struct {
37         Evas_Object *win;
38         Evas_Object *scroller;
39         Evas_Object *box;
40         Evas_Object *allpage;
41         Evas_Object *allpage_add_page;
42         Evas_Object *allpage_grid;
43         page_indicator_t *indicator;
44         int page_count;
45         int current_page;
46         view_state_t view_state;
47         Eina_List *page_list;
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;
52         bool is_srolling;
53         Ecore_Animator *edit_animator;
54         int animation_from_x;
55         int animation_from_y;
56         int animation_to_x;
57         int animation_to_y;
58 } cluster_view_s = {
59         .scroller = NULL,
60         .box = NULL,
61         .allpage = NULL,
62         .allpage_add_page = NULL,
63         .allpage_grid = NULL,
64         .indicator = NULL,
65         .page_count = 0,
66         .current_page = INIT_VALUE,
67         .view_state = VIEW_STATE_NORMAL,
68         .page_list = NULL,
69         .picked_page = NULL,
70         .picked_widget = NULL,
71         .edit_mode_scroll_timer = NULL,
72         .scroll_stop_timer = NULL,
73         .is_srolling = false,
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,
79 };
80
81 static int cluster_menu_list[4] = {
82         MENU_CLUSTER_EDIT,
83         MENU_CLUSTER_ADD_WIDGET,
84         MENU_CLUSTER_CHANGE_WALLPAPER,
85         MENU_CLUSTER_ALL_PAGES
86 };
87
88 static mouse_info_t cluster_mouse_info = {
89         .pressed = false,
90         .long_pressed = false,
91         .down_x = 0,
92         .down_y = 0,
93         .move_x = 0,
94         .move_y = 0,
95         .up_x = 0,
96         .up_y = 0,
97         .long_press_timer = NULL,
98         .offset_x = 0,
99         .offset_y = 0,
100         .pressed_obj = NULL,
101 };
102
103 //#define SCROLL_TIMING_ISSUE
104 #ifdef SCROLL_TIMING_ISSUE
105 #define SCROLL_TIMING_INTERVAL 0.001
106
107 static Ecore_Timer *__scroll_timing_timer = NULL;
108 #endif
109
110 static Eina_Hash *cluster_menu_table = NULL;
111
112 Evas_Object *__cluster_view_create_base_gui(Evas_Object *win);
113
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);
118
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);
136
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);
145
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);
150
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);
156
157 static Eina_Bool __cluster_view_scroll_timer_cb(void *data);
158
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);
169
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);
173
174 Evas_Object *cluster_view_create(Evas_Object *win)
175 {
176         cluster_view_s.win = win;
177
178         Evas_Object *base_layout = __cluster_view_create_base_gui(win);
179
180         if (base_layout == NULL) {
181                 LOGE("[FAILED][base_layout == NULL]");
182                 return NULL;
183         }
184
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);
187
188         return base_layout;
189 }
190
191 void cluster_view_init(void)
192 {
193         widget_viewer_init(cluster_view_s.win);
194         cluster_data_init();
195
196         __cluster_view_create_cluster();
197         __cluster_view_create_menu();
198 }
199
200 void cluster_view_app_terminate(void)
201 {
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);
206
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);
210
211         eina_hash_free(cluster_menu_table);
212         widget_viewer_fini();
213 }
214
215 void cluster_view_show(void)
216 {
217         page_indicator_show(cluster_view_s.indicator);
218 }
219
220 void cluster_view_hide(void)
221 {
222         page_indicator_hide(cluster_view_s.indicator);
223 }
224
225 void cluster_view_show_anim(double pos)
226 {
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);
230         }
231 }
232
233 void cluster_view_hide_anim(double pos)
234 {
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);
238         }
239 }
240
241 Evas_Object *__cluster_view_create_base_gui(Evas_Object *win)
242 {
243         cluster_view_s.scroller = elm_scroller_add(win);
244         if (cluster_view_s.scroller == NULL) {
245                 return NULL;
246         }
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);
253
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);
256
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);
260
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);
265
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);
271
272         elm_object_content_set(cluster_view_s.scroller, cluster_view_s.box);
273
274         return cluster_view_s.scroller;
275 }
276
277 static void __cluster_view_create_cluster(void)
278 {
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;
282
283         while (page_count--) {
284                 __cluster_view_page_new();
285         }
286
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);
292                 if (page == NULL) {
293                         LOGE("page is NULL");
294                 } else {
295                         if (!cluster_page_set_widget(page, item)) {
296                                 LOGE("failed cluster_page_set_widget page %d", item->page_idx);
297                         }
298                 }
299         }
300
301         page_indicator_set_current_page(cluster_view_s.indicator, cluster_view_s.current_page);
302 }
303
304 static void __cluster_view_create_menu(void)
305 {
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);
311 }
312
313 static void __cluster_view_menu_edit_cb(void *data, Evas_Object *obj, void *event_info)
314 {
315         menu_hide();
316
317         cluster_view_set_state(VIEW_STATE_EDIT);
318 }
319
320 static void __cluster_view_menu_add_widget_cb(void *data, Evas_Object *obj, void *event_info)
321 {
322         menu_hide();
323
324         cluster_view_set_state(VIEW_STATE_ADD_VIEWER);
325 }
326
327 static void __cluster_view_menu_change_wallpaper_cb(void *data, Evas_Object *obj, void *event_info)
328 {
329         const char *appid = "org.tizen.wallpaper-ui-service";
330         app_control_h app_control_handle = NULL;
331
332         if (app_control_create(&app_control_handle) != APP_CONTROL_ERROR_NONE) {
333                 LOGE("[FAILED][app_control_create]");
334                 return;
335         }
336
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");
340
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);
344                 return;
345         }
346
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);
350                 return;
351         }
352
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);
356                 return;
357         }
358
359         app_control_destroy(app_control_handle);
360
361         menu_hide();
362 }
363
364 static void __cluster_view_menu_all_pages_cb(void *data, Evas_Object *obj, void *event_info)
365 {
366         menu_hide();
367
368         cluster_view_set_state(VIEW_STATE_ALL_PAGE);
369 }
370
371 void cluster_view_hw_menu_key(void)
372 {
373         if (cluster_view_s.view_state == VIEW_STATE_NORMAL)
374                 menu_change_state_on_hw_menu_key(cluster_menu_table);
375 }
376
377 bool cluster_view_hw_home_key(void)
378 {
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);
387         }
388
389         return false;
390 }
391
392 bool cluster_view_hw_back_key(void)
393 {
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);
400         }
401
402         return true;
403 }
404
405 void cluster_view_lang_changed(homescreen_view_t view_type)
406 {
407         if (view_type == HOMESCREEN_VIEW_HOME) {
408                 cluster_view_set_state(VIEW_STATE_NORMAL);
409         }
410 }
411
412 view_state_t cluster_view_get_state(void)
413 {
414         return cluster_view_s.view_state;
415 }
416
417 bool cluster_view_set_state(view_state_t state)
418 {
419         if (cluster_view_s.is_srolling) {
420                 LOGE("cannot change view-state");
421                 return false;
422         }
423
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);
428         }
429
430         if (state == VIEW_STATE_EDIT) {
431                 homescreen_efl_btn_hide(HOMESCREEN_VIEW_HOME);
432
433                 Eina_List *data_list = cluster_data_get_widget_list();
434                 Eina_List *find_list = NULL;
435
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);
441                                 } else {
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);
445                                 }
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);
449                         }
450                 }
451
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);
456                         }
457                 }
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);
461
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);
465
466                                 cluster_view_s.picked_widget = NULL;
467
468                                 page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, cluster_view_s.current_page);
469                                 cluster_page_drag_cancel(page);
470                         }
471
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);
478                                 }
479                         }
480
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);
487                                 }
488                         }
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();
497
498                         Eina_List *find_list = NULL;
499
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);
505                                 }
506                         }
507
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);
513                                 }
514                         }
515
516                         if (cluster_view_s.current_page >= cluster_view_s.page_count) {
517                                 cluster_view_s.current_page = CLUSTER_HOME_PAGE;
518                         }
519                         __cluster_view_scroll_to_page(cluster_view_s.current_page, false);
520                 }
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);
527
528                 __cluster_view_create_all_page();
529
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);
536                         }
537                 }
538         }
539
540         cluster_view_s.view_state = state;
541         screen_reader_update(HOME);
542
543         return true;
544 }
545
546 bool cluster_view_add_widget(widget_data_t *item, bool scroll)
547 {
548         bool set_on = false;
549
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;
553                 set_on = true;
554         }
555
556         if (!set_on) {
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;
562                                 set_on = true;
563                                 page = page_item;
564                                 break;
565                         }
566                 }
567         }
568
569         if (!set_on) {
570                 if (cluster_view_s.page_count >= CLUSTER_MAX_PAGE) {
571                         LOGE("cluster page is max.");
572
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);
582                         return false;
583                 }
584
585                 cluster_page_t *page_t = __cluster_view_page_new();
586                 if (!page_t) {
587                         LOGE("Cannot add widget");
588                         return false;
589                 }
590
591                 if (!cluster_page_find_empty_space(page_t, item->type, &item->pos_x, &item->pos_y)) {
592                         return false;
593                 }
594
595                 item->page_idx = page_t->page_index;
596                 page = page_t;
597         }
598
599         if (!item->widget_layout) {
600                 __cluster_view_add_widget_content(item);
601         }
602
603         if (!cluster_page_set_widget(page, item)) {
604                 LOGE("cluster_page_set_widget is failed!!!");
605                 return false;
606         }
607
608         if (scroll) {
609                 cluster_view_s.current_page = item->page_idx;
610                 __cluster_view_scroll_to_page(cluster_view_s.current_page, true);
611         }
612
613         return true;
614 }
615
616 void cluster_view_delete_widget(widget_data_t *item)
617 {
618         if (item == NULL)
619                 return ;
620
621         cluster_page_t *page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, item->page_idx);
622         if (page)
623                 cluster_page_unset(page, item);
624         else
625                 LOGE("Page is NULL");
626
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);
631
632                 evas_object_del(item->widget_layout);
633                 item->widget_layout = NULL;
634         }
635
636         screen_reader_update(HOME);
637 }
638
639 void cluster_view_edit_on_done(cluster_page_t *page)
640 {
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;
646                 }
647         }
648 }
649
650 void cluster_view_get_access_object_list(Eina_List **list)
651 {
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);
655
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);
664
665                 __cluster_view_get_access_add_page(list);
666         }
667 }
668
669 static void __cluster_view_get_access_page_thumbnail(Eina_List **list)
670 {
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;
687
688                         *list = eina_list_append(*list, info);
689                 }
690         }
691 }
692
693 static void __cluster_view_get_access_page_delete_button(Eina_List **list)
694 {
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;
710
711                                 *list = eina_list_append(*list, info);
712                         }
713                 }
714         }
715 }
716
717 static void __cluster_view_get_access_add_page(Eina_List **list)
718 {
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;
730
731                 *list = eina_list_append(*list, info);
732         }
733 }
734
735 static void __cluster_view_scroll_to_home(void)
736 {
737         __cluster_view_scroll_to_page(CLUSTER_HOME_PAGE, true);
738 }
739
740 #ifdef SCROLL_TIMING_ISSUE
741 static Eina_Bool __cluster_view_scroll_show_page(void *data)
742 {
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);
748
749         return ECORE_CALLBACK_CANCEL;
750 }
751 #endif
752
753 static void __cluster_view_scroll_to_page(int page_idx, bool animation)
754 {
755         __cluster_view_scroll_start();
756
757         if (animation) {
758                 LOGD("bring in %d page", page_idx);
759                 elm_scroller_page_bring_in(cluster_view_s.scroller, page_idx, 0);
760         } else {
761 #ifdef SCROLL_TIMING_ISSUE
762                 static int __page_idx = 0;
763                 __page_idx = page_idx;
764
765                 if (__scroll_timing_timer) {
766                         ecore_timer_del(__scroll_timing_timer);
767                         __scroll_timing_timer = NULL;
768                 }
769                 __scroll_timing_timer = ecore_timer_add(SCROLL_TIMING_INTERVAL, __cluster_view_scroll_show_page, &__page_idx);
770 #else
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);
775 #endif
776         }
777 }
778
779 static void __cluster_view_app_launch_request_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *data)
780 {
781         switch (result) {
782         case APP_CONTROL_RESULT_CANCELED:
783                 LOGE("[APP_CONTROL_RESULT_CANCELED]");
784                 break;
785         case APP_CONTROL_RESULT_FAILED:
786                 LOGE("[APP_CONTROL_RESULT_FAILED]");
787                 break;
788         case APP_CONTROL_RESULT_SUCCEEDED:
789                 LOGD("[APP_CONTROL_RESULT_SUCCEEDED]");
790                 break;
791         default:
792                 LOGE("UNKNOWN ERROR");
793                 break;
794         }
795 }
796
797 static void __cluster_view_add_widget_content(widget_data_t *item)
798 {
799         int w, h;
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);
806 }
807
808 static void __cluster_view_create_all_page(void)
809 {
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);
812
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);
818
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);
826
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;
834
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);
843
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);
847
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);
853
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);
857                 }
858         }
859
860         __cluster_view_allpage_reposition();
861
862         if (cluster_view_s.page_count < CLUSTER_MAX_PAGE) {
863                 int x = 0, y = 0;
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);
866
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);
870
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);
875
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);
878         }
879 }
880
881 static void __cluster_view_allpage_reposition(void)
882 {
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) {
886                 int x = 0, y = 0;
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);
891                 else {
892                         elm_object_signal_emit(page_item->thumbnail_ly, SIGNAL_ALLPAGE_DELETE_BUTTON_HIDE, SIGNAL_SOURCE);
893                 }
894         }
895 }
896
897 static void __cluster_view_allpage_get_page_pos(int page_idx, int *w, int *h)
898 {
899         int row, col;
900         int start_y = 0;
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;
905         } else {
906                 start_y = (WINDOW_H - (CLUSTER_ALL_PAGE_H * 3 + CLUSTER_ALL_PAGE_GAP_H * 2)) / 2;
907         }
908         row = page_idx / 2;
909         col = page_idx % 2;
910
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));
913 }
914
915 static int __cluster_view_allpage_get_page_index(int x, int y)
916 {
917         int idx = 0;
918         int sx = CLUSTER_ALL_PAGE_PADDING_SIDE;
919         int sy = 0;
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;
924         } else {
925                 sy = (WINDOW_H - (CLUSTER_ALL_PAGE_H * 3 + CLUSTER_ALL_PAGE_GAP_H * 2)) / 2;
926         }
927         int w = CLUSTER_ALL_PAGE_W + CLUSTER_ALL_PAGE_GAP_W;
928         int h = CLUSTER_ALL_PAGE_H + CLUSTER_ALL_PAGE_GAP_H;
929
930         for (idx = 0; idx < cluster_view_s.page_count; idx++) {
931                 int row = idx / 2;
932                 int col = idx % 2;
933                 int ny = sy + (row * h) + (CLUSTER_ALL_PAGE_H / 2);
934                 int nx = sx + (col * w) + (CLUSTER_ALL_PAGE_W / 2);
935
936                 int d = (ny - y) * (ny - y) + (nx - x) * (nx - x);
937                 if (d < CLUSTER_VIEW_ALLPAGE_MOVE_GAP) {
938                         return (row * 2) + col;
939                 }
940         }
941
942         return INIT_VALUE;
943 }
944
945 static void __cluster_view_destroy_all_page(void)
946 {
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) {
950                 if (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);
955
956                         evas_object_del(page_item->thumbnail_ly);
957                         page_item->thumbnail_ly = NULL;
958                 }
959         }
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);
964
965         cluster_view_s.allpage_add_page = NULL;
966         cluster_view_s.allpage = NULL;
967 }
968
969 static cluster_page_t *__cluster_view_page_new(void)
970 {
971         if (cluster_view_s.page_count >= CLUSTER_MAX_PAGE) {
972                 LOGE("cluster page is max.");
973                 return NULL;
974         }
975
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);
982
983         page_indicator_set_page_count(cluster_view_s.indicator, cluster_view_s.page_count);
984
985         return page_t;
986 }
987
988 static void __cluster_view_page_delete(cluster_page_t *page)
989 {
990         elm_grid_unpack(cluster_view_s.allpage_grid, page->thumbnail_ly);
991
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);
994
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);
999         }
1000         cluster_page_delete(page);
1001
1002         cluster_view_s.page_count--;
1003
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);
1006 }
1007
1008 static void __cluster_view_allpage_delete_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
1009 {
1010         if (cluster_view_s.page_count <= 1)
1011                 return ;
1012
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);
1025         } else {
1026                 __cluster_view_allpage_delete_page_cb(page_item, NULL, NULL);
1027         }
1028 }
1029
1030 static void __cluster_view_allpage_add_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
1031 {
1032         cluster_page_t *page_t = __cluster_view_page_new();
1033         if (!page_t) {
1034                 LOGE("cluster page is max.");
1035                 return ;
1036         }
1037
1038         elm_grid_unpack(cluster_view_s.allpage_grid, cluster_view_s.allpage_add_page);
1039
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);
1042
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);
1046
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);
1053
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);
1057
1058         __cluster_view_allpage_reposition();
1059
1060         if (cluster_view_s.page_count < CLUSTER_MAX_PAGE) {
1061                 int x = 0, y = 0;
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);
1064         } else {
1065                 evas_object_del(cluster_view_s.allpage_add_page);
1066                 cluster_view_s.allpage_add_page = NULL;
1067         }
1068
1069         screen_reader_update(HOME);
1070 }
1071
1072 static void __cluster_view_allpage_delete_page_cb(void *data, Evas_Object *obj, void *event_info)
1073 {
1074         cluster_page_t *page = (cluster_page_t *)data;
1075
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;
1081
1082                 }
1083         }
1084
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;
1091                         else
1092                                 widget_item->page_idx = page_item->page_index;
1093                         cluster_data_update(widget_item);
1094                 }
1095         }
1096
1097         __cluster_view_page_delete(page);
1098         __cluster_view_allpage_reposition();
1099
1100
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);
1105
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);
1109
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);
1114                 }
1115                 int x = 0, y = 0;
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);
1118         }
1119         popup_hide();
1120         screen_reader_update(HOME);
1121 }
1122
1123 static void  __clsuter_view_thumbnail_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1124 {
1125         Evas_Event_Mouse_Down* ev = event_info;
1126         LOGD("DOWN: (%d,%d)", ev->output.x, ev->output.y);
1127
1128         cluster_mouse_info.pressed = true;
1129         cluster_mouse_info.pressed_obj = obj;
1130
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;
1133
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;
1137         }
1138
1139         cluster_mouse_info.long_press_timer = ecore_timer_add(LONG_PRESS_TIME,
1140                         __cluster_view_thumbnail_long_press_time_cb, data);
1141 }
1142
1143 static void  __clsuter_view_thumbnail_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1144 {
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);
1148
1149         if (!cluster_mouse_info.pressed)
1150                 return ;
1151
1152         cluster_mouse_info.pressed = false;
1153         cluster_mouse_info.pressed_obj = NULL;
1154
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;
1158         }
1159
1160         cluster_mouse_info.up_x = ev->output.x;
1161         cluster_mouse_info.up_y = ev->output.y;
1162
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);
1166
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);
1170                 }
1171
1172                 return ;
1173         }
1174
1175         cluster_mouse_info.long_pressed = false;
1176
1177         if (cluster_view_s.picked_page) {
1178                 __cluster_view_allpage_drop_page(data);
1179         }
1180 }
1181
1182 static int __cluster_view_page_sort_cb(const void *a , const void *b)
1183 {
1184         cluster_page_t *item1 = (cluster_page_t *)a;
1185         cluster_page_t *item2 = (cluster_page_t *)b;
1186
1187         return item1->page_index - item2->page_index;
1188 }
1189
1190 static void  __clsuter_view_thumbnail_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1191 {
1192         Evas_Event_Mouse_Move* ev = event_info;
1193
1194         if (!cluster_mouse_info.pressed)
1195                 return ;
1196
1197         cluster_mouse_info.move_x = ev->cur.output.x;
1198         cluster_mouse_info.move_y = ev->cur.output.y;
1199
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);
1203
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;
1208                         }
1209
1210                         return ;
1211                 }
1212         }
1213
1214         if (cluster_view_s.picked_page) {
1215                 __cluster_view_allpage_drag_page(data);
1216         }
1217 }
1218
1219 static Eina_Bool __cluster_view_thumbnail_long_press_time_cb(void *data)
1220 {
1221         if (!cluster_mouse_info.pressed)
1222                 return ECORE_CALLBACK_CANCEL;
1223
1224         cluster_mouse_info.long_pressed = true;
1225
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;
1229         }
1230
1231         __cluster_view_allpage_pick_up_page(data);
1232
1233         return ECORE_CALLBACK_CANCEL;
1234 }
1235
1236 static void __cluster_view_allpage_clicked_page(void *data, Evas_Object *obj, const char *emission, const char *source)
1237 {
1238         cluster_page_t *page_t = (cluster_page_t *)data;
1239
1240         cluster_view_s.current_page = page_t->page_index;
1241         cluster_view_set_state(VIEW_STATE_NORMAL);
1242 }
1243
1244 static void __cluster_view_allpage_drag_page(void *data)
1245 {
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);
1252
1253                 int move = 0;
1254                 int start, end;
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) {
1257                                 move = -1;
1258                                 start = cluster_view_s.picked_page->page_index;
1259                                 end = new_index;
1260                         } else if (cluster_view_s.picked_page->page_index > new_index) {
1261                                 move = +1;
1262                                 end = cluster_view_s.picked_page->page_index;
1263                                 start = new_index;
1264                         }
1265
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;
1273                                 }
1274                                 elm_grid_unpack(cluster_view_s.allpage_grid, page_item->thumbnail_ly);
1275                         }
1276
1277                         int x, y;
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);
1282                                 }
1283                         }
1284                 }
1285         }
1286 }
1287
1288 static void __cluster_view_allpage_pick_up_page(void *data)
1289 {
1290         screen_reader_update(CLEAR);
1291
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);
1294
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);
1297
1298         int cx = -1, cy = -1;
1299         int gx = -1, gy = -1, gw = 0, gh = 0;
1300         Evas *e = NULL;
1301
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);
1306
1307         cluster_mouse_info.offset_x = cx - gx;
1308         cluster_mouse_info.offset_y = cy - gy;
1309 }
1310
1311 static void __cluster_view_allpage_drop_page(void *data)
1312 {
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);
1317
1318                 int x, y;
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;
1322         }
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);
1325
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);
1333                 }
1334         }
1335
1336         screen_reader_update(HOME);
1337 }
1338
1339 static void __clsuter_view_widget_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1340 {
1341         Evas_Event_Mouse_Down* ev = event_info;
1342         LOGD("DOWN: (%d,%d)", ev->output.x, ev->output.y);
1343
1344         if (cluster_view_s.edit_animator) {
1345                 LOGE("edit animator is running");
1346                 return ;
1347         }
1348
1349         cluster_mouse_info.pressed = true;
1350         cluster_mouse_info.pressed_obj = obj;
1351
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;
1354
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;
1358         }
1359
1360         cluster_mouse_info.long_press_timer = ecore_timer_add(LONG_PRESS_TIME,
1361                         __cluster_view_widget_long_press_time_cb, data);
1362 }
1363
1364 static void __clsuter_view_widget_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1365 {
1366         Evas_Event_Mouse_Up* ev = event_info;
1367         LOGD("UP: (%d,%d)", ev->output.x, ev->output.y);
1368
1369         if (!cluster_mouse_info.pressed)
1370                 return ;
1371
1372         cluster_mouse_info.pressed = false;
1373         cluster_mouse_info.pressed_obj = NULL;
1374
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;
1378         }
1379
1380         cluster_mouse_info.up_x = ev->output.x;
1381         cluster_mouse_info.up_y = ev->output.y;
1382
1383         if (!cluster_mouse_info.long_pressed)
1384                 return ;
1385
1386         cluster_mouse_info.long_pressed = false;
1387
1388         elm_scroller_movement_block_set(cluster_view_s.scroller, ELM_SCROLLER_MOVEMENT_NO_BLOCK);
1389
1390         if (cluster_view_s.picked_widget) {
1391                 __cluster_view_edit_drop_widget(data);
1392         }
1393 }
1394
1395 static void __clsuter_view_widget_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1396 {
1397         Evas_Event_Mouse_Move* ev = event_info;
1398
1399         if (!cluster_mouse_info.pressed)
1400                 return ;
1401
1402         cluster_mouse_info.move_x = ev->cur.output.x;
1403         cluster_mouse_info.move_y = ev->cur.output.y;
1404
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);
1408
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;
1413                         }
1414
1415                         return ;
1416                 }
1417         }
1418
1419         if (cluster_view_s.picked_widget) {
1420                 __cluster_view_edit_drag_widget(data);
1421         }
1422 }
1423
1424 static Eina_Bool __cluster_view_widget_long_press_time_cb(void *data)
1425 {
1426         widget_data_t *widget = (widget_data_t *)data;
1427         if (!cluster_mouse_info.pressed)
1428                 return ECORE_CALLBACK_CANCEL;
1429
1430         cluster_mouse_info.long_pressed = true;
1431
1432         elm_scroller_movement_block_set(cluster_view_s.scroller, ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL);
1433
1434         widget_viewer_send_cancel_click_event(widget);
1435
1436         __cluster_view_edit_pick_up_widget(data);
1437
1438         return ECORE_CALLBACK_CANCEL;
1439 }
1440
1441 static void __cluster_view_edit_pick_up_widget(void *data)
1442 {
1443         int cx = -1, cy = -1;
1444         int gx = -1, gy = -1, gw = 0, gh = 0;
1445         Evas *e = NULL;
1446
1447         screen_reader_update(CLEAR);
1448
1449         cluster_view_s.picked_widget = (widget_data_t *)data;
1450
1451         Evas_Object *widget_layout = cluster_view_s.picked_widget->widget_layout;
1452
1453         e = evas_object_evas_get(widget_layout);
1454
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);
1459
1460         cluster_mouse_info.offset_x = cx - gx;
1461         cluster_mouse_info.offset_y = cy - gy;
1462
1463         cluster_page_t *page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, cluster_view_s.picked_widget->page_idx);
1464
1465         if (cluster_view_s.view_state == VIEW_STATE_NORMAL) {
1466                 cluster_view_set_state(VIEW_STATE_EDIT);
1467         } else {
1468                 cluster_page_unset(page, cluster_view_s.picked_widget);
1469         }
1470
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);
1473
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);
1476 }
1477
1478 static void __cluster_view_edit_drag_widget(void *data)
1479 {
1480         cluster_view_s.picked_widget = (widget_data_t *)data;
1481
1482         if (!cluster_view_s.picked_widget)
1483                 return ;
1484
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);
1488
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);
1492
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);
1496         } else {
1497                 int page_x, page_y, page_w, page_h;
1498                 int widget_x, widget_y;
1499
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);
1503
1504                 widget_x -= page_x;
1505                 widget_y -= page_y;
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;
1509                 }
1510
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;
1516
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);
1518                 }
1519         }
1520 }
1521
1522 static void __cluster_view_edit_drop_widget(void *data)
1523 {
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;
1527         }
1528
1529         if (cluster_view_s.edit_animator) {
1530                 ecore_animator_del(cluster_view_s.edit_animator);
1531                 cluster_view_s.edit_animator = NULL;
1532         }
1533
1534         int to_x, to_y;
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;
1537
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);
1540
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) {
1544                 int gx, gy, w, h;
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);
1548         }
1549
1550         cluster_view_s.animation_to_x = to_x;
1551         cluster_view_s.animation_to_y = to_y;
1552
1553         cluster_view_s.edit_animator = ecore_animator_timeline_add(HOME_ANIMATION_TIME, __cluster_view_edit_move_anim, NULL);
1554
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);
1558 }
1559
1560 static Eina_Bool __cluster_view_edit_move_anim(void *data, double pos)
1561 {
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);
1565
1566         if (pos >= 1.0 - (1e-10)) {
1567                 __cluster_view_edit_move_anim_done(data);
1568
1569                 cluster_view_s.edit_animator = NULL;
1570                 return ECORE_CALLBACK_DONE;
1571         }
1572
1573         return ECORE_CALLBACK_RENEW;
1574 }
1575
1576 static void __cluster_view_edit_move_anim_done(void *data)
1577 {
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);
1581
1582         cluster_page_t *page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, cluster_view_s.current_page);
1583
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);
1588                 }
1589
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);
1593                 }
1594         }
1595
1596         cluster_view_s.picked_widget = NULL;
1597         screen_reader_update(HOME);
1598 }
1599
1600 static void __clsuter_view_scroller_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1601 {
1602         Evas_Event_Mouse_Down* ev = event_info;
1603
1604         if (cluster_view_s.view_state != VIEW_STATE_NORMAL)
1605                 return ;
1606
1607         if (cluster_view_s.edit_animator) {
1608                 LOGE("edit animator is running");
1609                 return ;
1610         }
1611
1612         LOGD("DOWN: (%d,%d)", ev->output.x, ev->output.y);
1613
1614         cluster_mouse_info.pressed = true;
1615         cluster_mouse_info.pressed_obj = obj;
1616
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;
1619
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;
1623         }
1624
1625         cluster_mouse_info.long_press_timer = ecore_timer_add(LONG_PRESS_TIME,
1626                         __cluster_view_scroller_long_press_time_cb, obj);
1627 }
1628
1629 static void __clsuter_view_scroller_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1630 {
1631         Evas_Event_Mouse_Up* ev = event_info;
1632
1633         if (!cluster_mouse_info.pressed || cluster_mouse_info.pressed_obj != obj)
1634                 return ;
1635
1636         LOGD("UP: (%d,%d)", ev->output.x, ev->output.y);
1637
1638         cluster_mouse_info.pressed = false;
1639
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;
1643         }
1644
1645         cluster_mouse_info.up_x = ev->output.x;
1646         cluster_mouse_info.up_y = ev->output.y;
1647
1648         cluster_mouse_info.long_pressed = false;
1649 }
1650
1651 static void __clsuter_view_scroller_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
1652 {
1653         Evas_Event_Mouse_Move* ev = event_info;
1654
1655         if (!cluster_mouse_info.pressed || cluster_mouse_info.pressed_obj != obj)
1656                 return ;
1657
1658         cluster_mouse_info.move_x = ev->cur.output.x;
1659         cluster_mouse_info.move_y = ev->cur.output.y;
1660
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);
1664
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;
1669                         }
1670
1671                         return ;
1672                 }
1673         }
1674 }
1675
1676 static Eina_Bool __cluster_view_scroller_long_press_time_cb(void *data)
1677 {
1678         if (!cluster_mouse_info.pressed || cluster_mouse_info.pressed_obj != data)
1679                 return ECORE_CALLBACK_CANCEL;
1680
1681         cluster_mouse_info.long_pressed = true;
1682
1683         cluster_view_set_state(VIEW_STATE_EDIT);
1684
1685         return ECORE_CALLBACK_CANCEL;
1686 }
1687
1688 static void __cluster_view_scroll_drag_start_cb(void *data, Evas_Object *obj, void *event_info)
1689 {
1690         __cluster_view_scroll_start();
1691 }
1692
1693 static void __cluster_view_scroll_drag_stop_cb(void *data, Evas_Object *obj, void *event_info)
1694 {
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;
1698         }
1699
1700         cluster_view_s.scroll_stop_timer = ecore_timer_add(SCROLL_STOP_TIME, __cluster_view_scroll_stop, NULL);
1701 }
1702
1703 static void __cluster_view_scroll_anim_start_cb(void *data, Evas_Object *obj, void *event_info)
1704 {
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;
1708         }
1709 }
1710
1711 static void __cluster_view_scroll_anim_stop_cb(void *data, Evas_Object *obj, void *event_info)
1712 {
1713         __cluster_view_scroll_stop(NULL);
1714 }
1715
1716 static void __cluster_view_scroll_start(void)
1717 {
1718         screen_reader_update(CLEAR);
1719
1720         cluster_view_s.is_srolling = true;
1721
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);
1728         }
1729 }
1730
1731 static Eina_Bool __cluster_view_scroll_stop(void *data)
1732 {
1733         if (!cluster_view_s.is_srolling) {
1734                 LOGE("scroll is already stopped");
1735                 return ECORE_CALLBACK_CANCEL;
1736         }
1737
1738         cluster_view_s.is_srolling = false;
1739
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);
1743
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);
1748
1749         return ECORE_CALLBACK_CANCEL;
1750 }
1751
1752 static Eina_Bool __cluster_view_scroll_timer_cb(void *data)
1753 {
1754         cluster_page_t *current_page = (cluster_page_t *)eina_list_nth(cluster_view_s.page_list, cluster_view_s.current_page);
1755
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;
1761         } else {
1762                 cluster_view_s.edit_mode_scroll_timer = NULL;
1763                 return ECORE_CALLBACK_CANCEL;
1764         }
1765
1766         if (next_page_idx < 0 || next_page_idx >= cluster_view_s.page_count) {
1767                 return ECORE_CALLBACK_RENEW;
1768         }
1769
1770         cluster_page_drag_cancel(current_page);
1771         __cluster_view_scroll_to_page(next_page_idx, true);
1772         return ECORE_CALLBACK_RENEW;
1773 }