1 /* ev-sidebar-bookmarks.c
2 * this file is part of evince, a gnome document viewer
4 * Copyright (C) 2010 Carlos Garcia Campos <carlosgc@gnome.org>
6 * Evince is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * Evince is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
23 #include <glib/gi18n.h>
25 #include "ev-sidebar-bookmarks.h"
27 #include "ev-document.h"
28 #include "ev-sidebar-page.h"
46 struct _EvSidebarBookmarksPrivate {
47 EvDocumentModel *model;
48 EvBookmarks *bookmarks;
51 GtkWidget *del_button;
52 GtkWidget *add_button;
55 static void ev_sidebar_bookmarks_page_iface_init (EvSidebarPageInterface *iface);
57 G_DEFINE_TYPE_EXTENDED (EvSidebarBookmarks,
61 G_IMPLEMENT_INTERFACE (EV_TYPE_SIDEBAR_PAGE,
62 ev_sidebar_bookmarks_page_iface_init))
64 static guint signals[N_SIGNALS];
67 compare_bookmarks (EvBookmark *a,
70 if (a->page < b->page)
72 if (a->page > b->page)
78 ev_sidebar_bookmarks_update (EvSidebarBookmarks *sidebar_bookmarks)
80 EvSidebarBookmarksPrivate *priv = sidebar_bookmarks->priv;
85 model = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (priv->tree_view)));
86 gtk_list_store_clear (model);
91 items = ev_bookmarks_get_bookmarks (priv->bookmarks);
92 items = g_list_sort (items, (GCompareFunc)compare_bookmarks);
93 for (l = items; l; l = g_list_next (l)) {
94 EvBookmark *bm = (EvBookmark *)l->data;
96 gtk_list_store_append (model, &iter);
97 gtk_list_store_set (model, &iter,
98 COLUMN_MARKUP, bm->title,
99 COLUMN_PAGE, bm->page,
106 ev_sidebar_bookmarks_changed (EvBookmarks *bookmarks,
107 EvSidebarBookmarks *sidebar_bookmarks)
109 ev_sidebar_bookmarks_update (sidebar_bookmarks);
113 ev_sidebar_bookmarks_get_selected_page (EvSidebarBookmarks *sidebar_bookmarks,
114 GtkTreeSelection *selection)
119 if (gtk_tree_selection_get_selected (selection, &model, &iter)) {
122 gtk_tree_model_get (model, &iter,
132 ev_sidebar_bookmarks_selection_changed (GtkTreeSelection *selection,
133 EvSidebarBookmarks *sidebar_bookmarks)
135 EvSidebarBookmarksPrivate *priv = sidebar_bookmarks->priv;
138 page = ev_sidebar_bookmarks_get_selected_page (sidebar_bookmarks, selection);
140 ev_document_model_set_page (priv->model, page);
141 gtk_widget_set_sensitive (priv->del_button, TRUE);
143 gtk_widget_set_sensitive (priv->del_button, FALSE);
148 ev_sidebar_bookmarks_add_clicked (GtkWidget *button,
149 EvSidebarBookmarks *sidebar_bookmarks)
151 /* Let the window add the bookmark since
152 * since we don't know the page title
154 g_signal_emit (sidebar_bookmarks, signals[ADD_BOOKMARK], 0);
158 ev_sidebar_bookmarks_del_clicked (GtkWidget *button,
159 EvSidebarBookmarks *sidebar_bookmarks)
161 EvSidebarBookmarksPrivate *priv = sidebar_bookmarks->priv;
162 GtkTreeSelection *selection;
166 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->tree_view));
167 page = ev_sidebar_bookmarks_get_selected_page (sidebar_bookmarks, selection);
173 ev_bookmarks_delete (priv->bookmarks, &bm);
177 ev_sidebar_bookmarks_bookmark_renamed (GtkCellRendererText *renderer,
178 const gchar *path_string,
179 const gchar *new_text,
180 EvSidebarBookmarks *sidebar_bookmarks)
182 EvSidebarBookmarksPrivate *priv = sidebar_bookmarks->priv;
183 GtkTreePath *path = gtk_tree_path_new_from_string (path_string);
189 if (!new_text || new_text[0] == '\0')
192 model = gtk_tree_view_get_model (GTK_TREE_VIEW (priv->tree_view));
193 gtk_tree_model_get_iter (model, &iter, path);
194 gtk_tree_model_get (model, &iter,
197 gtk_tree_path_free (path);
200 bm.title = g_strdup (new_text);
201 ev_bookmarks_update (priv->bookmarks, &bm);
205 ev_sidebar_bookmarks_dispose (GObject *object)
207 EvSidebarBookmarks *sidebar_bookmarks = EV_SIDEBAR_BOOKMARKS (object);
208 EvSidebarBookmarksPrivate *priv = sidebar_bookmarks->priv;
211 g_object_unref (priv->model);
215 if (priv->bookmarks) {
216 g_object_unref (priv->bookmarks);
217 priv->bookmarks = NULL;
220 G_OBJECT_CLASS (ev_sidebar_bookmarks_parent_class)->dispose (object);
224 ev_sidebar_bookmarks_init (EvSidebarBookmarks *sidebar_bookmarks)
226 EvSidebarBookmarksPrivate *priv;
230 GtkCellRenderer *renderer;
231 GtkTreeSelection *selection;
233 sidebar_bookmarks->priv = G_TYPE_INSTANCE_GET_PRIVATE (sidebar_bookmarks,
234 EV_TYPE_SIDEBAR_BOOKMARKS,
235 EvSidebarBookmarksPrivate);
236 priv = sidebar_bookmarks->priv;
238 gtk_box_set_spacing (GTK_BOX (sidebar_bookmarks), 6);
240 swindow = gtk_scrolled_window_new (NULL, NULL);
241 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow),
242 GTK_POLICY_AUTOMATIC,
243 GTK_POLICY_AUTOMATIC);
244 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (swindow),
246 gtk_box_pack_start (GTK_BOX (sidebar_bookmarks), swindow, TRUE, TRUE, 0);
247 gtk_widget_show (swindow);
249 model = gtk_list_store_new (N_COLUMNS, G_TYPE_STRING, G_TYPE_UINT);
250 priv->tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model));
251 g_object_unref (model);
252 gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (priv->tree_view), FALSE);
253 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->tree_view));
254 g_signal_connect (selection, "changed",
255 G_CALLBACK (ev_sidebar_bookmarks_selection_changed),
258 renderer = gtk_cell_renderer_text_new ();
259 g_object_set (renderer,
260 "ellipsize", PANGO_ELLIPSIZE_END,
263 g_signal_connect (renderer, "edited",
264 G_CALLBACK (ev_sidebar_bookmarks_bookmark_renamed),
266 gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (priv->tree_view),
268 "markup", COLUMN_MARKUP,
270 gtk_container_add (GTK_CONTAINER (swindow), priv->tree_view);
271 gtk_widget_show (priv->tree_view);
273 hbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
275 priv->add_button = gtk_button_new_from_stock (GTK_STOCK_ADD);
276 g_signal_connect (priv->add_button, "clicked",
277 G_CALLBACK (ev_sidebar_bookmarks_add_clicked),
279 gtk_widget_set_sensitive (priv->add_button, FALSE);
280 gtk_box_pack_start (GTK_BOX (hbox), priv->add_button, TRUE, TRUE, 6);
281 gtk_widget_show (priv->add_button);
283 priv->del_button = gtk_button_new_from_stock (GTK_STOCK_REMOVE);
284 g_signal_connect (priv->del_button, "clicked",
285 G_CALLBACK (ev_sidebar_bookmarks_del_clicked),
287 gtk_widget_set_sensitive (priv->del_button, FALSE);
288 gtk_box_pack_start (GTK_BOX (hbox), priv->del_button, TRUE, TRUE, 6);
289 gtk_widget_show (priv->del_button);
291 gtk_box_pack_end (GTK_BOX (sidebar_bookmarks), hbox, FALSE, TRUE, 0);
292 gtk_widget_show (hbox);
293 gtk_widget_show (GTK_WIDGET (sidebar_bookmarks));
297 ev_sidebar_bookmarks_get_property (GObject *object,
302 EvSidebarBookmarks *sidebar_bookmarks;
304 sidebar_bookmarks = EV_SIDEBAR_BOOKMARKS (object);
308 g_value_set_object (value, sidebar_bookmarks->priv->tree_view);
311 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
317 ev_sidebar_bookmarks_class_init (EvSidebarBookmarksClass *klass)
319 GObjectClass *g_object_class = G_OBJECT_CLASS (klass);
321 g_object_class->get_property = ev_sidebar_bookmarks_get_property;
322 g_object_class->dispose = ev_sidebar_bookmarks_dispose;
324 g_type_class_add_private (g_object_class, sizeof (EvSidebarBookmarksPrivate));
326 g_object_class_override_property (g_object_class, PROP_WIDGET, "main-widget");
328 signals[ADD_BOOKMARK] =
329 g_signal_new ("add-bookmark",
330 G_TYPE_FROM_CLASS (g_object_class),
331 G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
332 G_STRUCT_OFFSET (EvSidebarBookmarksClass, add_bookmark),
334 g_cclosure_marshal_VOID__VOID,
340 ev_sidebar_bookmarks_new (void)
342 return GTK_WIDGET (g_object_new (EV_TYPE_SIDEBAR_BOOKMARKS, NULL));
346 ev_sidebar_bookmarks_set_bookmarks (EvSidebarBookmarks *sidebar_bookmarks,
347 EvBookmarks *bookmarks)
349 EvSidebarBookmarksPrivate *priv = sidebar_bookmarks->priv;
351 g_return_if_fail (EV_IS_BOOKMARKS (bookmarks));
353 if (priv->bookmarks == bookmarks)
357 g_object_unref (priv->bookmarks);
358 priv->bookmarks = g_object_ref (bookmarks);
359 g_signal_connect (priv->bookmarks, "changed",
360 G_CALLBACK (ev_sidebar_bookmarks_changed),
363 gtk_widget_set_sensitive (priv->add_button, TRUE);
364 ev_sidebar_bookmarks_update (sidebar_bookmarks);
367 /* EvSidebarPageIface */
369 ev_sidebar_bookmarks_set_model (EvSidebarPage *sidebar_page,
370 EvDocumentModel *model)
372 EvSidebarBookmarks *sidebar_bookmarks = EV_SIDEBAR_BOOKMARKS (sidebar_page);
373 EvSidebarBookmarksPrivate *priv = sidebar_bookmarks->priv;
375 if (priv->model == model)
379 g_object_unref (priv->model);
380 priv->model = g_object_ref (model);
384 ev_sidebar_bookmarks_support_document (EvSidebarPage *sidebar_page,
385 EvDocument *document)
391 ev_sidebar_bookmarks_get_label (EvSidebarPage *sidebar_page)
393 return _("Bookmarks");
397 ev_sidebar_bookmarks_page_iface_init (EvSidebarPageInterface *iface)
399 iface->support_document = ev_sidebar_bookmarks_support_document;
400 iface->set_model = ev_sidebar_bookmarks_set_model;
401 iface->get_label = ev_sidebar_bookmarks_get_label;