#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-window.h"
+#include "ev-gui.h"
struct _EvSidebarLinksPrivate {
GtkWidget *tree_view;
/* Keep these ids around for blocking */
guint selection_id;
guint page_changed_id;
+ guint row_activated_id;
EvJob *job;
GtkTreeModel *model;
};
-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);
+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);
+static void row_activated_callback (GtkTreeView *treeview,
+ GtkTreePath *arg1,
+ GtkTreeViewColumn *arg2,
+ gpointer user_data);
+static void ev_sidebar_links_page_iface_init (EvSidebarPageIface *iface);
+static void ev_sidebar_links_clear_document (EvSidebarLinks *sidebar_links);
+static void ev_sidebar_links_set_document (EvSidebarPage *sidebar_page,
+ EvDocument *document);
+static gboolean ev_sidebar_links_support_document (EvSidebarPage *sidebar_page,
+ EvDocument *document);
+static const gchar* ev_sidebar_links_get_label (EvSidebarPage *sidebar_page);
+
+
+G_DEFINE_TYPE_EXTENDED (EvSidebarLinks,
+ ev_sidebar_links,
+ GTK_TYPE_VBOX,
+ 0,
+ G_IMPLEMENT_INTERFACE (EV_TYPE_SIDEBAR_PAGE,
+ ev_sidebar_links_page_iface_init))
-G_DEFINE_TYPE (EvSidebarLinks, ev_sidebar_links, GTK_TYPE_VBOX)
-
#define EV_SIDEBAR_LINKS_GET_PRIVATE(object) \
(G_TYPE_INSTANCE_GET_PRIVATE ((object), EV_TYPE_SIDEBAR_LINKS, EvSidebarLinksPrivate))
}
static void
-selection_changed_cb (GtkTreeSelection *selection,
- EvSidebarLinks *ev_sidebar_links)
+selection_changed_callback (GtkTreeSelection *selection,
+ EvSidebarLinks *ev_sidebar_links)
{
EvDocument *document;
GtkTreeModel *model;
return retval;
}
+static void
+print_section_cb (GtkWidget *menuitem, EvSidebarLinks *sidebar)
+{
+ GtkWidget *window;
+ GtkTreeSelection *selection;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+
+ selection = gtk_tree_view_get_selection
+ (GTK_TREE_VIEW (sidebar->priv->tree_view));
+
+ if (gtk_tree_selection_get_selected (selection, &model, &iter)) {
+ EvLink *link;
+ int first_page, last_page;
+
+ gtk_tree_model_get (model, &iter,
+ EV_DOCUMENT_LINKS_COLUMN_LINK, &link,
+ -1);
+ first_page = ev_link_get_page (link) + 1;
+
+ 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);
+ } else {
+ last_page = -1;
+ }
+
+ window = gtk_widget_get_toplevel (GTK_WIDGET (sidebar));
+ if (EV_IS_WINDOW (window)) {
+ ev_window_print_range (EV_WINDOW (window),
+ first_page, last_page);
+ }
+ }
+}
+
+static GtkMenu *
+build_popup_menu (EvSidebarLinks *sidebar)
+{
+ GtkWidget *menu;
+ GtkWidget *item;
+
+ menu = gtk_menu_new ();
+ item = gtk_image_menu_item_new_from_stock (GTK_STOCK_PRINT, NULL);
+ gtk_label_set_label (GTK_LABEL (GTK_BIN (item)->child), _("Print..."));
+ gtk_widget_show (item);
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+ g_signal_connect (item, "activate",
+ G_CALLBACK (print_section_cb), sidebar);
+
+ return GTK_MENU (menu);
+}
+
+static void
+popup_menu_cb (GtkWidget *treeview, EvSidebarLinks *sidebar)
+{
+ GtkMenu *menu = build_popup_menu (sidebar);
+
+ gtk_menu_popup (menu, NULL, NULL,
+ ev_gui_menu_position_tree_selection,
+ sidebar->priv->tree_view, 0,
+ gtk_get_current_event_time ());
+ gtk_menu_shell_select_first (GTK_MENU_SHELL (menu), FALSE);
+}
+
+static gboolean
+button_press_cb (GtkWidget *treeview,
+ GdkEventButton *event,
+ EvSidebarLinks *sidebar)
+{
+ GtkTreePath *path = NULL;
+
+ if (event->button == 3) {
+ if (gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (treeview),
+ event->x,
+ event->y,
+ &path,
+ NULL, NULL, NULL)) {
+ gtk_tree_view_set_cursor (GTK_TREE_VIEW (treeview),
+ path, NULL, FALSE);
+ gtk_menu_popup (build_popup_menu (sidebar), NULL,
+ NULL, NULL, NULL, event->button,
+ gtk_get_current_event_time ());
+ gtk_tree_path_free (path);
+
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+
static void
ev_sidebar_links_construct (EvSidebarLinks *ev_sidebar_links)
{
(GtkTreeCellDataFunc) links_page_num_func,
ev_sidebar_links, NULL);
-
+ g_signal_connect (GTK_TREE_VIEW (priv->tree_view),
+ "button_press_event",
+ G_CALLBACK (button_press_cb),
+ ev_sidebar_links);
+ g_signal_connect (GTK_TREE_VIEW (priv->tree_view),
+ "popup_menu",
+ G_CALLBACK (popup_menu_cb),
+ ev_sidebar_links);
}
static void
return ev_sidebar_links;
}
-void
+static void
ev_sidebar_links_clear_document (EvSidebarLinks *sidebar_links)
{
EvSidebarLinksPrivate *priv;
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);
gtk_tree_selection_unselect_all (selection);
gtk_tree_model_foreach (sidebar_links->priv->model,
sidebar_links);
g_signal_handler_unblock (selection, sidebar_links->priv->selection_id);
+ g_signal_handler_unblock (sidebar_links->priv->tree_view, sidebar_links->priv->row_activated_id);
}
+static void
+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 {
+ gtk_tree_view_expand_row (GTK_TREE_VIEW (treeview), arg1, FALSE);
+ }
+
+ return;
+}
+
static void
-job_finished_cb (EvJobLinks *job,
- EvSidebarLinks *sidebar_links)
+job_finished_callback (EvJobLinks *job,
+ EvSidebarLinks *sidebar_links)
{
EvSidebarLinksPrivate *priv;
GtkTreeSelection *selection;
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_cb),
+ 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);
update_page_callback (priv->page_cache,
ev_page_cache_get_current_page (priv->page_cache),
sidebar_links);
}
-void
-ev_sidebar_links_set_document (EvSidebarLinks *sidebar_links,
+static void
+ev_sidebar_links_set_document (EvSidebarPage *sidebar_page,
EvDocument *document)
{
+ EvSidebarLinks *sidebar_links;
EvSidebarLinksPrivate *priv;
- g_return_if_fail (EV_IS_SIDEBAR_LINKS (sidebar_links));
+ g_return_if_fail (EV_IS_SIDEBAR_PAGE (sidebar_page));
g_return_if_fail (EV_IS_DOCUMENT (document));
+
+ sidebar_links = EV_SIDEBAR_LINKS (sidebar_page);
priv = sidebar_links->priv;
priv->job = ev_job_links_new (document);
g_signal_connect (priv->job,
"finished",
- G_CALLBACK (job_finished_cb),
+ 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);
}
+static gboolean
+ev_sidebar_links_support_document (EvSidebarPage *sidebar_page,
+ EvDocument *document)
+{
+ return (EV_IS_DOCUMENT_LINKS (document) &&
+ ev_document_links_has_document_links (EV_DOCUMENT_LINKS (document)));
+}
+
+static const gchar*
+ev_sidebar_links_get_label (EvSidebarPage *sidebar_page)
+{
+ return _("Index");
+}
+
+GtkWidget *
+ev_sidebar_links_get_treeview (EvSidebarLinks *sidebar)
+{
+ return sidebar->priv->tree_view;
+}
+
+static void
+ev_sidebar_links_page_iface_init (EvSidebarPageIface *iface)
+{
+ iface->support_document = ev_sidebar_links_support_document;
+ iface->set_document = ev_sidebar_links_set_document;
+ iface->get_label = ev_sidebar_links_get_label;
+}
+