fdef4b57848f1f50e5a5ad1c5c1da506f8974581
[apps/home/ug-memo-efl.git] / src / ug-select.c
1 /*
2   * Copyright 2012  Samsung Electronics Co., Ltd
3   * 
4   * Licensed under the Flora License, Version 1.0 (the "License");
5   * you may not use this file except in compliance with the License.
6   * You may obtain a copy of the License at
7   * 
8   *     http://www.tizenopensource.org/license
9   * 
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16
17 #include <stdlib.h>
18 #include <stdio.h>
19 #include <Elementary.h>
20 #include <dlog.h>
21 #include <ui-gadget-module.h>
22 #include <gravel.h>
23 #include <memo_string.h>
24 #include <extended-elm.h>
25 #include <supplement.h>
26 #include <memo-assist.h>
27 #include <memo-genlist.h>
28 #include <memo-assist.h>
29 #include <memo-efl.h>
30
31 typedef struct __select_view_t {
32     ug_data_t *ugd;
33     Evas_Object *navigator;
34     Evas_Object *ctrl_bar;
35     Elm_Object_Item *r_btn;
36     Evas_Object *body_main;
37
38     /* add more variables here */
39     Elm_Genlist_Item_Class itc;
40     Elm_Genlist_Item_Class itc_draw;
41     Evas_Object *genlist;
42     int selected;
43     int total;
44     Evas_Object *selectioninfo;
45     Evas_Object *selectioninfo_layout;
46 } select_view_t;
47
48 static void memo_data_iterate_cb (memo_data_t *md, void *user_data);
49
50 static void _on_data_update(void *data)
51 {
52     select_view_t *sv = (select_view_t *)data;
53     elm_genlist_clear(sv->genlist);
54         memo_all_data(memo_data_iterate_cb, sv);
55     sv->selected = 0;
56         elm_object_item_disabled_set(sv->r_btn, EINA_TRUE);
57 }
58
59 static void _on_quit(void *data, Evas_Object *obj, void *event_info)
60 {
61     RETIF(data == NULL);
62     select_view_t *sv = (select_view_t *)data;
63     ug_data_t *ugd = sv->ugd;
64     memo_unsubscribe_change(_on_data_update);
65     ug_destroy_me(ugd->ug);
66 }
67
68 static void _on_add(void *data, Evas_Object *obj, void *event_info)
69 {
70     RETIF(data == NULL);
71     select_view_t *sv = (select_view_t *)data;
72     ug_data_t *ugd = sv->ugd;
73     bundle *b = NULL;
74     Elm_Object_Item *it;
75     gl_data_t *gld = NULL;
76     int c_text = 0;
77     int c_image = 0;
78     char path[MEMO_BUFFER_SIZE] = {0};
79     memo_data_t *md = NULL;
80
81     b = bundle_create();
82     it = elm_genlist_first_item_get(sv->genlist);
83     while (it != NULL) {
84         gld = (gl_data_t *)elm_object_item_data_get(it);
85         md = memo_get_data(gld->index);
86         if (gld->check) {
87             if (gld->has_doodle) {
88                 c_image++;
89                 snprintf(ugd->buf, MEMO_BUFFER_SIZE, "image%d", c_image);
90                 snprintf(path, MEMO_BUFFER_SIZE, DOODLEDIR"/%d.png", gld->index);
91                 bundle_add(b, ugd->buf, path);
92             } else {
93                 c_text++;
94                 snprintf(ugd->buf, MEMO_BUFFER_SIZE, "text%d", c_text);
95                 bundle_add(b, ugd->buf, md->content);
96             }
97         }
98         memo_free_data(md);
99         it = elm_genlist_item_next_get(it);
100     }
101
102     snprintf(ugd->buf, MEMO_BUFFER_SIZE, "%d", c_image);
103     bundle_add(b, "image", ugd->buf);
104     snprintf(ugd->buf, MEMO_BUFFER_SIZE, "%d", c_text);
105     bundle_add(b, "text", ugd->buf);
106     ug_send_result(ugd->ug, b);
107     bundle_dump(b);
108     bundle_free(b);
109     memo_unsubscribe_change(_on_data_update);
110     ug_destroy_me(ugd->ug);
111 }
112
113 #pragma GCC diagnostic ignored "-Wformat-extra-args"
114 static void _create_selectioninfo(select_view_t *sv)
115 {
116     if (sv->selectioninfo == NULL)
117     {
118         sv->selectioninfo = elm_notify_add(sv->body_main);
119         elm_notify_orient_set(sv->selectioninfo, ELM_NOTIFY_ORIENT_BOTTOM);
120         sv->selectioninfo_layout = elm_layout_add(sv->body_main);
121         elm_layout_theme_set(sv->selectioninfo_layout, "standard", "selectioninfo", "vertical/bottom_12");
122         elm_object_content_set(sv->selectioninfo, sv->selectioninfo_layout);
123     }
124
125     if (sv->selected == 0) {
126         evas_object_hide(sv->selectioninfo);
127     } else {
128         char text[128];
129         if (sv->selected == 1) {
130             snprintf(text, 128, "%s", MEMO_I18N_1_MEMO_SELECTED);
131         } else {
132             snprintf(text, 128, MEMO_I18N_D_MEMOS_SELECTED, sv->selected);
133         }
134         edje_object_part_text_set(_EDJ(sv->selectioninfo_layout), "elm.text", text);
135         evas_object_show(sv->selectioninfo);
136     }
137 }
138 #pragma GCC diagnostic warning "-Wformat-extra-args"
139
140 static void _on_item_select_cb(void *data, Evas_Object *obj, void *event_info)
141 {
142     Elm_Object_Item *it = (Elm_Object_Item *)event_info;
143     gl_data_t *gld = (gl_data_t *)elm_object_item_data_get(it);
144     select_view_t *sv = (select_view_t *)gld->user_data;
145
146     gld->check = !gld->check;
147     elm_genlist_item_update(it);
148     gld->check ? sv->selected++ : sv->selected--;
149
150     /* update add button and selectinfo */
151     if (sv->selected == 0) {
152         elm_object_item_disabled_set(sv->r_btn, EINA_TRUE);
153     } else {
154         elm_object_item_disabled_set(sv->r_btn, EINA_FALSE);
155     }
156     _create_selectioninfo(sv);
157
158     /* reset state, next click event will be triggered as selected */
159     elm_genlist_item_selected_set(it, 0);
160 }
161
162 static void memo_data_iterate_cb (memo_data_t *md, void *user_data)
163 {
164     select_view_t *sv = (select_view_t *)user_data;
165     gl_data_t *gld = SMALLOC(gl_data_t);
166     RETIF(gld == NULL);
167     memo_gld_init(gld, md, sv, NULL);
168     if (md->has_doodle) {
169         elm_genlist_item_append(sv->genlist, &sv->itc_draw,(void *)gld,
170             NULL, ELM_GENLIST_ITEM_NONE, _on_item_select_cb, NULL);
171     } else {
172         elm_genlist_item_append(sv->genlist, &sv->itc,(void *)gld,
173             NULL, ELM_GENLIST_ITEM_NONE, _on_item_select_cb, NULL);
174     }
175     sv->total++;
176 }
177
178 static void _create_select_layout(select_view_t *sv)
179 {
180     ug_data_t *ugd = sv->ugd;
181
182     /* add navigationbar */
183     sv->navigator = elm_naviframe_add(ugd->base);
184
185     /* body main */
186     sv->body_main = elm_layout_create(sv->navigator, EDJ_FILE, "selector_frame");
187     /* genlist */
188     sv->genlist = elm_genlist_add(sv->body_main);
189     /* apply customized theme */
190     elm_object_theme_set(sv->genlist, sv->ugd->th);
191     elm_genlist_block_count_set(sv->genlist, 10);
192     memo_all_data(memo_data_iterate_cb, sv);
193
194     elm_object_part_content_set(sv->body_main, "elm.swallow.content", sv->genlist);
195     edje_object_part_text_set(_EDJ(sv->body_main), "text", (sv->total == 0 ? "No item" : ""));
196
197     /* compose */
198     Elm_Object_Item *navi_it = elm_naviframe_item_push(sv->navigator, MEMO_I18N_MEMO, NULL, NULL, sv->body_main, NULL);
199     /* control bar */
200     Evas_Object *ctrl_bar = memo_controlbar_add(sv->navigator);
201     elm_toolbar_item_append(ctrl_bar, NULL, MEMO_I18N_CANCEL, _on_quit, sv);
202     sv->r_btn = elm_toolbar_item_append(ctrl_bar, NULL, MEMO_I18N_ADD, _on_add, sv);
203     elm_object_item_part_content_set(navi_it, "controlbar", ctrl_bar);
204     elm_object_item_disabled_set(sv->r_btn, EINA_TRUE); /* disable add defaultly */
205 }
206
207 void *memo_load_select_view(ug_data_t *ugd, bundle *data)
208 {
209     select_view_t *sv = SMALLOC(select_view_t);
210     RETVIF(sv == NULL, NULL);
211     sv->ugd = ugd;
212
213     /* date update hooker */
214     memo_subscribe_change(_on_data_update, sv);
215
216     /* init */
217     memo_gl_itc_init(&sv->itc, "memo/edit/list");
218     memo_gl_itc_init(&sv->itc_draw, "memo/edit/list_draw");
219
220     /* create */
221     _create_select_layout(sv);
222     elm_object_part_content_set(ugd->base, "elm.swallow.content", sv->navigator);
223     return (void *)sv;
224 }