[gedit/wip/use-gsv-search: 10/10] ViewFrame: use gsv search API



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]