[yelp] [libyelp] Implement previous and next menu items



commit ac89d5aa37f8854bce9ceb0612d048eb83929d56
Author: Shaun McCance <shaunm gnome org>
Date:   Wed Apr 28 12:25:55 2010 -0500

    [libyelp] Implement previous and next menu items
    
    These are done entirely by YelpView, which exposes them as actions in
    a GtkActionGroup. I'd like to move history navigation to YelpView as
    well, using the same trick.

 libyelp/yelp-view.c |   90 +++++++++++++++++++++++++++++++++++++++++++++++++-
 libyelp/yelp-view.h |   26 +++++++-------
 src/yelp-window.c   |   10 ++++-
 3 files changed, 109 insertions(+), 17 deletions(-)
---
diff --git a/libyelp/yelp-view.c b/libyelp/yelp-view.c
index 24e047b..e937065 100644
--- a/libyelp/yelp-view.c
+++ b/libyelp/yelp-view.c
@@ -67,6 +67,9 @@ static void        view_resource_request          (WebKitWebView             *vi
                                                    WebKitNetworkResponse     *response,
                                                    gpointer                   user_data);
 
+static void        view_navigation_action         (GtkAction          *action,
+                                                   YelpView           *view);
+
 static void        view_clear_load                (YelpView           *view);
 static void        view_load_page                 (YelpView           *view);
 static void        view_show_error_page           (YelpView           *view,
@@ -82,6 +85,19 @@ static void        document_callback              (YelpDocument       *document,
                                                    YelpView           *view,
                                                    GError             *error);
 
+static const GtkActionEntry entries[] = {
+    {"YelpViewGoPrevious", NULL,
+     N_("_Previous Page"),
+     "<Control>Page_Up",
+     NULL,
+     G_CALLBACK (view_navigation_action) },
+    {"YelpViewGoNext", NULL,
+     N_("_Next Page"),
+     "<Control>Page_Down",
+     NULL,
+     G_CALLBACK (view_navigation_action) }
+};
+
 enum {
     PROP_0,
     PROP_URI,
@@ -120,6 +136,8 @@ struct _YelpViewPrivate {
     gchar         *page_desc;
     gchar         *page_icon;
 
+    GtkActionGroup *action_group;
+
     gint           navigation_requested;
 };
 
@@ -144,6 +162,12 @@ yelp_view_init (YelpView *view)
                           G_CALLBACK (view_navigation_requested), NULL);
     g_signal_connect (view, "resource-request-starting",
                       G_CALLBACK (view_resource_request), NULL);
+
+    priv->action_group = gtk_action_group_new ("YelpView");
+    gtk_action_group_set_translation_domain (priv->action_group, GETTEXT_PACKAGE);
+    gtk_action_group_add_actions (priv->action_group,
+				  entries, G_N_ELEMENTS (entries),
+				  view);
 }
 
 static void
@@ -162,6 +186,11 @@ yelp_view_dispose (GObject *object)
         priv->cancellable = NULL;
     }
 
+    if (priv->action_group) {
+        g_object_unref (priv->action_group);
+        priv->action_group = NULL;
+    }
+
     if (priv->document) {
         g_object_unref (priv->document);
         priv->document = NULL;
@@ -388,6 +417,13 @@ yelp_view_load_uri (YelpView *view,
     g_signal_emit_by_name (view, "notify::page-desc", 0);
     g_signal_emit_by_name (view, "notify::page-icon", 0);
 
+    gtk_action_set_sensitive (gtk_action_group_get_action (priv->action_group,
+                                                           "YelpViewGoPrevious"),
+                              FALSE);
+    gtk_action_set_sensitive (gtk_action_group_get_action (priv->action_group,
+                                                           "YelpViewGoNext"),
+                              FALSE);
+
     priv->uri = g_object_ref (uri);
     if (!yelp_uri_is_resolved (uri)) {
         priv->uri_resolved = g_signal_connect (uri, "resolved",
@@ -425,7 +461,14 @@ YelpDocument *
 yelp_view_get_document (YelpView *view)
 {
     YelpViewPrivate *priv = GET_PRIV (view);
-    return g_object_ref (priv->document);
+    return priv->document;
+}
+
+GtkActionGroup *
+yelp_view_get_action_group (YelpView *view)
+{
+    YelpViewPrivate *priv = GET_PRIV (view);
+    return priv->action_group;
 }
 
 /******************************************************************************/
@@ -487,6 +530,36 @@ view_resource_request (WebKitWebView         *view,
 }
 
 static void
+view_navigation_action (GtkAction *action,
+                        YelpView  *view)
+{
+    YelpViewPrivate *priv = GET_PRIV (view);
+    gchar *page_id, *new_id, *xref;
+    YelpUri *new_uri;
+
+    page_id = yelp_uri_get_page_id (priv->uri);
+
+    if (g_str_equal (gtk_action_get_name (action), "YelpViewGoPrevious"))
+        new_id = yelp_document_get_prev_id (priv->document, page_id);
+    else
+        new_id = yelp_document_get_next_id (priv->document, page_id);
+
+    /* Just in case we screwed up somewhere */
+    if (new_id == NULL) {
+        gtk_action_set_sensitive (action, FALSE);
+        return;
+    }
+
+    xref = g_strconcat ("xref:", new_id, NULL);
+    new_uri = yelp_uri_new_relative (priv->uri, xref);
+    yelp_view_load_uri (view, new_uri);
+
+    g_free (xref);
+    g_free (new_id);
+    g_object_unref (new_uri);
+}
+
+static void
 view_clear_load (YelpView *view)
 {
     YelpViewPrivate *priv = GET_PRIV (view);
@@ -732,7 +805,8 @@ document_callback (YelpDocument       *document,
     debug_print (DB_FUNCTION, "entering\n");
 
     if (signal == YELP_DOCUMENT_SIGNAL_INFO) {
-        gchar *page_id;
+        gchar *page_id, *prev_id, *next_id;
+        GtkAction *action;
         page_id = yelp_uri_get_page_id (priv->uri);
 
         g_free (priv->root_title);
@@ -745,10 +819,22 @@ document_callback (YelpDocument       *document,
         priv->page_desc = yelp_document_get_page_desc (document, page_id);
         priv->page_icon = yelp_document_get_page_icon (document, page_id);
 
+        prev_id = yelp_document_get_prev_id (document, page_id);
+        action = gtk_action_group_get_action (priv->action_group, "YelpViewGoPrevious");
+        gtk_action_set_sensitive (action, prev_id != NULL);
+        g_free (prev_id);
+
+        next_id = yelp_document_get_next_id (document, page_id);
+        action = gtk_action_group_get_action (priv->action_group, "YelpViewGoNext");
+        gtk_action_set_sensitive (action, next_id != NULL);
+        g_free (next_id);
+
         g_signal_emit_by_name (view, "notify::root-title", 0);
         g_signal_emit_by_name (view, "notify::page-title", 0);
         g_signal_emit_by_name (view, "notify::page-desc", 0);
         g_signal_emit_by_name (view, "notify::page-icon", 0);
+
+        g_free (page_id);
     }
     else if (signal == YELP_DOCUMENT_SIGNAL_CONTENTS) {
 	const gchar *contents;
diff --git a/libyelp/yelp-view.h b/libyelp/yelp-view.h
index ea2238f..0758d78 100644
--- a/libyelp/yelp-view.h
+++ b/libyelp/yelp-view.h
@@ -1,4 +1,4 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
 /*
  * Copyright (C) 2009 Shaun McCance <shaunm gnome org>
  *
@@ -57,19 +57,19 @@ typedef enum {
     YELP_VIEW_STATE_ERROR
 } YelpViewState;
 
-GType            yelp_view_get_type        (void);
-GType            yelp_view_state_get_type  (void);
+GType              yelp_view_get_type          (void);
+GType              yelp_view_state_get_type    (void);
 
-GtkWidget *      yelp_view_new             (void);
-
-void             yelp_view_load            (YelpView     *view,
-					    const gchar  *uri);
-void             yelp_view_load_uri        (YelpView     *view,
-					    YelpUri      *uri);
-void             yelp_view_load_document   (YelpView     *view,
-					    YelpUri      *uri,
-					    YelpDocument *document);
-YelpDocument *   yelp_view_get_document    (YelpView     *view);
+GtkWidget *        yelp_view_new               (void);
+void               yelp_view_load              (YelpView      *view,
+                                                const gchar   *uri);
+void               yelp_view_load_uri          (YelpView      *view,
+                                                YelpUri       *uri);
+void               yelp_view_load_document     (YelpView      *view,
+                                                YelpUri       *uri,
+                                                YelpDocument  *document);
+YelpDocument *     yelp_view_get_document      (YelpView     *view);
+GtkActionGroup *   yelp_view_get_action_group  (YelpView     *view);
 
 G_END_DECLS
 
diff --git a/src/yelp-window.c b/src/yelp-window.c
index b5233d6..6906037 100644
--- a/src/yelp-window.c
+++ b/src/yelp-window.c
@@ -143,6 +143,9 @@ static const gchar *YELP_UI =
     "<menu action='GoMenu'>"
     "<menuitem action='GoBack'/>"
     "<menuitem action='GoForward'/>"
+    "<separator/>"
+    "<menuitem action='YelpViewGoPrevious'/>"
+    "<menuitem action='YelpViewGoNext'/>"
     "</menu>"
     "</menubar>"
     "<accelerator action='OpenLocation'/>"
@@ -349,6 +352,8 @@ window_construct (YelpWindow *window)
 
     gtk_window_set_icon_name (GTK_WINDOW (window), "help-browser");
 
+    priv->view = (YelpView *) yelp_view_new ();
+
     vbox = gtk_vbox_new (FALSE, 0);
     gtk_container_add (GTK_CONTAINER (window), vbox);
 
@@ -363,6 +368,9 @@ window_construct (YelpWindow *window)
     gtk_ui_manager_insert_action_group (priv->ui_manager,
                                         yelp_application_get_action_group (priv->application),
                                         1);
+    gtk_ui_manager_insert_action_group (priv->ui_manager,
+                                        yelp_view_get_action_group (priv->view),
+                                        2);
     gtk_window_add_accel_group (GTK_WINDOW (window),
                                 gtk_ui_manager_get_accel_group (priv->ui_manager));
     gtk_ui_manager_add_ui_from_string (priv->ui_manager, YELP_UI, -1, NULL);
@@ -450,7 +458,6 @@ window_construct (YelpWindow *window)
                                     GTK_POLICY_AUTOMATIC);
     gtk_box_pack_end (GTK_BOX (vbox), scroll, TRUE, TRUE, 0);
 
-    priv->view = (YelpView *) yelp_view_new ();
     g_signal_connect (priv->view, "external-uri", G_CALLBACK (view_external_uri), window);
     g_signal_connect (priv->view, "loaded", G_CALLBACK (view_loaded), window);
     g_signal_connect (priv->view, "notify::yelp-uri", G_CALLBACK (view_uri_selected), window);
@@ -726,7 +733,6 @@ view_loaded (YelpView   *view,
     }
 
     g_strfreev (ids);
-    g_object_unref (document);
 }
 
 static void



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]