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