Revision: 2518 http://geany.svn.sourceforge.net/geany/?rev=2518&view=rev Author: eht16 Date: 2008-04-22 08:14:30 -0700 (Tue, 22 Apr 2008)
Log Message: ----------- Add file filter text entry (patch by Robert McGinley, thanks).
Modified Paths: -------------- trunk/ChangeLog trunk/plugins/filebrowser.c
Modified: trunk/ChangeLog =================================================================== --- trunk/ChangeLog 2008-04-22 15:04:50 UTC (rev 2517) +++ trunk/ChangeLog 2008-04-22 15:14:30 UTC (rev 2518) @@ -9,6 +9,8 @@ Make use of ngettext() for strings with plural forms. * Makefile.am: Add target "sign" to sign generated tarballs with gpg. + * plugins/filebrowser.c: + Add file filter text entry (patch by Robert McGinley, thanks).
2008-04-20 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
Modified: trunk/plugins/filebrowser.c =================================================================== --- trunk/plugins/filebrowser.c 2008-04-22 15:04:50 UTC (rev 2517) +++ trunk/plugins/filebrowser.c 2008-04-22 15:14:30 UTC (rev 2518) @@ -83,10 +83,12 @@ static GtkTreeIter *last_dir_iter = NULL; static GtkEntryCompletion *entry_completion = NULL;
+static GtkWidget *filter_entry; static GtkWidget *path_entry; static gchar *current_dir = NULL; /* in locale-encoding */ static gchar *open_cmd; /* in locale-encoding */ static gchar *config_file; +static gchar *filter = NULL;
static struct { @@ -128,6 +130,21 @@ }
+/* Returns: whether name has been removed by filter. */ +static gboolean check_filtered(const gchar *base_name) +{ + if (filter == NULL) + return FALSE; + + if (! p_utils->str_equal(base_name, "*") && ! g_pattern_match_simple(filter, base_name)) + { + return TRUE; + } + + return FALSE; +} + + /* name is in locale encoding */ static void add_item(const gchar *name) { @@ -138,6 +155,9 @@ if (! show_hidden_files && check_hidden(name)) return;
+ if (check_filtered(name)) + return; + fname = g_strconcat(current_dir, G_DIR_SEPARATOR_S, name, NULL); dir = g_file_test(fname, G_FILE_TEST_IS_DIR); g_free(fname); @@ -623,6 +643,16 @@ }
+static void on_clear_filter(GtkEntry *entry, gpointer user_data) +{ + setptr(filter, NULL); + + gtk_entry_set_text(GTK_ENTRY(filter_entry), ""); + + refresh(); +} + + static void on_path_entry_activate(GtkEntry *entry, gpointer user_data) { gchar *new_dir = (gchar*) gtk_entry_get_text(entry); @@ -640,6 +670,20 @@ new_dir = g_strdup(g_get_home_dir());
setptr(current_dir, new_dir); + + on_clear_filter(NULL, NULL); +} + + +static void on_filter_activate(GtkEntry *entry, gpointer user_data) +{ + setptr(filter, g_strdup(gtk_entry_get_text(entry))); + + if (! NZV(filter)) + { + setptr(filter, g_strdup("*")); + } + refresh(); }
@@ -720,10 +764,33 @@ g_signal_connect(G_OBJECT(wid), "clicked", G_CALLBACK(on_current_path), NULL); gtk_container_add(GTK_CONTAINER(toolbar), wid);
+ wid = (GtkWidget *) gtk_tool_button_new_from_stock(GTK_STOCK_CLEAR); + gtk_tool_item_set_tooltip(GTK_TOOL_ITEM(wid), tooltips, _("Clear the filter"), NULL); + g_signal_connect(G_OBJECT(wid), "clicked", G_CALLBACK(on_clear_filter), NULL); + gtk_container_add(GTK_CONTAINER(toolbar), wid); + return toolbar; }
+static GtkWidget *make_filterbar(void) +{ + GtkWidget *label, *filterbar; + + filterbar = gtk_hbox_new(FALSE, 1); + + label = gtk_label_new(_("Filter:")); + + filter_entry = gtk_entry_new(); + g_signal_connect(G_OBJECT(filter_entry), "activate", G_CALLBACK(on_filter_activate), NULL); + + gtk_box_pack_start(GTK_BOX(filterbar), label, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(filterbar), filter_entry, TRUE, TRUE, 0); + + return filterbar; +} + + static gboolean completion_match_func(GtkEntryCompletion *completion, const gchar *key, GtkTreeIter *iter, gpointer user_data) { @@ -837,12 +904,17 @@
void init(GeanyData *data) { - GtkWidget *scrollwin, *toolbar; + GtkWidget *scrollwin, *toolbar, *filterbar;
+ filter = NULL; + file_view_vbox = gtk_vbox_new(FALSE, 0); toolbar = make_toolbar(); gtk_box_pack_start(GTK_BOX(file_view_vbox), toolbar, FALSE, FALSE, 0);
+ filterbar = make_filterbar(); + gtk_box_pack_start(GTK_BOX(file_view_vbox), filterbar, FALSE, FALSE, 0); + path_entry = gtk_entry_new(); gtk_box_pack_start(GTK_BOX(file_view_vbox), path_entry, FALSE, FALSE, 2); g_signal_connect(G_OBJECT(path_entry), "activate", G_CALLBACK(on_path_entry_activate), NULL); @@ -961,6 +1033,7 @@ { g_free(config_file); g_free(open_cmd); + g_free(filter); gtk_widget_destroy(file_view_vbox); g_object_unref(G_OBJECT(entry_completion)); }
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.