SF.net SVN: geany: [999] trunk
ntrel at users.sourceforge.net
ntrel at xxxxx
Wed Nov 15 15:57:24 UTC 2006
Revision: 999
http://svn.sourceforge.net/geany/?rev=999&view=rev
Author: ntrel
Date: 2006-11-15 07:57:23 -0800 (Wed, 15 Nov 2006)
Log Message:
-----------
Add search history for Find in Files.
Add ui_combo_box_add_to_history() and use to prevent blocks of
duplicates (but not all duplicates) from search history combo boxes,
and limit history to 30 entries.
Modified Paths:
--------------
trunk/ChangeLog
trunk/src/search.c
trunk/src/ui_utils.c
trunk/src/ui_utils.h
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog 2006-11-14 23:42:13 UTC (rev 998)
+++ trunk/ChangeLog 2006-11-15 15:57:23 UTC (rev 999)
@@ -1,3 +1,12 @@
+2006-11-15 Nick Treleaven <nick.treleaven at btinternet.com>
+
+ * src/ui_utils.h, src/search.c, src/ui_utils.c:
+ Add search history for Find in Files.
+ Add ui_combo_box_add_to_history() and use to prevent blocks of
+ duplicates (but not all duplicates) from search history combo boxes,
+ and limit history to 30 entries.
+
+
2006-11-14 Enrico Tröger <enrico.troeger at uvena.de>
* scintilla/LexPascal.c: Tried to fix wrong styling at "end.".
Modified: trunk/src/search.c
===================================================================
--- trunk/src/search.c 2006-11-14 23:42:13 UTC (rev 998)
+++ trunk/src/search.c 2006-11-15 15:57:23 UTC (rev 999)
@@ -108,7 +108,7 @@
on_replace_entry_activate(GtkEntry *entry, gpointer user_data);
static gboolean
-on_combo_entry_key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer user_data);
+on_widget_key_pressed_set_focus(GtkWidget *widget, GdkEventKey *event, gpointer user_data);
static void
on_find_in_files_dialog_response(GtkDialog *dialog, gint response, gpointer user_data);
@@ -404,8 +404,9 @@
g_object_set_data_full(G_OBJECT(widgets.replace_dialog), "entry_replace",
gtk_widget_ref(entry_replace), (GDestroyNotify)gtk_widget_unref);
- g_signal_connect((gpointer) gtk_bin_get_child(GTK_BIN(entry_find)), "key-press-event",
- G_CALLBACK(on_combo_entry_key_pressed), gtk_bin_get_child(GTK_BIN(entry_replace)));
+ g_signal_connect((gpointer) gtk_bin_get_child(GTK_BIN(entry_find)),
+ "key-press-event", G_CALLBACK(on_widget_key_pressed_set_focus),
+ gtk_bin_get_child(GTK_BIN(entry_replace)));
g_signal_connect((gpointer) gtk_bin_get_child(GTK_BIN(entry_replace)), "activate",
G_CALLBACK(on_replace_entry_activate), NULL);
g_signal_connect((gpointer) widgets.replace_dialog, "response",
@@ -485,8 +486,8 @@
void search_show_find_in_files_dialog()
{
static GtkWidget *combo = NULL;
- static GtkWidget *entry1;
- GtkWidget *entry2; // the child GtkEntry of combo
+ static GtkWidget *dir_combo;
+ GtkWidget *entry; // the child GtkEntry of combo (or dir_combo)
GtkWidget *dirbtn, *openimg;
gint idx = document_get_cur_idx();
gchar *sel = NULL;
@@ -494,8 +495,6 @@
if (idx == -1 || ! doc_list[idx].is_valid) return;
- cur_dir = utils_get_current_file_dir();
-
if (widgets.find_in_files_dialog == NULL)
{
GtkWidget *label, *label1, *checkbox1, *checkbox2, *check_wholeword;
@@ -516,11 +515,12 @@
label1 = gtk_label_new(_("Directory:"));
gtk_misc_set_alignment(GTK_MISC(label1), 0, 0.5);
- entry1 = gtk_entry_new();
- gtk_entry_set_max_length(GTK_ENTRY(entry1), 248);
- gtk_entry_set_width_chars(GTK_ENTRY(entry1), 50);
- g_object_set_data_full(G_OBJECT(widgets.find_in_files_dialog), "entry_dir",
- gtk_widget_ref(entry1), (GDestroyNotify)gtk_widget_unref);
+ dir_combo = gtk_combo_box_entry_new_text();
+ entry = gtk_bin_get_child(GTK_BIN(dir_combo));
+ gtk_entry_set_max_length(GTK_ENTRY(entry), 248);
+ gtk_entry_set_width_chars(GTK_ENTRY(entry), 50);
+ g_object_set_data_full(G_OBJECT(widgets.find_in_files_dialog), "dir_combo",
+ gtk_widget_ref(dir_combo), (GDestroyNotify)gtk_widget_unref);
dirbtn = gtk_button_new();
openimg = gtk_image_new_from_stock(GTK_STOCK_OPEN, GTK_ICON_SIZE_BUTTON);
@@ -530,17 +530,17 @@
dbox = gtk_hbox_new(FALSE, 6);
gtk_box_pack_start(GTK_BOX(dbox), label1, FALSE, FALSE, 0);
- gtk_box_pack_start(GTK_BOX(dbox), entry1, TRUE, TRUE, 0);
+ gtk_box_pack_start(GTK_BOX(dbox), dir_combo, TRUE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(dbox), dirbtn, FALSE, FALSE, 0);
label = gtk_label_new(_("Search for:"));
gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
combo = gtk_combo_box_entry_new_text();
- entry2 = gtk_bin_get_child(GTK_BIN(combo));
- gtk_entry_set_max_length(GTK_ENTRY(entry2), 248);
- gtk_entry_set_width_chars(GTK_ENTRY(entry2), 50);
- gtk_entry_set_activates_default(GTK_ENTRY(entry2), TRUE);
+ entry = gtk_bin_get_child(GTK_BIN(combo));
+ gtk_entry_set_max_length(GTK_ENTRY(entry), 248);
+ gtk_entry_set_width_chars(GTK_ENTRY(entry), 50);
+ gtk_entry_set_activates_default(GTK_ENTRY(entry), TRUE);
sbox = gtk_hbox_new(FALSE, 6);
gtk_box_pack_start(GTK_BOX(sbox), label, FALSE, FALSE, 0);
@@ -603,12 +603,12 @@
gtk_container_add(GTK_CONTAINER(hbox), rbox);
gtk_container_add(GTK_CONTAINER(hbox), cbox);
- gtk_container_add(GTK_CONTAINER(vbox), dbox);
- gtk_container_add(GTK_CONTAINER(vbox), sbox);
+ gtk_box_pack_start(GTK_BOX(vbox), dbox, TRUE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(vbox), sbox, TRUE, FALSE, 0);
gtk_container_add(GTK_CONTAINER(vbox), hbox);
- g_signal_connect((gpointer) entry1, "key-press-event",
- G_CALLBACK(on_combo_entry_key_pressed), gtk_bin_get_child(GTK_BIN(combo)));
+ g_signal_connect((gpointer) dir_combo, "key-press-event",
+ G_CALLBACK(on_widget_key_pressed_set_focus), combo);
g_signal_connect((gpointer) widgets.find_in_files_dialog, "response",
G_CALLBACK(on_find_in_files_dialog_response), combo);
g_signal_connect((gpointer) widgets.find_in_files_dialog, "delete_event",
@@ -619,18 +619,23 @@
sel = get_default_text(idx);
- entry2 = GTK_BIN(combo)->child;
- if (sel) gtk_entry_set_text(GTK_ENTRY(entry2), sel);
+ entry = GTK_BIN(combo)->child;
+ if (sel) gtk_entry_set_text(GTK_ENTRY(entry), sel);
g_free(sel);
- if (cur_dir) gtk_entry_set_text(GTK_ENTRY(entry1), cur_dir);
- g_free(cur_dir);
+ entry = GTK_BIN(dir_combo)->child;
+ cur_dir = utils_get_current_file_dir();
+ if (cur_dir)
+ {
+ gtk_entry_set_text(GTK_ENTRY(entry), cur_dir);
+ g_free(cur_dir);
+ }
// put the focus to the directory entry if it is empty
- if (utils_str_equal(gtk_entry_get_text(GTK_ENTRY(entry1)), ""))
- gtk_widget_grab_focus(entry1);
+ if (utils_str_equal(gtk_entry_get_text(GTK_ENTRY(entry)), ""))
+ gtk_widget_grab_focus(dir_combo);
else
- gtk_widget_grab_focus(entry2);
+ gtk_widget_grab_focus(combo);
gtk_widget_show(widgets.find_in_files_dialog);
}
@@ -642,7 +647,9 @@
GTK_WINDOW(app->window), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
GTK_STOCK_OPEN, GTK_RESPONSE_OK, NULL);
- GtkWidget *entry_dir = lookup_widget(widgets.find_in_files_dialog, "entry_dir");
+ GtkWidget *dir_combo =
+ lookup_widget(widgets.find_in_files_dialog, "dir_combo");
+ GtkWidget *entry_dir = gtk_bin_get_child(GTK_BIN(dir_combo));
gchar *dir_locale;
const gchar *entry_text;
@@ -750,7 +757,7 @@
return;
}
- gtk_combo_box_prepend_text(GTK_COMBO_BOX(user_data), search_data.text);
+ ui_combo_box_add_to_history(GTK_COMBO_BOX(user_data), search_data.text);
search_data.flags = (fl1 ? SCFIND_MATCHCASE : 0) |
(fl2 ? SCFIND_WHOLEWORD : 0) |
(fl3 ? SCFIND_REGEXP | SCFIND_POSIX: 0) |
@@ -832,8 +839,8 @@
return;
}
- gtk_combo_box_prepend_text(GTK_COMBO_BOX(entry_find), find);
- gtk_combo_box_prepend_text(GTK_COMBO_BOX(entry_replace), replace);
+ ui_combo_box_add_to_history(GTK_COMBO_BOX(entry_find), find);
+ ui_combo_box_add_to_history(GTK_COMBO_BOX(entry_replace), replace);
if (search_replace_escape_re &&
(! utils_str_replace_escape(find) || ! utils_str_replace_escape(replace)))
@@ -904,7 +911,7 @@
static gboolean
-on_combo_entry_key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer user_data)
+on_widget_key_pressed_set_focus(GtkWidget *widget, GdkEventKey *event, gpointer user_data)
{
// catch tabulator key to set the focus in the replace entry instead of
// setting it to the combo box
@@ -924,8 +931,10 @@
{
const gchar *search_text =
gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(user_data))));
+ GtkWidget *dir_combo =
+ lookup_widget(widgets.find_in_files_dialog, "dir_combo");
const gchar *utf8_dir =
- gtk_entry_get_text(GTK_ENTRY(lookup_widget(widgets.find_in_files_dialog, "entry_dir")));
+ gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(dir_combo))));
if (utf8_dir == NULL || utils_str_equal(utf8_dir, ""))
msgwin_status_add(_("Invalid directory for find in files."));
@@ -951,7 +960,8 @@
if (search_find_in_files(search_text, locale_dir, regex_opt, opts))
{
- gtk_combo_box_prepend_text(GTK_COMBO_BOX(user_data), search_text);
+ ui_combo_box_add_to_history(GTK_COMBO_BOX(user_data), search_text);
+ ui_combo_box_add_to_history(GTK_COMBO_BOX(dir_combo), utf8_dir);
gtk_widget_hide(widgets.find_in_files_dialog);
}
g_free(locale_dir);
Modified: trunk/src/ui_utils.c
===================================================================
--- trunk/src/ui_utils.c 2006-11-14 23:42:13 UTC (rev 998)
+++ trunk/src/ui_utils.c 2006-11-15 15:57:23 UTC (rev 999)
@@ -1083,3 +1083,34 @@
}
+/* Prepends the active text to the drop down list, unless the first element in
+ * the list is identical, ensuring there are <= history_len elements. */
+void ui_combo_box_add_to_history(GtkComboBox *combo, const gchar *text)
+{
+ const gint history_len = 30;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ gchar *combo_text;
+ gboolean equal = FALSE;
+ GtkTreePath *path;
+
+ model = gtk_combo_box_get_model(combo);
+ if (gtk_tree_model_get_iter_first(model, &iter))
+ {
+ gtk_tree_model_get(model, &iter, 0, &combo_text, -1);
+ equal = utils_str_equal(combo_text, text);
+ g_free(combo_text);
+ }
+ if (equal) return; // don't prepend duplicate
+
+ gtk_combo_box_prepend_text(combo, text);
+
+ // limit history
+ path = gtk_tree_path_new_from_indices(history_len, -1);
+ if (gtk_tree_model_get_iter(model, &iter, path))
+ {
+ gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
+ }
+ gtk_tree_path_free(path);
+}
+
Modified: trunk/src/ui_utils.h
===================================================================
--- trunk/src/ui_utils.h 2006-11-14 23:42:13 UTC (rev 998)
+++ trunk/src/ui_utils.h 2006-11-15 15:57:23 UTC (rev 999)
@@ -101,4 +101,6 @@
void ui_hbutton_box_copy_layout(GtkButtonBox *master, GtkButtonBox *copy);
+void ui_combo_box_add_to_history(GtkComboBox *combo, const gchar *text);
+
#endif
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Commits
mailing list