1 #include "e.h"
2 #include "e_mod_main.h"
3
4 typedef struct _Import Import;
5
6 struct _Import
7 {
8 E_Config_Dialog *parent;
9 E_Config_Dialog_Data *cfdata;
10
11 Evas_Object *bg_obj;
12 Evas_Object *box_obj;
13 Evas_Object *content_obj;
14 Evas_Object *event_obj;
15 Evas_Object *fsel_obj;
16
17 Evas_Object *ok_obj;
18 Evas_Object *cancel_obj;
19
20 Evas_Object *win;
21 };
22
23 struct _E_Config_Dialog_Data
24 {
25 char *file;
26 };
27
28 static void _imc_import_cb_delete(void *data EINA_UNUSED, Evas *e, Evas_Object *obj, void *event_info);
29 static void _imc_import_cb_wid_focus(void *data, Evas_Object *obj);
30 static void _imc_import_cb_selected(void *data, Evas_Object *obj);
31 static void _imc_import_cb_changed(void *data, Evas_Object *obj);
32 static void _imc_import_cb_ok(void *data, void *data2);
33 static void _imc_import_cb_close(void *data, void *data2);
34 static void _imc_import_cb_key_down(void *data, Evas *e, Evas_Object *obj,
35 void *event);
36
37 Evas_Object *
e_int_config_imc_import(E_Config_Dialog * parent)38 e_int_config_imc_import(E_Config_Dialog *parent)
39 {
40 Evas *evas;
41 Evas_Object *win;
42 Evas_Object *o, *ofm;
43 Import *import;
44 E_Config_Dialog_Data *cfdata;
45 Evas_Modifier_Mask mask;
46 Evas_Coord w, h;
47 Eina_Bool kg;
48
49 import = E_NEW(Import, 1);
50 if (!import) return NULL;
51
52 win = elm_win_add(parent->parent, "E", ELM_WIN_DIALOG_BASIC);
53 if (!win)
54 {
55 E_FREE(import);
56 return NULL;
57 }
58
59 evas = evas_object_evas_get(win);
60
61 cfdata = E_NEW(E_Config_Dialog_Data, 1);
62 import->cfdata = cfdata;
63 import->win = win;
64 import->parent = parent;
65
66 elm_win_title_set(win, _("Select an Input Method Settings..."));
67 evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, _imc_import_cb_delete, NULL);
68 ecore_evas_name_class_set(ecore_evas_ecore_evas_get(evas_object_evas_get(win)), "E", "_imc_import_dialog");
69
70 o = elm_layout_add(win);
71 E_EXPAND(o);
72 E_FILL(o);
73 import->bg_obj = o;
74 e_theme_edje_object_set(o, "base/theme/dialog", "e/widgets/dialog/main");
75 elm_win_resize_object_add(win, o);
76 evas_object_show(o);
77
78 o = e_widget_list_add(evas, 1, 1);
79 e_widget_on_focus_hook_set(o, _imc_import_cb_wid_focus, import);
80 import->box_obj = o;
81 elm_object_part_content_set(import->bg_obj, "e.swallow.buttons", o);
82
83 o = evas_object_rectangle_add(evas);
84 import->event_obj = o;
85 mask = 0;
86 kg = evas_object_key_grab(o, "Tab", mask, ~mask, 0);
87 if (!kg)
88 fprintf(stderr, "ERROR: unable to redirect \"Tab\" key events to object %p.\n", o);
89 mask = evas_key_modifier_mask_get(evas, "Shift");
90 kg = evas_object_key_grab(o, "Tab", mask, ~mask, 0);
91 if (!kg)
92 fprintf(stderr, "ERROR: unable to redirect \"Tab\" key events to object %p.\n", o);
93 mask = 0;
94 kg = evas_object_key_grab(o, "Return", mask, ~mask, 0);
95 if (!kg)
96 fprintf(stderr, "ERROR: unable to redirect \"Return\" key events to object %p.\n", o);
97 mask = 0;
98 kg = evas_object_key_grab(o, "KP_Enter", mask, ~mask, 0);
99 if (!kg)
100 fprintf(stderr, "ERROR: unable to redirect \"KP_Enter\" key events to object %p.\n", o);
101 evas_object_event_callback_add(o, EVAS_CALLBACK_KEY_DOWN,
102 _imc_import_cb_key_down, import);
103
104 o = e_widget_list_add(evas, 0, 0);
105 import->content_obj = o;
106
107 ofm = e_widget_fsel_add(evas, e_user_homedir_get(), "/",
108 NULL, NULL,
109 _imc_import_cb_selected, import,
110 _imc_import_cb_changed, import, 1);
111 import->fsel_obj = ofm;
112 e_widget_list_object_append(o, ofm, 1, 1, 0.5);
113
114 e_widget_size_min_get(o, &w, &h);
115 evas_object_size_hint_min_set(o, w, h);
116 elm_object_part_content_set(import->bg_obj, "e.swallow.content", o);
117 evas_object_show(o);
118
119 import->ok_obj = e_widget_button_add(evas, _("OK"), NULL,
120 _imc_import_cb_ok, win, cfdata);
121 e_widget_list_object_append(import->box_obj, import->ok_obj, 1, 0, 0.5);
122
123 import->cancel_obj = e_widget_button_add(evas, _("Cancel"), NULL,
124 _imc_import_cb_close,
125 win, cfdata);
126 e_widget_list_object_append(import->box_obj, import->cancel_obj, 1, 0, 0.5);
127
128 e_widget_disabled_set(import->ok_obj, 1);
129 elm_win_center(win, 1, 1);
130
131 o = import->box_obj;
132 e_widget_size_min_get(o, &w, &h);
133 evas_object_size_hint_min_set(o, w, h);
134 elm_object_part_content_set(import->bg_obj, "e.swallow.buttons", o);
135
136 evas_object_show(win);
137 e_win_client_icon_set(win, "preferences-imc");
138
139 evas_object_data_set(win, "imc_win", import);
140
141 return win;
142 }
143
144 static void
_imc_import_cb_delete(void * data EINA_UNUSED,Evas * e EINA_UNUSED,Evas_Object * obj,void * event_info EINA_UNUSED)145 _imc_import_cb_delete(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
146 {
147 Import *import;
148
149 import = evas_object_data_get(obj, "imc_win");
150 if (!import) return;
151
152 evas_object_del(import->win);
153 e_int_config_imc_import_done(import->parent);
154
155 E_FREE(import->cfdata->file);
156 E_FREE(import->cfdata);
157 E_FREE(import);
158
159 return;
160 }
161
162 static void
_imc_import_cb_wid_focus(void * data,Evas_Object * obj)163 _imc_import_cb_wid_focus(void *data, Evas_Object *obj)
164 {
165 Import *import;
166
167 import = data;
168 if (obj == import->content_obj)
169 e_widget_focused_object_clear(import->box_obj);
170 else if (import->content_obj)
171 e_widget_focused_object_clear(import->content_obj);
172 }
173
174 static void
_imc_import_cb_selected(void * data,Evas_Object * obj EINA_UNUSED)175 _imc_import_cb_selected(void *data, Evas_Object *obj EINA_UNUSED)
176 {
177 Import *import;
178
179 import = data;
180 _imc_import_cb_ok(import->win, NULL);
181 }
182
183 static void
_imc_import_cb_changed(void * data,Evas_Object * obj EINA_UNUSED)184 _imc_import_cb_changed(void *data, Evas_Object *obj EINA_UNUSED)
185 {
186 Import *import;
187 const char *path;
188 const char *file;
189
190 if (!(import = data)) return;
191 if (!import->fsel_obj) return;
192
193 path = e_widget_fsel_selection_path_get(import->fsel_obj);
194 E_FREE(import->cfdata->file);
195 if (path)
196 import->cfdata->file = strdup(path);
197
198 if (import->cfdata->file)
199 {
200 char *strip;
201
202 file = ecore_file_file_get(import->cfdata->file);
203 strip = ecore_file_strip_ext(file);
204 if (!strip)
205 {
206 E_FREE(import->cfdata->file);
207 e_widget_disabled_set(import->ok_obj, 1);
208 return;
209 }
210 free(strip);
211 if (!e_util_glob_case_match(file, "*.imc"))
212 {
213 E_FREE(import->cfdata->file);
214 e_widget_disabled_set(import->ok_obj, 1);
215 return;
216 }
217 e_widget_disabled_set(import->ok_obj, 0);
218 }
219 else
220 e_widget_disabled_set(import->ok_obj, 1);
221 }
222
223 static void
_imc_import_cb_ok(void * data,void * data2 EINA_UNUSED)224 _imc_import_cb_ok(void *data, void *data2 EINA_UNUSED)
225 {
226 Import *import;
227 Evas_Object *win;
228 const char *path;
229 const char *file;
230
231 win = data;
232 if (!(import = evas_object_data_get(win, "imc_win"))) return;
233
234 path = e_widget_fsel_selection_path_get(import->fsel_obj);
235 E_FREE(import->cfdata->file);
236 if (path)
237 import->cfdata->file = strdup(path);
238
239 if (import->cfdata->file)
240 {
241 Eet_File *ef;
242 E_Input_Method_Config *imc;
243 char *strip;
244
245 file = ecore_file_file_get(import->cfdata->file);
246
247 if (!(strip = ecore_file_strip_ext(file))) return;
248 free(strip);
249
250 if (!e_util_glob_case_match(file, "*.imc"))
251 return;
252
253 imc = NULL;
254 ef = eet_open(import->cfdata->file, EET_FILE_MODE_READ);
255 if (ef)
256 {
257 imc = e_intl_input_method_config_read(ef);
258 eet_close(ef);
259 }
260
261 if (!imc)
262 {
263 e_util_dialog_show(_("Input Method Config Import Error"),
264 _("Enlightenment was unable to import "
265 "the configuration.<ps/><ps/>Are "
266 "you sure this is really a valid "
267 "configuration?"));
268 }
269 else
270 {
271 char buf[PATH_MAX];
272
273 e_intl_input_method_config_free(imc);
274 snprintf(buf, sizeof(buf), "%s/%s",
275 e_intl_imc_personal_path_get(), file);
276
277 if (!ecore_file_cp(import->cfdata->file, buf))
278 {
279 e_util_dialog_show(_("Input Method Config Import Error"),
280 _("Enlightenment was unable to import "
281 "the configuration<ps/>due to a copy "
282 "error."));
283 }
284 else
285 e_int_config_imc_update(import->parent, buf);
286 }
287 }
288
289 evas_object_del(import->win);
290 }
291
292 static void
_imc_import_cb_close(void * data,void * data2 EINA_UNUSED)293 _imc_import_cb_close(void *data, void *data2 EINA_UNUSED)
294 {
295 evas_object_del(data);
296 }
297
298 static void
_imc_import_cb_key_down(void * data,Evas * e EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event)299 _imc_import_cb_key_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event)
300 {
301 Evas_Event_Key_Down *ev;
302 Import *import;
303
304 ev = event;
305 import = data;
306 if ((!e_widget_fsel_typebuf_visible_get(import->fsel_obj)) && (!strcmp(ev->key, "Tab")))
307 {
308 if (evas_key_modifier_is_set(evas_key_modifier_get(evas_object_evas_get(import->win)), "Shift"))
309 {
310 if (e_widget_focus_get(import->box_obj))
311 {
312 if (!e_widget_focus_jump(import->box_obj, 0))
313 {
314 e_widget_focus_set(import->content_obj, 0);
315 if (!e_widget_focus_get(import->content_obj))
316 e_widget_focus_set(import->box_obj, 0);
317 }
318 }
319 else
320 {
321 if (!e_widget_focus_jump(import->content_obj, 0))
322 e_widget_focus_set(import->box_obj, 0);
323 }
324 }
325 else
326 {
327 if (e_widget_focus_get(import->box_obj))
328 {
329 if (!e_widget_focus_jump(import->box_obj, 1))
330 {
331 e_widget_focus_set(import->content_obj, 1);
332 if (!e_widget_focus_get(import->content_obj))
333 e_widget_focus_set(import->box_obj, 1);
334 }
335 }
336 else
337 {
338 if (!e_widget_focus_jump(import->content_obj, 1))
339 e_widget_focus_set(import->box_obj, 1);
340 }
341 }
342 }
343 else if (((!strcmp(ev->key, "Return")) ||
344 (!strcmp(ev->key, "KP_Enter")) ||
345 (!strcmp(ev->key, "space"))))
346 {
347 Evas_Object *o = NULL;
348
349 if ((import->content_obj) && (e_widget_focus_get(import->content_obj)))
350 o = e_widget_focused_object_get(import->content_obj);
351 else
352 o = e_widget_focused_object_get(import->box_obj);
353 if (o) e_widget_activate(o);
354 }
355 }
356
357