]> www.fi.muni.cz Git - evince.git/blob - libdocument/ev-link-dest.c
Include config.h. Bug #504721.
[evince.git] / libdocument / ev-link-dest.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., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
19  */
20
21 #include <config.h>
22 #include "ev-link-dest.h"
23
24 enum {
25         PROP_0,
26         PROP_TYPE,
27         PROP_PAGE,
28         PROP_LEFT,
29         PROP_TOP,
30         PROP_BOTTOM,
31         PROP_RIGHT,
32         PROP_ZOOM,
33         PROP_CHANGE,
34         PROP_NAMED,
35         PROP_PAGE_LABEL
36 };
37
38 typedef enum {
39         EV_DEST_CHANGE_TOP    = 1 << 0,
40         EV_DEST_CHANGE_LEFT   = 1 << 1,
41         EV_DEST_CHANGE_ZOOM   = 1 << 2
42 } EvDestChange;
43
44 struct _EvLinkDest {
45         GObject base_instance;
46         
47         EvLinkDestPrivate *priv;
48 };
49
50 struct _EvLinkDestClass {
51         GObjectClass base_class;
52 };
53
54 struct _EvLinkDestPrivate {
55         EvLinkDestType type;
56         int            page;
57         double         top;
58         double         left;
59         double         bottom;
60         double         right;
61         double         zoom;
62         EvDestChange   change;
63         gchar         *named;
64         gchar         *page_label;
65 };
66
67 G_DEFINE_TYPE (EvLinkDest, ev_link_dest, G_TYPE_OBJECT)
68
69 #define EV_LINK_DEST_GET_PRIVATE(object) \
70         (G_TYPE_INSTANCE_GET_PRIVATE ((object), EV_TYPE_LINK_DEST, EvLinkDestPrivate))
71
72 GType
73 ev_link_dest_type_get_type (void)
74 {
75         static GType type = 0;
76
77         if (G_UNLIKELY (type == 0)) {
78                 static const GEnumValue values[] = {
79                         { EV_LINK_DEST_TYPE_PAGE, "EV_LINK_DEST_TYPE_PAGE", "page" },
80                         { EV_LINK_DEST_TYPE_XYZ, "EV_LINK_DEST_TYPE_XYZ", "xyz" },
81                         { EV_LINK_DEST_TYPE_FIT, "EV_LINK_DEST_TYPE_FIT", "fit" },
82                         { EV_LINK_DEST_TYPE_FITH, "EV_LINK_DEST_TYPE_FITH", "fith" },
83                         { EV_LINK_DEST_TYPE_FITV, "EV_LINK_DEST_TYPE_FITV", "fitv" },
84                         { EV_LINK_DEST_TYPE_FITR, "EV_LINK_DEST_TYPE_FITR", "fitr" },
85                         { EV_LINK_DEST_TYPE_NAMED, "EV_LINK_DEST_TYPE_NAMED", "named" },
86                         { EV_LINK_DEST_TYPE_PAGE_LABEL, "EV_LINK_DEST_TYPE_PAGE_LABEL", "page_label" },
87                         { EV_LINK_DEST_TYPE_UNKNOWN, "EV_LINK_DEST_TYPE_UNKNOWN", "unknown" },
88                         { 0, NULL, NULL }
89                 };
90
91                 type = g_enum_register_static ("EvLinkDestType", values);
92         }
93
94         return type;
95 }
96
97 EvLinkDestType
98 ev_link_dest_get_dest_type (EvLinkDest *self)
99 {
100         g_return_val_if_fail (EV_IS_LINK_DEST (self), 0);
101
102         return self->priv->type;
103 }
104
105 gint
106 ev_link_dest_get_page (EvLinkDest *self)
107 {
108         g_return_val_if_fail (EV_IS_LINK_DEST (self), -1);
109
110         return self->priv->page;
111 }
112
113 gdouble
114 ev_link_dest_get_top (EvLinkDest *self,
115                       gboolean   *change_top)
116 {
117         g_return_val_if_fail (EV_IS_LINK_DEST (self), 0);
118
119         if (change_top)
120                 *change_top = (self->priv->change & EV_DEST_CHANGE_TOP);
121         
122         return self->priv->top;
123 }
124
125 gdouble
126 ev_link_dest_get_left (EvLinkDest *self,
127                        gboolean   *change_left)
128 {
129         g_return_val_if_fail (EV_IS_LINK_DEST (self), 0);
130
131         if (change_left)
132                 *change_left = (self->priv->change & EV_DEST_CHANGE_LEFT);
133
134         return self->priv->left;
135 }
136
137 gdouble
138 ev_link_dest_get_bottom (EvLinkDest *self)
139 {
140         g_return_val_if_fail (EV_IS_LINK_DEST (self), 0);
141
142         return self->priv->bottom;
143 }
144
145 gdouble
146 ev_link_dest_get_right (EvLinkDest *self)
147 {
148         g_return_val_if_fail (EV_IS_LINK_DEST (self), 0);
149
150         return self->priv->right;
151 }
152
153 gdouble
154 ev_link_dest_get_zoom (EvLinkDest *self,
155                        gboolean   *change_zoom)
156 {
157         g_return_val_if_fail (EV_IS_LINK_DEST (self), 0);
158
159         if (change_zoom)
160                 *change_zoom = (self->priv->change & EV_DEST_CHANGE_ZOOM);
161
162         return self->priv->zoom;
163 }
164
165 const gchar *
166 ev_link_dest_get_named_dest (EvLinkDest *self)
167 {
168         g_return_val_if_fail (EV_IS_LINK_DEST (self), NULL);
169
170         return self->priv->named;
171 }
172
173 const gchar *
174 ev_link_dest_get_page_label (EvLinkDest *self)
175 {
176         g_return_val_if_fail (EV_IS_LINK_DEST (self), NULL);
177
178         return self->priv->page_label;
179 }
180
181 static void
182 ev_link_dest_get_property (GObject    *object,
183                            guint       prop_id,
184                            GValue     *value,
185                            GParamSpec *param_spec)
186 {
187         EvLinkDest *self;
188
189         self = EV_LINK_DEST (object);
190
191         switch (prop_id) {
192                 case PROP_TYPE:
193                         g_value_set_enum (value, self->priv->type);
194                         break;
195                 case PROP_PAGE:
196                         g_value_set_int (value, self->priv->page);
197                         break;
198                 case PROP_TOP:
199                         g_value_set_double (value, self->priv->top);
200                         break;
201                 case PROP_LEFT:
202                         g_value_set_double (value, self->priv->left);
203                         break;
204                 case PROP_BOTTOM:
205                         g_value_set_double (value, self->priv->bottom);
206                         break;
207                 case PROP_RIGHT:
208                         g_value_set_double (value, self->priv->left);
209                         break;
210                 case PROP_ZOOM:
211                         g_value_set_double (value, self->priv->zoom);
212                         break;
213                 case PROP_CHANGE:
214                         g_value_set_uint (value, self->priv->change);
215                         break;
216                 case PROP_NAMED:
217                         g_value_set_string (value, self->priv->named);
218                         break;
219                 case PROP_PAGE_LABEL:
220                         g_value_set_string (value, self->priv->page_label);
221                         break;
222                 default:
223                         G_OBJECT_WARN_INVALID_PROPERTY_ID (object,
224                                                            prop_id,
225                                                            param_spec);
226                         break;
227         }
228 }
229
230 static void
231 ev_link_dest_set_property (GObject      *object,
232                            guint         prop_id,
233                            const GValue *value,
234                            GParamSpec   *param_spec)
235 {
236         EvLinkDest *self = EV_LINK_DEST (object);
237
238         switch (prop_id) {
239                 case PROP_TYPE:
240                         self->priv->type = g_value_get_enum (value);
241                         break;
242                 case PROP_PAGE:
243                         self->priv->page = g_value_get_int (value);
244                         break;
245                 case PROP_TOP:
246                         self->priv->top = g_value_get_double (value);
247                         break;
248                 case PROP_LEFT:
249                         self->priv->left = g_value_get_double (value);
250                         break;
251                 case PROP_BOTTOM:
252                         self->priv->bottom = g_value_get_double (value);
253                         break;
254                 case PROP_RIGHT:
255                         self->priv->right = g_value_get_double (value);
256                         break;
257                 case PROP_ZOOM:
258                         self->priv->zoom = g_value_get_double (value);
259                         break;
260                 case PROP_CHANGE:
261                         self->priv->change = g_value_get_uint (value);
262                         break;
263                 case PROP_NAMED:
264                         self->priv->named = g_value_dup_string (value);
265                         break;
266                 case PROP_PAGE_LABEL:
267                         self->priv->page_label = g_value_dup_string (value);
268                         break;
269                 default:
270                         G_OBJECT_WARN_INVALID_PROPERTY_ID (object,
271                                                            prop_id,
272                                                            param_spec);
273                         break;
274         }
275 }
276
277 static void
278 ev_link_dest_finalize (GObject *object)
279 {
280         EvLinkDestPrivate *priv;
281
282         priv = EV_LINK_DEST (object)->priv;
283
284         if (priv->named) {
285                 g_free (priv->named);
286                 priv->named = NULL;
287         }
288         if (priv->page_label) {
289                 g_free (priv->page_label);
290                 priv->page_label = NULL;
291         }
292
293         G_OBJECT_CLASS (ev_link_dest_parent_class)->finalize (object);
294 }
295
296 static void
297 ev_link_dest_init (EvLinkDest *ev_link_dest)
298 {
299         ev_link_dest->priv = EV_LINK_DEST_GET_PRIVATE (ev_link_dest);
300
301         ev_link_dest->priv->named = NULL;
302 }
303
304 static void
305 ev_link_dest_class_init (EvLinkDestClass *ev_link_dest_class)
306 {
307         GObjectClass *g_object_class;
308
309         g_object_class = G_OBJECT_CLASS (ev_link_dest_class);
310
311         g_object_class->set_property = ev_link_dest_set_property;
312         g_object_class->get_property = ev_link_dest_get_property;
313
314         g_object_class->finalize = ev_link_dest_finalize;
315
316         g_type_class_add_private (g_object_class, sizeof (EvLinkDestPrivate));
317
318         g_object_class_install_property (g_object_class,
319                                          PROP_TYPE,
320                                          g_param_spec_enum  ("type",
321                                                              "Dest Type",
322                                                              "The destination type",
323                                                              EV_TYPE_LINK_DEST_TYPE,
324                                                              EV_LINK_DEST_TYPE_UNKNOWN,
325                                                              G_PARAM_READWRITE |
326                                                              G_PARAM_CONSTRUCT_ONLY));
327         g_object_class_install_property (g_object_class,
328                                          PROP_PAGE,
329                                          g_param_spec_int ("page",
330                                                            "Dest Page",
331                                                            "The destination page",
332                                                            -1,
333                                                            G_MAXINT,
334                                                            0,
335                                                            G_PARAM_READWRITE |
336                                                            G_PARAM_CONSTRUCT_ONLY));
337         g_object_class_install_property (g_object_class,
338                                          PROP_LEFT,
339                                          g_param_spec_double ("left",
340                                                               "Left coordinate",
341                                                               "The left coordinate",
342                                                               -G_MAXDOUBLE,
343                                                               G_MAXDOUBLE,
344                                                               0,
345                                                               G_PARAM_READWRITE |
346                                                               G_PARAM_CONSTRUCT_ONLY));
347         g_object_class_install_property (g_object_class,
348                                          PROP_TOP,
349                                          g_param_spec_double ("top",
350                                                               "Top coordinate",
351                                                               "The top coordinate",
352                                                               -G_MAXDOUBLE,
353                                                               G_MAXDOUBLE,
354                                                               0,
355                                                               G_PARAM_READWRITE |
356                                                               G_PARAM_CONSTRUCT_ONLY));
357         g_object_class_install_property (g_object_class,
358                                          PROP_BOTTOM,
359                                          g_param_spec_double ("bottom",
360                                                               "Bottom coordinate",
361                                                               "The bottom coordinate",
362                                                               -G_MAXDOUBLE,
363                                                               G_MAXDOUBLE,
364                                                               0,
365                                                               G_PARAM_READWRITE |
366                                                               G_PARAM_CONSTRUCT_ONLY));
367         g_object_class_install_property (g_object_class,
368                                          PROP_RIGHT,
369                                          g_param_spec_double ("right",
370                                                               "Right coordinate",
371                                                               "The right coordinate",
372                                                               -G_MAXDOUBLE,
373                                                               G_MAXDOUBLE,
374                                                               0,
375                                                               G_PARAM_READWRITE |
376                                                               G_PARAM_CONSTRUCT_ONLY));
377
378         g_object_class_install_property (g_object_class,
379                                          PROP_ZOOM,
380                                          g_param_spec_double ("zoom",
381                                                               "Zoom",
382                                                               "Zoom",
383                                                               0,
384                                                               G_MAXDOUBLE,
385                                                               0,
386                                                               G_PARAM_READWRITE |
387                                                               G_PARAM_CONSTRUCT_ONLY));
388         g_object_class_install_property (g_object_class,
389                                          PROP_CHANGE,
390                                          g_param_spec_uint ("change",
391                                                             "Change",
392                                                             "Wether top, left, and zoom should be changed",
393                                                             0,
394                                                             G_MAXUINT,
395                                                             0,
396                                                             G_PARAM_READWRITE |
397                                                             G_PARAM_CONSTRUCT_ONLY));
398         g_object_class_install_property (g_object_class,
399                                          PROP_NAMED,
400                                          g_param_spec_string ("named",
401                                                               "Named destination",
402                                                               "The named destination",
403                                                               NULL,
404                                                               G_PARAM_READWRITE |
405                                                               G_PARAM_CONSTRUCT_ONLY));
406         g_object_class_install_property (g_object_class,
407                                          PROP_PAGE_LABEL,
408                                          g_param_spec_string ("page_label",
409                                                               "Label of the page",
410                                                               "The label of the destination page",
411                                                               NULL,
412                                                               G_PARAM_READWRITE |
413                                                               G_PARAM_CONSTRUCT_ONLY));
414 }
415
416 EvLinkDest *
417 ev_link_dest_new_page (gint page)
418 {
419         return EV_LINK_DEST (g_object_new (EV_TYPE_LINK_DEST,
420                                            "page", page,
421                                            "type", EV_LINK_DEST_TYPE_PAGE,
422                                            NULL));
423 }
424
425 EvLinkDest *
426 ev_link_dest_new_xyz (gint     page,
427                       gdouble  left,
428                       gdouble  top,
429                       gdouble  zoom,
430                       gboolean change_left,
431                       gboolean change_top,
432                       gboolean change_zoom)
433 {
434         EvDestChange change = 0;
435
436         if (change_left)
437                 change |= EV_DEST_CHANGE_LEFT;
438         if (change_top)
439                 change |= EV_DEST_CHANGE_TOP;
440         if (change_zoom)
441                 change |= EV_DEST_CHANGE_ZOOM;
442         
443         return EV_LINK_DEST (g_object_new (EV_TYPE_LINK_DEST,
444                                            "page", page,
445                                            "type", EV_LINK_DEST_TYPE_XYZ,
446                                            "left", left,
447                                            "top", top,
448                                            "zoom", zoom,
449                                            "change", change,
450                                            NULL));
451 }
452
453 EvLinkDest *
454 ev_link_dest_new_fit (gint page)
455 {
456         return EV_LINK_DEST (g_object_new (EV_TYPE_LINK_DEST,
457                                            "page", page,
458                                            "type", EV_LINK_DEST_TYPE_FIT,
459                                            NULL));
460 }
461
462 EvLinkDest *
463 ev_link_dest_new_fith (gint     page,
464                        gdouble  top,
465                        gboolean change_top)
466 {
467         EvDestChange change = 0;
468
469         if (change_top)
470                 change |= EV_DEST_CHANGE_TOP;
471         
472         return EV_LINK_DEST (g_object_new (EV_TYPE_LINK_DEST,
473                                            "page", page,
474                                            "type", EV_LINK_DEST_TYPE_FITH,
475                                            "top", top,
476                                            "change", change,
477                                            NULL));
478 }
479
480 EvLinkDest *
481 ev_link_dest_new_fitv (gint     page,
482                        gdouble  left,
483                        gboolean change_left)
484 {
485         EvDestChange change = 0;
486
487         if (change_left)
488                 change |= EV_DEST_CHANGE_LEFT;
489
490         return EV_LINK_DEST (g_object_new (EV_TYPE_LINK_DEST,
491                                            "page", page,
492                                            "type", EV_LINK_DEST_TYPE_FITV,
493                                            "left", left,
494                                            "change", change,
495                                            NULL));
496 }
497
498 EvLinkDest *
499 ev_link_dest_new_fitr (gint    page,
500                        gdouble left,
501                        gdouble bottom,
502                        gdouble right,
503                        gdouble top)
504 {
505         EvDestChange change = EV_DEST_CHANGE_TOP | EV_DEST_CHANGE_LEFT;
506         
507         return EV_LINK_DEST (g_object_new (EV_TYPE_LINK_DEST,
508                                            "page", page,
509                                            "type", EV_LINK_DEST_TYPE_FITR,
510                                            "left", left,
511                                            "bottom", bottom,
512                                            "right", right,
513                                            "top", top,
514                                            "change", change,
515                                            NULL));
516 }
517
518 EvLinkDest *
519 ev_link_dest_new_named (const gchar *named_dest)
520 {
521         return EV_LINK_DEST (g_object_new (EV_TYPE_LINK_DEST,
522                                            "named", named_dest,
523                                            "type", EV_LINK_DEST_TYPE_NAMED,
524                                            NULL));
525 }
526
527 EvLinkDest *
528 ev_link_dest_new_page_label (const gchar *page_label)
529 {
530         return EV_LINK_DEST (g_object_new (EV_TYPE_LINK_DEST,
531                                            "page_label", page_label,
532                                            "type", EV_LINK_DEST_TYPE_PAGE_LABEL,
533                                            NULL));
534 }