enum {
PROP_0,
PROP_MODEL,
+ PROP_WIDGET,
};
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,
case PROP_MODEL:
g_value_set_object (value, ev_sidebar_links->priv->model);
break;
+ case PROP_WIDGET:
+ g_value_set_object (value, ev_sidebar_links->priv->tree_view);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
+static void
+ev_sidebar_links_dispose (GObject *object)
+{
+ EvSidebarLinks *sidebar = EV_SIDEBAR_LINKS (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);
+ g_object_unref (sidebar->priv->job);
+ 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);
+}
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,
"Current Model",
GTK_TYPE_TREE_MODEL,
G_PARAM_READWRITE));
+ g_object_class_override_property (g_object_class,
+ PROP_WIDGET,
+ "main-widget");
g_type_class_add_private (g_object_class, sizeof (EvSidebarLinksPrivate));
}
ev_page_cache_set_link (ev_sidebar_links->priv->page_cache, link);
g_signal_handler_unblock (ev_sidebar_links->priv->page_cache,
ev_sidebar_links->priv->page_changed_id);
+
+ g_object_unref (link);
}
}
/* Creates a fake model to indicate that we're loading */
retval = (GtkTreeModel *)gtk_list_store_new (EV_DOCUMENT_LINKS_COLUMN_NUM_COLUMNS,
G_TYPE_STRING,
- G_TYPE_OBJECT);
+ G_TYPE_OBJECT,
+ G_TYPE_BOOLEAN);
gtk_list_store_append (GTK_LIST_STORE (retval), &iter);
markup = g_strdup_printf ("<span size=\"larger\" style=\"italic\">%s</span>", _("Loading..."));
gtk_list_store_set (GTK_LIST_STORE (retval), &iter,
EV_DOCUMENT_LINKS_COLUMN_MARKUP, markup,
+ EV_DOCUMENT_LINKS_COLUMN_EXPAND, FALSE,
EV_DOCUMENT_LINKS_COLUMN_LINK, NULL,
-1);
g_free (markup);
-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 (link)
+ g_object_unref (link);
} else {
last_page = -1;
}
static void
popup_menu_cb (GtkWidget *treeview, EvSidebarLinks *sidebar)
{
- gtk_menu_popup (build_popup_menu (sidebar), NULL, NULL,
+ 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
"visible", FALSE,
NULL);
}
+
+ if (link)
+ g_object_unref (link);
}
/* Public Functions */
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,
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (sidebar_links->priv->tree_view));
gtk_tree_selection_select_path (selection, path);
-
+
+ g_object_unref (link);
return TRUE;
}
}
+
+ if (link)
+ g_object_unref (link);
return FALSE;
}
return;
}
-
+
+static void
+expand_open_links (GtkTreeView *tree_view, GtkTreeModel *model, GtkTreeIter *parent)
+{
+ GtkTreeIter iter;
+ gboolean expand;
+
+ if (gtk_tree_model_iter_children (model, &iter, parent)) {
+ do {
+ gtk_tree_model_get (model, &iter,
+ EV_DOCUMENT_LINKS_COLUMN_EXPAND, &expand,
+ -1);
+ if (expand) {
+ GtkTreePath *path;
+
+ path = gtk_tree_model_get_path (model, &iter);
+ gtk_tree_view_expand_row (tree_view, path, FALSE);
+ gtk_tree_path_free (path);
+ }
+
+ expand_open_links (tree_view, model, &iter);
+ } while (gtk_tree_model_iter_next (model, &iter));
+ }
+}
+
static void
job_finished_callback (EvJobLinks *job,
EvSidebarLinks *sidebar_links)
{
EvSidebarLinksPrivate *priv;
GtkTreeSelection *selection;
- GtkTreeIter iter;
- GtkTreePath *path;
- gboolean result;
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_unref (job);
+ priv->job = NULL;
+
+ expand_open_links (GTK_TREE_VIEW (priv->tree_view), priv->model, NULL);
- /* Expand one level of the tree */
- path = gtk_tree_path_new_first ();
- for (result = gtk_tree_model_get_iter_first (priv->model, &iter);
- result;
- result = gtk_tree_model_iter_next (priv->model, &iter)) {
- gtk_tree_view_expand_row (GTK_TREE_VIEW (priv->tree_view), path, FALSE);
- gtk_tree_path_next (path);
- }
- gtk_tree_path_free (path);
-
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",
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 = g_object_ref (document);
+ priv->page_cache = ev_page_cache_get (document);
- priv->document = 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,
sidebar_links);
/* The priority doesn't matter for this job */
ev_job_queue_add_job (priv->job, EV_JOB_PRIORITY_LOW);
-
}
static gboolean
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)
{