In case a user sets min-value of the item, the toolbar shouldn't set the min-value...
[framework/uifw/elementary.git] / src / lib / elc_fileselector.c
index d768e27..148c73d 100644 (file)
@@ -79,11 +79,7 @@ typedef enum {
 } Elm_Fileselector_Type;
 
 static Elm_Genlist_Item_Class *list_itc[ELM_FILE_LAST];
-static Elm_Gengrid_Item_Class grid_itc[ELM_FILE_LAST] = {
-       { ELM_GENGRID_ITEM_CLASS_HEADER, "default", { NULL, NULL, NULL, NULL } },
-       { ELM_GENGRID_ITEM_CLASS_HEADER, "default", { NULL, NULL, NULL, NULL } },
-       { ELM_GENGRID_ITEM_CLASS_HEADER, "default", { NULL, NULL, NULL, NULL } },
-};
+static Elm_Gengrid_Item_Class *grid_itc[ELM_FILE_LAST];
 
 static const char *widtype = NULL;
 
@@ -123,13 +119,16 @@ static void
 _del_hook(Evas_Object *obj)
 {
    Widget_Data *wd;
+   int i;
 
    wd = elm_widget_data_get(obj);
    if (!wd) return;
 
-   elm_genlist_item_class_free(list_itc[ELM_DIRECTORY]);
-   elm_genlist_item_class_free(list_itc[ELM_FILE_IMAGE]);
-   elm_genlist_item_class_free(list_itc[ELM_FILE_UNKNOW]);
+   for (i = 0; i < ELM_FILE_LAST; ++i)
+     {
+        elm_genlist_item_class_free(list_itc[i]);
+        elm_gengrid_item_class_free(grid_itc[i]);
+     }
 
 #ifdef HAVE_EIO
    if (wd->current)
@@ -248,9 +247,9 @@ _itc_text_get(void              *data,
                Evas_Object *obj   __UNUSED__,
                const char *source __UNUSED__)
 {
-   return strdup(ecore_file_file_get(data)); /* NOTE this will be
-                                              * free() by the
-                                              * caller */
+   return elm_entry_utf8_to_markup(ecore_file_file_get(data)); /* NOTE this will be
+                                                                * free() by the
+                                                                * caller */
 }
 
 static Evas_Object *
@@ -389,6 +388,8 @@ _sel_do(void *data)
      }
    else /* navigating through folders only or file is not a dir. */
      {
+        char *s;
+        
         if (wd->expand && wd->mode == ELM_FILESELECTOR_LIST)
           _do_anchors(sd->fs, path);
         else if (wd->only_folder)
@@ -398,8 +399,14 @@ _sel_do(void *data)
              _populate(sd->fs, p, NULL);
              eina_stringshare_del(p);
           }
-        elm_object_text_set(wd->filename_entry,
-                                     ecore_file_file_get(path));
+        s = elm_entry_utf8_to_markup(ecore_file_file_get(path));
+        if (s)
+          {
+             elm_object_text_set(wd->filename_entry, s);
+             free(s);
+          }
+        else
+          elm_object_text_set(wd->filename_entry, "");
      }
 
    evas_object_smart_callback_call(sd->fs, SIG_SELECTED, (void *)path);
@@ -520,11 +527,15 @@ _do_anchors(Evas_Object *obj,
             const char  *path)
 {
    Widget_Data *wd = elm_widget_data_get(obj);
-   char **tok, buf[PATH_MAX * 3];
+   char **tok, buf[PATH_MAX * 3], *s;
    int i, j;
+   
    if (!wd) return;
+   s = elm_entry_utf8_to_markup(path);
+   if (!s) return;
    buf[0] = '\0';
-   tok = eina_str_split(path, "/", 0);
+   tok = eina_str_split(s, "/", 0);
+   free(s);
    eina_strlcat(buf, "<a href=/>root</a>", sizeof(buf));
    for (i = 0; tok[i]; i++)
      {
@@ -561,19 +572,19 @@ _filter_cb(void *data __UNUSED__, Eio_File *handler, const Eina_File_Direct_Info
 
    if (info->type == EINA_FILE_DIR)
      {
-        eio_file_associate_direct_add(handler, "type/grid", &grid_itc[ELM_DIRECTORY], NULL);
+        eio_file_associate_direct_add(handler, "type/grid", grid_itc[ELM_DIRECTORY], NULL);
         eio_file_associate_direct_add(handler, "type/list", list_itc[ELM_DIRECTORY], NULL);
      }
    else
      {
         if (evas_object_image_extension_can_load_get(info->path + info->name_start))
           {
-             eio_file_associate_direct_add(handler, "type/grid", &grid_itc[ELM_FILE_IMAGE], NULL);
+             eio_file_associate_direct_add(handler, "type/grid", grid_itc[ELM_FILE_IMAGE], NULL);
              eio_file_associate_direct_add(handler, "type/list", list_itc[ELM_FILE_IMAGE], NULL);
           }
         else
           {
-             eio_file_associate_direct_add(handler, "type/grid", &grid_itc[ELM_FILE_UNKNOW], NULL);
+             eio_file_associate_direct_add(handler, "type/grid", grid_itc[ELM_FILE_UNKNOW], NULL);
              eio_file_associate_direct_add(handler, "type/list", list_itc[ELM_FILE_UNKNOW], NULL);
           }
      }
@@ -589,12 +600,12 @@ _file_grid_cmp(const void *a, const void *b)
    const Elm_Gengrid_Item_Class *ca = elm_gengrid_item_item_class_get(ga);
    const Elm_Gengrid_Item_Class *cb = elm_gengrid_item_item_class_get(gb);
 
-   if (ca == &grid_itc[ELM_DIRECTORY])
+   if (ca == grid_itc[ELM_DIRECTORY])
      {
-        if (cb != &grid_itc[ELM_DIRECTORY])
+        if (cb != grid_itc[ELM_DIRECTORY])
           return -1;
      }
-   else if (cb == &grid_itc[ELM_DIRECTORY])
+   else if (cb == grid_itc[ELM_DIRECTORY])
      {
         return 1;
      }
@@ -660,13 +671,13 @@ _main_cb(void *data, Eio_File *handler, const Eina_File_Direct_Info *info __UNUS
      {
         Eina_Bool is_dir = (eio_file_associate_find(handler, "type/list") == list_itc[ELM_DIRECTORY]);
 
-        elm_genlist_item_direct_sorted_insert(wr->wd->files_list, eio_file_associate_find(handler, "type/list"),
-                                              eina_stringshare_ref(eio_file_associate_find(handler, "filename")),
-                                              wr->parent, wr->wd->expand && is_dir ? ELM_GENLIST_ITEM_SUBITEMS : ELM_GENLIST_ITEM_NONE,
-                                              _file_list_cmp, NULL, NULL);
+        elm_genlist_item_sorted_insert(wr->wd->files_list, eio_file_associate_find(handler, "type/list"),
+                                       eina_stringshare_ref(eio_file_associate_find(handler, "filename")),
+                                       wr->parent, wr->wd->expand && is_dir ? ELM_GENLIST_ITEM_TREE : ELM_GENLIST_ITEM_NONE,
+                                       _file_list_cmp, NULL, NULL);
      }
    else if (wr->wd->mode == ELM_FILESELECTOR_GRID)
-     elm_gengrid_item_direct_sorted_insert(wr->wd->files_grid, eio_file_associate_find(handler, "type/grid"),
+     elm_gengrid_item_sorted_insert(wr->wd->files_grid, eio_file_associate_find(handler, "type/grid"),
                                            eina_stringshare_ref(eio_file_associate_find(handler, "filename")),
                                            _file_grid_cmp, NULL, NULL);
 }
@@ -758,11 +769,11 @@ _populate(Evas_Object      *obj,
           elm_genlist_item_append(wd->files_list, list_itc[ELM_DIRECTORY],
                                   real, /* item data */
                                   parent,
-                                  wd->expand ? ELM_GENLIST_ITEM_SUBITEMS :
+                                  wd->expand ? ELM_GENLIST_ITEM_TREE :
                                   ELM_GENLIST_ITEM_NONE,
                                   NULL, NULL);
         else if (wd->mode == ELM_FILESELECTOR_GRID)
-          elm_gengrid_item_append(wd->files_grid, &grid_itc[ELM_DIRECTORY],
+          elm_gengrid_item_append(wd->files_grid, grid_itc[ELM_DIRECTORY],
                                   real, /* item data */
                                   NULL, NULL);
      }
@@ -778,7 +789,7 @@ _populate(Evas_Object      *obj,
                                   parent, ELM_GENLIST_ITEM_NONE,
                                   NULL, NULL);
         else if (wd->mode == ELM_FILESELECTOR_GRID)
-          elm_gengrid_item_append(wd->files_grid, &grid_itc[type],
+          elm_gengrid_item_append(wd->files_grid, grid_itc[type],
                                   real, /* item data */
                                   NULL, NULL);
      }
@@ -863,22 +874,24 @@ elm_fileselector_add(Evas_Object *parent)
    elm_widget_sub_object_add(obj, bt);
    wd->home_button = bt;
 
-   list_itc[ELM_DIRECTORY] = elm_genlist_item_class_new();
-   list_itc[ELM_FILE_IMAGE] = elm_genlist_item_class_new();
-   list_itc[ELM_FILE_UNKNOW] = elm_genlist_item_class_new();
-
-   list_itc[ELM_DIRECTORY]->func.content_get = grid_itc[ELM_DIRECTORY].func.content_get = _itc_icon_folder_get;
-   list_itc[ELM_FILE_IMAGE]->func.content_get = grid_itc[ELM_FILE_IMAGE].func.content_get = _itc_icon_image_get;
-   list_itc[ELM_FILE_UNKNOW]->func.content_get = grid_itc[ELM_FILE_UNKNOW].func.content_get = _itc_icon_file_get;
-
    for (i = 0; i < ELM_FILE_LAST; ++i)
      {
-                list_itc[i]->item_style = "default";
-                list_itc[i]->func.text_get = grid_itc[i].func.text_get = _itc_text_get;
-                list_itc[i]->func.state_get = grid_itc[i].func.state_get = _itc_state_get;
-                list_itc[i]->func.del = grid_itc[i].func.del = _itc_del;
+        list_itc[i] = elm_genlist_item_class_new();
+        grid_itc[i] = elm_gengrid_item_class_new();
+
+        list_itc[i]->item_style = "default";
+        list_itc[i]->func.text_get = grid_itc[i]->func.text_get = _itc_text_get;
+        list_itc[i]->func.state_get = grid_itc[i]->func.state_get = _itc_state_get;
+        list_itc[i]->func.del = grid_itc[i]->func.del = _itc_del;
      }
 
+   list_itc[ELM_DIRECTORY]->func.content_get =
+     grid_itc[ELM_DIRECTORY]->func.content_get = _itc_icon_folder_get;
+   list_itc[ELM_FILE_IMAGE]->func.content_get =
+     grid_itc[ELM_FILE_IMAGE]->func.content_get = _itc_icon_image_get;
+   list_itc[ELM_FILE_UNKNOW]->func.content_get =
+     grid_itc[ELM_FILE_UNKNOW]->func.content_get = _itc_icon_file_get;
+
    li = elm_genlist_add(parent);
    elm_widget_mirrored_automatic_set(li, EINA_FALSE);
    evas_object_size_hint_align_set(li, EVAS_HINT_FILL, EVAS_HINT_FILL);
@@ -890,7 +903,8 @@ elm_fileselector_add(Evas_Object *parent)
    evas_object_size_hint_align_set(grid, EVAS_HINT_FILL, EVAS_HINT_FILL);
    evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
 
-   s = elm_finger_size_get() * 2;
+   // XXX: will fail for dynamic finger size changing
+   s = _elm_config->finger_size * 2;
    elm_gengrid_item_size_set(grid, s, s);
    elm_gengrid_align_set(grid, 0.0, 0.0);
 
@@ -966,7 +980,7 @@ elm_fileselector_is_save_get(const Evas_Object *obj)
    ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
    Widget_Data *wd = elm_widget_data_get(obj);
    if (!wd) return EINA_FALSE;
-   return elm_object_disabled_get(wd->filename_entry);
+   return !elm_object_disabled_get(wd->filename_entry);
 }
 
 EAPI void
@@ -1067,10 +1081,13 @@ elm_fileselector_expandable_get(const Evas_Object *obj)
 
 EAPI void
 elm_fileselector_path_set(Evas_Object *obj,
-                          const char  *path)
+                          const char  *_path)
 {
    ELM_CHECK_WIDTYPE(obj, widtype);
+   char *path;
+   path = ecore_file_realpath(_path);
    _populate(obj, path, NULL);
+   free(path);
 }
 
 EAPI const char *
@@ -1139,16 +1156,31 @@ elm_fileselector_selected_get(const Evas_Object *obj)
    Widget_Data *wd = elm_widget_data_get(obj);
    if (!wd) return NULL;
 
+   if (!wd->path) return NULL;
+   
    if (wd->filename_entry)
      {
         const char *name;
         char buf[PATH_MAX];
-        char *dir;
+        char *dir, *s;
 
         dir = wd->only_folder ? ecore_file_dir_get(wd->path) : strdup(wd->path);
         name = elm_object_text_get(wd->filename_entry);
-        snprintf(buf, sizeof(buf), "%s/%s",
-                 dir, name);
+        if (name)
+          {
+             s = elm_entry_markup_to_utf8(name);
+             if (s)
+               {
+                  snprintf(buf, sizeof(buf), "%s/%s", dir, s);
+                  free(s);
+               }
+             else
+               snprintf(buf, sizeof(buf), "%s", dir);
+          }
+        else
+          {
+             snprintf(buf, sizeof(buf), "%s", dir);
+          }
         if (wd->only_folder && !ecore_file_is_dir(buf))
           eina_stringshare_replace(&wd->selection, ecore_file_dir_get(buf));
         else
@@ -1173,28 +1205,45 @@ elm_fileselector_selected_get(const Evas_Object *obj)
 
 EAPI Eina_Bool
 elm_fileselector_selected_set(Evas_Object *obj,
-                              const char  *path)
+                              const char  *_path)
 {
    ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
    Widget_Data *wd = elm_widget_data_get(obj);
    if (!wd) return EINA_FALSE;
 
+   Eina_Bool ret = EINA_TRUE;
+   char *path;
+   path = ecore_file_realpath(_path);
+
    if (ecore_file_is_dir(path))
      _populate(obj, path, NULL);
    else
      {
         if (!ecore_file_exists(path))
-          return EINA_FALSE;
+          {
+             ret = EINA_FALSE;
+             goto clean_up;
+          }
 
         _populate(obj, ecore_file_dir_get(path), NULL);
         if (wd->filename_entry)
           {
-             elm_object_text_set(wd->filename_entry,
-                                          ecore_file_file_get(path));
+             char *s;
+             
+             s = elm_entry_utf8_to_markup(ecore_file_file_get(path));
+             if (s)
+               {
+                  elm_object_text_set(wd->filename_entry, s);
+                  free(s);
+               }
+             else
+               elm_object_text_set(wd->filename_entry, "");
              eina_stringshare_replace(&wd->selection, path);
           }
      }
 
-   return EINA_TRUE;
+clean_up:
+   free(path);
+   return ret;
 }