]> www.fi.muni.cz Git - evince.git/blob - shell/ev-page-action.c
(ev_window_init): add GTK_SHADOW_IN to the scrolled window for
[evince.git] / shell / ev-page-action.c
1 /*
2  *  Copyright (C) 2003, 2004 Marco Pesenti Gritti
3  *  Copyright (C) 2003, 2004 Christian Persch
4  *
5  *  This program is free software; you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation; either version 2, or (at your option)
8  *  any later version.
9  *
10  *  This program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  *  GNU General Public License for more details.
14  *
15  *  You should have received a copy of the GNU General Public License
16  *  along with this program; if not, write to the Free Software
17  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18  *
19  *  $Id$
20  */
21
22 #include "config.h"
23
24 #include "ev-page-action.h"
25 #include "ev-window.h"
26
27 #include <glib/gi18n.h>
28 #include <gtk/gtkspinbutton.h>
29 #include <gtk/gtktoolitem.h>
30 #include <gtk/gtklabel.h>
31 #include <gtk/gtkhbox.h>
32
33 struct _EvPageActionPrivate
34 {
35         int current_page;
36         int total_pages;
37 };
38
39 enum
40 {
41         PROP_0,
42         PROP_CURRENT_PAGE,
43         PROP_TOTAL_PAGES
44 };
45
46 static void ev_page_action_init       (EvPageAction *action);
47 static void ev_page_action_class_init (EvPageActionClass *class);
48
49 enum
50 {
51         GOTO_PAGE_SIGNAL,
52         LAST_SIGNAL
53 };
54
55 static guint signals[LAST_SIGNAL] = { 0 };
56
57 static GObjectClass *parent_class = NULL;
58
59 G_DEFINE_TYPE (EvPageAction, ev_page_action, GTK_TYPE_ACTION)
60
61 #define EV_PAGE_ACTION_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), EV_TYPE_PAGE_ACTION, EvPageActionPrivate))
62
63 static void
64 update_label (GtkAction *action, gpointer dummy, GtkWidget *proxy)
65 {
66         EvPageAction *page = EV_PAGE_ACTION (action);
67         char *text;
68         GtkWidget *label;
69
70         label = GTK_WIDGET (g_object_get_data (G_OBJECT (proxy), "label"));
71
72         text = g_strdup_printf (_("of %d"), page->priv->total_pages);
73         gtk_label_set_text (GTK_LABEL (label), text);
74 }
75
76 static void
77 update_spin (GtkAction *action, gpointer dummy, GtkWidget *proxy)
78 {
79         EvPageAction *page = EV_PAGE_ACTION (action);
80         GtkWidget *spin;
81         int value;
82
83         spin = GTK_WIDGET (g_object_get_data (G_OBJECT (proxy), "spin"));
84
85         value = gtk_spin_button_get_value (GTK_SPIN_BUTTON (spin));
86
87         if (value != page->priv->current_page )
88         {
89                 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin),
90                                            page->priv->current_page);
91         }
92 }
93
94 static void
95 value_changed_cb (GtkWidget *spin, GtkAction *action)
96 {
97         int value;
98
99         value = gtk_spin_button_get_value (GTK_SPIN_BUTTON (spin));
100
101         g_signal_emit (action, signals[GOTO_PAGE_SIGNAL], 0, value);
102 }
103
104 static void
105 total_pages_changed_cb (EvPageAction *action, GParamSpec *pspec,
106                         GtkSpinButton *spin)
107 {
108         gtk_spin_button_set_range (GTK_SPIN_BUTTON (spin), 1, 
109                                    action->priv->total_pages);
110 }
111
112 static GtkWidget *
113 create_tool_item (GtkAction *action)
114 {
115         GtkWidget *hbox, *spin, *item, *label;
116
117         hbox = gtk_hbox_new (FALSE, 6);
118         gtk_container_set_border_width (GTK_CONTAINER (hbox), 6); 
119         gtk_widget_show (hbox);
120
121         item = GTK_WIDGET (gtk_tool_item_new ());
122         gtk_widget_show (item);
123
124         spin = gtk_spin_button_new_with_range (1, 9999, 1);
125         gtk_spin_button_set_digits (GTK_SPIN_BUTTON (spin), 0);
126         g_object_set_data (G_OBJECT (item), "spin", spin);
127         gtk_widget_show (spin);
128
129         g_signal_connect (action, "notify::total-pages",
130                           G_CALLBACK (total_pages_changed_cb),
131                           spin);
132         g_signal_connect (spin, "value_changed",
133                           G_CALLBACK (value_changed_cb),
134                           action);
135
136         label = gtk_label_new ("");
137         g_object_set_data (G_OBJECT (item), "label", label);
138         update_label (action, NULL, item);
139         gtk_widget_show (label);
140
141         gtk_box_pack_start (GTK_BOX (hbox), spin, FALSE, FALSE, 0);
142         gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
143         gtk_container_add (GTK_CONTAINER (item), hbox);
144
145         return item;
146 }
147
148 static void
149 connect_proxy (GtkAction *action, GtkWidget *proxy)
150 {
151         if (GTK_IS_TOOL_ITEM (proxy))
152         {
153                 g_signal_connect_object (action, "notify::total-pages",
154                                          G_CALLBACK (update_label),
155                                          proxy, 0);
156                 g_signal_connect_object (action, "notify::current-page",
157                                          G_CALLBACK (update_spin),
158                                          proxy, 0);
159         }
160
161         GTK_ACTION_CLASS (parent_class)->connect_proxy (action, proxy);
162 }
163
164 static void
165 ev_page_action_init (EvPageAction *action)
166 {
167         action->priv = EV_PAGE_ACTION_GET_PRIVATE (action);
168 }
169
170 static void
171 ev_page_action_finalize (GObject *object)
172 {
173         parent_class->finalize (object);
174 }
175
176 static void
177 ev_page_action_set_property (GObject *object,
178                              guint prop_id,
179                              const GValue *value,
180                              GParamSpec *pspec)
181 {
182         EvPageAction *page = EV_PAGE_ACTION (object);
183
184         switch (prop_id)
185         {
186                 case PROP_CURRENT_PAGE:
187                         page->priv->current_page = g_value_get_int (value);
188                         break;
189                 case PROP_TOTAL_PAGES:
190                         page->priv->total_pages = g_value_get_int (value);
191                         break;
192         }
193 }
194
195 static void
196 ev_page_action_get_property (GObject *object,
197                              guint prop_id,
198                              GValue *value,
199                              GParamSpec *pspec)
200 {
201         EvPageAction *page = EV_PAGE_ACTION (object);
202
203         switch (prop_id)
204         {
205                 case PROP_CURRENT_PAGE:
206                         g_value_set_int (value, page->priv->current_page);
207                         break;
208                 case PROP_TOTAL_PAGES:
209                         g_value_set_int (value, page->priv->total_pages);
210                         break;
211         }
212 }
213
214 void
215 ev_page_action_set_current_page (EvPageAction *page, int current_page)
216 {
217         g_object_set (page, "current-page", current_page, NULL);
218 }
219
220 void
221 ev_page_action_set_total_pages (EvPageAction *page, int total_pages)
222 {
223         g_object_set (page, "total-pages", total_pages, NULL);
224 }
225
226 static void
227 ev_page_action_class_init (EvPageActionClass *class)
228 {
229         GObjectClass *object_class = G_OBJECT_CLASS (class);
230         GtkActionClass *action_class = GTK_ACTION_CLASS (class);
231
232         object_class->finalize = ev_page_action_finalize;
233         object_class->set_property = ev_page_action_set_property;
234         object_class->get_property = ev_page_action_get_property;
235
236         parent_class = g_type_class_peek_parent (class);
237
238         action_class->toolbar_item_type = GTK_TYPE_TOOL_ITEM;
239         action_class->create_tool_item = create_tool_item;
240         action_class->connect_proxy = connect_proxy;
241
242         signals[GOTO_PAGE_SIGNAL] =
243                 g_signal_new ("goto_page",
244                               G_OBJECT_CLASS_TYPE (object_class),
245                               G_SIGNAL_RUN_FIRST,
246                               G_STRUCT_OFFSET (EvPageActionClass, goto_page),
247                               NULL, NULL,
248                               g_cclosure_marshal_VOID__INT,
249                               G_TYPE_NONE,
250                               1,
251                               G_TYPE_INT);
252
253         g_object_class_install_property (object_class,
254                                          PROP_CURRENT_PAGE,
255                                          g_param_spec_int ("current-page",
256                                                            "Current Page",
257                                                            "The number of current page",
258                                                            0,
259                                                            G_MAXINT,
260                                                            0,
261                                                            G_PARAM_READWRITE));
262
263         g_object_class_install_property (object_class,
264                                          PROP_TOTAL_PAGES,
265                                          g_param_spec_int ("total-pages",
266                                                            "Total Pages",
267                                                            "The total number of pages",
268                                                            0,
269                                                            G_MAXINT,
270                                                            0,
271                                                            G_PARAM_READWRITE));
272
273         g_type_class_add_private (object_class, sizeof (EvPageActionPrivate));
274 }