[gedit/wip/use-gsv-search: 3/3] Use the GtkSourceView search API
- From: Sébastien Wilmet <swilmet src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gedit/wip/use-gsv-search: 3/3] Use the GtkSourceView search API
- Date: Wed, 19 Jun 2013 15:11:09 +0000 (UTC)
commit f00314b5ace4959f109d19bd86501c97caba3b4c
Author: Sébastien Wilmet <swilmet gnome org>
Date: Wed Jun 19 12:20:58 2013 +0200
Use the GtkSourceView search API
gedit/gedit-document.c | 389 +++---------------------------------------------
gedit/gedit-document.h | 4 -
gedit/gedit-view.c | 6 -
3 files changed, 23 insertions(+), 376 deletions(-)
---
diff --git a/gedit/gedit-document.c b/gedit/gedit-document.c
index 71c36e2..3bc233f 100644
--- a/gedit/gedit-document.c
+++ b/gedit/gedit-document.c
@@ -88,14 +88,6 @@ static void gedit_document_save_real (GeditDocument *doc,
GeditDocumentNewlineType newline_type,
GeditDocumentCompressionType compression_type,
GeditDocumentSaveFlags flags);
-static void insert_text_cb (GeditDocument *doc,
- GtkTextIter *pos,
- const gchar *text,
- gint length);
-
-static void delete_range_cb (GeditDocument *doc,
- GtkTextIter *start,
- GtkTextIter *end);
struct _GeditDocumentPrivate
{
@@ -117,7 +109,6 @@ struct _GeditDocumentPrivate
guint search_flags;
gchar *search_text;
- gint num_of_lines_search_text;
GeditDocumentNewlineType newline_type;
GeditDocumentCompressionType compression_type;
@@ -133,11 +124,7 @@ struct _GeditDocumentPrivate
/* Saving stuff */
GeditDocumentSaver *saver;
- /* Search highlighting support variables */
- GeditTextRegion *to_search_region;
- GtkTextTag *found_tag;
-
- GtkTextTag *error_tag;
+ GtkTextTag *error_tag;
/* Mount operation factory */
GeditMountOperationFactory mount_operation_factory;
@@ -329,12 +316,6 @@ gedit_document_finalize (GObject *object)
g_free (doc->priv->content_type);
g_free (doc->priv->search_text);
- if (doc->priv->to_search_region != NULL)
- {
- /* we can't delete marks if we're finalizing the buffer */
- gedit_text_region_destroy (doc->priv->to_search_region, FALSE);
- }
-
G_OBJECT_CLASS (gedit_document_parent_class)->finalize (object);
}
@@ -988,16 +969,6 @@ gedit_document_init (GeditDocument *doc)
gtk_source_buffer_set_style_scheme (GTK_SOURCE_BUFFER (doc),
style_scheme);
- g_signal_connect_after (doc,
- "insert-text",
- G_CALLBACK (insert_text_cb),
- NULL);
-
- g_signal_connect_after (doc,
- "delete-range",
- G_CALLBACK (delete_range_cb),
- NULL);
-
g_signal_connect (doc,
"notify::content-type",
G_CALLBACK (on_content_type_changed),
@@ -2039,61 +2010,6 @@ gedit_document_goto_line_offset (GeditDocument *doc,
return ret;
}
-static gint
-compute_num_of_lines (const gchar *text)
-{
- const gchar *p;
- gint len;
- gint n = 1;
-
- g_return_val_if_fail (text != NULL, 0);
-
- len = strlen (text);
- p = text;
-
- while (len > 0)
- {
- gint del, par;
-
- pango_find_paragraph_boundary (p, len, &del, &par);
-
- if (del == par) /* not found */
- break;
-
- p += par;
- len -= par;
- ++n;
- }
-
- return n;
-}
-
-static void
-to_search_region_range (GeditDocument *doc,
- GtkTextIter *start,
- GtkTextIter *end)
-{
- gedit_debug (DEBUG_DOCUMENT);
-
- if (doc->priv->to_search_region == NULL)
- return;
-
- gtk_text_iter_set_line_offset (start, 0);
- gtk_text_iter_forward_to_line_end (end);
-
- /*
- g_print ("+ [%u (%u), %u (%u)]\n", gtk_text_iter_get_line (start), gtk_text_iter_get_offset (start),
- gtk_text_iter_get_line (end), gtk_text_iter_get_offset (end));
- */
-
- /* Add the region to the refresh region */
- gedit_text_region_add (doc->priv->to_search_region, start, end);
-
- /* Notify views of the updated highlight region */
- gtk_text_iter_backward_lines (start, doc->priv->num_of_lines_search_text);
- gtk_text_iter_forward_lines (end, doc->priv->num_of_lines_search_text);
-}
-
/**
* gedit_document_set_search_text:
* @doc:
@@ -2107,7 +2023,6 @@ gedit_document_set_search_text (GeditDocument *doc,
{
gchar *converted_text;
gboolean notify = FALSE;
- gboolean update_to_search_region = FALSE;
g_return_if_fail (GEDIT_IS_DOCUMENT (doc));
g_return_if_fail ((text == NULL) || (doc->priv->search_text != text));
@@ -2124,42 +2039,38 @@ gedit_document_set_search_text (GeditDocument *doc,
}
else
{
- converted_text = g_strdup("");
+ converted_text = g_strdup ("");
notify = gedit_document_get_can_search_again (doc);
}
g_free (doc->priv->search_text);
-
doc->priv->search_text = converted_text;
- doc->priv->num_of_lines_search_text = compute_num_of_lines (doc->priv->search_text);
- update_to_search_region = TRUE;
}
if (!GEDIT_SEARCH_IS_DONT_SET_FLAGS (flags))
{
- if (doc->priv->search_flags != flags)
- update_to_search_region = TRUE;
+ GtkTextSearchFlags search_flags;
doc->priv->search_flags = flags;
- }
-
- if (update_to_search_region)
- {
- GtkTextIter begin;
- GtkTextIter end;
+ search_flags = GTK_TEXT_SEARCH_VISIBLE_ONLY | GTK_TEXT_SEARCH_TEXT_ONLY;
- gtk_text_buffer_get_bounds (GTK_TEXT_BUFFER (doc),
- &begin,
- &end);
+ if (!GEDIT_SEARCH_IS_CASE_SENSITIVE (flags))
+ {
+ search_flags |= GTK_TEXT_SEARCH_CASE_INSENSITIVE;
+ }
- to_search_region_range (doc,
- &begin,
- &end);
+ gtk_source_buffer_set_search_flags (GTK_SOURCE_BUFFER (doc),
+ search_flags);
}
+ gtk_source_buffer_set_search_text (GTK_SOURCE_BUFFER (doc),
+ doc->priv->search_text);
+
if (notify)
+ {
g_object_notify (G_OBJECT (doc), "can-search-again");
+ }
}
/**
@@ -2612,14 +2523,6 @@ sync_tag_style (GeditDocument *doc,
}
static void
-sync_found_tag (GeditDocument *doc,
- GParamSpec *pspec,
- gpointer data)
-{
- sync_tag_style (doc, doc->priv->found_tag, "search-match");
-}
-
-static void
text_tag_set_highest_priority (GtkTextTag *tag,
GtkTextBuffer *buffer)
{
@@ -2631,217 +2534,6 @@ text_tag_set_highest_priority (GtkTextTag *tag,
gtk_text_tag_set_priority (tag, n - 1);
}
-static void
-search_region (GeditDocument *doc,
- GtkTextIter *start,
- GtkTextIter *end)
-{
- GtkTextIter iter;
- GtkTextIter m_start;
- GtkTextIter m_end;
- GtkTextSearchFlags search_flags = 0;
- gboolean found = TRUE;
-
- GtkTextBuffer *buffer;
-
- gedit_debug (DEBUG_DOCUMENT);
-
- buffer = GTK_TEXT_BUFFER (doc);
-
- if (doc->priv->found_tag == NULL)
- {
- doc->priv->found_tag = gtk_text_buffer_create_tag (GTK_TEXT_BUFFER (doc),
- "found",
- NULL);
-
- sync_found_tag (doc, NULL, NULL);
-
- g_signal_connect (doc,
- "notify::style-scheme",
- G_CALLBACK (sync_found_tag),
- NULL);
- }
-
- /* make sure the 'found' tag has the priority over
- * syntax highlighting tags */
- text_tag_set_highest_priority (doc->priv->found_tag,
- GTK_TEXT_BUFFER (doc));
-
-
- if (doc->priv->search_text == NULL)
- return;
-
- g_return_if_fail (doc->priv->num_of_lines_search_text > 0);
-
- gtk_text_iter_backward_lines (start, doc->priv->num_of_lines_search_text);
- gtk_text_iter_forward_lines (end, doc->priv->num_of_lines_search_text);
-
- if (gtk_text_iter_has_tag (start, doc->priv->found_tag) &&
- !gtk_text_iter_begins_tag (start, doc->priv->found_tag))
- {
- gtk_text_iter_backward_to_tag_toggle (start, doc->priv->found_tag);
- }
-
- if (gtk_text_iter_has_tag (end, doc->priv->found_tag) &&
- !gtk_text_iter_ends_tag (end, doc->priv->found_tag))
- {
- gtk_text_iter_forward_to_tag_toggle (end, doc->priv->found_tag);
- }
-
- /*
- g_print ("[%u (%u), %u (%u)]\n", gtk_text_iter_get_line (start), gtk_text_iter_get_offset (start),
- gtk_text_iter_get_line (end), gtk_text_iter_get_offset (end));
- */
-
- gtk_text_buffer_remove_tag (buffer,
- doc->priv->found_tag,
- start,
- end);
-
- if (*doc->priv->search_text == '\0')
- return;
-
- iter = *start;
-
- search_flags = GTK_TEXT_SEARCH_VISIBLE_ONLY | GTK_TEXT_SEARCH_TEXT_ONLY;
-
- if (!GEDIT_SEARCH_IS_CASE_SENSITIVE (doc->priv->search_flags))
- {
- search_flags = search_flags | GTK_TEXT_SEARCH_CASE_INSENSITIVE;
- }
-
- do
- {
- if ((end != NULL) && gtk_text_iter_is_end (end))
- end = NULL;
-
- found = gtk_text_iter_forward_search (&iter,
- doc->priv->search_text,
- search_flags,
- &m_start,
- &m_end,
- end);
-
- iter = m_end;
-
- if (found && GEDIT_SEARCH_IS_ENTIRE_WORD (doc->priv->search_flags))
- {
- gboolean word;
-
- word = gtk_text_iter_starts_word (&m_start) &&
- gtk_text_iter_ends_word (&m_end);
-
- if (!word)
- continue;
- }
-
- if (found)
- {
- gtk_text_buffer_apply_tag (buffer,
- doc->priv->found_tag,
- &m_start,
- &m_end);
- }
-
- } while (found);
-}
-
-void
-_gedit_document_search_region (GeditDocument *doc,
- const GtkTextIter *start,
- const GtkTextIter *end)
-{
- GeditTextRegion *region;
-
- gedit_debug (DEBUG_DOCUMENT);
-
- g_return_if_fail (GEDIT_IS_DOCUMENT (doc));
- g_return_if_fail (start != NULL);
- g_return_if_fail (end != NULL);
-
- if (doc->priv->to_search_region == NULL)
- return;
-
- /*
- g_print ("U [%u (%u), %u (%u)]\n", gtk_text_iter_get_line (start), gtk_text_iter_get_offset (start),
- gtk_text_iter_get_line (end), gtk_text_iter_get_offset (end));
- */
-
- /* get the subregions not yet highlighted */
- region = gedit_text_region_intersect (doc->priv->to_search_region,
- start,
- end);
- if (region)
- {
- gint i;
- GtkTextIter start_search;
- GtkTextIter end_search;
-
- i = gedit_text_region_subregions (region);
- gedit_text_region_nth_subregion (region,
- 0,
- &start_search,
- NULL);
-
- gedit_text_region_nth_subregion (region,
- i - 1,
- NULL,
- &end_search);
-
- gedit_text_region_destroy (region, TRUE);
-
- gtk_text_iter_order (&start_search, &end_search);
-
- search_region (doc, &start_search, &end_search);
-
- /* remove the just highlighted region */
- gedit_text_region_subtract (doc->priv->to_search_region,
- start,
- end);
- }
-}
-
-static void
-insert_text_cb (GeditDocument *doc,
- GtkTextIter *pos,
- const gchar *text,
- gint length)
-{
- GtkTextIter start;
- GtkTextIter end;
-
- gedit_debug (DEBUG_DOCUMENT);
-
- start = end = *pos;
-
- /*
- * pos is invalidated when
- * insertion occurs (because the buffer contents change), but the
- * default signal handler revalidates it to point to the end of the
- * inserted text
- */
- gtk_text_iter_backward_chars (&start,
- g_utf8_strlen (text, length));
-
- to_search_region_range (doc, &start, &end);
-}
-
-static void
-delete_range_cb (GeditDocument *doc,
- GtkTextIter *start,
- GtkTextIter *end)
-{
- GtkTextIter d_start;
- GtkTextIter d_end;
-
- gedit_debug (DEBUG_DOCUMENT);
-
- d_start = *start;
- d_end = *end;
-
- to_search_region_range (doc, &d_start, &d_end);
-}
-
/**
* gedit_document_set_language:
* @doc:
@@ -2898,51 +2590,16 @@ gedit_document_set_enable_search_highlighting (GeditDocument *doc,
{
g_return_if_fail (GEDIT_IS_DOCUMENT (doc));
- enable = enable != FALSE;
-
- if ((doc->priv->to_search_region != NULL) == enable)
- return;
-
- if (doc->priv->to_search_region != NULL)
+ if (!enable)
{
- /* Disable search highlighting */
- if (doc->priv->found_tag != NULL)
- {
- /* If needed remove the found_tag */
- GtkTextIter begin;
- GtkTextIter end;
-
- gtk_text_buffer_get_bounds (GTK_TEXT_BUFFER (doc),
- &begin,
- &end);
-
- gtk_text_buffer_remove_tag (GTK_TEXT_BUFFER (doc),
- doc->priv->found_tag,
- &begin,
- &end);
- }
-
- gedit_text_region_destroy (doc->priv->to_search_region,
- TRUE);
- doc->priv->to_search_region = NULL;
+ gtk_source_buffer_set_search_text (GTK_SOURCE_BUFFER (doc), NULL);
+ return;
}
- else
- {
- doc->priv->to_search_region = gedit_text_region_new (GTK_TEXT_BUFFER (doc));
- if (gedit_document_get_can_search_again (doc))
- {
- /* If search_text is not empty, highligth all its occurrences */
- GtkTextIter begin;
- GtkTextIter end;
-
- gtk_text_buffer_get_bounds (GTK_TEXT_BUFFER (doc),
- &begin,
- &end);
- to_search_region_range (doc,
- &begin,
- &end);
- }
+ if (gedit_document_get_can_search_again (doc))
+ {
+ gtk_source_buffer_set_search_text (GTK_SOURCE_BUFFER (doc),
+ doc->priv->search_text);
}
}
@@ -2951,7 +2608,7 @@ gedit_document_get_enable_search_highlighting (GeditDocument *doc)
{
g_return_val_if_fail (GEDIT_IS_DOCUMENT (doc), FALSE);
- return (doc->priv->to_search_region != NULL);
+ return gtk_source_buffer_get_search_text (GTK_SOURCE_BUFFER (doc)) != NULL;
}
GeditDocumentNewlineType
diff --git a/gedit/gedit-document.h b/gedit/gedit-document.h
index 920a372..4c76109 100644
--- a/gedit/gedit-document.h
+++ b/gedit/gedit-document.h
@@ -328,10 +328,6 @@ void _gedit_document_apply_error_style
gboolean _gedit_document_check_externally_modified
(GeditDocument *doc);
-void _gedit_document_search_region (GeditDocument *doc,
- const GtkTextIter *start,
- const GtkTextIter *end);
-
/* Search macros */
#define GEDIT_SEARCH_IS_DONT_SET_FLAGS(sflags) ((sflags & GEDIT_SEARCH_DONT_SET_FLAGS) != 0)
#define GEDIT_SEARCH_SET_DONT_SET_FLAGS(sflags,state) ((state == TRUE) ? \
diff --git a/gedit/gedit-view.c b/gedit/gedit-view.c
index f69c092..62c7e71 100644
--- a/gedit/gedit-view.c
+++ b/gedit/gedit-view.c
@@ -56,12 +56,6 @@
#define GEDIT_VIEW_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), GEDIT_TYPE_VIEW,
GeditViewPrivate))
-typedef enum
-{
- GOTO_LINE,
- SEARCH
-} SearchMode;
-
enum
{
TARGET_URI_LIST = 100,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]