[evolution] Search bar functionality polishing Polishing after switching from Evolution's highlight implementati



commit f6d4d6db614917b9c69a6ef540c4aabfa4486f6a
Author: Tomas Popela <tpopela redhat com>
Date:   Mon Apr 15 16:46:57 2013 +0200

    Search bar functionality polishing
    Polishing after switching from Evolution's highlight implementation to WebKit's one.

 e-util/e-search-bar.c | 98 +++++++++++++++++++++++++++++++++------------------
 e-util/e-web-view.c   |  8 +++++
 e-util/e-web-view.h   |  1 +
 3 files changed, 73 insertions(+), 34 deletions(-)
---
diff --git a/e-util/e-search-bar.c b/e-util/e-search-bar.c
index 678e2e8..9021a6f 100644
--- a/e-util/e-search-bar.c
+++ b/e-util/e-search-bar.c
@@ -39,6 +39,8 @@ struct _ESearchBarPrivate {
        GtkWidget *wrapped_next_box;
        GtkWidget *wrapped_prev_box;
        GtkWidget *matches_label;
+       GtkWidget *prev_button;
+       GtkWidget *next_button;
 
        gchar *active_search;
 
@@ -86,14 +88,10 @@ static void
 search_bar_update_highlights (ESearchBar *search_bar)
 {
        EWebView *web_view;
-       gboolean visible;
 
        web_view = e_search_bar_get_web_view (search_bar);
 
-       visible = gtk_widget_get_visible (GTK_WIDGET (search_bar));
-
-       webkit_web_view_set_highlight_text_matches (
-               WEBKIT_WEB_VIEW (web_view), visible);
+       webkit_web_view_unmark_text_matches (WEBKIT_WEB_VIEW (web_view));
 
        e_search_bar_changed (search_bar);
 }
@@ -105,10 +103,10 @@ search_bar_find (ESearchBar *search_bar,
        EWebView *web_view;
        GtkWidget *widget;
        gboolean case_sensitive;
-       gboolean new_search;
        gboolean wrapped = FALSE;
        gboolean success;
        gchar *text;
+       guint matches;
 
        web_view = e_search_bar_get_web_view (search_bar);
        case_sensitive = e_search_bar_get_case_sensitive (search_bar);
@@ -120,22 +118,14 @@ search_bar_find (ESearchBar *search_bar,
                return;
        }
 
-       new_search =
-               (search_bar->priv->active_search == NULL) ||
-               (g_strcmp0 (text, search_bar->priv->active_search) != 0);
-
-       if (new_search) {
-               guint matches;
-
-               webkit_web_view_unmark_text_matches (
-                       WEBKIT_WEB_VIEW (web_view));
-               matches = webkit_web_view_mark_text_matches (
-                       WEBKIT_WEB_VIEW (web_view),
-                       text, case_sensitive, 0);
-               webkit_web_view_set_highlight_text_matches (
-                       WEBKIT_WEB_VIEW (web_view), TRUE);
-               search_bar_update_matches (search_bar, matches);
-       }
+       webkit_web_view_unmark_text_matches (
+               WEBKIT_WEB_VIEW (web_view));
+       matches = webkit_web_view_mark_text_matches (
+               WEBKIT_WEB_VIEW (web_view),
+               text, case_sensitive, 0);
+       webkit_web_view_set_highlight_text_matches (
+               WEBKIT_WEB_VIEW (web_view), TRUE);
+       search_bar_update_matches (search_bar, matches);
 
        success = webkit_web_view_search_text (
                WEBKIT_WEB_VIEW (web_view),
@@ -149,10 +139,12 @@ search_bar_find (ESearchBar *search_bar,
        g_free (search_bar->priv->active_search);
        search_bar->priv->active_search = text;
 
+       gtk_widget_set_sensitive (search_bar->priv->next_button, matches != 0);
+       gtk_widget_set_sensitive (search_bar->priv->prev_button, matches != 0);
+
        g_object_notify (G_OBJECT (search_bar), "active-search");
 
        /* Update wrapped label visibility. */
-
        widget = search_bar->priv->wrapped_next_box;
 
        if (wrapped && search_forward)
@@ -208,6 +200,32 @@ search_bar_toggled_cb (ESearchBar *search_bar)
 }
 
 static void
+web_view_load_status_changed_cb (WebKitWebView *webkit_web_view,
+                                 GParamSpec *pspec,
+                                 gpointer user_data)
+{
+       WebKitLoadStatus status;
+       ESearchBar *search_bar;
+
+       status = webkit_web_view_get_load_status (webkit_web_view);
+       if (status != WEBKIT_LOAD_FINISHED)
+               return;
+
+       if (!user_data)
+               return;
+
+       search_bar = E_SEARCH_BAR (user_data);
+
+       if (gtk_widget_get_visible (GTK_WIDGET (search_bar))) {
+               if (search_bar->priv->active_search != NULL) {
+                      search_bar_find (search_bar, TRUE);
+               }
+       } else {
+               e_web_view_update_highlights (search_bar->priv->web_view);
+       }
+}
+
+static void
 search_bar_set_web_view (ESearchBar *search_bar,
                          EWebView *web_view)
 {
@@ -215,6 +233,10 @@ search_bar_set_web_view (ESearchBar *search_bar,
        g_return_if_fail (search_bar->priv->web_view == NULL);
 
        search_bar->priv->web_view = g_object_ref (web_view);
+
+       g_signal_connect (
+               web_view, "notify::load-status",
+               G_CALLBACK (web_view_load_status_changed_cb), search_bar);
 }
 
 static void
@@ -303,6 +325,16 @@ search_bar_dispose (GObject *object)
                priv->case_sensitive_button = NULL;
        }
 
+       if (priv->prev_button != NULL) {
+               g_object_unref (priv->prev_button);
+               priv->prev_button = NULL;
+       }
+
+       if (priv->next_button != NULL) {
+               g_object_unref (priv->next_button);
+               priv->next_button = NULL;
+       }
+
        if (priv->wrapped_next_box != NULL) {
                g_object_unref (priv->wrapped_next_box);
                priv->wrapped_next_box = NULL;
@@ -356,6 +388,7 @@ static void
 search_bar_show (GtkWidget *widget)
 {
        ESearchBar *search_bar;
+       EWebView *web_view;
 
        search_bar = E_SEARCH_BAR (widget);
 
@@ -364,7 +397,10 @@ search_bar_show (GtkWidget *widget)
 
        gtk_widget_grab_focus (search_bar->priv->entry);
 
-       search_bar_update_highlights (search_bar);
+       web_view = e_search_bar_get_web_view (search_bar);
+       webkit_web_view_unmark_text_matches (WEBKIT_WEB_VIEW (web_view));
+
+       search_bar_find (search_bar, TRUE);
 }
 
 static void
@@ -378,6 +414,8 @@ search_bar_hide (GtkWidget *widget)
        GTK_WIDGET_CLASS (e_search_bar_parent_class)->hide (widget);
 
        search_bar_update_highlights (search_bar);
+
+       e_web_view_update_highlights (search_bar->priv->web_view);
 }
 
 static gboolean
@@ -576,13 +614,9 @@ e_search_bar_init (ESearchBar *search_bar)
        gtk_widget_set_tooltip_text (
                widget, _("Find the previous occurrence of the phrase"));
        gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0);
+       search_bar->priv->prev_button = g_object_ref (widget);
        gtk_widget_show (widget);
 
-       g_object_bind_property (
-               search_bar, "active-search",
-               widget, "sensitive",
-               G_BINDING_SYNC_CREATE);
-
        g_signal_connect_swapped (
                widget, "clicked",
                G_CALLBACK (search_bar_find_previous_cb), search_bar);
@@ -595,13 +629,9 @@ e_search_bar_init (ESearchBar *search_bar)
        gtk_widget_set_tooltip_text (
                widget, _("Find the next occurrence of the phrase"));
        gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0);
+       search_bar->priv->next_button = g_object_ref (widget);
        gtk_widget_show (widget);
 
-       g_object_bind_property (
-               search_bar, "active-search",
-               widget, "sensitive",
-               G_BINDING_SYNC_CREATE);
-
        g_signal_connect_swapped (
                widget, "clicked",
                G_CALLBACK (search_bar_find_next_cb), search_bar);
diff --git a/e-util/e-web-view.c b/e-util/e-web-view.c
index 385f8fe..1c0d88c 100644
--- a/e-util/e-web-view.c
+++ b/e-util/e-web-view.c
@@ -2335,6 +2335,14 @@ e_web_view_clear_highlights (EWebView *web_view)
                g_free (g_queue_pop_head (&web_view->priv->highlights));
 }
 
+void
+e_web_view_update_highlights (EWebView *web_view)
+{
+       g_return_if_fail (E_IS_WEB_VIEW (web_view));
+
+       web_view_update_document_highlights (web_view);
+}
+
 GtkAction *
 e_web_view_get_action (EWebView *web_view,
                        const gchar *action_name)
diff --git a/e-util/e-web-view.h b/e-util/e-web-view.h
index 6fdf601..07e2541 100644
--- a/e-util/e-web-view.h
+++ b/e-util/e-web-view.h
@@ -174,6 +174,7 @@ void                e_web_view_set_save_as_proxy    (EWebView *web_view,
 void           e_web_view_add_highlight        (EWebView *web_view,
                                                 const gchar *highlight);
 void           e_web_view_clear_highlights     (EWebView *web_view);
+void           e_web_view_update_highlights    (EWebView *web_view);
 GtkAction *    e_web_view_get_action           (EWebView *web_view,
                                                 const gchar *action_name);
 GtkActionGroup *e_web_view_get_action_group    (EWebView *web_view,


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