Tizen 2.1 release
[platform/core/uifw/e17.git] / src / bin / e_fm_prop.c
1 #include "e.h"
2
3 /* FIXME:
4  *
5  * basic -
6  * + show file
7  * + show size
8  * + show last access date
9  * + show modified date
10  * + show mimetype
11  * + show permissions (others read, others write)
12  * + show preview
13  * + show owner
14  * + show icon
15  * * show symlink/fifo/socket/etc. status
16  * + show broken link status
17  * + change icon for mime type
18  * * change icon for just this file
19  * + change permissions
20  *
21  * advanced (extra) -
22  * * show change date
23  * * show comment
24  * * show generic
25  * * show mount status
26  * * show setuid bit
27  * + show link destination (if symlink or link)
28  * * show group
29  * * change link destination
30  * * change app to open THIS file with (or dir)
31  *
32  */
33
34 /* PROTOTYPES - same all the time */
35
36 static void        *_create_data(E_Config_Dialog *cfd);
37 static void         _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
38 static int          _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
39 static Evas_Object *_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata);
40 #if 0
41 static int          _advanced_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
42 static Evas_Object *_advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata);
43 #endif
44
45 static void         _cb_icon_sel(void *data, void *data2);
46 static void         _cb_type(void *data, Evas_Object *obj, void *event_info);
47 static void         _cb_preview_update(void *data, Evas_Object *obj, void *event_info);
48 static void         _cb_fsel_sel(void *data, Evas_Object *obj);
49 static void         _cb_fsel_ok(void *data, E_Dialog *dia);
50 static void         _cb_fsel_cancel(void *data, E_Dialog *dia);
51
52 /* Actual config data we will be playing with while the dialog is active */
53 struct _E_Config_Dialog_Data
54 {
55    E_Fm2_Icon      *ic;
56    E_Fm2_Icon_Info *fi;
57    struct
58    {
59       Evas_Object *icon_wid;
60       Evas_Object *preview;
61       Evas_Object *preview_table;
62       Evas_Object *fsel_wid;
63       E_Dialog    *fsel;
64    } gui;
65    /*- BASIC -*/
66    char            *file;
67    char            *location;
68    char            *size;
69    char            *mod_date;
70    char            *acc_date;
71    char            *pms_date;
72    char            *mime;
73    char            *owner;
74    char            *link;
75    char            *plink;
76    char            *blocks;
77    int              owner_read;
78    int              owner_write;
79    int              owner_exec;
80    int              others_read;
81    int              others_write;
82    int              others_exec;
83    int              group_read;
84    int              group_write;
85    int              group_exec;
86    int              picon_type;
87    int              picon_mime;
88    int              picon_changed;
89    int              icon_type;
90    int              icon_mime;
91    char            *icon;
92    /*- ADVANCED -*/
93 };
94
95 /* a nice easy setup function that does the dirty work */
96 EAPI E_Config_Dialog *
97 e_fm_prop_file(E_Container *con, E_Fm2_Icon *ic)
98 {
99    E_Config_Dialog *cfd;
100    E_Config_Dialog_View *v;
101
102    v = E_NEW(E_Config_Dialog_View, 1);
103
104    /* methods */
105    v->create_cfdata = _create_data;
106    v->free_cfdata = _free_data;
107    v->basic.apply_cfdata = _basic_apply_data;
108    v->basic.create_widgets = _basic_create_widgets;
109 #if 0
110    v->advanced.apply_cfdata = _advanced_apply_data;
111    v->advanced.create_widgets = _advanced_create_widgets;
112 #endif
113    /* create config dialog for NULL object/data */
114    cfd = e_config_dialog_new(con,
115                              _("File Properties"),
116                              "E", "_fm_prop",
117                              "enlightenment/file_properties", 0, v, ic);
118    return cfd;
119 }
120
121 /**--CREATE--**/
122 static void
123 _fill_data(E_Config_Dialog_Data *cfdata, E_Fm2_Icon *ic)
124 {
125    char loc[PATH_MAX];
126    char blks[256];
127    struct passwd *pw;
128
129    cfdata->ic = ic;
130    cfdata->fi = e_fm2_icon_file_info_get(ic);
131    if (cfdata->fi->file) cfdata->file = strdup(cfdata->fi->file);
132    cfdata->size = e_util_size_string_get(cfdata->fi->statinfo.st_size);
133    cfdata->mod_date = e_util_file_time_get(cfdata->fi->statinfo.st_mtime);
134    cfdata->acc_date = e_util_file_time_get(cfdata->fi->statinfo.st_atime);
135    cfdata->pms_date = e_util_file_time_get(cfdata->fi->statinfo.st_ctime);
136    if (cfdata->fi->mime) cfdata->mime = strdup(cfdata->fi->mime);
137
138    snprintf(blks, sizeof(blks), "%lu", (unsigned long)cfdata->fi->statinfo.st_blocks);
139    cfdata->blocks = strdup(blks);
140
141    snprintf(loc, sizeof(loc), "%s", e_fm2_real_path_get(cfdata->fi->fm));
142    cfdata->location = strdup(loc);
143
144    pw = getpwuid(cfdata->fi->statinfo.st_uid);
145    if (pw) cfdata->owner = strdup(pw->pw_name);
146    if (cfdata->fi->link) cfdata->link = strdup(cfdata->fi->link);
147    if (cfdata->fi->link) cfdata->plink = strdup(cfdata->fi->link);
148    if (cfdata->fi->statinfo.st_mode & S_IRUSR) cfdata->owner_read = 1;
149    if (cfdata->fi->statinfo.st_mode & S_IWUSR) cfdata->owner_write = 1;
150    if (cfdata->fi->statinfo.st_mode & S_IEXEC) cfdata->owner_exec = 1;
151    if (cfdata->fi->statinfo.st_mode & S_IROTH) cfdata->others_read = 1;
152    if (cfdata->fi->statinfo.st_mode & S_IWOTH) cfdata->others_write = 1;
153    if (cfdata->fi->statinfo.st_mode & S_IXOTH) cfdata->others_exec = 1;
154    if (cfdata->fi->statinfo.st_mode & S_IRGRP) cfdata->group_read = 1;
155    if (cfdata->fi->statinfo.st_mode & S_IWGRP) cfdata->group_write = 1;
156    if (cfdata->fi->statinfo.st_mode & S_IXGRP) cfdata->group_exec = 1;
157 }
158
159 static void *
160 _create_data(E_Config_Dialog *cfd)
161 {
162    /* Create cfdata - cfdata is a temporary block of config data that this
163     * dialog will be dealing with while configuring. it will be applied to
164     * the running systems/config in the apply methods
165     */
166    E_Config_Dialog_Data *cfdata;
167
168    cfdata = E_NEW(E_Config_Dialog_Data, 1);
169    _fill_data(cfdata, cfd->data);
170    return cfdata;
171 }
172
173 static void
174 _free_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
175 {
176    if (cfdata->gui.fsel)
177      e_object_del(E_OBJECT(cfdata->gui.fsel));
178    E_FREE(cfdata->file);
179    E_FREE(cfdata->location);
180    E_FREE(cfdata->size);
181    E_FREE(cfdata->blocks);
182    E_FREE(cfdata->mod_date);
183    E_FREE(cfdata->acc_date);
184    E_FREE(cfdata->pms_date);
185    E_FREE(cfdata->mime);
186    E_FREE(cfdata->owner);
187    E_FREE(cfdata->link);
188    E_FREE(cfdata->plink);
189    E_FREE(cfdata->icon);
190    free(cfdata);
191 }
192
193 /**--APPLY--**/
194 static int
195 _basic_apply_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
196 {
197    char buf[PATH_MAX];
198    Eina_Bool fperm = EINA_FALSE;
199
200    snprintf(buf, sizeof(buf), "%s/%s",
201             cfdata->location, cfdata->fi->file);
202    if (((cfdata->fi->statinfo.st_mode & S_IRUSR) && (cfdata->owner_read)) ||
203        ((!(cfdata->fi->statinfo.st_mode & S_IRUSR)) && (!cfdata->owner_read)))
204      fperm = EINA_TRUE;
205    if (((cfdata->fi->statinfo.st_mode & S_IWUSR) && (cfdata->owner_write)) ||
206        ((!(cfdata->fi->statinfo.st_mode & S_IWUSR)) && (!cfdata->owner_write)))
207      fperm = EINA_TRUE;
208    if (((cfdata->fi->statinfo.st_mode & S_IROTH) && (cfdata->others_read)) ||
209        ((!(cfdata->fi->statinfo.st_mode & S_IROTH)) && (!cfdata->others_read)))
210      fperm = EINA_TRUE;
211    if (((cfdata->fi->statinfo.st_mode & S_IEXEC) && (cfdata->owner_exec)) ||
212        ((!(cfdata->fi->statinfo.st_mode & S_IEXEC)) && (!cfdata->owner_exec)))
213      fperm = EINA_TRUE;
214    if (((cfdata->fi->statinfo.st_mode & S_IWOTH) && (cfdata->others_write)) ||
215        ((!(cfdata->fi->statinfo.st_mode & S_IWOTH)) && (!cfdata->others_write)))
216      fperm = EINA_TRUE;
217    if (((cfdata->fi->statinfo.st_mode & S_IXOTH) && (cfdata->others_exec)) ||
218        ((!(cfdata->fi->statinfo.st_mode & S_IXOTH)) && (!cfdata->others_exec)))
219      fperm = EINA_TRUE;
220    if (((cfdata->fi->statinfo.st_mode & S_IRGRP) && (cfdata->group_read)) ||
221        ((!(cfdata->fi->statinfo.st_mode & S_IRGRP)) && (!cfdata->group_read)))
222      fperm = EINA_TRUE;
223    if (((cfdata->fi->statinfo.st_mode & S_IWGRP) && (cfdata->group_write)) ||
224        ((!(cfdata->fi->statinfo.st_mode & S_IWGRP)) && (!cfdata->group_write)))
225      fperm = EINA_TRUE;
226    if (((cfdata->fi->statinfo.st_mode & S_IXGRP) && (cfdata->group_exec)) ||
227        ((!(cfdata->fi->statinfo.st_mode & S_IXGRP)) && (!cfdata->group_exec)))
228      fperm = EINA_TRUE;
229    if (fperm == EINA_TRUE)
230      {
231         mode_t pmode;
232
233         pmode = cfdata->fi->statinfo.st_mode;
234         if (cfdata->owner_read) cfdata->fi->statinfo.st_mode |= S_IRUSR;
235         else cfdata->fi->statinfo.st_mode &= ~S_IRUSR;
236         if (cfdata->owner_write) cfdata->fi->statinfo.st_mode |= S_IWUSR;
237         else cfdata->fi->statinfo.st_mode &= ~S_IWUSR;
238         if (cfdata->owner_exec) cfdata->fi->statinfo.st_mode |= S_IEXEC;
239         else cfdata->fi->statinfo.st_mode &= ~S_IEXEC;
240         if (cfdata->others_read) cfdata->fi->statinfo.st_mode |= S_IROTH;
241         else cfdata->fi->statinfo.st_mode &= ~S_IROTH;
242         if (cfdata->others_write) cfdata->fi->statinfo.st_mode |= S_IWOTH;
243         else cfdata->fi->statinfo.st_mode &= ~S_IWOTH;
244         if (cfdata->others_exec) cfdata->fi->statinfo.st_mode |= S_IXOTH;
245         else cfdata->fi->statinfo.st_mode &= ~S_IXOTH;
246         if (cfdata->group_read) cfdata->fi->statinfo.st_mode |= S_IRGRP;
247         else cfdata->fi->statinfo.st_mode &= ~S_IRGRP;
248         if (cfdata->group_write) cfdata->fi->statinfo.st_mode |= S_IWGRP;
249         else cfdata->fi->statinfo.st_mode &= ~S_IWGRP;
250         if (cfdata->group_exec) cfdata->fi->statinfo.st_mode |= S_IXGRP;
251         else cfdata->fi->statinfo.st_mode &= ~S_IXGRP;
252         if (chmod(buf, cfdata->fi->statinfo.st_mode) == -1)
253           {
254              e_util_dialog_show(_("Error"),
255                                 _("Cannot change permissions: %s"),
256                                 strerror(errno));
257
258              cfdata->fi->statinfo.st_mode = pmode;
259           }
260      }
261    if ((cfdata->link) && ((cfdata->fi->real_link) || (cfdata->fi->broken_link)))
262      {
263         if ((cfdata->link[0]) && (strcmp(cfdata->plink, cfdata->link)))
264           {
265              ecore_file_unlink(buf);
266              ecore_file_symlink(cfdata->link, buf);
267              free(cfdata->plink);
268              cfdata->plink = strdup(cfdata->link);
269           }
270      }
271    if ((cfdata->picon_type != cfdata->icon_type) ||
272        (cfdata->picon_mime != cfdata->icon_mime) ||
273        (cfdata->picon_changed))
274      {
275         if ((cfdata->icon_mime) && (cfdata->mime)) /* modify mimetype */
276           {
277              Eina_List *l;
278              E_Config_Mime_Icon *mi = NULL;
279              Eina_Bool found = EINA_FALSE;
280
281              if (!cfdata->picon_mime) /* remove previous custom icon info */
282                e_fm2_custom_file_del(buf);
283              EINA_LIST_FOREACH(e_config->mime_icons, l, mi)
284                {
285                   if (!mi) continue;
286                   if (strcmp(mi->mime, cfdata->mime)) continue;
287                   if (mi->icon)
288                     {
289                        eina_stringshare_del(mi->icon);
290                        mi->icon = NULL;
291                     }
292                   found = EINA_TRUE;
293                   break;
294                }
295              if ((found == EINA_FALSE) && (cfdata->icon_type != 0))
296                {
297                   mi = E_NEW(E_Config_Mime_Icon, 1);
298                   mi->mime = eina_stringshare_add(cfdata->mime);
299                   e_config->mime_icons = eina_list_append(e_config->mime_icons, mi);
300                }
301              /* FIXME: modify mime info */
302              if (cfdata->icon_type == 0)
303                {
304                   if (found == EINA_TRUE)
305                     {
306                        e_config->mime_icons = eina_list_remove(e_config->mime_icons, mi);
307                        if (mi->mime) eina_stringshare_del(mi->mime);
308                        if (mi->icon) eina_stringshare_del(mi->icon);
309                        free(mi);
310                     }
311                }
312              else if (cfdata->icon_type == 1)
313                {
314                   mi->icon = eina_stringshare_add("THUMB");
315                }
316              else if (cfdata->icon_type == 2)
317                {
318                   mi->icon = eina_stringshare_add(cfdata->icon);
319                }
320              e_config_save_queue();
321              e_fm_mime_icon_cache_flush();
322           }
323         else /* custom for this file */
324           {
325              E_Fm2_Custom_File *cf, cf0;
326
327              cf = e_fm2_custom_file_get(buf);
328              if (cf)
329                {
330                   cf->icon.type = cfdata->icon_type;
331                   if (cf->icon.icon)
332                     eina_stringshare_del(cf->icon.icon);
333                   cf->icon.icon = NULL;
334                   if (cfdata->icon_type == 2)
335                     cf->icon.icon = eina_stringshare_add(cfdata->icon);
336                   if (cfdata->icon_type == 0)
337                     cf->icon.valid = 0;
338                   else
339                     cf->icon.valid = 1;
340                }
341              else
342                {
343                   memset(&cf0, 0, sizeof(E_Fm2_Custom_File));
344                   cf = &cf0;
345                   cf->icon.type = cfdata->icon_type;
346                   if (cfdata->icon_type == 2)
347                     cf->icon.icon = cfdata->icon;
348                   if (cfdata->icon_type == 0)
349                     cf->icon.valid = 0;
350                   else
351                     cf->icon.valid = 1;
352                }
353              e_fm2_custom_file_set(buf, cf);
354              e_fm2_custom_file_flush();
355           }
356         cfdata->picon_type = cfdata->icon_type;
357         cfdata->picon_mime = cfdata->icon_mime;
358
359         e_fm2_all_icons_update();
360      }
361
362    return 1; /* Apply was OK */
363 }
364
365 #if 0
366 static int
367 _advanced_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
368 {
369    return 1; /* Apply was OK */
370 }
371
372 #endif
373
374 /**--GUI--**/
375 static Evas_Object *
376 _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata)
377 {
378    /* generate the core widget layout for a basic dialog */
379    Evas_Object *o, *ot, *ob, *of, *oi;
380    E_Radio_Group *rg;
381    char buf[PATH_MAX];
382    const char *itype = NULL;
383
384    snprintf(buf, sizeof(buf), "%s/%s",
385             cfdata->location, cfdata->fi->file);
386    o = e_widget_table_add(evas, 0);
387
388    ot = e_widget_table_add(evas, 0);
389
390    ob = e_widget_label_add(evas, _("Name:"));
391    e_widget_table_object_append(ot, ob, 0, 0, 1, 1, 1, 0, 1, 0);
392    ob = e_widget_entry_add(evas, &(cfdata->file), NULL, NULL, NULL);
393    e_widget_size_min_set(ob, 140, -1);
394    e_widget_entry_readonly_set(ob, 1);
395    e_widget_table_object_append(ot, ob, 1, 0, 1, 1, 1, 0, 1, 0);
396
397    ob = e_widget_label_add(evas, _("Location:"));
398    e_widget_table_object_append(ot, ob, 0, 1, 1, 1, 1, 0, 1, 0);
399    ob = e_widget_entry_add(evas, &(cfdata->location), NULL, NULL, NULL);
400    e_widget_size_min_set(ob, 140, -1);
401    e_widget_entry_readonly_set(ob, 1);
402    e_widget_table_object_append(ot, ob, 1, 1, 1, 1, 1, 0, 1, 0);
403
404    ob = e_widget_label_add(evas, _("Size:"));
405    e_widget_table_object_append(ot, ob, 0, 2, 1, 1, 1, 0, 1, 0);
406    ob = e_widget_entry_add(evas, &(cfdata->size), NULL, NULL, NULL);
407    e_widget_size_min_set(ob, 140, -1);
408    e_widget_entry_readonly_set(ob, 1);
409    e_widget_table_object_append(ot, ob, 1, 2, 1, 1, 1, 0, 1, 0);
410
411    ob = e_widget_label_add(evas, _("Occuped blocks on disk:"));
412    e_widget_table_object_append(ot, ob, 0, 3, 1, 1, 1, 0, 1, 0);
413    ob = e_widget_entry_add(evas, &(cfdata->blocks), NULL, NULL, NULL);
414    e_widget_size_min_set(ob, 140, -1);
415    e_widget_entry_readonly_set(ob, 1);
416    e_widget_table_object_append(ot, ob, 1, 3, 1, 1, 1, 0, 1, 0);
417
418    ob = e_widget_label_add(evas, _("Last Accessed:"));
419    e_widget_table_object_append(ot, ob, 0, 4, 1, 1, 1, 0, 1, 0);
420    ob = e_widget_entry_add(evas, &(cfdata->acc_date), NULL, NULL, NULL);
421    e_widget_size_min_set(ob, 140, -1);
422    e_widget_entry_readonly_set(ob, 1);
423    e_widget_table_object_append(ot, ob, 1, 4, 1, 1, 1, 0, 1, 0);
424
425    ob = e_widget_label_add(evas, _("Last Modified:"));
426    e_widget_table_object_append(ot, ob, 0, 5, 1, 1, 1, 0, 1, 0);
427    ob = e_widget_entry_add(evas, &(cfdata->mod_date), NULL, NULL, NULL);
428    e_widget_size_min_set(ob, 140, -1);
429    e_widget_entry_readonly_set(ob, 1);
430    e_widget_table_object_append(ot, ob, 1, 5, 1, 1, 1, 0, 1, 0);
431
432    ob = e_widget_label_add(evas, _("Last Modified Permissions:"));
433    e_widget_table_object_append(ot, ob, 0, 6, 1, 1, 1, 0, 1, 0);
434    ob = e_widget_entry_add(evas, &(cfdata->pms_date), NULL, NULL, NULL);
435    e_widget_size_min_set(ob, 140, -1);
436    e_widget_entry_readonly_set(ob, 1);
437    e_widget_table_object_append(ot, ob, 1, 6, 1, 1, 1, 0, 1, 0);
438
439    ob = e_widget_label_add(evas, _("File Type:"));
440    e_widget_table_object_append(ot, ob, 0, 7, 1, 1, 1, 0, 1, 0);
441    ob = e_widget_entry_add(evas, &(cfdata->mime), NULL, NULL, NULL);
442    e_widget_size_min_set(ob, 140, -1);
443    e_widget_entry_readonly_set(ob, 1);
444    e_widget_table_object_append(ot, ob, 1, 7, 1, 1, 1, 0, 1, 0);
445
446    of = e_widget_frametable_add(evas, _("Permissions"), 0);
447    ob = e_widget_entry_add(evas, &(cfdata->owner), NULL, NULL, NULL);
448
449    e_widget_entry_readonly_set(ob, 1);
450    e_widget_frametable_object_append(of, ob, 0, 0, 1, 1, 1, 1, 1, 1);
451    ob = e_widget_check_add(evas, _("read"), &(cfdata->owner_read));
452    e_widget_frametable_object_append(of, ob, 0, 1, 1, 1, 1, 1, 1, 1);
453    ob = e_widget_check_add(evas, _("write"), &(cfdata->owner_write));
454    e_widget_frametable_object_append(of, ob, 0, 2, 1, 1, 1, 1, 1, 1);
455    ob = e_widget_check_add(evas, _("execute"), &(cfdata->owner_exec));
456    e_widget_frametable_object_append(of, ob, 0, 3, 1, 1, 1, 1, 1, 1);
457
458    ob = e_widget_label_add(evas, _("Group:"));
459    e_widget_frametable_object_append(of, ob, 1, 0, 1, 1, 1, 1, 1, 1);
460    ob = e_widget_check_add(evas, _("read"), &(cfdata->group_read));
461    e_widget_frametable_object_append(of, ob, 1, 1, 1, 1, 1, 1, 1, 1);
462    ob = e_widget_check_add(evas, _("write"), &(cfdata->group_write));
463    e_widget_frametable_object_append(of, ob, 1, 2, 1, 1, 1, 1, 1, 1);
464    ob = e_widget_check_add(evas, _("execute"), &(cfdata->group_exec));
465    e_widget_frametable_object_append(of, ob, 1, 3, 1, 1, 1, 1, 1, 1);
466
467    ob = e_widget_label_add(evas, _("Others:"));
468    e_widget_frametable_object_append(of, ob, 2, 0, 1, 1, 1, 1, 1, 1);
469    ob = e_widget_check_add(evas, _("read"), &(cfdata->others_read));
470    e_widget_frametable_object_append(of, ob, 2, 1, 1, 1, 1, 1, 1, 1);
471    ob = e_widget_check_add(evas, _("write"), &(cfdata->others_write));
472    e_widget_frametable_object_append(of, ob, 2, 2, 1, 1, 1, 1, 1, 1);
473    ob = e_widget_check_add(evas, _("execute"), &(cfdata->others_exec));
474    e_widget_frametable_object_append(of, ob, 2, 3, 1, 1, 1, 1, 1, 1);
475
476    e_widget_table_object_append(ot, of, 0, 8, 2, 1, 1, 0, 1, 0);
477
478    e_widget_table_object_append(o, ot, 0, 0, 1, 1, 1, 1, 1, 1);
479
480    of = e_widget_frametable_add(evas, _("Preview"), 0);
481
482    ot = e_widget_table_add(evas, 0);
483    ob = e_widget_preview_add(evas, 128, 128);
484    cfdata->gui.preview = ob;
485    cfdata->gui.preview_table = ot;
486    evas_object_smart_callback_add(ob, "preview_update",
487                                   _cb_preview_update, cfdata);
488    e_widget_table_object_append(ot, ob, 0, 0, 1, 1, 0, 0, 1, 1);
489    e_widget_preview_thumb_set(ob, buf,
490                               "e/desktop/background", 128, 128);
491    e_widget_frametable_object_append(of, ot, 0, 0, 1, 1, 1, 1, 1, 1);
492
493    e_widget_table_object_append(o, of, 1, 0, 1, 1, 1, 1, 1, 1);
494
495    ot = e_widget_frametable_add(evas, _("Icon"), 0);
496
497    ob = e_widget_button_add(evas, "", NULL, _cb_icon_sel, cfdata, cfd);
498    cfdata->gui.icon_wid = ob;
499    oi = e_fm2_icon_get(evas,
500                        cfdata->ic,
501                        NULL, NULL, 0, &itype);
502    e_widget_button_icon_set(ob, oi);
503    e_widget_frametable_object_append(ot, ob, 0, 0, 1, 3, 1, 1, 1, 1);
504
505    if (itype)
506      {
507         if ((!strcmp(itype, "THEME_ICON")) ||
508             (!strcmp(itype, "DESKTOP")) ||
509             (!strcmp(itype, "FILE_TYPE")))
510           {
511              e_widget_disabled_set(ob, 1);
512              cfdata->icon_type = 0;
513           }
514         else if (!strcmp(itype, "THUMB"))
515           {
516              cfdata->icon_type = 1;
517              e_widget_disabled_set(ob, 1);
518           }
519         else if (!strcmp(itype, "CUSTOM"))
520           cfdata->icon_type = 2;
521      }
522    else
523      cfdata->icon_type = 0;
524    cfdata->picon_type = cfdata->icon_type;
525
526    rg = e_widget_radio_group_new(&cfdata->icon_type);
527    ob = e_widget_radio_add(evas, _("Default"), 0, rg);
528    evas_object_smart_callback_add(ob, "changed", _cb_type, cfdata);
529    e_widget_frametable_object_append(ot, ob, 1, 0, 1, 1, 1, 1, 1, 1);
530    ob = e_widget_radio_add(evas, _("Thumbnail"), 1, rg);
531    evas_object_smart_callback_add(ob, "changed", _cb_type, cfdata);
532    e_widget_frametable_object_append(ot, ob, 1, 1, 1, 1, 1, 1, 1, 1);
533    ob = e_widget_radio_add(evas, _("Custom"), 2, rg);
534    evas_object_smart_callback_add(ob, "changed", _cb_type, cfdata);
535    e_widget_frametable_object_append(ot, ob, 1, 2, 1, 1, 1, 1, 1, 1);
536
537    cfdata->icon_mime = 1;
538    if ((cfdata->fi->icon) || ((itype) && (!strcmp(itype, "DESKTOP"))))
539      cfdata->icon_mime = 0;
540    cfdata->picon_mime = cfdata->icon_mime;
541    if (cfdata->mime)
542      {
543         ob = e_widget_check_add(evas, _("Use this icon for all files of this type"), &(cfdata->icon_mime));
544         e_widget_frametable_object_append(ot, ob, 0, 3, 2, 1, 1, 1, 1, 1);
545      }
546
547    e_widget_table_object_append(o, ot, 0, 1, 1, 1, 1, 1, 1, 1);
548
549    if ((cfdata->link) && ((cfdata->fi->real_link) || (cfdata->fi->broken_link)))
550      {
551         ot = e_widget_frametable_add(evas, _("Link Information"), 0);
552
553         ob = e_widget_entry_add(evas, &(cfdata->link), NULL, NULL, NULL);
554         e_widget_frametable_object_append(ot, ob, 0, 0, 1, 1, 1, 0, 1, 0);
555
556         if (cfdata->fi->broken_link)
557           {
558             ob = e_widget_label_add(evas, _("This link is broken."));
559             e_widget_frametable_object_append(ot, ob, 0, 1, 1, 1, 1, 0, 1, 0);
560           }
561
562         e_widget_table_object_append(o, ot, 1, 1, 2, 1, 1, 1, 1, 1);
563      }
564    return o;
565 }
566
567 #if 0
568 static Evas_Object *
569 _advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata)
570 {
571    /* generate the core widget layout for an advanced dialog */
572    Evas_Object *o;
573
574    o = e_widget_table_add(evas, 0);
575    return o;
576 }
577
578 #endif
579
580 static void
581 _dia_del(void *data)
582 {
583    E_Dialog *dia = data;
584    E_Config_Dialog_Data *cfdata;
585
586    cfdata = dia->data;
587    if (!cfdata) return;
588    cfdata->gui.fsel = NULL;
589    cfdata->gui.fsel_wid = NULL;
590 }
591
592 static void
593 _cb_icon_sel(void *data, void *data2)
594 {
595    E_Config_Dialog_Data *cfdata;
596    E_Config_Dialog *cfd;
597    E_Dialog *dia;
598    Evas_Object *o;
599    Evas_Coord w, h;
600
601    cfdata = data;
602    if (!cfdata) return;
603    if (cfdata->gui.fsel) return;
604
605    cfd = data2;
606    if (!cfd) return;
607
608    dia = e_dialog_new(cfd->con, "E", "_fm2_file_properties_icon_select_dialog");
609    if (!dia) return;
610 //   if (cfdata->type == EDJ)
611 //     e_dialog_title_set(dia, _("Select an Edj File"));
612 //   else if (cfdata->type == IMG)
613    e_dialog_title_set(dia, _("Select an Image"));
614
615    dia->data = cfdata;
616    o = e_widget_fsel_add(dia->win->evas, "~/", "/", NULL, NULL,
617                          _cb_fsel_sel, cfdata, NULL, cfdata, 1);
618
619    cfdata->gui.fsel_wid = o;
620    evas_object_show(o);
621    e_widget_size_min_get(o, &w, &h);
622    e_dialog_content_set(dia, o, w, h);
623
624    e_dialog_button_add(dia, _("OK"), NULL, _cb_fsel_ok, cfdata);
625    e_dialog_button_add(dia, _("Cancel"), NULL, _cb_fsel_cancel, cfdata);
626    e_dialog_resizable_set(dia, 1);
627    e_util_win_auto_resize_fill(dia->win);
628    e_win_centered_set(dia->win, 1);
629    e_dialog_show(dia);
630    e_object_del_attach_func_set(E_OBJECT(dia), _dia_del);
631
632    cfdata->gui.fsel = dia;
633 }
634
635 static void
636 _cb_type(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
637 {
638    E_Config_Dialog_Data *cfdata;
639
640    cfdata = data;
641    if (cfdata->icon_type == 2)
642      e_widget_disabled_set(cfdata->gui.icon_wid, 0);
643    else
644      e_widget_disabled_set(cfdata->gui.icon_wid, 1);
645 }
646
647 static void
648 _cb_preview_update(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
649 {
650    E_Config_Dialog_Data *cfdata;
651
652    cfdata = data;
653    e_widget_table_object_repack(cfdata->gui.preview_table,
654                                 cfdata->gui.preview,
655                                 0, 0, 1, 1, 0, 0, 1, 1);
656 }
657
658 static void
659 _cb_fsel_sel(void *data, Evas_Object *obj __UNUSED__)
660 {
661    E_Config_Dialog_Data *cfdata;
662
663    cfdata = data;
664    if (!cfdata) return;
665 }
666
667 static void
668 _cb_fsel_ok(void *data, E_Dialog *dia)
669 {
670    E_Config_Dialog_Data *cfdata;
671    const char *file, *ext;
672    Evas_Object *icon = NULL;
673
674    cfdata = data;
675    if (!cfdata) return;
676
677    file = e_widget_fsel_selection_path_get(cfdata->gui.fsel_wid);
678    E_FREE(cfdata->icon);
679    if (file) cfdata->icon = strdup(file);
680    _cb_fsel_cancel(data, dia);
681    ext = strrchr(cfdata->icon, '.');
682    if (ext)
683      {
684         if (!strcasecmp(ext, ".edj"))
685           {
686              icon = edje_object_add(evas_object_evas_get(cfdata->gui.icon_wid));
687              edje_object_file_set(icon, cfdata->file, "icon");
688           }
689         else
690           {
691              icon = e_widget_image_add_from_file(evas_object_evas_get(cfdata->gui.icon_wid), cfdata->icon, 48, 48);
692           }
693      }
694    else
695      {
696         icon = e_widget_image_add_from_file(evas_object_evas_get(cfdata->gui.icon_wid), cfdata->icon, 48, 48);
697      }
698    if (icon) e_widget_button_icon_set(cfdata->gui.icon_wid, icon);
699 }
700
701 static void
702 _cb_fsel_cancel(void *data, E_Dialog *dia)
703 {
704    E_Config_Dialog_Data *cfdata;
705
706    cfdata = data;
707    e_object_del(E_OBJECT(dia));
708    cfdata->gui.fsel = NULL;
709 }
710