4 #include "xcnphandler.h"
5 #include "clipdrawer.h"
7 #define DELETE_ICON_PATH "/usr/share/icon/cbhm/05_delete.png"
8 #define IM "/usr/share/icon/cbhm/"
9 static const char *g_images_path[] = {
10 IM"cbhm_default_img.png",
21 #define GRID_ITEM_SIZE 100
23 // 0 - select mode, 1 - delete mode
24 static int g_clipdrawer_mode = 0;
25 // gic should live at gengrid callback functions
26 Elm_Gengrid_Item_Class gic;
28 typedef struct tag_gridimgitem
30 Elm_Gengrid_Item *item;
35 static int toggle_clipdrawer_mode()
37 g_clipdrawer_mode = !g_clipdrawer_mode;
38 return g_clipdrawer_mode;
41 static int get_clipdrawer_mode()
43 return g_clipdrawer_mode;
46 static void _list_longpress(void *data, Evas_Object *obj, void *event_info)
48 struct appdata *ad = data;
50 clipdrawer_change_mode(ad);
53 static void _list_click_paste(void *data, Evas_Object *obj, void *event_info)
55 struct appdata *ad = data;
56 Elm_List_Item *it = (Elm_List_Item *) elm_list_selected_item_get(obj);
60 elm_list_item_selected_set(it, 0);
66 cpdata = elm_list_item_label_get(it);
69 cplen = strlen(cpdata);
70 p = malloc(cplen + 1);
71 snprintf(p, cplen+1, "%s", cpdata);
72 elm_selection_set(1, obj, /*ELM_SEL_FORMAT_TEXT*/1, p);
73 // elm_selection_set(1, obj, /*ELM_SEL_FORMAT_MARKUP*/2, p);
75 // clipdrawer_lower_view(ad);
78 static void _list_del_response_cb(void *data, Evas_Object *obj, void *event_info)
80 Elm_List_Item *it = (Elm_List_Item *)data;
83 if((int)event_info == ELM_POPUP_RESPONSE_OK)
84 elm_list_item_del(it);
87 static void _list_click_delete(void *data, Evas_Object *obj, void *event_info)
89 struct appdata *ad = data;
90 Elm_List_Item *it = (Elm_List_Item *) elm_list_selected_item_get(obj);
94 elm_list_item_selected_set(it, 0);
96 Evas_Object *popup = elm_popup_add(ad->win_main);
97 elm_popup_timeout_set(popup, 3);
98 evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
99 elm_popup_desc_set(popup, "Are you sure delete this?");
100 elm_popup_buttons_add(popup, 2,
101 "Yes", ELM_POPUP_RESPONSE_OK,
102 "No", ELM_POPUP_RESPONSE_CANCEL,
104 evas_object_smart_callback_add(popup, "response", _list_del_response_cb, it);
105 evas_object_show(popup);
107 // char *slabel = NULL;
108 // slabel = elm_list_item_label_get(it);
111 int clipdrawer_update_contents(void *data)
113 struct appdata *ad = data;
116 // if delete mode, then back to normal mode
117 // if (get_clipdrawer_mode())
118 // clipdrawer_change_mode(ad);
120 elm_list_clear(ad->txtlist);
121 for (i = 0; i < HISTORY_QUEUE_MAX_TXT_ITEMS; i++)
123 pos = get_current_history_position()+i;
124 if (pos > HISTORY_QUEUE_MAX_TXT_ITEMS-1)
125 pos = pos-HISTORY_QUEUE_MAX_TXT_ITEMS;
126 if (get_item_contents_by_pos(pos) != NULL && strlen(get_item_contents_by_pos(pos)) > 0)
128 elm_list_item_append(ad->txtlist, get_item_contents_by_pos(pos), NULL, NULL, NULL, ad);
131 elm_list_go(ad->txtlist);
133 /* FIXME : sometimes when list update, screen isn't updated */
138 const char* clipdrawer_get_plain_string_from_escaped(char *escstr)
140 /* TODO : is it should be here? besides, remove dependency for entry */
141 /* NOTE : return string should be freed */
142 return elm_entry_markup_to_utf8(escstr);
145 Evas_Object* _grid_icon_get(const void *data, Evas_Object *obj, const char *part)
147 int delete_mode = get_clipdrawer_mode();
148 gridimgitem_t *ti = (gridimgitem_t *)data;
149 if (!strcmp(part, "elm.swallow.icon"))
151 Evas_Object *icon = elm_icon_add(obj);
152 elm_icon_file_set(icon, ti->path, NULL);
153 evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
154 evas_object_show(icon);
157 else if (!strcmp(part, "elm.swallow.end") && delete_mode)
159 ti->delbtn = elm_check_add(obj);
160 elm_object_style_set(ti->delbtn, "extended/imagegrid");
161 elm_check_state_set(ti->delbtn, 1);
162 evas_object_show(ti->delbtn);
169 static void _grid_longpress(void *data, Evas_Object *obj, void *event_info)
171 struct appdata *ad = data;
172 clipdrawer_change_mode(ad);
176 static void _grid_click_paste(void *data, Evas_Object *obj, void *event_info)
178 struct appdata *ad = data;
181 Elm_Gengrid_Item *sgobj = NULL;
182 sgobj = elm_gengrid_selected_item_get(ad->imggrid);
183 gridimgitem_t *ti = NULL;
184 ti = elm_gengrid_item_data_get(sgobj);
188 DTRACE("ERR: cbhm can't get the selected image\n");
191 len = strlen(ti->path);
192 p = malloc(len + 10);
193 snprintf(p,len+10, "file:///%s", ti->path);
195 elm_selection_set(/*secondary*/1,obj,/*ELM_SEL_FORMAT_IMAGE*/4,p);
197 // clipdrawer_lower_view(ad);
199 elm_gengrid_item_selected_set(sgobj, EINA_FALSE);
202 static void _grid_del_response_cb(void *data, Evas_Object *obj, void *event_info)
204 Elm_Gengrid_Item *it = (Elm_Gengrid_Item *)data;
205 evas_object_del(obj);
207 if((int)event_info == ELM_POPUP_RESPONSE_OK)
208 elm_gengrid_item_del(it);
211 static void _grid_click_delete(void *data, Evas_Object *obj, void *event_info)
213 struct appdata *ad = data;
214 Elm_Gengrid_Item *sgobj = NULL;
215 sgobj = elm_gengrid_selected_item_get(ad->imggrid);
216 gridimgitem_t *ti = NULL;
217 ti = elm_gengrid_item_data_get(sgobj);
221 DTRACE("ERR: cbhm can't get the clicked del image\n");
225 Evas_Object *popup = elm_popup_add(ad->win_main);
226 elm_popup_timeout_set(popup, 3);
227 evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
228 elm_popup_desc_set(popup, "Are you sure delete this?");
229 elm_popup_buttons_add(popup, 2,
230 "Yes", ELM_POPUP_RESPONSE_OK,
231 "No", ELM_POPUP_RESPONSE_CANCEL,
233 evas_object_smart_callback_add(popup, "response", _grid_del_response_cb, sgobj);
234 evas_object_show(popup);
237 void _grid_del(const void *data, Evas_Object *obj)
239 gridimgitem_t *ti = (gridimgitem_t *)data;
240 eina_stringshare_del(ti->path);
244 int clipdrawer_refresh_imghistory_item(void *data, int delete_mode)
246 struct appdata *ad = data;
247 Eina_List *oldlist = NULL;
249 Elm_Gengrid_Item *lgrid;
250 gridimgitem_t *lgitem;
254 oldlist = elm_gengrid_items_get(ad->imggrid);
255 elm_layout_content_unset(ad->ly_main, "imagehistory/list");
256 ngg = elm_gengrid_add(ad->win_main);
257 elm_layout_content_set(ad->ly_main, "imagehistory/list", ngg);
260 elm_gengrid_item_size_set(ad->imggrid, GRID_ITEM_SIZE, GRID_ITEM_SIZE+3);
261 elm_gengrid_align_set(ad->imggrid, 0.0, 0.0);
262 elm_gengrid_horizontal_set(ad->imggrid, EINA_TRUE);
263 elm_gengrid_bounce_set(ad->imggrid, EINA_TRUE, EINA_FALSE);
264 elm_gengrid_multi_select_set(ad->imggrid, EINA_FALSE);
266 evas_object_smart_callback_add(ad->imggrid, "selected", _grid_click_delete, ad);
268 evas_object_smart_callback_add(ad->imggrid, "selected", _grid_click_paste, ad);
269 evas_object_smart_callback_add(ad->imggrid, "longpressed", _grid_longpress, ad);
270 evas_object_size_hint_weight_set(ad->imggrid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
272 gic.item_style = "default_grid";
273 gic.func.label_get = NULL;
274 gic.func.icon_get = _grid_icon_get;
275 gic.func.state_get = NULL;
276 gic.func.del = _grid_del;
278 EINA_LIST_REVERSE_FOREACH(oldlist, l, lgrid)
280 lgitem = elm_gengrid_item_data_get(lgrid);
281 clipdrawer_add_image_item(lgitem->path);
284 evas_object_show (ad->imggrid);
286 elm_gengrid_clear(oldgg);
287 evas_object_hide(oldgg);
288 evas_object_del(oldgg);
293 int clipdrawer_refresh_txthistory_item(void *data, int delete_mode)
295 struct appdata *ad = data;
296 Eina_List *oldlist = NULL;
298 Elm_List_Item *litem;
300 Evas_Object *ntl = NULL;
301 // Evas_Object *ci = NULL;
303 oldlist = elm_list_items_get(ad->txtlist);
304 elm_layout_content_unset(ad->ly_main, "texthistory/list");
305 ntl = elm_list_add(ad->win_main);
306 elm_layout_content_set(ad->ly_main, "texthistory/list", ntl);
307 elm_object_style_set(ntl, "extended/historylist");
309 EINA_LIST_FOREACH(oldlist, l, litem)
311 ltext = elm_list_item_label_get(litem);
314 Evas_Object *ci = elm_icon_add(ad->win_main);
315 elm_icon_file_set(ci, DELETE_ICON_PATH, NULL);
316 evas_object_size_hint_min_set(ci, 33 * elm_scale_get(), 33 * elm_scale_get());
317 // evas_object_size_hint_aspect_set(ci, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
318 evas_object_show(ci);
319 elm_list_item_append(ntl, ltext, NULL, ci, NULL, ad);
323 elm_list_item_append(ntl, ltext, NULL, NULL, NULL, ad);
327 elm_list_clear(ad->txtlist);
328 evas_object_hide(ad->txtlist);
329 evas_object_del(ad->txtlist);
332 evas_object_size_hint_weight_set(ad->txtlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
334 evas_object_smart_callback_add(ad->txtlist, "selected", _list_click_delete, ad);
336 evas_object_smart_callback_add(ad->txtlist, "selected", _list_click_paste, ad);
337 evas_object_smart_callback_add(ad->txtlist, "longpressed", _list_longpress, ad);
339 elm_list_go(ad->txtlist);
344 int clipdrawer_change_mode(void *data)
346 struct appdata *ad = data;
348 toggle_clipdrawer_mode();
350 DTRACE("clipdrawer delete mode = %d\n", get_clipdrawer_mode());
352 clipdrawer_refresh_imghistory_item(ad, get_clipdrawer_mode());
353 clipdrawer_refresh_txthistory_item(ad, get_clipdrawer_mode());
358 // FIXME: how to remove calling g_get_main_appdata()?
359 // it's mainly used at 'clipdrawer_add_image_item'
360 int clipdrawer_add_image_item(char *imagepath)
362 struct appdata *ad = g_get_main_appdata();
363 gridimgitem_t *newgenimg = NULL;
364 char* filepath = NULL;
365 Eina_List *igl = NULL;
366 unsigned int igl_counter = 0;
368 // if delete mode, then back to normal mode
369 // if (get_clipdrawer_mode())
370 // clipdrawer_change_mode(ad);
372 if (!check_regular_file(imagepath))
374 DTRACE("Error : it isn't normal file = %s\n", imagepath);
378 igl = elm_gengrid_items_get(ad->imggrid);
379 igl_counter = eina_list_count(igl);
380 if (igl_counter >= HISTORY_QUEUE_MAX_IMG_ITEMS)
382 elm_gengrid_item_del(eina_list_data_get(eina_list_last(igl)));
385 newgenimg = malloc(sizeof(gridimgitem_t));
386 newgenimg->path = eina_stringshare_add(imagepath);
387 newgenimg->item = elm_gengrid_item_prepend(ad->imggrid, &gic, newgenimg, NULL, NULL);
393 clipdrawer_ly_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
395 struct appdata *ad = data;
397 #define EDJE_CLOSE_PART_PREFIX "closebutton/"
398 if (!strncmp(source, EDJE_CLOSE_PART_PREFIX, strlen(EDJE_CLOSE_PART_PREFIX)))
400 clipdrawer_lower_view(ad);
404 int clipdrawer_init(void *data)
406 struct appdata *ad = data;
409 // for elm_check, elm_list
410 elm_theme_extension_add(NULL, APP_EDJ_FILE);
412 cdy = (1.0*CLIPDRAWER_HEIGHT/SCREEN_HEIGHT)*ad->root_h;
413 cdw = (1.0*CLIPDRAWER_POS_Y/SCREEN_HEIGHT)*ad->root_h;
415 evas_object_resize(ad->win_main, ad->root_w, (int)cdy);
416 evas_object_move(ad->win_main, CLIPDRAWER_POS_X, (int)cdw);
417 evas_object_resize(ad->ly_main, ad->root_w, (int)cdy);
418 evas_object_move(ad->ly_main, CLIPDRAWER_POS_X, (int)cdw);
420 edje_object_signal_callback_add(elm_layout_edje_get(ad->ly_main), "mouse,up,1", "*", clipdrawer_ly_clicked, ad);
423 ad->imggrid = elm_gengrid_add(ad->win_main);
424 elm_layout_content_set(ad->ly_main, "imagehistory/list", ad->imggrid);
425 elm_gengrid_item_size_set(ad->imggrid, GRID_ITEM_SIZE, GRID_ITEM_SIZE+3);
426 elm_gengrid_align_set(ad->imggrid, 0.0, 0.0);
427 elm_gengrid_horizontal_set(ad->imggrid, EINA_TRUE);
428 elm_gengrid_bounce_set(ad->imggrid, EINA_TRUE, EINA_FALSE);
429 elm_gengrid_multi_select_set(ad->imggrid, EINA_FALSE);
430 evas_object_smart_callback_add(ad->imggrid, "selected", _grid_click_paste, ad);
431 evas_object_smart_callback_add(ad->imggrid, "longpressed", _grid_longpress, ad);
432 evas_object_size_hint_weight_set(ad->imggrid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
434 elm_gengrid_clear(ad->imggrid);
436 gic.item_style = "default_grid";
437 gic.func.label_get = NULL;
438 gic.func.icon_get = _grid_icon_get;
439 gic.func.state_get = NULL;
440 gic.func.del = _grid_del;
443 gridimgitem_t *newgenimg;
445 for (i = 0; i < N_IMAGES; i++)
447 clipdrawer_add_image_item(g_images_path[i]);
450 evas_object_show (ad->imggrid);
452 // for debugging, calc image history pos
454 Evas_Coord x, y, w, h;
455 Evas_Coord vx, vy, vw, vh;
457 edje_object_part_geometry_get(elm_layout_edje_get(ad->ly_main),"imagehistory/list",&x,&y,&w,&h);
458 evas_object_geometry_get (ad->imggrid, &vx,&vy,&vw,&vh);
459 fprintf(stderr, "## x = %d, y = %d, w = %d, h = %d\n", x, y, w, h);
460 fprintf(stderr, "## vx = %d, vy = %d, vw = %d, vh = %d\n", vx, vy, vw, vh);
463 ad->txtlist = elm_list_add(ad->win_main);
464 elm_layout_content_set(ad->ly_main, "texthistory/list", ad->txtlist);
465 elm_object_style_set(ad->txtlist, "extended/historylist");
466 evas_object_size_hint_weight_set(ad->txtlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
467 evas_object_smart_callback_add(ad->txtlist, "selected", _list_click_paste, ad);
468 evas_object_smart_callback_add(ad->txtlist, "longpressed", _list_longpress, ad);
469 elm_list_item_append(ad->txtlist, "default", NULL, NULL, NULL, ad);
471 elm_list_go(ad->txtlist);
473 if (get_item_counts() != 0)
474 clipdrawer_update_contents(ad);
479 int clipdrawer_create_view(void *data)
481 struct appdata *ad = data;
486 // at starting, showing app view
487 //clipdrawer_activate_view(ad);
492 void clipdrawer_activate_view(void *data)
494 struct appdata *ad = data;
498 evas_object_show(ad->win_main);
499 elm_win_activate(ad->win_main);
503 void clipdrawer_lower_view(void *data)
505 struct appdata *ad = data;
509 evas_object_hide(ad->win_main);
510 elm_win_lower(ad->win_main);
512 // if delete mode, then back to normal mode
513 if (get_clipdrawer_mode())
514 clipdrawer_change_mode(ad);