Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog12
-rw-r--r--backend/ev-link.c73
-rw-r--r--backend/ev-link.h9
-rw-r--r--pdf/ev-poppler.cc7
-rw-r--r--shell/ev-view.c29
5 files changed, 129 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 7be2008..71e8678 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,17 @@
2005-09-24 Marco Pesenti Gritti <mpg@redhat.com>
+ * backend/ev-link.c: (ev_link_type_get_type), (ev_link_get_bottom),
+ (ev_link_get_right), (ev_link_get_property),
+ (ev_link_set_property), (ev_link_class_init),
+ (ev_link_new_page_fitv), (ev_link_new_page_fitr):
+ * backend/ev-link.h:
+ * pdf/ev-poppler.cc:
+ * shell/ev-view.c: (goto_fitr_link), (ev_view_goto_link):
+
+ Implement fitr links
+
+2005-09-24 Marco Pesenti Gritti <mpg@redhat.com>
+
* shell/ev-view.c: (ev_view_get_width), (ev_view_get_height),
(goto_fitv_link), (goto_fith_link), (goto_fit_link),
(ev_view_goto_link), (ev_view_size_request_continuous_dual_page),
diff --git a/backend/ev-link.c b/backend/ev-link.c
index 82fce8d..57af5fa 100644
--- a/backend/ev-link.c
+++ b/backend/ev-link.c
@@ -32,6 +32,8 @@ enum {
PROP_URI,
PROP_LEFT,
PROP_TOP,
+ PROP_BOTTOM,
+ PROP_RIGHT,
PROP_ZOOM
};
@@ -52,6 +54,8 @@ struct _EvLinkPrivate {
int page;
double top;
double left;
+ double bottom;
+ double right;
double zoom;
};
@@ -73,6 +77,7 @@ ev_link_type_get_type (void)
{ 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" },
{ 0, NULL, NULL }
};
@@ -132,6 +137,22 @@ ev_link_get_left (EvLink *self)
}
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;
+}
+
+double
ev_link_get_zoom (EvLink *self)
{
g_return_val_if_fail (EV_IS_LINK (self), 0);
@@ -166,6 +187,12 @@ 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;
@@ -202,6 +229,12 @@ 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;
@@ -312,6 +345,27 @@ ev_link_class_init (EvLinkClass *ev_window_class)
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",
"Zoom",
@@ -397,6 +451,25 @@ ev_link_new_page_fitv (const char *title,
}
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)
{
return EV_LINK (g_object_new (EV_TYPE_LINK,
diff --git a/backend/ev-link.h b/backend/ev-link.h
index 86b3cc2..c014c01 100644
--- a/backend/ev-link.h
+++ b/backend/ev-link.h
@@ -47,6 +47,7 @@ typedef enum
EV_LINK_TYPE_PAGE_FIT,
EV_LINK_TYPE_PAGE_FITH,
EV_LINK_TYPE_PAGE_FITV,
+ EV_LINK_TYPE_PAGE_FITR,
EV_LINK_TYPE_EXTERNAL_URI,
/* We'll probably fill this in more as we support the other types of
* links */
@@ -69,6 +70,12 @@ EvLink *ev_link_new_page_fith (const char *title,
EvLink *ev_link_new_page_fitv (const char *title,
int page,
double left);
+EvLink *ev_link_new_page_fitr (const char *title,
+ int page,
+ double left,
+ double bottom,
+ double right,
+ double top);
EvLink *ev_link_new_page_fit (const char *title,
int page);
EvLink *ev_link_new_external (const char *title,
@@ -80,6 +87,8 @@ EvLinkType ev_link_get_link_type (EvLink *link);
int ev_link_get_page (EvLink *link);
double ev_link_get_top (EvLink *link);
double ev_link_get_left (EvLink *link);
+double ev_link_get_bottom (EvLink *link);
+double ev_link_get_right (EvLink *link);
double ev_link_get_zoom (EvLink *link);
/* Link Mapping stuff */
diff --git a/pdf/ev-poppler.cc b/pdf/ev-poppler.cc
index 5e95943..30b5a72 100644
--- a/pdf/ev-poppler.cc
+++ b/pdf/ev-poppler.cc
@@ -734,7 +734,12 @@ ev_link_from_dest (PopplerAction *action)
action->goto_dest.dest->left);
break;
case POPPLER_DEST_FITR:
- unimplemented_dest = "POPPLER_DEST_FITR";
+ link = ev_link_new_page_fitr (action->any.title,
+ action->goto_dest.dest->page_num - 1,
+ action->goto_dest.dest->left,
+ action->goto_dest.dest->bottom,
+ action->goto_dest.dest->right,
+ action->goto_dest.dest->top);
break;
case POPPLER_DEST_FITB:
unimplemented_dest = "POPPLER_DEST_FITB";
diff --git a/shell/ev-view.c b/shell/ev-view.c
index ae33566..c5cc503 100644
--- a/shell/ev-view.c
+++ b/shell/ev-view.c
@@ -1113,6 +1113,32 @@ get_link_at_location (EvView *view,
}
static void
+goto_fitr_link (EvView *view, EvLink *link)
+{
+ GdkPoint view_point;
+ EvPoint doc_point;
+ int doc_width, doc_height, page;
+ double zoom;
+
+ page = ev_link_get_page (link);
+ ev_page_cache_get_size (view->page_cache, page, 0, 1.0, &doc_width, &doc_height);
+
+ doc_point.x = ev_link_get_left (link);
+ doc_point.y = ev_link_get_top (link);
+ doc_point_to_view_point (view, page, &doc_point, &view_point);
+
+ zoom = zoom_for_size_best_fit (ev_link_get_right (link) - ev_link_get_left (link),
+ ev_link_get_top (link) - ev_link_get_bottom (link),
+ ev_view_get_width (view),
+ ev_view_get_height (view), 0, 0);
+
+ ev_view_set_sizing_mode (view, EV_SIZING_FREE);
+ ev_view_set_zoom (view, zoom, FALSE);
+ ev_page_cache_set_current_page (view->page_cache, page);
+ gtk_adjustment_set_value (view->hadjustment, view_point.x);
+}
+
+static void
goto_fitv_link (EvView *view, EvLink *link)
{
GdkPoint view_point;
@@ -1229,6 +1255,9 @@ ev_view_goto_link (EvView *view, EvLink *link)
case EV_LINK_TYPE_PAGE_FITV:
goto_fitv_link (view, link);
break;
+ case EV_LINK_TYPE_PAGE_FITR:
+ goto_fitr_link (view, link);
+ break;
case EV_LINK_TYPE_PAGE_XYZ:
goto_xyz_link (view, link);
break;