Added a basic output viewer.
[pspp-builds.git] / src / ui / gui / data-editor.c
index 2c84901feeb33c4fa610d69444d91f3ad4066675..50c181ee6da726fb37fc14a0858e85a7340398f4 100644 (file)
 
 #include "helper.h"
 #include "about.h"
+#include <data/procedure.h>
 #include "psppire-dialog.h"
 #include "psppire-selector.h"
 #include "weight-cases-dialog.h"
 #include "split-file-dialog.h"
 #include "transpose-dialog.h"
 #include "sort-cases-dialog.h"
+#include "select-cases-dialog.h"
 #include "compute-dialog.h"
 #include "goto-case-dialog.h"
 #include "comments-dialog.h"
 #include "variable-info-dialog.h"
 #include "dict-display.h"
+#include "clipboard.h"
 
 #define _(msgid) gettext (msgid)
 #define N_(msgid) msgid
@@ -50,6 +53,7 @@
 #include "psppire-data-store.h"
 #include "psppire-var-store.h"
 
+static void on_edit_copy (GtkMenuItem *, gpointer);
 
 static void create_data_sheet_variable_popup_menu (struct data_editor *);
 static void create_data_sheet_cases_popup_menu (struct data_editor *);
@@ -119,6 +123,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 *);
 
 
@@ -184,6 +219,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.
 */
@@ -203,6 +240,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"));
 
@@ -235,12 +277,18 @@ new_data_editor (void)
   connect_help (de->xml);
 
 
+
+  g_signal_connect (get_widget_assert (de->xml, "edit_copy"),
+                   "activate",
+                   G_CALLBACK (on_edit_copy), de);
+
+
   register_data_editor_actions (de);
 
   de->toggle_value_labels =
     gtk_toggle_action_new ("toggle-value-labels",
                           _("Labels"),
-                          _("Show (hide) value labels"),
+                          _("Show/hide value labels"),
                           "pspp-value-labels");
 
   g_signal_connect (de->toggle_value_labels, "activate",
@@ -388,6 +436,15 @@ new_data_editor (void)
   g_signal_connect (de->invoke_sort_cases_dialog, "activate",
                    G_CALLBACK (sort_cases_dialog), de);
 
+  de->invoke_select_cases_dialog =
+    gtk_action_new ("select-cases-dialog",
+                   _("Select Cases"),
+                   _("Select cases from the active file"),
+                   "pspp-select-cases");
+
+  g_signal_connect (de->invoke_select_cases_dialog, "activate",
+                   G_CALLBACK (select_cases_dialog), de);
+
 
   de->invoke_compute_dialog =
     gtk_action_new ("compute-dialog",
@@ -508,6 +565,10 @@ new_data_editor (void)
                            get_widget_assert (de->xml, "data_sort-cases")
                            );
 
+  gtk_action_connect_proxy (de->invoke_select_cases_dialog,
+                           get_widget_assert (de->xml, "data_select-cases")
+                           );
+
   gtk_action_connect_proxy (de->invoke_compute_dialog,
                            get_widget_assert (de->xml, "transform_compute")
                            );
@@ -610,10 +671,19 @@ new_data_editor (void)
                            get_widget_assert (de->xml, "button-split-file")
                            );
 
+  gtk_action_connect_proxy (de->invoke_select_cases_dialog,
+                           get_widget_assert (de->xml, "button-select-cases")
+                           );
+
+
   g_signal_connect (get_widget_assert (de->xml, "file_quit"),
                    "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",
@@ -629,6 +699,10 @@ new_data_editor (void)
   g_signal_connect (G_OBJECT (data_sheet), "button-event-row",
                    G_CALLBACK (popup_cases_menu), de);
 
+     /* 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;
@@ -705,21 +779,24 @@ data_var_select (GtkNotebook *notebook,
 
   GtkWidget *view_data = get_widget_assert (de->xml, "view_data");
   GtkWidget *view_variables = get_widget_assert (de->xml, "view_variables");
+  GtkWidget *edit_copy = get_widget_assert (de->xml, "edit_copy");
 
   switch (page_num)
     {
     case PAGE_VAR_SHEET:
       gtk_widget_hide (view_variables);
       gtk_widget_show (view_data);
+      gtk_widget_set_sensitive (edit_copy, FALSE);
       gtk_action_set_sensitive (de->insert_variable, TRUE);
       gtk_action_set_sensitive (de->insert_case, FALSE);
       gtk_action_set_sensitive (de->invoke_goto_dialog, FALSE);
       break;
     case PAGE_DATA_SHEET:
       gtk_widget_show (view_variables);
-      gtk_widget_hide (view_data);
+      gtk_widget_show (view_data);
       gtk_action_set_sensitive (de->invoke_goto_dialog, TRUE);
       gtk_action_set_sensitive (de->insert_case, TRUE);
+      gtk_widget_set_sensitive (edit_copy, TRUE);
       break;
     default:
       g_assert_not_reached ();
@@ -1647,3 +1724,18 @@ popup_cases_menu (GtkSheet *sheet, gint row,
                      event->button, event->time);
     }
 }
+
+
+
+static void
+on_edit_copy (GtkMenuItem *m, gpointer data)
+{
+  struct data_editor *de = data;
+
+  GtkSheet *data_sheet = GTK_SHEET (get_widget_assert (de->xml,
+                                                      "data_sheet"));
+
+  data_sheet_set_clip (data_sheet);
+}
+
+