[gedit/wip/use-gsv-search-2] GeditDocument: use the GtkSourceView search and replace API



commit feefbc0e97809b9a12342edb18f48310489ae046
Author: Sébastien Wilmet <swilmet gnome org>
Date:   Fri Jul 12 18:03:30 2013 +0200

    GeditDocument: use the GtkSourceView search and replace API
    
    Not strictly needed, because the search and replace functions in
    GeditDocument are deprecated. But it's better to use the gsv API so
    there are no conflicts between gedit and gsv for the search
    highlighting (maybe some third-party gedit plugins use the GeditDocument
    functions for the search and replace).

 gedit/gedit-document.c |  407 ++++--------------------------------------------
 gedit/gedit-document.h |    4 -
 2 files changed, 32 insertions(+), 379 deletions(-)
---
diff --git a/gedit/gedit-document.c b/gedit/gedit-document.c
index c1f151f..a2c4383 100644
--- a/gedit/gedit-document.c
+++ b/gedit/gedit-document.c
@@ -48,7 +48,6 @@
 #include "gedit-document-saver.h"
 #include "gedit-marshal.h"
 #include "gedit-enum-types.h"
-#include "gedittextregion.h"
 
 #ifndef ENABLE_GVFS_METADATA
 #include "gedit-metadata-manager.h"
@@ -88,14 +87,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 +108,6 @@ struct _GeditDocumentPrivate
 
        guint        search_flags;
        gchar       *search_text;
-       gint         num_of_lines_search_text;
 
        GeditDocumentNewlineType newline_type;
        GeditDocumentCompressionType compression_type;
@@ -133,11 +123,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;
@@ -330,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);
 }
 
@@ -371,7 +351,9 @@ gedit_document_get_property (GObject    *object,
                        g_value_set_boolean (value, gedit_document_get_can_search_again (doc));
                        break;
                case PROP_ENABLE_SEARCH_HIGHLIGHTING:
+                       G_GNUC_BEGIN_IGNORE_DEPRECATIONS;
                        g_value_set_boolean (value, gedit_document_get_enable_search_highlighting (doc));
+                       G_GNUC_END_IGNORE_DEPRECATIONS;
                        break;
                case PROP_NEWLINE_TYPE:
                        g_value_set_enum (value, doc->priv->newline_type);
@@ -417,8 +399,10 @@ gedit_document_set_property (GObject      *object,
                                                         g_value_get_string (value));
                        break;
                case PROP_ENABLE_SEARCH_HIGHLIGHTING:
+                       G_GNUC_BEGIN_IGNORE_DEPRECATIONS;
                        gedit_document_set_enable_search_highlighting (doc,
                                                                       g_value_get_boolean (value));
+                       G_GNUC_END_IGNORE_DEPRECATIONS;
                        break;
                case PROP_NEWLINE_TYPE:
                        set_newline_type (doc,
@@ -1022,16 +1006,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),
@@ -2073,63 +2047,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);
-
-       g_signal_emit (doc, document_signals [SEARCH_HIGHLIGHT_UPDATED], 0, start, end);
-}
-
 /**
  * gedit_document_set_search_text:
  * @doc:
@@ -2145,7 +2062,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));
@@ -2157,47 +2073,37 @@ gedit_document_set_search_text (GeditDocument *doc,
        {
                if (*text != '\0')
                {
-                       converted_text = gedit_utils_unescape_search_text (text);
+                       converted_text = gtk_source_utils_unescape_search_text (text);
                        notify = !gedit_document_get_can_search_again (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;
-
                doc->priv->search_flags = flags;
 
-       }
-
-       if (update_to_search_region)
-       {
-               GtkTextIter begin;
-               GtkTextIter end;
-
-               gtk_text_buffer_get_bounds (GTK_TEXT_BUFFER (doc),
-                                           &begin,
-                                           &end);
+               gtk_source_buffer_set_case_sensitive_search (GTK_SOURCE_BUFFER (doc),
+                                                            GEDIT_SEARCH_IS_CASE_SENSITIVE (flags));
 
-               to_search_region_range (doc,
-                                       &begin,
-                                       &end);
+               gtk_source_buffer_set_search_at_word_boundaries (GTK_SOURCE_BUFFER (doc),
+                                                                GEDIT_SEARCH_IS_ENTIRE_WORD (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");
+       }
 }
 
 /**
@@ -2216,7 +2122,7 @@ gedit_document_get_search_text (GeditDocument *doc,
        if (flags != NULL)
                *flags = doc->priv->search_flags;
 
-       return gedit_utils_escape_search_text (doc->priv->search_text);
+       return gtk_source_utils_escape_search_text (doc->priv->search_text);
 }
 
 gboolean
@@ -2405,6 +2311,9 @@ gedit_document_search_backward (GeditDocument     *doc,
  */
 
 /* FIXME this is an issue for introspection regardning @find */
+
+G_GNUC_BEGIN_IGNORE_DEPRECATIONS;
+
 gint
 gedit_document_replace_all (GeditDocument       *doc,
                            const gchar         *find,
@@ -2433,9 +2342,9 @@ gedit_document_replace_all (GeditDocument       *doc,
        if (find == NULL)
                search_text = g_strdup (doc->priv->search_text);
        else
-               search_text = gedit_utils_unescape_search_text (find);
+               search_text = gtk_source_utils_unescape_search_text (find);
 
-       replace_text = gedit_utils_unescape_search_text (replace);
+       replace_text = gtk_source_utils_unescape_search_text (replace);
 
        gtk_text_buffer_get_start_iter (buffer, &iter);
 
@@ -2522,6 +2431,8 @@ gedit_document_replace_all (GeditDocument       *doc,
        return cont;
 }
 
+G_GNUC_END_IGNORE_DEPRECATIONS;
+
 static void
 get_style_colors (GeditDocument *doc,
                   const gchar   *style_name,
@@ -2666,14 +2577,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)
 {
@@ -2685,217 +2588,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:
@@ -2959,51 +2651,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);
        }
 }
 
@@ -3018,7 +2675,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 515bcb4..0842f30 100644
--- a/gedit/gedit-document.h
+++ b/gedit/gedit-document.h
@@ -347,10 +347,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) ? \


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]