[gedit/wip/use-gsv-search: 10/10] ViewFrame: use gsv search API
- From: Sébastien Wilmet <swilmet src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gedit/wip/use-gsv-search: 10/10] ViewFrame: use gsv search API
- Date: Sat, 29 Jun 2013 21:53:47 +0000 (UTC)
commit c0e8ab0e244a89062a69f372df148053e9bc27bc
Author: Sébastien Wilmet <swilmet gnome org>
Date: Sat Jun 29 11:35:07 2013 +0200
ViewFrame: use gsv search API
gedit/gedit-view-frame.c | 299 +++++++++++++++++++++-------------------------
1 files changed, 139 insertions(+), 160 deletions(-)
---
diff --git a/gedit/gedit-view-frame.c b/gedit/gedit-view-frame.c
index d54e31f..e4d7b3d 100644
--- a/gedit/gedit-view-frame.c
+++ b/gedit/gedit-view-frame.c
@@ -25,10 +25,10 @@
#endif
#include "gedit-view-frame.h"
-#include "gedit-marshal.h"
#include "gedit-debug.h"
#include "gedit-utils.h"
+#include <gtksourceview/gtksource.h>
#include <gdk/gdkkeysyms.h>
#include <glib/gi18n.h>
#include <stdlib.h>
@@ -60,13 +60,13 @@ struct _GeditViewFramePrivate
* incremental search is cancelled
*/
gchar *old_search_text;
- GeditSearchFlags old_search_flags;
+ GtkSourceSearchFlags old_search_flags;
/* used to remember the state of the last
* incremental search (the document search
* state may be changed by the search dialog)
*/
- GeditSearchFlags search_flags;
+ GtkSourceSearchFlags search_flags;
GtkRevealer *slider;
GtkEntry *search_entry;
@@ -79,7 +79,6 @@ struct _GeditViewFramePrivate
glong search_entry_changed_id;
guint disable_popdown : 1;
- guint wrap_around : 1;
};
enum
@@ -227,106 +226,67 @@ set_entry_background (GeditViewFrame *frame,
static gboolean
run_search (GeditViewFrame *frame,
- const gchar *entry_text,
gboolean search_backward,
- gboolean wrap_around,
gboolean typing)
{
- GtkTextIter start_iter;
+ const gchar *entry_text;
+ GtkTextIter start_at;
GtkTextIter match_start;
GtkTextIter match_end;
gboolean found = FALSE;
- GeditDocument *doc;
+ GtkSourceBuffer *buffer;
g_return_val_if_fail (frame->priv->search_mode == SEARCH, FALSE);
- doc = gedit_view_frame_get_document (frame);
+ entry_text = gtk_entry_get_text (frame->priv->search_entry);
- gtk_text_buffer_get_iter_at_mark (GTK_TEXT_BUFFER (doc),
- &start_iter,
- frame->priv->start_mark);
+ buffer = GTK_SOURCE_BUFFER (gedit_view_frame_get_document (frame));
- if (*entry_text != '\0')
+ if (typing)
{
- if (!search_backward)
- {
- if (!typing)
- {
- /* forward and _NOT_ typing */
- gtk_text_buffer_get_selection_bounds (GTK_TEXT_BUFFER (doc),
- &start_iter,
- &match_end);
- }
-
- /* run search */
- found = gedit_document_search_forward (doc,
- &start_iter,
- NULL,
- &match_start,
- &match_end);
- }
- else if (!typing)
- {
- /* backward and not typing */
- gtk_text_buffer_get_selection_bounds (GTK_TEXT_BUFFER (doc),
- &start_iter,
- &match_end);
-
- /* run search */
- found = gedit_document_search_backward (doc,
- NULL,
- &start_iter,
- &match_start,
- &match_end);
- }
- else
- {
- /* backward (while typing) */
- g_return_val_if_reached (FALSE);
- }
+ gtk_text_buffer_get_iter_at_mark (GTK_TEXT_BUFFER (buffer),
+ &start_at,
+ frame->priv->start_mark);
+ }
+ else if (search_backward)
+ {
+ gtk_text_buffer_get_selection_bounds (GTK_TEXT_BUFFER (buffer),
+ &start_at,
+ NULL);
+ }
+ else
+ {
+ gtk_text_buffer_get_selection_bounds (GTK_TEXT_BUFFER (buffer),
+ NULL,
+ &start_at);
+ }
- if (!found && wrap_around)
- {
- if (!search_backward)
- {
- found = gedit_document_search_forward (doc,
- NULL,
- NULL, /* FIXME: set the end_inter */
- &match_start,
- &match_end);
- }
- else
- {
- found = gedit_document_search_backward (doc,
- NULL, /* FIXME: set the start_inter */
- NULL,
- &match_start,
- &match_end);
- }
- }
+ if (search_backward)
+ {
+ found = gtk_source_buffer_backward_search (buffer,
+ &start_at,
+ &match_start,
+ &match_end);
}
else
{
- gtk_text_buffer_get_selection_bounds (GTK_TEXT_BUFFER (doc),
- &start_iter,
- NULL);
+ found = gtk_source_buffer_forward_search (buffer,
+ &start_at,
+ &match_start,
+ &match_end);
}
if (found)
{
- gtk_text_buffer_place_cursor (GTK_TEXT_BUFFER (doc),
- &match_start);
-
- gtk_text_buffer_move_mark_by_name (GTK_TEXT_BUFFER (doc),
- "selection_bound", &match_end);
+ gtk_text_buffer_select_range (GTK_TEXT_BUFFER (buffer),
+ &match_start,
+ &match_end);
}
else if (typing)
{
- gtk_text_buffer_get_iter_at_mark (GTK_TEXT_BUFFER (doc),
- &start_iter,
- frame->priv->start_mark);
- gtk_text_buffer_place_cursor (GTK_TEXT_BUFFER (doc),
- &start_iter);
+ gtk_text_buffer_select_range (GTK_TEXT_BUFFER (buffer),
+ &start_at,
+ &start_at);
}
if (found || (*entry_text == '\0'))
@@ -347,8 +307,6 @@ static void
search_again (GeditViewFrame *frame,
gboolean search_backward)
{
- const gchar *entry_text;
-
g_return_if_fail (frame->priv->search_mode == SEARCH);
/* renew the flush timeout */
@@ -361,13 +319,7 @@ search_again (GeditViewFrame *frame,
frame);
}
- entry_text = gtk_entry_get_text (frame->priv->search_entry);
-
- run_search (frame,
- entry_text,
- search_backward,
- frame->priv->wrap_around,
- FALSE);
+ run_search (frame, search_backward, FALSE);
}
static gboolean
@@ -414,13 +366,12 @@ search_widget_key_press_event (GtkWidget *widget,
{
if (frame->priv->search_mode == SEARCH)
{
- GeditDocument *doc;
+ GtkSourceBuffer *buffer;
/* restore document search so that Find Next does the right thing */
- doc = gedit_view_frame_get_document (frame);
- gedit_document_set_search_text (doc,
- frame->priv->old_search_text,
- frame->priv->old_search_flags);
+ buffer = GTK_SOURCE_BUFFER (gedit_view_frame_get_document (frame));
+ gtk_source_buffer_set_search_flags (buffer, frame->priv->old_search_flags);
+ gtk_source_buffer_set_search_text (buffer, frame->priv->old_search_text);
}
hide_search_widget (frame, TRUE);
@@ -468,57 +419,75 @@ search_widget_key_press_event (GtkWidget *widget,
static void
update_search (GeditViewFrame *frame)
{
- GeditDocument *doc;
+ GtkSourceBuffer *buffer;
const gchar *entry_text;
- gchar *search_text;
- GeditSearchFlags search_flags;
- if (frame->priv->search_mode != SEARCH)
- {
- return;
- }
-
- doc = gedit_view_frame_get_document (frame);
+ buffer = GTK_SOURCE_BUFFER (gedit_view_frame_get_document (frame));
entry_text = gtk_entry_get_text (frame->priv->search_entry);
- search_text = gedit_document_get_search_text (doc, &search_flags);
-
- if ((search_text == NULL) ||
- (strcmp (search_text, entry_text) != 0) ||
- search_flags != frame->priv->search_flags)
- {
- gedit_document_set_search_text (doc,
- entry_text,
- frame->priv->search_flags);
- }
-
- g_free (search_text);
+ gtk_source_buffer_set_search_text (buffer, entry_text);
+ gtk_source_buffer_set_search_flags (buffer, frame->priv->search_flags);
}
static void
wrap_around_menu_item_toggled (GtkCheckMenuItem *checkmenuitem,
GeditViewFrame *frame)
{
- frame->priv->wrap_around = gtk_check_menu_item_get_active (checkmenuitem);
+ GtkSourceBuffer *buffer;
+
+ if (gtk_check_menu_item_get_active (checkmenuitem))
+ {
+ frame->priv->search_flags |= GTK_SOURCE_SEARCH_WRAP_AROUND;
+ }
+ else
+ {
+ frame->priv->search_flags &= ~GTK_SOURCE_SEARCH_WRAP_AROUND;
+ }
+
+ buffer = GTK_SOURCE_BUFFER (gedit_view_frame_get_document (frame));
+
+ gtk_source_buffer_set_search_flags (buffer, frame->priv->search_flags);
}
static void
match_entire_word_menu_item_toggled (GtkCheckMenuItem *checkmenuitem,
GeditViewFrame *frame)
{
- GEDIT_SEARCH_SET_ENTIRE_WORD (frame->priv->search_flags,
- gtk_check_menu_item_get_active (checkmenuitem));
- update_search (frame);
+ GtkSourceBuffer *buffer;
+
+ if (gtk_check_menu_item_get_active (checkmenuitem))
+ {
+ frame->priv->search_flags |= GTK_SOURCE_SEARCH_AT_WORD_BOUNDARIES;
+ }
+ else
+ {
+ frame->priv->search_flags &= ~GTK_SOURCE_SEARCH_AT_WORD_BOUNDARIES;
+ }
+
+ buffer = GTK_SOURCE_BUFFER (gedit_view_frame_get_document (frame));
+
+ gtk_source_buffer_set_search_flags (buffer, frame->priv->search_flags);
}
static void
match_case_menu_item_toggled (GtkCheckMenuItem *checkmenuitem,
GeditViewFrame *frame)
{
- GEDIT_SEARCH_SET_CASE_SENSITIVE (frame->priv->search_flags,
- gtk_check_menu_item_get_active (checkmenuitem));
- update_search (frame);
+ GtkSourceBuffer *buffer;
+
+ if (gtk_check_menu_item_get_active (checkmenuitem))
+ {
+ frame->priv->search_flags |= GTK_SOURCE_SEARCH_CASE_SENSITIVE;
+ }
+ else
+ {
+ frame->priv->search_flags &= ~GTK_SOURCE_SEARCH_CASE_SENSITIVE;
+ }
+
+ buffer = GTK_SOURCE_BUFFER (gedit_view_frame_get_document (frame));
+
+ gtk_source_buffer_set_search_flags (buffer, frame->priv->search_flags);
}
static void
@@ -526,35 +495,53 @@ add_popup_menu_items (GtkWidget *menu,
GeditViewFrame *frame)
{
GtkWidget *menu_item;
+ gboolean wrap_around;
+ gboolean entire_word;
+ gboolean case_sensitive;
/* create "Wrap Around" menu item. */
menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Wrap Around"));
- g_signal_connect (G_OBJECT (menu_item), "toggled",
+
+ g_signal_connect (G_OBJECT (menu_item),
+ "toggled",
G_CALLBACK (wrap_around_menu_item_toggled),
frame);
+
gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), menu_item);
- gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menu_item),
- frame->priv->wrap_around);
+
+ wrap_around = (frame->priv->search_flags & GTK_SOURCE_SEARCH_WRAP_AROUND) != 0;
+ gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menu_item), wrap_around);
+
gtk_widget_show (menu_item);
/* create "Match Entire Word Only" menu item. */
menu_item = gtk_check_menu_item_new_with_mnemonic (_("Match _Entire Word Only"));
- g_signal_connect (G_OBJECT (menu_item), "toggled",
+
+ g_signal_connect (G_OBJECT (menu_item),
+ "toggled",
G_CALLBACK (match_entire_word_menu_item_toggled),
frame);
+
gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), menu_item);
- gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menu_item),
- GEDIT_SEARCH_IS_ENTIRE_WORD (frame->priv->search_flags));
+
+ entire_word = (frame->priv->search_flags & GTK_SOURCE_SEARCH_AT_WORD_BOUNDARIES) != 0;
+ gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menu_item), entire_word);
+
gtk_widget_show (menu_item);
/* create "Match Case" menu item. */
menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Match Case"));
- g_signal_connect (G_OBJECT (menu_item), "toggled",
+
+ g_signal_connect (G_OBJECT (menu_item),
+ "toggled",
G_CALLBACK (match_case_menu_item_toggled),
frame);
+
gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), menu_item);
- gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menu_item),
- GEDIT_SEARCH_IS_CASE_SENSITIVE (frame->priv->search_flags));
+
+ case_sensitive = (frame->priv->search_flags & GTK_SOURCE_SEARCH_CASE_SENSITIVE) != 0;
+ gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menu_item), case_sensitive);
+
gtk_widget_show (menu_item);
}
@@ -804,12 +791,7 @@ search_init (GtkWidget *entry,
if (frame->priv->search_mode == SEARCH)
{
update_search (frame);
-
- run_search (frame,
- entry_text,
- FALSE,
- frame->priv->wrap_around,
- TRUE);
+ run_search (frame, FALSE, TRUE);
}
else if (*entry_text != '\0')
{
@@ -1030,39 +1012,33 @@ init_search_entry (GeditViewFrame *frame)
else
{
/* SEARCH mode */
- gboolean selection_exists;
- gchar *find_text = NULL;
- gchar *old_find_text;
- GeditSearchFlags old_find_flags = 0;
- gint sel_len = 0;
-
- old_find_text = gedit_document_get_search_text (GEDIT_DOCUMENT (buffer),
- &old_find_flags);
+ gboolean selection_exists;
+ gchar *search_text = NULL;
+ const gchar *old_search_text;
+ gint selection_len = 0;
- if (old_find_flags != 0)
- {
- frame->priv->old_search_flags = old_find_flags;
- }
+ old_search_text = gtk_source_buffer_get_search_text (GTK_SOURCE_BUFFER (buffer));
+ frame->priv->old_search_flags = gtk_source_buffer_get_search_flags (GTK_SOURCE_BUFFER
(buffer));
selection_exists = get_selected_text (buffer,
- &find_text,
- &sel_len);
+ &search_text,
+ &selection_len);
- if (selection_exists && (find_text != NULL) && (sel_len <= 160))
+ if (selection_exists && (search_text != NULL) && (selection_len <= 160))
{
- gtk_entry_set_text (frame->priv->search_entry, find_text);
+ gtk_entry_set_text (frame->priv->search_entry, search_text);
gtk_editable_set_position (GTK_EDITABLE (frame->priv->search_entry),
-1);
}
- else if (old_find_text != NULL)
+ else if (old_search_text != NULL)
{
g_free (frame->priv->old_search_text);
- frame->priv->old_search_text = old_find_text;
+ frame->priv->old_search_text = g_strdup (old_search_text);
g_signal_handler_block (frame->priv->search_entry,
frame->priv->search_entry_changed_id);
- gtk_entry_set_text (frame->priv->search_entry, old_find_text);
+ gtk_entry_set_text (frame->priv->search_entry, old_search_text);
gtk_editable_select_region (GTK_EDITABLE (frame->priv->search_entry),
0, -1);
@@ -1071,7 +1047,7 @@ init_search_entry (GeditViewFrame *frame)
frame->priv->search_entry_changed_id);
}
- g_free (find_text);
+ g_free (search_text);
}
}
@@ -1201,7 +1177,7 @@ gedit_view_frame_init (GeditViewFrame *frame)
frame->priv = GEDIT_VIEW_FRAME_GET_PRIVATE (frame);
frame->priv->typeselect_flush_timeout = 0;
- frame->priv->wrap_around = TRUE;
+ frame->priv->search_flags = GTK_SOURCE_SEARCH_WRAP_AROUND;
gtk_widget_init_template (GTK_WIDGET (frame));
@@ -1278,10 +1254,13 @@ gedit_view_frame_clear_search (GeditViewFrame *frame)
doc = gedit_view_frame_get_document (frame);
- gedit_document_set_search_text (doc, "", GEDIT_SEARCH_DONT_SET_FLAGS);
+ gtk_source_buffer_set_search_text (GTK_SOURCE_BUFFER (doc), "");
+
g_signal_handler_block (frame->priv->search_entry,
frame->priv->search_entry_changed_id);
+
gtk_entry_set_text (frame->priv->search_entry, "");
+
g_signal_handler_unblock (frame->priv->search_entry,
frame->priv->search_entry_changed_id);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]