apply FSL(Flora Software License)
[apps/home/memo.git] / src / memo_list_editor.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 <appcore-efl.h>
20 #include <Elementary.h>
21 #include <dlog.h>
22 #include <gravel.h>
23 #include <vconf-keys.h>
24 #include <extended-elm.h>
25 #include <supplement.h>
26 #include <memo-assist.h>
27 #include <memo_string.h>
28 #include <memo-genlist.h>
29 #include <memo_ug.h>
30
31 typedef struct __list_editor {
32     Evas_Object *parent;
33     Memo_Component_Callback cb;
34     void *data;
35     char buf[MEMO_BUFFER_SIZE]; /* for temporarily usage only */
36
37     /* content */
38     Evas_Object *body_main;
39     Evas_Object *select_all;
40     Evas_Object *genlist;
41
42     /* other */
43     Evas_Object *win_main;
44     Elm_Genlist_Item_Class itc;
45     Elm_Genlist_Item_Class itc_draw;
46     int count; /* count of records */
47     int select_count; /* count of records */
48     Evas_Object *selectioninfo;
49     Evas_Object *selectioninfo_layout;
50 } list_editor;
51
52 #pragma GCC diagnostic ignored "-Wformat-extra-args"
53 static void create_selectioninfo(list_editor *le)
54 {
55     if (le->selectioninfo == NULL) {
56         le->selectioninfo = elm_notify_add(le->body_main);
57         elm_notify_orient_set(le->selectioninfo, ELM_NOTIFY_ORIENT_BOTTOM);
58         le->selectioninfo_layout = elm_layout_add(le->body_main);
59         elm_layout_theme_set(le->selectioninfo_layout, "standard", "selectioninfo",
60                      "vertical/bottom_12");
61         elm_object_content_set(le->selectioninfo, le->selectioninfo_layout);
62     }
63
64     if (le->select_count == 0) {
65         evas_object_hide(le->selectioninfo);
66     } else {
67         char text[128];
68         if (le->select_count == 1) {
69             snprintf(text, 128, "%s", MEMO_I18N_1_MEMO_SELECTED);
70         } else {
71             snprintf(text, 128, MEMO_I18N_D_MEMOS_SELECTED, le->select_count);
72         }
73         edje_object_part_text_set(elm_layout_edje_get(le->selectioninfo_layout), "elm.text", text);
74         evas_object_show(le->selectioninfo);
75     }
76 }
77 #pragma GCC diagnostic warning "-Wformat-extra-args"
78
79 static void _on_item_select_cb(void *data, Evas_Object *obj, void *event_info)
80 {
81     Elm_Object_Item *it = (Elm_Object_Item *)event_info;
82     gl_data_t *gld = (gl_data_t *)elm_object_item_data_get(it);
83     list_editor *le = (list_editor *)gld->user_data;
84
85     elm_genlist_item_selected_set(it, 0);
86
87     gld->check = !gld->check;
88     elm_genlist_item_update(it);
89     (gld->check) ? (le->select_count++) : (le->select_count--);
90     if (le->select_count == le->count) { /* update select all */
91         elm_check_state_set(le->select_all, EINA_TRUE);
92     } else {
93         elm_check_state_set(le->select_all, EINA_FALSE);
94     }
95     /* update select info */
96     create_selectioninfo(le);
97     le->cb(le->data, "count", (void *)le->select_count);
98 }
99
100 static void memo_data_iterate_cb (memo_data_t *md, void *user_data)
101 {
102     list_editor *le = (list_editor *)user_data;
103     gl_data_t *gld = SMALLOC(gl_data_t);
104     RETIF(gld == NULL);
105     memo_gld_init(gld, md, le, NULL);
106     if (md->has_doodle) {
107         elm_genlist_item_append(le->genlist, &le->itc_draw,(void *)gld,
108             NULL, ELM_GENLIST_ITEM_NONE, _on_item_select_cb, NULL);
109     } else {
110         elm_genlist_item_append(le->genlist, &le->itc,(void *)gld,
111             NULL, ELM_GENLIST_ITEM_NONE, _on_item_select_cb, NULL);
112     }
113     le->count++;
114 }
115
116 static void on_select_all_change_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
117 {
118     list_editor *le = (list_editor *)data;
119     Evas_Event_Mouse_Up *ev = event_info;
120     Eina_Bool bSelect = EINA_FALSE;
121     Eina_List *realized_list;
122     Elm_Object_Item *it;
123     Eina_List *l = NULL;
124     gl_data_t *gld = NULL;
125
126     Evas_Coord x, y, w, h;
127     evas_object_geometry_get(obj, &x, &y, &w, &h);
128     if (!IN_RECT_CHECK(ev->output.x, ev->output.y, x, y, w, h)) {
129         return;
130     }
131
132     bSelect = elm_check_state_get(le->select_all);
133     bSelect = !bSelect;
134     elm_check_state_set(le->select_all, bSelect);
135     bSelect ? (le->select_count = le->count) : (le->select_count = 0);
136     it = elm_genlist_first_item_get(le->genlist);
137     while (it != NULL) {
138         gld = (gl_data_t *)elm_object_item_data_get(it);
139         if (gld->index != -1) {
140             gld->check = bSelect;
141         }
142         it = elm_genlist_item_next_get(it);
143     }
144     realized_list = elm_genlist_realized_items_get(le->genlist);
145     EINA_LIST_FOREACH(realized_list, l, it) {
146         elm_genlist_item_update(it);
147     }
148     create_selectioninfo(le);
149     le->cb(le->data, "count", (void *)le->select_count);
150 }
151
152 static void _create_list_editor_layout(list_editor *le, bundle *bd)
153 {
154     Evas_Object *eo = NULL;
155     Evas_Object *check = NULL;
156
157     le->body_main = elm_layout_create(le->parent, EDJ_FILE, "edit_list_frame");
158     le->cb(le->data, "layout", le->body_main);
159
160     /* select all */
161     eo = elm_layout_create(le->body_main, EDJ_FILE, "edit_list_item_select_all");
162     edje_object_part_text_set(elm_layout_edje_get(eo), "elm.text.select.all", MEMO_I18N_SELECT_ALL);
163     check = elm_check_create(eo);
164     elm_object_part_content_set(eo, "elm.swallow.check", check);
165     evas_object_event_callback_add(eo, EVAS_CALLBACK_MOUSE_UP, on_select_all_change_cb, le);
166     elm_object_part_content_set(le->body_main, "elm.swallow.select.all", eo);
167     le->select_all = check;
168     /* genlist */
169     le->genlist = elm_genlist_add(le->body_main);
170     elm_object_part_content_set(le->body_main, "elm.swallow.content", le->genlist);
171     elm_genlist_block_count_set(le->genlist, 8);
172     /* records */
173     le->count = 0;
174     memo_all_data(memo_data_iterate_cb, le);
175     /* notify */
176     le->cb(le->data, "count", (void *)le->select_count);
177 }
178
179 static void on_delete_yes(void *data, Evas_Object *obj, void *event_info)
180 {
181     list_editor *le = (list_editor *)data;
182     Elm_Object_Item *it;
183     Elm_Object_Item *pre;
184     gl_data_t *gld = NULL;
185
186     memo_begin_trans();
187     it = elm_genlist_first_item_get(le->genlist);
188     while (it != NULL) {
189         pre = it;
190         it = elm_genlist_item_next_get(it);
191         gld = (gl_data_t *)elm_object_item_data_get(pre);
192         if (gld->check) {
193             memo_del_data(gld->index);
194             elm_object_item_del(pre);
195         }
196     }
197     memo_end_trans();
198     le->cb(le->data, "delete_done", le->body_main);
199 }
200
201 void memo_list_editor_share_records(void *h_le)
202 {
203     list_editor *le = (list_editor *)h_le;
204     int indexes[400] = {0};
205     int c = 0;
206     Elm_Object_Item *it;
207     gl_data_t *gld = NULL;
208     it = elm_genlist_first_item_get(le->genlist);
209     while (it != NULL) {
210         gld = (gl_data_t *)elm_object_item_data_get(it);
211         if (gld->check) {
212             indexes[c++] = gld->index;
213         }
214         it = elm_genlist_item_next_get(it);
215     }
216     memo_share(le->win_main, indexes, c);
217 }
218
219 void memo_list_editor_delete_records(void *h_le)
220 {
221     list_editor *le = (list_editor *)h_le;
222     snprintf(le->buf, MEMO_BUFFER_SIZE, "%s?", MEMO_I18N_DELETE);
223     memo_create_yes_no_popup(le->win_main, le->buf, on_delete_yes, NULL, le);
224 }
225
226 void *memo_load_list_editor(Evas_Object *parent, Evas_Object *win, bundle *bd, Memo_Component_Callback cb, void *data)
227 {
228     list_editor *le = SMALLOC(list_editor);
229     RETVIF(le==NULL, NULL);
230     bundle_dump(bd);
231     le->parent = parent;
232     le->cb = (cb==NULL ? memo_com_dummy_cb : cb); /* make sure cb is not null, no need to check legitimacy of cb when call */
233     le->data = data;
234
235     /* init */
236     memo_gl_itc_init(&le->itc, "memo/edit/list");
237     memo_gl_itc_init(&le->itc_draw, "memo/edit/list_draw");
238     le->win_main = win;
239
240     _create_list_editor_layout(le, bd);
241     return (void *)le;
242 }
243
244 void memo_destroy_list_editor(void *h_le)
245 {
246     list_editor *le = (list_editor *)h_le;
247     evas_object_del(le->body_main);
248     SFREE(le);
249 }
250