+static void
+go_to_link (EvView *view, EvLink *link)
+{
+ EvLinkType type;
+ const char *uri;
+ int page;
+
+ type = ev_link_get_link_type (link);
+
+ switch (type) {
+ case EV_LINK_TYPE_TITLE:
+ break;
+ case EV_LINK_TYPE_PAGE:
+ page = ev_link_get_page (link);
+ set_document_page (view, page);
+ break;
+ case EV_LINK_TYPE_EXTERNAL_URI:
+ uri = ev_link_get_uri (link);
+ gnome_vfs_url_show (uri);
+ break;
+ }
+}
+
+void
+ev_view_go_to_link (EvView *view, EvLink *link)
+{
+ EvLinkType type;
+
+ go_to_link (view, link);
+
+ type = ev_link_get_link_type (link);
+ if (type == EV_LINK_TYPE_PAGE) {
+ ev_history_add_link (view->history, link);
+ }
+}
+
+static void
+go_to_index (EvView *view, int index)
+{
+ EvLink *link;
+
+ link = ev_history_get_link_nth (view->history, index);
+ g_return_if_fail (link != NULL);
+
+ go_to_link (view, link);
+}
+
+gboolean
+ev_view_can_go_back (EvView *view)
+{
+ int index, n;
+
+ if (view->history == NULL) {
+ return FALSE;
+ }
+
+ index = ev_history_get_current_index (view->history);
+ n = ev_history_get_n_links (view->history);
+
+ if (n > 0) {
+ return index != MAX (0, index - 1);
+ } else {
+ return FALSE;
+ }
+}
+
+void
+ev_view_go_back (EvView *view)
+{
+ int index, n;
+
+ g_return_if_fail (EV_IS_HISTORY (view->history));
+
+ index = ev_history_get_current_index (view->history);
+ n = ev_history_get_n_links (view->history);
+
+ if (n > 0) {
+ index = MAX (0, index - 1);
+ ev_history_set_current_index (view->history, index);
+ }
+}
+
+gboolean
+ev_view_can_go_forward (EvView *view)
+{
+ int index, n;
+
+ if (view->history == NULL) {
+ return FALSE;
+ }
+
+ index = ev_history_get_current_index (view->history);
+ n = ev_history_get_n_links (view->history);
+
+ if (n > 0) {
+ return index != MIN (n - 1, index + 1);
+ } else {
+ return FALSE;
+ }
+}
+
+void
+ev_view_go_forward (EvView *view)
+{
+ int index, n;
+
+ g_return_if_fail (EV_IS_HISTORY (view->history));
+
+ index = ev_history_get_current_index (view->history);
+ n = ev_history_get_n_links (view->history);
+
+ if (n > 0) {
+ index = MIN (n - 1, index + 1);
+ ev_history_set_current_index (view->history, index);
+ }
+}
+
+
+void
+ev_view_set_page (EvView *view,
+ int page)
+{
+ g_return_if_fail (EV_IS_VIEW (view));
+ g_return_if_fail (EV_IS_HISTORY (view->history));
+
+ set_document_page (view, page);
+ ev_history_add_page (view->history, page);
+}
+