2 * Copyright 2012 Samsung Electronics Co., Ltd
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
8 * http://www.tizenopensource.org/license
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.
19 #include <appcore-efl.h>
20 #include <Elementary.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>
31 typedef struct __list_editor {
33 Memo_Component_Callback cb;
35 char buf[MEMO_BUFFER_SIZE]; /* for temporarily usage only */
38 Evas_Object *body_main;
39 Evas_Object *select_all;
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;
52 #pragma GCC diagnostic ignored "-Wformat-extra-args"
53 static void create_selectioninfo(list_editor *le)
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);
64 if (le->select_count == 0) {
65 evas_object_hide(le->selectioninfo);
68 if (le->select_count == 1) {
69 snprintf(text, 128, "%s", MEMO_I18N_1_MEMO_SELECTED);
71 snprintf(text, 128, MEMO_I18N_D_MEMOS_SELECTED, le->select_count);
73 edje_object_part_text_set(elm_layout_edje_get(le->selectioninfo_layout), "elm.text", text);
74 evas_object_show(le->selectioninfo);
77 #pragma GCC diagnostic warning "-Wformat-extra-args"
79 static void _on_item_select_cb(void *data, Evas_Object *obj, void *event_info)
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;
85 elm_genlist_item_selected_set(it, 0);
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);
93 elm_check_state_set(le->select_all, EINA_FALSE);
95 /* update select info */
96 create_selectioninfo(le);
97 le->cb(le->data, "count", (void *)le->select_count);
100 static void memo_data_iterate_cb (memo_data_t *md, void *user_data)
102 list_editor *le = (list_editor *)user_data;
103 gl_data_t *gld = SMALLOC(gl_data_t);
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);
110 elm_genlist_item_append(le->genlist, &le->itc,(void *)gld,
111 NULL, ELM_GENLIST_ITEM_NONE, _on_item_select_cb, NULL);
116 static void on_select_all_change_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
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;
124 gl_data_t *gld = NULL;
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)) {
132 bSelect = elm_check_state_get(le->select_all);
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);
138 gld = (gl_data_t *)elm_object_item_data_get(it);
139 if (gld->index != -1) {
140 gld->check = bSelect;
142 it = elm_genlist_item_next_get(it);
144 realized_list = elm_genlist_realized_items_get(le->genlist);
145 EINA_LIST_FOREACH(realized_list, l, it) {
146 elm_genlist_item_update(it);
148 create_selectioninfo(le);
149 le->cb(le->data, "count", (void *)le->select_count);
152 static void _create_list_editor_layout(list_editor *le, bundle *bd)
154 Evas_Object *eo = NULL;
155 Evas_Object *check = NULL;
157 le->body_main = elm_layout_create(le->parent, EDJ_FILE, "edit_list_frame");
158 le->cb(le->data, "layout", le->body_main);
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;
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);
174 memo_all_data(memo_data_iterate_cb, le);
176 le->cb(le->data, "count", (void *)le->select_count);
179 static void on_delete_yes(void *data, Evas_Object *obj, void *event_info)
181 list_editor *le = (list_editor *)data;
183 Elm_Object_Item *pre;
184 gl_data_t *gld = NULL;
187 it = elm_genlist_first_item_get(le->genlist);
190 it = elm_genlist_item_next_get(it);
191 gld = (gl_data_t *)elm_object_item_data_get(pre);
193 memo_del_data(gld->index);
194 elm_object_item_del(pre);
198 le->cb(le->data, "delete_done", le->body_main);
201 void memo_list_editor_share_records(void *h_le)
203 list_editor *le = (list_editor *)h_le;
204 int indexes[400] = {0};
207 gl_data_t *gld = NULL;
208 it = elm_genlist_first_item_get(le->genlist);
210 gld = (gl_data_t *)elm_object_item_data_get(it);
212 indexes[c++] = gld->index;
214 it = elm_genlist_item_next_get(it);
216 memo_share(le->win_main, indexes, c);
219 void memo_list_editor_delete_records(void *h_le)
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);
226 void *memo_load_list_editor(Evas_Object *parent, Evas_Object *win, bundle *bd, Memo_Component_Callback cb, void *data)
228 list_editor *le = SMALLOC(list_editor);
229 RETVIF(le==NULL, NULL);
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 */
236 memo_gl_itc_init(&le->itc, "memo/edit/list");
237 memo_gl_itc_init(&le->itc_draw, "memo/edit/list_draw");
240 _create_list_editor_layout(le, bd);
244 void memo_destroy_list_editor(void *h_le)
246 list_editor *le = (list_editor *)h_le;
247 evas_object_del(le->body_main);