[gtksourceview/wip/search] search: fix adjust_subregion()



commit b36b717e3361a493a904a6298fa3aebe075cbc03
Author: Sébastien Wilmet <swilmet gnome org>
Date:   Sat Jun 22 15:24:45 2013 +0200

    search: fix adjust_subregion()

 gtksourceview/gtksourcesearch.c |  131 ++++++++++++++++++++-------------------
 1 files changed, 68 insertions(+), 63 deletions(-)
---
diff --git a/gtksourceview/gtksourcesearch.c b/gtksourceview/gtksourcesearch.c
index 210cea6..398404a 100644
--- a/gtksourceview/gtksourcesearch.c
+++ b/gtksourceview/gtksourcesearch.c
@@ -305,9 +305,6 @@ adjust_subregion (GtkSourceSearch *search,
                  GtkTextIter     *start,
                  GtkTextIter     *end)
 {
-       GtkTextIter initial_start = *start;
-       GtkTextIter initial_end = *end;
-
        gtk_text_iter_backward_lines (start, MAX (0, search->priv->text_nb_lines - 1));
        gtk_text_iter_forward_lines (end, MAX (0, search->priv->text_nb_lines - 1));
 
@@ -329,83 +326,91 @@ adjust_subregion (GtkSourceSearch *search,
         * not.
         */
 
-       if (gtk_text_iter_has_tag (start, search->priv->found_tag))
+       if (gtk_text_iter_has_tag (start, search->priv->found_tag) &&
+           !is_text_region_empty (search->priv->region_to_scan))
        {
-               if (search->priv->region_to_scan != NULL)
-               {
-                       GtkTextRegion *region = gtk_text_region_intersect (search->priv->region_to_scan,
-                                                                          start,
-                                                                          &initial_start);
+               GtkTextIter tag_start = *start;
+               GtkTextIter tag_end = *start;
+               GtkTextRegion *region;
 
-                       if (is_text_region_empty (region) &&
-                           !gtk_text_iter_ends_tag (start, search->priv->found_tag))
-                       {
-                               /* 'region' has already been scanned, so 'start'
-                                * is in a correct match, we can skip it.
-                                */
-                               gtk_text_iter_forward_to_tag_toggle (start, search->priv->found_tag);
-                       }
-                       else if (!gtk_text_iter_begins_tag (start, search->priv->found_tag))
-                       {
-                               /* 'region' has not already been scanned, so
-                                * 'start' is most probably in an old match that
-                                * must be removed.
-                                */
-                               gtk_text_iter_backward_to_tag_toggle (start, search->priv->found_tag);
-                       }
+               if (!gtk_text_iter_begins_tag (&tag_start, search->priv->found_tag))
+               {
+                       gtk_text_iter_backward_to_tag_toggle (&tag_start, search->priv->found_tag);
+               }
 
-                       if (region != NULL)
-                       {
-                               gtk_text_region_destroy (region, TRUE);
-                       }
+               if (!gtk_text_iter_ends_tag (&tag_end, search->priv->found_tag))
+               {
+                       gtk_text_iter_forward_to_tag_toggle (&tag_end, search->priv->found_tag);
                }
-               else if (!gtk_text_iter_ends_tag (start, search->priv->found_tag))
+
+               region = gtk_text_region_intersect (search->priv->region_to_scan,
+                                                   &tag_start,
+                                                   &tag_end);
+
+               if (is_text_region_empty (region))
                {
-                       /* All the buffer has been scanned, so 'start' is in a
+                       /* 'region' has already been scanned, so 'start' is in a
                         * correct match, we can skip it.
                         */
-                       gtk_text_iter_forward_to_tag_toggle (start, search->priv->found_tag);
+                       *start = tag_end;
+               }
+               else
+               {
+                       /* 'region' has not already been scanned completely, so
+                        * 'start' is most probably in an old match that must be
+                        * removed.
+                        */
+                       *start = tag_start;
+               }
+
+               if (region != NULL)
+               {
+                       gtk_text_region_destroy (region, TRUE);
                }
        }
 
        /* Symmetric for 'end'. */
 
-       if (gtk_text_iter_has_tag (end, search->priv->found_tag))
+       if (gtk_text_iter_has_tag (end, search->priv->found_tag) &&
+           !is_text_region_empty (search->priv->region_to_scan))
        {
-               if (search->priv->region_to_scan != NULL)
-               {
-                       GtkTextRegion *region = gtk_text_region_intersect (search->priv->region_to_scan,
-                                                                          &initial_end,
-                                                                          end);
+               GtkTextIter tag_start = *end;
+               GtkTextIter tag_end = *end;
+               GtkTextRegion *region;
 
-                       if (is_text_region_empty (region) &&
-                           !gtk_text_iter_begins_tag (end, search->priv->found_tag))
-                       {
-                               /* 'region' has already been scanned, so 'end'
-                                * is in a correct match, we can skip it.
-                                */
-                               gtk_text_iter_backward_to_tag_toggle (end, search->priv->found_tag);
-                       }
-                       else if (!gtk_text_iter_ends_tag (end, search->priv->found_tag))
-                       {
-                               /* 'region' has not already been scanned, so
-                                * 'end' is most probably in an old match that
-                                * must be removed.
-                                */
-                               gtk_text_iter_forward_to_tag_toggle (end, search->priv->found_tag);
-                       }
+               if (!gtk_text_iter_begins_tag (&tag_start, search->priv->found_tag))
+               {
+                       gtk_text_iter_backward_to_tag_toggle (&tag_start, search->priv->found_tag);
+               }
 
-                       if (region != NULL)
-                       {
-                               gtk_text_region_destroy (region, TRUE);
-                       }
+               if (!gtk_text_iter_ends_tag (&tag_end, search->priv->found_tag))
+               {
+                       gtk_text_iter_forward_to_tag_toggle (&tag_end, search->priv->found_tag);
                }
-               else if (!gtk_text_iter_begins_tag (end, search->priv->found_tag))
+
+               region = gtk_text_region_intersect (search->priv->region_to_scan,
+                                                   &tag_start,
+                                                   &tag_end);
+
+               if (is_text_region_empty (region))
                {
-                       /* All the buffer has been scanned, so 'end' is in a
+                       /* 'region' has already been scanned, so 'end' is in a
                         * correct match, we can skip it.
                         */
-                       gtk_text_iter_backward_to_tag_toggle (start, search->priv->found_tag);
+                       *end = tag_start;
+               }
+               else
+               {
+                       /* 'region' has not already been scanned completely, so
+                        * 'end' is most probably in an old match that must be
+                        * removed.
+                        */
+                       *end = tag_end;
+               }
+
+               if (region != NULL)
+               {
+                       gtk_text_region_destroy (region, TRUE);
                }
        }
 }


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