#include <gtk/gtk.h>
-#include <libpspp/copyleft.h>
-#include <libpspp/version.h>
-#include "help-menu.h"
-#include <libpspp/message.h>
+#include "libpspp/cast.h"
+#include "libpspp/copyleft.h"
+#include "libpspp/message.h"
+#include "libpspp/version.h"
+#include "ui/gui/help-menu.h"
#include "gl/configmake.h"
#include "gl/relocatable.h"
#define _(msgid) gettext (msgid)
#define N_(msgid) msgid
+/* Try to open html documentation uri via the default
+ browser on the operating system */
#ifdef __APPLE__
#define HTMLOPENAPP "open"
#elif _WIN32
-#define HTMLOPENAPP "start"
+#define HTMLOPENAPP "wscript"
#else
#define HTMLOPENAPP "xdg-open"
#endif
gtk_about_dialog_set_copyright (GTK_ABOUT_DIALOG (about),
"Free Software Foundation");
- gtk_about_dialog_set_translator_credits
+ gtk_about_dialog_set_translator_credits
(
GTK_ABOUT_DIALOG (about),
/* TRANSLATORS: Do not translate this string. Instead, put the names of the people
who have helped in the translation. */
_("translator-credits")
- );
+);
gtk_window_set_transient_for (GTK_WINDOW (about), parent);
gtk_widget_hide (about);
}
-/* Open the manual at PAGE */
+
+/* Opening the htmluri in windows via cmd /start uri opens
+ the windows command shell for a moment. The alternative is
+ to start a script via wscript. This will not be visible*/
+#ifdef _WIN32
+static gboolean open_windows_help (const gchar *helpuri,
+ GError **err)
+{
+ gchar *vbsfilename = NULL;
+ gchar *vbs = NULL;
+ gboolean result;
+ vbsfilename = g_build_filename (g_get_tmp_dir (),
+ "pspp-help-open.vbs",
+ NULL);
+ vbs = g_strdup_printf("CreateObject(\"WScript.Shell\").Run \"%s\"",
+ helpuri);
+ result = g_file_set_contents (vbsfilename,
+ vbs,
+ strlen(vbs),
+ err);
+ g_free (vbs);
+ if (!result)
+ goto error;
+
+ gchar *argv[] = {CONST_CAST (gchar *, "wscript"), vbsfilename, 0};
+
+ result = g_spawn_async (NULL, argv,
+ NULL, G_SPAWN_SEARCH_PATH,
+ NULL, NULL, NULL, err);
+ error:
+ g_free (vbsfilename);
+ return result;
+}
+#endif
+
+/* Open the manual at PAGE with the following priorities
+ First: local yelp help system
+ Second: browser with local html doc dir in path pspp.html/<helppage>.html
+ Third: browers with Internet html help at gnu.org */
void
online_help (const char *page)
{
- GError *err = NULL;
GError *htmlerr = NULL;
- gchar *argv[3] = { "yelp", 0, 0};
- gchar *htmlargv[3] = { HTMLOPENAPP, 0, 0};
gchar *htmlfilename = NULL;
gchar *htmlfullname = NULL;
+ gchar *htmluri = NULL;
if (page == NULL)
{
- argv[1] = g_strdup_printf ("file://%s", relocate (DOCDIR "/pspp.xml"));
htmlfilename = g_strdup ("index.html");
- htmlargv[1] = g_strdup_printf ("file://%s", htmlfilename);
}
else
{
gchar **tokens = NULL;
const int maxtokens = 5;
- int idx = 0;
- argv[1] = g_strdup_printf ("file://%s#%s",
- relocate (DOCDIR "/pspp.xml"), page);
+ int idx ;
+ /* The page will be translated to the htmlfilename
+ page htmlfilename
+ GRAPH#SCATTERPLOT SCATTERPLOT.html
+ QUICK-CLUSTER QUICK-CLUSTER.html
+ which is valid for the multiple page html doc*/
tokens = g_strsplit (page, "#", maxtokens);
- for(;tokens[idx] && idx < maxtokens;idx++);
+ for (idx = 0; idx < maxtokens && tokens[idx]; idx++)
+ ;
htmlfilename = g_strdup_printf ("%s.html", tokens[idx-1]);
g_strfreev (tokens);
}
-
+ /* Hint: pspp.html is a directory...*/
htmlfullname = g_strdup_printf ("%s/%s", relocate (DOCDIR "/pspp.html"),
htmlfilename);
- if (g_file_test (relocate (DOCDIR "/pspp.html"), G_FILE_TEST_EXISTS))
- htmlargv[1] = g_strdup_printf ("file://%s", htmlfullname);
+ if (g_file_test (relocate (DOCDIR "/pspp.html"), G_FILE_TEST_IS_DIR))
+ {
+ GError *urierr = NULL;
+ htmluri = g_filename_to_uri (htmlfullname,NULL, &urierr);
+ if (!htmluri)
+ {
+ msg (ME, _("Help path conversion error: %s"), urierr->message);
+ htmluri = htmlfullname;
+ }
+ g_clear_error (&urierr);
+ }
else
- htmlargv[1] = g_strdup_printf (PACKAGE_URL "manual/html_node/%s",
- htmlfilename);
-
+ htmluri = g_strdup_printf (PACKAGE_URL "manual/html_node/%s",
+ htmlfilename);
g_free (htmlfullname);
g_free (htmlfilename);
- if (! (g_spawn_async (NULL, argv,
- NULL, G_SPAWN_SEARCH_PATH,
- NULL, NULL, NULL, &err) ||
- g_spawn_async (NULL, htmlargv,
- NULL, G_SPAWN_SEARCH_PATH,
- NULL, NULL, NULL, &htmlerr))
- )
+ /* The following **SHOULD** work but it does not on 28.5.2016
+ g_app_info_launch_default_for_uri (htmluri, NULL, &err);
+ osx: wine is started to launch the uri...
+ windows: not so bad, but the first access does not work*/
+
+#ifdef _WIN32
+ bool ok = open_windows_help (htmluri, &htmlerr);
+#else
+ gchar *htmlargv[3] = {CONST_CAST (char *, HTMLOPENAPP), htmluri, 0};
+ bool ok = g_spawn_async (NULL, htmlargv,
+ NULL, G_SPAWN_SEARCH_PATH,
+ NULL, NULL, NULL, &htmlerr);
+#endif
+ if (!ok)
{
- msg (ME, _("Cannot open reference manual via yelp: %s. "
- "Cannot open via html: %s "
+ msg (ME, _("Cannot open via html: %s "
+ "with uri: %s "
"The PSSP manual is also available at %s"),
- err->message,
htmlerr->message,
+ htmluri,
PACKAGE_URL "documentation.html");
}
- g_free (argv[1]);
- g_free (htmlargv[1]);
- g_clear_error (&err);
+ g_free (htmluri);
g_clear_error (&htmlerr);
}
GtkWidget *help_ref = gtk_menu_item_new_with_mnemonic (_("_Reference Manual"));
GtkAccelGroup *accel_group = gtk_accel_group_new ();
-
+
gtk_window_add_accel_group (toplevel, accel_group);
gtk_widget_add_accelerator (help_ref,
g_signal_connect (help_about, "activate", G_CALLBACK (about_new), toplevel);
g_signal_connect (help_ref, "activate", G_CALLBACK (reference_manual), NULL);
-
+
g_object_set (menuitem, "submenu", menu, NULL);
gtk_widget_show_all (menuitem);
-
+
+ g_object_unref (accel_group);
+
return menuitem;
}