]> www.fi.muni.cz Git - evince.git/blob - backend/ev-link.c
Hungarian translation updated.
[evince.git] / backend / ev-link.c
1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; c-indent-level: 8 -*- */
2 /* this file is part of evince, a gnome document viewer
3  *
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 #ifdef HAVE_CONFIG_H
22 #include "config.h"
23 #endif
24
25 #include "ev-link.h"
26
27 enum {
28         PROP_0,
29         PROP_TITLE,
30         PROP_TYPE,
31         PROP_PAGE,
32         PROP_URI,
33         PROP_LEFT,
34         PROP_TOP,
35         PROP_BOTTOM,
36         PROP_RIGHT,
37         PROP_ZOOM,
38         PROP_FILENAME,
39         PROP_PARAMS
40 };
41
42
43 struct _EvLink {
44         GObject base_instance;
45         EvLinkPrivate *priv;
46 };
47
48 struct _EvLinkClass {
49         GObjectClass base_class;
50 };
51
52 struct _EvLinkPrivate {
53         char *title;
54         char *uri;
55         char *filename;
56         char *params;
57         EvLinkType type;
58         int page;
59         double top;
60         double left;
61         double bottom;
62         double right;
63         double zoom;
64 };
65
66 G_DEFINE_TYPE (EvLink, ev_link, G_TYPE_OBJECT)
67
68 #define EV_LINK_GET_PRIVATE(object) \
69         (G_TYPE_INSTANCE_GET_PRIVATE ((object), EV_TYPE_LINK, EvLinkPrivate))
70
71 GType
72 ev_link_type_get_type (void)
73 {
74         static GType type = 0;
75
76         if (G_UNLIKELY (type == 0)) {
77                 static const GEnumValue values[] = {
78                         { EV_LINK_TYPE_TITLE, "EV_LINK_TYPE_TITLE", "title" },
79                         { EV_LINK_TYPE_PAGE, "EV_LINK_TYPE_PAGE", "page" },
80                         { EV_LINK_TYPE_PAGE_XYZ, "EV_LINK_TYPE_PAGE_XYZ", "page-xyz" },
81                         { EV_LINK_TYPE_PAGE_FIT, "EV_LINK_TYPE_PAGE_FIT", "page-fit" },
82                         { EV_LINK_TYPE_PAGE_FITH, "EV_LINK_TYPE_PAGE_FITH", "page-fith" },
83                         { EV_LINK_TYPE_PAGE_FITV, "EV_LINK_TYPE_PAGE_FITV", "page-fitv" },
84                         { EV_LINK_TYPE_PAGE_FITR, "EV_LINK_TYPE_PAGE_FITR", "page-fitr" },
85                         { EV_LINK_TYPE_EXTERNAL_URI, "EV_LINK_TYPE_EXTERNAL_URI", "external" },
86                         { EV_LINK_TYPE_LAUNCH, "EV_LINK_TYPE_LAUNCH", "launch" },
87                         { 0, NULL, NULL }
88                 };
89
90                 type = g_enum_register_static ("EvLinkType", values);
91         }
92
93         return type;
94 }
95
96 const char *
97 ev_link_get_title (EvLink *self)
98 {
99         g_return_val_if_fail (EV_IS_LINK (self), NULL);
100         
101         return self->priv->title;
102 }
103
104 const char *
105 ev_link_get_uri (EvLink *self)
106 {
107         g_return_val_if_fail (EV_IS_LINK (self), NULL);
108         
109         return self->priv->uri;
110 }
111
112 EvLinkType
113 ev_link_get_link_type (EvLink *self)
114 {
115         g_return_val_if_fail (EV_IS_LINK (self), 0);
116         
117         return self->priv->type;
118 }
119
120 int
121 ev_link_get_page (EvLink *self)
122 {
123         g_return_val_if_fail (EV_IS_LINK (self), -1);
124         
125         return self->priv->page;
126 }
127
128 double
129 ev_link_get_top (EvLink *self)
130 {
131         g_return_val_if_fail (EV_IS_LINK (self), 0);
132         
133         return self->priv->top;
134 }
135
136 double
137 ev_link_get_left (EvLink *self)
138 {
139         g_return_val_if_fail (EV_IS_LINK (self), 0);
140         
141         return self->priv->left;
142 }
143
144 double
145 ev_link_get_bottom (EvLink *self)
146 {
147         g_return_val_if_fail (EV_IS_LINK (self), 0);
148         
149         return self->priv->bottom;
150 }
151
152 double
153 ev_link_get_right (EvLink *self)
154 {
155         g_return_val_if_fail (EV_IS_LINK (self), 0);
156         
157         return self->priv->right;
158 }
159
160 const char *
161 ev_link_get_filename (EvLink *link)
162 {
163         g_return_val_if_fail (EV_IS_LINK (link), NULL);
164
165         return link->priv->filename;
166 }
167
168 const char *
169 ev_link_get_params (EvLink *link)
170 {
171         g_return_val_if_fail (EV_IS_LINK (link), NULL);
172
173         return link->priv->params;
174 }
175
176 double
177 ev_link_get_zoom (EvLink *self)
178 {
179         g_return_val_if_fail (EV_IS_LINK (self), 0);
180         
181         return self->priv->zoom;
182 }
183
184 static void
185 ev_link_get_property (GObject *object, guint prop_id, GValue *value,
186                       GParamSpec *param_spec)
187 {
188         EvLink *self;
189
190         self = EV_LINK (object);
191
192         switch (prop_id) {
193         case PROP_TITLE:
194                 g_value_set_string (value, self->priv->title);
195                 break;
196         case PROP_URI:
197                 g_value_set_string (value, self->priv->uri);
198                 break;
199         case PROP_TYPE:
200                 g_value_set_enum (value, self->priv->type);
201                 break;
202         case PROP_PAGE:
203                 g_value_set_int (value, self->priv->page);
204                 break;
205         case PROP_TOP:
206                 g_value_set_double (value, self->priv->top);
207                 break;
208         case PROP_LEFT:
209                 g_value_set_double (value, self->priv->left);
210                 break;
211         case PROP_BOTTOM:
212                 g_value_set_double (value, self->priv->bottom);
213                 break;
214         case PROP_RIGHT:
215                 g_value_set_double (value, self->priv->left);
216                 break;
217         case PROP_ZOOM:
218                 g_value_set_double (value, self->priv->zoom);
219                 break;
220         case PROP_FILENAME:
221                 g_value_set_string (value, self->priv->filename);
222         case PROP_PARAMS:
223                 g_value_set_string (value, self->priv->params);
224         default:
225                 G_OBJECT_WARN_INVALID_PROPERTY_ID (object,
226                                                    prop_id,
227                                                    param_spec);
228                 break;
229         }
230 }
231
232 static void
233 ev_link_set_property (GObject *object, guint prop_id, const GValue *value,
234                       GParamSpec *param_spec)
235 {
236         EvLink *link = EV_LINK (object);
237         
238         switch (prop_id) {
239         case PROP_TITLE:
240                 link->priv->title = g_strdup (g_value_get_string (value));      
241                 break;
242         case PROP_URI:
243                 link->priv->uri = g_strdup (g_value_get_string (value));
244                 break;
245         case PROP_TYPE:
246                 link->priv->type = g_value_get_enum (value);
247                 break;
248         case PROP_PAGE:
249                 link->priv->page = g_value_get_int (value);
250                 break;
251         case PROP_TOP:
252                 link->priv->top = g_value_get_double (value);
253                 break;
254         case PROP_LEFT:
255                 link->priv->left = g_value_get_double (value);
256                 break;
257         case PROP_BOTTOM:
258                 link->priv->bottom = g_value_get_double (value);
259                 break;
260         case PROP_RIGHT:
261                 link->priv->right = g_value_get_double (value);
262                 break;
263         case PROP_ZOOM:
264                 link->priv->zoom = g_value_get_double (value);
265                 break;
266         case PROP_FILENAME:
267                 g_free (link->priv->filename);
268                 link->priv->filename = g_strdup (g_value_get_string (value));
269                 break;
270         case PROP_PARAMS:
271                 g_free (link->priv->params);
272                 link->priv->params = g_strdup (g_value_get_string (value));
273                 break;
274
275         default:
276                 G_OBJECT_WARN_INVALID_PROPERTY_ID (object,
277                                                    prop_id,
278                                                    param_spec);
279                 break;
280         }
281 }
282
283 static void
284 ev_window_dispose (GObject *object)
285 {
286         EvLinkPrivate *priv;
287
288         g_return_if_fail (EV_IS_LINK (object));
289
290         priv = EV_LINK (object)->priv;
291
292         if (priv->title) {
293                 g_free (priv->title);
294                 priv->title = NULL;
295         }
296
297         if (priv->uri) {
298                 g_free (priv->uri);
299                 priv->uri = NULL;
300         }
301
302         if (priv->filename) {
303                 g_free (priv->filename);
304                 priv->filename = NULL;
305         }
306
307         if (priv->params) {
308                 g_free (priv->params);
309                 priv->params = NULL;
310         }
311
312         G_OBJECT_CLASS (ev_link_parent_class)->dispose (object);
313 }
314
315 static void
316 ev_link_init (EvLink *ev_link)
317 {
318         ev_link->priv = EV_LINK_GET_PRIVATE (ev_link);
319         ev_link->priv->page = -1;
320         ev_link->priv->type = EV_LINK_TYPE_TITLE;
321 }
322
323 static void
324 ev_link_class_init (EvLinkClass *ev_window_class)
325 {
326         GObjectClass *g_object_class;
327
328         g_object_class = G_OBJECT_CLASS (ev_window_class);
329         g_object_class->dispose = ev_window_dispose;
330         g_object_class->set_property = ev_link_set_property;
331         g_object_class->get_property = ev_link_get_property;
332
333         g_type_class_add_private (g_object_class, sizeof (EvLinkPrivate));
334
335         g_object_class_install_property (g_object_class,
336                                          PROP_TITLE,
337                                          g_param_spec_string ("title",
338                                                               "Link Title",
339                                                               "The link title",
340                                                               NULL,
341                                                               G_PARAM_READWRITE |
342                                                               G_PARAM_CONSTRUCT_ONLY));
343         g_object_class_install_property (g_object_class,
344                                          PROP_URI,
345                                          g_param_spec_string ("uri",
346                                                               "Link URI",
347                                                               "The link URI",
348                                                               NULL,
349                                                               G_PARAM_READWRITE |
350                                                               G_PARAM_CONSTRUCT_ONLY));
351         g_object_class_install_property (g_object_class,
352                                          PROP_FILENAME,
353                                          g_param_spec_string ("filename",
354                                                               "Filename",
355                                                               "The link filename",
356                                                               NULL,
357                                                               G_PARAM_READWRITE |
358                                                               G_PARAM_CONSTRUCT_ONLY));
359         g_object_class_install_property (g_object_class,
360                                          PROP_PARAMS,
361                                          g_param_spec_string ("params",
362                                                               "Params",
363                                                               "The link params",
364                                                               NULL,
365                                                               G_PARAM_READWRITE |
366                                                               G_PARAM_CONSTRUCT_ONLY));
367         g_object_class_install_property (g_object_class,
368                                          PROP_TYPE,
369                                          g_param_spec_enum  ("type",
370                                                              "Link Type",
371                                                              "The link type",
372                                                              EV_TYPE_LINK_TYPE,
373                                                              EV_LINK_TYPE_TITLE,
374                                                              G_PARAM_READWRITE |
375                                                              G_PARAM_CONSTRUCT_ONLY));
376         g_object_class_install_property (g_object_class,
377                                          PROP_PAGE,
378                                          g_param_spec_int ("page",
379                                                            "Link Page",
380                                                            "The link page",
381                                                             -1,
382                                                             G_MAXINT,
383                                                             0,
384                                                             G_PARAM_READWRITE |
385                                                             G_PARAM_CONSTRUCT_ONLY));
386         g_object_class_install_property (g_object_class,
387                                          PROP_LEFT,
388                                          g_param_spec_double ("left",
389                                                               "Left coordinate",
390                                                               "The left coordinate",
391                                                               -G_MAXDOUBLE,
392                                                               G_MAXDOUBLE,
393                                                               0,
394                                                               G_PARAM_READWRITE |
395                                                               G_PARAM_CONSTRUCT_ONLY));
396         g_object_class_install_property (g_object_class,
397                                          PROP_TOP,
398                                          g_param_spec_double ("top",
399                                                               "Top coordinate",
400                                                               "The top coordinate",
401                                                               -G_MAXDOUBLE,
402                                                               G_MAXDOUBLE,
403                                                               0,
404                                                               G_PARAM_READWRITE |
405                                                               G_PARAM_CONSTRUCT_ONLY));
406         g_object_class_install_property (g_object_class,
407                                          PROP_BOTTOM,
408                                          g_param_spec_double ("bottom",
409                                                               "Bottom coordinate",
410                                                               "The bottom coordinate",
411                                                               -G_MAXDOUBLE,
412                                                               G_MAXDOUBLE,
413                                                               0,
414                                                               G_PARAM_READWRITE |
415                                                               G_PARAM_CONSTRUCT_ONLY));
416         g_object_class_install_property (g_object_class,
417                                          PROP_RIGHT,
418                                          g_param_spec_double ("right",
419                                                               "Right coordinate",
420                                                               "The right coordinate",
421                                                               -G_MAXDOUBLE,
422                                                               G_MAXDOUBLE,
423                                                               0,
424                                                               G_PARAM_READWRITE |
425                                                               G_PARAM_CONSTRUCT_ONLY));
426
427         g_object_class_install_property (g_object_class,
428                                          PROP_ZOOM,
429                                          g_param_spec_double ("zoom",
430                                                               "Zoom",
431                                                               "Zoom",
432                                                               0,
433                                                               G_MAXDOUBLE,
434                                                               0,
435                                                               G_PARAM_READWRITE |
436                                                               G_PARAM_CONSTRUCT_ONLY));
437 }
438
439 EvLink *
440 ev_link_new_title (const char *title)
441 {
442         return EV_LINK (g_object_new (EV_TYPE_LINK,
443                                       "title", title,
444                                       "type", EV_LINK_TYPE_TITLE,
445                                       NULL));
446 }
447
448 EvLink *
449 ev_link_new_page (const char *title, int page)
450 {
451         return EV_LINK (g_object_new (EV_TYPE_LINK,
452                                       "title", title,
453                                       "page", page,
454                                       "type", EV_LINK_TYPE_PAGE,
455                                       NULL));
456 }
457
458 EvLink *
459 ev_link_new_page_xyz (const char *title,
460                       int         page,
461                       double      left,
462                       double      top,
463                       double      zoom)
464 {
465         return EV_LINK (g_object_new (EV_TYPE_LINK,
466                                       "title", title,
467                                       "page", page,
468                                       "type", EV_LINK_TYPE_PAGE_XYZ,
469                                       "left", left,
470                                       "top", top,
471                                       "zoom", zoom,
472                                       NULL));
473 }
474
475 EvLink *
476 ev_link_new_page_fit (const char *title,
477                       int         page)
478 {
479         return EV_LINK (g_object_new (EV_TYPE_LINK,
480                                       "title", title,
481                                       "page", page,
482                                       "type", EV_LINK_TYPE_PAGE_FIT,
483                                       NULL));
484 }
485
486 EvLink *
487 ev_link_new_page_fith (const char *title,
488                        int         page,
489                        double      top)
490 {
491         return EV_LINK (g_object_new (EV_TYPE_LINK,
492                                       "title", title,
493                                       "page", page,
494                                       "type", EV_LINK_TYPE_PAGE_FITH,
495                                       "top", top,
496                                       NULL));
497 }
498
499 EvLink *
500 ev_link_new_page_fitv (const char *title,
501                        int         page,
502                        double      left)
503 {
504         return EV_LINK (g_object_new (EV_TYPE_LINK,
505                                       "title", title,
506                                       "page", page,
507                                       "type", EV_LINK_TYPE_PAGE_FITV,
508                                       "left", left,
509                                       NULL));
510 }
511
512 EvLink *
513 ev_link_new_page_fitr (const char     *title,
514                        int             page,
515                        double          left,
516                        double          bottom,
517                        double          right,
518                        double          top)
519 {
520         return EV_LINK (g_object_new (EV_TYPE_LINK,
521                                       "title", title,
522                                       "page", page,
523                                       "type", EV_LINK_TYPE_PAGE_FITR,
524                                       "left", left,
525                                       "bottom", bottom,
526                                       "right", right,
527                                       "top", top,
528                                       NULL));
529 }
530
531 EvLink *
532 ev_link_new_external (const char *title, const char *uri)
533 {
534         return EV_LINK (g_object_new (EV_TYPE_LINK,
535                                       "title", title,
536                                       "uri", uri,
537                                       "type", EV_LINK_TYPE_EXTERNAL_URI,
538                                       NULL));
539 }
540
541 EvLink *
542 ev_link_new_launch (const char *title,
543                     const char *filename,
544                     const char *params)
545 {
546         return EV_LINK (g_object_new (EV_TYPE_LINK,
547                                       "title", title,
548                                       "filename", filename,
549                                       "params", params,
550                                       "type", EV_LINK_TYPE_LAUNCH,
551                                       NULL));
552 }
553
554 static void
555 ev_link_mapping_free_foreach (EvLinkMapping *mapping)
556 {
557         g_object_unref (G_OBJECT (mapping->link));
558         g_free (mapping);
559 }
560
561 void
562 ev_link_mapping_free (GList *link_mapping)
563 {
564         if (link_mapping == NULL)
565                 return;
566
567         g_list_foreach (link_mapping, (GFunc) (ev_link_mapping_free_foreach), NULL);
568         g_list_free (link_mapping);
569 }
570
571
572 EvLink *
573 ev_link_mapping_find (GList   *link_mapping,
574                       gdouble  x,
575                       gdouble  y)
576 {
577         GList *list;
578         EvLink *link = NULL;
579         int i;
580         
581         i = 0;
582
583         for (list = link_mapping; list; list = list->next) {
584                 EvLinkMapping *mapping = list->data;
585
586                 i++;
587                 if ((x >= mapping->x1) &&
588                     (y >= mapping->y1) &&
589                     (x <= mapping->x2) &&
590                     (y <= mapping->y2)) {
591                         link = mapping->link;
592                         break;
593                 }
594         }
595
596         return link;
597 }
598