pspp-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Pspp-cvs] pspp lib/gtksheet/gtksheet.c po/de.po po/en_GB....


From: John Darrington
Subject: [Pspp-cvs] pspp lib/gtksheet/gtksheet.c po/de.po po/en_GB....
Date: Fri, 29 Feb 2008 09:13:55 +0000

CVSROOT:        /sources/pspp
Module name:    pspp
Changes by:     John Darrington <jmd>   08/02/29 09:13:55

Modified files:
        lib/gtksheet   : gtksheet.c 
        po             : de.po en_GB.po 
        src/ui/gui     : ChangeLog automake.mk comments-dialog.c 
                         compute-dialog.c crosstabs-dialog.c 
                         data-editor.c data-editor.glade data-editor.h 
                         descriptives-dialog.c examine-dialog.c 
                         find-dialog.c frequencies-dialog.c 
                         goto-case-dialog.c oneway-anova-dialog.c 
                         psppire-var-store.c psppire-var-store.h 
                         psppire.c rank-dialog.c recode-dialog.c 
                         select-cases-dialog.c sort-cases-dialog.c 
                         split-file-dialog.c 
                         t-test-independent-samples-dialog.c 
                         t-test-one-sample.c t-test-paired-samples.c 
                         transpose-dialog.c var-display.c var-display.h 
                         variable-info-dialog.c weight-cases-dialog.c 
Added files:
        src/ui/gui     : psppire-data-editor.c psppire-data-editor.h 
                         psppire-var-sheet.c psppire-var-sheet.h 
Removed files:
        src/ui/gui     : clipboard.c clipboard.h data-sheet.h 

Log message:
        Applied patch #6428

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/pspp/lib/gtksheet/gtksheet.c?cvsroot=pspp&r1=1.39&r2=1.40
http://cvs.savannah.gnu.org/viewcvs/pspp/po/de.po?cvsroot=pspp&r1=1.97&r2=1.98
http://cvs.savannah.gnu.org/viewcvs/pspp/po/en_GB.po?cvsroot=pspp&r1=1.113&r2=1.114
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/ChangeLog?cvsroot=pspp&r1=1.115&r2=1.116
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/automake.mk?cvsroot=pspp&r1=1.51&r2=1.52
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/comments-dialog.c?cvsroot=pspp&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/compute-dialog.c?cvsroot=pspp&r1=1.15&r2=1.16
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/crosstabs-dialog.c?cvsroot=pspp&r1=1.1&r2=1.2
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/data-editor.c?cvsroot=pspp&r1=1.66&r2=1.67
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/data-editor.glade?cvsroot=pspp&r1=1.42&r2=1.43
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/data-editor.h?cvsroot=pspp&r1=1.32&r2=1.33
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/descriptives-dialog.c?cvsroot=pspp&r1=1.4&r2=1.5
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/examine-dialog.c?cvsroot=pspp&r1=1.1&r2=1.2
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/find-dialog.c?cvsroot=pspp&r1=1.7&r2=1.8
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/frequencies-dialog.c?cvsroot=pspp&r1=1.3&r2=1.4
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/goto-case-dialog.c?cvsroot=pspp&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/oneway-anova-dialog.c?cvsroot=pspp&r1=1.3&r2=1.4
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/psppire-var-store.c?cvsroot=pspp&r1=1.29&r2=1.30
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/psppire-var-store.h?cvsroot=pspp&r1=1.11&r2=1.12
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/psppire.c?cvsroot=pspp&r1=1.59&r2=1.60
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/rank-dialog.c?cvsroot=pspp&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/recode-dialog.c?cvsroot=pspp&r1=1.3&r2=1.4
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/select-cases-dialog.c?cvsroot=pspp&r1=1.3&r2=1.4
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/sort-cases-dialog.c?cvsroot=pspp&r1=1.12&r2=1.13
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/split-file-dialog.c?cvsroot=pspp&r1=1.6&r2=1.7
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/t-test-independent-samples-dialog.c?cvsroot=pspp&r1=1.10&r2=1.11
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/t-test-one-sample.c?cvsroot=pspp&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/t-test-paired-samples.c?cvsroot=pspp&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/transpose-dialog.c?cvsroot=pspp&r1=1.9&r2=1.10
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/var-display.c?cvsroot=pspp&r1=1.3&r2=1.4
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/var-display.h?cvsroot=pspp&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/variable-info-dialog.c?cvsroot=pspp&r1=1.4&r2=1.5
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/weight-cases-dialog.c?cvsroot=pspp&r1=1.6&r2=1.7
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/psppire-data-editor.c?cvsroot=pspp&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/psppire-data-editor.h?cvsroot=pspp&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/psppire-var-sheet.c?cvsroot=pspp&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/psppire-var-sheet.h?cvsroot=pspp&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/clipboard.c?cvsroot=pspp&r1=1.5&r2=0
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/clipboard.h?cvsroot=pspp&r1=1.3&r2=0
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/data-sheet.h?cvsroot=pspp&r1=1.7&r2=0

Patches:
Index: lib/gtksheet/gtksheet.c
===================================================================
RCS file: /sources/pspp/pspp/lib/gtksheet/gtksheet.c,v
retrieving revision 1.39
retrieving revision 1.40
diff -u -b -r1.39 -r1.40
--- lib/gtksheet/gtksheet.c     27 Feb 2008 10:10:28 -0000      1.39
+++ lib/gtksheet/gtksheet.c     29 Feb 2008 09:13:50 -0000      1.40
@@ -4469,6 +4469,9 @@
 void
 gtk_sheet_unselect_range (GtkSheet * sheet)
 {
+  if (! GTK_WIDGET_REALIZED (GTK_WIDGET (sheet)))
+    return;
+
   gtk_sheet_real_unselect_range (sheet, NULL);
   sheet->state = GTK_STATE_NORMAL;
 

Index: po/de.po
===================================================================
RCS file: /sources/pspp/pspp/po/de.po,v
retrieving revision 1.97
retrieving revision 1.98
diff -u -b -r1.97 -r1.98
--- po/de.po    20 Feb 2008 04:43:37 -0000      1.97
+++ po/de.po    29 Feb 2008 09:13:50 -0000      1.98
@@ -10,7 +10,7 @@
 msgstr ""
 "Project-Id-Version: PSPP 0.4.3\n"
 "Report-Msgid-Bugs-To: address@hidden"
-"POT-Creation-Date: 2008-02-20 13:21+0900\n"
+"POT-Creation-Date: 2008-02-29 17:22+0900\n"
 "PO-Revision-Date: 2006-07-28 19:32+0800\n"
 "Last-Translator: John Darrington <address@hidden>\n"
 "Language-Team: German <address@hidden>\n"
@@ -47,12 +47,6 @@
 msgid "Date %04d-%d-%d is before the earliest acceptable date of 1582-10-15."
 msgstr ""
 
-#: src/data/casereader-filter.c:221
-msgid ""
-"At least one case in the data read had a weight value that was user-missing, "
-"system-missing, zero, or negative.  These case(s) were ignored."
-msgstr ""
-
 #: src/data/case-tmpfile.c:57
 msgid "failed to create temporary file"
 msgstr ""
@@ -73,6 +67,12 @@
 msgid "writing to temporary file"
 msgstr ""
 
+#: src/data/casereader-filter.c:221
+msgid ""
+"At least one case in the data read had a weight value that was user-missing, "
+"system-missing, zero, or negative.  These case(s) were ignored."
+msgstr ""
+
 #: src/data/data-in.c:257 src/data/data-in.c:447
 msgid "Field contents are not numeric."
 msgstr ""
@@ -320,14 +320,14 @@
 msgstr ""
 
 #: src/data/format.c:327 src/data/sys-file-reader.c:639
-#: src/ui/gui/data-editor.glade:1304 src/ui/gui/psppire.glade:2176
-#: src/ui/gui/psppire-var-store.c:493
+#: src/ui/gui/data-editor.glade:1197 src/ui/gui/psppire-var-store.c:604
+#: src/ui/gui/psppire.glade:2176
 msgid "String"
 msgstr "Zeichenkette"
 
 #: src/data/format.c:327 src/data/sys-file-reader.c:639
-#: src/ui/gui/data-editor.glade:1193 src/ui/gui/psppire.glade:2131
-#: src/ui/gui/psppire-var-store.c:486
+#: src/ui/gui/data-editor.glade:1086 src/ui/gui/psppire-var-store.c:597
+#: src/ui/gui/psppire.glade:2131
 msgid "Numeric"
 msgstr "Nummer"
 
@@ -1287,7 +1287,7 @@
 msgstr ""
 
 #: src/language/data-io/data-parser.c:643 src/language/data-io/print.c:404
-#: src/ui/gui/crosstabs.glade:92 src/ui/gui/var-sheet.c:72
+#: src/ui/gui/crosstabs.glade:92 src/ui/gui/psppire-var-sheet.c:103
 msgid "Columns"
 msgstr "Spalten"
 
@@ -1427,6 +1427,67 @@
 msgid "Handle for %s not allowed here."
 msgstr ""
 
+#: src/language/data-io/get-data.c:62
+#, c-format
+msgid "Unsupported TYPE %s"
+msgstr ""
+
+#: src/language/data-io/get-data.c:258
+#, c-format
+msgid ""
+"%s is allowed only with %s arrangement, but %s arrangement was stated or "
+"implied earlier in this command."
+msgstr ""
+
+#: src/language/data-io/get-data.c:313
+msgid "expecting FIXED or DELIMITED"
+msgstr ""
+
+#: src/language/data-io/get-data.c:326
+msgid "Value of FIRSTCASE must be 1 or greater."
+msgstr ""
+
+#: src/language/data-io/get-data.c:351
+msgid "expecting LINE or VARIABLES"
+msgstr ""
+
+#: src/language/data-io/get-data.c:364
+msgid "Value of FIXCASE must be at least 1."
+msgstr ""
+
+#: src/language/data-io/get-data.c:384
+msgid "Value of FIRST must be at least 1."
+msgstr ""
+
+#: src/language/data-io/get-data.c:396
+msgid "Value of PERCENT must be between 1 and 100."
+msgstr ""
+
+#: src/language/data-io/get-data.c:445
+msgid ""
+"In compatible syntax mode, the QUALIFIER string must contain exactly one "
+"character."
+msgstr ""
+
+#: src/language/data-io/get-data.c:460
+msgid "expecting VARIABLES"
+msgstr ""
+
+#: src/language/data-io/get-data.c:482
+#: src/language/data-io/placement-parser.c:376
+#, c-format
+msgid ""
+"The record number specified, %ld, is at or before the previous record, %d.  "
+"Data fields must be listed in order of increasing record number."
+msgstr ""
+
+#: src/language/data-io/get-data.c:491
+#, c-format
+msgid ""
+"The record number specified, %ld, exceeds the number of records per case "
+"specified on FIXCASE, %d."
+msgstr ""
+
 #: src/language/data-io/get.c:99
 msgid "expecting COMM or TAPE"
 msgstr ""
@@ -1516,67 +1577,6 @@
 "variable in earlier file (%s)."
 msgstr ""
 
-#: src/language/data-io/get-data.c:62
-#, c-format
-msgid "Unsupported TYPE %s"
-msgstr ""
-
-#: src/language/data-io/get-data.c:258
-#, c-format
-msgid ""
-"%s is allowed only with %s arrangement, but %s arrangement was stated or "
-"implied earlier in this command."
-msgstr ""
-
-#: src/language/data-io/get-data.c:313
-msgid "expecting FIXED or DELIMITED"
-msgstr ""
-
-#: src/language/data-io/get-data.c:326
-msgid "Value of FIRSTCASE must be 1 or greater."
-msgstr ""
-
-#: src/language/data-io/get-data.c:351
-msgid "expecting LINE or VARIABLES"
-msgstr ""
-
-#: src/language/data-io/get-data.c:364
-msgid "Value of FIXCASE must be at least 1."
-msgstr ""
-
-#: src/language/data-io/get-data.c:384
-msgid "Value of FIRST must be at least 1."
-msgstr ""
-
-#: src/language/data-io/get-data.c:396
-msgid "Value of PERCENT must be between 1 and 100."
-msgstr ""
-
-#: src/language/data-io/get-data.c:445
-msgid ""
-"In compatible syntax mode, the QUALIFIER string must contain exactly one "
-"character."
-msgstr ""
-
-#: src/language/data-io/get-data.c:460
-msgid "expecting VARIABLES"
-msgstr ""
-
-#: src/language/data-io/get-data.c:482
-#: src/language/data-io/placement-parser.c:376
-#, c-format
-msgid ""
-"The record number specified, %ld, is at or before the previous record, %d.  "
-"Data fields must be listed in order of increasing record number."
-msgstr ""
-
-#: src/language/data-io/get-data.c:491
-#, c-format
-msgid ""
-"The record number specified, %ld, exceeds the number of records per case "
-"specified on FIXCASE, %d."
-msgstr ""
-
 #: src/language/data-io/inpt-pgm.c:129
 msgid "Unexpected end-of-file within INPUT PROGRAM."
 msgstr ""
@@ -1666,6 +1666,20 @@
 msgid "The ending column for a field must be greater than the starting column."
 msgstr ""
 
+#: src/language/data-io/print-space.c:73 src/language/lexer/lexer.c:476
+#: src/language/stats/autorecode.c:154 src/language/xforms/select-if.c:60
+msgid "expecting end of command"
+msgstr ""
+
+#: src/language/data-io/print-space.c:116
+msgid "The expression on PRINT SPACE evaluated to the system-missing value."
+msgstr ""
+
+#: src/language/data-io/print-space.c:119
+#, c-format
+msgid "The expression on PRINT SPACE evaluated to %g."
+msgstr ""
+
 #: src/language/data-io/print.c:265
 #, c-format
 msgid "Output calls for %d records but %zu specified on RECORDS subcommand."
@@ -1685,20 +1699,6 @@
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/language/data-io/print-space.c:73 src/language/lexer/lexer.c:476
-#: src/language/stats/autorecode.c:154 src/language/xforms/select-if.c:60
-msgid "expecting end of command"
-msgstr ""
-
-#: src/language/data-io/print-space.c:116
-msgid "The expression on PRINT SPACE evaluated to the system-missing value."
-msgstr ""
-
-#: src/language/data-io/print-space.c:119
-#, c-format
-msgid "The expression on PRINT SPACE evaluated to %g."
-msgstr ""
-
 #: src/language/dictionary/apply-dictionary.c:75
 #, c-format
 msgid "Variable %s is %s in target file, but %s in source file."
@@ -1884,7 +1884,7 @@
 #: src/language/dictionary/split-file.c:86
 #: src/language/dictionary/sys-file-info.c:397
 #: src/language/dictionary/sys-file-info.c:564 src/ui/gui/crosstabs.glade:275
-#: src/ui/gui/psppire.glade:2099 src/ui/gui/var-sheet.c:69
+#: src/ui/gui/psppire-var-sheet.c:100 src/ui/gui/psppire.glade:2099
 msgid "Label"
 msgstr "Kennsatz"
 
@@ -2047,15 +2047,18 @@
 msgid "Measure: %s"
 msgstr "Messe"
 
-#: src/language/dictionary/sys-file-info.c:495 src/ui/gui/var-sheet.c:87
+#: src/language/dictionary/sys-file-info.c:495
+#: src/ui/gui/psppire-var-sheet.c:119
 msgid "Nominal"
 msgstr "Nominalwert"
 
-#: src/language/dictionary/sys-file-info.c:496 src/ui/gui/var-sheet.c:88
+#: src/language/dictionary/sys-file-info.c:496
+#: src/ui/gui/psppire-var-sheet.c:120
 msgid "Ordinal"
 msgstr "Ordinalwert"
 
-#: src/language/dictionary/sys-file-info.c:497 src/ui/gui/var-sheet.c:89
+#: src/language/dictionary/sys-file-info.c:497
+#: src/ui/gui/psppire-var-sheet.c:121
 msgid "Scale"
 msgstr "Skalwert"
 
@@ -2064,15 +2067,18 @@
 msgid "Display Alignment: %s"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:501 src/ui/gui/var-sheet.c:80
+#: src/language/dictionary/sys-file-info.c:501
+#: src/ui/gui/psppire-var-sheet.c:112
 msgid "Left"
 msgstr "Links"
 
-#: src/language/dictionary/sys-file-info.c:502 src/ui/gui/var-sheet.c:82
+#: src/language/dictionary/sys-file-info.c:502
+#: src/ui/gui/psppire-var-sheet.c:114
 msgid "Center"
 msgstr "Mittel"
 
-#: src/language/dictionary/sys-file-info.c:503 src/ui/gui/var-sheet.c:81
+#: src/language/dictionary/sys-file-info.c:503
+#: src/ui/gui/psppire-var-sheet.c:113
 msgid "Right"
 msgstr "Rechts"
 
@@ -2745,7 +2751,7 @@
 
 #: src/language/stats/crosstabs.q:859 src/language/stats/examine.q:917
 #: src/language/stats/frequencies.q:1128 src/language/stats/frequencies.q:1407
-#: src/ui/gui/var-sheet.c:71
+#: src/ui/gui/psppire-var-sheet.c:102
 msgid "Missing"
 msgstr "Löse"
 
@@ -2848,8 +2854,8 @@
 msgid "Directional measures."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1221 src/ui/gui/psppire.glade:2223
-#: src/ui/gui/var-sheet.c:66
+#: src/language/stats/crosstabs.q:1221 src/ui/gui/psppire-var-sheet.c:97
+#: src/ui/gui/psppire.glade:2223
 msgid "Type"
 msgstr "Typ"
 
@@ -3380,6 +3386,22 @@
 msgid "TABLES subcommand may not appear more than once."
 msgstr ""
 
+#: src/language/stats/npar-summary.c:108
+msgid "Descriptive Statistics"
+msgstr ""
+
+#: src/language/stats/npar-summary.c:145
+msgid "25th"
+msgstr ""
+
+#: src/language/stats/npar-summary.c:148
+msgid "50th (Median)"
+msgstr ""
+
+#: src/language/stats/npar-summary.c:151
+msgid "75th"
+msgstr ""
+
 #: src/language/stats/npar.q:98
 msgid "NPAR subcommand not currently implemented."
 msgstr ""
@@ -3404,22 +3426,6 @@
 "not match the number following (%zu)."
 msgstr ""
 
-#: src/language/stats/npar-summary.c:108
-msgid "Descriptive Statistics"
-msgstr ""
-
-#: src/language/stats/npar-summary.c:145
-msgid "25th"
-msgstr ""
-
-#: src/language/stats/npar-summary.c:148
-msgid "50th (Median)"
-msgstr ""
-
-#: src/language/stats/npar-summary.c:151
-msgid "75th"
-msgstr ""
-
 #: src/language/stats/oneway.q:169
 msgid "Number of contrast coefficients must equal the number of groups"
 msgstr ""
@@ -3568,7 +3574,7 @@
 msgid "Too many variables in INTO clause."
 msgstr ""
 
-#: src/language/stats/regression.q:167
+#: src/language/stats/regression.q:167 src/ui/gui/regression-dialog.c:42
 msgid "R"
 msgstr ""
 
@@ -4558,7 +4564,7 @@
 
 #: src/ui/gui/crosstabs-dialog.c:54 src/ui/gui/crosstabs-dialog.c:65
 #: src/ui/gui/crosstabs-dialog.c:100 src/ui/gui/crosstabs-dialog.c:108
-#: src/ui/gui/psppire-var-store.c:479 src/ui/gui/var-display.c:14
+#: src/ui/gui/psppire-var-store.c:590 src/ui/gui/var-display.c:13
 msgid "None"
 msgstr "Keine"
 
@@ -4597,6 +4603,7 @@
 msgstr ""
 
 #: src/ui/gui/crosstabs.glade:138 src/ui/gui/examine.glade:246
+#: src/ui/gui/regression.glade:31
 msgid "Statistics..."
 msgstr ""
 
@@ -4638,6 +4645,7 @@
 msgstr ""
 
 #: src/ui/gui/crosstabs.glade:439 src/ui/gui/oneway.glade:207
+#: src/ui/gui/regression.glade:324
 msgid "Statistics"
 msgstr ""
 
@@ -4645,327 +4653,335 @@
 msgid "Style of bevel around the custom entry button"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:167
+#: src/ui/gui/data-editor.c:150
 msgid "Transformations Pending"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:429
+#: src/ui/gui/data-editor.c:323
 #, fuzzy
 msgid "Labels"
 msgstr "Kennsatz"
 
-#: src/ui/gui/data-editor.c:430
+#: src/ui/gui/data-editor.c:324
 msgid "Show/hide value labels"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:448 src/ui/gui/data-editor.c:465
-#: src/ui/gui/data-editor.c:1923 src/ui/gui/data-editor.c:1976
+#: src/ui/gui/data-editor.c:342 src/ui/gui/data-editor.c:361
+#: src/ui/gui/data-editor.c:1494 src/ui/gui/data-editor.c:1546
 msgid "Clear"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:449
+#: src/ui/gui/data-editor.c:343
 msgid "Delete the cases at the selected position(s)"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:466
+#: src/ui/gui/data-editor.c:362
 msgid "Delete the variables at the selected position(s)"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:480 src/ui/gui/data-editor.c:1920
+#: src/ui/gui/data-editor.c:377 src/ui/gui/data-editor.c:1491
 #: src/ui/gui/data-editor.glade:137 src/ui/gui/data-editor.glade:808
 #, fuzzy
 msgid "Insert Variable"
 msgstr "Variableansicht"
 
-#: src/ui/gui/data-editor.c:481
+#: src/ui/gui/data-editor.c:378
 msgid "Create a new variable at the current position"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:499 src/ui/gui/data-editor.c:1973
+#: src/ui/gui/data-editor.c:396 src/ui/gui/data-editor.c:1543
 #: src/ui/gui/data-editor.glade:796
 #, fuzzy
 msgid "Insert Case"
 msgstr "_Stecken"
 
-#: src/ui/gui/data-editor.c:500
+#: src/ui/gui/data-editor.c:397
 msgid "Create a new case at the current position"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:520
+#: src/ui/gui/data-editor.c:417
 #, fuzzy
 msgid "Goto Case"
 msgstr "_Stecken"
 
-#: src/ui/gui/data-editor.c:521
+#: src/ui/gui/data-editor.c:418
 msgid "Jump to a Case in the Data Sheet"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:540
+#: src/ui/gui/data-editor.c:437
 #, fuzzy
 msgid "Weights"
 msgstr "Rechts"
 
-#: src/ui/gui/data-editor.c:541
+#: src/ui/gui/data-editor.c:438
 msgid "Weight cases by variable"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:550 src/ui/gui/data-editor.glade:312
+#: src/ui/gui/data-editor.c:447 src/ui/gui/data-editor.glade:312
 msgid "Transpose"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:551
+#: src/ui/gui/data-editor.c:448
 msgid "Transpose the cases with the variables"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:562
+#: src/ui/gui/data-editor.c:459
 #, fuzzy
 msgid "Split"
 msgstr "Alle Datei"
 
-#: src/ui/gui/data-editor.c:563
+#: src/ui/gui/data-editor.c:460
 msgid "Split the active file"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:573
+#: src/ui/gui/data-editor.c:470
 msgid "Sort"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:574
+#: src/ui/gui/data-editor.c:471
 msgid "Sort cases in the active file"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:582 src/ui/gui/data-editor.glade:347
+#: src/ui/gui/data-editor.c:479 src/ui/gui/data-editor.glade:347
 #: src/ui/gui/data-editor.glade:851
 msgid "Select Cases"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:583
+#: src/ui/gui/data-editor.c:480
 msgid "Select cases from the active file"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:592
+#: src/ui/gui/data-editor.c:489
 msgid "Compute"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:593
+#: src/ui/gui/data-editor.c:490
 #, fuzzy
 msgid "Compute new values for a variable"
 msgstr "Unpassend Wert für Variable"
 
-#: src/ui/gui/data-editor.c:601
+#: src/ui/gui/data-editor.c:498
 msgid "Oneway _ANOVA"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:602
+#: src/ui/gui/data-editor.c:499
 msgid "Perform one way analysis of variance"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:610 src/ui/gui/data-editor.glade:503
+#: src/ui/gui/data-editor.c:507 src/ui/gui/data-editor.glade:503
 msgid "_Independent Samples T Test"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:611
+#: src/ui/gui/data-editor.c:508
 msgid "Calculate T Test for samples from independent groups"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:620 src/ui/gui/data-editor.glade:511
+#: src/ui/gui/data-editor.c:517 src/ui/gui/data-editor.glade:511
 msgid "_Paired Samples T Test"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:621
+#: src/ui/gui/data-editor.c:518
 msgid "Calculate T Test for paired samples"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:630
+#: src/ui/gui/data-editor.c:527
 msgid "One _Sample T Test"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:631
+#: src/ui/gui/data-editor.c:528
 msgid "Calculate T Test for sample from a single distribution"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:640
+#: src/ui/gui/data-editor.c:537
 #, fuzzy
 msgid "Data File Comments"
 msgstr "Datei Fehler"
 
-#: src/ui/gui/data-editor.c:641
+#: src/ui/gui/data-editor.c:538
 msgid "Commentary text for the data file"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:649 src/ui/gui/data-editor.glade:776
+#: src/ui/gui/data-editor.c:546 src/ui/gui/data-editor.glade:776
 msgid "Find"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:650
+#: src/ui/gui/data-editor.c:547
 #, fuzzy
 msgid "Find Case"
 msgstr "_Stecken"
 
-#: src/ui/gui/data-editor.c:659 src/ui/gui/data-editor.glade:384
+#: src/ui/gui/data-editor.c:556 src/ui/gui/data-editor.glade:384
 #, fuzzy
 msgid "Ran_k Cases"
 msgstr "_Stecken"
 
-#: src/ui/gui/data-editor.c:660
+#: src/ui/gui/data-editor.c:557
 #, fuzzy
 msgid "Rank Cases"
 msgstr "_Stecken"
 
-#: src/ui/gui/data-editor.c:669 src/ui/gui/data-editor.glade:396
+#: src/ui/gui/data-editor.c:566 src/ui/gui/data-editor.glade:396
 #, fuzzy
 msgid "Recode into _Same Variables"
 msgstr "Variableansicht"
 
-#: src/ui/gui/data-editor.c:670
+#: src/ui/gui/data-editor.c:567
 #, fuzzy
 msgid "Recode values into the same Variables"
 msgstr "Unpassend Wert für Variable"
 
-#: src/ui/gui/data-editor.c:679 src/ui/gui/data-editor.glade:403
+#: src/ui/gui/data-editor.c:576 src/ui/gui/data-editor.glade:403
 msgid "Recode into _Different Variables"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:680
+#: src/ui/gui/data-editor.c:577
 msgid "Recode values into different Variables"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:689 src/ui/gui/data-editor.glade:286
+#: src/ui/gui/data-editor.c:586 src/ui/gui/data-editor.glade:286
 #: src/ui/gui/data-editor.glade:755
 msgid "Variables"
 msgstr "Variableansicht"
 
-#: src/ui/gui/data-editor.c:690
+#: src/ui/gui/data-editor.c:587
 #, fuzzy
 msgid "Jump to Variable"
 msgstr "Variableansicht"
 
-#: src/ui/gui/data-editor.c:698 src/ui/gui/data-editor.glade:457
+#: src/ui/gui/data-editor.c:595 src/ui/gui/data-editor.glade:457
 #: src/ui/gui/oneway.glade:179
 msgid "_Descriptives"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:699
+#: src/ui/gui/data-editor.c:596
 msgid "Calculate descriptive statistics (mean, variance, ...)"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:708 src/ui/gui/data-editor.glade:449
+#: src/ui/gui/data-editor.c:605 src/ui/gui/data-editor.glade:449
 #, fuzzy
 msgid "_Frequencies"
 msgstr "Variableansicht"
 
-#: src/ui/gui/data-editor.c:709
+#: src/ui/gui/data-editor.c:606
 msgid "Generate frequency statistics"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:717 src/ui/gui/data-editor.glade:473
+#: src/ui/gui/data-editor.c:614 src/ui/gui/data-editor.glade:473
 msgid "_Crosstabs"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:718
+#: src/ui/gui/data-editor.c:615
 msgid "Generate crosstabulations"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:727 src/ui/gui/data-editor.glade:465
+#: src/ui/gui/data-editor.c:624 src/ui/gui/data-editor.glade:465
 msgid "_Explore"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:728
+#: src/ui/gui/data-editor.c:625
 msgid "Examine Data by Factors"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1188
+#: src/ui/gui/data-editor.c:634 src/ui/gui/data-editor.glade:539
+msgid "Linear _Regression"
+msgstr ""
+
+#: src/ui/gui/data-editor.c:635
+msgid "Estimate parameters of the linear model"
+msgstr ""
+
+#: src/ui/gui/data-editor.c:1022
 msgid "Font Selection"
 msgstr "Schriftwahlung"
 
-#: src/ui/gui/data-editor.c:1397
+#: src/ui/gui/data-editor.c:1094
 msgid "No Split"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1406
+#: src/ui/gui/data-editor.c:1103
 #, fuzzy
 msgid "Split by "
 msgstr "Alle Datei"
 
-#: src/ui/gui/data-editor.c:1431
+#: src/ui/gui/data-editor.c:1128
 msgid "Filter off"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1444
+#: src/ui/gui/data-editor.c:1140
 #, c-format
 msgid "Filter by %s"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1462
+#: src/ui/gui/data-editor.c:1158
 msgid "Weights off"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1475
+#: src/ui/gui/data-editor.c:1170
 #, c-format
 msgid "Weight by %s"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1498 src/ui/gui/data-editor.c:1732
+#: src/ui/gui/data-editor.c:1193 src/ui/gui/data-editor.c:1427
 #: src/ui/gui/data-editor.glade:667
 msgid "Open"
 msgstr "Öffen"
 
-#: src/ui/gui/data-editor.c:1499
+#: src/ui/gui/data-editor.c:1194
 msgid "Open a data file"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1507 src/ui/gui/data-editor.c:1614
+#: src/ui/gui/data-editor.c:1202 src/ui/gui/data-editor.c:1309
 #: src/ui/gui/data-editor.glade:677
 msgid "Save"
 msgstr "Speichen"
 
-#: src/ui/gui/data-editor.c:1508 src/ui/gui/data-editor.c:1518
+#: src/ui/gui/data-editor.c:1203 src/ui/gui/data-editor.c:1213
 #, fuzzy
 msgid "Save data to file"
 msgstr "Speichern unter"
 
-#: src/ui/gui/data-editor.c:1517
+#: src/ui/gui/data-editor.c:1212
 #, fuzzy
 msgid "Save As"
 msgstr "Speichern unter"
 
-#: src/ui/gui/data-editor.c:1526 src/ui/gui/recode-dialog.c:930
-#: src/ui/gui/recode-dialog.c:1025
+#: src/ui/gui/data-editor.c:1221 src/ui/gui/recode-dialog.c:929
+#: src/ui/gui/recode-dialog.c:1024
 msgid "New"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1527
+#: src/ui/gui/data-editor.c:1222
 msgid "New data file"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1622 src/ui/gui/data-editor.c:1740
+#: src/ui/gui/data-editor.c:1317 src/ui/gui/data-editor.c:1435
 msgid "System Files (*.sav)"
 msgstr "Systemedatein (*.sav)"
 
-#: src/ui/gui/data-editor.c:1628 src/ui/gui/data-editor.c:1746
+#: src/ui/gui/data-editor.c:1323 src/ui/gui/data-editor.c:1441
 msgid "Portable Files (*.por) "
 msgstr "Tragbardatein (*.por)"
 
-#: src/ui/gui/data-editor.c:1634 src/ui/gui/data-editor.c:1752
+#: src/ui/gui/data-editor.c:1329 src/ui/gui/data-editor.c:1447
 #: src/ui/gui/syntax-editor.c:138 src/ui/gui/syntax-editor.c:522
 msgid "All Files"
 msgstr "Alle Datei"
 
-#: src/ui/gui/data-editor.c:1642
+#: src/ui/gui/data-editor.c:1337
 #, fuzzy
 msgid "System File"
 msgstr "Systemedatein (*.sav)"
 
-#: src/ui/gui/data-editor.c:1647
+#: src/ui/gui/data-editor.c:1342
 #, fuzzy
 msgid "Portable File"
 msgstr "Tragbardatein (*.por)"
 
-#: src/ui/gui/data-editor.c:1913
+#: src/ui/gui/data-editor.c:1485
 msgid "Sort Ascending"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1916
+#: src/ui/gui/data-editor.c:1488
 msgid "Sort Descending"
 msgstr ""
 
@@ -5044,7 +5060,7 @@
 msgstr "Glitten"
 
 #: src/ui/gui/data-editor.glade:267 src/ui/gui/data-editor.glade:871
-#: src/ui/gui/data-editor.glade:1566 src/ui/gui/data-editor.glade:1747
+#: src/ui/gui/data-editor.glade:1459 src/ui/gui/data-editor.glade:1640
 msgid "Value Labels"
 msgstr "Werten"
 
@@ -5110,10 +5126,6 @@
 msgid "Bivariate _Correlation"
 msgstr ""
 
-#: src/ui/gui/data-editor.glade:539
-msgid "Linear _Regression"
-msgstr ""
-
 #: src/ui/gui/data-editor.glade:547
 msgid "_Non-Parametric Statistics"
 msgstr ""
@@ -5187,122 +5199,114 @@
 msgid "Use Sets"
 msgstr ""
 
-#: src/ui/gui/data-editor.glade:964
-msgid "Data View"
-msgstr "Datenansicht"
-
-#: src/ui/gui/data-editor.glade:991
-msgid "Variable View"
-msgstr "Variableansicht"
-
-#: src/ui/gui/data-editor.glade:1021
+#: src/ui/gui/data-editor.glade:914
 msgid "Information Area"
 msgstr ""
 
-#: src/ui/gui/data-editor.glade:1040
+#: src/ui/gui/data-editor.glade:933
 msgid "Processor Area"
 msgstr ""
 
-#: src/ui/gui/data-editor.glade:1065
+#: src/ui/gui/data-editor.glade:958
 msgid "Case Counter Area"
 msgstr ""
 
-#: src/ui/gui/data-editor.glade:1090
+#: src/ui/gui/data-editor.glade:983
 msgid "Filter Use Status Area"
 msgstr ""
 
-#: src/ui/gui/data-editor.glade:1116
+#: src/ui/gui/data-editor.glade:1009
 msgid "Weight Status Area"
 msgstr ""
 
-#: src/ui/gui/data-editor.glade:1142
+#: src/ui/gui/data-editor.glade:1035
 #, fuzzy
 msgid "Split File Status Area"
 msgstr "Alle Datei"
 
-#: src/ui/gui/data-editor.glade:1172
+#: src/ui/gui/data-editor.glade:1065
 msgid "Variable Type"
 msgstr "Variableansicht"
 
-#: src/ui/gui/data-editor.glade:1208 src/ui/gui/psppire-var-store.c:487
+#: src/ui/gui/data-editor.glade:1101 src/ui/gui/psppire-var-store.c:598
 msgid "Comma"
 msgstr "Komma"
 
-#: src/ui/gui/data-editor.glade:1224 src/ui/gui/psppire-var-store.c:488
+#: src/ui/gui/data-editor.glade:1117 src/ui/gui/psppire-var-store.c:599
 msgid "Dot"
 msgstr "Punkt"
 
-#: src/ui/gui/data-editor.glade:1240
+#: src/ui/gui/data-editor.glade:1133
 msgid "Scientific notation"
 msgstr "Wissenschaftlichnotation"
 
-#: src/ui/gui/data-editor.glade:1256 src/ui/gui/psppire-var-store.c:490
+#: src/ui/gui/data-editor.glade:1149 src/ui/gui/psppire-var-store.c:601
 msgid "Date"
 msgstr "Datum"
 
-#: src/ui/gui/data-editor.glade:1272 src/ui/gui/psppire-var-store.c:491
+#: src/ui/gui/data-editor.glade:1165 src/ui/gui/psppire-var-store.c:602
 msgid "Dollar"
 msgstr "Euro"
 
-#: src/ui/gui/data-editor.glade:1288
+#: src/ui/gui/data-editor.glade:1181
 msgid "Custom currency"
 msgstr "Spezialwährung"
 
-#: src/ui/gui/data-editor.glade:1382
+#: src/ui/gui/data-editor.glade:1275
 msgid "positive"
 msgstr "positiv"
 
-#: src/ui/gui/data-editor.glade:1388
+#: src/ui/gui/data-editor.glade:1281
 msgid "negative"
 msgstr "negativ"
 
-#: src/ui/gui/data-editor.glade:1401
+#: src/ui/gui/data-editor.glade:1294
 msgid "Sample"
 msgstr "Muster"
 
-#: src/ui/gui/data-editor.glade:1451
+#: src/ui/gui/data-editor.glade:1344
 msgid "Width:"
 msgstr "Große:"
 
-#: src/ui/gui/data-editor.glade:1495
+#: src/ui/gui/data-editor.glade:1388
 msgid "Decimal Places:"
 msgstr "Dezimalstellen:"
 
-#: src/ui/gui/data-editor.glade:1664
+#: src/ui/gui/data-editor.glade:1557
 msgid "Value Label:"
 msgstr "Kennsatz:"
 
-#: src/ui/gui/data-editor.glade:1677 src/ui/gui/psppire.glade:2544
+#: src/ui/gui/data-editor.glade:1570 src/ui/gui/psppire.glade:2544
 #: src/ui/gui/recode.glade:185
 msgid "Value:"
 msgstr "Werte:"
 
-#: src/ui/gui/data-editor.glade:1814 src/ui/gui/examine.glade:423
+#: src/ui/gui/data-editor.glade:1707 src/ui/gui/examine.glade:423
 #: src/ui/gui/t-test.glade:460
 msgid "Missing Values"
 msgstr "Lösewerten"
 
-#: src/ui/gui/data-editor.glade:1832
+#: src/ui/gui/data-editor.glade:1725
 msgid "_Range plus one optional discrete missing value"
 msgstr "Wertebereich und ein optional Lösewert"
 
-#: src/ui/gui/data-editor.glade:1857
+#: src/ui/gui/data-editor.glade:1750
 msgid "_Low:"
 msgstr "_Tief:"
 
-#: src/ui/gui/data-editor.glade:1886
+#: src/ui/gui/data-editor.glade:1779
 msgid "_High:"
 msgstr "_Hoch:"
 
-#: src/ui/gui/data-editor.glade:1927
+#: src/ui/gui/data-editor.glade:1820
 msgid "Di_screte value:"
 msgstr "Di_skretwerte"
 
-#: src/ui/gui/data-editor.glade:1974
+#: src/ui/gui/data-editor.glade:1867
 msgid "_No missing values"
 msgstr "_Kein Lösewerten"
 
-#: src/ui/gui/data-editor.glade:1992
+#: src/ui/gui/data-editor.glade:1885
 msgid "_Discrete missing values"
 msgstr "_Diskret Lösewerten"
 
@@ -5519,7 +5523,7 @@
 msgid "Incorrect range specification"
 msgstr "Falshe Spannweitebeschreibung"
 
-#: src/ui/gui/oneway-anova-dialog.c:339
+#: src/ui/gui/oneway-anova-dialog.c:336
 #, c-format
 msgid "Contrast %d of %d"
 msgstr ""
@@ -5612,24 +5616,70 @@
 msgid "Paste"
 msgstr "Datum"
 
-#: src/ui/gui/psppire.c:197
-msgid "_Reset"
-msgstr "_Zurücksetzen"
+#: src/ui/gui/psppire-data-editor.c:604
+msgid "Data View"
+msgstr "Datenansicht"
 
-#: src/ui/gui/psppire.c:198
-#, fuzzy
-msgid "_Select"
-msgstr "Schriftwahlung"
+#: src/ui/gui/psppire-data-editor.c:607
+msgid "Variable View"
+msgstr "Variableansicht"
 
 #: src/ui/gui/psppire-data-store.c:827
 msgid "var"
 msgstr ""
 
-#: src/ui/gui/psppire-data-store.c:948 src/ui/gui/psppire-var-store.c:728
+#: src/ui/gui/psppire-data-store.c:948 src/ui/gui/psppire-var-store.c:839
 #, c-format
 msgid "%ld"
 msgstr ""
 
+#: src/ui/gui/psppire-var-sheet.c:96
+msgid "Name"
+msgstr "Name"
+
+#: src/ui/gui/psppire-var-sheet.c:98 src/ui/gui/psppire.glade:2187
+msgid "Width"
+msgstr "Große"
+
+#: src/ui/gui/psppire-var-sheet.c:99
+msgid "Decimals"
+msgstr "Dezimalstellen"
+
+#: src/ui/gui/psppire-var-sheet.c:101
+msgid "Values"
+msgstr "Werten"
+
+#: src/ui/gui/psppire-var-sheet.c:104
+msgid "Align"
+msgstr "Einstellung"
+
+#: src/ui/gui/psppire-var-sheet.c:105
+msgid "Measure"
+msgstr "Messe"
+
+#: src/ui/gui/psppire-var-store.c:600
+msgid "Scientific"
+msgstr "Wissenschäflich"
+
+#: src/ui/gui/psppire-var-store.c:603
+msgid "Custom"
+msgstr "Spezial"
+
+#: src/ui/gui/psppire-var-store.c:674 src/ui/gui/psppire-var-store.c:684
+#: src/ui/gui/psppire-var-store.c:694
+#, c-format
+msgid "%d"
+msgstr ""
+
+#: src/ui/gui/psppire.c:195
+msgid "_Reset"
+msgstr "_Zurücksetzen"
+
+#: src/ui/gui/psppire.c:196
+#, fuzzy
+msgid "_Select"
+msgstr "Schriftwahlung"
+
 #: src/ui/gui/psppire.glade:11
 #, fuzzy
 msgid "This is pre-alpha software.  Use at your own risk."
@@ -5826,10 +5876,6 @@
 msgid "Use expression as label"
 msgstr ""
 
-#: src/ui/gui/psppire.glade:2187 src/ui/gui/var-sheet.c:67
-msgid "Width"
-msgstr "Große"
-
 #: src/ui/gui/psppire.glade:2274
 msgid "Goto Case Number:"
 msgstr ""
@@ -5865,20 +5911,6 @@
 msgid "Search backward"
 msgstr ""
 
-#: src/ui/gui/psppire-var-store.c:489
-msgid "Scientific"
-msgstr "Wissenschäflich"
-
-#: src/ui/gui/psppire-var-store.c:492
-msgid "Custom"
-msgstr "Spezial"
-
-#: src/ui/gui/psppire-var-store.c:563 src/ui/gui/psppire-var-store.c:573
-#: src/ui/gui/psppire-var-store.c:583
-#, c-format
-msgid "%d"
-msgstr ""
-
 #: src/ui/gui/rank.glade:111
 msgid "By:"
 msgstr ""
@@ -5962,48 +5994,48 @@
 msgid "Proportion Estimation Formula"
 msgstr ""
 
-#: src/ui/gui/rank.glade:615
+#: src/ui/gui/rank.glade:614
 msgid "_Mean"
 msgstr ""
 
-#: src/ui/gui/rank.glade:627
+#: src/ui/gui/rank.glade:626
 #, fuzzy
 msgid "_Low"
 msgstr "_Tief:"
 
-#: src/ui/gui/rank.glade:643
+#: src/ui/gui/rank.glade:642
 #, fuzzy
 msgid "_High"
 msgstr "_Hoch:"
 
-#: src/ui/gui/rank.glade:661
+#: src/ui/gui/rank.glade:660
 msgid "_Sequential ranks to unique values"
 msgstr ""
 
-#: src/ui/gui/rank.glade:681
+#: src/ui/gui/rank.glade:680
 msgid "Rank Assigned to Ties"
 msgstr ""
 
-#: src/ui/gui/recode-dialog.c:881
+#: src/ui/gui/recode-dialog.c:880
 #, fuzzy
 msgid "Recode into Different Variables"
 msgstr "Variableansicht"
 
-#: src/ui/gui/recode-dialog.c:884
+#: src/ui/gui/recode-dialog.c:883
 #, fuzzy
 msgid "Recode into Same Variables"
 msgstr "Variableansicht"
 
-#: src/ui/gui/recode-dialog.c:915 src/ui/gui/recode-dialog.c:1017
+#: src/ui/gui/recode-dialog.c:914 src/ui/gui/recode-dialog.c:1016
 msgid "Old"
 msgstr ""
 
-#: src/ui/gui/recode-dialog.c:1276
+#: src/ui/gui/recode-dialog.c:1275
 #, fuzzy
 msgid "Recode into Different Variables: Old and New Values "
 msgstr "Variableansicht"
 
-#: src/ui/gui/recode-dialog.c:1277
+#: src/ui/gui/recode-dialog.c:1276
 #, fuzzy
 msgid "Recode into Same Variables: Old and New Values"
 msgstr "Variableansicht"
@@ -6099,6 +6131,42 @@
 msgid "Old and New Values"
 msgstr "Werte:"
 
+#: src/ui/gui/regression-dialog.c:41
+msgid "Coeff"
+msgstr ""
+
+#: src/ui/gui/regression-dialog.c:43
+msgid "Anova"
+msgstr ""
+
+#: src/ui/gui/regression-dialog.c:44
+msgid "Bcov"
+msgstr ""
+
+#: src/ui/gui/regression.glade:41
+#, fuzzy
+msgid "Save..."
+msgstr "Muster"
+
+#: src/ui/gui/regression.glade:145
+#, fuzzy
+msgid "Dependent"
+msgstr "Variableansicht"
+
+#: src/ui/gui/regression.glade:193
+#, fuzzy
+msgid "Independent"
+msgstr "Variableansicht"
+
+#: src/ui/gui/regression.glade:243
+#, fuzzy
+msgid "Predicted values"
+msgstr "Variableansicht"
+
+#: src/ui/gui/regression.glade:253
+msgid "Residuals"
+msgstr ""
+
 #: src/ui/gui/select-cases-dialog.c:85
 #, c-format
 msgid "Approximately %3d%% of all cases."
@@ -6158,6 +6226,19 @@
 msgid "To End"
 msgstr ""
 
+#: src/ui/gui/t-test-options.c:60
+#, c-format
+msgid "Confidence Interval: %2d %%"
+msgstr ""
+
+#: src/ui/gui/t-test-paired-samples.c:229
+msgid "Var 1"
+msgstr ""
+
+#: src/ui/gui/t-test-paired-samples.c:230
+msgid "Var 2"
+msgstr ""
+
 #: src/ui/gui/t-test.glade:56 src/ui/gui/t-test.glade:165
 msgid "Define Groups"
 msgstr ""
@@ -6197,19 +6278,6 @@
 msgid "Test Value: "
 msgstr "Werte:"
 
-#: src/ui/gui/t-test-options.c:60
-#, c-format
-msgid "Confidence Interval: %2d %%"
-msgstr ""
-
-#: src/ui/gui/t-test-paired-samples.c:232
-msgid "Var 1"
-msgstr ""
-
-#: src/ui/gui/t-test-paired-samples.c:233
-msgid "Var 2"
-msgstr ""
-
 #: src/ui/gui/variable-info-dialog.c:88
 #, fuzzy, c-format
 msgid "Label: %s\n"
@@ -6240,26 +6308,6 @@
 msgid "%s %s\n"
 msgstr ""
 
-#: src/ui/gui/var-sheet.c:65
-msgid "Name"
-msgstr "Name"
-
-#: src/ui/gui/var-sheet.c:68
-msgid "Decimals"
-msgstr "Dezimalstellen"
-
-#: src/ui/gui/var-sheet.c:70
-msgid "Values"
-msgstr "Werten"
-
-#: src/ui/gui/var-sheet.c:73
-msgid "Align"
-msgstr "Einstellung"
-
-#: src/ui/gui/var-sheet.c:74
-msgid "Measure"
-msgstr "Messe"
-
 #: src/ui/gui/weight-cases-dialog.c:88
 #, c-format
 msgid "Weight cases by %s"

Index: po/en_GB.po
===================================================================
RCS file: /sources/pspp/pspp/po/en_GB.po,v
retrieving revision 1.113
retrieving revision 1.114
diff -u -b -r1.113 -r1.114
--- po/en_GB.po 20 Feb 2008 04:43:37 -0000      1.113
+++ po/en_GB.po 29 Feb 2008 09:13:51 -0000      1.114
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: PSPP 0.4.3\n"
 "Report-Msgid-Bugs-To: address@hidden"
-"POT-Creation-Date: 2008-02-20 13:21+0900\n"
+"POT-Creation-Date: 2008-02-29 17:22+0900\n"
 "PO-Revision-Date: 2007-09-15 08:29+0800\n"
 "Last-Translator: John Darrington <address@hidden>\n"
 "Language-Team: John Darrington <address@hidden>\n"
@@ -44,12 +44,6 @@
 msgid "Date %04d-%d-%d is before the earliest acceptable date of 1582-10-15."
 msgstr ""
 
-#: src/data/casereader-filter.c:221
-msgid ""
-"At least one case in the data read had a weight value that was user-missing, "
-"system-missing, zero, or negative.  These case(s) were ignored."
-msgstr ""
-
 #: src/data/case-tmpfile.c:57
 msgid "failed to create temporary file"
 msgstr ""
@@ -70,6 +64,12 @@
 msgid "writing to temporary file"
 msgstr ""
 
+#: src/data/casereader-filter.c:221
+msgid ""
+"At least one case in the data read had a weight value that was user-missing, "
+"system-missing, zero, or negative.  These case(s) were ignored."
+msgstr ""
+
 #: src/data/data-in.c:257 src/data/data-in.c:447
 msgid "Field contents are not numeric."
 msgstr ""
@@ -315,14 +315,14 @@
 msgstr ""
 
 #: src/data/format.c:327 src/data/sys-file-reader.c:639
-#: src/ui/gui/data-editor.glade:1304 src/ui/gui/psppire.glade:2176
-#: src/ui/gui/psppire-var-store.c:493
+#: src/ui/gui/data-editor.glade:1197 src/ui/gui/psppire-var-store.c:604
+#: src/ui/gui/psppire.glade:2176
 msgid "String"
 msgstr ""
 
 #: src/data/format.c:327 src/data/sys-file-reader.c:639
-#: src/ui/gui/data-editor.glade:1193 src/ui/gui/psppire.glade:2131
-#: src/ui/gui/psppire-var-store.c:486
+#: src/ui/gui/data-editor.glade:1086 src/ui/gui/psppire-var-store.c:597
+#: src/ui/gui/psppire.glade:2131
 msgid "Numeric"
 msgstr ""
 
@@ -1279,7 +1279,7 @@
 msgstr ""
 
 #: src/language/data-io/data-parser.c:643 src/language/data-io/print.c:404
-#: src/ui/gui/crosstabs.glade:92 src/ui/gui/var-sheet.c:72
+#: src/ui/gui/crosstabs.glade:92 src/ui/gui/psppire-var-sheet.c:103
 msgid "Columns"
 msgstr ""
 
@@ -1418,6 +1418,67 @@
 msgid "Handle for %s not allowed here."
 msgstr ""
 
+#: src/language/data-io/get-data.c:62
+#, c-format
+msgid "Unsupported TYPE %s"
+msgstr ""
+
+#: src/language/data-io/get-data.c:258
+#, c-format
+msgid ""
+"%s is allowed only with %s arrangement, but %s arrangement was stated or "
+"implied earlier in this command."
+msgstr ""
+
+#: src/language/data-io/get-data.c:313
+msgid "expecting FIXED or DELIMITED"
+msgstr ""
+
+#: src/language/data-io/get-data.c:326
+msgid "Value of FIRSTCASE must be 1 or greater."
+msgstr ""
+
+#: src/language/data-io/get-data.c:351
+msgid "expecting LINE or VARIABLES"
+msgstr ""
+
+#: src/language/data-io/get-data.c:364
+msgid "Value of FIXCASE must be at least 1."
+msgstr ""
+
+#: src/language/data-io/get-data.c:384
+msgid "Value of FIRST must be at least 1."
+msgstr ""
+
+#: src/language/data-io/get-data.c:396
+msgid "Value of PERCENT must be between 1 and 100."
+msgstr ""
+
+#: src/language/data-io/get-data.c:445
+msgid ""
+"In compatible syntax mode, the QUALIFIER string must contain exactly one "
+"character."
+msgstr ""
+
+#: src/language/data-io/get-data.c:460
+msgid "expecting VARIABLES"
+msgstr ""
+
+#: src/language/data-io/get-data.c:482
+#: src/language/data-io/placement-parser.c:376
+#, c-format
+msgid ""
+"The record number specified, %ld, is at or before the previous record, %d.  "
+"Data fields must be listed in order of increasing record number."
+msgstr ""
+
+#: src/language/data-io/get-data.c:491
+#, c-format
+msgid ""
+"The record number specified, %ld, exceeds the number of records per case "
+"specified on FIXCASE, %d."
+msgstr ""
+
 #: src/language/data-io/get.c:99
 msgid "expecting COMM or TAPE"
 msgstr ""
@@ -1507,67 +1568,6 @@
 "variable in earlier file (%s)."
 msgstr ""
 
-#: src/language/data-io/get-data.c:62
-#, c-format
-msgid "Unsupported TYPE %s"
-msgstr ""
-
-#: src/language/data-io/get-data.c:258
-#, c-format
-msgid ""
-"%s is allowed only with %s arrangement, but %s arrangement was stated or "
-"implied earlier in this command."
-msgstr ""
-
-#: src/language/data-io/get-data.c:313
-msgid "expecting FIXED or DELIMITED"
-msgstr ""
-
-#: src/language/data-io/get-data.c:326
-msgid "Value of FIRSTCASE must be 1 or greater."
-msgstr ""
-
-#: src/language/data-io/get-data.c:351
-msgid "expecting LINE or VARIABLES"
-msgstr ""
-
-#: src/language/data-io/get-data.c:364
-msgid "Value of FIXCASE must be at least 1."
-msgstr ""
-
-#: src/language/data-io/get-data.c:384
-msgid "Value of FIRST must be at least 1."
-msgstr ""
-
-#: src/language/data-io/get-data.c:396
-msgid "Value of PERCENT must be between 1 and 100."
-msgstr ""
-
-#: src/language/data-io/get-data.c:445
-msgid ""
-"In compatible syntax mode, the QUALIFIER string must contain exactly one "
-"character."
-msgstr ""
-
-#: src/language/data-io/get-data.c:460
-msgid "expecting VARIABLES"
-msgstr ""
-
-#: src/language/data-io/get-data.c:482
-#: src/language/data-io/placement-parser.c:376
-#, c-format
-msgid ""
-"The record number specified, %ld, is at or before the previous record, %d.  "
-"Data fields must be listed in order of increasing record number."
-msgstr ""
-
-#: src/language/data-io/get-data.c:491
-#, c-format
-msgid ""
-"The record number specified, %ld, exceeds the number of records per case "
-"specified on FIXCASE, %d."
-msgstr ""
-
 #: src/language/data-io/inpt-pgm.c:129
 msgid "Unexpected end-of-file within INPUT PROGRAM."
 msgstr ""
@@ -1657,6 +1657,20 @@
 msgid "The ending column for a field must be greater than the starting column."
 msgstr ""
 
+#: src/language/data-io/print-space.c:73 src/language/lexer/lexer.c:476
+#: src/language/stats/autorecode.c:154 src/language/xforms/select-if.c:60
+msgid "expecting end of command"
+msgstr ""
+
+#: src/language/data-io/print-space.c:116
+msgid "The expression on PRINT SPACE evaluated to the system-missing value."
+msgstr ""
+
+#: src/language/data-io/print-space.c:119
+#, c-format
+msgid "The expression on PRINT SPACE evaluated to %g."
+msgstr ""
+
 #: src/language/data-io/print.c:265
 #, c-format
 msgid "Output calls for %d records but %zu specified on RECORDS subcommand."
@@ -1676,20 +1690,6 @@
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/language/data-io/print-space.c:73 src/language/lexer/lexer.c:476
-#: src/language/stats/autorecode.c:154 src/language/xforms/select-if.c:60
-msgid "expecting end of command"
-msgstr ""
-
-#: src/language/data-io/print-space.c:116
-msgid "The expression on PRINT SPACE evaluated to the system-missing value."
-msgstr ""
-
-#: src/language/data-io/print-space.c:119
-#, c-format
-msgid "The expression on PRINT SPACE evaluated to %g."
-msgstr ""
-
 #: src/language/dictionary/apply-dictionary.c:75
 #, c-format
 msgid "Variable %s is %s in target file, but %s in source file."
@@ -1875,7 +1875,7 @@
 #: src/language/dictionary/split-file.c:86
 #: src/language/dictionary/sys-file-info.c:397
 #: src/language/dictionary/sys-file-info.c:564 src/ui/gui/crosstabs.glade:275
-#: src/ui/gui/psppire.glade:2099 src/ui/gui/var-sheet.c:69
+#: src/ui/gui/psppire-var-sheet.c:100 src/ui/gui/psppire.glade:2099
 msgid "Label"
 msgstr ""
 
@@ -2038,15 +2038,18 @@
 msgid "Measure: %s"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:495 src/ui/gui/var-sheet.c:87
+#: src/language/dictionary/sys-file-info.c:495
+#: src/ui/gui/psppire-var-sheet.c:119
 msgid "Nominal"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:496 src/ui/gui/var-sheet.c:88
+#: src/language/dictionary/sys-file-info.c:496
+#: src/ui/gui/psppire-var-sheet.c:120
 msgid "Ordinal"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:497 src/ui/gui/var-sheet.c:89
+#: src/language/dictionary/sys-file-info.c:497
+#: src/ui/gui/psppire-var-sheet.c:121
 msgid "Scale"
 msgstr ""
 
@@ -2055,15 +2058,18 @@
 msgid "Display Alignment: %s"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:501 src/ui/gui/var-sheet.c:80
+#: src/language/dictionary/sys-file-info.c:501
+#: src/ui/gui/psppire-var-sheet.c:112
 msgid "Left"
 msgstr ""
 
-#: src/language/dictionary/sys-file-info.c:502 src/ui/gui/var-sheet.c:82
+#: src/language/dictionary/sys-file-info.c:502
+#: src/ui/gui/psppire-var-sheet.c:114
 msgid "Center"
 msgstr "Centre"
 
-#: src/language/dictionary/sys-file-info.c:503 src/ui/gui/var-sheet.c:81
+#: src/language/dictionary/sys-file-info.c:503
+#: src/ui/gui/psppire-var-sheet.c:113
 msgid "Right"
 msgstr ""
 
@@ -2736,7 +2742,7 @@
 
 #: src/language/stats/crosstabs.q:859 src/language/stats/examine.q:917
 #: src/language/stats/frequencies.q:1128 src/language/stats/frequencies.q:1407
-#: src/ui/gui/var-sheet.c:71
+#: src/ui/gui/psppire-var-sheet.c:102
 msgid "Missing"
 msgstr ""
 
@@ -2839,8 +2845,8 @@
 msgid "Directional measures."
 msgstr ""
 
-#: src/language/stats/crosstabs.q:1221 src/ui/gui/psppire.glade:2223
-#: src/ui/gui/var-sheet.c:66
+#: src/language/stats/crosstabs.q:1221 src/ui/gui/psppire-var-sheet.c:97
+#: src/ui/gui/psppire.glade:2223
 msgid "Type"
 msgstr ""
 
@@ -3371,6 +3377,22 @@
 msgid "TABLES subcommand may not appear more than once."
 msgstr ""
 
+#: src/language/stats/npar-summary.c:108
+msgid "Descriptive Statistics"
+msgstr ""
+
+#: src/language/stats/npar-summary.c:145
+msgid "25th"
+msgstr ""
+
+#: src/language/stats/npar-summary.c:148
+msgid "50th (Median)"
+msgstr ""
+
+#: src/language/stats/npar-summary.c:151
+msgid "75th"
+msgstr ""
+
 #: src/language/stats/npar.q:98
 msgid "NPAR subcommand not currently implemented."
 msgstr ""
@@ -3395,22 +3417,6 @@
 "not match the number following (%zu)."
 msgstr ""
 
-#: src/language/stats/npar-summary.c:108
-msgid "Descriptive Statistics"
-msgstr ""
-
-#: src/language/stats/npar-summary.c:145
-msgid "25th"
-msgstr ""
-
-#: src/language/stats/npar-summary.c:148
-msgid "50th (Median)"
-msgstr ""
-
-#: src/language/stats/npar-summary.c:151
-msgid "75th"
-msgstr ""
-
 #: src/language/stats/oneway.q:169
 msgid "Number of contrast coefficients must equal the number of groups"
 msgstr ""
@@ -3559,7 +3565,7 @@
 msgid "Too many variables in INTO clause."
 msgstr ""
 
-#: src/language/stats/regression.q:167
+#: src/language/stats/regression.q:167 src/ui/gui/regression-dialog.c:42
 msgid "R"
 msgstr ""
 
@@ -4549,7 +4555,7 @@
 
 #: src/ui/gui/crosstabs-dialog.c:54 src/ui/gui/crosstabs-dialog.c:65
 #: src/ui/gui/crosstabs-dialog.c:100 src/ui/gui/crosstabs-dialog.c:108
-#: src/ui/gui/psppire-var-store.c:479 src/ui/gui/var-display.c:14
+#: src/ui/gui/psppire-var-store.c:590 src/ui/gui/var-display.c:13
 msgid "None"
 msgstr ""
 
@@ -4586,6 +4592,7 @@
 msgstr ""
 
 #: src/ui/gui/crosstabs.glade:138 src/ui/gui/examine.glade:246
+#: src/ui/gui/regression.glade:31
 msgid "Statistics..."
 msgstr ""
 
@@ -4622,6 +4629,7 @@
 msgstr ""
 
 #: src/ui/gui/crosstabs.glade:439 src/ui/gui/oneway.glade:207
+#: src/ui/gui/regression.glade:324
 msgid "Statistics"
 msgstr ""
 
@@ -4629,307 +4637,315 @@
 msgid "Style of bevel around the custom entry button"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:167
+#: src/ui/gui/data-editor.c:150
 msgid "Transformations Pending"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:429
+#: src/ui/gui/data-editor.c:323
 msgid "Labels"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:430
+#: src/ui/gui/data-editor.c:324
 msgid "Show/hide value labels"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:448 src/ui/gui/data-editor.c:465
-#: src/ui/gui/data-editor.c:1923 src/ui/gui/data-editor.c:1976
+#: src/ui/gui/data-editor.c:342 src/ui/gui/data-editor.c:361
+#: src/ui/gui/data-editor.c:1494 src/ui/gui/data-editor.c:1546
 msgid "Clear"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:449
+#: src/ui/gui/data-editor.c:343
 msgid "Delete the cases at the selected position(s)"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:466
+#: src/ui/gui/data-editor.c:362
 msgid "Delete the variables at the selected position(s)"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:480 src/ui/gui/data-editor.c:1920
+#: src/ui/gui/data-editor.c:377 src/ui/gui/data-editor.c:1491
 #: src/ui/gui/data-editor.glade:137 src/ui/gui/data-editor.glade:808
 msgid "Insert Variable"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:481
+#: src/ui/gui/data-editor.c:378
 msgid "Create a new variable at the current position"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:499 src/ui/gui/data-editor.c:1973
+#: src/ui/gui/data-editor.c:396 src/ui/gui/data-editor.c:1543
 #: src/ui/gui/data-editor.glade:796
 msgid "Insert Case"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:500
+#: src/ui/gui/data-editor.c:397
 msgid "Create a new case at the current position"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:520
+#: src/ui/gui/data-editor.c:417
 msgid "Goto Case"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:521
+#: src/ui/gui/data-editor.c:418
 msgid "Jump to a Case in the Data Sheet"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:540
+#: src/ui/gui/data-editor.c:437
 msgid "Weights"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:541
+#: src/ui/gui/data-editor.c:438
 msgid "Weight cases by variable"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:550 src/ui/gui/data-editor.glade:312
+#: src/ui/gui/data-editor.c:447 src/ui/gui/data-editor.glade:312
 msgid "Transpose"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:551
+#: src/ui/gui/data-editor.c:448
 msgid "Transpose the cases with the variables"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:562
+#: src/ui/gui/data-editor.c:459
 msgid "Split"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:563
+#: src/ui/gui/data-editor.c:460
 msgid "Split the active file"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:573
+#: src/ui/gui/data-editor.c:470
 msgid "Sort"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:574
+#: src/ui/gui/data-editor.c:471
 msgid "Sort cases in the active file"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:582 src/ui/gui/data-editor.glade:347
+#: src/ui/gui/data-editor.c:479 src/ui/gui/data-editor.glade:347
 #: src/ui/gui/data-editor.glade:851
 msgid "Select Cases"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:583
+#: src/ui/gui/data-editor.c:480
 msgid "Select cases from the active file"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:592
+#: src/ui/gui/data-editor.c:489
 msgid "Compute"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:593
+#: src/ui/gui/data-editor.c:490
 msgid "Compute new values for a variable"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:601
+#: src/ui/gui/data-editor.c:498
 msgid "Oneway _ANOVA"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:602
+#: src/ui/gui/data-editor.c:499
 msgid "Perform one way analysis of variance"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:610 src/ui/gui/data-editor.glade:503
+#: src/ui/gui/data-editor.c:507 src/ui/gui/data-editor.glade:503
 msgid "_Independent Samples T Test"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:611
+#: src/ui/gui/data-editor.c:508
 msgid "Calculate T Test for samples from independent groups"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:620 src/ui/gui/data-editor.glade:511
+#: src/ui/gui/data-editor.c:517 src/ui/gui/data-editor.glade:511
 msgid "_Paired Samples T Test"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:621
+#: src/ui/gui/data-editor.c:518
 msgid "Calculate T Test for paired samples"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:630
+#: src/ui/gui/data-editor.c:527
 msgid "One _Sample T Test"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:631
+#: src/ui/gui/data-editor.c:528
 msgid "Calculate T Test for sample from a single distribution"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:640
+#: src/ui/gui/data-editor.c:537
 msgid "Data File Comments"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:641
+#: src/ui/gui/data-editor.c:538
 msgid "Commentary text for the data file"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:649 src/ui/gui/data-editor.glade:776
+#: src/ui/gui/data-editor.c:546 src/ui/gui/data-editor.glade:776
 msgid "Find"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:650
+#: src/ui/gui/data-editor.c:547
 msgid "Find Case"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:659 src/ui/gui/data-editor.glade:384
+#: src/ui/gui/data-editor.c:556 src/ui/gui/data-editor.glade:384
 msgid "Ran_k Cases"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:660
+#: src/ui/gui/data-editor.c:557
 msgid "Rank Cases"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:669 src/ui/gui/data-editor.glade:396
+#: src/ui/gui/data-editor.c:566 src/ui/gui/data-editor.glade:396
 msgid "Recode into _Same Variables"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:670
+#: src/ui/gui/data-editor.c:567
 msgid "Recode values into the same Variables"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:679 src/ui/gui/data-editor.glade:403
+#: src/ui/gui/data-editor.c:576 src/ui/gui/data-editor.glade:403
 msgid "Recode into _Different Variables"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:680
+#: src/ui/gui/data-editor.c:577
 msgid "Recode values into different Variables"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:689 src/ui/gui/data-editor.glade:286
+#: src/ui/gui/data-editor.c:586 src/ui/gui/data-editor.glade:286
 #: src/ui/gui/data-editor.glade:755
 msgid "Variables"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:690
+#: src/ui/gui/data-editor.c:587
 msgid "Jump to Variable"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:698 src/ui/gui/data-editor.glade:457
+#: src/ui/gui/data-editor.c:595 src/ui/gui/data-editor.glade:457
 #: src/ui/gui/oneway.glade:179
 msgid "_Descriptives"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:699
+#: src/ui/gui/data-editor.c:596
 msgid "Calculate descriptive statistics (mean, variance, ...)"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:708 src/ui/gui/data-editor.glade:449
+#: src/ui/gui/data-editor.c:605 src/ui/gui/data-editor.glade:449
 msgid "_Frequencies"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:709
+#: src/ui/gui/data-editor.c:606
 msgid "Generate frequency statistics"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:717 src/ui/gui/data-editor.glade:473
+#: src/ui/gui/data-editor.c:614 src/ui/gui/data-editor.glade:473
 msgid "_Crosstabs"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:718
+#: src/ui/gui/data-editor.c:615
 msgid "Generate crosstabulations"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:727 src/ui/gui/data-editor.glade:465
+#: src/ui/gui/data-editor.c:624 src/ui/gui/data-editor.glade:465
 msgid "_Explore"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:728
+#: src/ui/gui/data-editor.c:625
 msgid "Examine Data by Factors"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1188
+#: src/ui/gui/data-editor.c:634 src/ui/gui/data-editor.glade:539
+msgid "Linear _Regression"
+msgstr ""
+
+#: src/ui/gui/data-editor.c:635
+msgid "Estimate parameters of the linear model"
+msgstr ""
+
+#: src/ui/gui/data-editor.c:1022
 msgid "Font Selection"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1397
+#: src/ui/gui/data-editor.c:1094
 msgid "No Split"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1406
+#: src/ui/gui/data-editor.c:1103
 msgid "Split by "
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1431
+#: src/ui/gui/data-editor.c:1128
 msgid "Filter off"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1444
+#: src/ui/gui/data-editor.c:1140
 #, c-format
 msgid "Filter by %s"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1462
+#: src/ui/gui/data-editor.c:1158
 msgid "Weights off"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1475
+#: src/ui/gui/data-editor.c:1170
 #, c-format
 msgid "Weight by %s"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1498 src/ui/gui/data-editor.c:1732
+#: src/ui/gui/data-editor.c:1193 src/ui/gui/data-editor.c:1427
 #: src/ui/gui/data-editor.glade:667
 msgid "Open"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1499
+#: src/ui/gui/data-editor.c:1194
 msgid "Open a data file"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1507 src/ui/gui/data-editor.c:1614
+#: src/ui/gui/data-editor.c:1202 src/ui/gui/data-editor.c:1309
 #: src/ui/gui/data-editor.glade:677
 msgid "Save"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1508 src/ui/gui/data-editor.c:1518
+#: src/ui/gui/data-editor.c:1203 src/ui/gui/data-editor.c:1213
 msgid "Save data to file"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1517
+#: src/ui/gui/data-editor.c:1212
 msgid "Save As"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1526 src/ui/gui/recode-dialog.c:930
-#: src/ui/gui/recode-dialog.c:1025
+#: src/ui/gui/data-editor.c:1221 src/ui/gui/recode-dialog.c:929
+#: src/ui/gui/recode-dialog.c:1024
 msgid "New"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1527
+#: src/ui/gui/data-editor.c:1222
 msgid "New data file"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1622 src/ui/gui/data-editor.c:1740
+#: src/ui/gui/data-editor.c:1317 src/ui/gui/data-editor.c:1435
 msgid "System Files (*.sav)"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1628 src/ui/gui/data-editor.c:1746
+#: src/ui/gui/data-editor.c:1323 src/ui/gui/data-editor.c:1441
 msgid "Portable Files (*.por) "
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1634 src/ui/gui/data-editor.c:1752
+#: src/ui/gui/data-editor.c:1329 src/ui/gui/data-editor.c:1447
 #: src/ui/gui/syntax-editor.c:138 src/ui/gui/syntax-editor.c:522
 msgid "All Files"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1642
+#: src/ui/gui/data-editor.c:1337
 msgid "System File"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1647
+#: src/ui/gui/data-editor.c:1342
 msgid "Portable File"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1913
+#: src/ui/gui/data-editor.c:1485
 msgid "Sort Ascending"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1916
+#: src/ui/gui/data-editor.c:1488
 msgid "Sort Descending"
 msgstr ""
 
@@ -5003,7 +5019,7 @@
 msgstr ""
 
 #: src/ui/gui/data-editor.glade:267 src/ui/gui/data-editor.glade:871
-#: src/ui/gui/data-editor.glade:1566 src/ui/gui/data-editor.glade:1747
+#: src/ui/gui/data-editor.glade:1459 src/ui/gui/data-editor.glade:1640
 msgid "Value Labels"
 msgstr ""
 
@@ -5067,10 +5083,6 @@
 msgid "Bivariate _Correlation"
 msgstr ""
 
-#: src/ui/gui/data-editor.glade:539
-msgid "Linear _Regression"
-msgstr ""
-
 #: src/ui/gui/data-editor.glade:547
 msgid "_Non-Parametric Statistics"
 msgstr ""
@@ -5140,121 +5152,113 @@
 msgid "Use Sets"
 msgstr ""
 
-#: src/ui/gui/data-editor.glade:964
-msgid "Data View"
-msgstr ""
-
-#: src/ui/gui/data-editor.glade:991
-msgid "Variable View"
-msgstr ""
-
-#: src/ui/gui/data-editor.glade:1021
+#: src/ui/gui/data-editor.glade:914
 msgid "Information Area"
 msgstr ""
 
-#: src/ui/gui/data-editor.glade:1040
+#: src/ui/gui/data-editor.glade:933
 msgid "Processor Area"
 msgstr ""
 
-#: src/ui/gui/data-editor.glade:1065
+#: src/ui/gui/data-editor.glade:958
 msgid "Case Counter Area"
 msgstr ""
 
-#: src/ui/gui/data-editor.glade:1090
+#: src/ui/gui/data-editor.glade:983
 msgid "Filter Use Status Area"
 msgstr ""
 
-#: src/ui/gui/data-editor.glade:1116
+#: src/ui/gui/data-editor.glade:1009
 msgid "Weight Status Area"
 msgstr ""
 
-#: src/ui/gui/data-editor.glade:1142
+#: src/ui/gui/data-editor.glade:1035
 msgid "Split File Status Area"
 msgstr ""
 
-#: src/ui/gui/data-editor.glade:1172
+#: src/ui/gui/data-editor.glade:1065
 msgid "Variable Type"
 msgstr ""
 
-#: src/ui/gui/data-editor.glade:1208 src/ui/gui/psppire-var-store.c:487
+#: src/ui/gui/data-editor.glade:1101 src/ui/gui/psppire-var-store.c:598
 msgid "Comma"
 msgstr ""
 
-#: src/ui/gui/data-editor.glade:1224 src/ui/gui/psppire-var-store.c:488
+#: src/ui/gui/data-editor.glade:1117 src/ui/gui/psppire-var-store.c:599
 msgid "Dot"
 msgstr ""
 
-#: src/ui/gui/data-editor.glade:1240
+#: src/ui/gui/data-editor.glade:1133
 msgid "Scientific notation"
 msgstr ""
 
-#: src/ui/gui/data-editor.glade:1256 src/ui/gui/psppire-var-store.c:490
+#: src/ui/gui/data-editor.glade:1149 src/ui/gui/psppire-var-store.c:601
 msgid "Date"
 msgstr ""
 
-#: src/ui/gui/data-editor.glade:1272 src/ui/gui/psppire-var-store.c:491
+#: src/ui/gui/data-editor.glade:1165 src/ui/gui/psppire-var-store.c:602
 msgid "Dollar"
 msgstr ""
 
-#: src/ui/gui/data-editor.glade:1288
+#: src/ui/gui/data-editor.glade:1181
 msgid "Custom currency"
 msgstr ""
 
-#: src/ui/gui/data-editor.glade:1382
+#: src/ui/gui/data-editor.glade:1275
 msgid "positive"
 msgstr ""
 
-#: src/ui/gui/data-editor.glade:1388
+#: src/ui/gui/data-editor.glade:1281
 msgid "negative"
 msgstr ""
 
-#: src/ui/gui/data-editor.glade:1401
+#: src/ui/gui/data-editor.glade:1294
 msgid "Sample"
 msgstr ""
 
-#: src/ui/gui/data-editor.glade:1451
+#: src/ui/gui/data-editor.glade:1344
 msgid "Width:"
 msgstr ""
 
-#: src/ui/gui/data-editor.glade:1495
+#: src/ui/gui/data-editor.glade:1388
 msgid "Decimal Places:"
 msgstr ""
 
-#: src/ui/gui/data-editor.glade:1664
+#: src/ui/gui/data-editor.glade:1557
 msgid "Value Label:"
 msgstr ""
 
-#: src/ui/gui/data-editor.glade:1677 src/ui/gui/psppire.glade:2544
+#: src/ui/gui/data-editor.glade:1570 src/ui/gui/psppire.glade:2544
 #: src/ui/gui/recode.glade:185
 msgid "Value:"
 msgstr ""
 
-#: src/ui/gui/data-editor.glade:1814 src/ui/gui/examine.glade:423
+#: src/ui/gui/data-editor.glade:1707 src/ui/gui/examine.glade:423
 #: src/ui/gui/t-test.glade:460
 msgid "Missing Values"
 msgstr ""
 
-#: src/ui/gui/data-editor.glade:1832
+#: src/ui/gui/data-editor.glade:1725
 msgid "_Range plus one optional discrete missing value"
 msgstr ""
 
-#: src/ui/gui/data-editor.glade:1857
+#: src/ui/gui/data-editor.glade:1750
 msgid "_Low:"
 msgstr ""
 
-#: src/ui/gui/data-editor.glade:1886
+#: src/ui/gui/data-editor.glade:1779
 msgid "_High:"
 msgstr ""
 
-#: src/ui/gui/data-editor.glade:1927
+#: src/ui/gui/data-editor.glade:1820
 msgid "Di_screte value:"
 msgstr ""
 
-#: src/ui/gui/data-editor.glade:1974
+#: src/ui/gui/data-editor.glade:1867
 msgid "_No missing values"
 msgstr ""
 
-#: src/ui/gui/data-editor.glade:1992
+#: src/ui/gui/data-editor.glade:1885
 msgid "_Discrete missing values"
 msgstr ""
 
@@ -5456,7 +5460,7 @@
 msgid "Incorrect range specification"
 msgstr ""
 
-#: src/ui/gui/oneway-anova-dialog.c:339
+#: src/ui/gui/oneway-anova-dialog.c:336
 #, c-format
 msgid "Contrast %d of %d"
 msgstr ""
@@ -5545,23 +5549,69 @@
 msgid "Paste"
 msgstr ""
 
-#: src/ui/gui/psppire.c:197
-msgid "_Reset"
+#: src/ui/gui/psppire-data-editor.c:604
+msgid "Data View"
 msgstr ""
 
-#: src/ui/gui/psppire.c:198
-msgid "_Select"
+#: src/ui/gui/psppire-data-editor.c:607
+msgid "Variable View"
 msgstr ""
 
 #: src/ui/gui/psppire-data-store.c:827
 msgid "var"
 msgstr ""
 
-#: src/ui/gui/psppire-data-store.c:948 src/ui/gui/psppire-var-store.c:728
+#: src/ui/gui/psppire-data-store.c:948 src/ui/gui/psppire-var-store.c:839
 #, c-format
 msgid "%ld"
 msgstr ""
 
+#: src/ui/gui/psppire-var-sheet.c:96
+msgid "Name"
+msgstr ""
+
+#: src/ui/gui/psppire-var-sheet.c:98 src/ui/gui/psppire.glade:2187
+msgid "Width"
+msgstr ""
+
+#: src/ui/gui/psppire-var-sheet.c:99
+msgid "Decimals"
+msgstr ""
+
+#: src/ui/gui/psppire-var-sheet.c:101
+msgid "Values"
+msgstr ""
+
+#: src/ui/gui/psppire-var-sheet.c:104
+msgid "Align"
+msgstr ""
+
+#: src/ui/gui/psppire-var-sheet.c:105
+msgid "Measure"
+msgstr ""
+
+#: src/ui/gui/psppire-var-store.c:600
+msgid "Scientific"
+msgstr ""
+
+#: src/ui/gui/psppire-var-store.c:603
+msgid "Custom"
+msgstr ""
+
+#: src/ui/gui/psppire-var-store.c:674 src/ui/gui/psppire-var-store.c:684
+#: src/ui/gui/psppire-var-store.c:694
+#, c-format
+msgid "%d"
+msgstr ""
+
+#: src/ui/gui/psppire.c:195
+msgid "_Reset"
+msgstr ""
+
+#: src/ui/gui/psppire.c:196
+msgid "_Select"
+msgstr ""
+
 #: src/ui/gui/psppire.glade:11
 msgid "This is pre-alpha software.  Use at your own risk."
 msgstr ""
@@ -5746,10 +5796,6 @@
 msgid "Use expression as label"
 msgstr ""
 
-#: src/ui/gui/psppire.glade:2187 src/ui/gui/var-sheet.c:67
-msgid "Width"
-msgstr ""
-
 #: src/ui/gui/psppire.glade:2274
 msgid "Goto Case Number:"
 msgstr ""
@@ -5782,20 +5828,6 @@
 msgid "Search backward"
 msgstr ""
 
-#: src/ui/gui/psppire-var-store.c:489
-msgid "Scientific"
-msgstr ""
-
-#: src/ui/gui/psppire-var-store.c:492
-msgid "Custom"
-msgstr ""
-
-#: src/ui/gui/psppire-var-store.c:563 src/ui/gui/psppire-var-store.c:573
-#: src/ui/gui/psppire-var-store.c:583
-#, c-format
-msgid "%d"
-msgstr ""
-
 #: src/ui/gui/rank.glade:111
 msgid "By:"
 msgstr ""
@@ -5876,43 +5908,43 @@
 msgid "Proportion Estimation Formula"
 msgstr ""
 
-#: src/ui/gui/rank.glade:615
+#: src/ui/gui/rank.glade:614
 msgid "_Mean"
 msgstr ""
 
-#: src/ui/gui/rank.glade:627
+#: src/ui/gui/rank.glade:626
 msgid "_Low"
 msgstr ""
 
-#: src/ui/gui/rank.glade:643
+#: src/ui/gui/rank.glade:642
 msgid "_High"
 msgstr ""
 
-#: src/ui/gui/rank.glade:661
+#: src/ui/gui/rank.glade:660
 msgid "_Sequential ranks to unique values"
 msgstr ""
 
-#: src/ui/gui/rank.glade:681
+#: src/ui/gui/rank.glade:680
 msgid "Rank Assigned to Ties"
 msgstr ""
 
-#: src/ui/gui/recode-dialog.c:881
+#: src/ui/gui/recode-dialog.c:880
 msgid "Recode into Different Variables"
 msgstr ""
 
-#: src/ui/gui/recode-dialog.c:884
+#: src/ui/gui/recode-dialog.c:883
 msgid "Recode into Same Variables"
 msgstr ""
 
-#: src/ui/gui/recode-dialog.c:915 src/ui/gui/recode-dialog.c:1017
+#: src/ui/gui/recode-dialog.c:914 src/ui/gui/recode-dialog.c:1016
 msgid "Old"
 msgstr ""
 
-#: src/ui/gui/recode-dialog.c:1276
+#: src/ui/gui/recode-dialog.c:1275
 msgid "Recode into Different Variables: Old and New Values "
 msgstr ""
 
-#: src/ui/gui/recode-dialog.c:1277
+#: src/ui/gui/recode-dialog.c:1276
 msgid "Recode into Same Variables: Old and New Values"
 msgstr ""
 
@@ -5996,6 +6028,38 @@
 msgid "Old and New Values"
 msgstr ""
 
+#: src/ui/gui/regression-dialog.c:41
+msgid "Coeff"
+msgstr ""
+
+#: src/ui/gui/regression-dialog.c:43
+msgid "Anova"
+msgstr ""
+
+#: src/ui/gui/regression-dialog.c:44
+msgid "Bcov"
+msgstr ""
+
+#: src/ui/gui/regression.glade:41
+msgid "Save..."
+msgstr ""
+
+#: src/ui/gui/regression.glade:145
+msgid "Dependent"
+msgstr ""
+
+#: src/ui/gui/regression.glade:193
+msgid "Independent"
+msgstr ""
+
+#: src/ui/gui/regression.glade:243
+msgid "Predicted values"
+msgstr ""
+
+#: src/ui/gui/regression.glade:253
+msgid "Residuals"
+msgstr ""
+
 #: src/ui/gui/select-cases-dialog.c:85
 #, c-format
 msgid "Approximately %3d%% of all cases."
@@ -6052,6 +6116,19 @@
 msgid "To End"
 msgstr ""
 
+#: src/ui/gui/t-test-options.c:60
+#, c-format
+msgid "Confidence Interval: %2d %%"
+msgstr ""
+
+#: src/ui/gui/t-test-paired-samples.c:229
+msgid "Var 1"
+msgstr ""
+
+#: src/ui/gui/t-test-paired-samples.c:230
+msgid "Var 2"
+msgstr ""
+
 #: src/ui/gui/t-test.glade:56 src/ui/gui/t-test.glade:165
 msgid "Define Groups"
 msgstr ""
@@ -6089,19 +6166,6 @@
 msgid "Test Value: "
 msgstr ""
 
-#: src/ui/gui/t-test-options.c:60
-#, c-format
-msgid "Confidence Interval: %2d %%"
-msgstr ""
-
-#: src/ui/gui/t-test-paired-samples.c:232
-msgid "Var 1"
-msgstr ""
-
-#: src/ui/gui/t-test-paired-samples.c:233
-msgid "Var 2"
-msgstr ""
-
 #: src/ui/gui/variable-info-dialog.c:88
 #, c-format
 msgid "Label: %s\n"
@@ -6131,26 +6195,6 @@
 msgid "%s %s\n"
 msgstr ""
 
-#: src/ui/gui/var-sheet.c:65
-msgid "Name"
-msgstr ""
-
-#: src/ui/gui/var-sheet.c:68
-msgid "Decimals"
-msgstr ""
-
-#: src/ui/gui/var-sheet.c:70
-msgid "Values"
-msgstr ""
-
-#: src/ui/gui/var-sheet.c:73
-msgid "Align"
-msgstr ""
-
-#: src/ui/gui/var-sheet.c:74
-msgid "Measure"
-msgstr ""
-
 #: src/ui/gui/weight-cases-dialog.c:88
 #, c-format
 msgid "Weight cases by %s"

Index: src/ui/gui/ChangeLog
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/ChangeLog,v
retrieving revision 1.115
retrieving revision 1.116
diff -u -b -r1.115 -r1.116
--- src/ui/gui/ChangeLog        27 Feb 2008 04:16:44 -0000      1.115
+++ src/ui/gui/ChangeLog        29 Feb 2008 09:13:51 -0000      1.116
@@ -1,3 +1,28 @@
+2008-02-29  John Darrington <address@hidden>
+
+       * psppire-data-editor.c psppire-data-editor.h: New files.  Contains 
functionality
+       previously scattered thoughout data-editor.c and elsewhere.
+
+       * data-editor.c data-editor.h: Abstracted the variable sheet, the data 
sheet and
+       their containing GtkNotebook into a new Object.
+
+       * data-sheet.c data-sheet.h: Deleted.
+
+       * var-sheet.c var-sheet.h: Deleted.  Moved to psppire-var-sheet.[ch]
+
+       * psppire-var-sheet.c psppire-var-sheet.h: New files.
+       
+       * clipboard.c clipboard.h: Deleted.  Moved to psppire-data-editor.c
+
+       * psppire-var-store.c psppire-var-store.h: Updated symbols to avoid 
name clashes.
+       
+       * comments-dialog.c compute-dialog.c crosstabs-dialog.c 
descriptives-dialog.c
+       examine-dialog.c find-dialog.c frequencies-dialog.c goto-case-dialog.c
+       oneway-anova-dialog.c rank-dialog.c recode-dialog.c 
select-cases-dialog.c
+       sort-cases-dialog.c split-file-dialog.c 
t-test-independent-samples-dialog.c
+       transpose-dialog.c variable-info-dialog.c weight-cases-dialog.c 
t-test-one-sample.c
+       t-test-paired-samples.c: Updated dialogs to match above changes.
+
 2008-02-27  Jason Stover  <address@hidden>
 
        * regression-dialog.c: New file.

Index: src/ui/gui/automake.mk
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/automake.mk,v
retrieving revision 1.51
retrieving revision 1.52
diff -u -b -r1.51 -r1.52
--- src/ui/gui/automake.mk      27 Feb 2008 04:04:16 -0000      1.51
+++ src/ui/gui/automake.mk      29 Feb 2008 09:13:51 -0000      1.52
@@ -84,8 +84,6 @@
 src_ui_gui_psppire_SOURCES = \
        src/ui/gui/about.c \
        src/ui/gui/about.h \
-       src/ui/gui/clipboard.c \
-       src/ui/gui/clipboard.h \
        src/ui/gui/checkbox-treeview.c \
        src/ui/gui/checkbox-treeview.h \
        src/ui/gui/compute-dialog.c \
@@ -100,8 +98,6 @@
        src/ui/gui/frequencies-dialog.h \
        src/ui/gui/goto-case-dialog.c \
        src/ui/gui/goto-case-dialog.h \
-       src/ui/gui/data-sheet.c \
-       src/ui/gui/data-sheet.h \
        src/ui/gui/data-editor.c \
        src/ui/gui/data-editor.h \
        src/ui/gui/descriptives-dialog.c \
@@ -137,6 +133,8 @@
        src/ui/gui/psppire-vbuttonbox.h \
        src/ui/gui/psppire-case-file.c \
        src/ui/gui/psppire-case-file.h \
+       src/ui/gui/psppire-data-editor.c \
+       src/ui/gui/psppire-data-editor.h \
        src/ui/gui/psppire-data-store.c \
        src/ui/gui/psppire-data-store.h \
        src/ui/gui/psppire-dialog.c \
@@ -149,6 +147,8 @@
        src/ui/gui/psppire-selector.h \
        src/ui/gui/psppire-var-ptr.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/rank-dialog.c \
@@ -181,8 +181,6 @@
        src/ui/gui/val-labs-dialog.h \
        src/ui/gui/var-display.c \
        src/ui/gui/var-display.h \
-       src/ui/gui/var-sheet.c \
-       src/ui/gui/var-sheet.h \
        src/ui/gui/var-type-dialog.c \
        src/ui/gui/var-type-dialog.h \
        src/ui/gui/variable-info-dialog.c \

Index: src/ui/gui/comments-dialog.c
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/comments-dialog.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- src/ui/gui/comments-dialog.c        7 Jul 2007 06:14:26 -0000       1.2
+++ src/ui/gui/comments-dialog.c        29 Feb 2008 09:13:52 -0000      1.3
@@ -106,10 +106,9 @@
   GtkWidget *label = get_widget_assert (xml, "column-number-label");
   GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (textview));
 
-  GtkSheet *var_sheet =
-    GTK_SHEET (get_widget_assert (de->xml, "variable_sheet"));
+  PsppireVarStore *vs = NULL;
 
-  PsppireVarStore *vs = PSPPIRE_VAR_STORE (gtk_sheet_get_model (var_sheet));
+  g_object_get (de->data_editor, "var-store", &vs, NULL);
 
   gtk_window_set_transient_for (GTK_WINDOW (dialog), de->parent.window);
 

Index: src/ui/gui/compute-dialog.c
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/compute-dialog.c,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -b -r1.15 -r1.16
--- src/ui/gui/compute-dialog.c 13 Feb 2008 03:22:03 -0000      1.15
+++ src/ui/gui/compute-dialog.c 29 Feb 2008 09:13:52 -0000      1.16
@@ -368,7 +368,7 @@
   gint response;
   struct data_editor *de = data;
 
-  PsppireVarStore *vs;
+  PsppireVarStore *vs = NULL;
   struct compute_dialog scd;
 
   GladeXML *xml = XML_NEW ("psppire.glade");
@@ -388,12 +388,7 @@
        get_widget_assert (xml, "radio-button-expression-label");
 
 
-  GtkSheet *var_sheet =
-    GTK_SHEET (get_widget_assert (de->xml, "variable_sheet"));
-
-  vs = PSPPIRE_VAR_STORE (gtk_sheet_get_model (var_sheet));
-
-
+  g_object_get (de->data_editor, "var-store", &vs, NULL);
   scd.dict = vs->dict;
   scd.use_type = FALSE;
 
@@ -480,9 +475,9 @@
 
 
 enum {
-  COL_NAME,
-  COL_USAGE,
-  COL_ARITY
+  COMPUTE_COL_NAME,
+  COMPUTE_COL_USAGE,
+  COMPUTE_COL_ARITY
 };
 
 
@@ -504,9 +499,9 @@
       gtk_list_store_append (liststore, &iter);
 
       gtk_list_store_set (liststore, &iter,
-                         COL_NAME, expr_operation_get_name (op),
-                         COL_USAGE, expr_operation_get_prototype (op),
-                         COL_ARITY, expr_operation_get_arg_cnt (op),
+                         COMPUTE_COL_NAME, expr_operation_get_name (op),
+                         COMPUTE_COL_USAGE, expr_operation_get_prototype (op),
+                         COMPUTE_COL_ARITY, expr_operation_get_arg_cnt (op),
                          -1);
     }
 
@@ -527,7 +522,7 @@
 
     gtk_tree_view_column_pack_start (col, renderer, TRUE);
 
-    gtk_tree_view_column_add_attribute (col, renderer, "text", COL_USAGE);
+    gtk_tree_view_column_add_attribute (col, renderer, "text", 
COMPUTE_COL_USAGE);
   }
 
   gtk_tree_view_set_model (tv, GTK_TREE_MODEL (liststore));
@@ -555,8 +550,8 @@
 
   buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text_view));
 
-  gtk_tree_model_get_value (model, &iter, COL_NAME, &name_value);
-  gtk_tree_model_get_value (model, &iter, COL_ARITY, &arity_value);
+  gtk_tree_model_get_value (model, &iter, COMPUTE_COL_NAME, &name_value);
+  gtk_tree_model_get_value (model, &iter, COMPUTE_COL_ARITY, &arity_value);
 
   arity = g_value_get_int (&arity_value);
 

Index: src/ui/gui/crosstabs-dialog.c
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/crosstabs-dialog.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- src/ui/gui/crosstabs-dialog.c       8 Feb 2008 14:46:49 -0000       1.1
+++ src/ui/gui/crosstabs-dialog.c       29 Feb 2008 09:13:52 -0000      1.2
@@ -391,8 +391,7 @@
   struct crosstabs_dialog cd;
 
   GladeXML *xml = XML_NEW ("crosstabs.glade");
-  GtkSheet *var_sheet;
-  PsppireVarStore *vs;
+  PsppireVarStore *vs = NULL;
 
   GtkWidget *dialog = get_widget_assert   (xml, "crosstabs-dialog");
   GtkWidget *source = get_widget_assert   (xml, "dict-treeview");
@@ -408,9 +407,7 @@
   cd.stat_view = get_widget_assert (xml, "stats-view");
   cd.cell_view = get_widget_assert (xml, "cell-view");
 
-  var_sheet = GTK_SHEET (get_widget_assert (de->xml, "variable_sheet"));
-
-  vs = PSPPIRE_VAR_STORE (gtk_sheet_get_model (var_sheet));
+  g_object_get (de->data_editor, "var-store", &vs, NULL);
 
   put_checkbox_items_in_treeview (GTK_TREE_VIEW(cd.stat_view),
                                  B_CS_STATS_DEFAULT,

Index: src/ui/gui/data-editor.c
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/data-editor.c,v
retrieving revision 1.66
retrieving revision 1.67
diff -u -b -r1.66 -r1.67
--- src/ui/gui/data-editor.c    29 Feb 2008 09:12:23 -0000      1.66
+++ src/ui/gui/data-editor.c    29 Feb 2008 09:13:52 -0000      1.67
@@ -1,5 +1,5 @@
 /* PSPPIRE - a graphical user interface for PSPP.
-   Copyright (C) 2006, 2007  Free Software Foundation
+   Copyright (C) 2006, 2007, 2008  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
@@ -24,6 +24,8 @@
 #include "window-manager.h"
 #include <gtksheet/gtksheet.h>
 
+#include "psppire-data-editor.h"
+
 #include "helper.h"
 #include "about.h"
 #include <data/procedure.h>
@@ -47,7 +49,6 @@
 #include "examine-dialog.h"
 #include "dict-display.h"
 #include "regression-dialog.h"
-#include "clipboard.h"
 
 #include "oneway-anova-dialog.h"
 #include "t-test-independent-samples-dialog.h"
@@ -72,34 +73,15 @@
 static void on_edit_paste (GtkAction *a, gpointer data);
 
 
-static void create_data_sheet_variable_popup_menu (struct data_editor *);
-static void create_data_sheet_cases_popup_menu (struct data_editor *);
-
-static void popup_variable_menu (GtkSheet *, gint,
-                                GdkEventButton *, gpointer data);
-
-static void popup_cases_menu (GtkSheet *, gint,
-                                GdkEventButton *, gpointer data);
-
-/* Update the data_ref_entry with the reference of the active cell */
-static gint update_data_ref_entry (const GtkSheet *sheet,
-                                  gint row, gint col, gpointer data);
+static GtkWidget * create_data_sheet_variable_popup_menu (struct data_editor 
*);
+static GtkWidget * create_data_sheet_cases_popup_menu (struct data_editor *);
 
 static void register_data_editor_actions (struct data_editor *de);
-
-static void insert_variable (GtkAction *, gpointer data);
+static void on_insert_variable (GtkAction *, gpointer data);
 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);
-
-
 /* Callback for when the dictionary changes properties*/
 static void on_weight_change (GObject *, gint, gpointer);
 static void on_filter_change (GObject *, gint, gpointer);
@@ -114,20 +96,20 @@
 
 static void grid_lines_activate (GtkCheckMenuItem *, gpointer);
 
-static void data_sheet_activate (GtkCheckMenuItem *, gpointer);
+static void data_view_activate (GtkCheckMenuItem *, gpointer);
 
-static void variable_sheet_activate (GtkCheckMenuItem *, gpointer );
+static void variable_view_activate (GtkCheckMenuItem *, gpointer );
 
 static void fonts_activate (GtkMenuItem *, gpointer);
 
 static void file_quit (GtkCheckMenuItem *, gpointer );
 
 static void
-enable_delete_cases (GtkWidget *w, gint var, gpointer data)
+enable_delete_cases (GtkWidget *w, gint case_num, gpointer data)
 {
   struct data_editor *de = data;
 
-  gtk_action_set_visible (de->delete_cases, var != -1);
+  gtk_action_set_visible (de->delete_cases, case_num != -1);
 }
 
 
@@ -240,114 +222,33 @@
 
 #endif
 
-static void
-datum_entry_activate (GtkEntry *entry, gpointer data)
-{
-  gint row, column;
-  GtkSheet *data_sheet = GTK_SHEET (data);
-  PsppireDataStore *store = PSPPIRE_DATA_STORE (gtk_sheet_get_model 
(data_sheet));
 
-  const char *text = gtk_entry_get_text (entry);
-
-  gtk_sheet_get_active_cell (data_sheet, &row, &column);
-
-  if ( row == -1 || column == -1)
-    return;
-
-  psppire_data_store_set_string (store, text, row, column);
-}
-
-
-/* Update the Edit->Paste menuitem
-   If PAGE is not -1 , then it should be set to the current page of
-   the data editors notebook widget.
-   If -1, then it'll be queried.
-*/
 static void
-update_paste_menuitem (struct data_editor *de, gint page)
+update_paste_menuitems (GtkWidget *w, gboolean x, gpointer data)
 {
-  GtkWidget * edit_paste = get_widget_assert (de->xml, "edit_paste");
-  GtkWidget *notebook = get_widget_assert (de->xml, "notebook");
-  GtkSheet * data_sheet ;
-  gint row, column;
-
-  if ( page < 0 )
-    page = gtk_notebook_get_current_page (GTK_NOTEBOOK(notebook));
-
-
-  if ( PAGE_VAR_SHEET == page )
-    {
-      /* We don't yet support pasting to the var sheet */
-      gtk_widget_set_sensitive (edit_paste, FALSE);
-      return;
-    }
-
-  data_sheet = GTK_SHEET (get_widget_assert (de->xml, "data_sheet"));
+  struct data_editor *de = data;
 
-  gtk_sheet_get_active_cell (data_sheet, &row, &column);
+  GtkWidget * edit_paste = get_widget_assert (de->xml, "edit_paste");
 
-  if ( row < 0 || column < 0 )
-      gtk_widget_set_sensitive (edit_paste, FALSE);
-  else
-      gtk_widget_set_sensitive (edit_paste, TRUE);
+  gtk_widget_set_sensitive (edit_paste, x);
 }
 
-/* Update the Edit->Cut and Edit->Copy menuitems
-   If PAGE is not -1 , then it should be set to the current page of
-   the data editors notebook widget.
-   If -1, then it'll be queried.
-*/
 static void
-update_cut_copy_menuitem (struct data_editor *de, gint page)
-{
-  GtkWidget * edit_copy = get_widget_assert (de->xml, "edit_copy");
-  GtkWidget * edit_cut = get_widget_assert (de->xml, "edit_cut");
-  GtkWidget *notebook = get_widget_assert (de->xml, "notebook");
-  GtkSheet * data_sheet ;
-  gint row, column;
-
-  if ( page < 0 )
-    page = gtk_notebook_get_current_page (GTK_NOTEBOOK(notebook));
-
-
-  if ( PAGE_VAR_SHEET == page )
-    {
-      /* We don't yet support copying from the var sheet */
-      gtk_widget_set_sensitive (edit_copy, FALSE);
-      gtk_widget_set_sensitive (edit_cut, FALSE);
-      return;
-    }
-
-  data_sheet = GTK_SHEET (get_widget_assert (de->xml, "data_sheet"));
-
-  gtk_sheet_get_active_cell (data_sheet, &row, &column);
-
-  if ( row < 0 || column < 0 )
-    {
-      gtk_widget_set_sensitive (edit_copy, FALSE);
-      gtk_widget_set_sensitive (edit_cut, FALSE);
-      return;
-    }
-
-  gtk_widget_set_sensitive (edit_copy, TRUE);
-  gtk_widget_set_sensitive (edit_cut, TRUE);
-}
-
-
-/* Callback for when the datasheet's active cell becomes active/inactive */
-static gboolean
-on_data_sheet_activate_change (GtkSheet *sheet,
-                              gint row, gint column, gpointer data)
+update_cut_copy_menuitems (GtkWidget *w, gboolean x, gpointer data)
 {
   struct data_editor *de = data;
 
-  update_paste_menuitem (de, -1);
-  update_cut_copy_menuitem (de, -1);
+  GtkWidget * edit_copy = get_widget_assert (de->xml, "edit_copy");
+  GtkWidget * edit_cut = get_widget_assert (de->xml, "edit_cut");
 
-  return TRUE;
+  gtk_widget_set_sensitive (edit_copy, x);
+  gtk_widget_set_sensitive (edit_cut, x);
 }
 
+extern PsppireVarStore *the_var_store;
 extern struct dataset *the_dataset;
+extern PsppireDataStore *the_data_store ;
+
 
 /*
   Create a new data editor.
@@ -357,10 +258,8 @@
 {
   struct data_editor *de ;
   struct editor_window *e;
-  GtkSheet *var_sheet ;
-  GtkSheet *data_sheet ;
   PsppireVarStore *vs;
-  GtkWidget *datum_entry;
+  GtkWidget *vbox ;
 
   de = g_malloc0 (sizeof (*de));
 
@@ -369,34 +268,28 @@
   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"));
-
+  vbox = get_widget_assert (de->xml, "vbox1");
 
-  g_signal_connect (G_OBJECT (data_sheet), "activate",
-                   G_CALLBACK (on_data_sheet_activate_change), de);
+  de->data_editor = PSPPIRE_DATA_EDITOR (psppire_data_editor_new 
(the_var_store, the_data_store));
 
-  g_signal_connect (G_OBJECT (data_sheet), "deactivate",
-                   G_CALLBACK (on_data_sheet_activate_change), de);
+  g_signal_connect (de->data_editor, "data-selection-changed",
+                   G_CALLBACK (update_cut_copy_menuitems), de);
 
+  g_signal_connect (de->data_editor, "data-available-changed",
+                   G_CALLBACK (update_paste_menuitems), de);
 
-  vs = PSPPIRE_VAR_STORE (gtk_sheet_get_model (var_sheet));
 
-  g_assert(vs); /* Traps a possible bug in win32 build */
+  gtk_widget_show (GTK_WIDGET (de->data_editor));
 
-  g_signal_connect (G_OBJECT (data_sheet), "activate",
-                   G_CALLBACK (update_data_ref_entry),
-                   de->xml);
+  gtk_container_add (GTK_CONTAINER (vbox), GTK_WIDGET (de->data_editor));
+  gtk_box_reorder_child (GTK_BOX (vbox) , GTK_WIDGET (de->data_editor), 2);
+  dataset_add_transform_change_callback (the_dataset,
+                                        transformation_change_callback,
+                                        de);
 
-  datum_entry = get_widget_assert (de->xml, "datum_entry");
+  vs = the_var_store;
 
-  g_signal_connect (G_OBJECT (datum_entry), "activate",
-                   G_CALLBACK (datum_entry_activate),
-                   data_sheet);
+  g_assert(vs); /* Traps a possible bug in w32 build */
 
   g_signal_connect (vs->dict, "weight-changed",
                    G_CALLBACK (on_weight_change),
@@ -431,7 +324,7 @@
                           _("Show/hide value labels"),
                           "pspp-value-labels");
 
-  g_signal_connect (de->toggle_value_labels, "activate",
+  g_signal_connect (de->toggle_value_labels, "toggled",
                    G_CALLBACK (toggle_value_labels), de);
 
 
@@ -450,14 +343,16 @@
                    _("Delete the cases at the selected position(s)"),
                    "pspp-clear-cases");
 
-  g_signal_connect (de->delete_cases, "activate",
-                   G_CALLBACK (delete_cases), de);
+  g_signal_connect_swapped (de->delete_cases, "activate",
+                   G_CALLBACK (psppire_data_editor_delete_cases),
+                   de->data_editor);
 
   gtk_action_connect_proxy (de->delete_cases,
                            get_widget_assert (de->xml, "edit_clear-cases"));
 
   g_signal_connect (get_widget_assert (de->xml, "edit_paste"), "activate",
-                   G_CALLBACK (on_edit_paste), de);
+                   G_CALLBACK (on_edit_paste),
+                   de);
 
   gtk_action_set_visible (de->delete_cases, FALSE);
 
@@ -467,8 +362,9 @@
                    _("Delete the variables at the selected position(s)"),
                    "pspp-clear-variables");
 
-  g_signal_connect (de->delete_variables, "activate",
-                   G_CALLBACK (delete_variables), de);
+  g_signal_connect_swapped (de->delete_variables, "activate",
+                           G_CALLBACK (psppire_data_editor_delete_variables),
+                           de->data_editor);
 
   gtk_action_connect_proxy (de->delete_variables,
                            get_widget_assert (de->xml, "edit_clear-variables")
@@ -483,7 +379,7 @@
                    "pspp-insert-variable");
 
   g_signal_connect (de->insert_variable, "activate",
-                   G_CALLBACK (insert_variable), de);
+                   G_CALLBACK (on_insert_variable), de->data_editor);
 
 
   gtk_action_connect_proxy (de->insert_variable,
@@ -927,36 +823,25 @@
                    G_CALLBACK (reference_manual),
                    e->window);
 
-  g_signal_connect (data_sheet,
-                   "double-click-column",
-                   G_CALLBACK (click2column),
-                   de);
-
-  g_signal_connect (data_sheet,
-                   "select-column",
-                   G_CALLBACK (enable_delete_variables),
-                   de);
 
-  g_signal_connect (data_sheet,
-                   "select-row",
+  g_signal_connect (de->data_editor,
+                   "cases-selected",
                    G_CALLBACK (enable_delete_cases),
                    de);
 
 
-  g_signal_connect (var_sheet,
-                   "double-click-row",
-                   GTK_SIGNAL_FUNC (click2row),
-                   de);
-
-  g_signal_connect_after (var_sheet,
-                   "select-row",
+  g_signal_connect (de->data_editor,
+                   "variables-selected",
                    G_CALLBACK (enable_delete_variables),
                    de);
 
-  g_signal_connect (get_widget_assert (de->xml, "notebook"),
+
+  g_signal_connect (GTK_NOTEBOOK (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 (get_widget_assert (de->xml, "view_statusbar"),
                    "activate",
@@ -971,11 +856,11 @@
 
   g_signal_connect (get_widget_assert (de->xml, "view_data"),
                    "activate",
-                   G_CALLBACK (data_sheet_activate), de);
+                   G_CALLBACK (data_view_activate), de);
 
   g_signal_connect (get_widget_assert (de->xml, "view_variables"),
                    "activate",
-                   G_CALLBACK (variable_sheet_activate), de);
+                   G_CALLBACK (variable_view_activate), de);
 
 
 
@@ -1025,69 +910,21 @@
                    G_CALLBACK (minimise_all_windows), NULL);
 
 
-  create_data_sheet_variable_popup_menu (de);
-  create_data_sheet_cases_popup_menu (de);
-
-  g_signal_connect (G_OBJECT (data_sheet), "button-event-column",
-                   G_CALLBACK (popup_variable_menu), de);
-
-  g_signal_connect (G_OBJECT (data_sheet), "button-event-row",
-                   G_CALLBACK (popup_cases_menu), de);
-
-  return de;
-}
-
-
-/* Callback which occurs when the var sheet's row title
-   button is double clicked */
-static gboolean
-click2row (GtkWidget *w, gint row, gpointer data)
-{
-  struct data_editor *de = data;
-  GtkSheetRange visible_range;
-
-  gint current_row, current_column;
-
-  GtkWidget *data_sheet  = get_widget_assert (de->xml, "data_sheet");
-
-  data_editor_select_sheet (de, PAGE_DATA_SHEET);
-
-  gtk_sheet_get_active_cell (GTK_SHEET (data_sheet),
-                            &current_row, &current_column);
+  de->data_sheet_variable_popup_menu =
+    GTK_MENU (create_data_sheet_variable_popup_menu (de));
 
-  gtk_sheet_set_active_cell (GTK_SHEET (data_sheet), current_row, row);
+  de->data_sheet_cases_popup_menu =
+    GTK_MENU (create_data_sheet_cases_popup_menu (de));
 
-  gtk_sheet_get_visible_range (GTK_SHEET (data_sheet), &visible_range);
-
-  if ( row < visible_range.col0 || row > visible_range.coli)
-    {
-      gtk_sheet_moveto (GTK_SHEET (data_sheet),
-                       current_row, row, 0, 0);
-    }
-
-  return FALSE;
-}
-
-
-/* Callback which occurs when the data sheet's column title
-   is double clicked */
-static gboolean
-click2column (GtkWidget *w, gint col, gpointer data)
-{
-  struct data_editor *de = data;
 
-  gint current_row, current_column;
+  g_object_set (de->data_editor,
+               "column-menu", de->data_sheet_variable_popup_menu, NULL);
 
-  GtkWidget *var_sheet  = get_widget_assert (de->xml, "variable_sheet");
 
-  data_editor_select_sheet (de, PAGE_VAR_SHEET);
+  g_object_set (de->data_editor,
+               "row-menu", de->data_sheet_cases_popup_menu, NULL);
 
-  gtk_sheet_get_active_cell (GTK_SHEET (var_sheet),
-                            &current_row, &current_column);
-
-  gtk_sheet_set_active_cell (GTK_SHEET (var_sheet), col, current_column);
-
-  return FALSE;
+  return de;
 }
 
 
@@ -1111,16 +948,16 @@
 
   switch (page_num)
     {
-    case PAGE_VAR_SHEET:
+    case PSPPIRE_DATA_EDITOR_VARIABLE_VIEW:
       gtk_widget_hide (view_variables);
       gtk_widget_show (view_data);
       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:
+    case PSPPIRE_DATA_EDITOR_DATA_VIEW:
       gtk_widget_show (view_variables);
-      gtk_widget_show (view_data);
+      gtk_widget_hide (view_data);
       gtk_action_set_sensitive (de->invoke_goto_dialog, TRUE);
       gtk_action_set_sensitive (de->insert_case, TRUE);
       break;
@@ -1129,22 +966,12 @@
       break;
     }
 
+#if 0
   update_paste_menuitem (de, page_num);
-  update_cut_copy_menuitem (de, page_num);
-}
-
-
-void
-data_editor_select_sheet (struct data_editor *de, gint page)
-{
-  gtk_notebook_set_current_page
-   (
-    GTK_NOTEBOOK (get_widget_assert (de->xml,"notebook")), page
-    );
+#endif
 }
 
 
-
 static void
 status_bar_activate (GtkCheckMenuItem *menuitem, gpointer data)
 {
@@ -1162,33 +989,28 @@
 grid_lines_activate (GtkCheckMenuItem *menuitem, gpointer data)
 {
   struct data_editor *de = data;
-  const bool grid_visible = gtk_check_menu_item_get_active (menuitem);
-
-  gtk_sheet_show_grid (GTK_SHEET (get_widget_assert (de->xml,
-                                                    "variable_sheet")),
-                      grid_visible);
+  const gboolean grid_visible = gtk_check_menu_item_get_active (menuitem);
 
-  gtk_sheet_show_grid (GTK_SHEET (get_widget_assert (de->xml, "data_sheet")),
-                      grid_visible);
+  psppire_data_editor_show_grid (de->data_editor, grid_visible);
 }
 
 
 
 static void
-data_sheet_activate (GtkCheckMenuItem *menuitem, gpointer data)
+data_view_activate (GtkCheckMenuItem *menuitem, gpointer data)
 {
   struct data_editor *de = data;
 
-  data_editor_select_sheet (de, PAGE_DATA_SHEET);
+  gtk_notebook_set_page (GTK_NOTEBOOK (de->data_editor), 
PSPPIRE_DATA_EDITOR_DATA_VIEW);
 }
 
 
 static void
-variable_sheet_activate (GtkCheckMenuItem *menuitem, gpointer data)
+variable_view_activate (GtkCheckMenuItem *menuitem, gpointer data)
 {
   struct data_editor *de = data;
 
-  data_editor_select_sheet (de, PAGE_VAR_SHEET);
+  gtk_notebook_set_page (GTK_NOTEBOOK (de->data_editor), 
PSPPIRE_DATA_EDITOR_VARIABLE_VIEW);
 }
 
 
@@ -1204,23 +1026,13 @@
                                                               "data_editor")));
   if ( GTK_RESPONSE_OK == gtk_dialog_run (GTK_DIALOG (dialog)) )
     {
-      GtkSheet *data_sheet =
-       GTK_SHEET (get_widget_assert (de->xml, "data_sheet"));
-
-      GtkSheet *var_sheet =
-       GTK_SHEET (get_widget_assert (de->xml, "variable_sheet"));
-
-      PsppireDataStore *ds = PSPPIRE_DATA_STORE (gtk_sheet_get_model 
(data_sheet));
-      PsppireVarStore *vs = PSPPIRE_VAR_STORE (gtk_sheet_get_model 
(var_sheet));
-
       const gchar *font = gtk_font_selection_dialog_get_font_name
        (GTK_FONT_SELECTION_DIALOG (dialog));
 
       PangoFontDescription* font_desc =
        pango_font_description_from_string (font);
 
-      psppire_var_store_set_font (vs, font_desc);
-      psppire_data_store_set_font (ds, font_desc);
+      psppire_data_editor_set_font (de->data_editor, font_desc);
     }
 
   gtk_widget_hide (dialog);
@@ -1234,16 +1046,10 @@
 {
   struct data_editor *de = data;
 
-  GtkSheet *data_sheet = GTK_SHEET (get_widget_assert (de->xml, "data_sheet"));
-
-  PsppireDataStore *ds = PSPPIRE_DATA_STORE (gtk_sheet_get_model (data_sheet));
-
-
-  psppire_data_store_show_labels (ds,
-                                 gtk_toggle_action_get_active (ta));
+  g_object_set (de->data_editor, "value-labels", gtk_toggle_action_get_active 
(ta), NULL);
 }
 
-extern PsppireDataStore *the_data_store ;
+
 
 static void
 file_quit (GtkCheckMenuItem *menuitem, gpointer data)
@@ -1255,144 +1061,23 @@
   gtk_main_quit ();
 }
 
-static void
-delete_cases (GtkAction *action, gpointer data)
-{
-  struct data_editor *de = data;
-  GtkSheet *data_sheet =
-    GTK_SHEET (get_widget_assert (de->xml, "data_sheet"));
-
-  GtkSheetRange range;
-
-  PsppireDataStore *data_store = PSPPIRE_DATA_STORE
-    (gtk_sheet_get_model (data_sheet) );
-
-
-  /* This shouldn't be able to happen, because the action
-     should be disabled */
-  g_return_if_fail (gtk_sheet_get_state (data_sheet)
-                   ==  GTK_SHEET_ROW_SELECTED );
-
-  gtk_sheet_get_selected_range (data_sheet, &range);
-
-  gtk_sheet_unselect_range (data_sheet);
-
-  psppire_data_store_delete_cases (data_store, range.row0,
-                                  1 + range.rowi - range.row0);
-
-}
-
-static void
-delete_variables (GtkAction *a, gpointer data)
-{
-  struct data_editor *de = data;
-  GtkSheetRange range;
-
-  GtkNotebook *notebook = GTK_NOTEBOOK (get_widget_assert (de->xml,
-                                                          "notebook"));
-
-  const gint page = gtk_notebook_get_current_page (notebook);
-
-  GtkSheet *sheet = GTK_SHEET (get_widget_assert (de->xml,
-                                                 (page == PAGE_VAR_SHEET) ?
-                                                 "variable_sheet" :
-                                                 "data_sheet"));
-
-
-  gtk_sheet_get_selected_range (sheet, &range);
-
-  switch ( page )
-    {
-    case PAGE_VAR_SHEET:
-      {
-       PsppireVarStore *vs =
-         PSPPIRE_VAR_STORE (gtk_sheet_get_model (sheet));
-
-       psppire_dict_delete_variables (vs->dict,
-                                      range.row0,
-                                      1 +
-                                      range.rowi -
-                                      range.row0 );
-      }
-      break;
-    case PAGE_DATA_SHEET:
-      {
-       PsppireDataStore *ds =
-         PSPPIRE_DATA_STORE (gtk_sheet_get_model (sheet));
-
-       psppire_dict_delete_variables (ds->dict,
-                                      range.col0,
-                                      1 +
-                                      range.coli -
-                                      range.col0 );
-      }
-      break;
-    };
-
-  gtk_sheet_unselect_range (sheet);
-}
 
 static void
 insert_case (GtkAction *action, gpointer data)
 {
-  gint current_row ;
   struct data_editor *de = data;
 
-  GtkSheet *data_sheet =
-    GTK_SHEET (get_widget_assert (de->xml, "data_sheet"));
-
-  PsppireDataStore *ds = PSPPIRE_DATA_STORE
-    (gtk_sheet_get_model (data_sheet) );
-
-
-  gtk_sheet_get_active_cell (data_sheet, &current_row, NULL);
-
-  if (current_row < 0) current_row = 0;
-
-  psppire_data_store_insert_new_case (ds, current_row);
+  psppire_data_editor_insert_case (de->data_editor);
 }
 
-/* Insert a new variable before the current row in the variable sheet,
-   or before the current column in the data sheet, whichever is selected */
 static void
-insert_variable (GtkAction *action, gpointer data)
+on_insert_variable (GtkAction *action, gpointer data)
 {
-  struct data_editor *de = data;
-  gint posn = -1;
-
-  GtkWidget *notebook = get_widget_assert (de->xml, "notebook");
-
-  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:
-      posn = var_sheet->active_cell.row;
-      break;
-    case PAGE_DATA_SHEET:
-      {
-       GtkSheet *data_sheet =
-         GTK_SHEET (get_widget_assert (de->xml, "data_sheet"));
-
-       if ( data_sheet->state == GTK_SHEET_COLUMN_SELECTED )
-         posn = data_sheet->range.col0;
-       else
-         posn = data_sheet->active_cell.col;
-      }
-      break;
-    default:
-      g_assert_not_reached ();
-    }
-
-  if ( posn == -1 ) posn = 0;
-
-  psppire_dict_insert_variable (vs->dict, posn, NULL);
+  PsppireDataEditor *de = PSPPIRE_DATA_EDITOR (data);
+  psppire_data_editor_insert_variable (de);
 }
 
+
 /* Callback for when the dictionary changes its split variables */
 static void
 on_split_change (PsppireDict *dict, gpointer data)
@@ -1444,16 +1129,15 @@
     }
   else
     {
-      GtkSheet *var_sheet =
-       GTK_SHEET (get_widget_assert (de->xml, "variable_sheet"));
+      PsppireVarStore *vs = NULL;
+      struct variable *var ;
+      gchar *text ;
 
-      PsppireVarStore *vs = PSPPIRE_VAR_STORE
-       (gtk_sheet_get_model (var_sheet) );
+      g_object_get (de->data_editor, "var-store", &vs, NULL);
 
-      struct variable *var = psppire_dict_get_variable (vs->dict,
-                                                       filter_index);
+      var = psppire_dict_get_variable (vs->dict, filter_index);
 
-      gchar *text = g_strdup_printf (_("Filter by %s"), var_get_name (var));
+      text = g_strdup_printf (_("Filter by %s"), var_get_name (var));
 
       gtk_label_set_text (GTK_LABEL (filter_status_area), text);
 
@@ -1475,16 +1159,15 @@
     }
   else
     {
-      GtkSheet *var_sheet =
-       GTK_SHEET (get_widget_assert (de->xml, "variable_sheet"));
+      struct variable *var ;
+      PsppireVarStore *vs = NULL;
+      gchar *text;
 
-      PsppireVarStore *vs = PSPPIRE_VAR_STORE
-       (gtk_sheet_get_model (var_sheet) );
+      g_object_get (de->data_editor, "var-store", &vs, NULL);
 
-      struct variable *var = psppire_dict_get_variable (vs->dict,
-                                                       weight_index);
+      var = psppire_dict_get_variable (vs->dict, weight_index);
 
-      gchar *text = g_strdup_printf (_("Weight by %s"), var_get_name (var));
+      text = g_strdup_printf (_("Weight by %s"), var_get_name (var));
 
       gtk_label_set_text (GTK_LABEL (weight_status_area), text);
 
@@ -1793,132 +1476,9 @@
 }
 
 
-
-/* Update the data_ref_entry with the reference of the active cell */
-static gint
-update_data_ref_entry (const GtkSheet *sheet, gint row, gint col, gpointer 
data)
-{
-  GtkEntry *datum_entry;
-  GladeXML *data_editor_xml = data;
-
-  PsppireDataStore *data_store =
-    PSPPIRE_DATA_STORE (gtk_sheet_get_model (sheet));
-
-  g_return_val_if_fail (data_editor_xml, FALSE);
-
-
-  datum_entry =
-    GTK_ENTRY (get_widget_assert (data_editor_xml,
-                                 "datum_entry"));
-
-  if (data_store)
-    {
-      const struct variable *var =
-       psppire_dict_get_variable (data_store->dict, col);
-
-      /* The entry where the reference to the current cell is displayed */
-      GtkEntry *cell_ref_entry =
-       GTK_ENTRY (get_widget_assert (data_editor_xml,
-                                     "cell_ref_entry"));
-      if ( var )
-       {
-         gchar *text = g_strdup_printf ("%d: %s", row + FIRST_CASE_NUMBER,
-                                        var_get_name (var));
-
-         gchar *s = pspp_locale_to_utf8 (text, -1, 0);
-
-         g_free (text);
-
-         gtk_entry_set_text (cell_ref_entry, s);
-
-         g_free (s);
-       }
-      else
-       goto blank_entry;
-
-      if ( var )
-       {
-         gchar *text =
-           psppire_data_store_get_string (data_store, row,
-                                          var_get_dict_index(var));
-
-         if ( ! text )
-           goto blank_entry;
-
-         g_strchug (text);
-
-         gtk_entry_set_text (datum_entry, text);
-
-         free (text);
-       }
-      else
-       goto blank_entry;
-
-    }
-
-  return FALSE;
-
- blank_entry:
-  gtk_entry_set_text (datum_entry, "");
-
-  return FALSE;
-}
-
-
-
-
-
-static void
-do_sort (PsppireDataStore *ds, int var, gboolean descend)
-{
-  GString *string = g_string_new ("SORT CASES BY ");
-
-  const struct variable *v =
-    psppire_dict_get_variable (ds->dict, var);
-
-  g_string_append_printf (string, "%s", var_get_name (v));
-
-  if ( descend )
-    g_string_append (string, " (D)");
-
-  g_string_append (string, ".");
-
-  execute_syntax (create_syntax_string_source (string->str));
-
-  g_string_free (string, TRUE);
-}
-
-
-static void
-sort_up (GtkMenuItem *item, gpointer data)
-{
-  GtkSheet *sheet  = data;
-  GtkSheetRange range;
-  gtk_sheet_get_selected_range (sheet, &range);
-
-  do_sort (PSPPIRE_DATA_STORE (gtk_sheet_get_model(sheet)),
-          range.col0, FALSE);
-
-}
-
-static void
-sort_down (GtkMenuItem *item, gpointer data)
-{
-  GtkSheet *sheet  = data;
-  GtkSheetRange range;
-  gtk_sheet_get_selected_range (sheet, &range);
-
-  do_sort (PSPPIRE_DATA_STORE (gtk_sheet_get_model(sheet)),
-          range.col0, TRUE);
-}
-
-
-
-
-static void
+static GtkWidget *
 create_data_sheet_variable_popup_menu (struct data_editor *de)
 {
-  GtkSheet *sheet  = GTK_SHEET (get_widget_assert (de->xml, "data_sheet"));
   GtkWidget *menu = gtk_menu_new ();
 
   GtkWidget *sort_ascending =
@@ -1927,14 +1487,12 @@
   GtkWidget *sort_descending =
     gtk_menu_item_new_with_label (_("Sort Descending"));
 
-
   GtkWidget *insert_variable =
     gtk_menu_item_new_with_label (_("Insert Variable"));
 
   GtkWidget *clear_variable =
     gtk_menu_item_new_with_label (_("Clear"));
 
-
   gtk_action_connect_proxy (de->insert_variable,
                            insert_variable );
 
@@ -1957,26 +1515,26 @@
                         gtk_separator_menu_item_new ());
 
 
-  g_signal_connect (G_OBJECT (sort_ascending), "activate",
-                   G_CALLBACK (sort_up), sheet);
-
   gtk_menu_shell_append (GTK_MENU_SHELL (menu), sort_ascending);
 
 
-  g_signal_connect (G_OBJECT (sort_descending), "activate",
-                   G_CALLBACK (sort_down), sheet);
-
+  g_signal_connect_swapped (G_OBJECT (sort_ascending), "activate",
+                           G_CALLBACK (psppire_data_editor_sort_ascending),
+                           de->data_editor);
+
+  g_signal_connect_swapped (G_OBJECT (sort_descending), "activate",
+                           G_CALLBACK (psppire_data_editor_sort_descending),
+                           de->data_editor);
 
   gtk_menu_shell_append (GTK_MENU_SHELL (menu), sort_descending);
 
   gtk_widget_show_all (menu);
 
-
-  de->data_sheet_variable_popup_menu = GTK_MENU(menu);
+  return menu;
 }
 
 
-static void
+static GtkWidget *
 create_data_sheet_cases_popup_menu (struct data_editor *de)
 {
   GtkWidget *menu = gtk_menu_new ();
@@ -2008,77 +1566,26 @@
 
   gtk_widget_show_all (menu);
 
-
-  de->data_sheet_cases_popup_menu = GTK_MENU (menu);
+  return menu;
 }
 
 
-static void
-popup_variable_menu (GtkSheet *sheet, gint column,
-                    GdkEventButton *event, gpointer data)
-{
-  struct data_editor *de = data;
-
-  PsppireDataStore *data_store =
-    PSPPIRE_DATA_STORE (gtk_sheet_get_model (sheet));
-
-  const struct variable *v =
-    psppire_dict_get_variable (data_store->dict, column);
-
-  if ( v && event->button == 3)
-    {
-
-      gtk_sheet_select_column (sheet, column);
-
-      gtk_menu_popup (GTK_MENU (de->data_sheet_variable_popup_menu),
-                     NULL, NULL, NULL, NULL,
-                     event->button, event->time);
-    }
-}
-
-
-static void
-popup_cases_menu (GtkSheet *sheet, gint row,
-                 GdkEventButton *event, gpointer data)
-{
-  struct data_editor *de = data;
-
-  PsppireDataStore *data_store =
-    PSPPIRE_DATA_STORE (gtk_sheet_get_model (sheet));
-
-  if ( row <= psppire_data_store_get_case_count (data_store) &&
-       event->button == 3)
-    {
-      gtk_sheet_select_row (sheet, row);
-
-      gtk_menu_popup (GTK_MENU (de->data_sheet_cases_popup_menu),
-                     NULL, NULL, NULL, NULL,
-                     event->button, event->time);
-    }
-}
 
 
 static void
 on_edit_paste (GtkAction *a, gpointer data)
 {
-  GtkClipboard *clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
+  struct data_editor *de = data;
 
-  gtk_clipboard_request_contents (clipboard,
-                                 gdk_atom_intern ("UTF8_STRING", TRUE),
-                                 data_sheet_contents_received_callback,
-                                 data);
+  psppire_data_editor_clip_paste (de->data_editor);
 }
 
-
 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);
+  psppire_data_editor_clip_copy (de->data_editor);
 }
 
 
@@ -2087,68 +1594,6 @@
 on_edit_cut (GtkMenuItem *m, gpointer data)
 {
   struct data_editor *de = data;
-  gint max_rows, max_columns;
-  gint r;
-  GtkSheetRange range;
-  PsppireDataStore *ds;
-  GtkSheet *data_sheet = GTK_SHEET (get_widget_assert (de->xml,
-                                                      "data_sheet"));
-
-  data_sheet_set_clip (data_sheet);
-
-
-  /* Now blank all the cells */
-  gtk_sheet_get_selected_range (data_sheet, &range);
-
-  ds = PSPPIRE_DATA_STORE (gtk_sheet_get_model (data_sheet));
-
-
-   /* If nothing selected, then use active cell */
-  if ( range.row0 < 0 || range.col0 < 0 )
-    {
-      gint row, col;
-      gtk_sheet_get_active_cell (data_sheet, &row, &col);
 
-      range.row0 = range.rowi = row;
-      range.col0 = range.coli = col;
-    }
-
-  /* The sheet range can include cells that do not include data.
-     Exclude them from the range. */
-  max_rows = psppire_data_store_get_case_count (ds);
-  if (range.rowi >= max_rows)
-    {
-      if (max_rows == 0)
-        return;
-      range.rowi = max_rows - 1;
-    }
-
-  max_columns = dict_get_var_cnt (ds->dict->dict);
-  if (range.coli >= max_columns)
-    {
-      if (max_columns == 0)
-        return;
-      range.coli = max_columns - 1;
-    }
-
-  g_return_if_fail (range.rowi >= range.row0);
-  g_return_if_fail (range.row0 >= 0);
-  g_return_if_fail (range.coli >= range.col0);
-  g_return_if_fail (range.col0 >= 0);
-
-
-  for (r = range.row0; r <= range.rowi ; ++r )
-    {
-      gint c;
-
-      for (c = range.col0 ; c <= range.coli; ++c)
-       {
-         psppire_data_store_set_string (ds, "", r, c);
-       }
-    }
-
-  /* and remove the selection */
-  gtk_sheet_unselect_range (data_sheet);
+  psppire_data_editor_clip_cut (de->data_editor);
 }
-
-

Index: src/ui/gui/data-editor.glade
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/data-editor.glade,v
retrieving revision 1.42
retrieving revision 1.43
diff -u -b -r1.42 -r1.43
--- src/ui/gui/data-editor.glade        18 Feb 2008 08:35:27 -0000      1.42
+++ src/ui/gui/data-editor.glade        29 Feb 2008 09:13:52 -0000      1.43
@@ -896,113 +896,6 @@
           </packing>
         </child>
         <child>
-          <widget class="GtkNotebook" id="notebook">
-            <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="tab_pos">GTK_POS_BOTTOM</property>
-            <property name="scrollable">True</property>
-            <child>
-              <widget class="GtkVBox" id="vbox3">
-                <property name="visible">True</property>
-                <child>
-                  <widget class="GtkTable" id="table2">
-                    <property name="visible">True</property>
-                    <property name="n_rows">1</property>
-                    <property name="n_columns">2</property>
-                    <child>
-                      <widget class="GtkEntry" id="datum_entry">
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                      </widget>
-                      <packing>
-                        <property name="left_attach">1</property>
-                        <property name="right_attach">2</property>
-                        <property name="y_options"></property>
-                      </packing>
-                    </child>
-                    <child>
-                      <widget class="GtkEntry" id="cell_ref_entry">
-                        <property name="visible">True</property>
-                        <property name="sensitive">False</property>
-                        <property name="editable">False</property>
-                        <property name="width_chars">25</property>
-                      </widget>
-                      <packing>
-                        <property name="x_options">GTK_FILL</property>
-                        <property name="y_options"></property>
-                      </packing>
-                    </child>
-                  </widget>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">False</property>
-                  </packing>
-                </child>
-                <child>
-                  <widget class="GtkScrolledWindow" id="scrolledwindow1">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <child>
-                      <widget class="Custom" id="data_sheet">
-                        <property name="visible">True</property>
-                        <property 
name="creation_function">psppire_data_sheet_create</property>
-                      </widget>
-                    </child>
-                  </widget>
-                  <packing>
-                    <property name="position">1</property>
-                  </packing>
-                </child>
-              </widget>
-              <packing>
-                <property name="tab_expand">False</property>
-              </packing>
-            </child>
-            <child>
-              <widget class="GtkLabel" id="label1">
-                <property name="visible">True</property>
-                <property name="label" translatable="yes">Data View</property>
-              </widget>
-              <packing>
-                <property name="type">tab</property>
-                <property name="tab_expand">False</property>
-                <property name="tab_fill">False</property>
-              </packing>
-            </child>
-            <child>
-              <widget class="GtkScrolledWindow" id="scrolledwindow2">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <child>
-                  <widget class="Custom" id="variable_sheet">
-                    <property name="visible">True</property>
-                    <property 
name="creation_function">psppire_variable_sheet_create</property>
-                  </widget>
-                </child>
-              </widget>
-              <packing>
-                <property name="position">1</property>
-                <property name="tab_expand">False</property>
-              </packing>
-            </child>
-            <child>
-              <widget class="GtkLabel" id="label2">
-                <property name="visible">True</property>
-                <property name="label" translatable="yes">Variable 
View</property>
-              </widget>
-              <packing>
-                <property name="type">tab</property>
-                <property name="position">1</property>
-                <property name="tab_expand">False</property>
-                <property name="tab_fill">False</property>
-              </packing>
-            </child>
-          </widget>
-          <packing>
-            <property name="position">2</property>
-          </packing>
-        </child>
-        <child>
           <placeholder/>
         </child>
         <child>

Index: src/ui/gui/data-editor.h
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/data-editor.h,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -b -r1.32 -r1.33
--- src/ui/gui/data-editor.h    27 Feb 2008 04:04:16 -0000      1.32
+++ src/ui/gui/data-editor.h    29 Feb 2008 09:13:52 -0000      1.33
@@ -21,6 +21,7 @@
 #include <glade/glade.h>
 #include <gtk/gtk.h>
 #include "window-manager.h"
+#include "psppire-data-editor.h"
 
 struct data_editor
 {
@@ -72,6 +73,7 @@
   GtkMenu *data_sheet_variable_popup_menu;
   GtkMenu *data_sheet_cases_popup_menu;
 
+  PsppireDataEditor *data_editor;
 
   gboolean save_as_portable;
 
@@ -88,7 +90,4 @@
 
 void data_editor_select_sheet (struct data_editor *de, gint page);
 
-enum {PAGE_DATA_SHEET = 0, PAGE_VAR_SHEET};
-
-
 #endif

Index: src/ui/gui/descriptives-dialog.c
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/descriptives-dialog.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- src/ui/gui/descriptives-dialog.c    29 Jan 2008 11:12:59 -0000      1.4
+++ src/ui/gui/descriptives-dialog.c    29 Feb 2008 09:13:52 -0000      1.5
@@ -218,10 +218,9 @@
 
   GtkWidget *stats_treeview = get_widget_assert    (xml, "statistics");
 
-  GtkSheet *var_sheet =
-    GTK_SHEET (get_widget_assert (de->xml, "variable_sheet"));
+  PsppireVarStore *vs = NULL;
 
-  PsppireVarStore *vs = PSPPIRE_VAR_STORE (gtk_sheet_get_model (var_sheet));
+  g_object_get (de->data_editor, "var-store", &vs, NULL);
 
   gtk_window_set_transient_for (GTK_WINDOW (dialog), de->parent.window);
 

Index: src/ui/gui/examine-dialog.c
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/examine-dialog.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- src/ui/gui/examine-dialog.c 18 Feb 2008 08:35:27 -0000      1.1
+++ src/ui/gui/examine-dialog.c 29 Feb 2008 09:13:52 -0000      1.2
@@ -256,10 +256,9 @@
   GtkWidget *fct_selector = get_widget_assert (xml, "psppire-selector2");
   GtkWidget *id_selector = get_widget_assert (xml, "psppire-selector3");
 
-  GtkSheet *var_sheet =
-    GTK_SHEET (get_widget_assert (de->xml, "variable_sheet"));
+  PsppireVarStore *vs = NULL;
 
-  PsppireVarStore *vs = PSPPIRE_VAR_STORE (gtk_sheet_get_model (var_sheet));
+  g_object_get (de->data_editor, "var-store", &vs, NULL);
 
   ex_d.dep_list =   get_widget_assert   (xml, "treeview2");
   ex_d.fct_list =   get_widget_assert   (xml, "treeview3");

Index: src/ui/gui/find-dialog.c
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/find-dialog.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -b -r1.7 -r1.8
--- src/ui/gui/find-dialog.c    10 Feb 2008 08:17:50 -0000      1.7
+++ src/ui/gui/find-dialog.c    29 Feb 2008 09:13:52 -0000      1.8
@@ -54,7 +54,6 @@
 {
   GladeXML *xml;
   PsppireDict *dict;
-  GtkSheet *data_sheet;
   struct datasheet *data;
   struct data_editor *de;
   GtkWidget *variable_entry;
@@ -104,22 +103,27 @@
 {
   casenumber x = -1;
   gint column = -1;
-  gint row;
-  gtk_sheet_get_active_cell (fd->data_sheet, &row, NULL);
+  glong row;
+
+  g_object_get (fd->de->data_editor, "current-case", &row, NULL);
 
   if ( row < 0 )
     row = 0;
 
   find_value (fd, row, &x, &column);
 
+
   if ( x != -1)
     {
-      data_editor_select_sheet (fd->de, PAGE_DATA_SHEET);
+      gtk_notebook_set_page (GTK_NOTEBOOK (fd->de->data_editor),
+                            PSPPIRE_DATA_EDITOR_DATA_VIEW);
 
-      gtk_sheet_moveto (fd->data_sheet, x, column, 0.5, 0.5);
-
-      gtk_sheet_set_active_cell (fd->data_sheet, x, column);
+      g_object_set (fd->de->data_editor,
+                   "current-case", x,
+                   "current-variable", column,
+                   NULL);
     }
+
 }
 
 /* Callback on the selector.
@@ -191,8 +195,6 @@
   GtkWidget *selector;
   GtkWidget *find_button;
 
-  GtkSheet *var_sheet;
-  GtkSheet *data_sheet ;
   GtkWidget *buttonbox;
 
   PsppireVarStore *vs  ;
@@ -213,15 +215,13 @@
   source = get_widget_assert (fd.xml, "find-variable-treeview");
   selector = get_widget_assert (fd.xml, "find-selector");
 
-  var_sheet = GTK_SHEET (get_widget_assert (de->xml, "variable_sheet"));
-  data_sheet = GTK_SHEET (get_widget_assert (de->xml, "data_sheet"));
-
-  vs = PSPPIRE_VAR_STORE (gtk_sheet_get_model (var_sheet));
-  ds = PSPPIRE_DATA_STORE (gtk_sheet_get_model (data_sheet));
+  g_object_get (de->data_editor,
+               "var-store", &vs,
+               "data-store", &ds,
+               NULL);
 
   fd.dict = vs->dict;
   fd.data = ds->case_file->datasheet;
-  fd.data_sheet = data_sheet;
 
   fd.variable_entry        = get_widget_assert (fd.xml, "find-variable-entry");
   fd.value_entry           = get_widget_assert (fd.xml, "find-value-entry");

Index: src/ui/gui/frequencies-dialog.c
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/frequencies-dialog.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- src/ui/gui/frequencies-dialog.c     29 Jan 2008 11:13:00 -0000      1.3
+++ src/ui/gui/frequencies-dialog.c     29 Feb 2008 09:13:52 -0000      1.4
@@ -321,10 +321,9 @@
   GtkWidget *format_button = get_widget_assert (xml, "button1");
   GtkWidget *stats_treeview = get_widget_assert (xml, "stats-treeview");
 
-  GtkSheet *var_sheet =
-    GTK_SHEET (get_widget_assert (de->xml, "variable_sheet"));
+  PsppireVarStore *vs = NULL;
 
-  PsppireVarStore *vs = PSPPIRE_VAR_STORE (gtk_sheet_get_model (var_sheet));
+  g_object_get (de->data_editor, "var-store", &vs, NULL);
 
   put_checkbox_items_in_treeview (GTK_TREE_VIEW(stats_treeview),
                                  B_FS_DEFAULT,
@@ -333,8 +332,6 @@
                                  );
 
 
-
-
   gtk_window_set_transient_for (GTK_WINDOW (dialog), de->parent.window);
 
   attach_dictionary_to_treeview (GTK_TREE_VIEW (source),

Index: src/ui/gui/goto-case-dialog.c
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/goto-case-dialog.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- src/ui/gui/goto-case-dialog.c       4 Oct 2007 02:41:54 -0000       1.2
+++ src/ui/gui/goto-case-dialog.c       29 Feb 2008 09:13:52 -0000      1.3
@@ -27,17 +27,14 @@
 static void
 refresh (const struct data_editor *de, GladeXML *xml)
 {
-  GtkSheet *data_sheet =
-    GTK_SHEET (get_widget_assert (de->xml, "data_sheet"));
+  PsppireDataStore *ds = NULL;
+  casenumber case_count ;
 
-  PsppireDataStore *ds =
-    PSPPIRE_DATA_STORE (gtk_sheet_get_model (data_sheet));
+  GtkWidget *case_num_entry = get_widget_assert (xml, 
"goto-case-case-num-entry");
 
-  GtkWidget *case_num_entry =
-    get_widget_assert (xml, "goto-case-case-num-entry");
+  g_object_get (de->data_editor, "data-store", &ds, NULL);
 
-  casenumber case_count =
-    psppire_data_store_get_case_count (ds);
+  case_count =  psppire_data_store_get_case_count (ds);
 
   gtk_spin_button_set_range (GTK_SPIN_BUTTON (case_num_entry),
                             1, case_count);
@@ -61,24 +58,13 @@
 
   if ( response == PSPPIRE_RESPONSE_GOTO )
     {
-      gint row, column;
-      GtkSheet *data_sheet =
-       GTK_SHEET (get_widget_assert (de->xml, "data_sheet"));
-
-
+      glong case_num;
       GtkWidget *case_num_entry =
        get_widget_assert (xml, "goto-case-case-num-entry");
 
-      gtk_sheet_get_active_cell (data_sheet, &row, &column);
-
-      row =
-       gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (case_num_entry))
+      case_num = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON 
(case_num_entry))
        - FIRST_CASE_NUMBER ;
 
-      gtk_sheet_moveto (data_sheet,
-                       row, column,
-                       0.5, 0.5);
-
-      gtk_sheet_set_active_cell (data_sheet, row, column);
+      g_object_set (de->data_editor, "current-case", case_num, NULL);
     }
 }

Index: src/ui/gui/oneway-anova-dialog.c
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/oneway-anova-dialog.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- src/ui/gui/oneway-anova-dialog.c    29 Jan 2008 11:13:00 -0000      1.3
+++ src/ui/gui/oneway-anova-dialog.c    29 Feb 2008 09:13:53 -0000      1.4
@@ -129,15 +129,12 @@
   gint response;
   struct data_editor *de = data;
 
-  PsppireVarStore *vs;
+  PsppireVarStore *vs = NULL;
 
   GladeXML *xml = XML_NEW ("oneway.glade");
 
   struct oneway_anova_dialog ow;
 
-  GtkSheet *var_sheet =
-    GTK_SHEET (get_widget_assert (de->xml, "variable_sheet"));
-
   GtkWidget *dict_view =
     get_widget_assert (xml, "oneway-anova-treeview1");
 
@@ -165,7 +162,7 @@
   ow.homogeneity =
     GTK_TOGGLE_BUTTON (get_widget_assert (xml, "checkbutton2"));
 
-  vs = PSPPIRE_VAR_STORE (gtk_sheet_get_model (var_sheet));
+  g_object_get (de->data_editor, "var-store", &vs, NULL);
 
   ow.dict = vs->dict;
 

Index: src/ui/gui/psppire-var-store.c
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/psppire-var-store.c,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -b -r1.29 -r1.30
--- src/ui/gui/psppire-var-store.c      20 Feb 2008 05:06:48 -0000      1.29
+++ src/ui/gui/psppire-var-store.c      29 Feb 2008 09:13:53 -0000      1.30
@@ -28,7 +28,7 @@
 #include <gtksheet/gsheetmodel.h>
 
 #include "psppire-var-store.h"
-#include "var-sheet.h"
+#include <gtksheet/gsheet-row-iface.h>
 #include "helper.h"
 
 #include <data/dictionary.h>
@@ -262,7 +262,7 @@
   if ( !pv )
     return TRUE;
 
-  if ( var_is_alpha (pv) && column == COL_DECIMALS )
+  if ( var_is_alpha (pv) && column == PSPPIRE_VAR_STORE_COL_DECIMALS )
     return FALSE;
 
   write_spec = var_get_print_format (pv);
@@ -282,7 +282,7 @@
     case FMT_DTIME:
     case FMT_WKDAY:
     case FMT_MONTH:
-      if ( column == COL_DECIMALS || column == COL_WIDTH)
+      if ( column == PSPPIRE_VAR_STORE_COL_DECIMALS || column == 
PSPPIRE_VAR_STORE_COL_WIDTH)
        return FALSE;
       break;
     default:
@@ -375,7 +375,7 @@
   GSheetModel *model = G_SHEET_MODEL (data);
 
   g_sheet_model_range_changed (model,
-                                n, 0, n, n_COLS);
+                                n, 0, n, PSPPIRE_VAR_STORE_n_COLS);
 }
 
 
@@ -480,7 +480,7 @@
 
   switch (col)
     {
-    case COL_LABEL:
+    case PSPPIRE_VAR_STORE_COL_LABEL:
       var_set_label (pv, 0);
       return TRUE;
       break;
@@ -511,15 +511,15 @@
 
   switch (col)
     {
-    case COL_NAME:
+    case PSPPIRE_VAR_STORE_COL_NAME:
       return psppire_dict_rename_var (var_store->dict, pv, text);
       break;
-    case COL_COLUMNS:
+    case PSPPIRE_VAR_STORE_COL_COLUMNS:
       if ( ! text) return FALSE;
       var_set_display_width (pv, atoi (text));
       return TRUE;
       break;
-    case COL_WIDTH:
+    case PSPPIRE_VAR_STORE_COL_WIDTH:
       {
        int width = atoi (text);
        if ( ! text) return FALSE;
@@ -545,7 +545,7 @@
        return TRUE;
       }
       break;
-    case COL_DECIMALS:
+    case PSPPIRE_VAR_STORE_COL_DECIMALS:
       {
         bool for_input
           = var_store->format_type == PSPPIRE_VAR_STORE_INPUT_FORMATS;
@@ -566,15 +566,15 @@
        return TRUE;
       }
       break;
-    case COL_LABEL:
+    case PSPPIRE_VAR_STORE_COL_LABEL:
       var_set_label (pv, text);
       return TRUE;
       break;
-    case COL_TYPE:
-    case COL_VALUES:
-    case COL_MISSING:
-    case COL_ALIGN:
-    case COL_MEASURE:
+    case PSPPIRE_VAR_STORE_COL_TYPE:
+    case PSPPIRE_VAR_STORE_COL_VALUES:
+    case PSPPIRE_VAR_STORE_COL_MISSING:
+    case PSPPIRE_VAR_STORE_COL_ALIGN:
+    case PSPPIRE_VAR_STORE_COL_MEASURE:
       /* These can be modified only by their respective dialog boxes */
       return FALSE;
       break;
@@ -610,10 +610,10 @@
 
   switch (c)
     {
-    case COL_NAME:
+    case PSPPIRE_VAR_STORE_COL_NAME:
       return pspp_locale_to_utf8 ( var_get_name (pv), -1, err);
       break;
-    case COL_TYPE:
+    case PSPPIRE_VAR_STORE_COL_TYPE:
       {
        switch ( write_spec->type )
          {
@@ -667,7 +667,7 @@
          }
       }
       break;
-    case COL_WIDTH:
+    case PSPPIRE_VAR_STORE_COL_WIDTH:
       {
        gchar *s;
        GString *gstr = g_string_sized_new (10);
@@ -677,7 +677,7 @@
        return s;
       }
       break;
-    case COL_DECIMALS:
+    case PSPPIRE_VAR_STORE_COL_DECIMALS:
       {
        gchar *s;
        GString *gstr = g_string_sized_new (10);
@@ -687,7 +687,7 @@
        return s;
       }
       break;
-    case COL_COLUMNS:
+    case PSPPIRE_VAR_STORE_COL_COLUMNS:
       {
        gchar *s;
        GString *gstr = g_string_sized_new (10);
@@ -697,16 +697,16 @@
        return s;
       }
       break;
-    case COL_LABEL:
+    case PSPPIRE_VAR_STORE_COL_LABEL:
       return pspp_locale_to_utf8 (var_get_label (pv), -1, err);
       break;
 
-    case COL_MISSING:
+    case PSPPIRE_VAR_STORE_COL_MISSING:
       {
        return missing_values_to_string (pv, err);
       }
       break;
-    case COL_VALUES:
+    case PSPPIRE_VAR_STORE_COL_VALUES:
       {
        if ( ! var_has_value_labels (pv))
          return g_locale_to_utf8 (gettext (none), -1, 0, 0, err);
@@ -735,7 +735,7 @@
          }
       }
       break;
-    case COL_ALIGN:
+    case PSPPIRE_VAR_STORE_COL_ALIGN:
       {
        const gint align = var_get_alignment (pv);
 
@@ -743,7 +743,7 @@
        return g_locale_to_utf8 (gettext (alignments[align]), -1, 0, 0, err);
       }
       break;
-    case COL_MEASURE:
+    case PSPPIRE_VAR_STORE_COL_MEASURE:
       {
        return measure_to_string (pv, err);
       }
@@ -789,7 +789,7 @@
 static glong
 psppire_var_store_get_column_count (const GSheetModel * model)
 {
-  return n_COLS ;
+  return PSPPIRE_VAR_STORE_n_COLS ;
 }
 
 

Index: src/ui/gui/psppire-var-store.h
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/psppire-var-store.h,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -b -r1.11 -r1.12
--- src/ui/gui/psppire-var-store.h      20 Feb 2008 05:06:48 -0000      1.11
+++ src/ui/gui/psppire-var-store.h      29 Feb 2008 09:13:53 -0000      1.12
@@ -98,4 +98,19 @@
 
 G_END_DECLS
 
+
+enum {
+ PSPPIRE_VAR_STORE_COL_NAME,
+ PSPPIRE_VAR_STORE_COL_TYPE,
+ PSPPIRE_VAR_STORE_COL_WIDTH,
+ PSPPIRE_VAR_STORE_COL_DECIMALS,
+ PSPPIRE_VAR_STORE_COL_LABEL,
+ PSPPIRE_VAR_STORE_COL_VALUES,
+ PSPPIRE_VAR_STORE_COL_MISSING,
+ PSPPIRE_VAR_STORE_COL_COLUMNS,
+ PSPPIRE_VAR_STORE_COL_ALIGN,
+ PSPPIRE_VAR_STORE_COL_MEASURE,
+ PSPPIRE_VAR_STORE_n_COLS
+};
+
 #endif /* __PSPPIRE_VAR_STORE_H__ */

Index: src/ui/gui/psppire.c
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/psppire.c,v
retrieving revision 1.59
retrieving revision 1.60
diff -u -b -r1.59 -r1.60
--- src/ui/gui/psppire.c        2 Feb 2008 06:40:30 -0000       1.59
+++ src/ui/gui/psppire.c        29 Feb 2008 09:13:53 -0000      1.60
@@ -46,8 +46,6 @@
 #include "psppire-var-store.h"
 #include "psppire-data-store.h"
 #include "helper.h"
-#include "data-sheet.h"
-#include "var-sheet.h"
 #include "message-dialog.h"
 
 #include "output-viewer.h"

Index: src/ui/gui/rank-dialog.c
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/rank-dialog.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- src/ui/gui/rank-dialog.c    29 Jan 2008 11:13:00 -0000      1.2
+++ src/ui/gui/rank-dialog.c    29 Feb 2008 09:13:53 -0000      1.3
@@ -235,11 +235,9 @@
   GtkWidget *types_button = get_widget_assert (xml, "button1");
   GtkWidget *ties_button = get_widget_assert (xml, "button2");
 
-  GtkSheet *var_sheet =
-    GTK_SHEET (get_widget_assert (de->xml, "variable_sheet"));
-
-  PsppireVarStore *vs = PSPPIRE_VAR_STORE (gtk_sheet_get_model (var_sheet));
+  PsppireVarStore *vs = NULL;
 
+  g_object_get (de->data_editor, "var-store", &vs, NULL);
 
   rd.dict = vs->dict;
   rd.rank_vars =   get_widget_assert (xml, "variables-treeview");

Index: src/ui/gui/recode-dialog.c
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/recode-dialog.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- src/ui/gui/recode-dialog.c  3 Feb 2008 05:26:05 -0000       1.3
+++ src/ui/gui/recode-dialog.c  29 Feb 2008 09:13:53 -0000      1.4
@@ -374,7 +374,7 @@
   COL_OLD,
   COL_NEW_NAME,
   COL_NEW_LABEL,
-  n_COLS
+  n_COL_VARS
 };
 
 enum {
@@ -853,11 +853,10 @@
 
   GtkWidget *output_variable_box = get_widget_assert (xml,"frame4");
 
-  GtkSheet *var_sheet =
-    GTK_SHEET (get_widget_assert (de->xml, "variable_sheet"));
 
+  PsppireVarStore *vs = NULL;
 
-  PsppireVarStore *vs = PSPPIRE_VAR_STORE (gtk_sheet_get_model (var_sheet));
+  g_object_get (de->data_editor, "var-store", &vs, NULL);
 
   rd.change_button = get_widget_assert (xml, "change-button");
 
@@ -903,7 +902,7 @@
       GtkTreeViewColumn *col;
       GtkCellRenderer *renderer = gtk_cell_renderer_text_new ();
 
-      rd.var_map = gtk_list_store_new (n_COLS, G_TYPE_INT,
+      rd.var_map = gtk_list_store_new (n_COL_VARS, G_TYPE_INT,
                                                    G_TYPE_STRING,
                                                    G_TYPE_STRING);
 

Index: src/ui/gui/select-cases-dialog.c
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/select-cases-dialog.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- src/ui/gui/select-cases-dialog.c    29 Jan 2008 11:13:00 -0000      1.3
+++ src/ui/gui/select-cases-dialog.c    29 Feb 2008 09:13:53 -0000      1.4
@@ -253,12 +253,7 @@
 
   scd.xml = XML_NEW ("psppire.glade");
 
-  {
-    GtkSheet *data_sheet =
-      GTK_SHEET (get_widget_assert (de->xml, "data_sheet"));
-
-    scd.data_store = PSPPIRE_DATA_STORE (gtk_sheet_get_model (data_sheet));
-  }
+  g_object_get (de->data_editor, "data-store", &scd.data_store, NULL);
 
   button_range = get_widget_assert (scd.xml, "button-range");
   button_sample = get_widget_assert (scd.xml, "button-sample");

Index: src/ui/gui/sort-cases-dialog.c
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/sort-cases-dialog.c,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -b -r1.12 -r1.13
--- src/ui/gui/sort-cases-dialog.c      8 Feb 2008 03:33:43 -0000       1.12
+++ src/ui/gui/sort-cases-dialog.c      29 Feb 2008 09:13:54 -0000      1.13
@@ -105,10 +105,9 @@
   GtkWidget *selector = get_widget_assert (xml, "sort-cases-selector");
   GtkWidget *dest =   get_widget_assert   (xml, "sort-cases-treeview2");
 
-  GtkSheet *var_sheet =
-    GTK_SHEET (get_widget_assert (de->xml, "variable_sheet"));
+  PsppireVarStore *vs = NULL;
 
-  PsppireVarStore *vs = PSPPIRE_VAR_STORE (gtk_sheet_get_model (var_sheet));
+  g_object_get (de->data_editor, "var-store", &vs, NULL);
 
   gtk_window_set_transient_for (GTK_WINDOW (dialog), de->parent.window);
 

Index: src/ui/gui/split-file-dialog.c
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/split-file-dialog.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -b -r1.6 -r1.7
--- src/ui/gui/split-file-dialog.c      29 Jan 2008 11:13:00 -0000      1.6
+++ src/ui/gui/split-file-dialog.c      29 Feb 2008 09:13:54 -0000      1.7
@@ -178,8 +178,6 @@
   GtkWidget *selector ;
   GtkWidget *on_off   ;
 
-  GtkSheet *var_sheet ;
-
   sfd.xml = XML_NEW ("psppire.glade");
 
   dialog = get_widget_assert   (sfd.xml, "split-file-dialog");
@@ -188,9 +186,7 @@
   selector = get_widget_assert (sfd.xml, "split-file-selector");
   on_off = get_widget_assert   (sfd.xml, "split-radiobutton0");
 
-  var_sheet = GTK_SHEET (get_widget_assert (de->xml, "variable_sheet"));
-
-  vs = PSPPIRE_VAR_STORE (gtk_sheet_get_model (var_sheet));
+  g_object_get (de->data_editor, "var-store", &vs, NULL);
 
   sfd.dict = vs->dict;
   sfd.tv = GTK_TREE_VIEW (dest);

Index: src/ui/gui/t-test-independent-samples-dialog.c
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/t-test-independent-samples-dialog.c,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -b -r1.10 -r1.11
--- src/ui/gui/t-test-independent-samples-dialog.c      3 Feb 2008 04:15:34 
-0000       1.10
+++ src/ui/gui/t-test-independent-samples-dialog.c      29 Feb 2008 09:13:54 
-0000      1.11
@@ -397,13 +397,10 @@
   gint response;
   struct data_editor *de = data;
 
-  PsppireVarStore *vs;
+  PsppireVarStore *vs = NULL;
 
   GladeXML *xml = XML_NEW ("t-test.glade");
 
-  GtkSheet *var_sheet =
-    GTK_SHEET (get_widget_assert (de->xml, "variable_sheet"));
-
   GtkWidget *dict_view =
     get_widget_assert (xml, "indep-samples-t-test-treeview1");
 
@@ -419,7 +416,7 @@
   GtkWidget *options_button =
     get_widget_assert (xml, "indep-samples-t-test-options-button");
 
-  vs = PSPPIRE_VAR_STORE (gtk_sheet_get_model (var_sheet));
+  g_object_get (de->data_editor, "var-store", &vs, NULL);
 
   tt_d.dialog = get_widget_assert (xml, "t-test-independent-samples-dialog");
   tt_d.xml = xml;

Index: src/ui/gui/t-test-one-sample.c
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/t-test-one-sample.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- src/ui/gui/t-test-one-sample.c      29 Jan 2008 11:13:01 -0000      1.2
+++ src/ui/gui/t-test-one-sample.c      29 Feb 2008 09:13:54 -0000      1.3
@@ -127,13 +127,10 @@
   gint response;
   struct data_editor *de = data;
 
-  PsppireVarStore *vs;
+  PsppireVarStore *vs = NULL;
 
   GladeXML *xml = XML_NEW ("t-test.glade");
 
-  GtkSheet *var_sheet =
-    GTK_SHEET (get_widget_assert (de->xml, "variable_sheet"));
-
   GtkWidget *dict_view =
     get_widget_assert (xml, "one-sample-t-test-treeview2");
 
@@ -144,7 +141,7 @@
 
   GtkWidget *dialog = get_widget_assert (xml, "t-test-one-sample-dialog");
 
-  vs = PSPPIRE_VAR_STORE (gtk_sheet_get_model (var_sheet));
+  g_object_get (de->data_editor, "var-store", &vs, NULL);
 
   tt_d.dict = vs->dict;
   tt_d.vars_treeview = get_widget_assert (xml, "one-sample-t-test-treeview1");

Index: src/ui/gui/t-test-paired-samples.c
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/t-test-paired-samples.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- src/ui/gui/t-test-paired-samples.c  3 Feb 2008 04:15:34 -0000       1.2
+++ src/ui/gui/t-test-paired-samples.c  29 Feb 2008 09:13:54 -0000      1.3
@@ -186,13 +186,10 @@
   gint response;
   struct data_editor *de = data;
 
-  PsppireVarStore *vs;
+  PsppireVarStore *vs = NULL;
 
   GladeXML *xml = XML_NEW ("t-test.glade");
 
-  GtkSheet *var_sheet =
-    GTK_SHEET (get_widget_assert (de->xml, "variable_sheet"));
-
   GtkWidget *dict_view =
     get_widget_assert (xml, "paired-samples-t-test-treeview1");
 
@@ -202,7 +199,7 @@
 
   GtkWidget *dialog = get_widget_assert (xml, "t-test-paired-samples-dialog");
 
-  vs = PSPPIRE_VAR_STORE (gtk_sheet_get_model (var_sheet));
+  g_object_get (de->data_editor, "var-store", &vs, NULL);
 
   tt_d.dict = vs->dict;
   tt_d.pairs_treeview =

Index: src/ui/gui/transpose-dialog.c
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/transpose-dialog.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -b -r1.9 -r1.10
--- src/ui/gui/transpose-dialog.c       8 Feb 2008 03:33:43 -0000       1.9
+++ src/ui/gui/transpose-dialog.c       29 Feb 2008 09:13:54 -0000      1.10
@@ -85,10 +85,7 @@
 
   GladeXML *xml = XML_NEW ("psppire.glade");
 
-  GtkSheet *var_sheet =
-    GTK_SHEET (get_widget_assert (de->xml, "variable_sheet"));
-
-  PsppireVarStore *vs = PSPPIRE_VAR_STORE (gtk_sheet_get_model (var_sheet));
+  PsppireVarStore *vs = NULL;
 
   GtkWidget *dialog = get_widget_assert (xml, "transpose-dialog");
   GtkWidget *source = get_widget_assert (xml, "source-treeview");
@@ -97,6 +94,8 @@
   GtkWidget *selector2 = get_widget_assert (xml, "psppire-selector3");
   GtkWidget *new_name_entry = get_widget_assert (xml, "new-name-entry");
 
+  g_object_get (de->data_editor, "var-store", &vs, NULL);
+
   attach_dictionary_to_treeview (GTK_TREE_VIEW (source),
                                 vs->dict,
                                 GTK_SELECTION_MULTIPLE, NULL);

Index: src/ui/gui/var-display.c
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/var-display.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- src/ui/gui/var-display.c    11 Nov 2007 05:51:44 -0000      1.3
+++ src/ui/gui/var-display.c    29 Feb 2008 09:13:54 -0000      1.4
@@ -4,7 +4,6 @@
 #include <data/variable.h>
 #include <stdlib.h>
 
-#include "var-sheet.h"
 #include <gettext.h>
 #define _(msgid) gettext (msgid)
 #define N_(msgid) msgid

Index: src/ui/gui/var-display.h
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/var-display.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- src/ui/gui/var-display.h    7 Jul 2007 06:14:30 -0000       1.2
+++ src/ui/gui/var-display.h    29 Feb 2008 09:13:54 -0000      1.3
@@ -19,9 +19,16 @@
 #define VAR_DISPLAY 1
 
 #include <glib.h>
+#include <data/variable.h>
 
 struct variable;
 
+#define n_ALIGNMENTS 3
+
+extern const gchar *const alignments[n_ALIGNMENTS + 1];
+
+extern const gchar *const measures[n_MEASURES + 1];
+
 
 gchar * name_to_string (const struct variable *var, GError **err);
 

Index: src/ui/gui/variable-info-dialog.c
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/variable-info-dialog.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- src/ui/gui/variable-info-dialog.c   13 Feb 2008 02:59:30 -0000      1.4
+++ src/ui/gui/variable-info-dialog.c   29 Feb 2008 09:13:54 -0000      1.5
@@ -173,11 +173,9 @@
   GtkWidget *treeview = get_widget_assert (xml, "treeview2");
   GtkWidget *textview = get_widget_assert (xml, "textview1");
 
-  GtkSheet *var_sheet =
-    GTK_SHEET (get_widget_assert (de->xml, "variable_sheet"));
+  PsppireVarStore *vs = NULL;
 
-
-  PsppireVarStore *vs = PSPPIRE_VAR_STORE (gtk_sheet_get_model (var_sheet));
+  g_object_get (de->data_editor, "var-store", &vs, NULL);
 
   gtk_window_set_transient_for (GTK_WINDOW (dialog), de->parent.window);
 
@@ -202,36 +200,15 @@
     {
     case PSPPIRE_RESPONSE_GOTO:
       {
-       gint row, col;
-       GtkNotebook *notebook = GTK_NOTEBOOK
-         (get_widget_assert (de->xml,"notebook"));
-
        const struct variable *var =
          get_selected_variable (GTK_TREE_VIEW (treeview));
 
        if ( NULL == var)
          goto done;
 
-
-       if (PAGE_VAR_SHEET == gtk_notebook_get_current_page (notebook))
-         {
-           GtkSheet *var_sheet =
-             GTK_SHEET (get_widget_assert (de->xml, "variable_sheet"));
-
-           gtk_sheet_get_active_cell (var_sheet, &row, &col);
-           row = var_get_dict_index (var);
-           gtk_sheet_set_active_cell (var_sheet, row, col);
+       g_object_set (de->data_editor, "current-variable",  var_get_dict_index 
(var), NULL);
          }
-       else
-         {
-           GtkSheet *data_sheet =
-             GTK_SHEET (get_widget_assert (de->xml, "data_sheet"));
 
-           gtk_sheet_get_active_cell (data_sheet, &row, &col);
-           col = var_get_dict_index (var);
-           gtk_sheet_set_active_cell (data_sheet, row, col);
-         }
-      }
       break;
     case PSPPIRE_RESPONSE_PASTE:
       {

Index: src/ui/gui/weight-cases-dialog.c
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/weight-cases-dialog.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -b -r1.6 -r1.7
--- src/ui/gui/weight-cases-dialog.c    29 Jan 2008 11:13:01 -0000      1.6
+++ src/ui/gui/weight-cases-dialog.c    29 Feb 2008 09:13:55 -0000      1.7
@@ -120,10 +120,9 @@
   GtkWidget *radiobutton2 = get_widget_assert (xml, "radiobutton2");
   GtkWidget *status  = get_widget_assert (xml, "weight-status-label");
 
-  GtkSheet *var_sheet =
-    GTK_SHEET (get_widget_assert (de->xml, "variable_sheet"));
+  PsppireVarStore *vs = NULL;
 
-  PsppireVarStore *vs = PSPPIRE_VAR_STORE (gtk_sheet_get_model (var_sheet));
+  g_object_get (de->data_editor, "var-store", &vs,  NULL);
 
   gtk_window_set_transient_for (GTK_WINDOW (dialog), de->parent.window);
 

Index: src/ui/gui/psppire-data-editor.c
===================================================================
RCS file: src/ui/gui/psppire-data-editor.c
diff -N src/ui/gui/psppire-data-editor.c
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ src/ui/gui/psppire-data-editor.c    29 Feb 2008 09:13:53 -0000      1.1
@@ -0,0 +1,1440 @@
+/* PSPPIRE - a graphical user interface for PSPP.
+   Copyrigght (C) 2008 Free Software Foundation, Inc.
+
+   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
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+#include <gtk/gtksignal.h>
+#include <gtk/gtk.h>
+#include <gtksheet/gtksheet.h>
+#include "psppire-data-editor.h"
+#include "psppire-var-sheet.h"
+
+#include <gtksheet/gsheet-hetero-column.h>
+#include <language/syntax-string-source.h>
+#include "psppire-data-store.h"
+#include "helper.h"
+
+#include <gettext.h>
+#define _(msgid) gettext (msgid)
+#define N_(msgid) msgid
+
+
+enum {
+  DATA_SELECTION_CHANGED,
+  DATA_AVAILABLE_CHANGED,
+  CASES_SELECTED,
+  VARIABLES_SELECTED,
+  n_SIGNALS
+};
+
+
+static guint data_editor_signals [n_SIGNALS] = { 0 };
+
+
+static gboolean data_is_selected (PsppireDataEditor *de);
+
+static void psppire_data_editor_class_init          (PsppireDataEditorClass 
*klass);
+static void psppire_data_editor_init                (PsppireDataEditor      
*de);
+
+GType
+psppire_data_editor_get_type (void)
+{
+  static GType de_type = 0;
+
+  if (!de_type)
+    {
+      static const GTypeInfo de_info =
+      {
+       sizeof (PsppireDataEditorClass),
+       NULL, /* base_init */
+        NULL, /* base_finalize */
+       (GClassInitFunc) psppire_data_editor_class_init,
+        NULL, /* class_finalize */
+       NULL, /* class_data */
+        sizeof (PsppireDataEditor),
+       0,
+       (GInstanceInitFunc) psppire_data_editor_init,
+      };
+
+      de_type = g_type_register_static (GTK_TYPE_NOTEBOOK, "PsppireDataEditor",
+                                       &de_info, 0);
+    }
+
+  return de_type;
+}
+
+static GObjectClass * parent_class = NULL;
+
+static void
+psppire_data_editor_dispose (GObject *obj)
+{
+  PsppireDataEditor *de = (PsppireDataEditor *) obj;
+
+  if (de->dispose_has_run)
+    return;
+
+  g_object_unref (de->data_store);
+  g_object_unref (de->var_store);
+
+  /* Make sure dispose does not run twice. */
+  de->dispose_has_run = TRUE;
+
+  /* Chain up to the parent class */
+  G_OBJECT_CLASS (parent_class)->dispose (obj);
+}
+
+static void
+psppire_data_editor_finalize (GObject *obj)
+{
+   /* Chain up to the parent class */
+   G_OBJECT_CLASS (parent_class)->finalize (obj);
+}
+
+
+
+static void popup_variable_menu (GtkSheet *sheet, gint column,
+                                GdkEventButton *event, gpointer data);
+
+static void popup_cases_menu (GtkSheet *sheet, gint row,
+                             GdkEventButton *event, gpointer data);
+
+
+
+
+/* Callback which occurs when the data sheet's column title
+   is double clicked */
+static gboolean
+on_data_column_clicked (PsppireDataEditor *de, gint col, gpointer data)
+{
+
+  gint current_row, current_column;
+
+  gtk_notebook_set_current_page (GTK_NOTEBOOK (de), 
PSPPIRE_DATA_EDITOR_VARIABLE_VIEW);
+
+  gtk_sheet_get_active_cell (GTK_SHEET (de->var_sheet),
+                            &current_row, &current_column);
+
+  gtk_sheet_set_active_cell (GTK_SHEET (de->var_sheet), col, current_column);
+
+  return FALSE;
+}
+
+
+/* Callback which occurs when the var sheet's row title
+   button is double clicked */
+static gboolean
+on_var_row_clicked (PsppireDataEditor *de, gint row, gpointer data)
+{
+  GtkSheetRange visible_range;
+
+  gint current_row, current_column;
+
+  gtk_notebook_set_current_page (GTK_NOTEBOOK(de), 
PSPPIRE_DATA_EDITOR_DATA_VIEW);
+
+  gtk_sheet_get_active_cell (GTK_SHEET (de->data_sheet),
+                            &current_row, &current_column);
+
+  gtk_sheet_set_active_cell (GTK_SHEET (de->data_sheet), current_row, row);
+
+  gtk_sheet_get_visible_range (GTK_SHEET (de->data_sheet), &visible_range);
+
+  if ( row < visible_range.col0 || row > visible_range.coli)
+    {
+      gtk_sheet_moveto (GTK_SHEET (de->data_sheet),
+                       current_row, row, 0, 0);
+    }
+
+  return FALSE;
+}
+
+
+
+enum
+  {
+    PROP_0,
+    PROP_DATA_STORE,
+    PROP_VAR_STORE,
+    PROP_COLUMN_MENU,
+    PROP_ROW_MENU,
+    PROP_VALUE_LABELS,
+    PROP_CURRENT_CASE,
+    PROP_CURRENT_VAR,
+    PROP_DATA_SELECTED
+  };
+
+static void
+psppire_data_editor_set_property (GObject         *object,
+                                 guint            prop_id,
+                                 const GValue    *value,
+                                 GParamSpec      *pspec)
+{
+  PsppireDataEditor *de = PSPPIRE_DATA_EDITOR (object);
+
+  switch (prop_id)
+    {
+    case PROP_DATA_STORE:
+      if ( de->data_store) g_object_unref (de->data_store);
+      de->data_store = g_value_get_pointer (value);
+      g_object_ref (de->data_store);
+
+      g_object_set (de->data_sheet,
+                   "row-geometry", de->data_store,
+                   "column-geometry", de->data_store,
+                   "model", de->data_store,
+                   NULL);
+      break;
+    case PROP_VAR_STORE:
+      if ( de->var_store) g_object_unref (de->var_store);
+      de->var_store = g_value_get_pointer (value);
+      g_object_ref (de->var_store);
+
+      g_object_set (de->var_sheet,
+                   "row-geometry", de->var_store,
+                   "model", de->var_store,
+                   NULL);
+      break;
+    case PROP_COLUMN_MENU:
+      {
+       GObject *menu = g_value_get_object (value);
+
+       g_signal_connect (de->data_sheet, "button-event-column",
+                         G_CALLBACK (popup_variable_menu), menu);
+      }
+      break;
+    case PROP_ROW_MENU:
+      {
+       GObject *menu = g_value_get_object (value);
+
+       g_signal_connect (de->data_sheet, "button-event-row",
+                         G_CALLBACK (popup_cases_menu), menu);
+      }
+      break;
+    case PROP_CURRENT_VAR:
+      {
+       gint row, col;
+       gint var = g_value_get_long (value);
+       switch (gtk_notebook_get_current_page (GTK_NOTEBOOK (object)))
+         {
+         case PSPPIRE_DATA_EDITOR_DATA_VIEW:
+           gtk_sheet_get_active_cell (GTK_SHEET (de->data_sheet), &row, &col);
+           gtk_sheet_set_active_cell (GTK_SHEET (de->data_sheet), row, var);
+           gtk_sheet_moveto (GTK_SHEET (de->data_sheet), row, var, 0.5, 0.5);
+           break;
+         case PSPPIRE_DATA_EDITOR_VARIABLE_VIEW:
+           gtk_sheet_get_active_cell (GTK_SHEET (de->var_sheet), &row, &col);
+           gtk_sheet_set_active_cell (GTK_SHEET (de->var_sheet), var, col);
+           gtk_sheet_moveto (GTK_SHEET (de->var_sheet), var, col,  0.5, 0.5);
+           break;
+         default:
+           g_assert_not_reached ();
+           break;
+         };
+      }
+      break;
+    case PROP_CURRENT_CASE:
+      {
+       gint row, col;
+       gint case_num = g_value_get_long (value);
+       gtk_sheet_get_active_cell (GTK_SHEET (de->data_sheet), &row, &col);
+       gtk_sheet_set_active_cell (GTK_SHEET (de->data_sheet), case_num, col);
+       gtk_sheet_moveto (GTK_SHEET (de->data_sheet), case_num, col, 0.5, 0.5);
+      }
+      break;
+    case PROP_VALUE_LABELS:
+      {
+       psppire_data_store_show_labels (de->data_store,
+                                       g_value_get_boolean (value));
+      }
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+    };
+}
+
+static void
+psppire_data_editor_get_property (GObject         *object,
+                                 guint            prop_id,
+                                 GValue          *value,
+                                 GParamSpec      *pspec)
+{
+  PsppireDataEditor *de = PSPPIRE_DATA_EDITOR (object);
+
+  switch (prop_id)
+    {
+    case PROP_DATA_STORE:
+      g_value_set_pointer (value, de->data_store);
+      break;
+    case PROP_VAR_STORE:
+      g_value_set_pointer (value, de->var_store);
+      break;
+    case PROP_CURRENT_CASE:
+      {
+       gint row, column;
+       gtk_sheet_get_active_cell (GTK_SHEET (de->data_sheet), &row, &column);
+       g_value_set_long (value, row);
+      }
+      break;
+    case PROP_CURRENT_VAR:
+      {
+       gint row, column;
+       gtk_sheet_get_active_cell (GTK_SHEET (de->data_sheet), &row, &column);
+       g_value_set_long (value, column);
+      }
+      break;
+    case PROP_DATA_SELECTED:
+      g_value_set_boolean (value, data_is_selected (de));
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+    };
+}
+
+
+static void
+psppire_data_editor_class_init (PsppireDataEditorClass *klass)
+{
+  GParamSpec *data_store_spec ;
+  GParamSpec *var_store_spec ;
+  GParamSpec *column_menu_spec;
+  GParamSpec *row_menu_spec;
+  GParamSpec *value_labels_spec;
+  GParamSpec *current_case_spec;
+  GParamSpec *current_var_spec;
+  GParamSpec *data_selected_spec;
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+  parent_class = g_type_class_peek_parent (klass);
+
+  object_class->dispose = psppire_data_editor_dispose;
+  object_class->finalize = psppire_data_editor_finalize;
+
+  object_class->set_property = psppire_data_editor_set_property;
+  object_class->get_property = psppire_data_editor_get_property;
+
+  data_store_spec =
+    g_param_spec_pointer ("data-store",
+                         "Data Store",
+                         "A pointer to the data store associated with this 
editor",
+                         G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE | 
G_PARAM_READABLE );
+
+  g_object_class_install_property (object_class,
+                                   PROP_DATA_STORE,
+                                   data_store_spec);
+
+  var_store_spec =
+    g_param_spec_pointer ("var-store",
+                         "Variable Store",
+                         "A pointer to the variable store associated with this 
editor",
+                         G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE | 
G_PARAM_READABLE );
+
+  g_object_class_install_property (object_class,
+                                   PROP_VAR_STORE,
+                                   var_store_spec);
+
+  column_menu_spec =
+    g_param_spec_object ("column-menu",
+                        "Column Menu",
+                        "A menu to be displayed when button 3 is pressed in 
the column title buttons",
+                        GTK_TYPE_MENU,
+                        G_PARAM_WRITABLE);
+
+  g_object_class_install_property (object_class,
+                                   PROP_COLUMN_MENU,
+                                   column_menu_spec);
+
+
+  row_menu_spec =
+    g_param_spec_object ("row-menu",
+                        "Row Menu",
+                        "A menu to be displayed when button 3 is pressed in 
the row title buttons",
+                        GTK_TYPE_MENU,
+                        G_PARAM_WRITABLE);
+
+  g_object_class_install_property (object_class,
+                                   PROP_ROW_MENU,
+                                   row_menu_spec);
+
+  value_labels_spec =
+    g_param_spec_boolean ("value-labels",
+                        "Value Labels",
+                        "Whether or not the data sheet should display labels 
instead of values",
+                         FALSE,
+                        G_PARAM_WRITABLE | G_PARAM_READABLE);
+
+  g_object_class_install_property (object_class,
+                                   PROP_VALUE_LABELS,
+                                   value_labels_spec);
+
+
+  current_case_spec =
+    g_param_spec_long ("current-case",
+                      "Current Case",
+                      "Zero based number of the selected case",
+                      0, CASENUMBER_MAX,
+                      0,
+                      G_PARAM_WRITABLE | G_PARAM_READABLE);
+
+  g_object_class_install_property (object_class,
+                                   PROP_CURRENT_CASE,
+                                   current_case_spec);
+
+
+  current_var_spec =
+    g_param_spec_long ("current-variable",
+                      "Current Variable",
+                      "Zero based number of the selected variable",
+                      0, G_MAXINT,
+                      0,
+                      G_PARAM_WRITABLE | G_PARAM_READABLE);
+
+  g_object_class_install_property (object_class,
+                                   PROP_CURRENT_VAR,
+                                   current_var_spec);
+
+
+  data_selected_spec =
+    g_param_spec_boolean ("data-selected",
+                         "Data Selected",
+                         "True iff the data view is active and  one or more 
cells of data have been selected.",
+                         FALSE,
+                         G_PARAM_READABLE);
+
+  g_object_class_install_property (object_class,
+                                   PROP_DATA_SELECTED,
+                                   data_selected_spec);
+
+
+
+  data_editor_signals [DATA_SELECTION_CHANGED] =
+    g_signal_new ("data-selection-changed",
+                 G_TYPE_FROM_CLASS (klass),
+                 G_SIGNAL_RUN_FIRST,
+                 0,
+                 NULL, NULL,
+                 g_cclosure_marshal_VOID__BOOLEAN,
+                 G_TYPE_NONE,
+                 1,
+                 G_TYPE_BOOLEAN);
+
+  data_editor_signals [CASES_SELECTED] =
+    g_signal_new ("cases-selected",
+                 G_TYPE_FROM_CLASS (klass),
+                 G_SIGNAL_RUN_FIRST,
+                 0,
+                 NULL, NULL,
+                 g_cclosure_marshal_VOID__INT,
+                 G_TYPE_NONE,
+                 1,
+                 G_TYPE_INT);
+
+
+  data_editor_signals [VARIABLES_SELECTED] =
+    g_signal_new ("variables-selected",
+                 G_TYPE_FROM_CLASS (klass),
+                 G_SIGNAL_RUN_FIRST,
+                 0,
+                 NULL, NULL,
+                 g_cclosure_marshal_VOID__INT,
+                 G_TYPE_NONE,
+                 1,
+                 G_TYPE_INT);
+
+
+  data_editor_signals [DATA_AVAILABLE_CHANGED] =
+    g_signal_new ("data-available-changed",
+                 G_TYPE_FROM_CLASS (klass),
+                 G_SIGNAL_RUN_FIRST,
+                 0,
+                 NULL, NULL,
+                 g_cclosure_marshal_VOID__BOOLEAN,
+                 G_TYPE_NONE,
+                 1,
+                 G_TYPE_BOOLEAN);
+}
+
+/* Update the data_ref_entry with the reference of the active cell */
+static gint
+update_data_ref_entry (const GtkSheet *sheet, gint row, gint col, gpointer 
data)
+{
+  PsppireDataEditor *de = data;
+
+  PsppireDataStore *data_store =
+    PSPPIRE_DATA_STORE (gtk_sheet_get_model (sheet));
+
+  if (data_store)
+    {
+      const struct variable *var =
+       psppire_dict_get_variable (data_store->dict, col);
+
+      if ( var )
+       {
+         gchar *text = g_strdup_printf ("%d: %s", row + FIRST_CASE_NUMBER,
+                                        var_get_name (var));
+
+         gchar *s = pspp_locale_to_utf8 (text, -1, 0);
+
+         g_free (text);
+
+         gtk_entry_set_text (GTK_ENTRY (de->cell_ref_entry), s);
+
+         g_free (s);
+       }
+      else
+       goto blank_entry;
+
+      if ( var )
+       {
+         gchar *text =
+           psppire_data_store_get_string (data_store, row,
+                                          var_get_dict_index(var));
+
+         if ( ! text )
+           goto blank_entry;
+
+         g_strchug (text);
+
+         gtk_entry_set_text (GTK_ENTRY (de->datum_entry), text);
+
+         g_free (text);
+       }
+      else
+       goto blank_entry;
+
+    }
+
+  return FALSE;
+
+ blank_entry:
+  gtk_entry_set_text (GTK_ENTRY (de->datum_entry), "");
+
+  return FALSE;
+}
+
+
+static void
+datum_entry_activate (GtkEntry *entry, gpointer data)
+{
+  gint row, column;
+  PsppireDataEditor *de = data;
+
+  const gchar *text = gtk_entry_get_text (entry);
+
+  gtk_sheet_get_active_cell (GTK_SHEET (de->data_sheet), &row, &column);
+
+  if ( row == -1 || column == -1)
+    return;
+
+  psppire_data_store_set_string (de->data_store, text, row, column);
+}
+
+
+static void on_activate (PsppireDataEditor *de);
+static void on_deactivate (PsppireDataEditor *de);
+static gboolean on_switch_page (PsppireDataEditor *de, GtkNotebookPage *p, 
gint pagenum, gpointer data);
+static void on_select_range (PsppireDataEditor *de);
+
+static void on_select_row (GtkSheet *, gint, PsppireDataEditor *);
+static void on_select_variable (GtkSheet *, gint, PsppireDataEditor *);
+
+
+static void on_owner_change (GtkClipboard *,
+                            GdkEventOwnerChange *, gpointer);
+
+static void
+on_map (GtkWidget *w)
+{
+  GtkClipboard *clip = gtk_widget_get_clipboard (w, GDK_SELECTION_CLIPBOARD);
+
+  g_signal_connect (clip, "owner-change", G_CALLBACK (on_owner_change), w);
+}
+
+
+static void
+psppire_data_editor_init (PsppireDataEditor *de)
+{
+  GtkWidget *vbox = gtk_vbox_new (FALSE, 0);
+  GtkWidget *hbox = gtk_hbox_new (FALSE, 0);
+  GtkWidget *sw_ds = gtk_scrolled_window_new (NULL, NULL);
+  GtkWidget *sw_vs = gtk_scrolled_window_new (NULL, NULL);
+
+
+  de->data_sheet = gtk_sheet_new (NULL, NULL, NULL);
+  de->var_sheet = psppire_var_sheet_new ();
+
+  g_object_set (de, "tab-pos", GTK_POS_BOTTOM, NULL);
+
+  de->datum_entry = gtk_entry_new ();
+  de->cell_ref_entry = gtk_entry_new ();
+
+  g_object_set (de->cell_ref_entry,
+               "sensitive", FALSE,
+               "editable",  FALSE,
+               "width_chars", 25,
+               NULL);
+
+  gtk_box_pack_start (GTK_BOX (hbox), de->cell_ref_entry, FALSE, FALSE, 0);
+  gtk_box_pack_start (GTK_BOX (hbox), de->datum_entry, TRUE, TRUE, 0);
+
+
+  gtk_container_add (GTK_CONTAINER (sw_vs), de->var_sheet);
+  gtk_widget_show_all (sw_vs);
+
+
+  gtk_container_add (GTK_CONTAINER (sw_ds), de->data_sheet);
+  gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
+  gtk_box_pack_start (GTK_BOX (vbox), sw_ds, TRUE, TRUE, 0);
+
+  gtk_widget_show_all (vbox);
+
+  gtk_notebook_append_page (GTK_NOTEBOOK (de), vbox,
+                           gtk_label_new_with_mnemonic (_("Data View")));
+
+  gtk_notebook_append_page (GTK_NOTEBOOK (de), sw_vs,
+                           gtk_label_new_with_mnemonic (_("Variable View")));
+
+  g_signal_connect (de->data_sheet, "activate",
+                   G_CALLBACK (update_data_ref_entry),
+                   de);
+
+  g_signal_connect (de->datum_entry, "activate",
+                   G_CALLBACK (datum_entry_activate),
+                   de);
+
+
+  g_signal_connect_swapped (de->data_sheet,
+                   "double-click-column",
+                   G_CALLBACK (on_data_column_clicked),
+                   de);
+
+  g_signal_connect_swapped (de->var_sheet,
+                   "double-click-row",
+                   G_CALLBACK (on_var_row_clicked),
+                   de);
+
+  g_signal_connect_swapped (de->data_sheet, "activate",
+                           G_CALLBACK (on_activate),
+                           de);
+
+  g_signal_connect_swapped (de->data_sheet, "deactivate",
+                           G_CALLBACK (on_deactivate),
+                           de);
+
+  g_signal_connect_swapped (de->data_sheet, "select-range",
+                           G_CALLBACK (on_select_range),
+                           de);
+
+  g_signal_connect (de->data_sheet, "select-row",
+                   G_CALLBACK (on_select_row), de);
+
+  g_signal_connect (de->data_sheet, "select-column",
+                   G_CALLBACK (on_select_variable), de);
+
+
+  g_signal_connect (de->var_sheet, "select-row",
+                   G_CALLBACK (on_select_variable), de);
+
+
+  g_signal_connect_after (de, "switch-page",
+                   G_CALLBACK (on_switch_page),
+                   NULL);
+
+
+  g_signal_connect (de, "map", G_CALLBACK (on_map), NULL);
+
+  de->dispose_has_run = FALSE;
+}
+
+
+GtkWidget*
+psppire_data_editor_new (PsppireVarStore *var_store,
+                        PsppireDataStore *data_store)
+{
+  GtkWidget *widget;
+
+  widget =  g_object_new (PSPPIRE_DATA_EDITOR_TYPE,
+                         "var-store",  var_store,
+                         "data-store",  data_store,
+                         NULL);
+
+  return widget;
+}
+
+static void data_sheet_set_clip (GtkSheet *sheet);
+static void data_sheet_contents_received_callback (GtkClipboard *clipboard,
+                                                  GtkSelectionData *sd,
+                                                  gpointer data);
+
+
+void
+psppire_data_editor_clip_copy (PsppireDataEditor *de)
+{
+  data_sheet_set_clip (GTK_SHEET (de->data_sheet));
+}
+
+void
+psppire_data_editor_clip_paste (PsppireDataEditor *de)
+{
+  GtkClipboard *clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
+
+  gtk_clipboard_request_contents (clipboard,
+                                 gdk_atom_intern ("UTF8_STRING", TRUE),
+                                 data_sheet_contents_received_callback,
+                                 de);
+}
+
+
+
+void
+psppire_data_editor_clip_cut (PsppireDataEditor *de)
+{
+  gint max_rows, max_columns;
+  gint r;
+  GtkSheetRange range;
+  PsppireDataStore *ds = de->data_store;
+
+  data_sheet_set_clip (GTK_SHEET (de->data_sheet));
+
+  /* Now blank all the cells */
+  gtk_sheet_get_selected_range (GTK_SHEET (de->data_sheet), &range);
+
+   /* If nothing selected, then use active cell */
+  if ( range.row0 < 0 || range.col0 < 0 )
+    {
+      gint row, col;
+      gtk_sheet_get_active_cell (GTK_SHEET (de->data_sheet), &row, &col);
+
+      range.row0 = range.rowi = row;
+      range.col0 = range.coli = col;
+    }
+
+  /* The sheet range can include cells that do not include data.
+     Exclude them from the range. */
+  max_rows = psppire_data_store_get_case_count (ds);
+  if (range.rowi >= max_rows)
+    {
+      if (max_rows == 0)
+        return;
+      range.rowi = max_rows - 1;
+    }
+
+  max_columns = dict_get_var_cnt (ds->dict->dict);
+  if (range.coli >= max_columns)
+    {
+      if (max_columns == 0)
+        return;
+      range.coli = max_columns - 1;
+    }
+
+  g_return_if_fail (range.rowi >= range.row0);
+  g_return_if_fail (range.row0 >= 0);
+  g_return_if_fail (range.coli >= range.col0);
+  g_return_if_fail (range.col0 >= 0);
+
+
+  for (r = range.row0; r <= range.rowi ; ++r )
+    {
+      gint c;
+
+      for (c = range.col0 ; c <= range.coli; ++c)
+       {
+         psppire_data_store_set_string (ds, "", r, c);
+       }
+    }
+
+  /* and remove the selection */
+  gtk_sheet_unselect_range (GTK_SHEET (de->data_sheet));
+}
+
+
+
+
+/* Popup menu related stuff */
+
+static void
+popup_variable_menu (GtkSheet *sheet, gint column,
+                    GdkEventButton *event, gpointer data)
+{
+  GtkMenu *menu = GTK_MENU (data);
+
+  PsppireDataStore *data_store =
+    PSPPIRE_DATA_STORE (gtk_sheet_get_model (sheet));
+
+  const struct variable *v =
+    psppire_dict_get_variable (data_store->dict, column);
+
+  if ( v && event->button == 3)
+    {
+      gtk_sheet_select_column (sheet, column);
+
+      gtk_menu_popup (menu,
+                     NULL, NULL, NULL, NULL,
+                     event->button, event->time);
+    }
+}
+
+
+static void
+popup_cases_menu (GtkSheet *sheet, gint row,
+                 GdkEventButton *event, gpointer data)
+{
+  GtkMenu *menu = GTK_MENU (data);
+
+  PsppireDataStore *data_store =
+    PSPPIRE_DATA_STORE (gtk_sheet_get_model (sheet));
+
+  if ( row <= psppire_data_store_get_case_count (data_store) &&
+       event->button == 3)
+    {
+      gtk_sheet_select_row (sheet, row);
+
+      gtk_menu_popup (menu,
+                     NULL, NULL, NULL, NULL,
+                     event->button, event->time);
+    }
+}
+
+
+
+/* Sorting */
+
+static void
+do_sort (PsppireDataStore *ds, int var, gboolean descend)
+{
+  GString *string = g_string_new ("SORT CASES BY ");
+
+  const struct variable *v =
+    psppire_dict_get_variable (ds->dict, var);
+
+  g_string_append_printf (string, "%s", var_get_name (v));
+
+  if ( descend )
+    g_string_append (string, " (D)");
+
+  g_string_append (string, ".");
+
+  execute_syntax (create_syntax_string_source (string->str));
+
+  g_string_free (string, TRUE);
+}
+
+
+/* Sort the data by the the variable which the editor has currently
+   selected */
+void
+psppire_data_editor_sort_ascending  (PsppireDataEditor *de)
+{
+  GtkSheetRange range;
+  gtk_sheet_get_selected_range (GTK_SHEET(de->data_sheet), &range);
+
+  do_sort (de->data_store,  range.col0, FALSE);
+}
+
+
+/* Sort the data by the the variable which the editor has currently
+   selected */
+void
+psppire_data_editor_sort_descending (PsppireDataEditor *de)
+{
+  GtkSheetRange range;
+  gtk_sheet_get_selected_range (GTK_SHEET(de->data_sheet), &range);
+
+  do_sort (de->data_store,  range.col0, TRUE);
+}
+
+
+
+
+
+/* Insert a new variable  before the currently selected position */
+void
+psppire_data_editor_insert_variable (PsppireDataEditor *de)
+{
+  glong posn = -1;
+
+  if ( de->data_sheet->state == GTK_SHEET_COLUMN_SELECTED )
+    posn = GTK_SHEET (de->data_sheet)->range.col0;
+  else
+    posn = GTK_SHEET (de->data_sheet)->active_cell.col;
+
+  if ( posn == -1 ) posn = 0;
+
+  psppire_dict_insert_variable (de->data_store->dict, posn, NULL);
+}
+
+/* Insert a new case before the currently selected position */
+void
+psppire_data_editor_insert_case (PsppireDataEditor *de)
+{
+  glong posn = -1;
+
+  if ( de->data_sheet->state == GTK_SHEET_ROW_SELECTED )
+    posn = GTK_SHEET (de->data_sheet)->range.row0;
+  else
+    posn = GTK_SHEET (de->data_sheet)->active_cell.row;
+
+  if ( posn == -1 ) posn = 0;
+
+  psppire_data_store_insert_new_case (de->data_store, posn);
+}
+
+/* Delete the cases currently selected in the data sheet */
+void
+psppire_data_editor_delete_cases    (PsppireDataEditor *de)
+{
+  gint first = GTK_SHEET (de->data_sheet)->range.row0;
+  gint n = GTK_SHEET (de->data_sheet)->range.rowi - first + 1;
+
+  psppire_data_store_delete_cases (de->data_store, first, n);
+
+  gtk_sheet_unselect_range (GTK_SHEET (de->data_sheet));
+}
+
+/* Delete the variables currently selected in the
+   datasheet or variable sheet */
+void
+psppire_data_editor_delete_variables (PsppireDataEditor *de)
+{
+  gint first, n;
+
+  switch (gtk_notebook_get_current_page (GTK_NOTEBOOK (de)))
+    {
+    case PSPPIRE_DATA_EDITOR_DATA_VIEW:
+      first = GTK_SHEET (de->data_sheet)->range.col0;
+      n = GTK_SHEET (de->data_sheet)->range.coli - first + 1;
+      break;
+    case PSPPIRE_DATA_EDITOR_VARIABLE_VIEW:
+      first = GTK_SHEET (de->var_sheet)->range.row0;
+      n = GTK_SHEET (de->var_sheet)->range.rowi - first + 1;
+      break;
+    default:
+      g_assert_not_reached ();
+      break;
+    }
+
+  psppire_dict_delete_variables (de->var_store->dict, first, n);
+
+  gtk_sheet_unselect_range (GTK_SHEET (de->data_sheet));
+  gtk_sheet_unselect_range (GTK_SHEET (de->var_sheet));
+}
+
+
+void
+psppire_data_editor_show_grid (PsppireDataEditor *de, gboolean grid_visible)
+{
+  gtk_sheet_show_grid (GTK_SHEET (de->var_sheet), grid_visible);
+  gtk_sheet_show_grid (GTK_SHEET (de->data_sheet), grid_visible);
+}
+
+void
+psppire_data_editor_set_font (PsppireDataEditor *de, PangoFontDescription 
*font_desc)
+{
+  psppire_data_store_set_font (de->data_store, font_desc);
+  psppire_var_store_set_font (de->var_store, font_desc);
+}
+
+
+
+
+
+static void
+emit_selected_signal (PsppireDataEditor *de)
+{
+  gboolean data_selected = data_is_selected (de);
+
+  g_signal_emit (de, data_editor_signals[DATA_SELECTION_CHANGED], 0, 
data_selected);
+}
+
+static void
+on_activate (PsppireDataEditor *de)
+{
+  gint row, col;
+  gtk_sheet_get_active_cell (GTK_SHEET (de->data_sheet), &row, &col);
+
+  if ( row < psppire_data_store_get_case_count (de->data_store)
+       &&
+       col < psppire_var_store_get_var_cnt (de->var_store))
+    {
+      emit_selected_signal (de);
+      return ;
+    }
+
+  emit_selected_signal (de);
+}
+
+
+static void
+on_deactivate (PsppireDataEditor *de)
+{
+  emit_selected_signal (de);
+}
+
+static void
+on_select_range (PsppireDataEditor *de)
+{
+  GtkSheetRange range;
+
+  gtk_sheet_get_selected_range (GTK_SHEET (de->data_sheet), &range);
+
+  if ( range.rowi < psppire_data_store_get_case_count (de->data_store)
+       &&
+       range.coli < psppire_var_store_get_var_cnt (de->var_store))
+    {
+      emit_selected_signal (de);
+      return;
+    }
+
+  emit_selected_signal (de);
+}
+
+
+static gboolean
+on_switch_page (PsppireDataEditor *de, GtkNotebookPage *p, gint pagenum, 
gpointer data)
+{
+  if ( pagenum != PSPPIRE_DATA_EDITOR_DATA_VIEW )
+    {
+      emit_selected_signal (de);
+      return TRUE;
+    }
+
+  on_select_range (de);
+
+  return TRUE;
+}
+
+
+
+static gboolean
+data_is_selected (PsppireDataEditor *de)
+{
+  GtkSheetRange range;
+  gint row, col;
+
+  if ( gtk_notebook_current_page (GTK_NOTEBOOK (de)) != 
PSPPIRE_DATA_EDITOR_DATA_VIEW)
+    return FALSE;
+
+  gtk_sheet_get_active_cell (GTK_SHEET (de->data_sheet), &row, &col);
+
+  if ( row >= psppire_data_store_get_case_count (de->data_store)
+       ||
+       col >= psppire_var_store_get_var_cnt (de->var_store))
+    {
+      return FALSE;
+    }
+
+  gtk_sheet_get_selected_range (GTK_SHEET (de->data_sheet), &range);
+
+  if ( range.rowi >= psppire_data_store_get_case_count (de->data_store)
+       ||
+       range.coli >= psppire_var_store_get_var_cnt (de->var_store))
+    {
+      return FALSE;
+    }
+
+  return TRUE;
+}
+
+
+static void
+on_select_row (GtkSheet *sheet, gint row, PsppireDataEditor *de)
+{
+  g_signal_emit (de, data_editor_signals[CASES_SELECTED], 0, row);
+}
+
+
+static void
+on_select_variable (GtkSheet *sheet, gint var, PsppireDataEditor *de)
+{
+  g_signal_emit (de, data_editor_signals[VARIABLES_SELECTED], 0, var);
+}
+
+
+
+
+/* Clipboard stuff */
+
+
+#include <data/casereader.h>
+#include <data/case-map.h>
+#include <data/casewriter.h>
+
+#include <data/data-out.h>
+#include "xalloc.h"
+
+/* A casereader and dictionary holding the data currently in the clip */
+static struct casereader *clip_datasheet = NULL;
+static struct dictionary *clip_dict = NULL;
+
+
+static void data_sheet_update_clipboard (GtkSheet *);
+
+/* Set the clip according to the currently
+   selected range in the data sheet */
+static void
+data_sheet_set_clip (GtkSheet *sheet)
+{
+  int i;
+  struct casewriter *writer ;
+  GtkSheetRange range;
+  PsppireDataStore *ds;
+  struct case_map *map = NULL;
+  casenumber max_rows;
+  size_t max_columns;
+
+  ds = PSPPIRE_DATA_STORE (gtk_sheet_get_model (sheet));
+
+  gtk_sheet_get_selected_range (sheet, &range);
+
+   /* If nothing selected, then use active cell */
+  if ( range.row0 < 0 || range.col0 < 0 )
+    {
+      gint row, col;
+      gtk_sheet_get_active_cell (sheet, &row, &col);
+
+      range.row0 = range.rowi = row;
+      range.col0 = range.coli = col;
+    }
+
+  /* The sheet range can include cells that do not include data.
+     Exclude them from the range. */
+  max_rows = psppire_data_store_get_case_count (ds);
+  if (range.rowi >= max_rows)
+    {
+      if (max_rows == 0)
+        return;
+      range.rowi = max_rows - 1;
+    }
+  max_columns = dict_get_var_cnt (ds->dict->dict);
+  if (range.coli >= max_columns)
+    {
+      if (max_columns == 0)
+        return;
+      range.coli = max_columns - 1;
+    }
+
+  g_return_if_fail (range.rowi >= range.row0);
+  g_return_if_fail (range.row0 >= 0);
+  g_return_if_fail (range.coli >= range.col0);
+  g_return_if_fail (range.col0 >= 0);
+
+  /* Destroy any existing clip */
+  if ( clip_datasheet )
+    {
+      casereader_destroy (clip_datasheet);
+      clip_datasheet = NULL;
+    }
+
+  if ( clip_dict )
+    {
+      dict_destroy (clip_dict);
+      clip_dict = NULL;
+    }
+
+  /* Construct clip dictionary. */
+  clip_dict = dict_create ();
+  for (i = range.col0; i <= range.coli; i++)
+    {
+      const struct variable *old = dict_get_var (ds->dict->dict, i);
+      dict_clone_var_assert (clip_dict, old, var_get_name (old));
+    }
+
+  /* Construct clip data. */
+  map = case_map_by_name (ds->dict->dict, clip_dict);
+  writer = autopaging_writer_create (dict_get_next_value_idx (clip_dict));
+  for (i = range.row0; i <= range.rowi ; ++i )
+    {
+      struct ccase old;
+
+      if (psppire_case_file_get_case (ds->case_file, i, &old))
+        {
+          struct ccase new;
+
+          case_map_execute (map, &old, &new);
+          case_destroy (&old);
+          casewriter_write (writer, &new);
+        }
+      else
+        casewriter_force_error (writer);
+    }
+  case_map_destroy (map);
+
+  clip_datasheet = casewriter_make_reader (writer);
+
+  data_sheet_update_clipboard (sheet);
+}
+
+enum {
+  SELECT_FMT_NULL,
+  SELECT_FMT_TEXT,
+  SELECT_FMT_HTML
+};
+
+
+/* Perform data_out for case CC, variable V, appending to STRING */
+static void
+data_out_g_string (GString *string, const struct variable *v,
+                  const struct ccase *cc)
+{
+  char *buf ;
+
+  const struct fmt_spec *fs = var_get_print_format (v);
+  const union value *val = case_data (cc, v);
+  buf = xzalloc (fs->w);
+
+  data_out (val, fs, buf);
+
+  g_string_append_len (string, buf, fs->w);
+
+  g_free (buf);
+}
+
+static GString *
+clip_to_text (void)
+{
+  casenumber r;
+  GString *string;
+
+  const size_t val_cnt = casereader_get_value_cnt (clip_datasheet);
+  const casenumber case_cnt = casereader_get_case_cnt (clip_datasheet);
+  const size_t var_cnt = dict_get_var_cnt (clip_dict);
+
+  string = g_string_sized_new (10 * val_cnt * case_cnt);
+
+  for (r = 0 ; r < case_cnt ; ++r )
+    {
+      int c;
+      struct ccase cc;
+      if ( !  casereader_peek (clip_datasheet, r, &cc))
+       {
+         g_warning ("Clipboard seems to have inexplicably shrunk");
+         break;
+       }
+
+      for (c = 0 ; c < var_cnt ; ++c)
+       {
+         const struct variable *v = dict_get_var (clip_dict, c);
+         data_out_g_string (string, v, &cc);
+         if ( c < val_cnt - 1 )
+           g_string_append (string, "\t");
+       }
+
+      if ( r < case_cnt)
+       g_string_append (string, "\n");
+
+      case_destroy (&cc);
+    }
+
+  return string;
+}
+
+
+static GString *
+clip_to_html (void)
+{
+  casenumber r;
+  GString *string;
+
+  const size_t val_cnt = casereader_get_value_cnt (clip_datasheet);
+  const casenumber case_cnt = casereader_get_case_cnt (clip_datasheet);
+  const size_t var_cnt = dict_get_var_cnt (clip_dict);
+
+
+  /* Guestimate the size needed */
+  string = g_string_sized_new (20 * val_cnt * case_cnt);
+
+  g_string_append (string, "<table>\n");
+  for (r = 0 ; r < case_cnt ; ++r )
+    {
+      int c;
+      struct ccase cc;
+      if ( !  casereader_peek (clip_datasheet, r, &cc))
+       {
+         g_warning ("Clipboard seems to have inexplicably shrunk");
+         break;
+       }
+      g_string_append (string, "<tr>\n");
+
+      for (c = 0 ; c < var_cnt ; ++c)
+       {
+         const struct variable *v = dict_get_var (clip_dict, c);
+         g_string_append (string, "<td>");
+         data_out_g_string (string, v, &cc);
+         g_string_append (string, "</td>\n");
+       }
+
+      g_string_append (string, "</tr>\n");
+
+      case_destroy (&cc);
+    }
+  g_string_append (string, "</table>\n");
+
+  return string;
+}
+
+
+
+static void
+clipboard_get_cb (GtkClipboard     *clipboard,
+                 GtkSelectionData *selection_data,
+                 guint             info,
+                 gpointer          data)
+{
+  GString *string = NULL;
+
+  switch (info)
+    {
+    case SELECT_FMT_TEXT:
+      string = clip_to_text ();
+      break;
+    case SELECT_FMT_HTML:
+      string = clip_to_html ();
+      break;
+    default:
+      g_assert_not_reached ();
+    }
+
+  gtk_selection_data_set (selection_data, selection_data->target,
+                         8,
+                         (const guchar *) string->str, string->len);
+
+  g_string_free (string, TRUE);
+}
+
+static void
+clipboard_clear_cb (GtkClipboard *clipboard,
+                   gpointer data)
+{
+  dict_destroy (clip_dict);
+  clip_dict = NULL;
+
+  casereader_destroy (clip_datasheet);
+  clip_datasheet = NULL;
+}
+
+
+static const GtkTargetEntry targets[] = {
+  { "UTF8_STRING",   0, SELECT_FMT_TEXT },
+  { "STRING",        0, SELECT_FMT_TEXT },
+  { "TEXT",          0, SELECT_FMT_TEXT },
+  { "COMPOUND_TEXT", 0, SELECT_FMT_TEXT },
+  { "text/plain;charset=utf-8", 0, SELECT_FMT_TEXT },
+  { "text/plain",    0, SELECT_FMT_TEXT },
+  { "text/html",     0, SELECT_FMT_HTML }
+};
+
+
+
+static void
+data_sheet_update_clipboard (GtkSheet *sheet)
+{
+  GtkClipboard *clipboard =
+    gtk_widget_get_clipboard (GTK_WIDGET (sheet),
+                             GDK_SELECTION_CLIPBOARD);
+
+  if (!gtk_clipboard_set_with_owner (clipboard, targets,
+                                    G_N_ELEMENTS (targets),
+                                    clipboard_get_cb, clipboard_clear_cb,
+                                    G_OBJECT (sheet)))
+    clipboard_clear_cb (clipboard, sheet);
+}
+
+
+
+/* A callback for when the clipboard contents have been received */
+static void
+data_sheet_contents_received_callback (GtkClipboard *clipboard,
+                                     GtkSelectionData *sd,
+                                     gpointer data)
+{
+  gint count = 0;
+  gint row, column;
+  gint next_row, next_column;
+  gint first_column;
+  char *c;
+  PsppireDataEditor *data_editor = data;
+
+  if ( sd->length < 0 )
+    return;
+
+  if ( sd->type != gdk_atom_intern ("UTF8_STRING", FALSE))
+    return;
+
+  c = (char *) sd->data;
+
+  /* Paste text to selected position */
+  gtk_sheet_get_active_cell (GTK_SHEET (data_editor->data_sheet),
+                            &row, &column);
+
+  g_return_if_fail (row >= 0);
+  g_return_if_fail (column >= 0);
+
+  first_column = column;
+  next_row = row;
+  next_column = column;
+  while (count < sd->length)
+    {
+      char *s = c;
+
+      row = next_row;
+      column = next_column;
+      while (*c != '\t' && *c != '\n' && count < sd->length)
+       {
+         c++;
+         count++;
+       }
+      if ( *c == '\t')
+       {
+         next_row = row ;
+         next_column = column + 1;
+       }
+      else if ( *c == '\n')
+       {
+         next_row = row + 1;
+         next_column = first_column;
+       }
+      *c++ = '\0';
+      count++;
+
+
+      /* Append some new cases if pasting beyond the last row */
+      if ( row >= psppire_data_store_get_case_count (data_editor->data_store))
+       psppire_data_store_insert_new_case (data_editor->data_store, row);
+
+      psppire_data_store_set_string (data_editor->data_store, s, row, column);
+    }
+}
+
+
+static void
+on_owner_change (GtkClipboard *clip, GdkEventOwnerChange *event, gpointer data)
+{
+  gint i;
+  gboolean compatible_target = FALSE;
+  PsppireDataEditor *de = PSPPIRE_DATA_EDITOR (data);
+
+  for (i = 0 ; i < sizeof (targets) / sizeof(targets[0]) ; ++i )
+    {
+      GdkAtom atom = gdk_atom_intern (targets[i].target, TRUE);
+      if ( gtk_clipboard_wait_is_target_available (clip, atom))
+       {
+         compatible_target = TRUE;
+         break;
+       }
+    }
+
+  g_signal_emit (de, data_editor_signals[DATA_AVAILABLE_CHANGED], 0,
+                compatible_target);
+}

Index: src/ui/gui/psppire-data-editor.h
===================================================================
RCS file: src/ui/gui/psppire-data-editor.h
diff -N src/ui/gui/psppire-data-editor.h
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ src/ui/gui/psppire-data-editor.h    29 Feb 2008 09:13:53 -0000      1.1
@@ -0,0 +1,84 @@
+/* PSPPIRE - a graphical user interface for PSPP.
+   Copyright (C) 2008 Free Software Foundation, Inc.
+
+   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
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef __PSPPIRE_DATA_EDITOR_H__
+#define __PSPPIRE_DATA_EDITOR_H__
+
+
+#include <glib.h>
+#include <glib-object.h>
+#include <gtk/gtknotebook.h>
+
+#include "psppire-var-store.h"
+#include "psppire-data-store.h"
+
+G_BEGIN_DECLS
+
+#define PSPPIRE_DATA_EDITOR_TYPE            (psppire_data_editor_get_type ())
+#define PSPPIRE_DATA_EDITOR(obj)            (G_TYPE_CHECK_INSTANCE_CAST 
((obj), PSPPIRE_DATA_EDITOR_TYPE, PsppireDataEditor))
+#define PSPPIRE_DATA_EDITOR_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), 
PSPPIRE_DATA_EDITOR_TYPE, PsppireDataEditorClass))
+#define PSPPIRE_IS_DATA_EDITOR(obj)         (G_TYPE_CHECK_INSTANCE_TYPE 
((obj), PSPPIRE_DATA_EDITOR_TYPE))
+#define PSPPIRE_IS_DATA_EDITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), 
PSPPIRE_DATA_EDITOR_TYPE))
+
+
+typedef struct _PsppireDataEditor       PsppireDataEditor;
+typedef struct _PsppireDataEditorClass  PsppireDataEditorClass;
+
+/* All members are private. */
+struct _PsppireDataEditor
+{
+  GtkNotebook parent;
+
+  /* <private> */
+  gboolean dispose_has_run;
+  GtkWidget *cell_ref_entry;
+  GtkWidget *datum_entry;
+  GtkWidget *data_sheet;
+  GtkWidget *var_sheet;
+  PsppireDataStore *data_store;
+  PsppireVarStore *var_store;
+};
+
+
+struct _PsppireDataEditorClass
+{
+  GtkNotebookClass parent_class;
+};
+
+
+GType          psppire_data_editor_get_type        (void);
+GtkWidget*     psppire_data_editor_new             (PsppireVarStore *, 
PsppireDataStore *);
+void           psppire_data_editor_clip_copy       (PsppireDataEditor *);
+void           psppire_data_editor_clip_paste      (PsppireDataEditor *);
+void           psppire_data_editor_clip_cut        (PsppireDataEditor *);
+void           psppire_data_editor_sort_ascending  (PsppireDataEditor *);
+void           psppire_data_editor_sort_descending (PsppireDataEditor *);
+void           psppire_data_editor_insert_variable (PsppireDataEditor *);
+void           psppire_data_editor_delete_variables (PsppireDataEditor *);
+void           psppire_data_editor_show_grid       (PsppireDataEditor *, 
gboolean);
+void           psppire_data_editor_insert_case     (PsppireDataEditor *);
+void           psppire_data_editor_delete_cases    (PsppireDataEditor *);
+void           psppire_data_editor_set_font        (PsppireDataEditor *, 
PangoFontDescription *);
+void           psppire_data_editor_delete_cases    (PsppireDataEditor *);
+
+
+
+G_END_DECLS
+
+enum {PSPPIRE_DATA_EDITOR_DATA_VIEW = 0, PSPPIRE_DATA_EDITOR_VARIABLE_VIEW};
+
+
+#endif /* __PSPPIRE_DATA_EDITOR_H__ */

Index: src/ui/gui/psppire-var-sheet.c
===================================================================
RCS file: src/ui/gui/psppire-var-sheet.c
diff -N src/ui/gui/psppire-var-sheet.c
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ src/ui/gui/psppire-var-sheet.c      29 Feb 2008 09:13:53 -0000      1.1
@@ -0,0 +1,500 @@
+
+/* PSPPIRE - a graphical user interface for PSPP.
+   Copyright (C) 2008 Free Software Foundation, Inc.
+
+   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
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+#include "psppire-var-sheet.h"
+
+#include <glade/glade.h>
+#include "helper.h"
+#include <gtksheet/gsheet-hetero-column.h>
+#include "customentry.h"
+#include <data/variable.h>
+#include "psppire-var-store.h"
+
+#include <gettext.h>
+#define _(msgid) gettext (msgid)
+#define N_(msgid) msgid
+
+
+static void psppire_var_sheet_class_init  (PsppireVarSheetClass *klass);
+static void psppire_var_sheet_init        (PsppireVarSheet      *vs);
+
+
+GType
+psppire_var_sheet_get_type (void)
+{
+  static GType vs_type = 0;
+
+  if (!vs_type)
+    {
+      static const GTypeInfo vs_info =
+      {
+       sizeof (PsppireVarSheetClass),
+       NULL, /* base_init */
+        NULL, /* base_finalize */
+       (GClassInitFunc) psppire_var_sheet_class_init,
+        NULL, /* class_finalize */
+       NULL, /* class_data */
+        sizeof (PsppireVarSheet),
+       0,
+       (GInstanceInitFunc) psppire_var_sheet_init,
+      };
+
+      vs_type = g_type_register_static (GTK_TYPE_SHEET, "PsppireVarSheet",
+                                       &vs_info, 0);
+    }
+
+  return vs_type;
+}
+
+static GObjectClass * parent_class = NULL;
+
+static void
+psppire_var_sheet_dispose (GObject *obj)
+{
+  PsppireVarSheet *vs = (PsppireVarSheet *)obj;
+
+  if (vs->dispose_has_run)
+    return;
+
+  /* Make sure dispose does not run twice. */
+  vs->dispose_has_run = TRUE;
+
+  /* Chain up to the parent class */
+  G_OBJECT_CLASS (parent_class)->dispose (obj);
+}
+
+static void
+psppire_var_sheet_finalize (GObject *obj)
+{
+   /* Chain up to the parent class */
+   G_OBJECT_CLASS (parent_class)->finalize (obj);
+}
+
+
+struct column_parameters
+{
+  gchar label[20];
+  gint width ;
+};
+
+static const struct column_parameters column_def[] = {
+  { N_("Name"),    80},
+  { N_("Type"),    100},
+  { N_("Width"),   57},
+  { N_("Decimals"),91},
+  { N_("Label"),   95},
+  { N_("Values"),  103},
+  { N_("Missing"), 95},
+  { N_("Columns"), 80},
+  { N_("Align"),   69},
+  { N_("Measure"), 99},
+};
+
+
+#define n_ALIGNMENTS 3
+
+const gchar *const alignments[n_ALIGNMENTS + 1]={
+  N_("Left"),
+  N_("Right"),
+  N_("Center"),
+  0
+};
+
+const gchar *const measures[n_MEASURES + 1]={
+  N_("Nominal"),
+  N_("Ordinal"),
+  N_("Scale"),
+  0
+};
+
+
+
+/* Create a list store from an array of strings */
+static GtkListStore *
+create_label_list (const gchar *const *labels)
+{
+  const gchar *s;
+  gint i = 0;
+  GtkTreeIter iter;
+
+  GtkListStore *list_store;
+  list_store = gtk_list_store_new (1, G_TYPE_STRING);
+
+
+  while ( (s = labels[i++]))
+    {
+      gtk_list_store_append (list_store, &iter);
+      gtk_list_store_set (list_store, &iter,
+                         0, gettext (s),
+                         -1);
+    }
+
+  return list_store;
+}
+
+
+
+
+static void
+psppire_var_sheet_class_init (PsppireVarSheetClass *klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+  parent_class = g_type_class_peek_parent (klass);
+
+  object_class->dispose = psppire_var_sheet_dispose;
+  object_class->finalize = psppire_var_sheet_finalize;
+
+
+  klass->measure_list = create_label_list (measures);
+  klass->alignment_list = create_label_list (alignments);
+}
+
+
+
+/* Callback for when the alignment combo box
+   item is selected */
+static void
+change_alignment (GtkComboBox *cb,
+                 struct variable *var)
+{
+  gint active_item = gtk_combo_box_get_active (cb);
+
+  if ( active_item < 0 ) return ;
+
+  var_set_alignment (var, active_item);
+}
+
+
+
+/* Callback for when the measure combo box
+   item is selected */
+static void
+change_measure (GtkComboBox *cb,
+               struct variable *var)
+{
+  gint active_item = gtk_combo_box_get_active (cb);
+
+  if ( active_item < 0 ) return ;
+
+  var_set_measure (var, active_item);
+}
+
+
+
+static gboolean
+traverse_cell_callback (GtkSheet *sheet,
+                       gint row, gint column,
+                       gint *new_row, gint *new_column
+                       )
+{
+  PsppireVarStore *var_store = PSPPIRE_VAR_STORE (gtk_sheet_get_model (sheet));
+
+  gint n_vars = psppire_var_store_get_var_cnt (var_store);
+
+  if ( row == n_vars && *new_row >= n_vars)
+    {
+      GtkEntry *entry = GTK_ENTRY (gtk_sheet_get_entry (sheet));
+
+      const gchar *name = gtk_entry_get_text (entry);
+
+      if (! psppire_dict_check_name (var_store->dict, name, TRUE))
+       return FALSE;
+
+      psppire_dict_insert_variable (var_store->dict, row, name);
+
+      return TRUE;
+    }
+
+  /* If the destination cell is outside the current  variables, then
+     automatically create variables for the new rows.
+  */
+  if ( (*new_row > n_vars) ||
+       (*new_row == n_vars && *new_column != PSPPIRE_VAR_STORE_COL_NAME) )
+    {
+      gint i;
+      for ( i = n_vars ; i <= *new_row; ++i )
+       psppire_dict_insert_variable (var_store->dict, i, NULL);
+    }
+
+  return TRUE;
+}
+
+
+
+
+/*
+   Callback whenever the pointer leaves a cell on the var sheet.
+*/
+static gboolean
+var_sheet_cell_entry_leave (GtkSheet * sheet, gint row, gint column,
+                           gpointer data)
+{
+  gtk_sheet_change_entry (sheet, GTK_TYPE_ENTRY);
+  return TRUE;
+}
+
+
+/*
+   Callback whenever the pointer enters a cell on the var sheet.
+*/
+static gboolean
+var_sheet_cell_entry_enter (PsppireVarSheet *vs, gint row, gint column,
+                           gpointer data)
+{
+  GtkSheetCellAttr attributes;
+  PsppireVarStore *var_store ;
+  PsppireVarSheetClass *vs_class =
+    PSPPIRE_VAR_SHEET_CLASS(G_OBJECT_GET_CLASS (vs));
+
+  struct variable *var ;
+  GtkSheet *sheet = GTK_SHEET (vs);
+
+  g_return_val_if_fail (sheet != NULL, FALSE);
+
+  var_store = PSPPIRE_VAR_STORE (gtk_sheet_get_model (sheet));
+
+  g_assert (var_store);
+
+  if ( row >= psppire_var_store_get_var_cnt (var_store))
+    return TRUE;
+
+  gtk_sheet_get_attributes (sheet, row, column, &attributes);
+
+
+  var = psppire_var_store_get_var (var_store, row);
+
+  switch (column)
+    {
+    case PSPPIRE_VAR_STORE_COL_ALIGN:
+      {
+       static GtkListStore *list_store = NULL;
+       GtkComboBoxEntry *cbe;
+       gtk_sheet_change_entry (sheet, GTK_TYPE_COMBO_BOX_ENTRY);
+       cbe =
+         GTK_COMBO_BOX_ENTRY (gtk_sheet_get_entry (sheet)->parent);
+
+
+       if ( ! list_store) list_store = create_label_list (alignments);
+
+       gtk_combo_box_set_model (GTK_COMBO_BOX (cbe),
+                               GTK_TREE_MODEL (vs_class->alignment_list));
+
+       gtk_combo_box_entry_set_text_column (cbe, 0);
+
+       g_signal_connect (G_OBJECT (cbe),"changed",
+                        G_CALLBACK (change_alignment), var);
+      }
+      break;
+
+    case PSPPIRE_VAR_STORE_COL_MEASURE:
+      {
+       GtkComboBoxEntry *cbe;
+       gtk_sheet_change_entry (sheet, GTK_TYPE_COMBO_BOX_ENTRY);
+       cbe =
+         GTK_COMBO_BOX_ENTRY (gtk_sheet_get_entry (sheet)->parent);
+
+
+
+       gtk_combo_box_set_model (GTK_COMBO_BOX (cbe),
+                               GTK_TREE_MODEL (vs_class->measure_list));
+
+       gtk_combo_box_entry_set_text_column (cbe, 0);
+
+       g_signal_connect (G_OBJECT (cbe),"changed",
+                         G_CALLBACK (change_measure), var);
+      }
+      break;
+
+    case PSPPIRE_VAR_STORE_COL_VALUES:
+      {
+       PsppireCustomEntry *customEntry;
+
+       gtk_sheet_change_entry (sheet, PSPPIRE_CUSTOM_ENTRY_TYPE);
+
+       customEntry =
+         PSPPIRE_CUSTOM_ENTRY (gtk_sheet_get_entry (sheet));
+
+       if ( var_is_long_string (var))
+         g_object_set (customEntry,
+                       "editable", FALSE,
+                       NULL);
+
+       val_labs_dialog_set_target_variable (vs->val_labs_dialog, var);
+
+       g_signal_connect_swapped (customEntry,
+                                 "clicked",
+                                 G_CALLBACK (val_labs_dialog_show),
+                                 vs->val_labs_dialog);
+      }
+      break;
+
+    case PSPPIRE_VAR_STORE_COL_MISSING:
+      {
+       PsppireCustomEntry *customEntry;
+
+       gtk_sheet_change_entry (sheet, PSPPIRE_CUSTOM_ENTRY_TYPE);
+
+       customEntry =
+         PSPPIRE_CUSTOM_ENTRY (gtk_sheet_get_entry (sheet));
+
+       if ( var_is_long_string (var))
+         g_object_set (customEntry,
+                       "editable", FALSE,
+                       NULL);
+
+
+       vs->missing_val_dialog->pv =
+         psppire_var_store_get_var (var_store, row);
+
+       g_signal_connect_swapped (customEntry,
+                                 "clicked",
+                                 G_CALLBACK (missing_val_dialog_show),
+                                 vs->missing_val_dialog);
+      }
+      break;
+
+    case PSPPIRE_VAR_STORE_COL_TYPE:
+      {
+       PsppireCustomEntry *customEntry;
+
+       gtk_sheet_change_entry (sheet, PSPPIRE_CUSTOM_ENTRY_TYPE);
+
+       customEntry =
+         PSPPIRE_CUSTOM_ENTRY (gtk_sheet_get_entry (sheet));
+
+
+       /* Popup the Variable Type dialog box */
+       vs->var_type_dialog->pv = var;
+
+       g_signal_connect_swapped (customEntry,
+                                "clicked",
+                                G_CALLBACK (var_type_dialog_show),
+                                 vs->var_type_dialog);
+      }
+      break;
+
+    case PSPPIRE_VAR_STORE_COL_WIDTH:
+    case PSPPIRE_VAR_STORE_COL_DECIMALS:
+    case PSPPIRE_VAR_STORE_COL_COLUMNS:
+      {
+       if ( attributes.is_editable)
+         {
+           gint r_min, r_max;
+
+           const gchar *s = gtk_sheet_cell_get_text (sheet, row, column);
+
+           if (s)
+             {
+               GtkSpinButton *spinButton ;
+               const gint current_value  = g_strtod (s, NULL);
+               GtkObject *adj ;
+
+               const struct fmt_spec *fmt = var_get_write_format (var);
+               switch (column)
+                 {
+                 case PSPPIRE_VAR_STORE_COL_WIDTH:
+                   r_min = MAX (fmt->d + 1, fmt_min_output_width (fmt->type));
+                   r_max = fmt_max_output_width (fmt->type);
+                   break;
+                 case PSPPIRE_VAR_STORE_COL_DECIMALS:
+                   r_min = 0 ;
+                   r_max = fmt_max_output_decimals (fmt->type, fmt->w);
+                   break;
+                 case PSPPIRE_VAR_STORE_COL_COLUMNS:
+                   r_min = 1;
+                   r_max = 255 ; /* Is this a sensible value ? */
+                   break;
+                 default:
+                   g_assert_not_reached ();
+                 }
+
+               adj = gtk_adjustment_new (current_value,
+                                        r_min, r_max,
+                                        1.0, 1.0, 1.0 /* steps */
+                                        );
+
+               gtk_sheet_change_entry (sheet, GTK_TYPE_SPIN_BUTTON);
+
+               spinButton =
+                 GTK_SPIN_BUTTON (gtk_sheet_get_entry (sheet));
+
+               gtk_spin_button_set_adjustment (spinButton, GTK_ADJUSTMENT 
(adj));
+               gtk_spin_button_set_digits (spinButton, 0);
+             }
+         }
+      }
+      break;
+
+    default:
+      gtk_sheet_change_entry (sheet, GTK_TYPE_ENTRY);
+      break;
+    }
+
+
+  return TRUE;
+}
+
+
+
+
+static void
+psppire_var_sheet_init (PsppireVarSheet *vs)
+{
+  gint i;
+  GObject *geo = g_sheet_hetero_column_new (75, PSPPIRE_VAR_STORE_n_COLS);
+  GladeXML *xml = XML_NEW ("data-editor.glade");
+
+  vs->val_labs_dialog = val_labs_dialog_create (xml);
+  vs->missing_val_dialog = missing_val_dialog_create (xml);
+  vs->var_type_dialog = var_type_dialog_create (xml);
+
+  g_object_unref (xml);
+
+  vs->dispose_has_run = FALSE;
+
+  for (i = 0 ; i < PSPPIRE_VAR_STORE_n_COLS ; ++i )
+    {
+      g_sheet_hetero_column_set_button_label (G_SHEET_HETERO_COLUMN (geo), i,
+                                             gettext (column_def[i].label));
+
+      g_sheet_hetero_column_set_width (G_SHEET_HETERO_COLUMN (geo), i,
+                                      column_def[i].width);
+    }
+
+  g_object_set (vs, "column-geometry", geo, NULL);
+
+
+  g_signal_connect (vs, "activate",
+                   G_CALLBACK (var_sheet_cell_entry_enter),
+                   NULL);
+
+  g_signal_connect (vs, "deactivate",
+                   G_CALLBACK (var_sheet_cell_entry_leave),
+                   NULL);
+
+  g_signal_connect (vs, "traverse",
+                   G_CALLBACK (traverse_cell_callback), NULL);
+}
+
+
+GtkWidget*
+psppire_var_sheet_new (void)
+{
+  return GTK_WIDGET (g_object_new (psppire_var_sheet_get_type (), NULL));
+}

Index: src/ui/gui/psppire-var-sheet.h
===================================================================
RCS file: src/ui/gui/psppire-var-sheet.h
diff -N src/ui/gui/psppire-var-sheet.h
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ src/ui/gui/psppire-var-sheet.h      29 Feb 2008 09:13:53 -0000      1.1
@@ -0,0 +1,72 @@
+/* PSPPIRE - a graphical user interface for PSPP.
+   Copyright (C) 2008 Free Software Foundation, Inc.
+
+   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
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef __PSPPIRE_VAR_SHEET_H__
+#define __PSPPIRE_VAR_SHEET_H__
+
+
+#include <glib.h>
+#include <glib-object.h>
+#include <gtksheet/gtksheet.h>
+#include "val-labs-dialog.h"
+#include "missing-val-dialog.h"
+#include "var-type-dialog.h"
+
+
+G_BEGIN_DECLS
+
+#define PSPPIRE_VAR_SHEET_TYPE            (psppire_var_sheet_get_type ())
+#define PSPPIRE_VAR_SHEET(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), 
PSPPIRE_VAR_SHEET_TYPE, PsppireVarSheet))
+#define PSPPIRE_VAR_SHEET_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), 
PSPPIRE_VAR_SHEET_TYPE, PsppireVarSheetClass))
+#define PSPPIRE_IS_VAR_SHEET(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), 
PSPPIRE_VAR_SHEET_TYPE))
+#define PSPPIRE_IS_VAR_SHEET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), 
PSPPIRE_VAR_SHEET_TYPE))
+
+
+typedef struct _PsppireVarSheet       PsppireVarSheet;
+typedef struct _PsppireVarSheetClass  PsppireVarSheetClass;
+
+struct _PsppireVarSheet
+{
+  GtkSheet parent;
+
+  gboolean dispose_has_run;
+
+  struct val_labs_dialog *val_labs_dialog ;
+  struct missing_val_dialog *missing_val_dialog ;
+  struct var_type_dialog *var_type_dialog ;
+};
+
+
+struct _PsppireVarSheetClass
+{
+  GtkSheetClass parent_class;
+
+  GtkListStore *alignment_list;
+  GtkListStore *measure_list;
+
+  void (*var_sheet)(PsppireVarSheet*);
+};
+
+
+GType          psppire_var_sheet_get_type        (void);
+GtkWidget*     psppire_var_sheet_new             (void);
+
+G_END_DECLS
+
+
+
+
+#endif /* __PSPPIRE_VAR_SHEET_H__ */

Index: src/ui/gui/clipboard.c
===================================================================
RCS file: src/ui/gui/clipboard.c
diff -N src/ui/gui/clipboard.c
--- src/ui/gui/clipboard.c      24 Dec 2007 01:33:43 -0000      1.5
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,380 +0,0 @@
-/* PSPPIRE - a graphical user interface for PSPP.
-   Copyright (C) 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
-   the Free Software Foundation, either version 3 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>. */
-
-#include <config.h>
-
-#include <gtksheet/gtksheet.h>
-#include "clipboard.h"
-#include <data/case.h>
-#include "psppire-data-store.h"
-#include <data/casereader.h>
-#include <data/case-map.h>
-#include <data/casewriter.h>
-#include <data/format.h>
-#include <data/data-out.h>
-#include "helper.h"
-#include <stdlib.h>
-#include "data-editor.h"
-
-#include "xalloc.h"
-
-/* A casereader and dictionary holding the data currently in the clip */
-static struct casereader *clip_datasheet = NULL;
-static struct dictionary *clip_dict = NULL;
-
-
-
-
-static void data_sheet_update_clipboard (GtkSheet *);
-
-/* Set the clip according to the currently
-   selected range in the data sheet */
-void
-data_sheet_set_clip (GtkSheet *sheet)
-{
-  int i;
-  struct casewriter *writer ;
-  GtkSheetRange range;
-  PsppireDataStore *ds;
-  struct case_map *map = NULL;
-  casenumber max_rows;
-  size_t max_columns;
-
-  ds = PSPPIRE_DATA_STORE (gtk_sheet_get_model (sheet));
-
-  gtk_sheet_get_selected_range (sheet, &range);
-
-   /* If nothing selected, then use active cell */
-  if ( range.row0 < 0 || range.col0 < 0 )
-    {
-      gint row, col;
-      gtk_sheet_get_active_cell (sheet, &row, &col);
-
-      range.row0 = range.rowi = row;
-      range.col0 = range.coli = col;
-    }
-
-  /* The sheet range can include cells that do not include data.
-     Exclude them from the range. */
-  max_rows = psppire_data_store_get_case_count (ds);
-  if (range.rowi >= max_rows)
-    {
-      if (max_rows == 0)
-        return;
-      range.rowi = max_rows - 1;
-    }
-  max_columns = dict_get_var_cnt (ds->dict->dict);
-  if (range.coli >= max_columns)
-    {
-      if (max_columns == 0)
-        return;
-      range.coli = max_columns - 1;
-    }
-
-  g_return_if_fail (range.rowi >= range.row0);
-  g_return_if_fail (range.row0 >= 0);
-  g_return_if_fail (range.coli >= range.col0);
-  g_return_if_fail (range.col0 >= 0);
-
-  /* Destroy any existing clip */
-  if ( clip_datasheet )
-    {
-      casereader_destroy (clip_datasheet);
-      clip_datasheet = NULL;
-    }
-
-  if ( clip_dict )
-    {
-      dict_destroy (clip_dict);
-      clip_dict = NULL;
-    }
-
-  /* Construct clip dictionary. */
-  clip_dict = dict_create ();
-  for (i = range.col0; i <= range.coli; i++)
-    {
-      const struct variable *old = dict_get_var (ds->dict->dict, i);
-      dict_clone_var_assert (clip_dict, old, var_get_name (old));
-    }
-
-  /* Construct clip data. */
-  map = case_map_by_name (ds->dict->dict, clip_dict);
-  writer = autopaging_writer_create (dict_get_next_value_idx (clip_dict));
-  for (i = range.row0; i <= range.rowi ; ++i )
-    {
-      struct ccase old;
-
-      if (psppire_case_file_get_case (ds->case_file, i, &old))
-        {
-          struct ccase new;
-
-          case_map_execute (map, &old, &new);
-          case_destroy (&old);
-          casewriter_write (writer, &new);
-        }
-      else
-        casewriter_force_error (writer);
-    }
-  case_map_destroy (map);
-
-  clip_datasheet = casewriter_make_reader (writer);
-
-  data_sheet_update_clipboard (sheet);
-}
-
-enum {
-  SELECT_FMT_NULL,
-  SELECT_FMT_TEXT,
-  SELECT_FMT_HTML
-};
-
-
-/* Perform data_out for case CC, variable V, appending to STRING */
-static void
-data_out_g_string (GString *string, const struct variable *v,
-                  const struct ccase *cc)
-{
-  char *buf ;
-
-  const struct fmt_spec *fs = var_get_print_format (v);
-  const union value *val = case_data (cc, v);
-  buf = xzalloc (fs->w);
-
-  data_out (val, fs, buf);
-
-  g_string_append_len (string, buf, fs->w);
-
-  g_free (buf);
-}
-
-static GString *
-clip_to_text (void)
-{
-  casenumber r;
-  GString *string;
-
-  const size_t val_cnt = casereader_get_value_cnt (clip_datasheet);
-  const casenumber case_cnt = casereader_get_case_cnt (clip_datasheet);
-  const size_t var_cnt = dict_get_var_cnt (clip_dict);
-
-  string = g_string_sized_new (10 * val_cnt * case_cnt);
-
-  for (r = 0 ; r < case_cnt ; ++r )
-    {
-      int c;
-      struct ccase cc;
-      if ( !  casereader_peek (clip_datasheet, r, &cc))
-       {
-         g_warning ("Clipboard seems to have inexplicably shrunk");
-         break;
-       }
-
-      for (c = 0 ; c < var_cnt ; ++c)
-       {
-         const struct variable *v = dict_get_var (clip_dict, c);
-         data_out_g_string (string, v, &cc);
-         if ( c < val_cnt - 1 )
-           g_string_append (string, "\t");
-       }
-
-      if ( r < case_cnt)
-       g_string_append (string, "\n");
-
-      case_destroy (&cc);
-    }
-
-  return string;
-}
-
-
-static GString *
-clip_to_html (void)
-{
-  casenumber r;
-  GString *string;
-
-  const size_t val_cnt = casereader_get_value_cnt (clip_datasheet);
-  const casenumber case_cnt = casereader_get_case_cnt (clip_datasheet);
-  const size_t var_cnt = dict_get_var_cnt (clip_dict);
-
-
-  /* Guestimate the size needed */
-  string = g_string_sized_new (20 * val_cnt * case_cnt);
-
-  g_string_append (string, "<table>\n");
-  for (r = 0 ; r < case_cnt ; ++r )
-    {
-      int c;
-      struct ccase cc;
-      if ( !  casereader_peek (clip_datasheet, r, &cc))
-       {
-         g_warning ("Clipboard seems to have inexplicably shrunk");
-         break;
-       }
-      g_string_append (string, "<tr>\n");
-
-      for (c = 0 ; c < var_cnt ; ++c)
-       {
-         const struct variable *v = dict_get_var (clip_dict, c);
-         g_string_append (string, "<td>");
-         data_out_g_string (string, v, &cc);
-         g_string_append (string, "</td>\n");
-       }
-
-      g_string_append (string, "</tr>\n");
-
-      case_destroy (&cc);
-    }
-  g_string_append (string, "</table>\n");
-
-  return string;
-}
-
-
-
-static void
-clipboard_get_cb (GtkClipboard     *clipboard,
-                 GtkSelectionData *selection_data,
-                 guint             info,
-                 gpointer          data)
-{
-  GString *string = NULL;
-
-  switch (info)
-    {
-    case SELECT_FMT_TEXT:
-      string = clip_to_text ();
-      break;
-    case SELECT_FMT_HTML:
-      string = clip_to_html ();
-      break;
-    default:
-      g_assert_not_reached ();
-    }
-
-  gtk_selection_data_set (selection_data, selection_data->target,
-                         8,
-                         (const guchar *) string->str, string->len);
-
-  g_string_free (string, TRUE);
-}
-
-static void
-clipboard_clear_cb (GtkClipboard *clipboard,
-                   gpointer data)
-{
-  dict_destroy (clip_dict);
-  clip_dict = NULL;
-
-  casereader_destroy (clip_datasheet);
-  clip_datasheet = NULL;
-}
-
-
-
-static void
-data_sheet_update_clipboard (GtkSheet *sheet)
-{
-  static const GtkTargetEntry targets[] = {
-    { "UTF8_STRING",   0, SELECT_FMT_TEXT },
-    { "STRING",        0, SELECT_FMT_TEXT },
-    { "TEXT",          0, SELECT_FMT_TEXT },
-    { "COMPOUND_TEXT", 0, SELECT_FMT_TEXT },
-    { "text/plain;charset=utf-8", 0, SELECT_FMT_TEXT },
-    { "text/plain",    0, SELECT_FMT_TEXT },
-    { "text/html",     0, SELECT_FMT_HTML }
-  };
-
-  GtkClipboard *clipboard =
-    gtk_widget_get_clipboard (GTK_WIDGET (sheet),
-                             GDK_SELECTION_CLIPBOARD);
-
-  if (!gtk_clipboard_set_with_owner (clipboard, targets,
-                                    G_N_ELEMENTS (targets),
-                                    clipboard_get_cb, clipboard_clear_cb,
-                                    G_OBJECT (sheet)))
-    clipboard_clear_cb (clipboard, sheet);
-}
-
-
-
-/* A callback for when  clipboard contents have been received */
-void
-data_sheet_contents_received_callback (GtkClipboard *clipboard,
-                                     GtkSelectionData *sd,
-                                     gpointer data)
-{
-  struct data_editor *de = data;
-
-  gint count = 0;
-  gint row, column;
-  gint next_row, next_column;
-  gint first_column;
-  char *c;
-  GtkSheet *data_sheet ;
-  PsppireDataStore *data_store;
-
-  if ( sd->length < 0 )
-    return;
-
-  if ( sd->type != gdk_atom_intern ("UTF8_STRING", FALSE))
-    return;
-
-  c = (char *) sd->data;
-
-  /* Paste text to selected position */
-  data_sheet = GTK_SHEET (get_widget_assert (de->xml, "data_sheet"));
-  data_store = PSPPIRE_DATA_STORE (gtk_sheet_get_model (data_sheet));
-
-  gtk_sheet_get_active_cell (data_sheet, &row, &column);
-
-  g_return_if_fail (row >= 0);
-  g_return_if_fail (column >= 0);
-
-  first_column = column;
-  next_row = row;
-  next_column = column;
-  while (count < sd->length)
-    {
-      char *s = c;
-
-      row = next_row;
-      column = next_column;
-      while (*c != '\t' && *c != '\n' && count < sd->length)
-       {
-         c++;
-         count++;
-       }
-      if ( *c == '\t')
-       {
-         next_row = row ;
-         next_column = column + 1;
-       }
-      else if ( *c == '\n')
-       {
-         next_row = row + 1;
-         next_column = first_column;
-       }
-      *c++ = '\0';
-      count++;
-
-      /* Append some new cases if pasting beyond the last row */
-      if ( row >= psppire_data_store_get_case_count (data_store))
-       psppire_data_store_insert_new_case (data_store, row);
-
-      gtk_sheet_set_cell_text (data_sheet, row, column, s);
-    }
-}

Index: src/ui/gui/clipboard.h
===================================================================
RCS file: src/ui/gui/clipboard.h
diff -N src/ui/gui/clipboard.h
--- src/ui/gui/clipboard.h      12 Oct 2007 05:05:32 -0000      1.3
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,31 +0,0 @@
-/* PSPPIRE - a graphical user interface for PSPP.
-   Copyright (C) 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
-   the Free Software Foundation, either version 3 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>. */
-
-#include <gtksheet/gtksheet.h>
-
-#ifndef CLIPBOARD_H
-#define CLIPBOARD_H
-
-
-void data_sheet_set_clip (GtkSheet *data_sheet);
-
-void data_sheet_contents_received_callback (GtkClipboard *clipboard,
-                                           GtkSelectionData *sd,
-                                           gpointer data);
-
-
-#endif /* CLIPBOARD_H */
-

Index: src/ui/gui/data-sheet.h
===================================================================
RCS file: src/ui/gui/data-sheet.h
diff -N src/ui/gui/data-sheet.h
--- src/ui/gui/data-sheet.h     7 Jul 2007 06:14:27 -0000       1.7
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,48 +0,0 @@
-/* PSPPIRE - a graphical user interface for PSPP.
-   Copyright (C) 2004  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
-   the Free Software Foundation, either version 3 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>. */
-
-
-#ifndef DATA_SHEET_H
-#define DATA_SHEET_H
-
-#include <gtksheet/gtksheet.h>
-#include "psppire-dict.h"
-
-void psppire_data_sheet_clear (GtkSheet *sheet);
-
-#if 0
-void psppire_data_sheet_set_dictionary (GtkSheet *sheet, PsppireDict *d);
-#endif
-
-GtkWidget* psppire_data_sheet_create (gchar *widget_name,
-                                     gchar *string1,
-                                     gchar *string2,
-                                     gint int1, gint int2);
-
-
-void data_sheet_set_cell_value (GtkSheet *sheet, gint row, gint col,
-                              const GValue *value);
-
-
-void psppire_data_sheet_set_show_labels (GtkSheet *sheet, gboolean 
show_labels);
-
-/* Repair any damage that may have been done to the data sheet */
-void psppire_data_sheet_redisplay (GtkSheet *sheet);
-
-guint columnWidthToPixels (GtkSheet *sheet, gint column, guint width);
-
-
-#endif




reply via email to

[Prev in Thread] Current Thread [Next in Thread]