]> www.fi.muni.cz Git - evince.git/blob - libdocument/ev-link-action.c
[dualscreen] fix crash on ctrl+w and fix control window closing
[evince.git] / libdocument / ev-link-action.c
1 /* this file is part of evince, a gnome document viewer
2  *
3  *  Copyright (C) 2006 Carlos Garcia Campos <carlosgc@gnome.org>
4  *  Copyright (C) 2005 Red Hat, Inc.
5  *
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.
10  *
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.
15  *
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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19  */
20
21 #include <config.h>
22 #include "ev-link-action.h"
23 #include "ev-document-type-builtins.h"
24
25 enum {
26         PROP_0,
27         PROP_TYPE,
28         PROP_DEST,
29         PROP_URI,
30         PROP_FILENAME,
31         PROP_PARAMS,
32         PROP_NAME,
33         PROP_SHOW_LIST,
34         PROP_HIDE_LIST,
35         PROP_TOGGLE_LIST
36 };
37
38 struct _EvLinkAction {
39         GObject base_instance;
40
41         EvLinkActionPrivate *priv;
42 };
43
44 struct _EvLinkActionClass {
45         GObjectClass base_class;
46 };
47
48 struct _EvLinkActionPrivate {
49         EvLinkActionType  type;
50         EvLinkDest       *dest;
51         gchar            *uri;
52         gchar            *filename;
53         gchar            *params;
54         gchar            *name;
55         GList            *show_list;
56         GList            *hide_list;
57         GList            *toggle_list;
58 };
59
60 G_DEFINE_TYPE (EvLinkAction, ev_link_action, G_TYPE_OBJECT)
61
62 #define EV_LINK_ACTION_GET_PRIVATE(object) \
63         (G_TYPE_INSTANCE_GET_PRIVATE ((object), EV_TYPE_LINK_ACTION, EvLinkActionPrivate))
64
65 EvLinkActionType
66 ev_link_action_get_action_type (EvLinkAction *self)
67 {
68         g_return_val_if_fail (EV_IS_LINK_ACTION (self), 0);
69
70         return self->priv->type;
71 }
72
73 EvLinkDest *
74 ev_link_action_get_dest (EvLinkAction *self)
75 {
76         g_return_val_if_fail (EV_IS_LINK_ACTION (self), NULL);
77
78         return self->priv->dest;
79 }
80
81 const gchar *
82 ev_link_action_get_uri (EvLinkAction *self)
83 {
84         g_return_val_if_fail (EV_IS_LINK_ACTION (self), NULL);
85
86         return self->priv->uri;
87 }
88
89 const gchar *
90 ev_link_action_get_filename (EvLinkAction *self)
91 {
92         g_return_val_if_fail (EV_IS_LINK_ACTION (self), NULL);
93
94         return self->priv->filename;
95 }
96
97 const gchar *
98 ev_link_action_get_params (EvLinkAction *self)
99 {
100         g_return_val_if_fail (EV_IS_LINK_ACTION (self), NULL);
101
102         return self->priv->params;
103 }
104
105 const gchar *
106 ev_link_action_get_name (EvLinkAction *self)
107 {
108         g_return_val_if_fail (EV_IS_LINK_ACTION (self), NULL);
109
110         return self->priv->name;
111 }
112
113 GList *
114 ev_link_action_get_show_list (EvLinkAction *self)
115 {
116         g_return_val_if_fail (EV_IS_LINK_ACTION (self), NULL);
117
118         return self->priv->show_list;
119 }
120
121 GList *
122 ev_link_action_get_hide_list (EvLinkAction *self)
123 {
124         g_return_val_if_fail (EV_IS_LINK_ACTION (self), NULL);
125
126         return self->priv->hide_list;
127 }
128
129 GList *
130 ev_link_action_get_toggle_list (EvLinkAction *self)
131 {
132         g_return_val_if_fail (EV_IS_LINK_ACTION (self), NULL);
133
134         return self->priv->toggle_list;
135 }
136
137 static void
138 ev_link_action_get_property (GObject    *object,
139                              guint       prop_id,
140                              GValue     *value,
141                              GParamSpec *param_spec)
142 {
143         EvLinkAction *self;
144
145         self = EV_LINK_ACTION (object);
146
147         switch (prop_id) {
148                 case PROP_TYPE:
149                         g_value_set_enum (value, self->priv->type);
150                         break;
151                 case PROP_DEST:
152                         g_value_set_pointer (value, self->priv->dest);
153                         break;
154                 case PROP_URI:
155                         g_value_set_string (value, self->priv->uri);
156                         break;
157                 case PROP_FILENAME:
158                         g_value_set_string (value, self->priv->filename);
159                         break;
160                 case PROP_PARAMS:
161                         g_value_set_string (value, self->priv->params);
162                         break;
163                 case PROP_NAME:
164                         g_value_set_string (value, self->priv->name);
165                         break;
166                 case PROP_SHOW_LIST:
167                         g_value_set_pointer (value, self->priv->show_list);
168                         break;
169                 case PROP_HIDE_LIST:
170                         g_value_set_pointer (value, self->priv->hide_list);
171                         break;
172                 case PROP_TOGGLE_LIST:
173                         g_value_set_pointer (value, self->priv->toggle_list);
174                         break;
175                 default:
176                         G_OBJECT_WARN_INVALID_PROPERTY_ID (object,
177                                                            prop_id,
178                                                            param_spec);
179                         break;
180         }
181 }
182
183 static void
184 ev_link_action_set_property (GObject      *object,
185                              guint         prop_id,
186                              const GValue *value,
187                              GParamSpec   *param_spec)
188 {
189         EvLinkAction *self = EV_LINK_ACTION (object);
190
191         switch (prop_id) {
192                 case PROP_TYPE:
193                         self->priv->type = g_value_get_enum (value);
194                         break;
195                 case PROP_DEST:
196                         self->priv->dest = g_value_get_pointer (value);
197                         break;
198                 case PROP_URI:
199                         g_free (self->priv->uri);
200                         self->priv->uri = g_value_dup_string (value);
201                         break;
202                 case PROP_FILENAME:
203                         g_free (self->priv->filename);
204                         self->priv->filename = g_value_dup_string (value);
205                         break;
206                 case PROP_PARAMS:
207                         g_free (self->priv->params);
208                         self->priv->params = g_value_dup_string (value);
209                         break;
210                 case PROP_NAME:
211                         g_free (self->priv->name);
212                         self->priv->name = g_value_dup_string (value);
213                         break;
214                 case PROP_SHOW_LIST:
215                         self->priv->show_list = g_value_get_pointer (value);
216                         break;
217                 case PROP_HIDE_LIST:
218                         self->priv->hide_list = g_value_get_pointer (value);
219                         break;
220                 case PROP_TOGGLE_LIST:
221                         self->priv->toggle_list = g_value_get_pointer (value);
222                         break;
223                 default:
224                         G_OBJECT_WARN_INVALID_PROPERTY_ID (object,
225                                                            prop_id,
226                                                            param_spec);
227                         break;
228         }
229 }
230
231 static void
232 ev_link_action_finalize (GObject *object)
233 {
234         EvLinkActionPrivate *priv;
235
236         priv = EV_LINK_ACTION (object)->priv;
237
238         if (priv->dest) {
239                 g_object_unref (priv->dest);
240                 priv->dest = NULL;
241         }
242
243         if (priv->uri) {
244                 g_free (priv->uri);
245                 priv->uri = NULL;
246         }
247
248         if (priv->filename) {
249                 g_free (priv->filename);
250                 priv->filename = NULL;
251         }
252
253         if (priv->params) {
254                 g_free (priv->params);
255                 priv->params = NULL;
256         }
257
258         if (priv->name) {
259                 g_free (priv->name);
260                 priv->name = NULL;
261         }
262
263         if (priv->show_list) {
264                 g_list_foreach (priv->show_list, (GFunc)g_object_unref, NULL);
265                 g_list_free (priv->show_list);
266                 priv->show_list = NULL;
267         }
268
269         if (priv->hide_list) {
270                 g_list_foreach (priv->hide_list, (GFunc)g_object_unref, NULL);
271                 g_list_free (priv->hide_list);
272                 priv->hide_list = NULL;
273         }
274
275         if (priv->toggle_list) {
276                 g_list_foreach (priv->toggle_list, (GFunc)g_object_unref, NULL);
277                 g_list_free (priv->toggle_list);
278                 priv->toggle_list = NULL;
279         }
280
281         G_OBJECT_CLASS (ev_link_action_parent_class)->finalize (object);
282 }
283
284 static void
285 ev_link_action_init (EvLinkAction *ev_link_action)
286 {
287         ev_link_action->priv = EV_LINK_ACTION_GET_PRIVATE (ev_link_action);
288
289         ev_link_action->priv->dest = NULL;
290         ev_link_action->priv->uri = NULL;
291         ev_link_action->priv->filename = NULL;
292         ev_link_action->priv->params = NULL;
293         ev_link_action->priv->name = NULL;
294 }
295
296 static void
297 ev_link_action_class_init (EvLinkActionClass *ev_link_action_class)
298 {
299         GObjectClass *g_object_class;
300
301         g_object_class = G_OBJECT_CLASS (ev_link_action_class);
302
303         g_object_class->set_property = ev_link_action_set_property;
304         g_object_class->get_property = ev_link_action_get_property;
305
306         g_object_class->finalize = ev_link_action_finalize;
307
308         g_type_class_add_private (g_object_class, sizeof (EvLinkActionPrivate));
309
310         g_object_class_install_property (g_object_class,
311                                          PROP_TYPE,
312                                          g_param_spec_enum  ("type",
313                                                              "Action Type",
314                                                              "The link action type",
315                                                              EV_TYPE_LINK_ACTION_TYPE,
316                                                              EV_LINK_ACTION_TYPE_GOTO_DEST,
317                                                              G_PARAM_READWRITE |
318                                                              G_PARAM_CONSTRUCT_ONLY));
319         g_object_class_install_property (g_object_class,
320                                          PROP_DEST,
321                                          g_param_spec_pointer ("dest",
322                                                                "Action destination",
323                                                                "The link action destination",
324                                                                G_PARAM_READWRITE |
325                                                                G_PARAM_CONSTRUCT_ONLY));
326         g_object_class_install_property (g_object_class,
327                                          PROP_URI,
328                                          g_param_spec_string ("uri",
329                                                               "Link Action URI",
330                                                               "The link action URI",
331                                                               NULL,
332                                                               G_PARAM_READWRITE |
333                                                               G_PARAM_CONSTRUCT_ONLY));
334         g_object_class_install_property (g_object_class,
335                                          PROP_FILENAME,
336                                          g_param_spec_string ("filename",
337                                                               "Filename",
338                                                               "The link action filename",
339                                                               NULL,
340                                                               G_PARAM_READWRITE |
341                                                               G_PARAM_CONSTRUCT_ONLY));
342         g_object_class_install_property (g_object_class,
343                                          PROP_PARAMS,
344                                          g_param_spec_string ("params",
345                                                               "Params",
346                                                               "The link action params",
347                                                               NULL,
348                                                               G_PARAM_READWRITE |
349                                                               G_PARAM_CONSTRUCT_ONLY));
350         g_object_class_install_property (g_object_class,
351                                          PROP_NAME,
352                                          g_param_spec_string ("name",
353                                                               "Name",
354                                                               "The link action name",
355                                                               NULL,
356                                                               G_PARAM_READWRITE |
357                                                               G_PARAM_CONSTRUCT_ONLY));
358         g_object_class_install_property (g_object_class,
359                                          PROP_SHOW_LIST,
360                                          g_param_spec_pointer ("show-list",
361                                                                "ShowList",
362                                                                "The list of layers that should be shown",
363                                                                G_PARAM_READWRITE |
364                                                                G_PARAM_CONSTRUCT_ONLY));
365         g_object_class_install_property (g_object_class,
366                                          PROP_HIDE_LIST,
367                                          g_param_spec_pointer ("hide-list",
368                                                                "HideList",
369                                                                "The list of layers that should be hidden",
370                                                                G_PARAM_READWRITE |
371                                                                G_PARAM_CONSTRUCT_ONLY));
372         g_object_class_install_property (g_object_class,
373                                          PROP_TOGGLE_LIST,
374                                          g_param_spec_pointer ("toggle-list",
375                                                                "ToggleList",
376                                                                "The list of layers that should be toggled",
377                                                                G_PARAM_READWRITE |
378                                                                G_PARAM_CONSTRUCT_ONLY));
379 }
380
381 EvLinkAction *
382 ev_link_action_new_dest (EvLinkDest *dest)
383 {
384         return EV_LINK_ACTION (g_object_new (EV_TYPE_LINK_ACTION,
385                                              "dest", dest,
386                                              "type", EV_LINK_ACTION_TYPE_GOTO_DEST,
387                                              NULL));
388 }
389
390 EvLinkAction *
391 ev_link_action_new_remote (EvLinkDest  *dest,
392                            const gchar *filename)
393 {
394         return EV_LINK_ACTION (g_object_new (EV_TYPE_LINK_ACTION,
395                                              "dest", dest,
396                                              "filename", filename,
397                                              "type", EV_LINK_ACTION_TYPE_GOTO_REMOTE,
398                                              NULL));
399 }
400
401 EvLinkAction *
402 ev_link_action_new_external_uri (const gchar *uri)
403 {
404         return EV_LINK_ACTION (g_object_new (EV_TYPE_LINK_ACTION,
405                                              "uri", uri,
406                                              "type", EV_LINK_ACTION_TYPE_EXTERNAL_URI,
407                                              NULL));
408 }
409
410 EvLinkAction *
411 ev_link_action_new_launch (const gchar *filename,
412                            const gchar *params)
413 {
414         return EV_LINK_ACTION (g_object_new (EV_TYPE_LINK_ACTION,
415                                              "filename", filename,
416                                              "params", params,
417                                              "type", EV_LINK_ACTION_TYPE_LAUNCH,
418                                              NULL));
419 }
420
421 EvLinkAction *
422 ev_link_action_new_named (const gchar *name)
423 {
424         return EV_LINK_ACTION (g_object_new (EV_TYPE_LINK_ACTION,
425                                              "name", name,
426                                              "type", EV_LINK_ACTION_TYPE_NAMED,
427                                              NULL));
428 }
429
430 EvLinkAction *
431 ev_link_action_new_layers_state (GList *show_list,
432                                  GList *hide_list,
433                                  GList *toggle_list)
434 {
435         return EV_LINK_ACTION (g_object_new (EV_TYPE_LINK_ACTION,
436                                              "show-list", show_list,
437                                              "hide-list", hide_list,
438                                              "toggle-list", toggle_list,
439                                              "type", EV_LINK_ACTION_TYPE_LAYERS_STATE,
440                                              NULL));
441 }