]> www.fi.muni.cz Git - evince.git/blob - shell/ev-sidebar-bookmarks.c
initial sidebar document setting code.
[evince.git] / shell / ev-sidebar-bookmarks.c
1 /* this file is part of evince, a gnome document viewer
2  *
3  *  Copyright (C) 2004 Red Hat, Inc.
4  *
5  *  Author:
6  *    Jonathan Blandford <jrb@alum.mit.edu>
7  *
8  * Evince is free software; you can redistribute it and/or modify it
9  * under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * Evince is distributed in the hope that it will be useful, but
14  * WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
21  */
22
23 #ifdef HAVE_CONFIG_H
24 #include "config.h"
25 #endif
26
27 #include <string.h>
28 #include <gtk/gtk.h>
29
30 #include "ev-sidebar-bookmarks.h"
31
32 struct _EvSidebarBookmarksPrivate {
33         GtkWidget *tree_view;
34         GtkTreeModel *model;
35         EvDocument *current_document;
36 };
37
38 enum {
39         BOOKMARKS_COLUMN_MARKUP,
40         BOOKMARKS_COLUMN_OUTLINE,
41         BOOKMARKS_COLUMN_PAGE_NUM,
42         BOOKMARKS_COLUMN_PAGE_VALID,
43         BOOKMARKS_COLUMN_NUM_COLUMNS
44 };
45
46 static void bookmarks_page_num_func (GtkTreeViewColumn *tree_column,
47                                      GtkCellRenderer   *cell,
48                                      GtkTreeModel      *tree_model,
49                                      GtkTreeIter       *iter,
50                                      gpointer           data);
51
52 G_DEFINE_TYPE (EvSidebarBookmarks, ev_sidebar_bookmarks, GTK_TYPE_VBOX)
53
54 #define EV_SIDEBAR_BOOKMARKS_GET_PRIVATE(object) \
55         (G_TYPE_INSTANCE_GET_PRIVATE ((object), EV_TYPE_SIDEBAR_BOOKMARKS, EvSidebarBookmarksPrivate))
56
57 static void
58 ev_sidebar_bookmarks_class_init (EvSidebarBookmarksClass *ev_sidebar_bookmarks_class)
59 {
60         GObjectClass *g_object_class;
61
62         g_object_class = G_OBJECT_CLASS (ev_sidebar_bookmarks_class);
63
64         g_type_class_add_private (g_object_class, sizeof (EvSidebarBookmarksPrivate));
65
66 }
67
68
69 static void
70 ev_sidebar_bookmarks_construct (EvSidebarBookmarks *ev_sidebar_bookmarks)
71 {
72         EvSidebarBookmarksPrivate *priv;
73         GtkWidget *swindow;
74         GtkTreeViewColumn *column;
75         GtkCellRenderer *renderer;
76
77         priv = ev_sidebar_bookmarks->priv;
78         priv->model = (GtkTreeModel *) gtk_tree_store_new (BOOKMARKS_COLUMN_NUM_COLUMNS,
79                                                            G_TYPE_STRING,
80                                                            G_TYPE_POINTER,
81                                                            G_TYPE_INT,
82                                                            G_TYPE_BOOLEAN);
83
84         swindow = gtk_scrolled_window_new (NULL, NULL);
85
86         gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow),
87                                         GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
88         gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (swindow),
89                                              GTK_SHADOW_IN);
90
91         /* Create tree view */
92         priv->tree_view = gtk_tree_view_new ();
93         gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (priv->tree_view), FALSE);
94         gtk_container_add (GTK_CONTAINER (swindow), priv->tree_view);
95         gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (priv->tree_view), TRUE);
96
97         gtk_box_pack_start (GTK_BOX (ev_sidebar_bookmarks), swindow, TRUE, TRUE, 0);
98         gtk_widget_show_all (GTK_WIDGET (ev_sidebar_bookmarks));
99                 
100         column = gtk_tree_view_column_new ();
101         gtk_tree_view_column_set_expand (GTK_TREE_VIEW_COLUMN (column), TRUE);
102         gtk_tree_view_append_column (GTK_TREE_VIEW (priv->tree_view), column);
103
104         renderer = (GtkCellRenderer*)
105                 g_object_new (GTK_TYPE_CELL_RENDERER_TEXT,
106                               "ellipsize", PANGO_ELLIPSIZE_END,
107                               NULL);
108         gtk_tree_view_column_pack_start (GTK_TREE_VIEW_COLUMN (column), renderer, TRUE);
109         gtk_tree_view_column_set_attributes (GTK_TREE_VIEW_COLUMN (column), renderer,
110                                              "markup", BOOKMARKS_COLUMN_MARKUP,
111                                              NULL);
112                 
113         renderer = gtk_cell_renderer_text_new ();
114         gtk_tree_view_column_pack_end (GTK_TREE_VIEW_COLUMN (column), renderer, FALSE);
115         gtk_tree_view_column_set_cell_data_func (GTK_TREE_VIEW_COLUMN (column), renderer,
116                                                  (GtkTreeCellDataFunc) bookmarks_page_num_func,
117                                                  NULL, NULL);
118
119 }
120
121 static void
122 ev_sidebar_bookmarks_init (EvSidebarBookmarks *ev_sidebar_bookmarks)
123 {
124         ev_sidebar_bookmarks->priv = EV_SIDEBAR_BOOKMARKS_GET_PRIVATE (ev_sidebar_bookmarks);
125
126         ev_sidebar_bookmarks_construct (ev_sidebar_bookmarks);
127 }
128
129 static void
130 bookmarks_page_num_func (GtkTreeViewColumn *tree_column,
131                          GtkCellRenderer   *cell,
132                          GtkTreeModel      *tree_model,
133                          GtkTreeIter       *iter,
134                          gpointer           data)
135 {
136         int page_num;
137         gboolean page_valid;
138
139         gtk_tree_model_get (tree_model, iter,
140                             BOOKMARKS_COLUMN_PAGE_NUM, &page_num,
141                             BOOKMARKS_COLUMN_PAGE_VALID, &page_valid,
142                             -1);
143
144         if (page_valid) {
145                 gchar *markup = g_strdup_printf ("<i>%d</i>", page_num);
146                 g_object_set (cell,
147                               "markup", markup,
148                               "visible", TRUE,
149                               NULL);
150                 g_free (markup);
151         } else {
152                 g_object_set (cell,
153                               "visible", FALSE,
154                               NULL);
155         }
156 }
157
158 /* Public Functions */
159
160 GtkWidget *
161 ev_sidebar_bookmarks_new (void)
162 {
163         GtkWidget *ev_sidebar_bookmarks;
164
165         ev_sidebar_bookmarks = g_object_new (EV_TYPE_SIDEBAR_BOOKMARKS, NULL);
166
167         return ev_sidebar_bookmarks;
168 }
169
170 void
171 ev_sidebar_bookmarks_set_document (EvSidebarBookmarks *sidebar_bookmarks,
172                                    EvDocument         *document)
173 {
174         EvSidebarBookmarksPrivate *priv;
175
176         g_return_if_fail (EV_IS_SIDEBAR_BOOKMARKS (sidebar_bookmarks));
177         g_return_if_fail (EV_IS_DOCUMENT (document));
178
179         priv = sidebar_bookmarks->priv;
180
181         g_assert (priv->current_document == NULL);
182
183 }
184