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
4 * Copyright (C) 2005 Red Hat, Inc.
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.
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.
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.
44 GObject base_instance;
49 GObjectClass base_class;
52 struct _EvLinkPrivate {
66 G_DEFINE_TYPE (EvLink, ev_link, G_TYPE_OBJECT)
68 #define EV_LINK_GET_PRIVATE(object) \
69 (G_TYPE_INSTANCE_GET_PRIVATE ((object), EV_TYPE_LINK, EvLinkPrivate))
72 ev_link_type_get_type (void)
74 static GType type = 0;
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" },
90 type = g_enum_register_static ("EvLinkType", values);
97 ev_link_get_title (EvLink *self)
99 g_return_val_if_fail (EV_IS_LINK (self), NULL);
101 return self->priv->title;
105 ev_link_get_uri (EvLink *self)
107 g_return_val_if_fail (EV_IS_LINK (self), NULL);
109 return self->priv->uri;
113 ev_link_get_link_type (EvLink *self)
115 g_return_val_if_fail (EV_IS_LINK (self), 0);
117 return self->priv->type;
121 ev_link_get_page (EvLink *self)
123 g_return_val_if_fail (EV_IS_LINK (self), -1);
125 return self->priv->page;
129 ev_link_get_top (EvLink *self)
131 g_return_val_if_fail (EV_IS_LINK (self), 0);
133 return self->priv->top;
137 ev_link_get_left (EvLink *self)
139 g_return_val_if_fail (EV_IS_LINK (self), 0);
141 return self->priv->left;
145 ev_link_get_bottom (EvLink *self)
147 g_return_val_if_fail (EV_IS_LINK (self), 0);
149 return self->priv->bottom;
153 ev_link_get_right (EvLink *self)
155 g_return_val_if_fail (EV_IS_LINK (self), 0);
157 return self->priv->right;
161 ev_link_get_filename (EvLink *link)
163 g_return_val_if_fail (EV_IS_LINK (link), NULL);
165 return link->priv->filename;
169 ev_link_get_params (EvLink *link)
171 g_return_val_if_fail (EV_IS_LINK (link), NULL);
173 return link->priv->params;
177 ev_link_get_zoom (EvLink *self)
179 g_return_val_if_fail (EV_IS_LINK (self), 0);
181 return self->priv->zoom;
185 ev_link_get_property (GObject *object, guint prop_id, GValue *value,
186 GParamSpec *param_spec)
190 self = EV_LINK (object);
194 g_value_set_string (value, self->priv->title);
197 g_value_set_string (value, self->priv->uri);
200 g_value_set_enum (value, self->priv->type);
203 g_value_set_int (value, self->priv->page);
206 g_value_set_double (value, self->priv->top);
209 g_value_set_double (value, self->priv->left);
212 g_value_set_double (value, self->priv->bottom);
215 g_value_set_double (value, self->priv->left);
218 g_value_set_double (value, self->priv->zoom);
221 g_value_set_string (value, self->priv->filename);
223 g_value_set_string (value, self->priv->params);
225 G_OBJECT_WARN_INVALID_PROPERTY_ID (object,
233 ev_link_set_property (GObject *object, guint prop_id, const GValue *value,
234 GParamSpec *param_spec)
236 EvLink *link = EV_LINK (object);
240 link->priv->title = g_strdup (g_value_get_string (value));
243 link->priv->uri = g_strdup (g_value_get_string (value));
246 link->priv->type = g_value_get_enum (value);
249 link->priv->page = g_value_get_int (value);
252 link->priv->top = g_value_get_double (value);
255 link->priv->left = g_value_get_double (value);
258 link->priv->bottom = g_value_get_double (value);
261 link->priv->right = g_value_get_double (value);
264 link->priv->zoom = g_value_get_double (value);
267 g_free (link->priv->filename);
268 link->priv->filename = g_strdup (g_value_get_string (value));
271 g_free (link->priv->params);
272 link->priv->params = g_strdup (g_value_get_string (value));
276 G_OBJECT_WARN_INVALID_PROPERTY_ID (object,
284 ev_window_dispose (GObject *object)
288 g_return_if_fail (EV_IS_LINK (object));
290 priv = EV_LINK (object)->priv;
293 g_free (priv->title);
302 if (priv->filename) {
303 g_free (priv->filename);
304 priv->filename = NULL;
308 g_free (priv->params);
312 G_OBJECT_CLASS (ev_link_parent_class)->dispose (object);
316 ev_link_init (EvLink *ev_link)
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;
324 ev_link_class_init (EvLinkClass *ev_window_class)
326 GObjectClass *g_object_class;
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;
333 g_type_class_add_private (g_object_class, sizeof (EvLinkPrivate));
335 g_object_class_install_property (g_object_class,
337 g_param_spec_string ("title",
342 G_PARAM_CONSTRUCT_ONLY));
343 g_object_class_install_property (g_object_class,
345 g_param_spec_string ("uri",
350 G_PARAM_CONSTRUCT_ONLY));
351 g_object_class_install_property (g_object_class,
353 g_param_spec_string ("filename",
358 G_PARAM_CONSTRUCT_ONLY));
359 g_object_class_install_property (g_object_class,
361 g_param_spec_string ("params",
366 G_PARAM_CONSTRUCT_ONLY));
367 g_object_class_install_property (g_object_class,
369 g_param_spec_enum ("type",
375 G_PARAM_CONSTRUCT_ONLY));
376 g_object_class_install_property (g_object_class,
378 g_param_spec_int ("page",
385 G_PARAM_CONSTRUCT_ONLY));
386 g_object_class_install_property (g_object_class,
388 g_param_spec_double ("left",
390 "The left coordinate",
395 G_PARAM_CONSTRUCT_ONLY));
396 g_object_class_install_property (g_object_class,
398 g_param_spec_double ("top",
400 "The top coordinate",
405 G_PARAM_CONSTRUCT_ONLY));
406 g_object_class_install_property (g_object_class,
408 g_param_spec_double ("bottom",
410 "The bottom coordinate",
415 G_PARAM_CONSTRUCT_ONLY));
416 g_object_class_install_property (g_object_class,
418 g_param_spec_double ("right",
420 "The right coordinate",
425 G_PARAM_CONSTRUCT_ONLY));
427 g_object_class_install_property (g_object_class,
429 g_param_spec_double ("zoom",
436 G_PARAM_CONSTRUCT_ONLY));
440 ev_link_new_title (const char *title)
442 return EV_LINK (g_object_new (EV_TYPE_LINK,
444 "type", EV_LINK_TYPE_TITLE,
449 ev_link_new_page (const char *title, int page)
451 return EV_LINK (g_object_new (EV_TYPE_LINK,
454 "type", EV_LINK_TYPE_PAGE,
459 ev_link_new_page_xyz (const char *title,
465 return EV_LINK (g_object_new (EV_TYPE_LINK,
468 "type", EV_LINK_TYPE_PAGE_XYZ,
476 ev_link_new_page_fit (const char *title,
479 return EV_LINK (g_object_new (EV_TYPE_LINK,
482 "type", EV_LINK_TYPE_PAGE_FIT,
487 ev_link_new_page_fith (const char *title,
491 return EV_LINK (g_object_new (EV_TYPE_LINK,
494 "type", EV_LINK_TYPE_PAGE_FITH,
500 ev_link_new_page_fitv (const char *title,
504 return EV_LINK (g_object_new (EV_TYPE_LINK,
507 "type", EV_LINK_TYPE_PAGE_FITV,
513 ev_link_new_page_fitr (const char *title,
520 return EV_LINK (g_object_new (EV_TYPE_LINK,
523 "type", EV_LINK_TYPE_PAGE_FITR,
532 ev_link_new_external (const char *title, const char *uri)
534 return EV_LINK (g_object_new (EV_TYPE_LINK,
537 "type", EV_LINK_TYPE_EXTERNAL_URI,
542 ev_link_new_launch (const char *title,
543 const char *filename,
546 return EV_LINK (g_object_new (EV_TYPE_LINK,
548 "filename", filename,
550 "type", EV_LINK_TYPE_LAUNCH,
555 ev_link_mapping_free_foreach (EvLinkMapping *mapping)
557 g_object_unref (G_OBJECT (mapping->link));
562 ev_link_mapping_free (GList *link_mapping)
564 if (link_mapping == NULL)
567 g_list_foreach (link_mapping, (GFunc) (ev_link_mapping_free_foreach), NULL);
568 g_list_free (link_mapping);
573 ev_link_mapping_find (GList *link_mapping,
583 for (list = link_mapping; list; list = list->next) {
584 EvLinkMapping *mapping = list->data;
587 if ((x >= mapping->x1) &&
588 (y >= mapping->y1) &&
589 (x <= mapping->x2) &&
590 (y <= mapping->y2)) {
591 link = mapping->link;