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;
msgstr ""
"Project-Id-Version: PSPP 0.4.3\n"
"Report-Msgid-Bugs-To: pspp-dev@gnu.org\n"
-"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 <john@darrington.wattle.id.au>\n"
"Language-Team: German <pspp-dev@gnu.org>\n"
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 ""
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 ""
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"
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"
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 ""
"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 ""
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."
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."
#: 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"
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"
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"
#: 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"
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"
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 ""
"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 ""
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 ""
#: 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"
msgstr ""
#: src/ui/gui/crosstabs.glade:138 src/ui/gui/examine.glade:246
+#: src/ui/gui/regression.glade:31
msgid "Statistics..."
msgstr ""
msgstr ""
#: src/ui/gui/crosstabs.glade:439 src/ui/gui/oneway.glade:207
+#: src/ui/gui/regression.glade:324
msgid "Statistics"
msgstr ""
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 ""
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"
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 ""
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"
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 ""
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."
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 ""
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 ""
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"
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."
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 ""
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"
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"
msgstr ""
"Project-Id-Version: PSPP 0.4.3\n"
"Report-Msgid-Bugs-To: pspp-dev@gnu.org\n"
-"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 <john@darrington.wattle.id.au>\n"
"Language-Team: John Darrington <john@darrington.wattle.id.au>\n"
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 ""
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 ""
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 ""
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 ""
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 ""
"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 ""
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."
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."
#: 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 ""
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 ""
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 ""
#: 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 ""
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 ""
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 ""
"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 ""
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 ""
#: 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 ""
msgstr ""
#: src/ui/gui/crosstabs.glade:138 src/ui/gui/examine.glade:246
+#: src/ui/gui/regression.glade:31
msgid "Statistics..."
msgstr ""
msgstr ""
#: src/ui/gui/crosstabs.glade:439 src/ui/gui/oneway.glade:207
+#: src/ui/gui/regression.glade:324
msgid "Statistics"
msgstr ""
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 ""
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 ""
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 ""
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 ""
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 ""
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 ""
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 ""
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 ""
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 ""
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."
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 ""
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"
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"
+2008-02-29 John Darrington <john@darrington.wattle.id.au>
+
+ * 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 <jhs@math.gcsu.edu>
* regression-dialog.c: New file.
src_ui_gui_psppire_LDFLAGS = \
$(PG_LDFLAGS) \
- -export-dynamic
+ -export-dynamic
if RELOCATABLE_VIA_LD
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 \
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 \
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 \
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 \
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 \
+++ /dev/null
-/* 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);
- }
-}
+++ /dev/null
-/* 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 */
-
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);
gint response;
struct data_editor *de = data;
- PsppireVarStore *vs;
+ PsppireVarStore *vs = NULL;
struct compute_dialog scd;
GladeXML *xml = XML_NEW ("psppire.glade");
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;
enum {
- COL_NAME,
- COL_USAGE,
- COL_ARITY
+ COMPUTE_COL_NAME,
+ COMPUTE_COL_USAGE,
+ COMPUTE_COL_ARITY
};
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);
}
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));
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);
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");
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,
/* 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
#include "window-manager.h"
#include <gtksheet/gtksheet.h>
+#include "psppire-data-editor.h"
+
#include "helper.h"
#include "about.h"
#include <data/procedure.h>
#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"
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);
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);
}
#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.
{
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));
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");
+ de->data_editor = PSPPIRE_DATA_EDITOR (psppire_data_editor_new (the_var_store, the_data_store));
- g_signal_connect (G_OBJECT (data_sheet), "activate",
- 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 (G_OBJECT (data_sheet), "deactivate",
- G_CALLBACK (on_data_sheet_activate_change), 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));
+ gtk_widget_show (GTK_WIDGET (de->data_editor));
- g_assert(vs); /* Traps a possible bug in win32 build */
-
- 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),
_("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);
_("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);
_("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")
"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,
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",
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);
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),
- ¤t_row, ¤t_column);
-
- gtk_sheet_set_active_cell (GTK_SHEET (data_sheet), current_row, row);
-
- 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;
+ de->data_sheet_variable_popup_menu =
+ GTK_MENU (create_data_sheet_variable_popup_menu (de));
- gint current_row, current_column;
+ de->data_sheet_cases_popup_menu =
+ GTK_MENU (create_data_sheet_cases_popup_menu (de));
- GtkWidget *var_sheet = get_widget_assert (de->xml, "variable_sheet");
- data_editor_select_sheet (de, PAGE_VAR_SHEET);
+ g_object_set (de->data_editor,
+ "column-menu", de->data_sheet_variable_popup_menu, NULL);
- gtk_sheet_get_active_cell (GTK_SHEET (var_sheet),
- ¤t_row, ¤t_column);
- gtk_sheet_set_active_cell (GTK_SHEET (var_sheet), col, current_column);
+ g_object_set (de->data_editor,
+ "row-menu", de->data_sheet_cases_popup_menu, NULL);
- return FALSE;
+ return de;
}
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;
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)
{
grid_lines_activate (GtkCheckMenuItem *menuitem, gpointer data)
{
struct data_editor *de = data;
- const bool grid_visible = gtk_check_menu_item_get_active (menuitem);
+ const gboolean grid_visible = gtk_check_menu_item_get_active (menuitem);
- gtk_sheet_show_grid (GTK_SHEET (get_widget_assert (de->xml,
- "variable_sheet")),
- grid_visible);
-
- 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);
}
"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);
{
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)
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, ¤t_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)
}
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);
}
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);
}
-
-/* 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 =
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 );
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 ();
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);
- }
-}
-
+\f
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);
}
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);
}
-
-
<property name="position">1</property>
</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>
#include <glade/glade.h>
#include <gtk/gtk.h>
#include "window-manager.h"
+#include "psppire-data-editor.h"
struct data_editor
{
GtkMenu *data_sheet_variable_popup_menu;
GtkMenu *data_sheet_cases_popup_menu;
+ PsppireDataEditor *data_editor;
gboolean save_as_portable;
void data_editor_select_sheet (struct data_editor *de, gint page);
-enum {PAGE_DATA_SHEET = 0, PAGE_VAR_SHEET};
-
-
#endif
+++ /dev/null
-/* 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
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);
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");
{
GladeXML *xml;
PsppireDict *dict;
- GtkSheet *data_sheet;
struct datasheet *data;
struct data_editor *de;
GtkWidget *variable_entry;
{
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_sheet_moveto (fd->data_sheet, x, column, 0.5, 0.5);
+ gtk_notebook_set_page (GTK_NOTEBOOK (fd->de->data_editor),
+ PSPPIRE_DATA_EDITOR_DATA_VIEW);
- 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.
GtkWidget *selector;
GtkWidget *find_button;
- GtkSheet *var_sheet;
- GtkSheet *data_sheet ;
GtkWidget *buttonbox;
- PsppireVarStore *vs ;
+ PsppireVarStore *vs ;
PsppireDataStore *ds ;
fd.xml = XML_NEW ("psppire.glade");
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");
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,
);
-
-
gtk_window_set_transient_for (GTK_WINDOW (dialog), de->parent.window);
attach_dictionary_to_treeview (GTK_TREE_VIEW (source),
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);
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);
}
}
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");
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;
--- /dev/null
+/* 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),
+ ¤t_row, ¤t_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),
+ ¤t_row, ¤t_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));
+}
+
+
+\f
+
+/* 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);
+ }
+}
+
+\f
+
+/* 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);
+}
+
+
+\f
+
+
+/* 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);
+}
+
+
+\f
+
+
+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);
+}
+
+
+\f
+
+/* 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);
+}
--- /dev/null
+/* 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__ */
--- /dev/null
+
+/* 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));
+}
--- /dev/null
+/* 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__ */
#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>
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);
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:
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);
}
switch (col)
{
- case COL_LABEL:
+ case PSPPIRE_VAR_STORE_COL_LABEL:
var_set_label (pv, 0);
return TRUE;
break;
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;
return TRUE;
}
break;
- case COL_DECIMALS:
+ case PSPPIRE_VAR_STORE_COL_DECIMALS:
{
bool for_input
= var_store->format_type == PSPPIRE_VAR_STORE_INPUT_FORMATS;
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;
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 )
{
}
}
break;
- case COL_WIDTH:
+ case PSPPIRE_VAR_STORE_COL_WIDTH:
{
gchar *s;
GString *gstr = g_string_sized_new (10);
return s;
}
break;
- case COL_DECIMALS:
+ case PSPPIRE_VAR_STORE_COL_DECIMALS:
{
gchar *s;
GString *gstr = g_string_sized_new (10);
return s;
}
break;
- case COL_COLUMNS:
+ case PSPPIRE_VAR_STORE_COL_COLUMNS:
{
gchar *s;
GString *gstr = g_string_sized_new (10);
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);
}
}
break;
- case COL_ALIGN:
+ case PSPPIRE_VAR_STORE_COL_ALIGN:
{
const gint align = var_get_alignment (pv);
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);
}
static glong
psppire_var_store_get_column_count (const GSheetModel * model)
{
- return n_COLS ;
+ return PSPPIRE_VAR_STORE_n_COLS ;
}
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__ */
#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"
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");
COL_OLD,
COL_NEW_NAME,
COL_NEW_LABEL,
- n_COLS
+ n_COL_VARS
};
enum {
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");
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);
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");
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);
GtkWidget *selector ;
GtkWidget *on_off ;
- GtkSheet *var_sheet ;
-
sfd.xml = XML_NEW ("psppire.glade");
dialog = get_widget_assert (sfd.xml, "split-file-dialog");
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);
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");
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;
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");
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");
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");
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 =
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");
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);
#include <data/variable.h>
#include <stdlib.h>
-#include "var-sheet.h"
#include <gettext.h>
#define _(msgid) gettext (msgid)
#define N_(msgid) msgid
#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);
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);
{
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);
- }
- 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);
- }
+ g_object_set (de->data_editor, "current-variable", var_get_dict_index (var), NULL);
}
+
break;
case PSPPIRE_RESPONSE_PASTE:
{
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);