]> www.fi.muni.cz Git - evince.git/commitdiff
Initial history implementation. Needs work.
authorMarco Pesenti Gritti <marco@gnome.org>
Sun, 9 Jan 2005 19:30:55 +0000 (19:30 +0000)
committerMarco Pesenti Gritti <marco@src.gnome.org>
Sun, 9 Jan 2005 19:30:55 +0000 (19:30 +0000)
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.

ChangeLog
shell/Makefile.am
shell/ev-application.c
shell/ev-application.h
shell/ev-history.c [new file with mode: 0644]
shell/ev-history.h [new file with mode: 0644]
shell/ev-sidebar-bookmarks.c
shell/ev-view.c
shell/ev-view.h
shell/ev-window.c
shell/ev-window.h

index 52487a82417f9b348c104f30cab8f7a7fbe271b9..e7692c88a5f884a67734c6d55b774f7a992d201f 100644 (file)
--- 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.
index 0ad5df59aa8aad30b306c058fa372e81e3d77736..7b088f79f5902cca6bddb1bb6b6b03698155a470 100644 (file)
@@ -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          \
index 6fe50aaa67a92b8250027200254f4d0ee0c54b05..896fa902eb17a28ae4f3b8e28d35ca19e519eda3 100644 (file)
@@ -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);
index 674d799f973079095f3ff29a138268902e21f7ea..19a848bfb6a4e5670a9cef1dc17427e9b8a57e1d 100644 (file)
@@ -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 (file)
index 0000000..47fa300
--- /dev/null
@@ -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 (file)
index 0000000..f69cd48
--- /dev/null
@@ -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
index e54e4a5c0192087b15605ffaab117e1ed7b2b581..5c463b4e00a50ff40a9ec43b8e55fcb9e36ddffb 100644 (file)
@@ -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);
+               }
        }
 }
 
index 0848c965cd344929fa702d412a39a8f4e8ac8808..678770bd41563716178368680dc1d45e3b854c5c 100644 (file)
@@ -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)
 {
index c68bf9fe424a89bc3f092ebf69ee87af09629e47..067873bc2658c66ef35c83edd1d9db0f5923d563 100644 (file)
@@ -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);
index ff4c5d2417bd1c1fe786a56d63cdcab7acdc3b6a..0f26863ba707ec6093e2bc118885af091c266130 100644 (file)
@@ -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);
 
index 0d2e242ae33d9df2dca94d86c808124c6ef65377..ebd1fc44148149e03851eb687ca653a5cc53bcf0 100644 (file)
@@ -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