SF.net SVN: geany:[5621] trunk
colombanw at users.sourceforge.net
colombanw at xxxxx
Thu Mar 24 16:51:03 UTC 2011
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.
More information about the Commits
mailing list