add routine to clear shot flag at fail condition
[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/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",
11 };
12 #define N_IMAGES (1)
13
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
21
22 // gic should live at gengrid callback functions
23 Elm_Gengrid_Item_Class gic;
24
25 typedef struct tag_griditem
26 {
27         int itype;
28         Elm_Gengrid_Item *item;
29         const char *ipathdata;
30         Eina_Strbuf *istrdata;
31         Evas_Object *delbtn;
32 } griditem_t;
33
34 static void _list_click_paste(void *data, Evas_Object *obj, void *event_info)
35 {
36         struct appdata *ad = data;
37     Elm_List_Item *it = (Elm_List_Item *) elm_list_selected_item_get(obj);
38         if (it == NULL)
39                 return;
40
41     elm_list_item_selected_set(it, 0);
42
43         Elm_List_Item *item;
44         Eina_List *n;
45         int hc = 0;
46         EINA_LIST_FOREACH(elm_list_items_get(ad->txtlist), n, item)
47         {
48                 if (item == it)
49                         break;
50                 hc++;
51         }
52
53         fprintf(stderr, "## this c = %d, %d\n", hc, get_current_history_position());
54
55         int     pos = get_current_history_position()-hc;
56         if (pos < 0)
57                 pos = pos+(HISTORY_QUEUE_MAX_ITEMS);
58
59         fprintf(stderr, "## pos = %d, %s\n", pos, get_item_contents_by_pos(pos));
60         char *p = strdup(get_item_contents_by_pos(pos));
61
62         elm_selection_set(1, obj, /*ELM_SEL_FORMAT_TEXT*/1, p);
63
64 /*
65         char *p = NULL;
66         int cplen;
67
68         char *cpdata = NULL;
69         cpdata = elm_entry_utf8_to_markup(elm_list_item_label_get(it));
70         if (cpdata == NULL)
71                 return;
72         cplen = strlen(cpdata);
73         p = malloc(cplen + 1);
74         snprintf(p, cplen+1, "%s", cpdata);
75 */
76 //      elm_selection_set(1, obj, /*ELM_SEL_FORMAT_TEXT*/1, p);
77 //      elm_selection_set(1, obj, /*ELM_SEL_FORMAT_MARKUP*/2, p);
78
79 //      clipdrawer_lower_view(ad);
80 }
81
82 int clipdrawer_update_contents(void *data)
83 {
84         struct appdata *ad = data;
85         int i, pos;
86         char *unesc = NULL;
87
88         for (i = 0; i < HISTORY_QUEUE_MAX_ITEMS; i++)
89         {
90                 pos = get_current_history_position() - i;
91                 if (pos < 0)
92                         pos = pos+HISTORY_QUEUE_MAX_ITEMS;
93
94                 if (get_item_contents_by_pos(pos) != NULL && strlen(get_item_contents_by_pos(pos)) > 0)
95                 {
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);
99                         free(unesc);
100                 }
101         }
102
103         /* FIXME : sometimes when list update, screen isn't updated */
104
105         return 0;
106 }
107
108 const char* clipdrawer_get_plain_string_from_escaped(char *escstr)
109 {
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);
113 }
114
115 static void _grid_del_response_cb(void *data, Evas_Object *obj, void *event_info)
116 {
117         Elm_Gengrid_Item *it = (Elm_Gengrid_Item *)data;
118         evas_object_del(obj);
119
120         if((int)event_info == ELM_POPUP_RESPONSE_OK)
121                 elm_gengrid_item_del(it);
122 }
123
124 static void _grid_click_delete(void *data, Evas_Object *obj, void *event_info)
125 {
126         struct appdata *ad = data;
127 }
128
129 static void
130 _grid_item_ly_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
131 {
132         struct appdata *ad = g_get_main_appdata();
133
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);
138
139         #define EDJE_DELBTN_PART_PREFIX "delbtn"
140         if (strncmp(source, EDJE_DELBTN_PART_PREFIX, strlen(EDJE_DELBTN_PART_PREFIX)))
141         {
142                 if (!sgobj || !ti)
143                 {
144                         DTRACE("ERR: cbhm can't get the selected image\n");
145                         return;
146                 }
147
148                 elm_gengrid_item_selected_set(sgobj, EINA_FALSE);
149
150                 if (ti->itype == GI_TEXT)
151                 {
152                         char *p = strdup(eina_strbuf_string_get(ti->istrdata));
153
154                         elm_selection_set(1, obj, /*ELM_SEL_FORMAT_TEXT*/1, p);
155                 }
156                 else //if (ti->itype == GI_IMAGE)
157                 {
158                         int len = strlen(ti->ipathdata);
159                         char *p = malloc(len + 10);
160                         snprintf(p,len+10, "file:///%s", ti->ipathdata);
161
162                         elm_selection_set(/*secondary*/1,obj,/*ELM_SEL_FORMAT_IMAGE*/4,p);
163                 }
164
165                 return;
166         }
167
168         if (!sgobj)
169         {
170                 DTRACE("ERR: cbhm can't get the selected item\n");
171                 return;
172         }
173
174         elm_gengrid_item_selected_set(sgobj, EINA_FALSE);
175
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,
183                                                   NULL);
184         evas_object_smart_callback_add(popup, "response", _grid_del_response_cb, sgobj);
185         evas_object_show(popup);
186 }
187
188 Evas_Object* _grid_icon_get(const void *data, Evas_Object *obj, const char *part)
189 {
190         griditem_t *ti = (griditem_t *)data;
191
192         if (!strcmp(part, "elm.swallow.icon"))
193         {
194                 if (ti->itype == GI_TEXT)
195                 {
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);
204
205                         // FIXME: add string length check
206                         Evas_Object *ientry = elm_scrolled_entry_add(obj);
207                         evas_object_size_hint_weight_set(ientry, 0, 0);
208                         Eina_Strbuf *strent = NULL;
209                         char *strdata = eina_strbuf_string_get(ti->istrdata);
210                         int i, skipflag, strcnt;
211                         
212                         strent = eina_strbuf_new();
213                         skipflag = 0;
214                         strcnt = 0;
215                         for (i = 0; i < eina_strbuf_length_get(ti->istrdata); i++)
216                         {
217                                 switch (strdata[i])
218                                 {
219                                         case '>':
220                                                 skipflag = 0;
221                                                 break;
222                                         case '<':
223                                                 skipflag = 1;
224                                                 break;
225                                         default:
226                                                 if (!skipflag)
227                                                         strcnt++;
228                                                 break;
229                                 }
230                                 if (strcnt > 100)
231                                         break;
232                         }
233                         eina_strbuf_append_n(strent, strdata, i);
234 //                      eina_strbuf_append(strent, strdata);
235                         eina_strbuf_replace_all(strent, " absize=240x180 ", " absize=52x39 ");
236                         if (strcnt > 100)
237                                 eina_strbuf_append(strent, "...");
238
239                         elm_scrolled_entry_entry_set(ientry, eina_strbuf_string_get(strent));
240                         elm_scrolled_entry_editable_set(ientry, EINA_FALSE);
241                         elm_scrolled_entry_context_menu_disabled_set(ientry, EINA_TRUE);
242                         evas_object_show(ientry);
243                         elm_layout_content_set(layout, "elm.swallow.inner", ientry);
244
245                         eina_strbuf_free(strent);
246
247                         return layout;
248                 }
249                 else// if (ti->itype == GI_IMAGE)
250                 {
251                         Evas_Object *layout = elm_layout_add (obj);
252                         elm_layout_theme_set(layout, "gengrid", "widestyle", "horizontal_layout");
253                         edje_object_signal_callback_add(elm_layout_edje_get(layout), 
254                                                                                         "mouse,up,1", "*", _grid_item_ly_clicked, data);
255
256                         Evas_Object *sicon;
257                         sicon = evas_object_image_add(evas_object_evas_get(obj));
258                         evas_object_image_load_size_set(sicon, GRID_ITEM_SINGLE_W, GRID_ITEM_SINGLE_H);
259                         evas_object_image_file_set(sicon, ti->ipathdata, NULL);
260                         evas_object_image_fill_set(sicon, 0, 0, GRID_ITEM_SINGLE_W, GRID_ITEM_SINGLE_H);
261                         evas_object_resize(sicon, GRID_ITEM_SINGLE_W, GRID_ITEM_SINGLE_H);
262                         elm_layout_content_set(layout, "elm.swallow.icon", sicon);
263
264 /*
265 //                      edje_object_signal_emit(elm_layout_edje_get(layout), "elm,state,hide,delbtn", "elm");
266
267                         Evas_Object *rect = evas_object_rectangle_add(evas_object_evas_get(obj));
268 //                      evas_object_resize(rect, GRID_ITEM_W, GRID_ITEM_H);
269                         evas_object_color_set(rect, 0, 0, 0, 200);
270                         evas_object_show(rect);
271                         elm_layout_content_set(layout, "elm.swallow.cover", rect);
272 */
273
274                         return layout;
275
276 /*
277                         Evas_Object *icon = elm_icon_add(obj);
278                         elm_icon_file_set(icon, ti->ipathdata, NULL);
279                         evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
280                         evas_object_show(icon);
281 */
282
283 /*
284                         Ecore_Evas *my_ee;
285                         Evas *my_e;
286                         Evas_Object *fgimg;
287                         Evas_Object *bgrect;
288                         Evas_Object *delbtn;
289                         Evas_Object *icon;
290                         my_ee = ecore_evas_buffer_new(GRID_ITEM_SINGLE_W, GRID_ITEM_SINGLE_H);
291                         my_e = ecore_evas_get(my_ee);
292
293                         bgrect = evas_object_rectangle_add(my_e);
294                         evas_object_color_set(bgrect, 255, 255, 255, 255);
295                         evas_object_resize(bgrect, GRID_ITEM_SINGLE_W, GRID_ITEM_SINGLE_H);
296                         evas_object_move(bgrect, 0, 0);
297                         evas_object_show(bgrect);
298
299 #define BORDER_SIZE 1
300                         fgimg = evas_object_image_add(my_e);
301                         evas_object_image_load_size_set(fgimg, GRID_ITEM_SINGLE_W-BORDER_SIZE*2, GRID_ITEM_SINGLE_H-BORDER_SIZE*2);
302                         evas_object_image_file_set(fgimg, ti->ipathdata, NULL);
303                         evas_object_image_fill_set(fgimg, 0, 0, GRID_ITEM_SINGLE_W-BORDER_SIZE*2, GRID_ITEM_SINGLE_H-BORDER_SIZE*2);
304                         evas_object_image_filled_set(fgimg, 1);
305                         int x,y;
306                         evas_object_image_size_get(fgimg, &x, &y);
307                         //fprintf(stderr, "## img x = %d, y = %d\n", x, y);
308                         evas_object_resize(fgimg, GRID_ITEM_SINGLE_W-BORDER_SIZE*2, GRID_ITEM_SINGLE_H-BORDER_SIZE*2);
309                         evas_object_move(fgimg, BORDER_SIZE, BORDER_SIZE);
310                         evas_object_show(fgimg);
311
312                         icon = evas_object_image_add(evas_object_evas_get(obj));
313
314                         evas_object_image_data_set(icon, NULL);
315                         evas_object_image_size_set(icon, GRID_ITEM_SINGLE_W, GRID_ITEM_SINGLE_H);
316                         evas_object_image_fill_set(icon, 0, 0, GRID_ITEM_SINGLE_W, GRID_ITEM_SINGLE_H);
317                         evas_object_image_filled_set(icon, EINA_TRUE);
318                         evas_object_image_data_copy_set(icon, (int *)ecore_evas_buffer_pixels_get(my_ee));
319                         evas_object_image_data_update_add(icon, 0, 0, GRID_ITEM_SINGLE_W, GRID_ITEM_SINGLE_H);
320
321                         evas_object_del(bgrect);
322                         evas_object_del(fgimg);
323                         ecore_evas_free(my_ee);
324
325                         return icon;
326 */
327                 }
328
329 //              return icon;
330         }
331 /*
332         else if (!strcmp(part, "elm.swallow.end"))
333         {
334                 ti->delbtn = elm_check_add(obj);
335                 elm_object_style_set(ti->delbtn, "extended/itemcheck");
336                 //evas_object_propagate_events_set(ti->delbtn, 0);
337                 elm_check_state_set(ti->delbtn, tcm);
338                 evas_object_smart_callback_add(ti->delbtn, "changed", _grid_item_check_changed, data);
339                 evas_object_show(ti->delbtn);
340                 return ti->delbtn;
341         }
342 */
343            
344         return NULL;
345 }
346
347 static void _grid_longpress(void *data, Evas_Object *obj, void *event_info)
348 {
349         struct appdata *ad = data;
350         clipdrawer_change_mode(ad);
351 }
352
353 static void _grid_click_paste(void *data, Evas_Object *obj, void *event_info)
354 {
355         struct appdata *ad = data;
356         Elm_Gengrid_Item *sgobj = NULL;
357         sgobj = elm_gengrid_selected_item_get(ad->hig);
358         griditem_t *ti = NULL;
359         ti = elm_gengrid_item_data_get(sgobj);
360
361         fprintf(stderr, "## grid_click_paste = 0x%x\n", event_info);
362 }
363
364 void _grid_del(const void *data, Evas_Object *obj)
365 {
366         griditem_t *ti = (griditem_t *)data;
367         if (ti->itype == GI_IMAGE)
368                 eina_stringshare_del(ti->ipathdata);
369         else
370                 eina_strbuf_free(ti->istrdata);
371         free(ti);
372 }
373
374 // FIXME: how to remove calling g_get_main_appdata()? 
375 //        it's mainly used at 'clipdrawer_image_item'
376 int clipdrawer_add_item(char *idata, int type)
377 {
378         struct appdata *ad = g_get_main_appdata();
379         griditem_t *newgi = NULL;
380         Eina_List *igl = NULL;
381         unsigned int igl_counter = 0;
382
383         newgi = malloc(sizeof(griditem_t));
384         newgi->itype = type;
385         igl = elm_gengrid_items_get(ad->hig);
386         igl_counter = eina_list_count(igl);
387
388         fprintf(stderr, "## add - %d : %s\n", newgi->itype, idata);
389         if (type == GI_TEXT)
390         {
391                 newgi->istrdata = eina_strbuf_new();
392                 eina_strbuf_append(newgi->istrdata, idata);
393         }
394         else //if (type == GI_IMAGE)
395         {
396                 Eina_List *l;
397                 Elm_Gengrid_Item *item;
398                 griditem_t *ti = NULL;
399
400                 if (!check_regular_file(idata))
401                 {
402                         DTRACE("Error : it isn't normal file = %s\n", idata);
403                         return -1;
404                 }
405
406                 EINA_LIST_FOREACH(igl, l, item)
407                 {
408                         ti = elm_gengrid_item_data_get(item);
409                         if ((ti->itype == type) && !strcmp(ti->ipathdata, idata))
410                         {
411                                 DTRACE("Error : duplicated file path = %s\n", idata);
412                                 return -1;
413                         }
414                 }
415
416                 newgi->ipathdata = eina_stringshare_add(idata);
417         }
418
419         if (igl_counter >= HISTORY_QUEUE_MAX_ITEMS)
420         {
421                 // FIXME: add routine that is removing its elements
422                 elm_gengrid_item_del(eina_list_data_get(eina_list_last(igl)));
423         }
424
425         newgi->item = elm_gengrid_item_prepend(ad->hig, &gic, newgi, NULL, NULL);
426
427         return TRUE;
428 }
429
430 static void
431 clipdrawer_ly_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
432 {
433         struct appdata *ad = data;
434
435         #define EDJE_CLOSE_PART_PREFIX "background/close"
436         if (!strncmp(source, EDJE_CLOSE_PART_PREFIX, strlen(EDJE_CLOSE_PART_PREFIX)))
437         {
438                 clipdrawer_lower_view(ad);
439         }
440 }
441
442 int clipdrawer_init(void *data)
443 {
444         struct appdata *ad = data;
445         double cdy, cdw;
446
447         // for elm_check
448         elm_theme_extension_add(NULL, APP_EDJ_FILE);
449
450         cdy = (1.0*CLIPDRAWER_HEIGHT/SCREEN_HEIGHT)*ad->root_h;
451         cdw = (1.0*CLIPDRAWER_POS_Y/SCREEN_HEIGHT)*ad->root_h;
452
453         evas_object_resize(ad->win_main, ad->root_w, (int)cdy);
454         evas_object_move(ad->win_main, CLIPDRAWER_POS_X, (int)cdw);
455         evas_object_resize(ad->ly_main, ad->root_w, (int)cdy);
456         evas_object_move(ad->ly_main, CLIPDRAWER_POS_X, (int)cdw);
457
458         edje_object_signal_callback_add(elm_layout_edje_get(ad->ly_main), "mouse,up,1", "*", clipdrawer_ly_clicked, ad);
459
460         ad->hig = NULL;
461         ad->hig = elm_gengrid_add(ad->win_main);
462         elm_layout_content_set(ad->ly_main, "historyitems", ad->hig);
463         elm_gengrid_item_size_set(ad->hig, GRID_ITEM_W+2, GRID_ITEM_H);
464         elm_gengrid_align_set(ad->hig, 0.5, 0.5);
465         elm_gengrid_horizontal_set(ad->hig, EINA_TRUE);
466         elm_gengrid_bounce_set(ad->hig, EINA_TRUE, EINA_FALSE);
467         elm_gengrid_multi_select_set(ad->hig, EINA_FALSE);
468         evas_object_smart_callback_add(ad->hig, "selected", _grid_click_paste, ad);
469 //      evas_object_smart_callback_add(ad->hig, "longpressed", _grid_longpress, ad);
470         evas_object_size_hint_weight_set(ad->hig, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
471
472         elm_gengrid_clear(ad->hig);
473
474         gic.item_style = "default_grid";
475         gic.func.label_get = NULL;
476         gic.func.icon_get = _grid_icon_get;
477         gic.func.state_get = NULL;
478         gic.func.del = _grid_del;
479
480         int i;
481         griditem_t *newgi;
482
483         for (i = 0; i < N_IMAGES; i++)
484         {
485                 clipdrawer_add_item(g_images_path[0], GI_IMAGE);
486         }
487
488         clipdrawer_add_item("clipboard history", GI_TEXT);
489         //clipdrawer_add_item("clipboard history asldfjlaskdf las dflkas dflas dfljask dflasd flaksdf jalskdf jalskdf jalsk flaskdfj lkasjf lksad jf", GI_TEXT);
490
491         evas_object_show (ad->hig);
492
493 // for debugging, calc history pos
494 /*
495    Evas_Coord x, y, w, h;
496    Evas_Coord vx, vy, vw, vh;
497
498    edje_object_part_geometry_get(elm_layout_edje_get(ad->ly_main),"imagehistory/list",&x,&y,&w,&h);
499    evas_object_geometry_get (ad->hig, &vx,&vy,&vw,&vh);
500    fprintf(stderr, "## x = %d, y = %d, w = %d, h = %d\n", x, y, w, h);
501    fprintf(stderr, "## vx = %d, vy = %d, vw = %d, vh = %d\n", vx, vy, vw, vh);
502 */
503
504 //      if (get_item_counts() != 0)
505 //              clipdrawer_update_contents(ad);
506
507         return 0;
508 }
509
510 int clipdrawer_create_view(void *data)
511 {
512         struct appdata *ad = data;
513
514         clipdrawer_init(ad);
515
516         // for debug
517         // at starting, showing app view
518         clipdrawer_activate_view(ad);
519
520         return 0;
521 }
522
523 void clipdrawer_activate_view(void *data)
524 {
525         struct appdata *ad = data;
526         
527         if (ad->win_main)
528         {
529                 evas_object_show(ad->win_main);
530                 elm_win_activate(ad->win_main);
531         }
532 }
533
534 void clipdrawer_lower_view(void *data)
535 {
536         struct appdata *ad = data;
537         
538         if (ad->win_main)
539         {
540                 evas_object_hide(ad->win_main);
541                 elm_win_lower(ad->win_main);
542         }
543 }