Merge remote branch 'origin/master' into import-gui
[pspp] / src / ui / gui / psppire.c
index a9b8848eff534897b2ee261af158b46da2d62c48..be095248a940cdbb6b37befc651f88ec19158b22 100644 (file)
@@ -22,6 +22,7 @@
 #include <libintl.h>
 #include <unistd.h>
 
+#include "data/any-reader.h"
 #include "data/casereader.h"
 #include "data/dataset.h"
 #include "data/datasheet.h"
@@ -48,6 +49,7 @@
 #include "ui/gui/psppire-dict.h"
 #include "ui/gui/psppire.h"
 #include "ui/gui/psppire-output-window.h"
+#include "ui/gui/psppire-syntax-window.h"
 #include "ui/gui/psppire-selector.h"
 #include "ui/gui/psppire-var-store.h"
 #include "ui/gui/psppire-var-view.h"
 #include "gl/xalloc.h"
 #include "gl/relocatable.h"
 
-GtkRecentManager *the_recent_mgr;
-
 static void inject_renamed_icons (void);
 static void create_icon_factory (void);
-static void load_data_file (PsppireDataWindow *, const char *);
+static gchar *local_to_filename_encoding (const char *fn);
+
 
 #define _(msgid) gettext (msgid)
 #define N_(msgid) msgid
@@ -95,17 +96,25 @@ initialize (const char *data_file)
   journal_enable ();
   textdomain (PACKAGE);
 
-
-  the_recent_mgr = gtk_recent_manager_get_default ();
-
   psppire_selector_set_default_selection_func (GTK_TYPE_ENTRY, insert_source_row_into_entry);
   psppire_selector_set_default_selection_func (PSPPIRE_VAR_VIEW_TYPE, insert_source_row_into_tree_view);
   psppire_selector_set_default_selection_func (GTK_TYPE_TREE_VIEW, insert_source_row_into_tree_view);
 
   data_window = psppire_default_data_window ();
-  if (data_file != NULL)
-    load_data_file (data_window, data_file);
-  execute_const_syntax_string (data_window, "");
+
+  if (data_file)
+    {
+      gchar *filename = local_to_filename_encoding (data_file);
+
+      /* Check to see if the file is a .sav or a .por file.  If not
+         assume that it is a syntax file */
+      if ( any_reader_may_open (filename))
+        psppire_window_load (PSPPIRE_WINDOW (data_window), filename);
+      else
+        open_syntax_window (filename, NULL);
+
+      g_free (filename);
+    }
 }
 
 
@@ -248,8 +257,13 @@ create_icon_factory (void)
   gtk_icon_factory_add_default (factory);
 }
 \f
-static void
-load_data_file (PsppireDataWindow *window, const char *arg)
+/* 
+   Convert a filename from the local encoding into "filename" encoding.
+   The return value will be allocated on the heap.  It is the responsibility
+   of the caller to free it.
+ */
+static gchar *
+local_to_filename_encoding (const char *fn)
 {
   gchar *filename = NULL;
   gchar *utf8 = NULL;
@@ -269,12 +283,12 @@ load_data_file (PsppireDataWindow *window, const char *arg)
 
   if ( local_is_utf8)
     {
-      utf8 = xstrdup (arg);
+      utf8 = xstrdup (fn);
     }
   else
     {
       GError *err = NULL;
-      utf8 = g_locale_to_utf8 (arg, -1, NULL, &written, &err);
+      utf8 = g_locale_to_utf8 (fn, -1, NULL, &written, &err);
       if ( NULL == utf8)
         {
           g_warning ("Cannot convert filename from local encoding `%s' to UTF-8: %s",
@@ -299,11 +313,9 @@ load_data_file (PsppireDataWindow *window, const char *arg)
   g_free (utf8);
 
   if ( filename == NULL)
-    filename = xstrdup (arg);
-
-  psppire_window_load (PSPPIRE_WINDOW (window), filename);
+    filename = xstrdup (fn);
 
-  g_free (filename);
+  return filename;
 }
 
 static void