4 #include "xcnphandler.h"
5 #include "clipdrawer.h"
7 #define DELETE_ICON_PATH "/usr/share/cbhm/icons/05_delete.png"
8 #define IM "/usr/share/cbhm/icons/"
9 static const char *g_images_path[] = {
10 IM"cbhm_default_img.png",
14 #define GRID_ITEM_SPACE_W 6
15 #define GRID_ITEM_SINGLE_W 187
16 #define GRID_ITEM_SINGLE_H 151
17 #define GRID_ITEM_W (GRID_ITEM_SINGLE_W+(GRID_ITEM_SPACE_W*2))
18 #define GRID_ITEM_H (GRID_ITEM_SINGLE_H)
19 #define GRID_IMAGE_LIMIT_W 91
20 #define GRID_IMAGE_LIMIT_H 113
22 // gic should live at gengrid callback functions
23 Elm_Gengrid_Item_Class gic;
25 typedef struct tag_griditem
28 Elm_Gengrid_Item *item;
29 const char *ipathdata;
30 Eina_Strbuf *istrdata;
34 static void _list_click_paste(void *data, Evas_Object *obj, void *event_info)
36 struct appdata *ad = data;
37 Elm_List_Item *it = (Elm_List_Item *) elm_list_selected_item_get(obj);
41 elm_list_item_selected_set(it, 0);
46 EINA_LIST_FOREACH(elm_list_items_get(ad->txtlist), n, item)
53 fprintf(stderr, "## this c = %d, %d\n", hc, get_current_history_position());
55 int pos = get_current_history_position()-hc;
57 pos = pos+(HISTORY_QUEUE_MAX_ITEMS);
59 fprintf(stderr, "## pos = %d, %s\n", pos, get_item_contents_by_pos(pos));
60 char *p = strdup(get_item_contents_by_pos(pos));
62 elm_selection_set(1, obj, /*ELM_SEL_FORMAT_TEXT*/1, p);
69 cpdata = elm_entry_utf8_to_markup(elm_list_item_label_get(it));
72 cplen = strlen(cpdata);
73 p = malloc(cplen + 1);
74 snprintf(p, cplen+1, "%s", cpdata);
76 // elm_selection_set(1, obj, /*ELM_SEL_FORMAT_TEXT*/1, p);
77 // elm_selection_set(1, obj, /*ELM_SEL_FORMAT_MARKUP*/2, p);
79 // clipdrawer_lower_view(ad);
82 int clipdrawer_update_contents(void *data)
84 struct appdata *ad = data;
88 for (i = 0; i < HISTORY_QUEUE_MAX_ITEMS; i++)
90 pos = get_current_history_position() - i;
92 pos = pos+HISTORY_QUEUE_MAX_ITEMS;
94 if (get_item_contents_by_pos(pos) != NULL && strlen(get_item_contents_by_pos(pos)) > 0)
96 unesc = clipdrawer_get_plain_string_from_escaped(get_item_contents_by_pos(pos));
97 unesc = unesc ? unesc : "";
98 elm_list_item_append(ad->txtlist, unesc, NULL, NULL, NULL, ad);
103 /* FIXME : sometimes when list update, screen isn't updated */
108 const char* clipdrawer_get_plain_string_from_escaped(char *escstr)
110 /* TODO : is it should be here? besides, remove dependency for entry */
111 /* NOTE : return string should be freed */
112 return elm_entry_markup_to_utf8(escstr);
115 static void _grid_del_response_cb(void *data, Evas_Object *obj, void *event_info)
117 Elm_Gengrid_Item *it = (Elm_Gengrid_Item *)data;
118 evas_object_del(obj);
120 if((int)event_info == ELM_POPUP_RESPONSE_OK)
121 elm_gengrid_item_del(it);
124 static void _grid_click_delete(void *data, Evas_Object *obj, void *event_info)
126 struct appdata *ad = data;
130 _grid_item_ly_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
132 struct appdata *ad = g_get_main_appdata();
134 Elm_Gengrid_Item *sgobj = NULL;
135 sgobj = elm_gengrid_selected_item_get(ad->hig);
136 griditem_t *ti = NULL;
137 ti = elm_gengrid_item_data_get(sgobj);
139 #define EDJE_DELBTN_PART_PREFIX "delbtn"
140 if (strncmp(source, EDJE_DELBTN_PART_PREFIX, strlen(EDJE_DELBTN_PART_PREFIX)))
144 DTRACE("ERR: cbhm can't get the selected image\n");
148 elm_gengrid_item_selected_set(sgobj, EINA_FALSE);
150 if (ti->itype == GI_TEXT)
152 char *p = strdup(eina_strbuf_string_get(ti->istrdata));
154 elm_selection_set(1, obj, /*ELM_SEL_FORMAT_TEXT*/1, p);
156 else //if (ti->itype == GI_IMAGE)
158 int len = strlen(ti->ipathdata);
159 char *p = malloc(len + 10);
160 snprintf(p,len+10, "file:///%s", ti->ipathdata);
162 elm_selection_set(/*secondary*/1,obj,/*ELM_SEL_FORMAT_IMAGE*/4,p);
170 DTRACE("ERR: cbhm can't get the selected item\n");
174 elm_gengrid_item_selected_set(sgobj, EINA_FALSE);
176 Evas_Object *popup = elm_popup_add(ad->win_main);
177 elm_popup_timeout_set(popup, 5);
178 evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
179 elm_popup_desc_set(popup, "Are you sure delete this?");
180 elm_popup_buttons_add(popup, 2,
181 "Yes", ELM_POPUP_RESPONSE_OK,
182 "No", ELM_POPUP_RESPONSE_CANCEL,
184 evas_object_smart_callback_add(popup, "response", _grid_del_response_cb, sgobj);
185 evas_object_show(popup);
188 Evas_Object* _grid_icon_get(const void *data, Evas_Object *obj, const char *part)
190 griditem_t *ti = (griditem_t *)data;
192 if (!strcmp(part, "elm.swallow.icon"))
194 if (ti->itype == GI_TEXT)
196 Evas_Object *layout = elm_layout_add (obj);
197 elm_layout_theme_set(layout, "gengrid", "widestyle", "horizontal_layout");
198 edje_object_signal_callback_add(elm_layout_edje_get(layout), "mouse,up,1", "*", _grid_item_ly_clicked, data);
199 Evas_Object *rect = evas_object_rectangle_add(evas_object_evas_get(obj));
200 evas_object_resize(rect, GRID_ITEM_W, GRID_ITEM_H);
201 evas_object_color_set(rect, 242, 233, 183, 255);
202 evas_object_show(rect);
203 elm_layout_content_set(layout, "elm.swallow.icon", rect);
205 Evas_Object *ientry = elm_scrolled_entry_add(obj);
206 evas_object_size_hint_weight_set(ientry, 0, 0);
207 Eina_Strbuf *strent = NULL;
208 char *strdata = eina_strbuf_string_get(ti->istrdata);
209 int i, skipflag, strcnt;
211 strent = eina_strbuf_new();
214 for (i = 0; i < eina_strbuf_length_get(ti->istrdata); i++)
232 eina_strbuf_append_n(strent, strdata, i);
233 // eina_strbuf_append(strent, strdata);
234 eina_strbuf_replace_all(strent, " absize=240x180 ", " absize=52x39 ");
236 eina_strbuf_append(strent, "...");
238 elm_scrolled_entry_entry_set(ientry, eina_strbuf_string_get(strent));
239 elm_scrolled_entry_editable_set(ientry, EINA_FALSE);
240 elm_scrolled_entry_context_menu_disabled_set(ientry, EINA_TRUE);
241 evas_object_show(ientry);
242 elm_layout_content_set(layout, "elm.swallow.inner", ientry);
244 eina_strbuf_free(strent);
248 else// if (ti->itype == GI_IMAGE)
250 Evas_Object *layout = elm_layout_add (obj);
251 elm_layout_theme_set(layout, "gengrid", "widestyle", "horizontal_layout");
252 edje_object_signal_callback_add(elm_layout_edje_get(layout),
253 "mouse,up,1", "*", _grid_item_ly_clicked, data);
256 sicon = evas_object_image_add(evas_object_evas_get(obj));
257 evas_object_image_load_size_set(sicon, GRID_ITEM_SINGLE_W, GRID_ITEM_SINGLE_H);
258 evas_object_image_file_set(sicon, ti->ipathdata, NULL);
259 evas_object_image_fill_set(sicon, 0, 0, GRID_ITEM_SINGLE_W, GRID_ITEM_SINGLE_H);
260 evas_object_resize(sicon, GRID_ITEM_SINGLE_W, GRID_ITEM_SINGLE_H);
261 elm_layout_content_set(layout, "elm.swallow.icon", sicon);
264 // edje_object_signal_emit(elm_layout_edje_get(layout), "elm,state,hide,delbtn", "elm");
266 Evas_Object *rect = evas_object_rectangle_add(evas_object_evas_get(obj));
267 // evas_object_resize(rect, GRID_ITEM_W, GRID_ITEM_H);
268 evas_object_color_set(rect, 0, 0, 0, 200);
269 evas_object_show(rect);
270 elm_layout_content_set(layout, "elm.swallow.cover", rect);
276 Evas_Object *icon = elm_icon_add(obj);
277 elm_icon_file_set(icon, ti->ipathdata, NULL);
278 evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
279 evas_object_show(icon);
289 my_ee = ecore_evas_buffer_new(GRID_ITEM_SINGLE_W, GRID_ITEM_SINGLE_H);
290 my_e = ecore_evas_get(my_ee);
292 bgrect = evas_object_rectangle_add(my_e);
293 evas_object_color_set(bgrect, 255, 255, 255, 255);
294 evas_object_resize(bgrect, GRID_ITEM_SINGLE_W, GRID_ITEM_SINGLE_H);
295 evas_object_move(bgrect, 0, 0);
296 evas_object_show(bgrect);
298 #define BORDER_SIZE 1
299 fgimg = evas_object_image_add(my_e);
300 evas_object_image_load_size_set(fgimg, GRID_ITEM_SINGLE_W-BORDER_SIZE*2, GRID_ITEM_SINGLE_H-BORDER_SIZE*2);
301 evas_object_image_file_set(fgimg, ti->ipathdata, NULL);
302 evas_object_image_fill_set(fgimg, 0, 0, GRID_ITEM_SINGLE_W-BORDER_SIZE*2, GRID_ITEM_SINGLE_H-BORDER_SIZE*2);
303 evas_object_image_filled_set(fgimg, 1);
305 evas_object_image_size_get(fgimg, &x, &y);
306 //fprintf(stderr, "## img x = %d, y = %d\n", x, y);
307 evas_object_resize(fgimg, GRID_ITEM_SINGLE_W-BORDER_SIZE*2, GRID_ITEM_SINGLE_H-BORDER_SIZE*2);
308 evas_object_move(fgimg, BORDER_SIZE, BORDER_SIZE);
309 evas_object_show(fgimg);
311 icon = evas_object_image_add(evas_object_evas_get(obj));
313 evas_object_image_data_set(icon, NULL);
314 evas_object_image_size_set(icon, GRID_ITEM_SINGLE_W, GRID_ITEM_SINGLE_H);
315 evas_object_image_fill_set(icon, 0, 0, GRID_ITEM_SINGLE_W, GRID_ITEM_SINGLE_H);
316 evas_object_image_filled_set(icon, EINA_TRUE);
317 evas_object_image_data_copy_set(icon, (int *)ecore_evas_buffer_pixels_get(my_ee));
318 evas_object_image_data_update_add(icon, 0, 0, GRID_ITEM_SINGLE_W, GRID_ITEM_SINGLE_H);
320 evas_object_del(bgrect);
321 evas_object_del(fgimg);
322 ecore_evas_free(my_ee);
331 else if (!strcmp(part, "elm.swallow.end"))
333 ti->delbtn = elm_check_add(obj);
334 elm_object_style_set(ti->delbtn, "extended/itemcheck");
335 //evas_object_propagate_events_set(ti->delbtn, 0);
336 elm_check_state_set(ti->delbtn, tcm);
337 evas_object_smart_callback_add(ti->delbtn, "changed", _grid_item_check_changed, data);
338 evas_object_show(ti->delbtn);
346 static void _grid_longpress(void *data, Evas_Object *obj, void *event_info)
348 struct appdata *ad = data;
349 clipdrawer_change_mode(ad);
352 static void _grid_click_paste(void *data, Evas_Object *obj, void *event_info)
354 struct appdata *ad = data;
355 Elm_Gengrid_Item *sgobj = NULL;
356 sgobj = elm_gengrid_selected_item_get(ad->hig);
357 griditem_t *ti = NULL;
358 ti = elm_gengrid_item_data_get(sgobj);
360 fprintf(stderr, "## grid_click_paste = 0x%x\n", event_info);
363 void _grid_del(const void *data, Evas_Object *obj)
365 griditem_t *ti = (griditem_t *)data;
366 if (ti->itype == GI_IMAGE)
367 eina_stringshare_del(ti->ipathdata);
369 eina_strbuf_free(ti->istrdata);
373 // FIXME: how to remove calling g_get_main_appdata()?
374 // it's mainly used at 'clipdrawer_image_item'
375 int clipdrawer_add_item(char *idata, int type)
377 struct appdata *ad = g_get_main_appdata();
378 griditem_t *newgi = NULL;
379 Eina_List *igl = NULL;
380 unsigned int igl_counter = 0;
382 newgi = malloc(sizeof(griditem_t));
384 igl = elm_gengrid_items_get(ad->hig);
385 igl_counter = eina_list_count(igl);
387 fprintf(stderr, "## add - %d : %s\n", newgi->itype, idata);
390 newgi->istrdata = eina_strbuf_new();
391 eina_strbuf_append(newgi->istrdata, idata);
393 else //if (type == GI_IMAGE)
396 Elm_Gengrid_Item *item;
397 griditem_t *ti = NULL;
399 if (!check_regular_file(idata))
401 DTRACE("Error : it isn't normal file = %s\n", idata);
405 EINA_LIST_FOREACH(igl, l, item)
407 ti = elm_gengrid_item_data_get(item);
408 if ((ti->itype == type) && !strcmp(ti->ipathdata, idata))
410 DTRACE("Error : duplicated file path = %s\n", idata);
415 newgi->ipathdata = eina_stringshare_add(idata);
418 if (igl_counter >= HISTORY_QUEUE_MAX_ITEMS)
420 // FIXME: add routine that is removing its elements
421 elm_gengrid_item_del(eina_list_data_get(eina_list_last(igl)));
424 newgi->item = elm_gengrid_item_prepend(ad->hig, &gic, newgi, NULL, NULL);
430 clipdrawer_ly_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
432 struct appdata *ad = data;
434 #define EDJE_CLOSE_PART_PREFIX "background/close"
435 if (!strncmp(source, EDJE_CLOSE_PART_PREFIX, strlen(EDJE_CLOSE_PART_PREFIX)))
437 clipdrawer_lower_view(ad);
441 int clipdrawer_init(void *data)
443 struct appdata *ad = data;
447 elm_theme_extension_add(NULL, APP_EDJ_FILE);
449 cdy = (1.0*CLIPDRAWER_HEIGHT/SCREEN_HEIGHT)*ad->root_h;
450 cdw = (1.0*CLIPDRAWER_POS_Y/SCREEN_HEIGHT)*ad->root_h;
452 evas_object_resize(ad->win_main, ad->root_w, (int)cdy);
453 evas_object_move(ad->win_main, CLIPDRAWER_POS_X, (int)cdw);
454 evas_object_resize(ad->ly_main, ad->root_w, (int)cdy);
455 evas_object_move(ad->ly_main, CLIPDRAWER_POS_X, (int)cdw);
457 edje_object_signal_callback_add(elm_layout_edje_get(ad->ly_main), "mouse,up,1", "*", clipdrawer_ly_clicked, ad);
460 ad->hig = elm_gengrid_add(ad->win_main);
461 elm_layout_content_set(ad->ly_main, "historyitems", ad->hig);
462 elm_gengrid_item_size_set(ad->hig, GRID_ITEM_W+2, GRID_ITEM_H);
463 elm_gengrid_align_set(ad->hig, 0.5, 0.5);
464 elm_gengrid_horizontal_set(ad->hig, EINA_TRUE);
465 elm_gengrid_bounce_set(ad->hig, EINA_TRUE, EINA_FALSE);
466 elm_gengrid_multi_select_set(ad->hig, EINA_FALSE);
467 evas_object_smart_callback_add(ad->hig, "selected", _grid_click_paste, ad);
468 // evas_object_smart_callback_add(ad->hig, "longpressed", _grid_longpress, ad);
469 evas_object_size_hint_weight_set(ad->hig, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
471 elm_gengrid_clear(ad->hig);
473 gic.item_style = "default_grid";
474 gic.func.label_get = NULL;
475 gic.func.icon_get = _grid_icon_get;
476 gic.func.state_get = NULL;
477 gic.func.del = _grid_del;
482 for (i = 0; i < N_IMAGES; i++)
484 clipdrawer_add_item(g_images_path[0], GI_IMAGE);
487 clipdrawer_add_item("clipboard history", GI_TEXT);
488 //clipdrawer_add_item("clipboard history asldfjlaskdf las dflkas dflas dfljask dflasd flaksdf jalskdf jalskdf jalsk flaskdfj lkasjf lksad jf", GI_TEXT);
490 evas_object_show (ad->hig);
492 // for debugging, calc history pos
494 Evas_Coord x, y, w, h;
495 Evas_Coord vx, vy, vw, vh;
497 edje_object_part_geometry_get(elm_layout_edje_get(ad->ly_main),"imagehistory/list",&x,&y,&w,&h);
498 evas_object_geometry_get (ad->hig, &vx,&vy,&vw,&vh);
499 fprintf(stderr, "## x = %d, y = %d, w = %d, h = %d\n", x, y, w, h);
500 fprintf(stderr, "## vx = %d, vy = %d, vw = %d, vh = %d\n", vx, vy, vw, vh);
503 // if (get_item_counts() != 0)
504 // clipdrawer_update_contents(ad);
509 int clipdrawer_create_view(void *data)
511 struct appdata *ad = data;
516 // at starting, showing app view
517 clipdrawer_activate_view(ad);
522 void clipdrawer_activate_view(void *data)
524 struct appdata *ad = data;
528 evas_object_show(ad->win_main);
529 elm_win_activate(ad->win_main);
533 void clipdrawer_lower_view(void *data)
535 struct appdata *ad = data;
539 evas_object_hide(ad->win_main);
540 elm_win_lower(ad->win_main);