resize image item
[framework/uifw/cbhm.git] / src / clipdrawer.c
1 #include "common.h"
2 #include "cbhm_main.h"
3 #include "storage.h"
4 #include "xcnphandler.h"
5 #include "clipdrawer.h"
6
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",
11 /*
12         IM"2_photo.jpg",
13         IM"3_photo.jpg",
14         IM"4_photo.jpg",
15         IM"5_photo.jpg",
16         IM"6_photo.jpg",
17 */
18 };
19 #define N_IMAGES (1)
20
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
25
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;
30
31 typedef struct tag_griditem
32 {
33         Elm_Gengrid_Item *item;
34         const char *idata;
35         int itype;
36         Evas_Object *delbtn;
37 } griditem_t;
38
39 static int toggle_clipdrawer_mode()
40 {
41         g_clipdrawer_mode = !g_clipdrawer_mode;
42         return g_clipdrawer_mode;
43 }
44
45 static int get_clipdrawer_mode()
46 {
47         return g_clipdrawer_mode;
48 }
49
50 static void _list_click_paste(void *data, Evas_Object *obj, void *event_info)
51 {
52         struct appdata *ad = data;
53     Elm_List_Item *it = (Elm_List_Item *) elm_list_selected_item_get(obj);
54         if (it == NULL)
55                 return;
56
57     elm_list_item_selected_set(it, 0);
58
59         Elm_List_Item *item;
60         Eina_List *n;
61         int hc = 0;
62         EINA_LIST_FOREACH(elm_list_items_get(ad->txtlist), n, item)
63         {
64                 if (item == it)
65                         break;
66                 hc++;
67         }
68
69         fprintf(stderr, "## this c = %d, %d\n", hc, get_current_history_position());
70
71 //      int pos = get_current_history_position() - hc;
72
73         int     pos = get_current_history_position()-hc;
74         if (pos < 0)
75                 pos = pos+(HISTORY_QUEUE_MAX_TXT_ITEMS);
76
77         fprintf(stderr, "## pos = %d, %s\n", pos, get_item_contents_by_pos(pos));
78         char *p = strdup(get_item_contents_by_pos(pos));
79
80         elm_selection_set(1, obj, /*ELM_SEL_FORMAT_TEXT*/1, p);
81
82 /*
83         char *p = NULL;
84         int cplen;
85
86         char *cpdata = NULL;
87         cpdata = elm_entry_utf8_to_markup(elm_list_item_label_get(it));
88         if (cpdata == NULL)
89                 return;
90         cplen = strlen(cpdata);
91         p = malloc(cplen + 1);
92         snprintf(p, cplen+1, "%s", cpdata);
93 */
94 //      elm_selection_set(1, obj, /*ELM_SEL_FORMAT_TEXT*/1, p);
95 //      elm_selection_set(1, obj, /*ELM_SEL_FORMAT_MARKUP*/2, p);
96
97 //      clipdrawer_lower_view(ad);
98 }
99
100 int clipdrawer_update_contents(void *data)
101 {
102         struct appdata *ad = data;
103         int i, pos;
104         char *unesc = NULL;
105
106         // if delete mode, then back to normal mode
107 //      if (get_clipdrawer_mode())
108 //              clipdrawer_change_mode(ad);
109
110         for (i = 0; i < HISTORY_QUEUE_MAX_TXT_ITEMS; i++)
111         {
112                 pos = get_current_history_position() - i;
113                 if (pos < 0)
114                         pos = pos+HISTORY_QUEUE_MAX_TXT_ITEMS;
115
116                 if (get_item_contents_by_pos(pos) != NULL && strlen(get_item_contents_by_pos(pos)) > 0)
117                 {
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);
121                         free(unesc);
122                 }
123         }
124
125         /* FIXME : sometimes when list update, screen isn't updated */
126
127         return 0;
128 }
129
130 const char* clipdrawer_get_plain_string_from_escaped(char *escstr)
131 {
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);
135 }
136
137 Evas_Object* _grid_icon_get(const void *data, Evas_Object *obj, const char *part)
138 {
139         int delete_mode = get_clipdrawer_mode();
140         griditem_t *ti = (griditem_t *)data;
141
142         if (!strcmp(part, "elm.swallow.icon"))
143         {
144                 if (ti->itype == GI_TEXT)
145                 {
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);
153                         return ientry;
154                 }
155                 else// if (ti->itype == GI_IMAGE)
156                 {
157 /*
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);
162 */
163
164                         Ecore_Evas *my_ee;
165                         Evas *my_e;
166                         Evas_Object *fgimg;
167                         Evas_Object *bgrect;
168                         Evas_Object *delbtn;
169                         Evas_Object *icon;
170                         my_ee = ecore_evas_buffer_new(GRID_ITEM_W, GRID_ITEM_H);
171                         my_e = ecore_evas_get(my_ee);
172
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);
178
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);
185                         int x,y;
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);
191
192                         icon = evas_object_image_add(evas_object_evas_get(obj));
193
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);
200
201                         evas_object_del(bgrect);
202                         evas_object_del(fgimg);
203                         ecore_evas_free(my_ee);
204
205                         return icon;
206                 }
207
208 //              return icon;
209         }
210 /*
211         else if (!strcmp(part, "elm.swallow.end") && delete_mode)
212         {
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);
217                 return ti->delbtn;
218         }
219 */
220            
221         return NULL;
222 }
223
224 static void _grid_longpress(void *data, Evas_Object *obj, void *event_info)
225 {
226         struct appdata *ad = data;
227         clipdrawer_change_mode(ad);
228 }
229
230
231 static void _grid_click_paste(void *data, Evas_Object *obj, void *event_info)
232 {
233         struct appdata *ad = data;
234         char *file, *p;
235         int len;
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);
240
241         if (!sgobj || !ti)
242         {
243                 DTRACE("ERR: cbhm can't get the selected image\n");
244                 return;
245         }
246         if (ti->itype == GI_TEXT)
247         {
248                 char *p = strdup(eina_strbuf_string_get(ti->idata));
249
250                 elm_selection_set(1, obj, /*ELM_SEL_FORMAT_TEXT*/1, p);
251         }
252         else //if (ti->itype == GI_IMAGE)
253         {
254                 len = strlen(ti->idata);
255                 p = malloc(len + 10);
256                 snprintf(p,len+10, "file:///%s", ti->idata);
257
258                 elm_selection_set(/*secondary*/1,obj,/*ELM_SEL_FORMAT_IMAGE*/4,p);
259
260                 elm_gengrid_item_selected_set(sgobj, EINA_FALSE);
261         }
262 }
263
264 static void _grid_del_response_cb(void *data, Evas_Object *obj, void *event_info)
265 {
266         Elm_Gengrid_Item *it = (Elm_Gengrid_Item *)data;
267         evas_object_del(obj);
268
269         if((int)event_info == ELM_POPUP_RESPONSE_OK)
270                 elm_gengrid_item_del(it);
271 }
272
273 static void _grid_click_delete(void *data, Evas_Object *obj, void *event_info)
274 {
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);
280
281         if (!sgobj || !ti)
282         {
283                 DTRACE("ERR: cbhm can't get the clicked del image\n");
284                 return;
285         }
286
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,
294                                                   NULL);
295         evas_object_smart_callback_add(popup, "response", _grid_del_response_cb, sgobj);
296         evas_object_show(popup);
297 }
298
299 void _grid_del(const void *data, Evas_Object *obj)
300 {
301         griditem_t *ti = (griditem_t *)data;
302         if (ti->itype == GI_IMAGE)
303                 eina_stringshare_del(ti->idata);
304         else
305                 eina_strbuf_free(ti->idata);
306         free(ti);
307 }
308
309 int clipdrawer_refresh_history_item(void *data, int delete_mode)
310 {
311         struct appdata *ad = data;
312         Eina_List *oldlist = NULL;
313         const Eina_List *l;
314         Elm_Gengrid_Item *lgrid;
315         griditem_t *lgitem;
316         Evas_Object *ngg;
317         Evas_Object *oldgg;
318         
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);
323         oldgg = ad->hig;
324         ad->hig = 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);
330         if (delete_mode)
331                 evas_object_smart_callback_add(ad->hig, "selected", _grid_click_delete, ad);
332         else
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);
336
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;
342
343         EINA_LIST_REVERSE_FOREACH(oldlist, l, lgrid)
344         {
345                 lgitem = elm_gengrid_item_data_get(lgrid);
346                 clipdrawer_add_item(lgitem->idata, GI_IMAGE);
347         }
348
349         evas_object_show (ad->hig);
350
351         elm_gengrid_clear(oldgg);
352         evas_object_hide(oldgg);
353         evas_object_del(oldgg);
354
355         return 0;
356 }
357
358 int clipdrawer_change_mode(void *data)
359 {
360         struct appdata *ad = data;
361
362         toggle_clipdrawer_mode();
363
364         DTRACE("clipdrawer delete mode = %d\n", get_clipdrawer_mode());
365
366         clipdrawer_refresh_history_item(ad, get_clipdrawer_mode());
367
368         return 0;
369 }
370
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)
374 {
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;
380
381         // if delete mode, then back to normal mode
382 //      if (get_clipdrawer_mode())
383 //              clipdrawer_change_mode(ad);
384
385 /*
386         if (!check_regular_file(imagepath))
387         {
388                 DTRACE("Error : it isn't normal file = %s\n", imagepath);
389                 return -1;
390         }
391
392         igl = elm_gengrid_items_get(ad->hig);
393         igl_counter = eina_list_count(igl);
394
395         Eina_List *l;
396         Elm_Gengrid_Item *item;
397         griditem_t *ti = NULL;
398
399         EINA_LIST_FOREACH(igl, l, item)
400         {
401                 ti = elm_gengrid_item_data_get(item);
402                 if (!strcmp(ti->path, imagepath))
403                 {
404                         DTRACE("Error : duplicated file path = %s\n", imagepath);
405                         return -1;
406                 }
407         }
408
409         if (igl_counter >= HISTORY_QUEUE_MAX_IMG_ITEMS)
410         {
411                 elm_gengrid_item_del(eina_list_data_get(eina_list_last(igl)));
412         }
413
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);
418 */
419
420 /*
421         static int testmode = 0;
422         testmode++;
423
424         newgi = malloc(sizeof(griditem_t));
425         if (testmode % 3)
426         {
427         newgi->itype = GI_IMAGE;
428         newgi->idata = eina_stringshare_add(imagepath);
429         }
430         else
431         {
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>");
435
436         }
437         newgi->item = elm_gengrid_item_append(ad->hig, &gic, newgi, NULL, NULL);
438 */
439
440         newgi = malloc(sizeof(griditem_t));
441         newgi->itype = type;
442
443         fprintf(stderr, "## add %d : %s\n", newgi->itype, idata);
444         if (type == GI_TEXT)
445         {
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, "...");
450         }
451         else //if (type == GI_IMAGE)
452         {
453                 newgi->idata = eina_stringshare_add(idata);
454         }
455         newgi->item = elm_gengrid_item_prepend(ad->hig, &gic, newgi, NULL, NULL);
456
457         return TRUE;
458 }
459
460 static void
461 clipdrawer_ly_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
462 {
463         struct appdata *ad = data;
464
465         #define EDJE_CLOSE_PART_PREFIX "background/close"
466         if (!strncmp(source, EDJE_CLOSE_PART_PREFIX, strlen(EDJE_CLOSE_PART_PREFIX)))
467         {
468                 clipdrawer_lower_view(ad);
469         }
470 }
471
472 int clipdrawer_init(void *data)
473 {
474         struct appdata *ad = data;
475         double cdy, cdw;
476
477         // for elm_check
478         elm_theme_extension_add(NULL, APP_EDJ_FILE);
479
480         cdy = (1.0*CLIPDRAWER_HEIGHT/SCREEN_HEIGHT)*ad->root_h;
481         cdw = (1.0*CLIPDRAWER_POS_Y/SCREEN_HEIGHT)*ad->root_h;
482
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);
487
488         edje_object_signal_callback_add(elm_layout_edje_get(ad->ly_main), "mouse,up,1", "*", clipdrawer_ly_clicked, ad);
489
490         ad->hig = NULL;
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);
501
502         elm_gengrid_clear(ad->hig);
503
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;
509
510         int i;
511         griditem_t *newgi;
512
513         for (i = 0; i < N_IMAGES; i++)
514         {
515                 clipdrawer_add_item(g_images_path[0], GI_IMAGE);
516         }
517
518 /*
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);
520
521         clipdrawer_add_item("appliance r  ", GI_TEXT);
522         clipdrawer_add_item("appliance k  ", GI_TEXT);
523         clipdrawer_add_item("appliance s  ", GI_TEXT);
524 */
525
526         evas_object_show (ad->hig);
527
528 // for debugging, calc history pos
529 /*
530    Evas_Coord x, y, w, h;
531    Evas_Coord vx, vy, vw, vh;
532
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);
537 */
538
539 //      if (get_item_counts() != 0)
540 //              clipdrawer_update_contents(ad);
541
542         return 0;
543 }
544
545 int clipdrawer_create_view(void *data)
546 {
547         struct appdata *ad = data;
548
549         clipdrawer_init(ad);
550
551         // for debug
552         // at starting, showing app view
553         clipdrawer_activate_view(ad);
554
555         return 0;
556 }
557
558 void clipdrawer_activate_view(void *data)
559 {
560         struct appdata *ad = data;
561         
562         if (ad->win_main)
563         {
564                 evas_object_show(ad->win_main);
565                 elm_win_activate(ad->win_main);
566         }
567 }
568
569 void clipdrawer_lower_view(void *data)
570 {
571         struct appdata *ad = data;
572         
573         if (ad->win_main)
574         {
575                 evas_object_hide(ad->win_main);
576                 elm_win_lower(ad->win_main);
577
578                 // if delete mode, then back to normal mode
579                 if (get_clipdrawer_mode())
580                         clipdrawer_change_mode(ad);
581         }
582 }