File Open: Don't try to analyse the file if it's a directory.
authorJohn Darrington <john@darrington.wattle.id.au>
Thu, 10 Nov 2011 20:13:32 +0000 (21:13 +0100)
committerJohn Darrington <john@darrington.wattle.id.au>
Thu, 10 Nov 2011 20:13:32 +0000 (21:13 +0100)
The File Open dialog box looks at the contents of the selected file
in order to decide whether to set the sensitivity of the encoding
selector.  But if the file was a directory this caused error messages
on windoze. Closes bug #34773

src/data/file-name.c
src/ui/gui/psppire-window.c

index 5e4080b11f22ffa463f4bc0264b68de2736abd25..9eeb4b1cfc06309e45c0777ef1277aa0fbeb4894 100644 (file)
@@ -128,12 +128,16 @@ fn_is_special (const char *file_name)
   return false;
 }
 
-/* Returns true if file with name NAME exists. */
+/* Returns true if file with name NAME exists, and that file is not a
+   directory */
 bool
 fn_exists (const char *name)
 {
   struct stat temp;
-  return stat (name, &temp) == 0;
+  if ( stat (name, &temp) != 0 )
+    return false;
+
+  return ! S_ISDIR (temp.st_mode);
 }
 \f
 /* Environment variables. */
index 598de8930246591389a5dbdae3da7cd49e76d3e0..4eb274b5284805b3cfc8742499d11c1409cd7a26 100644 (file)
@@ -28,6 +28,7 @@
 #define N_(msgid) msgid
 
 #include "data/any-reader.h"
+#include "data/file-name.h"
 #include "data/dataset.h"
 
 #include "helper.h"
@@ -719,6 +720,12 @@ on_selection_changed (GtkFileChooser *chooser, GtkWidget *encoding_selector)
 
   sysname = convert_glib_filename_to_system_filename (name, NULL);
 
+  if ( ! fn_exists (sysname))
+    {
+      gtk_widget_set_sensitive (encoding_selector, FALSE);
+      return;
+    }
+
   gtk_widget_set_sensitive (encoding_selector, ! any_reader_may_open (sysname));
 }
 
@@ -788,9 +795,13 @@ psppire_window_file_chooser_dialog (PsppireWindow *toplevel)
 
   {
     GtkWidget *encoding_selector =  psppire_encoding_selector_new ("Auto", true);
-    gtk_file_chooser_set_extra_widget (GTK_FILE_CHOOSER (dialog), encoding_selector);
 
-    g_signal_connect (dialog, "selection-changed", G_CALLBACK (on_selection_changed), encoding_selector);
+    gtk_widget_set_sensitive (encoding_selector, FALSE);
+
+    g_signal_connect (dialog, "selection-changed", G_CALLBACK (on_selection_changed),
+                     encoding_selector);
+
+    gtk_file_chooser_set_extra_widget (GTK_FILE_CHOOSER (dialog), encoding_selector);
   }
 
   return dialog;