]> www.fi.muni.cz Git - evince.git/blob - libmisc/ev-page-action.c
Move part of the EvPageCache to EvDocument
[evince.git] / libmisc / 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  */
20
21 #ifdef HAVE_CONFIG_H
22 #include "config.h"
23 #endif
24
25 #include <string.h>
26 #include <stdlib.h>
27
28 #include <glib/gi18n.h>
29 #include <gtk/gtk.h>
30
31 #include "ev-page-action.h"
32 #include "ev-page-action-widget.h"
33
34 struct _EvPageActionPrivate
35 {
36         EvDocument *document;
37         GtkTreeModel *model;
38 };
39
40
41 static void ev_page_action_init       (EvPageAction *action);
42 static void ev_page_action_class_init (EvPageActionClass *class);
43
44 enum
45 {
46         ACTIVATE_LINK,
47         N_SIGNALS
48 };
49
50 static guint signals[N_SIGNALS] = {0, };
51
52 G_DEFINE_TYPE (EvPageAction, ev_page_action, GTK_TYPE_ACTION)
53
54 #define EV_PAGE_ACTION_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), EV_TYPE_PAGE_ACTION, EvPageActionPrivate))
55
56 enum {
57         PROP_0,
58         PROP_DOCUMENT,
59         PROP_MODEL,
60 };
61
62 static GtkWidget *
63 create_tool_item (GtkAction *action)
64 {
65         GtkWidget *proxy;
66
67         proxy = g_object_new (EV_TYPE_PAGE_ACTION_WIDGET, NULL);
68
69         return proxy;
70 }
71
72 static void
73 update_document (EvPageAction *page, GParamSpec *pspec, EvPageActionWidget *proxy)
74 {
75         if (page->priv->document)
76                 ev_page_action_widget_set_document (proxy, page->priv->document);
77 }
78
79 static void
80 update_model (EvPageAction *page, GParamSpec *pspec, EvPageActionWidget *proxy)
81 {
82         GtkTreeModel *model;
83
84         g_object_get (G_OBJECT (page),
85                       "model", &model,
86                       NULL);
87
88         ev_page_action_widget_update_model (proxy, model);
89 }
90
91 static void
92 activate_link_cb (EvPageActionWidget *proxy, EvLink *link, EvPageAction *action)
93 {
94         g_signal_emit (action, signals[ACTIVATE_LINK], 0, link);
95 }
96
97 static void
98 connect_proxy (GtkAction *action, GtkWidget *proxy)
99 {
100         if (GTK_IS_TOOL_ITEM (proxy)) {
101                 g_signal_connect_object (action, "notify::document",
102                                          G_CALLBACK (update_document),
103                                          proxy, 0);
104                 g_signal_connect (proxy, "activate_link",
105                                   G_CALLBACK (activate_link_cb),
106                                   action);
107                 g_signal_connect_object (action, "notify::model",
108                                          G_CALLBACK (update_model),
109                                          proxy, 0);
110         }
111
112         GTK_ACTION_CLASS (ev_page_action_parent_class)->connect_proxy (action, proxy);
113 }
114
115 static void
116 ev_page_action_dispose (GObject *object)
117 {
118         EvPageAction *page = EV_PAGE_ACTION (object);
119
120         if (page->priv->document) {
121                 g_object_unref (page->priv->document);
122                 page->priv->document = NULL;
123         }
124
125         G_OBJECT_CLASS (ev_page_action_parent_class)->dispose (object);
126 }
127
128 static void
129 ev_page_action_set_property (GObject      *object,
130                              guint         prop_id,
131                              const GValue *value,
132                              GParamSpec   *pspec)
133 {
134         EvPageAction *page;
135         EvDocument *document;
136         GtkTreeModel *model;
137
138         page = EV_PAGE_ACTION (object);
139
140         switch (prop_id)
141         {
142         case PROP_DOCUMENT:
143                 document = page->priv->document;
144                 page->priv->document = EV_DOCUMENT (g_value_dup_object (value));
145                 if (document)
146                         g_object_unref (document);
147                 break;
148         case PROP_MODEL:
149                 model = page->priv->model;
150                 page->priv->model = GTK_TREE_MODEL (g_value_dup_object (value));
151                 if (model)
152                         g_object_unref (model);
153                 break;
154         default:
155                 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
156                 break;
157         }
158 }
159
160 static void
161 ev_page_action_get_property (GObject    *object,
162                              guint       prop_id,
163                              GValue     *value,
164                              GParamSpec *pspec)
165 {
166         EvPageAction *page;
167
168         page = EV_PAGE_ACTION (object);
169
170         switch (prop_id)
171         {
172         case PROP_DOCUMENT:
173                 g_value_set_object (value, page->priv->document);
174                 break;
175         case PROP_MODEL:
176                 g_value_set_object (value, page->priv->model);
177                 break;
178         default:
179                 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
180                 break;
181         }
182 }
183
184 void
185 ev_page_action_set_document (EvPageAction *page, EvDocument *document)
186 {
187         g_object_set (page,
188                       "document", document,
189                       "model", NULL,
190                       NULL);
191 }
192
193 void
194 ev_page_action_set_model (EvPageAction *page_action,
195                           GtkTreeModel *model)
196 {
197         g_object_set (page_action,
198                       "model", model,
199                       NULL);
200 }
201
202 void
203 ev_page_action_grab_focus (EvPageAction *page_action)
204 {
205         GSList *proxies;
206
207         proxies = gtk_action_get_proxies (GTK_ACTION (page_action));
208         for (; proxies != NULL; proxies = proxies->next) {
209                 EvPageActionWidget *proxy;
210
211                 proxy = EV_PAGE_ACTION_WIDGET (proxies->data);
212
213                 if (GTK_WIDGET_MAPPED (GTK_WIDGET (proxy)))
214                         ev_page_action_widget_grab_focus (proxy);
215         }
216 }
217
218 static void
219 ev_page_action_init (EvPageAction *page)
220 {
221         page->priv = EV_PAGE_ACTION_GET_PRIVATE (page);
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->dispose = ev_page_action_dispose;
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[ACTIVATE_LINK] = g_signal_new ("activate_link",
239                                                G_OBJECT_CLASS_TYPE (object_class),
240                                                G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
241                                                G_STRUCT_OFFSET (EvPageActionClass, activate_link),
242                                                NULL, NULL,
243                                                g_cclosure_marshal_VOID__OBJECT,
244                                                G_TYPE_NONE, 1,
245                                                G_TYPE_OBJECT);
246
247         g_object_class_install_property (object_class,
248                                          PROP_DOCUMENT,
249                                          g_param_spec_object ("document",
250                                                               "Document",
251                                                               "Current document",
252                                                               EV_TYPE_DOCUMENT,
253                                                               G_PARAM_READWRITE));
254
255         g_object_class_install_property (object_class,
256                                          PROP_MODEL,
257                                          g_param_spec_object ("model",
258                                                               "Model",
259                                                               "Current Model",
260                                                               GTK_TYPE_TREE_MODEL,
261                                                               G_PARAM_READWRITE));
262
263         g_type_class_add_private (object_class, sizeof (EvPageActionPrivate));
264 }