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