bugfix: sometimes image shown when textonly setted & dim move from evas_rect(c) to...
[framework/uifw/cbhm.git] / src / clipdrawer.c
index 65ff0ee..68911ab 100644 (file)
@@ -12,15 +12,19 @@ static const char *g_images_path[] = {
 #define N_IMAGES (1)
 
 #define GRID_ITEM_SPACE_W 6
-#define GRID_ITEM_SINGLE_W 187
-#define GRID_ITEM_SINGLE_H 151
+#define GRID_ITEM_SINGLE_W 185
+#define GRID_ITEM_SINGLE_H 161
 #define GRID_ITEM_W (GRID_ITEM_SINGLE_W+(GRID_ITEM_SPACE_W*2))
 #define GRID_ITEM_H (GRID_ITEM_SINGLE_H)
 #define GRID_IMAGE_LIMIT_W 91
 #define GRID_IMAGE_LIMIT_H 113
 
+#define ANIM_DURATION 30 // 1 seconds
+#define ANIM_FLOPS (0.5/30)
+
 // gic should live at gengrid callback functions
 Elm_Gengrid_Item_Class gic;
+static Ecore_Timer *anim_timer = NULL;
 
 typedef struct tag_griditem
 {
@@ -32,38 +36,131 @@ typedef struct tag_griditem
        Evas_Object *ilayout;
 } griditem_t;
 
+const char *
+remove_tags(const char *p)
+{
+   char *q,*ret;
+   int i;
+   if (!p) return NULL;
+
+   q = malloc(strlen(p) + 1);
+   if (!q) return NULL;
+   ret = q;
+
+   while (*p)
+     {
+        if ((*p != '<')) *q++ = *p++;
+        else if (*p == '<')
+          {
+             if ((p[1] == 'b') && (p[2] == 'r') &&
+                 ((p[3] == ' ') || (p[3] == '/') || (p[3] == '>')))
+               *q++ = '\n';
+             while ((*p) && (*p != '>')) p++;
+             p++;
+          }
+     }
+   *q = 0;
+
+   return ret;
+}
 
-int clipdrawer_update_contents(void *data)
+const char* clipdrawer_get_plain_string_from_escaped(char *escstr)
 {
-       struct appdata *ad = data;
-       int i, pos;
-       char *unesc = NULL;
+       /* NOTE : return string should be freed */
+       return remove_tags(escstr);
+}
 
-       for (i = 0; i < HISTORY_QUEUE_MAX_ITEMS; i++)
+static char* _get_string_for_entry(char *str)
+{
+       if (!str)
+               return NULL;
+
+       Eina_Strbuf *strbuf = eina_strbuf_new();
+       if (!strbuf)
+               return strdup(str);
+       eina_strbuf_prepend(strbuf, "<font_size=18>");
+
+       char *trail = str;
+
+       while (trail && *trail)
        {
-               pos = get_current_history_position() - i;
-               if (pos < 0)
-                       pos = pos+HISTORY_QUEUE_MAX_ITEMS;
+               char *pretrail = trail;
+               unsigned long length;
+               char *temp;
+               char *endtag;
 
-               if (get_item_contents_by_pos(pos) != NULL && strlen(get_item_contents_by_pos(pos)) > 0)
+               trail = strchr(trail, '<');
+               if (!trail)
                {
-                       unesc = clipdrawer_get_plain_string_from_escaped(get_item_contents_by_pos(pos));
-                       unesc = unesc ? unesc : "";
-                       elm_list_item_append(ad->txtlist, unesc, NULL, NULL, NULL, ad);
-                       free(unesc);
+                       eina_strbuf_append(strbuf, pretrail);
+                       break;
                }
-       }
+               endtag = strchr(trail, '>');
+               if (!endtag)
+                       break;
 
-       /* FIXME : sometimes when list update, screen isn't updated */
+               length = trail - pretrail;
 
-       return 0;
-}
+               temp = strndup(pretrail, length);
+               if (!temp)
+               {
+                       trail++;
+                       continue;
+               }
 
-const char* clipdrawer_get_plain_string_from_escaped(char *escstr)
-{
-       /* TODO : is it should be here? besides, remove dependency for entry */
-       /* NOTE : return string should be freed */
-       return elm_entry_markup_to_utf8(escstr);
+               DTRACE("temp str: %s \n", temp);
+               eina_strbuf_append(strbuf, temp);
+               free(temp);
+               trail++;
+
+               if (trail[0] == '/')
+               {
+                       trail = endtag + 1;
+                       continue;
+               }
+
+               if (strncmp(trail, "br", 2) == 0)
+               {
+                       eina_strbuf_append(strbuf, "<br>");
+                       trail = endtag + 1;
+                       continue;
+               }
+
+               if (strncmp(trail, "img", 3) == 0)
+               {
+                       char *src = strstr(trail, "file://");
+                       char *src_endtag = strchr(trail, '>');
+                       if (!src || !src_endtag || src_endtag < src)
+                               continue;
+
+                       length = src_endtag - src;
+
+                       src = strndup(src, length);
+                       if (!src)
+                       {
+                               trail = endtag + 1;
+                               continue;
+                       }
+                       temp = src;
+                       while(*temp)
+                       {
+                               if (*temp == '\"' || *temp == '>')
+                                       *temp = '\0';
+                               else
+                                       temp++;
+                       }
+
+                       eina_strbuf_append_printf(strbuf, "<item absize=66x62 href=%s></item>", src);
+                       DTRACE("src str: %s \n", src);
+                       free(src);
+               }
+               trail = endtag + 1;
+       }
+
+       char *ret = eina_strbuf_string_steal(strbuf);
+       eina_strbuf_free(strbuf);
+       DTRACE("result str: %s \n", ret);
+       return ret;
 }
 
 static void _grid_del_response_cb(void *data, Evas_Object *obj, void *event_info)
@@ -72,7 +169,23 @@ static void _grid_del_response_cb(void *data, Evas_Object *obj, void *event_info
        evas_object_del(obj);
 
        if((int)event_info == ELM_POPUP_RESPONSE_OK)
+       {
+               struct appdata *ad = g_get_main_appdata();
                elm_gengrid_item_del(it);
+               ad->hicount--;
+               if (ad->hicount < 0)
+               {
+                       int cnt = 0;
+                       Elm_Gengrid_Item *trail = elm_gengrid_first_item_get(ad->hig);
+                       while(trail)
+                       {
+                               cnt++;
+                               elm_gengrid_item_next_get(trail);
+                       }
+                       ad->hicount = cnt;
+                       DTRACE("ERR: cbhm history cnt < 0, gengrid item cnt: %d\n", cnt);
+               }
+       }
 }
 
 static void _grid_click_delete(void *data, Evas_Object *obj, void *event_info)
@@ -85,6 +198,9 @@ _grid_item_ly_clicked(void *data, Evas_Object *obj, const char *emission, const
 {
        struct appdata *ad = g_get_main_appdata();
 
+       if (ad->anim_status != STATUS_NONE)
+               return;
+
        Elm_Gengrid_Item *sgobj = NULL;
        sgobj = elm_gengrid_selected_item_get(ad->hig);
        griditem_t *ti = NULL;
@@ -105,7 +221,7 @@ _grid_item_ly_clicked(void *data, Evas_Object *obj, const char *emission, const
                {
                        char *p = strdup(eina_strbuf_string_get(ti->istrdata));
 
-                       elm_selection_set(1, obj, /*ELM_SEL_FORMAT_TEXT*/1, p);
+                       elm_selection_set(1, ad->hig, /*ELM_SEL_FORMAT_HTML*/0x10, p);
                }
                else //if (ti->itype == GI_IMAGE)
                {
@@ -115,14 +231,13 @@ _grid_item_ly_clicked(void *data, Evas_Object *obj, const char *emission, const
                                char *p = malloc(len + 10);
                                snprintf(p,len+10, "file:///%s", ti->ipathdata);
 
-                               elm_selection_set(/*secondary*/1,obj,/*ELM_SEL_FORMAT_IMAGE*/4,p);
+                               elm_selection_set(/*secondary*/1, ad->hig,/*ELM_SEL_FORMAT_IMAGE*/4,p);
                        }
                        else
                        {
                                DTRACE("ERR: cbhm image paste mode is false\n");
                        }
                }
-
                return;
        }
 
@@ -165,7 +280,7 @@ Evas_Object* _grid_icon_get(const void *data, Evas_Object *obj, const char *part
                        elm_layout_content_set(layout, "elm.swallow.icon", rect);
 
                        // FIXME: add string length check
-                       Evas_Object *ientry = elm_scrolled_entry_add(obj);
+                       Evas_Object *ientry = elm_entry_add(obj);
                        evas_object_size_hint_weight_set(ientry, 0, 0);
                        Eina_Strbuf *strent = NULL;
                        char *strdata = eina_strbuf_string_get(ti->istrdata);
@@ -193,14 +308,19 @@ Evas_Object* _grid_icon_get(const void *data, Evas_Object *obj, const char *part
                                        break;
                        }
                        eina_strbuf_append_n(strent, strdata, i);
-//                     eina_strbuf_append(strent, strdata);
                        eina_strbuf_replace_all(strent, " absize=240x180 ", " absize=52x39 ");
                        if (strcnt > 100)
                                eina_strbuf_append(strent, "...");
-
-                       elm_scrolled_entry_entry_set(ientry, eina_strbuf_string_get(strent));
-                       elm_scrolled_entry_editable_set(ientry, EINA_FALSE);
-                       elm_scrolled_entry_context_menu_disabled_set(ientry, EINA_TRUE);
+                       elm_entry_scrollable_set(ientry, EINA_TRUE);
+                       char *entry_text = eina_strbuf_string_get(strent);
+                       entry_text = _get_string_for_entry(entry_text);
+                       if (entry_text)
+                       {
+                               elm_object_text_part_set(ientry, NULL, entry_text);
+                               free(entry_text);
+                       }
+                       elm_entry_editable_set(ientry, EINA_FALSE);
+                       elm_entry_context_menu_disabled_set(ientry, EINA_TRUE);
                        evas_object_show(ientry);
                        elm_layout_content_set(layout, "elm.swallow.inner", ientry);
 
@@ -225,104 +345,34 @@ Evas_Object* _grid_icon_get(const void *data, Evas_Object *obj, const char *part
 
                        struct appdata *ad = g_get_main_appdata();
                        
-                       if (!clipdrawer_paste_textonly_get(ad))
-                       {
-                               edje_object_signal_emit(elm_layout_edje_get(layout), "elm,state,hide,delbtn", "elm");
-                               Evas_Object *rect = evas_object_rectangle_add(evas_object_evas_get(obj));
-                               evas_object_color_set(rect, 0, 0, 0, 200);
-                               evas_object_show(rect);
-                               elm_layout_content_set(layout, "elm.swallow.cover", rect);
-                       }
+                       if (clipdrawer_paste_textonly_get(ad))
+                               edje_object_signal_emit(elm_layout_edje_get(layout), "elm,state,show,dim", "elm");
+                       else
+                               edje_object_signal_emit(elm_layout_edje_get(layout), "elm,state,hide,dim", "elm");
 
                        ti->ilayout = layout;
                        return layout;
-
-/*
-                       Evas_Object *icon = elm_icon_add(obj);
-                       elm_icon_file_set(icon, ti->ipathdata, NULL);
-                       evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
-                       evas_object_show(icon);
-*/
-
-/*
-                       Ecore_Evas *my_ee;
-                       Evas *my_e;
-                       Evas_Object *fgimg;
-                       Evas_Object *bgrect;
-                       Evas_Object *delbtn;
-                       Evas_Object *icon;
-                       my_ee = ecore_evas_buffer_new(GRID_ITEM_SINGLE_W, GRID_ITEM_SINGLE_H);
-                       my_e = ecore_evas_get(my_ee);
-
-                       bgrect = evas_object_rectangle_add(my_e);
-                       evas_object_color_set(bgrect, 255, 255, 255, 255);
-                       evas_object_resize(bgrect, GRID_ITEM_SINGLE_W, GRID_ITEM_SINGLE_H);
-                       evas_object_move(bgrect, 0, 0);
-                       evas_object_show(bgrect);
-
-#define BORDER_SIZE 1
-                       fgimg = evas_object_image_add(my_e);
-                       evas_object_image_load_size_set(fgimg, GRID_ITEM_SINGLE_W-BORDER_SIZE*2, GRID_ITEM_SINGLE_H-BORDER_SIZE*2);
-                       evas_object_image_file_set(fgimg, ti->ipathdata, NULL);
-                       evas_object_image_fill_set(fgimg, 0, 0, GRID_ITEM_SINGLE_W-BORDER_SIZE*2, GRID_ITEM_SINGLE_H-BORDER_SIZE*2);
-                       evas_object_image_filled_set(fgimg, 1);
-                       int x,y;
-                       evas_object_image_size_get(fgimg, &x, &y);
-                       //fprintf(stderr, "## img x = %d, y = %d\n", x, y);
-                       evas_object_resize(fgimg, GRID_ITEM_SINGLE_W-BORDER_SIZE*2, GRID_ITEM_SINGLE_H-BORDER_SIZE*2);
-                       evas_object_move(fgimg, BORDER_SIZE, BORDER_SIZE);
-                       evas_object_show(fgimg);
-
-                       icon = evas_object_image_add(evas_object_evas_get(obj));
-
-                       evas_object_image_data_set(icon, NULL);
-                       evas_object_image_size_set(icon, GRID_ITEM_SINGLE_W, GRID_ITEM_SINGLE_H);
-                       evas_object_image_fill_set(icon, 0, 0, GRID_ITEM_SINGLE_W, GRID_ITEM_SINGLE_H);
-                       evas_object_image_filled_set(icon, EINA_TRUE);
-                       evas_object_image_data_copy_set(icon, (int *)ecore_evas_buffer_pixels_get(my_ee));
-                       evas_object_image_data_update_add(icon, 0, 0, GRID_ITEM_SINGLE_W, GRID_ITEM_SINGLE_H);
-
-                       evas_object_del(bgrect);
-                       evas_object_del(fgimg);
-                       ecore_evas_free(my_ee);
-
-                       return icon;
-*/
                }
-
-//             return icon;
        }
-/*
-       else if (!strcmp(part, "elm.swallow.end"))
-       {
-               ti->delbtn = elm_check_add(obj);
-               elm_object_style_set(ti->delbtn, "extended/itemcheck");
-               //evas_object_propagate_events_set(ti->delbtn, 0);
-               elm_check_state_set(ti->delbtn, tcm);
-               evas_object_smart_callback_add(ti->delbtn, "changed", _grid_item_check_changed, data);
-               evas_object_show(ti->delbtn);
-               return ti->delbtn;
-       }
-*/
-          
+
        return NULL;
 }
 
 static void _grid_longpress(void *data, Evas_Object *obj, void *event_info)
 {
        struct appdata *ad = data;
-       clipdrawer_change_mode(ad);
 }
 
 static void _grid_click_paste(void *data, Evas_Object *obj, void *event_info)
 {
        struct appdata *ad = data;
+       if (ad->anim_status != STATUS_NONE)
+               return;
+
        Elm_Gengrid_Item *sgobj = NULL;
        sgobj = elm_gengrid_selected_item_get(ad->hig);
        griditem_t *ti = NULL;
        ti = elm_gengrid_item_data_get(sgobj);
-
-       fprintf(stderr, "## grid_click_paste = 0x%x\n", event_info);
 }
 
 void _grid_del(const void *data, Evas_Object *obj)
@@ -335,6 +385,36 @@ void _grid_del(const void *data, Evas_Object *obj)
        free(ti);
 }
 
+char* clipdrawer_get_item_data(void *data, int pos)
+{
+       struct appdata *ad = data;
+       griditem_t *ti = NULL;
+       griditem_t *newgi = NULL;
+       int count = 0;
+
+       if (pos < 0 || pos > ad->hicount)
+               return NULL;
+
+       Elm_Gengrid_Item *item = elm_gengrid_first_item_get(ad->hig);
+       while (item)
+       {
+               ti = elm_gengrid_item_data_get(item);
+               if (count == pos)
+               {
+                       if (!ti)
+                               break;
+                       if (ti->itype == GI_TEXT)
+                               return (char*)eina_strbuf_string_get(ti->istrdata);
+                       else
+                               return ti->ipathdata;
+               }
+               count++;
+               item = elm_gengrid_item_next_get(item);
+       }
+
+       return NULL;
+}
+
 // FIXME: how to remove calling g_get_main_appdata()? 
 //        it's mainly used at 'clipdrawer_image_item'
 int clipdrawer_add_item(char *idata, int type)
@@ -362,7 +442,7 @@ int clipdrawer_add_item(char *idata, int type)
                        return -1;
                }
 
-               while (item)    
+               while (item)
                {
                        ti = elm_gengrid_item_data_get(item);
                        if ((ti->itype == type) && !strcmp(ti->ipathdata, idata))
@@ -370,9 +450,8 @@ int clipdrawer_add_item(char *idata, int type)
                                DTRACE("Error : duplicated file path = %s\n", idata);
                                return -1;
                        }
-                       item = elm_gengrid_item_next_get(item);      
+                       item = elm_gengrid_item_next_get(item);
                }
-
                newgi->ipathdata = eina_stringshare_add(idata);
        }
 
@@ -394,6 +473,9 @@ clipdrawer_ly_clicked(void *data, Evas_Object *obj, const char *emission, const
 {
        struct appdata *ad = data;
 
+       if (ad->anim_status != STATUS_NONE)
+               return;
+
        #define EDJE_CLOSE_PART_PREFIX "background/close"
        if (!strncmp(source, EDJE_CLOSE_PART_PREFIX, strlen(EDJE_CLOSE_PART_PREFIX)))
        {
@@ -401,26 +483,96 @@ clipdrawer_ly_clicked(void *data, Evas_Object *obj, const char *emission, const
        }
 }
 
+static void set_sliding_win_geometry(void *data)
+{
+       struct appdata *ad = data;
+       Ecore_X_Window zone, xwin;
+       Evas_Coord x, y, w, h;
+       xwin = elm_win_xwindow_get(ad->win_main);
+       zone = ecore_x_e_illume_zone_get(xwin);
+       DTRACE("[CBHM] xwin:%x, zone:%x\n", xwin, zone);
+
+//     ecore_evas_geometry_get(ecore_evas_ecore_evas_get(evas_object_evas_get(ad->win_main)), &x, &y, &w, &h);
+
+       if (ad->o_degree == 90 || ad->o_degree == 270)
+       {
+               h = ad->anim_count/30.0 * CLIPDRAWER_HEIGHT_LANDSCAPE;
+               x = 0;
+               y = ad->root_w - h;
+               w = ad->root_h;
+       }
+       else
+       {
+               h = ad->anim_count/30.0 * CLIPDRAWER_HEIGHT;
+               x = 0;
+               y = ad->root_h - h;
+               w = ad->root_w;
+       }
+
+       if (!h)
+               w = 0;
+
+       DTRACE("[CBHM] change degree geometry... (%d, %d, %d x %d)\n", x, y, w, h);
+       ecore_x_e_illume_sliding_win_geometry_set(zone, x, y, w, h);
+       ecore_x_e_illume_sliding_win_state_set(zone, ad->anim_count != 0);
+}
+
+void set_rotation_to_clipdrawer(void *data)
+{
+       struct appdata *ad = data;
+       double wh, wy;
+       int wposx, wwidth;
+       int angle = ad->o_degree;
+
+       if (angle == 180) // reverse
+       {
+               wh = (1.0*CLIPDRAWER_HEIGHT/SCREEN_HEIGHT)*ad->root_h;
+               wy = 0;
+               wwidth = ad->root_w;
+               wposx = CLIPDRAWER_POS_X;
+       }
+       else if (angle == 90) // right rotate
+       {
+               wh = (1.0*CLIPDRAWER_HEIGHT_LANDSCAPE/SCREEN_WIDTH)*ad->root_w;
+               wy = (1.0*CLIPDRAWER_POS_X/SCREEN_WIDTH)*ad->root_w;
+               wwidth = ad->root_h;
+               wposx = CLIPDRAWER_WIDTH-CLIPDRAWER_HEIGHT_LANDSCAPE;
+       }
+       else if (angle == 270) // left rotate
+       {
+               wh = (1.0*CLIPDRAWER_HEIGHT_LANDSCAPE/SCREEN_WIDTH)*ad->root_w;
+               wy = (1.0*CLIPDRAWER_POS_X/SCREEN_WIDTH)*ad->root_w;
+               wwidth = ad->root_h;
+               wposx = CLIPDRAWER_POS_X;
+       }
+       else // angle == 0
+       {
+               wh = (1.0*CLIPDRAWER_HEIGHT/SCREEN_HEIGHT)*ad->root_h;
+               wy = (1.0*CLIPDRAWER_POS_Y/SCREEN_HEIGHT)*ad->root_h;
+               wwidth = ad->root_w;
+               wposx = CLIPDRAWER_POS_X;
+       }
+
+       evas_object_resize(ad->win_main, wwidth, (int)wh);
+       evas_object_move(ad->win_main, wposx, (int)wy);
+       if (ad->anim_count == ANIM_DURATION)
+               set_sliding_win_geometry(data);
+}
+
 int clipdrawer_init(void *data)
 {
        struct appdata *ad = data;
        double cdy, cdw;
 
+       ad->windowshow = EINA_FALSE;
        ad->hicount = 0;
        ad->pastetextonly = EINA_TRUE;
        ad->anim_status = STATUS_NONE;
+       ad->anim_count = 0;
 
        // for elm_check
        elm_theme_extension_add(NULL, APP_EDJ_FILE);
 
-       cdy = (1.0*CLIPDRAWER_HEIGHT/SCREEN_HEIGHT)*ad->root_h;
-       cdw = (1.0*CLIPDRAWER_POS_Y/SCREEN_HEIGHT)*ad->root_h;
-
-       evas_object_resize(ad->win_main, ad->root_w, (int)cdy);
-       evas_object_move(ad->win_main, CLIPDRAWER_POS_X, (int)cdw);
-       evas_object_resize(ad->ly_main, ad->root_w, (int)cdy);
-       evas_object_move(ad->ly_main, CLIPDRAWER_POS_X, (int)cdw);
-
        edje_object_signal_callback_add(elm_layout_edje_get(ad->ly_main), 
                                                                        "mouse,up,1", "*", clipdrawer_ly_clicked, ad);
 
@@ -481,112 +633,179 @@ int clipdrawer_create_view(void *data)
 
        // for debug
        // at starting, showing app view
-//     clipdrawer_activate_view(ad);
-
-//     clipdrawer_anim_show_effect(ad);
+       //clipdrawer_activate_view(ad);
 
        return 0;
 }
 
-Ecore_Timer *tm_anim;
-
-Eina_Bool anim_pos_calc_cb(void *data)
+Eina_Bool _get_anim_pos(void *data, int *sp, int *ep)
 {
+       if (!sp || !ep)
+               return EINA_FALSE;
+
        struct appdata *ad = data;
+       int angle = ad->o_degree;
+       int anim_start, anim_end, delta;
 
-       static int anim_count = 0;
-       static int anim_end = 120;
-       int anim_starty, anim_endy, deltay;
-//     if (anim_count == 0)
-//     {
-               switch (ad->anim_status)
-               {
-                       case HIDE_ANIM:
-                               anim_starty = (int)((1.0*CLIPDRAWER_HEIGHT/SCREEN_HEIGHT)*ad->root_h);
-                               anim_endy = ad->root_h;
-                               anim_starty = anim_endy - anim_starty;
-                               break;
-                       case SHOW_ANIM:
-                               anim_starty = ad->root_h;
-                               anim_endy = (int)((1.0*CLIPDRAWER_HEIGHT/SCREEN_HEIGHT)*ad->root_h);
-                               anim_endy = anim_starty-anim_endy;
-                               break;
-                       default:
-                               return EINA_FALSE;
-               }
+       if (angle == 180) // reverse
+       {
+               anim_start = (int)(((double)CLIPDRAWER_HEIGHT/SCREEN_HEIGHT)*ad->root_h);
+               anim_start = ad->root_h - anim_start;
+               anim_start = -anim_start;
+               anim_end = 0;
+       }
+       else if (angle == 90) // right rotate
+       {
+               anim_start = ad->root_w;
+               anim_end = (int)(((double)CLIPDRAWER_HEIGHT_LANDSCAPE/SCREEN_WIDTH)*ad->root_w);
+               anim_end = anim_start-anim_end;
+       }
+       else if (angle == 270) // left rotate
+       {
+               anim_start = (int)(((double)CLIPDRAWER_HEIGHT_LANDSCAPE/SCREEN_WIDTH)*ad->root_w);
+               anim_start = ad->root_w-anim_start;
+               anim_start = -anim_start;
+               anim_end = 0;
+       }
+       else // angle == 0
+       {
+               anim_start = ad->root_h;
+               anim_end = (int)(((double)CLIPDRAWER_HEIGHT/SCREEN_HEIGHT)*ad->root_h);
+               anim_end = anim_start-anim_end;
+       }
 
-//     }
+       *sp = anim_start;
+       *ep = anim_end;
+       return EINA_TRUE;
+}
 
-       double posprop = 1.0*anim_count/anim_end;
-       if (ad->anim_status == HIDE_ANIM)
-               deltay = (int)((anim_endy-anim_starty)*posprop);
-       else
-               deltay = (int)((anim_starty-anim_endy)*posprop);
+Eina_Bool _do_anim_delta_pos(void *data, int sp, int ep, int ac, int *dp)
+{
+       if (!dp)
+               return EINA_FALSE;
 
-       if (anim_count > anim_end)
+       struct appdata *ad = data;
+       int angle = ad->o_degree;
+       int delta;
+       double posprop;
+       posprop = 1.0*ac/ANIM_DURATION;
+
+       if (angle == 180) // reverse
        {
-               anim_count = 0;
-               ad->anim_status = STATUS_NONE;
-               if (ad->anim_status == HIDE_ANIM)
-               {
-                       evas_object_hide(ad->win_main);
-                       elm_win_lower(ad->win_main);
-               }
-               return EINA_FALSE;
+               delta = (int)((ep-sp)*posprop);
+               evas_object_move(ad->win_main, 0, sp+delta);
+       }
+       else if (angle == 90) // right rotate
+       {
+               delta = (int)((ep-sp)*posprop);
+               evas_object_move(ad->win_main, sp+delta, 0);
+       }
+       else if (angle == 270) // left rotate
+       {
+               delta = (int)((ep-sp)*posprop);
+               evas_object_move(ad->win_main, sp+delta, 0);
+       }
+       else // angle == 0
+       {
+               delta = (int)((sp-ep)*posprop);
+               evas_object_move(ad->win_main, 0, sp-delta);
        }
+       
+       *dp = delta;
 
-       if (ad->anim_status == HIDE_ANIM)
-               evas_object_move(ad->win_main, 0, anim_starty+deltay);
-       else
-               evas_object_move(ad->win_main, 0, anim_starty-deltay);
-       anim_count++;
+       return EINA_TRUE;
+}
 
-       if (ad->anim_status == HIDE_ANIM)
-               fprintf(stderr, "## cur pos y = %d\n", anim_starty+deltay);
-       else
-               fprintf(stderr, "## cur pos y = %d\n", anim_starty-deltay);
+static void stop_animation(void *data)
+{
+       struct appdata *ad = data;
 
-       return EINA_TRUE;
+       ad->anim_status = STATUS_NONE;
+       if (anim_timer)
+       {
+               ecore_timer_del(anim_timer);
+               anim_timer = NULL;
+       }
+
+       set_sliding_win_geometry(data);
 }
 
-void clipdrawer_anim_show_effect(void *data)
+Eina_Bool anim_pos_calc_cb(void *data)
 {
        struct appdata *ad = data;
 
-       if (ad->anim_status != STATUS_NONE)
+       int anim_start, anim_end, delta;
+
+       _get_anim_pos(ad, &anim_start, &anim_end);
+
+       if (ad->anim_status == SHOW_ANIM)
        {
-               DTRACE("ERR: another animation is showing\n");
-               return;
+               if (ad->anim_count > ANIM_DURATION)
+               {
+                       ad->anim_count = ANIM_DURATION;
+                       stop_animation(data);
+                       return EINA_FALSE;
+               }
+               _do_anim_delta_pos(ad, anim_start, anim_end, ad->anim_count, &delta);
+               ad->anim_count++;
+       }
+       else if (ad->anim_status == HIDE_ANIM)
+       {
+               if (ad->anim_count < 0)
+               {
+                       ad->anim_count = 0;
+                       evas_object_hide(ad->win_main);
+                       elm_win_lower(ad->win_main);
+                       unset_transient_for(ad);
+                       stop_animation(data);
+                       return EINA_FALSE;
+               }
+               _do_anim_delta_pos(ad, anim_start, anim_end, ad->anim_count, &delta);
+               ad->anim_count--;
+       }
+       else
+       {
+               stop_animation(data);
+               return EINA_FALSE;
        }
 
-       ad->anim_status = SHOW_ANIM;
-       ecore_timer_add(1.0/60, anim_pos_calc_cb, ad);
+       return EINA_TRUE;
 }
 
-void clipdrawer_anim_hide_effect(void *data)
+Eina_Bool clipdrawer_anim_effect(void *data, anim_status_t atype)
 {
        struct appdata *ad = data;
 
-       if (ad->anim_status != STATUS_NONE)
+       if (atype == ad->anim_status)
        {
-               DTRACE("ERR: another animation is showing\n");
-               return;
+               DTRACE("Warning: Animation effect is already in progress. \n");
+               return EINA_FALSE;
        }
 
-       ad->anim_status = HIDE_ANIM;
-       ecore_timer_add(1.0/60, anim_pos_calc_cb, ad);
+       ad->anim_status = atype;
+
+       if (anim_timer)
+               ecore_timer_del(anim_timer);
+
+       anim_timer = ecore_timer_add(ANIM_FLOPS, anim_pos_calc_cb, ad);
+
+       return EINA_TRUE;
 }
 
 void clipdrawer_activate_view(void *data)
 {
        struct appdata *ad = data;
-       
+
        if (ad->win_main)
        {
                set_transient_for(ad);
+               ad->o_degree = get_active_window_degree(ad->active_win);
+               elm_win_rotation_set(ad->win_main, ad->o_degree);
+               set_rotation_to_clipdrawer(data);
                evas_object_show(ad->win_main);
-//             clipdrawer_anim_show_effect(ad);
                elm_win_activate(ad->win_main);
+               if (clipdrawer_anim_effect(ad, SHOW_ANIM))
+                       ad->windowshow = EINA_TRUE;
        }
 }
 
@@ -594,12 +813,10 @@ void clipdrawer_lower_view(void *data)
 {
        struct appdata *ad = data;
        
-       if (ad->win_main)
+       if (ad->win_main && ad->windowshow)
        {
-               unset_transient_for(ad);
-//             clipdrawer_anim_hide_effect(ad);
-               evas_object_hide(ad->win_main);
-               elm_win_lower(ad->win_main);
+               if (clipdrawer_anim_effect(ad, HIDE_ANIM))
+                       ad->windowshow = EINA_FALSE;
        }
 }
 
@@ -607,51 +824,21 @@ void _change_gengrid_paste_textonly_mode(void *data)
 {
        struct appdata *ad = data;
 
-       fprintf(stderr, "## _change_gengrid_paste_textonly_mode = %d\n", clipdrawer_paste_textonly_get(ad));
-
-       Elm_Gengrid_Item *item;
        griditem_t *ti = NULL;
 
-       if (clipdrawer_paste_textonly_get(ad))
-       { // textonly paste mode
-               Elm_Gengrid_Item *item = elm_gengrid_first_item_get(ad->hig);
-
-               while (item)    
-               {
-                       ti = elm_gengrid_item_data_get(item);
-                       if ((ti->itype == GI_IMAGE) && (ti->ilayout))
-                       {
-                               fprintf(stderr, "## sig to hide delbtn\n");
-
-                               edje_object_signal_emit(elm_layout_edje_get(ti->ilayout), "elm,state,hide,delbtn", "elm");
-                               Evas_Object *rect = evas_object_rectangle_add(evas_object_evas_get(ad->hig));
-                               evas_object_color_set(rect, 0, 0, 0, 200);
-                               evas_object_show(rect);
-                               elm_layout_content_set(ti->ilayout, "elm.swallow.cover", rect);
-                       }
-                       item = elm_gengrid_item_next_get(item);      
-               }
-       }
-       else
-       { // text+image paste mode
-               Elm_Gengrid_Item *item = elm_gengrid_first_item_get(ad->hig);
+       Elm_Gengrid_Item *item = elm_gengrid_first_item_get(ad->hig);
 
-               while (item)    
+       while (item)
+       {
+               ti = elm_gengrid_item_data_get(item);
+               if ((ti->itype == GI_IMAGE) && (ti->ilayout))
                {
-                       ti = elm_gengrid_item_data_get(item);
-                       fprintf(stderr, "## itype = %d\n", ti->itype);
-                       fprintf(stderr, "## ilayout = 0x%x\n", ti->ilayout);
-                       if ((ti->itype == GI_IMAGE) && (ti->ilayout))
-                       {
-                               fprintf(stderr, "## sig to show delbtn\n");
-
-                               edje_object_signal_emit(elm_layout_edje_get(ti->ilayout), "elm,state,show,delbtn", "elm");
-                               Evas_Object *rect = elm_layout_content_unset(ti->ilayout, "elm.swallow.cover");
-                               evas_object_hide(rect);
-                               evas_object_del(rect);
-                       }
-                       item = elm_gengrid_item_next_get(item);      
+                       if (clipdrawer_paste_textonly_get(ad))
+                               edje_object_signal_emit(elm_layout_edje_get(ti->ilayout), "elm,state,show,dim", "elm");
+                       else
+                               edje_object_signal_emit(elm_layout_edje_get(ti->ilayout), "elm,state,hide,dim", "elm");
                }
+               item = elm_gengrid_item_next_get(item);
        }
 }