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