gui: Fix Glib-GObject-WARNING when closing the active dataset.
authorBen Pfaff <blp@cs.stanford.edu>
Mon, 9 Jul 2012 05:12:49 +0000 (22:12 -0700)
committerBen Pfaff <blp@cs.stanford.edu>
Mon, 9 Jul 2012 05:12:49 +0000 (22:12 -0700)
The DATASET CLOSE command, when it acts on the active dataset, just
removes the active dataset's name, changing it to the empty string.
(This is the documented behavior.)  However, the GUI relies on
every dataset having a name, so this caused the following warning:

GLib-GObject-WARNING **: value """" of type `gchararray' is invalid
or out of range for property `id' of type `gchararray'

This commit fixes the problem by giving any unnamed dataset a name
after running syntax.

src/data/session.c
src/data/session.h
src/ui/gui/executor.c
src/ui/gui/psppire-data-window.c

index 24c22b24ed3001285b84cb9427f76fbb93eb4e48..a308ec1f624befa7c8e302c656944274bd82cc0d 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 2010, 2011 Free Software Foundation, Inc.
+   Copyright (C) 2010, 2011, 2012 Free Software Foundation, Inc.
 
    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
@@ -35,6 +35,7 @@ struct session
     struct hmapx datasets;
     struct dataset *active;
     char *syntax_encoding;      /* Default encoding for syntax files. */
+    unsigned int n_dataset_names; /* For session_generate_dataset_name(). */
   };
 
 static struct hmapx_node *session_lookup_dataset__ (const struct session *,
@@ -49,6 +50,7 @@ session_create (void)
   hmapx_init (&s->datasets);
   s->active = NULL;
   s->syntax_encoding = xstrdup ("Auto");
+  s->n_dataset_names = 0;
   return s;
 }
 
@@ -164,6 +166,25 @@ session_get_dataset_by_seqno (const struct session *s, unsigned int seqno)
       return ds;
   return NULL;
 }
+
+/* Returns an identifier that is is not currently in use as a dataset name.
+   The caller must free the returned identifier, with free(). */
+char *
+session_generate_dataset_name (struct session *s)
+{
+  for (;;)
+    {
+      char *name;
+
+      s->n_dataset_names++;
+      assert(s->n_dataset_names != 0);
+
+      name = xasprintf ("DataSet%u", s->n_dataset_names);
+      if (!session_lookup_dataset (s, name))
+        return name;
+      free (name);
+    }
+}
 \f
 static struct hmapx_node *
 session_lookup_dataset__ (const struct session *s_, const char *name)
index f45cceb0b19bb08fb45a7e9e119f929cedd5752d..b61c3946772ca8af99653f289d0bd05f4a72aa42 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 2010, 2011 Free Software Foundation, Inc.
+   Copyright (C) 2010, 2011, 2012 Free Software Foundation, Inc.
 
    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
@@ -44,4 +44,6 @@ void session_for_each_dataset (const struct session *,
 struct dataset *session_get_dataset_by_seqno (const struct session *,
                                               unsigned int seqno);
 
+char *session_generate_dataset_name (struct session *);
+
 #endif /* session.h */
index 8fb4c2603e37662c0753041b1221a131a0ee52cf..ee83c2c7d8daed3154d7d4680f5a2cb0f44c58df 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPPIRE - a graphical user interface for PSPP.
-   Copyright (C) 2007, 2009, 2010, 2011  Free Software Foundation
+   Copyright (C) 2007, 2009, 2010, 2011, 2012  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
@@ -36,6 +36,20 @@ create_casereader_from_data_store (void *data_store_)
   return psppire_data_store_get_reader (data_store);
 }
 
+/* Ensures that dataset DS has a name, because some parts of the GUI insist
+   upon this. */
+static void
+name_dataset_cb (struct dataset *ds, void *aux UNUSED)
+{
+  if (dataset_name (ds)[0] == '\0')
+    {
+      struct session *session = dataset_session (ds);
+      char *dataset_name = session_generate_dataset_name (session);
+      dataset_set_name (ds, dataset_name);
+      free (dataset_name);
+    }
+}
+
 static void
 new_pdw_cb (struct dataset *ds, void *aux UNUSED)
 {
@@ -131,6 +145,8 @@ execute_syntax (PsppireDataWindow *window, struct lex_reader *lex_reader)
        break;
     }
 
+  session_for_each_dataset (the_session, name_dataset_cb, NULL);
+
   ll_for_each_safe (pdw, next_pdw, PsppireDataWindow, ll, &all_data_windows)
     {
       struct dataset *ds;
index 6dc422e3404773b993ad2c1ed78b14fae19a1c85..c22f7bb293acb05ec957931a8f2a693db728b86e 100644 (file)
@@ -1288,10 +1288,7 @@ psppire_data_window_new (struct dataset *ds)
 
   if (ds == NULL)
     {
-      static int n_datasets;
-      char *dataset_name;
-
-      dataset_name = xasprintf ("DataSet%d", ++n_datasets);
+      char *dataset_name = session_generate_dataset_name (the_session);
       ds = dataset_create (the_session, dataset_name);
       free (dataset_name);
     }