3 typedef struct _E_Widget_Data E_Widget_Data;
9 Evas_Object *o_preview_table;
10 Evas_Object *o_preview_preview_table;
11 Evas_Object *o_preview_frame;
12 Evas_Object *o_preview_scroll;
13 Evas_Object *o_preview_extra;
14 Evas_Object *o_preview_extra_entry;
15 Evas_Object *o_preview_size;
16 Evas_Object *o_preview_size_entry;
17 Evas_Object *o_preview_owner;
18 Evas_Object *o_preview_owner_entry;
19 Evas_Object *o_preview_perms;
20 Evas_Object *o_preview_perms_entry;
21 Evas_Object *o_preview_time;
22 Evas_Object *o_preview_time_entry;
23 Evas_Object *o_preview_preview;
24 Evas_Object *o_up_button;
25 Evas_Object *o_favorites_frame;
26 Evas_Object *o_favorites_fm;
27 Evas_Object *o_favorites_add;
28 Evas_Object *o_files_frame;
29 Evas_Object *o_files_fm;
31 Evas_Coord preview_w, preview_h;
33 char *preview_extra_text;
34 char *preview_size_text;
35 char *preview_owner_text;
36 char *preview_perms_text;
37 char *preview_time_text;
39 void (*sel_func) (void *data, Evas_Object *obj);
41 void (*chg_func) (void *data, Evas_Object *obj);
46 static void _e_wid_fsel_preview_update(void *data, Evas_Object *obj, void *event_info);
47 static void _e_wid_fsel_preview_file(E_Widget_Data *wd);
48 static char *_e_wid_file_size_get(off_t st_size);
49 static char *_e_wid_file_user_get(uid_t st_uid);
50 static char *_e_wid_file_perms_get(mode_t st_mode, uid_t st_uid, gid_t gid);
51 static char *_e_wid_file_time_get(time_t st_modtime);
52 static void _e_wid_del_hook(Evas_Object *obj);
54 /* local subsystem functions */
56 _e_wid_fsel_button_up(void *data1, void *data2 __UNUSED__)
62 e_fm2_parent_go(wd->o_files_fm);
63 if (wd->o_files_frame)
64 e_widget_scrollframe_child_pos_set(wd->o_files_frame, 0, 0);
65 // e_widget_entry_text_set(wd->o_entry,
66 // e_fm2_real_path_get(wd->o_files_fm));
70 _e_wid_fsel_favorites_add(void *data1, void *data2 __UNUSED__)
73 const char *current_path, *fn;
74 char buf[PATH_MAX], *fname;
81 current_path = e_fm2_real_path_get(wd->o_files_fm);
82 if (!ecore_file_is_dir(current_path)) return;
84 len = e_user_dir_snprintf(buf, sizeof(buf), "fileman/favorites/%s",
85 ecore_file_file_get(current_path));
86 if (len >= sizeof(buf)) return;
87 if (stat(buf, &st) < 0)
88 ret = symlink(current_path, buf);
95 if (len == sizeof(buf)) return;
96 maxlen = sizeof(buf) - len;
99 if (snprintf(buf + len, maxlen, "%d", i) >= maxlen)
103 while (stat(buf, &st) == 0);
104 ret = symlink(current_path, buf);
106 fn = ecore_file_file_get(buf);
107 len = strlen(fn) + 1;
109 memcpy(fname, fn, len);
110 e_user_dir_concat_static(buf, "fileman/favorites/.order");
111 if (ecore_file_exists(buf))
116 fprintf(f, "%s\n", fname);
120 e_fm2_refresh(wd->o_favorites_fm);
124 _e_wid_fsel_favorites_files_changed(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
127 Eina_List *icons, *l;
128 E_Fm2_Icon_Info *ici;
133 if (!wd->o_favorites_fm) return;
134 if (!wd->o_files_fm) return;
135 icons = e_fm2_all_list_get(wd->o_favorites_fm);
137 rp = e_fm2_real_path_get(wd->o_files_fm);
138 p1 = ecore_file_realpath(rp);
140 EINA_LIST_FOREACH(icons, l, ici)
144 p2 = ecore_file_realpath(ici->link);
149 e_fm2_select_set(wd->o_favorites_fm, ici->file, 1);
158 // e_widget_entry_text_set(wd->o_entry, rp);
160 eina_list_free(icons);
164 _e_wid_fsel_favorites_selected(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
168 E_Fm2_Icon_Info *ici;
171 if (!wd->o_favorites_fm) return;
172 if (!wd->o_files_frame) return;
173 selected = e_fm2_selected_list_get(wd->o_favorites_fm);
174 if (!selected) return;
175 ici = eina_list_data_get(selected);
176 if ((ici->link) && (ici->mount))
177 e_fm2_path_set(wd->o_files_fm, ici->link, "/");
178 else if (ici->real_link)
179 e_fm2_path_set(wd->o_files_fm, NULL, ici->real_link);
180 eina_list_free(selected);
181 e_widget_scrollframe_child_pos_set(wd->o_files_frame, 0, 0);
182 // e_widget_entry_text_set(wd->o_entry,
183 // e_fm2_real_path_get(wd->o_files_fm));
187 _e_wid_fsel_files_changed(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
192 if (!wd->o_files_fm) return;
193 if (!e_fm2_has_parent_get(wd->o_files_fm))
196 e_widget_disabled_set(wd->o_up_button, 1);
201 e_widget_disabled_set(wd->o_up_button, 0);
203 if (wd->o_files_frame)
204 e_widget_scrollframe_child_pos_set(wd->o_files_frame, 0, 0);
205 // if ((wd->path) && (stat(wd->path, &st) == 0))
206 // e_widget_entry_text_set(wd->o_entry, ecore_file_file_get(wd->path));
208 if (wd->chg_func) wd->chg_func(wd->chg_data, wd->obj);
212 _e_wid_fsel_files_selection_change(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
216 E_Fm2_Icon_Info *ici;
222 if (!wd->o_files_fm) return;
223 selected = e_fm2_selected_list_get(wd->o_files_fm);
224 if (!selected) return;
225 ici = eina_list_data_get(selected);
227 rp = e_fm2_real_path_get(wd->o_files_fm);
228 if (!strcmp(rp, "/"))
230 snprintf(buf, sizeof(buf), "/%s", ici->file);
234 snprintf(buf, sizeof(buf), "%s/%s",
237 wd->path = strdup(buf);
238 if (stat(wd->path, &st) == 0)
240 if (wd->preview) _e_wid_fsel_preview_file(wd);
241 if (!S_ISDIR(st.st_mode))
242 e_widget_entry_text_set(wd->o_entry, ici->file);
244 // e_widget_entry_text_set(wd->o_entry, wd->path);
246 eina_list_free(selected);
247 if (wd->chg_func) wd->chg_func(wd->chg_data, wd->obj);
251 _e_wid_fsel_files_selected(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
258 if (wd->sel_func) wd->sel_func(wd->sel_data, wd->obj);
262 /* externally accessible functions */
264 e_widget_fsel_add(Evas *evas, const char *dev, const char *path, char *selected, char *filter __UNUSED__,
265 void (*sel_func) (void *data, Evas_Object *obj), void *sel_data,
266 void (*chg_func) (void *data, Evas_Object *obj), void *chg_data,
269 Evas_Object *obj, *o;
271 Evas_Coord mw = 0, mh = 0;
274 obj = e_widget_add(evas);
276 e_widget_del_hook_set(obj, _e_wid_del_hook);
277 wd = calloc(1, sizeof(E_Widget_Data));
278 e_widget_data_set(obj, wd);
281 wd->sel_func = sel_func;
282 wd->sel_data = sel_data;
283 wd->chg_func = chg_func;
284 wd->chg_data = chg_data;
285 wd->preview = preview;
287 o = e_widget_table_add(evas, 0);
289 e_widget_sub_object_add(obj, o);
290 e_widget_resize_object_set(obj, o);
292 o = e_widget_table_add(evas, 0);
294 e_widget_sub_object_add(obj, o);
296 o = e_widget_button_add(evas, _("Add to Favorites"), "bookmark-new",
297 _e_wid_fsel_favorites_add, wd, NULL);
298 wd->o_favorites_add = o;
299 e_widget_sub_object_add(obj, o);
300 e_widget_table_object_append(wd->o_table2, o, 0, 0, 1, 1, 0, 0, 0, 0);
302 o = e_widget_button_add(evas, _("Go up a Directory"), "go-up",
303 _e_wid_fsel_button_up, wd, NULL);
305 e_widget_sub_object_add(obj, o);
306 e_widget_table_object_append(wd->o_table2, o, 1, 0, 1, 1, 0, 0, 1, 0);
310 o = e_widget_frametable_add(evas, _("Preview"), 0);
311 wd->o_preview_frame = o;
312 e_widget_sub_object_add(obj, o);
314 o = e_widget_table_add(evas, 0);
315 wd->o_preview_preview_table = o;
316 e_widget_sub_object_add(obj, o);
318 o = e_widget_table_add(evas, 0);
319 wd->o_preview_table = o;
320 e_widget_sub_object_add(obj, o);
322 o = e_widget_preview_add(evas, 128, 128);
323 wd->o_preview_preview = o;
324 e_widget_sub_object_add(obj, o);
325 evas_object_smart_callback_add(o, "preview_update",
326 _e_wid_fsel_preview_update, wd);
327 e_widget_table_object_append(wd->o_preview_preview_table,
328 wd->o_preview_preview,
329 0, 0, 1, 1, 0, 0, 1, 1);
331 o = e_widget_label_add(evas, _("Resolution:"));
332 wd->o_preview_extra = o;
333 e_widget_sub_object_add(obj, o);
334 e_widget_table_object_append(wd->o_preview_table,
336 0, 0, 1, 1, 1, 1, 1, 1);
338 o = e_widget_entry_add(evas, &(wd->preview_extra_text), NULL, NULL, NULL);
339 e_widget_entry_readonly_set(o, 1);
340 wd->o_preview_extra_entry = o;
341 e_widget_sub_object_add(obj, o);
342 e_widget_size_min_set(o, 100, -1);
343 e_widget_table_object_append(wd->o_preview_table,
344 wd->o_preview_extra_entry,
345 1, 0, 1, 1, 1, 1, 1, 1);
347 o = e_widget_label_add(evas, _("Size:"));
348 wd->o_preview_size = o;
349 e_widget_sub_object_add(obj, o);
350 e_widget_table_object_append(wd->o_preview_table,
352 0, 1, 1, 1, 1, 1, 1, 1);
354 o = e_widget_entry_add(evas, &(wd->preview_size_text), NULL, NULL, NULL);
355 e_widget_entry_readonly_set(o, 1);
356 wd->o_preview_size_entry = o;
357 e_widget_sub_object_add(obj, o);
358 e_widget_size_min_set(o, 100, -1);
359 e_widget_table_object_append(wd->o_preview_table,
360 wd->o_preview_size_entry,
361 1, 1, 1, 1, 1, 1, 1, 1);
363 o = e_widget_label_add(evas, _("Owner:"));
364 wd->o_preview_owner = o;
365 e_widget_sub_object_add(obj, o);
366 e_widget_table_object_append(wd->o_preview_table,
368 0, 2, 1, 1, 1, 1, 1, 1);
370 o = e_widget_entry_add(evas, &(wd->preview_owner_text), NULL, NULL, NULL);
371 e_widget_entry_readonly_set(o, 1);
372 wd->o_preview_owner_entry = o;
373 e_widget_sub_object_add(obj, o);
374 e_widget_size_min_set(o, 100, -1);
375 e_widget_table_object_append(wd->o_preview_table,
376 wd->o_preview_owner_entry,
377 1, 2, 1, 1, 1, 1, 1, 1);
379 o = e_widget_label_add(evas, _("Permissions:"));
380 wd->o_preview_perms = o;
381 e_widget_sub_object_add(obj, o);
382 e_widget_table_object_append(wd->o_preview_table,
384 0, 3, 1, 1, 1, 1, 1, 1);
386 o = e_widget_entry_add(evas, &(wd->preview_perms_text), NULL, NULL, NULL);
387 e_widget_entry_readonly_set(o, 1);
388 wd->o_preview_perms_entry = o;
389 e_widget_sub_object_add(obj, o);
390 e_widget_size_min_set(o, 100, -1);
391 e_widget_table_object_append(wd->o_preview_table,
392 wd->o_preview_perms_entry,
393 1, 3, 1, 1, 1, 1, 1, 1);
395 o = e_widget_label_add(evas, _("Modified:"));
396 wd->o_preview_time = o;
397 e_widget_sub_object_add(obj, o);
398 e_widget_table_object_append(wd->o_preview_table,
400 0, 4, 1, 1, 1, 1, 1, 1);
402 o = e_widget_entry_add(evas, &(wd->preview_time_text), NULL, NULL, NULL);
403 e_widget_entry_readonly_set(o, 1);
404 wd->o_preview_time_entry = o;
405 e_widget_sub_object_add(obj, o);
406 e_widget_size_min_set(o, 100, -1);
407 e_widget_table_object_append(wd->o_preview_table,
408 wd->o_preview_time_entry,
409 1, 4, 1, 1, 1, 1, 1, 1);
413 wd->o_favorites_fm = o;
414 e_widget_sub_object_add(obj, o);
415 memset(&fmc, 0, sizeof(E_Fm2_Config));
416 fmc.view.mode = E_FM2_VIEW_MODE_LIST;
417 fmc.view.open_dirs_in_place = 1;
418 fmc.view.selector = 1;
419 fmc.view.single_click = 1;
420 fmc.view.no_subdir_jump = 1;
421 fmc.view.no_subdir_drop = 1;
422 fmc.view.link_drop = 1;
423 fmc.icon.list.w = 24;
424 fmc.icon.list.h = 24;
425 fmc.icon.fixed.w = 1;
426 fmc.icon.fixed.h = 1;
427 fmc.icon.extension.show = 0;
428 fmc.icon.key_hint = NULL;
429 fmc.list.sort.no_case = 1;
430 fmc.list.sort.dirs.first = 0;
431 fmc.list.sort.dirs.last = 0;
432 fmc.selection.single = 1;
433 fmc.selection.windows_modifiers = 0;
434 e_fm2_config_set(o, &fmc);
435 evas_object_smart_callback_add(o, "changed",
436 _e_wid_fsel_favorites_files_changed, wd);
437 evas_object_smart_callback_add(o, "selected",
438 _e_wid_fsel_favorites_selected, wd);
439 e_fm2_path_set(o, "favorites", "/");
441 o = e_widget_scrollframe_pan_add(evas, wd->o_favorites_fm,
445 e_fm2_pan_child_size_get);
446 evas_object_propagate_events_set(wd->o_favorites_fm, 0);
447 e_widget_scrollframe_focus_object_set(o, wd->o_favorites_fm);
449 wd->o_favorites_frame = o;
450 e_widget_sub_object_add(obj, o);
451 e_widget_size_min_set(o, 128, 128);
452 e_widget_table_object_append(wd->o_table2, o, 0, 1, 1, 1, 1, 1, 0, 1);
456 e_widget_sub_object_add(obj, o);
457 memset(&fmc, 0, sizeof(E_Fm2_Config));
458 fmc.view.mode = E_FM2_VIEW_MODE_LIST;
459 fmc.view.open_dirs_in_place = 1;
460 fmc.view.selector = 1;
461 fmc.view.single_click = 0;
462 fmc.view.no_subdir_jump = 0;
463 fmc.icon.list.w = 24;
464 fmc.icon.list.h = 24;
465 fmc.icon.fixed.w = 1;
466 fmc.icon.fixed.h = 1;
467 fmc.icon.extension.show = 1;
468 fmc.icon.key_hint = NULL;
469 fmc.list.sort.no_case = 1;
470 fmc.list.sort.dirs.first = 1;
471 fmc.list.sort.dirs.last = 0;
472 fmc.selection.single = 1;
473 fmc.selection.windows_modifiers = 0;
474 e_fm2_config_set(o, &fmc);
475 evas_object_smart_callback_add(o, "dir_changed",
476 _e_wid_fsel_files_changed, wd);
477 evas_object_smart_callback_add(o, "selection_change",
478 _e_wid_fsel_files_selection_change, wd);
479 evas_object_smart_callback_add(o, "selected",
480 _e_wid_fsel_files_selected, wd);
481 e_fm2_path_set(o, dev, path);
483 o = e_widget_scrollframe_pan_add(evas, wd->o_files_fm,
487 e_fm2_pan_child_size_get);
488 evas_object_propagate_events_set(wd->o_files_fm, 0);
489 e_widget_scrollframe_focus_object_set(o, wd->o_files_fm);
491 wd->o_files_frame = o;
492 e_widget_sub_object_add(obj, o);
493 e_widget_size_min_set(o, 128, 128);
494 e_widget_table_object_append(wd->o_table2, o, 1, 1, 1, 1, 1, 1, 1, 1);
496 o = e_widget_entry_add(evas, &(wd->entry_text), NULL, NULL, NULL);
498 e_widget_sub_object_add(obj, o);
499 if (selected) e_widget_entry_text_set(o, selected);
503 e_widget_frametable_object_append(wd->o_preview_frame,
504 wd->o_preview_preview_table,
505 0, 0, 1, 1, 0, 0, 1, 1);
506 e_widget_frametable_object_append(wd->o_preview_frame,
508 0, 1, 1, 1, 0, 0, 0, 0);
509 e_widget_table_object_append(wd->o_table2,
511 2, 1, 1, 1, 0, 1, 0, 1);
514 e_widget_table_object_append(wd->o_table, wd->o_table2,
515 0, 0, 1, 1, 1, 1, 1, 1);
516 e_widget_table_object_append(wd->o_table, wd->o_entry,
517 0, 1, 1, 1, 1, 0, 1, 0);
519 e_widget_size_min_get(wd->o_table, &mw, &mh);
520 e_widget_size_min_set(obj, mw, mh);
522 evas_object_show(wd->o_favorites_add);
523 evas_object_show(wd->o_up_button);
524 evas_object_show(wd->o_favorites_frame);
525 evas_object_show(wd->o_favorites_fm);
526 evas_object_show(wd->o_files_frame);
527 evas_object_show(wd->o_files_fm);
528 evas_object_show(wd->o_entry);
531 evas_object_show(wd->o_preview_preview);
532 evas_object_show(wd->o_preview_preview_table);
533 evas_object_show(wd->o_preview_extra);
534 evas_object_show(wd->o_preview_extra_entry);
535 evas_object_show(wd->o_preview_size);
536 evas_object_show(wd->o_preview_size_entry);
537 evas_object_show(wd->o_preview_owner);
538 evas_object_show(wd->o_preview_owner_entry);
539 evas_object_show(wd->o_preview_perms);
540 evas_object_show(wd->o_preview_perms_entry);
541 evas_object_show(wd->o_preview_time);
542 evas_object_show(wd->o_preview_time_entry);
543 evas_object_show(wd->o_preview_table);
544 evas_object_show(wd->o_preview_frame);
546 evas_object_show(wd->o_table2);
547 evas_object_show(wd->o_table);
552 e_widget_fsel_path_get(Evas_Object *obj, const char **dev, const char **path)
557 wd = e_widget_data_get(obj);
558 e_fm2_path_get(wd->o_files_fm, dev, path);
562 e_widget_fsel_selection_path_get(Evas_Object *obj)
568 if (!obj) return NULL;
569 wd = e_widget_data_get(obj);
571 s = e_widget_entry_text_get(wd->o_entry);
572 dir = e_fm2_real_path_get(wd->o_files_fm);
575 snprintf(buf, sizeof(buf), "%s/%s", dir, s);
576 wd->path = strdup(buf);
580 wd->path = strdup(dir);
586 e_widget_fsel_window_object_set(Evas_Object *obj, E_Object *eobj)
591 wd = e_widget_data_get(obj);
592 e_fm2_window_object_set(wd->o_favorites_fm, eobj);
593 e_fm2_window_object_set(wd->o_files_fm, eobj);
597 _e_wid_fsel_preview_update(void *data, Evas_Object *obj, void *event_info __UNUSED__)
605 o = evas_object_image_add(evas_object_evas_get(obj));
606 evas_object_image_file_set(o, wd->path, NULL);
607 evas_object_image_size_get(o, &iw, &ih);
609 if ((iw > 0) && (ih > 0))
611 snprintf(buf, sizeof(buf), "%ix%i", iw, ih);
612 e_widget_entry_text_set(wd->o_preview_extra_entry, buf);
614 e_widget_table_object_repack(wd->o_preview_preview_table,
615 wd->o_preview_preview,
616 0, 0, 1, 1, 0, 0, 1, 1);
620 _e_wid_fsel_preview_file(E_Widget_Data *wd)
622 char *size, *owner, *perms, *mtime;
625 if (stat(wd->path, &st) < 0) return;
627 size = _e_wid_file_size_get(st.st_size);
628 owner = _e_wid_file_user_get(st.st_uid);
629 perms = _e_wid_file_perms_get(st.st_mode, st.st_uid, st.st_gid);
630 mtime = _e_wid_file_time_get(st.st_mtime);
632 e_widget_preview_thumb_set(wd->o_preview_preview, wd->path,
633 "e/desktop/background", 128, 128);
635 e_widget_table_object_repack(wd->o_preview_preview_table,
636 wd->o_preview_preview,
637 0, 0, 1, 1, 0, 0, 1, 1);
639 e_widget_entry_text_set(wd->o_preview_extra_entry, "");
640 e_widget_entry_text_set(wd->o_preview_size_entry, size);
641 e_widget_entry_text_set(wd->o_preview_owner_entry, owner);
642 e_widget_entry_text_set(wd->o_preview_perms_entry, perms);
643 e_widget_entry_text_set(wd->o_preview_time_entry, mtime);
652 _e_wid_file_size_get(off_t st_size)
654 return e_util_size_string_get(st_size);
658 _e_wid_file_user_get(uid_t st_uid)
663 if (getuid() == st_uid)
664 snprintf(name, sizeof(name), _("You"));
667 pwd = getpwuid(st_uid);
669 snprintf(name, sizeof(name), "%s", pwd->pw_name);
671 snprintf(name, sizeof(name), "%-8d", (int)st_uid);
677 _e_wid_file_perms_get(mode_t st_mode, uid_t st_uid, gid_t st_gid)
690 if (getuid() == st_uid)
692 if (getgid() == st_gid)
695 if ((S_IRUSR & st_mode) == S_IRUSR)
697 if ((S_IWUSR & st_mode) == S_IWUSR)
700 if ((S_IRGRP & st_mode) == S_IRGRP)
702 if ((S_IWGRP & st_mode) == S_IWGRP)
705 if ((S_IROTH & st_mode) == S_IROTH)
707 if ((S_IWOTH & st_mode) == S_IWOTH)
712 if ((!user_read) && (!user_write))
713 snprintf(perms, sizeof(perms), _("Protected"));
714 else if ((user_read) && (!user_write))
715 snprintf(perms, sizeof(perms), _("Read Only"));
716 else if ((user_read) && (user_write))
721 if ((!group_read) && (!group_write))
722 snprintf(perms, sizeof(perms), _("Forbidden"));
723 else if ((group_read) && (!group_write))
724 snprintf(perms, sizeof(perms), _("Read Only"));
725 else if ((group_read) && (group_write))
730 if ((!other_read) && (!other_write))
731 snprintf(perms, sizeof(perms), _("Forbidden"));
732 else if ((other_read) && (!other_write))
733 snprintf(perms, sizeof(perms), _("Read Only"));
734 else if ((other_read) && (other_write))
738 return strdup(perms);
740 return strdup(_("Read-Write"));
744 _e_wid_file_time_get(time_t st_modtime)
746 return e_util_file_time_get(st_modtime);
750 _e_wid_del_hook(Evas_Object *obj)
754 wd = e_widget_data_get(obj);
755 E_FREE(wd->entry_text);
756 E_FREE(wd->preview_extra_text);
757 E_FREE(wd->preview_size_text);
758 E_FREE(wd->preview_owner_text);
759 E_FREE(wd->preview_perms_text);
760 E_FREE(wd->preview_time_text);