[gedit] Bug 697428 - Add binary-patterns setting to the file browser



commit 6db05b6ec7be94302ec839456db71f238a65925c
Author: Garrett Regier <garrettregier gmail com>
Date:   Sun Jun 16 04:48:27 2013 -0700

    Bug 697428 - Add binary-patterns setting to the file browser
    
    This is a list of extra glob patterns to consider as binary files.

 plugins/filebrowser/gedit-file-browser-plugin.c    |   11 ++-
 plugins/filebrowser/gedit-file-browser-store.c     |  108 ++++++++++++++++++-
 plugins/filebrowser/gedit-file-browser-store.h     |    8 ++-
 ...ome.gedit.plugins.filebrowser.gschema.xml.in.in |    5 +
 4 files changed, 123 insertions(+), 9 deletions(-)
---
diff --git a/plugins/filebrowser/gedit-file-browser-plugin.c b/plugins/filebrowser/gedit-file-browser-plugin.c
index e779c73..8220c26 100644
--- a/plugins/filebrowser/gedit-file-browser-plugin.c
+++ b/plugins/filebrowser/gedit-file-browser-plugin.c
@@ -48,6 +48,7 @@
 #define FILEBROWSER_OPEN_AT_FIRST_DOC  "open-at-first-doc"
 #define FILEBROWSER_FILTER_MODE                "filter-mode"
 #define FILEBROWSER_FILTER_PATTERN     "filter-pattern"
+#define FILEBROWSER_BINARY_PATTERNS    "binary-patterns"
 
 #define NAUTILUS_BASE_SETTINGS         "org.gnome.nautilus.preferences"
 #define NAUTILUS_FALLBACK_SETTINGS     "org.gnome.gedit.plugins.filebrowser.nautilus"
@@ -562,9 +563,15 @@ gedit_file_browser_plugin_activate (GeditWindowActivatable *activatable)
        store = gedit_file_browser_widget_get_browser_store (priv->tree_widget);
 
        g_settings_bind (priv->settings,
-                        "filter-mode",
+                        FILEBROWSER_FILTER_MODE,
                         store,
-                        "filter-mode",
+                        FILEBROWSER_FILTER_MODE,
+                        G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
+
+       g_settings_bind (priv->settings,
+                        FILEBROWSER_BINARY_PATTERNS,
+                        store,
+                        FILEBROWSER_BINARY_PATTERNS,
                         G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
 
        g_signal_connect (store,
diff --git a/plugins/filebrowser/gedit-file-browser-store.c b/plugins/filebrowser/gedit-file-browser-store.c
index f845b5f..0b6fc8b 100644
--- a/plugins/filebrowser/gedit-file-browser-store.c
+++ b/plugins/filebrowser/gedit-file-browser-store.c
@@ -122,6 +122,9 @@ struct _GeditFileBrowserStorePrivate
        GeditFileBrowserStoreFilterFunc filter_func;
        gpointer filter_user_data;
 
+       gchar **binary_patterns;
+       GPtrArray *binary_pattern_specs;
+
        SortFunc sort_func;
 
        GSList *async_handles;
@@ -212,7 +215,8 @@ enum {
 
        PROP_ROOT,
        PROP_VIRTUAL_ROOT,
-       PROP_FILTER_MODE
+       PROP_FILTER_MODE,
+       PROP_BINARY_PATTERNS
 };
 
 /* Signals */
@@ -251,6 +255,12 @@ gedit_file_browser_store_finalize (GObject *object)
        /* Free all the nodes */
        file_browser_node_free (obj, obj->priv->root);
 
+       if (obj->priv->binary_patterns != NULL)
+       {
+               g_strfreev (obj->priv->binary_patterns);
+               g_ptr_array_unref (obj->priv->binary_pattern_specs);
+       }
+
        /* Cancel any asynchronous operations */
        for (item = obj->priv->async_handles; item; item = item->next)
        {
@@ -299,6 +309,9 @@ gedit_file_browser_store_get_property (GObject    *object,
                case PROP_FILTER_MODE:
                        g_value_set_flags (value, obj->priv->filter_mode);
                        break;
+               case PROP_BINARY_PATTERNS:
+                       g_value_set_boxed (value, obj->priv->binary_patterns);
+                       break;
                default:
                        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
                        break;
@@ -322,6 +335,10 @@ gedit_file_browser_store_set_property (GObject      *object,
                        gedit_file_browser_store_set_filter_mode (obj,
                                                                  g_value_get_flags (value));
                        break;
+               case PROP_BINARY_PATTERNS:
+                       gedit_file_browser_store_set_binary_patterns (obj,
+                                                                     g_value_get_boxed (value));
+                       break;
                default:
                        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
                        break;
@@ -354,11 +371,18 @@ gedit_file_browser_store_class_init (GeditFileBrowserStoreClass *klass)
 
        g_object_class_install_property (object_class, PROP_FILTER_MODE,
                                         g_param_spec_flags ("filter-mode",
-                                                             "Filter Mode",
-                                                             "The filter mode",
-                                                             GEDIT_TYPE_FILE_BROWSER_STORE_FILTER_MODE,
-                                                             
gedit_file_browser_store_filter_mode_get_default (),
-                                                             G_PARAM_READWRITE));
+                                                            "Filter Mode",
+                                                            "The filter mode",
+                                                            GEDIT_TYPE_FILE_BROWSER_STORE_FILTER_MODE,
+                                                            gedit_file_browser_store_filter_mode_get_default 
(),
+                                                            G_PARAM_READWRITE));
+
+       g_object_class_install_property (object_class, PROP_BINARY_PATTERNS,
+                                        g_param_spec_boxed ("binary-patterns",
+                                                            "Binary Patterns",
+                                                            "The binary patterns",
+                                                            G_TYPE_STRV,
+                                                            G_PARAM_READWRITE));
 
        model_signals[BEGIN_LOADING] =
            g_signal_new ("begin-loading",
@@ -1037,6 +1061,32 @@ model_node_update_visibility (GeditFileBrowserStore *model,
        {
                node->flags |= GEDIT_FILE_BROWSER_STORE_FLAG_IS_FILTERED;
        }
+       else if (FILTER_BINARY (model->priv->filter_mode) &&
+                model->priv->binary_patterns != NULL)
+       {
+               gint i;
+               gssize name_length;
+               gchar *name_reversed;
+
+               name_length = strlen (node->name);
+               name_reversed = g_utf8_strreverse (node->name, name_length);
+
+               for (i = 0; i < model->priv->binary_pattern_specs->len; ++i)
+               {
+                       GPatternSpec *spec;
+
+                       spec = g_ptr_array_index (model->priv->binary_pattern_specs, i);
+
+                       if (g_pattern_match (spec, name_length,
+                                            node->name, name_reversed))
+                       {
+                               node->flags |= GEDIT_FILE_BROWSER_STORE_FLAG_IS_FILTERED;
+                               break;
+                       }
+               }
+
+               g_free (name_reversed);
+       }
        else if (model->priv->filter_func)
        {
                iter.user_data = node;
@@ -3339,6 +3389,52 @@ gedit_file_browser_store_set_filter_func (GeditFileBrowserStore           *model
        model_refilter (model);
 }
 
+const gchar * const *
+gedit_file_browser_store_get_binary_patterns (GeditFileBrowserStore *model)
+{
+       return (const gchar * const *) model->priv->binary_patterns;
+}
+
+void
+gedit_file_browser_store_set_binary_patterns (GeditFileBrowserStore  *model,
+                                             const gchar           **binary_patterns)
+{
+       g_return_if_fail (GEDIT_IS_FILE_BROWSER_STORE (model));
+
+       if (model->priv->binary_patterns != NULL)
+       {
+               g_strfreev (model->priv->binary_patterns);
+               g_ptr_array_unref (model->priv->binary_pattern_specs);
+       }
+
+       model->priv->binary_patterns = g_strdupv ((gchar **) binary_patterns);
+
+       if (binary_patterns == NULL)
+       {
+               model->priv->binary_pattern_specs = NULL;
+       }
+       else
+       {
+               gint i;
+
+               model->priv->binary_pattern_specs = g_ptr_array_new ();
+               g_ptr_array_set_size (model->priv->binary_pattern_specs,
+                                     g_strv_length ((gchar **) binary_patterns));
+               g_ptr_array_set_free_func (model->priv->binary_pattern_specs,
+                                          (GDestroyNotify) g_pattern_spec_free);
+
+               for (i = 0; binary_patterns[i] != NULL; ++i)
+               {
+                       g_ptr_array_add (model->priv->binary_pattern_specs,
+                                        g_pattern_spec_new (binary_patterns[i]));
+               }
+       }
+
+       model_refilter (model);
+
+       g_object_notify (G_OBJECT (model), "binary-patterns");
+}
+
 void
 gedit_file_browser_store_refilter (GeditFileBrowserStore *model)
 {
diff --git a/plugins/filebrowser/gedit-file-browser-store.h b/plugins/filebrowser/gedit-file-browser-store.h
index d72aeef..e460b34 100644
--- a/plugins/filebrowser/gedit-file-browser-store.h
+++ b/plugins/filebrowser/gedit-file-browser-store.h
@@ -152,7 +152,7 @@ void                 gedit_file_browser_store_set_value             
(GeditFileBrowserStore            *tr
                                                                 gint                              column,
                                                                 GValue                           *value);
 
-void            _gedit_file_browser_store_iter_expanded                (GeditFileBrowserStore            
*model,
+void            _gedit_file_browser_store_iter_expanded        (GeditFileBrowserStore            *model,
                                                                 GtkTreeIter                      *iter);
 void            _gedit_file_browser_store_iter_collapsed       (GeditFileBrowserStore            *model,
                                                                 GtkTreeIter                      *iter);
@@ -164,6 +164,12 @@ void                gedit_file_browser_store_set_filter_mode       (GeditFileBrowserStore
 void            gedit_file_browser_store_set_filter_func       (GeditFileBrowserStore            *model,
                                                                 GeditFileBrowserStoreFilterFunc   func,
                                                                 gpointer                          user_data);
+
+const gchar * const *
+                 gedit_file_browser_store_get_binary_patterns  (GeditFileBrowserStore            *model);
+void            gedit_file_browser_store_set_binary_patterns   (GeditFileBrowserStore            *model,
+                                                                const gchar                     
**binary_patterns);
+
 void            gedit_file_browser_store_refilter              (GeditFileBrowserStore            *model);
 GeditFileBrowserStoreFilterMode
 gedit_file_browser_store_filter_mode_get_default               (void);
diff --git a/plugins/filebrowser/org.gnome.gedit.plugins.filebrowser.gschema.xml.in.in 
b/plugins/filebrowser/org.gnome.gedit.plugins.filebrowser.gschema.xml.in.in
index e79a6b9..63da5aa 100644
--- a/plugins/filebrowser/org.gnome.gedit.plugins.filebrowser.gschema.xml.in.in
+++ b/plugins/filebrowser/org.gnome.gedit.plugins.filebrowser.gschema.xml.in.in
@@ -35,6 +35,11 @@
       <_summary>File Browser Filter Pattern</_summary>
       <_description>The filter pattern to filter the file browser with. This filter works on top of the 
filter_mode.</_description>
     </key>
+    <key name="binary-patterns" type="as">
+      <default>['*.la', '*.lo']</default>
+      <_summary>File Browser Binary Patterns</_summary>
+      <_description>The supplemental patterns to use when when filtering binary files.</_description>
+    </key>
   </schema>
 
   <enum id="org.gnome.gedit.plugins.filebrowser.nautilus.ClickPolicy">


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]