[cbhm] fixed focus problem when landscape mode
[framework/uifw/cbhm.git] / src / clipdrawer.c
index d5c3c24..2fc67b2 100644 (file)
-#include "common.h"
-#include "cbhm_main.h"
-#include "storage.h"
-#include "xcnphandler.h"
+/*
+ * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+
+#include <utilX.h>
 #include "clipdrawer.h"
-
-#define DELETE_ICON_PATH "/usr/share/cbhm/icons/05_delete.png"
-#define IM     "/usr/share/cbhm/icons/"
-static const char *g_images_path[] = {
-       IM"cbhm_default_img.png",
-};
-#define N_IMAGES (1)
-
+#include "item_manager.h"
+#include "xconverter.h"
+
+#define EDJ_PATH "/usr/share/edje"
+#define APP_EDJ_FILE EDJ_PATH"/cbhmdrawer.edj"
+#define GRP_MAIN "cbhmdrawer"
+
+#define ANIM_DURATION 30 // 1 seconds
+#define ANIM_FLOPS (0.5/30)
+#define CLIPDRAWER_HEIGHT 360
+#define CLIPDRAWER_HEIGHT_LANDSCAPE 228
+#define DEFAULT_WIDTH 720
 #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 140
 #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 60 // 2 seconds
-#define ANIM_FLOPS (1.0/60)
-
-// gic should live at gengrid callback functions
-Elm_Gengrid_Item_Class gic;
-
-typedef struct tag_griditem
+#define GRID_IMAGE_INNER 10
+#define GRID_IMAGE_REAL_W (GRID_ITEM_SINGLE_W - (2*GRID_IMAGE_INNER))
+#define GRID_IMAGE_REAL_H (GRID_ITEM_SINGLE_H - (2*GRID_IMAGE_INNER))
+
+static Evas_Object *create_win(ClipdrawerData *cd, const char *name);
+static Evas_Object *_grid_content_get(void *data, Evas_Object *obj, const char *part);
+static void _grid_del(void *data, Evas_Object *obj);
+static Eina_Bool clipdrawer_add_item(AppData *ad, CNP_ITEM *item);
+static Eina_Bool clipdrawer_del_item(AppData *ad, CNP_ITEM *item);
+static void clipdrawer_ly_clicked(void *data, Evas_Object *obj, const char *emission, const char *source);
+static void _grid_item_ly_clicked(void *data, Evas_Object *obj, const char *emission, const char *source);
+static void setting_win(Ecore_X_Display *x_disp, Ecore_X_Window x_main_win);
+static void set_transient_for(Ecore_X_Window x_main_win, Ecore_X_Window x_active_win);
+static void unset_transient_for(Ecore_X_Window x_main_win, Ecore_X_Window x_active_win);
+
+static void _change_gengrid_paste_textonly_mode(ClipdrawerData *cd)
 {
-       int itype;
-       Elm_Gengrid_Item *item;
-       const char *ipathdata;
-       Eina_Strbuf *istrdata;
-       Evas_Object *delbtn;
-       Evas_Object *ilayout;
-} griditem_t;
+       CNP_ITEM *item = NULL;
 
+       Elm_Object_Item *gitem = elm_gengrid_first_item_get(cd->gengrid);
 
-int clipdrawer_update_contents(void *data)
-{
-       struct appdata *ad = data;
-       int i, pos;
-       char *unesc = NULL;
-
-       for (i = 0; i < HISTORY_QUEUE_MAX_ITEMS; i++)
+       while (gitem)
        {
-               pos = get_current_history_position() - i;
-               if (pos < 0)
-                       pos = pos+HISTORY_QUEUE_MAX_ITEMS;
-
-               if (get_item_contents_by_pos(pos) != NULL && strlen(get_item_contents_by_pos(pos)) > 0)
+               item = elm_object_item_data_get(gitem);
+               if ((item->type_index == ATOM_INDEX_IMAGE) && (item->layout))
                {
-                       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);
+                       if (cd->paste_text_only)
+                               edje_object_signal_emit(elm_layout_edje_get(item->layout), "elm,state,show,dim", "elm");
+                       else
+                               edje_object_signal_emit(elm_layout_edje_get(item->layout), "elm,state,hide,dim", "elm");
                }
+               gitem = elm_gengrid_item_next_get(gitem);
        }
+}
 
-       /* FIXME : sometimes when list update, screen isn't updated */
+void clipdrawer_paste_textonly_set(AppData *ad, Eina_Bool textonly)
+{
+       ClipdrawerData *cd = ad->clipdrawer;
+       if (cd->paste_text_only != textonly)
+               cd->paste_text_only = textonly;
+       DTRACE("paste textonly mode = %d\n", textonly);
 
-       return 0;
+       _change_gengrid_paste_textonly_mode(cd);
 }
 
-const char* clipdrawer_get_plain_string_from_escaped(char *escstr)
+Eina_Bool clipdrawer_paste_textonly_get(AppData *ad)
 {
-       /* TODO : is it should be here? besides, remove dependency for entry */
-       /* NOTE : return string should be freed */
-       return elm_entry_markup_to_utf8(escstr);
+       ClipdrawerData *cd = ad->clipdrawer;
+       return cd->paste_text_only;
 }
 
-static void _grid_del_response_cb(void *data, Evas_Object *obj, void *event_info)
+static Evas_Object *_load_edj(Evas_Object* win, const char *file, const char *group)
 {
-       Elm_Gengrid_Item *it = (Elm_Gengrid_Item *)data;
-       evas_object_del(obj);
+       Evas_Object *layout = elm_layout_add(win);
+       if (!layout)
+       {
+               DMSG("ERROR: elm_layout_add return NULL\n");
+               return NULL;
+       }
 
-       if((int)event_info == ELM_POPUP_RESPONSE_OK)
-               elm_gengrid_item_del(it);
+       if (!elm_layout_file_set(layout, file, group))
+       {
+               DMSG("ERROR: elm_layout_file_set return FALSE\n");
+               evas_object_del(layout);
+               return NULL;
+       }
+
+       evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+       elm_win_resize_object_add(win, layout);
+
+       evas_object_show(layout);
+       return layout;
 }
 
-static void _grid_click_delete(void *data, Evas_Object *obj, void *event_info)
+static Eina_Bool keydown_cb(void *data, int type, void *event)
 {
-       struct appdata *ad = data;
+       AppData *ad = data;
+       Ecore_Event_Key *ev = event;
+       if (!strcmp(ev->keyname, KEY_END))
+               clipdrawer_lower_view(ad);
+
+       return ECORE_CALLBACK_PASS_ON;
 }
 
-static void
-_grid_item_ly_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
+ClipdrawerData* init_clipdrawer(AppData *ad)
 {
-       struct appdata *ad = g_get_main_appdata();
-
-       if (ad->anim_status != STATUS_NONE)
-               return;
+       ClipdrawerData *cd = calloc(1, sizeof(ClipdrawerData));
 
-       Elm_Gengrid_Item *sgobj = NULL;
-       sgobj = elm_gengrid_selected_item_get(ad->hig);
-       griditem_t *ti = NULL;
-       ti = elm_gengrid_item_data_get(sgobj);
+       /* create and setting window */
+       if (!cd)
+               return NULL;
+       if (!(cd->main_win = create_win(cd, APPNAME)))
+       {
+               free(cd);
+               return NULL;
+       }
+       cd->x_main_win = elm_win_xwindow_get(cd->main_win);
+       setting_win(ad->x_disp, cd->x_main_win);
 
-       #define EDJE_DELBTN_PART_PREFIX "delbtn"
-       if (strncmp(source, EDJE_DELBTN_PART_PREFIX, strlen(EDJE_DELBTN_PART_PREFIX)))
+       /* edj setting */
+       if (!(cd->main_layout = _load_edj(cd->main_win, APP_EDJ_FILE, GRP_MAIN)))
        {
-               if (!sgobj || !ti)
-               {
-                       DTRACE("ERR: cbhm can't get the selected image\n");
-                       return;
-               }
+               evas_object_del(cd->main_win);
+               free(cd);
+               return NULL;
+       }
 
-               elm_gengrid_item_selected_set(sgobj, EINA_FALSE);
+       /* create and setting gengrid */
+       elm_theme_extension_add(NULL, APP_EDJ_FILE);
+       edje_object_signal_callback_add(elm_layout_edje_get(cd->main_layout),
+                       "mouse,up,1", "*", clipdrawer_ly_clicked, ad);
 
-               if (ti->itype == GI_TEXT)
-               {
-                       char *p = strdup(eina_strbuf_string_get(ti->istrdata));
+       elm_object_part_text_set(cd->main_layout, "panel_title", "Clipboard");
+       elm_object_part_text_set(cd->main_layout, "panel_function", "Done");
 
-                       elm_selection_set(1, obj, /*ELM_SEL_FORMAT_TEXT*/1, p);
-               }
-               else //if (ti->itype == GI_IMAGE)
-               {
-                       if (!clipdrawer_paste_textonly_get(ad))
-                       {
-                               int len = strlen(ti->ipathdata);
-                               char *p = malloc(len + 10);
-                               snprintf(p,len+10, "file:///%s", ti->ipathdata);
+       cd->gengrid = elm_gengrid_add(cd->main_win);
+       elm_object_part_content_set(cd->main_layout, "historyitems", cd->gengrid);
+       elm_gengrid_item_size_set(cd->gengrid, GRID_ITEM_W, GRID_ITEM_H);
+       elm_gengrid_align_set(cd->gengrid, 0.5, 0.0);
+       elm_gengrid_horizontal_set(cd->gengrid, EINA_TRUE);
+       elm_gengrid_bounce_set(cd->gengrid, EINA_TRUE, EINA_FALSE);
+       elm_gengrid_multi_select_set(cd->gengrid, EINA_FALSE);
+//     evas_object_smart_callback_add(cd->gengrid, "selected", _grid_click_paste, ad);
+       evas_object_size_hint_weight_set(cd->gengrid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
 
-                               elm_selection_set(/*secondary*/1,obj,/*ELM_SEL_FORMAT_IMAGE*/4,p);
-                       }
-                       else
-                       {
-                               DTRACE("ERR: cbhm image paste mode is false\n");
-                       }
-               }
+       elm_gengrid_clear(cd->gengrid);
 
-               return;
-       }
+       cd->gic.item_style = "clipboard_photo_style";
+       cd->gic.func.text_get = NULL;
+       cd->gic.func.content_get = _grid_content_get;
+       cd->gic.func.state_get = NULL;
+       cd->gic.func.del = _grid_del;
 
-       if (!sgobj)
-       {
-               DTRACE("ERR: cbhm can't get the selected item\n");
-               return;
-       }
+       evas_object_show(cd->gengrid);
+
+       ad->draw_item_add = clipdrawer_add_item;
+       ad->draw_item_del = clipdrawer_del_item;
+//     ad->x_main_win = cd->x_main_win;
+
+       cd->keydown_handler = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, keydown_cb, ad);
+       cd->evas = evas_object_evas_get(cd->main_win);
 
-       elm_gengrid_item_selected_set(sgobj, EINA_FALSE);
+       delete_mode = EINA_FALSE;
 
-       Evas_Object *popup = elm_popup_add(ad->win_main);
-       elm_popup_timeout_set(popup, 5);
-       evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
-       elm_popup_desc_set(popup, "Are you sure delete this?");
-       elm_popup_buttons_add(popup, 2,
-                                                 "Yes", ELM_POPUP_RESPONSE_OK,
-                                                 "No", ELM_POPUP_RESPONSE_CANCEL,
-                                                 NULL);
-       evas_object_smart_callback_add(popup, "response", _grid_del_response_cb, sgobj);
-       evas_object_show(popup);
+       return cd;
 }
 
-Evas_Object* _grid_icon_get(const void *data, Evas_Object *obj, const char *part)
+void depose_clipdrawer(ClipdrawerData *cd)
 {
-       griditem_t *ti = (griditem_t *)data;
+       evas_object_del(cd->main_win);
+       if (cd->anim_timer)
+               ecore_timer_del(cd->anim_timer);
+       if (cd->keydown_handler)
+               ecore_event_handler_del(cd->keydown_handler);
+       free(cd);
+}
 
-       if (!strcmp(part, "elm.swallow.icon"))
+static Eina_Bool clipdrawer_add_item(AppData *ad, CNP_ITEM *item)
+{
+       ClipdrawerData *cd = ad->clipdrawer;
+       if (item->type_index == ATOM_INDEX_IMAGE)
        {
-               if (ti->itype == GI_TEXT)
+               Elm_Object_Item *gitem = elm_gengrid_first_item_get(cd->gengrid);
+               while (gitem)
                {
-                       Evas_Object *layout = elm_layout_add (obj);
-                       elm_layout_theme_set(layout, "gengrid", "widestyle", "horizontal_layout");
-                       edje_object_signal_callback_add(elm_layout_edje_get(layout), 
-                                                                                       "mouse,up,1", "*", _grid_item_ly_clicked, data);
-                       Evas_Object *rect = evas_object_rectangle_add(evas_object_evas_get(obj));
-                       evas_object_resize(rect, GRID_ITEM_W, GRID_ITEM_H);
-                       evas_object_color_set(rect, 242, 233, 183, 255);
-                       evas_object_show(rect);
-                       elm_layout_content_set(layout, "elm.swallow.icon", rect);
-
-                       // FIXME: add string length check
-                       Evas_Object *ientry = elm_scrolled_entry_add(obj);
-                       evas_object_size_hint_weight_set(ientry, 0, 0);
-                       Eina_Strbuf *strent = NULL;
-                       char *strdata = eina_strbuf_string_get(ti->istrdata);
-                       int i, skipflag, strcnt;
-                       
-                       strent = eina_strbuf_new();
-                       skipflag = 0;
-                       strcnt = 0;
-                       for (i = 0; i < eina_strbuf_length_get(ti->istrdata); i++)
+                       CNP_ITEM *gitem_data = elm_object_item_data_get(gitem);
+                       gitem = elm_gengrid_item_next_get(gitem);
+                       if ((gitem_data->type_index == item->type_index) && (!strcmp(item->data, gitem_data->data)))
                        {
-                               switch (strdata[i])
-                               {
-                                       case '>':
-                                               skipflag = 0;
-                                               break;
-                                       case '<':
-                                               skipflag = 1;
-                                               break;
-                                       default:
-                                               if (!skipflag)
-                                                       strcnt++;
-                                               break;
-                               }
-                               if (strcnt > 100)
-                                       break;
+                               DMSG("duplicated file path = %s\n", item->data);
+                               item_delete_by_CNP_ITEM(ad, gitem_data);
                        }
-                       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);
-                       evas_object_show(ientry);
-                       elm_layout_content_set(layout, "elm.swallow.inner", ientry);
-
-                       eina_strbuf_free(strent);
-
-                       return layout;
                }
-               else// if (ti->itype == GI_IMAGE)
-               {
-                       Evas_Object *layout = elm_layout_add (obj);
-                       elm_layout_theme_set(layout, "gengrid", "widestyle", "horizontal_layout");
-                       edje_object_signal_callback_add(elm_layout_edje_get(layout), 
-                                                                                       "mouse,up,1", "*", _grid_item_ly_clicked, data);
-
-                       Evas_Object *sicon;
-                       sicon = evas_object_image_add(evas_object_evas_get(obj));
-                       evas_object_image_load_size_set(sicon, GRID_ITEM_SINGLE_W, GRID_ITEM_SINGLE_H);
-                       evas_object_image_file_set(sicon, ti->ipathdata, NULL);
-                       evas_object_image_fill_set(sicon, 0, 0, GRID_ITEM_SINGLE_W, GRID_ITEM_SINGLE_H);
-                       evas_object_resize(sicon, GRID_ITEM_SINGLE_W, GRID_ITEM_SINGLE_H);
-                       elm_layout_content_set(layout, "elm.swallow.icon", sicon);
-
-                       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);
-                       }
-
-                       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;
-*/
-               }
+       item->gitem = elm_gengrid_item_prepend(cd->gengrid, &cd->gic, item, NULL, NULL);
 
-//             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;
+       return EINA_TRUE;
 }
 
-static void _grid_longpress(void *data, Evas_Object *obj, void *event_info)
+static Eina_Bool clipdrawer_del_item(AppData *ad, CNP_ITEM *item)
 {
-       struct appdata *ad = data;
-       clipdrawer_change_mode(ad);
+       if (item->gitem)
+               elm_object_item_del(item->gitem);
+       return EINA_TRUE;
 }
 
-static void _grid_click_paste(void *data, Evas_Object *obj, void *event_info)
+static void _grid_del(void *data, Evas_Object *obj)
 {
-       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);
+       CNP_ITEM *item = data;
+       item->gitem = NULL;
+       item->layout = NULL;
 }
 
-void _grid_del(const void *data, Evas_Object *obj)
+static Evas_Object *_grid_content_get(void *data, Evas_Object *obj, const char *part)
 {
-       griditem_t *ti = (griditem_t *)data;
-       if (ti->itype == GI_TEXT)
-               eina_strbuf_free(ti->istrdata);
-       else
-               eina_stringshare_del(ti->ipathdata);
-       free(ti);
-}
+       CNP_ITEM *item = data;
+       AppData *ad = item->ad;
+       ClipdrawerData *cd = ad->clipdrawer;
 
-// 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)
-{
-       struct appdata *ad = g_get_main_appdata();
-       griditem_t *newgi = NULL;
+       if (item->type_index == ATOM_INDEX_IMAGE && !strcmp(part, "elm.swallow.icon")) /* text/uri */
+       {
+               int w, h, iw, ih;
 
-       newgi = malloc(sizeof(griditem_t));
-       newgi->itype = type;
+               Evas_Object *layout = elm_layout_add(obj);
+               elm_layout_theme_set(layout, "gengrid", "item", "clipboard_style");
+               edje_object_signal_callback_add(elm_layout_edje_get(layout),
+                               "mouse,up,1", "*", _grid_item_ly_clicked, data);
 
-       fprintf(stderr, "## add - %d : %s\n", newgi->itype, idata);
-       if (type == GI_TEXT)
-       {
-               newgi->istrdata = eina_strbuf_new();
-               eina_strbuf_append(newgi->istrdata, idata);
-       }
-       else //if (type == GI_IMAGE)
-       {
-               Elm_Gengrid_Item *item = elm_gengrid_first_item_get(ad->hig);
-               griditem_t *ti = NULL;
 
-               if (!check_regular_file(idata))
-               {
-                       DTRACE("Error : it isn't normal file = %s\n", idata);
-                       return -1;
-               }
+               Evas_Object *sicon;
+               sicon = evas_object_image_add(evas_object_evas_get(obj));
+               evas_object_image_load_size_set(sicon, GRID_IMAGE_REAL_W, GRID_IMAGE_REAL_H);
+               evas_object_image_file_set(sicon, item->data, NULL);
+               evas_object_image_size_get(sicon, &w, &h);
 
-               while (item)    
+               if (w > GRID_IMAGE_REAL_W || h > GRID_IMAGE_REAL_H)
                {
-                       ti = elm_gengrid_item_data_get(item);
-                       if ((ti->itype == type) && !strcmp(ti->ipathdata, idata))
+                       if (w >= h)
                        {
-                               DTRACE("Error : duplicated file path = %s\n", idata);
-                               return -1;
+                               iw = GRID_IMAGE_REAL_W;
+                               ih = (float)GRID_IMAGE_REAL_W / w * h;
                        }
-                       item = elm_gengrid_item_next_get(item);      
+                       else
+                       {
+                               iw = (float)GRID_IMAGE_REAL_H / h * w;
+                               ih = GRID_IMAGE_REAL_H;
+                       }
+               }
+               else
+               {
+                       iw = w;
+                       ih = h;
                }
 
-               newgi->ipathdata = eina_stringshare_add(idata);
-       }
+               evas_object_image_fill_set(sicon, 0, 0, iw, ih);
+               evas_object_resize(sicon, iw, ih);
+               evas_object_size_hint_min_set(sicon, iw, ih);
+               elm_object_part_content_set(layout, "elm.swallow.icon", sicon);
+
+               if (cd->paste_text_only)
+                       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");
 
-       if (ad->hicount >= HISTORY_QUEUE_MAX_ITEMS)
+               item->layout = layout;
+       }
+       else if (item->type_index != ATOM_INDEX_IMAGE && !strcmp(part, "elm.swallow.entry")) /* text/uri */
        {
-               ad->hicount--;
-               // FIXME: add routine that is removing its elements
-               elm_gengrid_item_del(elm_gengrid_last_item_get(ad->hig));
+               Evas_Object *layout = elm_layout_add(obj);
+               elm_layout_theme_set(layout, "gengrid", "widestyle", "horizontal_layout");
+               edje_object_signal_callback_add(elm_layout_edje_get(layout), 
+                               "mouse,up,1", "*", _grid_item_ly_clicked, data);
+               Evas_Object *rect = evas_object_rectangle_add(evas_object_evas_get(obj));
+               evas_object_resize(rect, GRID_ITEM_W, GRID_ITEM_H);
+               evas_object_color_set(rect, 237, 233, 208, 255);
+               evas_object_show(rect);
+               elm_object_part_content_set(layout, "elm.swallow.icon", rect);
+
+               Evas_Object *ientry = elm_entry_add(obj);
+               evas_object_size_hint_weight_set(ientry, 0, 0);
+               elm_entry_scrollable_set(ientry, EINA_TRUE);
+
+               char *entry_text = string_for_entry_get(ad, item->type_index, item->data);
+               if (entry_text)
+               {
+                       elm_object_part_text_set(ientry, NULL, entry_text);
+                       free(entry_text);
+               }
+               else
+               {
+                       elm_object_part_text_set(ientry, NULL, item->data);
+               }
+               elm_entry_editable_set(ientry, EINA_FALSE);
+               elm_entry_context_menu_disabled_set(ientry, EINA_TRUE);
+               evas_object_show(ientry);
+               elm_object_part_content_set(layout, "elm.swallow.inner", ientry);
+
+               item->layout = layout;
        }
+       else
+               return NULL;
 
-       ad->hicount++;
-       newgi->item = elm_gengrid_item_prepend(ad->hig, &gic, newgi, NULL, NULL);
+       if (delete_mode)
+               edje_object_signal_emit(elm_layout_edje_get(item->layout), "elm,state,show,delbtn", "elm");
+       else
+               edje_object_signal_emit(elm_layout_edje_get(item->layout), "elm,state,hide,delbtn", "elm");
 
-       return TRUE;
+       return item->layout;
 }
 
-static void
-clipdrawer_ly_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
+static void clipdrawer_ly_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
 {
-       struct appdata *ad = data;
+       AppData *ad = data;
 
-       if (ad->anim_status != STATUS_NONE)
+       if (ad->clipdrawer->anim_status != STATUS_NONE)
                return;
 
-       #define EDJE_CLOSE_PART_PREFIX "background/close"
+#define EDJE_CLOSE_PART_PREFIX "background/title/close"
+#define EDJE_DELETE_MODE_PREFIX "background/title/delete"
        if (!strncmp(source, EDJE_CLOSE_PART_PREFIX, strlen(EDJE_CLOSE_PART_PREFIX)))
        {
                clipdrawer_lower_view(ad);
        }
+       else if (!strncmp(source, EDJE_DELETE_MODE_PREFIX, strlen(EDJE_DELETE_MODE_PREFIX)))
+       {
+               _delete_mode_set(ad, !delete_mode);
+       }
+
 }
 
-int clipdrawer_init(void *data)
+static void _grid_item_ly_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
 {
-       struct appdata *ad = data;
-       double cdy, cdw;
+       CNP_ITEM *item = data;
+       AppData *ad = item->ad;
+       ClipdrawerData *cd = ad->clipdrawer;
+
+       if (cd->anim_status != STATUS_NONE)
+               return;
 
-       ad->windowshow = EINA_FALSE;
-       ad->hicount = 0;
-       ad->pastetextonly = EINA_TRUE;
-       ad->anim_status = STATUS_NONE;
+       Elm_Object_Item *sgobj = NULL;
+       sgobj = elm_gengrid_selected_item_get(cd->gengrid);
+       item = elm_object_item_data_get(sgobj);
 
-       // for elm_check
-       elm_theme_extension_add(NULL, APP_EDJ_FILE);
+       if (!sgobj || !item)
+       {
+               DTRACE("ERR: cbhm can't get the selected item\n");
+               return;
+       }
+
+       #define EDJE_DELBTN_PART_PREFIX "delbtn"
+       if (strncmp(source, EDJE_DELBTN_PART_PREFIX, strlen(EDJE_DELBTN_PART_PREFIX)))
+       {
+               elm_gengrid_item_selected_set(sgobj, EINA_FALSE);
+
+               if (delete_mode)
+                       return;
+
+               if (item->type_index != ATOM_INDEX_IMAGE || !cd->paste_text_only)
+               {
+                       set_selection_owner(ad, ECORE_X_SELECTION_SECONDARY, item);
+               }
+       }
+       else
+       {
+               elm_gengrid_item_selected_set(sgobj, EINA_FALSE);
 
-       cdy = (1.0*CLIPDRAWER_HEIGHT/SCREEN_HEIGHT)*ad->root_h;
-       cdw = (1.0*CLIPDRAWER_POS_Y/SCREEN_HEIGHT)*ad->root_h;
+               item_delete_by_CNP_ITEM(ad, item);
+       }
+}
 
-       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);
+void set_transient_for(Ecore_X_Window x_main_win, Ecore_X_Window x_active_win)
+{
+       ecore_x_icccm_transient_for_set(x_main_win, x_active_win);
+       ecore_x_event_mask_set(x_active_win,
+                               ECORE_X_EVENT_MASK_WINDOW_PROPERTY | ECORE_X_EVENT_MASK_WINDOW_CONFIGURE);
+}
 
-       edje_object_signal_callback_add(elm_layout_edje_get(ad->ly_main), 
-                                                                       "mouse,up,1", "*", clipdrawer_ly_clicked, ad);
+void unset_transient_for(Ecore_X_Window x_main_win, Ecore_X_Window x_active_win)
+{
+       ecore_x_event_mask_unset(x_active_win,
+                       ECORE_X_EVENT_MASK_WINDOW_PROPERTY | ECORE_X_EVENT_MASK_WINDOW_CONFIGURE);
+       ecore_x_icccm_transient_for_unset(x_main_win);
+}
 
-       ad->hig = NULL;
-       ad->hig = elm_gengrid_add(ad->win_main);
-       elm_layout_content_set(ad->ly_main, "historyitems", ad->hig);
-       elm_gengrid_item_size_set(ad->hig, GRID_ITEM_W+2, GRID_ITEM_H);
-       elm_gengrid_align_set(ad->hig, 0.5, 0.5);
-       elm_gengrid_horizontal_set(ad->hig, EINA_TRUE);
-       elm_gengrid_bounce_set(ad->hig, EINA_TRUE, EINA_FALSE);
-       elm_gengrid_multi_select_set(ad->hig, EINA_FALSE);
-       evas_object_smart_callback_add(ad->hig, "selected", _grid_click_paste, ad);
-//     evas_object_smart_callback_add(ad->hig, "longpressed", _grid_longpress, ad);
-       evas_object_size_hint_weight_set(ad->hig, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+static void set_focus_for_app_window(Ecore_X_Window x_main_win, Eina_Bool enable)
+{
+       CALLED();
+       Eina_Bool accepts_focus;
+       Ecore_X_Window_State_Hint initial_state;
+       Ecore_X_Pixmap icon_pixmap;
+       Ecore_X_Pixmap icon_mask;
+       Ecore_X_Window icon_window;
+       Ecore_X_Window window_group;
+       Eina_Bool is_urgent;
+
+       ecore_x_icccm_hints_get (x_main_win,
+                       &accepts_focus, &initial_state, &icon_pixmap, &icon_mask, &icon_window, &window_group, &is_urgent);
+       ecore_x_icccm_hints_set (x_main_win,
+                       enable, initial_state, icon_pixmap, icon_mask, icon_window, window_group, is_urgent);
+       DMSG("set focus mode = %d\n", enable);
+}
 
-       elm_gengrid_clear(ad->hig);
+void setting_win(Ecore_X_Display *x_disp, Ecore_X_Window x_main_win)
+{
+       CALLED();
+       // disable window effect
+       utilx_set_window_effect_state(x_disp, x_main_win, 0);
 
-       gic.item_style = "default_grid";
-       gic.func.label_get = NULL;
-       gic.func.icon_get = _grid_icon_get;
-       gic.func.state_get = NULL;
-       gic.func.del = _grid_del;
+       ecore_x_icccm_name_class_set(x_main_win, "NORMAL_WINDOW", "NORMAL_WINDOW");
 
-       int i;
-       griditem_t *newgi;
+       set_focus_for_app_window(x_main_win, EINA_FALSE);
 
-       for (i = 0; i < N_IMAGES; i++)
+}
+
+Evas_Object *create_win(ClipdrawerData *cd, const char *name)
+{
+       CALLED();
+
+       Evas_Object *win = elm_win_add(NULL, name, ELM_WIN_BASIC);
+       if (!win)
        {
-               clipdrawer_add_item(g_images_path[0], GI_IMAGE);
+               DMSG("ERROR: elm_win_add return NULL\n");
+               return NULL;
        }
+       elm_win_title_set(win, name);
+       elm_win_borderless_set(win, EINA_TRUE);
+       ecore_x_window_size_get(ecore_x_window_root_first_get(), &cd->root_w, &cd->root_h);
+       DMSG("root_w: %d, root_h: %d\n", cd->root_w, cd->root_h);
+       evas_object_resize(win, cd->root_w, cd->root_h);
+
+       elm_scale_set((double)cd->root_w/DEFAULT_WIDTH);
+       return win;
+}
 
-       clipdrawer_add_item("clipboard history", GI_TEXT);
+static void set_sliding_win_geometry(ClipdrawerData *cd)
+{
+       CALLED();
+       Ecore_X_Window zone;
+       Evas_Coord x, y, w, h;
+       zone = ecore_x_e_illume_zone_get(cd->x_main_win);
+       DTRACE(" zone:%x\n", zone);
 
-       evas_object_show (ad->hig);
+       if (cd->o_degree == 90 || cd->o_degree == 270)
+       {
+               h = cd->anim_count * CLIPDRAWER_HEIGHT_LANDSCAPE / ANIM_DURATION;
+               x = 0;
+               y = cd->root_w - h;
+               w = cd->root_h;
+       }
+       else
+       {
+               h = cd->anim_count * CLIPDRAWER_HEIGHT / ANIM_DURATION;
+               x = 0;
+               y = cd->root_h - h;
+               w = cd->root_w;
+       }
 
-// for debugging, calc history pos
-/*
-   Evas_Coord x, y, w, h;
-   Evas_Coord vx, vy, vw, vh;
+       if (!h)
+               w = 0;
 
-   edje_object_part_geometry_get(elm_layout_edje_get(ad->ly_main),"imagehistory/list",&x,&y,&w,&h);
-   evas_object_geometry_get (ad->hig, &vx,&vy,&vw,&vh);
-   fprintf(stderr, "## x = %d, y = %d, w = %d, h = %d\n", x, y, w, h);
-   fprintf(stderr, "## vx = %d, vy = %d, vw = %d, vh = %d\n", vx, vy, vw, vh);
-*/
+       DTRACE("[CBHM] change degree geometry... (%d, %d, %d x %d)\n", x, y, w, h);
+       int clipboard_state;
+       if (cd->anim_count)
+               clipboard_state = ECORE_X_ILLUME_CLIPBOARD_STATE_ON;
+       else
+               clipboard_state = ECORE_X_ILLUME_CLIPBOARD_STATE_OFF;
+       ecore_x_e_illume_clipboard_geometry_set(zone, x, y, w, h);
+       ecore_x_e_illume_clipboard_state_set(zone, clipboard_state);
+}
 
-//     if (get_item_counts() != 0)
-//             clipdrawer_update_contents(ad);
+void set_rotation_to_clipdrawer(ClipdrawerData *cd)
+{
+       CALLED();
+       int angle = cd->o_degree;
+       int x, y, w, h;
 
-       return 0;
+       if (angle == 180) // reverse
+       {
+               h = CLIPDRAWER_HEIGHT;
+               x = 0;
+               y = 0;
+               w = cd->root_w;
+       }
+       else if (angle == 90) // right rotate
+       {
+               h = CLIPDRAWER_HEIGHT_LANDSCAPE;
+               x = cd->root_w - h;
+               y = 0;
+               w = cd->root_h;
+       }
+       else if (angle == 270) // left rotate
+       {
+               h = CLIPDRAWER_HEIGHT_LANDSCAPE;
+               x = 0;
+               y = 0;
+               w = cd->root_h;
+       }
+       else // angle == 0
+       {
+               h = CLIPDRAWER_HEIGHT;
+               x = 0;
+               y = cd->root_h - h;
+               w = cd->root_w;
+       }
+
+       evas_object_resize(cd->main_win, w, h);
+       evas_object_move(cd->main_win, x, y);
+       if (cd->anim_count == ANIM_DURATION)
+               set_sliding_win_geometry(cd);
 }
 
-int clipdrawer_create_view(void *data)
+static Eina_Bool _get_anim_pos(ClipdrawerData *cd, int *sp, int *ep)
 {
-       struct appdata *ad = data;
-
-       clipdrawer_init(ad);
+       if (!sp || !ep)
+               return EINA_FALSE;
 
-       // for debug
-       // at starting, showing app view
-//     clipdrawer_activate_view(ad);
+       int angle = cd->o_degree;
+       int anim_start, anim_end;
 
-//     clipdrawer_anim_show_effect(ad);
+       if (angle == 180) // reverse
+       {
+               anim_start = -(cd->root_h - CLIPDRAWER_HEIGHT);
+               anim_end = 0;
+       }
+       else if (angle == 90) // right rotate
+       {
+               anim_start = cd->root_w;
+               anim_end = anim_start - CLIPDRAWER_HEIGHT_LANDSCAPE;
+       }
+       else if (angle == 270) // left rotate
+       {
+               anim_start = -(cd->root_w - CLIPDRAWER_HEIGHT_LANDSCAPE);
+               anim_end = 0;
+       }
+       else // angle == 0
+       {
+               anim_start = cd->root_h;
+               anim_end = anim_start - CLIPDRAWER_HEIGHT;
+       }
 
-       return 0;
+       *sp = anim_start;
+       *ep = anim_end;
+       return EINA_TRUE;
 }
 
-Ecore_Timer *tm_anim;
-
-Eina_Bool anim_pos_calc_cb(void *data)
+static Eina_Bool _do_anim_delta_pos(ClipdrawerData *cd, int sp, int ep, int ac, int *dp)
 {
-       struct appdata *ad = data;
+       if (!dp)
+               return EINA_FALSE;
 
-       static int anim_count = 0;
-       int anim_starty, anim_endy, deltay;
+       int angle = cd->o_degree;
+       int delta;
        double posprop;
+       posprop = 1.0*ac/ANIM_DURATION;
 
-       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
+       {
+               delta = (int)((ep-sp)*posprop);
+               evas_object_move(cd->main_win, 0, sp+delta);
+       }
+       else if (angle == 90) // right rotate
+       {
+               delta = (int)((ep-sp)*posprop);
+               evas_object_move(cd->main_win, sp+delta, 0);
        }
+       else if (angle == 270) // left rotate
+       {
+               delta = (int)((ep-sp)*posprop);
+               evas_object_move(cd->main_win, sp+delta, 0);
+       }
+       else // angle == 0
+       {
+               delta = (int)((sp-ep)*posprop);
+               evas_object_move(cd->main_win, 0, sp-delta);
+       }
+       
+       *dp = delta;
+
+       return EINA_TRUE;
+}
+
+static void stop_animation(AppData *ad)
+{
+       CALLED();
+       ClipdrawerData *cd = ad->clipdrawer;
+       cd->anim_status = STATUS_NONE;
+       if (cd->anim_timer)
+       {
+               ecore_timer_del(cd->anim_timer);
+               cd->anim_timer = NULL;
+       }
+
+       set_sliding_win_geometry(cd);
+}
+
+static Eina_Bool anim_pos_calc_cb(void *data)
+{
+       AppData *ad = data;
+       ClipdrawerData *cd = ad->clipdrawer;
+       int anim_start, anim_end, delta;
+
+       _get_anim_pos(cd, &anim_start, &anim_end);
 
-       if (anim_count > ANIM_DURATION)
+       if (cd->anim_status == SHOW_ANIM)
        {
-               anim_count = 0;
-               if (ad->anim_status == HIDE_ANIM)
+               if (cd->anim_count > ANIM_DURATION)
                {
-                       evas_object_hide(ad->win_main);
-                       elm_win_lower(ad->win_main);
-                       unset_transient_for(ad);
+                       cd->anim_count = ANIM_DURATION;
+                       stop_animation(ad);
+                       return EINA_FALSE;
                }
-               ad->anim_status = STATUS_NONE;
-               return EINA_FALSE;
+               _do_anim_delta_pos(cd, anim_start, anim_end, cd->anim_count, &delta);
+               if (cd->anim_count == 1)
+                       evas_object_show(cd->main_win);
+               cd->anim_count++;
        }
-
-       posprop = 1.0*anim_count/ANIM_DURATION;
-       switch (ad->anim_status)
-       {
-               case HIDE_ANIM:
-                       deltay = (int)((anim_endy-anim_starty)*posprop);
-                       evas_object_move(ad->win_main, 0, anim_starty+deltay);
-                       //fprintf(stderr, "## cur pos y = %d\n", anim_starty+deltay);
-                       break;
-               case SHOW_ANIM:
-                       deltay = (int)((anim_starty-anim_endy)*posprop);
-                       evas_object_move(ad->win_main, 0, anim_starty-deltay);
-                       //fprintf(stderr, "## cur pos y = %d\n", anim_starty-deltay);
-                       break;
-               default:
+       else if (cd->anim_status == HIDE_ANIM)
+       {
+               if (cd->anim_count < 0)
+               {
+                       cd->anim_count = 0;
+                       evas_object_hide(cd->main_win);
+                       elm_win_lower(cd->main_win);
+                       unset_transient_for(cd->x_main_win, ad->x_active_win);
+                       stop_animation(ad);
+                       _delete_mode_set(ad, EINA_FALSE);
                        return EINA_FALSE;
+               }
+               _do_anim_delta_pos(cd, anim_start, anim_end, cd->anim_count, &delta);
+               cd->anim_count--;
+       }
+       else
+       {
+               stop_animation(ad);
+               return EINA_FALSE;
        }
 
-       anim_count++;
        return EINA_TRUE;
 }
 
-void clipdrawer_anim_effect(void *data, anim_status_t atype)
+static Eina_Bool clipdrawer_anim_effect(AppData *ad, AnimStatus atype)
 {
-       struct appdata *ad = data;
-
-       if (ad->anim_status != STATUS_NONE)
+       CALLED();
+       ClipdrawerData *cd = ad->clipdrawer;
+       if (atype == cd->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 = atype;
-       ecore_timer_add(ANIM_FLOPS, anim_pos_calc_cb, ad);
+       cd->anim_status = atype;
+
+       if (cd->anim_timer)
+               ecore_timer_del(cd->anim_timer);
+       cd->anim_timer = ecore_timer_add(ANIM_FLOPS, anim_pos_calc_cb, ad);
+
+       return EINA_TRUE;
 }
 
-void clipdrawer_activate_view(void *data)
+void clipdrawer_activate_view(AppData* ad)
 {
-       struct appdata *ad = data;
-       
-       if (ad->win_main)
+       CALLED();
+       ClipdrawerData *cd = ad->clipdrawer;
+       if (cd->main_win)
        {
-               set_transient_for(ad);
-               evas_object_show(ad->win_main);
+               set_focus_for_app_window(cd->x_main_win, EINA_TRUE);
+               set_transient_for(cd->x_main_win, ad->x_active_win);
+               cd->o_degree = get_active_window_degree(ad->x_active_win);
+               elm_win_rotation_set(cd->main_win, cd->o_degree);
+               set_rotation_to_clipdrawer(cd);
+               evas_object_show(cd->main_win);
+               elm_win_activate(cd->main_win);
                clipdrawer_anim_effect(ad, SHOW_ANIM);
-               elm_win_activate(ad->win_main);
-               ad->windowshow = EINA_TRUE;
        }
 }
 
-void clipdrawer_lower_view(void *data)
+void clipdrawer_lower_view(AppData* ad)
 {
-       struct appdata *ad = data;
-       
-       if (ad->win_main && ad->windowshow)
+       CALLED();
+       ClipdrawerData *cd = ad->clipdrawer;
+       if (cd->main_win && cd->anim_count)
        {
+               set_focus_for_app_window(cd->x_main_win, EINA_FALSE);
+       //      if (clipdrawer_anim_effect(ad, HIDE_ANIM))
+       //              ad->windowshow = EINA_FALSE;
                clipdrawer_anim_effect(ad, HIDE_ANIM);
-               ad->windowshow = EINA_FALSE;
        }
 }
 
-void _change_gengrid_paste_textonly_mode(void *data)
+void _delete_mode_set(AppData* ad, Eina_Bool del_mode)
 {
-       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);
+       ClipdrawerData *cd = ad->clipdrawer;
+       CNP_ITEM *item = NULL;
 
-               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);      
-               }
+       delete_mode = del_mode;
+       if (del_mode)
+       {
+               edje_object_signal_emit(elm_layout_edje_get(cd->main_layout), "elm,state,show,function", "elm");
+               edje_object_signal_emit(elm_layout_edje_get(cd->main_layout), "elm,state,hide,delmode", "elm");
        }
        else
-       { // text+image paste mode
-               Elm_Gengrid_Item *item = elm_gengrid_first_item_get(ad->hig);
-
-               while (item)    
-               {
-                       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);      
-               }
+       {
+               edje_object_signal_emit(elm_layout_edje_get(cd->main_layout), "elm,state,hide,function", "elm");
+               edje_object_signal_emit(elm_layout_edje_get(cd->main_layout), "elm,state,show,delmode", "elm");
        }
-}
 
-void clipdrawer_paste_textonly_set(void *data, Eina_Bool textonly)
-{
-       struct appdata *ad = data;
-       textonly = !!textonly;
-       if (ad->pastetextonly != textonly)
-               ad->pastetextonly = textonly;
-       DTRACE("paste textonly mode = %d\n", textonly);
-
-       _change_gengrid_paste_textonly_mode(ad);
-}
+       Elm_Object_Item *gitem = elm_gengrid_first_item_get(cd->gengrid);
+       while (gitem)
+       {
+               item = elm_object_item_data_get(gitem);
+               if (del_mode)
+                       edje_object_signal_emit(elm_layout_edje_get(item->layout), "elm,state,show,delbtn", "elm");
+               else
+                       edje_object_signal_emit(elm_layout_edje_get(item->layout), "elm,state,hide,delbtn", "elm");
 
-Eina_Bool clipdrawer_paste_textonly_get(void *data)
-{
-       struct appdata *ad = data;
-       return ad->pastetextonly;
+               gitem = elm_gengrid_item_next_get(gitem);
+       }
 }