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_W 187
22 #define GRID_ITEM_H 151
23 #define GRID_IMAGE_LIMIT_W 91
24 #define GRID_IMAGE_LIMIT_H 113
26 // 0 - select mode, 1 - delete mode
27 static int g_clipdrawer_mode = 0;
28 // gic should live at gengrid callback functions
29 Elm_Gengrid_Item_Class gic;
31 typedef struct tag_griditem
33 Elm_Gengrid_Item *item;
39 static int toggle_clipdrawer_mode()
41 g_clipdrawer_mode = !g_clipdrawer_mode;
42 return g_clipdrawer_mode;
45 static int get_clipdrawer_mode()
47 return g_clipdrawer_mode;
50 static void _list_click_paste(void *data, Evas_Object *obj, void *event_info)
52 struct appdata *ad = data;
53 Elm_List_Item *it = (Elm_List_Item *) elm_list_selected_item_get(obj);
57 elm_list_item_selected_set(it, 0);
62 EINA_LIST_FOREACH(elm_list_items_get(ad->txtlist), n, item)
69 fprintf(stderr, "## this c = %d, %d\n", hc, get_current_history_position());
71 // int pos = get_current_history_position() - hc;
73 int pos = get_current_history_position()-hc;
75 pos = pos+(HISTORY_QUEUE_MAX_TXT_ITEMS);
77 fprintf(stderr, "## pos = %d, %s\n", pos, get_item_contents_by_pos(pos));
78 char *p = strdup(get_item_contents_by_pos(pos));
80 elm_selection_set(1, obj, /*ELM_SEL_FORMAT_TEXT*/1, p);
87 cpdata = elm_entry_utf8_to_markup(elm_list_item_label_get(it));
90 cplen = strlen(cpdata);
91 p = malloc(cplen + 1);
92 snprintf(p, cplen+1, "%s", cpdata);
94 // elm_selection_set(1, obj, /*ELM_SEL_FORMAT_TEXT*/1, p);
95 // elm_selection_set(1, obj, /*ELM_SEL_FORMAT_MARKUP*/2, p);
97 // clipdrawer_lower_view(ad);
100 int clipdrawer_update_contents(void *data)
102 struct appdata *ad = data;
106 // if delete mode, then back to normal mode
107 // if (get_clipdrawer_mode())
108 // clipdrawer_change_mode(ad);
110 for (i = 0; i < HISTORY_QUEUE_MAX_TXT_ITEMS; i++)
112 pos = get_current_history_position() - i;
114 pos = pos+HISTORY_QUEUE_MAX_TXT_ITEMS;
116 if (get_item_contents_by_pos(pos) != NULL && strlen(get_item_contents_by_pos(pos)) > 0)
118 unesc = clipdrawer_get_plain_string_from_escaped(get_item_contents_by_pos(pos));
119 unesc = unesc ? unesc : "";
120 elm_list_item_append(ad->txtlist, unesc, NULL, NULL, NULL, ad);
125 /* FIXME : sometimes when list update, screen isn't updated */
130 const char* clipdrawer_get_plain_string_from_escaped(char *escstr)
132 /* TODO : is it should be here? besides, remove dependency for entry */
133 /* NOTE : return string should be freed */
134 return elm_entry_markup_to_utf8(escstr);
137 Evas_Object* _grid_icon_get(const void *data, Evas_Object *obj, const char *part)
139 int delete_mode = get_clipdrawer_mode();
140 griditem_t *ti = (griditem_t *)data;
142 if (!strcmp(part, "elm.swallow.icon"))
144 if (ti->itype == GI_TEXT)
146 Evas_Object *ientry = elm_entry_add(obj);
147 elm_entry_entry_set(ientry, eina_strbuf_string_get(ti->idata));
148 elm_entry_background_color_set(ientry, 242, 233, 183, 255);
149 elm_entry_editable_set(ientry, EINA_FALSE);
150 // evas_object_size_hint_aspect_set(ientry, EVAS_ASPECT_CONTROL_HORIZONTAL, 1, 1);
151 // evas_object_resize(ientry, GRID_ITEM_W, GRID_ITEM_H);
152 evas_object_show(ientry);
155 else// if (ti->itype == GI_IMAGE)
158 Evas_Object *icon = elm_icon_add(obj);
159 elm_icon_file_set(icon, ti->idata, NULL);
160 evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
161 evas_object_show(icon);
170 my_ee = ecore_evas_buffer_new(GRID_ITEM_W, GRID_ITEM_H);
171 my_e = ecore_evas_get(my_ee);
173 bgrect = evas_object_rectangle_add(my_e);
174 evas_object_color_set(bgrect, 255, 255, 255, 255);
175 evas_object_resize(bgrect, GRID_ITEM_W, GRID_ITEM_H);
176 evas_object_move(bgrect, 0, 0);
177 evas_object_show(bgrect);
179 #define BORDER_SIZE 1
180 fgimg = evas_object_image_add(my_e);
181 evas_object_image_load_size_set(fgimg, GRID_ITEM_W-BORDER_SIZE*2, GRID_ITEM_H-BORDER_SIZE*2);
182 evas_object_image_file_set(fgimg, ti->idata, NULL);
183 evas_object_image_fill_set(fgimg, 0, 0, GRID_ITEM_W-BORDER_SIZE*2, GRID_ITEM_H-BORDER_SIZE*2);
184 evas_object_image_filled_set(fgimg, 1);
186 evas_object_image_size_get(fgimg, &x, &y);
187 fprintf(stderr, "## img x = %d, y = %d\n", x, y);
188 evas_object_resize(fgimg, GRID_ITEM_W-BORDER_SIZE*2, GRID_ITEM_H-BORDER_SIZE*2);
189 evas_object_move(fgimg, BORDER_SIZE, BORDER_SIZE);
190 evas_object_show(fgimg);
192 icon = evas_object_image_add(evas_object_evas_get(obj));
194 evas_object_image_data_set(icon, NULL);
195 evas_object_image_size_set(icon, GRID_ITEM_W, GRID_ITEM_H);
196 evas_object_image_fill_set(icon, 0, 0, GRID_ITEM_W, GRID_ITEM_H);
197 evas_object_image_filled_set(icon, EINA_TRUE);
198 evas_object_image_data_copy_set(icon, (int *)ecore_evas_buffer_pixels_get(my_ee));
199 evas_object_image_data_update_add(icon, 0, 0, GRID_ITEM_W, GRID_ITEM_H);
201 evas_object_del(bgrect);
202 evas_object_del(fgimg);
203 ecore_evas_free(my_ee);
211 else if (!strcmp(part, "elm.swallow.end") && delete_mode)
213 ti->delbtn = elm_check_add(obj);
214 elm_object_style_set(ti->delbtn, "extended/imagegrid");
215 elm_check_state_set(ti->delbtn, EINA_TRUE);
216 evas_object_show(ti->delbtn);
224 static void _grid_longpress(void *data, Evas_Object *obj, void *event_info)
226 struct appdata *ad = data;
227 clipdrawer_change_mode(ad);
231 static void _grid_click_paste(void *data, Evas_Object *obj, void *event_info)
233 struct appdata *ad = data;
236 Elm_Gengrid_Item *sgobj = NULL;
237 sgobj = elm_gengrid_selected_item_get(ad->hig);
238 griditem_t *ti = NULL;
239 ti = elm_gengrid_item_data_get(sgobj);
243 DTRACE("ERR: cbhm can't get the selected image\n");
246 if (ti->itype == GI_TEXT)
248 char *p = strdup(eina_strbuf_string_get(ti->idata));
250 elm_selection_set(1, obj, /*ELM_SEL_FORMAT_TEXT*/1, p);
252 else //if (ti->itype == GI_IMAGE)
254 len = strlen(ti->idata);
255 p = malloc(len + 10);
256 snprintf(p,len+10, "file:///%s", ti->idata);
258 elm_selection_set(/*secondary*/1,obj,/*ELM_SEL_FORMAT_IMAGE*/4,p);
260 elm_gengrid_item_selected_set(sgobj, EINA_FALSE);
264 static void _grid_del_response_cb(void *data, Evas_Object *obj, void *event_info)
266 Elm_Gengrid_Item *it = (Elm_Gengrid_Item *)data;
267 evas_object_del(obj);
269 if((int)event_info == ELM_POPUP_RESPONSE_OK)
270 elm_gengrid_item_del(it);
273 static void _grid_click_delete(void *data, Evas_Object *obj, void *event_info)
275 struct appdata *ad = data;
276 Elm_Gengrid_Item *sgobj = NULL;
277 sgobj = elm_gengrid_selected_item_get(ad->hig);
278 griditem_t *ti = NULL;
279 ti = elm_gengrid_item_data_get(sgobj);
283 DTRACE("ERR: cbhm can't get the clicked del image\n");
287 Evas_Object *popup = elm_popup_add(ad->win_main);
288 elm_popup_timeout_set(popup, 5);
289 evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
290 elm_popup_desc_set(popup, "Are you sure delete this?");
291 elm_popup_buttons_add(popup, 2,
292 "Yes", ELM_POPUP_RESPONSE_OK,
293 "No", ELM_POPUP_RESPONSE_CANCEL,
295 evas_object_smart_callback_add(popup, "response", _grid_del_response_cb, sgobj);
296 evas_object_show(popup);
299 void _grid_del(const void *data, Evas_Object *obj)
301 griditem_t *ti = (griditem_t *)data;
302 if (ti->itype == GI_IMAGE)
303 eina_stringshare_del(ti->idata);
305 eina_strbuf_free(ti->idata);
309 int clipdrawer_refresh_history_item(void *data, int delete_mode)
311 struct appdata *ad = data;
312 Eina_List *oldlist = NULL;
314 Elm_Gengrid_Item *lgrid;
319 oldlist = elm_gengrid_items_get(ad->hig);
320 elm_layout_content_unset(ad->ly_main, "imagehistory/list");
321 ngg = elm_gengrid_add(ad->win_main);
322 elm_layout_content_set(ad->ly_main, "imagehistory/list", ngg);
325 elm_gengrid_item_size_set(ad->hig, GRID_ITEM_W, GRID_ITEM_H+3);
326 elm_gengrid_align_set(ad->hig, 0.5, 0.5);
327 // elm_gengrid_horizontal_set(ad->hig, EINA_TRUE);
328 elm_gengrid_bounce_set(ad->hig, EINA_TRUE, EINA_FALSE);
329 elm_gengrid_multi_select_set(ad->hig, EINA_FALSE);
331 evas_object_smart_callback_add(ad->hig, "selected", _grid_click_delete, ad);
333 evas_object_smart_callback_add(ad->hig, "selected", _grid_click_paste, ad);
334 evas_object_smart_callback_add(ad->hig, "longpressed", _grid_longpress, ad);
335 evas_object_size_hint_weight_set(ad->hig, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
337 gic.item_style = "default_grid";
338 gic.func.label_get = NULL;
339 gic.func.icon_get = _grid_icon_get;
340 gic.func.state_get = NULL;
341 gic.func.del = _grid_del;
343 EINA_LIST_REVERSE_FOREACH(oldlist, l, lgrid)
345 lgitem = elm_gengrid_item_data_get(lgrid);
346 clipdrawer_add_item(lgitem->idata, GI_IMAGE);
349 evas_object_show (ad->hig);
351 elm_gengrid_clear(oldgg);
352 evas_object_hide(oldgg);
353 evas_object_del(oldgg);
358 int clipdrawer_change_mode(void *data)
360 struct appdata *ad = data;
362 toggle_clipdrawer_mode();
364 DTRACE("clipdrawer delete mode = %d\n", get_clipdrawer_mode());
366 clipdrawer_refresh_history_item(ad, get_clipdrawer_mode());
371 // FIXME: how to remove calling g_get_main_appdata()?
372 // it's mainly used at 'clipdrawer_image_item'
373 int clipdrawer_add_item(char *idata, int type)
375 struct appdata *ad = g_get_main_appdata();
376 griditem_t *newgi = NULL;
377 char* filepath = NULL;
378 Eina_List *igl = NULL;
379 unsigned int igl_counter = 0;
381 // if delete mode, then back to normal mode
382 // if (get_clipdrawer_mode())
383 // clipdrawer_change_mode(ad);
386 if (!check_regular_file(imagepath))
388 DTRACE("Error : it isn't normal file = %s\n", imagepath);
392 igl = elm_gengrid_items_get(ad->hig);
393 igl_counter = eina_list_count(igl);
396 Elm_Gengrid_Item *item;
397 griditem_t *ti = NULL;
399 EINA_LIST_FOREACH(igl, l, item)
401 ti = elm_gengrid_item_data_get(item);
402 if (!strcmp(ti->path, imagepath))
404 DTRACE("Error : duplicated file path = %s\n", imagepath);
409 if (igl_counter >= HISTORY_QUEUE_MAX_IMG_ITEMS)
411 elm_gengrid_item_del(eina_list_data_get(eina_list_last(igl)));
414 newgi = malloc(sizeof(griditem_t));
415 newgi->itype = GI_IMAGE;
416 newgi->idata = eina_stringshare_add(imagepath);
417 newgi->item = elm_gengrid_item_prepend(ad->hig, &gic, newgi, NULL, NULL);
421 static int testmode = 0;
424 newgi = malloc(sizeof(griditem_t));
427 newgi->itype = GI_IMAGE;
428 newgi->idata = eina_stringshare_add(imagepath);
432 newgi->itype = GI_TEXT;
433 newgi->idata = eina_strbuf_new();
434 eina_strbuf_append(newgi->idata, "hello!! <item absize=40x30 href=file:///usr/share/icon/cbhm/cbhm_default_img.png></item>");
437 newgi->item = elm_gengrid_item_append(ad->hig, &gic, newgi, NULL, NULL);
440 newgi = malloc(sizeof(griditem_t));
443 fprintf(stderr, "## add %d : %s\n", newgi->itype, idata);
446 newgi->idata = eina_strbuf_new();
447 eina_strbuf_append_n(newgi->idata, idata, 69);
448 if (strlen(idata) > 69)
449 eina_strbuf_append(newgi->idata, "...");
451 else //if (type == GI_IMAGE)
453 newgi->idata = eina_stringshare_add(idata);
455 newgi->item = elm_gengrid_item_prepend(ad->hig, &gic, newgi, NULL, NULL);
461 clipdrawer_ly_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
463 struct appdata *ad = data;
465 #define EDJE_CLOSE_PART_PREFIX "background/close"
466 if (!strncmp(source, EDJE_CLOSE_PART_PREFIX, strlen(EDJE_CLOSE_PART_PREFIX)))
468 clipdrawer_lower_view(ad);
472 int clipdrawer_init(void *data)
474 struct appdata *ad = data;
478 elm_theme_extension_add(NULL, APP_EDJ_FILE);
480 cdy = (1.0*CLIPDRAWER_HEIGHT/SCREEN_HEIGHT)*ad->root_h;
481 cdw = (1.0*CLIPDRAWER_POS_Y/SCREEN_HEIGHT)*ad->root_h;
483 evas_object_resize(ad->win_main, ad->root_w, (int)cdy);
484 evas_object_move(ad->win_main, CLIPDRAWER_POS_X, (int)cdw);
485 evas_object_resize(ad->ly_main, ad->root_w, (int)cdy);
486 evas_object_move(ad->ly_main, CLIPDRAWER_POS_X, (int)cdw);
488 edje_object_signal_callback_add(elm_layout_edje_get(ad->ly_main), "mouse,up,1", "*", clipdrawer_ly_clicked, ad);
491 ad->hig = elm_gengrid_add(ad->win_main);
492 elm_layout_content_set(ad->ly_main, "historyitems", ad->hig);
493 elm_gengrid_item_size_set(ad->hig, GRID_ITEM_W+3, GRID_ITEM_H);
494 elm_gengrid_align_set(ad->hig, 0.5, 0.5);
495 elm_gengrid_horizontal_set(ad->hig, EINA_TRUE);
496 elm_gengrid_bounce_set(ad->hig, EINA_TRUE, EINA_FALSE);
497 elm_gengrid_multi_select_set(ad->hig, EINA_FALSE);
498 evas_object_smart_callback_add(ad->hig, "selected", _grid_click_paste, ad);
499 // evas_object_smart_callback_add(ad->hig, "longpressed", _grid_longpress, ad);
500 evas_object_size_hint_weight_set(ad->hig, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
502 elm_gengrid_clear(ad->hig);
504 gic.item_style = "default_grid";
505 gic.func.label_get = NULL;
506 gic.func.icon_get = _grid_icon_get;
507 gic.func.state_get = NULL;
508 gic.func.del = _grid_del;
513 for (i = 0; i < N_IMAGES; i++)
515 clipdrawer_add_item(g_images_path[0], GI_IMAGE);
519 clipdrawer_add_item("some aslkdfjalskdjflkasdf as dflkjas df aslk fjalskdf jlaks djflaksj dflkas flkas jdflkas jdflkasj dflk asjldfk jqwlkerj qlkw jflkzjx cvlkzx vlkasj fldkjqwlkerj qwlkerj qwlrkj asldkfjalskdjflaskdjflaskjdflaksjdflkasjdflkjasldfkjaslkrj123i4o uosadf osapd fuoasiuer lqw rlqwkj foiasudfqlkj;lrqjewlr ", GI_TEXT);
521 clipdrawer_add_item("appliance r ", GI_TEXT);
522 clipdrawer_add_item("appliance k ", GI_TEXT);
523 clipdrawer_add_item("appliance s ", GI_TEXT);
526 evas_object_show (ad->hig);
528 // for debugging, calc history pos
530 Evas_Coord x, y, w, h;
531 Evas_Coord vx, vy, vw, vh;
533 edje_object_part_geometry_get(elm_layout_edje_get(ad->ly_main),"imagehistory/list",&x,&y,&w,&h);
534 evas_object_geometry_get (ad->hig, &vx,&vy,&vw,&vh);
535 fprintf(stderr, "## x = %d, y = %d, w = %d, h = %d\n", x, y, w, h);
536 fprintf(stderr, "## vx = %d, vy = %d, vw = %d, vh = %d\n", vx, vy, vw, vh);
539 // if (get_item_counts() != 0)
540 // clipdrawer_update_contents(ad);
545 int clipdrawer_create_view(void *data)
547 struct appdata *ad = data;
552 // at starting, showing app view
553 clipdrawer_activate_view(ad);
558 void clipdrawer_activate_view(void *data)
560 struct appdata *ad = data;
564 evas_object_show(ad->win_main);
565 elm_win_activate(ad->win_main);
569 void clipdrawer_lower_view(void *data)
571 struct appdata *ad = data;
575 evas_object_hide(ad->win_main);
576 elm_win_lower(ad->win_main);
578 // if delete mode, then back to normal mode
579 if (get_clipdrawer_mode())
580 clipdrawer_change_mode(ad);