Implemented the FREQUENCIES dialog.
authorJohn Darrington <john@darrington.wattle.id.au>
Sat, 1 Dec 2007 04:42:19 +0000 (04:42 +0000)
committerJohn Darrington <john@darrington.wattle.id.au>
Sat, 1 Dec 2007 04:42:19 +0000 (04:42 +0000)
13 files changed:
po/de.po
po/en_GB.po
src/ui/gui/ChangeLog
src/ui/gui/automake.mk
src/ui/gui/checkbox-treeview.c [new file with mode: 0644]
src/ui/gui/checkbox-treeview.h [new file with mode: 0644]
src/ui/gui/data-editor.c
src/ui/gui/data-editor.glade
src/ui/gui/data-editor.h
src/ui/gui/descriptives-dialog.c
src/ui/gui/frequencies-dialog.c [new file with mode: 0644]
src/ui/gui/frequencies-dialog.h [new file with mode: 0644]
src/ui/gui/frequencies.glade [new file with mode: 0644]

index 22304c4decdfd1e948da650a9e82c9d4e4fb526e..37c7d8f0047801908db1f507ac57dc4675521424 100644 (file)
--- a/po/de.po
+++ b/po/de.po
@@ -10,7 +10,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PSPP 0.4.3\n"
 "Report-Msgid-Bugs-To: pspp-dev@gnu.org\n"
-"POT-Creation-Date: 2007-11-29 20:13+0900\n"
+"POT-Creation-Date: 2007-11-30 16:17+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"
@@ -2665,7 +2665,7 @@ msgstr ""
 
 #: src/language/stats/crosstabs.q:1151 src/language/stats/crosstabs.q:1178
 #: src/language/stats/crosstabs.q:1198 src/language/stats/crosstabs.q:1219
-#: src/language/stats/examine.q:1423 src/ui/gui/descriptives-dialog.c:276
+#: src/language/stats/examine.q:1423 src/ui/gui/checkbox-treeview.c:115
 msgid "Statistic"
 msgstr ""
 
@@ -2859,7 +2859,8 @@ msgstr ""
 #: src/language/stats/frequencies.q:123 src/language/stats/npar-summary.c:125
 #: src/language/stats/oneway.q:392 src/language/stats/t-test.q:683
 #: src/language/stats/t-test.q:706 src/language/stats/t-test.q:830
-#: src/language/stats/t-test.q:1168 src/ui/gui/descriptives-dialog.c:52
+#: src/language/stats/t-test.q:1168 src/ui/gui/descriptives-dialog.c:40
+#: src/ui/gui/frequencies-dialog.c:41
 msgid "Mean"
 msgstr ""
 
@@ -2872,12 +2873,14 @@ msgid "Std Dev"
 msgstr ""
 
 #: src/language/stats/descriptives.c:105 src/language/stats/examine.q:1604
-#: src/language/stats/frequencies.q:128 src/ui/gui/descriptives-dialog.c:59
+#: src/language/stats/frequencies.q:128 src/ui/gui/descriptives-dialog.c:47
+#: src/ui/gui/frequencies-dialog.c:46
 msgid "Variance"
 msgstr ""
 
 #: src/language/stats/descriptives.c:106 src/language/stats/examine.q:1711
-#: src/language/stats/frequencies.q:129 src/ui/gui/descriptives-dialog.c:60
+#: src/language/stats/frequencies.q:129 src/ui/gui/descriptives-dialog.c:48
+#: src/ui/gui/frequencies-dialog.c:51
 msgid "Kurtosis"
 msgstr ""
 
@@ -2886,7 +2889,8 @@ msgid "S E Kurt"
 msgstr ""
 
 #: src/language/stats/descriptives.c:108 src/language/stats/examine.q:1691
-#: src/language/stats/frequencies.q:131 src/ui/gui/descriptives-dialog.c:61
+#: src/language/stats/frequencies.q:131 src/ui/gui/descriptives-dialog.c:49
+#: src/ui/gui/frequencies-dialog.c:47
 msgid "Skewness"
 msgstr ""
 
@@ -2895,24 +2899,27 @@ msgid "S E Skew"
 msgstr ""
 
 #: src/language/stats/descriptives.c:110 src/language/stats/examine.q:1652
-#: src/language/stats/frequencies.q:133 src/ui/gui/descriptives-dialog.c:56
+#: src/language/stats/frequencies.q:133 src/ui/gui/descriptives-dialog.c:44
+#: src/ui/gui/frequencies-dialog.c:49
 msgid "Range"
 msgstr ""
 
 #: src/language/stats/descriptives.c:111 src/language/stats/examine.q:1629
 #: src/language/stats/frequencies.q:134 src/language/stats/npar-summary.c:131
-#: src/language/stats/oneway.q:404 src/ui/gui/descriptives-dialog.c:54
+#: src/language/stats/oneway.q:404 src/ui/gui/descriptives-dialog.c:42
+#: src/ui/gui/frequencies-dialog.c:43
 msgid "Minimum"
 msgstr ""
 
 #: src/language/stats/descriptives.c:112 src/language/stats/examine.q:1640
 #: src/language/stats/frequencies.q:135 src/language/stats/npar-summary.c:134
-#: src/language/stats/oneway.q:405 src/ui/gui/descriptives-dialog.c:55
+#: src/language/stats/oneway.q:405 src/ui/gui/descriptives-dialog.c:43
+#: src/ui/gui/frequencies-dialog.c:44
 msgid "Maximum"
 msgstr ""
 
 #: src/language/stats/descriptives.c:113 src/language/stats/frequencies.q:136
-#: src/ui/gui/descriptives-dialog.c:57
+#: src/ui/gui/descriptives-dialog.c:45 src/ui/gui/frequencies-dialog.c:54
 msgid "Sum"
 msgstr ""
 
@@ -3019,6 +3026,7 @@ msgid "5%% Trimmed Mean"
 msgstr ""
 
 #: src/language/stats/examine.q:1582 src/language/stats/frequencies.q:125
+#: src/ui/gui/frequencies-dialog.c:53
 msgid "Median"
 msgstr ""
 
@@ -3147,7 +3155,7 @@ msgstr ""
 msgid "S.E. Mean"
 msgstr ""
 
-#: src/language/stats/frequencies.q:126
+#: src/language/stats/frequencies.q:126 src/ui/gui/frequencies-dialog.c:50
 msgid "Mode"
 msgstr ""
 
@@ -4397,286 +4405,295 @@ msgstr "Spalten"
 msgid "Style of bevel around the custom entry button"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:163
+#: src/ui/gui/data-editor.c:164
 msgid "Transformations Pending"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:425
+#: src/ui/gui/data-editor.c:426
 #, fuzzy
 msgid "Labels"
 msgstr "Kennsatz"
 
-#: src/ui/gui/data-editor.c:426
+#: src/ui/gui/data-editor.c:427
 msgid "Show/hide value labels"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:444 src/ui/gui/data-editor.c:461
-#: src/ui/gui/data-editor.c:1830 src/ui/gui/data-editor.c:1883
+#: src/ui/gui/data-editor.c:445 src/ui/gui/data-editor.c:462
+#: src/ui/gui/data-editor.c:1846 src/ui/gui/data-editor.c:1899
 msgid "Clear"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:445
+#: src/ui/gui/data-editor.c:446
 msgid "Delete the cases at the selected position(s)"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:462
+#: src/ui/gui/data-editor.c:463
 msgid "Delete the variables at the selected position(s)"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:476 src/ui/gui/data-editor.c:1827
+#: src/ui/gui/data-editor.c:477 src/ui/gui/data-editor.c:1843
 #: 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:477
+#: src/ui/gui/data-editor.c:478
 msgid "Create a new variable at the current position"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:495 src/ui/gui/data-editor.c:1880
+#: src/ui/gui/data-editor.c:496 src/ui/gui/data-editor.c:1896
 #: src/ui/gui/data-editor.glade:796
 #, fuzzy
 msgid "Insert Case"
 msgstr "_Stecken"
 
-#: src/ui/gui/data-editor.c:496
+#: src/ui/gui/data-editor.c:497
 msgid "Create a new case at the current position"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:516
+#: src/ui/gui/data-editor.c:517
 #, fuzzy
 msgid "Goto Case"
 msgstr "_Stecken"
 
-#: src/ui/gui/data-editor.c:517
+#: src/ui/gui/data-editor.c:518
 msgid "Jump to a Case in the Data Sheet"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:536
+#: src/ui/gui/data-editor.c:537
 #, fuzzy
 msgid "Weights"
 msgstr "Rechts"
 
-#: src/ui/gui/data-editor.c:537
+#: src/ui/gui/data-editor.c:538
 msgid "Weight cases by variable"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:546 src/ui/gui/data-editor.glade:312
+#: src/ui/gui/data-editor.c:547 src/ui/gui/data-editor.glade:312
 msgid "Transpose"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:547
+#: src/ui/gui/data-editor.c:548
 msgid "Transpose the cases with the variables"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:558
+#: src/ui/gui/data-editor.c:559
 #, fuzzy
 msgid "Split"
 msgstr "Alle Datei"
 
-#: src/ui/gui/data-editor.c:559
+#: src/ui/gui/data-editor.c:560
 msgid "Split the active file"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:569
+#: src/ui/gui/data-editor.c:570
 msgid "Sort"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:570
+#: src/ui/gui/data-editor.c:571
 msgid "Sort cases in the active file"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:578 src/ui/gui/data-editor.glade:347
+#: src/ui/gui/data-editor.c:579 src/ui/gui/data-editor.glade:347
 #: src/ui/gui/data-editor.glade:851
 msgid "Select Cases"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:579
+#: src/ui/gui/data-editor.c:580
 msgid "Select cases from the active file"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:588
+#: src/ui/gui/data-editor.c:589
 msgid "Compute"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:589
+#: src/ui/gui/data-editor.c:590
 #, fuzzy
 msgid "Compute new values for a variable"
 msgstr "Unpassend Wert für Variable"
 
-#: src/ui/gui/data-editor.c:597
+#: src/ui/gui/data-editor.c:598
 msgid "Oneway _ANOVA"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:598
+#: src/ui/gui/data-editor.c:599
 msgid "Perform one way analysis of variance"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:606 src/ui/gui/data-editor.glade:503
+#: src/ui/gui/data-editor.c:607 src/ui/gui/data-editor.glade:503
 msgid "_Independent Samples T Test"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:607
+#: src/ui/gui/data-editor.c:608
 msgid "Calculate T Test for samples from independent groups"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:616
+#: src/ui/gui/data-editor.c:617
 #, fuzzy
 msgid "Data File Comments"
 msgstr "Datei Fehler"
 
-#: src/ui/gui/data-editor.c:617
+#: src/ui/gui/data-editor.c:618
 msgid "Commentary text for the data file"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:625 src/ui/gui/data-editor.glade:776
+#: src/ui/gui/data-editor.c:626 src/ui/gui/data-editor.glade:776
 msgid "Find"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:626
+#: src/ui/gui/data-editor.c:627
 #, fuzzy
 msgid "Find Case"
 msgstr "_Stecken"
 
-#: src/ui/gui/data-editor.c:635 src/ui/gui/data-editor.glade:384
+#: src/ui/gui/data-editor.c:636 src/ui/gui/data-editor.glade:384
 #, fuzzy
 msgid "Ran_k Cases"
 msgstr "_Stecken"
 
-#: src/ui/gui/data-editor.c:636
+#: src/ui/gui/data-editor.c:637
 #, fuzzy
 msgid "Rank Cases"
 msgstr "_Stecken"
 
-#: src/ui/gui/data-editor.c:645 src/ui/gui/data-editor.glade:396
+#: src/ui/gui/data-editor.c:646 src/ui/gui/data-editor.glade:396
 #, fuzzy
 msgid "Recode into _Same Variables"
 msgstr "Variableansicht"
 
-#: src/ui/gui/data-editor.c:646
+#: src/ui/gui/data-editor.c:647
 #, fuzzy
 msgid "Recode values into the same Variables"
 msgstr "Unpassend Wert für Variable"
 
-#: src/ui/gui/data-editor.c:655 src/ui/gui/data-editor.glade:403
+#: src/ui/gui/data-editor.c:656 src/ui/gui/data-editor.glade:403
 msgid "Recode into _Different Variables"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:656
+#: src/ui/gui/data-editor.c:657
 msgid "Recode values into different Variables"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:665 src/ui/gui/data-editor.glade:286
+#: src/ui/gui/data-editor.c:666 src/ui/gui/data-editor.glade:286
 #: src/ui/gui/data-editor.glade:755
 msgid "Variables"
 msgstr "Variableansicht"
 
-#: src/ui/gui/data-editor.c:666
+#: src/ui/gui/data-editor.c:667
 #, fuzzy
 msgid "Jump to Variable"
 msgstr "Variableansicht"
 
-#: src/ui/gui/data-editor.c:674 src/ui/gui/data-editor.glade:457
+#: src/ui/gui/data-editor.c:675 src/ui/gui/data-editor.glade:457
 #: src/ui/gui/oneway.glade:179
 msgid "_Descriptives"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:675
+#: src/ui/gui/data-editor.c:676
 msgid "Calculate descriptive statistics (mean, variance, ...)"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1108
+#: src/ui/gui/data-editor.c:685 src/ui/gui/data-editor.glade:449
+#, fuzzy
+msgid "_Frequencies"
+msgstr "Variableansicht"
+
+#: src/ui/gui/data-editor.c:686
+msgid "Generate frequency statistics"
+msgstr ""
+
+#: src/ui/gui/data-editor.c:1124
 msgid "Font Selection"
 msgstr "Schriftwahlung"
 
-#: src/ui/gui/data-editor.c:1315
+#: src/ui/gui/data-editor.c:1331
 msgid "No Split"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1324
+#: src/ui/gui/data-editor.c:1340
 #, fuzzy
 msgid "Split by "
 msgstr "Alle Datei"
 
-#: src/ui/gui/data-editor.c:1349
+#: src/ui/gui/data-editor.c:1365
 msgid "Filter off"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1362
+#: src/ui/gui/data-editor.c:1378
 #, c-format
 msgid "Filter by %s"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1380
+#: src/ui/gui/data-editor.c:1396
 msgid "Weights off"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1393
+#: src/ui/gui/data-editor.c:1409
 #, c-format
 msgid "Weight by %s"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1416 src/ui/gui/data-editor.c:1650
+#: src/ui/gui/data-editor.c:1432 src/ui/gui/data-editor.c:1666
 #: src/ui/gui/data-editor.glade:667
 msgid "Open"
 msgstr "Öffen"
 
-#: src/ui/gui/data-editor.c:1417
+#: src/ui/gui/data-editor.c:1433
 msgid "Open a data file"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1425 src/ui/gui/data-editor.c:1532
+#: src/ui/gui/data-editor.c:1441 src/ui/gui/data-editor.c:1548
 #: src/ui/gui/data-editor.glade:677
 msgid "Save"
 msgstr "Speichen"
 
-#: src/ui/gui/data-editor.c:1426 src/ui/gui/data-editor.c:1436
+#: src/ui/gui/data-editor.c:1442 src/ui/gui/data-editor.c:1452
 #, fuzzy
 msgid "Save data to file"
 msgstr "Speichern unter"
 
-#: src/ui/gui/data-editor.c:1435
+#: src/ui/gui/data-editor.c:1451
 #, fuzzy
 msgid "Save As"
 msgstr "Speichern unter"
 
-#: src/ui/gui/data-editor.c:1444 src/ui/gui/recode-dialog.c:931
+#: src/ui/gui/data-editor.c:1460 src/ui/gui/recode-dialog.c:931
 #: src/ui/gui/recode-dialog.c:1025
 msgid "New"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1445
+#: src/ui/gui/data-editor.c:1461
 msgid "New data file"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1540 src/ui/gui/data-editor.c:1658
+#: src/ui/gui/data-editor.c:1556 src/ui/gui/data-editor.c:1674
 msgid "System Files (*.sav)"
 msgstr "Systemedatein (*.sav)"
 
-#: src/ui/gui/data-editor.c:1546 src/ui/gui/data-editor.c:1664
+#: src/ui/gui/data-editor.c:1562 src/ui/gui/data-editor.c:1680
 msgid "Portable Files (*.por) "
 msgstr "Tragbardatein (*.por)"
 
-#: src/ui/gui/data-editor.c:1552 src/ui/gui/data-editor.c:1670
+#: src/ui/gui/data-editor.c:1568 src/ui/gui/data-editor.c:1686
 #: 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:1560
+#: src/ui/gui/data-editor.c:1576
 #, fuzzy
 msgid "System File"
 msgstr "Systemedatein (*.sav)"
 
-#: src/ui/gui/data-editor.c:1565
+#: src/ui/gui/data-editor.c:1581
 #, fuzzy
 msgid "Portable File"
 msgstr "Tragbardatein (*.por)"
 
-#: src/ui/gui/data-editor.c:1820
+#: src/ui/gui/data-editor.c:1836
 msgid "Sort Ascending"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1823
+#: src/ui/gui/data-editor.c:1839
 msgid "Sort Descending"
 msgstr ""
 
@@ -4805,11 +4822,6 @@ msgstr ""
 msgid "_Descriptive Statistics"
 msgstr ""
 
-#: src/ui/gui/data-editor.glade:449
-#, fuzzy
-msgid "_Frequencies"
-msgstr "Variableansicht"
-
 #: src/ui/gui/data-editor.glade:465
 msgid "_Explore"
 msgstr ""
@@ -5033,16 +5045,16 @@ msgstr "_Kein Lösewerten"
 msgid "_Discrete missing values"
 msgstr "_Diskret Lösewerten"
 
-#: src/ui/gui/descriptives-dialog.c:53
+#: src/ui/gui/descriptives-dialog.c:41 src/ui/gui/frequencies-dialog.c:42
 msgid "Standard deviation"
 msgstr ""
 
-#: src/ui/gui/descriptives-dialog.c:58
+#: src/ui/gui/descriptives-dialog.c:46
 #, fuzzy
 msgid "Standard error"
 msgstr "Skript Fehler"
 
-#: src/ui/gui/descriptives-dialog.glade:122
+#: src/ui/gui/descriptives-dialog.glade:122 src/ui/gui/frequencies.glade:139
 msgid "Statistics:"
 msgstr ""
 
@@ -5067,6 +5079,64 @@ msgstr ""
 msgid "Bad regular expression: %s"
 msgstr ""
 
+#: src/ui/gui/frequencies-dialog.c:45
+#, fuzzy
+msgid "Standard error of the mean"
+msgstr "Skript Fehler"
+
+#: src/ui/gui/frequencies-dialog.c:48
+#, fuzzy
+msgid "Standard error of the skewness"
+msgstr "Skript Fehler"
+
+#: src/ui/gui/frequencies-dialog.c:52
+#, fuzzy
+msgid "Standard error of the kurtosis"
+msgstr "Skript Fehler"
+
+#: src/ui/gui/frequencies.glade:98 src/ui/gui/psppire.glade:265
+#: src/ui/gui/rank.glade:67
+#, fuzzy
+msgid "Variable(s):"
+msgstr "Variableansicht"
+
+#: src/ui/gui/frequencies.glade:168
+#, fuzzy
+msgid "Display Frequency Table"
+msgstr "Variableansicht"
+
+#: src/ui/gui/frequencies.glade:185
+msgid "Format..."
+msgstr ""
+
+#: src/ui/gui/frequencies.glade:264
+msgid "Ascending Order"
+msgstr ""
+
+#: src/ui/gui/frequencies.glade:275
+msgid "Descending Order"
+msgstr ""
+
+#: src/ui/gui/frequencies.glade:290
+msgid "Ascending Counts"
+msgstr ""
+
+#: src/ui/gui/frequencies.glade:305
+msgid "Descending Counts"
+msgstr ""
+
+#: src/ui/gui/frequencies.glade:323
+msgid "Order by"
+msgstr ""
+
+#: src/ui/gui/frequencies.glade:355
+msgid "Supress tables with more than N categories"
+msgstr ""
+
+#: src/ui/gui/frequencies.glade:371
+msgid "Maximum no of categories"
+msgstr ""
+
 #: src/ui/gui/helper.c:140
 msgid "Sorry. The help system hasn't yet been implemented."
 msgstr "Es gibt noch nicht kein Helpsysteme. Schade!"
@@ -5273,11 +5343,6 @@ msgstr "Variableansicht"
 msgid "Current Status: "
 msgstr ""
 
-#: src/ui/gui/psppire.glade:265 src/ui/gui/rank.glade:67
-#, fuzzy
-msgid "Variable(s):"
-msgstr "Variableansicht"
-
 #: src/ui/gui/psppire.glade:314
 #, fuzzy
 msgid "Name Variable:"
index 54fd361a29c629acd00518a735b7daaf0479796c..1d9eb170afcfd55a1846a45a28b84431dd25e9dc 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PSPP 0.4.3\n"
 "Report-Msgid-Bugs-To: pspp-dev@gnu.org\n"
-"POT-Creation-Date: 2007-11-29 20:13+0900\n"
+"POT-Creation-Date: 2007-11-30 16:17+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"
@@ -2656,7 +2656,7 @@ msgstr ""
 
 #: src/language/stats/crosstabs.q:1151 src/language/stats/crosstabs.q:1178
 #: src/language/stats/crosstabs.q:1198 src/language/stats/crosstabs.q:1219
-#: src/language/stats/examine.q:1423 src/ui/gui/descriptives-dialog.c:276
+#: src/language/stats/examine.q:1423 src/ui/gui/checkbox-treeview.c:115
 msgid "Statistic"
 msgstr ""
 
@@ -2850,7 +2850,8 @@ msgstr ""
 #: src/language/stats/frequencies.q:123 src/language/stats/npar-summary.c:125
 #: src/language/stats/oneway.q:392 src/language/stats/t-test.q:683
 #: src/language/stats/t-test.q:706 src/language/stats/t-test.q:830
-#: src/language/stats/t-test.q:1168 src/ui/gui/descriptives-dialog.c:52
+#: src/language/stats/t-test.q:1168 src/ui/gui/descriptives-dialog.c:40
+#: src/ui/gui/frequencies-dialog.c:41
 msgid "Mean"
 msgstr ""
 
@@ -2863,12 +2864,14 @@ msgid "Std Dev"
 msgstr ""
 
 #: src/language/stats/descriptives.c:105 src/language/stats/examine.q:1604
-#: src/language/stats/frequencies.q:128 src/ui/gui/descriptives-dialog.c:59
+#: src/language/stats/frequencies.q:128 src/ui/gui/descriptives-dialog.c:47
+#: src/ui/gui/frequencies-dialog.c:46
 msgid "Variance"
 msgstr ""
 
 #: src/language/stats/descriptives.c:106 src/language/stats/examine.q:1711
-#: src/language/stats/frequencies.q:129 src/ui/gui/descriptives-dialog.c:60
+#: src/language/stats/frequencies.q:129 src/ui/gui/descriptives-dialog.c:48
+#: src/ui/gui/frequencies-dialog.c:51
 msgid "Kurtosis"
 msgstr ""
 
@@ -2877,7 +2880,8 @@ msgid "S E Kurt"
 msgstr ""
 
 #: src/language/stats/descriptives.c:108 src/language/stats/examine.q:1691
-#: src/language/stats/frequencies.q:131 src/ui/gui/descriptives-dialog.c:61
+#: src/language/stats/frequencies.q:131 src/ui/gui/descriptives-dialog.c:49
+#: src/ui/gui/frequencies-dialog.c:47
 msgid "Skewness"
 msgstr ""
 
@@ -2886,24 +2890,27 @@ msgid "S E Skew"
 msgstr ""
 
 #: src/language/stats/descriptives.c:110 src/language/stats/examine.q:1652
-#: src/language/stats/frequencies.q:133 src/ui/gui/descriptives-dialog.c:56
+#: src/language/stats/frequencies.q:133 src/ui/gui/descriptives-dialog.c:44
+#: src/ui/gui/frequencies-dialog.c:49
 msgid "Range"
 msgstr ""
 
 #: src/language/stats/descriptives.c:111 src/language/stats/examine.q:1629
 #: src/language/stats/frequencies.q:134 src/language/stats/npar-summary.c:131
-#: src/language/stats/oneway.q:404 src/ui/gui/descriptives-dialog.c:54
+#: src/language/stats/oneway.q:404 src/ui/gui/descriptives-dialog.c:42
+#: src/ui/gui/frequencies-dialog.c:43
 msgid "Minimum"
 msgstr ""
 
 #: src/language/stats/descriptives.c:112 src/language/stats/examine.q:1640
 #: src/language/stats/frequencies.q:135 src/language/stats/npar-summary.c:134
-#: src/language/stats/oneway.q:405 src/ui/gui/descriptives-dialog.c:55
+#: src/language/stats/oneway.q:405 src/ui/gui/descriptives-dialog.c:43
+#: src/ui/gui/frequencies-dialog.c:44
 msgid "Maximum"
 msgstr ""
 
 #: src/language/stats/descriptives.c:113 src/language/stats/frequencies.q:136
-#: src/ui/gui/descriptives-dialog.c:57
+#: src/ui/gui/descriptives-dialog.c:45 src/ui/gui/frequencies-dialog.c:54
 msgid "Sum"
 msgstr ""
 
@@ -3010,6 +3017,7 @@ msgid "5%% Trimmed Mean"
 msgstr ""
 
 #: src/language/stats/examine.q:1582 src/language/stats/frequencies.q:125
+#: src/ui/gui/frequencies-dialog.c:53
 msgid "Median"
 msgstr ""
 
@@ -3138,7 +3146,7 @@ msgstr ""
 msgid "S.E. Mean"
 msgstr ""
 
-#: src/language/stats/frequencies.q:126
+#: src/language/stats/frequencies.q:126 src/ui/gui/frequencies-dialog.c:50
 msgid "Mode"
 msgstr ""
 
@@ -4388,267 +4396,275 @@ msgstr ""
 msgid "Style of bevel around the custom entry button"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:163
+#: src/ui/gui/data-editor.c:164
 msgid "Transformations Pending"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:425
+#: src/ui/gui/data-editor.c:426
 msgid "Labels"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:426
+#: src/ui/gui/data-editor.c:427
 msgid "Show/hide value labels"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:444 src/ui/gui/data-editor.c:461
-#: src/ui/gui/data-editor.c:1830 src/ui/gui/data-editor.c:1883
+#: src/ui/gui/data-editor.c:445 src/ui/gui/data-editor.c:462
+#: src/ui/gui/data-editor.c:1846 src/ui/gui/data-editor.c:1899
 msgid "Clear"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:445
+#: src/ui/gui/data-editor.c:446
 msgid "Delete the cases at the selected position(s)"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:462
+#: src/ui/gui/data-editor.c:463
 msgid "Delete the variables at the selected position(s)"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:476 src/ui/gui/data-editor.c:1827
+#: src/ui/gui/data-editor.c:477 src/ui/gui/data-editor.c:1843
 #: src/ui/gui/data-editor.glade:137 src/ui/gui/data-editor.glade:808
 msgid "Insert Variable"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:477
+#: src/ui/gui/data-editor.c:478
 msgid "Create a new variable at the current position"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:495 src/ui/gui/data-editor.c:1880
+#: src/ui/gui/data-editor.c:496 src/ui/gui/data-editor.c:1896
 #: src/ui/gui/data-editor.glade:796
 msgid "Insert Case"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:496
+#: src/ui/gui/data-editor.c:497
 msgid "Create a new case at the current position"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:516
+#: src/ui/gui/data-editor.c:517
 msgid "Goto Case"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:517
+#: src/ui/gui/data-editor.c:518
 msgid "Jump to a Case in the Data Sheet"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:536
+#: src/ui/gui/data-editor.c:537
 msgid "Weights"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:537
+#: src/ui/gui/data-editor.c:538
 msgid "Weight cases by variable"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:546 src/ui/gui/data-editor.glade:312
+#: src/ui/gui/data-editor.c:547 src/ui/gui/data-editor.glade:312
 msgid "Transpose"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:547
+#: src/ui/gui/data-editor.c:548
 msgid "Transpose the cases with the variables"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:558
+#: src/ui/gui/data-editor.c:559
 msgid "Split"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:559
+#: src/ui/gui/data-editor.c:560
 msgid "Split the active file"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:569
+#: src/ui/gui/data-editor.c:570
 msgid "Sort"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:570
+#: src/ui/gui/data-editor.c:571
 msgid "Sort cases in the active file"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:578 src/ui/gui/data-editor.glade:347
+#: src/ui/gui/data-editor.c:579 src/ui/gui/data-editor.glade:347
 #: src/ui/gui/data-editor.glade:851
 msgid "Select Cases"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:579
+#: src/ui/gui/data-editor.c:580
 msgid "Select cases from the active file"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:588
+#: src/ui/gui/data-editor.c:589
 msgid "Compute"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:589
+#: src/ui/gui/data-editor.c:590
 msgid "Compute new values for a variable"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:597
+#: src/ui/gui/data-editor.c:598
 msgid "Oneway _ANOVA"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:598
+#: src/ui/gui/data-editor.c:599
 msgid "Perform one way analysis of variance"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:606 src/ui/gui/data-editor.glade:503
+#: src/ui/gui/data-editor.c:607 src/ui/gui/data-editor.glade:503
 msgid "_Independent Samples T Test"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:607
+#: src/ui/gui/data-editor.c:608
 msgid "Calculate T Test for samples from independent groups"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:616
+#: src/ui/gui/data-editor.c:617
 msgid "Data File Comments"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:617
+#: src/ui/gui/data-editor.c:618
 msgid "Commentary text for the data file"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:625 src/ui/gui/data-editor.glade:776
+#: src/ui/gui/data-editor.c:626 src/ui/gui/data-editor.glade:776
 msgid "Find"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:626
+#: src/ui/gui/data-editor.c:627
 msgid "Find Case"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:635 src/ui/gui/data-editor.glade:384
+#: src/ui/gui/data-editor.c:636 src/ui/gui/data-editor.glade:384
 msgid "Ran_k Cases"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:636
+#: src/ui/gui/data-editor.c:637
 msgid "Rank Cases"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:645 src/ui/gui/data-editor.glade:396
+#: src/ui/gui/data-editor.c:646 src/ui/gui/data-editor.glade:396
 msgid "Recode into _Same Variables"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:646
+#: src/ui/gui/data-editor.c:647
 msgid "Recode values into the same Variables"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:655 src/ui/gui/data-editor.glade:403
+#: src/ui/gui/data-editor.c:656 src/ui/gui/data-editor.glade:403
 msgid "Recode into _Different Variables"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:656
+#: src/ui/gui/data-editor.c:657
 msgid "Recode values into different Variables"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:665 src/ui/gui/data-editor.glade:286
+#: src/ui/gui/data-editor.c:666 src/ui/gui/data-editor.glade:286
 #: src/ui/gui/data-editor.glade:755
 msgid "Variables"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:666
+#: src/ui/gui/data-editor.c:667
 msgid "Jump to Variable"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:674 src/ui/gui/data-editor.glade:457
+#: src/ui/gui/data-editor.c:675 src/ui/gui/data-editor.glade:457
 #: src/ui/gui/oneway.glade:179
 msgid "_Descriptives"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:675
+#: src/ui/gui/data-editor.c:676
 msgid "Calculate descriptive statistics (mean, variance, ...)"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1108
+#: src/ui/gui/data-editor.c:685 src/ui/gui/data-editor.glade:449
+msgid "_Frequencies"
+msgstr ""
+
+#: src/ui/gui/data-editor.c:686
+msgid "Generate frequency statistics"
+msgstr ""
+
+#: src/ui/gui/data-editor.c:1124
 msgid "Font Selection"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1315
+#: src/ui/gui/data-editor.c:1331
 msgid "No Split"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1324
+#: src/ui/gui/data-editor.c:1340
 msgid "Split by "
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1349
+#: src/ui/gui/data-editor.c:1365
 msgid "Filter off"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1362
+#: src/ui/gui/data-editor.c:1378
 #, c-format
 msgid "Filter by %s"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1380
+#: src/ui/gui/data-editor.c:1396
 msgid "Weights off"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1393
+#: src/ui/gui/data-editor.c:1409
 #, c-format
 msgid "Weight by %s"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1416 src/ui/gui/data-editor.c:1650
+#: src/ui/gui/data-editor.c:1432 src/ui/gui/data-editor.c:1666
 #: src/ui/gui/data-editor.glade:667
 msgid "Open"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1417
+#: src/ui/gui/data-editor.c:1433
 msgid "Open a data file"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1425 src/ui/gui/data-editor.c:1532
+#: src/ui/gui/data-editor.c:1441 src/ui/gui/data-editor.c:1548
 #: src/ui/gui/data-editor.glade:677
 msgid "Save"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1426 src/ui/gui/data-editor.c:1436
+#: src/ui/gui/data-editor.c:1442 src/ui/gui/data-editor.c:1452
 msgid "Save data to file"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1435
+#: src/ui/gui/data-editor.c:1451
 msgid "Save As"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1444 src/ui/gui/recode-dialog.c:931
+#: src/ui/gui/data-editor.c:1460 src/ui/gui/recode-dialog.c:931
 #: src/ui/gui/recode-dialog.c:1025
 msgid "New"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1445
+#: src/ui/gui/data-editor.c:1461
 msgid "New data file"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1540 src/ui/gui/data-editor.c:1658
+#: src/ui/gui/data-editor.c:1556 src/ui/gui/data-editor.c:1674
 msgid "System Files (*.sav)"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1546 src/ui/gui/data-editor.c:1664
+#: src/ui/gui/data-editor.c:1562 src/ui/gui/data-editor.c:1680
 msgid "Portable Files (*.por) "
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1552 src/ui/gui/data-editor.c:1670
+#: src/ui/gui/data-editor.c:1568 src/ui/gui/data-editor.c:1686
 #: src/ui/gui/syntax-editor.c:138 src/ui/gui/syntax-editor.c:522
 msgid "All Files"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1560
+#: src/ui/gui/data-editor.c:1576
 msgid "System File"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1565
+#: src/ui/gui/data-editor.c:1581
 msgid "Portable File"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1820
+#: src/ui/gui/data-editor.c:1836
 msgid "Sort Ascending"
 msgstr ""
 
-#: src/ui/gui/data-editor.c:1823
+#: src/ui/gui/data-editor.c:1839
 msgid "Sort Descending"
 msgstr ""
 
@@ -4770,10 +4786,6 @@ msgstr ""
 msgid "_Descriptive Statistics"
 msgstr ""
 
-#: src/ui/gui/data-editor.glade:449
-msgid "_Frequencies"
-msgstr ""
-
 #: src/ui/gui/data-editor.glade:465
 msgid "_Explore"
 msgstr ""
@@ -4992,15 +5004,15 @@ msgstr ""
 msgid "_Discrete missing values"
 msgstr ""
 
-#: src/ui/gui/descriptives-dialog.c:53
+#: src/ui/gui/descriptives-dialog.c:41 src/ui/gui/frequencies-dialog.c:42
 msgid "Standard deviation"
 msgstr ""
 
-#: src/ui/gui/descriptives-dialog.c:58
+#: src/ui/gui/descriptives-dialog.c:46
 msgid "Standard error"
 msgstr ""
 
-#: src/ui/gui/descriptives-dialog.glade:122
+#: src/ui/gui/descriptives-dialog.glade:122 src/ui/gui/frequencies.glade:139
 msgid "Statistics:"
 msgstr ""
 
@@ -5025,6 +5037,59 @@ msgstr ""
 msgid "Bad regular expression: %s"
 msgstr ""
 
+#: src/ui/gui/frequencies-dialog.c:45
+msgid "Standard error of the mean"
+msgstr ""
+
+#: src/ui/gui/frequencies-dialog.c:48
+msgid "Standard error of the skewness"
+msgstr ""
+
+#: src/ui/gui/frequencies-dialog.c:52
+msgid "Standard error of the kurtosis"
+msgstr ""
+
+#: src/ui/gui/frequencies.glade:98 src/ui/gui/psppire.glade:265
+#: src/ui/gui/rank.glade:67
+msgid "Variable(s):"
+msgstr ""
+
+#: src/ui/gui/frequencies.glade:168
+msgid "Display Frequency Table"
+msgstr ""
+
+#: src/ui/gui/frequencies.glade:185
+msgid "Format..."
+msgstr ""
+
+#: src/ui/gui/frequencies.glade:264
+msgid "Ascending Order"
+msgstr ""
+
+#: src/ui/gui/frequencies.glade:275
+msgid "Descending Order"
+msgstr ""
+
+#: src/ui/gui/frequencies.glade:290
+msgid "Ascending Counts"
+msgstr ""
+
+#: src/ui/gui/frequencies.glade:305
+msgid "Descending Counts"
+msgstr ""
+
+#: src/ui/gui/frequencies.glade:323
+msgid "Order by"
+msgstr ""
+
+#: src/ui/gui/frequencies.glade:355
+msgid "Supress tables with more than N categories"
+msgstr ""
+
+#: src/ui/gui/frequencies.glade:371
+msgid "Maximum no of categories"
+msgstr ""
+
 #: src/ui/gui/helper.c:140
 msgid "Sorry. The help system hasn't yet been implemented."
 msgstr ""
@@ -5220,10 +5285,6 @@ msgstr ""
 msgid "Current Status: "
 msgstr ""
 
-#: src/ui/gui/psppire.glade:265 src/ui/gui/rank.glade:67
-msgid "Variable(s):"
-msgstr ""
-
 #: src/ui/gui/psppire.glade:314
 msgid "Name Variable:"
 msgstr ""
index 45058669a21f557ccc529e6733e517012ef465ef..24c9293cb6ecf3a25d40bf7eb4c886002f3359d3 100644 (file)
@@ -1,3 +1,17 @@
+2007-12-01  John Darrington <john@darrington.wattle.id.au>
+
+       * descriptives-dialog.c: Moved the code dealing with checkboxes 
+       inside treeview widgets into their own files.
+
+       * checkbox-treeview.c checkbox-treeview.h: New file (see above).
+
+       * frequencies-dialog.c frequencies-dialog.h frequencies.glade: New 
+       files. Implemented FREQUENCIES dialog box.
+
+       * data-editor.c data-editor.h data-editor.glade :  Added callback
+       for frequencies dialog.
+
+
 2007-11-23  John Darrington <john@darrington.wattle.id.au>
 
        * psppire-acr.c psppire-acr.h: Generalised the external widget
index ee2b5c8264eab247cb213bfd0b064f37c36fa8f0..24f0196c3cc6c7dc4a149c9c17455ab313518fbf 100644 (file)
@@ -49,6 +49,7 @@ src_ui_gui_psppiredir = $(pkgdatadir)
 dist_src_ui_gui_psppire_DATA = \
        $(top_srcdir)/src/ui/gui/data-editor.glade \
        $(top_srcdir)/src/ui/gui/descriptives-dialog.glade \
+       $(top_srcdir)/src/ui/gui/frequencies.glade \
        $(top_srcdir)/src/ui/gui/oneway.glade \
        $(top_srcdir)/src/ui/gui/output-viewer.glade \
        $(top_srcdir)/src/ui/gui/psppire.glade \
@@ -79,12 +80,16 @@ src_ui_gui_psppire_SOURCES = \
        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/compute-dialog.h \
        src/ui/gui/comments-dialog.c \
        src/ui/gui/comments-dialog.h \
        src/ui/gui/customentry.c \
        src/ui/gui/customentry.h \
+       src/ui/gui/frequencies-dialog.c \
+       src/ui/gui/frequencies-dialog.h \
        src/ui/gui/goto-case-dialog.c \
        src/ui/gui/goto-case-dialog.h \
        src/ui/gui/data-sheet.c \
diff --git a/src/ui/gui/checkbox-treeview.c b/src/ui/gui/checkbox-treeview.c
new file mode 100644 (file)
index 0000000..2639665
--- /dev/null
@@ -0,0 +1,127 @@
+/* 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 "checkbox-treeview.h"
+#include <gtk/gtk.h>
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+#define N_(msgid) msgid
+
+
+/* A GtkTreeCellDataFunc which renders a checkbox that determines
+   whether to calculate the statistic. */
+static void
+stat_calculate_cell_data_func (GtkTreeViewColumn *col,
+                               GtkCellRenderer *cell,
+                               GtkTreeModel *model,
+                               GtkTreeIter *iter,
+                               gpointer data)
+{
+  gboolean selected;
+
+  gtk_tree_model_get (model, iter, CHECKBOX_COLUMN_SELECTED, &selected, -1);
+  g_object_set (cell, "active", selected, NULL);
+}
+
+
+/* A GtkTreeCellDataFunc which renders the label of the statistic. */
+static void
+stat_label_cell_data_func (GtkTreeViewColumn *col,
+                           GtkCellRenderer *cell,
+                           GtkTreeModel *model,
+                           GtkTreeIter *iter,
+                           gpointer statistic)
+{
+  gchar *label = NULL;
+  gtk_tree_model_get (model, iter, CHECKBOX_COLUMN_LABEL, &label, -1);
+  g_object_set (cell, "text", gettext (label), NULL);
+  g_free (label);
+}
+
+/* Callback for checkbox cells in the statistics tree view.
+   Toggles the checkbox. */
+static void
+toggle (GtkCellRendererToggle *cell_renderer, gchar *path_str, gpointer data)
+{
+  GtkTreeModel *model = (GtkTreeModel *)data;
+  GtkTreeIter iter;
+  GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
+  gboolean selected;
+
+  gtk_tree_model_get_iter (model, &iter, path);
+  gtk_tree_model_get (model, &iter, CHECKBOX_COLUMN_SELECTED, &selected, -1);
+  gtk_list_store_set (GTK_LIST_STORE (model), &iter, CHECKBOX_COLUMN_SELECTED,
+                      !selected, -1);
+  gtk_tree_path_free (path);
+}
+
+
+void
+put_checkbox_items_in_treeview (GtkTreeView *treeview,
+                               guint default_items,
+                               gint n_items,
+                               const struct checkbox_entry_item *items
+                               )
+{
+  GtkTreeViewColumn *col;
+  GtkCellRenderer *renderer;
+  GtkListStore *list;
+  size_t i;
+
+  list = gtk_list_store_new (N_CHECKBOX_COLUMNS,
+                            G_TYPE_STRING, G_TYPE_BOOLEAN);
+  gtk_tree_view_set_model (GTK_TREE_VIEW (treeview), GTK_TREE_MODEL (list));
+
+  for (i = 0; i < n_items; i++)
+    {
+      GtkTreeIter iter;
+      gtk_list_store_append (list, &iter);
+      gtk_list_store_set (list, &iter,
+                          CHECKBOX_COLUMN_LABEL, items[i].label,
+                          CHECKBOX_COLUMN_SELECTED,
+                         (default_items & (1u << i)) != 0,
+                          -1);
+    }
+
+  /* Calculate column. */
+  col = gtk_tree_view_column_new ();
+  renderer = gtk_cell_renderer_toggle_new ();
+  g_signal_connect (GTK_CELL_RENDERER_TOGGLE (renderer),
+                    "toggled", G_CALLBACK (toggle), GTK_TREE_MODEL (list));
+  gtk_tree_view_column_pack_start (col, renderer, TRUE);
+  gtk_tree_view_column_set_cell_data_func (col, renderer,
+                                          stat_calculate_cell_data_func,
+                                          NULL, NULL);
+  gtk_tree_view_append_column (treeview, col);
+
+  /* Statistic column. */
+  col = gtk_tree_view_column_new ();
+  gtk_tree_view_column_set_title (col, _("Statistic"));
+  renderer = gtk_cell_renderer_text_new ();
+  gtk_tree_view_column_pack_start (col, renderer, TRUE);
+  gtk_tree_view_column_set_cell_data_func (col, renderer,
+                                          stat_label_cell_data_func,
+                                          NULL, NULL);
+  g_object_set (renderer, "ellipsize-set", TRUE, NULL);
+  g_object_set (renderer, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
+  gtk_tree_view_column_set_min_width (col, 200);
+  gtk_tree_view_column_set_sizing (col, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
+  gtk_tree_view_column_set_resizable (col, TRUE);
+  gtk_tree_view_append_column (treeview, col);
+}
diff --git a/src/ui/gui/checkbox-treeview.h b/src/ui/gui/checkbox-treeview.h
new file mode 100644 (file)
index 0000000..1616b73
--- /dev/null
@@ -0,0 +1,43 @@
+/* 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/>. */
+
+
+#ifndef __CHECKBOX_TREEVIEW_H__
+#define __CHECKBOX_TREEVIEW_H__ 1
+
+
+#include <gtk/gtk.h>
+
+struct checkbox_entry_item
+  {
+    const char *name;
+    const char *label;
+  };
+
+enum
+  {
+    CHECKBOX_COLUMN_LABEL,
+    CHECKBOX_COLUMN_SELECTED,
+    N_CHECKBOX_COLUMNS
+  };
+
+
+void put_checkbox_items_in_treeview (GtkTreeView *treeview,
+                                    guint default_items,
+                                    gint n_items,
+                                    const struct checkbox_entry_item *items
+                                    );
+#endif
index f1848621b45e68c6af4a670fc82cce0f2e417483..a69b7e665ec7721c3e483c8eacaf3fb8d4bcf59e 100644 (file)
@@ -42,6 +42,7 @@
 #include "comments-dialog.h"
 #include "variable-info-dialog.h"
 #include "descriptives-dialog.h"
+#include "frequencies-dialog.h"
 #include "dict-display.h"
 #include "clipboard.h"
 
@@ -678,6 +679,17 @@ new_data_editor (void)
   g_signal_connect (de->invoke_descriptives_dialog, "activate",
                    G_CALLBACK (descriptives_dialog), de);
 
+
+  de->invoke_frequencies_dialog =
+    gtk_action_new ("frequencies-dialog",
+                   _("_Frequencies"),
+                   _("Generate frequency statistics"),
+                   "pspp-frequencies");
+
+  g_signal_connect (de->invoke_frequencies_dialog, "activate",
+                   G_CALLBACK (frequencies_dialog), de);
+
+
   e->window = GTK_WINDOW (get_widget_assert (de->xml, "data_editor"));
 
   g_signal_connect_swapped (get_widget_assert (de->xml,"file_new_data"),
@@ -824,6 +836,10 @@ new_data_editor (void)
                            get_widget_assert (de->xml, "analyze_descriptives")
                            );
 
+  gtk_action_connect_proxy (de->invoke_frequencies_dialog,
+                           get_widget_assert (de->xml, "analyze_frequencies")
+                           );
+
   g_signal_connect (get_widget_assert (de->xml,"help_about"),
                    "activate",
                    G_CALLBACK (about_new),
index 7a34a31fa787d9bd2b7f0e6dcf57bdcb29804847..1746d9e77d32055357450e97dc156d028ae6a571 100644 (file)
                             <property name="visible">True</property>
                             <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
                             <child>
-                              <widget class="GtkMenuItem" id="frequencies">
+                              <widget class="GtkMenuItem" id="analyze_frequencies">
                                 <property name="visible">True</property>
                                 <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
                                 <property name="label" translatable="yes">_Frequencies</property>
index a49d2c5b2ca066f893a283d70a3f1440e88873c8..9f8ce0a698049211292d0100605f9e4b74062b01 100644 (file)
@@ -47,6 +47,7 @@ struct data_editor
   GtkAction *invoke_recode_different_dialog;
 
   GtkAction *invoke_descriptives_dialog;
+  GtkAction *invoke_frequencies_dialog;
 
   GtkAction *invoke_t_test_independent_samples_dialog;
   GtkAction *invoke_oneway_anova_dialog;
index 5a9a2b73c2c4be1f470b5b4cae0e657eb84dc877..4697c9fdfa073308f08fc1ef823519537f90af97 100644 (file)
@@ -16,6 +16,7 @@
 
 #include <config.h>
 
+#include "checkbox-treeview.h"
 #include "descriptives-dialog.h"
 
 #include <gtk/gtk.h>
 #define _(msgid) gettext (msgid)
 #define N_(msgid) msgid
 
-enum
-  {
-    COLUMN_LABEL,
-    COLUMN_SELECTED,
-    N_STAT_COLUMNS
-  };
-
-struct descriptive_stat
-  {
-    const char *name;
-    const char *label;
-  };
-
 #define DESCRIPTIVE_STATS                       \
   DS (MEAN, N_("Mean"))                         \
   DS (STDDEV, N_("Standard deviation"))         \
@@ -77,7 +65,8 @@ enum
     B_DS_DEFAULT = B_DS_MEAN | B_DS_STDDEV | B_DS_MINIMUM | B_DS_MAXIMUM
   };
 
-static const struct descriptive_stat stats[] =
+
+static const struct checkbox_entry_item stats[] =
   {
 #define DS(NAME, LABEL) {#NAME, LABEL},
     DESCRIPTIVE_STATS
@@ -107,7 +96,8 @@ refresh (PsppireDialog *dialog, struct descriptives_dialog *scd)
 
   for (i = 0, ok = gtk_tree_model_get_iter_first (scd->stats, &iter); ok;
        i++, ok = gtk_tree_model_iter_next (scd->stats, &iter))
-    gtk_list_store_set (GTK_LIST_STORE (scd->stats), &iter, COLUMN_SELECTED,
+    gtk_list_store_set (GTK_LIST_STORE (scd->stats), &iter,
+                       CHECKBOX_COLUMN_SELECTED,
                         (B_DS_DEFAULT & (1u << i)) ? true : false, -1);
 
   gtk_toggle_button_set_active (scd->exclude_missing_listwise, false);
@@ -150,7 +140,8 @@ generate_syntax (const struct descriptives_dialog *scd)
        i++, ok = gtk_tree_model_iter_next (scd->stats, &iter))
     {
       gboolean toggled;
-      gtk_tree_model_get (scd->stats, &iter, COLUMN_SELECTED, &toggled, -1);
+      gtk_tree_model_get (scd->stats, &iter,
+                         CHECKBOX_COLUMN_SELECTED, &toggled, -1);
       if (toggled)
         selected |= 1u << i;
     }
@@ -193,100 +184,6 @@ generate_syntax (const struct descriptives_dialog *scd)
   return text;
 }
 
-/* A GtkTreeCellDataFunc which renders a checkbox that determines
-   whether to calculate the statistic. */
-static void
-stat_calculate_cell_data_func (GtkTreeViewColumn *col,
-                               GtkCellRenderer *cell,
-                               GtkTreeModel *model,
-                               GtkTreeIter *iter,
-                               gpointer data)
-{
-  gboolean selected;
-
-  gtk_tree_model_get (model, iter, COLUMN_SELECTED, &selected, -1);
-  g_object_set (cell, "active", selected, NULL);
-}
-
-/* Callback for checkbox cells in the statistics tree view.
-   Toggles the checkbox. */
-static void
-toggle (GtkCellRendererToggle *cell_renderer, gchar *path_str, gpointer data)
-{
-  GtkTreeModel *model = (GtkTreeModel *)data;
-  GtkTreeIter iter;
-  GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
-  gboolean selected;
-
-  gtk_tree_model_get_iter (model, &iter, path);
-  gtk_tree_model_get (model, &iter, COLUMN_SELECTED, &selected, -1);
-  gtk_list_store_set (GTK_LIST_STORE (model), &iter, COLUMN_SELECTED,
-                      !selected, -1);
-  gtk_tree_path_free (path);
-}
-
-/* A GtkTreeCellDataFunc which renders the label of the statistic. */
-static void
-stat_label_cell_data_func (GtkTreeViewColumn *col,
-                           GtkCellRenderer *cell,
-                           GtkTreeModel *model,
-                           GtkTreeIter *iter,
-                           gpointer statistic)
-{
-  gchar *label = NULL;
-  gtk_tree_model_get (model, iter, COLUMN_LABEL, &label, -1);
-  g_object_set (cell, "text", gettext (label), NULL);
-  g_free (label);
-}
-
-static void
-put_statistics_in_treeview (GtkTreeView *treeview)
-{
-  GtkTreeViewColumn *col;
-  GtkCellRenderer *renderer;
-  GtkListStore *list;
-  size_t i;
-
-  list = gtk_list_store_new (N_STAT_COLUMNS, G_TYPE_STRING, G_TYPE_BOOLEAN);
-  gtk_tree_view_set_model (GTK_TREE_VIEW (treeview), GTK_TREE_MODEL (list));
-
-  for (i = 0; i < sizeof stats / sizeof *stats; i++)
-    {
-      GtkTreeIter iter;
-      gtk_list_store_append (list, &iter);
-      gtk_list_store_set (list, &iter,
-                          COLUMN_LABEL, stats[i].label,
-                          COLUMN_SELECTED, (B_DS_DEFAULT & (1u << i)) != 0,
-                          -1);
-    }
-
-  /* Calculate column. */
-  col = gtk_tree_view_column_new ();
-  renderer = gtk_cell_renderer_toggle_new ();
-  g_signal_connect (GTK_CELL_RENDERER_TOGGLE (renderer),
-                    "toggled", G_CALLBACK (toggle), GTK_TREE_MODEL (list));
-  gtk_tree_view_column_pack_start (col, renderer, TRUE);
-  gtk_tree_view_column_set_cell_data_func (col, renderer,
-                                          stat_calculate_cell_data_func,
-                                          NULL, NULL);
-  gtk_tree_view_append_column (treeview, col);
-
-  /* Statistic column. */
-  col = gtk_tree_view_column_new ();
-  gtk_tree_view_column_set_title (col, _("Statistic"));
-  renderer = gtk_cell_renderer_text_new ();
-  gtk_tree_view_column_pack_start (col, renderer, TRUE);
-  gtk_tree_view_column_set_cell_data_func (col, renderer,
-                                          stat_label_cell_data_func,
-                                          NULL, NULL);
-  g_object_set (renderer, "ellipsize-set", TRUE, NULL);
-  g_object_set (renderer, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
-  gtk_tree_view_column_set_min_width (col, 150);
-  gtk_tree_view_column_set_sizing (col, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
-  gtk_tree_view_column_set_resizable (col, true);
-  gtk_tree_view_append_column (treeview, col);
-}
-
 
 /* Dialog is valid iff at least one variable has been selected */
 static gboolean
@@ -319,7 +216,7 @@ descriptives_dialog (GObject *o, gpointer data)
   GtkWidget *selector = get_widget_assert (xml, "stat-var-selector");
   GtkWidget *dest =   get_widget_assert   (xml, "stat-variables");
 
-  GtkWidget *stats = get_widget_assert    (xml, "statistics");
+  GtkWidget *stats_treeview = get_widget_assert    (xml, "statistics");
 
   GtkSheet *var_sheet =
     GTK_SHEET (get_widget_assert (de->xml, "variable_sheet"));
@@ -340,10 +237,12 @@ descriptives_dialog (GObject *o, gpointer data)
                                 insert_source_row_into_tree_view,
                                 NULL);
 
-  put_statistics_in_treeview (GTK_TREE_VIEW (stats));
+  put_checkbox_items_in_treeview (GTK_TREE_VIEW (stats_treeview),
+                                 B_DS_DEFAULT,
+                                 N_DESCRIPTIVE_STATS, stats);
 
   scd.stat_vars = GTK_TREE_VIEW (dest);
-  scd.stats = gtk_tree_view_get_model (GTK_TREE_VIEW (stats));
+  scd.stats = gtk_tree_view_get_model (GTK_TREE_VIEW (stats_treeview));
   scd.dict = vs->dict;
   scd.include_user_missing =
     GTK_TOGGLE_BUTTON (get_widget_assert (xml, "include_user_missing"));
diff --git a/src/ui/gui/frequencies-dialog.c b/src/ui/gui/frequencies-dialog.c
new file mode 100644 (file)
index 0000000..295b764
--- /dev/null
@@ -0,0 +1,418 @@
+/* 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 "checkbox-treeview.h"
+#include "frequencies-dialog.h"
+
+#include <gtk/gtk.h>
+#include <gtksheet/gtksheet.h>
+#include <stdlib.h>
+
+#include <language/syntax-string-source.h>
+#include <ui/gui/data-editor.h>
+#include <ui/gui/dialog-common.h>
+#include <ui/gui/dict-display.h>
+#include <ui/gui/helper.h>
+#include <ui/gui/psppire-dialog.h>
+#include <ui/gui/psppire-var-store.h>
+#include <ui/gui/syntax-editor.h>
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+#define N_(msgid) msgid
+
+
+#define FREQUENCY_STATS                       \
+  FS (MEAN, N_("Mean"))                         \
+  FS (STDDEV, N_("Standard deviation"))         \
+  FS (MINIMUM, N_("Minimum"))                   \
+  FS (MAXIMUM, N_("Maximum"))                   \
+  FS (SEMEAN, N_("Standard error of the mean")) \
+  FS (VARIANCE, N_("Variance"))                 \
+  FS (SKEWNESS, N_("Skewness"))                 \
+  FS (SESKEW, N_("Standard error of the skewness"))  \
+  FS (RANGE, N_("Range"))                       \
+  FS (MODE, N_("Mode"))                         \
+  FS (KURTOSIS, N_("Kurtosis"))                 \
+  FS (SEKURT, N_("Standard error of the kurtosis"))  \
+  FS (MEDIAN, N_("Median"))      \
+  FS (SUM, N_("Sum"))
+
+enum
+  {
+#define FS(NAME, LABEL) FS_##NAME,
+    FREQUENCY_STATS
+#undef FS
+    N_FREQUENCY_STATS
+  };
+
+enum
+  {
+#define FS(NAME, LABEL) B_FS_##NAME = 1u << FS_##NAME,
+    FREQUENCY_STATS
+#undef FS
+    B_FS_ALL = (1u << N_FREQUENCY_STATS) - 1,
+    B_FS_DEFAULT = B_FS_MEAN | B_FS_STDDEV | B_FS_MINIMUM | B_FS_MAXIMUM
+  };
+
+
+static const struct checkbox_entry_item stats[] =
+  {
+#define FS(NAME, LABEL) {#NAME, LABEL},
+    FREQUENCY_STATS
+#undef FS
+  };
+
+
+
+enum frq_order
+  {
+    FRQ_AVALUE,
+    FRQ_DVALUE,
+    FRQ_ACOUNT,
+    FRQ_DCOUNT
+  };
+
+struct format_options
+{
+  enum frq_order order;
+  gboolean use_limits;
+  int limit;
+};
+
+struct frequencies_dialog
+{
+  GtkTreeView *stat_vars;
+  PsppireDict *dict;
+
+  GtkWidget *table_button;
+
+  GtkWidget *format_dialog;
+  GtkWidget *maximum_cats;
+  GtkWidget *limit_toggle_button;
+  GtkSpinButton *limit_spinbutton;
+
+  GtkToggleButton  *avalue;
+  GtkToggleButton  *dvalue;
+  GtkToggleButton  *afreq;
+  GtkToggleButton  *dfreq;
+
+  struct format_options current_opts;
+
+  GtkTreeModel *stats;
+};
+
+static void
+refresh (PsppireDialog *dialog, struct frequencies_dialog *fd)
+{
+  GtkTreeIter iter;
+  size_t i;
+  bool ok;
+
+  GtkTreeModel *liststore = gtk_tree_view_get_model (fd->stat_vars);
+  gtk_list_store_clear (GTK_LIST_STORE (liststore));
+
+  for (i = 0, ok = gtk_tree_model_get_iter_first (fd->stats, &iter); ok;
+       i++, ok = gtk_tree_model_iter_next (fd->stats, &iter))
+    gtk_list_store_set (GTK_LIST_STORE (fd->stats), &iter,
+                       CHECKBOX_COLUMN_SELECTED,
+                        (B_FS_DEFAULT & (1u << i)) ? true : false, -1);
+
+  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (fd->table_button), TRUE);
+}
+
+static char *
+generate_syntax (const struct frequencies_dialog *fd)
+{
+  GtkTreeIter iter;
+  gboolean ok;
+  gint i;
+  guint selected = 0;
+
+  gchar *text;
+  GString *string = g_string_new ("FREQUENCIES");
+
+  g_string_append (string, "\n\t/VARIABLES=");
+  append_variable_names (string, fd->dict, GTK_TREE_VIEW (fd->stat_vars));
+
+  g_string_append (string, "\n\t/FORMAT=");
+
+  switch (fd->current_opts.order)
+    {
+    case FRQ_AVALUE:
+      g_string_append (string, "AVALUE");
+      break;
+    case FRQ_DVALUE:
+      g_string_append (string, "DVALUE");
+      break;
+    case FRQ_ACOUNT:
+      g_string_append (string, "AFREQ");
+      break;
+    case FRQ_DCOUNT:
+      g_string_append (string, "DFREQ");
+      break;
+    default:
+      g_assert_not_reached();
+    }
+
+  g_string_append (string, " ");
+
+  if ( fd->current_opts.use_limits )
+    {
+      g_string_append_printf (string, "LIMIT (%d)", fd->current_opts.limit);
+    }
+  else
+    {
+      if ( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (fd->table_button)))
+       g_string_append (string, "TABLE");
+      else
+       g_string_append (string, "NOTABLE");
+    }
+
+
+  for (i = 0, ok = gtk_tree_model_get_iter_first (fd->stats, &iter); ok;
+       i++, ok = gtk_tree_model_iter_next (fd->stats, &iter))
+    {
+      gboolean toggled;
+      gtk_tree_model_get (fd->stats, &iter,
+                         CHECKBOX_COLUMN_SELECTED, &toggled, -1);
+      if (toggled)
+        selected |= 1u << i;
+    }
+
+  if (selected != B_FS_DEFAULT)
+    {
+      g_string_append (string, "\n\t/STATISTICS=");
+      if (selected == B_FS_ALL)
+        g_string_append (string, "ALL");
+      else if (selected == 0)
+        g_string_append (string, "NONE");
+      else
+        {
+          int n = 0;
+          if ((selected & B_FS_DEFAULT) == B_FS_DEFAULT)
+            {
+              g_string_append (string, "DEFAULT");
+              selected &= ~B_FS_DEFAULT;
+              n++;
+            }
+          for (i = 0; i < N_FREQUENCY_STATS; i++)
+            if (selected & (1u << i))
+              {
+                if (n++)
+                  g_string_append (string, " ");
+                g_string_append (string, stats[i].name);
+              }
+        }
+    }
+
+  g_string_append (string, ".\n");
+
+  text = string->str;
+
+  g_string_free (string, FALSE);
+
+  return text;
+}
+
+/* Dialog is valid iff at least one variable has been selected */
+static gboolean
+dialog_state_valid (gpointer data)
+{
+  struct frequencies_dialog *fd = data;
+
+  GtkTreeModel *vars = gtk_tree_view_get_model (fd->stat_vars);
+
+  GtkTreeIter notused;
+
+  return gtk_tree_model_get_iter_first (vars, &notused);
+}
+
+
+static void
+on_format_clicked (struct frequencies_dialog *fd)
+{
+  int ret;
+  g_signal_emit_by_name (fd->limit_toggle_button, "toggled");
+
+  switch (fd->current_opts.order)
+    {
+    case FRQ_AVALUE:
+      gtk_toggle_button_set_active (fd->avalue, TRUE);
+      break;
+    case FRQ_DVALUE:
+      gtk_toggle_button_set_active (fd->dvalue, TRUE);
+      break;
+    case FRQ_ACOUNT:
+      gtk_toggle_button_set_active (fd->dfreq, TRUE);
+      break;
+    case FRQ_DCOUNT:
+      gtk_toggle_button_set_active (fd->dfreq, TRUE);
+      break;
+    };
+
+  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (fd->limit_toggle_button),
+                               fd->current_opts.use_limits);
+
+  gtk_spin_button_set_value (fd->limit_spinbutton,
+                            fd->current_opts.limit);
+
+  ret = psppire_dialog_run (PSPPIRE_DIALOG (fd->format_dialog));
+
+  if ( ret == PSPPIRE_RESPONSE_CONTINUE )
+    {
+      if (gtk_toggle_button_get_active (fd->avalue))
+       fd->current_opts.order = FRQ_AVALUE;
+      else if (gtk_toggle_button_get_active (fd->dvalue))
+       fd->current_opts.order = FRQ_DVALUE;
+      else if (gtk_toggle_button_get_active (fd->afreq))
+       fd->current_opts.order = FRQ_ACOUNT;
+      else if (gtk_toggle_button_get_active (fd->dfreq))
+       fd->current_opts.order = FRQ_DCOUNT;
+
+      fd->current_opts.use_limits = gtk_toggle_button_get_active
+       (GTK_TOGGLE_BUTTON (fd->limit_toggle_button));
+
+      fd->current_opts.limit =
+       gtk_spin_button_get_value (fd->limit_spinbutton);
+    }
+}
+
+
+/* Makes widget W's sensitivity follow the active state of TOGGLE */
+static void
+sensitive_if_active (GtkToggleButton *toggle, GtkWidget *w)
+{
+  gboolean active = gtk_toggle_button_get_active (toggle);
+
+  gtk_widget_set_sensitive (w, active);
+}
+
+/* Pops up the Frequencies dialog box */
+void
+frequencies_dialog (GObject *o, gpointer data)
+{
+  gint response;
+  struct data_editor *de = data;
+
+  struct frequencies_dialog fd;
+
+  GladeXML *xml = XML_NEW ("frequencies.glade");
+
+  GtkWidget *dialog = get_widget_assert   (xml, "frequencies-dialog");
+  GtkWidget *source = get_widget_assert   (xml, "dict-treeview");
+  GtkWidget *dest =   get_widget_assert   (xml, "var-treeview");
+  GtkWidget *selector = get_widget_assert (xml, "selector1");
+  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 = PSPPIRE_VAR_STORE (gtk_sheet_get_model (var_sheet));
+
+  put_checkbox_items_in_treeview (GTK_TREE_VIEW(stats_treeview),
+                                 B_FS_DEFAULT,
+                                 N_FREQUENCY_STATS,
+                                 stats
+                                 );
+
+
+
+
+  gtk_window_set_transient_for (GTK_WINDOW (dialog), de->parent.window);
+
+  attach_dictionary_to_treeview (GTK_TREE_VIEW (source),
+                                vs->dict,
+                                GTK_SELECTION_MULTIPLE, NULL);
+
+  set_dest_model (GTK_TREE_VIEW (dest), vs->dict);
+
+
+  psppire_selector_set_subjects (PSPPIRE_SELECTOR (selector),
+                                source,
+                                dest,
+                                insert_source_row_into_tree_view,
+                                NULL);
+
+
+  fd.stat_vars = GTK_TREE_VIEW (dest);
+  fd.dict = vs->dict;
+  fd.table_button = get_widget_assert (xml, "checkbutton1");
+  fd.format_dialog = get_widget_assert (xml, "format-dialog");
+  fd.maximum_cats = get_widget_assert (xml, "hbox5");
+  fd.limit_toggle_button = get_widget_assert (xml, "checkbutton2");
+  fd.limit_spinbutton =
+    GTK_SPIN_BUTTON (get_widget_assert (xml, "spinbutton1"));
+
+  fd.stats = gtk_tree_view_get_model (GTK_TREE_VIEW (stats_treeview));
+
+  fd.avalue = GTK_TOGGLE_BUTTON (get_widget_assert (xml, "radiobutton1"));
+  fd.dvalue = GTK_TOGGLE_BUTTON (get_widget_assert (xml, "radiobutton2"));
+  fd.afreq  = GTK_TOGGLE_BUTTON (get_widget_assert (xml, "radiobutton3"));
+  fd.dfreq  = GTK_TOGGLE_BUTTON (get_widget_assert (xml, "radiobutton4"));
+
+  fd.current_opts.order = FRQ_AVALUE;
+  fd.current_opts.use_limits = FALSE;
+  fd.current_opts.limit = 50;
+
+  g_signal_connect (dialog, "refresh", G_CALLBACK (refresh),  &fd);
+
+  psppire_dialog_set_valid_predicate (PSPPIRE_DIALOG (dialog),
+                                     dialog_state_valid, &fd);
+
+
+  g_signal_connect_swapped (format_button, "clicked",
+                           G_CALLBACK (on_format_clicked),  &fd);
+
+  g_signal_connect (fd.limit_toggle_button, "toggled",
+                   G_CALLBACK (sensitive_if_active), fd.maximum_cats);
+
+
+  response = psppire_dialog_run (PSPPIRE_DIALOG (dialog));
+
+
+  switch (response)
+    {
+    case GTK_RESPONSE_OK:
+      {
+       gchar *syntax = generate_syntax (&fd);
+       struct getl_interface *sss = create_syntax_string_source (syntax);
+       execute_syntax (sss);
+
+       g_free (syntax);
+      }
+      break;
+    case PSPPIRE_RESPONSE_PASTE:
+      {
+       gchar *syntax = generate_syntax (&fd);
+
+       struct syntax_editor *se =
+         (struct syntax_editor *) window_create (WINDOW_SYNTAX, NULL);
+
+       gtk_text_buffer_insert_at_cursor (se->buffer, syntax, -1);
+
+       g_free (syntax);
+      }
+      break;
+    default:
+      break;
+    }
+
+  g_object_unref (xml);
+}
diff --git a/src/ui/gui/frequencies-dialog.h b/src/ui/gui/frequencies-dialog.h
new file mode 100644 (file)
index 0000000..90990a4
--- /dev/null
@@ -0,0 +1,27 @@
+/* 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/>. */
+
+#ifndef __FREQUENCIES_DIALOG_H
+#define __FREQUENCIES_DIALOG_H
+
+
+#include <gtk/gtk.h>
+#include <glade/glade.h>
+
+
+void frequencies_dialog (GObject *o, gpointer data);
+
+#endif
diff --git a/src/ui/gui/frequencies.glade b/src/ui/gui/frequencies.glade
new file mode 100644 (file)
index 0000000..5617d40
--- /dev/null
@@ -0,0 +1,429 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
+<!--Generated with glade3 3.2.2 on Fri Nov 30 15:42:55 2007 by john@marilyn-->
+<glade-interface>
+  <requires lib="psppire"/>
+  <widget class="PsppireDialog" id="frequencies-dialog">
+    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+    <property name="title">Frequencies</property>
+    <property name="modal">True</property>
+    <child internal-child="hbox">
+      <widget class="GtkHBox" id="dialog-hbox1">
+        <property name="visible">True</property>
+        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+        <property name="spacing">2</property>
+        <child>
+          <widget class="GtkVBox" id="vbox1">
+            <property name="visible">True</property>
+            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+            <child>
+              <widget class="GtkHBox" id="hbox1">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <child>
+                  <widget class="GtkScrolledWindow" id="scrolledwindow1">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="hscrollbar_policy">GTK_POLICY_NEVER</property>
+                    <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+                    <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
+                    <child>
+                      <widget class="GtkTreeView" id="dict-treeview">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                        <property name="headers_visible">False</property>
+                        <property name="headers_clickable">True</property>
+                      </widget>
+                    </child>
+                  </widget>
+                </child>
+                <child>
+                  <widget class="GtkAlignment" id="alignment2">
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="yalign">0.05000000074505806</property>
+                    <property name="yscale">0</property>
+                    <child>
+                      <widget class="PsppireSelector" id="selector1">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                        <property name="no_show_all">True</property>
+                        <property name="border_width">5</property>
+                      </widget>
+                    </child>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkVBox" id="vbox3">
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <child>
+                      <widget class="GtkFrame" id="frame1">
+                        <property name="visible">True</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                        <property name="label_xalign">0</property>
+                        <property name="shadow_type">GTK_SHADOW_NONE</property>
+                        <child>
+                          <widget class="GtkScrolledWindow" id="scrolledwindow2">
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <property name="hscrollbar_policy">GTK_POLICY_NEVER</property>
+                            <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+                            <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
+                            <child>
+                              <widget class="GtkTreeView" id="var-treeview">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                <property name="headers_visible">False</property>
+                                <property name="headers_clickable">True</property>
+                              </widget>
+                            </child>
+                          </widget>
+                        </child>
+                        <child>
+                          <widget class="GtkLabel" id="label1">
+                            <property name="visible">True</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <property name="label" translatable="yes">Variable(s):</property>
+                            <property name="use_markup">True</property>
+                          </widget>
+                          <packing>
+                            <property name="type">label_item</property>
+                          </packing>
+                        </child>
+                      </widget>
+                      <packing>
+                        <property name="expand">False</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="GtkFrame" id="frame1">
+                        <property name="visible">True</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                        <property name="label_xalign">0</property>
+                        <property name="shadow_type">GTK_SHADOW_NONE</property>
+                        <child>
+                          <widget class="GtkScrolledWindow" id="scrolledwindow3">
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <property name="hscrollbar_policy">GTK_POLICY_NEVER</property>
+                            <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+                            <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
+                            <child>
+                              <widget class="GtkTreeView" id="stats-treeview">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                <property name="headers_visible">False</property>
+                                <property name="headers_clickable">True</property>
+                              </widget>
+                            </child>
+                          </widget>
+                        </child>
+                        <child>
+                          <widget class="GtkLabel" id="label1">
+                            <property name="visible">True</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <property name="label" translatable="yes">Statistics:</property>
+                            <property name="use_markup">True</property>
+                          </widget>
+                          <packing>
+                            <property name="type">label_item</property>
+                          </packing>
+                        </child>
+                      </widget>
+                      <packing>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+              </widget>
+            </child>
+            <child>
+              <widget class="GtkHBox" id="hbox3">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <child>
+                  <widget class="GtkCheckButton" id="checkbutton1">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="label" translatable="yes">Display Frequency Table</property>
+                    <property name="response_id">0</property>
+                    <property name="draw_indicator">True</property>
+                  </widget>
+                </child>
+                <child>
+                  <widget class="GtkHBox" id="hbox2">
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="spacing">5</property>
+                    <property name="homogeneous">True</property>
+                    <child>
+                      <widget class="GtkButton" id="button1">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                        <property name="label" translatable="yes">Format...</property>
+                        <property name="response_id">0</property>
+                      </widget>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="padding">5</property>
+                    <property name="pack_type">GTK_PACK_END</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+              </widget>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="padding">5</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </widget>
+        </child>
+        <child>
+          <widget class="PsppireVButtonBox" id="psppire-vbuttonbox1">
+            <property name="visible">True</property>
+            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+            <property name="border_width">5</property>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="pack_type">GTK_PACK_END</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+      </widget>
+    </child>
+  </widget>
+  <widget class="PsppireDialog" id="format-dialog">
+    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+    <property name="title">Frequencies: Format</property>
+    <property name="modal">True</property>
+    <child internal-child="hbox">
+      <widget class="GtkHBox" id="dialog-hbox2">
+        <property name="visible">True</property>
+        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+        <property name="spacing">2</property>
+        <child>
+          <widget class="GtkHBox" id="hbox4">
+            <property name="visible">True</property>
+            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+            <property name="spacing">5</property>
+            <child>
+              <widget class="GtkFrame" id="frame2">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="label_xalign">0</property>
+                <child>
+                  <widget class="GtkAlignment" id="alignment1">
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="left_padding">12</property>
+                    <child>
+                      <widget class="GtkVButtonBox" id="vbuttonbox1">
+                        <property name="visible">True</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                        <property name="homogeneous">True</property>
+                        <child>
+                          <widget class="GtkRadioButton" id="radiobutton1">
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <property name="label" translatable="yes">Ascending Order</property>
+                            <property name="response_id">0</property>
+                            <property name="active">True</property>
+                            <property name="draw_indicator">True</property>
+                          </widget>
+                        </child>
+                        <child>
+                          <widget class="GtkRadioButton" id="radiobutton2">
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <property name="label" translatable="yes">Descending Order</property>
+                            <property name="response_id">0</property>
+                            <property name="active">True</property>
+                            <property name="draw_indicator">True</property>
+                            <property name="group">radiobutton1</property>
+                          </widget>
+                          <packing>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <widget class="GtkRadioButton" id="radiobutton3">
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <property name="label" translatable="yes">Ascending Counts</property>
+                            <property name="response_id">0</property>
+                            <property name="active">True</property>
+                            <property name="draw_indicator">True</property>
+                            <property name="group">radiobutton1</property>
+                          </widget>
+                          <packing>
+                            <property name="position">2</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <widget class="GtkRadioButton" id="radiobutton4">
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <property name="label" translatable="yes">Descending Counts</property>
+                            <property name="response_id">0</property>
+                            <property name="active">True</property>
+                            <property name="draw_indicator">True</property>
+                            <property name="group">radiobutton1</property>
+                          </widget>
+                          <packing>
+                            <property name="position">3</property>
+                          </packing>
+                        </child>
+                      </widget>
+                    </child>
+                  </widget>
+                </child>
+                <child>
+                  <widget class="GtkLabel" id="label2">
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="label" translatable="yes">Order by</property>
+                    <property name="use_markup">True</property>
+                  </widget>
+                  <packing>
+                    <property name="type">label_item</property>
+                  </packing>
+                </child>
+              </widget>
+            </child>
+            <child>
+              <widget class="GtkAlignment" id="alignment3">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="yalign">0</property>
+                <property name="yscale">0</property>
+                <property name="top_padding">5</property>
+                <child>
+                  <widget class="GtkVBox" id="vbox2">
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <child>
+                      <widget class="GtkCheckButton" id="checkbutton2">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                        <property name="response_id">0</property>
+                        <property name="draw_indicator">True</property>
+                        <child>
+                          <widget class="GtkLabel" id="label4">
+                            <property name="width_request">180</property>
+                            <property name="visible">True</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <property name="label" translatable="yes">Supress tables with more than N categories</property>
+                            <property name="wrap">True</property>
+                          </widget>
+                        </child>
+                      </widget>
+                    </child>
+                    <child>
+                      <widget class="GtkHBox" id="hbox5">
+                        <property name="visible">True</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                        <child>
+                          <widget class="GtkLabel" id="label3">
+                            <property name="width_request">120</property>
+                            <property name="visible">True</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <property name="xalign">0</property>
+                            <property name="label" translatable="yes">Maximum no of categories</property>
+                            <property name="wrap">True</property>
+                            <property name="wrap_mode">PANGO_WRAP_WORD_CHAR</property>
+                          </widget>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">False</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <widget class="GtkSpinButton" id="spinbutton1">
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <property name="adjustment">100 1 65536 1 10 10</property>
+                            <property name="numeric">True</property>
+                            <property name="update_policy">GTK_UPDATE_IF_VALID</property>
+                          </widget>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">False</property>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
+                      </widget>
+                      <packing>
+                        <property name="padding">5</property>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                  </widget>
+                </child>
+              </widget>
+              <packing>
+                <property name="expand">False</property>
+                <property name="padding">5</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </widget>
+        </child>
+        <child>
+          <widget class="PsppireVButtonBox" id="psppire-vbuttonbox2">
+            <property name="visible">True</property>
+            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+            <property name="border_width">5</property>
+            <property name="buttons">PSPPIRE_BUTTON_CONTINUE_MASK | PSPPIRE_BUTTON_CANCEL_MASK | PSPPIRE_BUTTON_HELP_MASK</property>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="pack_type">GTK_PACK_END</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+      </widget>
+    </child>
+  </widget>
+</glade-interface>