Enlightenment CVS committal

Author  : jethomas
Project : e17
Module  : libs/ewl

Dir     : e17/libs/ewl/src/lib


Modified Files:
        ewl_filedialog.c ewl_filedialog.h ewl_filelist.c 
        ewl_filelist.h ewl_filelist_model.c ewl_filelist_model.h 
        ewl_filepicker.c ewl_filepicker.h 


Log Message:
Implement filtering in the file choosing widgets

===================================================================
RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_filedialog.c,v
retrieving revision 1.40
retrieving revision 1.41
diff -u -3 -r1.40 -r1.41
--- ewl_filedialog.c    14 Nov 2007 20:07:58 -0000      1.40
+++ ewl_filedialog.c    9 Dec 2007 04:33:39 -0000       1.41
@@ -405,7 +405,8 @@
  */
 void
 ewl_filedialog_filter_add(Ewl_Filedialog *fd, const char *name,
-                                               const char *filter)
+                                               const char *filter,
+                                               Ecore_List *mime_types)
 {
        DENTER_FUNCTION(DLEVEL_STABLE);
        DCHECK_PARAM_PTR(fd);
@@ -413,7 +414,7 @@
        DCHECK_PARAM_PTR(filter);
        DCHECK_TYPE(fd, EWL_FILEDIALOG_TYPE);
 
-       ewl_filepicker_filter_add(EWL_FILEPICKER(fd->fp), name, filter);
+       ewl_filepicker_filter_add(EWL_FILEPICKER(fd->fp), name, filter, 
mime_types);
 
        DLEAVE_FUNCTION(DLEVEL_STABLE);
 }
===================================================================
RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_filedialog.h,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -3 -r1.23 -r1.24
--- ewl_filedialog.h    14 Nov 2007 20:07:58 -0000      1.23
+++ ewl_filedialog.h    9 Dec 2007 04:33:39 -0000       1.24
@@ -89,7 +89,8 @@
 
 void            ewl_filedialog_filter_add(Ewl_Filedialog *fd,
                                                const char *name,
-                                               const char *filter);
+                                               const char *filter,
+                                               Ecore_List *mime_types);
 
 /*
  * Internally used callbacks, override at your own risk.
===================================================================
RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_filelist.c,v
retrieving revision 1.44
retrieving revision 1.45
diff -u -3 -r1.44 -r1.45
--- ewl_filelist.c      9 Dec 2007 01:00:40 -0000       1.44
+++ ewl_filelist.c      9 Dec 2007 04:33:39 -0000       1.45
@@ -77,8 +77,8 @@
        fl->multiselect = FALSE;
        fl->skip_hidden = TRUE;
 
-       ewl_filelist_filter_set(fl, NULL);
-       ewl_filelist_directory_set(fl, NULL);
+       fl->directory = NULL;
+       fl->filter = NULL;
        ewl_filelist_setup(fl);
 
        DRETURN_INT(TRUE, DLEVEL_STABLE);
@@ -279,7 +279,7 @@
                if (data) ewl_filelist_model_data_unref(data);
                
                data = ewl_filelist_model_directory_new(fl->directory,
-                                                fl->skip_hidden, TRUE);
+                                                fl->skip_hidden, TRUE, 
fl->filter);
                ewl_mvc_data_set(EWL_MVC(fl->controller), data);
                ewl_mvc_dirty_set(EWL_MVC(fl->controller), TRUE);
 
@@ -313,17 +313,25 @@
  * @brief Sets the given filter into the filelist
  */
 void
-ewl_filelist_filter_set(Ewl_Filelist *fl, const char *filter)
+ewl_filelist_filter_set(Ewl_Filelist *fl, Ewl_Filelist_Filter *filter)
 {
+       Ewl_Filelist_Directory *dir;
+       int ret = 0;
+       
        DENTER_FUNCTION(DLEVEL_STABLE);
        DCHECK_PARAM_PTR(fl);
+       DCHECK_PARAM_PTR(filter);
        DCHECK_TYPE(fl, EWL_FILELIST_TYPE);
 
-       IF_FREE(fl->filter);
-       fl->filter = (filter ? strdup(filter) : NULL);
+       fl->filter = NULL;
+       fl->filter = filter;
+       dir = ewl_mvc_data_get(EWL_MVC(fl->controller));
        
-       /* Model does not do filtering yet */
-       DWARNING("Filtering not yet implemented");
+       /* Set the filelist and test if there is any change in data */
+       if (dir)
+               ret = ewl_filelist_model_filter_set(dir, filter);
+       if (ret)
+               ewl_mvc_dirty_set(EWL_MVC(fl->controller), TRUE);
 
        DLEAVE_FUNCTION(DLEVEL_STABLE);
 }
@@ -333,7 +341,7 @@
  * @return Returns the current filter
  * @brief Retrieves the current filter set on the filelist
  */
-const char *
+Ewl_Filelist_Filter *
 ewl_filelist_filter_get(Ewl_Filelist *fl)
 {
        DENTER_FUNCTION(DLEVEL_STABLE);
@@ -406,7 +414,8 @@
 void
 ewl_filelist_show_dot_files_set(Ewl_Filelist *fl, unsigned int dot)
 {
-       Ewl_Filelist_Directory *data;
+       Ewl_Filelist_Directory *dir;
+       int ret = 0;
        
        DENTER_FUNCTION(DLEVEL_STABLE);
        DCHECK_PARAM_PTR(fl);
@@ -416,13 +425,13 @@
                DRETURN(DLEVEL_STABLE);
 
        fl->skip_hidden = !!dot;
-       data = ewl_mvc_data_get(EWL_MVC(fl->controller));
-       if (data) ewl_filelist_model_data_unref(data);
-                                               
-       data = ewl_filelist_model_directory_new(fl->directory,
-                                        fl->skip_hidden, TRUE);
-       ewl_mvc_data_set(EWL_MVC(fl->controller), data);
-       ewl_mvc_dirty_set(EWL_MVC(fl->controller), TRUE);
+       dir = ewl_mvc_data_get(EWL_MVC(fl->controller));
+
+       /* check if data and then call the model function */
+       if (dir)
+               ret = ewl_filelist_model_show_dot_files_set(dir, dot);
+       if (ret)
+               ewl_mvc_dirty_set(EWL_MVC(fl->controller), TRUE);
        
        DLEAVE_FUNCTION(DLEVEL_STABLE);
 }
@@ -1150,12 +1159,12 @@
        DENTER_FUNCTION(DLEVEL_STABLE);
        DCHECK_PARAM_PTR(w);
        DCHECK_TYPE(w, EWL_FILELIST_TYPE);
-
+       
        fl = EWL_FILELIST(w);
        IF_FREE(fl->directory);
-       IF_FREE(fl->filter);
        IF_FREE(fl->view);
        IF_FREE(fl->model);
+       fl->filter = NULL;
 
        DLEAVE_FUNCTION(DLEVEL_STABLE);
 }
===================================================================
RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_filelist.h,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -3 -r1.21 -r1.22
--- ewl_filelist.h      14 Nov 2007 20:07:58 -0000      1.21
+++ ewl_filelist.h      9 Dec 2007 04:33:39 -0000       1.22
@@ -20,6 +20,30 @@
  *
  * @{
  */
+ 
+ /**
+ *  * @def EWL_FILELIST_FILTER_TYPE
+ *   * The type name
+ *    **/
+#define EWL_FILELIST_FILTER_TYPE "filelist_filter"
+
+typedef struct Ewl_Filelist_Filter Ewl_Filelist_Filter;
+
+/**
+ *  * @def EWL_FILELIST_FILTER(ff)
+ *   * Typecasts a pointer to an Ewl_Filelist_Filter
+ *    **/
+#define EWL_FILELIST_FILTER(ff), ((Ewl_Filelist_Filter *)ff)
+
+/**
+ *  * @brief The data structure for Ewl_Filelist_Filter
+ *   **/
+struct Ewl_Filelist_Filter
+{
+               char *name;
+               char *extension;
+               Ecore_List *mime_list;
+};
 
 /**
  * @def EWL_FILELIST_TYPE
@@ -56,7 +80,7 @@
        Ewl_Model *model;       /**< The model for the mvc */
 
        char *directory;        /**< The directory to display */
-       char *filter;           /**< The file filter to employ */
+       Ewl_Filelist_Filter *filter;            /**< The file filter to employ 
*/
 
        unsigned char multiselect:1;    /**< Allow multiple file selctions */
        unsigned char skip_hidden:1;    /**< Show . files */
@@ -69,6 +93,65 @@
        } scroll_flags;         /**< Flags to modify a containing scrollpane */
 };
 
+/**
+ * @def EWL_FILELIST_FILE_TYPE
+ * The type name
+ */
+#define EWL_FILELIST_FILE_TYPE "filelist_file"
+
+typedef struct Ewl_Filelist_File Ewl_Filelist_File;
+
+/**
+ * @def EWL_FILELIST_FILE(fl)
+ * Typecasts a pointer to an Ewl_Filelist_File pointer
+ */
+#define EWL_FILELIST_FILE(fl) ((Ewl_Filelist_File *)fl)
+
+/**
+ * @brief The data structure for Ewl_Filelist_File
+ */
+struct Ewl_Filelist_File
+{
+       const char *name;
+       off_t size;
+       mode_t mode;
+       uid_t username;
+       gid_t groupname;
+       time_t modtime;
+       unsigned char readable:1;
+       unsigned char writeable:1;
+       unsigned char is_dir:1;
+};
+
+/**
+ *  * @def EWL_FILELIST_DIRECTORY_TYPE
+ *   * The type name
+ *    */
+#define EWL_FILELIST_DIRECTORY_TYPE "filelist_directory"
+
+typedef struct Ewl_Filelist_Directory Ewl_Filelist_Directory;
+
+/**
+ *  * @def EWL_FILELIST_DIRECTORY(fl)
+ *   * Typecasts a pointer to an Ewl_Filelist_Directory pointer
+ *    */
+#define EWL_FILELIST_DIRECTORY(fl) ((Ewl_Filelist_Directory *)fl)
+
+/**
+ *  * @brief The data structure for Ewl_Filelist_Directory
+ *   */
+struct Ewl_Filelist_Directory
+{
+       const char *name;
+       Ecore_List *rfiles;
+       Ecore_List *rdirs;
+       Ecore_List *files;
+       Ecore_List *dirs;
+       Ewl_Filelist_Filter *filter;
+       unsigned char skip_hidden:1;
+       unsigned int num_dirs;
+       unsigned int num_files;
+};
 
 Ewl_Widget     *ewl_filelist_new(void);
 
@@ -79,8 +162,8 @@
 const char     *ewl_filelist_directory_get(Ewl_Filelist *fl);
 
 void            ewl_filelist_filter_set(Ewl_Filelist *fl,
-                                                       const char *filter);
-const char     *ewl_filelist_filter_get(Ewl_Filelist *fl);
+                                                       Ewl_Filelist_Filter 
*filter);
+Ewl_Filelist_Filter    *ewl_filelist_filter_get(Ewl_Filelist *fl);
 
 void            ewl_filelist_view_set(Ewl_Filelist *fl,
                                                Ewl_Filelist_View view);
@@ -126,21 +209,6 @@
 const char     *ewl_filelist_stock_icon_get(const char *path);
 
 char           *ewl_filelist_expand_path(Ewl_Filelist *fl, const char *dir);
-void            ewl_filelist_directory_read(Ewl_Filelist *fl,
-                                       const char *dir,
-                                       unsigned int skip_dot_dot,
-                                       void (*func)(Ewl_Filelist *fl,
-                                               const char *dir,
-                                               char *file, void *data),
-                                       void *data);
-void            ewl_filelist_handle_click(Ewl_Filelist *fl, Ewl_Widget *w,
-                                               Ewl_Event_Mouse_Up *ev,
-                                               const char *select_state,
-                                               const char *unselect_state);
-void            ewl_filelist_container_shift_handle(Ewl_Filelist *fl,
-                                       Ewl_Container *c, Ewl_Widget *clicked,
-                                       const char *select_signal,
-                                       const char *unselect_signal);
 
 /*
  * Internally used functions, override at your own risk
===================================================================
RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_filelist_model.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -3 -r1.5 -r1.6
--- ewl_filelist_model.c        14 Nov 2007 20:07:59 -0000      1.5
+++ ewl_filelist_model.c        9 Dec 2007 04:33:39 -0000       1.6
@@ -5,6 +5,7 @@
 #include "ewl_debug.h"
 #include "ewl_model.h"
 #include "ewl_filelist.h"
+#include "ewl_io_manager.h"
 #include <dirent.h>
 
 static int ewl_filelist_model_data_name_sort(Ewl_Filelist_File *file1,
@@ -12,21 +13,28 @@
 static int ewl_filelist_model_data_size_sort(Ewl_Filelist_File *file1,
                                Ewl_Filelist_File *file2);
 static void free_file(Ewl_Filelist_File *file);
+void ewl_filelist_model_filter(Ewl_Filelist_Directory *dir);
+static unsigned int ewl_filelist_model_filter_main
+                               (Ewl_Filelist_Directory *dir,
+                               Ewl_Filelist_File *file);
 
 /**
  * @param path: The path to the directory to read
- * @param skip_hidden: TRUE skips hidden files, FALSE does not
+ * @param skip_hidden: TRUE shows hidden files, FALSE does not
  * @param show_dot_dot: TRUE shows .. for navigating upwards, FALSE does not
+ * @param filter: The Ewl_Filelist_Filter to use
  * @return Returns an Ewl_Filelist_Directory structure
  * @brief Retrieves all files in a directory
  */
 Ewl_Filelist_Directory *
-ewl_filelist_model_directory_new(const char *path, 
+ewl_filelist_model_directory_new(const char *path,
                                        unsigned char skip_hidden,
-                                       unsigned int show_dot_dot)
+                                       unsigned int show_dot_dot,
+                                       Ewl_Filelist_Filter *filter)
 {
        Ewl_Filelist_Directory *dir;
        Ewl_Filelist_File *file;
+       
        struct stat st;
        char filename[PATH_MAX], *file_temp;
        int nf = 0, nd = 0;
@@ -48,13 +56,6 @@
 
        while ((file_temp = ecore_list_first_remove(all_files)))
        {
-               /* Handle hidden files */
-               if ((skip_hidden) && (file_temp[0] == '.'))
-               {
-                       FREE(file_temp);
-                       continue;
-               }
-
                /* allocate the memory for the file structure */
                file = NEW(Ewl_Filelist_File, 1);
 
@@ -100,12 +101,18 @@
        /* create the new directory structure */
        dir = NEW(Ewl_Filelist_Directory, 1);
 
-       dir->files = files;
-       dir->dirs = dirs;
+       dir->rfiles = files;
+       dir->rdirs = dirs;
+       dir->files = ecore_list_new();
+       dir->dirs = ecore_list_new();
        dir->name = ecore_string_instance(path);
        dir->skip_hidden = !!skip_hidden;
+       dir->filter = filter;
        dir->num_dirs = nd;
        dir->num_files = nf;
+       
+       /* Filter the directory */
+       ewl_filelist_model_filter(dir);
 
        IF_FREE_LIST(all_files);
        DRETURN_PTR(dir, DLEVEL_STABLE);
@@ -339,8 +346,8 @@
        file = ecore_list_index_goto(fld->dirs, parent);
        snprintf(path, PATH_MAX, "%s/%s", fld->name, file->name);
        subdir = ewl_filelist_model_directory_new
-                                       (path, fld->skip_hidden, 
-                                        FALSE);
+                                       (path, fld->skip_hidden,
+                                       FALSE, fld->filter);
 
        DRETURN_PTR(subdir, DLEVEL_STABLE);
 }
@@ -360,6 +367,8 @@
        ecore_string_release(dir->name);
        ecore_list_destroy(dir->files);
        ecore_list_destroy(dir->dirs);
+       ecore_list_destroy(dir->rfiles);
+       ecore_list_destroy(dir->rdirs);
        FREE(dir);
 
        DRETURN_INT(TRUE, DLEVEL_STABLE);
@@ -377,5 +386,201 @@
        FREE(file);
 
        DLEAVE_FUNCTION(DLEVEL_STABLE);
+}
+
+/**
+ * @param data: The model to work with
+ * @param hidden: TRUE shows hidden files, FALSE does not
+ * @return Returns TRUE if a change in data, FALSE if not
+ * @brief This function sets whether the filelist should contain hidden files
+ */
+unsigned int
+ewl_filelist_model_show_dot_files_set(Ewl_Filelist_Directory *dir,
+                                                       unsigned int 
skip_hidden)
+{
+       DENTER_FUNCTION(DLEVEL_STABLE);
+       DCHECK_PARAM_PTR_RET(dir, FALSE);
+       
+       /* If nothing has changed, leave */
+       if (skip_hidden == !!dir->skip_hidden)
+               DRETURN_INT(FALSE, DLEVEL_STABLE);
+
+       /* Else set value in */
+       dir->skip_hidden = !!skip_hidden;
+
+       /* Refilter the files */
+       ewl_filelist_model_filter(dir);
+
+       DRETURN_INT(TRUE, DLEVEL_STABLE);
+}
+
+/**
+ * @param data: The model to work with
+ * @return Returns if the model shows dot files
+ * @brief Returns if the model shows dot files
+ */
+unsigned int
+ewl_filelist_model_show_dot_files_get(Ewl_Filelist_Directory *dir)
+{
+       DENTER_FUNCTION(DLEVEL_STABLE);
+       DCHECK_PARAM_PTR_RET(dir, FALSE);
+       DRETURN_INT((unsigned int)dir->skip_hidden, DLEVEL_STABLE);
+}
+
+/**
+ * @param dir: The directory to filter
+ * @return Does not return a value
+ * @brief Filters a directory
+ */
+void
+ewl_filelist_model_filter(Ewl_Filelist_Directory *dir)
+{
+       Ewl_Filelist_File *file;
+       int ret = 0;
+
+       DENTER_FUNCTION(DLEVEL_STABLE);
+       DCHECK_PARAM_PTR(dir);
+
+       /* Set up temporary filelist */
+       ecore_list_clear(dir->files);
+       ecore_list_clear(dir->dirs);
+
+
+       /* Hidden files first */
+       if (dir->skip_hidden)
+       {
+
+               /* Run through files and filter hidden first, then others */
+               ecore_list_first_goto(dir->rfiles);
+               while ((file = ecore_list_next(dir->rfiles)))
+               {
+                       ret = ewl_filelist_model_filter_main(dir, file);
+                       if ((file->name[0] != '.') && (ret))
+                              ecore_list_append(dir->files, file);
+
+               }
+
+               /* Now directories */
+               ecore_list_first_goto(dir->rdirs);
+               while ((file = ecore_list_next(dir->rdirs)))
+               {
+                       if ((file->name[0] != '.') || 
+                                       (!strcmp(file->name, "..")))
+                               ecore_list_append(dir->dirs, file);
+               }
+       }
+
+       /* If showing hidden */
+       else
+       {
+               /* Still loop through to check if pass filter */
+               ecore_list_first_goto(dir->rfiles);
+               while ((file = ecore_list_next(dir->rfiles)))
+               {
+                       ret = ewl_filelist_model_filter_main(dir, file);
+                       if (ret)
+                               ecore_list_append(dir->files, file);
+               }
+
+               ecore_list_first_goto(dir->rdirs);
+               while ((file = ecore_list_next(dir->rdirs)))
+                       ecore_list_append(dir->dirs, file);
+       }
+
+
+       /* Set numbers into directory data */
+       dir->num_dirs = ecore_list_count(dir->dirs);
+       dir->num_files = ecore_list_count(dir->files);
+
+       DLEAVE_FUNCTION(DLEVEL_STABLE);
+}
+
+/**
+ * @param dir: The directory to set a filter upon
+ * @param filter: The Ewl_Filelist_Filter to use
+ * @returns: Returns TRUE on data change, FALSE if not
+ * @brief Sets a filter onto a directory
+ */
+unsigned int
+ewl_filelist_model_filter_set(Ewl_Filelist_Directory *dir,
+                                       Ewl_Filelist_Filter *filter)
+{
+       DENTER_FUNCTION(DLEVEL_STABLE);
+       DCHECK_PARAM_PTR_RET(dir, FALSE);
+       DCHECK_PARAM_PTR_RET(filter, FALSE);
+
+       /* If nothing has changed, leave */
+       if ((dir->filter) && (!memcmp(dir->filter, filter,
+                                               sizeof(dir->filter))))
+               DRETURN_INT(FALSE, DLEVEL_STABLE);
+
+       /* Set the filter and call the function */
+       dir->filter = filter;
+       ewl_filelist_model_filter(dir);
+
+       DRETURN_INT(TRUE, DLEVEL_STABLE);
+}
+
+/**
+ * @param dir: The directory to get the filter for
+ * @returns: Returns the Ewl_Filelist_Filter used
+ * @brief Gets the filter used on a directory
+ */
+Ewl_Filelist_Filter *
+ewl_filelist_model_filter_get(Ewl_Filelist_Directory *dir)
+{
+       DENTER_FUNCTION(DLEVEL_STABLE);
+       DCHECK_PARAM_PTR_RET(dir, NULL);
+       DRETURN_PTR(dir->filter, DLEVEL_STABLE);
+}
+
+/**
+ * @internal
+ * @param dir: The directory to get the filter from
+ * @param file: The file to test
+ * @returns: Returns TRUE if passes the filter, FALSE otherwise
+ * @brief Tests a file against a filter
+ */
+static unsigned int
+ewl_filelist_model_filter_main(Ewl_Filelist_Directory *dir,
+                                       Ewl_Filelist_File *file)
+{
+       Ewl_Filelist_Filter *filter = dir->filter;
+       const char *mime_check;
+       char *mime_given;
+
+       DENTER_FUNCTION(DLEVEL_STABLE);
+       DCHECK_PARAM_PTR_RET(dir, FALSE);
+       DCHECK_PARAM_PTR_RET(file, FALSE);
+
+       if (!filter)
+               DRETURN_INT(FALSE, DLEVEL_STABLE);
+
+       /* First check mime types */
+       if (filter->mime_list)
+       {
+               mime_check = ewl_io_manager_uri_mime_type_get(file->name);
+               ecore_list_first_goto(filter->mime_list);
+               while ((mime_given = ecore_list_next(filter->mime_list)))
+               {
+                       if (!strcmp(mime_given, mime_check))
+                               DRETURN_INT(TRUE, DLEVEL_STABLE);
+               }
+       }
+
+       /* Next check extension */
+       else if (filter->extension)
+       {
+               if (!fnmatch(filter->extension, file->name, 0))
+                       DRETURN_INT(TRUE, DLEVEL_STABLE);
+       }
+
+       /* If no filter at all is in effect */
+       else if ((!filter->extension) && (!filter->mime_list))
+       {
+               DRETURN_INT(TRUE, DLEVEL_STABLE);
+       }
+
+       DRETURN_INT(FALSE, DLEVEL_STABLE);
 }
 
===================================================================
RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_filelist_model.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -3 -r1.6 -r1.7
--- ewl_filelist_model.h        3 Dec 2007 04:16:06 -0000       1.6
+++ ewl_filelist_model.h        9 Dec 2007 04:33:39 -0000       1.7
@@ -1,5 +1,6 @@
 #ifndef EWL_FILELIST_MODEL_H
 #define EWL_FILELIST_MODEL_H
+#include "ewl_filelist.h"
 
 /**
  * @addtogroup Ewl_Filelist_Model Ewl_Filelist_Model: The model for the 
filelist
@@ -8,66 +9,10 @@
  * @{
  */
 
-/**
- * @def EWL_FILELIST_FILE_TYPE
- * The type name
- */
-#define EWL_FILELIST_FILE_TYPE "filelist_file"
-
-typedef struct Ewl_Filelist_File Ewl_Filelist_File;
-
-/**
- * @def EWL_FILELIST_FILE(fl)
- * Typecasts a pointer to an Ewl_Filelist_File pointer
- */
-#define EWL_FILELIST_FILE(fl) ((Ewl_Filelist_File *)fl)
-
-/**
- * @brief The data structure for Ewl_Filelist_File
- */
-struct Ewl_Filelist_File
-{
-       const char *name;
-       off_t size;
-       mode_t mode;
-       uid_t username;
-       gid_t groupname;
-       time_t modtime;
-       unsigned char readable:1;
-       unsigned char writeable:1;
-       unsigned char is_dir:1;
-};
-
-/**
- *  * @def EWL_FILELIST_DIRECTORY_TYPE
- *   * The type name
- *    */
-#define EWL_FILELIST_DIRECTORY_TYPE "filelist_directory"
-
-typedef struct Ewl_Filelist_Directory Ewl_Filelist_Directory;
-
-/**
- *  * @def EWL_FILELIST_DIRECTORY(fl)
- *   * Typecasts a pointer to an Ewl_Filelist_Directory pointer
- *    */
-#define EWL_FILELIST_DIRECTORY(fl) ((Ewl_Filelist_Directory *)fl)
-
-/**
- *  * @brief The data structure for Ewl_Filelist_Directory
- *   */
-struct Ewl_Filelist_Directory
-{
-       const char *name;
-       Ecore_List *files;
-       Ecore_List *dirs;
-       unsigned char skip_hidden:1;
-       unsigned int num_dirs;
-       unsigned int num_files;
-};
-
 Ewl_Filelist_Directory *ewl_filelist_model_directory_new(const char *path,
-                                               unsigned char skip_hidden,
-                                               unsigned int show_dot_dot);
+                                               unsigned char skip_hidden,
+                                               unsigned int show_dot_dot,
+                                               Ewl_Filelist_Filter *filter);
 unsigned int ewl_filelist_model_data_count(void *data);
 void *ewl_filelist_model_data_fetch(void *data, unsigned int row,
                                                unsigned int column);
@@ -80,6 +25,15 @@
 unsigned int ewl_filelist_model_data_unref(void *data);
 int ewl_filelist_model_column_sortable(void *data, 
                                                unsigned int column);
+
+unsigned int ewl_filelist_model_show_dot_files_set(Ewl_Filelist_Directory *dir,
+                                               unsigned int skip_hidden);
+unsigned int ewl_filelist_model_show_dot_files_get(Ewl_Filelist_Directory 
*dir);
+
+unsigned int ewl_filelist_model_filter_set(Ewl_Filelist_Directory *dir,
+                                       Ewl_Filelist_Filter *filter);
+Ewl_Filelist_Filter *ewl_filelist_model_filter_get
+                                       (Ewl_Filelist_Directory *dir);
 
 /**
  * @}
===================================================================
RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_filepicker.c,v
retrieving revision 1.39
retrieving revision 1.40
diff -u -3 -r1.39 -r1.40
--- ewl_filepicker.c    17 Nov 2007 16:57:56 -0000      1.39
+++ ewl_filepicker.c    9 Dec 2007 04:33:39 -0000       1.40
@@ -12,20 +12,6 @@
 #include "ewl_private.h"
 #include "ewl_debug.h"
 
-/**
- * Ewl_Filepicker_Filter
- */
-typedef struct Ewl_Filepicker_Filter Ewl_Filepicker_Filter;
-
-/**
- * @brief Contains information on a filepicker filter
- */
-struct Ewl_Filepicker_Filter
-{
-       char *name;
-       char *filter;
-};
-
 static void ewl_filepicker_favorites_populate(Ewl_Filepicker *fp);
 static void ewl_filepicker_cb_list_value_changed(Ewl_Widget *w, void *ev,
                                                                void *data);
@@ -46,7 +32,7 @@
 static unsigned int ewl_filepicker_cb_type_count(void *data);
 static Ewl_Widget *ewl_filepicker_cb_type_header(void *data, unsigned int col);
 
-static void ewl_filepicker_filter_free_cb(Ewl_Filepicker_Filter *filter);
+static void ewl_filepicker_filter_free_cb(Ewl_Filelist_Filter *filter);
 
 /**
  * @return Returns a new Ewl_Filepicker widget or NULL on failure
@@ -133,6 +119,15 @@
        fp->file_list_box = ewl_scrollpane_new();
        ewl_container_child_append(EWL_CONTAINER(o), fp->file_list_box);
        ewl_widget_show(fp->file_list_box);
+       
+       fp->file_list = ewl_filelist_new();
+       ewl_container_child_append(EWL_CONTAINER(fp->file_list_box),
+                                                       fp->file_list);
+       ewl_callback_append(EWL_WIDGET(fp->file_list),
+                               EWL_CALLBACK_VALUE_CHANGED,
+                               ewl_filepicker_cb_list_value_changed,
+                               fp);
+       ewl_widget_show(fp->file_list);
 
        o = ewl_hbox_new();
        ewl_container_child_append(EWL_CONTAINER(fp), o);
@@ -152,7 +147,6 @@
        fp->filters = ecore_list_new();
        ecore_list_free_cb_set(fp->filters,
                        ECORE_FREE_CB(ewl_filepicker_filter_free_cb));
-       ewl_filepicker_filter_add(fp, "All files", NULL);
 
        fp->mvc_filters.model = ewl_model_new();
        ewl_model_data_fetch_set(fp->mvc_filters.model,
@@ -170,8 +164,6 @@
        ewl_mvc_view_set(EWL_MVC(fp->mvc_filters.combo),
                                fp->mvc_filters.view);
        ewl_mvc_data_set(EWL_MVC(fp->mvc_filters.combo), fp);
-       ewl_mvc_selected_set(EWL_MVC(fp->mvc_filters.combo),
-                               NULL, fp, 0, 0);
        ewl_combo_editable_set(EWL_COMBO(fp->mvc_filters.combo), TRUE);
        ewl_callback_append(fp->mvc_filters.combo,
                                EWL_CALLBACK_VALUE_CHANGED,
@@ -203,17 +195,12 @@
                                ewl_filepicker_cb_button_clicked, fp);
        ewl_object_fill_policy_set(EWL_OBJECT(o), EWL_FLAG_FILL_SHRINK);
        ewl_widget_show(o);
-
-       /* do this last so all the other widgets are set correctly */
-       fp->file_list = ewl_filelist_new();
-       ewl_container_child_append(EWL_CONTAINER(fp->file_list_box),
-                                                       fp->file_list);
-       ewl_callback_append(EWL_WIDGET(fp->file_list),
-                               EWL_CALLBACK_VALUE_CHANGED,
-                               ewl_filepicker_cb_list_value_changed,
-                               fp);
-       ewl_widget_show(fp->file_list);
+       
+       /* Set up filelist */
+       ewl_filepicker_filter_add(fp, "All files", NULL, NULL);
        ewl_filepicker_directory_set(fp, NULL);
+       ewl_mvc_selected_set(EWL_MVC(fp->mvc_filters.combo),
+                       NULL, fp, 0, 0);
 
        DRETURN_INT(TRUE, DLEVEL_STABLE);
 }
@@ -361,7 +348,7 @@
  * @brief Set the given filter into the file picker
  */
 void
-ewl_filepicker_filter_set(Ewl_Filepicker *fp, const char *filter)
+ewl_filepicker_filter_set(Ewl_Filepicker *fp, Ewl_Filelist_Filter *filter)
 {
        DENTER_FUNCTION(DLEVEL_STABLE);
        DCHECK_PARAM_PTR(fp);
@@ -377,7 +364,7 @@
  * @return Returns the current filter used in the filepicker
  * @brief Retrieves the current filter used in the filepicker
  */
-const char *
+Ewl_Filelist_Filter *
 ewl_filepicker_filter_get(Ewl_Filepicker *fp)
 {
        DENTER_FUNCTION(DLEVEL_STABLE);
@@ -542,18 +529,22 @@
  */
 void
 ewl_filepicker_filter_add(Ewl_Filepicker *fp, const char *name,
-                                               const char *filter)
+                                               const char *extension,
+                                               Ecore_List *mime_types)
 {
-       Ewl_Filepicker_Filter *f;
+       Ewl_Filelist_Filter *f;
 
        DENTER_FUNCTION(DLEVEL_STABLE);
        DCHECK_PARAM_PTR(fp);
        DCHECK_PARAM_PTR(name);
        DCHECK_TYPE(fp, EWL_FILEPICKER_TYPE);
 
-       f= NEW(Ewl_Filepicker_Filter, 1);
+       f= NEW(Ewl_Filelist_Filter, 1);
        f->name = strdup(name);
-       f->filter = (filter ? strdup(filter) : NULL);
+       if (extension) f->extension = strdup(extension);
+       else f->extension = NULL;
+       if (mime_types) f->mime_list = mime_types;
+       else f->mime_list = NULL;
 
        ecore_list_prepend(fp->filters, f);
 
@@ -652,7 +643,7 @@
                                unsigned int col __UNUSED__)
 {
        Ewl_Filepicker *fp;
-       Ewl_Filepicker_Filter *filter;
+       Ewl_Filelist_Filter *filter;
 
        DENTER_FUNCTION(DLEVEL_STABLE);
        DCHECK_PARAM_PTR_RET(data, NULL);
@@ -681,7 +672,7 @@
 ewl_filepicker_cb_type_header(void *data, unsigned int col)
 {
        Ewl_Filepicker *fp;
-       Ewl_Filepicker_Filter *filter;
+       Ewl_Filelist_Filter *filter;
        Ewl_Widget *w;
 
        DENTER_FUNCTION(DLEVEL_STABLE);
@@ -761,6 +752,7 @@
 ewl_filepicker_cb_filter_change(Ewl_Widget *w, void *ev __UNUSED__, void *data)
 {
        Ewl_Filepicker *fp;
+       const char *name;
 
        DENTER_FUNCTION(DLEVEL_STABLE);
        DCHECK_PARAM_PTR(w);
@@ -768,7 +760,13 @@
        DCHECK_TYPE(w, EWL_WIDGET_TYPE);
 
        fp = data;
-       ewl_filepicker_filter_set(fp, ewl_text_text_get(EWL_TEXT(w)));
+       name = ewl_text_text_get(EWL_TEXT(w));
+       
+       if (!name)
+               DRETURN(DLEVEL_STABLE);
+       
+       ewl_filepicker_filter_add(fp, name, name, NULL);
+       ewl_filepicker_cb_type_change(fp->mvc_filters.combo, NULL, fp);
 
        DLEAVE_FUNCTION(DLEVEL_STABLE);
 }
@@ -778,7 +776,7 @@
                                                        void *data)
 {
        Ewl_Filepicker *fp;
-       Ewl_Filepicker_Filter *filter;
+       Ewl_Filelist_Filter *filter;
        Ewl_Selection_Idx *idx;
 
        DENTER_FUNCTION(DLEVEL_STABLE);
@@ -792,8 +790,10 @@
        {
                ecore_list_index_goto(fp->filters, idx->row);
                filter = ecore_list_current(fp->filters);
-               ewl_filepicker_filter_set(fp, filter->filter);
+               ewl_filepicker_filter_set(fp, filter);
        }
+       
+       FREE(idx);
 
        DLEAVE_FUNCTION(DLEVEL_STABLE);
 }
@@ -821,14 +821,15 @@
 }
 
 static void
-ewl_filepicker_filter_free_cb(Ewl_Filepicker_Filter *filter)
+ewl_filepicker_filter_free_cb(Ewl_Filelist_Filter *filter)
 {
        DENTER_FUNCTION(DLEVEL_STABLE);
 
        if (!filter) DRETURN(DLEVEL_STABLE);
 
        IF_FREE(filter->name);
-       IF_FREE(filter->filter);
+       IF_FREE(filter->extension);
+       IF_FREE_LIST(filter->mime_list);
 
        FREE(filter);
 
===================================================================
RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_filepicker.h,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -3 -r1.13 -r1.14
--- ewl_filepicker.h    17 Nov 2007 00:01:55 -0000      1.13
+++ ewl_filepicker.h    9 Dec 2007 04:33:39 -0000       1.14
@@ -5,6 +5,7 @@
 #include "ewl_box.h"
 #include "ewl_view.h"
 #include "ewl_model.h"
+#include "ewl_filelist.h"
 
 /**
  * @addtogroup Ewl_Filepicker Ewl_Filepicker: Allows selecting files from a 
list
@@ -77,8 +78,8 @@
 const char     *ewl_filepicker_directory_get(Ewl_Filepicker *fp);
 
 void            ewl_filepicker_filter_set(Ewl_Filepicker *fp,
-                                                       const char *filter);
-const char     *ewl_filepicker_filter_get(Ewl_Filepicker *fp);
+                                                       Ewl_Filelist_Filter 
*filter);
+Ewl_Filelist_Filter    *ewl_filepicker_filter_get(Ewl_Filepicker *fp);
 
 void            ewl_filepicker_multiselect_set(Ewl_Filepicker *fp,
                                                        unsigned int ms);
@@ -106,7 +107,8 @@
 
 void            ewl_filepicker_filter_add(Ewl_Filepicker *fp,
                                                const char *name,
-                                               const char *filter);
+                                               const char *extension,
+                                               Ecore_List *mime_types);
 /**
  * @}
  */



-------------------------------------------------------------------------
SF.Net email is sponsored by: 
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://sourceforge.net/services/buy/index.php
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to