Tizen 2.0 Release
[apps/core/preloaded/myfiles.git] / src / common / mf-language-mgr.c
1 /*
2  * Copyright 2013         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://floralicense.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
18 #include <libintl.h>
19 #include <glib.h>
20
21 #include "mf-language-mgr.h"
22 #include "mf-dlog.h"
23 #include "mf-util.h"
24
25 typedef struct
26 {
27         Evas_Object *obj;
28         obj_type type;
29         const char *text_id;
30         const char *part;
31 }obj_data;
32
33 typedef struct
34 {
35         Elm_Object_Item *obj_item;
36         const char *text_id;
37         item_type type;
38 }obj_item_data;
39
40 typedef struct _lang_mgr *lang_mgr;
41 struct  _lang_mgr{
42         GList *objs;
43         GList *obj_items;
44         GList *glist_items;
45         GList *grid_items;
46 }_lang_mgr;
47
48
49 static lang_mgr g_lang_mgr;
50
51 #define G_LIST_FOREACH(list, l, data) \
52   for (l = list,                         \
53        data = g_list_nth_data(l, 0);     \
54        l;                                \
55        l = g_list_next(l),            \
56        data = g_list_nth_data(l, 0))
57
58 static void __glist_free(void *data)
59 {
60         obj_data *item = data;
61         MF_CHECK(item);
62         //if(item->text_id)
63                 //free(item->text_id);
64         free(item);
65 }
66
67
68 static void __update_obj(void *data, void *userdata)
69 {
70         char *text;
71         obj_data *item = data;
72         MF_CHECK(item);
73         mf_debug("handle: 0x%x, ID:%s",item->obj, item->text_id);
74
75         text = mf_util_get_text(item->text_id);
76
77         if(item->type == OBJ_TYPE_ELM_OBJECT)
78                 elm_object_text_set(item->obj, text);
79         else if(item->type == OBJ_TYPE_EDJE_OBJECT)
80                 edje_object_part_text_set(elm_layout_edje_get(item->obj), item->part, text);
81         else
82                 mf_debug("Unhandled case");
83 }
84
85 static void __update_obj_item(void *data, void *userdata)
86 {
87         char *text;
88         obj_item_data *item_data = data;
89         MF_CHECK(item_data);
90         mf_debug("handle: 0x%x, ID:%s",item_data->obj_item, item_data->text_id);
91         text = mf_util_get_text(item_data->text_id);
92         elm_object_item_text_set(item_data->obj_item, text);
93 }
94
95 static void __update_list(void *data, void *userdata)
96 {
97         Elm_Object_Item *item = data;
98         MF_CHECK(item);
99         mf_debug("handle: 0x%x",item);
100         elm_genlist_item_update(item);
101 }
102
103 static void __update_grid(void *data, void *userdata)
104 {
105         Elm_Object_Item *item = data;
106         MF_CHECK(item);
107         mf_debug("handle: 0x%x",item);
108         elm_gengrid_item_update(item);
109 }
110
111 static void __obj_del_cb(void *data, Evas * e, Evas_Object * eo, void *event_info)
112 {
113         obj_data *item = data;
114         MF_CHECK(g_lang_mgr);
115         MF_CHECK(item);
116
117         g_lang_mgr->objs =
118                 g_list_delete_link(g_lang_mgr->objs, g_list_find(g_lang_mgr->objs, item));
119
120         free(item);
121 }
122
123 #if 0
124 static void __obj_item_del_cb(void *data, Evas_Object *obj, void *event_info)
125 {
126         mf_debug("");
127         obj_item_data *item = data;
128         MF_CHECK(g_lang_mgr);
129         MF_CHECK(item);
130
131         g_lang_mgr->obj_items=
132                 g_list_delete_link(g_lang_mgr->obj_items, g_list_find(g_lang_mgr->obj_items, item));
133
134         free(item);
135 }
136 #endif
137
138 int mf_language_mgr_create(void)
139 {
140         mf_debug("");
141         if(!g_lang_mgr)
142         {
143                 lang_mgr mgr = calloc(1, sizeof(_lang_mgr));
144                 if(!mgr)
145                 {
146                         mf_debug("Error: calloc");
147                         return -1;
148                 }
149                 g_lang_mgr = mgr;
150         }
151         return 0;
152 }
153
154 int mf_language_mgr_destroy(void)
155 {
156         MF_CHECK_VAL(g_lang_mgr, -1);
157         g_list_free_full(g_lang_mgr->objs, __glist_free);
158         g_lang_mgr->objs = NULL;
159
160         g_list_free(g_lang_mgr->glist_items);
161         g_lang_mgr->glist_items = NULL;
162
163         g_list_free(g_lang_mgr->grid_items);
164         g_lang_mgr->grid_items = NULL;
165
166         free(g_lang_mgr);
167         g_lang_mgr = NULL;
168
169         return 0;
170 }
171
172 void mf_language_mgr_register_object(Evas_Object *obj, obj_type type, const char *part, const char *text_id)
173 {
174         MF_CHECK(g_lang_mgr);
175         obj_data *item = calloc(1, sizeof(obj_data));
176         MF_CHECK(item);
177
178         item->type = type;
179         item->part = part;
180         item->text_id = text_id;
181         item->obj = obj;
182
183         evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, __obj_del_cb, item);
184
185         g_lang_mgr->objs = g_list_append(g_lang_mgr->objs, item);
186 }
187
188 void mf_language_mgr_register_object_item(Elm_Object_Item *object_item, const char *text_ID, item_type type)
189 {
190         mf_debug();
191         MF_CHECK(g_lang_mgr);
192         mf_debug();
193         obj_item_data *data = calloc(1, sizeof(obj_item_data));
194         mf_debug();
195         MF_CHECK(data);
196         mf_debug();
197
198         mf_debug("text id is [%s] item is [%p]", text_ID, object_item);
199         data->obj_item = object_item;
200         data->text_id = text_ID;
201         data->type = type;
202
203         g_lang_mgr->obj_items= g_list_append(g_lang_mgr->obj_items, data);
204         mf_debug("======================length is [%d]", g_list_length(g_lang_mgr->obj_items));
205
206 }
207
208 void mf_language_mgr_unregister_object_item(Elm_Object_Item *object_item)
209 {
210         GList *l;
211         obj_item_data *data;
212
213         G_LIST_FOREACH(g_lang_mgr->obj_items, l, data)
214         {
215                 if (data == NULL || data->obj_item == NULL) {
216                         continue;
217                 }
218                 if(data->obj_item == object_item)
219                 {
220                         g_lang_mgr->obj_items = g_list_delete_link(g_lang_mgr->obj_items, l);
221                         free(data);
222                         data = NULL;
223                         break;
224                 }
225         }
226 }
227
228 void mf_language_mgr_unregister_object_item_by_type(item_type type)
229 {
230         MF_TRACE_BEGIN;
231         GList *l;
232         obj_item_data *data;
233         GList *temp = NULL;
234         G_LIST_FOREACH(g_lang_mgr->obj_items, l, data)
235         {
236                 if (data == NULL) {
237                         continue;
238                 }
239                 if(data->type == type)
240                 {
241                         free(data);
242                         data = NULL;
243                 } else {
244                         temp = g_list_append(temp, data);
245                 }
246         }
247
248         g_list_free(g_lang_mgr->obj_items);
249         g_lang_mgr->obj_items = temp;
250
251         MF_TRACE_END;
252 }
253
254
255 void mf_language_mgr_object_item_text_ID_set(Elm_Object_Item *object_item, const char *text_ID)
256 {
257         MF_CHECK(g_lang_mgr);
258         GList *l;
259         obj_item_data *data;
260
261         G_LIST_FOREACH(g_lang_mgr->obj_items, l, data)
262         {
263                 if(data->obj_item == object_item)
264                 {
265                         mf_debug("set ID: %s", text_ID);
266                         data->text_id = text_ID;
267                         break;
268                 }
269         }
270
271 }
272
273 void mf_language_mgr_register_genlist_item(Elm_Object_Item *item)
274 {
275         MF_CHECK(g_lang_mgr);
276         g_lang_mgr->glist_items =
277                 g_list_append(g_lang_mgr->glist_items, item);
278 }
279
280 void mf_language_mgr_unregister_genlist_item(Elm_Object_Item *item)
281 {
282         MF_CHECK(g_lang_mgr);
283         g_lang_mgr->glist_items =
284                 g_list_delete_link(g_lang_mgr->glist_items, g_list_find(g_lang_mgr->glist_items, item));
285 }
286
287 void mf_language_mgr_register_gengrid_item(Elm_Object_Item *item)
288 {
289         MF_CHECK(g_lang_mgr);
290         g_lang_mgr->grid_items =
291                 g_list_append(g_lang_mgr->grid_items, item);
292 }
293
294 void mf_language_mgr_unregister_gengrid_item(Elm_Object_Item *item)
295 {
296         MF_CHECK(g_lang_mgr);
297         g_lang_mgr->grid_items =
298                 g_list_delete_link(g_lang_mgr->grid_items, g_list_find(g_lang_mgr->grid_items, item));
299 }
300
301 void mf_language_mgr_update()
302 {
303         mf_debug("language changed. update text");
304         MF_CHECK(g_lang_mgr);
305         g_list_foreach(g_lang_mgr->objs, __update_obj, NULL);
306         g_list_foreach(g_lang_mgr->obj_items, __update_obj_item, NULL);
307         g_list_foreach(g_lang_mgr->glist_items, __update_list, NULL);
308         g_list_foreach(g_lang_mgr->grid_items, __update_grid, NULL);
309 }
310