[gedit] Create the SearchContext in GeditReplaceDialog



commit 5132f57206cd23afc5ee34c8d06ad48dec9f8a2b
Author: Sébastien Wilmet <swilmet gnome org>
Date:   Sun Aug 25 00:33:15 2013 +0200

    Create the SearchContext in GeditReplaceDialog

 gedit/gedit-commands-search.c |  124 -----------------------
 gedit/gedit-replace-dialog.c  |  220 ++++++++++++++++++++++++++++++++---------
 gedit/gedit-replace-dialog.h  |    8 --
 3 files changed, 174 insertions(+), 178 deletions(-)
---
diff --git a/gedit/gedit-commands-search.c b/gedit/gedit-commands-search.c
index f6c0fa2..429577b 100644
--- a/gedit/gedit-commands-search.c
+++ b/gedit/gedit-commands-search.c
@@ -491,112 +491,12 @@ do_replace_all (GeditReplaceDialog *dialog,
 }
 
 static void
-update_regex_error (GeditReplaceDialog     *dialog,
-                   GtkSourceSearchContext *search_context)
-{
-       GError *regex_error = gtk_source_search_context_get_regex_error (search_context);
-       GtkSourceRegexSearchState regex_state = gtk_source_search_context_get_regex_state (search_context);
-
-       gedit_replace_dialog_set_search_error (dialog, NULL);
-       gedit_replace_dialog_set_replace_error (dialog, NULL);
-
-       if (regex_error == NULL)
-       {
-               return;
-       }
-
-       switch (regex_state)
-       {
-               case GTK_SOURCE_REGEX_SEARCH_COMPILATION_ERROR:
-               case GTK_SOURCE_REGEX_SEARCH_MATCHING_ERROR:
-                       gedit_replace_dialog_set_search_error (dialog, regex_error->message);
-                       break;
-
-               case GTK_SOURCE_REGEX_SEARCH_REPLACE_ERROR:
-                       gedit_replace_dialog_set_replace_error (dialog, regex_error->message);
-                       break;
-
-               default:
-                       g_return_if_reached ();
-       }
-
-       g_error_free (regex_error);
-}
-
-static void
-regex_error_notify_cb (GtkSourceSearchContext *search_context,
-                      GParamSpec             *pspec,
-                      GeditReplaceDialog     *dialog)
-{
-       GeditDocument *doc;
-       GtkSourceSearchContext *doc_search_context;
-
-       doc = GEDIT_DOCUMENT (gtk_source_search_context_get_buffer (search_context));
-       doc_search_context = _gedit_document_get_search_context (doc);
-
-       if (search_context == doc_search_context)
-       {
-               update_regex_error (dialog, search_context);
-       }
-}
-
-static void
-search_context_finalized_cb (GeditReplaceDialog *dialog,
-                            GObject            *where_the_object_was)
-{
-       gedit_replace_dialog_set_search_error (dialog, NULL);
-       gedit_replace_dialog_set_replace_error (dialog, NULL);
-}
-
-static void
-create_search_context (GeditReplaceDialog *dialog,
-                      GeditDocument      *doc)
-{
-       GtkSourceSearchContext *search_context;
-       GtkSourceSearchSettings *search_settings;
-
-       search_settings = gedit_replace_dialog_get_search_settings (dialog);
-
-       search_context = _gedit_document_get_search_context (doc);
-
-       if (search_context != NULL &&
-           search_settings == gtk_source_search_context_get_settings (search_context))
-       {
-               return;
-       }
-
-       search_context = gtk_source_search_context_new (GTK_SOURCE_BUFFER (doc),
-                                                       search_settings);
-
-       g_signal_connect_object (search_context,
-                                "notify::regex-error",
-                                G_CALLBACK (regex_error_notify_cb),
-                                dialog,
-                                0);
-
-       g_object_weak_ref (G_OBJECT (search_context),
-                          (GWeakNotify)search_context_finalized_cb,
-                          dialog);
-
-       update_regex_error (dialog, search_context);
-
-       _gedit_document_set_search_context (doc, search_context);
-
-       g_object_unref (search_context);
-}
-
-static void
 replace_dialog_response_cb (GeditReplaceDialog *dialog,
                            gint                response_id,
                            GeditWindow        *window)
 {
-       GeditDocument *doc;
-
        gedit_debug (DEBUG_COMMANDS);
 
-       doc = gedit_window_get_active_document (window);
-       create_search_context (dialog, doc);
-
        switch (response_id)
        {
                case GEDIT_REPLACE_DIALOG_FIND_RESPONSE:
@@ -631,18 +531,6 @@ replace_dialog_destroyed (GeditWindow        *window,
                           NULL);
 }
 
-static void
-active_tab_changed_cb (GeditWindow        *window,
-                      GeditTab           *tab,
-                      GeditReplaceDialog *replace_dialog)
-{
-       if (tab != NULL)
-       {
-               GeditDocument *doc = gedit_tab_get_document (tab);
-               create_search_context (replace_dialog, doc);
-       }
-}
-
 static GtkWidget *
 create_dialog (GeditWindow *window)
 {
@@ -661,12 +549,6 @@ create_dialog (GeditWindow *window)
                           (GWeakNotify) replace_dialog_destroyed,
                           window);
 
-       g_signal_connect_object (window,
-                                "active-tab-changed",
-                                G_CALLBACK (active_tab_changed_cb),
-                                dialog,
-                                0);
-
        return dialog;
 }
 
@@ -696,7 +578,6 @@ _gedit_cmd_search_replace (GtkAction   *action,
 {
        gpointer data;
        GtkWidget *replace_dialog;
-       GeditDocument *doc;
 
        gedit_debug (DEBUG_COMMANDS);
 
@@ -713,11 +594,6 @@ _gedit_cmd_search_replace (GtkAction   *action,
                replace_dialog = GTK_WIDGET (data);
        }
 
-       doc = gedit_window_get_active_document (window);
-       g_return_if_fail (doc != NULL);
-
-       create_search_context (GEDIT_REPLACE_DIALOG (replace_dialog), doc);
-
        gtk_widget_show (replace_dialog);
        last_search_data_restore_position (GEDIT_REPLACE_DIALOG (replace_dialog));
        gedit_replace_dialog_present_with_time (GEDIT_REPLACE_DIALOG (replace_dialog),
diff --git a/gedit/gedit-replace-dialog.c b/gedit/gedit-replace-dialog.c
index 6e71841..9be09e8 100644
--- a/gedit/gedit-replace-dialog.c
+++ b/gedit/gedit-replace-dialog.c
@@ -31,9 +31,7 @@
 
 #include "gedit-replace-dialog.h"
 #include "gedit-history-entry.h"
-#include "gedit-utils.h"
-#include "gedit-marshal.h"
-#include "gedit-dirs.h"
+#include "gedit-document.h"
 
 struct _GeditReplaceDialogPrivate
 {
@@ -68,6 +66,43 @@ get_gedit_window (GeditReplaceDialog *dialog)
        return NULL;
 }
 
+static GeditDocument *
+get_active_document (GeditReplaceDialog *dialog)
+{
+       GeditWindow *window = get_gedit_window (dialog);
+
+       if (window != NULL)
+       {
+               return gedit_window_get_active_document (window);
+       }
+
+       return NULL;
+}
+
+static GtkSourceSearchContext *
+get_active_search_context (GeditReplaceDialog *dialog)
+{
+       GeditDocument *doc;
+       GtkSourceSearchContext *search_context;
+
+       doc = get_active_document (dialog);
+
+       if (doc == NULL)
+       {
+               return NULL;
+       }
+
+       search_context = _gedit_document_get_search_context (doc);
+
+       if (search_context != NULL &&
+           dialog->priv->search_settings == gtk_source_search_context_get_settings (search_context))
+       {
+               return search_context;
+       }
+
+       return NULL;
+}
+
 void
 gedit_replace_dialog_present_with_time (GeditReplaceDialog *dialog,
                                        guint32             timestamp)
@@ -88,12 +123,119 @@ gedit_replace_dialog_delete_event (GtkWidget   *widget,
 }
 
 static void
+set_error (GtkEntry    *entry,
+          const gchar *error_msg)
+{
+       if (error_msg == NULL || error_msg[0] == '\0')
+       {
+               gtk_entry_set_icon_from_gicon (entry, GTK_ENTRY_ICON_SECONDARY, NULL);
+               gtk_entry_set_icon_tooltip_text (entry, GTK_ENTRY_ICON_SECONDARY, NULL);
+       }
+       else
+       {
+               GIcon *icon = g_themed_icon_new_with_default_fallbacks ("dialog-error-symbolic");
+
+               gtk_entry_set_icon_from_gicon (entry, GTK_ENTRY_ICON_SECONDARY, icon);
+               gtk_entry_set_icon_tooltip_text (entry, GTK_ENTRY_ICON_SECONDARY, error_msg);
+
+               g_object_unref (icon);
+       }
+}
+
+static void
+set_search_error (GeditReplaceDialog *dialog,
+                 const gchar        *error_msg)
+{
+       set_error (GTK_ENTRY (dialog->priv->search_text_entry), error_msg);
+}
+
+static void
+set_replace_error (GeditReplaceDialog *dialog,
+                  const gchar        *error_msg)
+{
+       set_error (GTK_ENTRY (dialog->priv->replace_text_entry), error_msg);
+}
+
+static void
+update_regex_error (GeditReplaceDialog *dialog)
+{
+       GtkSourceSearchContext *search_context;
+       GError *regex_error;
+       GtkSourceRegexSearchState regex_state;
+
+       set_search_error (dialog, NULL);
+       set_replace_error (dialog, NULL);
+
+       search_context = get_active_search_context (dialog);
+
+       if (search_context == NULL)
+       {
+               return;
+       }
+
+       regex_error = gtk_source_search_context_get_regex_error (search_context);
+       regex_state = gtk_source_search_context_get_regex_state (search_context);
+
+       if (regex_error == NULL)
+       {
+               return;
+       }
+
+       switch (regex_state)
+       {
+               case GTK_SOURCE_REGEX_SEARCH_COMPILATION_ERROR:
+               case GTK_SOURCE_REGEX_SEARCH_MATCHING_ERROR:
+                       set_search_error (dialog, regex_error->message);
+                       break;
+
+               case GTK_SOURCE_REGEX_SEARCH_REPLACE_ERROR:
+                       set_replace_error (dialog, regex_error->message);
+                       break;
+
+               default:
+                       g_return_if_reached ();
+       }
+
+       g_error_free (regex_error);
+}
+
+static void
+create_search_context (GeditReplaceDialog *dialog)
+{
+       GtkSourceSearchContext *search_context = get_active_search_context (dialog);
+       GeditDocument *doc;
+
+       if (search_context != NULL)
+       {
+               return;
+       }
+
+       doc = get_active_document (dialog);
+       search_context = gtk_source_search_context_new (GTK_SOURCE_BUFFER (doc),
+                                                       dialog->priv->search_settings);
+
+       g_signal_connect_object (search_context,
+                                "notify::regex-error",
+                                G_CALLBACK (update_regex_error),
+                                dialog,
+                                G_CONNECT_SWAPPED);
+
+       update_regex_error (dialog);
+
+       _gedit_document_set_search_context (doc, search_context);
+
+       g_object_unref (search_context);
+}
+
+static void
 gedit_replace_dialog_response (GtkDialog *dialog,
                                gint       response_id)
 {
        GeditReplaceDialog *dlg = GEDIT_REPLACE_DIALOG (dialog);
        const gchar *str;
 
+       create_search_context (GEDIT_REPLACE_DIALOG (dialog));
+
        switch (response_id)
        {
                case GEDIT_REPLACE_DIALOG_REPLACE_RESPONSE:
@@ -226,6 +368,13 @@ get_selected_text (GtkTextBuffer  *doc,
 }
 
 static void
+active_tab_changed_cb (GeditReplaceDialog *dialog)
+{
+       create_search_context (dialog);
+       update_regex_error (dialog);
+}
+
+static void
 show_cb (GeditReplaceDialog *dialog)
 {
        GeditWindow *window;
@@ -241,7 +390,13 @@ show_cb (GeditReplaceDialog *dialog)
                return;
        }
 
-       doc = gedit_window_get_active_document (window);
+       g_signal_connect_object (window,
+                                "active-tab-changed",
+                                G_CALLBACK (active_tab_changed_cb),
+                                dialog,
+                                G_CONNECT_SWAPPED);
+
+       doc = get_active_document (dialog);
 
        if (doc == NULL)
        {
@@ -262,10 +417,20 @@ show_cb (GeditReplaceDialog *dialog)
                g_free (escaped_selection);
        }
 
+       create_search_context (dialog);
+
        g_free (selection);
 }
 
 static void
+hide_cb (GeditReplaceDialog *dialog)
+{
+       GeditWindow *window = get_gedit_window (dialog);
+
+       g_signal_handlers_disconnect_by_func (window, active_tab_changed_cb, dialog);
+}
+
+static void
 gedit_replace_dialog_init (GeditReplaceDialog *dlg)
 {
        dlg->priv = gedit_replace_dialog_get_instance_private (dlg);
@@ -339,6 +504,11 @@ gedit_replace_dialog_init (GeditReplaceDialog *dlg)
                          "show",
                          G_CALLBACK (show_cb),
                          NULL);
+
+       g_signal_connect (dlg,
+                         "hide",
+                         G_CALLBACK (hide_cb),
+                         NULL);
 }
 
 GtkWidget *
@@ -372,14 +542,6 @@ gedit_replace_dialog_get_backwards (GeditReplaceDialog *dialog)
        return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog->priv->backwards_checkbutton));
 }
 
-GtkSourceSearchSettings *
-gedit_replace_dialog_get_search_settings (GeditReplaceDialog *dialog)
-{
-       g_return_val_if_fail (GEDIT_IS_REPLACE_DIALOG (dialog), NULL);
-
-       return dialog->priv->search_settings;
-}
-
 /* This function returns the original search text. The search text from the
  * search settings has been unescaped, and the escape function is not
  * reciprocal. So to avoid bugs, we have to deal with the original search text.
@@ -392,38 +554,4 @@ gedit_replace_dialog_get_search_text (GeditReplaceDialog *dialog)
        return gtk_entry_get_text (GTK_ENTRY (dialog->priv->search_text_entry));
 }
 
-static void
-set_error (GtkEntry    *entry,
-          const gchar *error_msg)
-{
-       if (error_msg == NULL || error_msg[0] == '\0')
-       {
-               gtk_entry_set_icon_from_gicon (entry, GTK_ENTRY_ICON_SECONDARY, NULL);
-               gtk_entry_set_icon_tooltip_text (entry, GTK_ENTRY_ICON_SECONDARY, NULL);
-       }
-       else
-       {
-               GIcon *icon = g_themed_icon_new_with_default_fallbacks ("dialog-error-symbolic");
-
-               gtk_entry_set_icon_from_gicon (entry, GTK_ENTRY_ICON_SECONDARY, icon);
-               gtk_entry_set_icon_tooltip_text (entry, GTK_ENTRY_ICON_SECONDARY, error_msg);
-
-               g_object_unref (icon);
-       }
-}
-
-void
-gedit_replace_dialog_set_search_error (GeditReplaceDialog *dialog,
-                                      const gchar        *error_msg)
-{
-       set_error (GTK_ENTRY (dialog->priv->search_text_entry), error_msg);
-}
-
-void
-gedit_replace_dialog_set_replace_error (GeditReplaceDialog *dialog,
-                                       const gchar        *error_msg)
-{
-       set_error (GTK_ENTRY (dialog->priv->replace_text_entry), error_msg);
-}
-
 /* ex:set ts=8 noet: */
diff --git a/gedit/gedit-replace-dialog.h b/gedit/gedit-replace-dialog.h
index 38a5032..f26d919 100644
--- a/gedit/gedit-replace-dialog.h
+++ b/gedit/gedit-replace-dialog.h
@@ -97,14 +97,6 @@ const gchar          *gedit_replace_dialog_get_replace_text          (GeditReplaceDialog 
*dialog
 
 gboolean                gedit_replace_dialog_get_backwards             (GeditReplaceDialog *dialog);
 
-GtkSourceSearchSettings        *gedit_replace_dialog_get_search_settings       (GeditReplaceDialog *dialog);
-
-void                    gedit_replace_dialog_set_search_error          (GeditReplaceDialog *dialog,
-                                                                        const gchar        *error_msg);
-
-void                    gedit_replace_dialog_set_replace_error         (GeditReplaceDialog *dialog,
-                                                                        const gchar        *error_msg);
-
 G_END_DECLS
 
 #endif  /* __GEDIT_REPLACE_DIALOG_H__  */


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