From 2c91588d544c80f08526a54c98b25aabe3777ef7 Mon Sep 17 00:00:00 2001 From: Marco Pesenti Gritti Date: Sun, 09 Jan 2005 19:30:55 +0000 Subject: Initial history implementation. Needs work. 2005-01-09 Marco Pesenti Gritti * 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. --- diff --git a/ChangeLog b/ChangeLog index 52487a8..e7692c8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,28 @@ +2005-01-09 Marco Pesenti Gritti + + * 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 * 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 + +#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 + +#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 #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 #include +#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 -- cgit v0.9.1