Patch #6086. Adds "transformation pending" state.
[pspp-builds.git] / src / ui / gui / data-editor.c
index 16c85d9d92b1833a2460daf931876389a7bfd56a..9681a09f1be8813e1e14d7696839afd8f39cf743 100644 (file)
@@ -26,6 +26,7 @@
 
 #include "helper.h"
 #include "about.h"
+#include <data/procedure.h>
 #include "psppire-dialog.h"
 #include "psppire-selector.h"
 #include "weight-cases-dialog.h"
@@ -76,13 +77,9 @@ static void toggle_value_labels (GtkToggleAction *a, gpointer data);
 /* Switch between the VAR SHEET and the DATA SHEET */
 
 static gboolean click2column (GtkWidget *w, gint col, gpointer data);
-
 static gboolean click2row (GtkWidget *w, gint row, gpointer data);
 
 
-static void select_sheet (struct data_editor *de, guint page_num);
-
-
 /* Callback for when the dictionary changes properties*/
 static void on_weight_change (GObject *, gint, gpointer);
 static void on_filter_change (GObject *, gint, gpointer);
@@ -123,6 +120,37 @@ enable_delete_variables (GtkWidget *w, gint var, gpointer data)
 }
 
 
+
+/* Run the EXECUTE command. */
+static void
+execute (GtkMenuItem *mi, gpointer data)
+{
+  struct getl_interface *sss = create_syntax_string_source ("EXECUTE.");
+
+  execute_syntax (sss);
+}
+
+static void
+transformation_change_callback (bool transformations_pending,
+                               gpointer data)
+{
+  struct data_editor *de = data;
+  GtkWidget *menuitem =
+    get_widget_assert (de->xml, "transform_run-pending");
+  GtkWidget *status_label  =
+    get_widget_assert (de->xml, "case-counter-area");
+
+  gtk_widget_set_sensitive (menuitem, transformations_pending);
+
+
+  if ( transformations_pending)
+    gtk_label_set_text (GTK_LABEL (status_label),
+                       _("Transformations Pending"));
+  else
+    gtk_label_set_text (GTK_LABEL (status_label), "");
+}
+
+
 static void open_data_file (const gchar *, struct data_editor *);
 
 
@@ -188,6 +216,8 @@ datum_entry_activate (GtkEntry *entry, gpointer data)
   psppire_data_store_set_string (store, text, row, column);
 }
 
+extern struct dataset *the_dataset;
+
 /*
   Create a new data editor.
 */
@@ -207,6 +237,11 @@ new_data_editor (void)
 
   de->xml = XML_NEW ("data-editor.glade");
 
+
+  dataset_add_transform_change_callback (the_dataset,
+                                        transformation_change_callback,
+                                        de);
+
   var_sheet = GTK_SHEET (get_widget_assert (de->xml, "variable_sheet"));
   data_sheet = GTK_SHEET (get_widget_assert (de->xml, "data_sheet"));
 
@@ -566,7 +601,6 @@ new_data_editor (void)
                    G_CALLBACK (data_var_select), de);
 
 
-
   g_signal_connect (get_widget_assert (de->xml, "view_statusbar"),
                    "activate",
                    G_CALLBACK (status_bar_activate), de);
@@ -619,6 +653,10 @@ new_data_editor (void)
                    "activate",
                    G_CALLBACK (file_quit), de);
 
+  g_signal_connect (get_widget_assert (de->xml, "transform_run-pending"),
+                   "activate",
+                   G_CALLBACK (execute), de);
+
 
   g_signal_connect (get_widget_assert (de->xml, "windows_minimise_all"),
                    "activate",
@@ -634,8 +672,11 @@ new_data_editor (void)
   g_signal_connect (G_OBJECT (data_sheet), "button-event-row",
                    G_CALLBACK (popup_cases_menu), de);
 
-
-  select_sheet (de, PAGE_DATA_SHEET);
+     /* The "switch-page" signal does get emitted unless the page actually 
+       changes.  But the state is indeterminate at startup.  Therefore we 
+       must explicitly change it to one state, then the other */
+  data_editor_select_sheet (de, PAGE_VAR_SHEET);
+  data_editor_select_sheet (de, PAGE_DATA_SHEET);
 
   return de;
 }
@@ -702,8 +743,13 @@ new_data_window (GtkMenuItem *menuitem, gpointer parent)
 
 
 static void
-select_sheet (struct data_editor *de, guint page_num)
+data_var_select (GtkNotebook *notebook,
+               GtkNotebookPage *page,
+               guint page_num,
+               gpointer user_data)
 {
+  struct data_editor *de = user_data;
+
   GtkWidget *view_data = get_widget_assert (de->xml, "view_data");
   GtkWidget *view_variables = get_widget_assert (de->xml, "view_variables");
 
@@ -729,20 +775,6 @@ select_sheet (struct data_editor *de, guint page_num)
 }
 
 
-static void
-data_var_select (GtkNotebook *notebook,
-               GtkNotebookPage *page,
-               guint page_num,
-               gpointer user_data)
-{
-  struct data_editor *de = user_data;
-
-  select_sheet (de, page_num);
-}
-
-
-
-
 void
 data_editor_select_sheet (struct data_editor *de, gint page)
 {
@@ -753,6 +785,7 @@ data_editor_select_sheet (struct data_editor *de, gint page)
 }
 
 
+
 static void
 status_bar_activate (GtkCheckMenuItem *menuitem, gpointer data)
 {
@@ -1661,5 +1694,3 @@ popup_cases_menu (GtkSheet *sheet, gint row,
                      event->button, event->time);
     }
 }
-
-