Tizen 2.1 release
[platform/core/uifw/e17.git] / src / bin / e_import_dialog.c
1 #include "e.h"
2
3 static void
4 _fsel_path_save(E_Import_Dialog *id)
5 {
6    const char *fdev = NULL, *fpath = NULL;
7
8    e_widget_fsel_path_get(id->fsel_obj, &fdev, &fpath);
9    if ((fdev) || (fpath))
10      {
11         eina_stringshare_replace(&e_config->wallpaper_import_last_dev, fdev);
12         eina_stringshare_replace(&e_config->wallpaper_import_last_path, fpath);
13         e_config_save_queue();
14      }
15 }
16
17 static void
18 _fsel_cb_close(void *data, E_Dialog *dia __UNUSED__)
19 {
20    E_Import_Dialog *id = data;
21
22    e_object_ref(data);
23    if (id->cancel) id->cancel(id);
24    e_object_del(data);
25    e_object_unref(data);
26 }
27
28 static void
29 _import_ok(void *data, void *data2)
30 {
31    E_Import_Dialog *id;
32
33    id = e_object_data_get(data2);
34    e_object_ref(E_OBJECT(id));
35    if (id->ok) id->ok(data, id);
36    e_object_del(E_OBJECT(id));
37    e_object_unref(E_OBJECT(id));
38 }
39
40 static void
41 _fsel_cb_ok(void *data, E_Dialog *dia __UNUSED__)
42 {
43    E_Import_Dialog *id;
44    const char *path, *p;
45    int is_bg, is_theme, r;
46    const char *file;
47    char buf[PATH_MAX];
48
49    id = data;
50    path = e_widget_fsel_selection_path_get(id->fsel_obj);
51    if (!path) return;
52
53    p = strrchr(path, '.');
54    if ((p) && (strcasecmp(p, ".edj")))
55      {
56         E_Import_Config_Dialog *import;
57         import = e_import_config_dialog_show(id->dia->win->container, path, _import_ok, NULL);
58         e_dialog_parent_set(import->dia, id->dia->win);
59         e_object_data_set(E_OBJECT(import), id);
60         return;
61      }
62    r = 0;
63    file = ecore_file_file_get(path);
64    e_user_dir_snprintf(buf, sizeof(buf), "backgrounds/%s", file);
65
66    is_bg = edje_file_group_exists(path, "e/desktop/background");
67    is_theme =
68      edje_file_group_exists(path, "e/widgets/border/default/border");
69
70    if ((is_bg) && (!is_theme))
71      {
72         if (!ecore_file_cp(path, buf))
73           {
74              e_util_dialog_show(_("Import Error"),
75                                 _("Enlightenment was unable to "
76                                   "import the image<br>due to a "
77                                   "copy error."));
78           }
79         else
80           r = 1;
81      }
82    else
83      {
84         e_util_dialog_show(_("Import Error"),
85                            _("Enlightenment was unable to "
86                              "import the image.<br><br>"
87                              "Are you sure this is a valid "
88                              "image?"));
89      }
90
91    if (r)
92      {
93         e_object_ref(E_OBJECT(id));
94         if (id->ok) id->ok(buf, id);
95         e_object_del(E_OBJECT(id));
96         e_object_unref(E_OBJECT(id));
97      }
98    else
99      _fsel_cb_close(id, NULL);
100 }
101
102
103 static void
104 _e_import_dia_del(void *data)
105 {
106    E_Dialog *dia = data;
107
108    e_object_del(dia->data);
109 }
110
111 static void
112 _e_import_dialog_del(void *data)
113 {
114    E_Import_Dialog *id = data;
115
116    _fsel_path_save(id);
117    e_object_del(E_OBJECT(id->dia));
118    free(id);
119 }
120
121 static void
122 _e_import_dialog_win_del(E_Win *win)
123 {
124    E_Dialog *dia;
125    E_Import_Dialog *id;
126
127    dia = win->data;
128    id = dia->data;
129    e_object_del(E_OBJECT(id));
130 }
131
132 //////////////////////////////////////////////////////////////////////////////////
133
134 EAPI E_Import_Dialog *
135 e_import_dialog_show(E_Container *con, const char *dev, const char *path, Ecore_End_Cb ok, Ecore_Cb cancel)
136 {
137    Evas *evas;
138    E_Import_Dialog *id;
139    Evas_Object *ofm;
140    int w, h;
141    const char *fdev, *fpath;
142    char buf[PATH_MAX];
143    E_Dialog *dia;
144
145    id = E_OBJECT_ALLOC(E_Import_Dialog, E_IMPORT_DIALOG_TYPE, _e_import_dialog_del);
146    if (!id) return NULL;
147
148    dia = e_dialog_new(con, "E", "_import_fsel_dialog");
149    dia->data = id;
150    id->dia = dia;
151    id->ok = ok, id->cancel = cancel;
152    e_object_del_attach_func_set(E_OBJECT(dia), _e_import_dia_del);
153    e_win_delete_callback_set(dia->win, _e_import_dialog_win_del);
154
155    evas = e_win_evas_get(dia->win);
156    e_dialog_title_set(dia, _("Select a Picture..."));
157
158    fdev = dev ?: e_config->wallpaper_import_last_dev;
159    fpath = path ?: e_config->wallpaper_import_last_path;
160    if (fdev)
161      snprintf(buf, sizeof(buf), "%s/%s",
162               fdev, path);
163    else
164      snprintf(buf, sizeof(buf), "%s", path);
165
166    if (!ecore_file_exists(ecore_file_realpath(buf)))
167      fpath = "/";
168    else
169      fpath = path ?: e_config->wallpaper_import_last_path;
170
171    if ((!fdev) && (!fpath))
172      {
173         fdev = "~/";
174         fpath = "/";
175      }
176
177    //printf("LAST: [%s] '%s' '%s'\n", buf, fdev, fpath);
178    /* if we ever use the second param in _fsel_cb_ok() then we will have to create a second function
179     * for this callback, but as of now it's okay
180     */
181    ofm = e_widget_fsel_add(evas, fdev, fpath, NULL, NULL, (void*)_fsel_cb_ok, id,
182                            NULL, NULL, 1);
183    e_widget_fsel_window_object_set(ofm, E_OBJECT(dia->win));
184    id->fsel_obj = ofm;
185    e_widget_size_min_get(ofm, &w, &h);
186    e_dialog_content_set(dia, ofm, w, h);
187
188    e_dialog_button_add(dia, _("Use"), NULL, _fsel_cb_ok, id);
189    e_dialog_button_add(dia, _("Cancel"), NULL, _fsel_cb_close, id);
190    e_dialog_border_icon_set(dia, "enlightenment/background");
191    e_dialog_show(dia);
192    e_win_centered_set(dia->win, 1);
193    e_widget_focus_set(ofm, 1);
194
195    return id;
196 }