initial upload for tizen 2.0 beta
[apps/home/gallery.git] / src / features / gl-gridview.c
1 /*
2   * Copyright 2012  Samsung Electronics Co., Ltd
3   *
4   * Licensed under the Flora License, Version 1.0 (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://www.tizenopensource.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 "gl-debug.h"
18 #include "gl-gridview.h"
19 #include "gl-ui-util.h"
20 #include "gl-util.h"
21 #include "gl-drm.h"
22 #include "gl-albums.h"
23 #include "gl-data.h"
24 #include "gl-ext-ug-load.h"
25 #include "gl-ext-exec.h"
26 #include "gl-controlbar.h"
27 #include "gl-nocontents.h"
28 #include "gl-notify.h"
29 #include "gl-strings.h"
30 #include "gl-thumb.h"
31 #ifdef _USE_ROTATE_BG
32 #include "gl-exif.h"
33 #endif
34
35 /* Icon swallowed to part "elm.swallow.icon" */
36 #define GL_GRID_TOUCH_RANGE 20
37
38 static void
39 _gl_grid_sel_icon(void *data)
40 {
41         gl_dbg("");
42         gl_grid_sel_cb(data, NULL, NULL);
43 }
44
45 static void
46 _gl_grid_item_check_changed(void *data, Evas_Object *obj, void *event_info)
47 {
48         GL_CHECK(obj);
49         GL_CHECK(data);
50         gl_item *gitem = (gl_item *) data;
51         GL_CHECK(gitem->ad);
52         gl_appdata *ad = (gl_appdata *)gitem->ad;
53         int view_mode = gl_get_view_mode(ad);
54         Evas_Object *view_ly = NULL;
55         Elm_Object_Item *nf_it = NULL;
56         gl_dbg("");
57
58         if (view_mode == GL_VIEW_THUMBS_EDIT) {
59                 view_ly = ad->gridinfo.edit_layout;
60                 nf_it = ad->gridinfo.nf_it_edit;
61         } else {
62                 return;
63         }
64
65
66         Eina_Bool checked = elm_check_state_get(obj);
67         gitem->checked = checked;
68         if (checked)
69         {
70                 gl_dbg("Append:%s", gitem->item->file_url);
71                 _gl_data_selected_list_append(ad, gitem);
72         }
73         else
74         {
75                 gl_dbg("Remove:%s", gitem->item->file_url);
76                 _gl_data_selected_list_remove(ad, gitem);
77         }
78
79         /* Display selectioninfo */
80         int cnt = _gl_data_selected_list_count(ad);
81         _gl_notify_create_selinfo(ad, view_ly, nf_it, ad->gridinfo.thumbs_cnt,
82                                   cnt, false);
83 }
84
85 static void
86 _gl_grid_shrink_resp_cb(void *data, Evas_Object *obj,
87         const char *emission, const char *source)
88 {
89         GL_CHECK(data);
90         gl_dbg("");
91
92         _gl_grid_sel_icon(data);
93
94         edje_object_signal_callback_del(obj,
95                 "shrink,expand,done", "bg", _gl_grid_shrink_resp_cb);
96
97 }
98
99 static Evas_Object *__gl_grid_get_content(void *data, Evas_Object *obj, const char *part)
100 {
101         GL_CHECK_NULL(part);
102         GL_CHECK_NULL(strlen(part));
103         GL_CHECK_NULL(data);
104         gl_item *gitem = (gl_item *) data;
105         GL_CHECK_NULL(gitem->item);
106         GL_CHECK_NULL(gitem->ad);
107         gl_appdata *ad = (gl_appdata *)gitem->ad;
108         int view_mode = gl_get_view_mode(ad);
109         int item_size = ad->gridinfo.icon_size;
110         bool is_expired_drm = false;
111
112         if (!g_strcmp0(part, GL_THUMB_ICON)) {
113                 Evas_Object *layout = NULL;
114                 char *path = NULL;
115                 char *drm_path = NULL;
116                 unsigned int orient = 0;
117
118                 /* Is it DRM file? Has a valid RO? */
119                 if(gl_drm_is_drm_file(gitem->item->file_url) &&
120                    gl_drm_check_valid_ro(gitem->item->file_url,
121                         gl_drm_get_permtype(gitem->item->type)) == false) {
122                         path =  GL_DEFAULT_THUMB_ICON;
123                         is_expired_drm = true;
124                 } else if (ad->maininfo.medias_cnt < 2 &&
125                            gitem->item->type == MEDIA_CONTENT_TYPE_IMAGE) {
126                         if (!g_strcmp0(GL_DB_DEFAULT_THUMB, gitem->item->thumb_url)) {
127                                 path = GL_DEFAULT_THUMB_ICON;
128                         } else {
129                                 char *drm_path = gl_drm_get_file_path(gitem);
130                                 path = _GETICON(drm_path);
131                                 if (gl_is_image_valid(ad, path) == false)
132                                         path = _GETICON(gitem->item->thumb_url);
133 #ifdef _USE_ROTATE_BG
134                                 /* Rotate bg if it's created from original file */
135                                 if (!g_strcmp0(path, gitem->item->file_url))
136                                         _gl_exif_get_orientation(path, &orient);
137 #endif
138                         }
139                 } else {
140                         int ret = -1;
141                         ret = _gl_get_thumb(ad, gitem->item->file_url,
142                                             &gitem->item->thumb_url);
143                         /* Use default image */
144                         if (ret < 0)
145                                 path = GL_DEFAULT_THUMB_ICON;
146                         else
147                                 path = gitem->item->thumb_url;
148                 }
149
150                 if (gitem->item->type == MEDIA_CONTENT_TYPE_VIDEO) {
151                         unsigned int v_dur = 0;
152                         if (gitem->item->video_info) {
153                                 v_dur = gitem->item->video_info->duration;
154                         }
155                         int bk_len = 0;
156                         if (gitem->item->video_info == NULL)
157                                 bk_len = 0;
158                         else
159                                 bk_len = gitem->item->video_info->bookmarks;
160                         layout = _gl_thumb_show_part_icon_video(obj, path,
161                                                                 v_dur, bk_len,
162                                                                 is_expired_drm,
163                                                                 item_size);
164                 } else {
165                         layout = _gl_thumb_show_part_icon_image(obj, path,
166                                                                 orient,
167                                                                 is_expired_drm,
168                                                                 item_size);
169                 }
170
171                 if(drm_path) {
172                         free(drm_path);
173                         drm_path = NULL;
174                 }
175
176                 evas_object_event_callback_add(layout,
177                         EVAS_CALLBACK_MOUSE_DOWN, gl_grid_item_mouse_down, gitem);
178                 evas_object_event_callback_add(layout,
179                         EVAS_CALLBACK_MOUSE_UP, gl_grid_item_mouse_up, gitem);
180
181
182                 return layout;
183         } else if (!g_strcmp0(part, GL_THUMB_CHECKBOX) &&
184                    view_mode == GL_VIEW_THUMBS_EDIT) {
185                 Evas_Object *ck = NULL;
186                 ck = _gl_thumb_show_part_checkbox(obj, gitem->checked,
187                                                   _gl_grid_item_check_changed,
188                                                   data);
189                 GL_CHECK_NULL(ck);
190
191                 gitem->check_obj = ck;
192                 return ck;
193         }
194
195         return NULL;
196 }
197
198 static bool
199 _gl_grid_create_items(void *data, Evas_Object *parent)
200 {
201         GL_CHECK_FALSE(data);
202         gl_appdata *ad = (gl_appdata *)data;
203         int i = 0;
204         int item_cnt = 0;
205         gl_item *gitem = NULL;
206         int ret = -1;
207         /* Get all medias count of current album */
208         int cnt = ad->maininfo.medias_cnt;
209         gl_dbg("List count : %d gv_mode : %d", cnt, ad->gridinfo.grid_view_mode);
210
211         ad->gridinfo.thumbgic.item_style = GL_GENGRID_ITEM_STYLE_THUMBNAIL;
212         ad->gridinfo.thumbgic.func.text_get = NULL;
213         ad->gridinfo.thumbgic.func.content_get = __gl_grid_get_content;
214
215         elm_gengrid_clear(parent);
216         for (i = 1; i <= cnt; i++)
217         {
218                 _gl_data_get_item_by_index(ad, i, false, &gitem);
219                 if (gitem == NULL || gitem->item == NULL ||
220                     gitem->item->uuid == NULL) {
221                         gl_dbgE("Invalid gitem. continue...");
222                         continue;
223                 }
224
225                 if (!gitem->item->file_url)
226                 {
227                         gl_dbg("file_url is invalid.");
228                         ret = _gl_data_delete_media(ad, gitem->item);
229                         if (ret != 0)
230                         {
231                                 continue;
232                         }
233                         _gl_data_selected_list_remove(ad, gitem);
234                         _gl_data_item_list_remove(ad, gitem);
235                         cnt--;
236                         i--;
237                         gitem = NULL;
238                         continue;
239                 }
240
241                 if (ad->gridinfo.back_to_normal)
242                 {
243                         gitem->checked = false;
244                         //gitem->check_obj = NULL;
245                 }
246
247                 if (ad->gridinfo.grid_view_mode == GL_GRID_IMAGES &&
248                     gitem->item->type != MEDIA_CONTENT_TYPE_IMAGE)
249                     continue;
250
251                 gitem->elm_item = elm_gengrid_item_append(parent,
252                                                         &(ad->gridinfo.thumbgic),
253                                                         gitem,
254                                                         gl_grid_sel_cb,
255                                                         gitem);
256                 item_cnt++;
257                 gitem->sequence = item_cnt;
258
259         }
260
261         /* Disable grid item selection callback */
262         elm_gengrid_select_mode_set(parent, ELM_OBJECT_SELECT_MODE_NONE);
263
264         ad->gridinfo.thumbs_cnt = item_cnt;
265         ad->gridinfo.back_to_normal = false;
266
267         if (item_cnt == 0)
268         {
269                 return EINA_FALSE;
270         }
271         else
272         {
273                 return EINA_TRUE;
274         }
275 }
276
277 void
278 gl_grid_item_mouse_down(void *data, Evas *e,
279         Evas_Object *obj, void *event_info)
280 {
281         GL_CHECK(obj);
282         GL_CHECK(event_info);
283         GL_CHECK(data);
284         gl_item *gitem = (gl_item *) data;
285         GL_CHECK(gitem->ad);
286         gl_appdata *ad = (gl_appdata *)gitem->ad;
287         Evas_Event_Mouse_Down *ev = (Evas_Event_Mouse_Down *) event_info;
288
289         ad->gridinfo.grid_touch_info.x = ev->output.x;
290         ad->gridinfo.grid_touch_info.y = ev->output.y;
291
292         if (ad->uginfo.ug_called_by_me == NULL)
293         {
294                 edje_object_signal_emit(_EDJ(obj), "mouse,down,shrink", "bg");
295                 ad->gridinfo.grid_touch_info.b_pressed = true;
296         }
297 }
298
299 void
300 gl_grid_item_mouse_up(void *data, Evas *e,
301         Evas_Object *obj, void *event_info)
302 {
303         GL_CHECK(data);
304         gl_item *gitem = (gl_item *) data;
305         GL_CHECK(gitem->ad);
306         gl_appdata *ad = (gl_appdata *)gitem->ad;
307
308         if (!event_info || !obj)
309         {
310                 goto RET_WO_EXEC;
311         }
312
313         Evas_Event_Mouse_Up *ev = event_info;
314         if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD ||
315             ev->event_flags & EVAS_EVENT_FLAG_ON_SCROLL)
316         {
317                 goto RET_WO_EXEC;
318         }
319         if ((abs(ad->gridinfo.grid_touch_info.x - ev->output.x) > GL_GRID_TOUCH_RANGE) ||
320             (abs(ad->gridinfo.grid_touch_info.y - ev->output.y) > GL_GRID_TOUCH_RANGE))
321         {
322                 goto RET_WO_EXEC;
323         }
324
325         gl_dbg("");
326
327         if (ad->gridinfo.grid_touch_info.b_pressed)
328         {
329                 edje_object_signal_emit(_EDJ(obj), "mouse,up,expand", "bg");
330                 edje_object_signal_callback_add(_EDJ(obj),
331                         "shrink,expand,done", "bg", _gl_grid_shrink_resp_cb, data);
332                 ad->gridinfo.grid_touch_info.b_pressed = false;
333         }
334         return;
335
336       RET_WO_EXEC:
337         if (ad->gridinfo.grid_touch_info.b_pressed)
338         {
339                 edje_object_signal_emit(_EDJ(obj), "mouse,up,expand", "bg");
340                 ad->gridinfo.grid_touch_info.b_pressed = false;
341         }
342 }
343
344 /*
345 * Set new view to all/image_grid_view.
346 *
347 * b_noc, true: it's nocontents view, false: normal view.
348 */
349 static int _gl_grid_set_view(void *data, Evas_Object *view, bool b_noc)
350 {
351         GL_CHECK_VAL(data, -1);
352         gl_appdata *ad = (gl_appdata *)data;
353         gl_grid_mode view_mode = ad->gridinfo.grid_view_mode;
354
355         switch (view_mode) {
356         case GL_GRID_ALL:
357                 ad->gridinfo.all_view = view;
358                 if (b_noc)
359                         gl_grid_set_nocontents(ad, view);
360                 else
361                         gl_grid_set_nocontents(ad, NULL);
362                 break;
363         case GL_GRID_IMAGES:
364                 ad->gridinfo.images_view = view;
365                 if (b_noc)
366                         gl_grid_set_nocontents(ad, view);
367                 else
368                         gl_grid_set_nocontents(ad, NULL);
369                 break;
370         default:
371                 break;
372         }
373
374         return 0;
375 }
376
377 void
378 gl_grid_sel_cb(void *data, Evas_Object *obj, void *event_info)
379 {
380         GL_CHECK(data);
381         gl_item *gitem = (gl_item *) data;
382         GL_CHECK(gitem->item);
383         GL_CHECK(gitem->item->file_url);
384         GL_CHECK(strlen(gitem->item->file_url));
385         GL_CHECK(gitem->ad);
386         gl_appdata *ad = (gl_appdata *)gitem->ad;
387         int view_mode = gl_get_view_mode(ad);
388         gl_dbg("");
389
390         if (view_mode != GL_VIEW_THUMBS)
391         {
392                 //gl_dbg("EditMode.. now return.");
393                 return;
394         }
395         else
396         {
397                 gl_dbg("ViewMode");
398         }
399
400         if (gitem->item->type == MEDIA_CONTENT_TYPE_IMAGE ||
401             gitem->item->type == MEDIA_CONTENT_TYPE_VIDEO)
402         {
403                 gl_dbg("Loading UG-IMAGE(VIDEO)-VIEWER");
404                 gl_ext_load_iv_ug(ad, gitem, GL_UG_IV);
405         }
406 }
407
408 /*
409 * When select album, show first (GL_FIRST_VIEW_END_POS+1) medias.
410 * Then use idler to get other medias from DB and appened
411 * them to gridview.
412 * In order to reduce transit time of first show of thumbnails view.
413 * Cause most of time is spent for getting records from DB,
414 * so we get first (GL_FIRST_VIEW_END_POS+1) items and show thumbnails view,
415 * it will accelerate view show.
416 */
417 int
418 gl_grid_idler_append_items(void *data)
419 {
420         GL_CHECK_VAL(data, -1);
421         gl_appdata *ad = (gl_appdata *)data;
422         GL_CHECK_VAL(ad->albuminfo.current_album, -1);
423         GL_CHECK_VAL(ad->gridinfo.all_view, -1);
424         int i = 0;
425         int item_cnt = 0;
426         gl_item *gitem = NULL;
427         /* Get all medias count of current album */
428         int cnt = ad->maininfo.medias_cnt;
429         int ret = -1;
430
431         gl_dbg("First view medias count: %d; girdview mode: %d",
432                 cnt, ad->gridinfo.grid_view_mode);
433         if (ad->maininfo.medias_cnt != (GL_FIRST_VIEW_END_POS + 1))
434         {
435                 gl_dbg("No any more items, return!");
436                 return -1;
437         }
438         /* Get other items from DB */
439         ret = _gl_data_get_item_list(ad, ad->albuminfo.current_album,
440                                      (GL_FIRST_VIEW_END_POS + 1),
441                                      GL_GET_UNTIL_LAST_RECORD);
442         if (ret < 0) {
443                 gl_dbgE("Get items list failed[%d]!", ret);
444                 return ret;
445         }
446
447         cnt = ad->maininfo.medias_cnt;
448         gl_dbg("Grid view all medias count: %d", cnt);
449
450         if (ad->gridinfo.grid_view_mode != GL_GRID_ALL)
451         {
452                 /* Event gridview mode is wrong, we still need to get other records */
453                 gl_dbg("Gridview mode is wrong, return!");
454                 return -1;
455         }
456
457         /* From (GL_FIRST_VIEW_END_POS + 2)th item to last one */
458         i = GL_FIRST_VIEW_END_POS + 2;
459
460         for (; i <= cnt; i++)
461         {
462                 _gl_data_get_item_by_index(ad, i, false, &gitem);
463                 if (gitem == NULL || gitem->item == NULL ||
464                     gitem->item->uuid == NULL ) {
465                         gl_dbgE("Invalid gitem, continue...");
466                         continue;
467                 }
468
469                 if (!gitem->item->file_url)
470                 {
471                         gl_dbg("file_url is invalid.");
472                         _gl_data_delete_media(ad, gitem->item);
473                         _gl_data_selected_list_remove(ad, gitem);
474                         _gl_data_item_list_remove(ad, gitem);
475                         cnt--;
476                         i--;
477                         gitem = NULL;
478                         continue;
479                 }
480
481                 if (ad->gridinfo.grid_view_mode == GL_GRID_IMAGES &&
482                     gitem->item->type != MEDIA_CONTENT_TYPE_IMAGE)
483                     continue;
484
485                 gitem->elm_item = elm_gengrid_item_append(ad->gridinfo.all_view,
486                                                                 &(ad->gridinfo.thumbgic),
487                                                                 gitem,
488                                                                 gl_grid_sel_cb,
489                                                                 gitem);
490                 item_cnt++;
491                 gitem->sequence = item_cnt + GL_FIRST_VIEW_END_POS + 1;
492         }
493
494         gl_dbgW("\tUse idler to append other medias--Done!");
495         if (item_cnt == 0)
496         {
497                 return -1;
498         }
499         else
500         {
501                 ad->gridinfo.thumbs_cnt = item_cnt + GL_FIRST_VIEW_END_POS + 1;
502                 gl_dbg("All count appended: %d", ad->gridinfo.thumbs_cnt);
503                 return 0;
504         }
505 }
506
507 static Eina_Bool __gl_grid_append_items_idler_cb(void *data)
508 {
509         GL_CHECK_CANCEL(data);
510
511         /* Try to get other medias from DB and append them to gridview */
512         int ret = gl_grid_idler_append_items(data);
513         if (ret < 0) {
514                 gl_dbgE("Failed to append grid items!");
515         } else {
516                 gl_dbg("Successful to append grid items!");
517         }
518
519         /* Remove idler after all items appended */
520         _gl_grid_del_append_idler(data);
521
522         return ECORE_CALLBACK_CANCEL;
523 }
524
525 Evas_Object *
526 gl_grid_create_layout(void *data, Evas_Object *parent)
527 {
528         GL_CHECK_NULL(parent);
529         GL_CHECK_NULL(data);
530         gl_appdata *ad = (gl_appdata *)data;
531         gl_dbg("");
532
533         Evas_Object *layout = NULL;
534         layout = gl_ui_load_edj(ad->maininfo.naviframe, GL_EDJ_FILE,
535                                 GL_GRP_GRIDVIEW);
536         evas_object_show(layout);
537
538         return layout;
539 }
540
541 Evas_Object *_gl_grid_create_view(void *data, Evas_Object *parent,
542                                   gl_grid_mode mode, bool b_use_idler)
543 {
544         GL_CHECK_NULL(parent);
545         GL_CHECK_NULL(data);
546         gl_appdata *ad = (gl_appdata *)data;
547         Evas_Object *grid = NULL;
548         ad->gridinfo.grid_view_mode = mode;
549         grid = _gl_thumb_add_gengrid(parent);
550
551         if (!_gl_grid_create_items(ad, grid)) {
552                 evas_object_del(grid);
553                 grid = NULL;
554                 Evas_Object *noc = _gl_nocontents_create(ad);
555                 gl_grid_set_nocontents(ad, noc);
556                 evas_object_show(noc);
557                 return noc;
558         }
559
560         gl_dbg("thumbs_cnt : %d", ad->gridinfo.thumbs_cnt);
561         gl_grid_set_item_size(ad, grid);
562
563         evas_object_show(grid);
564
565         if (b_use_idler &&
566             ad->maininfo.medias_cnt == (GL_FIRST_VIEW_END_POS + 1)) {
567                 gl_dbgW("\tUse idler to append other medias--Start");
568                 /* Remove idler */
569                 _gl_grid_del_append_idler(ad);
570                 /* Add idler */
571                 ad->gridinfo.grid_append_idler = ecore_idler_add(__gl_grid_append_items_idler_cb,
572                                                                  ad);
573         }
574
575         return grid;
576 }
577
578 int
579 gl_grid_change_to_edit(void *data)
580 {
581         GL_CHECK_VAL(data, -1);
582         gl_appdata *ad = (gl_appdata *)data;
583         int view_mode = gl_get_view_mode(ad);
584         bool b_ret = false;
585         Evas_Object *view = NULL;
586         gl_dbg("view_mode: %d", view_mode);
587
588         if (view_mode == GL_VIEW_THUMBS_EDIT) {
589                 view = ad->gridinfo.edit_view;
590         } else {
591                 gl_dbgE("Wrong view mode!");
592                 return -1;
593         }
594         GL_CHECK_VAL(view, -1);
595
596         b_ret = _gl_grid_create_items(ad, view);
597         gl_grid_set_item_size(ad, NULL);
598
599         if (!b_ret) {
600                 gl_dbgE("Create items failed!");
601                 return -1;
602         } else {
603                 return 0;
604         }
605 }
606
607 int
608 gl_grid_change_to_view(void *data)
609 {
610         GL_CHECK_VAL(data, -1);
611         gl_appdata *ad = (gl_appdata *)data;
612         int gridview_mode = ad->gridinfo.grid_view_mode;
613         bool b_ret = false;
614         gl_dbg("gridview_mode: %d", gridview_mode);
615
616         if (ad->gridinfo.all_view == NULL
617             && ad->gridinfo.images_view == NULL)
618         {
619                 gl_dbg("Error : Any gridview doesn't exist");
620                 return -1;
621         }
622
623         /* Come back from edit mode, save state */
624         ad->gridinfo.back_to_normal = true;
625
626         if (gridview_mode == GL_GRID_ALL)
627         {
628                 b_ret = _gl_grid_create_items(ad, ad->gridinfo.all_view);
629         }
630         else if (gridview_mode == GL_GRID_IMAGES)
631         {
632                 b_ret = _gl_grid_create_items(ad, ad->gridinfo.images_view);
633         }
634         gl_grid_set_item_size(ad, NULL);
635
636         if (!b_ret) {
637                 gl_dbgE("Create items failed!");
638                 return -1;
639         } else {
640                 return 0;
641         }
642 }
643
644 /**
645 * Get all/image_grid_view.
646 *
647 * True returned if it's normal view, if it's nocontents view return false.
648 */
649 bool gl_grid_get_view(void *data, Evas_Object **view)
650 {
651         GL_CHECK_FALSE(data);
652         gl_appdata *ad = (gl_appdata *)data;
653         gl_grid_mode view_mode = ad->gridinfo.grid_view_mode;
654         Evas_Object *gv = NULL;
655         bool b_view = false;
656
657         switch (view_mode) {
658         case GL_GRID_ALL:
659                 gv = ad->gridinfo.all_view;
660                 if (gv && ad->gridinfo.all_nocontents == NULL)
661                         b_view = true;
662                 break;
663         case GL_GRID_IMAGES:
664                 gv = ad->gridinfo.images_view;
665                 if (gv && ad->gridinfo.images_nocontents == NULL)
666                         b_view = true;
667                 break;
668         default:
669                 break;
670         }
671
672         /* Nocontents */
673         if (!b_view)
674                 gl_dbg("Previous view is Nocontents...");
675
676         /* Return view */
677         if (view)
678                 *view = gv;
679
680         return b_view;
681 }
682
683 /* Assign new value to all/image_grid_nocontents */
684 int gl_grid_set_nocontents(void *data, Evas_Object *noc)
685 {
686         GL_CHECK_VAL(data, -1);
687         gl_appdata *ad = (gl_appdata *)data;
688         gl_grid_mode view_mode = ad->gridinfo.grid_view_mode;
689
690         switch (view_mode) {
691         case GL_GRID_ALL:
692                 ad->gridinfo.all_nocontents = noc;
693                 break;
694         case GL_GRID_IMAGES:
695                 ad->gridinfo.images_nocontents = noc;
696                 break;
697         default:
698                 break;
699         }
700
701         return 0;
702 }
703
704 int gl_grid_set_item_size(void *data, Evas_Object *gridview)
705 {
706         GL_CHECK_VAL(data, -1);
707         gl_appdata *ad = (gl_appdata *)data;
708         int cnt = 0;
709         Evas_Object *gv = NULL;
710         int view_mode = gl_get_view_mode(ad);
711
712         if (gridview) {
713                 gv = gridview;
714         } else {
715                 bool b_view = false;
716                 if (view_mode == GL_VIEW_THUMBS_EDIT) {
717                         b_view = true;
718                         gv = ad->gridinfo.edit_view;
719                 } else {
720                         b_view = gl_grid_get_view(ad, &gv);
721                 }
722
723                 if (!b_view || !gv) {
724                         gl_dbgE("gridview is invalid!");
725                         return -1;
726                 }
727         }
728
729         if (ad->gridinfo.updated_thumbs_cnt <= 0) {
730                 cnt = ad->gridinfo.thumbs_cnt;
731         } else {
732                 cnt = ad->gridinfo.updated_thumbs_cnt;
733                 ad->gridinfo.updated_thumbs_cnt = 0;
734         }
735
736         return _gl_thumb_set_size(ad, gv, cnt, &(ad->gridinfo.icon_size));
737 }
738
739 Eina_Bool
740 gl_grid_update_items(void *data)
741 {
742         GL_CHECK_FALSE(data);
743         gl_appdata *ad = (gl_appdata *)data;
744         Eina_Bool res = EINA_FALSE;
745         Evas_Object *gv = NULL;
746         int view_mode = gl_get_view_mode(ad);
747         bool b_view = false;
748         gl_dbg("");
749
750         if (view_mode == GL_VIEW_THUMBS_EDIT)
751         {
752                 gl_dbg("\n\nEdit_Mode\n");
753                 gv = ad->gridinfo.edit_view;
754         }
755         else
756         {
757                 b_view = gl_grid_get_view(ad, &gv);
758                 GL_CHECK_FALSE(gv);
759         }
760         if (b_view) {
761                 res = _gl_grid_create_items(ad, gv);
762                 if (!res)
763                 {
764                         gl_dbg("_gl_grid_create_items() return false...");
765                         evas_object_hide(gv);
766                         evas_object_del(gv);
767                         _gl_grid_set_view(ad, NULL, false);
768                         Evas_Object *noc = _gl_nocontents_create(ad);
769                         evas_object_show(noc);
770                         _gl_grid_set_view(ad, noc, true);
771
772                         elm_object_part_content_unset(ad->gridinfo.layout,
773                                                       "elm.swallow.view");
774                         elm_object_part_content_set(ad->gridinfo.layout,
775                                                     "elm.swallow.view", noc);
776                 }
777                 else
778                 {
779                         gl_grid_set_item_size(ad, gv);
780                 }
781         }
782         else
783         {
784                 gl_dbg("Remove nocontents view.");
785                 evas_object_hide(gv);
786                 evas_object_del(gv);
787                 _gl_grid_set_view(ad, NULL, false);
788                 bool b_noc = false;
789                 int view_m = ad->gridinfo.grid_view_mode;
790
791                 Evas_Object *view = NULL;
792                 view = _gl_grid_create_view(ad, ad->gridinfo.layout,
793                                             view_m, false);
794                 if ((view_m == GL_GRID_IMAGES &&
795                      ad->gridinfo.images_nocontents) ||
796                     (view_m == GL_GRID_ALL &&
797                      ad->gridinfo.all_nocontents))
798                         b_noc = true;
799
800                 /* No nocotents removed, gridview created, enable edit button */
801                 if (!b_noc) {
802                         _gl_ctrl_disable_toolbar_item(ad, false,
803                                                       GL_NAVI_THUMBS,
804                                                       false);
805                 } else {
806                         b_noc = true;
807                 }
808                 _gl_grid_set_view(ad, view, b_noc);
809
810                 elm_object_part_content_unset(ad->gridinfo.layout,
811                                               "elm.swallow.view");
812                 elm_object_part_content_set(ad->gridinfo.layout,
813                                             "elm.swallow.view", view);
814         }
815
816         return res;
817 }
818
819 int
820 gl_grid_clear_view(void *data)
821 {
822         GL_CHECK_VAL(data, -1);
823         gl_appdata *ad = (gl_appdata *)data;
824         ad->gridinfo.segment = NULL;
825
826         /* Destroy idler */
827         _gl_grid_del_append_idler(data);
828
829         if (ad->gridinfo.all_view != NULL) {
830                 evas_object_del(ad->gridinfo.all_view);
831                 ad->gridinfo.all_view = NULL;
832         }
833
834         if (ad->gridinfo.images_view != NULL) {
835                 evas_object_del(ad->gridinfo.images_view);
836                 ad->gridinfo.images_view = NULL;
837         }
838         ad->gridinfo.all_nocontents = NULL;
839         ad->gridinfo.images_nocontents = NULL;
840         ad->gridinfo.edit_it = NULL;
841
842         return 0;
843 }
844
845 /* Update griditem size */
846 int _gl_grid_update_item_size(void *data, Evas_Object *view)
847 {
848         GL_CHECK_VAL(data, -1);
849         gl_appdata *ad = (gl_appdata *)data;
850         Evas_Object *_view = NULL;
851         int view_mode = gl_get_view_mode(ad);
852         gl_dbg("");
853
854         if (ad->gridinfo.thumbs_cnt <= GL_GRID_ITEM_ZOOM_LEVEL_02_CNT) {
855                 gl_dbgW("Thumbs count is less than 7!");
856                 return -1;
857         }
858
859         if (view) {
860                 _view = view;
861         } else {
862                 bool b_view = false;
863                 if (view_mode == GL_VIEW_THUMBS_EDIT) {
864                         b_view = true;
865                         _view = ad->gridinfo.edit_view;
866                 } else {
867                         b_view = gl_grid_get_view(ad, &_view);
868                 }
869
870                 if (!b_view || !_view) {
871                         gl_dbgE("gridview is invalid!");
872                         return -1;
873                 }
874         }
875
876         gl_grid_set_item_size(data, _view);
877
878         _gl_thumb_update_gengrid(_view);
879
880         return 0;
881 }
882
883 int _gl_grid_del_append_idler(void *data)
884 {
885         GL_CHECK_VAL(data, -1);
886         gl_appdata *ad = (gl_appdata *)data;
887
888         if (ad->gridinfo.grid_append_idler) {
889                 ecore_idler_del(ad->gridinfo.grid_append_idler);
890                 ad->gridinfo.grid_append_idler = NULL;
891         }
892
893         return 0;
894 }
895