[cbhm] License is changed to Flora License
[framework/uifw/cbhm.git] / src / clipdrawer.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
18 #include <utilX.h>
19 #include "clipdrawer.h"
20 #include "item_manager.h"
21 #include "xconverter.h"
22
23 #define EDJ_PATH "/usr/share/edje"
24 #define APP_EDJ_FILE EDJ_PATH"/cbhmdrawer.edj"
25 #define GRP_MAIN "cbhmdrawer"
26
27 #define ANIM_DURATION 30 // 1 seconds
28 #define ANIM_FLOPS (0.5/30)
29 #define DEFAULT_WIDTH 720
30 #define GRID_IMAGE_INNER 10
31
32 static Evas_Object *create_win(ClipdrawerData *cd, const char *name);
33 static Evas_Object *_grid_content_get(void *data, Evas_Object *obj, const char *part);
34 static void _grid_del(void *data, Evas_Object *obj);
35 static Eina_Bool clipdrawer_add_item(AppData *ad, CNP_ITEM *item);
36 static Eina_Bool clipdrawer_del_item(AppData *ad, CNP_ITEM *item);
37 static void clipdrawer_ly_clicked(void *data, Evas_Object *obj, const char *emission, const char *source);
38 static void _grid_item_ly_clicked(void *data, Evas_Object *obj, const char *emission, const char *source);
39 static void setting_win(Ecore_X_Display *x_disp, Ecore_X_Window x_main_win);
40 static void set_transient_for(Ecore_X_Window x_main_win, Ecore_X_Window x_active_win);
41 static void unset_transient_for(Ecore_X_Window x_main_win, Ecore_X_Window x_active_win);
42
43 static void _change_gengrid_paste_textonly_mode(ClipdrawerData *cd)
44 {
45         CNP_ITEM *item = NULL;
46
47         Elm_Object_Item *gitem = elm_gengrid_first_item_get(cd->gengrid);
48
49         while (gitem)
50         {
51                 item = elm_object_item_data_get(gitem);
52                 if ((item->type_index == ATOM_INDEX_IMAGE) && (item->layout))
53                 {
54                         if (cd->paste_text_only)
55                                 edje_object_signal_emit(elm_layout_edje_get(item->layout), "elm,state,show,dim", "elm");
56                         else
57                                 edje_object_signal_emit(elm_layout_edje_get(item->layout), "elm,state,hide,dim", "elm");
58                 }
59                 gitem = elm_gengrid_item_next_get(gitem);
60         }
61 }
62
63 void clipdrawer_paste_textonly_set(AppData *ad, Eina_Bool textonly)
64 {
65         ClipdrawerData *cd = ad->clipdrawer;
66         if (cd->paste_text_only != textonly)
67                 cd->paste_text_only = textonly;
68         DTRACE("paste textonly mode = %d\n", textonly);
69
70         _change_gengrid_paste_textonly_mode(cd);
71 }
72
73 Eina_Bool clipdrawer_paste_textonly_get(AppData *ad)
74 {
75         ClipdrawerData *cd = ad->clipdrawer;
76         return cd->paste_text_only;
77 }
78
79 static Evas_Object *_load_edj(Evas_Object* win, const char *file, const char *group)
80 {
81         Evas_Object *layout = elm_layout_add(win);
82         if (!layout)
83         {
84                 DMSG("ERROR: elm_layout_add return NULL\n");
85                 return NULL;
86         }
87
88         if (!elm_layout_file_set(layout, file, group))
89         {
90                 DMSG("ERROR: elm_layout_file_set return FALSE\n");
91                 evas_object_del(layout);
92                 return NULL;
93         }
94
95         evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
96         elm_win_resize_object_add(win, layout);
97
98         evas_object_show(layout);
99         return layout;
100 }
101
102 static Eina_Bool keydown_cb(void *data, int type, void *event)
103 {
104         AppData *ad = data;
105         Ecore_Event_Key *ev = event;
106         if (!strcmp(ev->keyname, KEY_END))
107                 clipdrawer_lower_view(ad);
108
109         return ECORE_CALLBACK_PASS_ON;
110 }
111
112 ClipdrawerData* init_clipdrawer(AppData *ad)
113 {
114         ClipdrawerData *cd = calloc(1, sizeof(ClipdrawerData));
115
116         /* create and setting window */
117         if (!cd)
118                 return NULL;
119         if (!(cd->main_win = create_win(cd, APPNAME)))
120         {
121                 free(cd);
122                 return NULL;
123         }
124         cd->x_main_win = elm_win_xwindow_get(cd->main_win);
125         setting_win(ad->x_disp, cd->x_main_win);
126
127         /* edj setting */
128         if (!(cd->main_layout = _load_edj(cd->main_win, APP_EDJ_FILE, GRP_MAIN)))
129         {
130                 evas_object_del(cd->main_win);
131                 free(cd);
132                 return NULL;
133         }
134
135         Evas_Object* ly = elm_layout_edje_get(cd->main_layout);
136         if (cd->root_w == DEFAULT_WIDTH)
137         {
138                 cd->height = atoi(edje_object_data_get(ly, "proxima_clipdrawer_height"));
139                 cd->landscape_height = atoi(edje_object_data_get(ly, "proxima_clipdrawer_landscape_height"));
140                 cd->grid_item_w = atoi(edje_object_data_get(ly, "proxima_grid_item_w"));
141                 cd->grid_item_h = atoi(edje_object_data_get(ly, "proxima_grid_item_h"));
142         }
143         else
144         {
145                 cd->height = atoi(edje_object_data_get(ly, "u1_clipdrawer_height"));
146                 cd->landscape_height = atoi(edje_object_data_get(ly, "u1_clipdrawer_landscape_height"));
147                 cd->grid_item_w = atoi(edje_object_data_get(ly, "u1_grid_item_w"));
148                 cd->grid_item_h = atoi(edje_object_data_get(ly, "u1_grid_item_h"));
149         }
150         printf("height: %d , land_height:%d\n", cd->height, cd->landscape_height);
151
152         /* create and setting gengrid */
153         elm_theme_extension_add(NULL, APP_EDJ_FILE);
154         edje_object_signal_callback_add(elm_layout_edje_get(cd->main_layout),
155                         "mouse,up,1", "*", clipdrawer_ly_clicked, ad);
156
157         elm_object_part_text_set(cd->main_layout, "panel_title", "Clipboard");
158         elm_object_part_text_set(cd->main_layout, "panel_function", "Done");
159
160         cd->gengrid = elm_gengrid_add(cd->main_win);
161         elm_object_part_content_set(cd->main_layout, "historyitems", cd->gengrid);
162         elm_gengrid_item_size_set(cd->gengrid, cd->grid_item_w, cd->grid_item_h);
163         elm_gengrid_align_set(cd->gengrid, 0.0, 0.0);
164         elm_gengrid_horizontal_set(cd->gengrid, EINA_TRUE);
165         elm_gengrid_bounce_set(cd->gengrid, EINA_TRUE, EINA_FALSE);
166         elm_gengrid_multi_select_set(cd->gengrid, EINA_FALSE);
167 //      evas_object_smart_callback_add(cd->gengrid, "selected", _grid_click_paste, ad);
168         evas_object_size_hint_weight_set(cd->gengrid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
169
170         elm_gengrid_clear(cd->gengrid);
171
172         cd->gic.item_style = "clipboard_photo_style";
173         cd->gic.func.text_get = NULL;
174         cd->gic.func.content_get = _grid_content_get;
175         cd->gic.func.state_get = NULL;
176         cd->gic.func.del = _grid_del;
177
178         evas_object_show(cd->gengrid);
179
180         ad->draw_item_add = clipdrawer_add_item;
181         ad->draw_item_del = clipdrawer_del_item;
182 //      ad->x_main_win = cd->x_main_win;
183
184         cd->keydown_handler = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, keydown_cb, ad);
185         cd->evas = evas_object_evas_get(cd->main_win);
186
187         delete_mode = EINA_FALSE;
188
189         return cd;
190 }
191
192 void depose_clipdrawer(ClipdrawerData *cd)
193 {
194         evas_object_del(cd->main_win);
195         if (cd->anim_timer)
196                 ecore_timer_del(cd->anim_timer);
197         if (cd->keydown_handler)
198                 ecore_event_handler_del(cd->keydown_handler);
199         free(cd);
200 }
201
202 static Eina_Bool clipdrawer_add_item(AppData *ad, CNP_ITEM *item)
203 {
204         ClipdrawerData *cd = ad->clipdrawer;
205         if (item->type_index == ATOM_INDEX_IMAGE)
206         {
207                 Elm_Object_Item *gitem = elm_gengrid_first_item_get(cd->gengrid);
208                 while (gitem)
209                 {
210                         CNP_ITEM *gitem_data = elm_object_item_data_get(gitem);
211                         gitem = elm_gengrid_item_next_get(gitem);
212                         if ((gitem_data->type_index == item->type_index) && (!strcmp(item->data, gitem_data->data)))
213                         {
214                                 DMSG("duplicated file path = %s\n", item->data);
215                                 item_delete_by_CNP_ITEM(ad, gitem_data);
216                         }
217                 }
218         }
219
220         item->gitem = elm_gengrid_item_prepend(cd->gengrid, &cd->gic, item, NULL, NULL);
221
222         return EINA_TRUE;
223 }
224
225 static Eina_Bool clipdrawer_del_item(AppData *ad, CNP_ITEM *item)
226 {
227         if (item->gitem)
228                 elm_object_item_del(item->gitem);
229         return EINA_TRUE;
230 }
231
232 static void _grid_del(void *data, Evas_Object *obj)
233 {
234         CNP_ITEM *item = data;
235         item->gitem = NULL;
236         item->layout = NULL;
237 }
238
239 static Evas_Object *_grid_content_get(void *data, Evas_Object *obj, const char *part)
240 {
241         CNP_ITEM *item = data;
242         AppData *ad = item->ad;
243         ClipdrawerData *cd = ad->clipdrawer;
244
245         if (item->type_index == ATOM_INDEX_IMAGE && !strcmp(part, "elm.swallow.icon")) /* text/uri */
246         {
247                 int w, h, iw, ih;
248
249                 Evas_Object *layout = elm_layout_add(obj);
250                 elm_layout_theme_set(layout, "gengrid", "item", "clipboard_style");
251                 edje_object_signal_callback_add(elm_layout_edje_get(layout),
252                                 "mouse,up,1", "*", _grid_item_ly_clicked, data);
253
254
255                 Evas_Object *sicon;
256                 int grid_image_real_w;
257                 int grid_image_real_h;
258                 grid_image_real_w = cd->grid_item_w - (2*GRID_IMAGE_INNER);
259                 grid_image_real_h = cd->grid_item_h - (2*GRID_IMAGE_INNER);
260                 sicon = evas_object_image_add(evas_object_evas_get(obj));
261                 evas_object_image_load_size_set(sicon, grid_image_real_w, grid_image_real_h);
262                 evas_object_image_file_set(sicon, item->data, NULL);
263                 evas_object_image_size_get(sicon, &w, &h);
264
265                 if (w > grid_image_real_w || h > grid_image_real_h)
266                 {
267                         if (w >= h)
268                         {
269                                 iw = grid_image_real_w;
270                                 ih = (float)grid_image_real_w / w * h;
271                         }
272                         else
273                         {
274                                 iw = (float)grid_image_real_h / h * w;
275                                 ih = grid_image_real_h;
276                         }
277                 }
278                 else
279                 {
280                         iw = w;
281                         ih = h;
282                 }
283
284                 evas_object_image_fill_set(sicon, 0, 0, iw, ih);
285                 evas_object_resize(sicon, iw, ih);
286                 evas_object_size_hint_min_set(sicon, iw, ih);
287                 elm_object_part_content_set(layout, "elm.swallow.icon", sicon);
288
289                 if (cd->paste_text_only)
290                         edje_object_signal_emit(elm_layout_edje_get(layout), "elm,state,show,dim", "elm");
291                 else
292                         edje_object_signal_emit(elm_layout_edje_get(layout), "elm,state,hide,dim", "elm");
293
294                 item->layout = layout;
295         }
296         else if (item->type_index != ATOM_INDEX_IMAGE && !strcmp(part, "elm.swallow.entry")) /* text/uri */
297         {
298                 Evas_Object *layout = elm_layout_add(obj);
299                 elm_layout_theme_set(layout, "gengrid", "widestyle", "horizontal_layout");
300                 edje_object_signal_callback_add(elm_layout_edje_get(layout), 
301                                 "mouse,up,1", "*", _grid_item_ly_clicked, data);
302                 Evas_Object *rect = evas_object_rectangle_add(evas_object_evas_get(obj));
303                 evas_object_resize(rect, cd->grid_item_w, cd->grid_item_h);
304                 evas_object_color_set(rect, 237, 233, 208, 255);
305                 evas_object_show(rect);
306                 elm_object_part_content_set(layout, "elm.swallow.icon", rect);
307
308                 Evas_Object *ientry = elm_entry_add(obj);
309                 evas_object_size_hint_weight_set(ientry, 0, 0);
310                 elm_entry_scrollable_set(ientry, EINA_TRUE);
311
312                 char *entry_text = string_for_entry_get(ad, item->type_index, item->data);
313                 if (entry_text)
314                 {
315                         elm_object_part_text_set(ientry, NULL, entry_text);
316                         free(entry_text);
317                 }
318                 else
319                 {
320                         elm_object_part_text_set(ientry, NULL, item->data);
321                 }
322                 elm_entry_editable_set(ientry, EINA_FALSE);
323                 elm_entry_context_menu_disabled_set(ientry, EINA_TRUE);
324                 evas_object_show(ientry);
325                 elm_object_part_content_set(layout, "elm.swallow.inner", ientry);
326
327                 item->layout = layout;
328         }
329         else
330                 return NULL;
331
332         if (delete_mode)
333                 edje_object_signal_emit(elm_layout_edje_get(item->layout), "elm,state,show,delbtn", "elm");
334         else
335                 edje_object_signal_emit(elm_layout_edje_get(item->layout), "elm,state,hide,delbtn", "elm");
336
337         return item->layout;
338 }
339
340 static void clipdrawer_ly_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
341 {
342         AppData *ad = data;
343
344         if (ad->clipdrawer->anim_status != STATUS_NONE)
345                 return;
346
347 #define EDJE_CLOSE_PART_PREFIX "background/title/close"
348 #define EDJE_DELETE_MODE_PREFIX "background/title/delete"
349         if (!strncmp(source, EDJE_CLOSE_PART_PREFIX, strlen(EDJE_CLOSE_PART_PREFIX)))
350         {
351                 clipdrawer_lower_view(ad);
352         }
353         else if (!strncmp(source, EDJE_DELETE_MODE_PREFIX, strlen(EDJE_DELETE_MODE_PREFIX)))
354         {
355                 _delete_mode_set(ad, !delete_mode);
356         }
357
358 }
359
360 static void _grid_item_ly_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
361 {
362         CNP_ITEM *item = data;
363         AppData *ad = item->ad;
364         ClipdrawerData *cd = ad->clipdrawer;
365
366         if (cd->anim_status != STATUS_NONE)
367                 return;
368
369         Elm_Object_Item *sgobj = NULL;
370         sgobj = elm_gengrid_selected_item_get(cd->gengrid);
371         item = elm_object_item_data_get(sgobj);
372
373         if (!sgobj || !item)
374         {
375                 DTRACE("ERR: cbhm can't get the selected item\n");
376                 return;
377         }
378
379         #define EDJE_DELBTN_PART_PREFIX "delbtn"
380         if (strncmp(source, EDJE_DELBTN_PART_PREFIX, strlen(EDJE_DELBTN_PART_PREFIX)))
381         {
382                 elm_gengrid_item_selected_set(sgobj, EINA_FALSE);
383
384                 if (delete_mode)
385                         return;
386
387                 if (item->type_index != ATOM_INDEX_IMAGE || !cd->paste_text_only)
388                 {
389                         set_selection_owner(ad, ECORE_X_SELECTION_SECONDARY, item);
390                 }
391         }
392         else
393         {
394                 elm_gengrid_item_selected_set(sgobj, EINA_FALSE);
395
396                 item_delete_by_CNP_ITEM(ad, item);
397         }
398 }
399
400 void set_transient_for(Ecore_X_Window x_main_win, Ecore_X_Window x_active_win)
401 {
402         ecore_x_icccm_transient_for_set(x_main_win, x_active_win);
403         ecore_x_event_mask_set(x_active_win,
404                                 ECORE_X_EVENT_MASK_WINDOW_PROPERTY | ECORE_X_EVENT_MASK_WINDOW_CONFIGURE);
405 }
406
407 void unset_transient_for(Ecore_X_Window x_main_win, Ecore_X_Window x_active_win)
408 {
409         ecore_x_event_mask_unset(x_active_win,
410                         ECORE_X_EVENT_MASK_WINDOW_PROPERTY | ECORE_X_EVENT_MASK_WINDOW_CONFIGURE);
411         ecore_x_icccm_transient_for_unset(x_main_win);
412 }
413
414 static void set_focus_for_app_window(Ecore_X_Window x_main_win, Eina_Bool enable)
415 {
416         CALLED();
417         Eina_Bool accepts_focus;
418         Ecore_X_Window_State_Hint initial_state;
419         Ecore_X_Pixmap icon_pixmap;
420         Ecore_X_Pixmap icon_mask;
421         Ecore_X_Window icon_window;
422         Ecore_X_Window window_group;
423         Eina_Bool is_urgent;
424
425         ecore_x_icccm_hints_get (x_main_win,
426                         &accepts_focus, &initial_state, &icon_pixmap, &icon_mask, &icon_window, &window_group, &is_urgent);
427         ecore_x_icccm_hints_set (x_main_win,
428                         enable, initial_state, icon_pixmap, icon_mask, icon_window, window_group, is_urgent);
429         DMSG("set focus mode = %d\n", enable);
430 }
431
432 void setting_win(Ecore_X_Display *x_disp, Ecore_X_Window x_main_win)
433 {
434         CALLED();
435         // disable window effect
436         utilx_set_window_effect_state(x_disp, x_main_win, 0);
437
438         ecore_x_icccm_name_class_set(x_main_win, "NORMAL_WINDOW", "NORMAL_WINDOW");
439
440         set_focus_for_app_window(x_main_win, EINA_FALSE);
441
442 }
443
444 Evas_Object *create_win(ClipdrawerData *cd, const char *name)
445 {
446         CALLED();
447
448         Evas_Object *win = elm_win_add(NULL, name, ELM_WIN_BASIC);
449         if (!win)
450         {
451                 DMSG("ERROR: elm_win_add return NULL\n");
452                 return NULL;
453         }
454         elm_win_title_set(win, name);
455         elm_win_borderless_set(win, EINA_TRUE);
456         ecore_x_window_size_get(ecore_x_window_root_first_get(), &cd->root_w, &cd->root_h);
457         DMSG("root_w: %d, root_h: %d\n", cd->root_w, cd->root_h);
458         evas_object_resize(win, cd->root_w, cd->root_h);
459
460         elm_scale_set((double)cd->root_w/DEFAULT_WIDTH);
461         return win;
462 }
463
464 static void set_sliding_win_geometry(ClipdrawerData *cd)
465 {
466         CALLED();
467         Ecore_X_Window zone;
468         Evas_Coord x, y, w, h;
469         zone = ecore_x_e_illume_zone_get(cd->x_main_win);
470         DTRACE(" zone:%x\n", zone);
471
472         if (cd->o_degree == 90 || cd->o_degree == 270)
473         {
474                 h = cd->anim_count * cd->landscape_height / ANIM_DURATION;
475                 x = 0;
476                 y = cd->root_w - h;
477                 w = cd->root_h;
478         }
479         else
480         {
481                 h = cd->anim_count * cd->height / ANIM_DURATION;
482                 x = 0;
483                 y = cd->root_h - h;
484                 w = cd->root_w;
485         }
486
487         if (!h)
488                 w = 0;
489
490         DTRACE("[CBHM] change degree geometry... (%d, %d, %d x %d)\n", x, y, w, h);
491         int clipboard_state;
492         if (cd->anim_count)
493                 clipboard_state = ECORE_X_ILLUME_CLIPBOARD_STATE_ON;
494         else
495                 clipboard_state = ECORE_X_ILLUME_CLIPBOARD_STATE_OFF;
496         ecore_x_e_illume_clipboard_geometry_set(zone, x, y, w, h);
497         ecore_x_e_illume_clipboard_state_set(zone, clipboard_state);
498 }
499
500 void set_rotation_to_clipdrawer(ClipdrawerData *cd)
501 {
502         CALLED();
503         int angle = cd->o_degree;
504         int x, y, w, h;
505
506         if (angle == 180) // reverse
507         {
508                 h = cd->height;
509                 x = 0;
510                 y = 0;
511                 w = cd->root_w;
512         }
513         else if (angle == 90) // right rotate
514         {
515                 h = cd->landscape_height;
516                 x = cd->root_w - h;
517                 y = 0;
518                 w = cd->root_h;
519         }
520         else if (angle == 270) // left rotate
521         {
522                 h = cd->landscape_height;
523                 x = 0;
524                 y = 0;
525                 w = cd->root_h;
526         }
527         else // angle == 0
528         {
529                 h = cd->height;
530                 x = 0;
531                 y = cd->root_h - h;
532                 w = cd->root_w;
533         }
534
535         evas_object_resize(cd->main_win, w, h);
536         evas_object_move(cd->main_win, x, y);
537         if (cd->anim_count == ANIM_DURATION)
538                 set_sliding_win_geometry(cd);
539 }
540
541 static Eina_Bool _get_anim_pos(ClipdrawerData *cd, int *sp, int *ep)
542 {
543         if (!sp || !ep)
544                 return EINA_FALSE;
545
546         int angle = cd->o_degree;
547         int anim_start, anim_end;
548
549         if (angle == 180) // reverse
550         {
551                 anim_start = -(cd->root_h - cd->height);
552                 anim_end = 0;
553         }
554         else if (angle == 90) // right rotate
555         {
556                 anim_start = cd->root_w;
557                 anim_end = anim_start - cd->landscape_height;
558         }
559         else if (angle == 270) // left rotate
560         {
561                 anim_start = -(cd->root_w - cd->landscape_height);
562                 anim_end = 0;
563         }
564         else // angle == 0
565         {
566                 anim_start = cd->root_h;
567                 anim_end = anim_start - cd->height;
568         }
569
570         *sp = anim_start;
571         *ep = anim_end;
572         return EINA_TRUE;
573 }
574
575 static Eina_Bool _do_anim_delta_pos(ClipdrawerData *cd, int sp, int ep, int ac, int *dp)
576 {
577         if (!dp)
578                 return EINA_FALSE;
579
580         int angle = cd->o_degree;
581         int delta;
582         double posprop;
583         posprop = 1.0*ac/ANIM_DURATION;
584
585         if (angle == 180) // reverse
586         {
587                 delta = (int)((ep-sp)*posprop);
588                 evas_object_move(cd->main_win, 0, sp+delta);
589         }
590         else if (angle == 90) // right rotate
591         {
592                 delta = (int)((ep-sp)*posprop);
593                 evas_object_move(cd->main_win, sp+delta, 0);
594         }
595         else if (angle == 270) // left rotate
596         {
597                 delta = (int)((ep-sp)*posprop);
598                 evas_object_move(cd->main_win, sp+delta, 0);
599         }
600         else // angle == 0
601         {
602                 delta = (int)((sp-ep)*posprop);
603                 evas_object_move(cd->main_win, 0, sp-delta);
604         }
605         
606         *dp = delta;
607
608         return EINA_TRUE;
609 }
610
611 static void stop_animation(AppData *ad)
612 {
613         CALLED();
614         ClipdrawerData *cd = ad->clipdrawer;
615         cd->anim_status = STATUS_NONE;
616         if (cd->anim_timer)
617         {
618                 ecore_timer_del(cd->anim_timer);
619                 cd->anim_timer = NULL;
620         }
621
622         set_sliding_win_geometry(cd);
623 }
624
625 static Eina_Bool anim_pos_calc_cb(void *data)
626 {
627         AppData *ad = data;
628         ClipdrawerData *cd = ad->clipdrawer;
629         int anim_start, anim_end, delta;
630
631         _get_anim_pos(cd, &anim_start, &anim_end);
632
633         if (cd->anim_status == SHOW_ANIM)
634         {
635                 if (cd->anim_count > ANIM_DURATION)
636                 {
637                         cd->anim_count = ANIM_DURATION;
638                         stop_animation(ad);
639                         return EINA_FALSE;
640                 }
641                 _do_anim_delta_pos(cd, anim_start, anim_end, cd->anim_count, &delta);
642                 if (cd->anim_count == 1)
643                         evas_object_show(cd->main_win);
644                 cd->anim_count++;
645         }
646         else if (cd->anim_status == HIDE_ANIM)
647         {
648                 if (cd->anim_count < 0)
649                 {
650                         cd->anim_count = 0;
651                         evas_object_hide(cd->main_win);
652                         elm_win_lower(cd->main_win);
653                         unset_transient_for(cd->x_main_win, ad->x_active_win);
654                         stop_animation(ad);
655                         _delete_mode_set(ad, EINA_FALSE);
656                         return EINA_FALSE;
657                 }
658                 _do_anim_delta_pos(cd, anim_start, anim_end, cd->anim_count, &delta);
659                 cd->anim_count--;
660         }
661         else
662         {
663                 stop_animation(ad);
664                 return EINA_FALSE;
665         }
666
667         return EINA_TRUE;
668 }
669
670 static Eina_Bool clipdrawer_anim_effect(AppData *ad, AnimStatus atype)
671 {
672         CALLED();
673         ClipdrawerData *cd = ad->clipdrawer;
674         if (atype == cd->anim_status)
675         {
676                 DTRACE("Warning: Animation effect is already in progress. \n");
677                 return EINA_FALSE;
678         }
679
680         cd->anim_status = atype;
681
682         if (cd->anim_timer)
683                 ecore_timer_del(cd->anim_timer);
684         cd->anim_timer = ecore_timer_add(ANIM_FLOPS, anim_pos_calc_cb, ad);
685
686         return EINA_TRUE;
687 }
688
689 void clipdrawer_activate_view(AppData* ad)
690 {
691         CALLED();
692         ClipdrawerData *cd = ad->clipdrawer;
693         if (cd->main_win)
694         {
695                 set_focus_for_app_window(cd->x_main_win, EINA_TRUE);
696                 set_transient_for(cd->x_main_win, ad->x_active_win);
697                 cd->o_degree = get_active_window_degree(ad->x_active_win);
698                 elm_win_rotation_set(cd->main_win, cd->o_degree);
699                 set_rotation_to_clipdrawer(cd);
700                 evas_object_show(cd->main_win);
701                 elm_win_activate(cd->main_win);
702                 clipdrawer_anim_effect(ad, SHOW_ANIM);
703         }
704 }
705
706 void clipdrawer_lower_view(AppData* ad)
707 {
708         CALLED();
709         ClipdrawerData *cd = ad->clipdrawer;
710         if (cd->main_win && cd->anim_count)
711         {
712                 set_focus_for_app_window(cd->x_main_win, EINA_FALSE);
713         //      if (clipdrawer_anim_effect(ad, HIDE_ANIM))
714         //              ad->windowshow = EINA_FALSE;
715                 clipdrawer_anim_effect(ad, HIDE_ANIM);
716         }
717 }
718
719 void _delete_mode_set(AppData* ad, Eina_Bool del_mode)
720 {
721         ClipdrawerData *cd = ad->clipdrawer;
722         CNP_ITEM *item = NULL;
723
724         delete_mode = del_mode;
725         if (del_mode)
726         {
727                 edje_object_signal_emit(elm_layout_edje_get(cd->main_layout), "elm,state,show,function", "elm");
728                 edje_object_signal_emit(elm_layout_edje_get(cd->main_layout), "elm,state,hide,delmode", "elm");
729         }
730         else
731         {
732                 edje_object_signal_emit(elm_layout_edje_get(cd->main_layout), "elm,state,hide,function", "elm");
733                 edje_object_signal_emit(elm_layout_edje_get(cd->main_layout), "elm,state,show,delmode", "elm");
734         }
735
736         Elm_Object_Item *gitem = elm_gengrid_first_item_get(cd->gengrid);
737         while (gitem)
738         {
739                 item = elm_object_item_data_get(gitem);
740                 if (del_mode)
741                         edje_object_signal_emit(elm_layout_edje_get(item->layout), "elm,state,show,delbtn", "elm");
742                 else
743                         edje_object_signal_emit(elm_layout_edje_get(item->layout), "elm,state,hide,delbtn", "elm");
744
745                 gitem = elm_gengrid_item_next_get(gitem);
746         }
747 }