Refactor the Help menu.
authorJohn Darrington <john@darrington.wattle.id.au>
Mon, 10 May 2010 16:50:38 +0000 (18:50 +0200)
committerJohn Darrington <john@darrington.wattle.id.au>
Mon, 10 May 2010 16:50:38 +0000 (18:50 +0200)
Instead of writing a help menu for each of the three main windows,
implement it once, and merge it into the menubars using GtkUIManager

13 files changed:
src/ui/gui/about.c [deleted file]
src/ui/gui/about.h [deleted file]
src/ui/gui/automake.mk
src/ui/gui/data-editor.ui
src/ui/gui/help-menu.c [new file with mode: 0644]
src/ui/gui/help-menu.h [new file with mode: 0644]
src/ui/gui/helper.c
src/ui/gui/helper.h
src/ui/gui/output-viewer.glade
src/ui/gui/psppire-data-window.c
src/ui/gui/psppire-output-window.c
src/ui/gui/psppire-syntax-window.c
src/ui/gui/syntax-editor.glade

diff --git a/src/ui/gui/about.c b/src/ui/gui/about.c
deleted file mode 100644 (file)
index 5b606bf..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-/* PSPPIRE - a graphical user interface for PSPP.
-   Copyright (C) 2006, 2007, 2010  Free Software Foundation
-
-   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 3 of the License, 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, see <http://www.gnu.org/licenses/>. */
-
-
-#include <config.h>
-
-#include <gtk/gtk.h>
-
-#include <libpspp/copyleft.h>
-#include <libpspp/version.h>
-#include "about.h"
-#include "helper.h"
-
-#include "gl/configmake.h"
-
-#include <gettext.h>
-#define _(msgid) gettext (msgid)
-#define N_(msgid) msgid
-
-
-static const gchar *artists[] = { "Patrick Brunier", "Dondi Bogusky", NULL};
-
-void
-about_new (GtkMenuItem *m, GtkWindow *parent)
-{
-  GtkWidget *about =  gtk_about_dialog_new ();
-
-  GdkPixbuf *pb =
-    gdk_pixbuf_new_from_file_at_size (relocate (PKGDATADIR "/pspplogo.png"),
-                                     64, 64, 0);
-
-  gtk_about_dialog_set_logo (GTK_ABOUT_DIALOG (about), pb);
-
-
-  gtk_window_set_icon_name (GTK_WINDOW (about), "psppicon");
-
-  gtk_about_dialog_set_website (GTK_ABOUT_DIALOG (about),
-                               "http://www.gnu.org/software/pspp");
-
-  gtk_about_dialog_set_version (GTK_ABOUT_DIALOG (about),
-                               bare_version);
-
-  gtk_about_dialog_set_authors (GTK_ABOUT_DIALOG (about),
-                               (const gchar **) authors);
-
-  gtk_about_dialog_set_artists (GTK_ABOUT_DIALOG (about),
-                               artists);
-
-  gtk_about_dialog_set_license (GTK_ABOUT_DIALOG (about),
-                               copyleft);
-
-  gtk_about_dialog_set_comments (GTK_ABOUT_DIALOG (about),
-                                _("A program for the analysis of sampled data"));
-
-  gtk_about_dialog_set_copyright (GTK_ABOUT_DIALOG (about),
-                                 "Free Software Foundation");
-
-  gtk_about_dialog_set_translator_credits 
-    (
-     GTK_ABOUT_DIALOG (about),
-     /* TRANSLATORS: Use this string to list the people who have helped with
-       translation to your language. */
-     _("translator-credits")
-     );
-
-  gtk_window_set_transient_for (GTK_WINDOW (about), parent);
-
-  gtk_window_set_modal (GTK_WINDOW (about), TRUE);
-
-  gtk_dialog_run (GTK_DIALOG (about));
-
-  gtk_widget_hide (about);
-}
-
diff --git a/src/ui/gui/about.h b/src/ui/gui/about.h
deleted file mode 100644 (file)
index 1695648..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-/* PSPPIRE - a graphical user interface for PSPP.
-   Copyright (C) 2007, 2010  Free Software Foundation
-
-   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 3 of the License, 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, see <http://www.gnu.org/licenses/>. */
-
-#include <gtk/gtk.h>
-
-
-void about_new (GtkMenuItem *m, GtkWindow *parent);
index 52e7713472ba5458ed6a97a9acbed39191a507e7..48154d6dc8cadb34dd997cad419b25e0937b5fbc 100644 (file)
@@ -116,8 +116,6 @@ src_ui_gui_psppire_SOURCES = \
        src/ui/gui/psppire-hbuttonbox.c \
        src/ui/gui/psppire-vbuttonbox.c \
        src/ui/gui/psppire-acr.c \
-       src/ui/gui/about.c \
-       src/ui/gui/about.h \
        src/ui/gui/checkbox-treeview.c \
        src/ui/gui/checkbox-treeview.h \
        src/ui/gui/comments-dialog.c \
@@ -149,6 +147,8 @@ src_ui_gui_psppire_SOURCES = \
        src/ui/gui/goto-case-dialog.c \
        src/ui/gui/goto-case-dialog.h \
        src/ui/gui/helper.c \
+       src/ui/gui/help-menu.c \
+       src/ui/gui/help-menu.h \
        src/ui/gui/helper.h \
        src/ui/gui/main.c \
        src/ui/gui/missing-val-dialog.c \
index 8ae12effa1dc8c55b04ce1e62ad1c82434f39c3d..e05f4ffdb1eda59cf35037b7fc3d154cd6f2d170 100644 (file)
             <property name="label" translatable="yes">_Split</property>
           </object>
         </child>
-        <child>
-          <object class="GtkAction" id="help">
-            <property name="name">help</property>
-            <property name="label" translatable="yes">_Help</property>
-          </object>
-        </child>
-        <child>
-          <object class="GtkAction" id="help_reference">
-            <property name="name">help_reference</property>
-            <property name="label" translatable="yes">_Reference Manual</property>
-          </object>
-        </child>
-        <child>
-          <object class="GtkAction" id="help_about">
-            <property name="stock-id">gtk-about</property>
-            <property name="name">help_about</property>
-          </object>
-        </child>
       </object>
     </child>
     <ui>
           <menuitem action="windows_minimise_all"/>
           <menuitem action="windows_split"/>
         </menu>
-        <menu action="help">
-          <menuitem action="help_reference"/>
-          <menuitem action="help_about"/>
-        </menu>
       </menubar>
       <toolbar action="toolbar">
         <placeholder name="tool-items">
diff --git a/src/ui/gui/help-menu.c b/src/ui/gui/help-menu.c
new file mode 100644 (file)
index 0000000..c24125d
--- /dev/null
@@ -0,0 +1,150 @@
+/* PSPPIRE - a graphical user interface for PSPP.
+   Copyright (C) 2006, 2007, 2010  Free Software Foundation
+
+   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 3 of the License, 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, see <http://www.gnu.org/licenses/>. */
+
+
+#include <config.h>
+
+#include <gtk/gtk.h>
+
+#include <libpspp/copyleft.h>
+#include <libpspp/version.h>
+#include "help-menu.h"
+#include <libpspp/message.h>
+
+#include "gl/configmake.h"
+#include "gl/relocatable.h"
+
+#include <gettext.h>
+#define _(msgid) gettext (msgid)
+#define N_(msgid) msgid
+
+
+static const gchar *artists[] = { "Patrick Brunier", "Dondi Bogusky", NULL};
+
+static void
+about_new (GtkMenuItem *m, GtkWindow *parent)
+{
+  GtkWidget *about =  gtk_about_dialog_new ();
+
+  GdkPixbuf *pb =
+    gdk_pixbuf_new_from_file_at_size (relocate (PKGDATADIR "/pspplogo.png"),
+                                     64, 64, 0);
+
+  gtk_about_dialog_set_logo (GTK_ABOUT_DIALOG (about), pb);
+
+
+  gtk_window_set_icon_name (GTK_WINDOW (about), "psppicon");
+
+  gtk_about_dialog_set_website (GTK_ABOUT_DIALOG (about),
+                               "http://www.gnu.org/software/pspp");
+
+  gtk_about_dialog_set_version (GTK_ABOUT_DIALOG (about),
+                               bare_version);
+
+  gtk_about_dialog_set_authors (GTK_ABOUT_DIALOG (about),
+                               (const gchar **) authors);
+
+  gtk_about_dialog_set_artists (GTK_ABOUT_DIALOG (about),
+                               artists);
+
+  gtk_about_dialog_set_license (GTK_ABOUT_DIALOG (about),
+                               copyleft);
+
+  gtk_about_dialog_set_comments (GTK_ABOUT_DIALOG (about),
+                                _("A program for the analysis of sampled data"));
+
+  gtk_about_dialog_set_copyright (GTK_ABOUT_DIALOG (about),
+                                 "Free Software Foundation");
+
+  gtk_about_dialog_set_translator_credits 
+    (
+     GTK_ABOUT_DIALOG (about),
+     /* TRANSLATORS: Use this string to list the people who have helped with
+       translation to your language. */
+     _("translator-credits")
+     );
+
+  gtk_window_set_transient_for (GTK_WINDOW (about), parent);
+
+  gtk_window_set_modal (GTK_WINDOW (about), TRUE);
+
+  gtk_dialog_run (GTK_DIALOG (about));
+
+  gtk_widget_hide (about);
+}
+
+
+static void
+reference_manual (GtkMenuItem *menu, gpointer data)
+{
+  GError *err = NULL;
+  gchar *cmd = g_strdup_printf ("yelp file://%s", relocate (DOCDIR "/pspp.xml"));
+
+  if ( ! g_spawn_command_line_async (cmd, &err) )
+    {
+      msg (ME, _("Cannot open reference manual: %s.  The PSPP user manual is "
+                 "also available at "
+                 "http://www.gnu.org/software/pspp/documentation.html"),
+           err->message);
+    }
+
+  g_free (cmd);
+  g_clear_error (&err);
+}
+
+void
+merge_help_menu (GtkUIManager *uim)
+{
+  GtkActionGroup *action_group = gtk_action_group_new ("help");
+
+  static const GtkActionEntry entries[] =
+    {
+      {
+       "help", NULL,                               /* name, stock id */
+       N_("_Help"), NULL,                          /* label, accelerator */
+       NULL,
+       NULL,
+      },
+    
+      {
+       "help_reference", GTK_STOCK_HELP,            /* name, stock id */
+       N_("_Reference Manual"), NULL,               /* label, accelerator */
+       NULL,                                        /* tooltip */
+       G_CALLBACK (reference_manual)
+      },
+    
+      {
+       "help_about", GTK_STOCK_ABOUT,
+       NULL, NULL, NULL,
+       G_CALLBACK (about_new)
+      },
+    };
+
+  gtk_action_group_set_translation_domain (action_group, PACKAGE);
+
+  gtk_ui_manager_add_ui_from_string   (uim, "\
+      <menubar name=\"menubar\">\
+        <menu action=\"help\">\
+          <menuitem action=\"help_reference\"/>\
+          <menuitem action=\"help_about\"/>\
+        </menu>\
+       </menubar>\
+       ", -1, 0);
+
+  gtk_action_group_add_actions (action_group, entries, G_N_ELEMENTS (entries), NULL);
+
+  gtk_ui_manager_insert_action_group  (uim, action_group, 0);
+}
diff --git a/src/ui/gui/help-menu.h b/src/ui/gui/help-menu.h
new file mode 100644 (file)
index 0000000..ff3740f
--- /dev/null
@@ -0,0 +1,25 @@
+/* PSPPIRE - a graphical user interface for PSPP.
+   Copyright (C) 2007, 2010  Free Software Foundation
+
+   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 3 of the License, 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, see <http://www.gnu.org/licenses/>. */
+
+#ifndef HELP_MENU_H
+#define HELP_MENU_H
+
+#include <gtk/gtk.h>
+
+
+void merge_help_menu (GtkUIManager *uim);
+
+#endif
index 3be3981388e46c4a3a17c32b81061cd64ac180d4..e25342ed0dc2a472a54db9c256bc3fa48642fed6 100644 (file)
@@ -230,25 +230,6 @@ connect_help (GtkBuilder *xml)
 }
 
 
-void
-reference_manual (GtkMenuItem *menu, gpointer data)
-{
-  GError *err = NULL;
-  gchar *cmd = g_strdup_printf ("yelp file://%s", relocate (DOCDIR "/pspp.xml"));
-
-  if ( ! g_spawn_command_line_async (cmd, &err) )
-    {
-      msg (ME, _("Cannot open reference manual: %s.  The PSPP user manual is "
-                 "also available at "
-                 "http://www.gnu.org/software/pspp/documentation.html"),
-           err->message);
-    }
-
-  g_free (cmd);
-  g_clear_error (&err);
-}
-
-
 /* Create a deep copy of SRC */
 GtkListStore *
 clone_list_store (const GtkListStore *src)
index 671bb8edf633649aa63e07843f1103da8369d995..ec142c8ef7f777f21810481beaef2a635e8b60c6 100644 (file)
@@ -54,8 +54,6 @@ gchar * convert_glib_filename_to_system_filename (const gchar *fname,
 
 void connect_help (GtkBuilder *);
 
-void reference_manual (GtkMenuItem *, gpointer);
-
 #define builder_new(NAME) builder_new_real (relocate (PKGDATADIR "/" NAME))
 
 GtkBuilder *builder_new_real (const gchar *name);
index dfc2663f7893e0a06b89a22d77b8cd0cd6b98bb2..76770e9fbdc8ac41c5c6632447170fa3a677937a 100644 (file)
@@ -11,7 +11,7 @@
         <property name="visible">True</property>
         <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
         <child>
-          <widget class="GtkMenuBar" id="menubar1">
+          <widget class="GtkMenuBar" id="menubar">
             <property name="visible">True</property>
             <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
             <child>
                 </child>
               </widget>
             </child>
-            <child>
-              <widget class="GtkMenuItem" id="menuitem9">
-                <property name="visible">True</property>
-                <property name="label" translatable="yes">_Help</property>
-                <property name="use_underline">True</property>
-                <child>
-                  <widget class="GtkMenu" id="menuitem9_menu">
-                    <child>
-                      <widget class="GtkMenuItem" id="help_reference">
-                        <property name="visible">True</property>
-                        <property name="label" translatable="yes">_Reference Manual</property>
-                        <property name="use_underline">True</property>
-                      </widget>
-                    </child>
-                    <child>
-                      <widget class="GtkMenuItem" id="help_about">
-                        <property name="visible">True</property>
-                        <property name="label" translatable="yes">_About</property>
-                        <property name="use_underline">True</property>
-                      </widget>
-                    </child>
-                  </widget>
-                </child>
-              </widget>
-            </child>
           </widget>
           <packing>
             <property name="expand">False</property>
index c655ece6a8bc3989ad991a36046882f1ca1ab530..2968892d80d54abd0d0d00e2bf1de70fd973a14c 100644 (file)
@@ -24,7 +24,7 @@
 #include "data/procedure.h"
 #include "language/syntax-string-source.h"
 #include "libpspp/message.h"
-#include "ui/gui/about.h"
+#include "ui/gui/help-menu.h"
 #include "ui/gui/comments-dialog.h"
 #include "ui/gui/compute-dialog.h"
 #include "ui/gui/correlation-dialog.h"
@@ -1443,27 +1443,12 @@ psppire_data_window_init (PsppireDataWindow *de)
 
   }
 
-  g_signal_connect (get_action_assert (de->builder,"file_new_syntax"),
-                   "activate",
-                   G_CALLBACK (create_syntax_window),
-                   NULL);
-
-
-  {
-    GtkAction *abt = get_action_assert (de->builder, "help_about");
-
-    g_signal_connect (abt,
+    g_signal_connect (get_action_assert (de->builder,"file_new_syntax"),
                      "activate",
-                     G_CALLBACK (about_new),
-                     de);
-  }
+                     G_CALLBACK (create_syntax_window),
+                     NULL);
 
 
-  g_signal_connect (get_action_assert (de->builder,"help_reference"),
-                   "activate",
-                   G_CALLBACK (reference_manual),
-                   de);
-
 
   g_signal_connect (de->data_editor,
                    "cases-selected",
@@ -1540,6 +1525,8 @@ psppire_data_window_init (PsppireDataWindow *de)
   {
     GtkUIManager *uim = GTK_UI_MANAGER (get_object_assert (de->builder, "uimanager1", GTK_TYPE_UI_MANAGER));
 
+    merge_help_menu (uim);
+    
     PSPPIRE_WINDOW (de)->menu =
       GTK_MENU_SHELL (gtk_ui_manager_get_widget (uim,"/ui/menubar/windows/windows_minimise_all")->parent);
   }
index 3003fba8373e5e36674399b9b6b5e5d2629a95ee..f78b8855bb9d72d129258d96b45121915b93db64 100644 (file)
@@ -32,7 +32,7 @@
 #include <output/tab.h>
 #include <stdlib.h>
 
-#include "about.h"
+#include "help-menu.h"
 
 #include "psppire-output-window.h"
 
@@ -553,16 +553,6 @@ psppire_output_window_init (PsppireOutputWindow *window)
                    G_CALLBACK (cancel_urgency),
                    NULL);
 
-  g_signal_connect (get_action_assert (xml,"help_about"),
-                   "activate",
-                   G_CALLBACK (about_new),
-                   window);
-
-  g_signal_connect (get_action_assert (xml,"help_reference"),
-                   "activate",
-                   G_CALLBACK (reference_manual),
-                   NULL);
-
   g_signal_connect (get_action_assert (xml,"windows_minimise-all"),
                    "activate",
                    G_CALLBACK (psppire_window_minimise_all),
@@ -570,9 +560,10 @@ psppire_output_window_init (PsppireOutputWindow *window)
 
   {
     GtkUIManager *uim = GTK_UI_MANAGER (get_object_assert (xml, "uimanager1", GTK_TYPE_UI_MANAGER));
+    merge_help_menu (uim);
 
     PSPPIRE_WINDOW (window)->menu =
-      GTK_MENU_SHELL (gtk_ui_manager_get_widget (uim,"/ui/menubar1/windows_menuitem/windows_minimise-all")->parent);
+      GTK_MENU_SHELL (gtk_ui_manager_get_widget (uim,"/ui/menubar/windows_menuitem/windows_minimise-all")->parent);
   }
 
   g_signal_connect_swapped (get_action_assert (xml, "file_export"), "activate",
index f9fe53ccc60268712d584ce981c1128baa7e4558..3541a165705b20dbed1b68cf366db4e17d1c0c51 100644 (file)
@@ -30,7 +30,7 @@
 #include "psppire-data-window.h"
 #include "psppire-window-register.h"
 #include "psppire.h"
-#include "about.h"
+#include "help-menu.h"
 #include "psppire-syntax-window.h"
 #include "syntax-editor-source.h"
 #include <language/lexer/lexer.h>
@@ -392,7 +392,7 @@ psppire_syntax_window_init (PsppireSyntaxWindow *window)
   GtkBuilder *xml = builder_new ("syntax-editor.ui");
   GtkWidget *box = gtk_vbox_new (FALSE, 0);
 
-  GtkWidget *menubar = get_widget_assert (xml, "menubar2");
+  GtkWidget *menubar = get_widget_assert (xml, "menubar");
   GtkWidget *sw = get_widget_assert (xml, "scrolledwindow8");
 
 
@@ -437,21 +437,6 @@ psppire_syntax_window_init (PsppireSyntaxWindow *window)
                    window);
 #endif
 
-  {
-    GtkAction *abt = get_action_assert (xml, "help_about");
-    g_object_set (abt, "stock-id", "gtk-about", NULL);
-
-    g_signal_connect (abt,
-                     "activate",
-                     G_CALLBACK (about_new),
-                     window);
-  }
-
-  g_signal_connect (get_action_assert (xml,"help_reference"),
-                   "activate",
-                   G_CALLBACK (reference_manual),
-                   NULL);
-
   g_signal_connect_swapped (get_action_assert (xml, "file_save"),
                    "activate",
                    G_CALLBACK (syntax_save),
@@ -496,8 +481,10 @@ psppire_syntax_window_init (PsppireSyntaxWindow *window)
   {
   GtkUIManager *uim = GTK_UI_MANAGER (get_object_assert (xml, "uimanager1", GTK_TYPE_UI_MANAGER));
 
+  merge_help_menu (uim);
+
   PSPPIRE_WINDOW (window)->menu =
-    GTK_MENU_SHELL (gtk_ui_manager_get_widget (uim,"/ui/menubar2/windows/windows_minimise_all")->parent);
+    GTK_MENU_SHELL (gtk_ui_manager_get_widget (uim,"/ui/menubar/windows/windows_minimise_all")->parent);
   }
 
   g_object_unref (xml);
index 8f565e12e987e14e3a278ab9aede0447d102f70c..ae43ea5b789c9ef104d93371f56d38de5ec0a944 100644 (file)
@@ -3,7 +3,7 @@
 
 <glade-interface>
 
-       <widget class="GtkMenuBar" id="menubar2">
+       <widget class="GtkMenuBar" id="menubar">
          <property name="visible">True</property>
          <property name="pack_direction">GTK_PACK_DIRECTION_LTR</property>
          <property name="child_pack_direction">GTK_PACK_DIRECTION_LTR</property>
              </child>
            </widget>
          </child>
-         <child>
-           <widget class="GtkMenuItem" id="menuitem9">
-             <property name="visible">True</property>
-             <property name="label" translatable="yes">_Help</property>
-             <property name="use_underline">True</property>
-
-             <child>
-               <widget class="GtkMenu" id="menuitem9_menu">
-                 <child>
-                   <widget class="GtkMenuItem" id="help_reference">
-                     <property name="visible">True</property>
-                     <property name="label" translatable="yes">_Reference Manual</property>
-                     <property name="use_underline">True</property>
-                   </widget>
-                 </child>
-                 <child>
-                   <widget class="GtkMenuItem" id="help_about">
-                     <property name="visible">True</property>
-                     <property name="label" translatable="yes">_About</property>
-                     <property name="use_underline">True</property>
-                   </widget>
-                 </child>
-               </widget>
-             </child>
-           </widget>
-         </child>
        </widget>