]> www.fi.muni.cz Git - evince.git/blob - shell/ev-page-action.c
use G_DEFINE_TYPE-supplied ev_sidebar_thumbnails_parent_class variable,
[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 G_DEFINE_TYPE (EvPageAction, ev_page_action, GTK_TYPE_ACTION)
58
59 #define EV_PAGE_ACTION_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), EV_TYPE_PAGE_ACTION, EvPageActionPrivate))
60
61 static void
62 update_label (GtkAction *action, gpointer dummy, GtkWidget *proxy)
63 {
64         EvPageAction *page = EV_PAGE_ACTION (action);
65         char *text;
66         GtkWidget *label;
67
68         label = GTK_WIDGET (g_object_get_data (G_OBJECT (proxy), "label"));
69
70         text = g_strdup_printf (_("of %d"), page->priv->total_pages);
71         gtk_label_set_text (GTK_LABEL (label), text);
72 }
73
74 static void
75 update_spin (GtkAction *action, gpointer dummy, GtkWidget *proxy)
76 {
77         EvPageAction *page = EV_PAGE_ACTION (action);
78         GtkWidget *spin;
79         int value;
80
81         spin = GTK_WIDGET (g_object_get_data (G_OBJECT (proxy), "spin"));
82
83         value = gtk_spin_button_get_value (GTK_SPIN_BUTTON (spin));
84
85         if (value != page->priv->current_page )
86         {
87                 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin),
88                                            page->priv->current_page);
89         }
90 }
91
92 static void
93 value_changed_cb (GtkWidget *spin, GtkAction *action)
94 {
95         int value;
96
97         value = gtk_spin_button_get_value (GTK_SPIN_BUTTON (spin));
98
99         g_signal_emit (action, signals[GOTO_PAGE_SIGNAL], 0, value);
100 }
101
102 static void
103 total_pages_changed_cb (EvPageAction *action, GParamSpec *pspec,
104                         GtkSpinButton *spin)
105 {
106         gtk_spin_button_set_range (GTK_SPIN_BUTTON (spin), 1, 
107                                    action->priv->total_pages);
108 }
109
110 static GtkWidget *
111 create_tool_item (GtkAction *action)
112 {
113         GtkWidget *hbox, *spin, *item, *label;
114
115         hbox = gtk_hbox_new (FALSE, 6);
116         gtk_container_set_border_width (GTK_CONTAINER (hbox), 6); 
117         gtk_widget_show (hbox);
118
119         item = GTK_WIDGET (gtk_tool_item_new ());
120         gtk_widget_show (item);
121
122         spin = gtk_spin_button_new_with_range (1, 9999, 1);
123         gtk_spin_button_set_digits (GTK_SPIN_BUTTON (spin), 0);
124         g_object_set_data (G_OBJECT (item), "spin", spin);
125         gtk_widget_show (spin);
126
127         g_signal_connect (action, "notify::total-pages",
128                           G_CALLBACK (total_pages_changed_cb),
129                           spin);
130         g_signal_connect (spin, "value_changed",
131                           G_CALLBACK (value_changed_cb),
132                           action);
133
134         label = gtk_label_new ("");
135         g_object_set_data (G_OBJECT (item), "label", label);
136         update_label (action, NULL, item);
137         gtk_widget_show (label);
138
139         gtk_box_pack_start (GTK_BOX (hbox), spin, FALSE, FALSE, 0);
140         gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
141         gtk_container_add (GTK_CONTAINER (item), hbox);
142
143         return item;
144 }
145
146 static void
147 connect_proxy (GtkAction *action, GtkWidget *proxy)
148 {
149         if (GTK_IS_TOOL_ITEM (proxy))
150         {
151                 g_signal_connect_object (action, "notify::total-pages",
152                                          G_CALLBACK (update_label),
153                                          proxy, 0);
154                 g_signal_connect_object (action, "notify::current-page",
155                                          G_CALLBACK (update_spin),
156                                          proxy, 0);
157         }
158
159         GTK_ACTION_CLASS (ev_page_action_parent_class)->connect_proxy (action, proxy);
160 }
161
162 static void
163 ev_page_action_init (EvPageAction *action)
164 {
165         action->priv = EV_PAGE_ACTION_GET_PRIVATE (action);
166 }
167
168 static void
169 ev_page_action_finalize (GObject *object)
170 {
171         G_OBJECT_CLASS (ev_page_action_parent_class)->finalize (object);
172 }
173
174 static void
175 ev_page_action_set_property (GObject *object,
176                              guint prop_id,
177                              const GValue *value,
178                              GParamSpec *pspec)
179 {
180         EvPageAction *page = EV_PAGE_ACTION (object);
181
182         switch (prop_id)
183         {
184                 case PROP_CURRENT_PAGE:
185                         page->priv->current_page = g_value_get_int (value);
186                         break;
187                 case PROP_TOTAL_PAGES:
188                         page->priv->total_pages = g_value_get_int (value);
189                         break;
190         }
191 }
192
193 static void
194 ev_page_action_get_property (GObject *object,
195                              guint prop_id,
196                              GValue *value,
197                              GParamSpec *pspec)
198 {
199         EvPageAction *page = EV_PAGE_ACTION (object);
200
201         switch (prop_id)
202         {
203                 case PROP_CURRENT_PAGE:
204                         g_value_set_int (value, page->priv->current_page);
205                         break;
206                 case PROP_TOTAL_PAGES:
207                         g_value_set_int (value, page->priv->total_pages);
208                         break;
209         }
210 }
211
212 void
213 ev_page_action_set_current_page (EvPageAction *page, int current_page)
214 {
215         g_object_set (page, "current-page", current_page, NULL);
216 }
217
218 void
219 ev_page_action_set_total_pages (EvPageAction *page, int total_pages)
220 {
221         g_object_set (page, "total-pages", total_pages, NULL);
222 }
223
224 static void
225 ev_page_action_class_init (EvPageActionClass *class)
226 {
227         GObjectClass *object_class = G_OBJECT_CLASS (class);
228         GtkActionClass *action_class = GTK_ACTION_CLASS (class);
229
230         object_class->finalize = ev_page_action_finalize;
231         object_class->set_property = ev_page_action_set_property;
232         object_class->get_property = ev_page_action_get_property;
233
234         action_class->toolbar_item_type = GTK_TYPE_TOOL_ITEM;
235         action_class->create_tool_item = create_tool_item;
236         action_class->connect_proxy = connect_proxy;
237
238         signals[GOTO_PAGE_SIGNAL] =
239                 g_signal_new ("goto_page",
240                               G_OBJECT_CLASS_TYPE (object_class),
241                               G_SIGNAL_RUN_FIRST,
242                               G_STRUCT_OFFSET (EvPageActionClass, goto_page),
243                               NULL, NULL,
244                               g_cclosure_marshal_VOID__INT,
245                               G_TYPE_NONE,
246                               1,
247                               G_TYPE_INT);
248
249         g_object_class_install_property (object_class,
250                                          PROP_CURRENT_PAGE,
251                                          g_param_spec_int ("current-page",
252                                                            "Current Page",
253                                                            "The number of current page",
254                                                            0,
255                                                            G_MAXINT,
256                                                            0,
257                                                            G_PARAM_READWRITE));
258
259         g_object_class_install_property (object_class,
260                                          PROP_TOTAL_PAGES,
261                                          g_param_spec_int ("total-pages",
262                                                            "Total Pages",
263                                                            "The total number of pages",
264                                                            0,
265                                                            G_MAXINT,
266                                                            0,
267                                                            G_PARAM_READWRITE));
268
269         g_type_class_add_private (object_class, sizeof (EvPageActionPrivate));
270 }