]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-sidebar-links.c
Updated Serbian translation
[evince.git] / shell / ev-sidebar-links.c
index 84b49dd292b47175aa5c0ac03df28e149082aba5..ac728ed6b15fec191331000360653187cca8cf26 100644 (file)
@@ -55,6 +55,10 @@ enum {
        PROP_WIDGET,
 };
 
        PROP_WIDGET,
 };
 
+enum {
+       LINK_ACTIVATED,
+       N_SIGNALS
+};
 
 static void links_page_num_func                                (GtkTreeViewColumn *tree_column,
                                                         GtkCellRenderer   *cell,
 
 static void links_page_num_func                                (GtkTreeViewColumn *tree_column,
                                                         GtkCellRenderer   *cell,
@@ -77,6 +81,7 @@ static gboolean ev_sidebar_links_support_document     (EvSidebarPage  *sidebar_page,
                                                         EvDocument     *document);
 static const gchar* ev_sidebar_links_get_label                 (EvSidebarPage *sidebar_page);
 
                                                         EvDocument     *document);
 static const gchar* ev_sidebar_links_get_label                 (EvSidebarPage *sidebar_page);
 
+static guint signals[N_SIGNALS];
 
 G_DEFINE_TYPE_EXTENDED (EvSidebarLinks, 
                         ev_sidebar_links, 
 
 G_DEFINE_TYPE_EXTENDED (EvSidebarLinks, 
                         ev_sidebar_links, 
@@ -143,12 +148,6 @@ ev_sidebar_links_dispose (GObject *object)
 {
        EvSidebarLinks *sidebar = EV_SIDEBAR_LINKS (object);
 
 {
        EvSidebarLinks *sidebar = EV_SIDEBAR_LINKS (object);
 
-       if (sidebar->priv->document) {
-               g_object_unref (sidebar->priv->document);
-               sidebar->priv->document = NULL;
-               sidebar->priv->page_cache = NULL;
-       }
-
        if (sidebar->priv->job) {
                g_signal_handlers_disconnect_by_func (sidebar->priv->job,
                                                      job_finished_callback, sidebar);
        if (sidebar->priv->job) {
                g_signal_handlers_disconnect_by_func (sidebar->priv->job,
                                                      job_finished_callback, sidebar);
@@ -157,6 +156,18 @@ ev_sidebar_links_dispose (GObject *object)
                sidebar->priv->job = NULL;
        }
 
                sidebar->priv->job = NULL;
        }
 
+       if (sidebar->priv->model) {
+               g_object_unref (sidebar->priv->model);
+               sidebar->priv->model = NULL;
+       }
+
+       if (sidebar->priv->document) {
+               g_object_unref (sidebar->priv->document);
+               sidebar->priv->document = NULL;
+               sidebar->priv->page_cache = NULL;
+       }
+
+
        G_OBJECT_CLASS (ev_sidebar_links_parent_class)->dispose (object);
 }
 
        G_OBJECT_CLASS (ev_sidebar_links_parent_class)->dispose (object);
 }
 
@@ -171,6 +182,14 @@ ev_sidebar_links_class_init (EvSidebarLinksClass *ev_sidebar_links_class)
        g_object_class->get_property = ev_sidebar_links_get_property;
        g_object_class->dispose = ev_sidebar_links_dispose;
 
        g_object_class->get_property = ev_sidebar_links_get_property;
        g_object_class->dispose = ev_sidebar_links_dispose;
 
+       signals[LINK_ACTIVATED] = g_signal_new ("link-activated",
+                        G_TYPE_FROM_CLASS (g_object_class),
+                        G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+                        G_STRUCT_OFFSET (EvSidebarLinksClass, link_activated),
+                        NULL, NULL,
+                        g_cclosure_marshal_VOID__OBJECT,
+                        G_TYPE_NONE, 1, G_TYPE_OBJECT);
+
        g_object_class_install_property (g_object_class,
                                         PROP_MODEL,
                                         g_param_spec_object ("model",
        g_object_class_install_property (g_object_class,
                                         PROP_MODEL,
                                         g_param_spec_object ("model",
@@ -210,10 +229,11 @@ selection_changed_callback (GtkTreeSelection   *selection,
 
                g_signal_handler_block (ev_sidebar_links->priv->page_cache,
                                        ev_sidebar_links->priv->page_changed_id);
 
                g_signal_handler_block (ev_sidebar_links->priv->page_cache,
                                        ev_sidebar_links->priv->page_changed_id);
-               /* FIXME: we should handle this better.  This breaks w/ URLs */
-               ev_page_cache_set_link (ev_sidebar_links->priv->page_cache, link);
+               g_signal_emit (ev_sidebar_links, signals[LINK_ACTIVATED], 0, link);
                g_signal_handler_unblock (ev_sidebar_links->priv->page_cache,
                                          ev_sidebar_links->priv->page_changed_id);
                g_signal_handler_unblock (ev_sidebar_links->priv->page_cache,
                                          ev_sidebar_links->priv->page_changed_id);
+
+               g_object_unref (link);
        }
 }
 
        }
 }
 
@@ -262,13 +282,19 @@ print_section_cb (GtkWidget *menuitem, EvSidebarLinks *sidebar)
                                    -1);
                first_page = ev_link_get_page (link) + 1;
 
                                    -1);
                first_page = ev_link_get_page (link) + 1;
 
+               if (link)
+                       g_object_unref (link);
+
                if (gtk_tree_model_iter_next (model, &iter)) {
                        gtk_tree_model_get (model, &iter,
                                            EV_DOCUMENT_LINKS_COLUMN_LINK, &link,
                                            -1);
                        last_page = ev_link_get_page (link);
                if (gtk_tree_model_iter_next (model, &iter)) {
                        gtk_tree_model_get (model, &iter,
                                            EV_DOCUMENT_LINKS_COLUMN_LINK, &link,
                                            -1);
                        last_page = ev_link_get_page (link);
+
+                       if (link)
+                               g_object_unref (link);
                } else {
                } else {
-                       last_page = -1;
+                       last_page =  ev_page_cache_get_n_pages (sidebar->priv->page_cache);
                }
        
                window = gtk_widget_get_toplevel (GTK_WIDGET (sidebar));
                }
        
                window = gtk_widget_get_toplevel (GTK_WIDGET (sidebar));
@@ -420,7 +446,7 @@ links_page_num_func (GtkTreeViewColumn *tree_column,
                            -1);
        
        if (link != NULL &&
                            -1);
        
        if (link != NULL &&
-           ev_link_get_link_type (link) == EV_LINK_TYPE_PAGE) {
+           ev_link_get_page (link) >= 0) {
                gchar *page_label;
                gchar *page_string;
 
                gchar *page_label;
                gchar *page_string;
 
@@ -439,6 +465,9 @@ links_page_num_func (GtkTreeViewColumn *tree_column,
                              "visible", FALSE,
                              NULL);
        }
                              "visible", FALSE,
                              NULL);
        }
+
+       if (link)
+               g_object_unref (link);
 }
 
 /* Public Functions */
 }
 
 /* Public Functions */
@@ -466,7 +495,7 @@ update_page_callback_foreach (GtkTreeModel *model,
                            EV_DOCUMENT_LINKS_COLUMN_LINK, &link,
                            -1);
 
                            EV_DOCUMENT_LINKS_COLUMN_LINK, &link,
                            -1);
 
-       if (link && ev_link_get_link_type (link) == EV_LINK_TYPE_PAGE) {
+       if (link) {
                int current_page;
 
                current_page = ev_page_cache_get_current_page (sidebar_links->priv->page_cache);
                int current_page;
 
                current_page = ev_page_cache_get_current_page (sidebar_links->priv->page_cache);
@@ -474,13 +503,14 @@ update_page_callback_foreach (GtkTreeModel *model,
                        GtkTreeSelection *selection;
 
                        selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (sidebar_links->priv->tree_view));
                        GtkTreeSelection *selection;
 
                        selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (sidebar_links->priv->tree_view));
-
                        gtk_tree_selection_select_path (selection, path);
                        gtk_tree_selection_select_path (selection, path);
-
+                       g_object_unref (link);
+                       
                        return TRUE;
                }
                        return TRUE;
                }
+               g_object_unref (link);
        }
        }
-       
+
        return FALSE;
 }
 
        return FALSE;
 }
 
@@ -490,19 +520,37 @@ update_page_callback (EvPageCache    *page_cache,
                      EvSidebarLinks *sidebar_links)
 {
        GtkTreeSelection *selection;
                      EvSidebarLinks *sidebar_links)
 {
        GtkTreeSelection *selection;
+       GtkTreeModel *model;
+       GtkTreeIter iter;
+       
+       selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (sidebar_links->priv->tree_view));
+
+       if (gtk_tree_selection_get_selected (selection, &model, &iter)) {
+               EvLink *link;
+
+               gtk_tree_model_get (model, &iter,
+                                   EV_DOCUMENT_LINKS_COLUMN_LINK, &link,
+                                   -1);
+               if (link) {
+                       gint current_page;              
+                       current_page = ev_page_cache_get_current_page (sidebar_links->priv->page_cache);
+                       if (ev_link_get_page (link) == current_page) {
+                               g_object_unref (link);
+                               return;
+                       }
+                       g_object_unref (link);
+               }
+       }               
+
        /* We go through the tree linearly looking for the first page that
         * matches.  This is pretty inefficient.  We can do something neat with
         * a GtkTreeModelSort here to make it faster, if it turns out to be
         * slow.
         */
        /* We go through the tree linearly looking for the first page that
         * matches.  This is pretty inefficient.  We can do something neat with
         * a GtkTreeModelSort here to make it faster, if it turns out to be
         * slow.
         */
-
-       selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (sidebar_links->priv->tree_view));
-
        g_signal_handler_block (selection, sidebar_links->priv->selection_id);
        g_signal_handler_block (sidebar_links->priv->tree_view, sidebar_links->priv->row_activated_id);
 
        g_signal_handler_block (selection, sidebar_links->priv->selection_id);
        g_signal_handler_block (sidebar_links->priv->tree_view, sidebar_links->priv->row_activated_id);
 
-       gtk_tree_selection_unselect_all (selection);
-       gtk_tree_model_foreach (sidebar_links->priv->model,
+       gtk_tree_model_foreach (model,
                                update_page_callback_foreach,
                                sidebar_links);
 
                                update_page_callback_foreach,
                                sidebar_links);
 
@@ -529,13 +577,11 @@ static void
 expand_open_links (GtkTreeView *tree_view, GtkTreeModel *model, GtkTreeIter *parent)
 {
        GtkTreeIter iter;
 expand_open_links (GtkTreeView *tree_view, GtkTreeModel *model, GtkTreeIter *parent)
 {
        GtkTreeIter iter;
-       EvLink *link;
        gboolean expand;
 
        if (gtk_tree_model_iter_children (model, &iter, parent)) {
                do {
                        gtk_tree_model_get (model, &iter,
        gboolean expand;
 
        if (gtk_tree_model_iter_children (model, &iter, parent)) {
                do {
                        gtk_tree_model_get (model, &iter,
-                                           EV_DOCUMENT_LINKS_COLUMN_LINK, &link,
                                            EV_DOCUMENT_LINKS_COLUMN_EXPAND, &expand,
                                            -1);
                        if (expand) {
                                            EV_DOCUMENT_LINKS_COLUMN_EXPAND, &expand,
                                            -1);
                        if (expand) {
@@ -559,11 +605,12 @@ job_finished_callback (EvJobLinks     *job,
        GtkTreeSelection *selection;
 
        priv = sidebar_links->priv;
        GtkTreeSelection *selection;
 
        priv = sidebar_links->priv;
-
-       priv->model = g_object_ref (job->model);
+       
+       priv->model = job->model;
        g_object_notify (G_OBJECT (sidebar_links), "model");
 
        gtk_tree_view_set_model (GTK_TREE_VIEW (priv->tree_view), job->model);
        g_object_notify (G_OBJECT (sidebar_links), "model");
 
        gtk_tree_view_set_model (GTK_TREE_VIEW (priv->tree_view), job->model);
+       
        g_object_unref (job);
        priv->job = NULL;
 
        g_object_unref (job);
        priv->job = NULL;