[gtksourceview/wip/search] search: update occurrences_count on delete-range



commit 1ff637e5455492d5464490b6e5c41e4d34675726
Author: Sébastien Wilmet <swilmet gnome org>
Date:   Sun Jun 23 13:37:39 2013 +0200

    search: update occurrences_count on delete-range
    
    With unit tests (all pass).

 gtksourceview/gtksourcesearch.c |   23 ++++++++++--
 tests/test-search.c             |   74 +++++++++++++++++++++++++++++++++++++++
 2 files changed, 93 insertions(+), 4 deletions(-)
---
diff --git a/gtksourceview/gtksourcesearch.c b/gtksourceview/gtksourcesearch.c
index 6700e11..c701922 100644
--- a/gtksourceview/gtksourcesearch.c
+++ b/gtksourceview/gtksourcesearch.c
@@ -463,6 +463,11 @@ remove_occurrences_in_range (GtkSourceSearch *search,
        GtkTextIter match_start;
        GtkTextIter match_end;
 
+       if (search->priv->found_tag == NULL)
+       {
+               init_found_tag (search);
+       }
+
        if (gtk_text_iter_has_tag (start, search->priv->found_tag) &&
            !gtk_text_iter_toggles_tag (start, search->priv->found_tag))
        {
@@ -802,19 +807,29 @@ insert_text_after_cb (GtkSourceSearch *search,
 
 static void
 delete_range_before_cb (GtkSourceSearch *search,
-                       GtkTextIter     *start,
-                       GtkTextIter     *end)
+                       GtkTextIter     *delete_start,
+                       GtkTextIter     *delete_end)
 {
        GtkTextIter start_buffer;
        GtkTextIter end_buffer;
 
        gtk_text_buffer_get_bounds (search->priv->buffer, &start_buffer, &end_buffer);
 
-       if (gtk_text_iter_equal (start, &start_buffer) &&
-           gtk_text_iter_equal (end, &end_buffer))
+       if (gtk_text_iter_equal (delete_start, &start_buffer) &&
+           gtk_text_iter_equal (delete_end, &end_buffer))
        {
                /* Special case when removing all the text. */
                search->priv->occurrences_count = 0;
+               return;
+       }
+
+       if (search->priv->text != NULL)
+       {
+               GtkTextIter start = *delete_start;
+               GtkTextIter end = *delete_end;
+
+               remove_occurrences_in_range (search, &start, &end);
+               add_subregion_to_scan (search, &start, &end);
        }
 }
 
diff --git a/tests/test-search.c b/tests/test-search.c
index 9223207..f0ee70d 100644
--- a/tests/test-search.c
+++ b/tests/test-search.c
@@ -138,6 +138,79 @@ test_occurrences_count_with_insert (void)
        g_object_unref (source_buffer);
 }
 
+static void
+test_occurrences_count_with_delete (void)
+{
+       GtkSourceBuffer *source_buffer = gtk_source_buffer_new (NULL);
+       GtkTextBuffer *text_buffer = GTK_TEXT_BUFFER (source_buffer);
+       GtkTextIter start;
+       GtkTextIter end;
+       guint occurrences_count;
+
+       gtk_source_buffer_set_search_text (source_buffer, "foo");
+
+       /* Contents: "foo" -> "" */
+       gtk_text_buffer_set_text (text_buffer, "foo", -1);
+       flush_queue ();
+       occurrences_count = gtk_source_buffer_get_search_occurrences_count (source_buffer);
+       g_assert_cmpuint (occurrences_count, ==, 1);
+
+       gtk_text_buffer_get_bounds (text_buffer, &start, &end);
+       gtk_text_buffer_delete (text_buffer, &start, &end);
+       flush_queue ();
+       occurrences_count = gtk_source_buffer_get_search_occurrences_count (source_buffer);
+       g_assert_cmpuint (occurrences_count, ==, 0);
+
+       /* Contents: "foo" -> "oo" */
+       gtk_text_buffer_set_text (text_buffer, "foo", -1);
+       flush_queue ();
+       occurrences_count = gtk_source_buffer_get_search_occurrences_count (source_buffer);
+       g_assert_cmpuint (occurrences_count, ==, 1);
+
+       gtk_text_buffer_get_start_iter (text_buffer, &start);
+       gtk_text_buffer_get_iter_at_offset (text_buffer, &end, 1);
+       gtk_text_buffer_delete (text_buffer, &start, &end);
+       flush_queue ();
+       occurrences_count = gtk_source_buffer_get_search_occurrences_count (source_buffer);
+       g_assert_cmpuint (occurrences_count, ==, 0);
+
+       /* Contents: "foobar foobeer" -> "foobar" */
+       gtk_text_buffer_set_text (text_buffer, "foobar foobeer", -1);
+       flush_queue ();
+       occurrences_count = gtk_source_buffer_get_search_occurrences_count (source_buffer);
+       g_assert_cmpuint (occurrences_count, ==, 2);
+
+       gtk_text_buffer_get_iter_at_offset (text_buffer, &start, 6);
+       gtk_text_buffer_get_end_iter (text_buffer, &end);
+       gtk_text_buffer_delete (text_buffer, &start, &end);
+       flush_queue ();
+       occurrences_count = gtk_source_buffer_get_search_occurrences_count (source_buffer);
+       g_assert_cmpuint (occurrences_count, ==, 1);
+
+       /* Contents: "foo[foo]foo" -> "foofoo" */
+       gtk_text_buffer_set_text (text_buffer, "foofoofoo", -1);
+       flush_queue ();
+       occurrences_count = gtk_source_buffer_get_search_occurrences_count (source_buffer);
+       g_assert_cmpuint (occurrences_count, ==, 3);
+
+       gtk_text_buffer_get_iter_at_offset (text_buffer, &start, 3);
+       gtk_text_buffer_get_iter_at_offset (text_buffer, &end, 6);
+       gtk_text_buffer_delete (text_buffer, &start, &end);
+       flush_queue ();
+       occurrences_count = gtk_source_buffer_get_search_occurrences_count (source_buffer);
+       g_assert_cmpuint (occurrences_count, ==, 2);
+
+       /* Contents: "fo[of]oo" -> "fooo" */
+       gtk_text_buffer_get_iter_at_offset (text_buffer, &start, 2);
+       gtk_text_buffer_get_iter_at_offset (text_buffer, &end, 4);
+       gtk_text_buffer_delete (text_buffer, &start, &end);
+       flush_queue ();
+       occurrences_count = gtk_source_buffer_get_search_occurrences_count (source_buffer);
+       g_assert_cmpuint (occurrences_count, ==, 1);
+
+       g_object_unref (source_buffer);
+}
+
 int
 main (int argc, char **argv)
 {
@@ -145,6 +218,7 @@ main (int argc, char **argv)
 
        g_test_add_func ("/Search/occurrences-count/simple", test_occurrences_count_simple);
        g_test_add_func ("/Search/occurrences-count/with-insert", test_occurrences_count_with_insert);
+       g_test_add_func ("/Search/occurrences-count/with-delete", test_occurrences_count_with_delete);
 
        return g_test_run ();
 }


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