elementary/map - map supports language,changed
[framework/uifw/elementary.git] / src / lib / elc_fileselector_button.c
1 #include <Elementary.h>
2 #include "elm_priv.h"
3 #include "elm_widget_fileselector_button.h"
4
5 EAPI const char ELM_FILESELECTOR_BUTTON_SMART_NAME[] =
6   "elm_fileselector_button";
7
8 #define DEFAULT_WINDOW_TITLE "Select a file"
9
10 static const char SIG_FILE_CHOSEN[] = "file,chosen";
11 static const Evas_Smart_Cb_Description _smart_callbacks[] = {
12    {SIG_FILE_CHOSEN, "s"},
13    {NULL, NULL}
14 };
15
16 EVAS_SMART_SUBCLASS_NEW
17   (ELM_FILESELECTOR_BUTTON_SMART_NAME, _elm_fileselector_button,
18   Elm_Fileselector_Button_Smart_Class, Elm_Button_Smart_Class,
19   elm_button_smart_class_get, _smart_callbacks);
20
21 static Eina_Bool
22 _elm_fileselector_button_smart_theme(Evas_Object *obj)
23 {
24    char buf[4096];
25    const char *style;
26
27    ELM_FILESELECTOR_BUTTON_DATA_GET(obj, sd);
28
29    style = eina_stringshare_add(elm_widget_style_get(obj));
30
31    snprintf(buf, sizeof(buf), "fileselector_button/%s", style);
32
33    /* file selector button's style has an extra bit */
34    eina_stringshare_replace(&(ELM_WIDGET_DATA(sd)->style), buf);
35
36    if (!ELM_WIDGET_CLASS(_elm_fileselector_button_parent_sc)->theme(obj))
37      return EINA_FALSE;
38
39    eina_stringshare_replace(&(ELM_WIDGET_DATA(sd)->style), style);
40
41    eina_stringshare_del(style);
42
43    return EINA_TRUE;
44 }
45
46 static void
47 _selection_done(void *data,
48                 Evas_Object *obj __UNUSED__,
49                 void *event_info)
50 {
51    Elm_Fileselector_Button_Smart_Data *sd = data;
52    const char *file = event_info;
53    Evas_Object *del;
54
55    if (file) eina_stringshare_replace(&sd->fsd.path, file);
56
57    del = sd->fsw;
58    sd->fs = NULL;
59    sd->fsw = NULL;
60    evas_object_del(del);
61
62    evas_object_smart_callback_call
63      (ELM_WIDGET_DATA(sd)->obj, SIG_FILE_CHOSEN, (void *)file);
64 }
65
66 static Evas_Object *
67 _new_window_add(Elm_Fileselector_Button_Smart_Data *sd)
68 {
69    Evas_Object *win, *bg;
70
71    win = elm_win_add(NULL, "fileselector_button", ELM_WIN_DIALOG_BASIC);
72    elm_win_title_set(win, sd->window_title);
73    elm_win_autodel_set(win, EINA_TRUE);
74    evas_object_smart_callback_add(win, "delete,request", _selection_done, sd);
75
76    bg = elm_bg_add(win);
77    elm_win_resize_object_add(win, bg);
78    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
79    evas_object_show(bg);
80
81    evas_object_resize(win, sd->w, sd->h);
82    return win;
83 }
84
85 static Evas_Object *
86 _parent_win_get(Evas_Object *obj)
87 {
88    while ((obj) && (strcmp(elm_widget_type_get(obj), "elm_win")))
89      obj = elm_object_parent_widget_get(obj);
90
91    return obj;
92 }
93
94 static void
95 _activate(Elm_Fileselector_Button_Smart_Data *sd)
96 {
97    Eina_Bool is_inwin = EINA_FALSE;
98
99    if (sd->fs) return;
100
101    if (sd->inwin_mode)
102      {
103         sd->fsw = _parent_win_get(ELM_WIDGET_DATA(sd)->obj);
104
105         if (!sd->fsw)
106           sd->fsw = _new_window_add(sd);
107         else
108           {
109              sd->fsw = elm_win_inwin_add(sd->fsw);
110              is_inwin = EINA_TRUE;
111           }
112      }
113    else
114      sd->fsw = _new_window_add(sd);
115
116    sd->fs = elm_fileselector_add(sd->fsw);
117    elm_widget_mirrored_set
118      (sd->fs, elm_widget_mirrored_get(ELM_WIDGET_DATA(sd)->obj));
119    elm_widget_mirrored_automatic_set(sd->fs, EINA_FALSE);
120    elm_fileselector_expandable_set(sd->fs, sd->fsd.expandable);
121    elm_fileselector_folder_only_set(sd->fs, sd->fsd.folder_only);
122    elm_fileselector_is_save_set(sd->fs, sd->fsd.is_save);
123    elm_fileselector_selected_set(sd->fs, sd->fsd.path);
124    evas_object_size_hint_weight_set
125      (sd->fs, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
126    evas_object_size_hint_align_set(sd->fs, EVAS_HINT_FILL, EVAS_HINT_FILL);
127    evas_object_smart_callback_add(sd->fs, "done", _selection_done, sd);
128    evas_object_show(sd->fs);
129
130    if (is_inwin)
131      {
132         elm_win_inwin_content_set(sd->fsw, sd->fs);
133         elm_win_inwin_activate(sd->fsw);
134      }
135    else
136      {
137         elm_win_resize_object_add(sd->fsw, sd->fs);
138         evas_object_show(sd->fsw);
139      }
140 }
141
142 static void
143 _button_clicked(void *data,
144                 Evas_Object *obj __UNUSED__,
145                 void *event_info __UNUSED__)
146 {
147    _activate(data);
148 }
149
150 static void
151 _elm_fileselector_button_smart_add(Evas_Object *obj)
152 {
153    EVAS_SMART_DATA_ALLOC(obj, Elm_Fileselector_Button_Smart_Data);
154
155    ELM_WIDGET_CLASS(_elm_fileselector_button_parent_sc)->base.add(obj);
156
157    priv->window_title = eina_stringshare_add(DEFAULT_WINDOW_TITLE);
158    if (getenv("HOME")) priv->fsd.path = eina_stringshare_add(getenv("HOME"));
159    else priv->fsd.path = eina_stringshare_add("/");
160
161    priv->fsd.expandable = _elm_config->fileselector_expand_enable;
162    priv->inwin_mode = _elm_config->inwin_dialogs_enable;
163    priv->w = 400;
164    priv->h = 400;
165
166    elm_widget_mirrored_automatic_set(obj, EINA_FALSE);
167
168    evas_object_smart_callback_add(obj, "clicked", _button_clicked, priv);
169
170    _elm_fileselector_button_smart_theme(obj);
171    elm_widget_can_focus_set(obj, EINA_TRUE);
172 }
173
174 static void
175 _elm_fileselector_button_smart_del(Evas_Object *obj)
176 {
177    Evas_Object *win;
178
179    ELM_FILESELECTOR_BUTTON_DATA_GET(obj, sd);
180
181    if (sd->window_title) eina_stringshare_del(sd->window_title);
182    if (sd->fsd.path) eina_stringshare_del(sd->fsd.path);
183    if (sd->fs)
184      {
185         win = evas_object_data_del(obj, "win");
186         evas_object_del(win);
187      }
188
189    ELM_WIDGET_CLASS(_elm_fileselector_button_parent_sc)->base.del(obj);
190 }
191
192 static void
193 _elm_fileselector_button_smart_set_user(
194   Elm_Fileselector_Button_Smart_Class *sc)
195 {
196    ELM_WIDGET_CLASS(sc)->base.add = _elm_fileselector_button_smart_add;
197    ELM_WIDGET_CLASS(sc)->base.del = _elm_fileselector_button_smart_del;
198
199    ELM_WIDGET_CLASS(sc)->theme = _elm_fileselector_button_smart_theme;
200
201    ELM_BUTTON_CLASS(sc)->admits_autorepeat = EINA_FALSE;
202 }
203
204 EAPI const Elm_Fileselector_Button_Smart_Class *
205 elm_fileselector_button_smart_class_get(void)
206 {
207    static Elm_Fileselector_Button_Smart_Class _sc =
208      ELM_FILESELECTOR_BUTTON_SMART_CLASS_INIT_NAME_VERSION
209        (ELM_FILESELECTOR_BUTTON_SMART_NAME);
210    static const Elm_Fileselector_Button_Smart_Class *class = NULL;
211    Evas_Smart_Class *esc = (Evas_Smart_Class *)&_sc;
212
213    if (class) return class;
214
215    _elm_fileselector_button_smart_set(&_sc);
216    esc->callbacks = _smart_callbacks;
217    class = &_sc;
218
219    return class;
220 }
221
222 EAPI Evas_Object *
223 elm_fileselector_button_add(Evas_Object *parent)
224 {
225    Evas_Object *obj;
226
227    EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
228
229    obj = elm_widget_add(_elm_fileselector_button_smart_class_new(), parent);
230    if (!obj) return NULL;
231
232    if (!elm_widget_sub_object_add(parent, obj))
233      ERR("could not add %p as sub object of %p", obj, parent);
234
235    return obj;
236 }
237
238 EAPI void
239 elm_fileselector_button_window_title_set(Evas_Object *obj,
240                                          const char *title)
241 {
242    ELM_FILESELECTOR_BUTTON_CHECK(obj);
243    ELM_FILESELECTOR_BUTTON_DATA_GET(obj, sd);
244
245    eina_stringshare_replace(&sd->window_title, title);
246
247    if (sd->fsw) elm_win_title_set(sd->fsw, sd->window_title);
248 }
249
250 EAPI const char *
251 elm_fileselector_button_window_title_get(const Evas_Object *obj)
252 {
253    ELM_FILESELECTOR_BUTTON_CHECK(obj) NULL;
254    ELM_FILESELECTOR_BUTTON_DATA_GET(obj, sd);
255
256    return sd->window_title;
257 }
258
259 EAPI void
260 elm_fileselector_button_window_size_set(Evas_Object *obj,
261                                         Evas_Coord width,
262                                         Evas_Coord height)
263 {
264    ELM_FILESELECTOR_BUTTON_CHECK(obj);
265    ELM_FILESELECTOR_BUTTON_DATA_GET(obj, sd);
266
267    sd->w = width;
268    sd->h = height;
269
270    if (sd->fsw) evas_object_resize(sd->fsw, sd->w, sd->h);
271 }
272
273 EAPI void
274 elm_fileselector_button_window_size_get(const Evas_Object *obj,
275                                         Evas_Coord *width,
276                                         Evas_Coord *height)
277 {
278    ELM_FILESELECTOR_BUTTON_CHECK(obj);
279    ELM_FILESELECTOR_BUTTON_DATA_GET(obj, sd);
280
281    if (width) *width = sd->w;
282    if (height) *height = sd->h;
283 }
284
285 EAPI void
286 elm_fileselector_button_path_set(Evas_Object *obj,
287                                  const char *path)
288 {
289    ELM_FILESELECTOR_BUTTON_CHECK(obj);
290    ELM_FILESELECTOR_BUTTON_DATA_GET(obj, sd);
291
292    eina_stringshare_replace(&sd->fsd.path, path);
293
294    if (sd->fs) elm_fileselector_selected_set(sd->fs, sd->fsd.path);
295 }
296
297 EAPI const char *
298 elm_fileselector_button_path_get(const Evas_Object *obj)
299 {
300    ELM_FILESELECTOR_BUTTON_CHECK(obj) NULL;
301    ELM_FILESELECTOR_BUTTON_DATA_GET(obj, sd);
302
303    return sd->fsd.path;
304 }
305
306 EAPI void
307 elm_fileselector_button_expandable_set(Evas_Object *obj,
308                                        Eina_Bool value)
309 {
310    ELM_FILESELECTOR_BUTTON_CHECK(obj);
311    ELM_FILESELECTOR_BUTTON_DATA_GET(obj, sd);
312
313    sd->fsd.expandable = value;
314
315    if (sd->fs) elm_fileselector_expandable_set(sd->fs, sd->fsd.expandable);
316 }
317
318 EAPI Eina_Bool
319 elm_fileselector_button_expandable_get(const Evas_Object *obj)
320 {
321    ELM_FILESELECTOR_BUTTON_CHECK(obj) EINA_FALSE;
322    ELM_FILESELECTOR_BUTTON_DATA_GET(obj, sd);
323
324    return sd->fsd.expandable;
325 }
326
327 EAPI void
328 elm_fileselector_button_folder_only_set(Evas_Object *obj,
329                                         Eina_Bool value)
330 {
331    ELM_FILESELECTOR_BUTTON_CHECK(obj);
332    ELM_FILESELECTOR_BUTTON_DATA_GET(obj, sd);
333
334    sd->fsd.folder_only = value;
335
336    if (sd->fs) elm_fileselector_folder_only_set(sd->fs, sd->fsd.folder_only);
337 }
338
339 EAPI Eina_Bool
340 elm_fileselector_button_folder_only_get(const Evas_Object *obj)
341 {
342    ELM_FILESELECTOR_BUTTON_CHECK(obj) EINA_FALSE;
343    ELM_FILESELECTOR_BUTTON_DATA_GET(obj, sd);
344
345    return sd->fsd.folder_only;
346 }
347
348 EAPI void
349 elm_fileselector_button_is_save_set(Evas_Object *obj,
350                                     Eina_Bool value)
351 {
352    ELM_FILESELECTOR_BUTTON_CHECK(obj);
353    ELM_FILESELECTOR_BUTTON_DATA_GET(obj, sd);
354
355    sd->fsd.is_save = value;
356
357    if (sd->fs) elm_fileselector_is_save_set(sd->fs, sd->fsd.is_save);
358 }
359
360 EAPI Eina_Bool
361 elm_fileselector_button_is_save_get(const Evas_Object *obj)
362 {
363    ELM_FILESELECTOR_BUTTON_CHECK(obj) EINA_FALSE;
364    ELM_FILESELECTOR_BUTTON_DATA_GET(obj, sd);
365
366    return sd->fsd.is_save;
367 }
368
369 EAPI void
370 elm_fileselector_button_inwin_mode_set(Evas_Object *obj,
371                                        Eina_Bool value)
372 {
373    ELM_FILESELECTOR_BUTTON_CHECK(obj);
374    ELM_FILESELECTOR_BUTTON_DATA_GET(obj, sd);
375
376    sd->inwin_mode = value;
377 }
378
379 EAPI Eina_Bool
380 elm_fileselector_button_inwin_mode_get(const Evas_Object *obj)
381 {
382    ELM_FILESELECTOR_BUTTON_CHECK(obj) EINA_FALSE;
383    ELM_FILESELECTOR_BUTTON_DATA_GET(obj, sd);
384
385    return sd->inwin_mode;
386 }