Patch #6086. Adds "transformation pending" state.
[pspp-builds.git] / src / ui / gui / data-editor.c
index 28f15e01c4dddbec2244d4a37e8221098cf5585a..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"
@@ -71,17 +72,14 @@ static void insert_case (GtkAction *a, gpointer data);
 static void delete_cases (GtkAction *a, gpointer data);
 static void delete_variables (GtkAction *a, gpointer data);
 
+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);
@@ -102,10 +100,6 @@ static void variable_sheet_activate (GtkCheckMenuItem *, gpointer );
 
 static void fonts_activate (GtkMenuItem *, gpointer);
 
-static void value_labels_activate (GtkCheckMenuItem *, gpointer);
-static void value_labels_toggled (GtkToggleToolButton *, gpointer);
-
-
 static void file_quit (GtkCheckMenuItem *, gpointer );
 
 static void
@@ -126,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 *);
 
 
@@ -191,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.
 */
@@ -210,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"));
 
@@ -244,6 +276,24 @@ new_data_editor (void)
 
   register_data_editor_actions (de);
 
+  de->toggle_value_labels =
+    gtk_toggle_action_new ("toggle-value-labels",
+                          _("Labels"),
+                          _("Show (hide) value labels"),
+                          "pspp-value-labels");
+
+  g_signal_connect (de->toggle_value_labels, "activate",
+                   G_CALLBACK (toggle_value_labels), de);
+
+
+  gtk_action_connect_proxy (GTK_ACTION (de->toggle_value_labels),
+                           get_widget_assert (de->xml,
+                                              "togglebutton-value-labels"));
+
+
+  gtk_action_connect_proxy (GTK_ACTION (de->toggle_value_labels),
+                           get_widget_assert (de->xml,
+                                              "view_value-labels"));
 
   de->delete_cases =
     gtk_action_new ("clear-cases",
@@ -551,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);
@@ -579,14 +628,6 @@ new_data_editor (void)
 
 
 
-  g_signal_connect (get_widget_assert (de->xml, "view_valuelabels"),
-                   "activate",
-                   G_CALLBACK (value_labels_activate), de);
-
-
-  g_signal_connect (get_widget_assert (de->xml, "togglebutton-value-labels"),
-                   "toggled",
-                   G_CALLBACK (value_labels_toggled), de);
 
   gtk_action_connect_proxy (de->action_data_open,
                            get_widget_assert (de->xml, "button-open")
@@ -612,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",
@@ -627,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;
 }
@@ -695,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");
 
@@ -722,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)
 {
@@ -746,6 +785,7 @@ data_editor_select_sheet (struct data_editor *de, gint page)
 }
 
 
+
 static void
 status_bar_activate (GtkCheckMenuItem *menuitem, gpointer data)
 {
@@ -828,50 +868,20 @@ fonts_activate (GtkMenuItem *menuitem, gpointer data)
 }
 
 
-/* The next two callbacks are mutually co-operative */
 
-/* Callback for the value labels menu item */
+/* Callback for the value labels action */
 static void
-value_labels_activate (GtkCheckMenuItem *menuitem, gpointer data)
+toggle_value_labels (GtkToggleAction *ta, gpointer data)
 {
   struct data_editor *de = data;
 
   GtkSheet *data_sheet = GTK_SHEET (get_widget_assert (de->xml, "data_sheet"));
 
-  GtkToggleToolButton *tb =
-    GTK_TOGGLE_TOOL_BUTTON (get_widget_assert (de->xml,
-                                              "togglebutton-value-labels"));
-
   PsppireDataStore *ds = PSPPIRE_DATA_STORE (gtk_sheet_get_model (data_sheet));
 
-  gboolean show_value_labels = gtk_check_menu_item_get_active (menuitem);
-
-  gtk_toggle_tool_button_set_active (tb, show_value_labels);
-
-  psppire_data_store_show_labels (ds, show_value_labels);
-}
-
-
-/* Callback for the value labels tooglebutton */
-static void
-value_labels_toggled (GtkToggleToolButton *toggle_tool_button,
-                     gpointer data)
-{
-  struct data_editor *de = data;
-
-  GtkSheet *data_sheet = GTK_SHEET (get_widget_assert (de->xml, "data_sheet"));
-
-  GtkCheckMenuItem *item =
-    GTK_CHECK_MENU_ITEM (get_widget_assert (de->xml, "view_valuelabels"));
-
-  PsppireDataStore *ds = PSPPIRE_DATA_STORE (gtk_sheet_get_model (data_sheet));
-
-  gboolean show_value_labels =
-    gtk_toggle_tool_button_get_active (toggle_tool_button);
-
-  gtk_check_menu_item_set_active (item, show_value_labels);
 
-  psppire_data_store_show_labels (ds, show_value_labels);
+  psppire_data_store_show_labels (ds,
+                                 gtk_toggle_action_get_active (ta));
 }