From 37bd3f192cd2a4bfcb961c599c512beb1ef4a567 Mon Sep 17 00:00:00 2001 From: Thomas Leonard Date: Sun, 7 Mar 2004 15:45:20 +0000 Subject: [PATCH] r3359: Added 'Select by Name'. --- ROX-Filer/Help/Changes | 4 ++++ ROX-Filer/src/filer.c | 6 +++--- ROX-Filer/src/filer.h | 9 ++++---- ROX-Filer/src/global.h | 1 + ROX-Filer/src/menu.c | 1 + ROX-Filer/src/minibuffer.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 66 insertions(+), 8 deletions(-) diff --git a/ROX-Filer/Help/Changes b/ROX-Filer/Help/Changes index 08040587..6a4d876e 100644 --- a/ROX-Filer/Help/Changes +++ b/ROX-Filer/Help/Changes @@ -2,6 +2,10 @@ A RISC OS-like filer for X by Thomas Leonard +07-Mar-2004 +~~~~~~~~~~~ +Added 'Select by Name'. + 06-Mar-2004 ~~~~~~~~~~~ Cope with XRandR screen resizing (Geoff Youngs and Tom Morton). diff --git a/ROX-Filer/src/filer.c b/ROX-Filer/src/filer.c index 9711d182..9385c8e6 100644 --- a/ROX-Filer/src/filer.c +++ b/ROX-Filer/src/filer.c @@ -667,7 +667,7 @@ static gint pointer_out(GtkWidget *widget, /* Move the cursor to the next selected item in direction 'dir' * (+1 or -1). */ -static void next_selected(FilerWindow *filer_window, int dir) +void filer_next_selected(FilerWindow *filer_window, int dir) { ViewIter iter, cursor; gboolean have_cursor; @@ -948,10 +948,10 @@ gint filer_key_press_event(GtkWidget *widget, return_pressed(filer_window, event); break; case GDK_ISO_Left_Tab: - next_selected(filer_window, -1); + filer_next_selected(filer_window, -1); break; case GDK_Tab: - next_selected(filer_window, 1); + filer_next_selected(filer_window, 1); break; case GDK_BackSpace: change_to_parent(filer_window); diff --git a/ROX-Filer/src/filer.h b/ROX-Filer/src/filer.h index bdb73618..bf7a17a3 100644 --- a/ROX-Filer/src/filer.h +++ b/ROX-Filer/src/filer.h @@ -161,10 +161,9 @@ gint filer_key_press_event(GtkWidget *widget, GdkEventKey *event, void filer_set_autoscroll(FilerWindow *filer_window, gboolean auto_scroll); void filer_refresh(FilerWindow *filer_window); -extern gboolean filer_match_filter(FilerWindow *filer_window, - const gchar *filename); -extern void filer_set_filter(FilerWindow *filer_window, FilterType type, - const gchar *filter_string); -extern void filer_set_hidden(FilerWindow *fwin, gboolean hidden); +gboolean filer_match_filter(FilerWindow *filer_window, const gchar *filename); +void filer_set_filter(FilerWindow *filer_window, FilterType type, const gchar *filter_string); +void filer_set_hidden(FilerWindow *fwin, gboolean hidden); +void filer_next_selected(FilerWindow *filer_window, int dir); #endif /* _FILER_H */ diff --git a/ROX-Filer/src/global.h b/ROX-Filer/src/global.h index 3d3c058f..8ef3c8bd 100644 --- a/ROX-Filer/src/global.h +++ b/ROX-Filer/src/global.h @@ -107,6 +107,7 @@ typedef enum { MINI_SHELL, MINI_SELECT_IF, MINI_FILTER, + MINI_SELECT_BY_NAME, } MiniType; /* The next three correspond to the styles on the Display submenu: */ diff --git a/ROX-Filer/src/menu.c b/ROX-Filer/src/menu.c index ad8e5426..964ec3b4 100644 --- a/ROX-Filer/src/menu.c +++ b/ROX-Filer/src/menu.c @@ -218,6 +218,7 @@ static GtkItemFactoryEntry filer_menu_def[] = { {">" N_("Select All"), NULL, select_all, 0, NULL}, {">" N_("Clear Selection"), NULL, clear_selection, 0, NULL}, {">" N_("Invert Selection"), NULL, invert_selection, 0, NULL}, +{">" N_("Select by Name..."), "period", mini_buffer, MINI_SELECT_BY_NAME, NULL}, {">" N_("Select If..."), NULL, mini_buffer, MINI_SELECT_IF, NULL}, {N_("Options..."), NULL, menu_show_options, 0, "", GTK_STOCK_PREFERENCES}, {N_("New"), NULL, NULL, 0, ""}, diff --git a/ROX-Filer/src/minibuffer.c b/ROX-Filer/src/minibuffer.c index c42fe72f..c681a6b3 100644 --- a/ROX-Filer/src/minibuffer.c +++ b/ROX-Filer/src/minibuffer.c @@ -23,6 +23,7 @@ #include "config.h" +#include #include #include #include @@ -64,6 +65,7 @@ static void search_in_dir(FilerWindow *filer_window, int dir); static const gchar *mini_contents(FilerWindow *filer_window); static void show_help(FilerWindow *filer_window); static gboolean grab_focus(GtkWidget *minibuffer); +static gboolean select_if_glob(ViewIter *iter, gpointer data); /**************************************************************** * EXTERNAL INTERFACE * @@ -126,6 +128,7 @@ void minibuffer_show(FilerWindow *filer_window, MiniType mini_type) mini_type == MINI_PATH ? _("Goto:") : mini_type == MINI_SHELL ? _("Shell:") : mini_type == MINI_SELECT_IF ? _("Select If:") : + mini_type == MINI_SELECT_BY_NAME ? _("Select Named:") : mini_type == MINI_FILTER ? _("Pattern:") : "?"); @@ -148,6 +151,11 @@ void minibuffer_show(FilerWindow *filer_window, MiniType mini_type) gtk_entry_set_text(mini, ""); filer_window->mini_cursor_base = -1; /* History */ break; + case MINI_SELECT_BY_NAME: + gtk_entry_set_text(mini, "*."); + filer_window->mini_cursor_base = -1; /* History */ + view_select_if(filer_window->view, select_if_glob, "*."); + break; case MINI_FILTER: if(filer_window->filter!=FILER_SHOW_GLOB || !filer_window->filter_string) @@ -259,6 +267,15 @@ static void show_help(FilerWindow *filer_window) _("Enter a shell command to execute. Click " "on a file to add it to the buffer.")); break; + case MINI_SELECT_BY_NAME: + info_message( + _("Enter a file name pattern to select all matching files:\n\n" + "? means any character\n" + "* means zero or more characters\n" + "[aA] means 'a' or 'A'\n" + "[a-z] means any character from a to z (lowercase)\n" + "*.png means any name ending in '.png')")); + break; case MINI_SELECT_IF: show_condition_help(NULL); break; @@ -943,6 +960,25 @@ static gint key_press_event(GtkWidget *widget, return FALSE; } break; + case MINI_SELECT_BY_NAME: + switch (event->keyval) + { + case GDK_Up: + filer_next_selected(filer_window, -1); + break; + case GDK_Down: + filer_next_selected(filer_window, 1); + break; + case GDK_Tab: + break; + case GDK_Return: + case GDK_KP_Enter: + minibuffer_hide(filer_window); + break; + default: + return FALSE; + } + break; case MINI_FILTER: switch (event->keyval) @@ -963,6 +999,17 @@ static gint key_press_event(GtkWidget *widget, return TRUE; } +static gboolean select_if_glob(ViewIter *iter, gpointer data) +{ + DirItem *item; + const char *pattern = (char *) data; + + item = iter->peek(iter); + g_return_val_if_fail(item != NULL, FALSE); + + return fnmatch(pattern, item->leafname, 0) == 0; +} + static void changed(GtkEditable *mini, FilerWindow *filer_window) { switch (filer_window->mini_type) @@ -975,6 +1022,12 @@ static void changed(GtkEditable *mini, FilerWindow *filer_window) gtk_entry_get_text( GTK_ENTRY(filer_window->minibuffer))); return; + case MINI_SELECT_BY_NAME: + view_select_if(filer_window->view, + select_if_glob, + (gpointer) gtk_entry_get_text( + GTK_ENTRY(filer_window->minibuffer))); + return; default: break; } -- 2.11.4.GIT