Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog25
-rw-r--r--shell/Makefile.am2
-rw-r--r--shell/ev-application.c6
-rw-r--r--shell/ev-application.h2
-rw-r--r--shell/ev-history.c152
-rw-r--r--shell/ev-history.h69
-rw-r--r--shell/ev-sidebar-bookmarks.c10
-rw-r--r--shell/ev-view.c91
-rw-r--r--shell/ev-view.h15
-rw-r--r--shell/ev-window.c19
-rw-r--r--shell/ev-window.h4
11 files changed, 379 insertions, 16 deletions
diff --git a/ChangeLog b/ChangeLog
index 52487a8..e7692c8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,28 @@
+2005-01-09 Marco Pesenti Gritti <marco@gnome.org>
+
+ * shell/Makefile.am:
+ * shell/ev-application.c: (ev_application_open_bookmark):
+ * shell/ev-application.h:
+ * shell/ev-history.c: (ev_history_init), (free_links_list),
+ (ev_history_finalize), (ev_history_class_init),
+ (ev_history_add_link), (ev_history_add_page),
+ (ev_history_get_link_nth), (ev_history_get_n_links),
+ (ev_history_get_current_index), (ev_history_set_current_index),
+ (ev_history_new):
+ * shell/ev-history.h:
+ * shell/ev-sidebar-bookmarks.c: (selection_changed_cb):
+ * shell/ev-view.c: (ev_view_finalize), (ev_view_set_document),
+ (set_document_page), (go_to_bookmark), (ev_view_go_to_bookmark),
+ (go_to_index), (ev_view_go_back), (ev_view_go_forward),
+ (ev_view_set_page):
+ * shell/ev-view.h:
+ * shell/ev-window.c: (ev_window_open_bookmark),
+ (ev_window_cmd_go_back), (ev_window_cmd_go_forward),
+ (goto_page_cb), (register_custom_actions):
+ * shell/ev-window.h:
+
+ Initial history implementation. Needs work.
+
2005-01-09 Martin Kretzschmar <martink@gnome.org>
* pdf/xpdf/GDKSplashOutputDev.cc (redraw): fix pixbuf data offset.
diff --git a/shell/Makefile.am b/shell/Makefile.am
index 0ad5df5..7b088f7 100644
--- a/shell/Makefile.am
+++ b/shell/Makefile.am
@@ -21,6 +21,8 @@ evince_SOURCES= \
eggfindbar.h \
ev-application.c \
ev-application.h \
+ ev-history.c \
+ ev-history.h \
ev-marshal.c \
ev-marshal.h \
ev-navigation-action.c \
diff --git a/shell/ev-application.c b/shell/ev-application.c
index 6fe50aa..896fa90 100644
--- a/shell/ev-application.c
+++ b/shell/ev-application.c
@@ -171,13 +171,12 @@ ev_application_open (EvApplication *application, GError *err)
void
ev_application_open_bookmark (EvApplication *application,
- EvDocument *document,
+ EvWindow *window,
EvBookmark *bookmark,
GError *error)
{
EvBookmarkType type;
const char *uri;
- int page;
type = ev_bookmark_get_bookmark_type (bookmark);
@@ -185,8 +184,7 @@ ev_application_open_bookmark (EvApplication *application,
case EV_BOOKMARK_TYPE_TITLE:
break;
case EV_BOOKMARK_TYPE_LINK:
- page = ev_bookmark_get_page (bookmark);
- ev_document_set_page (document, page);
+ ev_window_open_bookmark (window, bookmark);
break;
case EV_BOOKMARK_TYPE_EXTERNAL_URI:
uri = ev_bookmark_get_uri (bookmark);
diff --git a/shell/ev-application.h b/shell/ev-application.h
index 674d799..19a848b 100644
--- a/shell/ev-application.h
+++ b/shell/ev-application.h
@@ -60,7 +60,7 @@ void ev_application_open (EvApplication *application,
GError *err);
EvWindow *ev_application_new_window (EvApplication *application);
void ev_application_open_bookmark (EvApplication *application,
- EvDocument *document,
+ EvWindow *window,
EvBookmark *bookmark,
GError *err);
diff --git a/shell/ev-history.c b/shell/ev-history.c
new file mode 100644
index 0000000..47fa300
--- /dev/null
+++ b/shell/ev-history.c
@@ -0,0 +1,152 @@
+/*
+ * Copyright (C) 2005 Marco Pesenti Gritti
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Id$
+ */
+
+#include "config.h"
+
+#include <glib/gi18n.h>
+
+#include "ev-history.h"
+
+struct _EvHistoryPrivate
+{
+ GList *links;
+ int current_index;
+};
+
+static void ev_history_init (EvHistory *history);
+static void ev_history_class_init (EvHistoryClass *class);
+
+static GObjectClass *parent_class = NULL;
+
+G_DEFINE_TYPE (EvHistory, ev_history, G_TYPE_OBJECT)
+
+#define EV_HISTORY_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), EV_TYPE_HISTORY, EvHistoryPrivate))
+
+static void
+ev_history_init (EvHistory *history)
+{
+ history->priv = EV_HISTORY_GET_PRIVATE (history);
+
+ history->priv->links = NULL;
+}
+
+static void
+free_links_list (GList *l)
+{
+ g_list_foreach (l, (GFunc)g_object_unref, NULL);
+ g_list_free (l);
+}
+
+static void
+ev_history_finalize (GObject *object)
+{
+ EvHistory *history = EV_HISTORY (object);
+
+ free_links_list (history->priv->links);
+
+ parent_class->finalize (object);
+}
+
+static void
+ev_history_class_init (EvHistoryClass *class)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (class);
+
+ object_class->finalize = ev_history_finalize;
+
+ parent_class = g_type_class_peek_parent (class);
+
+ g_type_class_add_private (object_class, sizeof (EvHistoryPrivate));
+}
+
+void
+ev_history_add_link (EvHistory *history, EvBookmark *bookmark)
+{
+ int length;
+
+ g_return_if_fail (EV_IS_HISTORY (history));
+ g_return_if_fail (EV_IS_BOOKMARK (bookmark));
+
+ g_object_ref (bookmark);
+ history->priv->links = g_list_append (history->priv->links,
+ bookmark);
+
+ length = g_list_length (history->priv->links);
+ history->priv->current_index = length - 1;
+
+ g_print ("Set current\n");
+}
+
+void
+ev_history_add_page (EvHistory *history, int page)
+{
+ EvBookmark *bookmark;
+ char *title;
+
+ g_return_if_fail (EV_IS_HISTORY (history));
+
+ title = g_strdup_printf (_("Page %d\n"), page);
+ bookmark = ev_bookmark_new_link (title, page);
+ g_free (title);
+
+ ev_history_add_link (history, bookmark);
+}
+
+EvBookmark *
+ev_history_get_link_nth (EvHistory *history, int index)
+{
+ GList *l;
+
+ g_return_val_if_fail (EV_IS_HISTORY (history), NULL);
+
+ l = g_list_nth (history->priv->links, index);
+
+ return EV_BOOKMARK (l->data);
+}
+
+int
+ev_history_get_n_links (EvHistory *history)
+{
+ g_return_val_if_fail (EV_IS_HISTORY (history), -1);
+
+ return g_list_length (history->priv->links);
+}
+
+int
+ev_history_get_current_index (EvHistory *history)
+{
+ g_return_val_if_fail (EV_IS_HISTORY (history), -1);
+
+ return history->priv->current_index;
+}
+
+void
+ev_history_set_current_index (EvHistory *history, int index)
+{
+ g_return_if_fail (EV_IS_HISTORY (history));
+
+ history->priv->current_index = index;
+}
+
+EvHistory *
+ev_history_new (void)
+{
+ return EV_HISTORY (g_object_new (EV_TYPE_HISTORY, NULL));
+}
diff --git a/shell/ev-history.h b/shell/ev-history.h
new file mode 100644
index 0000000..f69cd48
--- /dev/null
+++ b/shell/ev-history.h
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2005 Marco Pesenti Gritti
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Id$
+ */
+
+#ifndef EV_HISTORY_H
+#define EV_HISTORY_H
+
+#include <glib-object.h>
+
+#include "ev-bookmark.h"
+
+G_BEGIN_DECLS
+
+#define EV_TYPE_HISTORY (ev_history_get_type ())
+#define EV_HISTORY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EV_TYPE_HISTORY, EvHistory))
+#define EV_HISTORY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EV_TYPE_HISTORY, EvHistoryClass))
+#define EV_IS_HISTORY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EV_TYPE_HISTORY))
+#define EV_IS_HISTORY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), EV_TYPE_HISTORY))
+#define EV_HISTORY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), EV_TYPE_HISTORY, EvHistoryClass))
+
+typedef struct _EvHistory EvHistory;
+typedef struct _EvHistoryPrivate EvHistoryPrivate;
+typedef struct _EvHistoryClass EvHistoryClass;
+
+struct _EvHistory
+{
+ GObject parent;
+
+ /*< private >*/
+ EvHistoryPrivate *priv;
+};
+
+struct _EvHistoryClass
+{
+ GObjectClass parent_class;
+};
+
+GType ev_history_get_type (void);
+EvHistory *ev_history_new (void);
+void ev_history_add_link (EvHistory *history,
+ EvBookmark *bookmark);
+void ev_history_add_page (EvHistory *history,
+ int page);
+EvBookmark *ev_history_get_link_nth (EvHistory *history,
+ int index);
+int ev_history_get_n_links (EvHistory *history);
+int ev_history_get_current_index (EvHistory *history);
+void ev_history_set_current_index (EvHistory *history,
+ int index);
+
+G_END_DECLS
+
+#endif
diff --git a/shell/ev-sidebar-bookmarks.c b/shell/ev-sidebar-bookmarks.c
index e54e4a5..5c463b4 100644
--- a/shell/ev-sidebar-bookmarks.c
+++ b/shell/ev-sidebar-bookmarks.c
@@ -106,6 +106,7 @@ selection_changed_cb (GtkTreeSelection *selection,
if (gtk_tree_selection_get_selected (selection, &model, &iter)) {
EvBookmark *bookmark;
EvApplication *app;
+ GtkWidget *window;
GValue value = {0, };
gtk_tree_model_get_value (model, &iter,
@@ -114,8 +115,13 @@ selection_changed_cb (GtkTreeSelection *selection,
bookmark = EV_BOOKMARK (g_value_get_object (&value));
g_return_if_fail (bookmark != NULL);
- app = ev_application_get_instance ();
- ev_application_open_bookmark (app, document, bookmark, NULL);
+ window = gtk_widget_get_ancestor (GTK_WIDGET (ev_sidebar_bookmarks),
+ EV_TYPE_WINDOW);
+ if (window) {
+ app = ev_application_get_instance ();
+ ev_application_open_bookmark (app, EV_WINDOW (window),
+ bookmark, NULL);
+ }
}
}
diff --git a/shell/ev-view.c b/shell/ev-view.c
index 0848c96..678770b 100644
--- a/shell/ev-view.c
+++ b/shell/ev-view.c
@@ -28,6 +28,7 @@
#include "ev-marshal.h"
#include "ev-view.h"
#include "ev-document-find.h"
+#include "ev-history.h"
#define EV_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EV_TYPE_VIEW, EvViewClass))
#define EV_IS_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EV_TYPE_VIEW))
@@ -52,6 +53,7 @@ struct _EvView {
GtkWidget parent_instance;
EvDocument *document;
+ EvHistory *history;
GdkWindow *bin_window;
@@ -91,7 +93,7 @@ static guint page_changed_signal = 0;
static void ev_view_set_scroll_adjustments (EvView *view,
GtkAdjustment *hadjustment,
GtkAdjustment *vadjustment);
-
+
G_DEFINE_TYPE (EvView, ev_view, GTK_TYPE_WIDGET)
/*** Helper functions ***/
@@ -168,6 +170,9 @@ ev_view_finalize (GObject *object)
if (view->document)
g_object_unref (view->document);
+ if (view->history)
+ g_object_unref (view->history);
+
ev_view_set_scroll_adjustments (view, NULL, NULL);
g_array_free (view->find_results, TRUE);
@@ -900,12 +905,16 @@ ev_view_set_document (EvView *view,
if (old_page != ev_view_get_page (view))
g_signal_emit (view, page_changed_signal, 0);
+
+ if (view->history) {
+ g_object_unref (view->history);
+ }
+ view->history = ev_history_new ();
}
}
-void
-ev_view_set_page (EvView *view,
- int page)
+static void
+set_document_page (EvView *view, int page)
{
if (view->document) {
int old_page = ev_document_get_page (view->document);
@@ -920,6 +929,80 @@ ev_view_set_page (EvView *view,
}
}
+static void
+go_to_bookmark (EvView *view, EvBookmark *bookmark)
+{
+ EvBookmarkType type;
+ int page;
+
+ type = ev_bookmark_get_bookmark_type (bookmark);
+
+ if (type == EV_BOOKMARK_TYPE_LINK) {
+ page = ev_bookmark_get_page (bookmark);
+ set_document_page (view, page);
+ }
+}
+
+void
+ev_view_go_to_bookmark (EvView *view, EvBookmark *bookmark)
+{
+ go_to_bookmark (view, bookmark);
+ ev_history_add_link (view->history, bookmark);
+}
+
+static void
+go_to_index (EvView *view, int index)
+{
+ EvBookmark *bookmark;
+
+ bookmark = ev_history_get_link_nth (view->history, index);
+ g_return_if_fail (bookmark != NULL);
+
+ go_to_bookmark (view, bookmark);
+}
+
+void
+ev_view_go_back (EvView *view)
+{
+ int index;
+
+ g_return_if_fail (EV_IS_HISTORY (view->history));
+
+ index = ev_history_get_current_index (view->history);
+ index = MAX (0, index - 1);
+
+ ev_history_set_current_index (view->history, index);
+ go_to_index (view, index);
+}
+
+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);
+
+ index = MIN (n - 1, index + 1);
+
+ ev_history_set_current_index (view->history, index);
+ go_to_index (view, 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);
+}
+
int
ev_view_get_page (EvView *view)
{
diff --git a/shell/ev-view.h b/shell/ev-view.h
index c68bf9f..067873b 100644
--- a/shell/ev-view.h
+++ b/shell/ev-view.h
@@ -23,6 +23,7 @@
#include <gtk/gtkwidget.h>
#include "ev-document.h"
+#include "ev-bookmark.h"
G_BEGIN_DECLS
@@ -36,13 +37,23 @@ typedef struct _EvViewClass EvViewClass;
GType ev_view_get_type (void) G_GNUC_CONST;
GtkWidget* ev_view_new (void);
-void ev_view_copy (EvView *view);
-void ev_view_select_all (EvView *view);
void ev_view_set_document (EvView *view,
EvDocument *document);
+
+/* Clipboard */
+void ev_view_copy (EvView *view);
+void ev_view_select_all (EvView *view);
+
+/* Navigation */
+void ev_view_go_back (EvView *view);
+void ev_view_go_forward (EvView *view);
+void ev_view_go_to_bookmark (EvView *view,
+ EvBookmark *bookmark);
void ev_view_set_page (EvView *view,
int page);
int ev_view_get_page (EvView *view);
+
+/* Page size */
void ev_view_zoom_in (EvView *view);
void ev_view_zoom_out (EvView *view);
void ev_view_normal_size (EvView *view);
diff --git a/shell/ev-window.c b/shell/ev-window.c
index ff4c5d2..0f26863 100644
--- a/shell/ev-window.c
+++ b/shell/ev-window.c
@@ -190,6 +190,12 @@ update_action_sensitivity (EvWindow *ev_window)
set_action_sensitive (ev_window, "GoLastPage", page < n_pages);
}
+void
+ev_window_open_bookmark (EvWindow *ev_window, EvBookmark *bookmark)
+{
+ ev_view_go_to_bookmark (EV_VIEW (ev_window->priv->view), bookmark);
+}
+
gboolean
ev_window_is_empty (const EvWindow *ev_window)
{
@@ -866,7 +872,7 @@ ev_window_cmd_go_back (GtkAction *action, EvWindow *ev_window)
{
g_return_if_fail (EV_IS_WINDOW (ev_window));
- /* FIXME */
+ ev_view_go_back (EV_VIEW (ev_window->priv->view));
}
static void
@@ -874,7 +880,7 @@ ev_window_cmd_go_forward (GtkAction *action, EvWindow *ev_window)
{
g_return_if_fail (EV_IS_WINDOW (ev_window));
- /* FIXME */
+ ev_view_go_forward (EV_VIEW (ev_window->priv->view));
}
static void
@@ -1323,8 +1329,11 @@ static GtkToggleActionEntry toggle_entries[] = {
static void
goto_page_cb (GtkAction *action, int page_number, EvWindow *ev_window)
{
+ EvView *view = EV_VIEW (ev_window->priv->view);
- ev_view_set_page (EV_VIEW (ev_window->priv->view), page_number);
+ if (ev_view_get_page (view) != page_number) {
+ ev_view_set_page (view, page_number);
+ }
}
static void
@@ -1341,6 +1350,8 @@ register_custom_actions (EvWindow *window, GtkActionGroup *group)
"direction", EV_NAVIGATION_DIRECTION_BACK,
"is_important", TRUE,
NULL);
+ g_signal_connect (action, "activate",
+ G_CALLBACK (ev_window_cmd_go_back), window);
gtk_action_group_add_action (group, action);
g_object_unref (action);
@@ -1352,6 +1363,8 @@ register_custom_actions (EvWindow *window, GtkActionGroup *group)
"arrow-tooltip", _("Forward history"),
"direction", EV_NAVIGATION_DIRECTION_FORWARD,
NULL);
+ g_signal_connect (action, "activate",
+ G_CALLBACK (ev_window_cmd_go_back), window);
gtk_action_group_add_action (group, action);
g_object_unref (action);
diff --git a/shell/ev-window.h b/shell/ev-window.h
index 0d2e242..ebd1fc4 100644
--- a/shell/ev-window.h
+++ b/shell/ev-window.h
@@ -26,6 +26,8 @@
#include <glib-object.h>
#include <gtk/gtkwindow.h>
+#include "ev-bookmark.h"
+
G_BEGIN_DECLS
typedef struct _EvWindow EvWindow;
@@ -54,6 +56,8 @@ struct _EvWindowClass {
GType ev_window_get_type (void);
void ev_window_open (EvWindow *ev_window, const char *uri);
+void ev_window_open_bookmark (EvWindow *ev_window,
+ EvBookmark *bookmark);
gboolean ev_window_is_empty (const EvWindow *ev_window);
G_END_DECLS