Revision: 5621 http://geany.svn.sourceforge.net/geany/?rev=5621&view=rev Author: colombanw Date: 2011-03-24 16:51:02 +0000 (Thu, 24 Mar 2011)
Log Message: ----------- Make Shift-Enter in search dialog and toolbar search entries search backwards
Modified Paths: -------------- trunk/ChangeLog trunk/doc/geany.html trunk/doc/geany.txt trunk/src/callbacks.c trunk/src/callbacks.h trunk/src/document.c trunk/src/document.h trunk/src/geanyentryaction.c trunk/src/search.c trunk/src/toolbar.c trunk/src/ui_utils.c trunk/src/ui_utils.h
Modified: trunk/ChangeLog =================================================================== --- trunk/ChangeLog 2011-03-24 16:34:10 UTC (rev 5620) +++ trunk/ChangeLog 2011-03-24 16:51:02 UTC (rev 5621) @@ -8,6 +8,11 @@
* doc/geany.txt, doc/geany.html: Update the documentation to talk about real-time tag parsing. + * doc/geany.txt, doc/geany.html, src/callbacks.c, src/callbacks.h, + src/document.c, src/document.h, src/geanyentryaction.c, + src/search.c, src/toolbar.c, src/ui_utils.c, src/ui_utils.h: + Make Shift-Enter in search dialog and toolbar search entries search + backwards.
2011-03-22 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com>
Modified: trunk/doc/geany.html =================================================================== --- trunk/doc/geany.html 2011-03-24 16:34:10 UTC (rev 5620) +++ trunk/doc/geany.html 2011-03-24 16:51:02 UTC (rev 5621) @@ -1578,7 +1578,8 @@ <h4><a class="toc-backref" href="#id60">Search bar</a></h4> <p>The quickest way to find some text is to use the search bar entry in the toolbar. This performs a case-insensitive search in the current -document whilst you type. Pressing Enter will search again.</p> +document whilst you type. Pressing Enter will search again, and pressing +Shift-Enter will search backwards.</p> </div> </div> <div class="section" id="find"> @@ -6483,7 +6484,7 @@ <div class="footer"> <hr class="footer" /> <a class="reference external" href="geany.txt">View document source</a>. -Generated on: 2011-03-24 02:06 UTC. +Generated on: 2011-03-24 16:40 UTC. Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
</div>
Modified: trunk/doc/geany.txt =================================================================== --- trunk/doc/geany.txt 2011-03-24 16:34:10 UTC (rev 5620) +++ trunk/doc/geany.txt 2011-03-24 16:51:02 UTC (rev 5621) @@ -1167,7 +1167,8 @@ `````````` The quickest way to find some text is to use the search bar entry in the toolbar. This performs a case-insensitive search in the current -document whilst you type. Pressing Enter will search again. +document whilst you type. Pressing Enter will search again, and pressing +Shift-Enter will search backwards.
Find ^^^^
Modified: trunk/src/callbacks.c =================================================================== --- trunk/src/callbacks.c 2011-03-24 16:34:10 UTC (rev 5620) +++ trunk/src/callbacks.c 2011-03-24 16:51:02 UTC (rev 5621) @@ -535,24 +535,22 @@
/* store text, clear search flags so we can use Search->Find Next/Previous */ -static void setup_find_next(const gchar *text) +static void setup_find(const gchar *text, gboolean backwards) { setptr(search_data.text, g_strdup(text)); search_data.flags = 0; - search_data.backwards = FALSE; + search_data.backwards = backwards; search_data.search_bar = TRUE; }
-/* search text */ -void -on_toolbar_search_entry_changed(GtkAction *action, const gchar *text, gpointer user_data) +static void do_toolbar_search(const gchar *text, gboolean incremental, gboolean backwards) { GeanyDocument *doc = document_get_current(); gboolean result;
- setup_find_next(text); - result = document_search_bar_find(doc, search_data.text, 0, GPOINTER_TO_INT(user_data)); + setup_find(text, backwards); + result = document_search_bar_find(doc, search_data.text, 0, incremental, backwards); if (search_data.search_bar) ui_set_search_entry_background(toolbar_get_widget_child_by_name("SearchEntry"), result); } @@ -560,6 +558,22 @@
/* search text */ void +on_toolbar_search_entry_changed(GtkAction *action, const gchar *text, gpointer user_data) +{ + do_toolbar_search(text, TRUE, FALSE); +} + + +/* search text */ +void +on_toolbar_search_entry_activate(GtkAction *action, const gchar *text, gpointer user_data) +{ + do_toolbar_search(text, FALSE, GPOINTER_TO_INT(user_data)); +} + + +/* search text */ +void on_toolbutton_search_clicked (GtkAction *action, gpointer user_data) { @@ -571,8 +585,8 @@ { const gchar *text = gtk_entry_get_text(GTK_ENTRY(entry));
- setup_find_next(text); - result = document_search_bar_find(doc, search_data.text, 0, FALSE); + setup_find(text, FALSE); + result = document_search_bar_find(doc, search_data.text, 0, FALSE, FALSE); if (search_data.search_bar) ui_set_search_entry_background(entry, result); }
Modified: trunk/src/callbacks.h =================================================================== --- trunk/src/callbacks.h 2011-03-24 16:34:10 UTC (rev 5620) +++ trunk/src/callbacks.h 2011-03-24 16:51:02 UTC (rev 5621) @@ -143,6 +143,11 @@ gpointer user_data);
void +on_toolbar_search_entry_activate (GtkAction *action, + const gchar *text, + gpointer user_data); + +void on_toggle_case1_activate (GtkMenuItem *menuitem, gpointer user_data);
Modified: trunk/src/document.c =================================================================== --- trunk/src/document.c 2011-03-24 16:34:10 UTC (rev 5620) +++ trunk/src/document.c 2011-03-24 16:51:02 UTC (rev 5621) @@ -1826,7 +1826,8 @@ /* special search function, used from the find entry in the toolbar * return TRUE if text was found otherwise FALSE * return also TRUE if text is empty */ -gboolean document_search_bar_find(GeanyDocument *doc, const gchar *text, gint flags, gboolean inc) +gboolean document_search_bar_find(GeanyDocument *doc, const gchar *text, gint flags, gboolean inc, + gboolean backwards) { gint start_pos, search_pos; struct Sci_TextToFind ttf; @@ -1836,20 +1837,28 @@ if (! *text) return TRUE;
- start_pos = (inc) ? sci_get_selection_start(doc->editor->sci) : + start_pos = (inc || backwards) ? sci_get_selection_start(doc->editor->sci) : sci_get_selection_end(doc->editor->sci); /* equal if no selection */
- /* search cursor to end */ + /* search cursor to end or start */ ttf.chrg.cpMin = start_pos; - ttf.chrg.cpMax = sci_get_length(doc->editor->sci); + ttf.chrg.cpMax = backwards ? 0 : sci_get_length(doc->editor->sci); ttf.lpstrText = (gchar *)text; search_pos = sci_find_text(doc->editor->sci, flags, &ttf);
- /* if no match, search start to cursor */ + /* if no match, search start (or end) to cursor */ if (search_pos == -1) { - ttf.chrg.cpMin = 0; - ttf.chrg.cpMax = start_pos + strlen(text); + if (backwards) + { + ttf.chrg.cpMin = sci_get_length(doc->editor->sci); + ttf.chrg.cpMax = start_pos; + } + else + { + ttf.chrg.cpMin = 0; + ttf.chrg.cpMax = start_pos + strlen(text); + } search_pos = sci_find_text(doc->editor->sci, flags, &ttf); }
Modified: trunk/src/document.h =================================================================== --- trunk/src/document.h 2011-03-24 16:34:10 UTC (rev 5620) +++ trunk/src/document.h 2011-03-24 16:51:02 UTC (rev 5621) @@ -214,7 +214,8 @@ void document_open_files(const GSList *filenames, gboolean readonly, GeanyFiletype *ft, const gchar *forced_enc);
-gboolean document_search_bar_find(GeanyDocument *doc, const gchar *text, gint flags, gboolean inc); +gboolean document_search_bar_find(GeanyDocument *doc, const gchar *text, gint flags, gboolean inc, + gboolean backwards);
gint document_find_text(GeanyDocument *doc, const gchar *text, gint flags, gboolean search_backwards, gboolean scroll, GtkWidget *parent);
Modified: trunk/src/geanyentryaction.c =================================================================== --- trunk/src/geanyentryaction.c 2011-03-24 16:34:10 UTC (rev 5620) +++ trunk/src/geanyentryaction.c 2011-03-24 16:51:02 UTC (rev 5621) @@ -47,6 +47,7 @@ enum { ENTRY_ACTIVATE, + ENTRY_ACTIVATE_BACKWARD, ENTRY_CHANGED,
LAST_SIGNAL @@ -67,6 +68,7 @@ gtk_entry_set_width_chars(GTK_ENTRY(priv->entry), 9);
ui_entry_add_clear_icon(GTK_ENTRY(priv->entry)); + ui_entry_add_activate_backward_signal(GTK_ENTRY(priv->entry));
gtk_widget_show(priv->entry);
@@ -86,6 +88,15 @@ }
+static void delegate_entry_activate_backward_cb(GtkEntry *entry, GeanyEntryAction *action) +{ + GeanyEntryActionPrivate *priv = GEANY_ENTRY_ACTION_GET_PRIVATE(action); + const gchar *text = gtk_entry_get_text(GTK_ENTRY(priv->entry)); + + g_signal_emit(action, signals[ENTRY_ACTIVATE_BACKWARD], 0, text); +} + + static void delegate_entry_changed_cb(GtkEditable *editable, GeanyEntryAction *action) { GeanyEntryActionPrivate *priv = GEANY_ENTRY_ACTION_GET_PRIVATE(action); @@ -104,8 +115,10 @@ G_CALLBACK(ui_editable_insert_text_callback), NULL); g_signal_connect(priv->entry, "changed", G_CALLBACK(delegate_entry_changed_cb), action); g_signal_connect(priv->entry, "activate", G_CALLBACK(delegate_entry_activate_cb), action); + g_signal_connect(priv->entry, "activate-backward", + G_CALLBACK(delegate_entry_activate_backward_cb), action);
- GTK_ACTION_CLASS(geany_entry_action_parent_class)->connect_proxy(action, widget); + GTK_ACTION_CLASS(geany_entry_action_parent_class)->connect_proxy(action, widget); }
@@ -121,18 +134,26 @@
signals[ENTRY_CHANGED] = g_signal_new("entry-changed", G_TYPE_FROM_CLASS(klass), - (GSignalFlags) 0, + G_SIGNAL_RUN_LAST, 0, - 0, NULL, + NULL, g_cclosure_marshal_VOID__STRING, G_TYPE_NONE, 1, G_TYPE_STRING); signals[ENTRY_ACTIVATE] = g_signal_new("entry-activate", G_TYPE_FROM_CLASS(klass), - (GSignalFlags) 0, + G_SIGNAL_RUN_LAST, 0, + NULL, + NULL, + g_cclosure_marshal_VOID__STRING, + G_TYPE_NONE, 1, G_TYPE_STRING); + signals[ENTRY_ACTIVATE_BACKWARD] = g_signal_new("entry-activate-backward", + G_TYPE_FROM_CLASS(klass), + G_SIGNAL_RUN_LAST, 0, NULL, + NULL, g_cclosure_marshal_VOID__STRING, G_TYPE_NONE, 1, G_TYPE_STRING); }
Modified: trunk/src/search.c =================================================================== --- trunk/src/search.c 2011-03-24 16:34:10 UTC (rev 5620) +++ trunk/src/search.c 2011-03-24 16:51:02 UTC (rev 5621) @@ -160,6 +160,9 @@ on_find_entry_activate(GtkEntry *entry, gpointer user_data);
static void +on_find_entry_activate_backward(GtkEntry *entry, gpointer user_data); + +static void on_replace_dialog_response(GtkDialog *dialog, gint response, gpointer user_data);
static void @@ -476,6 +479,9 @@
g_signal_connect(gtk_bin_get_child(GTK_BIN(entry)), "activate", G_CALLBACK(on_find_entry_activate), NULL); + ui_entry_add_activate_backward_signal(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(entry)))); + g_signal_connect(gtk_bin_get_child(GTK_BIN(entry)), "activate-backward", + G_CALLBACK(on_find_entry_activate_backward), NULL); g_signal_connect(find_dlg.dialog, "response", G_CALLBACK(on_find_dialog_response), entry); g_signal_connect(find_dlg.dialog, "delete-event", @@ -1109,6 +1115,18 @@ }
+static void +on_find_entry_activate_backward(GtkEntry *entry, gpointer user_data) +{ + /* can't search backwards with a regexp */ + if (search_data.flags & SCFIND_REGEXP) + utils_beep(); + else + on_find_dialog_response(NULL, GEANY_RESPONSE_FIND_PREVIOUS, + ui_lookup_widget(GTK_WIDGET(entry), "entry")); +} + + #define int_search_flags(match_case, whole_word, regexp, word_start) \ ((match_case ? SCFIND_MATCHCASE : 0) | \ (whole_word ? SCFIND_WHOLEWORD : 0) | \
Modified: trunk/src/toolbar.c =================================================================== --- trunk/src/toolbar.c 2011-03-24 16:34:10 UTC (rev 5620) +++ trunk/src/toolbar.c 2011-03-24 16:51:02 UTC (rev 5621) @@ -381,9 +381,11 @@ action_searchentry = geany_entry_action_new( "SearchEntry", _("Search"), _("Find the entered text in the current file"), FALSE); g_signal_connect(action_searchentry, "entry-activate", - G_CALLBACK(on_toolbar_search_entry_changed), GINT_TO_POINTER(FALSE)); + G_CALLBACK(on_toolbar_search_entry_activate), GINT_TO_POINTER(FALSE)); + g_signal_connect(action_searchentry, "entry-activate-backward", + G_CALLBACK(on_toolbar_search_entry_activate), GINT_TO_POINTER(TRUE)); g_signal_connect(action_searchentry, "entry-changed", - G_CALLBACK(on_toolbar_search_entry_changed), GINT_TO_POINTER(TRUE)); + G_CALLBACK(on_toolbar_search_entry_changed), NULL); gtk_action_group_add_action(group, action_searchentry);
action_gotoentry = geany_entry_action_new(
Modified: trunk/src/ui_utils.c =================================================================== --- trunk/src/ui_utils.c 2011-03-24 16:34:10 UTC (rev 5620) +++ trunk/src/ui_utils.c 2011-03-24 16:51:02 UTC (rev 5621) @@ -1436,6 +1436,35 @@ }
+/* Adds a :activate-backwards signal emitted by default when <Shift>Return is pressed */ +void ui_entry_add_activate_backward_signal(GtkEntry *entry) +{ + static gboolean installed = FALSE; + + g_return_if_fail(GTK_IS_ENTRY(entry)); + + if (G_UNLIKELY(! installed)) + { + GtkBindingSet *binding_set; + + installed = TRUE; + + /* try to handle the unexpected case where GTK would already have installed the signal */ + if (g_signal_lookup("activate-backward", G_TYPE_FROM_INSTANCE(entry))) + { + g_warning("Signal GtkEntry:activate-backward is unexpectedly already installed"); + return; + } + + g_signal_new("activate-backward", G_TYPE_FROM_INSTANCE(entry), + G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, 0, NULL, NULL, + g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + binding_set = gtk_binding_set_by_class(GTK_ENTRY_GET_CLASS(entry)); + gtk_binding_entry_add_signal(binding_set, GDK_Return, GDK_SHIFT_MASK, "activate-backward", 0); + } +} + + static void add_to_size_group(GtkWidget *widget, gpointer size_group) { g_return_if_fail(GTK_IS_SIZE_GROUP(size_group));
Modified: trunk/src/ui_utils.h =================================================================== --- trunk/src/ui_utils.h 2011-03-24 16:34:10 UTC (rev 5620) +++ trunk/src/ui_utils.h 2011-03-24 16:51:02 UTC (rev 5621) @@ -211,6 +211,8 @@
void ui_entry_add_clear_icon(GtkEntry *entry);
+void ui_entry_add_activate_backward_signal(GtkEntry *entry); + void ui_editable_insert_text_callback(GtkEditable *editable, gchar *new_text, gint new_text_len, gint *position, gpointer data);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.