#include "ev-job-queue.h"
#include "ev-document-links.h"
#include "ev-window.h"
+#include "ev-gui.h"
struct _EvSidebarLinksPrivate {
GtkWidget *tree_view;
GtkTreePath *arg1,
GtkTreeViewColumn *arg2,
gpointer user_data);
+static void job_finished_callback (EvJobLinks *job,
+ EvSidebarLinks *sidebar_links);
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,
#define EV_SIDEBAR_LINKS_GET_PRIVATE(object) \
(G_TYPE_INSTANCE_GET_PRIVATE ((object), EV_TYPE_SIDEBAR_LINKS, EvSidebarLinksPrivate))
-
-static void
-ev_sidebar_links_destroy (GtkObject *object)
-{
- EvSidebarLinks *ev_sidebar_links = (EvSidebarLinks *) object;
-
- ev_sidebar_links_clear_document (ev_sidebar_links);
-}
-
static void
ev_sidebar_links_set_property (GObject *object,
guint prop_id,
}
}
+static void
+ev_sidebar_links_dispose (GObject *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);
+ ev_job_queue_remove_job (sidebar->priv->job);
+ g_object_unref (sidebar->priv->job);
+ sidebar->priv->job = NULL;
+ }
+
+ G_OBJECT_CLASS (ev_sidebar_links_parent_class)->dispose (object);
+}
static void
ev_sidebar_links_class_init (EvSidebarLinksClass *ev_sidebar_links_class)
{
GObjectClass *g_object_class;
- GtkObjectClass *gtk_object_class;
g_object_class = G_OBJECT_CLASS (ev_sidebar_links_class);
- gtk_object_class = GTK_OBJECT_CLASS (ev_sidebar_links_class);
g_object_class->set_property = ev_sidebar_links_set_property;
g_object_class->get_property = ev_sidebar_links_get_property;
-
- gtk_object_class->destroy = ev_sidebar_links_destroy;
+ g_object_class->dispose = ev_sidebar_links_dispose;
g_object_class_install_property (g_object_class,
PROP_MODEL,
}
}
+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,
event->y,
&path,
NULL, NULL, NULL)) {
- GtkWidget *menu;
- GtkWidget *item;
-
gtk_tree_view_set_cursor (GTK_TREE_VIEW (treeview),
path, NULL, FALSE);
-
- 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);
-
- gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, 2,
+ 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;
"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;
}
-static void
-ev_sidebar_links_clear_document (EvSidebarLinks *sidebar_links)
-{
- EvSidebarLinksPrivate *priv;
-
- g_return_if_fail (EV_IS_SIDEBAR_LINKS (sidebar_links));
-
- priv = sidebar_links->priv;
-
- if (priv->document) {
- g_object_unref (priv->document);
- priv->document = NULL;
- priv->page_cache = NULL;
- }
-
- gtk_tree_view_set_model (GTK_TREE_VIEW (priv->tree_view), NULL);
-}
-
static gboolean
update_page_callback_foreach (GtkTreeModel *model,
GtkTreePath *path,
gtk_tree_view_set_model (GTK_TREE_VIEW (priv->tree_view), job->model);
g_object_unref (job);
+ priv->job = NULL;
/* Expand one level of the tree */
path = gtk_tree_path_new_first ();
priv = sidebar_links->priv;
- g_object_ref (document);
+ if (priv->document) {
+ gtk_tree_view_set_model (GTK_TREE_VIEW (priv->tree_view), NULL);
+ g_object_unref (priv->document);
+ }
- priv->document = document;
+ priv->document = g_object_ref (document);
priv->page_cache = ev_document_get_page_cache (document);
+ if (priv->job) {
+ g_signal_handlers_disconnect_by_func (priv->job,
+ job_finished_callback,
+ sidebar_links);
+ g_object_unref (priv->job);
+ }
+
priv->job = ev_job_links_new (document);
g_signal_connect (priv->job,
"finished",
sidebar_links);
/* The priority doesn't matter for this job */
ev_job_queue_add_job (priv->job, EV_JOB_PRIORITY_LOW);
-
}
static gboolean