The source code moved from the SPIN with license changed to Flora 1.1
[apps/native/home/homescreen-efl.git] / src / livebox_all_pages.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 <stdio.h>
18 #include <stdbool.h>
19
20 #include <Elementary.h>
21 #include <Eina.h>
22 #include <system_settings.h>
23
24 #include "conf.h"
25
26 #include "livebox_all_pages.h"
27 #include "homescreen-efl.h"
28 #include "page_scroller.h"
29 #include "livebox/livebox_panel.h"
30 #include "livebox/livebox_utils.h"
31 #include "util.h"
32 #include "dynamic_index.h"
33 #include "mouse.h"
34 #include "popup.h"
35 #include "layout.h"
36 #include "data_model.h"
37
38 static Evas_Object *__livebox_all_pages_create_grid(Evas_Object *parent_layout);
39 static Evas_Object *__livebox_all_pages_create_thumb(Evas_Object *page, bool is_fake, bool show_remove_button);
40 static Evas_Object *__livebox_all_pages_create_bg(Evas_Object *parent);
41 static Evas_Object *__livebox_all_pages_create_add_icon_layout(void);
42 static Evas_Object *__livebox_all_pages_insert_thumb(void *data, Evas_Object *obj, const char *part);
43 static Evas_Object *__livebox_all_pages_get_thumb_page(Elm_Object_Item *it);
44
45 static Eina_Bool __livebox_all_pages_item_up_cb(void *data);
46 static Eina_Bool __livebox_all_pages_get_grid_state(void *data, Evas_Object *obj, const char *part);
47 static Eina_Bool __livebox_all_pages_new_item_created_cb(void *data);
48
49 static void __livebox_all_pages_del_grid(void *data, Evas_Object *obj);
50 static void __livebox_all_pages_grid_item_longpressed_cb(void *data, Evas_Object *obj, void *ei);
51 static void __livebox_all_pages_grid_item_moved_cb(void *data, Evas_Object *obj, void *ei);
52 static void __livebox_all_pages_grid_changed_cb(void *data, Evas_Object *obj, void *ei);
53 static void __livebox_all_pages_hide_remove_button(Elm_Object_Item *it);
54 static void __livebox_all_pages_realized_cb(void *data, Evas_Object *obj, void *ei);
55 static void __livebox_all_pages_remove_button_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
56 static void __livebox_all_pages_remove_button_clicked_liveboxes_cb(void *data);
57 static void __livebox_all_pages_add_page_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
58 static void __livebox_all_pages_page_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
59 static void __libebox_all_pages_grid_item_pressed_cb(void *data, Evas_Object *obj, void *ei);
60
61 static char *__livebox_all_pages_get_grid_text(void *data, Evas_Object *obj, const char *part);
62 static bool __livebox_all_pages_fill_grid(Evas_Object *grid);
63 static bool __livebox_all_pages_check_add_page(Elm_Object_Item *it);
64 static bool __livebox_all_pages_is_page_empty(Evas_Object *page);
65 static Eina_List *__livebox_all_pages_unpack_grid(void);
66 static Elm_Gengrid_Item_Class *__livebox_all_pages_create_grid_item_class(void);
67
68
69 static struct {
70         Evas_Object *item;
71         Elm_Object_Item *g_item;
72
73         int cur_x;
74         int cur_y;
75
76         bool is_created;
77 } s_info_reposition = {
78         .item = NULL,
79         .g_item = NULL,
80
81         .cur_x = -1,
82         .cur_y = -1,
83
84         .is_created = false,
85 };
86
87 static struct {
88         Evas_Object *grid;
89         Evas_Object *layout;
90         Elm_Gengrid_Item_Class *gic;
91         Elm_Object_Item *add_page_item;
92         bool is_add_page_visible;
93         int current_page;
94         int pressed_item;
95         bool is_item_longpressed;
96 } s_info = {
97         .grid = NULL,
98         .layout = NULL,
99         .gic = NULL,
100         .add_page_item = NULL,
101         .is_add_page_visible = true,
102         .current_page = -1,
103         .pressed_item = -1,
104         .is_item_longpressed = false,
105 };
106
107 /*======================================== PUBLIC FUNCTIONS IMPLEMENTATION ======================================*/
108 HAPI Evas_Object *livebox_all_pages_show(void)
109 {
110         Evas_Object *all_pages_layout = NULL;
111         Evas_Object *win = home_screen_get_win();
112         Evas_Object *bg = NULL;
113         Evas_Object *grid = NULL;
114
115
116         int g_count;
117         int w = home_screen_get_root_width();
118         int h = home_screen_get_root_height();
119
120         if (!win) {
121                 LOGE("[INVALID_STATE][win='%p']", win);
122                 return NULL;
123         }
124
125         all_pages_layout = util_create_edje_layout(win, EDJE_DIR"/page_edit.edj", GROUP_ALL_PAGES);
126         if (!all_pages_layout) {
127                 LOGE("[FAILED][util_edje_layout_create]");
128                 return NULL;
129         }
130
131         evas_object_size_hint_min_set(all_pages_layout, w, h);
132         evas_object_size_hint_max_set(all_pages_layout, w, h);
133         evas_object_resize(all_pages_layout, w, h);
134         evas_object_layer_set(all_pages_layout, EVAS_LAYER_MAX-1);
135         evas_object_move(all_pages_layout, ALL_PAGES_X, ALL_PAGES_Y);
136
137         bg = __livebox_all_pages_create_bg(all_pages_layout);
138         if (!bg) {
139                 LOGE("[FAILED][__livebox_all_pages_create_bg]");
140                 evas_object_del(all_pages_layout);
141                 return NULL;
142         }
143
144         grid = __livebox_all_pages_create_grid(all_pages_layout);
145         if (!grid) {
146                 LOGE("[FAILED][__livebox_all_pages_create_grid]");
147                 evas_object_del(all_pages_layout);
148                 return NULL;
149         }
150
151         __livebox_all_pages_fill_grid(grid);
152
153         s_info.grid = grid;
154         s_info.layout = all_pages_layout;
155         g_count = elm_gengrid_items_count(grid);
156
157         if (g_count == MAX_ITEMS)
158                 s_info.is_add_page_visible = false;
159
160         evas_object_smart_callback_add(grid, "realized", __livebox_all_pages_realized_cb, NULL);
161
162         return all_pages_layout;
163 }
164
165 HAPI void livebox_all_pages_hide(void)
166 {
167         Evas_Object *all_pages_layout = s_info.layout;
168         Evas_Object *lvb_scroller = NULL;
169
170         Eina_List *page_list = NULL;
171         int page_count = 0;
172
173         if (!all_pages_layout) {
174                 LOGE("[FAILED][all_pages_layout]");
175                 return;
176         }
177
178         lvb_scroller = livebox_panel_get();
179         if (!lvb_scroller) {
180                 LOGE("[FAILED][livebox_panel_get]");
181                 return;
182         }
183
184         page_list = __livebox_all_pages_unpack_grid();
185         if (!page_list) {
186                 LOGE("[FAILED][__livebox_all_pages_unpack_grid]");
187                 return;
188         }
189
190         page_scroller_pack_pages(lvb_scroller, page_list);
191         eina_list_free(page_list);
192         evas_object_del(all_pages_layout);
193         elm_gengrid_item_class_free(s_info.gic);
194
195         page_count = page_scroller_get_page_count(lvb_scroller);
196
197         if (s_info.current_page >= page_count)
198                 s_info.current_page = page_count - 1;
199
200         if (s_info.pressed_item >= 0)
201                 s_info.current_page = s_info.pressed_item - 1;
202
203         LOGI("CURRENT : [%d] PRESSED_PAGE: [%d]", s_info.current_page, s_info.pressed_item);
204
205         page_scroller_show_page(lvb_scroller, s_info.current_page);
206
207         dynamic_index_reload(evas_object_data_get(lvb_scroller, KEY_INDEX), s_info.current_page,
208                 page_count);
209
210
211         s_info.layout = NULL;
212         s_info.grid = NULL;
213         s_info.gic = NULL;
214 }
215
216 HAPI void livebox_all_pages_move_item(int x, int y)
217 {
218         int xp, yp;
219         int m_idx = -1; /*moved item index*/
220         int d_idx = -1; /*destination index*/
221
222         Elm_Object_Item *it = NULL;
223         Elm_Object_Item *n_it = NULL;
224
225         Evas_Object *empty_ly = NULL;
226
227         if (!s_info_reposition.item)
228                 return;
229
230         xp = x - OFFSET;
231         yp = y - OFFSET;
232         evas_object_move(s_info_reposition.item, xp, yp);
233
234         it = elm_gengrid_at_xy_item_get(s_info.grid, x, y, NULL, NULL);
235         if (!it || (it == s_info_reposition.g_item) || !s_info_reposition.g_item || s_info_reposition.is_created)
236                 return;
237
238         /*check if item is add page*/
239         if (__livebox_all_pages_check_add_page(it))
240                 return;
241
242         m_idx = elm_gengrid_item_index_get(s_info_reposition.g_item);
243         d_idx = elm_gengrid_item_index_get(it);
244
245         empty_ly = __livebox_all_pages_create_thumb(NULL, false, true);
246         if (!empty_ly) {
247                 LOGE("[FAILED][__livebox_all_pages_create_thumb]");
248                 return;
249         }
250
251         if (d_idx > m_idx) {
252                 /*insert after*/
253                 s_info_reposition.is_created = true;
254                 n_it = elm_gengrid_item_insert_after(s_info.grid, s_info.gic, empty_ly, it, NULL, NULL);
255         } else {
256                 /*insert before*/
257                 s_info_reposition.is_created = true;
258                 n_it = elm_gengrid_item_insert_before(s_info.grid, s_info.gic, empty_ly, it, NULL, NULL);
259         }
260
261         evas_object_smart_callback_add(s_info.grid, "index,update", __livebox_all_pages_grid_changed_cb, n_it);
262         elm_object_item_del(s_info_reposition.g_item);
263         s_info_reposition.g_item = n_it;
264 }
265
266 HAPI void livebox_all_pages_up_item(void)
267 {
268         if (!s_info_reposition.item)
269                 return;
270
271         ecore_timer_add(0.05, __livebox_all_pages_item_up_cb, NULL);
272 }
273
274 /*====================================== PRIVATE FUNCTIONS IMPLEMENTATION =======================================*/
275 static void __livebox_all_pages_remove_button_clicked_liveboxes_cb(void *data)
276 {
277         Elm_Object_Item *clicked_item = (Elm_Object_Item *) data;
278         Evas_Object *add_page = NULL;
279         Eina_List *g_items = NULL;
280         Elm_Object_Item *g_item = NULL;
281         Eina_List *last_node = NULL;
282         Evas_Object *clicked_page =  NULL;
283         int g_count = 0;
284
285         if (!clicked_item) {
286                 LOGE("[FAILED][__livebox_all_pages_remove_button_clicked_liveboxes_cb]");
287                 return;
288         }
289
290         clicked_page = __livebox_all_pages_get_thumb_page(clicked_item);
291         if (!clicked_page) {
292                 LOGE("[FAILED][__livebox_all_pages_get_thumb_page]");
293                 return;
294         }
295
296         g_items = elm_gengrid_realized_items_get(s_info.grid);
297         last_node = eina_list_last(g_items);
298         if (last_node)
299                 g_item = eina_list_data_get(last_node);
300         eina_list_free(g_items);
301
302         /*is this the correct order ? :*/
303         livebox_panel_destroy_page(clicked_page);
304         elm_object_item_del(clicked_item);
305         g_count = elm_gengrid_items_count(s_info.grid);
306
307
308         if (g_count < MAX_ITEMS && !(__livebox_all_pages_check_add_page(g_item))) {
309                 add_page = __livebox_all_pages_create_add_icon_layout();
310                 if (!add_page) {
311                         LOGE("[FAILED][__livebox_all_pages_create_add_icon_layout]");
312                         return;
313                 }
314
315                 s_info.add_page_item = elm_gengrid_item_append(s_info.grid, s_info.gic, add_page, NULL, NULL);
316                 if (!s_info.add_page_item) {
317                         LOGE("[FAILED][elm_gengrid_item_append]");
318                         evas_object_del(add_page);
319                         return;
320                 }
321
322                 s_info.is_add_page_visible = true;
323         }
324
325         if (g_count == 2)
326                 __livebox_all_pages_hide_remove_button(elm_gengrid_first_item_get(s_info.grid));
327
328         s_info.pressed_item = -1;
329         popup_destroy();
330 }
331
332 static bool __livebox_all_pages_is_page_empty(Evas_Object *page)
333 {
334         Eina_List *lb_list = NULL;
335
336         if (!page) {
337                 LOGE("[INVALID_PARAM][page='%p']", page);
338                 return true;
339         }
340
341         lb_list = livebox_utils_get_liveboxes_on_page_list(page);
342         if (!lb_list) {
343                 LOGE("[FAILED][livebox_utils_liveboxes_on_page_list_get]");
344                 return true;
345         }
346
347         if (eina_list_count(lb_list) > 0) {
348                 LOGE("[FAILED][eina_list_count]");
349                 eina_list_free(lb_list);
350                 return false;
351         }
352
353         eina_list_free(lb_list);
354         return true;
355 }
356
357 static void __livebox_all_pages_add_page_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
358 {
359         Tree_node_t *page_node = NULL;
360
361         Elm_Object_Item *first_item = NULL;
362
363         Evas_Object *layout = s_info.layout;
364         Evas_Object *grid = s_info.grid;
365         Evas_Object *new_page = NULL;
366         Evas_Object *thumb = NULL;
367         Evas_Object *first_item_layout = NULL;
368
369
370         int g_count = 0; /*gengrid items count*/
371
372         Elm_Gengrid_Item_Class *gic = s_info.gic;
373         Elm_Object_Item *add_item = s_info.add_page_item;
374
375         int w = home_screen_get_root_width();
376         int h = home_screen_get_root_height();
377
378         w = THUMB_W_REL * w;
379         h = THUMB_H_REL * h;
380
381         if (!gic || !layout || !grid || !add_item) {
382                 LOGE("[INVALID_PARAM][gic='%p'][layout='%p'][grid='%p'][add_item='%p']", gic, layout, grid, add_item);
383                 return;
384         }
385
386         g_count = elm_gengrid_items_count(grid);
387
388         page_node = data_model_add_widget_page();
389         if (!page_node) {
390                 LOGE("page_node == NULL");
391                 return;
392         }
393
394         new_page =  livebox_panel_create_empty_page(page_node, livebox_panel_get());
395         if (!new_page) {
396                 LOGE("[FAILED][livebox_panel_empty_page_create]");
397                 data_model_del_item(page_node);
398                 return;
399         }
400
401         home_screen_print_tree();
402
403         thumb = __livebox_all_pages_create_thumb(new_page, true, true);
404         if (!thumb) {
405                 LOGE("[FAILED][__livebox_all_pages_create_thumb]");
406                 evas_object_del(new_page);
407                 return;
408         }
409
410
411         if (g_count < MAX_ITEMS) {
412                 elm_gengrid_item_insert_before(grid, gic, thumb, add_item, NULL, NULL);
413                 s_info.is_add_page_visible = true;
414         } else if (g_count == MAX_ITEMS) {
415                 elm_object_item_del(s_info.add_page_item);
416                 s_info.add_page_item = NULL;
417
418                 elm_gengrid_item_append(grid, gic, thumb, NULL, NULL);
419                 s_info.is_add_page_visible = false;
420         }
421
422         /*Show remove button on first page*/
423         first_item = elm_gengrid_first_item_get(s_info.grid);
424         if (!first_item) {
425                 return;
426         }
427
428         first_item_layout = elm_object_item_part_content_get(first_item, GENGRID_ITEM_CONTENT);
429         if (!first_item_layout)
430                 return;
431         /*WHAT HAPPENS to previously allocated thumb (g_count > MAX_ITEMS)??*/
432         thumb = elm_object_part_content_get(first_item_layout, PART_GRID_ITEM_CONTENT);
433         if (!thumb)
434                 return;
435
436         elm_object_signal_emit(thumb, SIGNAL_REMOVE_BUTTON_SHOW, SIGNAL_SOURCE);
437 }
438
439 static Evas_Object *__livebox_all_pages_create_bg(Evas_Object *parent)
440 {
441         LOGI("");
442         Evas_Object *bg = NULL;
443         char *buf = NULL;
444         int ret = -1;
445
446         if (!parent) {
447                 LOGE("[FAILED][__livebox_all_pages_create_bg]");
448                 return NULL;
449         }
450
451         bg = elm_bg_add(parent);
452         if (!bg) {
453                 LOGE("[FAILED][elm_bg_add]");
454                 return NULL;
455         }
456
457         ret = system_settings_get_value_string(SYSTEM_SETTINGS_KEY_WALLPAPER_HOME_SCREEN, &buf);
458
459         if (ret != SYSTEM_SETTINGS_ERROR_NONE || !buf) {
460                 LOGE("[FAILED][failed to get bg path]");
461                 evas_object_del(bg);
462                 return NULL;
463         }
464
465         if (!elm_bg_file_set(bg, buf, NULL)) {
466                 LOGE("[FAILED][failed to set bg]");
467                 evas_object_del(bg);
468                 free(buf);
469                 return NULL;
470         }
471
472         evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
473         evas_object_size_hint_align_set(bg, EVAS_HINT_FILL, EVAS_HINT_FILL);
474         evas_object_show(bg);
475         elm_object_part_content_set(parent, "bg", bg);
476         free(buf);
477         return bg;
478 }
479
480 static Evas_Object *__livebox_all_pages_create_grid(Evas_Object *parent_layout)
481 {
482         Evas_Object *grid = NULL;
483
484         if (!parent_layout) {
485                 LOGE("[INVALID_PARAM][parent_layout='%p']", parent_layout);
486                 return NULL;
487         }
488
489         grid = elm_gengrid_add(parent_layout);
490         if (!grid) {
491                 LOGE("Failed to create gengrid");
492                 return NULL;
493         }
494
495         elm_gengrid_item_size_set(grid, (ITEM_W_REL * home_screen_get_root_width()), (ITEM_H_REL * home_screen_get_root_height()));
496         elm_gengrid_select_mode_set(grid, ELM_OBJECT_SELECT_MODE_NONE);
497         elm_gengrid_filled_set(grid, EINA_TRUE);
498         elm_gengrid_horizontal_set(grid, EINA_FALSE);
499
500         /* elm_gengrid_reorder_mode_set(grid, EINA_TRUE);*/
501         elm_gengrid_align_set(grid, 0.5, 0.5);
502
503         evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
504         elm_object_part_content_set(parent_layout, PART_LAYOUT_CONTENT, grid);
505         evas_object_show(grid);
506
507         evas_object_smart_callback_add(grid, "longpressed", __livebox_all_pages_grid_item_longpressed_cb, NULL);
508         evas_object_smart_callback_add(grid, "moved", __livebox_all_pages_grid_item_moved_cb, NULL);
509         evas_object_smart_callback_add(grid, "pressed", __libebox_all_pages_grid_item_pressed_cb, NULL);
510
511         __livebox_all_pages_create_grid_item_class();
512
513         return grid;
514 }
515
516 static Elm_Gengrid_Item_Class *__livebox_all_pages_create_grid_item_class(void)
517 {
518         Elm_Gengrid_Item_Class *gic = s_info.gic;
519         if (!s_info.gic) {
520                 gic = elm_gengrid_item_class_new();
521                 if (!gic) {
522                         LOGE("Failed to create gengrid item class");
523                         return NULL;
524                 }
525
526                 gic->item_style = "default";
527                 gic->func.text_get = __livebox_all_pages_get_grid_text;
528                 gic->func.content_get = __livebox_all_pages_insert_thumb;
529                 gic->func.state_get = __livebox_all_pages_get_grid_state;
530                 gic->func.del = __livebox_all_pages_del_grid;
531
532                 s_info.gic = gic;
533         }
534
535         return gic;
536 }
537
538 static Evas_Object *__livebox_all_pages_create_thumb(Evas_Object *page, bool is_fake, bool show_remove_button)
539 {
540         Evas_Object *win = NULL;
541         Evas_Object *thumb = NULL;
542         Evas_Object *ly_grid_item = NULL;
543         Evas_Object *ly_thumb = NULL;
544         Evas *e = NULL;
545
546         win = home_screen_get_win();
547         if (!win) {
548                 LOGE("[FAILED][home_screen_win_get]");
549                 return NULL;
550         }
551
552         int w = home_screen_get_root_width();
553         int h = home_screen_get_root_height();
554
555         w = THUMB_W_REL * w;
556         h = THUMB_H_REL * h;
557
558         ly_grid_item = util_create_edje_layout(win, EDJE_DIR"/page_edit.edj", GROUP_GRID_ITEM);
559         if (!ly_grid_item) {
560                 LOGE("[FAILED][util_edje_layout_create]");
561                 return NULL;
562         }
563
564         ly_thumb = util_create_edje_layout(win, EDJE_DIR"/page_edit.edj", GROUP_THUMB);
565         if (!ly_thumb) {
566                 LOGE("[FAILED][util_edje_layout_create]");
567                 evas_object_del(ly_grid_item);
568                 return NULL;
569         }
570
571         elm_object_signal_callback_add(ly_thumb, SIGNAL_THUMBNAIL_CLICKED, SIGNAL_SOURCE, __livebox_all_pages_page_clicked_cb, NULL);
572
573         if (page && !is_fake) {
574                 thumb = page_scroller_get_page_thumbnail(page, w, h);
575                 if (!thumb) {
576                         LOGE("[FAILED][page_scroller_page_thumbnail_get]");
577                         evas_object_del(ly_grid_item);
578                         evas_object_del(ly_thumb);
579                         return NULL;
580                 }
581
582                 evas_object_resize(thumb, w, h);
583                 evas_object_size_hint_max_set(thumb, w, h);
584                 evas_object_data_set(thumb, KEY_THUMB_DATA, page);
585         } else if (page) {
586                 e = evas_object_evas_get(win);
587                 if (!e) {
588                         LOGE("[FAILED][evas_object_evas_get]");
589                         return NULL;
590                 }
591
592                 thumb = evas_object_rectangle_add(e);
593                 if (!thumb) {
594                         LOGE("[FAILED][Failed to create thumb]");
595                         evas_object_del(ly_grid_item);
596                         evas_object_del(ly_thumb);
597                         return NULL;
598                 }
599
600                 evas_object_color_set(thumb, 0, 0, 0, 0);
601                 evas_object_resize(thumb, w, h);
602                 evas_object_size_hint_max_set(thumb, w, h);
603                 evas_object_data_set(thumb, KEY_THUMB_DATA, page);
604         }
605
606         if (!page && !is_fake) {
607                 elm_object_signal_emit(ly_thumb, SIGNAL_BG_HIDE, SIGNAL_SOURCE);
608                 elm_object_signal_emit(ly_thumb, SIGNAL_REMOVE_BUTTON_HIDE, SIGNAL_SOURCE);
609         }
610         elm_object_signal_callback_add(ly_thumb, SIGNAL_REMOVE_BUTTON_CLICKED, SIGNAL_SOURCE, __livebox_all_pages_remove_button_clicked_cb, ly_thumb);
611
612         elm_object_part_content_set(ly_thumb, PART_THUMB_CONTENT, thumb);
613         elm_object_part_content_set(ly_grid_item, PART_GRID_ITEM_CONTENT, ly_thumb);
614
615         if (!show_remove_button)
616                 elm_object_signal_emit(ly_thumb, SIGNAL_REMOVE_BUTTON_HIDE_INSTANT, SIGNAL_SOURCE);
617
618         return ly_grid_item;
619 }
620
621 static Evas_Object *__livebox_all_pages_create_add_icon_layout(void)
622 {
623         Evas_Object *win = NULL;
624         Evas *e = NULL;
625         Evas_Object *add_icon = NULL;
626         Evas_Object *ly_grid_item = NULL;
627         Evas_Object *ly_thumb = NULL;
628         int w = home_screen_get_root_width();
629         int h = home_screen_get_root_height();
630
631         win = home_screen_get_win();
632         if (!win) {
633                 LOGE("[FAILED][home_screen_win_get]");
634                 return NULL;
635         }
636
637         e = evas_object_evas_get(win);
638         if (!e) {
639                 LOGE("[FAILED][evas_object_evas_get]");
640                 return NULL;
641         }
642
643         add_icon = evas_object_rectangle_add(e);
644         if (!add_icon) {
645                 LOGE("[FAILED][evas_object_rectangle_add]");
646                 return NULL;
647         }
648         evas_object_color_set(add_icon, 0, 0, 0, 0);
649
650         ly_grid_item = util_create_edje_layout(win, EDJE_DIR"/page_edit.edj", GROUP_GRID_ITEM);
651         if (!ly_grid_item) {
652                 LOGE("[FAILED][util_edje_layout_create]");
653                 evas_object_del(add_icon);
654                 return NULL;
655         }
656
657         ly_thumb = util_create_edje_layout(win, EDJE_DIR"/page_edit.edj", GROUP_THUMB);
658         if (!ly_thumb) {
659                 LOGE("[FAILED][util_edje_layout_create]");
660                 evas_object_del(add_icon);
661                 evas_object_del(ly_grid_item);
662                 return NULL;
663         }
664
665         w = THUMB_W_REL * w;
666         h = THUMB_H_REL * h;
667         evas_object_size_hint_max_set(add_icon, w, h);
668
669         elm_object_signal_emit(ly_thumb, SIGNAL_REMOVE_BUTTON_HIDE_INSTANT, SIGNAL_SOURCE);
670         elm_object_part_content_set(ly_grid_item, PART_GRID_ITEM_CONTENT, ly_thumb);
671         elm_object_part_content_set(ly_thumb, PART_THUMB_CONTENT, add_icon);
672
673         evas_object_data_set(add_icon, KEY_THUMB_DATA, ly_thumb); /*if pointer returned from the data_key will be the same it would mean that we have add page.*/
674         elm_object_signal_callback_add(ly_thumb, SIGNAL_THUMBNAIL_CLICKED, SIGNAL_SOURCE, __livebox_all_pages_add_page_clicked_cb, (void *) index);
675         elm_object_signal_emit(ly_thumb, SIGNAL_ADD_ICON_SHOW, SIGNAL_SOURCE);
676
677         return ly_grid_item;
678 }
679
680 static bool __livebox_all_pages_fill_grid(Evas_Object *grid)
681 {
682         Eina_List *pages = NULL;
683         Eina_List *it = NULL;
684
685         Evas_Object *lvb_scroller = NULL;
686         Evas_Object *page = NULL;
687         Evas_Object *t_page = NULL;
688         Evas_Object *add_page = NULL;
689
690         bool show_remove_page = false;
691
692         Elm_Gengrid_Item_Class *gic = s_info.gic;
693
694         int g_count = 0;
695
696         if (!grid) {
697                 LOGE("[INVALID_PARAM][grid='%p']", grid);
698                 return false;
699         }
700
701         lvb_scroller = livebox_panel_get();
702         if (!lvb_scroller) {
703                 LOGE("[FAILED][lvb_scroller='%p']", lvb_scroller);
704                 return false;
705         }
706
707         s_info.current_page = page_scroller_get_current_page(lvb_scroller);
708
709         LOGI("[%s]", evas_object_type_get(lvb_scroller));
710
711         pages = page_scroller_unpack_pages(lvb_scroller);
712         if (!pages) {
713                 LOGE("[FAILED][page_scroller_unpack_pages]");
714                 return false;
715         }
716
717         show_remove_page = (eina_list_count(pages) > 1);
718
719         EINA_LIST_FOREACH(pages, it, page) {
720                 if (!page)
721                         continue;
722
723                 t_page = __livebox_all_pages_create_thumb(page, false, show_remove_page);
724                 if (!t_page) {
725                         LOGE("[FAILED][__livebox_all_pages_create_thumb]");
726                         /*TODO: livebox implementer, free pages + think of the way to do something with ui data inside the nodes !*/
727                         elm_gengrid_clear(grid);
728                         return false;
729                 }
730
731                 elm_gengrid_item_append(grid, gic, t_page, NULL, NULL);
732         }
733
734         eina_list_free(pages);
735
736         g_count = elm_gengrid_items_count(grid);
737         if (g_count < MAX_ITEMS) {
738                 add_page = __livebox_all_pages_create_add_icon_layout();
739                 if (!add_page) {
740                         LOGE("[FAILED][__livebox_all_pages_create_add_icon_layout]");
741                         elm_gengrid_clear(grid);
742                         return false;
743                 }
744
745                 s_info.add_page_item = elm_gengrid_item_append(grid, gic, add_page, NULL, NULL);
746                 if (!s_info.add_page_item) {
747                         LOGE("[FAILED][elm_gengrid_item_append]");
748                         evas_object_del(add_page);
749                         elm_gengrid_clear(grid);
750                         return false;
751                 }
752
753                 s_info.is_add_page_visible = true;
754         }
755
756         return true;
757 }
758
759 static Evas_Object *__livebox_all_pages_insert_thumb(void *data, Evas_Object *obj, const char *part)
760 {
761         Evas_Object *thumb = (Evas_Object *) data;
762
763         if (!thumb) {
764                 LOGE("[INVALID_DATA][__livebox_all_pages_insert_thumb]");
765                 return NULL;
766         }
767
768         if (!strncmp(part, GENGRID_ITEM_CONTENT, strlen(GENGRID_ITEM_CONTENT))) {
769                 return thumb;
770         }
771
772         return NULL;
773 }
774
775 static Eina_List *__livebox_all_pages_unpack_grid(void)
776 {
777         Evas_Object *page = NULL;
778
779         Elm_Object_Item *g_item = NULL;
780
781         Eina_List *p_list = NULL;
782         Eina_List *g_items = NULL; /*list of elm_gengrid items.*/
783         Eina_List *it = NULL;
784
785         if (!s_info.grid) {
786                 LOGE("[FAILED][s_info.grid='%p']", s_info.grid);
787                 return NULL;
788         }
789
790         g_items = elm_gengrid_realized_items_get(s_info.grid);
791         if (!g_items) {
792                 LOGE("[FAILED][elm_gengrid_realized_items_get]");
793                 return NULL;
794         }
795
796         EINA_LIST_FOREACH(g_items, it, g_item) {
797                 if (!g_item)
798                         continue;
799
800                 page = __livebox_all_pages_get_thumb_page(g_item);
801                 if (!page) {
802                         LOGE("[FAILED][__livebox_all_pages_get_thumb_page]");
803                         eina_list_free(p_list);
804                         eina_list_free(g_items);
805                         return NULL;
806                 }
807
808                 if (!__livebox_all_pages_check_add_page(g_item)) {
809                         p_list = eina_list_append(p_list, page);
810                         if (!p_list) {
811                                 LOGE("[FAILED][eina_list_append]");
812                                 eina_list_free(g_items);
813                                 return NULL;
814                         }
815                 }
816         }
817         eina_list_free(g_items);
818
819         return p_list;
820 }
821
822 static void __livebox_all_pages_grid_item_longpressed_cb(void *data, Evas_Object *obj, void *ei)
823 {
824         s_info.is_item_longpressed = true;
825         s_info.pressed_item = -1;
826
827         Elm_Object_Item *it = (Elm_Object_Item *) ei;
828
829         if (__livebox_all_pages_check_add_page(it))
830                 return;
831
832         Evas_Object *thumb_layout = elm_object_item_part_content_get(it, GENGRID_ITEM_CONTENT);
833         Evas_Object *thumb = elm_object_part_content_unset(thumb_layout, PART_GRID_ITEM_CONTENT);
834
835         evas_object_layer_set(thumb, EVAS_LAYER_MAX);
836
837         elm_object_signal_emit(thumb, SIGNAL_REMOVE_BUTTON_HIDE, SIGNAL_SOURCE);
838         elm_object_signal_emit(thumb, SIGNAL_BG_REPOSITON, SIGNAL_SOURCE);
839
840         s_info_reposition.item = thumb;
841         s_info_reposition.g_item = it;
842 }
843
844 static void __livebox_all_pages_grid_item_moved_cb(void *data, Evas_Object *obj, void *ei)
845 {
846         LOGD("item moved");
847 }
848
849 static void __livebox_all_pages_grid_changed_cb(void *data, Evas_Object *obj, void *ei)
850 {
851         ecore_timer_add(ITEM_CREATE_TIME, __livebox_all_pages_new_item_created_cb, NULL);
852         evas_object_smart_callback_del(obj, "index,update", __livebox_all_pages_grid_changed_cb);
853         return;
854 }
855
856 /**
857  * @brief Block new item creation during reposition process
858  */
859 static Eina_Bool __livebox_all_pages_new_item_created_cb(void *data)
860 {
861         s_info_reposition.is_created = false;
862         return EINA_FALSE;
863 }
864
865 /**
866  * @details Function check if elm_object item contain add page layout
867  */
868 static bool __livebox_all_pages_check_add_page(Elm_Object_Item *it)
869 {
870         Evas_Object *page = NULL;
871         Evas_Object *ly = NULL;
872         Evas_Object *ly_content = NULL;
873
874         if (!it) {
875                 LOGE("[INVALID_PARAM][it='%p']", it);
876                 return false;
877         }
878
879         ly = elm_object_item_part_content_get(it, GENGRID_ITEM_CONTENT);
880         if (!ly) {
881                 LOGE("[FAILED][elm_object_item_part_content_get]");
882                 return false;
883         }
884
885         ly_content = elm_object_part_content_get(ly, PART_GRID_ITEM_CONTENT);
886         if (!ly_content) {
887                 LOGE("[FAILED][elm_object_part_content_get]");
888                 return false;
889         }
890
891         page = __livebox_all_pages_get_thumb_page(it);
892         if (!page) {
893                 LOGE("[FAILED][__livebox_all_pages_get_thumb_page]");
894                 return false;
895         }
896
897         if (page == ly_content)
898                 return true;
899
900         return false;
901 }
902
903 static Evas_Object *__livebox_all_pages_get_thumb_page(Elm_Object_Item *it)
904 {
905         Evas_Object *ly = NULL;
906         Evas_Object *ly_content = NULL;
907         Evas_Object *thumb = NULL;
908         Evas_Object *page = NULL;
909
910         if (!it) {
911                 LOGE("[INVALID_PARAM][it='%p']", it);
912                 return NULL;
913         }
914
915         ly = elm_object_item_part_content_get(it, GENGRID_ITEM_CONTENT);
916         if (!ly) {
917                 LOGE("[FAILED][elm_object_item_part_content_get]");
918                 return NULL;
919         }
920
921         ly_content = elm_object_part_content_get(ly, PART_GRID_ITEM_CONTENT);
922         if (!ly_content) {
923                 LOGE("[FAILED][elm_object_part_content_get]");
924                 return NULL;
925         }
926
927         thumb = elm_object_part_content_get(ly_content, PART_THUMB_CONTENT);
928         if (!thumb) {
929                 LOGE("[FAILED][elm_object_part_content_get]");
930                 return NULL;
931         }
932
933         page = (Evas_Object *) evas_object_data_get(thumb, KEY_THUMB_DATA);
934
935         return page;
936 }
937
938 static Eina_Bool __livebox_all_pages_item_up_cb(void *data)
939 {
940         int gengrid_items = 0;
941         Evas_Object *page = NULL;
942         Evas_Object *prev_page = NULL;
943         Elm_Object_Item *prev_it = NULL;
944         Tree_node_t *page_node = NULL;
945         Tree_node_t *prev_node = NULL;
946
947         Elm_Object_Item *d_it = s_info_reposition.g_item; /*destination item;*/
948         if (!d_it) {
949                 LOGE("[FAILED][__livebox_all_pages_item_up_cb]");
950                 return ECORE_CALLBACK_CANCEL;
951         }
952
953         Evas_Object *ly_container = elm_object_item_part_content_get(d_it, GENGRID_ITEM_CONTENT);
954         if (!ly_container) {
955                 LOGE("[FAILED][elm_object_item_part_content_get]");
956                 return ECORE_CALLBACK_CANCEL;
957         }
958
959         elm_object_part_content_set(ly_container, PART_GRID_ITEM_CONTENT, s_info_reposition.item);
960         elm_object_signal_emit(s_info_reposition.item, SIGNAL_BG_NORMAL, SIGNAL_SOURCE);
961
962         gengrid_items = elm_gengrid_items_count(s_info.grid);
963         if (gengrid_items > 2)
964                 elm_object_signal_emit(s_info_reposition.item, SIGNAL_REMOVE_BUTTON_SHOW, SIGNAL_SOURCE);
965
966         page = __livebox_all_pages_get_thumb_page(d_it);
967         if (!page) {
968                 LOGE("page == NULL");
969                 return ECORE_CALLBACK_CANCEL;
970         }
971
972         page_node = evas_object_data_get(page, KEY_ICON_DATA);
973         if (!page_node) {
974                 LOGE("page_node == NULL");
975                 return ECORE_CALLBACK_CANCEL;
976         }
977
978         prev_it = elm_gengrid_item_prev_get(d_it);
979         if (prev_it) {
980                 LOGD("prev_it != NULL");
981
982                 prev_page = __livebox_all_pages_get_thumb_page(prev_it);
983
984                 if (!prev_page) {
985                         LOGE("prev_page == NULL");
986                         return ECORE_CALLBACK_CANCEL;
987                 }
988
989                 prev_node = evas_object_data_get(prev_page, KEY_ICON_DATA);
990                 if (!prev_node) {
991                         LOGE("prev_node == NULL");
992                         return ECORE_CALLBACK_CANCEL;
993                 }
994
995                 data_model_insert_after(prev_node, page_node);
996         } else {
997                 LOGD("prev_it == NULL");
998
999                 data_model_insert_after(NULL, page_node);
1000         }
1001
1002         s_info_reposition.cur_x = -1;
1003         s_info_reposition.cur_y = -1;
1004         s_info_reposition.g_item = NULL;
1005         s_info_reposition.item = NULL;
1006         s_info_reposition.is_created = false;
1007         s_info.is_item_longpressed = false;
1008
1009         home_screen_print_tree();
1010
1011         return ECORE_CALLBACK_CANCEL;
1012 }
1013
1014 /*Gengrid Class item functions*/
1015 static char *__livebox_all_pages_get_grid_text(void *data, Evas_Object *obj, const char *part)
1016 {
1017         return NULL;
1018 }
1019
1020 static Eina_Bool __livebox_all_pages_get_grid_state(void *data, Evas_Object *obj, const char *part)
1021 {
1022         return EINA_FALSE;
1023 }
1024
1025 static void __livebox_all_pages_del_grid(void *data, Evas_Object *obj)
1026 {
1027 }
1028
1029 static void __livebox_all_pages_hide_remove_button(Elm_Object_Item *it)
1030 {
1031         Evas_Object *thumb_layout = NULL;
1032         Evas_Object *thumb = NULL;
1033
1034         if (!it)
1035                 LOGE("[INVALID_PARAM][it='%p']", it);
1036
1037         thumb_layout = elm_object_item_part_content_get(it, GENGRID_ITEM_CONTENT);
1038         thumb = elm_object_part_content_get(thumb_layout, PART_GRID_ITEM_CONTENT);
1039         elm_object_signal_emit(thumb, SIGNAL_REMOVE_BUTTON_HIDE, SIGNAL_SOURCE);
1040 }
1041
1042 static void __livebox_all_pages_realized_cb(void *data, Evas_Object *obj, void *ei)
1043 {
1044         int g_count = 0;
1045         g_count = elm_gengrid_items_count(obj);
1046
1047         if (g_count == 2)
1048                 __livebox_all_pages_hide_remove_button(elm_gengrid_first_item_get(obj));
1049 }
1050
1051 static void __livebox_all_pages_remove_button_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
1052 {
1053         Elm_Object_Item *clicked_item = NULL;
1054         Evas_Object *clicked_page = NULL;
1055         Evas_Object *lvb = (Evas_Object *) data;
1056
1057         if (!lvb) {
1058                 LOGE("[FAILED][lvb='%p']", lvb);
1059                 return;
1060         }
1061
1062         int x = -1, y = -1;
1063         evas_object_geometry_get(lvb, &x, &y, NULL, NULL);
1064
1065         clicked_item = elm_gengrid_at_xy_item_get(s_info.grid, x, y, NULL, NULL);
1066         if (!clicked_item) {
1067                 LOGE("[FAILED][elm_gengrid_at_xy_item_get]");
1068                 return;
1069         }
1070
1071         clicked_page = __livebox_all_pages_get_thumb_page(clicked_item);
1072         if (!clicked_page) {
1073                 LOGE("[FAILED][__livebox_all_pages_get_thumb_page]");
1074                 return;
1075         }
1076         if (__livebox_all_pages_is_page_empty(clicked_page)) {
1077                 __livebox_all_pages_remove_button_clicked_liveboxes_cb(clicked_item);
1078         } else {
1079                 popup_data_t *p_data = popup_create_data();
1080                 if (!p_data) {
1081                         LOGE("[FAILED][failed to create popup data]");
1082                         return;
1083                 }
1084
1085                 p_data->type = POPUP_TWO_BUTTONS;
1086                 p_data->popup_title_text = strdup(_("IDS_HS_HEADER_DELETE_PAGE_ABB2"));
1087                 p_data->popup_content_text = strdup(_("IDS_HS_POP_THIS_PAGE_AND_ALL_THE_ITEMS_IT_CONTAINS_WILL_BE_DELETED"));
1088                 p_data->popup_confirm_text = strdup(_("IDS_HS_OPT_DELETE"));
1089                 p_data->popup_cancel_text = strdup(_("IDS_CAM_SK_CANCEL"));
1090                 p_data->orientation = ELM_POPUP_ORIENT_CENTER;
1091
1092                 popup_show(p_data, __livebox_all_pages_remove_button_clicked_liveboxes_cb, NULL,
1093                                         (void *) clicked_item);
1094         }
1095 }
1096
1097 static void __livebox_all_pages_page_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
1098 {
1099         Evas_Object *lvb_scroller = NULL;
1100
1101         if (s_info.is_item_longpressed)
1102                 return;
1103
1104         lvb_scroller = livebox_panel_get();
1105         if (!lvb_scroller) {
1106                 LOGE("Failed to get scroller");
1107                 return;
1108         }
1109
1110         livebox_all_pages_hide();
1111         home_screen_set_view_type(HOMESCREEN_VIEW_HOME);
1112         s_info.pressed_item = -1;
1113 }
1114
1115 static void __libebox_all_pages_grid_item_pressed_cb(void *data, Evas_Object *obj, void *ei)
1116 {
1117         s_info.pressed_item = elm_gengrid_item_index_get(ei);
1118 }
1119