[evince] shell: show a sidebar with search results when find is active



commit 930ad17aac664010f8b346b1414cd05b97dc2275
Author: Carlos Garcia Campos <carlosgc gnome org>
Date:   Sun Jun 23 13:28:50 2013 +0200

    shell: show a sidebar with search results when find is active
    
    https://bugzilla.gnome.org/show_bug.cgi?id=566827

 shell/ev-window.c |   67 +++++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 57 insertions(+), 10 deletions(-)
---
diff --git a/shell/ev-window.c b/shell/ev-window.c
index fcf6b9f..f9533af 100644
--- a/shell/ev-window.c
+++ b/shell/ev-window.c
@@ -42,6 +42,7 @@
 #include <gtk/gtk.h>
 
 #include "eggfindbar.h"
+#include "ev-find-sidebar.h"
 
 #include "ev-application.h"
 #include "ev-document-factory.h"
@@ -139,6 +140,7 @@ struct _EvWindowPrivate {
        GtkWidget *password_view;
        GtkWidget *sidebar_thumbs;
        GtkWidget *sidebar_links;
+       GtkWidget *find_sidebar;
        GtkWidget *sidebar_attachments;
        GtkWidget *sidebar_layers;
        GtkWidget *sidebar_annots;
@@ -3874,11 +3876,24 @@ ev_window_cmd_edit_find (GtkAction *action, EvWindow *ev_window)
        ev_window_show_find_bar (ev_window);
 }
 
+static void
+ev_window_find_previous (EvWindow *ev_window)
+{
+       ev_view_find_previous (EV_VIEW (ev_window->priv->view));
+       ev_find_sidebar_previous (EV_FIND_SIDEBAR (ev_window->priv->find_sidebar));
+}
+
+static void
+ev_window_find_next (EvWindow *ev_window)
+{
+       ev_view_find_next (EV_VIEW (ev_window->priv->view));
+       ev_find_sidebar_next (EV_FIND_SIDEBAR (ev_window->priv->find_sidebar));
+}
 
 static gboolean
-find_next_idle_cb (EvView *view)
+find_next_idle_cb (EvWindow *ev_window)
 {
-       ev_view_find_next (view);
+       ev_window_find_next (ev_window);
        return FALSE;
 }
 
@@ -3895,15 +3910,15 @@ ev_window_cmd_edit_find_next (GtkAction *action, EvWindow *ev_window)
 
        /* Use idle to make sure view allocation happens before find */
        if (find_bar_hidden)
-               g_idle_add ((GSourceFunc)find_next_idle_cb, ev_window->priv->view);
+               g_idle_add ((GSourceFunc)find_next_idle_cb, ev_window);
        else
-               ev_view_find_next (EV_VIEW (ev_window->priv->view));
+               ev_window_find_next (ev_window);
 }
 
 static gboolean
-find_previous_idle_cb (EvView *view)
+find_previous_idle_cb (EvWindow *ev_window)
 {
-       ev_view_find_previous (view);
+       ev_window_find_previous (ev_window);
        return FALSE;
 }
 
@@ -3920,9 +3935,9 @@ ev_window_cmd_edit_find_previous (GtkAction *action, EvWindow *ev_window)
 
        /* Use idle to make sure view allocation happens before find */
        if (find_bar_hidden)
-               g_idle_add ((GSourceFunc)find_previous_idle_cb, ev_window->priv->view);
+               g_idle_add ((GSourceFunc)find_previous_idle_cb, ev_window);
        else
-               ev_view_find_previous (EV_VIEW (ev_window->priv->view));
+               ev_window_find_previous (ev_window);
 }
 
 static void
@@ -5222,6 +5237,15 @@ attachment_bar_menu_popup_cb (EvSidebarAttachments *attachbar,
 }
 
 static void
+find_sidebar_result_activated_cb (EvFindSidebar *find_sidebar,
+                                 gint           page,
+                                 gint           result,
+                                 EvWindow      *window)
+{
+       ev_view_find_set_result (EV_VIEW (window->priv->view), page, result);
+}
+
+static void
 ev_window_update_find_status_message (EvWindow *ev_window)
 {
        gchar *message;
@@ -5298,6 +5322,7 @@ ev_window_find_job_updated_cb (EvJobFind *job,
        if (find_check_refresh_rate (job, FIND_PAGE_RATE_REFRESH)) {
                ev_window_update_actions_sensitivity (ev_window);
                ev_window_update_find_status_message (ev_window);
+               ev_find_sidebar_update (EV_FIND_SIDEBAR (ev_window->priv->find_sidebar));
        }
 }
 
@@ -5323,14 +5348,14 @@ static void
 find_bar_previous_cb (EggFindBar *find_bar,
                      EvWindow   *ev_window)
 {
-       ev_view_find_previous (EV_VIEW (ev_window->priv->view));
+       ev_window_find_previous (ev_window);
 }
 
 static void
 find_bar_next_cb (EggFindBar *find_bar,
                  EvWindow   *ev_window)
 {
-       ev_view_find_next (EV_VIEW (ev_window->priv->view));
+       ev_window_find_next (ev_window);
 }
 
 static void
@@ -5368,6 +5393,8 @@ ev_window_search_start (EvWindow *ev_window)
                ev_job_find_set_options (EV_JOB_FIND (ev_window->priv->find_job), options);
 
                ev_view_find_started (EV_VIEW (ev_window->priv->view), EV_JOB_FIND 
(ev_window->priv->find_job));
+               ev_find_sidebar_start (EV_FIND_SIDEBAR (ev_window->priv->find_sidebar),
+                                      EV_JOB_FIND (ev_window->priv->find_job));
 
                g_signal_connect (ev_window->priv->find_job, "finished",
                                  G_CALLBACK (ev_window_find_job_finished_cb),
@@ -5379,6 +5406,7 @@ ev_window_search_start (EvWindow *ev_window)
        } else {
                ev_window_update_actions_sensitivity (ev_window);
                egg_find_bar_set_status_text (find_bar, NULL);
+               ev_find_sidebar_clear (EV_FIND_SIDEBAR (ev_window->priv->find_sidebar));
                gtk_widget_queue_draw (GTK_WIDGET (ev_window->priv->view));
        }
 }
@@ -5451,6 +5479,12 @@ ev_window_show_find_bar (EvWindow *ev_window)
 
        ev_history_freeze (ev_window->priv->history);
 
+       g_object_ref (ev_window->priv->sidebar);
+       gtk_container_remove (GTK_CONTAINER (ev_window->priv->hpaned), ev_window->priv->sidebar);
+       gtk_paned_pack1 (GTK_PANED (ev_window->priv->hpaned),
+                        ev_window->priv->find_sidebar, FALSE, FALSE);
+       gtk_widget_show (ev_window->priv->find_sidebar);
+
        update_chrome_flag (ev_window, EV_CHROME_FINDBAR, TRUE);
        update_chrome_visibility (ev_window);
        gtk_widget_grab_focus (ev_window->priv->find_bar);
@@ -5463,6 +5497,12 @@ ev_window_close_find_bar (EvWindow *ev_window)
        if (!gtk_widget_get_visible (ev_window->priv->find_bar))
                return;
 
+       g_object_ref (ev_window->priv->find_sidebar);
+       gtk_container_remove (GTK_CONTAINER (ev_window->priv->hpaned),
+                             ev_window->priv->find_sidebar);
+       gtk_paned_pack1 (GTK_PANED (ev_window->priv->hpaned),
+                        ev_window->priv->sidebar, FALSE, FALSE);
+
        update_chrome_flag (ev_window, EV_CHROME_FINDBAR, FALSE);
        update_chrome_visibility (ev_window);
        gtk_widget_grab_focus (ev_window->priv->view);
@@ -7354,6 +7394,13 @@ ev_window_init (EvWindow *ev_window)
        gtk_widget_show (ev_window->priv->view);
        gtk_widget_show (ev_window->priv->password_view);
 
+       /* Find results sidebar */
+       ev_window->priv->find_sidebar = ev_find_sidebar_new ();
+       g_signal_connect (ev_window->priv->find_sidebar,
+                         "result-activated",
+                         G_CALLBACK (find_sidebar_result_activated_cb),
+                         ev_window);
+
        /* We own a ref on these widgets, as we can swap them in and out */
        g_object_ref (ev_window->priv->view);
        g_object_ref (ev_window->priv->password_view);


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