comment out clipdrawer mode check
[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      "/opt/media/Images and videos/My photo clips/"
9 static const char *g_images_path[] = {
10         IM"1_photo.jpg",
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_SIZE 100
22
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;
27
28 typedef struct tag_gridimgitem
29 {
30         Elm_Gengrid_Item *item;
31         const char *path;
32         Evas_Object *delbtn;
33 } gridimgitem_t;
34
35 static int toggle_clipdrawer_mode()
36 {
37         g_clipdrawer_mode = !g_clipdrawer_mode;
38         return g_clipdrawer_mode;
39 }
40
41 static int get_clipdrawer_mode()
42 {
43         return g_clipdrawer_mode;
44 }
45
46 static void _list_longpress(void *data, Evas_Object *obj, void *event_info)
47 {
48         struct appdata *ad = data;
49
50         clipdrawer_change_mode(ad);
51 }
52
53 static void _list_click_paste(void *data, Evas_Object *obj, void *event_info)
54 {
55         struct appdata *ad = data;
56     Elm_List_Item *it = (Elm_List_Item *) elm_list_selected_item_get(obj);
57         if (it == NULL)
58                 return;
59
60     elm_list_item_selected_set(it, 0);
61
62         char *p = NULL;
63         int cplen;
64
65         char *cpdata = NULL;
66         cpdata = elm_list_item_label_get(it);
67         if (cpdata == NULL)
68                 return;
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);
74
75 //      clipdrawer_lower_view(ad);
76 }
77
78 static void _list_del_response_cb(void *data, Evas_Object *obj, void *event_info)
79 {
80         Elm_List_Item *it = (Elm_List_Item *)data;
81         evas_object_del(obj);
82
83         if((int)event_info == ELM_POPUP_RESPONSE_OK)
84                 elm_list_item_del(it);
85 }
86
87 static void _list_click_delete(void *data, Evas_Object *obj, void *event_info)
88 {
89         struct appdata *ad = data;
90     Elm_List_Item *it = (Elm_List_Item *) elm_list_selected_item_get(obj);
91         if (it == NULL)
92                 return;
93
94     elm_list_item_selected_set(it, 0);
95
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,
103                                                   NULL);
104         evas_object_smart_callback_add(popup, "response", _list_del_response_cb, it);
105         evas_object_show(popup);
106
107 //      char *slabel = NULL;
108 //      slabel = elm_list_item_label_get(it);
109 }
110
111 int clipdrawer_update_contents(void *data)
112 {
113         struct appdata *ad = data;
114         int i, pos;
115
116         // if delete mode, then back to normal mode
117 //      if (get_clipdrawer_mode())
118 //              clipdrawer_change_mode(ad);
119
120         elm_list_clear(ad->txtlist);
121         for (i = 0; i < HISTORY_QUEUE_MAX_TXT_ITEMS; i++)
122         {
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)
127                 {
128                         elm_list_item_append(ad->txtlist, get_item_contents_by_pos(pos), NULL, NULL, NULL, ad);
129                 }
130         }
131         elm_list_go(ad->txtlist);
132
133         /* FIXME : sometimes when list update, screen isn't updated */
134
135         return 0;
136 }
137
138 const char* clipdrawer_get_plain_string_from_escaped(char *escstr)
139 {
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);
143 }
144
145 Evas_Object* _grid_icon_get(const void *data, Evas_Object *obj, const char *part)
146 {
147         int delete_mode = get_clipdrawer_mode();
148         gridimgitem_t *ti = (gridimgitem_t *)data;
149         if (!strcmp(part, "elm.swallow.icon"))
150         {
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);
155                 return icon;
156         }
157         else if (!strcmp(part, "elm.swallow.end") && delete_mode)
158         {
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);
163                 return ti->delbtn;
164         }
165            
166         return NULL;
167 }
168
169 static void _grid_longpress(void *data, Evas_Object *obj, void *event_info)
170 {
171         struct appdata *ad = data;
172         clipdrawer_change_mode(ad);
173 }
174
175
176 static void _grid_click_paste(void *data, Evas_Object *obj, void *event_info)
177 {
178         struct appdata *ad = data;
179         char *file, *p;
180         int len;
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);
185
186         if (!sgobj || !ti)
187         {
188                 DTRACE("ERR: cbhm can't get the selected image\n");
189                 return;
190         }
191         len = strlen(ti->path);
192         p = malloc(len + 10);
193         snprintf(p,len+10, "file:///%s", ti->path);
194
195         elm_selection_set(/*secondary*/1,obj,/*ELM_SEL_FORMAT_IMAGE*/4,p);
196
197 //      clipdrawer_lower_view(ad);
198
199         elm_gengrid_item_selected_set(sgobj, EINA_FALSE);
200 }
201
202 static void _grid_del_response_cb(void *data, Evas_Object *obj, void *event_info)
203 {
204         Elm_Gengrid_Item *it = (Elm_Gengrid_Item *)data;
205         evas_object_del(obj);
206
207         if((int)event_info == ELM_POPUP_RESPONSE_OK)
208                 elm_gengrid_item_del(it);
209 }
210
211 static void _grid_click_delete(void *data, Evas_Object *obj, void *event_info)
212 {
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);
218
219         if (!sgobj || !ti)
220         {
221                 DTRACE("ERR: cbhm can't get the clicked del image\n");
222                 return;
223         }
224
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,
232                                                   NULL);
233         evas_object_smart_callback_add(popup, "response", _grid_del_response_cb, sgobj);
234         evas_object_show(popup);
235 }
236
237 void _grid_del(const void *data, Evas_Object *obj)
238 {
239         gridimgitem_t *ti = (gridimgitem_t *)data;
240         eina_stringshare_del(ti->path);
241         free(ti);
242 }
243
244 int clipdrawer_refresh_imghistory_item(void *data, int delete_mode)
245 {
246         struct appdata *ad = data;
247         Eina_List *oldlist = NULL;
248         const Eina_List *l;
249         Elm_Gengrid_Item *lgrid;
250         gridimgitem_t *lgitem;
251         Evas_Object *ngg;
252         Evas_Object *oldgg;
253         
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);
258         oldgg = ad->imggrid;
259         ad->imggrid = 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);
265         if (delete_mode)
266                 evas_object_smart_callback_add(ad->imggrid, "selected", _grid_click_delete, ad);
267         else
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);
271
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;
277
278         EINA_LIST_REVERSE_FOREACH(oldlist, l, lgrid)
279         {
280                 lgitem = elm_gengrid_item_data_get(lgrid);
281                 clipdrawer_add_image_item(lgitem->path);
282         }
283
284         evas_object_show (ad->imggrid);
285
286         elm_gengrid_clear(oldgg);
287         evas_object_hide(oldgg);
288         evas_object_del(oldgg);
289
290         return 0;
291 }
292
293 int clipdrawer_refresh_txthistory_item(void *data, int delete_mode)
294 {
295         struct appdata *ad = data;
296         Eina_List *oldlist = NULL;
297         const Eina_List *l;
298         Elm_List_Item *litem;
299         const char *ltext;
300         Evas_Object *ntl = NULL;
301 //      Evas_Object *ci = NULL;
302
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");
308
309         EINA_LIST_FOREACH(oldlist, l, litem)
310         {
311                 ltext = elm_list_item_label_get(litem);
312                 if (delete_mode)
313                 {
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);
320                 }
321                 else
322                 {
323                         elm_list_item_append(ntl, ltext, NULL, NULL, NULL, ad);
324                 }
325         }
326
327         elm_list_clear(ad->txtlist);
328         evas_object_hide(ad->txtlist);
329         evas_object_del(ad->txtlist);
330
331         ad->txtlist = ntl;
332         evas_object_size_hint_weight_set(ad->txtlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
333         if (delete_mode)
334                 evas_object_smart_callback_add(ad->txtlist, "selected", _list_click_delete, ad);
335         else
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);
338
339         elm_list_go(ad->txtlist);
340
341         return 0;
342 }
343
344 int clipdrawer_change_mode(void *data)
345 {
346         struct appdata *ad = data;
347
348         toggle_clipdrawer_mode();
349
350         DTRACE("clipdrawer delete mode = %d\n", get_clipdrawer_mode());
351
352         clipdrawer_refresh_imghistory_item(ad, get_clipdrawer_mode());
353         clipdrawer_refresh_txthistory_item(ad, get_clipdrawer_mode());
354
355         return 0;
356 }
357
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)
361 {
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;
367
368         // if delete mode, then back to normal mode
369 //      if (get_clipdrawer_mode())
370 //              clipdrawer_change_mode(ad);
371
372         if (!check_regular_file(imagepath))
373         {
374                 DTRACE("Error : it isn't normal file = %s\n", imagepath);
375                 return -1;
376         }
377
378         igl = elm_gengrid_items_get(ad->imggrid);
379         igl_counter = eina_list_count(igl);
380         if (igl_counter >= HISTORY_QUEUE_MAX_IMG_ITEMS)
381         {
382                 elm_gengrid_item_del(eina_list_data_get(eina_list_last(igl)));
383         }
384
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);
388
389         return TRUE;
390 }
391
392 static void
393 clipdrawer_ly_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
394 {
395         struct appdata *ad = data;
396
397         #define EDJE_CLOSE_PART_PREFIX "closebutton/"
398         if (!strncmp(source, EDJE_CLOSE_PART_PREFIX, strlen(EDJE_CLOSE_PART_PREFIX)))
399         {
400                 clipdrawer_lower_view(ad);
401         }
402 }
403
404 int clipdrawer_init(void *data)
405 {
406         struct appdata *ad = data;
407         double cdy, cdw;
408
409         // for elm_check, elm_list
410         elm_theme_extension_add(NULL, APP_EDJ_FILE);
411
412         cdy = (1.0*CLIPDRAWER_HEIGHT/SCREEN_HEIGHT)*ad->root_h;
413         cdw = (1.0*CLIPDRAWER_POS_Y/SCREEN_HEIGHT)*ad->root_h;
414
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);
419
420         edje_object_signal_callback_add(elm_layout_edje_get(ad->ly_main), "mouse,up,1", "*", clipdrawer_ly_clicked, ad);
421
422         ad->imggrid = NULL;
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);
433
434         elm_gengrid_clear(ad->imggrid);
435
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;
441
442         int i;
443         gridimgitem_t *newgenimg;
444
445         for (i = 0; i < N_IMAGES; i++)
446         {
447                 clipdrawer_add_image_item(g_images_path[i]);
448         }
449
450         evas_object_show (ad->imggrid);
451
452 // for debugging, calc image history pos
453 /*
454    Evas_Coord x, y, w, h;
455    Evas_Coord vx, vy, vw, vh;
456
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);
461 */
462
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);
470
471         elm_list_go(ad->txtlist);
472
473         if (get_item_counts() != 0)
474                 clipdrawer_update_contents(ad);
475
476         return 0;
477 }
478
479 int clipdrawer_create_view(void *data)
480 {
481         struct appdata *ad = data;
482
483         clipdrawer_init(ad);
484
485         // for debug
486         // at starting, showing app view
487         //clipdrawer_activate_view(ad);
488
489         return 0;
490 }
491
492 void clipdrawer_activate_view(void *data)
493 {
494         struct appdata *ad = data;
495         
496         if (ad->win_main)
497         {
498                 evas_object_show(ad->win_main);
499                 elm_win_activate(ad->win_main);
500         }
501 }
502
503 void clipdrawer_lower_view(void *data)
504 {
505         struct appdata *ad = data;
506         
507         if (ad->win_main)
508         {
509                 evas_object_hide(ad->win_main);
510                 elm_win_lower(ad->win_main);
511
512                 // if delete mode, then back to normal mode
513                 if (get_clipdrawer_mode())
514                         clipdrawer_change_mode(ad);
515         }
516 }