[gedit/wip/search: 1/2] Use the new search and replace API from GtkSourceView



commit 21cad89f4a3766ab1f525368b1276c03f30a6d6e
Author: Sébastien Wilmet <swilmet gnome org>
Date:   Thu Aug 8 19:30:50 2013 +0200

    Use the new search and replace API from GtkSourceView
    
    One remaining thing: update the sensitivity of the menu items: find
    next, find prev, and clear search highlight.

 gedit/gedit-commands-search.c      |  284 +++++++++++++--------------
 gedit/gedit-document.c             |  221 ++++++++++++++-------
 gedit/gedit-document.h             |    5 +
 gedit/gedit-replace-dialog.c       |  195 +++++++++----------
 gedit/gedit-replace-dialog.h       |   33 +---
 gedit/gedit-view-frame.c           |  383 ++++++++++++++++++------------------
 gedit/gedit-window.c               |    4 +-
 plugins/spell/gedit-spell-plugin.c |   30 ++--
 8 files changed, 600 insertions(+), 555 deletions(-)
---
diff --git a/gedit/gedit-commands-search.c b/gedit/gedit-commands-search.c
index da0b9d3..36652af 100644
--- a/gedit/gedit-commands-search.c
+++ b/gedit/gedit-commands-search.c
@@ -130,20 +130,29 @@ text_found (GeditWindow *window,
 }
 
 #define MAX_MSG_LENGTH 40
+
 static void
-text_not_found (GeditWindow *window,
-               const gchar *text)
+text_not_found (GeditWindow        *window,
+               GeditReplaceDialog *replace_dialog)
 {
-       gchar *searched;
+       GtkSourceSearchSettings *search_settings;
+       const gchar *search_text;
+       gchar *escaped_search_text;
+       gchar *truncated_text;
 
-       searched = gedit_utils_str_end_truncate (text, MAX_MSG_LENGTH);
+       search_settings = gedit_replace_dialog_get_search_settings (replace_dialog);
+       search_text = gtk_source_search_settings_get_search_text (search_settings);
+       escaped_search_text = gtk_source_utils_escape_search_text (search_text);
+       truncated_text = gedit_utils_str_end_truncate (escaped_search_text, MAX_MSG_LENGTH);
 
        gedit_statusbar_flash_message (GEDIT_STATUSBAR (window->priv->statusbar),
                                       window->priv->generic_message_cid,
                                       /* Translators: %s is replaced by the text
                                          entered by the user in the search box */
-                                      _("\"%s\" not found"), searched);
-       g_free (searched);
+                                      _("\"%s\" not found"), truncated_text);
+
+       g_free (escaped_search_text);
+       g_free (truncated_text);
 }
 
 static void
@@ -162,8 +171,7 @@ finish_search_from_dialog (GeditWindow *window,
        }
        else
        {
-               const gchar *search_text = gedit_replace_dialog_get_search_text (replace_dialog);
-               text_not_found (window, search_text);
+               text_not_found (window, replace_dialog);
        }
 
        gtk_dialog_set_response_sensitive (GTK_DIALOG (replace_dialog),
@@ -172,19 +180,22 @@ finish_search_from_dialog (GeditWindow *window,
 }
 
 static gboolean
-forward_search_finished (GtkSourceBuffer *buffer,
-                        GAsyncResult    *result,
-                        GeditView       *view)
+forward_search_finished (GtkSourceSearchContext *search_context,
+                        GAsyncResult           *result,
+                        GeditView              *view)
 {
        gboolean found;
+       GtkSourceBuffer *buffer;
        GtkTextIter match_start;
        GtkTextIter match_end;
 
-       found = gtk_source_buffer_forward_search_finish (buffer,
-                                                        result,
-                                                        &match_start,
-                                                        &match_end,
-                                                        NULL);
+       found = gtk_source_search_context_forward_finish (search_context,
+                                                         result,
+                                                         &match_start,
+                                                         &match_end,
+                                                         NULL);
+
+       buffer = gtk_source_search_context_get_buffer (search_context);
 
        if (found)
        {
@@ -211,9 +222,9 @@ forward_search_finished (GtkSourceBuffer *buffer,
 }
 
 static void
-forward_search_from_dialog_finished (GtkSourceBuffer *buffer,
-                                    GAsyncResult    *result,
-                                    GeditWindow     *window)
+forward_search_from_dialog_finished (GtkSourceSearchContext *search_context,
+                                    GAsyncResult           *result,
+                                    GeditWindow            *window)
 {
        GeditView *view = gedit_window_get_active_view (window);
        gboolean found;
@@ -223,7 +234,7 @@ forward_search_from_dialog_finished (GtkSourceBuffer *buffer,
                return;
        }
 
-       found = forward_search_finished (buffer, result, view);
+       found = forward_search_finished (search_context, result, view);
 
        finish_search_from_dialog (window, found);
 }
@@ -235,6 +246,7 @@ run_forward_search (GeditWindow *window,
        GeditView *view;
        GtkTextBuffer *buffer;
        GtkTextIter start_at;
+       GtkSourceSearchContext *search_context;
 
        view = gedit_window_get_active_view (window);
 
@@ -245,40 +257,50 @@ run_forward_search (GeditWindow *window,
 
        buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
 
+       search_context = _gedit_document_get_search_context (GEDIT_DOCUMENT (buffer));
+
+       if (search_context == NULL)
+       {
+               return;
+       }
+
        gtk_text_buffer_get_selection_bounds (buffer, NULL, &start_at);
 
        if (from_dialog)
        {
-               gtk_source_buffer_forward_search_async (GTK_SOURCE_BUFFER (buffer),
-                                                       &start_at,
-                                                       NULL,
-                                                       
(GAsyncReadyCallback)forward_search_from_dialog_finished,
-                                                       window);
+               gtk_source_search_context_forward_async (search_context,
+                                                        &start_at,
+                                                        NULL,
+                                                        
(GAsyncReadyCallback)forward_search_from_dialog_finished,
+                                                        window);
        }
        else
        {
-               gtk_source_buffer_forward_search_async (GTK_SOURCE_BUFFER (buffer),
-                                                       &start_at,
-                                                       NULL,
-                                                       (GAsyncReadyCallback)forward_search_finished,
-                                                       view);
+               gtk_source_search_context_forward_async (search_context,
+                                                        &start_at,
+                                                        NULL,
+                                                        (GAsyncReadyCallback)forward_search_finished,
+                                                        view);
        }
 }
 
 static gboolean
-backward_search_finished (GtkSourceBuffer *buffer,
-                         GAsyncResult    *result,
-                         GeditView       *view)
+backward_search_finished (GtkSourceSearchContext *search_context,
+                         GAsyncResult           *result,
+                         GeditView              *view)
 {
        gboolean found;
        GtkTextIter match_start;
        GtkTextIter match_end;
+       GtkSourceBuffer *buffer;
 
-       found = gtk_source_buffer_backward_search_finish (buffer,
-                                                         result,
-                                                         &match_start,
-                                                         &match_end,
-                                                         NULL);
+       found = gtk_source_search_context_backward_finish (search_context,
+                                                          result,
+                                                          &match_start,
+                                                          &match_end,
+                                                          NULL);
+
+       buffer = gtk_source_search_context_get_buffer (search_context);
 
        if (found)
        {
@@ -305,9 +327,9 @@ backward_search_finished (GtkSourceBuffer *buffer,
 }
 
 static void
-backward_search_from_dialog_finished (GtkSourceBuffer *buffer,
-                                     GAsyncResult    *result,
-                                     GeditWindow     *window)
+backward_search_from_dialog_finished (GtkSourceSearchContext *search_context,
+                                     GAsyncResult           *result,
+                                     GeditWindow            *window)
 {
        GeditView *view = gedit_window_get_active_view (window);
        gboolean found;
@@ -317,7 +339,7 @@ backward_search_from_dialog_finished (GtkSourceBuffer *buffer,
                return;
        }
 
-       found = backward_search_finished (buffer, result, view);
+       found = backward_search_finished (search_context, result, view);
 
        finish_search_from_dialog (window, found);
 }
@@ -329,6 +351,7 @@ run_backward_search (GeditWindow *window,
        GeditView *view;
        GtkTextBuffer *buffer;
        GtkTextIter start_at;
+       GtkSourceSearchContext *search_context;
 
        view = gedit_window_get_active_view (window);
 
@@ -339,71 +362,37 @@ run_backward_search (GeditWindow *window,
 
        buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
 
+       search_context = _gedit_document_get_search_context (GEDIT_DOCUMENT (buffer));
+
+       if (search_context == NULL)
+       {
+               return;
+       }
+
        gtk_text_buffer_get_selection_bounds (buffer, &start_at, NULL);
 
        if (from_dialog)
        {
-               gtk_source_buffer_backward_search_async (GTK_SOURCE_BUFFER (buffer),
-                                                        &start_at,
-                                                        NULL,
-                                                        
(GAsyncReadyCallback)backward_search_from_dialog_finished,
-                                                        window);
+               gtk_source_search_context_backward_async (search_context,
+                                                         &start_at,
+                                                         NULL,
+                                                         
(GAsyncReadyCallback)backward_search_from_dialog_finished,
+                                                         window);
        }
        else
        {
-               gtk_source_buffer_backward_search_async (GTK_SOURCE_BUFFER (buffer),
-                                                        &start_at,
-                                                        NULL,
-                                                        (GAsyncReadyCallback)backward_search_finished,
-                                                        view);
+               gtk_source_search_context_backward_async (search_context,
+                                                         &start_at,
+                                                         NULL,
+                                                         (GAsyncReadyCallback)backward_search_finished,
+                                                         view);
        }
 }
 
 static void
-set_search_state (GeditReplaceDialog *dialog,
-                 GtkSourceBuffer    *buffer)
-{
-       const gchar *search_text;
-       gchar *unescaped_search_text;
-       gboolean match_case;
-       gboolean entire_word;
-       gboolean wrap_around;
-
-       search_text = gedit_replace_dialog_get_search_text (dialog);
-       unescaped_search_text = gtk_source_utils_unescape_search_text (search_text);
-       gtk_source_buffer_set_search_text (buffer, unescaped_search_text);
-       g_free (unescaped_search_text);
-
-       match_case = gedit_replace_dialog_get_match_case (dialog);
-       gtk_source_buffer_set_case_sensitive_search (buffer, match_case);
-
-       entire_word = gedit_replace_dialog_get_entire_word (dialog);
-       gtk_source_buffer_set_search_at_word_boundaries (buffer, entire_word);
-
-       wrap_around = gedit_replace_dialog_get_wrap_around (dialog);
-       gtk_source_buffer_set_search_wrap_around (buffer, wrap_around);
-}
-
-static void
 do_find (GeditReplaceDialog *dialog,
         GeditWindow        *window)
 {
-       GeditView *active_view;
-       GtkSourceBuffer *buffer;
-
-       /* TODO: make the dialog insensitive when all the tabs are closed
-        * and assert here that the view is not NULL */
-       active_view = gedit_window_get_active_view (window);
-
-       if (active_view == NULL)
-       {
-               return;
-       }
-
-       buffer = GTK_SOURCE_BUFFER (gtk_text_view_get_buffer (GTK_TEXT_VIEW (active_view)));
-
-       set_search_state (dialog, buffer);
-
        if (gedit_replace_dialog_get_backwards (dialog))
        {
                run_backward_search (window, TRUE);
@@ -414,7 +403,7 @@ do_find (GeditReplaceDialog *dialog,
        }
 }
 
-/* FIXME: move in gedit-document.c and share it with gedit-view */
+/* FIXME: move in gedit-document.c and share it with gedit-view-frame */
 static gboolean
 get_selected_text (GtkTextBuffer  *doc,
                   gchar         **selected_text,
@@ -445,20 +434,26 @@ static void
 do_replace (GeditReplaceDialog *dialog,
            GeditWindow        *window)
 {
-       GtkSourceBuffer *buffer;
+       GeditDocument *doc;
+       GtkSourceSearchContext *search_context;
        const gchar *replace_entry_text;
        gchar *unescaped_replace_text;
        GtkTextIter start;
        GtkTextIter end;
 
-       buffer = GTK_SOURCE_BUFFER (gedit_window_get_active_document (window));
+       doc = gedit_window_get_active_document (window);
 
-       if (buffer == NULL)
+       if (doc == NULL)
        {
                return;
        }
 
-       set_search_state (dialog, buffer);
+       search_context = _gedit_document_get_search_context (doc);
+
+       if (search_context == NULL)
+       {
+               return;
+       }
 
        /* replace text may be "", we just delete */
        replace_entry_text = gedit_replace_dialog_get_replace_text (dialog);
@@ -466,9 +461,13 @@ do_replace (GeditReplaceDialog *dialog,
 
        unescaped_replace_text = gtk_source_utils_unescape_search_text (replace_entry_text);
 
-       gtk_text_buffer_get_selection_bounds (GTK_TEXT_BUFFER (buffer), &start, &end);
+       gtk_text_buffer_get_selection_bounds (GTK_TEXT_BUFFER (doc), &start, &end);
 
-       gtk_source_buffer_search_replace (buffer, &start, &end, unescaped_replace_text, -1);
+       gtk_source_search_context_replace (search_context,
+                                          &start,
+                                          &end,
+                                          unescaped_replace_text,
+                                          -1);
 
        g_free (unescaped_replace_text);
 
@@ -479,22 +478,25 @@ static void
 do_replace_all (GeditReplaceDialog *dialog,
                GeditWindow        *window)
 {
-       GeditView *active_view;
-       GtkSourceBuffer *buffer;
+       GeditDocument *doc;
+       GtkSourceSearchContext *search_context;
        const gchar *replace_entry_text;
        gchar *unescaped_replace_text;
        gint count;
 
-       active_view = gedit_window_get_active_view (window);
+       doc = gedit_window_get_active_document (window);
 
-       if (active_view == NULL)
+       if (doc == NULL)
        {
                return;
        }
 
-       buffer = GTK_SOURCE_BUFFER (gtk_text_view_get_buffer (GTK_TEXT_VIEW (active_view)));
+       search_context = _gedit_document_get_search_context (doc);
 
-       set_search_state (dialog, buffer);
+       if (search_context == NULL)
+       {
+               return;
+       }
 
        /* replace text may be "", we just delete all occurrences */
        replace_entry_text = gedit_replace_dialog_get_replace_text (dialog);
@@ -502,7 +504,7 @@ do_replace_all (GeditReplaceDialog *dialog,
 
        unescaped_replace_text = gtk_source_utils_unescape_search_text (replace_entry_text);
 
-       count = gtk_source_buffer_search_replace_all (buffer, unescaped_replace_text, -1);
+       count = gtk_source_search_context_replace_all (search_context, unescaped_replace_text, -1);
 
        g_free (unescaped_replace_text);
 
@@ -512,8 +514,7 @@ do_replace_all (GeditReplaceDialog *dialog,
        }
        else
        {
-               const gchar *search_entry_text = gedit_replace_dialog_get_search_text (dialog);
-               text_not_found (window, search_entry_text);
+               text_not_found (window, dialog);
        }
 
        gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog),
@@ -526,8 +527,28 @@ replace_dialog_response_cb (GeditReplaceDialog *dialog,
                            gint                response_id,
                            GeditWindow        *window)
 {
+       GeditDocument *doc;
+       GtkSourceSearchContext *search_context;
+       GtkSourceSearchSettings *search_settings;
+
        gedit_debug (DEBUG_COMMANDS);
 
+       search_settings = gedit_replace_dialog_get_search_settings (dialog);
+
+       doc = gedit_window_get_active_document (window);
+       search_context = _gedit_document_get_search_context (doc);
+
+       if (search_context == NULL ||
+           search_settings != gtk_source_search_context_get_settings (search_context))
+       {
+               search_context = gtk_source_search_context_new (GTK_SOURCE_BUFFER (doc),
+                                                               search_settings);
+
+               _gedit_document_set_search_context (doc, search_context);
+
+               g_object_unref (search_context);
+       }
+
        switch (response_id)
        {
                case GEDIT_REPLACE_DIALOG_FIND_RESPONSE:
@@ -640,8 +661,11 @@ _gedit_cmd_search_replace (GtkAction   *action,
 
        if (selection_exists && find_text != NULL && sel_len < 80)
        {
-               gedit_replace_dialog_set_search_text (GEDIT_REPLACE_DIALOG (replace_dialog),
-                                                     find_text);
+               GtkSourceSearchSettings *search_settings;
+
+               search_settings = gedit_replace_dialog_get_search_settings (GEDIT_REPLACE_DIALOG 
(replace_dialog));
+
+               gtk_source_search_settings_set_search_text (search_settings, find_text);
        }
 
        g_free (find_text);
@@ -652,43 +676,13 @@ _gedit_cmd_search_replace (GtkAction   *action,
                                                GDK_CURRENT_TIME);
 }
 
-static void
-do_find_again (GeditWindow *window,
-              gboolean     backward)
-{
-       GeditView *active_view;
-       gpointer data;
-
-       active_view = gedit_window_get_active_view (window);
-       g_return_if_fail (active_view != NULL);
-
-       data = g_object_get_data (G_OBJECT (window), GEDIT_REPLACE_DIALOG_KEY);
-
-       if (data != NULL)
-       {
-               GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (active_view));
-
-               set_search_state (GEDIT_REPLACE_DIALOG (data),
-                                 GTK_SOURCE_BUFFER (buffer));
-       }
-
-       if (backward)
-       {
-               run_backward_search (window, FALSE);
-       }
-       else
-       {
-               run_forward_search (window, FALSE);
-       }
-}
-
 void
 _gedit_cmd_search_find_next (GtkAction   *action,
                             GeditWindow *window)
 {
        gedit_debug (DEBUG_COMMANDS);
 
-       do_find_again (window, FALSE);
+       run_forward_search (window, FALSE);
 }
 
 void
@@ -697,7 +691,7 @@ _gedit_cmd_search_find_prev (GtkAction   *action,
 {
        gedit_debug (DEBUG_COMMANDS);
 
-       do_find_again (window, TRUE);
+       run_backward_search (window, FALSE);
 }
 
 void
@@ -706,6 +700,7 @@ _gedit_cmd_search_clear_highlight (GtkAction   *action,
 {
        GeditTab *active_tab;
        GeditViewFrame *frame;
+       GeditDocument *doc;
 
        gedit_debug (DEBUG_COMMANDS);
 
@@ -718,6 +713,9 @@ _gedit_cmd_search_clear_highlight (GtkAction   *action,
 
        frame = GEDIT_VIEW_FRAME (_gedit_tab_get_view_frame (active_tab));
        gedit_view_frame_clear_search (frame);
+
+       doc = gedit_view_frame_get_document (frame);
+       _gedit_document_set_search_context (doc, NULL);
 }
 
 void
diff --git a/gedit/gedit-document.c b/gedit/gedit-document.c
index 7527cb2..7cace58 100644
--- a/gedit/gedit-document.c
+++ b/gedit/gedit-document.c
@@ -104,8 +104,12 @@ struct _GeditDocumentPrivate
        GTimeVal     mtime;
        GTimeVal     time_of_last_save_or_load;
 
-       guint        search_flags;
-       gchar       *search_text;
+       /* The search context for the incremental search, or the search and
+        * replace. They are mutually exclusive.
+        */
+       GtkSourceSearchContext *search_context;
+
+       GtkSourceSearchSettings *deprecated_search_settings;
 
        GeditDocumentNewlineType newline_type;
        GeditDocumentCompressionType compression_type;
@@ -293,6 +297,8 @@ gedit_document_dispose (GObject *object)
        g_clear_object (&doc->priv->editor_settings);
        g_clear_object (&doc->priv->metadata_info);
        g_clear_object (&doc->priv->location);
+       g_clear_object (&doc->priv->search_context);
+       g_clear_object (&doc->priv->deprecated_search_settings);
 
        doc->priv->dispose_has_run = TRUE;
 
@@ -312,7 +318,6 @@ gedit_document_finalize (GObject *object)
        }
 
        g_free (doc->priv->content_type);
-       g_free (doc->priv->search_text);
 
        G_OBJECT_CLASS (gedit_document_parent_class)->finalize (object);
 }
@@ -351,7 +356,9 @@ gedit_document_get_property (GObject    *object,
                        G_GNUC_END_IGNORE_DEPRECATIONS;
                        break;
                case PROP_ENABLE_SEARCH_HIGHLIGHTING:
-                       g_value_set_boolean (value, gtk_source_buffer_get_highlight_search (GTK_SOURCE_BUFFER 
(doc)));
+                       g_value_set_boolean (value,
+                                            doc->priv->search_context != NULL &&
+                                            gtk_source_search_context_get_highlight 
(doc->priv->search_context));
                        break;
                case PROP_NEWLINE_TYPE:
                        g_value_set_enum (value, doc->priv->newline_type);
@@ -397,8 +404,11 @@ gedit_document_set_property (GObject      *object,
                                                         g_value_get_string (value));
                        break;
                case PROP_ENABLE_SEARCH_HIGHLIGHTING:
-                       gtk_source_buffer_set_highlight_search (GTK_SOURCE_BUFFER (doc),
-                                                               g_value_get_boolean (value));
+                       if (doc->priv->search_context != NULL)
+                       {
+                               gtk_source_search_context_set_highlight (doc->priv->search_context,
+                                                                        g_value_get_boolean (value));
+                       }
                        break;
                case PROP_NEWLINE_TYPE:
                        set_newline_type (doc,
@@ -521,9 +531,8 @@ gedit_document_class_init (GeditDocumentClass *klass)
        /**
         * GeditDocument:can-search-again:
         *
-        * Deprecated: 3.10: Use the #GtkSourceBuffer:search-text property. When
-        * #GtkSourceBuffer:search-text is non-%NULL,
-        * #GeditDocument:can-search-again is %TRUE.
+        * Deprecated: 3.10: Use the search and replace API of GtkSourceView
+        * instead.
         */
        g_object_class_install_property (object_class, PROP_CAN_SEARCH_AGAIN,
                                         g_param_spec_boolean ("can-search-again",
@@ -537,7 +546,8 @@ gedit_document_class_init (GeditDocumentClass *klass)
        /**
         * GeditDocument:enable-search-highlighting:
         *
-        * Deprecated: 3.10: Use the #GtkSourceBuffer:highlight-search property.
+        * Deprecated: 3.10: Use the search and replace API of GtkSourceView
+        * instead.
         */
        g_object_class_install_property (object_class, PROP_ENABLE_SEARCH_HIGHLIGHTING,
                                         g_param_spec_boolean ("enable-search-highlighting",
@@ -1005,12 +1015,6 @@ gedit_document_init (GeditDocument *doc)
                         "highlight-matching-brackets",
                         G_SETTINGS_BIND_GET);
 
-       g_settings_bind (priv->editor_settings,
-                        GEDIT_SETTINGS_SEARCH_HIGHLIGHTING,
-                        doc,
-                        "highlight-search",
-                        G_SETTINGS_BIND_GET);
-
        style_scheme = get_default_style_scheme (priv->editor_settings);
        if (style_scheme != NULL)
                gtk_source_buffer_set_style_scheme (GTK_SOURCE_BUFFER (doc),
@@ -2062,13 +2066,33 @@ gedit_document_goto_line_offset (GeditDocument *doc,
        return ret;
 }
 
+static GtkSourceSearchContext *
+get_deprecated_search_context (GeditDocument *doc)
+{
+       GtkSourceSearchSettings *search_settings;
+
+       if (doc->priv->search_context == NULL)
+       {
+               return NULL;
+       }
+
+       search_settings = gtk_source_search_context_get_settings (doc->priv->search_context);
+
+       if (search_settings == doc->priv->deprecated_search_settings)
+       {
+               return doc->priv->search_context;
+       }
+
+       return NULL;
+}
+
 /**
  * gedit_document_set_search_text:
  * @doc:
  * @text: (allow-none):
  * @flags:
  *
- * Deprecated: 3.10: Use gtk_source_buffer_set_search_text() instead.
+ * Deprecated: 3.10: Use the search and replace API of GtkSourceView instead.
  **/
 
 G_GNUC_BEGIN_IGNORE_DEPRECATIONS;
@@ -2080,9 +2104,9 @@ gedit_document_set_search_text (GeditDocument *doc,
 {
        gchar *converted_text;
        gboolean notify = FALSE;
+       GtkSourceSearchContext *search_context;
 
        g_return_if_fail (GEDIT_IS_DOCUMENT (doc));
-       g_return_if_fail ((text == NULL) || (doc->priv->search_text != text));
        g_return_if_fail ((text == NULL) || g_utf8_validate (text, -1, NULL));
 
        gedit_debug_message (DEBUG_DOCUMENT, "text = %s", text);
@@ -2100,23 +2124,32 @@ gedit_document_set_search_text (GeditDocument *doc,
                        notify = gedit_document_get_can_search_again (doc);
                }
 
-               g_free (doc->priv->search_text);
-               doc->priv->search_text = converted_text;
+               gtk_source_search_settings_set_search_text (doc->priv->deprecated_search_settings,
+                                                           converted_text);
+
+               g_free (converted_text);
        }
 
        if (!GEDIT_SEARCH_IS_DONT_SET_FLAGS (flags))
        {
-               doc->priv->search_flags = flags;
-
-               gtk_source_buffer_set_case_sensitive_search (GTK_SOURCE_BUFFER (doc),
-                                                            GEDIT_SEARCH_IS_CASE_SENSITIVE (flags));
+               gtk_source_search_settings_set_case_sensitive (doc->priv->deprecated_search_settings,
+                                                              GEDIT_SEARCH_IS_CASE_SENSITIVE (flags));
 
-               gtk_source_buffer_set_search_at_word_boundaries (GTK_SOURCE_BUFFER (doc),
-                                                                GEDIT_SEARCH_IS_ENTIRE_WORD (flags));
+               gtk_source_search_settings_set_at_word_boundaries (doc->priv->deprecated_search_settings,
+                                                                  GEDIT_SEARCH_IS_ENTIRE_WORD (flags));
        }
 
-       gtk_source_buffer_set_search_text (GTK_SOURCE_BUFFER (doc),
-                                          doc->priv->search_text);
+       search_context = get_deprecated_search_context (doc);
+
+       if (search_context == NULL)
+       {
+               search_context = gtk_source_search_context_new (GTK_SOURCE_BUFFER (doc),
+                                                               doc->priv->deprecated_search_settings);
+
+               _gedit_document_set_search_context (doc, search_context);
+
+               g_object_unref (search_context);
+       }
 
        if (notify)
        {
@@ -2131,33 +2164,48 @@ G_GNUC_END_IGNORE_DEPRECATIONS;
  * @doc:
  * @flags: (allow-none):
  *
- * Deprecated: 3.10: Use gtk_source_buffer_get_search_text() instead.
+ * Deprecated: 3.10: Use the search and replace API of GtkSourceView instead.
  */
 gchar *
 gedit_document_get_search_text (GeditDocument *doc,
                                guint         *flags)
 {
+       const gchar *search_text;
+
        g_return_val_if_fail (GEDIT_IS_DOCUMENT (doc), NULL);
 
        if (flags != NULL)
-               *flags = doc->priv->search_flags;
+       {
+               *flags = 0;
 
-       return gtk_source_utils_escape_search_text (doc->priv->search_text);
+               if (gtk_source_search_settings_get_case_sensitive (doc->priv->deprecated_search_settings))
+               {
+                       *flags |= GEDIT_SEARCH_CASE_SENSITIVE;
+               }
+
+               if (gtk_source_search_settings_get_at_word_boundaries (doc->priv->deprecated_search_settings))
+               {
+                       *flags |= GEDIT_SEARCH_ENTIRE_WORD;
+               }
+       }
+
+       search_text = gtk_source_search_settings_get_search_text (doc->priv->deprecated_search_settings);
+
+       return gtk_source_utils_escape_search_text (search_text);
 }
 
 /**
  * gedit_document_get_can_search_again:
  * @doc:
  *
- * Deprecated: 3.10: Use gtk_source_buffer_get_search_text() instead. If the
- * search text is non-%NULL, it means that it can search again.
+ * Deprecated: 3.10: Use the search and replace API of GtkSourceView instead.
  */
 gboolean
 gedit_document_get_can_search_again (GeditDocument *doc)
 {
        g_return_val_if_fail (GEDIT_IS_DOCUMENT (doc), FALSE);
 
-       return gtk_source_buffer_get_search_text (GTK_SOURCE_BUFFER (doc)) != NULL;
+       return gtk_source_search_settings_get_search_text (doc->priv->deprecated_search_settings) != NULL;
 }
 
 /**
@@ -2168,7 +2216,7 @@ gedit_document_get_can_search_again (GeditDocument *doc)
  * @match_start: (allow-none):
  * @match_end: (allow-none):
  *
- * Deprecated: 3.10: Use gtk_source_buffer_forward_search_async() instead.
+ * Deprecated: 3.10: Use the search and replace API of GtkSourceView instead.
  **/
 gboolean
 gedit_document_search_forward (GeditDocument     *doc,
@@ -2177,6 +2225,7 @@ gedit_document_search_forward (GeditDocument     *doc,
                               GtkTextIter       *match_start,
                               GtkTextIter       *match_end)
 {
+       const gchar *search_text;
        GtkTextIter iter;
        GtkTextSearchFlags search_flags;
        gboolean found = FALSE;
@@ -2189,15 +2238,12 @@ gedit_document_search_forward (GeditDocument     *doc,
        g_return_val_if_fail ((end == NULL) ||
                              (gtk_text_iter_get_buffer (end) ==  GTK_TEXT_BUFFER (doc)), FALSE);
 
-       if (doc->priv->search_text == NULL)
+       search_text = gtk_source_search_settings_get_search_text (doc->priv->deprecated_search_settings);
+
+       if (search_text == NULL)
        {
-               gedit_debug_message (DEBUG_DOCUMENT, "doc->priv->search_text == NULL\n");
                return FALSE;
        }
-       else
-       {
-               gedit_debug_message (DEBUG_DOCUMENT, "doc->priv->search_text == \"%s\"\n", 
doc->priv->search_text);
-       }
 
        if (start == NULL)
                gtk_text_buffer_get_start_iter (GTK_TEXT_BUFFER (doc), &iter);
@@ -2206,21 +2252,22 @@ gedit_document_search_forward (GeditDocument     *doc,
 
        search_flags = GTK_TEXT_SEARCH_VISIBLE_ONLY | GTK_TEXT_SEARCH_TEXT_ONLY;
 
-       if (!GEDIT_SEARCH_IS_CASE_SENSITIVE (doc->priv->search_flags))
+       if (!gtk_source_search_settings_get_case_sensitive (doc->priv->deprecated_search_settings))
        {
-               search_flags = search_flags | GTK_TEXT_SEARCH_CASE_INSENSITIVE;
+               search_flags |= GTK_TEXT_SEARCH_CASE_INSENSITIVE;
        }
 
        while (!found)
        {
                found = gtk_text_iter_forward_search (&iter,
-                                                     doc->priv->search_text,
+                                                     search_text,
                                                      search_flags,
                                                      &m_start,
                                                      &m_end,
                                                      end);
 
-               if (found && GEDIT_SEARCH_IS_ENTIRE_WORD (doc->priv->search_flags))
+               if (found &&
+                   gtk_source_search_settings_get_at_word_boundaries (doc->priv->deprecated_search_settings))
                {
                        found = gtk_text_iter_starts_word (&m_start) &&
                                        gtk_text_iter_ends_word (&m_end);
@@ -2251,7 +2298,7 @@ gedit_document_search_forward (GeditDocument     *doc,
  * @match_start: (allow-none):
  * @match_end: (allow-none):
  *
- * Deprecated: 3.10: Use gtk_source_buffer_backward_search_async() instead.
+ * Deprecated: 3.10: Use the search and replace API of GtkSourceView instead.
  **/
 gboolean
 gedit_document_search_backward (GeditDocument     *doc,
@@ -2260,6 +2307,7 @@ gedit_document_search_backward (GeditDocument     *doc,
                                GtkTextIter       *match_start,
                                GtkTextIter       *match_end)
 {
+       const gchar *search_text;
        GtkTextIter iter;
        GtkTextSearchFlags search_flags;
        gboolean found = FALSE;
@@ -2272,15 +2320,12 @@ gedit_document_search_backward (GeditDocument     *doc,
        g_return_val_if_fail ((end == NULL) ||
                              (gtk_text_iter_get_buffer (end) ==  GTK_TEXT_BUFFER (doc)), FALSE);
 
-       if (doc->priv->search_text == NULL)
+       search_text = gtk_source_search_settings_get_search_text (doc->priv->deprecated_search_settings);
+
+       if (search_text == NULL)
        {
-               gedit_debug_message (DEBUG_DOCUMENT, "doc->priv->search_text == NULL\n");
                return FALSE;
        }
-       else
-       {
-               gedit_debug_message (DEBUG_DOCUMENT, "doc->priv->search_text == \"%s\"\n", 
doc->priv->search_text);
-       }
 
        if (end == NULL)
                gtk_text_buffer_get_end_iter (GTK_TEXT_BUFFER (doc), &iter);
@@ -2289,21 +2334,22 @@ gedit_document_search_backward (GeditDocument     *doc,
 
        search_flags = GTK_TEXT_SEARCH_VISIBLE_ONLY | GTK_TEXT_SEARCH_TEXT_ONLY;
 
-       if (!GEDIT_SEARCH_IS_CASE_SENSITIVE (doc->priv->search_flags))
+       if (!gtk_source_search_settings_get_case_sensitive (doc->priv->deprecated_search_settings))
        {
-               search_flags = search_flags | GTK_TEXT_SEARCH_CASE_INSENSITIVE;
+               search_flags |= GTK_TEXT_SEARCH_CASE_INSENSITIVE;
        }
 
        while (!found)
        {
                found = gtk_text_iter_backward_search (&iter,
-                                                      doc->priv->search_text,
+                                                      search_text,
                                                       search_flags,
                                                       &m_start,
                                                       &m_end,
                                                       start);
 
-               if (found && GEDIT_SEARCH_IS_ENTIRE_WORD (doc->priv->search_flags))
+               if (found &&
+                   gtk_source_search_settings_get_at_word_boundaries (doc->priv->deprecated_search_settings))
                {
                        found = gtk_text_iter_starts_word (&m_start) &&
                                        gtk_text_iter_ends_word (&m_end);
@@ -2333,7 +2379,7 @@ gedit_document_search_backward (GeditDocument     *doc,
  * @replace:
  * @flags:
  *
- * Deprecated: 3.10: Use gtk_source_buffer_search_replace_all() instead.
+ * Deprecated: 3.10: Use the search and replace API of GtkSourceView instead.
  */
 
 /* FIXME this is an issue for introspection regardning @find */
@@ -2349,21 +2395,24 @@ gedit_document_replace_all (GeditDocument       *doc,
        GtkTextSearchFlags search_flags = 0;
        gboolean found = TRUE;
        gint cont = 0;
+       const gchar *search_text_from_settings;
        gchar *search_text;
        gchar *replace_text;
        gint replace_text_len;
        GtkTextBuffer *buffer;
        gboolean brackets_highlighting;
-       gboolean search_highliting;
 
        g_return_val_if_fail (GEDIT_IS_DOCUMENT (doc), 0);
        g_return_val_if_fail (replace != NULL, 0);
-       g_return_val_if_fail ((find != NULL) || (doc->priv->search_text != NULL), 0);
+
+       search_text_from_settings = gtk_source_search_settings_get_search_text 
(doc->priv->deprecated_search_settings);
+
+       g_return_val_if_fail ((find != NULL) || (search_text_from_settings != NULL), 0);
 
        buffer = GTK_TEXT_BUFFER (doc);
 
        if (find == NULL)
-               search_text = g_strdup (doc->priv->search_text);
+               search_text = g_strdup (search_text_from_settings);
        else
                search_text = gtk_source_utils_unescape_search_text (find);
 
@@ -2390,10 +2439,6 @@ gedit_document_replace_all (GeditDocument       *doc,
        brackets_highlighting = gtk_source_buffer_get_highlight_matching_brackets (GTK_SOURCE_BUFFER 
(buffer));
        gtk_source_buffer_set_highlight_matching_brackets (GTK_SOURCE_BUFFER (buffer), FALSE);
 
-       /* and do search highliting later */
-       search_highliting = gtk_source_buffer_get_highlight_search (GTK_SOURCE_BUFFER (buffer));
-       gtk_source_buffer_set_highlight_search (GTK_SOURCE_BUFFER (buffer), FALSE);
-
        gtk_text_buffer_begin_user_action (buffer);
 
        do
@@ -2447,9 +2492,6 @@ gedit_document_replace_all (GeditDocument       *doc,
        gtk_source_buffer_set_highlight_matching_brackets (GTK_SOURCE_BUFFER (buffer),
                                                           brackets_highlighting);
 
-       gtk_source_buffer_set_highlight_search (GTK_SOURCE_BUFFER (buffer),
-                                               search_highliting);
-
        g_free (search_text);
        g_free (replace_text);
 
@@ -2666,7 +2708,7 @@ _gedit_document_get_seconds_since_last_save_or_load (GeditDocument *doc)
  * @doc:
  * @enable:
  *
- * Deprecated: 3.10: Use gtk_source_buffer_set_highlight_search() instead.
+ * Deprecated: 3.10: Use the search and replace API of GtkSourceView instead.
  */
 void
 gedit_document_set_enable_search_highlighting (GeditDocument *doc,
@@ -2674,21 +2716,30 @@ gedit_document_set_enable_search_highlighting (GeditDocument *doc,
 {
        g_return_if_fail (GEDIT_IS_DOCUMENT (doc));
 
-       gtk_source_buffer_set_highlight_search (GTK_SOURCE_BUFFER (doc), enable);
+       if (doc->priv->search_context != NULL)
+       {
+               gtk_source_search_context_set_highlight (doc->priv->search_context,
+                                                        enable);
+       }
 }
 
 /**
  * gedit_document_get_enable_search_highlighting:
  * @doc:
  *
- * Deprecated: 3.10: Use gtk_source_buffer_get_highlight_search() instead.
+ * Deprecated: 3.10: Use the search and replace API of GtkSourceView instead.
  */
 gboolean
 gedit_document_get_enable_search_highlighting (GeditDocument *doc)
 {
        g_return_val_if_fail (GEDIT_IS_DOCUMENT (doc), FALSE);
 
-       return gtk_source_buffer_get_highlight_search (GTK_SOURCE_BUFFER (doc));
+       if (doc->priv->search_context == NULL)
+       {
+               return FALSE;
+       }
+
+       return gtk_source_search_context_get_highlight (doc->priv->search_context);
 }
 
 GeditDocumentNewlineType
@@ -2939,4 +2990,32 @@ _gedit_document_apply_error_style (GeditDocument *doc,
                                   end);
 }
 
+void
+_gedit_document_set_search_context (GeditDocument          *doc,
+                                   GtkSourceSearchContext *search_context)
+{
+       g_return_if_fail (GEDIT_IS_DOCUMENT (doc));
+
+       g_clear_object (&doc->priv->search_context);
+       doc->priv->search_context = search_context;
+
+       if (search_context != NULL)
+       {
+               gboolean highlight = g_settings_get_boolean (doc->priv->editor_settings,
+                                                            GEDIT_SETTINGS_SEARCH_HIGHLIGHTING);
+
+               gtk_source_search_context_set_highlight (search_context, highlight);
+
+               g_object_ref (search_context);
+       }
+}
+
+GtkSourceSearchContext *
+_gedit_document_get_search_context (GeditDocument *doc)
+{
+       g_return_val_if_fail (GEDIT_IS_DOCUMENT (doc), NULL);
+
+       return doc->priv->search_context;
+}
+
 /* ex:set ts=8 noet: */
diff --git a/gedit/gedit-document.h b/gedit/gedit-document.h
index 16c93fc..e5965e0 100644
--- a/gedit/gedit-document.h
+++ b/gedit/gedit-document.h
@@ -376,6 +376,11 @@ GMountOperation
                *_gedit_document_create_mount_operation
                                                (GeditDocument       *doc);
 
+void                    _gedit_document_set_search_context     (GeditDocument          *doc,
+                                                                GtkSourceSearchContext *search_context);
+
+GtkSourceSearchContext *_gedit_document_get_search_context     (GeditDocument          *doc);
+
 G_END_DECLS
 
 #endif /* __GEDIT_DOCUMENT_H__ */
diff --git a/gedit/gedit-replace-dialog.c b/gedit/gedit-replace-dialog.c
index afe70e7..2bb9c76 100644
--- a/gedit/gedit-replace-dialog.c
+++ b/gedit/gedit-replace-dialog.c
@@ -3,6 +3,7 @@
  * This file is part of gedit
  *
  * Copyright (C) 2005 Paolo Maggi
+ * Copyright (C) 2013 Sébastien Wilmet
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -48,14 +49,16 @@ struct _GeditReplaceDialogPrivate
        GtkWidget *backwards_checkbutton;
        GtkWidget *wrap_around_checkbutton;
 
-       gboolean   ui_error;
+       GtkSourceSearchSettings *search_settings;
+
+       gboolean ui_error;
 };
 
 G_DEFINE_TYPE_WITH_PRIVATE (GeditReplaceDialog, gedit_replace_dialog, GTK_TYPE_DIALOG)
 
 void
 gedit_replace_dialog_present_with_time (GeditReplaceDialog *dialog,
-                                      guint32            timestamp)
+                                       guint32             timestamp)
 {
        g_return_if_fail (GEDIT_REPLACE_DIALOG (dialog));
 
@@ -113,11 +116,23 @@ gedit_replace_dialog_response (GtkDialog *dialog,
 }
 
 static void
+gedit_replace_dialog_dispose (GObject *object)
+{
+       GeditReplaceDialog *dialog = GEDIT_REPLACE_DIALOG (object);
+
+       g_clear_object (&dialog->priv->search_settings);
+
+       G_OBJECT_CLASS (gedit_replace_dialog_parent_class)->dispose (object);
+}
+
+static void
 gedit_replace_dialog_class_init (GeditReplaceDialogClass *klass)
 {
+       GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
        GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
        GtkDialogClass *dialog_class = GTK_DIALOG_CLASS (klass);
 
+       gobject_class->dispose = gedit_replace_dialog_dispose;
        widget_class->delete_event = gedit_replace_dialog_delete_event;
        dialog_class->response = gedit_replace_dialog_response;
 
@@ -140,6 +155,10 @@ insert_text_handler (GtkEditable *editable,
                     gint        *position,
                     gpointer     data)
 {
+       /* FIXME: I think we can remove this function. This was a hack in the
+        * escape_search_text() function. Now there is a bug when inserting '\'
+        * in the text entry (the '\' is escaped and becomes '\\').
+        */
        static gboolean insert_text = FALSE;
        gchar *escaped_text;
        gint new_len;
@@ -174,6 +193,7 @@ search_text_entry_changed (GtkEditable        *editable,
                           GeditReplaceDialog *dialog)
 {
        const gchar *search_string;
+       gchar *unescaped_search_string;
 
        search_string = gtk_entry_get_text (GTK_ENTRY (editable));
        g_return_if_fail (search_string != NULL);
@@ -181,18 +201,55 @@ search_text_entry_changed (GtkEditable        *editable,
        if (*search_string != '\0')
        {
                gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog),
-                       GEDIT_REPLACE_DIALOG_FIND_RESPONSE, TRUE);
+                                                  GEDIT_REPLACE_DIALOG_FIND_RESPONSE,
+                                                  TRUE);
+
                gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog),
-                       GEDIT_REPLACE_DIALOG_REPLACE_ALL_RESPONSE, TRUE);
+                                                  GEDIT_REPLACE_DIALOG_REPLACE_ALL_RESPONSE,
+                                                  TRUE);
        }
        else
        {
                gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog),
-                       GEDIT_REPLACE_DIALOG_FIND_RESPONSE, FALSE);
+                                                  GEDIT_REPLACE_DIALOG_FIND_RESPONSE,
+                                                  FALSE);
+
                gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog),
-                       GEDIT_REPLACE_DIALOG_REPLACE_RESPONSE, FALSE);
+                                                  GEDIT_REPLACE_DIALOG_REPLACE_RESPONSE,
+                                                  FALSE);
+
                gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog),
-                       GEDIT_REPLACE_DIALOG_REPLACE_ALL_RESPONSE, FALSE);
+                                                  GEDIT_REPLACE_DIALOG_REPLACE_ALL_RESPONSE,
+                                                  FALSE);
+       }
+
+       unescaped_search_string = gtk_source_utils_unescape_search_text (search_string);
+
+       gtk_source_search_settings_set_search_text (dialog->priv->search_settings,
+                                                   unescaped_search_string);
+
+       g_free (unescaped_search_string);
+}
+
+static void
+search_text_notify_cb (GtkSourceSearchSettings *search_settings,
+                      GParamSpec              *pspec,
+                      GeditReplaceDialog      *dialog)
+{
+       const gchar *search_text = gtk_source_search_settings_get_search_text (search_settings);
+
+       if (search_text == NULL)
+       {
+               gtk_entry_set_text (GTK_ENTRY (dialog->priv->search_text_entry), "");
+       }
+       else
+       {
+               gchar *escaped_search_text = gtk_source_utils_escape_search_text (search_text);
+
+               gtk_entry_set_text (GTK_ENTRY (dialog->priv->search_text_entry),
+                                   escaped_search_text);
+
+               g_free (escaped_search_text);
        }
 }
 
@@ -249,15 +306,36 @@ gedit_replace_dialog_init (GeditReplaceDialog *dlg)
                          "insert_text",
                          G_CALLBACK (insert_text_handler),
                          NULL);
+
        g_signal_connect (dlg->priv->replace_text_entry,
                          "insert_text",
                          G_CALLBACK (insert_text_handler),
                          NULL);
+
        g_signal_connect (dlg->priv->search_text_entry,
                          "changed",
                          G_CALLBACK (search_text_entry_changed),
                          dlg);
 
+       dlg->priv->search_settings = gtk_source_search_settings_new ();
+
+       g_object_bind_property (dlg->priv->match_case_checkbutton, "active",
+                               dlg->priv->search_settings, "case-sensitive",
+                               G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
+
+       g_object_bind_property (dlg->priv->entire_word_checkbutton, "active",
+                               dlg->priv->search_settings, "at-word-boundaries",
+                               G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
+
+       g_object_bind_property (dlg->priv->wrap_around_checkbutton, "active",
+                               dlg->priv->search_settings, "wrap-around",
+                               G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
+
+       g_signal_connect (dlg->priv->search_settings,
+                         "notify::search-text",
+                         G_CALLBACK (search_text_notify_cb),
+                         dlg);
+
        gtk_widget_show_all (GTK_WIDGET (dlg));
 }
 
@@ -281,45 +359,6 @@ gedit_replace_dialog_new (GtkWindow *parent)
        return GTK_WIDGET (dlg);
 }
 
-void
-gedit_replace_dialog_set_search_text (GeditReplaceDialog *dialog,
-                                     const gchar        *text)
-{
-       g_return_if_fail (GEDIT_IS_REPLACE_DIALOG (dialog));
-       g_return_if_fail (text != NULL);
-
-       gtk_entry_set_text (GTK_ENTRY (dialog->priv->search_text_entry),
-                           text);
-
-       gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog),
-                                          GEDIT_REPLACE_DIALOG_FIND_RESPONSE,
-                                          (text != '\0'));
-
-       gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog),
-                                          GEDIT_REPLACE_DIALOG_REPLACE_ALL_RESPONSE,
-                                          (text != '\0'));
-}
-
-/* The text must be unescaped before searching */
-const gchar *
-gedit_replace_dialog_get_search_text (GeditReplaceDialog *dialog)
-{
-       g_return_val_if_fail (GEDIT_IS_REPLACE_DIALOG (dialog), NULL);
-
-       return gtk_entry_get_text (GTK_ENTRY (dialog->priv->search_text_entry));
-}
-
-void
-gedit_replace_dialog_set_replace_text (GeditReplaceDialog *dialog,
-                                      const gchar        *text)
-{
-       g_return_if_fail (GEDIT_IS_REPLACE_DIALOG (dialog));
-       g_return_if_fail (text != NULL);
-
-       gtk_entry_set_text (GTK_ENTRY (dialog->priv->replace_text_entry),
-                           text);
-}
-
 const gchar *
 gedit_replace_dialog_get_replace_text (GeditReplaceDialog *dialog)
 {
@@ -328,52 +367,6 @@ gedit_replace_dialog_get_replace_text (GeditReplaceDialog *dialog)
        return gtk_entry_get_text (GTK_ENTRY (dialog->priv->replace_text_entry));
 }
 
-void
-gedit_replace_dialog_set_match_case (GeditReplaceDialog *dialog,
-                                    gboolean            match_case)
-{
-       g_return_if_fail (GEDIT_IS_REPLACE_DIALOG (dialog));
-
-       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->priv->match_case_checkbutton),
-                                     match_case);
-}
-
-gboolean
-gedit_replace_dialog_get_match_case (GeditReplaceDialog *dialog)
-{
-       g_return_val_if_fail (GEDIT_IS_REPLACE_DIALOG (dialog), FALSE);
-
-       return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog->priv->match_case_checkbutton));
-}
-
-void
-gedit_replace_dialog_set_entire_word (GeditReplaceDialog *dialog,
-                                     gboolean            entire_word)
-{
-       g_return_if_fail (GEDIT_IS_REPLACE_DIALOG (dialog));
-
-       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->priv->entire_word_checkbutton),
-                                     entire_word);
-}
-
-gboolean
-gedit_replace_dialog_get_entire_word (GeditReplaceDialog *dialog)
-{
-       g_return_val_if_fail (GEDIT_IS_REPLACE_DIALOG (dialog), FALSE);
-
-       return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog->priv->entire_word_checkbutton));
-}
-
-void
-gedit_replace_dialog_set_backwards (GeditReplaceDialog *dialog,
-                                   gboolean            backwards)
-{
-       g_return_if_fail (GEDIT_IS_REPLACE_DIALOG (dialog));
-
-       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->priv->backwards_checkbutton),
-                                     backwards);
-}
-
 gboolean
 gedit_replace_dialog_get_backwards (GeditReplaceDialog *dialog)
 {
@@ -382,22 +375,12 @@ gedit_replace_dialog_get_backwards (GeditReplaceDialog *dialog)
        return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog->priv->backwards_checkbutton));
 }
 
-void
-gedit_replace_dialog_set_wrap_around (GeditReplaceDialog *dialog,
-                                     gboolean            wrap_around)
+GtkSourceSearchSettings *
+gedit_replace_dialog_get_search_settings (GeditReplaceDialog *dialog)
 {
-       g_return_if_fail (GEDIT_IS_REPLACE_DIALOG (dialog));
-
-       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->priv->wrap_around_checkbutton),
-                                     wrap_around);
-}
-
-gboolean
-gedit_replace_dialog_get_wrap_around (GeditReplaceDialog *dialog)
-{
-       g_return_val_if_fail (GEDIT_IS_REPLACE_DIALOG (dialog), FALSE);
+       g_return_val_if_fail (GEDIT_IS_REPLACE_DIALOG (dialog), NULL);
 
-       return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog->priv->wrap_around_checkbutton));
+       return dialog->priv->search_settings;
 }
 
 /* ex:set ts=8 noet: */
diff --git a/gedit/gedit-replace-dialog.h b/gedit/gedit-replace-dialog.h
index 9eb0f40..3f7b834 100644
--- a/gedit/gedit-replace-dialog.h
+++ b/gedit/gedit-replace-dialog.h
@@ -32,6 +32,7 @@
 #define __GEDIT_REPLACE_DIALOG_H__
 
 #include <gtk/gtk.h>
+#include <gtksourceview/gtksource.h>
 
 G_BEGIN_DECLS
 
@@ -82,36 +83,18 @@ enum
 /*
  * Public methods
  */
-GType           gedit_replace_dialog_get_type          (void) G_GNUC_CONST;
+GType                   gedit_replace_dialog_get_type                  (void) G_GNUC_CONST;
 
-GtkWidget      *gedit_replace_dialog_new               (GtkWindow          *parent);
+GtkWidget              *gedit_replace_dialog_new                       (GtkWindow          *parent);
 
-void            gedit_replace_dialog_present_with_time (GeditReplaceDialog *dialog,
-                                                        guint32             timestamp);
+void                    gedit_replace_dialog_present_with_time         (GeditReplaceDialog *dialog,
+                                                                        guint32             timestamp);
 
-void            gedit_replace_dialog_set_search_text   (GeditReplaceDialog *dialog,
-                                                        const gchar        *text);
-const gchar    *gedit_replace_dialog_get_search_text   (GeditReplaceDialog *dialog);
+const gchar            *gedit_replace_dialog_get_replace_text          (GeditReplaceDialog *dialog);
 
-void            gedit_replace_dialog_set_replace_text  (GeditReplaceDialog *dialog,
-                                                        const gchar        *text);
-const gchar    *gedit_replace_dialog_get_replace_text  (GeditReplaceDialog *dialog);
+gboolean                gedit_replace_dialog_get_backwards             (GeditReplaceDialog *dialog);
 
-void            gedit_replace_dialog_set_match_case    (GeditReplaceDialog *dialog,
-                                                        gboolean            match_case);
-gboolean        gedit_replace_dialog_get_match_case    (GeditReplaceDialog *dialog);
-
-void            gedit_replace_dialog_set_entire_word   (GeditReplaceDialog *dialog,
-                                                        gboolean            entire_word);
-gboolean        gedit_replace_dialog_get_entire_word   (GeditReplaceDialog *dialog);
-
-void            gedit_replace_dialog_set_backwards     (GeditReplaceDialog *dialog,
-                                                        gboolean            backwards);
-gboolean        gedit_replace_dialog_get_backwards     (GeditReplaceDialog *dialog);
-
-void            gedit_replace_dialog_set_wrap_around   (GeditReplaceDialog *dialog,
-                                                        gboolean            wrap_around);
-gboolean        gedit_replace_dialog_get_wrap_around   (GeditReplaceDialog *dialog);
+GtkSourceSearchSettings        *gedit_replace_dialog_get_search_settings       (GeditReplaceDialog *dialog);
 
 G_END_DECLS
 
diff --git a/gedit/gedit-view-frame.c b/gedit/gedit-view-frame.c
index fe4fc53..1acc74f 100644
--- a/gedit/gedit-view-frame.c
+++ b/gedit/gedit-view-frame.c
@@ -61,11 +61,6 @@ struct _GeditViewFramePrivate
         */
        GtkTextMark *start_mark;
 
-       /* Used to restore the search state if an incremental search is
-        * cancelled.
-        */
-       gchar *old_search_text;
-
        GtkRevealer *revealer;
        GdTaggedEntry *search_entry;
        GdTaggedEntryTag *entry_tag;
@@ -78,19 +73,12 @@ struct _GeditViewFramePrivate
        gulong search_entry_focus_out_id;
        gulong search_entry_changed_id;
 
-       /* Used to remember the state of the last incremental search (the
-        * buffer search state may be changed by the search and replace dialog).
-        */
-       guint case_sensitive_search : 1;
-       guint search_at_word_boundaries : 1;
-       guint search_wrap_around : 1;
+       GtkSourceSearchSettings *search_settings;
 
        /* Used to restore the search state if an incremental search is
         * cancelled.
         */
-       guint old_case_sensitive_search : 1;
-       guint old_search_at_word_boundaries : 1;
-       guint old_search_wrap_around : 1;
+       GtkSourceSearchSettings *old_search_settings;
 };
 
 enum
@@ -103,16 +91,6 @@ enum
 G_DEFINE_TYPE_WITH_PRIVATE (GeditViewFrame, gedit_view_frame, GTK_TYPE_OVERLAY)
 
 static void
-gedit_view_frame_finalize (GObject *object)
-{
-       GeditViewFrame *frame = GEDIT_VIEW_FRAME (object);
-
-       g_free (frame->priv->old_search_text);
-
-       G_OBJECT_CLASS (gedit_view_frame_parent_class)->finalize (object);
-}
-
-static void
 gedit_view_frame_dispose (GObject *object)
 {
        GeditViewFrame *frame = GEDIT_VIEW_FRAME (object);
@@ -130,6 +108,8 @@ gedit_view_frame_dispose (GObject *object)
        }
 
        g_clear_object (&frame->priv->entry_tag);
+       g_clear_object (&frame->priv->search_settings);
+       g_clear_object (&frame->priv->old_search_settings);
 
        G_OBJECT_CLASS (gedit_view_frame_parent_class)->dispose (object);
 }
@@ -226,6 +206,25 @@ renew_flush_timeout (GeditViewFrame *frame)
                                       frame);
 }
 
+static GtkSourceSearchContext *
+get_search_context (GeditViewFrame *frame)
+{
+       GeditDocument *doc;
+       GtkSourceSearchContext *search_context;
+       GtkSourceSearchSettings *search_settings;
+
+       doc = gedit_view_frame_get_document (frame);
+       search_context = _gedit_document_get_search_context (doc);
+       search_settings = gtk_source_search_context_get_settings (search_context);
+
+       if (search_settings == frame->priv->search_settings)
+       {
+               return search_context;
+       }
+
+       return NULL;
+}
+
 static void
 set_search_state (GeditViewFrame *frame,
                  SearchState     state)
@@ -263,19 +262,22 @@ finish_search (GeditViewFrame    *frame,
 }
 
 static void
-start_search_finished (GtkSourceBuffer *buffer,
-                      GAsyncResult    *result,
-                      GeditViewFrame  *frame)
+start_search_finished (GtkSourceSearchContext *search_context,
+                      GAsyncResult           *result,
+                      GeditViewFrame         *frame)
 {
        GtkTextIter match_start;
        GtkTextIter match_end;
        gboolean found;
+       GtkSourceBuffer *buffer;
+
+       found = gtk_source_search_context_forward_finish (search_context,
+                                                         result,
+                                                         &match_start,
+                                                         &match_end,
+                                                         NULL);
 
-       found = gtk_source_buffer_forward_search_finish (buffer,
-                                                        result,
-                                                        &match_start,
-                                                        &match_end,
-                                                        NULL);
+       buffer = gtk_source_search_context_get_buffer (search_context);
 
        if (found)
        {
@@ -303,41 +305,51 @@ static void
 start_search (GeditViewFrame *frame)
 {
        GtkTextIter start_at;
-       GtkSourceBuffer *buffer;
+       GtkTextBuffer *buffer;
+       GtkSourceSearchContext *search_context;
 
        g_return_if_fail (frame->priv->search_mode == SEARCH);
 
-       buffer = GTK_SOURCE_BUFFER (gedit_view_frame_get_document (frame));
+       search_context = get_search_context (frame);
 
-       gtk_text_buffer_get_iter_at_mark (GTK_TEXT_BUFFER (buffer),
+       if (search_context == NULL)
+       {
+               return;
+       }
+
+       buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (frame->priv->view));
+
+       gtk_text_buffer_get_iter_at_mark (buffer,
                                          &start_at,
                                          frame->priv->start_mark);
 
-       gtk_source_buffer_forward_search_async (buffer,
-                                               &start_at,
-                                               NULL,
-                                               (GAsyncReadyCallback)start_search_finished,
-                                               frame);
+       gtk_source_search_context_forward_async (search_context,
+                                                &start_at,
+                                                NULL,
+                                                (GAsyncReadyCallback)start_search_finished,
+                                                frame);
 }
 
 static void
-forward_search_finished (GtkSourceBuffer *buffer,
-                        GAsyncResult    *result,
-                        GeditViewFrame  *frame)
+forward_search_finished (GtkSourceSearchContext *search_context,
+                        GAsyncResult           *result,
+                        GeditViewFrame         *frame)
 {
        GtkTextIter match_start;
        GtkTextIter match_end;
        gboolean found;
 
-       found = gtk_source_buffer_forward_search_finish (buffer,
-                                                        result,
-                                                        &match_start,
-                                                        &match_end,
-                                                        NULL);
+       found = gtk_source_search_context_forward_finish (search_context,
+                                                         result,
+                                                         &match_start,
+                                                         &match_end,
+                                                         NULL);
 
        if (found)
        {
-               gtk_text_buffer_select_range (GTK_TEXT_BUFFER (buffer),
+               GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (frame->priv->view));
+
+               gtk_text_buffer_select_range (buffer,
                                              &match_start,
                                              &match_end);
        }
@@ -349,39 +361,48 @@ static void
 forward_search (GeditViewFrame *frame)
 {
        GtkTextIter start_at;
-       GtkSourceBuffer *buffer;
+       GtkTextBuffer *buffer;
+       GtkSourceSearchContext *search_context;
 
        g_return_if_fail (frame->priv->search_mode == SEARCH);
 
+       search_context = get_search_context (frame);
+
+       if (search_context == NULL)
+       {
+               return;
+       }
+
        renew_flush_timeout (frame);
 
-       buffer = GTK_SOURCE_BUFFER (gedit_view_frame_get_document (frame));
+       buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (frame->priv->view));
 
-       gtk_text_buffer_get_selection_bounds (GTK_TEXT_BUFFER (buffer),
-                                             NULL,
-                                             &start_at);
+       gtk_text_buffer_get_selection_bounds (buffer, NULL, &start_at);
 
-       gtk_source_buffer_forward_search_async (buffer,
-                                               &start_at,
-                                               NULL,
-                                               (GAsyncReadyCallback)forward_search_finished,
-                                               frame);
+       gtk_source_search_context_forward_async (search_context,
+                                                &start_at,
+                                                NULL,
+                                                (GAsyncReadyCallback)forward_search_finished,
+                                                frame);
 }
 
 static void
-backward_search_finished (GtkSourceBuffer *buffer,
-                         GAsyncResult    *result,
-                         GeditViewFrame  *frame)
+backward_search_finished (GtkSourceSearchContext *search_context,
+                         GAsyncResult           *result,
+                         GeditViewFrame         *frame)
 {
        GtkTextIter match_start;
        GtkTextIter match_end;
        gboolean found;
+       GtkSourceBuffer *buffer;
 
-       found = gtk_source_buffer_backward_search_finish (buffer,
-                                                         result,
-                                                         &match_start,
-                                                         &match_end,
-                                                         NULL);
+       found = gtk_source_search_context_backward_finish (search_context,
+                                                          result,
+                                                          &match_start,
+                                                          &match_end,
+                                                          NULL);
+
+       buffer = gtk_source_search_context_get_buffer (search_context);
 
        if (found)
        {
@@ -397,23 +418,29 @@ static void
 backward_search (GeditViewFrame *frame)
 {
        GtkTextIter start_at;
-       GtkSourceBuffer *buffer;
+       GtkTextBuffer *buffer;
+       GtkSourceSearchContext *search_context;
 
        g_return_if_fail (frame->priv->search_mode == SEARCH);
 
+       search_context = get_search_context (frame);
+
+       if (search_context == NULL)
+       {
+               return;
+       }
+
        renew_flush_timeout (frame);
 
-       buffer = GTK_SOURCE_BUFFER (gedit_view_frame_get_document (frame));
+       buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (frame->priv->view));
 
-       gtk_text_buffer_get_selection_bounds (GTK_TEXT_BUFFER (buffer),
-                                             &start_at,
-                                             NULL);
+       gtk_text_buffer_get_selection_bounds (buffer, &start_at, NULL);
 
-       gtk_source_buffer_backward_search_async (buffer,
-                                                &start_at,
-                                                NULL,
-                                                (GAsyncReadyCallback)backward_search_finished,
-                                                frame);
+       gtk_source_search_context_backward_async (search_context,
+                                                 &start_at,
+                                                 NULL,
+                                                 (GAsyncReadyCallback)backward_search_finished,
+                                                 frame);
 }
 
 static gboolean
@@ -443,6 +470,36 @@ search_widget_scroll_event (GtkWidget      *widget,
        return GDK_EVENT_PROPAGATE;
 }
 
+static GtkSourceSearchSettings *
+copy_search_settings (GtkSourceSearchSettings *settings)
+{
+       GtkSourceSearchSettings *new_settings = gtk_source_search_settings_new ();
+       gboolean val;
+       const gchar *text;
+
+       if (settings == NULL)
+       {
+               return new_settings;
+       }
+
+       val = gtk_source_search_settings_get_case_sensitive (settings);
+       gtk_source_search_settings_set_case_sensitive (new_settings, val);
+
+       val = gtk_source_search_settings_get_wrap_around (settings);
+       gtk_source_search_settings_set_wrap_around (new_settings, val);
+
+       val = gtk_source_search_settings_get_at_word_boundaries (settings);
+       gtk_source_search_settings_set_at_word_boundaries (new_settings, val);
+
+       val = gtk_source_search_settings_get_regex_enabled (settings);
+       gtk_source_search_settings_set_regex_enabled (new_settings, val);
+
+       text = gtk_source_search_settings_get_search_text (settings);
+       gtk_source_search_settings_set_search_text (new_settings, text);
+
+       return new_settings;
+}
+
 static gboolean
 search_widget_key_press_event (GtkWidget      *widget,
                                GdkEventKey    *event,
@@ -460,20 +517,16 @@ search_widget_key_press_event (GtkWidget      *widget,
        /* Close window and cancel the search */
        if (event->keyval == GDK_KEY_Escape)
        {
-               if (frame->priv->search_mode == SEARCH)
+               GtkSourceSearchContext *search_context = get_search_context (frame);
+
+               if (frame->priv->search_mode == SEARCH &&
+                   search_context != NULL)
                {
-                       GtkSourceBuffer *buffer;
-                       gchar *unescaped_search_text;
-
-                       /* restore document search so that Find Next does the right thing */
-                       buffer = GTK_SOURCE_BUFFER (gedit_view_frame_get_document (frame));
-                       gtk_source_buffer_set_case_sensitive_search (buffer, 
frame->priv->old_case_sensitive_search);
-                       gtk_source_buffer_set_search_at_word_boundaries (buffer, 
frame->priv->old_search_at_word_boundaries);
-                       gtk_source_buffer_set_search_wrap_around (buffer, 
frame->priv->old_search_wrap_around);
-
-                       unescaped_search_text = gtk_source_utils_unescape_search_text 
(frame->priv->old_search_text);
-                       gtk_source_buffer_set_search_text (buffer, unescaped_search_text);
-                       g_free (unescaped_search_text);
+                       g_clear_object (&frame->priv->search_settings);
+                       frame->priv->search_settings = copy_search_settings 
(frame->priv->old_search_settings);
+
+                       gtk_source_search_context_set_settings (search_context,
+                                                               frame->priv->search_settings);
                }
 
                hide_search_widget (frame, TRUE);
@@ -521,6 +574,7 @@ search_widget_key_press_event (GtkWidget      *widget,
 static void
 update_entry_tag (GeditViewFrame *frame)
 {
+       GtkSourceSearchContext *search_context;
        GtkTextBuffer *buffer;
        GtkTextIter select_start;
        GtkTextIter select_end;
@@ -535,15 +589,21 @@ update_entry_tag (GeditViewFrame *frame)
                return;
        }
 
-       buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (frame->priv->view));
+       search_context = get_search_context (frame);
 
-       count = gtk_source_buffer_get_search_occurrences_count (GTK_SOURCE_BUFFER (buffer));
+       if (search_context == NULL)
+       {
+               return;
+       }
+
+       count = gtk_source_search_context_get_occurrences_count (search_context);
 
+       buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (frame->priv->view));
        gtk_text_buffer_get_selection_bounds (buffer, &select_start, &select_end);
 
-       pos = gtk_source_buffer_get_search_occurrence_position (GTK_SOURCE_BUFFER (buffer),
-                                                               &select_start,
-                                                               &select_end);
+       pos = gtk_source_search_context_get_occurrence_position (search_context,
+                                                                &select_start,
+                                                                &select_end);
 
        if (count == -1 || pos == -1)
        {
@@ -600,59 +660,21 @@ install_update_entry_tag_idle (GeditViewFrame *frame)
 }
 
 static void
-update_search_settings (GeditViewFrame *frame)
+update_search_text (GeditViewFrame *frame)
 {
-       GtkSourceBuffer *buffer;
        const gchar *entry_text;
        gchar *unescaped_entry_text;
 
-       buffer = GTK_SOURCE_BUFFER (gedit_view_frame_get_document (frame));
-
        entry_text = gtk_entry_get_text (GTK_ENTRY (frame->priv->search_entry));
        unescaped_entry_text = gtk_source_utils_unescape_search_text (entry_text);
 
-       gtk_source_buffer_set_search_text (buffer, unescaped_entry_text);
-       gtk_source_buffer_set_case_sensitive_search (buffer, frame->priv->case_sensitive_search);
-       gtk_source_buffer_set_search_at_word_boundaries (buffer, frame->priv->search_at_word_boundaries);
-       gtk_source_buffer_set_search_wrap_around (buffer, frame->priv->search_wrap_around);
+       gtk_source_search_settings_set_search_text (frame->priv->search_settings,
+                                                   unescaped_entry_text);
 
        g_free (unescaped_entry_text);
 }
 
 static void
-wrap_around_toggled_cb (GtkCheckMenuItem *menu_item,
-                       GeditViewFrame   *frame)
-{
-       GtkSourceBuffer *buffer = GTK_SOURCE_BUFFER (gedit_view_frame_get_document (frame));
-
-       frame->priv->search_wrap_around = gtk_check_menu_item_get_active (menu_item);
-
-       gtk_source_buffer_set_search_wrap_around (buffer, frame->priv->search_wrap_around);
-}
-
-static void
-entire_word_toggled_cb (GtkCheckMenuItem *menu_item,
-                       GeditViewFrame   *frame)
-{
-       GtkSourceBuffer *buffer = GTK_SOURCE_BUFFER (gedit_view_frame_get_document (frame));
-
-       frame->priv->search_at_word_boundaries = gtk_check_menu_item_get_active (menu_item);
-
-       gtk_source_buffer_set_search_at_word_boundaries (buffer, frame->priv->search_at_word_boundaries);
-}
-
-static void
-match_case_toggled_cb (GtkCheckMenuItem *menu_item,
-                      GeditViewFrame   *frame)
-{
-       GtkSourceBuffer *buffer = GTK_SOURCE_BUFFER (gedit_view_frame_get_document (frame));
-
-       frame->priv->case_sensitive_search = gtk_check_menu_item_get_active (menu_item);
-
-       gtk_source_buffer_set_case_sensitive_search (buffer, frame->priv->case_sensitive_search);
-}
-
-static void
 add_popup_menu_items (GeditViewFrame *frame,
                      GtkWidget      *menu)
 {
@@ -662,46 +684,31 @@ add_popup_menu_items (GeditViewFrame *frame,
        menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Wrap Around"));
 
        gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), menu_item);
-
-       g_signal_connect (menu_item,
-                         "toggled",
-                         G_CALLBACK (wrap_around_toggled_cb),
-                         frame);
-
-       gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menu_item),
-                                       frame->priv->search_wrap_around);
-
        gtk_widget_show (menu_item);
 
+       g_object_bind_property (frame->priv->search_settings, "wrap-around",
+                               menu_item, "active",
+                               G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
+
        /* create "Match Entire Word Only" menu item. */
        menu_item = gtk_check_menu_item_new_with_mnemonic (_("Match _Entire Word Only"));
 
        gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), menu_item);
-
-       g_signal_connect (menu_item,
-                         "toggled",
-                         G_CALLBACK (entire_word_toggled_cb),
-                         frame);
-
-       gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menu_item),
-                                       frame->priv->search_at_word_boundaries);
-
        gtk_widget_show (menu_item);
 
+       g_object_bind_property (frame->priv->search_settings, "at-word-boundaries",
+                               menu_item, "active",
+                               G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
+
        /* create "Match Case" menu item. */
        menu_item = gtk_check_menu_item_new_with_mnemonic (_("_Match Case"));
 
        gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), menu_item);
-
-       g_signal_connect (menu_item,
-                         "toggled",
-                         G_CALLBACK (match_case_toggled_cb),
-                         frame);
-
-       gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menu_item),
-                                       frame->priv->case_sensitive_search);
-
        gtk_widget_show (menu_item);
+
+       g_object_bind_property (frame->priv->search_settings, "case-sensitive",
+                               menu_item, "active",
+                               G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
 }
 
 static void
@@ -979,7 +986,7 @@ search_entry_changed_cb (GtkEntry       *entry,
 
        if (frame->priv->search_mode == SEARCH)
        {
-               update_search_settings (frame);
+               update_search_text (frame);
                start_search (frame);
        }
        else
@@ -1077,24 +1084,37 @@ init_search_entry (GeditViewFrame *frame)
                /* SEARCH mode */
                gboolean selection_exists;
                gchar *search_text = NULL;
-               const gchar *old_search_text;
                gint selection_len = 0;
+               const gchar *old_search_text;
+               GtkSourceSearchContext *search_context;
 
-               old_search_text = gtk_source_buffer_get_search_text (GTK_SOURCE_BUFFER (buffer));
+               if (frame->priv->search_settings == NULL)
+               {
+                       frame->priv->search_settings = gtk_source_search_settings_new ();
+               }
+
+               g_clear_object (&frame->priv->old_search_settings);
+               frame->priv->old_search_settings = copy_search_settings (frame->priv->search_settings);
 
-               frame->priv->old_case_sensitive_search =
-                       gtk_source_buffer_get_case_sensitive_search (GTK_SOURCE_BUFFER (buffer));
+               search_context = gtk_source_search_context_new (GTK_SOURCE_BUFFER (buffer),
+                                                               frame->priv->search_settings);
 
-               frame->priv->old_search_at_word_boundaries =
-                       gtk_source_buffer_get_search_at_word_boundaries (GTK_SOURCE_BUFFER (buffer));
+               _gedit_document_set_search_context (GEDIT_DOCUMENT (buffer),
+                                                   search_context);
 
-               frame->priv->old_search_wrap_around =
-                       gtk_source_buffer_get_search_wrap_around (GTK_SOURCE_BUFFER (buffer));
+               g_signal_connect_swapped (search_context,
+                                         "notify::occurrences-count",
+                                         G_CALLBACK (install_update_entry_tag_idle),
+                                         frame);
+
+               g_object_unref (search_context);
 
                selection_exists = get_selected_text (buffer,
                                                      &search_text,
                                                      &selection_len);
 
+               old_search_text = gtk_source_search_settings_get_search_text (frame->priv->search_settings);
+
                if (selection_exists && (search_text != NULL) && (selection_len <= 160))
                {
                        gchar *search_text_escaped = gtk_source_utils_escape_search_text (search_text);
@@ -1111,9 +1131,6 @@ init_search_entry (GeditViewFrame *frame)
                {
                        gchar *old_search_text_escaped = gtk_source_utils_escape_search_text 
(old_search_text);
 
-                       g_free (frame->priv->old_search_text);
-                       frame->priv->old_search_text = old_search_text_escaped;
-
                        g_signal_handler_block (frame->priv->search_entry,
                                                frame->priv->search_entry_changed_id);
 
@@ -1204,7 +1221,6 @@ gedit_view_frame_class_init (GeditViewFrameClass *klass)
        GObjectClass *object_class = G_OBJECT_CLASS (klass);
        GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
 
-       object_class->finalize = gedit_view_frame_finalize;
        object_class->dispose = gedit_view_frame_dispose;
        object_class->get_property = gedit_view_frame_get_property;
 
@@ -1252,10 +1268,6 @@ gedit_view_frame_init (GeditViewFrame *frame)
 
        frame->priv = gedit_view_frame_get_instance_private (frame);
 
-       frame->priv->case_sensitive_search = FALSE;
-       frame->priv->search_at_word_boundaries = FALSE;
-       frame->priv->search_wrap_around = TRUE;
-
        gtk_widget_init_template (GTK_WIDGET (frame));
 
        gtk_widget_override_background_color (GTK_WIDGET (frame), 0, &transparent);
@@ -1288,11 +1300,6 @@ gedit_view_frame_init (GeditViewFrame *frame)
                          G_CALLBACK (mark_set_cb),
                          frame);
 
-       g_signal_connect_swapped (doc,
-                                 "notify::search-occurrences-count",
-                                 G_CALLBACK (install_update_entry_tag_idle),
-                                 frame);
-
        g_signal_connect (frame->priv->revealer,
                          "key-press-event",
                          G_CALLBACK (search_widget_key_press_event),
@@ -1387,14 +1394,8 @@ gedit_view_frame_popup_goto_line (GeditViewFrame *frame)
 void
 gedit_view_frame_clear_search (GeditViewFrame *frame)
 {
-       GeditDocument *doc;
-
        g_return_if_fail (GEDIT_IS_VIEW_FRAME (frame));
 
-       doc = gedit_view_frame_get_document (frame);
-
-       gtk_source_buffer_set_search_text (GTK_SOURCE_BUFFER (doc), "");
-
        g_signal_handler_block (frame->priv->search_entry,
                                frame->priv->search_entry_changed_id);
 
diff --git a/gedit/gedit-window.c b/gedit/gedit-window.c
index e6cfefc..f4a088c 100644
--- a/gedit/gedit-window.c
+++ b/gedit/gedit-window.c
@@ -789,7 +789,7 @@ set_sensitivity_according_to_tab (GeditWindow *window,
                                  state_normal &&
                                  editable);
 
-       b = gtk_source_buffer_get_search_text (GTK_SOURCE_BUFFER (doc)) != NULL;
+       b = TRUE;
        action = gtk_action_group_get_action (window->priv->action_group,
                                              "SearchFindNext");
        gtk_action_set_sensitive (action,
@@ -2873,7 +2873,7 @@ search_text_notify_cb (GeditDocument *doc,
        if (doc != gedit_window_get_active_document (window))
                return;
 
-       sensitive = gtk_source_buffer_get_search_text (GTK_SOURCE_BUFFER (doc)) != NULL;
+       sensitive = TRUE;
 
        action = gtk_action_group_get_action (window->priv->action_group,
                                              "SearchFindNext");
diff --git a/plugins/spell/gedit-spell-plugin.c b/plugins/spell/gedit-spell-plugin.c
index efccae5..0bc498a 100644
--- a/plugins/spell/gedit-spell-plugin.c
+++ b/plugins/spell/gedit-spell-plugin.c
@@ -659,9 +659,8 @@ change_all_cb (GeditSpellCheckerDialog *dlg,
        CheckRange *range;
        gchar *w = NULL;
        GtkTextIter start, end;
-       gboolean case_sensitive;
-       gboolean at_word_boundaries;
-       gboolean highlight_search;
+       GtkSourceSearchSettings *search_settings;
+       GtkSourceSearchContext *search_context;
 
        gedit_debug (DEBUG_PLUGINS);
 
@@ -692,26 +691,25 @@ change_all_cb (GeditSpellCheckerDialog *dlg,
 
        g_free (w);
 
-       case_sensitive = gtk_source_buffer_get_case_sensitive_search (GTK_SOURCE_BUFFER (doc));
-       at_word_boundaries = gtk_source_buffer_get_search_at_word_boundaries (GTK_SOURCE_BUFFER (doc));
-       highlight_search = gtk_source_buffer_get_highlight_search (GTK_SOURCE_BUFFER (doc));
+       search_settings = gtk_source_search_settings_new ();
+       gtk_source_search_settings_set_case_sensitive (search_settings, TRUE);
+       gtk_source_search_settings_set_at_word_boundaries (search_settings, TRUE);
+       gtk_source_search_settings_set_search_text (search_settings, word);
 
-       gtk_source_buffer_set_case_sensitive_search (GTK_SOURCE_BUFFER (doc), TRUE);
-       gtk_source_buffer_set_search_at_word_boundaries (GTK_SOURCE_BUFFER (doc), TRUE);
-       gtk_source_buffer_set_highlight_search (GTK_SOURCE_BUFFER (doc), FALSE);
+       search_context = gtk_source_search_context_new (GTK_SOURCE_BUFFER (doc),
+                                                       search_settings);
 
-       gtk_source_buffer_set_search_text (GTK_SOURCE_BUFFER (doc), word);
-       gtk_source_buffer_search_replace_all (GTK_SOURCE_BUFFER (doc), change, -1);
-       gtk_source_buffer_set_search_text (GTK_SOURCE_BUFFER (doc), NULL);
+       gtk_source_search_context_set_highlight (search_context, FALSE);
 
-       gtk_source_buffer_set_case_sensitive_search (GTK_SOURCE_BUFFER (doc), case_sensitive);
-       gtk_source_buffer_set_search_at_word_boundaries (GTK_SOURCE_BUFFER (doc), at_word_boundaries);
-       gtk_source_buffer_set_highlight_search (GTK_SOURCE_BUFFER (doc), highlight_search);
+       gtk_source_search_context_replace_all (search_context, change, -1);
 
        update_current (doc, range->mw_start + g_utf8_strlen (change, -1));
 
        /* go to next misspelled word */
        ignore_cb (dlg, word, view);
+
+       g_object_unref (search_settings);
+       g_object_unref (search_context);
 }
 
 static void
@@ -857,8 +855,6 @@ spell_cb (GtkAction        *action,
        gtk_window_set_transient_for (GTK_WINDOW (dlg),
                                      GTK_WINDOW (priv->window));
 
-       gtk_source_buffer_set_search_text (GTK_SOURCE_BUFFER (doc), NULL);
-
        g_signal_connect (dlg, "ignore", G_CALLBACK (ignore_cb), view);
        g_signal_connect (dlg, "ignore_all", G_CALLBACK (ignore_cb), view);
 


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