2012/08/21: tizen 2.0 beta
[apps/home/call-setting.git] / src / cst-autoreject-ime.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 <Elementary.h>
18 #include <Ecore_IMF.h>
19
20 #include "cst-common.h"
21 #include "cst-common-string.h"
22 #include "cst-widget.h"
23 #include "cst-util.h"
24
25 static Elm_Genlist_Item_Class *itc = NULL;
26 static Elm_Genlist_Item_Class *itc_2text_expand = NULL;
27 static Elm_Genlist_Item_Class *itc_sub_expand = NULL;
28
29 static void __cst_on_click_reject_rule_exp(void *data, Evas *evas, Evas_Object *obj, void *event_info);
30 static CstGlItemDisplayInfo_t list_dep1_rule[] = {
31         {1, CST_STR_MATCH_CRITERIA, ELM_GENLIST_ITEM_TREE, CST_GL_ITEM_EXPANDABLE, __cst_on_click_reject_rule_exp},
32         {1, -1, ELM_GENLIST_ITEM_NONE, CST_GL_ITEM_NONE, NULL},
33 };
34
35 static CstGlItemDisplayInfo_t list_dep2_rule[] = {
36         {2, CST_STR_EXACTLY_THE_SAME_AS, ELM_GENLIST_ITEM_NONE, CST_GL_ITEM_RADIO_1TEXT, (void *)PH_MISC_BLOCK_RULE_EXACTLY},
37         {2, CST_STR_START_WITH, ELM_GENLIST_ITEM_NONE, CST_GL_ITEM_RADIO_1TEXT, (void *)PH_MISC_BLOCK_RULE_START},
38         {2, CST_STR_INCLUDE, ELM_GENLIST_ITEM_NONE, CST_GL_ITEM_RADIO_1TEXT, (void *)PH_MISC_BLOCK_RULE_INCLUDE},
39         {2, -1, ELM_GENLIST_ITEM_NONE, CST_GL_ITEM_NONE, NULL},
40 };
41
42 int _cst_get_reject_number(char *buffer, void *data)
43 {
44         ENTER(_cst_get_reject_number);
45         retv_if(NULL == data, 0);
46         CstUgData_t *ugd = (CstUgData_t *)data;
47         const char *entry_input;
48         Evas_Object *error;
49         Ecore_IMF_Context *imf_ctx;
50
51         entry_input = elm_entry_entry_get(ugd->dg_entry);
52         retv_if(NULL == entry_input, -1);
53         if (strlen(entry_input) == 0) {
54                 imf_ctx = elm_entry_imf_context_get(ugd->dg_entry);
55                 if (imf_ctx) {
56                         ecore_imf_context_input_panel_hide(imf_ctx);
57                 }
58                 error = _cst_create_error_popup(ugd->nf, CST_ERROR_ENTER_NUMBER);
59                 ugd->popup = error;
60                 evas_object_show(error);
61                 return -1;
62         }
63
64         DBG("IME input string = %s length=%d", entry_input, strlen(entry_input));
65
66         snprintf(buffer, CST_MAX_PHONE_NUMBER_LEN, "%s", entry_input);
67         return strlen(entry_input);
68 }
69
70 static Evas_Object *__cst_gl_icon_get_autoreject_ime(void *data, Evas_Object *obj, const char *part)
71 {
72         ENTER(__cst_gl_icon_get_autoreject_ime);
73         retv_if(NULL == data, NULL);
74         CstUgData_t *ugd = (CstUgData_t *)data;
75
76         if (!strcmp(part, "elm.icon")) {
77                 Evas_Object *ef = _cst_create_ime_editfield(ugd, obj, CST_IME_AUTO_REJECT, NULL);
78                 retv_if(ef == NULL, NULL);
79
80                 return _cst_create_ime_btn_layout(obj, ef,
81                                 _cst_on_click_ime_contact_btn, (void *)ugd);
82         }
83         return NULL;
84 }
85
86 static void __cst_gl_reject_cst_del(void *data, Evas_Object *obj)
87 {
88         CstGlItemData_t *item_data = (CstGlItemData_t *)data;
89         if (item_data)
90                 free(item_data);
91         return;
92 }
93
94 static char *__cst_gl_label_get_reject_expand(void *data, Evas_Object *obj, const char *part)
95 {
96         retv_if(NULL == data, NULL);
97         CstGlItemData_t *item_data = (CstGlItemData_t *)data;
98         if (!strcmp(part, "elm.text.1")) {
99                 if (list_dep1_rule[item_data->index].str_id != -1)
100                         return strdup(T_(list_dep1_rule[item_data->index].str_id));
101         } else if (!strcmp(part, "elm.text.2")) {
102                 CstUgData_t *ugd = (CstUgData_t *)item_data->ugd;
103                 retv_if(NULL == ugd, NULL);
104
105                 int index;
106                 for (index = 0; list_dep2_rule[index].style != CST_GL_ITEM_NONE; ++index) {
107                         DBG("index :%d", index);
108                         if (ugd->reject_rule == (ph_misc_block_rules)list_dep2_rule[index].func) {
109                                 if (list_dep2_rule[index].str_id != -1)
110                                         return strdup(T_(list_dep2_rule[index].str_id));
111                         }
112                 }
113
114                 DBG("Rejection rule is not exist : %d", ugd->reject_rule);
115         }
116         return NULL;
117 }
118
119 static void __cst_gl_reject_rule_sel(void *data, Evas_Object *obj, void *event_info)
120 {
121         ret_if(NULL == data);
122         CstGlItemData_t *item_data = (CstGlItemData_t *)data;
123         CstUgData_t *ugd = item_data->ugd;
124         elm_genlist_item_selected_set((Elm_Object_Item *)event_info, EINA_FALSE);
125
126         if (list_dep1_rule[item_data->index].func) {
127                 if (list_dep1_rule[item_data->index].style == CST_GL_ITEM_EXPANDABLE)
128                         list_dep1_rule[item_data->index].func((void *)ugd, NULL, obj, event_info);
129         }
130         return;
131 }
132
133 static char *__cst_gl_2nd_reject_rule_label_get(void *data, Evas_Object *obj, const char *part)
134 {
135         retv_if(NULL == data, NULL);
136         CstGlItemData_t *item_data = (CstGlItemData_t *)data;
137         if (!strcmp(part, "elm.text")) {
138                 if (list_dep2_rule[item_data->index].str_id != -1)
139                         return strdup(T_(list_dep2_rule[item_data->index].str_id));
140         }
141         return NULL;
142 }
143
144 static Evas_Object *__cst_gl_2nd_reject_rule_icon_get(void *data, Evas_Object *obj, const char *part)
145 {
146         retv_if(NULL == data, NULL);
147         CstGlItemData_t *item_data = (CstGlItemData_t *)data;
148         CstUgData_t *ugd = (CstUgData_t *)item_data->ugd;
149
150         retv_if(NULL == ugd, NULL);
151         if (!strcmp(part, "elm.icon")) {
152                 if (ugd->rdg_reject_rule == NULL) {
153                         ugd->rdg_reject_rule = elm_radio_add(obj);
154                         elm_radio_value_set(ugd->rdg_reject_rule, -1);
155                 }
156                 Evas_Object *radio = _cst_create_radio_icon(obj,
157                         ugd->rdg_reject_rule, (int)list_dep2_rule[item_data->index].func,
158                         ugd->reject_rule, NULL);
159                 return radio;
160         }
161         return NULL;
162 }
163
164 static void __cst_gl_2nd_reject_rule_sel(void *data, Evas_Object *obj, void *event_info)
165 {
166         ret_if(data == NULL);
167         CstGlItemData_t *item_data = (CstGlItemData_t *)data;
168         CstUgData_t *ugd = item_data->ugd;
169
170         elm_genlist_item_selected_set((Elm_Object_Item *)event_info, EINA_FALSE);
171         ugd->reject_rule = (ph_misc_block_rules)list_dep2_rule[item_data->index].func;
172         if (ugd->rdg_reject_rule) {
173                 elm_radio_value_set(ugd->rdg_reject_rule, ugd->reject_rule);    
174                 elm_genlist_item_update(item_data->parent_gl_item);
175         }
176         return;
177 }
178
179 static void __cst_gl_reject_rule_exp(void *data, Evas_Object *obj, void *event_info)
180 {
181         ENTER(__cst_gl_reject_rule_exp);
182         ret_if(NULL == data);
183         CstUgData_t *ugd = (CstUgData_t *)data;
184         Elm_Object_Item *item = (Elm_Object_Item *)event_info;
185         ret_if(NULL == item);
186         Evas_Object *genlist = elm_object_item_widget_get(item);
187         ret_if(NULL == genlist);
188         ugd->rdg_reject_rule = NULL;
189
190         CstGlItemData_t *item_data2;
191         int i = 0;
192
193         itc_sub_expand->item_style = "dialogue/1text.1icon/expandable2";
194         itc_sub_expand->func.text_get = __cst_gl_2nd_reject_rule_label_get;
195         itc_sub_expand->func.content_get = __cst_gl_2nd_reject_rule_icon_get;
196         itc_sub_expand->func.state_get = NULL;
197         itc_sub_expand->func.del = __cst_gl_reject_cst_del;
198
199         ugd->rdg_reject_rule = elm_radio_add(genlist);
200         elm_radio_value_set(ugd->rdg_reject_rule, -1);
201         for (i = 0; list_dep2_rule[i].style != CST_GL_ITEM_NONE; i++) {
202                 item_data2 = (CstGlItemData_t *)calloc(1, sizeof(CstGlItemData_t));
203                 ret_if(item_data2 == NULL);
204                 item_data2->index = i;
205                 item_data2->ugd = ugd;
206                 item_data2->parent_gl_item = item;
207
208                 elm_genlist_item_append(genlist, itc_sub_expand,
209                         (void *)item_data2, item, list_dep2_rule[i].flags,
210                         __cst_gl_2nd_reject_rule_sel, item_data2);
211         }
212 }
213
214 static void __cst_gl_reject_rule_con(void *data, Evas_Object *obj, void *event_info)
215 {
216
217         Elm_Object_Item *item = event_info;
218         elm_genlist_item_subitems_clear(item);
219 }
220
221 static void __cst_gl_reject_rule_exp_req(void *data, Evas_Object *obj, void *event_info)
222 {
223         if (data != NULL) { /*Close IME*/
224                 CstUgData_t *ugd = (CstUgData_t *)data;
225                 elm_object_focus_set(ugd->dg_entry, EINA_FALSE);
226         }
227
228         Elm_Object_Item *item = event_info;
229         elm_genlist_item_expanded_set(item, EINA_TRUE);
230 }
231
232 static void __cst_gl_reject_rule_con_req(void *data, Evas_Object *obj, void *event_info)
233 {
234         Elm_Object_Item *item = event_info;
235         elm_genlist_item_expanded_set(item, EINA_FALSE);
236 }
237
238 static void __cst_on_click_reject_rule_exp(void *data, Evas *evas, Evas_Object *obj, void *event_info)
239 {
240         ENTER(__cst_on_click_reject_rule_exp);
241         Elm_Object_Item *item = event_info;
242         ret_if(NULL == data);
243         if (elm_genlist_item_expanded_get(item)) {
244                 __cst_gl_reject_rule_con_req(data, obj, event_info);
245                 __cst_gl_reject_rule_con(data, obj, event_info);
246         } else {
247                 elm_genlist_tree_effect_enabled_set(elm_object_item_widget_get(item), EINA_TRUE);
248                 __cst_gl_reject_rule_exp_req(data, obj, event_info);
249                 __cst_gl_reject_rule_exp(data, obj, event_info);
250         }
251 }
252
253 static Evas_Object *__cst_create_autoreject_ime_genlist(CstUgData_t *ugd)
254 {
255         ENTER(__cst_create_autoreject_ime_genlist);
256         Elm_Object_Item *item = NULL;
257         Evas_Object *genlist;
258         retv_if(NULL == ugd, NULL);
259         genlist = elm_genlist_add(ugd->nf);
260
261         if (!itc)
262                 itc = elm_genlist_item_class_new();
263
264         if (!itc_2text_expand)
265                 itc_2text_expand = elm_genlist_item_class_new();
266
267         if (!itc_sub_expand)
268                 itc_sub_expand = elm_genlist_item_class_new();
269
270         itc->item_style = "1icon";
271         itc->func.text_get = NULL;
272         itc->func.content_get = __cst_gl_icon_get_autoreject_ime;
273         itc->func.state_get = NULL;
274         itc->func.del = NULL;
275
276         itc_2text_expand->item_style = "dialogue/2text.3/expandable";
277         itc_2text_expand->func.text_get = __cst_gl_label_get_reject_expand;
278         itc_2text_expand->func.content_get = NULL;
279         itc_2text_expand->func.state_get = NULL;
280         itc_2text_expand->func.del = __cst_gl_reject_cst_del;
281
282         item = elm_genlist_item_append(genlist, itc,
283                 (void *)ugd, NULL, ELM_GENLIST_ITEM_NONE,
284                 NULL, NULL);
285
286         CstGlItemData_t *item_data = (CstGlItemData_t *)calloc(1, sizeof(CstGlItemData_t));
287         retv_if(NULL == item_data, NULL);
288
289         item_data->ugd = ugd;
290         item = elm_genlist_item_append(genlist, itc_2text_expand,
291                                 (void *)item_data, NULL, ELM_GENLIST_ITEM_TREE,
292                                 __cst_gl_reject_rule_sel, item_data);
293
294         return genlist;
295 }
296
297 Evas_Object *_cst_create_autoreject_ime(Evas_Object *parent, char *edit_string, void *data)
298 {
299         ENTER(_cst_create_autoreject_ime);
300         CstUgData_t *ugd = (CstUgData_t *)data;
301
302         Evas_Object *genlist = __cst_create_autoreject_ime_genlist(ugd);
303         return genlist;
304 }
305