Merge 'master' into 'psppsheet'. 20121202031952/pspp 20121203032039/pspp 20121204032004/pspp 20121205032030/pspp 20121206032021/pspp 20121207032036/pspp 20121208032040/pspp 20121209032019/pspp 20121210032023/pspp 20121211032038/pspp 20121212032028/pspp 20121213032029/pspp 20121214032036/pspp 20121215032028/pspp 20121216032020/pspp 20121217032038/pspp 20121218031957/pspp 20121219032034/pspp 20121220032031/pspp 20121221032037/pspp 20121222032032/pspp 20121223032002/pspp 20121225032008/pspp 20121226032016/pspp 20121227032003/pspp 20121228032058/pspp 20121229032201/pspp 20121230032128/pspp
authorBen Pfaff <blp@cs.stanford.edu>
Sun, 2 Dec 2012 03:39:07 +0000 (19:39 -0800)
committerBen Pfaff <blp@cs.stanford.edu>
Sun, 2 Dec 2012 03:39:07 +0000 (19:39 -0800)
1  2 
src/ui/gui/aggregate-dialog.c
src/ui/gui/automake.mk
src/ui/gui/chi-square-dialog.c
src/ui/gui/data-editor.ui
src/ui/gui/psppire-data-window.c
src/ui/gui/runs-dialog.c

index a5c243a8e2de40c5fa4f80d5f581248f471807a0,013e1bee76538549fa551661cd07dce91ec9262f..8b54ed584afe84798b8475e46295bed1b66060fa
@@@ -93,15 -93,6 +93,6 @@@ struct aggregat
  static char * generate_syntax (const struct aggregate *rd);
  
  
- /* Makes widget W's sensitivity follow the active state of TOGGLE */
- static void
- sensitive_if_active (GtkToggleButton *toggle, GtkWidget *w)
- {
-   gboolean active = gtk_toggle_button_get_active (toggle);
-   gtk_widget_set_sensitive (w, active);
- }
  static void update_arguments (struct aggregate *agg);
  
  
@@@ -469,6 -460,8 +460,6 @@@ aggregate_dialog (PsppireDataWindow *dw
    struct aggregate fd;
    gint response;
  
 -  PsppireVarStore *vs;
 -
    GtkWidget *dialog ;
    GtkWidget *source ;
  
  
    g_signal_connect_swapped (dialog, "refresh", G_CALLBACK (refresh),  &fd);
  
 -  g_object_get (fd.de->data_editor, "var-store", &vs, NULL);
 -
    gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (fd.de));
  
 -  g_object_get (vs, "dictionary", &fd.dict, NULL);
 +  g_object_get (fd.de->data_editor, "dictionary", &fd.dict, NULL);
    g_object_set (source, "model", fd.dict, NULL);
  
  
                                      dialog_state_valid, &fd);
  
    g_signal_connect (fd.filename_radiobutton, "toggled",
-                   G_CALLBACK (sensitive_if_active), fd.filename_box );
+                   G_CALLBACK (set_sensitivity_from_toggle), fd.filename_box );
  
    g_signal_connect_swapped (fd.filename_button, "clicked",
                    G_CALLBACK (choose_filename), &fd);
diff --combined src/ui/gui/automake.mk
index ea1f06df8b3ba5b1beb87d8051d0a21f1035a3ca,6d3b6d0ec3710fee9498dbbe8c4f3cd4e90712d7..8cba97018bd166cfb06f6dc6fcaa7ec3f6ace615
@@@ -1,5 -1,7 +1,5 @@@
  ## Process this file with automake to produce Makefile.in  -*- makefile -*-
  
 -include $(top_srcdir)/src/ui/gui/sheet/automake.mk
 -
  UI_FILES = \
        src/ui/gui/aggregate.ui \
        src/ui/gui/autorecode.ui \
@@@ -9,7 -11,6 +9,7 @@@
        src/ui/gui/count.ui \
        src/ui/gui/crosstabs.ui \
        src/ui/gui/chi-square.ui \
 +      src/ui/gui/data-sheet.ui \
        src/ui/gui/descriptives.ui \
        src/ui/gui/entry-dialog.ui \
        src/ui/gui/examine.ui \
@@@ -44,7 -45,6 +44,7 @@@
        src/ui/gui/data-editor.ui \
        src/ui/gui/output-viewer.ui \
        src/ui/gui/syntax-editor.ui \
 +      src/ui/gui/var-sheet.ui \
        src/ui/gui/var-type-dialog.ui
  
  EXTRA_DIST += \
@@@ -72,7 -72,8 +72,7 @@@ endi
  
  
  src_ui_gui_psppire_LDADD = \
 -        src/ui/gui/sheet/libsheet.la \
 -      lib/gtk-contrib/libgtksheet.a \
 +      lib/gtk-contrib/libxpaned.a \
        src/ui/libuicommon.la \
        src/libpspp.la \
        src/libpspp-core.la \
@@@ -163,8 -164,6 +163,6 @@@ src_ui_gui_psppire_SOURCES = 
        src/ui/gui/autorecode-dialog.h \
        src/ui/gui/aggregate-dialog.c \
        src/ui/gui/aggregate-dialog.h \
-       src/ui/gui/binomial-dialog.c \
-       src/ui/gui/binomial-dialog.h \
        src/ui/gui/builder-wrapper.c \
        src/ui/gui/builder-wrapper.h \
        src/ui/gui/checkbox-treeview.c \
        src/ui/gui/chi-square-dialog.h \
        src/ui/gui/count-dialog.c \
        src/ui/gui/count-dialog.h \
-       src/ui/gui/crosstabs-dialog.c \
-       src/ui/gui/crosstabs-dialog.h \
 -      src/ui/gui/customentry.c \
 -      src/ui/gui/customentry.h \
        src/ui/gui/dialog-common.c \
        src/ui/gui/dialog-common.h \
        src/ui/gui/dict-display.h \
        src/ui/gui/executor.h \
        src/ui/gui/find-dialog.c \
        src/ui/gui/find-dialog.h \
-       src/ui/gui/frequencies-dialog.c \
-       src/ui/gui/frequencies-dialog.h \
        src/ui/gui/goto-case-dialog.c \
        src/ui/gui/goto-case-dialog.h \
        src/ui/gui/helper.c \
        src/ui/gui/psppire-conf.h \
        src/ui/gui/psppire-data-editor.c \
        src/ui/gui/psppire-data-editor.h \
 +      src/ui/gui/psppire-data-sheet.c \
 +      src/ui/gui/psppire-data-sheet.h \
        src/ui/gui/psppire-data-store.c \
        src/ui/gui/psppire-data-store.h \
        src/ui/gui/psppire-data-window.c \
        src/ui/gui/psppire-dialog.h \
        src/ui/gui/psppire-dialog-action.c \
        src/ui/gui/psppire-dialog-action.h \
+       src/ui/gui/psppire-dialog-action-binomial.c \
+       src/ui/gui/psppire-dialog-action-binomial.h \
        src/ui/gui/psppire-dialog-action-correlation.c \
        src/ui/gui/psppire-dialog-action-correlation.h \
+       src/ui/gui/psppire-dialog-action-crosstabs.c \
+       src/ui/gui/psppire-dialog-action-crosstabs.h \
        src/ui/gui/psppire-dialog-action-descriptives.c \
        src/ui/gui/psppire-dialog-action-descriptives.h \
        src/ui/gui/psppire-dialog-action-examine.c \
        src/ui/gui/psppire-dialog-action-examine.h \
        src/ui/gui/psppire-dialog-action-factor.c \
        src/ui/gui/psppire-dialog-action-factor.h \
+       src/ui/gui/psppire-dialog-action-frequencies.c \
+       src/ui/gui/psppire-dialog-action-frequencies.h \
        src/ui/gui/psppire-dialog-action-indep-samps.c \
        src/ui/gui/psppire-dialog-action-indep-samps.h \
        src/ui/gui/psppire-dialog-action-kmeans.c \
        src/ui/gui/psppire-var-ptr.h \
        src/ui/gui/psppire-var-sheet.c \
        src/ui/gui/psppire-var-sheet.h \
 -      src/ui/gui/psppire-var-store.c \
 -      src/ui/gui/psppire-var-store.h \
        src/ui/gui/psppire-vbuttonbox.h \
        src/ui/gui/psppire-window.c \
        src/ui/gui/psppire-window.h \
index 64a6356ce188f3d0356c3d6051102ddbe083f942,c67923ca28b5261de3132b1e12fe2b43c1410fc6..5d4cc4b431038ad00ab77e550214b605c308e9d1
@@@ -46,14 -46,6 +46,6 @@@ struct chisquare_dialo
    GtkListStore *expected_list;
  };
  
- static void
- set_sensitivity (GtkToggleButton *button, GtkWidget *w)
- {
-   gboolean state = gtk_toggle_button_get_active (button);
-   gtk_widget_set_sensitive (w, state);
- }
  static gboolean
  dialog_state_valid (gpointer data)
  {
@@@ -162,6 -154,7 +154,6 @@@ chisquare_dialog (PsppireDataWindow *dw
    struct chisquare_dialog csd;
  
    GtkBuilder *xml = builder_new ("chi-square.ui");
 -  PsppireVarStore *vs;
  
    GtkWidget *dialog = get_widget_assert   (xml, "chisquare-dialog");
  
  
    csd.values_button = get_widget_assert   (xml, "radiobutton2");
  
 -  g_object_get (dw->data_editor, "var-store", &vs, NULL);
 -
    gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (dw));
   
  
 -  g_object_get (vs, "dictionary", &csd.dict, NULL);
 +  g_object_get (dw->data_editor, "dictionary", &csd.dict, NULL);
    g_object_set (dict_view,
                "model", csd.dict, 
                "predicate", var_is_numeric,
                NULL);
  
  
-   g_signal_connect (csd.range_button, "toggled", G_CALLBACK (set_sensitivity), 
+   g_signal_connect (csd.range_button, "toggled", G_CALLBACK (set_sensitivity_from_toggle), 
                    range_table);
  
  
-   g_signal_connect (csd.values_button, "toggled", G_CALLBACK (set_sensitivity), 
+   g_signal_connect (csd.values_button, "toggled", G_CALLBACK (set_sensitivity_from_toggle), 
                    values_acr);
  
-   g_signal_connect (csd.values_button, "toggled", G_CALLBACK (set_sensitivity), 
+   g_signal_connect (csd.values_button, "toggled", G_CALLBACK (set_sensitivity_from_toggle), 
                    expected_value_entry);
  
  
index 491b94b1bc683dd533e7e84c1a66285799e6396b,da3a4a5e5999ebd6b2efc50e86baa1de5947ef69..0b1378e8422b557741bcaa9569ff0520b98112c4
@@@ -1,6 -1,20 +1,6 @@@
  <?xml version="1.0"?>
  <interface>
    <object class="GtkUIManager" id="uimanager1">
 -    <child>
 -      <object class="GtkActionGroup" id="actiongroup2">
 -        <child>
 -          <object class="GtkAction" id="sort-up">
 -            <property name="stock-id">gtk-sort-ascending</property>
 -          </object>
 -        </child>
 -        <child>
 -          <object class="GtkAction" id="sort-down">
 -            <property name="stock-id">gtk-sort-descending</property>
 -          </object>
 -        </child>
 -      </object>
 -    </child>
      <child>
        <object class="GtkActionGroup" id="actiongroup1">
          <child>
              <property name="label" translatable="yes">_Edit</property>
            </object>
          </child>
 -        <child>
 -          <object class="GtkAction" id="action_insert-variable">
 -            <property name="name">action_insert-variable</property>
 -            <property name="label" translatable="yes">Insert Variable</property>
 -            <property name="tooltip" translatable="yes">Create a new variable at the current position</property>
 -          <property name="stock-id">pspp-insert-variable</property>
 -          </object>
 -        </child>
 -        <child>
 -          <object class="GtkAction" id="edit_insert-case">
 -            <property name="name">edit_insert-case</property>
 -            <property name="label" translatable="yes">Insert Cases</property>
 -            <property name="tooltip" translatable="yes">Create a new case at the current position</property>
 -          <property name="stock-id">pspp-insert-case</property>
 -          </object>
 -        </child>
 -        <child>
 -          <object class="GtkAction" id="edit_goto-case">
 -            <property name="label" translatable="yes">Go To Case...</property>
 -            <property name="name">edit_goto-case</property>
 -            <property name="tooltip" translatable="yes">Jump to a case in the data sheet</property>
 -          <property name="stock-id">gtk-jump-to</property>
 -
 -          </object>
 -        </child>
 -        <child>
 -          <object class="GtkAction" id="edit_cut">
 -            <property name="stock-id">gtk-cut</property>
 -            <property name="name">edit_cut</property>
 -          </object>
 -        </child>
 -        <child>
 -          <object class="GtkAction" id="edit_copy">
 -            <property name="stock-id">gtk-copy</property>
 -            <property name="name">edit_copy</property>
 -          </object>
 -        </child>
 -        <child>
 -          <object class="GtkAction" id="edit_paste">
 -            <property name="stock-id">gtk-paste</property>
 -            <property name="name">edit_paste</property>
 -          </object>
 -        </child>
 -        <child>
 -          <object class="GtkAction" id="edit_clear-variables">
 -            <property name="name">edit_clear-variables</property>
 -            <property name="label" translatable="yes">Cl_ear Variables</property>
 -          <property name="tooltip" translatable="yes">Delete the variables at the selected position(s)</property>
 -            <property name="stock-id">gtk-clear</property>
 -          </object>
 -        </child>
 -        <child>
 -          <object class="GtkAction" id="edit_clear-cases">
 -            <property name="name">edit_clear-cases</property>
 -            <property name="stock-id">gtk-clear</property>
 -            <property name="label" translatable="yes">_Clear Cases</property>
 -            <property name="tooltip" translatable="yes">Delete the cases at the selected position(s)</property>
 -          </object>
 -        </child>
 -        <child>
 -          <object class="GtkAction" id="edit_find">
 -            <property name="stock-id">gtk-find</property>
 -            <property name="name">edit_find</property>
 -            <property name="label" translatable="yes">_Find...</property>
 -          </object>
 -        </child>
          <child>
            <object class="GtkAction" id="view">
              <property name="name">view</property>
            </object>
          </child>
          <child>
-           <object class="GtkAction" id="analyze_frequencies">
-             <property name="name">analyze_frequencies</property>
+           <object class="PsppireDialogActionFrequencies" id="frequencies">
+             <property name="manager">uimanager1</property>
+             <property name="name">frequencies</property>
              <property name="label" translatable="yes">_Frequencies...</property>
            </object>
          </child>
            </object>
          </child>
          <child>
-           <object class="GtkAction" id="crosstabs">
+           <object class="PsppireDialogActionCrosstabs" id="crosstabs">
              <property name="name">crosstabs</property>
+             <property name="manager">uimanager1</property>
              <property name="label" translatable="yes">_Crosstabs...</property>
            </object>
          </child>
            </object>
          </child>
          <child>
-           <object class="GtkAction" id="binomial">
+           <object class="PsppireDialogActionBinomial" id="binomial">
              <property name="name">binomial</property>
+             <property name="manager">uimanager1</property>
              <property name="label" translatable="yes">_Binomial...</property>
            </object>
          </child>
            <separator/>
            <menuitem action="file_quit"/>
          </menu>
 -        <menu action="edit">
 -          <menuitem action="action_insert-variable"/>
 -          <menuitem action="edit_insert-case"/>
 -          <menuitem action="edit_goto-case"/>
 -          <separator/>
 -          <menuitem action="edit_cut"/>
 -          <menuitem action="edit_copy"/>
 -          <menuitem action="edit_paste"/>
 -          <menuitem action="edit_clear-variables"/>
 -          <menuitem action="edit_clear-cases"/>
 -          <separator/>
 -          <menuitem action="edit_find"/>
 -        </menu>
 +      <placeholder name="DataSheetEditMenu"/>
 +      <placeholder name="VarSheetEditMenu"/>
          <menu action="view">
            <menuitem action="view_statusbar"/>
            <separator/>
          </menu>
          <menu action="analyze">
            <menu action="descriptive-statistics">
-             <menuitem action="analyze_frequencies"/>
+             <menuitem action="frequencies"/>
              <menuitem action="analyze_descriptives"/>
              <menuitem action="explore"/>
              <menuitem action="crosstabs"/>
          </menu>
        </menubar>
        <toolbar action="toolbar">
 -        <placeholder name="tool-items">
 -          <toolitem name="toolbar_open" action="file_open"/>
 -          <toolitem name="toolbar_save" action="file_save"/>
 -        <separator/>
 -          <toolitem name="toolbar_goto-case" action="edit_goto-case"/>
 -          <toolitem name="toolbar_goto-variable" action="utilities_variables"/>
 -        <separator/>
 -          <toolitem name="toolbar_find" action="edit_find"/>
 -        <separator/>
 -        <toolitem name="toolbar_insert-cases" action="edit_insert-case"/>
 -        <toolitem name="toolbar_insert-variable" action="action_insert-variable"/>
 -        <separator/>
 -        <toolitem name="toolbar_split-file" action="data_split-file"/>
 -        <toolitem name="toolbar_weight-cases" action="data_weight-cases"/>
 -        <toolitem name="toolbar_select-cases" action="data_select-cases"/>
 -        <separator/>
 -        <toolitem name="toolbar_select-cases" action="view_value-labels"/>
 -        </placeholder>
 -      </toolbar>
 -      <popup name="datasheet-variable-popup">
 -      <menuitem action="action_insert-variable"/>
 -      <separator/>
 -      <menuitem action="edit_clear-variables"/>
 +      <toolitem name="toolbar_open" action="file_open"/>
 +      <toolitem name="toolbar_save" action="file_save"/>
        <separator/>
 -        <menuitem action="sort-up"/>
 -        <menuitem action="sort-down"/>
 -      </popup>
 -      <popup name="varsheet-variable-popup">
 -      <menuitem action="action_insert-variable"/>
 +      <placeholder name="DataSheetToolItems"/>
 +      <placeholder name="VarSheetToolItems"/>
        <separator/>
 -      <menuitem action="edit_clear-variables"/>
 -      </popup>
 -      <popup name="datasheet-cases-popup">
 -      <menuitem action="edit_insert-case"/>
 +      <toolitem name="toolbar_split-file" action="data_split-file"/>
 +      <toolitem name="toolbar_weight-cases" action="data_weight-cases"/>
 +      <toolitem name="toolbar_select-cases" action="data_select-cases"/>
        <separator/>
 -      <menuitem action="edit_clear-cases"/>
 -      </popup>
 +      <toolitem name="toolbar_select-cases" action="view_value-labels"/>
 +      </toolbar>
      </ui>
    </object>
    <!-- interface-requires gtk+ 2.6 -->
    <object class="GtkMenuBar" constructor="uimanager1" id="menubar">
      <property name="visible">True</property>
    </object>
 -  <object class="GtkMenu" constructor="uimanager1" id="datasheet-variable-popup">
 -    <property name="visible">True</property>
 -  </object>
 -  <object class="GtkMenu" constructor="uimanager1" id="varsheet-variable-popup">
 -    <property name="visible">True</property>
 -  </object>
 -  <object class="GtkMenu" constructor="uimanager1" id="datasheet-cases-popup">
 -    <property name="visible">True</property>
 -  </object>
    <object class="GtkHandleBox" id="handlebox1">
      <property name="visible">True</property>
      <child>
index ad967b3256c7578860236c8eed1e79cf9d2bbf1f,9e5860b7199521358c3ae57a4eb08de8d882d32c..73c98b383efcd6624809471dffbdf12badcfc25d
  #include "libpspp/str.h"
  #include "ui/gui/aggregate-dialog.h"
  #include "ui/gui/autorecode-dialog.h"
- #include "ui/gui/binomial-dialog.h"
  #include "ui/gui/builder-wrapper.h"
  #include "ui/gui/chi-square-dialog.h"
  #include "ui/gui/comments-dialog.h"
  #include "ui/gui/compute-dialog.h"
  #include "ui/gui/count-dialog.h"
- #include "ui/gui/crosstabs-dialog.h"
  #include "ui/gui/entry-dialog.h"
  #include "ui/gui/executor.h"
- #include "ui/gui/frequencies-dialog.h"
 -#include "ui/gui/find-dialog.h"
 -#include "ui/gui/goto-case-dialog.h"
  #include "ui/gui/help-menu.h"
  #include "ui/gui/helper.h"
  #include "ui/gui/helper.h"
@@@ -43,7 -42,6 +40,7 @@@
  #include "ui/gui/npar-two-sample-related.h"
  #include "ui/gui/oneway-anova-dialog.h"
  #include "ui/gui/psppire-data-window.h"
 +#include "ui/gui/psppire-dialog-action.h"
  #include "ui/gui/psppire-syntax-window.h"
  #include "ui/gui/psppire-window.h"
  #include "ui/gui/psppire.h"
@@@ -88,10 -86,6 +85,10 @@@ static void psppire_data_window_get_pro
                                                GValue          *value,
                                                GParamSpec      *pspec);
  
 +static guint psppire_data_window_add_ui (PsppireDataWindow *, GtkUIManager *);
 +static void psppire_data_window_remove_ui (PsppireDataWindow *,
 +                                           GtkUIManager *, guint);
 +
  GType
  psppire_data_window_get_type (void)
  {
@@@ -157,6 -151,24 +154,6 @@@ psppire_data_window_class_init (Psppire
                            G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE));
  }
  \f
 -static void
 -set_paste_menuitem_sensitivity (PsppireDataWindow *de, gboolean x)
 -{
 -  GtkAction *edit_paste = get_action_assert (de->builder, "edit_paste");
 -
 -  gtk_action_set_sensitive (edit_paste, x);
 -}
 -
 -static void
 -set_cut_copy_menuitem_sensitivity (PsppireDataWindow *de, gboolean x)
 -{
 -  GtkAction *edit_copy = get_action_assert (de->builder, "edit_copy");
 -  GtkAction *edit_cut = get_action_assert (de->builder, "edit_cut");
 -
 -  gtk_action_set_sensitive (edit_copy, x);
 -  gtk_action_set_sensitive (edit_cut, x);
 -}
 -
  /* Run the EXECUTE command. */
  static void
  execute (PsppireDataWindow *dw)
@@@ -203,11 -215,13 +200,11 @@@ on_filter_change (GObject *o, gint filt
      }
    else
      {
 -      PsppireVarStore *vs = NULL;
        PsppireDict *dict = NULL;
        struct variable *var ;
        gchar *text ;
  
 -      g_object_get (de->data_editor, "var-store", &vs, NULL);
 -      g_object_get (vs, "dictionary", &dict, NULL);
 +      g_object_get (de->data_editor, "dictionary", &dict, NULL);
  
        var = psppire_dict_get_variable (dict, filter_index);
  
@@@ -274,10 -288,12 +271,10 @@@ on_weight_change (GObject *o, gint weig
    else
      {
        struct variable *var ;
 -      PsppireVarStore *vs = NULL;
        PsppireDict *dict = NULL;
        gchar *text;
  
 -      g_object_get (de->data_editor, "var-store", &vs, NULL);
 -      g_object_get (vs, "dictionary", &dict, NULL);
 +      g_object_get (de->data_editor, "dictionary", &dict, NULL);
  
        var = psppire_dict_get_variable (dict, weight_index);
  
@@@ -413,6 -429,19 +410,6 @@@ save_file (PsppireWindow *w
  }
  
  
 -static void
 -insert_case (PsppireDataWindow *dw)
 -{
 -  psppire_data_editor_insert_case (dw->data_editor);
 -}
 -
 -static void
 -on_insert_variable (PsppireDataWindow *dw)
 -{
 -  psppire_data_editor_insert_variable (dw->data_editor);
 -}
 -
 -
  static void
  display_dict (PsppireDataWindow *de)
  {
@@@ -597,6 -626,27 +594,6 @@@ on_rename_dataset (PsppireDataWindow *d
    free (new_name);
  }
  
 -static void
 -on_edit_paste (PsppireDataWindow  *de)
 -{
 -  psppire_data_editor_clip_paste (de->data_editor);
 -}
 -
 -static void
 -on_edit_copy (PsppireDataWindow  *de)
 -{
 -  psppire_data_editor_clip_copy (de->data_editor);
 -}
 -
 -
 -
 -static void
 -on_edit_cut (PsppireDataWindow  *de)
 -{
 -  psppire_data_editor_clip_cut (de->data_editor);
 -}
 -
 -
  static void
  status_bar_activate (PsppireDataWindow  *de, GtkToggleAction *action)
  {
@@@ -691,6 -741,7 +688,6 @@@ file_quit (PsppireDataWindow *de
    psppire_quit ();
  }
  
 -
  static void
  on_recent_data_select (GtkMenuShell *menushell,
                       PsppireWindow *window)
@@@ -775,52 -826,75 +772,52 @@@ on_recent_files_select (GtkMenuShell *m
    g_free (file);
  }
  
 -
 -
  static void
 -enable_delete_cases (GtkWidget *w, gint case_num, gpointer data)
 +set_unsaved (gpointer w)
  {
 -  PsppireDataWindow *de = PSPPIRE_DATA_WINDOW (data);
 -
 -  gtk_action_set_visible (de->delete_cases, case_num != -1);
 +  psppire_window_set_unsaved (PSPPIRE_WINDOW (w));
  }
  
 -
  static void
 -enable_delete_variables (GtkWidget *w, gint var, gpointer data)
 +on_switch_page (PsppireDataEditor *de, GtkNotebookPage *p,
 +              gint pagenum, PsppireDataWindow *dw)
  {
 -  PsppireDataWindow *de = PSPPIRE_DATA_WINDOW (data);
 -
 -  gtk_action_set_visible (de->delete_variables, var != -1);
 +  GtkWidget *page_menu_item;
 +  gboolean is_ds;
 +  const char *path;
 +
 +  is_ds = pagenum == PSPPIRE_DATA_EDITOR_DATA_VIEW;
 +  path = (is_ds
 +          ? "/ui/menubar/view/view_data"
 +          : "/ui/menubar/view/view_variables");
 +  page_menu_item = gtk_ui_manager_get_widget (dw->ui_manager, path);
 +  gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (page_menu_item), TRUE);
  }
  
 -/* Callback for when the datasheet/varsheet is selected */
  static void
 -on_switch_sheet (GtkNotebook *notebook,
 -               GtkNotebookPage *page,
 -               guint page_num,
 -               gpointer user_data)
 +on_ui_manager_changed (PsppireDataEditor *de,
 +                       GParamSpec *pspec UNUSED,
 +                       PsppireDataWindow *dw)
  {
 -  PsppireDataWindow *de = PSPPIRE_DATA_WINDOW (user_data);
 -
 -  GtkUIManager *uim = GTK_UI_MANAGER (get_object_assert (de->builder, "uimanager1", GTK_TYPE_UI_MANAGER));
 -
 -  GtkWidget *view_data =
 -    gtk_ui_manager_get_widget (uim,"/ui/menubar/view/view_data");
 -
 -  GtkWidget *view_variables =
 -    gtk_ui_manager_get_widget (uim,"/ui/menubar/view/view_variables");
 +  GtkUIManager *uim = psppire_data_editor_get_ui_manager (de);
 +  if (uim == dw->uim)
 +    return;
  
 -  switch (page_num)
 +  if (dw->uim)
      {
 -    case PSPPIRE_DATA_EDITOR_VARIABLE_VIEW:
 -      gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (view_variables),
 -                                      TRUE);
 -      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 PSPPIRE_DATA_EDITOR_DATA_VIEW:
 -      gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (view_data), TRUE);
 -      gtk_action_set_sensitive (de->invoke_goto_dialog, TRUE);
 -      gtk_action_set_sensitive (de->insert_case, TRUE);
 -      break;
 -    default:
 -      g_assert_not_reached ();
 -      break;
 +      psppire_data_window_remove_ui (dw, dw->uim, dw->merge_id);
 +      g_object_unref (dw->uim);
 +      dw->uim = NULL;
      }
  
 -#if 0
 -  update_paste_menuitem (de, page_num);
 -#endif
 -}
 -
 -
 -
 -static void
 -set_unsaved (gpointer w)
 -{
 -  psppire_window_set_unsaved (PSPPIRE_WINDOW (w));
 +  dw->uim = uim;
 +  if (dw->uim)
 +    {
 +      g_object_ref (dw->uim);
 +      dw->merge_id = psppire_data_window_add_ui (dw, dw->uim);
 +    }
  }
  
 -
  /* Connects the action called ACTION_NAME to HANDLER passing DW as the auxilliary data.
     Returns a pointer to the action
  */
@@@ -829,12 -903,25 +826,24 @@@ connect_action (PsppireDataWindow *dw, 
                                    GCallback handler)
  {
    GtkAction *action = get_action_assert (dw->builder, action_name);
-  
    g_signal_connect_swapped (action, "activate", handler, dw);
  
    return action;
  }
  
 -  PsppireDict *dict = dw->var_store->dictionary;
 -  gboolean enable = psppire_dict_get_var_cnt (dict) > 0;
+ /* Only a data file with at least one variable can be saved. */
+ static void
+ enable_save (PsppireDataWindow *dw)
+ {
++  gboolean enable = psppire_dict_get_var_cnt (dw->dict) > 0;
+   gtk_action_set_sensitive (get_action_assert (dw->builder, "file_save"),
+                             enable);
+   gtk_action_set_sensitive (get_action_assert (dw->builder, "file_save_as"),
+                             enable);
+ }
  /* Initializes as much of a PsppireDataWindow as we can and must before the
     dataset has been set.
  
  static void
  psppire_data_window_init (PsppireDataWindow *de)
  {
 -  GtkUIManager *uim;
 -
    de->builder = builder_new ("data-editor.ui");
  
 -  uim = GTK_UI_MANAGER (get_object_assert (de->builder, "uimanager1", GTK_TYPE_UI_MANAGER));
 +  de->ui_manager = GTK_UI_MANAGER (get_object_assert (de->builder, "uimanager1", GTK_TYPE_UI_MANAGER));
  
    PSPPIRE_WINDOW (de)->menu =
 -    GTK_MENU_SHELL (gtk_ui_manager_get_widget (uim,"/ui/menubar/windows/windows_minimise_all")->parent);
 +    GTK_MENU_SHELL (gtk_ui_manager_get_widget (de->ui_manager, "/ui/menubar/windows/windows_minimise_all")->parent);
 +
 +  de->uim = NULL;
 +  de->merge_id = 0;
  }
  
  static void
@@@ -866,6 -952,8 +875,6 @@@ psppire_data_window_finish_init (Psppir
        transformation_change_callback, /* transformations_changed */
      };
  
 -  PsppireDict *dict;
 -
    GtkWidget *menubar;
    GtkWidget *hb ;
    GtkWidget *sb ;
    GtkWidget *box = gtk_vbox_new (FALSE, 0);
  
    de->dataset = ds;
 -  dict = psppire_dict_new_from_dict (dataset_dict (ds));
 -  de->var_store = psppire_var_store_new (dict);
 -  g_object_unref (dict);
 -  de->data_store = psppire_data_store_new (dict);
 +  de->dict = psppire_dict_new_from_dict (dataset_dict (ds));
 +  de->data_store = psppire_data_store_new (de->dict);
    psppire_data_store_set_reader (de->data_store, NULL);
  
    menubar = get_widget_assert (de->builder, "menubar");
    hb = get_widget_assert (de->builder, "handlebox1");
    sb = get_widget_assert (de->builder, "status-bar");
  
 +  de->uim = NULL;
 +  de->merge_id = 0;
 +
    de->data_editor =
 -    PSPPIRE_DATA_EDITOR (psppire_data_editor_new (de, de->var_store,
 -                                                  de->data_store));
 +    PSPPIRE_DATA_EDITOR (psppire_data_editor_new (de->dict, de->data_store));
 +  g_signal_connect (de->data_editor, "switch-page",
 +                    G_CALLBACK (on_switch_page), de);
  
    g_signal_connect_swapped (de->data_store, "case-changed",
                            G_CALLBACK (set_unsaved), de);
  
    gtk_container_add (GTK_CONTAINER (de), box);
  
 -  set_cut_copy_menuitem_sensitivity (de, FALSE);
 -
 -  g_signal_connect_swapped (de->data_editor, "data-selection-changed",
 -                          G_CALLBACK (set_cut_copy_menuitem_sensitivity), de);
 -
 -
 -  set_paste_menuitem_sensitivity (de, FALSE);
 -
 -  g_signal_connect_swapped (de->data_editor, "data-available-changed",
 -                          G_CALLBACK (set_paste_menuitem_sensitivity), de);
 -
 -  g_signal_connect (dict, "weight-changed",
 +  g_signal_connect (de->dict, "weight-changed",
                    G_CALLBACK (on_weight_change),
                    de);
  
 -  g_signal_connect (dict, "filter-changed",
 +  g_signal_connect (de->dict, "filter-changed",
                    G_CALLBACK (on_filter_change),
                    de);
  
 -  g_signal_connect (dict, "split-changed",
 +  g_signal_connect (de->dict, "split-changed",
                    G_CALLBACK (on_split_change),
                    de);
  
 -  g_signal_connect_swapped (dict, "backend-changed",
++  g_signal_connect_swapped (de->dict, "backend-changed",
+                             G_CALLBACK (enable_save), de);
 -  g_signal_connect_swapped (dict, "variable-inserted",
++  g_signal_connect_swapped (de->dict, "variable-inserted",
+                             G_CALLBACK (enable_save), de);
 -  g_signal_connect_swapped (dict, "variable-deleted",
++  g_signal_connect_swapped (de->dict, "variable-deleted",
+                             G_CALLBACK (enable_save), de);
+   enable_save (de);
  
 -  connect_action (de, "edit_copy", G_CALLBACK (on_edit_copy));
 -
 -  connect_action (de, "edit_cut", G_CALLBACK (on_edit_cut));
 -
    connect_action (de, "file_new_data", G_CALLBACK (create_data_window));
  
    connect_action (de, "file_import-text", G_CALLBACK (text_data_import_assistant));
  
    connect_action (de, "file_information_external-file", G_CALLBACK (sysfile_info));
  
 -  connect_action (de, "edit_paste", G_CALLBACK (on_edit_paste));
 -
 -  de->insert_case = connect_action (de, "edit_insert-case", G_CALLBACK (insert_case));
 -
 -  de->insert_variable = connect_action (de, "action_insert-variable", G_CALLBACK (on_insert_variable));
 -
 -  de->invoke_goto_dialog = connect_action (de, "edit_goto-case", G_CALLBACK (goto_case_dialog));
 -
    g_signal_connect_swapped (get_action_assert (de->builder, "view_value-labels"), "toggled", G_CALLBACK (toggle_value_labels), de);
  
 -  {
 -    de->delete_cases = get_action_assert (de->builder, "edit_clear-cases");
 -
 -    g_signal_connect_swapped (de->delete_cases, "activate", G_CALLBACK (psppire_data_editor_delete_cases), de->data_editor);
 -
 -    gtk_action_set_visible (de->delete_cases, FALSE);
 -  }
 -
 -
 -  {
 -    de->delete_variables = get_action_assert (de->builder, "edit_clear-variables");
 -
 -    g_signal_connect_swapped (de->delete_variables, "activate", G_CALLBACK (psppire_data_editor_delete_variables), de->data_editor);
 -
 -    gtk_action_set_visible (de->delete_variables, FALSE);
 -  }
 -
 -
    connect_action (de, "data_transpose", G_CALLBACK (transpose_dialog));
    connect_action (de, "data_select-cases", G_CALLBACK (select_cases_dialog));
    connect_action (de, "data_aggregate", G_CALLBACK (aggregate_dialog));
    connect_action (de, "transform_compute", G_CALLBACK (compute_dialog));
    connect_action (de, "transform_autorecode", G_CALLBACK (autorecode_dialog));
 -  connect_action (de, "edit_find", G_CALLBACK (find_dialog));
    connect_action (de, "data_split-file", G_CALLBACK (split_file_dialog));
    connect_action (de, "data_weight-cases", G_CALLBACK (weight_cases_dialog));
    connect_action (de, "oneway-anova", G_CALLBACK (oneway_anova_dialog));
    connect_action (de, "transform_count", G_CALLBACK (count_dialog));
    connect_action (de, "transform_recode-same", G_CALLBACK (recode_same_dialog));
    connect_action (de, "transform_recode-different", G_CALLBACK (recode_different_dialog));
-   connect_action (de, "analyze_frequencies", G_CALLBACK (frequencies_dialog));
-   connect_action (de, "crosstabs", G_CALLBACK (crosstabs_dialog));
    connect_action (de, "univariate", G_CALLBACK (univariate_dialog));
    connect_action (de, "chi-square", G_CALLBACK (chisquare_dialog));
-   connect_action (de, "binomial", G_CALLBACK (binomial_dialog));
    connect_action (de, "runs", G_CALLBACK (runs_dialog));
    connect_action (de, "ks-one-sample", G_CALLBACK (ks_one_sample_dialog));
    connect_action (de, "k-related-samples", G_CALLBACK (k_related_dialog));
    connect_action (de, "two-related-samples", G_CALLBACK (two_related_dialog));
  
    {
 -    GtkUIManager *uim = GTK_UI_MANAGER (get_object_assert (de->builder, "uimanager1", GTK_TYPE_UI_MANAGER));
 -
      GtkWidget *recent_data =
 -      gtk_ui_manager_get_widget (uim,"/ui/menubar/file/file_recent-data");
 +      gtk_ui_manager_get_widget (de->ui_manager, "/ui/menubar/file/file_recent-data");
  
      GtkWidget *recent_files =
 -      gtk_ui_manager_get_widget (uim,"/ui/menubar/file/file_recent-files");
 +      gtk_ui_manager_get_widget (de->ui_manager, "/ui/menubar/file/file_recent-files");
  
  
      GtkWidget *menu_data = gtk_recent_chooser_menu_new_for_manager (
    connect_action (de, "file_new_syntax", G_CALLBACK (create_syntax_window));
  
  
 -  g_signal_connect (de->data_editor,
 -                  "cases-selected",
 -                  G_CALLBACK (enable_delete_cases),
 -                  de);
 -
 -  g_signal_connect (de->data_editor,
 -                  "variables-selected",
 -                  G_CALLBACK (enable_delete_variables),
 -                  de);
 -
 -
 -  g_signal_connect (de->data_editor,
 -                  "switch-page",
 -                  G_CALLBACK (on_switch_sheet), de);
 -
    gtk_notebook_set_current_page (GTK_NOTEBOOK (de->data_editor), PSPPIRE_DATA_EDITOR_VARIABLE_VIEW);
    gtk_notebook_set_current_page (GTK_NOTEBOOK (de->data_editor), PSPPIRE_DATA_EDITOR_DATA_VIEW);
  
  
    g_signal_connect_swapped (get_action_assert (de->builder, "windows_split"), "toggled", G_CALLBACK (toggle_split_window), de);
  
 -  {
 -    GtkUIManager *uim = GTK_UI_MANAGER (get_object_assert (de->builder, "uimanager1", GTK_TYPE_UI_MANAGER));
 -
 -    merge_help_menu (uim);
 -  }
 -
 -  {
 -    GtkWidget *data_sheet_cases_popup_menu = get_widget_assert (de->builder,
 -                                                              "datasheet-cases-popup");
 +  merge_help_menu (de->ui_manager);
  
 -    GtkWidget *var_sheet_variable_popup_menu = get_widget_assert (de->builder,
 -                                                                "varsheet-variable-popup");
 -
 -    GtkWidget *data_sheet_variable_popup_menu = get_widget_assert (de->builder,
 -                                                                 "datasheet-variable-popup");
 -
 -    g_signal_connect_swapped (get_action_assert (de->builder, "sort-up"), "activate",
 -                            G_CALLBACK (psppire_data_editor_sort_ascending),
 -                            de->data_editor);
 -
 -    g_signal_connect_swapped (get_action_assert (de->builder, "sort-down"), "activate",
 -                            G_CALLBACK (psppire_data_editor_sort_descending),
 -                            de->data_editor);
 -
 -    g_object_set (de->data_editor,
 -                "datasheet-column-menu", data_sheet_variable_popup_menu,
 -                "datasheet-row-menu", data_sheet_cases_popup_menu,
 -                "varsheet-row-menu", var_sheet_variable_popup_menu,
 -                NULL);
 -  }
 +  g_signal_connect (de->data_editor, "notify::ui-manager",
 +                    G_CALLBACK (on_ui_manager_changed), de);
 +  on_ui_manager_changed (de->data_editor, NULL, de);
  
    gtk_widget_show (GTK_WIDGET (de->data_editor));
    gtk_widget_show (box);
@@@ -1055,23 -1229,16 +1068,23 @@@ psppire_data_window_dispose (GObject *o
  {
    PsppireDataWindow *dw = PSPPIRE_DATA_WINDOW (object);
  
 +  if (dw->uim)
 +    {
 +      psppire_data_window_remove_ui (dw, dw->uim, dw->merge_id);
 +      g_object_unref (dw->uim);
 +      dw->uim = NULL;
 +    }
 +
    if (dw->builder != NULL)
      {
        g_object_unref (dw->builder);
        dw->builder = NULL;
      }
  
 -  if (dw->var_store)
 +  if (dw->dict)
      {
 -      g_object_unref (dw->var_store);
 -      dw->var_store = NULL;
 +      g_object_unref (dw->dict);
 +      dw->dict = NULL;
      }
  
    if (dw->data_store)
@@@ -1149,65 -1316,6 +1162,65 @@@ psppire_data_window_get_property (GObje
      };
  }
  
 +static guint
 +psppire_data_window_add_ui (PsppireDataWindow *pdw, GtkUIManager *uim)
 +{
 +  gchar *ui_string;
 +  guint merge_id;
 +  GList *list;
 +
 +  ui_string = gtk_ui_manager_get_ui (uim);
 +  merge_id = gtk_ui_manager_add_ui_from_string (pdw->ui_manager, ui_string,
 +                                                -1, NULL);
 +  g_free (ui_string);
 +
 +  g_return_val_if_fail (merge_id != 0, 0);
 +
 +  list = gtk_ui_manager_get_action_groups (uim);
 +  for (; list != NULL; list = list->next)
 +    {
 +      GtkActionGroup *action_group = list->data;
 +      GList *actions = gtk_action_group_list_actions (action_group);
 +      GList *action;
 +
 +      for (action = actions; action != NULL; action = action->next)
 +        {
 +          GtkAction *a = action->data;
 +
 +          if (PSPPIRE_IS_DIALOG_ACTION (a))
 +            g_object_set (a, "manager", pdw->ui_manager, NULL);
 +        }
 +
 +      gtk_ui_manager_insert_action_group (pdw->ui_manager, action_group, 0);
 +    }
 +
 +  gtk_window_add_accel_group (GTK_WINDOW (pdw),
 +                              gtk_ui_manager_get_accel_group (uim));
 +
 +  return merge_id;
 +}
 +
 +static void
 +psppire_data_window_remove_ui (PsppireDataWindow *pdw,
 +                               GtkUIManager *uim, guint merge_id)
 +{
 +  GList *list;
 +
 +  g_return_if_fail (merge_id != 0);
 +
 +  gtk_ui_manager_remove_ui (pdw->ui_manager, merge_id);
 +
 +  list = gtk_ui_manager_get_action_groups (uim);
 +  for (; list != NULL; list = list->next)
 +    {
 +      GtkActionGroup *action_group = list->data;
 +      gtk_ui_manager_remove_action_group (pdw->ui_manager, action_group);
 +    }
 +
 +  gtk_window_remove_accel_group (GTK_WINDOW (pdw),
 +                                 gtk_ui_manager_get_accel_group (uim));
 +}
 +
  GtkWidget*
  psppire_data_window_new (struct dataset *ds)
  {
  bool
  psppire_data_window_is_empty (PsppireDataWindow *dw)
  {
 -  return psppire_var_store_get_var_cnt (dw->var_store) == 0;
 +  return psppire_dict_get_var_cnt (dw->dict) == 0;
  }
  
  static void
@@@ -1285,18 -1393,6 +1298,18 @@@ psppire_data_window_for_dataset (struc
    return NULL;
  }
  
 +PsppireDataWindow *
 +psppire_data_window_for_data_store (PsppireDataStore *data_store)
 +{
 +  PsppireDataWindow *pdw;
 +
 +  ll_for_each (pdw, PsppireDataWindow, ll, &all_data_windows)
 +    if (pdw->data_store == data_store)
 +      return pdw;
 +
 +  return NULL;
 +}
 +
  void
  create_data_window (void)
  {
@@@ -1310,14 -1406,10 +1323,14 @@@ open_data_window (PsppireWindow *victim
  
    if (PSPPIRE_IS_DATA_WINDOW (victim)
        && psppire_data_window_is_empty (PSPPIRE_DATA_WINDOW (victim)))
 -    window = GTK_WIDGET (victim);
 +    {
 +      window = GTK_WIDGET (victim);
 +      gtk_widget_hide (GTK_WIDGET (PSPPIRE_DATA_WINDOW (window)->data_editor));
 +    }
    else
      window = psppire_data_window_new (NULL);
  
    psppire_window_load (PSPPIRE_WINDOW (window), file_name);
 -  gtk_widget_show (window);
 +  gtk_widget_show_all (window);
  }
 +
diff --combined src/ui/gui/runs-dialog.c
index 7bc05f2422c711c2a3884aa340f791dc8d4dfc35,7fc68131c64d03d58db31e040d3a7820c3c816f6..bfbfc834cbced0e92ca00a1701bd75ad2ae8b08f
@@@ -61,15 -61,6 +61,6 @@@ struct run
  
  static char * generate_syntax (const struct runs *rd);
  
- /* Makes widget W's sensitivity follow the active state of TOGGLE */
- static void
- sensitive_if_active (GtkToggleButton *toggle, GtkWidget *w)
- {
-   gboolean active = gtk_toggle_button_get_active (toggle);
-   gtk_widget_set_sensitive (w, active);
- }
  static void
  refresh (struct runs *fd)
  {
@@@ -122,6 -113,8 +113,6 @@@ runs_dialog (PsppireDataWindow *dw
    struct runs fd;
    gint response;
  
 -  PsppireVarStore *vs;
 -
    GtkWidget *dialog ;
    GtkWidget *source ;
  
  
    fd.variables = get_widget_assert   (fd.xml, "psppire-var-view1");
  
 -  g_object_get (fd.de->data_editor, "var-store", &vs, NULL);
 -
    gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (fd.de));
  
 -  g_object_get (vs, "dictionary", &fd.dict, NULL);
 +  g_object_get (fd.de->data_editor, "dictionary", &fd.dict, NULL);
    g_object_set (source, "model", fd.dict,
                "predicate", var_is_numeric,
                NULL);
  
    g_signal_connect (fd.cb[CB_CUSTOM], "toggled",
-                   G_CALLBACK (sensitive_if_active), fd.entry);
+                   G_CALLBACK (set_sensitivity_from_toggle), fd.entry);
  
    psppire_dialog_set_valid_predicate (PSPPIRE_DIALOG (dialog),
                                      dialog_state_valid, &fd);