]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-sidebar-links.c
Added figures by Fotis Tsamis
[evince.git] / shell / ev-sidebar-links.c
index 1205b4e2ecc700c8b1129dbbbeea3adf9b15e734..91986f8c0948d950ca6fe7331819fc2bc8f52bc6 100644 (file)
 #endif
 
 #include <string.h>
+
 #include <glib/gi18n.h>
 #include <gtk/gtk.h>
 
-#include "ev-sidebar-page.h"
-#include "ev-sidebar-links.h"
-#include "ev-job-queue.h"
 #include "ev-document-links.h"
+#include "ev-job-scheduler.h"
+#include "ev-sidebar-links.h"
+#include "ev-sidebar-page.h"
 #include "ev-window.h"
 
 struct _EvSidebarLinksPrivate {
@@ -59,11 +60,6 @@ enum {
        N_SIGNALS
 };
 
-static void links_page_num_func                                (GtkTreeViewColumn *tree_column,
-                                                        GtkCellRenderer   *cell,
-                                                        GtkTreeModel      *tree_model,
-                                                        GtkTreeIter       *iter,
-                                                        EvSidebarLinks    *sidebar_links);
 static void update_page_callback                       (EvPageCache       *page_cache,
                                                         gint               current_page,
                                                         EvSidebarLinks    *sidebar_links);
@@ -150,7 +146,7 @@ ev_sidebar_links_dispose (GObject *object)
        if (sidebar->priv->job) {
                g_signal_handlers_disconnect_by_func (sidebar->priv->job,
                                                      job_finished_callback, sidebar);
-               ev_job_queue_remove_job (sidebar->priv->job);                                                 
+               ev_job_cancel (sidebar->priv->job);                                                   
                g_object_unref (sidebar->priv->job);
                sidebar->priv->job = NULL;
        }
@@ -264,7 +260,8 @@ create_loading_model (void)
        retval = (GtkTreeModel *)gtk_list_store_new (EV_DOCUMENT_LINKS_COLUMN_NUM_COLUMNS,
                                                     G_TYPE_STRING,
                                                     G_TYPE_OBJECT,
-                                                    G_TYPE_BOOLEAN);
+                                                    G_TYPE_BOOLEAN,
+                                                    G_TYPE_STRING);
 
        gtk_list_store_append (GTK_LIST_STORE (retval), &iter);
        markup = g_strdup_printf ("<span size=\"larger\" style=\"italic\">%s</span>", _("Loading..."));
@@ -278,27 +275,6 @@ create_loading_model (void)
        return retval;
 }
 
-static gint
-get_page_from_link (EvLink *link)
-{
-       EvLinkAction *action;
-       EvLinkDest *dest;
-
-       action = ev_link_get_action (link);
-       if (!action)
-               return -1;
-
-       if (ev_link_action_get_action_type (action) !=
-           EV_LINK_ACTION_TYPE_GOTO_DEST)
-               return -1;
-
-       dest = ev_link_action_get_dest (action);
-       if (dest)
-               return ev_link_dest_get_page (dest);
-               
-       return -1;
-}
-
 static void
 print_section_cb (GtkWidget *menuitem, EvSidebarLinks *sidebar)
 {
@@ -321,7 +297,7 @@ print_section_cb (GtkWidget *menuitem, EvSidebarLinks *sidebar)
                if (!link)
                        return;
 
-               first_page = get_page_from_link (link);
+               first_page = ev_link_get_page (link);
                if (first_page == -1) {
                        g_object_unref (link);
                        return;
@@ -336,7 +312,7 @@ print_section_cb (GtkWidget *menuitem, EvSidebarLinks *sidebar)
                                            -1);
 
                        if (link) {
-                               last_page = get_page_from_link (link);
+                               last_page = ev_link_get_page (link);
                                g_object_unref (link);
                        }
                } else {
@@ -348,10 +324,7 @@ print_section_cb (GtkWidget *menuitem, EvSidebarLinks *sidebar)
        
                window = gtk_widget_get_toplevel (GTK_WIDGET (sidebar));
                if (EV_IS_WINDOW (window)) {
-#ifdef WITH_PRINT
-                       ev_window_print_range (EV_WINDOW (window),
-                                              first_page, last_page);
-#endif
+                       ev_window_print_range (EV_WINDOW (window), first_page, last_page);
                }
        }
 }
@@ -461,15 +434,16 @@ ev_sidebar_links_construct (EvSidebarLinks *ev_sidebar_links)
        
        renderer = gtk_cell_renderer_text_new ();
        gtk_tree_view_column_pack_end (GTK_TREE_VIEW_COLUMN (column), renderer, FALSE);
-       gtk_tree_view_column_set_cell_data_func (GTK_TREE_VIEW_COLUMN (column), renderer,
-                                                (GtkTreeCellDataFunc) links_page_num_func,
-                                                ev_sidebar_links, NULL);
+       gtk_tree_view_column_set_attributes (GTK_TREE_VIEW_COLUMN (column), renderer,
+                                            "text", EV_DOCUMENT_LINKS_COLUMN_PAGE_LABEL,
+                                            NULL);
+       g_object_set (G_OBJECT (renderer), "style", PANGO_STYLE_ITALIC, NULL);
 
-       g_signal_connect (GTK_TREE_VIEW (priv->tree_view),
+       g_signal_connect (priv->tree_view,
                          "button_press_event",
                          G_CALLBACK (button_press_cb),
                          ev_sidebar_links);
-       g_signal_connect (GTK_TREE_VIEW (priv->tree_view),
+       g_signal_connect (priv->tree_view,
                          "popup_menu",
                          G_CALLBACK (popup_menu_cb),
                          ev_sidebar_links);
@@ -483,51 +457,38 @@ ev_sidebar_links_init (EvSidebarLinks *ev_sidebar_links)
        ev_sidebar_links_construct (ev_sidebar_links);
 }
 
-static void
-links_page_num_func (GtkTreeViewColumn *tree_column,
-                    GtkCellRenderer   *cell,
-                    GtkTreeModel      *tree_model,
-                    GtkTreeIter       *iter,
-                    EvSidebarLinks    *sidebar_links)
+static gboolean
+fill_page_labels (GtkTreeModel *tree_model,
+                  GtkTreePath *path,
+                  GtkTreeIter *iter,
+                 EvSidebarLinks    *sidebar_links)
 {
        EvLink *link;
        gint page;
+       gchar *page_label;
 
        gtk_tree_model_get (tree_model, iter,
                            EV_DOCUMENT_LINKS_COLUMN_LINK, &link,
                            -1);
 
-       if (!link) {
-               g_object_set (cell,
-                             "visible", FALSE,
-                             NULL);
-               return;
-       }
-
-       page = get_page_from_link (link);
+       if (!link)
+               return FALSE;
 
-       if (page >= 0) {
-               gchar *page_label;
-               gchar *page_string;
+       page = ev_link_get_page (link);
 
-               page_label = ev_page_cache_get_page_label (sidebar_links->priv->page_cache,
-                                                          page);
-               page_string = g_markup_printf_escaped ("<i>%s</i>", page_label);
-
-               g_object_set (cell,
-                             "markup", page_string,
-                             "visible", TRUE,
-                             NULL);
+       if (page < 0) 
+               return FALSE;
+       
+       page_label = ev_page_cache_get_page_label (sidebar_links->priv->page_cache,
+                                                  page);
+       gtk_tree_store_set (GTK_TREE_STORE (tree_model), iter,
+                           EV_DOCUMENT_LINKS_COLUMN_PAGE_LABEL, page_label, 
+                           -1);
 
-               g_free (page_label);
-               g_free (page_string);
-       } else {
-               g_object_set (cell,
-                             "visible", FALSE,
-                             NULL);
-       }
+       g_free (page_label);
 
        g_object_unref (link);
+       return FALSE;
 }
 
 /* Public Functions */
@@ -559,7 +520,7 @@ update_page_callback_foreach (GtkTreeModel *model,
                int current_page;
                int dest_page;
 
-               dest_page = get_page_from_link (link);
+               dest_page = ev_link_get_page (link);
                g_object_unref (link);
                
                current_page = ev_page_cache_get_current_page (sidebar_links->priv->page_cache);
@@ -601,7 +562,7 @@ update_page_callback (EvPageCache    *page_cache,
                if (link) {
                        gint dest_page;
 
-                       dest_page = get_page_from_link (link);
+                       dest_page = ev_link_get_page (link);
                        g_object_unref (link);
                        
                        if (dest_page == current_page)
@@ -630,7 +591,7 @@ row_activated_callback (GtkTreeView       *treeview,
                        GtkTreePath       *arg1,
                        GtkTreeViewColumn *arg2,
                        gpointer           user_data)
-{      
+{
        if (gtk_tree_view_row_expanded (GTK_TREE_VIEW (treeview), arg1)) {
                gtk_tree_view_collapse_row (GTK_TREE_VIEW (treeview), arg1);
        } else {
@@ -673,6 +634,8 @@ job_finished_callback (EvJobLinks     *job,
        
        priv->model = job->model;
        g_object_notify (G_OBJECT (sidebar_links), "model");
+       
+       gtk_tree_model_foreach (priv->model, (GtkTreeModelForeachFunc)fill_page_labels, sidebar_links);
 
        gtk_tree_view_set_model (GTK_TREE_VIEW (priv->tree_view), job->model);
        
@@ -683,18 +646,26 @@ job_finished_callback (EvJobLinks     *job,
 
        selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->tree_view));
        gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
-       priv->selection_id = g_signal_connect (selection, "changed",
-                                              G_CALLBACK (selection_changed_callback),
-                                              sidebar_links);
-       priv->page_changed_id = g_signal_connect (priv->page_cache, "page-changed",
+       
+       if (priv->selection_id <= 0) {
+               priv->selection_id =
+                       g_signal_connect (selection, "changed",
+                                         G_CALLBACK (selection_changed_callback),
+                                         sidebar_links);
+       }
+       priv->page_changed_id = g_signal_connect (priv->page_cache, "page-changed",
                                                  G_CALLBACK (update_page_callback),
                                                  sidebar_links);
-       priv->row_activated_id = g_signal_connect (G_OBJECT (priv->tree_view), "row-activated",
-                                                   G_CALLBACK (row_activated_callback), sidebar_links);
+       if (priv->row_activated_id <= 0) {
+               priv->row_activated_id =
+                       g_signal_connect (priv->tree_view, "row-activated",
+                                         G_CALLBACK (row_activated_callback),
+                                         sidebar_links);
+       }
+       
        update_page_callback (priv->page_cache,
                              ev_page_cache_get_current_page (priv->page_cache),
                              sidebar_links);
-
 }
 
 static void
@@ -732,7 +703,7 @@ ev_sidebar_links_set_document (EvSidebarPage  *sidebar_page,
                          G_CALLBACK (job_finished_callback),
                          sidebar_links);
        /* The priority doesn't matter for this job */
-       ev_job_queue_add_job (priv->job, EV_JOB_PRIORITY_LOW);
+       ev_job_scheduler_push_job (priv->job, EV_JOB_PRIORITY_NONE);
 }
 
 static gboolean