+ gtk_tree_model_get (model, &iter,
+ COLUMN_PAGE, &page,
+ -1);
+ return page;
+ }
+
+ return -1;
+}
+
+static void
+ev_bookmarks_popup_cmd_open_bookmark (GtkAction *action,
+ EvSidebarBookmarks *sidebar_bookmarks)
+{
+ EvSidebarBookmarksPrivate *priv = sidebar_bookmarks->priv;
+ GtkTreeSelection *selection;
+ gint page;
+
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->tree_view));
+ page = ev_sidebar_bookmarks_get_selected_page (sidebar_bookmarks, selection);
+ ev_document_model_set_page (priv->model, page);
+}
+
+static void
+ev_bookmarks_popup_cmd_rename_bookmark (GtkAction *action,
+ EvSidebarBookmarks *sidebar_bookmarks)
+{
+ EvSidebarBookmarksPrivate *priv = sidebar_bookmarks->priv;
+ GtkTreeView *tree_view = GTK_TREE_VIEW (priv->tree_view);
+ GtkTreeSelection *selection;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+
+
+ selection = gtk_tree_view_get_selection (tree_view);
+ if (gtk_tree_selection_get_selected (selection, &model, &iter)) {
+ GtkTreePath *path;
+
+ path = gtk_tree_model_get_path (model, &iter);
+ gtk_tree_view_set_cursor (tree_view, path,
+ gtk_tree_view_get_column (tree_view, 0),
+ TRUE);
+ gtk_tree_path_free (path);
+ }
+}
+
+static void
+ev_bookmarks_popup_cmd_remove_bookmark (GtkAction *action,
+ EvSidebarBookmarks *sidebar_bookmarks)
+{
+ EvSidebarBookmarksPrivate *priv = sidebar_bookmarks->priv;
+ GtkTreeSelection *selection;
+ gint page;
+ EvBookmark bm;
+
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->tree_view));
+ page = ev_sidebar_bookmarks_get_selected_page (sidebar_bookmarks, selection);
+ bm.page = page;
+ bm.title = NULL;
+ ev_bookmarks_delete (priv->bookmarks, &bm);
+}
+
+static const GtkActionEntry popup_entries[] = {
+ { "OpenBookmark", GTK_STOCK_OPEN, N_("_Open Bookmark"), NULL,
+ NULL, G_CALLBACK (ev_bookmarks_popup_cmd_open_bookmark) },
+ { "RenameBookmark", NULL, N_("_Rename Bookmark"), NULL,
+ NULL, G_CALLBACK (ev_bookmarks_popup_cmd_rename_bookmark) },
+ { "RemoveBookmark", NULL, N_("_Remove Bookmark"), NULL,
+ NULL, G_CALLBACK (ev_bookmarks_popup_cmd_remove_bookmark) }
+};
+
+static gint
+compare_bookmarks (EvBookmark *a,
+ EvBookmark *b)
+{
+ if (a->page < b->page)
+ return -1;
+ if (a->page > b->page)
+ return 1;
+ return 0;
+}
+
+static void
+ev_sidebar_bookmarks_update (EvSidebarBookmarks *sidebar_bookmarks)
+{
+ EvSidebarBookmarksPrivate *priv = sidebar_bookmarks->priv;
+ GtkListStore *model;
+ GList *items, *l;
+ GtkTreeIter iter;
+
+ model = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (priv->tree_view)));
+ gtk_list_store_clear (model);
+
+ if (!priv->bookmarks) {
+ g_object_set (priv->tree_view, "has-tooltip", FALSE, NULL);
+ return;
+ }
+
+ items = ev_bookmarks_get_bookmarks (priv->bookmarks);
+ items = g_list_sort (items, (GCompareFunc)compare_bookmarks);
+ for (l = items; l; l = g_list_next (l)) {
+ EvBookmark *bm = (EvBookmark *)l->data;
+
+ gtk_list_store_append (model, &iter);
+ gtk_list_store_set (model, &iter,
+ COLUMN_MARKUP, bm->title,
+ COLUMN_PAGE, bm->page,
+ -1);
+ }
+ g_list_free (items);
+ g_object_set (priv->tree_view, "has-tooltip", TRUE, NULL);
+}
+
+static void
+ev_sidebar_bookmarks_changed (EvBookmarks *bookmarks,
+ EvSidebarBookmarks *sidebar_bookmarks)
+{
+ ev_sidebar_bookmarks_update (sidebar_bookmarks);
+}
+
+static void
+ev_sidebar_bookmarks_selection_changed (GtkTreeSelection *selection,
+ EvSidebarBookmarks *sidebar_bookmarks)
+{
+ EvSidebarBookmarksPrivate *priv = sidebar_bookmarks->priv;
+ gint page;
+
+ page = ev_sidebar_bookmarks_get_selected_page (sidebar_bookmarks, selection);
+ if (page >= 0) {
+ ev_document_model_set_page (priv->model, page);
+ gtk_widget_set_sensitive (priv->del_button, TRUE);
+ } else {
+ gtk_widget_set_sensitive (priv->del_button, FALSE);
+ }
+}
+
+static void
+ev_sidebar_bookmarks_add_clicked (GtkWidget *button,
+ EvSidebarBookmarks *sidebar_bookmarks)
+{
+ /* Let the window add the bookmark since
+ * since we don't know the page title
+ */
+ g_signal_emit (sidebar_bookmarks, signals[ADD_BOOKMARK], 0);
+}
+
+static void
+ev_sidebar_bookmarks_del_clicked (GtkWidget *button,
+ EvSidebarBookmarks *sidebar_bookmarks)
+{
+ EvSidebarBookmarksPrivate *priv = sidebar_bookmarks->priv;
+ GtkTreeSelection *selection;
+ gint page;
+ EvBookmark bm;
+
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->tree_view));
+ page = ev_sidebar_bookmarks_get_selected_page (sidebar_bookmarks, selection);
+ if (page < 0)
+ return;
+
+ bm.page = page;
+ bm.title = NULL;
+ ev_bookmarks_delete (priv->bookmarks, &bm);
+}