]> www.fi.muni.cz Git - evince.git/blobdiff - backend/ev-link.c
Fix for the bug #325067 with more intelligent selection of current link in
[evince.git] / backend / ev-link.c
index cde435542310edb43577ec35ea8e482f7719948b..a325c3525788badbe1921341668a8996e2921f89 100644 (file)
@@ -32,7 +32,11 @@ enum {
        PROP_URI,
        PROP_LEFT,
        PROP_TOP,
-       PROP_ZOOM
+       PROP_BOTTOM,
+       PROP_RIGHT,
+       PROP_ZOOM,
+       PROP_FILENAME,
+       PROP_PARAMS
 };
 
 
@@ -48,10 +52,14 @@ struct _EvLinkClass {
 struct _EvLinkPrivate {
        char *title;
        char *uri;
+       char *filename;
+       char *params;
        EvLinkType type;
        int page;
        double top;
        double left;
+       double bottom;
+       double right;
        double zoom;
 };
 
@@ -70,7 +78,12 @@ ev_link_type_get_type (void)
                        { EV_LINK_TYPE_TITLE, "EV_LINK_TYPE_TITLE", "title" },
                        { EV_LINK_TYPE_PAGE, "EV_LINK_TYPE_PAGE", "page" },
                        { EV_LINK_TYPE_PAGE_XYZ, "EV_LINK_TYPE_PAGE_XYZ", "page-xyz" },
+                       { EV_LINK_TYPE_PAGE_FIT, "EV_LINK_TYPE_PAGE_FIT", "page-fit" },
+                       { EV_LINK_TYPE_PAGE_FITH, "EV_LINK_TYPE_PAGE_FITH", "page-fith" },
+                       { EV_LINK_TYPE_PAGE_FITV, "EV_LINK_TYPE_PAGE_FITV", "page-fitv" },
+                       { EV_LINK_TYPE_PAGE_FITR, "EV_LINK_TYPE_PAGE_FITR", "page-fitr" },
                        { EV_LINK_TYPE_EXTERNAL_URI, "EV_LINK_TYPE_EXTERNAL_URI", "external" },
+                       { EV_LINK_TYPE_LAUNCH, "EV_LINK_TYPE_LAUNCH", "launch" },
                        { 0, NULL, NULL }
                 };
 
@@ -107,7 +120,7 @@ ev_link_get_link_type (EvLink *self)
 int
 ev_link_get_page (EvLink *self)
 {
-       g_return_val_if_fail (EV_IS_LINK (self), 0);
+       g_return_val_if_fail (EV_IS_LINK (self), -1);
        
        return self->priv->page;
 }
@@ -128,6 +141,38 @@ ev_link_get_left (EvLink *self)
        return self->priv->left;
 }
 
+double
+ev_link_get_bottom (EvLink *self)
+{
+       g_return_val_if_fail (EV_IS_LINK (self), 0);
+       
+       return self->priv->bottom;
+}
+
+double
+ev_link_get_right (EvLink *self)
+{
+       g_return_val_if_fail (EV_IS_LINK (self), 0);
+       
+       return self->priv->right;
+}
+
+const char *
+ev_link_get_filename (EvLink *link)
+{
+       g_return_val_if_fail (EV_IS_LINK (link), NULL);
+
+       return link->priv->filename;
+}
+
+const char *
+ev_link_get_params (EvLink *link)
+{
+       g_return_val_if_fail (EV_IS_LINK (link), NULL);
+
+       return link->priv->params;
+}
+
 double
 ev_link_get_zoom (EvLink *self)
 {
@@ -163,9 +208,19 @@ ev_link_get_property (GObject *object, guint prop_id, GValue *value,
        case PROP_LEFT:
                g_value_set_double (value, self->priv->left);
                break;
+       case PROP_BOTTOM:
+               g_value_set_double (value, self->priv->bottom);
+               break;
+       case PROP_RIGHT:
+               g_value_set_double (value, self->priv->left);
+               break;
        case PROP_ZOOM:
                g_value_set_double (value, self->priv->zoom);
                break;
+       case PROP_FILENAME:
+               g_value_set_string (value, self->priv->filename);
+       case PROP_PARAMS:
+               g_value_set_string (value, self->priv->params);
        default:
                G_OBJECT_WARN_INVALID_PROPERTY_ID (object,
                                                   prop_id,
@@ -199,9 +254,23 @@ ev_link_set_property (GObject *object, guint prop_id, const GValue *value,
        case PROP_LEFT:
                link->priv->left = g_value_get_double (value);
                break;
+       case PROP_BOTTOM:
+               link->priv->bottom = g_value_get_double (value);
+               break;
+       case PROP_RIGHT:
+               link->priv->right = g_value_get_double (value);
+               break;
        case PROP_ZOOM:
                link->priv->zoom = g_value_get_double (value);
                break;
+       case PROP_FILENAME:
+               g_free (link->priv->filename);
+               link->priv->filename = g_strdup (g_value_get_string (value));
+               break;
+       case PROP_PARAMS:
+               g_free (link->priv->params);
+               link->priv->params = g_strdup (g_value_get_string (value));
+               break;
 
        default:
                G_OBJECT_WARN_INVALID_PROPERTY_ID (object,
@@ -230,6 +299,16 @@ ev_window_dispose (GObject *object)
                priv->uri = NULL;
        }
 
+       if (priv->filename) {
+               g_free (priv->filename);
+               priv->filename = NULL;
+       }
+
+       if (priv->params) {
+               g_free (priv->params);
+               priv->params = NULL;
+       }
+
        G_OBJECT_CLASS (ev_link_parent_class)->dispose (object);
 }
 
@@ -237,7 +316,7 @@ static void
 ev_link_init (EvLink *ev_link)
 {
        ev_link->priv = EV_LINK_GET_PRIVATE (ev_link);
-
+       ev_link->priv->page = -1;
        ev_link->priv->type = EV_LINK_TYPE_TITLE;
 }
 
@@ -269,6 +348,22 @@ ev_link_class_init (EvLinkClass *ev_window_class)
                                                              NULL,
                                                              G_PARAM_READWRITE |
                                                              G_PARAM_CONSTRUCT_ONLY));
+       g_object_class_install_property (g_object_class,
+                                        PROP_FILENAME,
+                                        g_param_spec_string ("filename",
+                                                             "Filename",
+                                                             "The link filename",
+                                                             NULL,
+                                                             G_PARAM_READWRITE |
+                                                             G_PARAM_CONSTRUCT_ONLY));
+       g_object_class_install_property (g_object_class,
+                                        PROP_PARAMS,
+                                        g_param_spec_string ("params",
+                                                             "Params",
+                                                             "The link params",
+                                                             NULL,
+                                                             G_PARAM_READWRITE |
+                                                             G_PARAM_CONSTRUCT_ONLY));
        g_object_class_install_property (g_object_class,
                                         PROP_TYPE,
                                         g_param_spec_enum  ("type",
@@ -293,7 +388,7 @@ ev_link_class_init (EvLinkClass *ev_window_class)
                                         g_param_spec_double ("left",
                                                              "Left coordinate",
                                                              "The left coordinate",
-                                                             0,
+                                                             -G_MAXDOUBLE,
                                                              G_MAXDOUBLE,
                                                              0,
                                                              G_PARAM_READWRITE |
@@ -303,11 +398,32 @@ ev_link_class_init (EvLinkClass *ev_window_class)
                                         g_param_spec_double ("top",
                                                              "Top coordinate",
                                                              "The top coordinate",
+                                                             -G_MAXDOUBLE,
+                                                             G_MAXDOUBLE,
                                                              0,
+                                                             G_PARAM_READWRITE |
+                                                             G_PARAM_CONSTRUCT_ONLY));
+       g_object_class_install_property (g_object_class,
+                                        PROP_BOTTOM,
+                                        g_param_spec_double ("bottom",
+                                                             "Bottom coordinate",
+                                                             "The bottom coordinate",
+                                                             -G_MAXDOUBLE,
                                                              G_MAXDOUBLE,
                                                              0,
                                                              G_PARAM_READWRITE |
                                                              G_PARAM_CONSTRUCT_ONLY));
+       g_object_class_install_property (g_object_class,
+                                        PROP_RIGHT,
+                                        g_param_spec_double ("right",
+                                                             "Right coordinate",
+                                                             "The right coordinate",
+                                                             -G_MAXDOUBLE,
+                                                             G_MAXDOUBLE,
+                                                             0,
+                                                             G_PARAM_READWRITE |
+                                                             G_PARAM_CONSTRUCT_ONLY));
+
        g_object_class_install_property (g_object_class,
                                         PROP_ZOOM,
                                         g_param_spec_double ("zoom",
@@ -356,6 +472,62 @@ ev_link_new_page_xyz (const char *title,
                                      NULL));
 }
 
+EvLink *
+ev_link_new_page_fit (const char *title,
+                     int         page)
+{
+       return EV_LINK (g_object_new (EV_TYPE_LINK,
+                                     "title", title,
+                                     "page", page,
+                                     "type", EV_LINK_TYPE_PAGE_FIT,
+                                     NULL));
+}
+
+EvLink *
+ev_link_new_page_fith (const char *title,
+                      int         page,
+                      double      top)
+{
+       return EV_LINK (g_object_new (EV_TYPE_LINK,
+                                     "title", title,
+                                     "page", page,
+                                     "type", EV_LINK_TYPE_PAGE_FITH,
+                                     "top", top,
+                                     NULL));
+}
+
+EvLink *
+ev_link_new_page_fitv (const char *title,
+                      int         page,
+                      double      left)
+{
+       return EV_LINK (g_object_new (EV_TYPE_LINK,
+                                     "title", title,
+                                     "page", page,
+                                     "type", EV_LINK_TYPE_PAGE_FITV,
+                                     "left", left,
+                                     NULL));
+}
+
+EvLink *
+ev_link_new_page_fitr (const char     *title,
+                      int             page,
+                      double          left,
+                      double          bottom,
+                      double          right,
+                      double          top)
+{
+       return EV_LINK (g_object_new (EV_TYPE_LINK,
+                                     "title", title,
+                                     "page", page,
+                                     "type", EV_LINK_TYPE_PAGE_FITR,
+                                     "left", left,
+                                     "bottom", bottom,
+                                     "right", right,
+                                     "top", top,
+                                     NULL));
+}
+
 EvLink *
 ev_link_new_external (const char *title, const char *uri)
 {
@@ -366,7 +538,18 @@ ev_link_new_external (const char *title, const char *uri)
                                      NULL));
 }
 
-
+EvLink *
+ev_link_new_launch (const char *title,
+                   const char *filename,
+                   const char *params)
+{
+       return EV_LINK (g_object_new (EV_TYPE_LINK,
+                                     "title", title,
+                                     "filename", filename,
+                                     "params", params,
+                                     "type", EV_LINK_TYPE_LAUNCH,
+                                     NULL));
+}
 
 static void
 ev_link_mapping_free_foreach (EvLinkMapping *mapping)