Patch #5676 (syntax string source).
[pspp-builds.git] / src / ui / gui / data-editor.c
index 7e320bbdfd1603826225a7a972f576510b737384..262ae543ac59e8f98766aac8558ac37fe3734ea0 100644 (file)
@@ -1,6 +1,6 @@
 /*
     PSPPIRE --- A Graphical User Interface for PSPP
-    Copyright (C) 2006  Free Software Foundation
+    Copyright (C) 2006, 2007  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
 
 #include "helper.h"
 #include "about.h"
+#include "psppire-dialog.h"
+#include "psppire-var-select.h"
 
 #define _(msgid) gettext (msgid)
 #define N_(msgid) msgid
 
 #include "data-editor.h"
 #include "syntax-editor.h"
+#include <language/syntax-string-source.h>
 #include "window-manager.h"
 
 #include "psppire-data-store.h"
 #include "psppire-var-store.h"
 
+#include "weight-cases-dialog.h"
+
 
 static void insert_variable (GtkCheckMenuItem *m, gpointer data);
 
@@ -55,6 +60,11 @@ 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);
+static void on_split_change (PsppireDict *, gpointer);
+
 static void data_var_select (GtkNotebook *notebook,
                            GtkNotebookPage *page,
                            guint page_num,
@@ -100,37 +110,7 @@ disable_edit_clear (GtkWidget *w, gint x, gint y, gpointer data)
   return FALSE;
 }
 
-
-/* Callback for when the dictionary changes its weights */
-static void
-on_weight_change (GObject *o, gint weight_index, gpointer data)
-{
-  struct data_editor *de = data;
-  GtkWidget *weight_status_area =
-    get_widget_assert (de->xml, "weight-status-area");
-
-  if ( weight_index == -1 )
-    {
-      gtk_label_set_text (GTK_LABEL (weight_status_area), _("Weights off"));
-    }
-  else
-    {
-      GtkSheet *var_sheet =
-       GTK_SHEET (get_widget_assert (de->xml, "variable_sheet"));
-
-      PsppireVarStore *vs = PSPPIRE_VAR_STORE
-       (gtk_sheet_get_model (var_sheet) );
-
-      struct variable *var = psppire_dict_get_variable (vs->dict,
-                                                       weight_index);
-
-      gchar *text = g_strdup_printf (_("Weight by %s"), var_get_name (var));
-
-      gtk_label_set_text (GTK_LABEL (weight_status_area), text);
-
-      g_free (text);
-    }
-}
+static void weight_cases_dialog (GObject *o, gpointer data);
 
 
 /*
@@ -159,8 +139,26 @@ new_data_editor (void)
                    G_CALLBACK (on_weight_change),
                    de);
 
+  g_signal_connect (vs->dict, "filter-changed",
+                   G_CALLBACK (on_filter_change),
+                   de);
+
+  g_signal_connect (vs->dict, "split-changed",
+                   G_CALLBACK (on_split_change),
+                   de);
+
   connect_help (de->xml);
 
+  de->invoke_weight_cases_dialog =
+    gtk_action_new ("weight-cases-dialog",
+                   _("Weights"),
+                   _("Weight cases by variable"),
+                   "pspp-weight-cases");
+
+
+  g_signal_connect (de->invoke_weight_cases_dialog, "activate",
+                   G_CALLBACK (weight_cases_dialog), de);
+
   e->window = GTK_WINDOW (get_widget_assert (de->xml, "data_editor"));
 
   g_signal_connect (get_widget_assert (de->xml,"file_new_data"),
@@ -195,6 +193,17 @@ new_data_editor (void)
                    G_CALLBACK (insert_variable),
                    de);
 
+  gtk_action_connect_proxy (de->invoke_weight_cases_dialog,
+                           get_widget_assert (de->xml, "data_weight-cases")
+                           );
+
+  /* 
+  g_signal_connect (get_widget_assert (de->xml,"data_weight-cases"),
+                   "activate",
+                   G_CALLBACK (weight_cases_dialog),
+                   de);
+  */
+
 
   g_signal_connect (get_widget_assert (de->xml,"help_about"),
                    "activate",
@@ -275,6 +284,10 @@ new_data_editor (void)
                    G_CALLBACK (value_labels_toggled), de);
 
 
+  gtk_action_connect_proxy (de->invoke_weight_cases_dialog,
+                           get_widget_assert (de->xml, "button-weight-cases")
+                           );
+
   g_signal_connect (get_widget_assert (de->xml, "file_quit"),
                    "activate",
                    G_CALLBACK (file_quit), de);
@@ -336,8 +349,6 @@ click2column (GtkWidget *w, gint col, gpointer data)
 }
 
 
-
-
 void
 new_data_window (GtkMenuItem *menuitem, gpointer parent)
 {
@@ -644,12 +655,9 @@ insert_variable (GtkCheckMenuItem *m, gpointer data)
   GtkSheet *var_sheet =
     GTK_SHEET (get_widget_assert (de->xml, "variable_sheet"));
 
-
-
   PsppireVarStore *vs = PSPPIRE_VAR_STORE
     (gtk_sheet_get_model (var_sheet) );
 
-
   switch ( gtk_notebook_get_current_page ( GTK_NOTEBOOK (notebook)) )
     {
     case PAGE_VAR_SHEET:
@@ -671,7 +679,188 @@ insert_variable (GtkCheckMenuItem *m, gpointer data)
     }
 
   psppire_dict_insert_variable (vs->dict, posn, NULL);
+}
+
+/* Callback for when the dictionary changes its split variables */
+static void
+on_split_change (PsppireDict *dict, gpointer data)
+{
+  struct data_editor *de = data;
+
+  size_t n_split_vars = dict_get_split_cnt (dict->dict);
+
+  GtkWidget *split_status_area =
+    get_widget_assert (de->xml, "split-file-status-area");
+
+  if ( n_split_vars == 0 )
+    {
+      gtk_label_set_text (GTK_LABEL (split_status_area), _("No Split"));
+    }
+  else
+    {
+      gint i;
+      GString *text;
+      struct variable *const * split_vars = dict_get_split_vars (dict->dict);
+
+      text = g_string_new (_("Split by "));
+
+      for (i = 0 ; i < n_split_vars - 1; ++i )
+       {
+         g_string_append_printf (text, "%s, ", var_get_name (split_vars[i]));
+       }
+      g_string_append (text, var_get_name (split_vars[i]));
+
+      gtk_label_set_text (GTK_LABEL (split_status_area), text->str);
+
+      g_string_free (text, TRUE);
+    }
+}
+
+
+/* Callback for when the dictionary changes its filter variable */
+static void
+on_filter_change (GObject *o, gint filter_index, gpointer data)
+{
+  struct data_editor *de = data;
+  GtkWidget *filter_status_area =
+    get_widget_assert (de->xml, "filter-use-status-area");
+
+  if ( filter_index == -1 )
+    {
+      gtk_label_set_text (GTK_LABEL (filter_status_area), _("Filter off"));
+    }
+  else
+    {
+      GtkSheet *var_sheet =
+       GTK_SHEET (get_widget_assert (de->xml, "variable_sheet"));
+
+      PsppireVarStore *vs = PSPPIRE_VAR_STORE
+       (gtk_sheet_get_model (var_sheet) );
+
+      struct variable *var = psppire_dict_get_variable (vs->dict,
+                                                       filter_index);
+
+      gchar *text = g_strdup_printf (_("Filter by %s"), var_get_name (var));
+
+      gtk_label_set_text (GTK_LABEL (filter_status_area), text);
+
+      g_free (text);
+    }
+}
+
+/* Callback for when the dictionary changes its weights */
+static void
+on_weight_change (GObject *o, gint weight_index, gpointer data)
+{
+  struct data_editor *de = data;
+  GtkWidget *weight_status_area =
+    get_widget_assert (de->xml, "weight-status-area");
+
+  if ( weight_index == -1 )
+    {
+      gtk_label_set_text (GTK_LABEL (weight_status_area), _("Weights off"));
+    }
+  else
+    {
+      GtkSheet *var_sheet =
+       GTK_SHEET (get_widget_assert (de->xml, "variable_sheet"));
+
+      PsppireVarStore *vs = PSPPIRE_VAR_STORE
+       (gtk_sheet_get_model (var_sheet) );
+
+      struct variable *var = psppire_dict_get_variable (vs->dict,
+                                                       weight_index);
+
+      gchar *text = g_strdup_printf (_("Weight by %s"), var_get_name (var));
+
+      gtk_label_set_text (GTK_LABEL (weight_status_area), text);
+
+      g_free (text);
+    }
+}
+
+static void
+weight_cases_dialog (GObject *o, gpointer data)
+{
+  gint response;
+  struct data_editor *de = data;
+  GtkSheet *var_sheet =
+    GTK_SHEET (get_widget_assert (de->xml, "variable_sheet"));
+
+
+  GladeXML *xml = glade_xml_new (PKGDATADIR "/psppire.glade",
+                                "weight-cases-dialog", NULL);
+
+
+  GtkWidget *treeview =  get_widget_assert (xml, "treeview");
+  GtkWidget *entry =  get_widget_assert (xml, "entry1");
+
+
+  PsppireVarStore *vs = PSPPIRE_VAR_STORE (gtk_sheet_get_model (var_sheet));
+
+  PsppireVarSelect *select = psppire_var_select_new (treeview,
+                                                    entry, vs->dict);
+
+
+  PsppireDialog *dialog = create_weight_dialog (select, xml);
+
+  response = psppire_dialog_run (dialog);
+
+  g_object_unref (xml);
 
+  switch (response)
+    {
+    case GTK_RESPONSE_OK:
+    {
+      struct getl_interface *sss ;
+      const GList *list = psppire_var_select_get_variables (select);
+
+      g_assert ( g_list_length ((GList *)list) <= 1 );
+
+      if ( list == NULL)
+         {
+           sss = create_syntax_string_source ("WEIGHT OFF.");
+         }
+      else
+       {
+         struct variable *var = list->data;
+
+           sss = create_syntax_string_source ("WEIGHT BY %s.\n",
+                                              var_get_name (var));
+         }
+
+       execute_syntax (sss);
+       }
+      break;
+    case PSPPIRE_RESPONSE_PASTE:
+      {
+       struct syntax_editor *se =  (struct syntax_editor *) window_create (WINDOW_SYNTAX, NULL);
+
+       const GList *list = psppire_var_select_get_variables (select);
+
+       g_assert ( g_list_length ((GList *)list) <= 1 );
+
+       if ( list == NULL)
+         {
+           gtk_text_buffer_insert_at_cursor (se->buffer, "WEIGHT OFF.", -1);
+         }
+       else
+         {
+           struct variable *var = list->data;
+
+           gchar *text = g_strdup_printf ("WEIGHT BY %s.",
+                                          var_get_name (var));
+
+           gtk_text_buffer_insert_at_cursor (se->buffer,
+                                             text, -1);
+
+           g_free (text);
+         }
+      }
+      break;
+    default:
+      break;
+    }
 }