summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Seitz <keiths@redhat.com>2002-09-24 23:50:31 +0000
committerKeith Seitz <keiths@redhat.com>2002-09-24 23:50:31 +0000
commit43375e54d64ecea0b356c82d72b29fd95dd54cc9 (patch)
tree7582d7bb623964e848d993dde740802e40a748b0
parent5a88d945c95d8c15e31bf74fc9850b8c01fdeaec (diff)
downloadgdb-tcltk840-20020924-branchpoint.tar.gz
import iwidgets 4.0.1tcltk840-20020924-branchpoint
-rw-r--r--iwidgets/.cvsignore5
-rw-r--r--iwidgets/CHANGES1604
-rw-r--r--iwidgets/ChangeLog1498
-rw-r--r--iwidgets/Makefile.in189
-rw-r--r--iwidgets/README212
-rw-r--r--iwidgets/aclocal.m41
-rwxr-xr-xiwidgets/configure1156
-rw-r--r--iwidgets/configure.in99
-rw-r--r--iwidgets/demos/buttonbox13
-rw-r--r--iwidgets/demos/calendar26
-rw-r--r--iwidgets/demos/canvasprintbox22
-rw-r--r--iwidgets/demos/canvasprintdialog31
-rw-r--r--iwidgets/demos/catalog407
-rw-r--r--iwidgets/demos/checkbox12
-rw-r--r--iwidgets/demos/combobox16
-rw-r--r--iwidgets/demos/dateentry12
-rw-r--r--iwidgets/demos/datefield12
-rw-r--r--iwidgets/demos/demo.html42
-rw-r--r--iwidgets/demos/dialog47
-rw-r--r--iwidgets/demos/dialogshell35
-rw-r--r--iwidgets/demos/disjointlistbox9
-rw-r--r--iwidgets/demos/entryfield33
-rw-r--r--iwidgets/demos/extbutton15
-rw-r--r--iwidgets/demos/extfileselectionbox9
-rw-r--r--iwidgets/demos/extfileselectiondialog15
-rw-r--r--iwidgets/demos/feedback18
-rw-r--r--iwidgets/demos/fileselectionbox9
-rw-r--r--iwidgets/demos/fileselectiondialog15
-rw-r--r--iwidgets/demos/finddialog222
-rw-r--r--iwidgets/demos/hierarchy154
-rw-r--r--iwidgets/demos/html/buttonbox.n.html217
-rw-r--r--iwidgets/demos/html/calendar.n.html363
-rw-r--r--iwidgets/demos/html/canvasprintbox.n.html303
-rw-r--r--iwidgets/demos/html/canvasprintdialog.n.html250
-rw-r--r--iwidgets/demos/html/checkbox.n.html209
-rw-r--r--iwidgets/demos/html/combobox.n.html484
-rw-r--r--iwidgets/demos/html/dateentry.n.html238
-rw-r--r--iwidgets/demos/html/datefield.n.html248
-rw-r--r--iwidgets/demos/html/dialog.n.html199
-rw-r--r--iwidgets/demos/html/dialogshell.n.html269
-rw-r--r--iwidgets/demos/html/disjointlistbox.n.html361
-rw-r--r--iwidgets/demos/html/entryfield.n.html340
-rw-r--r--iwidgets/demos/html/extbutton.n.html160
-rw-r--r--iwidgets/demos/html/extfileselectionbox.n.html467
-rw-r--r--iwidgets/demos/html/extfileselectiondialog.n.html375
-rw-r--r--iwidgets/demos/html/feedback.n.html168
-rw-r--r--iwidgets/demos/html/fileselectionbox.n.html456
-rw-r--r--iwidgets/demos/html/fileselectiondialog.n.html339
-rw-r--r--iwidgets/demos/html/finddialog.n.html392
-rw-r--r--iwidgets/demos/html/hierarchy.n.html673
-rw-r--r--iwidgets/demos/html/hyperhelp.n.html258
-rw-r--r--iwidgets/demos/html/iwidgets4.0.0UserCmds.html66
-rw-r--r--iwidgets/demos/html/labeledframe.n.html210
-rw-r--r--iwidgets/demos/html/labeledwidget.n.html224
-rw-r--r--iwidgets/demos/html/mainwindow.n.html373
-rw-r--r--iwidgets/demos/html/menubar.n.html686
-rw-r--r--iwidgets/demos/html/messagebox.n.html358
-rw-r--r--iwidgets/demos/html/messagedialog.n.html279
-rw-r--r--iwidgets/demos/html/notebook.n.html509
-rw-r--r--iwidgets/demos/html/optionmenu.n.html316
-rw-r--r--iwidgets/demos/html/panedwindow.n.html352
-rw-r--r--iwidgets/demos/html/promptdialog.n.html313
-rw-r--r--iwidgets/demos/html/pushbutton.n.html175
-rw-r--r--iwidgets/demos/html/radiobox.n.html211
-rw-r--r--iwidgets/demos/html/scopedobject.n.html96
-rw-r--r--iwidgets/demos/html/scrolledcanvas.n.html343
-rw-r--r--iwidgets/demos/html/scrolledframe.n.html258
-rw-r--r--iwidgets/demos/html/scrolledhtml.n.html406
-rw-r--r--iwidgets/demos/html/scrolledlistbox.n.html452
-rw-r--r--iwidgets/demos/html/scrolledtext.n.html367
-rw-r--r--iwidgets/demos/html/selectionbox.n.html389
-rw-r--r--iwidgets/demos/html/selectiondialog.n.html314
-rw-r--r--iwidgets/demos/html/shell.n.html219
-rw-r--r--iwidgets/demos/html/spindate.n.html614
-rw-r--r--iwidgets/demos/html/spinint.n.html269
-rw-r--r--iwidgets/demos/html/spinner.n.html308
-rw-r--r--iwidgets/demos/html/spintime.n.html604
-rw-r--r--iwidgets/demos/html/tabnotebook.n.html860
-rw-r--r--iwidgets/demos/html/tabset.n.html681
-rw-r--r--iwidgets/demos/html/timeentry.n.html256
-rw-r--r--iwidgets/demos/html/timefield.n.html206
-rw-r--r--iwidgets/demos/html/toolbar.n.html351
-rw-r--r--iwidgets/demos/html/watch.n.html324
-rw-r--r--iwidgets/demos/hyperhelp14
-rw-r--r--iwidgets/demos/images/box.xbm14
-rw-r--r--iwidgets/demos/images/clear.gifbin0 -> 279 bytes
-rw-r--r--iwidgets/demos/images/close.gifbin0 -> 249 bytes
-rw-r--r--iwidgets/demos/images/copy.gifbin0 -> 269 bytes
-rw-r--r--iwidgets/demos/images/cut.gifbin0 -> 179 bytes
-rw-r--r--iwidgets/demos/images/exit.gifbin0 -> 396 bytes
-rw-r--r--iwidgets/demos/images/find.gifbin0 -> 386 bytes
-rw-r--r--iwidgets/demos/images/help.gifbin0 -> 591 bytes
-rw-r--r--iwidgets/demos/images/line.xbm14
-rw-r--r--iwidgets/demos/images/mag.gifbin0 -> 183 bytes
-rw-r--r--iwidgets/demos/images/new.gifbin0 -> 212 bytes
-rw-r--r--iwidgets/demos/images/open.gifbin0 -> 258 bytes
-rw-r--r--iwidgets/demos/images/oval.xbm14
-rw-r--r--iwidgets/demos/images/paste.gifbin0 -> 376 bytes
-rw-r--r--iwidgets/demos/images/points.xbm14
-rw-r--r--iwidgets/demos/images/poly.gifbin0 -> 141 bytes
-rw-r--r--iwidgets/demos/images/print.gifbin0 -> 263 bytes
-rw-r--r--iwidgets/demos/images/ruler.gifbin0 -> 174 bytes
-rw-r--r--iwidgets/demos/images/save.gifbin0 -> 270 bytes
-rw-r--r--iwidgets/demos/images/select.gifbin0 -> 124 bytes
-rw-r--r--iwidgets/demos/images/text.xbm14
-rw-r--r--iwidgets/demos/iwidgets.gifbin0 -> 7727 bytes
-rw-r--r--iwidgets/demos/labeledframe47
-rw-r--r--iwidgets/demos/labeledwidget23
-rw-r--r--iwidgets/demos/mainwindow163
-rw-r--r--iwidgets/demos/menubar76
-rw-r--r--iwidgets/demos/messagebox32
-rw-r--r--iwidgets/demos/messagedialog20
-rw-r--r--iwidgets/demos/notebook71
-rw-r--r--iwidgets/demos/optionmenu12
-rw-r--r--iwidgets/demos/panedwindow30
-rw-r--r--iwidgets/demos/promptdialog21
-rw-r--r--iwidgets/demos/pushbutton17
-rw-r--r--iwidgets/demos/radiobox14
-rw-r--r--iwidgets/demos/scopedobject16
-rw-r--r--iwidgets/demos/scrolledcanvas45
-rw-r--r--iwidgets/demos/scrolledframe29
-rw-r--r--iwidgets/demos/scrolledhtml14
-rw-r--r--iwidgets/demos/scrolledlistbox30
-rw-r--r--iwidgets/demos/scrolledtext13
-rw-r--r--iwidgets/demos/selectionbox12
-rw-r--r--iwidgets/demos/selectiondialog22
-rw-r--r--iwidgets/demos/shell11
-rw-r--r--iwidgets/demos/spindate9
-rw-r--r--iwidgets/demos/spinint29
-rw-r--r--iwidgets/demos/spinner28
-rw-r--r--iwidgets/demos/spintime9
-rw-r--r--iwidgets/demos/tabnotebook72
-rw-r--r--iwidgets/demos/tabset16
-rw-r--r--iwidgets/demos/timeentry7
-rw-r--r--iwidgets/demos/timefield12
-rw-r--r--iwidgets/demos/toolbar45
-rw-r--r--iwidgets/demos/watch16
-rw-r--r--iwidgets/doc/buttonbox.n189
-rw-r--r--iwidgets/doc/calendar.n335
-rw-r--r--iwidgets/doc/canvasprintbox.n268
-rw-r--r--iwidgets/doc/canvasprintdialog.n169
-rw-r--r--iwidgets/doc/checkbox.n178
-rw-r--r--iwidgets/doc/combobox.n376
-rw-r--r--iwidgets/doc/dateentry.n177
-rw-r--r--iwidgets/doc/datefield.n215
-rw-r--r--iwidgets/doc/dialog.n140
-rw-r--r--iwidgets/doc/dialogshell.n217
-rw-r--r--iwidgets/doc/disjointlistbox.n290
-rw-r--r--iwidgets/doc/entryfield.n282
-rw-r--r--iwidgets/doc/extbutton.n149
-rw-r--r--iwidgets/doc/extfileselectionbox.n395
-rw-r--r--iwidgets/doc/extfileselectiondialog.n239
-rw-r--r--iwidgets/doc/feedback.n145
-rw-r--r--iwidgets/doc/fileselectionbox.n391
-rw-r--r--iwidgets/doc/fileselectiondialog.n218
-rw-r--r--iwidgets/doc/finddialog.n294
-rw-r--r--iwidgets/doc/generateHtml.sh10
-rw-r--r--iwidgets/doc/hierarchy.n629
-rw-r--r--iwidgets/doc/hyperhelp.n196
-rw-r--r--iwidgets/doc/iwidgets.ps13149
-rw-r--r--iwidgets/doc/labeledframe.n195
-rw-r--r--iwidgets/doc/labeledwidget.n217
-rw-r--r--iwidgets/doc/mainwindow.n308
-rw-r--r--iwidgets/doc/man.macros186
-rw-r--r--iwidgets/doc/menubar.n348
-rw-r--r--iwidgets/doc/messagebox.n277
-rw-r--r--iwidgets/doc/messagedialog.n215
-rw-r--r--iwidgets/doc/mkitclman320
-rw-r--r--iwidgets/doc/notebook.n321
-rw-r--r--iwidgets/doc/optionmenu.n261
-rw-r--r--iwidgets/doc/panedwindow.n307
-rw-r--r--iwidgets/doc/promptdialog.n200
-rw-r--r--iwidgets/doc/pushbutton.n151
-rw-r--r--iwidgets/doc/radiobox.n180
-rw-r--r--iwidgets/doc/scopedobject.n100
-rw-r--r--iwidgets/doc/scrolledcanvas.n257
-rw-r--r--iwidgets/doc/scrolledframe.n211
-rw-r--r--iwidgets/doc/scrolledhtml.n313
-rw-r--r--iwidgets/doc/scrolledlistbox.n356
-rw-r--r--iwidgets/doc/scrolledtext.n284
-rw-r--r--iwidgets/doc/selectionbox.n302
-rw-r--r--iwidgets/doc/selectiondialog.n199
-rw-r--r--iwidgets/doc/shell.n197
-rw-r--r--iwidgets/doc/spindate.n275
-rw-r--r--iwidgets/doc/spinint.n185
-rw-r--r--iwidgets/doc/spinner.n229
-rw-r--r--iwidgets/doc/spintime.n266
-rw-r--r--iwidgets/doc/tabnotebook.n659
-rw-r--r--iwidgets/doc/tabset.n466
-rw-r--r--iwidgets/doc/timeentry.n196
-rw-r--r--iwidgets/doc/timefield.n186
-rw-r--r--iwidgets/doc/tk2html46
-rw-r--r--iwidgets/doc/tk2html.awk320
-rw-r--r--iwidgets/doc/tk2html.perl337
-rw-r--r--iwidgets/doc/tk2html2.awk53
-rw-r--r--iwidgets/doc/toolbar.n305
-rw-r--r--iwidgets/doc/watch.n286
-rw-r--r--iwidgets/generic/buttonbox.itk571
-rw-r--r--iwidgets/generic/calendar.itk983
-rw-r--r--iwidgets/generic/canvasprintbox.itk1111
-rw-r--r--iwidgets/generic/canvasprintdialog.itk155
-rw-r--r--iwidgets/generic/checkbox.itk341
-rw-r--r--iwidgets/generic/colors.itcl209
-rw-r--r--iwidgets/generic/combobox.itk1443
-rw-r--r--iwidgets/generic/dateentry.itk424
-rw-r--r--iwidgets/generic/datefield.itk1021
-rw-r--r--iwidgets/generic/dialog.itk92
-rw-r--r--iwidgets/generic/dialogshell.itk350
-rw-r--r--iwidgets/generic/disjointlistbox.itk529
-rw-r--r--iwidgets/generic/entryfield.itk603
-rw-r--r--iwidgets/generic/extbutton.itk439
-rw-r--r--iwidgets/generic/extfileselectionbox.itk1187
-rw-r--r--iwidgets/generic/extfileselectiondialog.itk182
-rw-r--r--iwidgets/generic/feedback.itk212
-rw-r--r--iwidgets/generic/fileselectionbox.itk1296
-rw-r--r--iwidgets/generic/fileselectiondialog.itk181
-rw-r--r--iwidgets/generic/finddialog.itk488
-rw-r--r--iwidgets/generic/hierarchy.itk1983
-rw-r--r--iwidgets/generic/hyperhelp.itk508
-rw-r--r--iwidgets/generic/labeledframe.itk496
-rw-r--r--iwidgets/generic/labeledwidget.itk445
-rw-r--r--iwidgets/generic/mainwindow.itk313
-rw-r--r--iwidgets/generic/menubar.itk2267
-rw-r--r--iwidgets/generic/messagebox.itk399
-rw-r--r--iwidgets/generic/messagedialog.itk144
-rw-r--r--iwidgets/generic/notebook.itk946
-rw-r--r--iwidgets/generic/optionmenu.itk664
-rw-r--r--iwidgets/generic/pane.itk128
-rw-r--r--iwidgets/generic/panedwindow.itk942
-rw-r--r--iwidgets/generic/promptdialog.itk199
-rw-r--r--iwidgets/generic/pushbutton.itk356
-rw-r--r--iwidgets/generic/radiobox.itk427
-rw-r--r--iwidgets/generic/regexpfield.itk455
-rw-r--r--iwidgets/generic/roman.itcl29
-rw-r--r--iwidgets/generic/scopedobject.itcl181
-rw-r--r--iwidgets/generic/scrolledcanvas.itk477
-rw-r--r--iwidgets/generic/scrolledframe.itk250
-rw-r--r--iwidgets/generic/scrolledhtml.itk2521
-rw-r--r--iwidgets/generic/scrolledlistbox.itk732
-rw-r--r--iwidgets/generic/scrolledtext.itk501
-rw-r--r--iwidgets/generic/scrolledwidget.itk376
-rw-r--r--iwidgets/generic/selectionbox.itk560
-rw-r--r--iwidgets/generic/selectiondialog.itk233
-rw-r--r--iwidgets/generic/shell.itk375
-rw-r--r--iwidgets/generic/spindate.itk693
-rw-r--r--iwidgets/generic/spinint.itk237
-rw-r--r--iwidgets/generic/spinner.itk448
-rw-r--r--iwidgets/generic/spintime.itk527
-rw-r--r--iwidgets/generic/tabnotebook.itk1105
-rw-r--r--iwidgets/generic/tabset.itk2753
-rw-r--r--iwidgets/generic/tclIndex1372
-rw-r--r--iwidgets/generic/timeentry.itk398
-rw-r--r--iwidgets/generic/timefield.itk1018
-rw-r--r--iwidgets/generic/toolbar.itk983
-rw-r--r--iwidgets/generic/unknownimage.gifbin0 -> 472 bytes
-rw-r--r--iwidgets/generic/watch.itk626
-rw-r--r--iwidgets/incoming/README44
-rw-r--r--iwidgets/incoming/demos/buttoncage16
-rw-r--r--iwidgets/incoming/demos/collapsablewidget21
-rw-r--r--iwidgets/incoming/doc/collapsablewidget.n212
-rw-r--r--iwidgets/incoming/doc/man.macros186
-rw-r--r--iwidgets/incoming/src/buttoncage.itk585
-rw-r--r--iwidgets/incoming/src/collapsablewidget.itk324
-rw-r--r--iwidgets/iwidgets.tcl.in31
-rw-r--r--iwidgets/license.terms31
-rw-r--r--iwidgets/outgoing/README14
-rw-r--r--iwidgets/pkgIndex.tcl.in3
-rw-r--r--iwidgets/tcl.m42270
-rw-r--r--iwidgets/tests/all19
-rw-r--r--iwidgets/tests/all.tcl122
-rw-r--r--iwidgets/tests/buttonbox.test199
-rw-r--r--iwidgets/tests/calendar.test171
-rw-r--r--iwidgets/tests/canvasprintbox.test162
-rw-r--r--iwidgets/tests/canvasprintdialog.test181
-rw-r--r--iwidgets/tests/checkbox.test161
-rw-r--r--iwidgets/tests/combobox.test328
-rw-r--r--iwidgets/tests/dateentry.test219
-rw-r--r--iwidgets/tests/datefield.test203
-rw-r--r--iwidgets/tests/defs220
-rw-r--r--iwidgets/tests/dialog.test147
-rw-r--r--iwidgets/tests/dialogshell.test240
-rw-r--r--iwidgets/tests/disjointlistbox.test116
-rw-r--r--iwidgets/tests/entryfield.test198
-rw-r--r--iwidgets/tests/extbutton.test150
-rw-r--r--iwidgets/tests/extfileselectionbox.test209
-rw-r--r--iwidgets/tests/extfileselectiondialog.test218
-rw-r--r--iwidgets/tests/feedback.test157
-rw-r--r--iwidgets/tests/fileselectionbox.test212
-rw-r--r--iwidgets/tests/fileselectiondialog.test219
-rw-r--r--iwidgets/tests/finddialog.test168
-rw-r--r--iwidgets/tests/hierarchy.test321
-rw-r--r--iwidgets/tests/hyperhelp.html157
-rw-r--r--iwidgets/tests/hyperhelp.test178
-rw-r--r--iwidgets/tests/labeledframe.test194
-rw-r--r--iwidgets/tests/labeledwidget.test172
-rw-r--r--iwidgets/tests/menubar.test560
-rw-r--r--iwidgets/tests/messagebox.test195
-rw-r--r--iwidgets/tests/messagedialog.test163
-rw-r--r--iwidgets/tests/notebook.test325
-rw-r--r--iwidgets/tests/optionmenu.test201
-rw-r--r--iwidgets/tests/panedwindow.test175
-rw-r--r--iwidgets/tests/promptdialog.test175
-rw-r--r--iwidgets/tests/pushbutton.test152
-rw-r--r--iwidgets/tests/radiobox.test167
-rw-r--r--iwidgets/tests/regexpfield.test197
-rw-r--r--iwidgets/tests/scrolledcanvas.test194
-rw-r--r--iwidgets/tests/scrolledframe.test223
-rw-r--r--iwidgets/tests/scrolledhtml.test222
-rw-r--r--iwidgets/tests/scrolledlistbox.test226
-rw-r--r--iwidgets/tests/scrolledtext.test190
-rw-r--r--iwidgets/tests/selectionbox.test190
-rw-r--r--iwidgets/tests/selectiondialog.test202
-rw-r--r--iwidgets/tests/shell.test212
-rw-r--r--iwidgets/tests/spindate.test172
-rw-r--r--iwidgets/tests/spinint.test191
-rw-r--r--iwidgets/tests/spinner.test173
-rw-r--r--iwidgets/tests/spintime.test156
-rw-r--r--iwidgets/tests/tabnotebook.test343
-rw-r--r--iwidgets/tests/tabset.test347
-rw-r--r--iwidgets/tests/timeentry.test203
-rw-r--r--iwidgets/tests/timefield.test196
-rw-r--r--iwidgets/tests/toolbar.test297
-rw-r--r--iwidgets/tests/usual.test75
-rw-r--r--iwidgets/tests/watch.test165
-rw-r--r--iwidgets/win/iwidgets.tcl31
-rw-r--r--iwidgets/win/makefile.vc46
-rw-r--r--iwidgets/win/pkg.vc10
327 files changed, 107342 insertions, 0 deletions
diff --git a/iwidgets/.cvsignore b/iwidgets/.cvsignore
new file mode 100644
index 00000000000..58652af0aa7
--- /dev/null
+++ b/iwidgets/.cvsignore
@@ -0,0 +1,5 @@
+Makefile
+config.log
+confdefs.h
+iwidgets.tcl
+pkgIndex.tcl
diff --git a/iwidgets/CHANGES b/iwidgets/CHANGES
new file mode 100644
index 00000000000..d012c1f9d74
--- /dev/null
+++ b/iwidgets/CHANGES
@@ -0,0 +1,1604 @@
+[incr Widgets] CHANGES
+----------------------
+
+==========================================================================
+CURRENT VERSION: 4.0.1
+PREVIOUS VERSION: 4.0.0
+DATE: 9/16/02
+CONTACT: Chad Smith (itclguy@attbi.com)
+
+ This is primarily a bug-fix release of the [incr Widgets]. Please see
+the ChangeLog for a detailed explanation of the changes made to the various
+widgets and the SourceForge tickets to which each change is associated.
+
+ Check out the incoming/demos directory. I've added a couple new widgets
+that were submitted to SourceForge. Let me know if you think they are
+useful or not. If so, they can be added to the distribution in a future
+release.
+
+ Many thanks to Marty Backe for his tireless efforts closing out numerous
+SF tickets for this release!
+
+==========================================================================
+
+
+
+==========================================================================
+ -------------------------- iwidgets-4.0.0 ------------------------------
+ -------------------- CHANGES FROM iwidgets-3.1.0 -----------------------
+==========================================================================
+DATE: 8/07/01
+CONTACT: Chad Smith (itclguy@yahoo.com)
+
+--------
+CHANGES:
+--------
+ This release of the [incr Widgets] marks the first time they are
+released independently of the [incr Tcl] distribution. The Iwidgets
+package is now separate from Itcl and can be optionally downloaded
+and built as a true extension to Itcl (well actually Itk).
+
+ Along with the Makefile/configuration-type changes necessary for
+removing the Iwidgets from Itcl, there are many other changes you
+should note in this release. I'll try to list each of these:
+
+o - The most important change is that doing a 'package require Iwidgets'
+ no longer pulls the itcl namespace commands into the global namespace.
+ Previously, this was done because none of the itcl-specific commands
+ such as class, configbody, etc. were properly resolved in the [incr
+ Widgets] classes. Now, all references to itcl commands use proper
+ namespace resolution. For example, "class iwidgets::Checkbox" is now
+ replaced with "itcl::class iwidgets::Checkbox".
+
+ Here is a list of itcl commands that are now properly scoped:
+ class
+ body
+ configbody
+ scope
+ code
+
+ There are likely many folks in the community that have come to rely
+ on the exporting of itcl commands into the global namespace, so if you're
+ one of these folks you have two choices if you want to use this version
+ of the [incr Widgets]: (1) You can add a "namespace import -force itcl::*"
+ at the beginning of your application (this is what 'package require
+ Iwidgets' used to do); or (2) you can add "itcl::" in front of each of the
+ itcl-specific commands in your code.
+
+o - A new mega-widget, extbutton, was added to the distribution. Note that
+ this new widget will only work with Tk 8.4 or later. A man page and
+ test case is available in the distribution.
+
+o - "readonly" was added as a new value for the combobox's -state option.
+
+o - A new option, -gmt, was added to the datefield. It accepts boolean values.
+
+o - A new option, -state, was added to the radiobox.
+
+o - A new method, bbox, was added to tabset to return the bounding box that
+ will completely enclose all tabs.
+
+o - A new option, -automount, was added to extfileselectionbox and
+ fileselectionbox.
+
+o - Error checking was added to hierarchy's -alwaysquery option to enforce
+ boolean values, and some memory leaks were plugged in the 'clear' method.
+
+==========================================================================
+
+
+
+==========================================================================
+ -------------------------- iwidgets-3.0.0 ------------------------------
+ -------------------- CHANGES FROM iwidgets-2.2.0 -----------------------
+==========================================================================
+
+ [incr Widgets] version 3.0.0 is compatable with itcl3.0
+
+ [incr Widgets] has undergone a major overhaul between the last version
+and 3.0.0. Since so many changes have taken place it made more since to
+list them by widget class name rather than the old style of new features
+and bug fixes. The majority of the changes are under the covers and will
+have minimal impact of existing scripts, but there are a few that may
+bite you. To locate possible incompatabilities, just search this file
+for the key words "POSSIBLE INCOMPATIBILITY".
+
+ In addition, quite a few new widgets have been added to the set. They
+include the following:
+
+ Calendar
+ Checkbox
+ Dateentry
+ Datefield
+ Disjointlistbox
+ Extfileselectionbox
+ Extfileselectiondialog
+ Finddialog
+ Hierarchy
+ Labeledframe
+ Mainwindow
+ Messagebox
+ Scrolledwidget
+ Timeentry
+ Timefield
+ Watch
+
+ Thanx to the following contributors who have been kind enough to help
+me support this effort through enhancements, bug fixes, and new widgets.
+
+ John Tucker jatucker@austin.dsccc.com
+ Mitch Gorman emrys@net-gate.com
+ John Reekie johnr@EECS.Berkeley.EDU
+ Alfredo Jahn ajahn@spd.dsccc.com
+ Michael McLennan mmclennan@lucent.com
+
+
+Labeledwidget
+______________________________________________________________________________
+
+>> Reimplemented geometry management using the grid instead of the packer.
+
+>> Changed component option basis to be that of the "usuals".
+
+>> Removed a redundant frame component named "shell" just below the hull.
+
+>> Corrected labelvariable bug. Setting the labelvariable had no effect.
+ The code has been corrected such that a trace is installed on the variable
+ which forces an update of the label text upon writes to the variable.
+
+>> Removed the labmargin frame component used for implementing a margin.
+ This is now accomplished via the grid by maintaining an empty row/column
+ for the margin and adjusting its minsize.
+
+>> POSSIBLE INCOMPATIBILITY - The childsite is now a protected component.
+ If you need access to it, use the childsite command.
+
+>> Added new label position orientation settings. The current label
+ positions are nw, n, ne, sw, s, se, en, e, es, wn, w, and ws.
+
+>> Updated the test script and man page.
+
+
+Scrolledlistbox
+______________________________________________________________________________
+
+>> Derived from the Scrolledwidget class which provides the vertical
+ and horizontal scrollbars along with the options to control their
+ display.
+
+>> Reimplemented geometry management using the grid instead of the packer.
+
+>> Changed component option basis to be that of the "usuals".
+
+>> Added a -state option that allows you to disable the listbox. Selection
+ is blocked. The foreground of the scrolledlistbox label is changed
+ to disbabledforeground.
+
+>> Fixed the infinite looping problem which would occur with -hscrollmode
+ set to dynamic and a really long line added just out of the view port.
+ As you'd scroll down the horizontal scrollbar bar would start flashing
+ on and off.
+
+>> Removed the margin frame components used for implementing a margin
+ between the listbox and scrollbars. This is now accomplished via
+ the grid by maintaining an empty row/column for the margin and
+ adjusting its minsize.
+
+>> POSSIBLE INCOMPATIBILITY - Removed -items option. This was originally
+ put in as a convienence, but it turns out to be quite costly in terms
+ of performance. It had to go. The insert/delete/get commands can be
+ used instead which is much more in line with Tk.
+
+>> Updated the test script, demo, and man page.
+
+
+Entryfield
+______________________________________________________________________________
+
+>> Reimplemented geometry management using the grid instead of the packer.
+
+>> Modified the real type validation to except exponents. Patch provided
+ by evans@engineous.com (Rick Evans).
+
+>> The -state option changes the label to disabledforeground when the
+ entryfield is disabled.
+
+>> Changed component option basis to be that of the "usuals".
+
+>> Added a -pasting configuration option to allow user to enable/disable
+ pasting into the entry component of the entryfield. csmith@adc.com
+ (Chad Smith)
+
+>> Removed hardcoded state comparisons in the _keyPress method and replaced
+ with code to mask out <Ctrl> and <Alt> keypress events. csmith@adc.com
+ (Chad Smith)
+
+
+Pushbutton
+______________________________________________________________________________
+
+>> Changed component option basis to be that of the "usuals".
+
+>> POSSIBLE INCOMPATABILITY - The pushButton component has been changed
+ to pushbutton.
+
+>> POSSIBLE INCOMPATABILITY - The following options have been removed
+ and are not directly available in the pushbutton anymore:
+ -anchor -justify -textvariable
+
+ The underlying button component still maintains them , but not the
+ pushbutton itself. You can still set them via the component
+ command, i.e. ".pb component pushButton configure -justify left"
+
+
+Buttonbox
+______________________________________________________________________________
+
+>> Changed component option basis to be that of the "usuals".
+
+
+Shell
+______________________________________________________________________________
+
+>> Changed component option basis to be that of the "usuals".
+
+>> Added a -width and -height option. A value of zero causes the width
+ and/or height to be adjusted to the required value based on the size
+ requests of the components placed in the childsite. Otherwise, the
+ width and/or height is fixed. The default is zero.
+
+>> Added -width and -height tests to the test script and updated the
+ man page.
+
+>> The activate method no longer returns an error if it is called when
+ the shell is already active. Instead, the shell is just raised.
+
+
+Dialogshell
+______________________________________________________________________________
+
+>> Reimplemented geometry management using the grid instead of the packer.
+
+>> Changed component option basis to be that of the "usuals".
+
+>> Updated the test script and man page, adding the -width and -height
+ options that are inherited from the shell.
+
+
+Dialog
+______________________________________________________________________________
+
+>> Updated the test script and man page, adding the -width and -height
+ options that are inherited from the shell.
+
+
+Selectionbox
+______________________________________________________________________________
+
+>> Reimplemented geometry management using the grid instead of the packer.
+
+>> Changed component option basis to be that of the "usuals".
+
+>> Modified the insert and delete methods to use the items insert and
+ delete method rather than configuring the -items option which has
+ been removed from the underlying scrolledlistbox.
+
+>> Removed the margin frame component used for implementing a margin
+ between the items and selection. This is now accomplished via
+ the grid by maintaining an empty row for the margin and adjusting
+ its minsize.
+
+>> Removed the unecessary frame that was used to contrain the width
+ and height of the widget. This is now performed directly on the
+ widget hull.
+
+>> POSSIBLE INCOMPATABILITY - The following options have been removed
+ and are not directly available in the selectionbox anymore:
+ -hscrollmode -itemslabelpos -labelmargin -margin -relief
+ -sbwidth -scrollmargin -selectionlabelpos -vscrollmode
+
+ The underlying components still maintain them, but not the
+ selectionbox itself. You can still set them via the component
+ command, i.e. ".sb component selection configure -labelpos nw" or
+ ".sb component items configure -hscrollmode static"
+
+>> Added a -width and -height option. A value of zero causes the width
+ and/or height to be adjusted to the required value based on the size
+ requests of the components placed in the childsite. Otherwise, the
+ width and/or height is fixed. The default is zero.
+
+>> Updated the test script, demo, and man page.
+
+
+Selectiondialog
+______________________________________________________________________________
+
+>> Pack propagation is now handled by the shell class.
+
+>> Modified the insert and delete methods to use the insert and
+ delete method rather than configuring the -items option which has
+ been removed from the underlying scrolledlistbox.
+
+>> Changed component option basis to be that of the "usuals".
+
+>> POSSIBLE INCOMPATABILITY - The "sb" component has been renamed to be
+ "selectionbox". This is much more descriptive.
+
+>> POSSIBLE INCOMPATABILITY - The following options have been removed
+ and are not directly available in the selectiondialog anymore:
+ -hscrollmode -itemslabelpos -labelmargin -margin -relief
+ -sbwidth -scrollmargin -selectionlabelpos -vscrollmode
+
+ The underlying components still maintain them, but not the
+ selectiondialog itself. You can still set them via the component
+ command, i.e. ".sd component selectionbox configure -margin 10" or
+ ".sd component selectionbox component items configure -hscrollmode static"
+
+>> The -width and -height options are now controlled by the shell class.
+ A value of zero causes the width and/or height to be adjusted to the
+ required value based on the size requests of the components. Otherwise,
+ the width and/or height is fixed. The default is zero.
+
+
+Scrolledtext
+______________________________________________________________________________
+
+>> Derived from the Scrolledwidget class which provides the vertical
+ and horizontal scrollbars along with the options to control their
+ display.
+
+>> Reimplemented geometry management using the grid instead of the packer,
+ eliminating quite a few unneeded frames along the way.
+
+>> Changed component option basis to be that of the "usuals".
+
+>> Removed the margin frame components used for implementing a margin
+ between the text and scrollbars. This is now accomplished via
+ the grid by maintaining an empty row/column for the margin and
+ adjusting its minsize.
+
+>> The -state option changes the label to disabledforeground when the
+ scrolledtext is disabled.
+
+>> Fixed the infinite looping problem which would occur with -wrap set
+ to none, -hscrollmode set to dynamic and a really long line added
+ just out of the view port. As you'd scroll down the horizontal
+ scrollbar bar would start flashing on and off.
+
+>> Added an index argument to the import method so a file can be
+ imported into the text area at positions other than just the end.
+
+>> Updated the test script and man page.
+
+
+Feedback
+______________________________________________________________________________
+
+>> Corrected namspace problem by removing global scope qualifier from
+ class definition as well as method and option bodies. Bug report
+ and patch provided by evans@engineous.com (Rick Evans).
+
+
+Hyperhelp
+______________________________________________________________________________
+
+>> Corrected namspace problem by removing global scope qualifier from
+ class definition as well as method and option bodies. Bug report
+ provided by evans@engineous.com (Rick Evans).
+
+
+Scrolledhtml
+______________________________________________________________________________
+
+>> Corrected namspace problem by removing global scope qualifier from
+ class definition as well as method and option bodies. Bug report
+ provided by evans@engineous.com (Rick Evans).
+
+
+Canvasprintbox
+______________________________________________________________________________
+
+>> Added tcl_platform to list of global variables declared in print
+ method. Bug report provided by evans@engineous.com (Rick Evans).
+
+
+Scrolledcanvas
+______________________________________________________________________________
+
+>> Derived from the Scrolledwidget class which provides the vertical
+ and horizontal scrollbars along with the options to control their
+ display.
+
+>> POSSIBLE INCOMPATIBILITY - The ScrCanvas component has been renamed
+ canvas.
+
+>> The -state option changes the label to disabledforeground when the
+ scrolledcanvas is disabled.
+
+>> Reimplemented geometry management using the grid instead of the packer.
+
+>> Changed component option basis to be that of the "usuals".
+
+>> Removed the margin frame components used for implementing a margin
+ between the canvas and scrollbars. This is now accomplished via
+ the grid by maintaining an empty row/column for the margin and
+ adjusting its minsize.
+
+>> Updated the test script, demo, and man page.
+
+
+Scrolledframe
+______________________________________________________________________________
+
+>> Derived from the Scrolledwidget class which provides the vertical
+ and horizontal scrollbars along with the options to control their
+ display.
+
+>> POSSIBLE INCOMPATIBILITY - The childsite is now a protected component.
+ If you need access to it, use the childsite command.
+
+>> POSSIBLE INCOMPATIBILITY - The scrCanvas component has been renamed
+ canvas and the scrFrame component to sfchildsite.
+
+>> Reimplemented geometry management using the grid instead of the packer.
+
+>> Changed component option basis to be that of the "usuals".
+
+>> Fixed the infinite looping problem which would occur with -hscrollmode
+ set to dynamic and a really long component added just out of the view
+ port. As you'd scroll down the horizontal scrollbar bar would start
+ flashing on and off.
+
+>> Removed the margin frame components used for implementing a margin
+ between the canvas and scrollbars. This is now accomplished via
+ the grid by maintaining an empty row/column for the margin and
+ adjusting its minsize.
+
+>> Updated the test script, demo, and man page.
+
+
+Promptdialog
+______________________________________________________________________________
+
+>> Changed component option basis to be that of the "usuals".
+
+>> POSSIBLE INCOMPATABILITY - Renamed the "ef" component to "prompt".
+
+>> POSSIBLE INCOMPATABILITY - The following options have been removed
+ and are not directly available in the promptdialog anymore:
+ -fixed -justify -labelbitmap -labelimage -labelmargin
+ -state -textvariable -width
+
+ The underlying components still maintain them, but not the
+ promptdialog itself. You can still set them via the component
+ command, i.e. ".pd component prompt configure -labelpos w"
+
+>> Updated the test script, demo, and man page.
+
+
+Messagedialog
+______________________________________________________________________________
+
+>> Changed component option basis to be that of the "usuals".
+
+>> POSSIBLE INCOMPATABILITY - Renamed the "msg" component to "message".
+
+>> POSSIBLE INCOMPATABILITY - The following options have been removed
+ and are not directly available in the messagedialog anymore:
+ -anchor -justify -wraplength
+
+ The underlying components still maintain them, but not the
+ messagedialog itself. You can still set them via the component
+ command, i.e. ".md component message configure -justify left"
+
+>> Reimplemented geometry management using the grid instead of the packer.
+
+>> Updated the test script, demo, and man page.
+
+
+Hierarchy
+______________________________________________________________________________
+
+>> New iwidgets hierarchical data viewer mega-widget which manages a list
+ of nodes that can be expanded or collapsed. Individual nodes can be
+ highlighted. Clicking with the right mouse button on any item brings
+ up a special item menu. Clicking on the background area brings up
+ a different popup menu.
+
+>> Many thanks to Michael McLennan who provided the nucleus of this code.
+
+>> Man page, test script, and demo have been produced.
+
+>> The catalog demo has been updated to include the hierarchy demo.
+
+
+Checkbox
+______________________________________________________________________________
+
+>> New iwidget checkbox mega-widget which manages a group of check
+ buttons quite similar to that of the existing radiobox.
+
+>> Thanks to John Tucker for the contributed code.
+
+>> Man page, test script, and demo have been produced.
+
+>> The catalog demo has been updated to include the checkbox demo.
+
+
+Radiobox
+______________________________________________________________________________
+
+>> Changed component option basis to be that of the "usuals".
+
+>> Changed the base class to be labeledframe.
+
+>> Updated the test script, demo, and man page.
+
+
+Spinner
+______________________________________________________________________________
+
+>> Reimplemented geometry management using the grid instead of the packer.
+
+>> Removed a redundant frame component named "arrowFrame".
+
+>> Removed the use of the option database to set the option values.
+
+
+Spinint
+______________________________________________________________________________
+
+>> Removed the use of the option database to set the option values.
+
+
+Datefield
+______________________________________________________________________________
+
+>> New iwidget. The datefield is a smart date entry field with adjustable
+ built-in intelligence levels. It can be made smart enough not to accept
+ any bad dates or made dumb enough to accept any old thing typed. Since
+ it is derived from the labeledwidget, it also includes an optional label.
+
+>> Man page, test script, and demo have been produced.
+
+>> The catalog demo has been updated to include the datefield demo.
+
+
+Calendar
+______________________________________________________________________________
+
+>> New iwidget. The calendar widget provide for the selection and/or
+ display of dates. It displays a single month at a time. Buttons exist
+ on the top to change the month in effect turning th pages of a calendar.
+ As a page is turned, the dates for the month are modified. Selection
+ of a date visually marks that date. The selected value can be monitored
+ via the -command option or just retrieved using the get method. Methods
+ also exist to select a date and show a particular month.
+
+ The option set allows the calendars appearance to take on many forms.
+ For example, the background of the weekdays and weekends can be
+ independently changed, the starting day of the week can be set to
+ any of the days, the titles and fonts of everything is configurable,
+ and an outline can be displayed around the each day.
+
+>> Many thanks to Michael McLennan who provided me a early copy of his
+ book which gave me the example on which this code is based.
+
+>> Man page, test script, and demo have been produced.
+
+>> The catalog demo has been updated to include the calendar demo.
+
+
+Dateentry
+______________________________________________________________________________
+
+>> New iwidget. Dateentry is a quicken style date entry field with a
+ popup calendar produced by combining the datefield and calendar widgets
+ together. This allows a user to enter the date via the keyboard or by
+ using the mouse by selecting the calendar icon which brings up a popup
+ calendar. Since it is based on both the datefield and calendar, both
+ option sets exists under the same roof in the dateentry.
+
+>> Man page, test script, and demo have been produced.
+
+>> The catalog demo has been updated to include the dateentry demo.
+
+
+Messagebox
+______________________________________________________________________________
+
+>> New iwidget. Implements an information messages area widget with
+ scrollbars. Message types can be user defined and configured. Their
+ options include foreground, background, font, bell, and their display
+ mode of on or off. This allows message types to defined as needed,
+ removed when no longer so, and modified when necessary.
+
+ The number of lines that can be displayed may be limited. When this
+ limit is reached, the oldest line is removed. There is also support
+ for saving the contents to a file, using the standard file selection
+ dialog.
+
+>> Many thanks to Alfredo Jahn who came up with idea and provided me a
+ very stable working version which I extended to support user defined
+ message types.
+
+>> Man page, test script, and demo have been produced.
+
+>> The catalog demo has been updated to include the messagebox demo.
+
+
+Spintime
+______________________________________________________________________________
+
+>> Reimplemented geometry management using the grid instead of the packer.
+
+>> Removed the margin frame component used for implementing a margin
+ between the hour, minute and second components. This is now accomplished
+ via the grid by maintaining an empty row for the margin and adjusting
+ its minsize.
+
+>> POSSIBLE INCOMPATIBILITY - The delete, clear, and insert methods have
+ been removed. Use the show method to set the time.
+
+>> POSSIBLE INCOMPATIBILITY - The get method has been changed such that
+ it returns the time as either a colon separated string or a clock clicks
+ value.
+
+>> Added a show method to be used to set the time. The method takes as
+ an argument either a valid time string, a clock clicks value, or the
+ keyword now.
+
+>> The current time will now appear as the default.
+
+>> Updated the test script, demo, and man page.
+
+
+Spindate
+______________________________________________________________________________
+
+>> Reimplemented geometry management using the grid instead of the packer.
+
+>> Removed the margin frame component used for implementing a margin
+ between the month, day and year components. This is now accomplished
+ via the grid by maintaining an empty row for the margin and adjusting
+ its minsize.
+
+>> Spindate now uses the clock command during the spinning of the date
+ components. Only valid dates are spun now.
+
+>> POSSIBLE INCOMPATIBILITY - Changed the -monthformat option to be
+ string, brief, and full doing away with the optional user specified list.
+
+>> POSSIBLE INCOMPATIBILITY - The delete, clear, and insert methods have
+ been removed. Use the show method to set the date.
+
+>> POSSIBLE INCOMPATIBILITY - The get method has been changed such that
+ it returns the date as either a string or a clock clicks value.
+
+>> Added a show method to be used to set the time. The method takes as
+ an argument either a valid time string, a clock clicks value, or the
+ keyword now.
+
+>> The current date will now appear as the default.
+
+>> Selection and keyboard entry of values has been disabled. The value
+ may only be changed via the spinners which insures correct operation.
+
+>> Updated the test script, demo, and man page..
+
+
+Feedback
+______________________________________________________________________________
+
+>> Reimplemented geometry management using the grid instead of the packer.
+
+>> Made all the itk_components public.
+
+>> Added a trough which appears beneath the feedback widget. It has a
+ -troughcolor option to set its color.
+
+
+Scrolledhtml
+______________________________________________________________________________
+
+>> Added -alink (same as -linkhighlight, but matches html naming) and -update
+ options.
+
+>> Added new tags to come up to html3.2:
+ basefont
+ div
+ font
+ table
+ td
+ th
+ tr
+
+>> Added numbering formats for <li> tag.
+
+>> Fixed to delete images after page is cleared.
+
+>> Fixed to bring anchor points to middle when moving down to a nearby
+ anchor point.
+
+>> Fixes to regular expression matches.
+
+>> Performance enhancements with stack algorithm and regular expression
+ searches.
+
+
+Hyperhelp
+______________________________________________________________________________
+
+>> Added -closecmd and -maxhistory options.
+
+>> Made itk_components public/private (which could conceivably break
+ someone, if they were using a component directly that is now private)
+
+>> Fixed bindings.
+
+
+Toolbar
+______________________________________________________________________________
+
+>> Added a destructor to cancel the possibly pending after command request
+ to display the popup help.
+
+>> Corrected the vertical packing such that items are expanded horizontally.
+
+
+Finddialog
+______________________________________________________________________________
+
+>> New iwidget. Finddialog works in conjunction with a text or
+ scrolledtext widget to provide a means of performing search operations.
+ The user is prompted for a text pattern to be found in the text or
+ scrolledtext widget. The search can be for all occurances, by regular
+ expression, considerate of the case, or backwards.
+
+>> Man page, test script, and demo have been produced.
+
+>> The catalog demo has been updated to include the finddialog demo.
+
+
+Panedwindow
+______________________________________________________________________________
+
+>> Corrected show/hide bug which caused the placement of the sash and
+ separator to be incorrect. If you added a couple of panes and then
+ hid them all of them followed by showing them, the sash distribution
+ was wrong.
+
+>> Corrected a divide by zero problem which occurred when you hid all
+ of the panes.
+
+
+Combobox
+______________________________________________________________________________
+
+>> Mitch Gorman (emrys@net-gate.com) has taken over maintenance of the
+ combobox from John Sigler.
+
+>> Entry completion has been added. Should your typing in the entry
+ field match an item in the list, it is completed for you automatically.
+ This feature is switchable via the -completion option. The default
+ is on.
+
+>> It now utilizes a true button for the arrowBtn component.
+
+>> The -state option has been fixed such that it can be truly disabled.
+
+>> Reimplemented geometry management using the grid instead of the packer.
+
+>> A -grab option has been added to do both local and global grabs
+ of the drop-down listbox.
+
+>> POSSIBLE INCOMPATIBILITY - Removed -items option. This was originally
+ put in as a convienence, but it turns out to be quite costly in terms
+ of performance. It had to go. The insert/delete/get commands can be
+ used instead which is much more in line with Tk.
+
+>> POSSIBLE INCOMPATIBILITY - The following options have been removed:
+ -autoclear and -fliparrow.
+
+>> The combobox now utilizes built-in bitmaps for button glyphs.
+
+>> Removed the margin frame component used for implementing a margin
+ between the entry and arrow button. This is now accomplished via
+ the grid by maintaining an empty column for the margin and adjusting
+ its minsize.
+
+>> List elements are preserved when switching between drop-down and simple
+ styles via the -dropdown option.
+
+>> The functionality of the -state and -editable options have been made
+ completely independent of each other. It can be editable/normal,
+ non-editable/normal, or disabled, and toggling one option will not
+ impact the other option when the first is toggled back
+
+>> Corrected the validation processing in the -unique option.
+
+>> Fixed various error messages returned due to bad arguments, options, etc.
+
+
+Fileselectionbox
+______________________________________________________________________________
+
+>> Reimplemented geometry management using the grid instead of the packer.
+
+>> Changed component option basis to be that of the "usuals".
+
+>> Removed frame components used for margins. This is now accomplished
+ via the grid by maintaining an empty row/column for the margin and
+ setting its minsize.
+
+>> Changed the default value of -nomatchstring to "".
+
+>> The directory and files lists are now shown without the leading
+ directory name. Although this differs from the Motif standard, it
+ keeps the fileselectionbox more in line with the tk_getSaveFile dialog.
+
+>> POSSIBLE INCOMPATIBILITY - The -style option which allowed you to
+ display the fileselectionbox in a "notif" style using comboboxes
+ for the filter and selection and kept the lists in a panedwindow
+ has been removed. A related option, -dirsfraction is also gone.
+
+ This feature caused the fileselectionbox to be much slower during
+ construction than anticipated. If you liked the "notif" style, it
+ exists in a new mega-widget call extfileselectionbox and
+ extfileselectiondialog.
+
+>> POSSIBLE INCOMPATIBILITY - The childsite is now a protected component.
+ If you need access to it, use the childsite command.
+
+>> POSSIBLE INCOMPATABILITY - The following options have been removed
+ and are not directly available in the fileselectionbox anymore:
+
+ -relief -repeatdelay -repeatinterval -labelmargin
+ -hscrollmode -sbwidth -scrollmargin -vscrollmode
+ -dirslabelpos -fileslabelpos -filterlabelpos
+ -selectionimage- selectionlabelpos -filterfocuscommand
+ -selectionfocuscommand -dbldirscommand -dblfilescommand
+
+ The underlying components still maintain them , but not the
+ fileselectionbox itself. You can still set them via the component
+ command, i.e. ".fsb component dirs configure -hscrollmode none"
+
+>> POSSIBLE INCOMPATIBILITY - The -horizmargin and -vertmargin options
+ have been removed. I doubt if anybody other than the most picky
+ of people will be effected.
+
+>> Added new childsite position orientation settings. The new
+ positions are n, s, e, w, top, bottom, and center.
+
+>> Updated the test script and man page.
+
+
+Extfileselectionbox
+______________________________________________________________________________
+
+>> New Iwidget. The extfileselectionbox is basically the "notif" portion
+ of the previous version of the fileselectionbox. It was separated from
+ the fileselectionbox for performance reasons.
+
+>> Created test script, demo and man page.
+
+>> The catalog demo has been updated to include the extfileselectionbox demo.
+
+
+Tabset
+______________________________________________________________________________
+>> Corrected tab display problem which was occurring on HP machines.
+
+ Some additional updates were installed in tab selection and deselection.
+ They will only be invoke should the os be HP-UX. Also, the ability
+ to scroll the tabs via MB2 has been disabled for HPs. Thanks to
+ tilt@designacc.com (Thomas Tempero) for first reporting the problem
+ mikesz@pcs.mot.com (Michael Szilagyi) for sending me the fix which
+ was implemented.
+
+
+Timefield
+______________________________________________________________________________
+
+>> New iwidget. The timefield is a smart time entry field. It verifies
+ user time input prior to its display. Since it is derived from the
+ labeledwidget, it also includes an optional label.
+
+>> Man page, test script, and demo have been produced.
+
+>> The catalog demo has been updated to include the timefield demo.
+
+
+Watch
+______________________________________________________________________________
+
+>> New iwidget. The watch widget displays a simple clock face. Methods
+ exist to set/get the time. The hands can be adjusted via mouse selection
+ with the new setting being retrievable via the get method. It is
+ very configurable. The colors of the hands, face, and marks can all
+ be changed to suit your needs.
+
+>> Many thanks to John Tucker who developed this nice widget.
+
+>> Man page, test script, and demo have been produced.
+
+>> The catalog demo has been updated to include the watch demo.
+
+
+Timeentry
+______________________________________________________________________________
+
+>> New iwidget. Timeentry, like the dateentry, is along the quicken
+ lines as well. It displays a timefield with a watch icon button
+ beside it. Selection of button presents a popup watch which enables
+ you to select the time by dragging the hands about the face. The
+ popup has a close button that removes the popup and sets the timefield
+ to the value previously displayed in the watch. You can also just
+ enter the time directly as you would in the standard timefield.
+
+>> Man page, test script, and demo have been produced.
+
+>> The catalog demo has been updated to include the timeentry demo.
+
+
+==========================================================================
+ -------------------------- iwidgets-2.1.1 ------------------------------
+ -------------------- CHANGES FROM iwidgets-2.1.0 -----------------------
+==========================================================================
+
+ [incr Widgets] version 2.1.1 is compatable with itcl2.1
+
+NEW FEATURES
+------------------------------------------------------------------------------
+>> Added pagecget method to notebook class.
+
+ Patch supplied by Tom Tromey (tromey@cygnus.com).
+
+>> Added buttoncget method to buttonbox class.
+
+ Patch supplied by Tom Tromey (tromey@cygnus.com).
+
+>> Added buttoncget method to dialogshell class.
+
+ Patch supplied by Tom Tromey (tromey@cygnus.com).
+
+>> Added -closecmd option to the hyperhelp mega-widget.
+
+ Previously, closing the hyperhelp widget deleted the object which was
+ deemed to be user hostile. Now, there exists a -closecmd option
+ which defaults to just deactivating the widget. Should you wish to
+ destroy the widget, either do so explictly or modify the -closecmd
+ to do it.
+
+
+BUG FIXES
+------------------------------------------------------------------------------
+>> Corrected selectborderwidth option class name in the toolbar
+
+ The class name was set to SelectBorderWidth rather than BorderWidth.
+ This created problems when attempting to use the toolbar with
+ other widgets like the scrolledcanvas. Bug report by csmith@adc.com
+ (Chad Smith).
+
+>> Allow negative indexes in scrolledlistbox
+
+ Negative indicies are reasonable and valid. Bug report by
+ wfarel@cas.org (Bill Farel).
+
+>> Corrected problem with caps-lock and num-lock in entryfields
+
+ Validation was not being being done if the num-lock or caps-lock
+ keys are down. Bug report by ronnie@r2d2.wink.com (Ronnie Carpio).
+
+>> Corrected problem with special character entry in entryfields
+
+ Upon entry of a special character in the entry field like \ or [
+ an error would be reported: "Error: missing "". The substitutions
+ being performed in iwidgets::Entryfield::_keyPress have been corrected.
+ Bug report and patch provided by ronnie@r2d2.wink.com (Ronnie Carpio).
+
+>> Made the relayout method in pushbutton protected.
+
+ The relayout method in the pushbutton needed to be changed from private
+ to protected so parent classes can have access. Bug discovered by
+ Mario Weilguni <e8732250@student.tuwien.ac.at>
+
+>> Corrected html tag parsing in scrolledhtml mega-widget
+
+ Fixed regular expressions parsing html tags to ignore text in quotes
+ and only examine first attribute in list.
+
+>> Corrected optionmenu insert bug
+
+ The option menu would not allow you to insert an entry beyond the
+ current length of the popup menu. It should just default to using
+ the end in this case.
+
+>> Corrected scrolledtext import method newline insertion problem
+
+ There was a bug in the scrolledtext widget. It always inserted a
+ newline before the text of the file when doing an "import". And it
+ didn't correctly preserve a trailing newline on the file. Reported
+ by Tom Tromey (tromey@cygnus.com)
+
+>> Corrected minor problems in notebook class.
+
+ The index method gave an error if (eg) "select" wass passed but
+ there is no selection. Instead it should return -1 as documented.
+ Changed it to always return -1 in case of error. This makes more
+ sense.
+
+ If there are no items in the notebook, the -scrollcommand should
+ still be run (if it is set). Otherwise, you end up with a
+ scrollbar that looks odd, and when you try to scroll you get
+ errors. Changed it so that it will tell the scrollbar that
+ the entire notebook is being displayed. Reported by Tom Tromey
+ (tromey@cygnus.com)
+
+>> Corrected menubar menucget command to return errors for bad options.
+
+ The command "<menubar> menucget .element" returned something other
+ than an error message. This has been corrected. Reported by Tom
+ Tromey (tromey@cygnus.com)
+
+>> Corrected menubar man page.
+
+ The usage for the menubar menucget command was wrong and has been
+ fixed. Reported by Tom Tromey (tromey@cygnus.com)
+
+
+INCOMPATIBLE CHANGES
+------------------------------------------------------------------------------
+
+
+==========================================================================
+ -------------------------- iwidgets-2.1.0 ------------------------------
+ -------------------- CHANGES FROM iwidgets-2.0.1 -----------------------
+==========================================================================
+
+ [incr Widgets] version 2.1.0 is compatable with itcl2.1
+
+NEW FEATURES
+------------------------------------------------------------------------------
+>> Eliminated unneeded update idletask calls.
+
+ Went through many of the [incr Widgets] and got rid of those update
+ idletask calls that were not really needed. This should speed a few
+ of them up a bit.
+
+>> The hyperhelp mega-widget has been enhanced such that topic items
+ don't need to be in the help directory.
+
+ It's just an added option in specifying topics. To use it, you would
+ replace '-topics {topic1 topic2 topic3}' with
+ '-topics {topic1 {topicname2 filename2} {topic3 filename3}}'. In other
+ words, you only have to change where you want to specify a pathname. If
+ you don't specify a filename, everything works the same.
+
+>> Added a -autoclear option to the combobox.
+
+ The combobox was doing an automatic erasure of the entry field contents
+ upon hitting return. With this option, you can turn that off but it
+ still puts the string in the list.
+
+>> Added a -master option to the shell class.
+
+ The shell made all instances transient with "." as the master. With
+ this option, you can change the master to other toplevels. The default
+ is no master for shells, and "." for all dialogs which are derived from
+ shell.
+
+>> Added a -style option to the fileselectionbox and fileselection dialog.
+
+ Tony Parent did a great job of augmenting the fileselectionbox with
+ a style option that allows you to change the layout from the standard
+ motif look-and-feel to a better than motif layout. This new layout
+ is called notif and features comboboxes for the filter and selection
+ entry fields and a paned window contains the two listboxes allowing
+ you to change the allocation of space for the lists.
+
+>> Removed the center childsite position for the fileselectionbox.
+
+ This is a side effect of the notif change made by Tony Parent. It
+ just isn't easy to have a center position when your in a pane window.
+ It is a small sacrifice for the having an alternate layout of the
+ fileselectionbox.
+
+
+BUG FIXES
+------------------------------------------------------------------------------
+>> The makefile was amended to install the unknown.gif file correctly.
+
+ The hyperhelp and scrolledhtml widgets need an unknown gif file that
+ is used when unable to load an image. The makefile was not properly
+ installing it.
+
+>> The scrolledhtml.n man page was fixed to allow man2html to work.
+
+ The scrolledhtml.n file had a bug which would hang man2html during a
+ "make install-html". The bug affected only the htmling of the file
+ not the man page itself.
+
+
+INCOMPATIBLE CHANGES
+------------------------------------------------------------------------------
+
+
+==========================================================================
+ -------------------------- iwidgets-2.0.1 ------------------------------
+ -------------------- CHANGES FROM iwidgets-2.0.0 -----------------------
+==========================================================================
+
+ [incr Widgets] version 2.0.1 is compatable with itcl2.0
+
+NEW FEATURES
+------------------------------------------------------------------------------
+>> Added extra frame around canvas widget in Scrolledcanvas class
+
+ The borderwidth, relief, and hightlight options have been removed from
+ the canvas widget and placed on the new encompassing frame widget. This
+ fixes the problem with canvas widgets including the border and highlight
+ ring in the clipping region.
+
+>> Added extra frame around text widget in Scrolledtext class
+
+ The borderwidth, relief, and hightlight options have been removed from
+ the text widget and placed on the new encompassing frame widget. This
+ fixes the problem with text widgets including the border and highlight
+ ring in the clipping region.
+
+>> The canvasprintbox stamp supports resizing and default print buttons
+
+ Tako Schotanus updated the canvasprintbox such that the stamp now gets
+ updated whenever the window is resized. Also, he modified the dialog
+ default buttons to be Print, Apply and Cancel. Apply does a refresh and
+ Print does what you'd expect.
+
+>> Added feedback mega-widget to [incr Widgets]
+
+ The feedback widget is a gage for displaying process status. Display
+ is given as a percentage and as a thermometer type bar. Options exist
+ for adding a label and controlling its position.
+
+ Special thanks go to Sam Shen(SLShen@lbl.gov), as this code is based on his
+ feedback.tcl code from tk inspect. The original code is copyright 1995
+ Lawrence Berkeley Laboratory.
+
+>> Added scrolledhtml mega-widget to [incr Widgets]
+
+ The scrolledhtml widget implements a scrollable html text widget through
+ inheritance from scrolledtext. Import reads from an html file, while
+ export still writes plain text. Also provides a render command, to
+ display html text passed in as an argument.
+
+ Special thanks go to Sam Shen(SLShen@lbl.gov), as this code is based on his
+ tkhtml.tcl code from tk inspect. The original code is copyright 1995
+ Lawrence Berkeley Laboratory.
+
+>> Added hyperhelp mega-widget to [incr Widgets]
+
+ The hyperhelp widget implements a help facility using html formatted
+ hypertext files.
+
+ Special thanks go to Sam Shen(SLShen@lbl.gov), as this code is based on his
+ help.tcl code from tk inspect.
+
+>> Added menubar mega-widget to [incr Widgets]
+
+ Actually it was kind-of already an iwidget. It was living in the incoming
+ directory for a time. No one had a complaints about it so now it is
+ a full citizen.
+
+
+BUG FIXES
+------------------------------------------------------------------------------
+>> Corrected spurious quote in toolbar.itk
+
+ Thanks to Tom Tromey for finding this elusive little buglet and sending
+ the patch. Wish all problems were reported in this manner.
+
+>> Corrected problem with dialogs being unable to acquire a grab.
+
+ The dialogshell activate method would generate an error if unable to
+ acquire a grab for application and global modal dialogs. The fix
+ installed adds a catch and a reattempt loop with a delay. In other
+ words, the dialog shell will continuously attempt to acquire the grab
+ with a delay between attempts.
+
+>> Corrected problem with pushbutton not displaying the tab traversal ring.
+
+ The pushbutton would not display the tab traversal ring when the default
+ ring was enabled. This has been corrected.
+
+>> Corrected scrolledlistbox getcurselection method with multiple selectmode.
+
+ If the current scrolledlistbox selectmode is multiple, then the
+ getcurselection method should always return the selected items as
+ a list, regardless of the number of items selected. It used to
+ return a list only if more than one item is selected.
+
+>> Buttonbox wasn't adjusting geometrically following hides if not mapped.
+
+ Bernard Johnson from TI was good enough to find this one. It could
+ be seen by creating a dialog, activating, deactivating, then hiding
+ a button. Next, activate it again and you'd notice that the dialog's
+ buttonbox had not been resized. The problem was that the resizing
+ of the buttonbox was bound to the map event, which once mapped, was
+ removed when it shouldn't have been.
+
+>> Buttonbox wasn't adjusting properly following button additions which
+ were preceeded by deletions.
+
+ Greg McFarlane found this one. The buttonbox needed to do perform
+ and update idletasks following the sizing of the box during a deletion.
+ Otherwise, the values returned by winfo were incorrect during a
+ subsequent button addition.
+
+>> Removed underlining of listbox items in the combobox.
+
+ Milind Khandekar requested that this feature be removed. It was
+ annoying.
+
+
+INCOMPATIBLE CHANGES
+------------------------------------------------------------------------------
+
+
+==========================================================================
+ -------------------------- iwidgets-2.0.0 ------------------------------
+ -------------------- CHANGES FROM iwidgets-2.0b4 -----------------------
+==========================================================================
+
+ [incr Widgets] version 2.0.0 is compatable with itcl2.0
+
+NEW FEATURES
+------------------------------------------------------------------------------
+>> The copyright has been assigned to DSC Communications Corporation.
+
+ The copyright has been transferred from private individuals to DSC.
+ It is still an open copyright, just changes in the legalize wording.
+
+>> Added several new mega-widgets.
+
+ The new mega-widgets include the toolbar, tabnotebook, tabset, and
+ notebook. Check the man pages for details.
+
+>> Added demo catalog.
+
+ The demos directory now contains a catalog program. It displays the
+ code for each demo upon single select. Double-click starts the demo.
+
+>> Added incoming directory for experimental mega-widgets.
+
+ An incoming directory exists in the distribution which contains beta
+ state mega-widgets. They are not installed, but do include the needed
+ doc, demos, and tests. These mega-widgets may or may not make the cut.
+ Please send feedback on their viability. If enough positive response
+ is felt, then they will be moved up. Otherwise, I'll move them to an
+ outgoing directory and later delete them altogether.
+
+>> With the introduction of the new itcl-2.0b3 code command, the following
+ changes were required.
+
+ All "bind" and "after" commands now use "code".
+
+ All "-command" options and scrollbar commands now use "code".
+
+ Removed "uplevel /scope" combinations from command type options.
+
+ Replaced "eval" with "uplevel #0" for evaluation of command options.
+
+>> Added curselection method to selectionbox and selectiondialog class.
+
+ The curselection command from the contained listbox of the selectionbox
+ has been thinwrapped.
+
+>> Removed BLT dependency for implementing application modal dialogs.
+
+ The dialogshell class no longer uses blt_busy for application modal
+ dialogs. Instead, local grabs are performed. The benefits are speed
+ and extension independence. Minus is the loss of the watch cursor
+ which blt_busy used. I figure, programmers wanting the cursor action
+ can implement it themselves on an as needed basis.
+
+>> Added a grab stack in the dialogshell.
+
+ The dialogshell uses a grabstack to keep track of the current blocking
+ levels. Thus a application modal dialog can activate another one and
+ upon closing the last one, the next one in the stack gets the block.
+ This feature did not exist before.
+
+>> Replace "after 1" commands with "after idle"
+
+ This produces the same result, but makes for a cleaner syntax.
+
+>> Added center command to the dialogshell.
+
+ The dialogshell provides a center command which takes an optional argument
+ of the path for another widget. Upon activation, the dialogshell will
+ be centered with respect to it. The command may also be invoked with
+ no arguments to center the dialogshell on the screen as a whole. Since
+ all other dialog classes are derived from dialogshell, all dialogs now
+ have the center command available.
+
+>> Made the Help button hidden by default for dialogs
+
+ Most people turn it off right away anyway. It is still there. Just need
+ to do a "show Help" if you need it back.
+
+>> Comboxbox now derived from entryfield.
+
+ The combobox structure has been modified to be derived from the entryfield
+ class. Now combobox labels can be aligned using the labeledwidget
+ alignlabels method along with optionmenus, entryfields and such.
+
+>> Added -justify and -wraplength to Messagedialog.
+
+ The justify and wraplength options are now kept for the label in the
+ messagedialog widget.
+
+>> Added a man page generator for itcl.
+
+ In the doc directory is a new utility called mkitclman. It does a good
+ job at an initial pass of man page generation for new iwidget classes.
+ You still need to get in there and beef up the man page which is produced,
+ but it is better than starting from scratch.
+
+>> Added the canvasprintbox and canvasprintdialog mega-widgets.
+
+ Two new mega-widgets, canvasprintbox and canvasprintdialog, have been
+ contributed to [incr Widgets]. Thanks to Tako Schotanus,
+ Tako.Schotanus@bouw.tno.nl.
+
+>> Added the textbackground option to the scrolledcanvas widget
+
+ The textbackground option has been added to the scrolledcanvas widget
+ similarly to the scrolledlistbox and entryfield widgets.
+
+
+BUG FIXES
+------------------------------------------------------------------------------
+>> Enabled repeat action in spinners.
+
+ This was available in iwidgets two versions ago. I made in incorrect
+ merge and lost the change. It has now been added back into the spinner.
+
+>> Eliminated use of #auto in panedwindow.
+
+ Using #auto made the test script fail should you run it two times in a
+ row. Instead, the class keeps its own unique counter which is always
+ reset upon construction. This was more of an annoyance than a bug.
+
+>> Corrected selection problem in selectiondialog.
+
+ The selectiondialog wasn't configuring the itemscommand properly, so
+ selection of an item was not reflected in the selection entryfield.
+
+>> Corrected index usage problem in buttonbox insert method.
+
+ The buttonbox insert method didn't correctly convert the index argument
+ prior to inserting the new pushbutton. This has been fixed.
+
+>> Corrected flicker problem in scrolled* widgets.
+
+ Modified the scrolled* widgets to only change the current scrollbar
+ display if different than the current setting. This fixes the flicker
+ problem which was apparent during horizontal scrolling.
+
+>> Entryfield command option performs a break.
+
+ Following evaluation of the command option for entryfield widgets, a
+ break is performed. This caused a problem when entryfields were in
+ a dialog. Hitting return in the entryfield, invoked the dialogs
+ default button. This has been fixed.
+
+
+INCOMPATIBLE CHANGES
+------------------------------------------------------------------------------
+>> Removed -highlightbackground option from mega-widgets
+
+ All the -highlightbackground options have been renamed to be -background.
+ This was always an annoyance anyway. Now, setting the -background changes
+ all the highlightbackgrounds as well. Should anybody still for some odd
+ reason need -highlightbackground, just access the component with the
+ "component name configure" command.
+
+
+==========================================================================
+ -------------------------- iwidgets-2.0b0 ------------------------------
+ -------------------- CHANGES FROM iwidgets-2.0b1 -----------------------
+==========================================================================
+
+ [incr Widgets] versions b1, b2, b3, and b4 are compatable with itcl-2.0b2
+
+NEW FEATURES
+------------------------------------------------------------------------------
+
+>> A secondary lower case mega-widget command now exits.
+
+ Mega-widgets can now be created using the new lower case, more tk'ish
+ method or still using the class name.
+
+ Entryfield .ef and entryfield .ef
+
+ both perform the same operation.
+
+>> The demos should now all work.
+
+ The correct wish is now called. itkwish instead of the old itcl_wish.
+
+>> The man pages have all been updated to the best of my ability.
+
+>> A new more minimal format for the code style has been implemented.
+
+ The class declaration only contains declarations. All implementation is
+ spearate. This creates a much more readable class.
+
+>> All class file names as well as the tests, doc, and demos are all lower
+ case.
+
+>> Several new validate types such as hexidecimal and real have been added
+ to the Entryfield.
+
+>> The Panedwindow class additional commands:
+
+ A paneconfigure command exists for configuring indiviual tagged panes.
+
+ panedwindow .pw
+ .pw add first
+ .pw add last
+ .pw paneconfigure first -margin 10
+
+ An insert command exists. It takes an index and tag as arguments followed
+ by optional arguments to be applied to the pane.
+
+ .pw insert end second -minimum 20
+
+>> The Buttonbox class now has additional commands:
+
+ A buttonconfigure command exists for configuring indiviual tagged buttons.
+
+ buttonbox .bb
+ .bb add OK -text OK
+ .bb add Cancel -text Cancel
+ .bb buttonconfigure OK -command [list puts OK]
+
+ An insert command has been added. It takes an index as the first arg,
+ followed by the tag and button arguments.
+
+ .bb insert Cancel Apply -text Apply
+
+ The invoke command no long excepts a list of buttons to invoke. That
+ didn't make much sense. It takes an optional index for a single button
+ to invoke. Without any arguments, the default button is invoked.
+
+BUG FIXES
+------------------------------------------------------------------------------
+
+>> Corrected scrolled* packing
+
+ The packing order of all the scrolled* mega-widgets has been modified
+ such that the scrollbars are the last to be clipped.
+
+>> Corrected buttonbox single button centering
+
+ The buttonbox has been modified such that a box with only one button
+ will be correctly centered.
+
+>> scrolledlist selection corrected
+
+ The -selectioncommand is now invoked following any selection of an item,
+ regardless if it was already selected. The programmer must now determine
+ if the selected item has changed if necessary. The previous approach of
+ only invoking the -selectioncommand if the selection has changed caused
+ too many problems, making it behave erraticly.
+
+>> Corrected problems preventing classes being derived from scrolled* classes
+
+ Several variables were incorrectly declared to be private rather than
+ protected. Also, the _scroll* method was incorrectly declared private
+ instead of protected. These problems prevented inheritance from the
+ scrolled* classes.
+
+
+INCOMPATIBLE CHANGES
+------------------------------------------------------------------------------
+
+>> The class names are now upper case on the first character only.
+
+ Class names have been changed to be upper case on the first character
+ only to be more X'ish. Old class names like EntryField are now Entryfield.
+
+>> All public methods are now all lowercase.
+
+ This effects the typical common method such as childsite. Others effected
+ include :
+
+ ::iwidgets::Labeledwidget::alignlabels
+
+>> Labeledwidget class changes:
+
+ The -labelon option has been removed. The mega-widget now unpacks both
+ the label and margin if neither the -labeltext, -labelbitmap, or
+ -labeimage have a value.
+
+ The -font option has been removed. The -labelfont option should be used
+ instead.
+
+>> Entryfield class changes:
+
+ The -labelon option is not inherited by the Entryfield anymore. See the
+ Labeledwidget changes above.
+
+ The Entryfield fixed option has a different meaning. It now specified
+ the maximum number of characters allowed. A value of zero is unlimited.
+ This frees up the width option to be able to specify a greater number
+ of characters than the fixed amount for visual effect.
+
+ The -type and -validate options have been combined to just -validate
+ which now takes either a type keyword or a command. The command receives
+ additional trailing arguments consisting of the input character and the
+ the widget. I hope to change this soon to use substitutions like %c
+ for the character at a later date.
+
+ The -background option has been removed. The -textbackground option
+ should be used instead.
+
+ The -validate option now has several substitution strings which may be
+ passed to the validation script.
+
+>> ScrollBar class changes:
+
+ It has been deleted. It wasn't a big win. The only benefit was that the
+ -background option automatically calculated the troughcolor at 80% of
+ its value. It's just as easy to use the option database and change the
+ Tk scrollbar troughcolor to whatever value is desired. The various
+ scrolled* classes now all use the straight Tk scrollbar.
+
+>> Panedwindow class changes:
+
+ Panes are now tagged. This means the add, and insert methods take an
+ additional argument which is the tag for that pane.
+
+ The panedwindow index method now takes the tag as well as the number and
+ keyword "end". Other methods such as delete, hide, and show now can use
+ the pane tag as an index.
+
+ panedwindow .pw
+ .pw add bottom
+ .pw insert 0 top
+ .pw insert 1 middle
+ .pw delete middle
+
+ The refresh method has been renamed to reset.
+
+ The semi-private -state option has been removed. The only method of
+ controlling the display of panes is via the hide and show methods.
+
+>> Dialogshell class changes:
+
+ The modality option value of "system" has been renamed to be "global"
+
+>> Dialog class changes:
+
+ All the options for the buttons have been removed. The buttonconfigure
+ method should be used instead. The class simply creates the standard
+ OK, Apply, Cancel, and Help buttons tagged by their default labels.
+ The buttonconfigure method can be used to make modifications to the
+ buttons. The hide and show methods should now be used instead of the
+ the -disp* options.
+
+ dialog .d
+ .d buttonconfigure OK -text Enter
+ .d hide Help
+ .d hide Apply
+
+ The -orient option is no longer kept. It seemed rarely used if at all.
+ The -buttonboxpos option handles the mojority of the cases as is.
+
+>> Scrolledcanvas class changes:
+
+ The binditem method is now been renamed back to bind. This is what it
+ should have been all along. A problem in the alpha version of [incr Tcl]
+ prevented use of this word.
+
diff --git a/iwidgets/ChangeLog b/iwidgets/ChangeLog
new file mode 100644
index 00000000000..76b8dcada32
--- /dev/null
+++ b/iwidgets/ChangeLog
@@ -0,0 +1,1498 @@
+=-=-=-=-=-=-=-=-=-=-= BEGIN IWIDGETS 4.0.1 CHANGES =-=-=-=-=-=-=-=-=-=-=-
+2002-09-09 Chad Smith <csmith@adc.com>
+ * Makefile.in: SF ticket 227921
+ Updated man page installation such that "iwidgets_" is now
+ prepended to the man page filename. This is done to avoid
+ naming conflicts with man pages in other extensions.
+
+2002-09-09 Chad Smith <csmith@adc.com>
+ * generic/scrolledtext.itk
+ * doc/scrolledtext.n
+ * doc/scrolledhtml.n
+ * demos/html/scrolledtext.n.html
+ * demos/html/scrolledhtml.n.html
+ * tests/scrolledtext.test
+ * tests/scrolledhtml.test
+ SF ticket 532602: added -tabs to scrolledtext (and
+ scrolledhtml due to inheritance)
+
+2002-09-08 Marty Backe <marty@lucidway.org>
+ * generic/combobox.itk
+ Fixed SF bug 501300 - keyboard navigation was not working
+ properly if any items were null
+
+2002-09-06 Chad Smith <csmith@adc.com>
+ * generic/hierarchy.itk: SF ticket 596111
+ After reconfiguring -querycommand, the text component
+ lost its tag configuration. Added code to reset
+ the hilite, lowlite, and info tags.
+
+2002-09-05 Chad Smith <csmith@adc.com>
+ * generic/hierarchy.itk: SF ticket 600941
+ Marked node lost its highlighting when parent folder
+ closed and reopened
+
+2002-09-05 Chad Smith <csmith@adc.com>
+ * generic/canvasprintbox.itk: SF ticket 560153
+ Wouldn't print to a filename other than "canvas.ps".
+
+2002-09-05 Chad Smith <csmith@adc.com>
+ * generic/tabnotebook.itk: SF ticket 514222
+ Patch added for infinite loop problem introduced by
+ new -padx and -pady Tk frame widget options in 8.4
+
+2002-09-05 Chad Smith <csmith@adc.com>
+ * generic/tabnotebook.itk: SF ticket 603823
+ Patch for bugs related to the -int option
+ * generic/calendar.itk: SF ticket 603823
+ Found bug while testing the dateentry patch. Several
+ methods expected -int to be set to "yes" or "no"
+
+2002-03-24 Marty Backe <mgbacke@usa.net>
+ * generic/disjointlistbox.itk
+ Applied patch sumitted by Brett Schwarz to add two new sort
+ options which determine how items are added to each
+ scrolledlistbox. Did some various code formatting cleanup.
+ * doc/disjointlistbox.n
+ Updated the man page to reflect the addition of the two
+ sort options.
+ * demos/html/disjointlistbox.n.html
+ Updated the html version of the man page
+ * tests/disjointlistbox.test
+ Added tests for the the two new options.
+
+2002-03-19 Marty Backe <mgbacke@usa.net>
+ * generic/messagebox.itk
+ Modified the save method to center the tk_getSaveFile dialog
+ on the messagebox window.
+
+2002-03-16 Marty Backe <mgbacke@usa.net>
+ * generic/scrolledlistbox.itk: SF Patch 494696
+ Applied patch submitted by Brett Schwarz to change the sort
+ method to accept any sort arguments allowed by Tcl's lsort.
+ Modified patch to generate an appropriate error message if an
+ invalid sort argument is provided.
+ * doc/scrolledlistbox.n
+ Updated the man page to reflect the new sort arguments.
+ * demos/html/scrolledlistbox.n.html
+ Updated per change to doc/scrolledlistbox.n
+ * tests/scrolledlistbox.test
+ Updated the 'fail test' to reflect the new error message generated
+ by an invalid sort argument.
+ * tests/combobox.test
+ Updated the sort 'failed test' to reflect the new error message
+ generated by an invalid sort argument. Fallout from patch to
+ scrolledlistbox.itk. See above.
+
+2002-03-15 Marty Backe <mgbacke@usa.net>
+ * generic/messagebox.itk
+ Fixed a couple of bugs relating to the popup menu 'Save' function:
+ 1) The filename that was saved to was also echoed to the
+ messagebox. Unfortunately the variable referenced was not
+ valid, so a stack trace followed any Save operation.
+ 2) The message 'issued' to the messagebox from item 1) above
+ used the tag INFO, which doesn't exist by default.
+
+ I choose to remove the 'issue' after a file Save. The widget
+ really shouldn't contribute anything to the messagebox output.
+ The user of the messagebox iwidget should have control over
+ what gets displayed.
+
+ Changed the 'export' method to directly use the scrolledtext
+ 'export' method instead of re-implementing it within this widget.
+
+ Rearranged the layout of the popup menu. Moved the 'Clear' menu
+ to the end of the list. It was too easy to generate the popup and
+ accidentally choose the 'Clear' function.
+
+ * generic/hyperhelp.itk
+ Removed the 'error' statement that would cause any application that
+ used Hyperhelp to stacktrace if a file to be rendered couldn't be
+ opened. It's now just a silent error. Perhaps a -errorcommand option
+ could be added later.
+
+2002-03-10 Marty Backe <mgbacke@usa.net>
+ * generic/extfileselectionbox.itk: SF ticket 482080
+ Fixed SF ticket 482080 - wrapped _pwd in quotes
+ Fixed newly discovered bug:
+ When the current directory contains a directory named after
+ a punctuation mark (e.g., ! '). Method _setDirList was always
+ setting the Dir listbox selection to index 0, which is normally
+ ".", unless the directory contains a directory named
+ after a punctuation mark. Now it gets set to "." regardless.
+
+2002-02-26 Marty Backe <mgbacke@usa.net>
+ * generic/radiobox.itk: SF ticket 521332
+ Fixed various bugs:
+ 1) Traces weren't being released when the object was destroyed.
+ 2) Small memory leak - _modes($this) array element not deleted
+ when the object was destroyed.
+ 3) If the -command option was defined, the command would be
+ triggered when the first radiobutton was added via the add
+ method.
+ Added a destructor to fix bugs 1 & 2. Modified the constructor to
+ fix bug 3.
+ * generic/extfileselectiondialog.itk: SF ticket 521335
+ Added the -sashcursor option (was already defined in the man page,
+ but wasn't implemented).
+ * tests/radiobox.test:
+ Added test to check for bug number 3 above.
+ * tests/extfileselectiondialog.test:
+ Added 2 option tests for -sashcursor & -labelfont. Updated the
+ option count test.
+
+2002-02-24 Marty Backe <mgbacke@usa.net>
+ * generic/datefield.itk
+ Fixed bugs introduced in previous patch - unbraced 'if' conditionals
+ * generic/tabset.itk
+ Fixed bug introduced in previous patch - 'code' used instead
+ of 'itcl::code'.
+ * generic/shell.itk: SF ticket 521338
+ The 'center' method now properly centers windows that have been
+ resized between calls to center.
+ * generic/scrolledlistbox.ikt: SF ticket 521326
+ The <B1-Motion> binding was removed to eliminate multiple triggers
+ of the command specified by the -selectioncommand option if the
+ mouse is moved while the item is being selected.
+
+2002-02-16 Marty Backe <mgbacke@usa.net>
+ * generic/scrolledhtml.itk: SF ticket 481956
+ Fixed potential for lengthy page renderings to throw a bgerror.
+
+2001-12-11 Chad Smith <csmith@adc.com>
+ * generic/combobox.itk: SF ticket 474817
+ Fixed an auto-completion problem.
+
+2001-12-07 Chad Smith <csmith@adc.com>
+ * generic/tabset.itk:
+ Added patch submitted by Reinhard Max to optimize tab addition.
+
+2001-11-29 Chad Smith <csmith@adc.com>
+ * configure.in:
+ * Makefile.in: SF tickets 462528 and 486735
+ Removed a lot of unnecessary variables. Updated configure.in
+ so that autoconf-generated version matches the configure script
+ that is included (thanks Andreas). Removed --with-itk and
+ changed --with-itcl to be required if Iwidgets is not
+ installed direcly underneath toplevel Itcl directory.
+
+2001-09-20 Chad Smith <csmith@adc.com>
+ * generic/shell.itk: SF ticket 227885
+ Added an 'update idletasks' to flush the event loop after
+ activating a shell iwidgets.
+
+2001-09-18 Chad Smith <csmith@adc.com>
+ * generic/radiobox.itk: SF ticket 227923
+ Added code to keep users from modifying -variable and -value
+ radiobutton component options.
+
+2001-09-17 Chad Smith <csmith@adc.com>
+ * generic/entryfield.itk: SF ticket 227912
+ Corrected some pasting problems.
+
+2001-09-14 Chad Smith <csmith@adc.com>
+ * generic/tabset.itk: SF ticket 460879
+ Commented out a line of code to keep the tab from forcing
+ focus on the hull frame on <Enter>.
+
+2001-09-14 Chad Smith <csmith@adc.com>
+ * generic/tabnotebook.itk: SF tickets 452803 and 461471
+ Had to do an "undo" of some previous code that was causing an
+ infinite resizing on <Configure> events.
+
+=-=-=-=-=-=-=-=-=-=-= END IWIDGETS 4.0.1 CHANGES =-=-=-=-=-=-=-=-=-=-=-=-
+
+2001-08-07 Chad Smith <csmith@adc.com>
+ * Merged iwidgets_overhaul branch to CVS head. This branch
+ included all modifications necessary to extract the iwidgets
+ from the itcl distribution.
+
+2001-07-17 Jeff Hobbs <jeffh@ActiveState.com>
+ * Makefile.in: removed attempt to install $(GENERIC_DIR)/*.tcl
+ from install-libraries target as there aren't any .tcl files there
+ since the removal of generic/scopedobject.tcl. This was resulting
+ in an error on install.
+
+2001-05-24 davygrvy
+ * ChangeLog (added):
+ Auto gen'd this from output of `cvs log`. This will help us
+ make a nice quality digest of the changes done for a release.
+
+2001-05-23 davygrvy
+ * .cvsignore:
+ * configure:
+ * configure.in:
+ Updated patch level to 3.0.2 in prep for a release.
+
+2001-05-22 davygrvy
+ * win/iwidgets.tcl:
+ * win/makefile.vc:
+ * win/pkg.vc:
+ makefile.vc actually works again.
+
+ * win/pkgIndex.tcl:
+ we'll auto gen these from the makefile
+
+ * win/makefile.vc:
+ got catalog.tcl installing
+
+2001-05-21 davygrvy
+ * demos/demo.html:
+ Moved change on the old iwidget3.0.0 to the new repository tree
+ for Iwidgets
+
+2001-05-19 davygrvy
+ * generic/menubar.itk:
+ * generic/tabnotebook.itk:
+ Moved Chad's changes to the new repository files from the old
+ iwidgets3.0.0
+
+2001-05-18 davygrvy
+ * generic/scopedobject.tcl:
+ removed due to copy
+
+2001-04-25 davygrvy
+ * generic/colors.itk:
+ * win/catalog.bat:
+ * win/makefile.bc:
+ * win/tclIndex:
+ cleaning of prior 2.2.0 import to match the correct HEAD
+
+ * CHANGES:
+ * Makefile.in:
+ * README:
+ * aclocal.m4:
+ * configure:
+ * configure.in:
+ * demos/buttonbox:
+ * demos/canvasprintdialog:
+ * demos/catalog:
+ * demos/combobox:
+ * demos/demo.html:
+ * demos/dialog:
+ * demos/dialogshell:
+ * demos/entryfield:
+ * demos/feedback:
+ * demos/fileselectionbox:
+ * demos/fileselectiondialog:
+ * demos/html/buttonbox.n.html:
+ * demos/html/canvasprintbox.n.html:
+ * demos/html/canvasprintdialog.n.html:
+ * demos/html/combobox.n.html:
+ * demos/html/dialog.n.html:
+ * demos/html/dialogshell.n.html:
+ * demos/html/entryfield.n.html:
+ * demos/html/feedback.n.html:
+ * demos/html/fileselectionbox.n.html:
+ * demos/html/fileselectiondialog.n.html:
+ * demos/html/hyperhelp.n.html:
+ * demos/html/iwidgets2.2.0UserCmds.html:
+ * demos/html/labeledwidget.n.html:
+ * demos/html/menubar.n.html:
+ * demos/html/messagedialog.n.html:
+ * demos/html/notebook.n.html:
+ * demos/html/optionmenu.n.html:
+ * demos/html/panedwindow.n.html:
+ * demos/html/promptdialog.n.html:
+ * demos/html/pushbutton.n.html:
+ * demos/html/radiobox.n.html:
+ * demos/html/scrolledcanvas.n.html:
+ * demos/html/scrolledframe.n.html:
+ * demos/html/scrolledhtml.n.html:
+ * demos/html/scrolledlistbox.n.html:
+ * demos/html/scrolledtext.n.html:
+ * demos/html/selectionbox.n.html:
+ * demos/html/selectiondialog.n.html:
+ * demos/html/shell.n.html:
+ * demos/html/spindate.n.html:
+ * demos/html/spinint.n.html:
+ * demos/html/spinner.n.html:
+ * demos/html/spintime.n.html:
+ * demos/html/tabnotebook.n.html:
+ * demos/html/tabset.n.html:
+ * demos/html/toolbar.n.html:
+ * demos/hyperhelp:
+ * demos/images/mag.gif:
+ * demos/images/poly.gif:
+ * demos/images/ruler.gif:
+ * demos/images/select.gif:
+ * demos/iwidgets.gif:
+ * demos/labeledwidget:
+ * demos/menubar:
+ * demos/messagedialog:
+ * demos/notebook:
+ * demos/optionmenu:
+ * demos/panedwindow:
+ * demos/promptdialog:
+ * demos/pushbutton:
+ * demos/radiobox:
+ * demos/scrolledcanvas:
+ * demos/scrolledframe:
+ * demos/scrolledhtml:
+ * demos/scrolledlistbox:
+ * demos/scrolledtext:
+ * demos/selectionbox:
+ * demos/selectiondialog:
+ * demos/spindate:
+ * demos/spinint:
+ * demos/spinner:
+ * demos/spintime:
+ * demos/tabnotebook:
+ * demos/tabset:
+ * demos/toolbar:
+ * doc/buttonbox.n:
+ * doc/canvasprintbox.n:
+ * doc/canvasprintdialog.n:
+ * doc/combobox.n:
+ * doc/dialog.n:
+ * doc/dialogshell.n:
+ * doc/entryfield.n:
+ * doc/feedback.n:
+ * doc/fileselectionbox.n:
+ * doc/fileselectiondialog.n:
+ * doc/hyperhelp.n:
+ * doc/iwidgets.ps:
+ * doc/labeledwidget.n:
+ * doc/man.macros:
+ * doc/menubar.n:
+ * doc/messagedialog.n:
+ * doc/mkitclman:
+ * doc/notebook.n:
+ * doc/optionmenu.n:
+ * doc/panedwindow.n:
+ * doc/promptdialog.n:
+ * doc/pushbutton.n:
+ * doc/radiobox.n:
+ * doc/scrolledcanvas.n:
+ * doc/scrolledframe.n:
+ * doc/scrolledhtml.n:
+ * doc/scrolledlistbox.n:
+ * doc/scrolledtext.n:
+ * doc/selectionbox.n:
+ * doc/selectiondialog.n:
+ * doc/shell.n:
+ * doc/spindate.n:
+ * doc/spinint.n:
+ * doc/spinner.n:
+ * doc/spintime.n:
+ * doc/tabnotebook.n:
+ * doc/tabset.n:
+ * doc/tk2html:
+ * doc/tk2html.awk:
+ * doc/tk2html.perl:
+ * doc/tk2html2.awk:
+ * doc/toolbar.n:
+ * generic/buttonbox.itk:
+ * generic/canvasprintbox.itk:
+ * generic/canvasprintdialog.itk:
+ * generic/colors.itk:
+ * generic/combobox.itk:
+ * generic/dialog.itk:
+ * generic/dialogshell.itk:
+ * generic/entryfield.itk:
+ * generic/feedback.itk:
+ * generic/fileselectionbox.itk:
+ * generic/fileselectiondialog.itk:
+ * generic/hyperhelp.itk:
+ * generic/labeledwidget.itk:
+ * generic/menubar.itk:
+ * generic/messagedialog.itk:
+ * generic/notebook.itk:
+ * generic/optionmenu.itk:
+ * generic/pane.itk:
+ * generic/panedwindow.itk:
+ * generic/promptdialog.itk:
+ * generic/pushbutton.itk:
+ * generic/radiobox.itk:
+ * generic/scrolledcanvas.itk:
+ * generic/scrolledframe.itk:
+ * generic/scrolledhtml.itk:
+ * generic/scrolledlistbox.itk:
+ * generic/scrolledtext.itk:
+ * generic/selectionbox.itk:
+ * generic/selectiondialog.itk:
+ * generic/shell.itk:
+ * generic/spindate.itk:
+ * generic/spinint.itk:
+ * generic/spinner.itk:
+ * generic/spintime.itk:
+ * generic/tabnotebook.itk:
+ * generic/tabset.itk:
+ * generic/tclIndex:
+ * generic/toolbar.itk:
+ * generic/unknownimage.gif:
+ * incoming/README:
+ * incoming/doc/man.macros:
+ * incoming/tests/all:
+ * incoming/tests/defs:
+ * iwidgets.tcl.in:
+ * license.terms:
+ * outgoing/README:
+ * pkgIndex.tcl.in:
+ * tests/all:
+ * tests/all.tcl:
+ * tests/buttonbox.test:
+ * tests/canvasprintbox.test:
+ * tests/canvasprintdialog.test:
+ * tests/combobox.test:
+ * tests/defs:
+ * tests/dialog.test:
+ * tests/dialogshell.test:
+ * tests/entryfield.test:
+ * tests/feedback.test:
+ * tests/fileselectionbox.test:
+ * tests/fileselectiondialog.test:
+ * tests/hyperhelp.html:
+ * tests/hyperhelp.test:
+ * tests/labeledwidget.test:
+ * tests/menubar.test:
+ * tests/messagedialog.test:
+ * tests/notebook.test:
+ * tests/optionmenu.test:
+ * tests/panedwindow.test:
+ * tests/promptdialog.test:
+ * tests/pushbutton.test:
+ * tests/radiobox.test:
+ * tests/scrolledcanvas.test:
+ * tests/scrolledframe.test:
+ * tests/scrolledhtml.test:
+ * tests/scrolledlistbox.test:
+ * tests/scrolledtext.test:
+ * tests/selectionbox.test:
+ * tests/selectiondialog.test:
+ * tests/shell.test:
+ * tests/spindate.test:
+ * tests/spinint.test:
+ * tests/spinner.test:
+ * tests/spintime.test:
+ * tests/tabnotebook.test:
+ * tests/tabset.test:
+ * tests/toolbar.test:
+ * tests/usual.test:
+ * win/catalog.bat:
+ * win/iwidgets.tcl:
+ * win/makefile.bc:
+ * win/makefile.vc:
+ * win/pkgIndex.tcl:
+ * win/tclIndex:
+ import of current 2.2.0
+
+ * win/pkg.vc:
+ moved the info about the iwidget version for makefile.vc
+
+2001-04-04 smithc
+ * generic/menubar.itk:
+ Fixed stack trace that would occur if the programmer attempted to create two menu items with the
+ same command name.
+
+2000-12-19 smithc
+ * generic/combobox.itk:
+ Fixed 3 bugs:
+
+ 1) bug with -state config option
+ 2) added some performance enhancements
+ 3) added code to restore grabs following dropdown listbox unmap
+
+2000-12-06 smithc
+ * generic/hierarchy.itk:
+ Added patches submitted by Martin Backe on 12/5/00. One was for a memory leak in
+ the clear() method, and the other was to correct %n substitution in the _select()
+ method.
+
+ * doc/hierarchy.n:
+ Added -selectcommand to the man page.
+
+2000-08-25 csmith
+ * generic/scrolledlistbox.itk:
+ Patch submitted by Shaun Lowry - I don't know the ticket number, but here's
+ part of the ticket description:
+
+ Name: Shaun Lowry
+ email: slowry@iss.net
+ Support: Gold
+ Severity: 2
+ OperatingSystem: Windows NT
+ OperatingSystemVersion: NT4 SP6
+ Machine: Beige :-) (home built PC)
+ Synopsis: scrolledlistbox "pattern" based selection doesn't work properly
+
+ ReproducibleScript:
+ package require Iwidgets
+ iwidgets::scrolledlistbox .f
+ .f insert end "friendly"
+ .f insert end "hostile"
+ .f get host*
+ .f get friend*
+
+2000-08-22 welch
+ * configure:
+ * configure.in:
+ Bumped version number to 3.0.1 (PARTS LIST NOTICE)
+
+ * generic/scrolledlistbox.itk:
+ Added catch around -listvariable option so this can be used
+ with older versions of Tk that do not have this option on listboxes.
+
+2000-08-17 csmith
+ * generic/timeentry.itk:
+ Same problem as dateentry. See documentation for dateentry version 1.2 in
+ CVS. I don't have a ticket number.
+
+ -chad smith
+
+ * generic/dateentry.itk:
+ While documenting the iwidgets last year in my book, I came across a bug where
+ destroying a component didn't remove it from the composite options list. I
+ told Michael about it, and he's fixed it in 3.2. This broke the dateentry
+ because it was explicitly unsetting the component from the itk_component
+ array. I simply deleted that line of code.
+
+ I need to make a pass at the rest of the iwidgets to see which other ones were
+ also unsetting the component.
+
+ -chad smith
+
+2000-08-08 csmith
+ * generic/hierarchy.itk:
+ Several enhancements and bug fixes added by Doug Howard. Doug added the
+ following configuration options:
+ -dblclickcommand
+ -icondblcommand
+ -imagecommand
+ -imagedblcommand
+ -imagemenuloadcommand
+ -textmenuloadcommand
+
+ He also added two public methods: expanded and expState. Multiple non-public
+ methods were added to support the new configuration options. I have updated
+ the man page for each new option and public method.
+
+ * doc/hierarchy.n:
+ Man page updated per the additional configuration options and public methods
+ added by Doug Howard.
+
+ * tests/hierarchy.test:
+ Needed to change the number of configuration options per additions by
+ Doug Howard so hierarchy would pass the 'make test'.
+
+2000-08-07 welch
+ * configure:
+ Ran autoconf
+
+2000-08-02 welch
+ * Makefile.in:
+ * configure:
+ Changed this to use installFiles.tcl instead of install-sh
+
+2000-07-29 welch
+ * configure:
+ * configure:
+ Ran autoconf
+
+2000-07-14 welch
+ * configure:
+ Updated configure
+
+2000-07-06 mmc
+ * generic/timefield.itk:
+ * tests/all:
+ * tests/all.tcl:
+ * tests/defs:
+ * tests/menubar.test:
+ * tests/notebook.test:
+ * tests/tabnotebook.test:
+ * tests/tabset.test:
+ * tests/toolbar.test:
+ * unix/Makefile.in:
+ * unix/configure.in:
+ * unix/install-sh:
+ * unix/iwidgets.tcl.in:
+ * unix/pkgIndex.tcl.in:
+
+ 6/26/00 (bug fix)
+ Fixed Itcl_ClassVarResolver so that the formal parameters in a
+ method/proc take precedence over class data members.
+
+ 6/30/00 (bug fix)
+ Fixed all itcl/itk/iwidgets3.0.0 tests to run cleanly with the new
+ tcltest package.
+
+ 7/1/00 (bug fix)
+ Fixed "itk_component delete" so that the composite option list is
+ cleaned up whenever a component is deleted. For example, suppose
+ a component is the sole contributor of -font. When that component
+ is removed via "itk_component delete", the -font option goes away
+ as well. Also fixed the handling of the itk-delete-* binding for
+ the component. When the component is removed, the binding tag
+ is also removed by itk::remove_destroy_hook.
+
+ 7/5/00 (bug fix)
+ Fixed the check done during object creation to avoid clobbering
+ existing commands. Previously, itcl would look for any command--
+ in the local *and* global namespace--that might be clobbered.
+ Now, it looks for commands only in the local namespace, since
+ those are the only ones that could truly be clobbered.
+
+ 7/5/00 (cleanup)
+ Removed obsolete Makefile/configure files in the various "unix"
+ directories. Makefiles and configure files now reside one level
+ above, in the standard TEA place.
+
+2000-06-06 wart
+ * Makefile.in:
+ * configure:
+ * configure.in:
+ * tests/all.tcl:
+ * tests/buttonbox.test:
+ * tests/calendar.test:
+ * tests/canvasprintbox.test:
+ * tests/canvasprintdialog.test:
+ * tests/checkbox.test:
+ * tests/combobox.test:
+ * tests/dateentry.test:
+ * tests/datefield.test:
+ * tests/dialog.test:
+ * tests/dialogshell.test:
+ * tests/disjointlistbox.test:
+ * tests/entryfield.test:
+ * tests/extfileselectionbox.test:
+ * tests/extfileselectiondialog.test:
+ * tests/feedback.test:
+ * tests/fileselectionbox.test:
+ * tests/fileselectiondialog.test:
+ * tests/finddialog.test:
+ * tests/hierarchy.test:
+ * tests/hyperhelp.test:
+ * tests/labeledframe.test:
+ * tests/labeledwidget.test:
+ * tests/menubar.test:
+ * tests/messagebox.test:
+ * tests/messagedialog.test:
+ * tests/notebook.test:
+ * tests/optionmenu.test:
+ * tests/panedwindow.test:
+ * tests/promptdialog.test:
+ * tests/pushbutton.test:
+ * tests/radiobox.test:
+ * tests/regexpfield.test:
+ * tests/scrolledcanvas.test:
+ * tests/scrolledframe.test:
+ * tests/scrolledhtml.test:
+ * tests/scrolledlistbox.test:
+ * tests/scrolledtext.test:
+ * tests/selectionbox.test:
+ * tests/selectiondialog.test:
+ * tests/shell.test:
+ * tests/spindate.test:
+ * tests/spinint.test:
+ * tests/spinner.test:
+ * tests/spintime.test:
+ * tests/tabnotebook.test:
+ * tests/tabset.test:
+ * tests/timeentry.test:
+ * tests/timefield.test:
+ * tests/toolbar.test:
+ * tests/usual.test:
+ * tests/watch.test:
+ Modified tests to run with TEA Makefile
+
+2000-06-02 csmith
+ * generic/timefield.itk:
+ Here are the comments from an itcl mailing list poster as well as
+ my comments interspersed.
+
+
+ iwidgets::timefield
+
+2000-04-26 csmith
+ * generic/checkbox.itk:
+ Bug fix - patch by Mark Wilson added to select method to handle boolean
+ (other than 0,1) -onvalue options.
+
+2000-04-19 mmc
+ * configure:
+ * configure.in:
+
+ - fixed itcl::find to find classes/objects in *all* namespaces
+ - fixed tests to run cleanly
+
+2000-03-28 csmith
+ * generic/scrolledhtml.itk:
+ Applied patches submitted by Brian Griffin. The patches are as follows:
+
+ *** scrolledhtml.itk 1999/02/21 02:50:38 1.3
+ --- scrolledhtml.itk 2000/03/14 18:07:27
+ *************** class iwidgets::Scrolledhtml {
+ *** 141,146 ****
+ --- 141,147 ----
+ itk_option define -unknownimage unknownimage File {}
+ itk_option define -textbackground textBackground Background {}
+ itk_option define -update update Update 1
+ + itk_option define -debug deBug Debug 0
+ =20
+ public method import {args}
+ public method clear {}
+ *************** body iwidgets::Scrolledhtml::import {arg
+ *** 544,550 ****
+ append _cwd [file dirname $filename]
+ } else {
+ set f [open $filename r]
+ ! g set _cwd [file dirname $filename]
+ }
+ }
+ }
+ --- 545,551 ----
+ append _cwd [file dirname $filename]
+ } else {
+ set f [open $filename r]
+ ! set _cwd [file dirname $filename]
+ }
+ }
+ }
+ *************** body iwidgets::Scrolledhtml::render {htm
+ *** 611,618 ****
+ [lindex $entity 1]] "" entity
+ set cmd [string tolower [lindex $entity 0]]
+ if {[info command _entity_$cmd]!=3D""} {
+ ! catch {eval _entity_$cmd [lrange $entity 1 end]}
+ }
+ set html \
+ [string range $html [expr [lindex $match 1]+1] end]
+ }
+ --- 612,624 ----
+ [lindex $entity 1]] "" entity
+ set cmd [string tolower [lindex $entity 0]]
+ if {[info command _entity_$cmd]!=3D""} {
+ ! if {[catch {eval _entity_$cmd [lrange $entity 1 end]}
+ bad]} {
+ ! if {$itk_option(-debug)} {
+ ! global errorInfo
+ ! puts stderr "render: _entity_$cmd [lrange $entity
+ 1 end] =
+ Error:$bad\n$errorInfo"
+ ! }
+ }
+ + }
+ set html \
+ [string range $html [expr [lindex $match 1]+1] end]
+ }
+ *************** body iwidgets::Scrolledhtml::_append_tex
+ *** 728,743 ****
+ if ![string length $text] return
+ }
+ if {!$_pre && !$_intitle} {
+ ! set p [$_hottext get "end - 2c"]
+ set n [string index $text 0]
+ if {$n =3D=3D " " && $p =3D=3D " "} {
+ set text [string range $text 1 end]
+ }
+ ! $_hottext insert end $text $_tag
+ return
+ }
+ if {$_pre && !$_intitle} {
+ ! $_hottext insert end $text $_tag
+ return
+ }
+ append _title $text
+ --- 734,757 ----
+ if ![string length $text] return
+ }
+ if {!$_pre && !$_intitle} {
+ ! if {[catch {$_hottext get "end - 2c"} p]} {
+ ! set p ""
+ ! }
+ set n [string index $text 0]
+ if {$n =3D=3D " " && $p =3D=3D " "} {
+ set text [string range $text 1 end]
+ }
+ ! if {[catch {$_hottext insert end $text $_tag}]} {
+ ! set pht [winfo parent $_hottext]
+ ! catch {$pht insert end $text $_tag}
+ ! } =20
+ return
+ }
+ if {$_pre && !$_intitle} {
+ ! if {[catch {$_hottext insert end $text $_tag}]} {
+ ! set pht [winfo parent $_hottext]
+ ! catch {$pht insert end $text $_tag}
+ ! } =20
+ return
+ }
+ append _title $text
+ *************** body iwidgets::Scrolledhtml::_set_tag {}
+ *** 807,813 ****
+ if {![info exists _tagl($_tag)]} {
+ set _tagfont($_tag) 1
+ eval $_hottext tag configure $_tag \
+ ! -foreground $_color \
+ -lmargin1 ${_left}m \
+ -lmargin2 ${_left2}m $args
+ if [catch {eval $_hottext tag configure $_tag \
+ --- 821,827 ----
+ if {![info exists _tagl($_tag)]} {
+ set _tagfont($_tag) 1
+ eval $_hottext tag configure $_tag \
+ ! -foreground \$_color \
+ -lmargin1 ${_left}m \
+ -lmargin2 ${_left2}m $args
+ if [catch {eval $_hottext tag configure $_tag \
+ *************** body iwidgets::Scrolledhtml::_entity_tab
+ *** 2127,2133 ****
+ # end table
+ # ------------------------------------------------------------------
+ body iwidgets::Scrolledhtml::_entity_/table {} {
+ ! if $_intable {
+ _pop tableborder
+ set table [[_pop table] childsite]
+ _pop row
+ --- 2141,2147 ----
+ # end table
+ # ------------------------------------------------------------------
+ body iwidgets::Scrolledhtml::_entity_/table {} {
+ ! if {$_intable} {
+ _pop tableborder
+ set table [[_pop table] childsite]
+ _pop row
+ *************** body iwidgets::Scrolledhtml::_entity_/ta
+ *** 2150,2155 ****
+ --- 2164,2181 ----
+ set _link [_pop link]
+ set _alink [_pop alink]
+ foreach x [grid slaves $table] {
+ + set text [$x get 1.0 end]
+ + set tl [split $text \n]
+ + set max 0
+ + foreach l $tl {
+ + set len [string length $l]
+ + if {$len > $max} {
+ + set max $len
+ + }
+ + }
+ + if {$max > [$x cget -width]} {
+ + $x configure -width $max
+ + }
+ if {[$x cget -height] =3D=3D 1} {
+ $x configure -height [lindex [split [$x index "end - 1 chars"]
+ "."] =
+ 0]
+ }
+ *************** body iwidgets::Scrolledhtml::_entity_td=20
+ *** 2219,2227 ****
+ set cellspacing [_peek cellspacing]
+ set _hottext $table.cell[incr _counter]
+ text $_hottext -relief flat -width $ar(width) -height $ar(height) =
+ \
+ ! -foreground $_color -background $_bgcolor =
+ -highlightthickness 0 \
+ ! -wrap word -cursor $itk_option(-cursor) \
+ -padx $cellpadding -pady $cellpadding
+ if [info exists ar(nowrap)] {
+ $_hottext configure -wrap none
+ }
+ --- 2245,2258 ----
+ set cellspacing [_peek cellspacing]
+ set _hottext $table.cell[incr _counter]
+ text $_hottext -relief flat -width $ar(width) -height $ar(height) \
+ ! -highlightthickness 0 -wrap word -cursor $itk_option(-cursor) \
+ -padx $cellpadding -pady $cellpadding
+ + if {$_color !=3D ""} {
+ + $_hottext config -foreground $_color
+ + }
+ + if {$_bgcolor !=3D ""} {
+ + $_hottext config -background $_bgcolor=20
+ + }
+ if [info exists ar(nowrap)] {
+ $_hottext configure -wrap none
+ }
+ *************** body iwidgets::Scrolledhtml::_entity_td=20
+ *** 2229,2235 ****
+ --- 2260,2272 ----
+ $_hottext configure -relief sunken
+ }
+ set row [_peek row]
+ + if {$row < 0} {
+ + set row 0
+ + }
+ set column [_pop column]
+ + if {$column < 0} {
+ + set column 0
+ + }
+ while {[grid slaves $table -row $row -column $column] !=3D ""} {
+ incr column
+ }
+
+ * generic/shell.itk:
+ Reversed these two lines of code in the activate() method.
+ wm deiconify $itk_component(hull)
+ raise $itk_component(hull)
+ This fixes a problem mentioned by Brett Schwarz with a particular window
+ manager he was using with Linux. After testing this code change on a number
+ of other platforms/WMs (Solaris, Windows, HP-UX -- OLVWM, CDE, GNOME, FVWM) it
+ does not appear to affect behavior on any of these other systems.
+
+2000-03-21 csmith
+ * generic/fileselectionbox.itk:
+ From a patch I received from Brett Schwarz:
+
+ BUG
+ ---
+ When the -fileson option is set to false, then only the directory
+ listing is shown. It is implied that this becomes a directory selector.
+ However, when single clicking on a directory, the selection entry widget
+ only gets updated with the tail of the directory name (what is actually
+ in the directory listbox), not the whole path.
+
+ DESIRED BEHAVIOR
+
+ * generic/extfileselectionbox.itk:
+ From a patch I received from Brett Schwarz:
+
+ BUG
+ ---
+ When the -fileson option is set to false, then only the directory
+ listing is shown. I is implied that this becomes a directory selector.
+ However, when single clicking on a directory, the selection entry widget
+ only gets updated with the tail of the directory name (what is actually
+ in the directory listbox), not the whole path.
+
+ DESIRED BEHAVIOR
+
+2000-03-10 csmith
+ * doc/checkbox.n:
+ Updated man page to reflect addition of new config option:
+ orient.
+
+ * generic/radiobox.itk:
+ Added a new configuration option to the radiobox: -orient, which specifies the
+ orientation of the radiobuttons within the radiobox.
+
+ * generic/checkbox.itk:
+ Added a new config option to the checkbox: -oritent, which allows the user to
+ specify the orientation of the checkbuttons, either horizontally or
+ vertically (default).
+
+ * doc/radiobox.n:
+ Updated man page to reflect the new config option I added:
+ orient.
+
+2000-03-09 csmith
+ * doc/scrolledlistbox.n:
+ Updated man page to include -listvariable associated option and itemconfigure
+ associated method.
+
+ * generic/spinint.itk:
+ Added patch submitted by Brett Schwarz. When a value outside the specified
+ range is typed into the entryfield component, the spinint will beep if the up
+ or down arrow is pressed. We decided it was better to change the value back
+ to within the valid range. For example, if the range is from 10 to 20:
+ user types 50 in entryfield:
+ up arrow results in 10
+ down arrow results in 20
+ user types 5 in entryfield:
+ up arrow results in 10
+ down arrow results in 20
+
+ * generic/feedback.itk:
+ This is to close ticket #2881. While implementing the fix, I found another
+ bug where resizing of the window did not update the trough. So I did not add
+ the patch from this ticket. Rather, I added a new binding in the class
+ constructor on the hull such that <Configure> events invoke the _display
+ method to update the trough. This binding fixes both cases and does not
+ introduce any performance problems.
+
+ * doc/scrolledtext.n:
+ Updated man page to include image associated method.
+
+2000-03-08 csmith
+ * generic/hierarchy.itk:
+ Implemented and tested bug fix for ticket #3444.
+ csmith: 3/8/00 4:02pm
+
+2000-03-02 csmith
+ * generic/scrolledlistbox.itk:
+ Added a wrapper method for the new tk8.3 itemconfigure command for the
+ listbox.
+
+ * generic/scrolledtext.itk:
+ This is to close bug report #3446. I added a wrapper method for the text
+ widget's new image function per request.
+
+ * unix/Makefile.in:
+ This is to close ticket #3958. Removed the "iwidgets.tcl and pkgIndex.tcl"
+ targets from 'make clean'.
+
+ * generic/scrolledlistbox.itk:
+ Added -listvariable to the list of options kept with the listbox component is
+ added so that this option is available at the mega-widget level.
+
+2000-01-31 csmith
+ * generic/combobox.itk:
+ Small bug fix in the delete method when deleting text from the entry
+ component.
+
+2000-01-26 csmith
+ * generic/disjointlistbox.itk:
+ This mega-widget is setting tk_strictMotif to 1. Several emails circulated
+ around the itcl mailing list about problems that this caused. disjointlistbox
+ is the only mega-widget that set this global variable, so I've removed the
+ line of code that did this. After a brief sanity check, things look fine
+ without this line of code.
+
+2000-01-24 wart
+ * configure:
+ Regenerated configure scripts to pick up changes to tcl.m4
+
+ * configure:
+ Regenerated configure scripts to pick up recent changes to tcl.m4
+
+2000-01-07 csmith
+ * generic/messagedialog.itk:
+ Added -wraplength and -justify to configuration options. I don't know why
+ these were removed from version 2.2, but they're useful and should be there.
+
+2000-01-03 csmith
+ * generic/combobox.itk:
+ One typo dealing with -state with -dropdown is false ("info exists" should
+ have been "winfo exists"). Also added a conditional in the delete method
+ to avoid a possible stack dump.
+
+ * generic/watch.itk:
+ -tickcolor was not working - simple fix to modify the canvas option
+ from -fill to -outline
+
+ * generic/timefield.itk:
+ Patch by Massimo Morin to add -gmt and -textvariable options to
+ the timefield.
+
+ * generic/optionmenu.itk:
+ The 'select' method was not working properly when passed the "end" argument.
+ Modified the 'select' method to check for a bad index value - did not use
+ the patch attached to the bug report.
+
+ * generic/canvasprintbox.itk:
+ minor bug fix, -pagesize was not updating the optionmenu
+
+ * generic/calendar.itk:
+ Fixed a bug with -buttonforeground when photos used instead of
+ bitmaps.
+
+ * generic/spindate.itk:
+ datemargin was not working properly. Bug fixed by Brett
+ Schwarz.
+
+ * generic/finddialog.itk:
+ Patch by Brett Schwarz to fix -clearcommand and -matchcommand options,
+ which were not working.
+
+ * generic/extfileselectionbox.itk:
+ A few public methods should be private:
+ _selectDir
+ _dblSelectDir
+ _selectFile
+
+ * Makefile.in:
+ Patch submitted by Andreas Gustafsson: 'make clean' removes files generated
+ by the configure script and should only remove files generated by make.
+
+1999-12-20 csmith
+ * generic/labeledframe.itk:
+ Fixed some access level inconsistencies with some class methods. One public
+ method (smt) should not be public. Actually, I can't find anywhere in any
+ code where this method is called. Maybe it should be deleted? I made it
+ protected along with 3 private methods that were labeled as protected in the
+ method comment block.
+
+ * generic/checkbox.itk:
+ 1) I removed the following configuration option definitions from the
+ class definition: -command, -disabledforeground, and -selectcolor.
+ These options are now only applicable after checkbuttons have been
+ added to the checkbox.
+
+ a) The -command option never worked anyway. It was defined
+ via 'itk_option define' but was not implemented. The easiest
+ solution was to keep this option when adding a new checkbutton.
+ This at least adds -command functionality but doesn't provide
+ for % variable substitutions, which would be a nice addition
+ for future revisions.
+
+ b) The -disabledforeground and -selectcolor options were valid
+ options for initial checkbox creation but had no error checking.
+ You could therefore create a new checkbox with -selectcolor set
+ to "foo bar" and it would work OK. When you tried to add a new
+ checkbutton via the add() method, however, it would fail until
+ the class level -selectcolor was modified. This could lead to
+ confusion, so these two options are now only valid after (or
+ during) the addition of checkbuttons. Tk then handles the error
+ checking.
+
+ 2) Added -state to the keep fragment during checkbutton addition.
+
+ So in a nutshell, these 4 options are now valid checkbox options after
+ at least one checkbutton has been added:
+ -command
+ -disabledforeground
+ -selectcolor
+ -state
+
+1999-12-16 wart
+ * Makefile.in:
+ Install a few extra useful files (license.terms, catalog.bat)
+
+1999-12-16 csmith
+ * generic/menubar.itk:
+ public method _helpHandler should be private. Not sure how this originally
+ happened unless just an oversight on the author's part.
+
+1999-12-15 csmith
+ * generic/feedback.itk:
+ Modified the _display method per a bug report submitted by Kory Hopkins on
+ 9/24/99 (at least that's when I got it). There was a simple code change to
+ fix a problem with the trough calculation when stepping.
+
+1999-11-24 wart
+ * configure:
+ regenerated configure scripts to pick up tcl.m4 changes
+
+ * configure:
+ tcl.m4: Updated to reflect recent TEA changes
+
+ */configure: Regnereated with new tcl.m4
+
+ iwidgets2.2.0/Makefile.in: Don't copy nonexistent files
+
+1999-11-18 csmith
+ * generic/optionmenu.itk:
+ Modified a ternary expression to a simple if:then conditional because of some
+ problems with exponentials.
+
+ * generic/optionmenu.itk:
+ Just for clarity, changed the menubutton component's designated "-indicator"
+ option to "-indicatoron". Someone noticed it and actually submitted a bug
+ report on it. Geez.
+
+ * doc/toolbar.n:
+ Removed the -relief option from the list of standard options.
+
+ * generic/scrolledtext.itk:
+ Fixed a bug with the search method. The arguments needed to be evaluated one
+ level down the call stack.
+
+ * demos/html/toolbar.n.html:
+ Removed the -relief option from the standard options and also alphabetized
+ each of the standard options for lookup convenience.
+
+1999-09-14 wart
+ * iwidgets.tcl.in:
+ * pkgIndex.tcl.in:
+ Fixed installation of pkgIndex.tcl file. We have to install a pre-made
+ pkgIndex.tcl file since pkg_mkIndex can't seem to make a usable one.
+
+1999-09-10 wart
+ * Makefile.in:
+ Fixed bug when calling mkIndex.tcl for itk
+
+ reduced amount of output from "make install" in iwidgets
+
+1999-09-09 wart
+ * iwidgets.tcl.in:
+ * pkgIndex.tcl.in:
+ Added pkgIndex files for Iwidgets
+
+ Top level Makefile should no longer loop endlessly if the configure went bad.
+
+1999-09-04 wart
+ * Makefile.in:
+ * aclocal.m4:
+ * configure:
+ * configure.in:
+ TEA changes. Itcl now uses the same Makefiles and configure scripts for
+ both Windows and Unix.
+
+ Note that static shells are not yet done in this TEA implementation.
+
+1999-08-21 matt
+ * win/makefile.vc:
+ Moved HTML install to seperate non-default target, since the files that
+ it tries to install don't exist and cause a failure during the install.
+
+1999-07-26 csmith
+ * generic/pane.itk:
+ A typo in the configbody for -minimum. The first '$' should be removed from
+ set $itk_option(-minimum) $pixels
+
+1999-07-22 csmith
+ * generic/notebook.itk:
+ This is to incorporate a bug fix reported by Larry Virden for the
+ tabbed notebook. Looks like a typo in the code, where
+ set $_currPage -1
+ should be
+ set _currPage -1
+
+ * generic/calendar.itk:
+ This is to fix a problem reported by Larry Virden in the calendar
+ iwidget. There's a typo in the line,
+ set $_time $time
+ which should be
+ set _time $time
+
+1999-07-08 rjohnson
+ * demos/html/iwidgets2.2.0UserCmds.html:
+ * demos/html/iwidgets3.0.0UserCmds.htm:
+
+ Updated html index file to 3.0.
+
+ * demos/html/iwidgets3.0.0UserCmds.htm:
+ * demos/html/iwidgets3.0.0UserCmds.html:
+
+ Messed up extension.
+
+1999-06-16 csmith
+ * generic/toolbar.itk:
+ This fix is contributed by Raviv Gil. Below is his description of the bug.
+
+ "Working with iwidgets3.0.0 we've encountered the following problem :
+ We created a toolbar containing several buttons, each button with a short
+ help string. Passing above the toolbar and then closing the window sometimes
+ opened a Tcl Error message indicating that the method 'showBalloon' was
+ invoked for an invalid tk path."
+
+ * generic/panedwindow.itk:
+ There were several places in the code that looped from 1 to the number of
+ actual panes in the panedwindow when the code should be looping over the
+ number of active panes. Each of these areas in the code could cause a stack
+ dump, complaining about an invalid pathanme regarding a sash or a separator.
+ I've changed each of these areas to use _activePanes instead of _panes.
+
+1999-05-25 redman
+ * unix/configure.in:
+ Fix the makefile and configure files, etc., for Unix
+ in order to compile with Tcl/Tk 8.1 with stubs.
+
+ Builds itclsh and itkwish properly.
+
+1999-03-30 csmith
+ * generic/checkbox.itk:
+ ::Checkbox::select invokes the specified checkbutton regardless of whether
+ it's selected or not. It should only tell the checkbutton to invoke if
+ the checkbutton is not already selected.
+
+ * generic/menubar.itk:
+ There was a typo in the redefinition of the tkMenuFind proc at the bottom
+ of menubar.itk. "winfo" was being used instead of "info" with the
+ "command" argument.
+
+1999-03-15 csmith
+ * tests/entryfield.test:
+ Added one line of code in the 'foreach test' loop for the new -
+ pasting option.
+
+ * doc/entryfield.n:
+ Updated man page to document a new option, -pasting, which allows the
+ developer to disable pasting into the entry component of the entryfield.
+ This is useful when using -validate because validation does not catch
+ pasting text.
+
+ * generic/entryfield.itk:
+ 1) Added a new configuration option, -pasting, which allows the user to
+ disable pasting text into the entry component of the entryfield.
+ Previously, when using -validate, the user was allowed to paste text
+ which could cause stack dumps into the entryfield because pasting was
+ not caught. The user, for instance, could paste a 40 digit number and
+ kill any expr's since the integer is too large for tcl to handle.
+ 2) The _keyPress method hardcoded state comparisons for <Ctrl>, <Alt>,
+ <NumLock><Ctrl>, and <NumLock><Alt>. The problem was that these
+ hardcoded values were UNIX-specific. I added platform-independant code.
+
+ * CHANGES:
+ Added to entries under the Entryfield section: 1) documented new configuration
+ option, -pasting; and 2) documented change to _keyPress method to remove
+ hardcoded state comparisons.
+
+1999-03-08 csmith
+ * generic/panedwindow.itk:
+ Instantiating an extfileselectionbox iwidgets with a single configuration
+ option, '-fileson 0', caused a stack dump as a result of accessing an
+ invalid tk window pathname in iwidgets::Panedwindow::sashcursor. The
+ solution was to wrap a conditional around the path to see if it exists
+ before trying to use it.
+
+1999-03-04 csmith
+ * generic/combobox.itk:
+ The -command configuration option was being overwritten in the
+ _createComponents method if it was specified during widget creation.
+
+1999-02-21 rjohnson
+ * generic/scrolledhtml.itk:
+
+ Removed stack trace error in widget. However, the widget still
+ doesn't display correctly...
+
+1999-01-25 stanton
+ * unix/iwidgets.tcl.in:
+ * win/iwidgets.tcl:
+ Changed so iwidgets.tcl does a "namespace import -force itcl::*"
+ This is a hack to get around the fact that iwidgets uses "class"
+ instead of "itcl::class". The correct long term solution is to change
+ all of the iwidgets code to use qualified names.
+
+1998-12-22 rjohnson
+ * demos/watch:
+
+ Fixed bug in watch demo.
+
+1998-12-18 rjohnson
+ * demos/catalog:
+
+ Removed the mainwindow demo from the catalog demo. It was not a well
+ behaved demo and running would break the catalog demo. [Bug ID: 508]
+
+1998-09-14 stanton
+ * demos/images/clear.gif:
+ * demos/images/close.gif:
+ * demos/images/copy.gif:
+ * demos/images/cut.gif:
+ * demos/images/exit.gif:
+ * demos/images/find.gif:
+ * demos/images/help.gif:
+ * demos/images/mag.gif:
+ * demos/images/new.gif:
+ * demos/images/open.gif:
+ * demos/images/paste.gif:
+ * demos/images/poly.gif:
+ * demos/images/print.gif:
+ * demos/images/ruler.gif:
+ * demos/images/save.gif:
+ * demos/images/select.gif:
+ * demos/iwidgets.gif:
+ * generic/unknownimage.gif:
+ Fixed binary files
+
+1998-09-10 stanton
+ * doc/iwidgets.ps:
+ added iwidgets.ps as a binary file
+
+1998-08-25 stanton
+ * demos/mainwindow:
+ fixed bug where image names conflicted with global commands
+
+1998-08-24 stanton
+ * generic/hyperhelp.itk:
+ fixed portability bug in file name handling
+
+ * demos/html/buttonbox.n.html:
+ * demos/html/canvasprintbox.n.html:
+ * demos/html/canvasprintdialog.n.html:
+ * demos/html/combobox.n.html:
+ * demos/html/dialog.n.html:
+ * demos/html/dialogshell.n.html:
+ * demos/html/entryfield.n.html:
+ * demos/html/feedback.n.html:
+ * demos/html/fileselectionbox.n.html:
+ * demos/html/fileselectiondialog.n.html:
+ * demos/html/hyperhelp.n.html:
+ * demos/html/iwidgets2.2.0UserCmds.html:
+ * demos/html/labeledwidget.n.html:
+ * demos/html/menubar.n.html:
+ * demos/html/messagedialog.n.html:
+ * demos/html/notebook.n.html:
+ * demos/html/optionmenu.n.html:
+ * demos/html/panedwindow.n.html:
+ * demos/html/promptdialog.n.html:
+ * demos/html/pushbutton.n.html:
+ * demos/html/radiobox.n.html:
+ * demos/html/scrolledcanvas.n.html:
+ * demos/html/scrolledframe.n.html:
+ * demos/html/scrolledhtml.n.html:
+ * demos/html/scrolledlistbox.n.html:
+ * demos/html/scrolledtext.n.html:
+ * demos/html/selectionbox.n.html:
+ * demos/html/selectiondialog.n.html:
+ * demos/html/shell.n.html:
+ * demos/html/spindate.n.html:
+ * demos/html/spinint.n.html:
+ * demos/html/spinner.n.html:
+ * demos/html/spintime.n.html:
+ * demos/html/tabnotebook.n.html:
+ * demos/html/tabset.n.html:
+ * demos/html/toolbar.n.html:
+ updated
+
+1998-08-21 stanton
+ * demos/catalog:
+ removed extraneous import
+
+1998-08-18 welch
+ * demos/catalog:
+ Fixed demo
+
+1998-08-11 welch
+ * CHANGES:
+ * demos/catalog:
+ * demos/html/buttonbox.n.html:
+ * demos/html/canvasprintbox.n.html:
+ * demos/html/combobox.n.html:
+ * demos/html/dialogshell.n.html:
+ * demos/html/entryfield.n.html:
+ * demos/html/fileselectionbox.n.html:
+ * demos/html/fileselectiondialog.n.html:
+ * demos/html/hyperhelp.n.html:
+ * demos/html/labeledwidget.n.html:
+ * demos/html/menubar.n.html:
+ * demos/html/notebook.n.html:
+ Updates from Michael
+
+ * demos/feedback:
+ * demos/html/canvasprintdialog.n.html:
+ * demos/html/dialog.n.html:
+ * demos/html/feedback.n.html:
+ * demos/html/messagedialog.n.html:
+ * demos/html/optionmenu.n.html:
+ * demos/html/panedwindow.n.html:
+ * demos/html/promptdialog.n.html:
+ * demos/html/pushbutton.n.html:
+ * demos/html/radiobox.n.html:
+ * demos/html/scrolledcanvas.n.html:
+ * demos/html/scrolledframe.n.html:
+ * demos/html/scrolledhtml.n.html:
+ * demos/html/scrolledlistbox.n.html:
+ * demos/html/scrolledtext.n.html:
+ * demos/html/selectionbox.n.html:
+ * demos/html/selectiondialog.n.html:
+ * demos/html/shell.n.html:
+ * demos/html/spindate.n.html:
+ * demos/html/spinint.n.html:
+ * demos/html/spinner.n.html:
+ * demos/html/spintime.n.html:
+ * demos/html/tabnotebook.n.html:
+ * demos/html/tabset.n.html:
+ * demos/html/toolbar.n.html:
+ * demos/mainwindow:
+ * demos/watch:
+ * doc/calendar.n:
+ * doc/labeledframe.n:
+ * doc/optionmenu.n:
+ * doc/selectionbox.n:
+ * generic/combobox.itk:
+ * generic/entryfield.itk:
+ * generic/hierarchy.itk:
+ * generic/menubar.itk:
+ * generic/messagebox.itk:
+ * generic/optionmenu.itk:
+ * generic/radiobox.itk:
+ * generic/scrolledframe.itk:
+ * generic/scrolledhtml.itk:
+ * generic/shell.itk:
+ * generic/toolbar.itk:
+ * tests/entryfield.test:
+ * tests/hyperhelp.test:
+ * tests/optionmenu.test:
+ * tests/shell.test:
+ * tests/spinner.test:
+ * unix/Makefile.in:
+ * unix/iwidgets.tcl.in:
+ * unix/pkgIndex.tcl.in:
+ 3.0 final from Michael
+
+ * unix/Makefile.in:
+ Fixed symlink
+
diff --git a/iwidgets/Makefile.in b/iwidgets/Makefile.in
new file mode 100644
index 00000000000..8507f8df184
--- /dev/null
+++ b/iwidgets/Makefile.in
@@ -0,0 +1,189 @@
+#
+# This file is a Makefile for [incr Widgets]. If it has the name
+# "Makefile.in" then it is a template for a Makefile; to generate
+# the actual Makefile, run "./configure", which is a configuration
+# script generated by the "autoconf" program (constructs like
+# "@foo@" will get replaced in the actual Makefile.
+#
+# RCS: $Id$
+
+# Current [incr Widgets] version; used in various names.
+
+ITCL_VERSION = @ITCL_VERSION@
+IWIDGETS_VERSION = @VERSION@
+
+#----------------------------------------------------------------
+# Things you can change to personalize the Makefile for your own
+# site (you can make these changes in either Makefile.in or
+# Makefile, but changes to Makefile will get lost if you re-run
+# the configuration script).
+#----------------------------------------------------------------
+
+# Default top-level directories in which to install architecture-
+# specific files (exec_prefix) and machine-independent files such
+# as scripts (prefix). The values specified here may be overridden
+# at configure-time with the --exec-prefix and --prefix options
+# to the "configure" script.
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+srcdir = @srcdir@
+bindir = @bindir@
+
+# The following definition can be set to non-null for special systems
+# like AFS with replication. It allows the pathnames used for installation
+# to be different than those used for actually reference files at
+# run-time. INSTALL_ROOT is prepended to $prefix and $exec_prefix
+# when installing files.
+INSTALL_ROOT =
+
+# Path name to use when installing library scripts:
+SCRIPT_INSTALL_DIR = $(INSTALL_ROOT)$(prefix)/lib/iwidgets$(IWIDGETS_VERSION)
+
+# Directory in which to install the archive libtcl.a:
+LIB_INSTALL_DIR = $(INSTALL_ROOT)$(exec_prefix)/lib
+
+# Directory in which to install the program tclsh:
+BIN_INSTALL_DIR = $(INSTALL_ROOT)$(exec_prefix)/bin
+
+# Top-level directory in which to install manual entries:
+MAN_INSTALL_DIR = $(INSTALL_ROOT)$(prefix)/man/mann
+
+# Directory containing Tcl source code (for library used during test):
+TCL_SRC_DIR = @TCL_SRC_DIR@
+
+# Directory containing Tk source code (for library used during test):
+TK_SRC_DIR = @TK_SRC_DIR@
+
+# Itcl libraries can be found here:
+ITCL_LIB_DIR = @ITCL_LIB_DIR@
+
+# Directory containing Itcl source code (for library used during test):
+ITCL_SRC_DIR = @ITCL_SRC_DIR@
+
+# Itk libraries can be found here:
+ITK_LIB_DIR = @ITK_LIB_DIR@
+
+# Directory containing Itk source code (for library used during test):
+ITK_SRC_DIR = @ITK_SRC_DIR@
+
+# Some versions of make, like SGI's, use the following variable to
+# determine which shell to use for executing commands:
+SHELL = /bin/sh
+
+#----------------------------------------------------------------
+# The information below is modified by the configure script when
+# Makefile is generated from Makefile.in. You shouldn't normally
+# modify any of this stuff by hand.
+#----------------------------------------------------------------
+
+INSTALL = $(TCLSH_PROG) `$(CYGPATH) $(ITCL_SRC_DIR)/../config/installFile.tcl` -c
+INSTALL_PROGRAM = $(INSTALL)
+INSTALL_DATA = $(INSTALL) -m 644
+INSTALL_SCRIPT = $(INSTALL) -m 555
+MKINSTALLDIRS = $(ITCL_SRC_DIR)/../config/mkinstalldirs
+RANLIB = @RANLIB@
+LN_S = ln -s
+TOP_DIR = $(srcdir)
+GENERIC_DIR = $(TOP_DIR)/generic
+UNIX_DIR = $(TOP_DIR)/unix
+
+CYGPATH = @CYGPATH@
+TCLSH_PROG = @TCLSH_PROG@
+
+#----------------------------------------------------------------
+# The information below should be usable as is. The configure
+# script won't modify it and you shouldn't need to modify it
+# either.
+#----------------------------------------------------------------
+
+info:
+ @echo "Please specify either 'make test' or 'make install'."
+
+all:
+ @echo "Nothing to make for target 'all'. Run 'make test' to \
+ test the distribution"
+ @echo "and 'make install' to install it."
+
+install: install-libraries install-doc install-demos
+
+test:
+ LD_LIBRARY_PATH=$(ITCL_LIB_DIR):$(ITK_LIB_DIR):$(LD_LIBRARY_PATH); export LD_LIBRARY_PATH ; \
+ TCL_LIBRARY=$(TCL_SRC_DIR)/library; export TCL_LIBRARY; \
+ ITCL_LIBRARY=$(ITCL_LIB_DIR); export ITCL_LIBRARY; \
+ TK_LIBRARY=$(TK_SRC_DIR)/library; export TK_LIBRARY; \
+ ITK_LIBRARY=$(ITK_LIB_DIR); export ITK_LIBRARY; \
+ IWIDGETS_LIBRARY=@IWIDGETS_SRC_DIR@; export IWIDGETS_LIBRARY; \
+ $(TCLSH_PROG) `@CYGPATH@ $(srcdir)/tests/all.tcl` \
+ -exedir `@CYGPATH@ $(TK_SRC_DIR)/unix` $(TESTFLAGS)
+
+install-libraries:
+ @$(MKINSTALLDIRS) $(SCRIPT_INSTALL_DIR) $(LIB_INSTALL_DIR)
+ @rm -f $(LIB_INSTALL_DIR)/iwidgets
+ $(LN_S) $(SCRIPT_INSTALL_DIR) $(LIB_INSTALL_DIR)/iwidgets
+ @$(MKINSTALLDIRS) $(SCRIPT_INSTALL_DIR)/scripts
+ @echo "Installing source files from $(GENERIC_DIR) into $(SCRIPT_INSTALL_DIR)"
+ @for i in $(GENERIC_DIR)/*.itk $(GENERIC_DIR)/*.itcl $(GENERIC_DIR)/tclIndex $(GENERIC_DIR)/*.gif ; \
+ do \
+ $(INSTALL_DATA) $$i $(SCRIPT_INSTALL_DIR)/scripts; \
+ done;
+ @echo "Installing iwidgets.tcl and pkgIndex.tcl into $(SCRIPT_INSTALL_DIR)"
+ @for i in iwidgets.tcl pkgIndex.tcl ; \
+ do \
+ $(INSTALL_DATA) $$i $(SCRIPT_INSTALL_DIR); \
+ done;
+
+install-demos:
+ @$(MKINSTALLDIRS) $(SCRIPT_INSTALL_DIR)/demos/images $(SCRIPT_INSTALL_DIR)/demos/html
+ @echo "Installing demos from $(srcdir)/demos into $(SCRIPT_INSTALL_DIR)/demos"
+ @for i in $(srcdir)/demos/*; \
+ do \
+ if [ -f $$i ] ; then \
+ $(INSTALL_SCRIPT) $$i $(SCRIPT_INSTALL_DIR)/demos; \
+ fi; \
+ done;
+ @echo "Installing images from $(srcdir)/demos/images into $(SCRIPT_INSTALL_DIR)/demos/images"
+ for i in $(srcdir)/demos/images/*; \
+ do \
+ if [ -f $$i ] ; then \
+ $(INSTALL_DATA) $$i $(SCRIPT_INSTALL_DIR)/demos/images; \
+ fi; \
+ done;
+ @echo "Installing html man pages from $(srcdir)/demos/html into $(SCRIPT_INSTALL_DIR)/demos/html"
+ for i in $(srcdir)/demos/html/*; \
+ do \
+ if [ -f $$i ] ; then \
+ $(INSTALL_DATA) $$i $(SCRIPT_INSTALL_DIR)/demos/html; \
+ fi; \
+ done;
+
+install-doc:
+ @$(MKINSTALLDIRS) $(MAN_INSTALL_DIR)
+ @echo "Installing man pages from $(TOP_DIR)/doc into $(MAN_INSTALL_DIR)"
+ @cd $(TOP_DIR)/doc; for i in *.n; \
+ do \
+ rm -f $(MAN_INSTALL_DIR)/`basename $$i`; \
+ rm -f $(MAN_INSTALL_DIR)/`basename iwidgets_$$i`; \
+ sed -e '/man\.macros/r man.macros' -e '/man\.macros/d' \
+ $$i > $(MAN_INSTALL_DIR)/`basename iwidgets_$$i`; \
+ chmod 444 $(MAN_INSTALL_DIR)/`basename iwidgets_$$i`; \
+ done;
+ $(INSTALL_DATA) $(srcdir)/license.terms $(SCRIPT_INSTALL_DIR)
+
+Makefile: $(srcdir)/Makefile.in
+ $(SHELL) config.status
+
+clean:
+ rm -f core errs *~ \#* TAGS *.E a.out errors
+
+distclean: clean
+ rm -f Makefile config.status config.cache config.log
+
+depend:
+ makedepend -- $(CC_SWITCHES) -- $(SRCS)
+
+configure: configure.in
+ autoconf
+
+# DO NOT DELETE THIS LINE -- make depend depends on it.
diff --git a/iwidgets/README b/iwidgets/README
new file mode 100644
index 00000000000..6e808020828
--- /dev/null
+++ b/iwidgets/README
@@ -0,0 +1,212 @@
+------------------------------------------------------------------------------
+ [incr Widgets] - version 4.0.1
+------------------------------------------------------------------------------
+Please send general comments, suggestions, and questions to chad_smith@adc.com
+or itclguy@yahoo.com. Much of this file was written by Mark Ulferts, the
+original [incr Widgets] guy, several years ago when the Iwidgets were first
+released. Chad has assumed responsibilities for updates and maintenance.
+
+==============================================================================
+ Copyright (c) 1995 DSC Technologies Corporation
+==============================================================================
+ This software is copyrighted by DSC Technologies and private individual
+ contributors. The copyright holder is specifically listed in the header
+ of each file. The following terms apply to all files associated with the
+ software unless explicitly disclaimed in individual files by private
+ contributors.
+
+ Permission to use, copy, modify, distribute and license this software and
+ its documentation for any purpose, and without fee or written agreement
+ with DSC, is hereby granted, provided that the above copyright notice
+ appears in all copies and that both the copyright notice and warranty
+ disclaimer below appear in supporting documentation, and that the names of
+ DSC Technologies Corporation or DSC Communications Corporation not be used
+ in advertising or publicity pertaining to the software without specific,
+ written prior permission.
+
+ DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-INFRINGEMENT.
+ THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND
+ DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
+ ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL DSC BE LIABLE FOR ANY
+ SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
+ RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+ CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, ARISING OUT OF OR IN
+ CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+ RESTRICTED RIGHTS: Use, duplication or disclosure by the government
+ is subject to the restrictions as set forth in subparagraph (c) (1) (ii)
+ of the Rights in Technical Data and Computer Software Clause as DFARS
+ 252.227-7013 and FAR 52.227-19.
+==============================================================================
+
+ OVERVIEW
+------------------------------------------------------------------------------
+ - Introduction
+ - Distribution
+ - Web site
+ - Getting started
+ - Contributions
+ - Acknowledgements
+------------------------------------------------------------------------------
+
+
+ Introduction
+------------------------------------------------------------------------------
+ [incr Widgets] is an object-oriented mega-widget set which extends
+ Tcl/Tk and is based on [incr Tcl] and [incr Tk]. This set of mega-widgets
+ delivers many new, general purpose widgets like option menus, comboboxes,
+ selection boxes, and various dialogs whose couterparts are found in Motif
+ and Windows. Since [incr Widgets] is based on the [incr Tk] extension, the
+ Tk framework of configuration options, widget commands, and default bindings
+ is maintained. In other words, each [incr Widgets] mega-widget seamlessly
+ blends with the standard Tk widgets. They look, act and feel like Tk
+ widgets. In addition, all [incr Widgets] mega-widgets are object oriented and
+ may themselves be extended, using either inheritance or composition.
+
+ [incr Widgets] offers a strong object-oriented foundation which addresses
+ the need for a flexible and extensible mega-widget set. Its usage replaces
+ common widget combinations with higher level abstractions, simplifying code,
+ reducing errors, increasing readability, adding productivity, and promoting
+ a singular look-and-feel. The ability to extend [incr Widgets] enables
+ developers to create new mega-widgets based on previous work.
+
+ In short, [incr Widgets] is a library of reusable mega-widgets that can
+ be easily extended using composition or inheritance, allowing quicker
+ development of large scale applications. Usage drastically reduces
+ development time. New dialogs can be created in hours. Whole applications
+ in a few days. Reuse becomes a reality. Many projects are benefitting frm
+ the intergration of this mega-widget set into their development strategy.
+ [incr Widgets] is an [incr Tcl] and [incr Tk] success story. Good products
+ come from good foundations.
+
+
+ Distribution
+------------------------------------------------------------------------------
+ The [incr Widgets] distribution may be downloaded at SourceForge:
+ www.sourceforge.net/projects/incrtcl. The current distribution is
+ version 4.0.1.
+
+
+ Web site
+------------------------------------------------------------------------------
+ For the most current news regarding [incr Widgets] please consult the web
+ site - http://incrtcl.sourceforge.net/iwidgets. Many thanks to Brett Schwarz
+ who has done an incredible job overhauling this site. Take a look!
+
+
+ Getting started
+------------------------------------------------------------------------------
+ The "doc" directory contains man pages and a technical paper. The man
+ pages are installed under the man directory off your --prefix, and as of
+ version 4.0.1 are prepended with the text "iwidgets_" to easily differentiate
+ [incr Widgets] man pages from those of other extensions.
+
+ doc/iwidgets.ps ... Updated paper presented at Tcl Workshop 95.
+
+ doc/*.n ........... Man pages
+
+ The "demos" directory contains demo scripts for each mega-widget as
+ well as html versions of all the [incr Widgets] man pages. The
+ demos are also installed under the lib directory off your --prefix.
+
+ demos/catalog ..... Comprehensive demo package which illustrates
+ [incr Widgets] usage additionally displaying the
+ source.
+
+ demos/html ..... HTML version of the [incr Widgets] man pages.
+
+ The "tests" directory contains a set of test scripts for [incr Widgets].
+ They also make for a great demo of the flexiblity of the mega-widgets.
+
+
+ Installation
+------------------------------------------------------------------------------
+ NOTE: Having the itcl distribution is a prerequsite to using iwidgets.
+ Thus, if you don't have itcl you need to visit Source Forge to download
+ and install it first. Once you have downloaded and installed [incr Tcl]
+ and [incr Tk], you can proceed with [incr Widgets] installation as follows:
+
+ 1) Copy the iwidgets4.0.1.tar.gz file to your toplevel [incr Tcl]
+ directory. For example, if you have the itcl3.2.1 distribution in
+ a directory named /usr/local/tcl/itcl3.2.1, then you should copy
+ the iwidgets file to this directory.
+
+ Note, if you don't copy the iwidgets archive to this directory,
+ then you will need to specify the --with-itcl flag when you run
+ the configure script.
+
+ 2) Untar/unzip the archive:
+
+ gunzip -c iwidgets4.0.1.tar.gz |tar xvf -
+
+ 3) Run the configuration script:
+
+ cd iwidgets4.0.0
+ ./configure
+
+ By default, the configuration script will set things up to be
+ installed in "/usr/local". You can change this by specifying a
+ different "prefix" in the "configure" command. You'll want to
+ use the same value you used for the prefix in the configuration
+ of your [incr Tcl/Tk] distribution.
+
+ ./configure --prefix=/your/install/path
+
+ The "configure" script generates a Makefile from the Makefile.in
+ template.
+
+ Also, as mentioned eariler, you may need to tell the [incr Widgets]
+ where the [incr Tcl] source is located. For example, if your toplevel
+ [incr Tcl] directory is located in /opt/tools/tcl/itcl3.2.1 and you
+ are building the [incr Widgets] in a directory other than this, then
+ you will need to use the following:
+
+ ./configure --prefix=/your/install/path \
+ --with-itcl=/opt/tools/tcl/itcl3.2.1
+
+ 4) Run the test suite:
+
+ make test
+
+ 7) Install the [incr Widgets] man pages, demos, and script files.
+
+ make install
+
+
+ Acknowledgements
+------------------------------------------------------------------------------
+ Thanks to Brett Schwarz for a ton of work done on the new [incr Widgets]
+ web site, http://incrtcl.sourceforge.net/iwidgets.
+
+ Thanks to the original develment team, comprised of Mark Ulferts, Sue
+ Yockey, Bret Schuhmacher, Alfredo Jahn, John Sigler, and Bill Scott. Also
+ thanks to Mark Harrison for his influence, confidence, and ideas.
+
+ Thanks also to the new set of contributors which include John Tucker,
+ Mitch Gorman, John Reekie, Alfredo Jahn, Ken Copeland, Tako Schotanus,
+ Tony Parent and Michael McLennan
+
+ Thanks to Michael McLennan, creator of [incr Tcl] and [incr Tk], for the
+ beta copies, training, assistance, and his infectious enthusiasm.
+
+ Thanks to DSC Communications for picking up the copyright and supporting
+ the public release of this software.
+
+ Thanks to John P. Davis for creating the [incr Widgets] "Flaming Toaster"
+ logo which can be seen at http://www.tcltk.com/iwidgets
+
+ Thanks to WebNet Technologies for their assistance is designing the [incr
+ Widgets] web site, as well as hosting it.
+
+ Special thanks to my wife Karen for supporting this effort and to our two
+ girls, Katelyn and Bailey, who occasionally shared the PC with me. Also
+ thanks to my Discman and its relentless power supply as well as my rock
+ and roll CD collection. No music, no software.
+
+--
+ ____________________________________________________________________________
+ _/_/ _/_/ _/ _/ _/ Mark L. Ulferts
+ _/ _/ _/ _/ _/ _/ _/ ulferts@swbell.net
+ _/ _/_/ _/ _/ _/ _/ mulferts@austin.dsccc.com
+ _/ _/ _/ _/ _/_/_/ _/ _/_/_/_/ _/ DSC Communications Corp, Austin Texas
diff --git a/iwidgets/aclocal.m4 b/iwidgets/aclocal.m4
new file mode 100644
index 00000000000..8618b995c55
--- /dev/null
+++ b/iwidgets/aclocal.m4
@@ -0,0 +1 @@
+builtin(include,./tcl.m4)
diff --git a/iwidgets/configure b/iwidgets/configure
new file mode 100755
index 00000000000..2ddcbe0a994
--- /dev/null
+++ b/iwidgets/configure
@@ -0,0 +1,1156 @@
+#! /bin/sh
+
+# Guess values for system-dependent variables and create Makefiles.
+# Generated automatically using autoconf version 2.13
+# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+# Defaults:
+ac_help=
+ac_default_prefix=/usr/local
+# Any additions from configure.in:
+ac_help="$ac_help
+ --with-tcl directory containing tcl configuration (tclConfig.sh)"
+ac_help="$ac_help
+ --with-tk directory containing tk configuration (tkConfig.sh)"
+ac_help="$ac_help
+ --with-itcl=DIR use Itcl 3.0 binaries from DIR"
+
+# Initialize some variables set by options.
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+build=NONE
+cache_file=./config.cache
+exec_prefix=NONE
+host=NONE
+no_create=
+nonopt=NONE
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+target=NONE
+verbose=
+x_includes=NONE
+x_libraries=NONE
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+# Initialize some other variables.
+subdirs=
+MFLAGS= MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+# Maximum number of lines to put in a shell here document.
+ac_max_here_lines=12
+
+ac_prev=
+for ac_option
+do
+
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval "$ac_prev=\$ac_option"
+ ac_prev=
+ continue
+ fi
+
+ case "$ac_option" in
+ -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+ *) ac_optarg= ;;
+ esac
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case "$ac_option" in
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir="$ac_optarg" ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build="$ac_optarg" ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file="$ac_optarg" ;;
+
+ -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+ | --da=*)
+ datadir="$ac_optarg" ;;
+
+ -disable-* | --disable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ eval "enable_${ac_feature}=no" ;;
+
+ -enable-* | --enable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "enable_${ac_feature}='$ac_optarg'" ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix="$ac_optarg" ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he)
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat << EOF
+Usage: configure [options] [host]
+Options: [defaults in brackets after descriptions]
+Configuration:
+ --cache-file=FILE cache test results in FILE
+ --help print this message
+ --no-create do not create output files
+ --quiet, --silent do not print \`checking...' messages
+ --version print the version of autoconf that created configure
+Directory and file names:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [same as prefix]
+ --bindir=DIR user executables in DIR [EPREFIX/bin]
+ --sbindir=DIR system admin executables in DIR [EPREFIX/sbin]
+ --libexecdir=DIR program executables in DIR [EPREFIX/libexec]
+ --datadir=DIR read-only architecture-independent data in DIR
+ [PREFIX/share]
+ --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data in DIR
+ [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var]
+ --libdir=DIR object code libraries in DIR [EPREFIX/lib]
+ --includedir=DIR C header files in DIR [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include]
+ --infodir=DIR info documentation in DIR [PREFIX/info]
+ --mandir=DIR man documentation in DIR [PREFIX/man]
+ --srcdir=DIR find the sources in DIR [configure dir or ..]
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM
+ run sed PROGRAM on installed program names
+EOF
+ cat << EOF
+Host type:
+ --build=BUILD configure for building on BUILD [BUILD=HOST]
+ --host=HOST configure for HOST [guessed]
+ --target=TARGET configure for TARGET [TARGET=HOST]
+Features and packages:
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --x-includes=DIR X include files are in DIR
+ --x-libraries=DIR X library files are in DIR
+EOF
+ if test -n "$ac_help"; then
+ echo "--enable and --with options recognized:$ac_help"
+ fi
+ exit 0 ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host="$ac_optarg" ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir="$ac_optarg" ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir="$ac_optarg" ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir="$ac_optarg" ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir="$ac_optarg" ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst \
+ | --locals | --local | --loca | --loc | --lo)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+ localstatedir="$ac_optarg" ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir="$ac_optarg" ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir="$ac_optarg" ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix="$ac_optarg" ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix="$ac_optarg" ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix="$ac_optarg" ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name="$ac_optarg" ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir="$ac_optarg" ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir="$ac_optarg" ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site="$ac_optarg" ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir="$ac_optarg" ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir="$ac_optarg" ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target="$ac_optarg" ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers)
+ echo "configure generated by autoconf version 2.13"
+ exit 0 ;;
+
+ -with-* | --with-*)
+ ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "with_${ac_package}='$ac_optarg'" ;;
+
+ -without-* | --without-*)
+ ac_package=`echo $ac_option|sed -e 's/-*without-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ eval "with_${ac_package}=no" ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes="$ac_optarg" ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries="$ac_optarg" ;;
+
+ -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
+ ;;
+
+ *)
+ if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
+ echo "configure: warning: $ac_option: invalid host type" 1>&2
+ fi
+ if test "x$nonopt" != xNONE; then
+ { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
+ fi
+ nonopt="$ac_option"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
+fi
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+# File descriptor usage:
+# 0 standard input
+# 1 file creation
+# 2 errors and warnings
+# 3 some systems may open it to /dev/tty
+# 4 used on the Kubota Titan
+# 6 checking for... messages and results
+# 5 compiler messages saved in config.log
+if test "$silent" = yes; then
+ exec 6>/dev/null
+else
+ exec 6>&1
+fi
+exec 5>./config.log
+
+echo "\
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+" 1>&5
+
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell metacharacters.
+ac_configure_args=
+for ac_arg
+do
+ case "$ac_arg" in
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c) ;;
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
+ ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ *) ac_configure_args="$ac_configure_args $ac_arg" ;;
+ esac
+done
+
+# NLS nuisances.
+# Only set these to C if already set. These must not be set unconditionally
+# because not all systems understand e.g. LANG=C (notably SCO).
+# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
+# Non-C LC_CTYPE values break the ctype check.
+if test "${LANG+set}" = set; then LANG=C; export LANG; fi
+if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
+if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
+if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo > confdefs.h
+
+# A filename unique to this package, relative to the directory that
+# configure is in, which we can look for to find out if srcdir is correct.
+ac_unique_file=generic/buttonbox.itk
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then its parent.
+ ac_prog=$0
+ ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
+ test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
+ srcdir=$ac_confdir
+ if test ! -r $srcdir/$ac_unique_file; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+ if test "$ac_srcdir_defaulted" = yes; then
+ { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
+ else
+ { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
+ fi
+fi
+srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
+
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+ if test "x$prefix" != xNONE; then
+ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+ else
+ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+ fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+ if test -r "$ac_site_file"; then
+ echo "loading site script $ac_site_file"
+ . "$ac_site_file"
+ fi
+done
+
+if test -r "$cache_file"; then
+ echo "loading cache $cache_file"
+ . $cache_file
+else
+ echo "creating cache $cache_file"
+ > $cache_file
+fi
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+ac_exeext=
+ac_objext=o
+if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+ # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
+ if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
+ ac_n= ac_c='
+' ac_t=' '
+ else
+ ac_n=-n ac_c= ac_t=
+ fi
+else
+ ac_n= ac_c='\c' ac_t=
+fi
+
+
+# RCS: $Id$
+
+ITCL_VERSION=3.2
+
+
+PACKAGE=iwidgets
+MAJOR_VERSION=4
+MINOR_VERSION=0
+PATCHLEVEL=.1
+
+VERSION=${MAJOR_VERSION}.${MINOR_VERSION}${PATCHLEVEL}
+IWIDGETS_SRC_DIR=`pwd`
+
+
+
+
+
+
+case "`uname -s`" in
+ *win32* | *WIN32* | *CYGWIN_NT*|*CYGWIN_98*|*CYGWIN_95*)
+ CYGPATH="cygpath -w"
+ RELPATH=".. .. bin"
+ ;;
+ *)
+ CYGPATH=echo
+ RELPATH=..
+ ;;
+esac
+
+
+
+
+#--------------------------------------------------------------------
+# See if there was a command-line option for where Tcl is; if
+# not, search for Tcl.
+#--------------------------------------------------------------------
+
+
+ #
+ # Ok, lets find the tcl configuration
+ # First, look for one uninstalled.
+ # the alternative search directory is invoked by --with-tcl
+ #
+
+ if test x"${no_tcl}" = x ; then
+ # we reset no_tcl in case something fails here
+ no_tcl=true
+ # Check whether --with-tcl or --without-tcl was given.
+if test "${with_tcl+set}" = set; then
+ withval="$with_tcl"
+ with_tclconfig=${withval}
+fi
+
+ echo $ac_n "checking for Tcl configuration""... $ac_c" 1>&6
+echo "configure:585: checking for Tcl configuration" >&5
+ if eval "test \"`echo '$''{'ac_cv_c_tclconfig'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+
+
+ # First check to see if --with-tcl was specified.
+ if test x"${with_tclconfig}" != x ; then
+ if test -f "${with_tclconfig}/tclConfig.sh" ; then
+ ac_cv_c_tclconfig=`(cd ${with_tclconfig}; pwd)`
+ else
+ { echo "configure: error: ${with_tclconfig} directory doesn't contain tclConfig.sh" 1>&2; exit 1; }
+ fi
+ fi
+
+ # then check for a private Tcl installation
+ if test x"${ac_cv_c_tclconfig}" = x ; then
+ for i in \
+ ../tcl \
+ `ls -dr ../tcl[8-9].[0-9]* 2>/dev/null` \
+ ../../tcl \
+ `ls -dr ../../tcl[8-9].[0-9]* 2>/dev/null` \
+ ../../../tcl \
+ `ls -dr ../../../tcl[8-9].[0-9]* 2>/dev/null` ; do
+ if test -f "$i/unix/tclConfig.sh" ; then
+ ac_cv_c_tclconfig=`(cd $i/unix; pwd)`
+ break
+ fi
+ done
+ fi
+
+ # check in a few common install locations
+ if test x"${ac_cv_c_tclconfig}" = x ; then
+ for i in `ls -d ${prefix}/lib 2>/dev/null` \
+ `ls -d /usr/local/lib 2>/dev/null` ; do
+ if test -f "$i/tclConfig.sh" ; then
+ ac_cv_c_tclconfig=`(cd $i; pwd)`
+ break
+ fi
+ done
+ fi
+
+ # check in a few other private locations
+ if test x"${ac_cv_c_tclconfig}" = x ; then
+ for i in \
+ ${srcdir}/../tcl \
+ `ls -dr ${srcdir}/../tcl[8-9].[0-9]* 2>/dev/null` ; do
+ if test -f "$i/unix/tclConfig.sh" ; then
+ ac_cv_c_tclconfig=`(cd $i/unix; pwd)`
+ break
+ fi
+ done
+ fi
+
+fi
+
+
+ if test x"${ac_cv_c_tclconfig}" = x ; then
+ TCL_BIN_DIR="# no Tcl configs found"
+ echo "configure: warning: Can't find Tcl configuration definitions" 1>&2
+ exit 0
+ else
+ no_tcl=
+ TCL_BIN_DIR=${ac_cv_c_tclconfig}
+ echo "$ac_t""found $TCL_BIN_DIR/tclConfig.sh" 1>&6
+ fi
+ fi
+
+
+ echo $ac_n "checking for existence of $TCL_BIN_DIR/tclConfig.sh""... $ac_c" 1>&6
+echo "configure:655: checking for existence of $TCL_BIN_DIR/tclConfig.sh" >&5
+
+ if test -f "$TCL_BIN_DIR/tclConfig.sh" ; then
+ echo "$ac_t""loading" 1>&6
+ . $TCL_BIN_DIR/tclConfig.sh
+ else
+ echo "$ac_t""file not found" 1>&6
+ fi
+
+ #
+ # The eval is required to do the TCL_DBGX substitution in the
+ # TCL_LIB_FILE variable
+ #
+
+ eval TCL_LIB_FILE=${TCL_LIB_FILE}
+ eval TCL_LIB_FLAG=${TCL_LIB_FLAG}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#--------------------------------------------------------------------
+# See if there was a command-line option for where Tk is; if
+# not, search for Tk.
+#--------------------------------------------------------------------
+
+
+ #
+ # Ok, lets find the tk configuration
+ # First, look for one uninstalled.
+ # the alternative search directory is invoked by --with-tk
+ #
+
+ if test x"${no_tk}" = x ; then
+ # we reset no_tk in case something fails here
+ no_tk=true
+ # Check whether --with-tk or --without-tk was given.
+if test "${with_tk+set}" = set; then
+ withval="$with_tk"
+ with_tkconfig=${withval}
+fi
+
+ echo $ac_n "checking for Tk configuration""... $ac_c" 1>&6
+echo "configure:711: checking for Tk configuration" >&5
+ if eval "test \"`echo '$''{'ac_cv_c_tkconfig'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+
+
+ # First check to see if --with-tkconfig was specified.
+ if test x"${with_tkconfig}" != x ; then
+ if test -f "${with_tkconfig}/tkConfig.sh" ; then
+ ac_cv_c_tkconfig=`(cd ${with_tkconfig}; pwd)`
+ else
+ { echo "configure: error: ${with_tkconfig} directory doesn't contain tkConfig.sh" 1>&2; exit 1; }
+ fi
+ fi
+
+ # then check for a private Tk library
+ if test x"${ac_cv_c_tkconfig}" = x ; then
+ for i in \
+ ../tk \
+ `ls -dr ../tk[8-9].[0-9]* 2>/dev/null` \
+ ../../tk \
+ `ls -dr ../../tk[8-9].[0-9]* 2>/dev/null` \
+ ../../../tk \
+ `ls -dr ../../../tk[8-9].[0-9]* 2>/dev/null` ; do
+ if test -f "$i/unix/tkConfig.sh" ; then
+ ac_cv_c_tkconfig=`(cd $i/unix; pwd)`
+ break
+ fi
+ done
+ fi
+ # check in a few common install locations
+ if test x"${ac_cv_c_tkconfig}" = x ; then
+ for i in `ls -d ${prefix}/lib 2>/dev/null` \
+ `ls -d /usr/local/lib 2>/dev/null` ; do
+ if test -f "$i/tkConfig.sh" ; then
+ ac_cv_c_tkconfig=`(cd $i; pwd)`
+ break
+ fi
+ done
+ fi
+ # check in a few other private locations
+ if test x"${ac_cv_c_tkconfig}" = x ; then
+ for i in \
+ ${srcdir}/../tk \
+ `ls -dr ${srcdir}/../tk[8-9].[0-9]* 2>/dev/null` ; do
+ if test -f "$i/unix/tkConfig.sh" ; then
+ ac_cv_c_tkconfig=`(cd $i/unix; pwd)`
+ break
+ fi
+ done
+ fi
+
+fi
+
+ if test x"${ac_cv_c_tkconfig}" = x ; then
+ TK_BIN_DIR="# no Tk configs found"
+ echo "configure: warning: Can't find Tk configuration definitions" 1>&2
+ exit 0
+ else
+ no_tk=
+ TK_BIN_DIR=${ac_cv_c_tkconfig}
+ echo "$ac_t""found $TK_BIN_DIR/tkConfig.sh" 1>&6
+ fi
+ fi
+
+
+
+ echo $ac_n "checking for existence of $TK_BIN_DIR/tkConfig.sh""... $ac_c" 1>&6
+echo "configure:779: checking for existence of $TK_BIN_DIR/tkConfig.sh" >&5
+
+ if test -f "$TK_BIN_DIR/tkConfig.sh" ; then
+ echo "$ac_t""loading" 1>&6
+ . $TK_BIN_DIR/tkConfig.sh
+ else
+ echo "$ac_t""could not find $TK_BIN_DIR/tkConfig.sh" 1>&6
+ fi
+
+
+
+
+
+
+
+#--------------------------------------------------------------------
+# See if --with-itcl was specified to give the [incr Tcl] and [incr Tk]
+# source code location. If not, then we'll assume that the Iwidgets
+# package is being installed directly beneath the toplevel Itcl directory.
+#--------------------------------------------------------------------
+
+# Check whether --with-itcl or --without-itcl was given.
+if test "${with_itcl+set}" = set; then
+ withval="$with_itcl"
+ itcl_search=$withval
+else
+ itcl_search=`cd ${IWIDGETS_SRC_DIR}/..; pwd`
+fi
+
+
+ITCL_LIB_DIR=""
+if test -r $itcl_search/itcl/library/itcl.tcl; then
+ if test -r $itcl_search/itk/library/itk.tcl; then
+ if test -r $itcl_search/config/mkinstalldirs; then
+ ITCL_LIB_DIR=$itcl_search/itcl/library
+ ITCL_SRC_DIR=$itcl_search/itcl
+ ITK_LIB_DIR=$itcl_search/itk/library
+ ITK_SRC_DIR=$itcl_search/itk
+ fi
+ fi
+fi
+
+if test -z "$ITCL_LIB_DIR"; then
+ { echo "configure: error: Can't find Itcl source. Use --with-itcl to specify the the toplevel incr Tcl directory on your system. (This directory should contain itcl/library/itcl.tcl, itk/library/itk.tcl, and config/mkinstalldirs.)" 1>&2; exit 1; }
+fi
+
+
+#--------------------------------------------------------------------
+# Needed for running the test suite
+#--------------------------------------------------------------------
+
+
+ echo $ac_n "checking for tclsh""... $ac_c" 1>&6
+echo "configure:832: checking for tclsh" >&5
+
+ if eval "test \"`echo '$''{'ac_cv_path_tclsh'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+
+ search_path=`echo ${exec_prefix}/bin:${prefix}/bin:${TCL_BIN_DIR}:${TCL_BIN_DIR}/../bin:${PATH} | sed -e 's/:/ /g'`
+ for dir in $search_path ; do
+ for j in `ls -r $dir/tclsh[8-9]*${EXEEXT} 2> /dev/null` \
+ `ls -r $dir/tclsh*${EXEEXT} 2> /dev/null` ; do
+ if test x"$ac_cv_path_tclsh" = x ; then
+ if test -f "$j" ; then
+ ac_cv_path_tclsh=$j
+ break
+ fi
+ fi
+ done
+ done
+
+fi
+
+
+ if test -f "$ac_cv_path_tclsh" ; then
+ TCLSH_PROG=$ac_cv_path_tclsh
+ echo "$ac_t""$TCLSH_PROG" 1>&6
+ else
+ { echo "configure: error: No tclsh found in PATH: $search_path" 1>&2; exit 1; }
+ fi
+
+
+
+#--------------------------------------------------------------------
+# Fill in template files with the proper info.
+#--------------------------------------------------------------------
+
+
+
+
+
+
+
+
+trap '' 1 2 15
+cat > confcache <<\EOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs. It is not useful on other systems.
+# If it contains results you don't want to keep, you may remove or edit it.
+#
+# By default, configure uses ./config.cache as the cache file,
+# creating it if it does not exist already. You can give configure
+# the --cache-file=FILE option to use a different cache file; that is
+# what configure does when it calls configure scripts in
+# subdirectories, so they share the cache.
+# Giving --cache-file=/dev/null disables caching, for debugging configure.
+# config.status only pays attention to the cache file if you give it the
+# --recheck option to rerun configure.
+#
+EOF
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(set) 2>&1 |
+ case `(ac_space=' '; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote substitution
+ # turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ -e "s/'/'\\\\''/g" \
+ -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
+ ;;
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
+ ;;
+ esac >> confcache
+if cmp -s $cache_file confcache; then
+ :
+else
+ if test -w $cache_file; then
+ echo "updating cache $cache_file"
+ cat confcache > $cache_file
+ else
+ echo "not updating unwritable cache $cache_file"
+ fi
+fi
+rm -f confcache
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Any assignment to VPATH causes Sun make to only execute
+# the first set of double-colon rules, so remove it if not needed.
+# If there is a colon in the path, we need to keep it.
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d'
+fi
+
+trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
+
+# Transform confdefs.h into DEFS.
+# Protect against shell expansion while executing Makefile rules.
+# Protect against Makefile macro expansion.
+cat > conftest.defs <<\EOF
+s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g
+s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g
+s%\[%\\&%g
+s%\]%\\&%g
+s%\$%$$%g
+EOF
+DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '`
+rm -f conftest.defs
+
+
+# Without the "./", some shells look in PATH for config.status.
+: ${CONFIG_STATUS=./config.status}
+
+echo creating $CONFIG_STATUS
+rm -f $CONFIG_STATUS
+cat > $CONFIG_STATUS <<EOF
+#! /bin/sh
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# This directory was configured as follows,
+# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+#
+# $0 $ac_configure_args
+#
+# Compiler output produced by configure, useful for debugging
+# configure, is in ./config.log if it exists.
+
+ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
+for ac_option
+do
+ case "\$ac_option" in
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
+ exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
+ -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
+ echo "$CONFIG_STATUS generated by autoconf version 2.13"
+ exit 0 ;;
+ -help | --help | --hel | --he | --h)
+ echo "\$ac_cs_usage"; exit 0 ;;
+ *) echo "\$ac_cs_usage"; exit 1 ;;
+ esac
+done
+
+ac_given_srcdir=$srcdir
+
+trap 'rm -fr `echo "Makefile \
+ iwidgets.tcl \
+ pkgIndex.tcl" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+# Protect against being on the right side of a sed subst in config.status.
+sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
+ s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
+$ac_vpsub
+$extrasub
+s%@SHELL@%$SHELL%g
+s%@CFLAGS@%$CFLAGS%g
+s%@CPPFLAGS@%$CPPFLAGS%g
+s%@CXXFLAGS@%$CXXFLAGS%g
+s%@FFLAGS@%$FFLAGS%g
+s%@DEFS@%$DEFS%g
+s%@LDFLAGS@%$LDFLAGS%g
+s%@LIBS@%$LIBS%g
+s%@exec_prefix@%$exec_prefix%g
+s%@prefix@%$prefix%g
+s%@program_transform_name@%$program_transform_name%g
+s%@bindir@%$bindir%g
+s%@sbindir@%$sbindir%g
+s%@libexecdir@%$libexecdir%g
+s%@datadir@%$datadir%g
+s%@sysconfdir@%$sysconfdir%g
+s%@sharedstatedir@%$sharedstatedir%g
+s%@localstatedir@%$localstatedir%g
+s%@libdir@%$libdir%g
+s%@includedir@%$includedir%g
+s%@oldincludedir@%$oldincludedir%g
+s%@infodir@%$infodir%g
+s%@mandir@%$mandir%g
+s%@ITCL_VERSION@%$ITCL_VERSION%g
+s%@PACKAGE@%$PACKAGE%g
+s%@VERSION@%$VERSION%g
+s%@CYGPATH@%$CYGPATH%g
+s%@RELPATH@%$RELPATH%g
+s%@TCL_DBGX@%$TCL_DBGX%g
+s%@TCL_BIN_DIR@%$TCL_BIN_DIR%g
+s%@TCL_SRC_DIR@%$TCL_SRC_DIR%g
+s%@TCL_LIB_FILE@%$TCL_LIB_FILE%g
+s%@TCL_LIBS@%$TCL_LIBS%g
+s%@TCL_DEFS@%$TCL_DEFS%g
+s%@TCL_SHLIB_LD_LIBS@%$TCL_SHLIB_LD_LIBS%g
+s%@TCL_EXTRA_CFLAGS@%$TCL_EXTRA_CFLAGS%g
+s%@TCL_LD_FLAGS@%$TCL_LD_FLAGS%g
+s%@TCL_STUB_LIB_FILE@%$TCL_STUB_LIB_FILE%g
+s%@TCL_LIB_SPEC@%$TCL_LIB_SPEC%g
+s%@TCL_BUILD_LIB_SPEC@%$TCL_BUILD_LIB_SPEC%g
+s%@TCL_STUB_LIB_SPEC@%$TCL_STUB_LIB_SPEC%g
+s%@TCL_BUILD_STUB_LIB_SPEC@%$TCL_BUILD_STUB_LIB_SPEC%g
+s%@TK_BIN_DIR@%$TK_BIN_DIR%g
+s%@TK_SRC_DIR@%$TK_SRC_DIR%g
+s%@TK_LIB_FILE@%$TK_LIB_FILE%g
+s%@TK_XINCLUDES@%$TK_XINCLUDES%g
+s%@TCLSH_PROG@%$TCLSH_PROG%g
+s%@ITCL_LIB_DIR@%$ITCL_LIB_DIR%g
+s%@ITCL_SRC_DIR@%$ITCL_SRC_DIR%g
+s%@ITK_LIB_DIR@%$ITK_LIB_DIR%g
+s%@ITK_SRC_DIR@%$ITK_SRC_DIR%g
+s%@IWIDGETS_SRC_DIR@%$IWIDGETS_SRC_DIR%g
+
+CEOF
+EOF
+
+cat >> $CONFIG_STATUS <<\EOF
+
+# Split the substitutions into bite-sized pieces for seds with
+# small command number limits, like on Digital OSF/1 and HP-UX.
+ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
+ac_file=1 # Number of current file.
+ac_beg=1 # First line for current file.
+ac_end=$ac_max_sed_cmds # Line after last line for current file.
+ac_more_lines=:
+ac_sed_cmds=""
+while $ac_more_lines; do
+ if test $ac_beg -gt 1; then
+ sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
+ else
+ sed "${ac_end}q" conftest.subs > conftest.s$ac_file
+ fi
+ if test ! -s conftest.s$ac_file; then
+ ac_more_lines=false
+ rm -f conftest.s$ac_file
+ else
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds="sed -f conftest.s$ac_file"
+ else
+ ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
+ fi
+ ac_file=`expr $ac_file + 1`
+ ac_beg=$ac_end
+ ac_end=`expr $ac_end + $ac_max_sed_cmds`
+ fi
+done
+if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds=cat
+fi
+EOF
+
+cat >> $CONFIG_STATUS <<EOF
+
+CONFIG_FILES=\${CONFIG_FILES-"Makefile \
+ iwidgets.tcl \
+ pkgIndex.tcl"}
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case "$ac_file" in
+ *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ *) ac_file_in="${ac_file}.in" ;;
+ esac
+
+ # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
+
+ # Remove last slash and all that follows it. Not all systems have dirname.
+ ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+ # The file is in a subdirectory.
+ test ! -d "$ac_dir" && mkdir "$ac_dir"
+ ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
+ else
+ ac_dir_suffix= ac_dots=
+ fi
+
+ case "$ac_given_srcdir" in
+ .) srcdir=.
+ if test -z "$ac_dots"; then top_srcdir=.
+ else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
+ /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
+ *) # Relative path.
+ srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
+ top_srcdir="$ac_dots$ac_given_srcdir" ;;
+ esac
+
+
+ echo creating "$ac_file"
+ rm -f "$ac_file"
+ configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
+ case "$ac_file" in
+ *Makefile*) ac_comsub="1i\\
+# $configure_input" ;;
+ *) ac_comsub= ;;
+ esac
+
+ ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+ sed -e "$ac_comsub
+s%@configure_input@%$configure_input%g
+s%@srcdir@%$srcdir%g
+s%@top_srcdir@%$top_srcdir%g
+" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
+fi; done
+rm -f conftest.s*
+
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+
+exit 0
+EOF
+chmod +x $CONFIG_STATUS
+rm -fr confdefs* $ac_clean_files
+test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
+
diff --git a/iwidgets/configure.in b/iwidgets/configure.in
new file mode 100644
index 00000000000..184c9374f9f
--- /dev/null
+++ b/iwidgets/configure.in
@@ -0,0 +1,99 @@
+dnl This file is an input file used by the GNU "autoconf" program to
+dnl generate the file "configure", which is run during [incr Tcl]
+dnl installation to configure the system for the local environment.
+
+AC_INIT(generic/buttonbox.itk)
+# RCS: $Id$
+
+ITCL_VERSION=3.2
+AC_SUBST(ITCL_VERSION)
+
+PACKAGE=iwidgets
+MAJOR_VERSION=4
+MINOR_VERSION=0
+PATCHLEVEL=.1
+
+VERSION=${MAJOR_VERSION}.${MINOR_VERSION}${PATCHLEVEL}
+IWIDGETS_SRC_DIR=`pwd`
+
+AC_SUBST(PACKAGE)
+AC_SUBST(VERSION)
+
+AC_PREREQ(2.0)
+
+case "`uname -s`" in
+ *win32* | *WIN32* | *CYGWIN_NT*|*CYGWIN_98*|*CYGWIN_95*)
+ CYGPATH="cygpath -w"
+ RELPATH=".. .. bin"
+ ;;
+ *)
+ CYGPATH=echo
+ RELPATH=..
+ ;;
+esac
+
+AC_SUBST(CYGPATH)
+AC_SUBST(RELPATH)
+
+#--------------------------------------------------------------------
+# See if there was a command-line option for where Tcl is; if
+# not, search for Tcl.
+#--------------------------------------------------------------------
+
+SC_PATH_TCLCONFIG
+SC_LOAD_TCLCONFIG
+
+#--------------------------------------------------------------------
+# See if there was a command-line option for where Tk is; if
+# not, search for Tk.
+#--------------------------------------------------------------------
+
+SC_PATH_TKCONFIG
+SC_LOAD_TKCONFIG
+
+#--------------------------------------------------------------------
+# See if --with-itcl was specified to give the [incr Tcl] and [incr Tk]
+# source code location. If not, then we'll assume that the Iwidgets
+# package is being installed directly beneath the toplevel Itcl directory.
+#--------------------------------------------------------------------
+
+AC_ARG_WITH(itcl, [ --with-itcl=DIR use Itcl 3.0 binaries from DIR],
+ itcl_search=$withval, itcl_search=`cd ${IWIDGETS_SRC_DIR}/..; pwd`)
+
+ITCL_LIB_DIR=""
+if test -r $itcl_search/itcl/library/itcl.tcl; then
+ if test -r $itcl_search/itk/library/itk.tcl; then
+ if test -r $itcl_search/config/mkinstalldirs; then
+ ITCL_LIB_DIR=$itcl_search/itcl/library
+ ITCL_SRC_DIR=$itcl_search/itcl
+ ITK_LIB_DIR=$itcl_search/itk/library
+ ITK_SRC_DIR=$itcl_search/itk
+ fi
+ fi
+fi
+
+if test -z "$ITCL_LIB_DIR"; then
+ AC_MSG_ERROR(Can't find Itcl source. Use --with-itcl to specify the the toplevel [incr Tcl] directory on your system. (This directory should contain itcl/library/itcl.tcl, itk/library/itk.tcl, and config/mkinstalldirs.))
+fi
+
+
+#--------------------------------------------------------------------
+# Needed for running the test suite
+#--------------------------------------------------------------------
+
+SC_PROG_TCLSH
+
+#--------------------------------------------------------------------
+# Fill in template files with the proper info.
+#--------------------------------------------------------------------
+AC_SUBST(TCL_SRC_DIR)
+AC_SUBST(TK_SRC_DIR)
+AC_SUBST(ITCL_LIB_DIR)
+AC_SUBST(ITCL_SRC_DIR)
+AC_SUBST(ITK_LIB_DIR)
+AC_SUBST(ITK_SRC_DIR)
+AC_SUBST(IWIDGETS_SRC_DIR)
+
+AC_OUTPUT(Makefile \
+ iwidgets.tcl \
+ pkgIndex.tcl)
diff --git a/iwidgets/demos/buttonbox b/iwidgets/demos/buttonbox
new file mode 100644
index 00000000000..f5a15c0013b
--- /dev/null
+++ b/iwidgets/demos/buttonbox
@@ -0,0 +1,13 @@
+# ----------------------------------------------------------------------
+# DEMO: buttonbox in [incr Widgets]
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+
+iwidgets::buttonbox .bb
+
+.bb add OK -text OK -command "puts OK"
+.bb add Apply -text Apply -command "puts Apply"
+.bb add Cancel -text Cancel -command "puts Cancel"
+.bb default OK
+
+pack .bb -expand yes -fill both
diff --git a/iwidgets/demos/calendar b/iwidgets/demos/calendar
new file mode 100644
index 00000000000..ab656ea1d51
--- /dev/null
+++ b/iwidgets/demos/calendar
@@ -0,0 +1,26 @@
+# ----------------------------------------------------------------------
+# DEMO: calendar in [incr Widgets]
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+
+option add *Calendar.buttonForeground black
+option add *Calendar.outline black
+option add *Calendar.weekdayBackground white
+option add *Calendar.weekendBackground mistyrose
+option add *Calendar.selectColor red
+. configure -background white
+
+iwidgets::calendar .cal
+pack .cal -expand yes -fill both
+
+iwidgets::optionmenu .days -labeltext "Start Day:" -command {
+ set day [.days get]
+ .cal configure -startday $day -days $caldays($day)
+}
+pack .days -padx 4 -pady 4
+
+array set caldays {
+ sunday {S M T W T F S}
+ monday {Mo Tu We Th Fr Sa Su}
+}
+.days insert end sunday monday
diff --git a/iwidgets/demos/canvasprintbox b/iwidgets/demos/canvasprintbox
new file mode 100644
index 00000000000..0591b43514c
--- /dev/null
+++ b/iwidgets/demos/canvasprintbox
@@ -0,0 +1,22 @@
+# ----------------------------------------------------------------------
+# DEMO: canvasprintbox in [incr Widgets]
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+
+option add *textBackground seashell
+
+#
+# Make a canvas for the main application:
+#
+canvas .c -width 200 -height 200 -background white
+pack .c
+
+.c create rectangle 30 30 150 150 -fill blue
+.c create oval 70 70 190 190 -fill red
+.c create polygon 60 50 110 180 10 180 -fill green
+.c create text 100 5 -anchor n -text "Example Drawing"
+
+iwidgets::canvasprintbox .pcb -printcmd "lpr" -pagesize "A4"
+
+.pcb setcanvas .c
+
diff --git a/iwidgets/demos/canvasprintdialog b/iwidgets/demos/canvasprintdialog
new file mode 100644
index 00000000000..c628280ca4c
--- /dev/null
+++ b/iwidgets/demos/canvasprintdialog
@@ -0,0 +1,31 @@
+# ----------------------------------------------------------------------
+# DEMO: canvasprintdialog in [incr Widgets]
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+
+option add *textBackground seashell
+
+#
+# Make a canvas for the main application:
+#
+canvas .c -width 200 -height 200 -background white
+pack .c
+
+.c create rectangle 30 30 150 150 -fill blue
+.c create oval 70 70 190 190 -fill red
+.c create polygon 60 50 110 180 10 180 -fill green
+.c create text 100 5 -anchor n -text "Example Drawing"
+
+button .print -text "Print..." -command {
+ if {[.pcd activate]} {
+ puts "use command \".pcd print\" to really print"
+ } else {
+ puts "aborted"
+ }
+}
+pack .print
+
+iwidgets::canvasprintdialog .pcd -modality application \
+ -printcmd "lpr" -pagesize "A4"
+
+.pcd setcanvas .c
diff --git a/iwidgets/demos/catalog b/iwidgets/demos/catalog
new file mode 100644
index 00000000000..cbaa66695de
--- /dev/null
+++ b/iwidgets/demos/catalog
@@ -0,0 +1,407 @@
+#!/bin/sh
+# ----------------------------------------------------------------------
+# PROGRAM: demo program for [incr Widgets]
+# ----------------------------------------------------------------------
+# Michael J. McLennan
+# Bell Labs Innovations for Lucent Technologies
+# mmclennan@lucent.com
+# http://www.tcltk.com/itcl/
+# ======================================================================
+# Copyright (c) 1993-1998 Lucent Technologies, Inc.
+# ======================================================================
+#\
+exec wish8.4 "$0"
+
+package require Iwidgets 4.0
+
+# ----------------------------------------------------------------------
+option add *Scrolledtext.textBackground white startupFile
+option add *Scrolledlistbox.textBackground white startupFile
+option add *Scrolledhtml.textBackground white startupFile
+option add *Scrolledhtml.padX 10 startupFile
+option add *boxColor blue startupFile
+option add *boxTextColor white startupFile
+
+# ----------------------------------------------------------------------
+# USAGE: iw_demo_file <name>
+#
+# Returns the proper demo file name for a demo called <name>.
+# ----------------------------------------------------------------------
+proc iw_demo_file {name} {
+ global iwidgets::library
+ return [file join $library demos $name]
+}
+
+# ----------------------------------------------------------------------
+# USAGE: iw_demo_manpage <name>
+#
+# Returns the proper man page file for a demo called <name>.
+# ----------------------------------------------------------------------
+proc iw_demo_manpage {name} {
+ global iwidgets::library
+ return [file join $library demos html $name.n.html]
+}
+
+# ----------------------------------------------------------------------
+# USAGE: iw_load_demo <name>
+#
+# Loads a demo program with the given <name>. Demos can be written
+# as if they will pop up in the main application window, but they will
+# pop up inside the tab notebook instead.
+# ----------------------------------------------------------------------
+proc iw_load_demo {name} {
+ global widgets
+
+ catch {eval destroy [winfo children $widgets(info-example)]}
+ iw_lock on
+ iw_status "Loading..."
+
+ set win [frame $widgets(info-example).inner]
+ pack $win -expand yes
+
+ set loadcmd {
+ set fid [open [iw_demo_file $name] r]
+ set code [read $fid]
+ close $fid
+ }
+ if {[catch $loadcmd result] == 0} {
+ regsub -all "(\"|\{|\\\[| |\n|^|\t)((\\.\[A-Za-z0-9\]+)+)" \
+ $code "\\1$win\\2" code
+ regsub -all "(\"|\{|\\\[| |\n|^)(\\. )" \
+ $code "\\1$win " code
+ if {[catch {uplevel #0 $code} result] == 0} {
+ $widgets(info-code) clear
+ $widgets(info-code) import [iw_demo_file $name]
+ iw_draw_hier $name
+ iw_load_manpage $name
+ iw_lock off
+ iw_status ""
+ return
+ }
+ }
+ catch {eval destroy [winfo children $win]}
+ label $win.err -background white -wraplength 4i \
+ -text "Can't load demo:\n$result"
+ pack $win.err -expand yes
+ iw_lock off
+ iw_status ""
+}
+
+# overload a few critical functions that might be used by demo programs...
+rename exit tcl_exit
+proc exit {{status 0}} {
+ # do nothing
+}
+
+rename puts tcl_puts
+proc puts {args} {
+ global widgets
+ if {[llength $args] == 1} {
+ iw_status [lindex $args 0]
+ } else {
+ eval tcl_puts $args
+ }
+}
+
+# ----------------------------------------------------------------------
+# USAGE: iw_load_manpage
+#
+# Loads the man page for the current demo. Man pages are not
+# automatically loaded unless the man page viewer is visible.
+# This procedure checks to see if the viewer is visible, and loads
+# the man page if needed.
+# ----------------------------------------------------------------------
+set iwManPage ""
+proc iw_load_manpage {{name ""}} {
+ global widgets iwManPage
+
+ if {[winfo ismapped $widgets(info-manpage)]} {
+ if {$name == ""} {
+ set name [$widgets(list) getcurselection]
+ }
+ if {$name != $iwManPage} {
+ iw_lock on
+ iw_status "Loading man page..."
+ $widgets(info-manpage) import [iw_demo_manpage $name]
+ iw_lock off
+ iw_status ""
+ place forget $widgets(info-manpage-feedback)
+ }
+ set iwManPage $name
+ }
+}
+
+# ----------------------------------------------------------------------
+# USAGE: iw_manpage_progress
+#
+# Handles the progress meter whenever an HTML man page is rendered.
+# If the progress meter is not showing, it is put up, and the current
+# state is updated. If the meter is at 100%, it is taken down.
+# ----------------------------------------------------------------------
+proc iw_manpage_progress {n} {
+ global widgets remaining
+
+ if {![winfo ismapped $widgets(info-manpage-feedback)]} {
+ $widgets(info-manpage-feedback) configure -steps $n
+ $widgets(info-manpage-feedback) reset
+ place $widgets(info-manpage-feedback) -relx 0.5 -rely 0.5 \
+ -anchor c -width 200
+ update
+ set remaining $n
+ }
+
+ $widgets(info-manpage-feedback) step [expr $remaining - $n]
+ set remaining $n
+}
+
+# ----------------------------------------------------------------------
+# USAGE: iw_status <message>
+#
+# Displays a status <message> near the top of the window.
+# ----------------------------------------------------------------------
+proc iw_status {message} {
+ global widgets
+ $widgets(status) configure -text $message
+ update
+}
+
+# ----------------------------------------------------------------------
+# USAGE: iw_lock <state>
+#
+# Locks or unlocks the main window. Sets a grab on the main menu,
+# so that all events are sent to it.
+# ----------------------------------------------------------------------
+proc iw_lock {state} {
+ global widgets
+ if {$state} {
+ grab set $widgets(mainMenu)
+ . configure -cursor watch
+ } else {
+ grab release $widgets(mainMenu)
+ . configure -cursor ""
+ }
+}
+
+# ----------------------------------------------------------------------
+# USAGE: iw_draw_hier <name>
+#
+# Queries the hierarchy for a particular class in demo <name> and
+# draws a class diagram into a display window. Usually invoked when
+# a demo is loaded to display the class hierarchy for the associated
+# widget.
+# ----------------------------------------------------------------------
+proc iw_draw_hier {name} {
+ global widgets
+ set canv $widgets(info-hier)
+ $canv delete all
+
+ set class [string toupper [string index $name 0]][string tolower [string range $name 1 end]]
+
+ if {[catch [list namespace eval iwidgets [list itcl::find classes $class]]] == 0} {
+ set objs [namespace eval iwidgets [list itcl::find objects -class $class]]
+ if {[llength $objs]} {
+ update idletasks
+ set bases [[lindex $objs 0] info heritage]
+ iw_draw_level [lrange $bases 1 end] $canv [lindex $bases 0]
+ set bbox [$canv bbox all]
+
+ $canv move all [expr [lindex $bbox 0] * -1] [expr [lindex $bbox 1] * -1]
+
+ $canv xview moveto 0
+ $canv yview moveto 0
+
+ set bbox [$canv bbox all]
+ set x [expr ([winfo width $widgets(info)] / 2) - ([lindex $bbox 2] / 2)]
+ set y 10
+ $canv move all $x $y
+ }
+ }
+}
+
+# ----------------------------------------------------------------------
+# USAGE: iw_draw_level <bases> <canv> <class>
+#
+# Draws one level of the hierarchy for <class>.
+# ----------------------------------------------------------------------
+proc iw_draw_level {bases canv class} {
+ set org [iw_draw_box $canv $class]
+ set top $org
+
+ set offset 0
+
+ if {[llength $bases]} {
+ $canv lower [$canv create line $offset $org \
+ $offset [expr $top-10] \
+ -40 [expr $top-10] \
+ -24 [expr $top-10] \
+ -20 [expr $top-16] \
+ -16 [expr $top-10] \
+ -20 [expr $top-16] \
+ -20 [expr $top-26]]
+ $canv move all 20 [expr -($top-26+$org)]
+
+ set del [iw_draw_level [lrange $bases 1 end] $canv [lindex $bases 0]]
+ $canv move all -20 [expr $top-26+$org]
+ set top [expr $top+$del-30+$org]
+ incr offset 4
+ }
+
+ return $top
+}
+
+# ----------------------------------------------------------------------
+# USAGE: iw_draw_box <canv> <class>
+#
+# Draws one box for a class hierarchy onto a canvas window.
+# ----------------------------------------------------------------------
+proc iw_draw_box {canv class} {
+ set bg [option get $canv boxColor BoxColor]
+ set textbg [option get $canv boxTextColor BoxTextColor]
+
+ set cname [string trimleft $class :]
+ $canv create text 0 0 -anchor center -text $cname \
+ -fill $textbg -tags $class
+
+ set bbox [$canv bbox $class]
+ set x0 [expr [lindex $bbox 0]-4]
+ set y0 [expr [lindex $bbox 1]-4]
+ set x1 [expr [lindex $bbox 2]+4]
+ set y1 [expr [lindex $bbox 3]+4]
+
+ $canv create rectangle $x0 $y0 $x1 $y1 \
+ -outline black -fill $bg
+
+ $canv raise $class
+
+ return $y0
+}
+
+# ----------------------------------------------------------------------
+wm title . {[incr Widgets] Demo}
+wm geometry . 750x440
+
+frame .mbar -borderwidth 2 -relief raised
+pack .mbar -fill x
+set widgets(mainMenu) [menubutton .mbar.main -text "Main" -menu .mbar.main.m]
+pack .mbar.main -side left
+
+menu .mbar.main.m
+.mbar.main.m add command -label "About..." -command {.about activate}
+.mbar.main.m add separator
+.mbar.main.m add command -label "Quit" -command tcl_exit
+
+iwidgets::panedwindow .pw -orient vertical
+pack .pw -expand yes -fill both
+
+.pw add "widgets"
+set pane [.pw childsite "widgets"]
+set widgets(list) $pane.wlist
+
+iwidgets::scrolledlistbox $widgets(list) -labeltext "Select a widget:" \
+ -selectioncommand {iw_load_demo [$widgets(list) getcurselection]} \
+ -labelpos nw -vscrollmode dynamic -hscrollmode none \
+ -exportselection no
+pack $widgets(list) -expand yes -fill both -padx 8
+
+.pw add "info"
+set pane [.pw childsite "info"]
+set widgets(info) $pane.info
+
+.pw fraction 25 75
+
+set widgets(status) [label $pane.status]
+pack $pane.status -anchor w
+
+iwidgets::tabnotebook $widgets(info) -tabpos s
+pack $widgets(info) -expand yes -fill both
+
+set widgets(info-example) [$widgets(info) add -label "Example"]
+$widgets(info-example) configure -background white
+
+set win [$widgets(info) add -label "Example Code"]
+set widgets(info-code) [iwidgets::scrolledtext $win.code \
+ -wrap none -vscrollmode dynamic -hscrollmode none]
+pack $widgets(info-code) -expand yes -fill both -padx 4 -pady 4
+
+set win [$widgets(info) add -label "Inheritance"]
+set widgets(info-hier) [iwidgets::scrolledcanvas $win.canv -textbackground white \
+ -vscrollmode dynamic -hscrollmode dynamic]
+pack $widgets(info-hier) -expand yes -fill both -padx 4 -pady 4
+
+set win [$widgets(info) add -label "Man Page"]
+set widgets(info-manpage) [iwidgets::scrolledhtml $win.html \
+ -wrap word -vscrollmode dynamic -hscrollmode none \
+ -feedback "iw_manpage_progress" \
+ -linkcommand "$win.html import -link"]
+pack $widgets(info-manpage) -expand yes -fill both -padx 4 -pady 4
+
+set widgets(info-manpage-feedback) [iwidgets::feedback $win.html.fb \
+ -borderwidth 2]
+
+bind $widgets(info-manpage) <Map> {iw_load_manpage}
+
+$widgets(info) select "Example"
+
+# ----------------------------------------------------------------------
+# "About" window
+# ----------------------------------------------------------------------
+iwidgets::dialog .about -title {About: [incr Widgets] Demo} -modality none
+.about hide "Apply"
+.about hide "Help"
+.about hide "Cancel"
+.about buttonconfigure "OK" -command ".about deactivate"
+.about default "OK"
+
+set win [.about childsite]
+label $win.title -text {[incr Widgets]}
+pack $win.title
+catch {$win.title configure -font -*-helvetica-bold-o-normal-*-*-180-*}
+
+set file [file join ${iwidgets::library} demos iwidgets.gif]
+label $win.icon -image [image create photo -file $file]
+pack $win.icon -side left
+
+label $win.by -text "Contributed By"
+pack $win.by
+catch {$win.by configure -font -*-helvetica-medium-r-normal-*-*-100-*}
+
+label $win.authors -text "Mark L. Ulferts
+Sue Yockey
+John Sigler
+Bill Scott
+Alfredo Jahn
+Tako Schotanus
+Kris Raney
+John Tucker
+Mitch Gorman
+John Reekie
+Ken Copeland
+Tony Parent
+Chad Smith
+and
+Michael McLennan
+"
+pack $win.authors
+catch {$win.authors configure -font -*-helvetica-medium-o-normal-*-*-120-*}
+
+# ----------------------------------------------------------------------
+# Load up a list of demos...
+# ----------------------------------------------------------------------
+foreach file [lsort [glob [file join ${iwidgets::library} demos *]]] {
+ set name [file tail $file]
+ if {![file isdirectory $file] && ![string match *.* $name]
+ && ![string match catalog $name]
+ && ![string match scopedobject $name]} {
+ if {$name == "mainwindow"} {
+ # This demo is doesn't work well with the catalog
+ # so we skip it.
+
+ continue
+ }
+ $widgets(list) insert end $name
+ }
+}
+$widgets(list) selection set 0
+uplevel #0 [$widgets(list) cget -selectioncommand]
+
+
diff --git a/iwidgets/demos/checkbox b/iwidgets/demos/checkbox
new file mode 100644
index 00000000000..c405a027a8b
--- /dev/null
+++ b/iwidgets/demos/checkbox
@@ -0,0 +1,12 @@
+# ----------------------------------------------------------------------
+# DEMO: checkbox in [incr Widgets]
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+
+iwidgets::checkbox .cb -labeltext Styles
+.cb add bold -text Bold
+.cb add italic -text Italic
+.cb add underline -text Underline
+.cb select underline
+
+pack .cb -padx 10 -pady 10 -fill both -expand yes
diff --git a/iwidgets/demos/combobox b/iwidgets/demos/combobox
new file mode 100644
index 00000000000..32a20227b0d
--- /dev/null
+++ b/iwidgets/demos/combobox
@@ -0,0 +1,16 @@
+# ----------------------------------------------------------------------
+# DEMO: combobox in [incr Widgets]
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+
+option add *textBackground seashell
+
+iwidgets::combobox .cb -labeltext "Font:" -labelpos w -selectioncommand {
+ puts "selected: [.cb getcurselection]"
+}
+
+.cb insert list end Ariel Courier Helvetica Knarly Lucida \
+ Rumpus Symbol Times "Zapf Dingbats"
+
+.cb selection set Times
+pack .cb
diff --git a/iwidgets/demos/dateentry b/iwidgets/demos/dateentry
new file mode 100644
index 00000000000..068e7dde5dc
--- /dev/null
+++ b/iwidgets/demos/dateentry
@@ -0,0 +1,12 @@
+# ----------------------------------------------------------------------
+# DEMO: dateentry in [incr Widgets]
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+
+proc returnCmd {} {
+ puts [.de get]
+}
+
+iwidgets::dateentry .de -labeltext "Date:" -command returnCmd
+pack .de -fill x -expand yes -padx 10 -pady 10
+
diff --git a/iwidgets/demos/datefield b/iwidgets/demos/datefield
new file mode 100644
index 00000000000..03b33a54932
--- /dev/null
+++ b/iwidgets/demos/datefield
@@ -0,0 +1,12 @@
+# ----------------------------------------------------------------------
+# DEMO: datefield in [incr Widgets]
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+
+proc returnCmd {} {
+ puts [.df get]
+}
+
+iwidgets::datefield .df -labeltext "Date (International Format):" \
+ -command returnCmd -int 1
+pack .df -fill x -expand yes -padx 10 -pady 10
diff --git a/iwidgets/demos/demo.html b/iwidgets/demos/demo.html
new file mode 100644
index 00000000000..2da81a8a186
--- /dev/null
+++ b/iwidgets/demos/demo.html
@@ -0,0 +1,42 @@
+<title>Demo HTML Page</title>
+<body bgcolor="white" link="blue" vlink="NavyBlue" alink="red">
+<center>
+<img src="iwidgets.gif" alt="iwidgets logo"> <br>
+</center>
+<blockquote>
+<h2>Display Your HTML Pages</h2>
+<p>
+Now you can write all of your documentation in HTML format!
+You can publish it on the World Wide Web, or bundle it with
+your tool and display it using
+a <a href="html/hyperhelp.n.html">hyperhelp</a>
+or <a href="html/scrolledhtml.n.html">scrolledhtml</a> widget.
+
+<p>
+<hr size=3 width=95% align=center noshade>
+<p>
+
+Most of the usual HTML tags are recognized and supported.<br>
+So you can include things like:
+<p>
+<ul>
+<li> block quotes
+<li> <b>bold</b>
+<li> <tt>code</tt>
+<li> color images
+<li> definition lists
+<li> directory lists
+<li> <i>italic</i>
+<li> preformatted text
+<li> <sup>sup</sup>erscript
+<li> unordered lists
+<li> ...and much, <em>much</em> more!
+</ul>
+
+<p>
+<hr size=3 width=95% align=center noshade>
+<p>
+
+<big>Build it. Document it. Let us display it.</big>
+</blockquote>
+</body>
diff --git a/iwidgets/demos/dialog b/iwidgets/demos/dialog
new file mode 100644
index 00000000000..17890eb8d4b
--- /dev/null
+++ b/iwidgets/demos/dialog
@@ -0,0 +1,47 @@
+# ----------------------------------------------------------------------
+# DEMO: dialog in [incr Widgets]
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+
+iwidgets::radiobox .rb -labelpos nw \
+ -labeltext "Use modality to\nlock up your\napplication:"
+pack .rb -padx 4 -pady 4
+
+.rb add none -text "-modality none"
+.rb add application -text "-modality application"
+.rb add global -text "-modality global"
+.rb select none
+
+button .activate -text "Push Me" -command {
+ .d configure -modality [.rb get]
+ .d activate
+}
+pack .activate
+
+#
+# Build a generic dialog
+#
+iwidgets::dialog .d
+.d buttonconfigure OK -command {
+ puts "pushed: OK"
+ .d deactivate 1
+}
+.d buttonconfigure Apply -command {
+ puts "pushed: Apply"
+}
+.d buttonconfigure Cancel -command {
+ puts "pushed: Cancel"
+ .d deactivate 0
+}
+.d buttonconfigure Help -command {
+ puts "pushed: Help"
+}
+
+#
+# Add something to the top of the dialog...
+#
+set win [.d childsite]
+label $win.ex -text "Standard Dialog\n(put your widgets here)" \
+ -background black -foreground white \
+ -width 40 -height 5
+pack $win.ex -expand yes -fill both -padx 4 -pady 4
diff --git a/iwidgets/demos/dialogshell b/iwidgets/demos/dialogshell
new file mode 100644
index 00000000000..1e3cd408ce1
--- /dev/null
+++ b/iwidgets/demos/dialogshell
@@ -0,0 +1,35 @@
+# ----------------------------------------------------------------------
+# DEMO: dialogshell in [incr Widgets]
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+
+iwidgets::radiobox .rb -labeltext "Use modality to\nlock up your\napplication:"
+pack .rb -padx 4 -pady 4
+
+.rb add none -text "-modality none"
+.rb add application -text "-modality application"
+.rb add global -text "-modality global"
+.rb select none
+
+button .activate -text "Push Me" -command {
+ .ds configure -modality [.rb get]
+ .ds activate
+}
+pack .activate
+
+#
+# Build a generic dialog
+#
+iwidgets::dialogshell .ds
+
+.ds add dismiss -text "Dismiss" -command {.ds deactivate}
+.ds default dismiss
+
+#
+# Add something to the top of the dialog...
+#
+set win [.ds childsite]
+label $win.ex -text "Minimal Dialog\n(put your widgets here)" \
+ -background black -foreground white \
+ -width 40 -height 5
+pack $win.ex -expand yes -fill both -padx 4 -pady 4
diff --git a/iwidgets/demos/disjointlistbox b/iwidgets/demos/disjointlistbox
new file mode 100644
index 00000000000..e0149037ee8
--- /dev/null
+++ b/iwidgets/demos/disjointlistbox
@@ -0,0 +1,9 @@
+# ----------------------------------------------------------------------
+# DEMO: disjointlistbox in [incr Widgets]
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+
+iwidgets::disjointlistbox .dlb
+pack .dlb -padx 10 -pady 10 -fill both -expand yes
+
+.dlb insertlhs {black white red blue yellow green magenta}
diff --git a/iwidgets/demos/entryfield b/iwidgets/demos/entryfield
new file mode 100644
index 00000000000..da278a8fd80
--- /dev/null
+++ b/iwidgets/demos/entryfield
@@ -0,0 +1,33 @@
+# ----------------------------------------------------------------------
+# DEMO: entryfield in [incr Widgets]
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+
+option add *textBackground seashell
+. configure -background white
+
+iwidgets::entryfield .login -labeltext "Login:" -labelpos nw \
+ -command { focus [.passwd component entry] }
+pack .login -padx 4 -pady 4
+
+iwidgets::entryfield .passwd -labeltext "Password:" -labelpos nw -show "\267" \
+ -command { focus [.phone component entry] }
+pack .passwd -padx 4 -pady 4
+
+iwidgets::entryfield .phone -labeltext "Phone:" -labelpos nw \
+ -command { focus [.login component entry] } \
+ -validate {check_phonenum %W "%c"}
+pack .phone -padx 4 -pady 4
+
+proc check_phonenum {entry char} {
+ set current [$entry get]
+ set len [string length $current]
+ if {$len == 3 || $len == 7} {
+ $entry delete 0 end
+ $entry insert 0 "$current-"
+ }
+ if {$len < 12 && [string match {[0-9]} $char]} {
+ return 1
+ }
+ return 0
+}
diff --git a/iwidgets/demos/extbutton b/iwidgets/demos/extbutton
new file mode 100644
index 00000000000..5a199a7b5d9
--- /dev/null
+++ b/iwidgets/demos/extbutton
@@ -0,0 +1,15 @@
+# ----------------------------------------------------------------------
+# DEMO: extbutton in [incr Widgets]
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+
+iwidgets::extbutton .eb1 -text "Bitmap example" -bitmap info \
+ -background bisque -activeforeground red -bitmapforeground blue \
+ -defaultring 1 -command {puts "Bisque is beautiful"}
+
+iwidgets::extbutton .eb2 -text "Image example" -bd 3 -image \
+ [image create photo -file $iwidgets::library/demos/images/clear.gif] \
+ -font 9x15bold -background lightgreen -imagepos e \
+ -activebackground lightyellow
+
+pack .eb1 .eb2 -pady 8
diff --git a/iwidgets/demos/extfileselectionbox b/iwidgets/demos/extfileselectionbox
new file mode 100644
index 00000000000..3c5ff7b292b
--- /dev/null
+++ b/iwidgets/demos/extfileselectionbox
@@ -0,0 +1,9 @@
+# ----------------------------------------------------------------------
+# DEMO: extfileselectionbox in [incr Widgets]
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+
+option add *textBackground seashell
+
+iwidgets::extfileselectionbox .fsb -width 4i -height 4i
+pack .fsb
diff --git a/iwidgets/demos/extfileselectiondialog b/iwidgets/demos/extfileselectiondialog
new file mode 100644
index 00000000000..8cac6c0b0a3
--- /dev/null
+++ b/iwidgets/demos/extfileselectiondialog
@@ -0,0 +1,15 @@
+# ----------------------------------------------------------------------
+# DEMO: extfileselectiondialog in [incr Widgets]
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+
+iwidgets::extfileselectiondialog .efsd -modality application
+
+button .select -text "Files..." -command {
+ if {[.efsd activate]} {
+ puts "selected: [.efsd get]"
+ } else {
+ puts ""
+ }
+}
+pack .select -side left
diff --git a/iwidgets/demos/feedback b/iwidgets/demos/feedback
new file mode 100644
index 00000000000..232b5083a79
--- /dev/null
+++ b/iwidgets/demos/feedback
@@ -0,0 +1,18 @@
+# ----------------------------------------------------------------------
+# DEMO: feedback in [incr Widgets]
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+
+. configure -background white
+
+iwidgets::feedback .fb -labeltext "Status " -steps 22
+pack .fb -padx 4 -pady 4
+
+button .go -text "Go" -command {
+ .fb reset
+ for {set i 0} {$i < 22} {incr i} {
+ .fb step
+ after 100
+ }
+}
+pack .go -padx 4 -pady 4
diff --git a/iwidgets/demos/fileselectionbox b/iwidgets/demos/fileselectionbox
new file mode 100644
index 00000000000..5945d7896dc
--- /dev/null
+++ b/iwidgets/demos/fileselectionbox
@@ -0,0 +1,9 @@
+# ----------------------------------------------------------------------
+# DEMO: fileselectionbox in [incr Widgets]
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+
+option add *textBackground seashell
+
+iwidgets::fileselectionbox .fsb -width 4i -height 4i
+pack .fsb
diff --git a/iwidgets/demos/fileselectiondialog b/iwidgets/demos/fileselectiondialog
new file mode 100644
index 00000000000..56d1650a6b4
--- /dev/null
+++ b/iwidgets/demos/fileselectiondialog
@@ -0,0 +1,15 @@
+# ----------------------------------------------------------------------
+# DEMO: fileselectiondialog in [incr Widgets]
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+
+iwidgets::fileselectiondialog .fsd -modality application
+
+button .select -text "Files..." -command {
+ if {[.fsd activate]} {
+ puts "selected: [.fsd get]"
+ } else {
+ puts ""
+ }
+}
+pack .select -side left
diff --git a/iwidgets/demos/finddialog b/iwidgets/demos/finddialog
new file mode 100644
index 00000000000..25bf193b076
--- /dev/null
+++ b/iwidgets/demos/finddialog
@@ -0,0 +1,222 @@
+# ----------------------------------------------------------------------
+# DEMO: finddialog in [incr Widgets]
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+
+#
+# Demo script for the Finddialog class
+#
+proc find {} {
+ if {! [winfo exists .findd]} {
+ iwidgets::finddialog .findd -textwidget .st
+ }
+
+ .findd center .st
+ .findd activate
+}
+
+iwidgets::scrolledtext .st -visibleitems 50x14 -wrap none
+pack .st
+
+button .findb -text "Press to Search Text" -command find
+pack .findb -pady 5
+
+.st insert end "
+ The Declaration of Independence
+ (Adopted in Congress 4 July 1776)
+
+When, in the course of human events, it becomes necessary for one
+people to dissolve the political bonds which have connected them with
+another, and to assume among the powers of the earth, the separate and
+equal station to which the laws of nature and of nature's God entitle
+them, a decent respect to the opinions of mankind requires that they
+should declare the causes which impel them to the separation.
+
+We hold these truths to be self-evident, that all men are created
+equal, that they are endowed by their Creator with certain unalienable
+rights, that among these are life, liberty and the pursuit of
+happiness. That to secure these rights, governments are instituted
+among men, deriving their just powers form the consent of the
+governed. That whenever any form of government becomes destructive to
+these ends, it is the right of the people to alter or to abolish it,
+and to institute new government, laying its foundation on such
+principles and organizing its powers in such form, as to them shall
+seem most likely to effect their safety and happiness. Prudence,
+indeed, will dictate that governments long established should not be
+changed for light and transient causes; and accordingly all experience
+hath shown that mankind are more disposed to suffer, while evils are
+sufferable, than to right themselves by abolishing the forms to which
+they are accustomed. But when a long train of abuses and usurpations,
+pursuing invariably the same object evinces a design to reduce them
+under absolute despotism, it is their right, it is their duty, to
+throw off such government, and to provide new guards for their future
+security. --Such has been the patient sufferance of these colonies;
+and such is now the necessity which constrains them to alter their
+former systems of government. The history of the present King of Great
+Britain is a history of repeated injuries and usurpations, all having
+in direct object the establishment of an absolute tyranny over these
+states. To prove this, let facts be submitted to a candid world.
+
+He has refused his assent to laws, the most wholesome and necessary
+for the public good.
+
+He has forbidden his governors to pass laws of immediate and pressing
+importance, unless suspended in their operation till his assent should
+be obtained; and when so suspended, he has utterly neglected to attend
+to them.
+
+He has refused to pass other laws for the accommodation of large
+districts of people, unless those people would relinquish the right of
+representation in the legislature, a right inestimable to them and
+formidable to tyrants only.
+
+He has called together legislative bodies at places unusual,
+uncomfortable, and distant from the depository of their public
+records, for the sole purpose of fatiguing them into compliance with
+his measures.
+
+He has dissolved representative houses repeatedly, for opposing with
+manly firmness his invasions on the rights of the people.
+
+He has refused for a long time, after such dissolutions, to cause
+others to be elected; whereby the legislative powers, incapable of
+annihilation, have returned to the people at large for their exercise;
+the state remaining in the meantime exposed to all the dangers of
+invasion from without, and convulsions within.
+
+He has endeavored to prevent the population of these states; for that
+purpose obstructing the laws for naturalization of foreigners;
+refusing to pass others to encourage their migration hither, and
+raising the conditions of new appropriations of lands.
+
+He has obstructed the administration of justice, by refusing his
+assent to laws for establishing judiciary powers.
+
+He has made judges dependent on his will alone, for the tenure of
+their offices, and the amount and payment of their salaries.
+
+He has erected a multitude of new offices, and sent hither swarms of
+officers to harass our people, and eat out their substance.
+
+He has kept among us, in times of peace, standing armies without the
+consent of our legislature.
+
+He has affected to render the military independent of and superior to
+civil power.
+
+He has combined with others to subject us to a jurisdiction foreign to
+our constitution, and unacknowledged by our laws; giving his assent to
+their acts of pretended legislation:
+
+For quartering large bodies of armed troops among us:
+
+For protecting them, by mock trial, from punishment for any murders
+which they should commit on the inhabitants of these states:
+
+For cutting off our trade with all parts of the world:
+
+For imposing taxes on us without our consent:
+
+For depriving us in many cases, of the benefits of trial by jury:
+
+For transporting us beyond seas to be tried for pretended offenses:
+
+For abolishing the free system of English laws in a neighboring
+province, establishing therein an arbitrary government, and enlarging
+its boundaries so as to render it at once an example and fit
+instrument for introducing the same absolute rule in these colonies:
+
+For taking away our charters, abolishing our most valuable laws, and
+altering fundamentally the forms of our governments:
+
+For suspending our own legislatures, and declaring themselves invested
+with power to legislate for us in all cases whatsoever.
+
+He has abdicated government here, by declaring us out of his
+protection and waging war against us.
+
+He has plundered our seas, ravaged our coasts, burned our towns, and
+destroyed the lives of our people.
+
+He is at this time transporting large armies of foreign mercenaries to
+complete the works of death, desolation and tyranny, already begun
+with circumstances of cruelty and perfidy scarcely paralleled in the
+most barbarous ages, and totally unworthy the head of a civilized
+nation.
+
+He has constrained our fellow citizens taken captive on the high seas
+to bear arms against their country, to become the executioners of
+their friends and brethren, or to fall themselves by their hands.
+
+He has excited domestic insurrections amongst us, and has endeavored
+to bring on the inhabitants of our frontiers, the merciless Indian
+savages, whose known rule of warfare, is undistinguished destruction
+of all ages, sexes and conditions.
+
+In every stage of these oppressions we have petitioned for redress in
+the most humble terms: our repeated petitions have been answered only
+by repeated injury. A prince, whose character is thus marked by every
+act which may define a tyrant, is unfit to be the ruler of a free
+people.
+
+Nor have we been wanting in attention to our British brethren. We have
+warned them from time to time of attempts by their legislature to
+extend an unwarrantable jurisdiction over us. We have reminded them of
+the circumstances of our emigration and settlement here. We have
+appealed to their native justice and magnanimity, and we have conjured
+them by the ties of our common kindred to disavow these usurpations,
+which, would inevitably interrupt our connections and
+correspondence. We must, therefore, acquiesce in the necessity, which
+denounces our separation, and hold them, as we hold the rest of
+mankind, enemies in war, in peace friends.
+
+We, therefore, the representatives of the United States of America, in
+General Congress, assembled, appealing to the Supreme Judge of the
+world for the rectitude of our intentions, do, in the name, and by the
+authority of the good people of these colonies, solemnly publish and
+declare, that these united colonies are, and of right ought to be free
+and independent states; that they are absolved from all allegiance to
+the British Crown, and that all political connection between them and
+the state of Great Britain, is and ought to be totally dissolved; and
+that as free and independent states, they have full power to levy war,
+conclude peace, contract alliances, establish commerce, and to do all
+other acts and things which independent states may of right do. And
+for the support of this declaration, with a firm reliance on the
+protection of Divine Providence, we mutually pledge to each other our
+lives, our fortunes and our sacred honor.
+
+New Hampshire: Josiah Bartlett, William Whipple, Matthew Thornton
+
+Massachusetts: John Hancock, Samual Adams, John Adams, Robert Treat
+Paine, Elbridge Gerry
+
+Rhode Island: Stephen Hopkins, William Ellery
+
+Connecticut: Roger Sherman, Samuel Huntington, William Williams,
+Oliver Wolcott
+
+New York: William Floyd, Philip Livingston, Francis Lewis, Lewis
+Morris
+
+New Jersey: Richard Stockton, John Witherspoon, Francis Hopkinson,
+John Hart, Abraham Clark
+
+Pennsylvania: Robert Morris, Benjamin Rush, Benjamin Franklin, John
+Morton, George Clymer, James Smith, George Taylor, James Wilson,
+George Ross
+
+Delaware: Caesar Rodney, George Read, Thomas McKean
+
+Maryland: Samuel Chase, William Paca, Thomas Stone, Charles Carroll of
+Carrollton
+
+Virginia: George Wythe, Richard Henry Lee, Thomas Jefferson, Benjamin
+Harrison, Thomas Nelson, Jr., Francis Lightfoot Lee, Carter Braxton
+
+North Carolina: William Hooper, Joseph Hewes, John Penn
+
+South Carolina: Edward Rutledge, Thomas Heyward, Jr., Thomas Lynch,
+Jr., Arthur Middleton
+
+Georgia: Button Gwinnett, Lyman Hall, George Walton
+"
diff --git a/iwidgets/demos/hierarchy b/iwidgets/demos/hierarchy
new file mode 100644
index 00000000000..efe26ca4e81
--- /dev/null
+++ b/iwidgets/demos/hierarchy
@@ -0,0 +1,154 @@
+# ----------------------------------------------------------------------
+# DEMO: hierarchy in [incr Widgets]
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+
+# This demo displays a users file system starting at thier HOME
+# directory. You can change the starting directory by setting the
+# environment variable SHOWDIR.
+#
+if {![info exists env(SHOWDIR)]} {
+ set env(SHOWDIR) $env(HOME)
+}
+
+# ----------------------------------------------------------------------
+# PROC: get_files file
+#
+# Used as the -querycommand for the hierarchy viewer. Returns the
+# list of files under a particular directory. If the file is "",
+# then the SHOWDIR is used as the directory. Otherwise, the node itself
+# is treated as a directory. The procedure returns a unique id and
+# the text to be displayed for each file. The unique id is the complete
+# path name and the text is the file name.
+# ----------------------------------------------------------------------
+proc get_files {file} {
+ global env
+
+ if {$file == ""} {
+ set dir $env(SHOWDIR)
+ } else {
+ set dir $file
+ }
+
+ if {[catch {cd $dir}] != 0} {
+ return ""
+ }
+
+ set rlist ""
+
+ foreach file [lsort [glob -nocomplain *]] {
+ lappend rlist [list [file join $dir $file] $file]
+ }
+
+ return $rlist
+}
+
+# ----------------------------------------------------------------------
+# PROC: select_node tags status
+#
+# Select/Deselect the node given the tags and current selection status.
+# The unique id which is the complete file path name is mixed in with
+# all the tags for the node. So, we'll find it by searching for our
+# SHOWDIR and then doing the selection or deselection.
+# ----------------------------------------------------------------------
+proc select_node {tags status} {
+ global env
+
+ set uid [lindex $tags [lsearch -regexp $tags $env(SHOWDIR)]]
+
+ if {$status} {
+ .h selection remove $uid
+ } else {
+ .h selection add $uid
+ }
+}
+
+# ----------------------------------------------------------------------
+# PROC: expand_node tags
+#
+# Expand the node given the tags. The unique id which is the complete
+# file path name is mixed in with all the tags for the node. So, we'll
+# find it by searching for our SHOWDIR and then doing the expansion.
+# ----------------------------------------------------------------------
+proc expand_node {tags} {
+ global env
+
+ set uid [lindex $tags [lsearch -regexp $tags $env(SHOWDIR)]]
+
+ .h expand $uid
+}
+
+# ----------------------------------------------------------------------
+# PROC: collapse_node tags
+#
+# Collapse the node given the tags. The unique id which is the complete
+# file path name is mixed in with all the tags for the node. So, we'll
+# find it by searching for our SHOWDIR and then doing the collapse.
+# ----------------------------------------------------------------------
+proc collapse_node {tags} {
+ global env
+
+ set uid [lindex $tags [lsearch -regexp $tags $env(SHOWDIR)]]
+
+ .h collapse $uid
+}
+
+# ----------------------------------------------------------------------
+# PROC: expand_recursive
+#
+# Recursively expand all the file nodes in the hierarchy.
+# ----------------------------------------------------------------------
+proc expand_recursive {node} {
+ set files [get_files $node]
+
+ foreach tagset $files {
+ set uid [lindex $tagset 0]
+
+ .h expand $uid
+
+ if {[get_files $uid] != {}} {
+ expand_recursive $uid
+ }
+ }
+}
+
+# ----------------------------------------------------------------------
+# PROC: expand_all
+#
+# Expand all the file nodes in the hierarchy.
+# ----------------------------------------------------------------------
+proc expand_all {} {
+ expand_recursive ""
+}
+
+# ----------------------------------------------------------------------
+# PROC: collapse_all
+#
+# Collapse all the nodes in the hierarchy.
+# ----------------------------------------------------------------------
+proc collapse_all {} {
+ .h configure -querycommand "get_files %n"
+}
+
+#
+# Create the hierarchy mega-widget, adding commands to both the item
+# and background popup menus.
+#
+iwidgets::hierarchy .h -querycommand "get_files %n" -visibleitems 30x15 \
+ -labeltext $env(SHOWDIR) -selectcommand "select_node %n %s"
+pack .h -side left -expand yes -fill both
+
+.h component itemMenu add command -label "Select" \
+ -command {select_node [.h current] 0}
+.h component itemMenu add command -label "Deselect" \
+ -command {select_node [.h current] 1}
+.h component itemMenu add separator
+.h component itemMenu add command -label "Expand" \
+ -command {expand_node [.h current]}
+.h component itemMenu add command -label "Collapse" \
+ -command {collapse_node [.h current]}
+
+.h component bgMenu add command -label "Expand All" -command expand_all
+.h component bgMenu add command -label "Collapse All" -command collapse_all
+.h component bgMenu add command -label "Clear Selections" \
+ -command {.h selection clear}
diff --git a/iwidgets/demos/html/buttonbox.n.html b/iwidgets/demos/html/buttonbox.n.html
new file mode 100644
index 00000000000..94002d3a7e0
--- /dev/null
+++ b/iwidgets/demos/html/buttonbox.n.html
@@ -0,0 +1,217 @@
+<TITLE>buttonbox - Create and manipulate a manager widget for buttons</TITLE>
+<H1>buttonbox - Create and manipulate a manager widget for buttons</H1>
+
+</pre><H2>SYNOPSIS</H2>
+<B>buttonbox<I> <I>pathName </I>?<I>options</I>?
+</pre><H2>INHERITANCE</H2>
+itk::Widget &lt;- buttonbox
+</pre><H2>STANDARD OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>background</B><br>
+</td>
+<td valign=top>
+<B>cursor</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/options.n.html"> "options" </A> manual entry for details on the standard options.
+</pre><H2>WIDGET-SPECIFIC OPTIONS</H2>
+<P>
+<pre>
+Name: <B>orient</B>
+Class: <B>Orient</B>
+Command-Line Switch: <B>-orient</B>
+</pre>
+<UL>
+Orientation of the button box: <B>horizontal</B> or <B>vertical</B>. The default
+is horizontal.
+</UL>
+<P>
+<pre>
+Name: <B>padX</B>
+Class: <B>PadX</B>
+Command-Line Switch: <B>-padx</B>
+</pre>
+<UL>
+Specifies a non-negative padding distance to leave between the button group and
+the outer edge of the button box in the x direction. The value may be
+given in any of the forms acceptable to <B>Tk_GetPixels</B>. The default
+is 5 pixels.
+</UL>
+<P>
+<pre>
+Name: <B>padY</B>
+Class: <B>PadY</B>
+Command-Line Switch: <B>-pady</B>
+</pre>
+<UL>
+Specifies a non-negative padding distance to leave between the button group and
+the outer edge of the button box in the y direction. The value may be given
+in any of the forms acceptable to <B>Tk_GetPixels</B>. The default is 5 pixels.
+</UL>
+<P>
+</pre><HR>
+
+</pre><H2>DESCRIPTION</H2>
+<P>
+The <B>buttonbox</B> command creates a manager widget for controlling
+buttons. The button box also supports the display and invocation
+of a default button. The button box can be configured either horizontally
+or vertically.
+
+</pre><H2>METHODS</H2>
+<P>
+The <B>buttonbox</B> command creates a new Tcl command whose
+name is <I>pathName</I>. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+<pre>
+<I>pathName option </I>?<I>arg arg ...</I>?
+</pre>
+<I>Option</I> and the <I>arg</I>s
+determine the exact behavior of the command.
+<P>
+Many of the widget commands for the buttonbox take as one argument an
+indicator of which button of the button box to operate on. These
+indicators are called <I>indexes</I> and allow reference and manipulation
+of buttons regardless of their current map state. buttonbox indexes
+may be specified in any of the following forms:
+<DL>
+<DT> <I>number</I>
+</I></B>
+<DD> Specifies the button numerically, where 0 corresponds to the
+left/top-most button of the button box.
+</DL>
+<DL>
+<DT> <B>end</B>
+</I></B>
+<DD> Indicates the right/bottom-most button of the button box.
+</DL>
+<DL>
+<DT> <B>default</B>
+</I></B>
+<DD> Indicates the current default button of the button box. This is the
+button with the default ring displayed.
+</DL>
+<DL>
+<DT> <I>pattern</I>
+</I></B>
+<DD> If the index doesn't satisfy one of the above forms then this
+form is used. <I>Pattern</I> is pattern-matched against the tag of
+each button in the button box, in order from left/top to right/left,
+until a matching entry is found. The rules of <B>Tcl_StringMatch</B>
+are used.
+
+</DL>
+</pre><H2>WIDGET-SPECIFIC METHODS</H2>
+<DL>
+<DT> <I>pathName <B>add</B> <I>tag</I> <I>args</I>
+</I></B>
+<DD> Add a button distinguished by <I>tag</I> to the end of the button box.
+If additional arguments are present they specify options to be applied
+to the button. See <B>PushButton</B> for information on the options
+available.
+</DL>
+<DL>
+<DT> <I>pathName <B>buttonconfigure</B> <I>index</I> ?<I>options</I>?
+</I></B>
+<DD> This command is similar to the <B>configure</B> command, except that
+it applies to the options for an individual button,
+whereas <B>configure</B> applies to the options for the button box as a whole.
+<I>Options</I> may have any of the values accepted by the <B>PushButton</B>
+command. If <I>options</I> are specified, options are modified
+as indicated in the command and the command returns an empty string.
+If no <I>options</I> are specified, returns a list describing
+the current options for entry <I>index</I> (see <B>Tk_ConfigureInfo</B> for
+information on the format of this list).
+</DL>
+<DL>
+<DT> <I>pathName <B>cget</B> <I>option</I>
+</I></B>
+<DD> Returns the current value of the configuration option given
+by <I>option</I>.
+<I>Option</I> may have any of the values accepted by the <B>buttonbox</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>configure</B> ?<I>option</I>? ?<I>value option value ...</I>?
+</I></B>
+<DD> Query or modify the configuration options of the widget.
+If no <I>option</I> is specified, returns a list describing all of
+the available options for <I>pathName</I> (see <B>Tk_ConfigureInfo</B> for
+information on the format of this list). If <I>option</I> is specified
+with no <I>value</I>, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no <I>option</I> is specified). If
+one or more <I>option-value</I> pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+<I>Option</I> may have any of the values accepted by the <B>buttonbox</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName <B>default</B> <I>index</I>
+</I></B>
+<DD> Sets the default button to the button given by <I>index</I>. This causes
+the default ring to appear arround the specified button.
+</DL>
+<DL>
+<DT> <I>pathName <B>delete</B> <I>index</I>
+</I></B>
+<DD> Deletes the button given by <I>index</I> from the button box.
+</DL>
+<DL>
+<DT> <I>pathName <B>hide</B> <I>index</I>
+</I></B>
+<DD> Hides the button denoted by <I>index</I>. This doesn't remove the button
+permanently, just inhibits its display.
+</DL>
+<DL>
+<DT> <I>pathName <B>index <I>index</I>
+</I></B>
+<DD> Returns the numerical index corresponding to <I>index</I>.
+</DL>
+<DL>
+<DT> <I>pathName <B>insert <I>index</I> <I>tag</I> ?<I>option value option value ...</I>?
+</I></B>
+<DD> Same as the <B>add</B> command except that it inserts the new
+button just before the one given by <I>index</I>, instead of appending
+to the end of the button box. The <I>option</I>, and <I>value</I>
+arguments have the same interpretation as for the <B>add</B> widget
+command.
+</DL>
+<DL>
+<DT> <I>pathName <B>invoke</B> <I>?index?</I>
+</I></B>
+<DD> Invoke the command associated with a button. If no arguments
+are given then the current default button is invoked, otherwise the argument
+is expected to be a button <I>index</I>.
+</DL>
+<DL>
+<DT> <I>pathName <B>show</B> <I>index</I>
+</I></B>
+<DD> Display a previously hidden button denoted by <I>index</I>.
+</DL>
+</pre><H2>EXAMPLE</H2>
+<pre>
+ buttonbox .bb
+
+ .bb add Yes -text Yes -command "puts Yes"
+ .bb add No -text No -command "puts No"
+ .bb add Maybe -text Maybe -command "puts Maybe"
+ .bb default Yes
+
+ pack .bb -expand yes -fill both
+</pre>
+</pre><H2>AUTHORS</H2>
+Bret A. Schuhmacher
+<P>
+Mark L. Ulferts
+</pre><H2>KEYWORDS</H2>
+buttonbox, pushbutton, button, widget
diff --git a/iwidgets/demos/html/calendar.n.html b/iwidgets/demos/html/calendar.n.html
new file mode 100644
index 00000000000..cb1cbb52908
--- /dev/null
+++ b/iwidgets/demos/html/calendar.n.html
@@ -0,0 +1,363 @@
+<TITLE>calendar - Create and manipulate a monthly calendar</TITLE>
+<H1>calendar - Create and manipulate a monthly calendar</H1>
+
+</pre><H2>SYNOPSIS</H2>
+<B>calendar<I> <I>pathName </I>?<I>options</I>?
+</pre><H2>INHERITANCE</H2>
+itk::Widget &lt;- calendar
+</pre><H2>STANDARD OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>background</B><br>
+</td>
+<td valign=top>
+<B>cursor</B><br>
+</td>
+<td valign=top>
+<B>foreground</B><br>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/options.n.html"> "options" </A> manual entry for details on the standard options.
+</pre><H2>ASSOCIATED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>int</B><br>
+</td></table>
+<P>
+See the "datefield" manual entry for details on this option. Note that
+this option is needed when the calendar is used in conjunction
+with the dateentry widget. It is necessary for support of international
+date formats in versions of Tk less than 8.4.
+</pre><H2>WIDGET-SPECIFIC OPTIONS</H2>
+<P>
+<pre>
+Name: <B>backwardImage</B>
+Class: <B>Image</B>
+Command-Line Switch: <B>-backwardimage</B>
+</pre>
+<UL>
+Specifies a image to be displayed on the backwards calendar
+button. This image must have been created previously with
+the <B>image create</B> command. If none is specified, a default
+is provided.
+</UL>
+<P>
+<pre>
+Name: <B>buttonForeground</B>
+Class: <B>Foreground</B>
+Command-Line Switch: <B>-buttonforeground</B>
+</pre>
+<UL>
+Specifies the foreground color of the forward and backward buttons
+in any of the forms acceptable to <B>Tk_GetColor</B>. The default
+color is blue.
+</UL>
+<P>
+<pre>
+Name: <B>command</B>
+Class: <B>Command</B>
+Command-Line Switch: <B>-command</B>
+</pre>
+<UL>
+Specifies a Tcl script to executed upon selection of a date in the
+calendar. If the command script contains any <B>%</B> characters,
+then the script will not be executed directly. Instead, a new
+script will be generated by replacing each <B>%</B>, and the
+character following it, with information from the calendar. The
+replacement depends on the character following the <B>%</B>, as
+defined in the list below.
+</UL>
+<DL>
+<DT> <B>%d</B>
+</I></B>
+<DD> Replaced with the date selected in the format mm/dd/yyyy.
+</DL>
+<P>
+<pre>
+Name: <B>currentDateFont</B>
+Class: <B>Font</B>
+Command-Line Switch: <B>-currentdatefont</B>
+</pre>
+<UL>
+Specifies the font used for the current date text in any of the forms
+acceptable to <B>Tk_GetFont</B>.
+</UL>
+<P>
+<pre>
+Name: <B>dateFont</B>
+Class: <B>Font</B>
+Command-Line Switch: <B>-datefont</B>
+</pre>
+<UL>
+Specifies the font used for the days of the month text in any of the forms
+acceptable to <B>Tk_GetFont</B>.
+</UL>
+<P>
+<pre>
+Name: <B>dayFont</B>
+Class: <B>Font</B>
+Command-Line Switch: <B>-dayfont</B>
+</pre>
+<UL>
+Specifies the font used for the days of the week text in any of the forms
+acceptable to <B>Tk_GetFont</B>.
+</UL>
+<P>
+<pre>
+Name: <B>days</B>
+Class: <B>days</B>
+Command-Line Switch: <B>-days</B>
+</pre>
+<UL>
+Specifies a list of values to be used for the days of the week
+text to displayed above the days of the month. The default value
+is {Su Mo Tu We Th Fr Sa}.
+</UL>
+<P>
+<pre>
+Name: <B>forewardImage</B>
+Class: <B>Image</B>
+Command-Line Switch: <B>-forewardimage</B>
+</pre>
+<UL>
+Specifies a image to be displayed on the forewards calendar
+button. This image must have been created previously with
+the <B>image create</B> command. If none is specified, a default
+is provided.
+</UL>
+<P>
+<pre>
+Name: <B>height</B>
+Class: <B>Height</B>
+Command-Line Switch: <B>-height</B>
+</pre>
+<UL>
+Specifies a desired window height that the calendar widget should
+request from its geometry manager. The value may be specified in any
+of the forms acceptable to <B>Tk_GetPixels</B>. The default height
+is 165 pixels.
+</UL>
+<P>
+<pre>
+Name: <B>outline</B>
+Class: <B>Outline</B>
+Command-Line Switch: <B>-outline</B>
+</pre>
+<UL>
+Specifies the outline color used to surround the days of the month text in
+any of the forms acceptable to <B>Tk_GetColor</B>. The default is the
+same color as the background.
+</UL>
+<P>
+<pre>
+Name: <B>selectColor</B>
+Class: <B>Foreground</B>
+Command-Line Switch: <B>-selectcolor</B>
+</pre>
+<UL>
+Specifies the color of the ring displayed that distinguishes the
+currently selected date in any of the forms acceptable to
+<B>Tk_GetColor</B>. The default is red.
+</UL>
+<P>
+<pre>
+Name: <B>selectThickness</B>
+Class: <B>SelectThickness</B>
+Command-Line Switch: <B>-selectthickness</B>
+</pre>
+<UL>
+Specifies the thickness of the ring displayed that distinguishes
+the currently selected date. The default is 3 pixels.
+</UL>
+<P>
+<pre>
+Name: <B>startday</B>
+Class: <B>Day</B>
+Command-Line Switch: <B>-startday</B>
+</pre>
+<UL>
+Specifies the starting day for the week: <B>sunday</B>, <B>monday</B>,
+<B>tuesday</B>, <B>wednesday</B>, <B>thursday</B>, <B>friday</B>, or
+<B>saturday</B>. The default is sunday.
+</UL>
+<P>
+<pre>
+Name: <B>titleFont</B>
+Class: <B>Font</B>
+Command-Line Switch: <B>-titlefont</B>
+</pre>
+<UL>
+Specifies the font used for the title text which consists of the
+month and year. The font may be given in any of the forms
+acceptable to <B>Tk_GetFont</B>.
+</UL>
+<P>
+<pre>
+Name: <B>weekdayBackground</B>
+Class: <B>Background</B>
+Command-Line Switch: <B>-weekdaybackground</B>
+</pre>
+<UL>
+Specifies the background color for the weekdays which allows it to
+be visually distinguished from the weekend. The color may be given
+in any of the forms acceptable to <B>Tk_GetColor</B>. The default is
+the same as the background.
+</UL>
+<P>
+<pre>
+Name: <B>weekendBackground</B>
+Class: <B>Background</B>
+Command-Line Switch: <B>-weekendbackground</B>
+</pre>
+<UL>
+Specifies the background color for the weekends which allows it to
+be visually distinguished from the weekdays. The color may be given
+in any of the forms acceptable to <B>Tk_GetColor</B>. The default is
+the same as the background.
+</UL>
+<P>
+<pre>
+Name: <B>width</B>
+Class: <B>Width</B>
+Command-Line Switch: <B>-width</B>
+</pre>
+<UL>
+Specifies a desired window width that the calendar widget should
+request from its geometry manager. The value may be specified in any
+of the forms acceptable to <B>Tk_GetPixels</B>. The default width
+is 200 pixels.
+</UL>
+<P>
+</pre><HR>
+
+</pre><H2>DESCRIPTION</H2>
+<P>
+The <B>calendar</B> command creates a calendar widget for the selection
+of a date, displaying a single month at a time. Buttons exist on the
+top to change the month in effect turning the pages of a calendar. As
+a page is turned, the dates for the month are modified. Selection of
+a date visually marks that date. The selected value can be monitored
+via the -command option or just retrieved using the get command.
+
+</pre><H2>METHODS</H2>
+<P>
+The <B>calendar</B> command creates a new Tcl command whose
+name is <I>pathName</I>. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+<pre>
+<I>pathName option </I>?<I>arg arg ...</I>?
+</pre>
+<I>Option</I> and the <I>arg</I>s
+determine the exact behavior of the command. The following
+commands are possible for calendar widgets:
+
+</pre><H2>WIDGET-SPECIFIC METHODS</H2>
+<DL>
+<DT> <I>pathName <B>cget</B> <I>option</I>
+</I></B>
+<DD> Returns the current value of the configuration option given
+by <I>option</I>.
+<I>Option</I> may have any of the values accepted by the <B>calendar</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>configure</B> ?<I>option</I>? ?<I>value option value ...</I>?
+</I></B>
+<DD> Query or modify the configuration options of the widget.
+If no <I>option</I> is specified, returns a list describing all of
+the available options for <I>pathName</I> (see <B>Tk_ConfigureInfo</B> for
+information on the format of this list). If <I>option</I> is specified
+with no <I>value</I>, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no <I>option</I> is specified). If
+one or more <I>option-value</I> pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+<I>Option</I> may have any of the values accepted by the <B>calendar</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName <B>get</B> ?<B>format</B>?
+</I></B>
+<DD> Returns the currently selected date in a format of
+string or as an integer clock value using the <B>-string</B> and <B>-clicks</B>
+format options respectively. The default is by string. Reference the
+clock command for more information on obtaining dates and their
+formats.
+</DL>
+<DL>
+<DT> <I>pathName <B>select</B> <I>date</I>
+</I></B>
+<DD> Changes the currently selected date to the value specified which
+must be in the form of a date string, an integer clock value or as
+the keyword "now". Reference the clock
+command for more information on obtaining dates and their formats.
+Note that selecting a date does not change the
+month being shown to that of the date given. This chore is left
+to the <B>show\R command.
+</DL>
+<DL>
+<DT> <I>pathName <B>show</B> <I>date</I>
+</I></B>
+<DD> Changes the currently displayed date to be that of the date
+argument which must be in the form of a date string, an
+integer clock value or as
+the keyword "now". Reference the clock
+command for more information on obtaining dates and their formats.
+
+</DL>
+</pre><H2>COMPONENTS</H2>
+<P>
+<pre>
+Name: <B>forward</B>
+Class: <B>Button</B>
+</pre>
+<UL>
+The forward component provides the button on the upper right of the
+calendar that changes the month to be the next. See the "button"
+widget manual entry for details on the forward component item.
+</UL>
+<P>
+<pre>
+Name: <B>page</B>
+Class: <B>Canvas</B>
+</pre>
+<UL>
+The page component provides the canvas on which the title, days of the
+week, and days of the month appear. See the "canvas" widget manual
+entry for details on the page component item.
+</UL>
+<P>
+<pre>
+Name: <B>backward</B>
+Class: <B>Button</B>
+</pre>
+<UL>
+The backward component provides the button on the upper right of the
+calendar that changes the month to be the next. See the "button"
+widget manual entry for details on the backward component item.
+
+</UL>
+</pre><H2>EXAMPLE</H2>
+<pre>
+ proc selectCmd {date} {
+ puts $date
+ }
+
+ calendar .c -command {selectCmd %d} -weekendbackground mistyrose \\
+ -weekdaybackground ghostwhite -outline black \\
+ -startday wednesday -days {We Th Fr Sa Su Mo Tu}
+ pack .c
+</pre>
+</pre><H2>AUTHORS</H2>
+Mark L. Ulferts
+<P>
+Michael J. McLennan
+</pre><H2>KEYWORDS</H2>
+calendar, widget
diff --git a/iwidgets/demos/html/canvasprintbox.n.html b/iwidgets/demos/html/canvasprintbox.n.html
new file mode 100644
index 00000000000..9bb16a79692
--- /dev/null
+++ b/iwidgets/demos/html/canvasprintbox.n.html
@@ -0,0 +1,303 @@
+<TITLE>canvasprintbox - Create and manipulate a canvas print box widget</TITLE>
+<H1>canvasprintbox - Create and manipulate a canvas print box widget</H1>
+
+</pre><H2>SYNOPSIS</H2>
+<B>canvasprintbox<I> <I>pathName </I>?<I>options</I>?
+</pre><H2>INHERITANCE</H2>
+itk::Widget &lt;- Canvasprintbox
+</pre><H2>STANDARD OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>activeBackground</B><br>
+<B>foreground</B><br>
+<B>insertBackground</B><br>
+<B>insertWidth</B><br>
+<B>selectBackground</B><br>
+</td>
+<td valign=top>
+<B>background</B><br>
+<B>highlightBackground</B><br>
+<B>insertBorderWidth</B><br>
+<B>relief</B><br>
+<B>selectBorderWidth</B><br>
+</td>
+<td valign=top>
+<B>borderWidth</B><br>
+<B>highlightColor</B><br>
+<B>insertOffTime</B><br>
+<B>repeatDelay</B><br>
+<B>selectForeground</B><br>
+</td>
+<td valign=top>
+<B>cursor</B><br>
+<B>highlightThickness</B><br>
+<B>insertOnTime</B><br>
+<B>repeatInterval</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/options.n.html"> "options" </A> manual entry for details on the standard options.
+</pre><H2>ASSOCIATED OPTIONS</H2>
+<UL>
+</UL>
+<P>
+</pre><H2>WIDGET-SPECIFIC OPTIONS</H2>
+<P>
+<pre>
+Name: <B>filename</B>
+Class: <B>FileName</B>
+Command-Line Switch: <B>-filename</B>
+</pre>
+<UL>
+The file to write the postscript output to (Only when output
+is set to "file"). If posterizing is turned on and <B>hpagecnt</B>
+and/or <B>vpagecnt</B> is more than 1, x.y is appended to the filename
+where x is the horizontal page number and y the vertical page number.
+</UL>
+<P>
+<pre>
+Name: <B>hpagecnt</B>
+Class: <B>PageCnt</B>
+Command-Line Switch: <B>-hpagecnt</B>
+</pre>
+<UL>
+Is used in combination with <B>posterize</B> to determine over
+how many pages the output should be distributed. This
+attribute specifies how many pages should be used horizontaly.
+Any change to this attribute will automatically update the "stamp".
+Defaults to 1.
+</UL>
+<P>
+<pre>
+Name: <B>orient</B>
+Class: <B>Orient</B>
+Command-Line Switch: <B>-orient</B>
+</pre>
+<UL>
+Determines the orientation of the output to the printer (or file).
+It can take the value "portrait" or "landscape" (default). Changes
+to this attribute will be reflected immediately in the "stamp".
+Defaults to "landscape" but will be changed automaticaly to the value
+deemed appropiate for the current canvas. Setting this attribute
+when the canvasprintbox is first constructed (instead of using the
+"configure" method) will turn off the auto adjustment of this attribute.
+</UL>
+<P>
+<pre>
+Name: <B>output</B>
+Class: <B>Output</B>
+Command-Line Switch: <B>-output</B>
+</pre>
+<UL>
+Specifies where the postscript output should go: to the printer
+or to a file. Can take on the values "printer" or "file".
+The corresponding entry-widget will reflect the contents of
+either the <B>printcmd</B> attribute or the <B>filename</B> attribute.
+Defaults to "printer".
+</UL>
+<P>
+<pre>
+Name: <B>pageSize</B>
+Class: <B>PageSize</B>
+Command-Line Switch: <B>-pagesize</B>
+</pre>
+<UL>
+The pagesize the printer supports. Changes to this attribute
+will be reflected immediately in the "stamp".
+Defaults to "a4".
+</UL>
+<P>
+<pre>
+Name: <B>posterize</B>
+Class: <B>Posterize</B>
+Command-Line Switch: <B>-posterize</B>
+</pre>
+<UL>
+Indicates if posterizing is turned on or not. Posterizing
+the output means that it is possible to distribute the
+output over more than one page. This way it is possible to
+print a canvas/region which is larger than the specified
+pagesize without stretching. If used in combination with
+stretching it can be used to "blow up" the contents of a
+canvas to as large as size as you want (See attributes:
+hpagecnt and vpagecnt). Any change to this attribute will
+automatically update the "stamp".
+Defaults to 0.
+</UL>
+<P>
+<pre>
+Name: <B>printCmd</B>
+Class: <B>PrintCmd</B>
+Command-Line Switch: <B>-printcmd</B>
+</pre>
+<UL>
+The command to execute when printing the postscript output.
+The command will get the postscript directed to its standard
+input (Only when output is set to "printer").
+Defaults to "lpr".
+</UL>
+<P>
+<pre>
+Name: <B>printRegion</B>
+Class: <B>PrintRegion</B>
+Command-Line Switch: <B>-printregion</B>
+</pre>
+<UL>
+A list of four coordinates specifying which part of the canvas to print.
+An empty list means that the canvas' entire <B>scrollregion</B> should be
+printed. Any change to this attribute will automatically update the "stamp".
+Defaults to an empty list.
+</UL>
+<P>
+<pre>
+Name: <B>stretch</B>
+Class: <B>Stretch</B>
+Command-Line Switch: <B>-stretch</B>
+</pre>
+<UL>
+Determines if the output should be stretched to fill the
+page (as defined by the attribute pagesize) as large as
+possible. The aspect-ratio of the output will be retained
+and the output will never fall outside of the boundaries
+of the page.
+Defaults to 0 but will be changed automaticaly to the value
+deemed appropiate for the current canvas. Setting this attribute
+when the canvasprintbox is first constructed (instead of using the
+"configure" method) will turn off the auto adjustment of this attribute.
+</UL>
+<P>
+<pre>
+Name: <B>vPageCnt</B>
+Class: <B>PageCnt</B>
+Command-Line Switch: <B>-vpagecnt</B>
+</pre>
+<UL>
+Is used in combination with "posterize" to determine over
+how many pages the output should be distributed. This
+attribute specifies how many pages should be used verticaly.
+Any change to this attribute will automatically update the "stamp".
+Defaults to 1.
+</UL>
+<P>
+</pre><HR>
+
+</pre><H2>DESCRIPTION</H2>
+<P>
+Implements a print box for printing the contents of a canvas widget
+to a printer or a file. It is possible to specify page orientation, the
+number of pages to print the image on and if the output should be
+stretched to fit the page. Options exist to control the appearance and
+actions of the widget.
+
+</pre><H2>METHODS</H2>
+<P>
+The <B>canvasprintbox</B> command creates a new Tcl command whose
+name is <I>pathName</I>. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+<pre>
+<I>pathName option </I>?<I>arg arg ...</I>?
+</pre>
+<I>Option</I> and the <I>arg</I>s
+determine the exact behavior of the command. The following
+commands are possible for canvasprintbox widgets:
+
+</pre><H2>WIDGET-SPECIFIC METHODS</H2>
+<DL>
+<DT> <I>pathName <B>cget</B> <I>option</I>
+</I></B>
+<DD> Returns the current value of the configuration option given
+by <I>option</I>.
+<I>Option</I> may have any of the values accepted by the <B>canvasprintbox</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>configure</B> ?<I>option</I>? ?<I>value option value ...</I>?
+</I></B>
+<DD> Query or modify the configuration options of the widget.
+If no <I>option</I> is specified, returns a list describing all of
+the available options for <I>pathName</I> (see <B>Tk_ConfigureInfo</B> for
+information on the format of this list). If <I>option</I> is specified
+with no <I>value</I>, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no <I>option</I> is specified). If
+one or more <I>option-value</I> pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+<I>Option</I> may have any of the values accepted by the <B>canvasprintbox</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>getoutput</B>
+</I></B>
+<DD> Returns the value of the <B>printercmd</B> or <B>filename</B> option
+depending on the current setting of <B>output</B>.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>print</B>
+</I></B>
+<DD> Perfrom the actual printing of the canvas using the current settings of
+all the attributes. Returns a boolean indicating wether the printing was
+successful or not.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>refresh</B>
+</I></B>
+<DD> Retrieves the current value for all edit fields and updates
+the stamp accordingly. Is useful for Apply-buttons.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>setcanvas</B> <I>canvas</I>
+</I></B>
+<DD> This is used to set the <I>canvas</I> that has to be printed.
+A stamp-sized copy will automatically be drawn to show how the
+output would look with the current settings.
+</DL>
+<DL>
+<DT> <I>pathName <B>stop</B>
+</I></B>
+<DD> Stops the drawing of the "stamp". I'm currently unable to detect
+when a Canvasprintbox gets destroyed or withdrawn. It's therefore
+advised that you perform a stop before you do something like that.
+</DL>
+</pre><H2>COMPONENTS</H2>
+<P>
+<pre>
+Name: <B>prtflentry</B>
+Class: <B>Entry</B>
+</pre>
+<UL>
+The prtflentry component is the entry field for user input of the
+<B>filename</B> or <B>printer</B> command (depending on the value of
+<B>output</B>).
+</UL>
+<P>
+<pre>
+Name: <B>hpcnt</B>
+Class: <B>Entry</B>
+</pre>
+<UL>
+The hpcnt component is the entry field for user input of the number of
+pages to use horizontaly when <B>posterize</B> is turned on.
+</UL>
+</table>
+<pre>
+Name: <B>vpcnt</B>
+Class: <B>Entry</B>
+</pre>
+<UL>
+The vpcnt component is the entry field for user input of the number of
+pages to use verticaly when <B>posterize</B> is turned on.
+</UL>
+</table>
+
+</pre><H2>EXAMPLE</H2>
+<pre>
+canvasprintbox .fsb -orient landscape -stretch 1
+pack .fsb -padx 10 -pady 10 -fill both -expand yes
+</pre>
+</pre><H2>AUTHOR</H2>
+Tako Schotanus
+</pre><H2>KEYWORDS</H2>
+canvasprintbox, widget
diff --git a/iwidgets/demos/html/canvasprintdialog.n.html b/iwidgets/demos/html/canvasprintdialog.n.html
new file mode 100644
index 00000000000..d1ca1dea7c7
--- /dev/null
+++ b/iwidgets/demos/html/canvasprintdialog.n.html
@@ -0,0 +1,250 @@
+<TITLE>canvasprintdialog - Create and manipulate a canvas print dialog widget</TITLE>
+<H1>canvasprintdialog - Create and manipulate a canvas print dialog widget</H1>
+
+</pre><H2>SYNOPSIS</H2>
+<B>canvasprintdialog<I> <I>pathName </I>?<I>options</I>?
+</pre><H2>INHERITANCE</H2>
+itk::Toplevel &lt;- Dialogshell &lt;- Dialog &lt;- Canvasprintdialog
+</pre><H2>STANDARD OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>activeBackground</B><br>
+<B>foreground</B><br>
+<B>insertBackground</B><br>
+<B>insertWidth</B><br>
+<B>selectBackground</B><br>
+</td>
+<td valign=top>
+<B>background</B><br>
+<B>highlightBackground</B><br>
+<B>insertBorderWidth</B><br>
+<B>relief</B><br>
+<B>selectBorderWidth</B><br>
+</td>
+<td valign=top>
+<B>borderWidth</B><br>
+<B>highlightColor</B><br>
+<B>insertOffTime</B><br>
+<B>repeatDelay</B><br>
+<B>selectForeground</B><br>
+</td>
+<td valign=top>
+<B>cursor</B><br>
+<B>highlightThickness</B><br>
+<B>insertOnTime</B><br>
+<B>repeatInterval</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/options.n.html"> "options" </A> manual entry for details on the standard options.
+</pre><H2>ASSOCIATED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>filename</B><br>
+<B>pagesize</B><br>
+<B>vpagecnt</B><br>
+</td>
+<td valign=top>
+<B>hpagecnt</B><br>
+<B>posterize</B><br>
+</td>
+<td valign=top>
+<B>orient</B><br>
+<B>printcmd</B><br>
+</td>
+<td valign=top>
+<B>output</B><br>
+<B>printregion</B><br>
+</td>
+</table>
+<P>
+See the "canvasprintbox" widget manual entry for details on the above
+associated options.
+
+</pre><H2>INHERITED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>buttonBoxPadX</B><br>
+<B>padY</B><br>
+</td>
+<td valign=top>
+<B>buttonBoxPadY</B><br>
+<B>separator</B><br>
+</td>
+<td valign=top>
+<B>buttonBoxPos</B><br>
+<B>thickness</B><br>
+</td>
+<td valign=top>
+<B>padX</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="dialogshell.n.html"> "dialogshell" </A> widget manual entry for details on the above
+inherited options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>master</B><br>
+</td>
+<td valign=top>
+<B>modality</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the "shell" widget manual entry for details on the above
+inherited options.
+<P>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>title</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the "Toplevel" widget manual entry for details on the above
+inherited options.
+<P>
+</pre><H2>WIDGET-SPECIFIC OPTIONS</H2>
+<P>
+</pre><HR>
+
+</pre><H2>DESCRIPTION</H2>
+<P>
+The <B>canvasprintdialog</B> command creates a print dialog for printing
+the contents of a canvas widget to a printer or a file. It is possible
+to specify page orientation, the number of pages to print the image on
+and if the output should be stretched to fit the page.
+
+</pre><H2>METHODS</H2>
+<P>
+The <B>canvasprintdialog</B> command creates a new Tcl command whose
+name is <I>pathName</I>. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+<pre>
+<I>pathName option </I>?<I>arg arg ...</I>?
+</pre>
+<I>Option</I> and the <I>arg</I>s
+determine the exact behavior of the command. The following
+commands are possible for canvasprintdialog widgets:
+</pre><H2>ASSOCIATED METHODS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>getoutput</B><br>
+</td>
+<td valign=top>
+<B>setcanvas</B><br>
+</td>
+<td valign=top>
+<B>refresh</B><br>
+</td>
+<td valign=top>
+<B>print</B><br>
+</td>
+</table>
+<P>
+See the "canvasprintbox" class manual entry for details on the
+associated methods.
+</pre><H2>INHERITED METHODS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>add</B><br>
+<B>insert</B><br>
+</td>
+<td valign=top>
+<B>buttonconfigure</B><br>
+<B>invoke</B><br>
+</td>
+<td valign=top>
+<B>default</B><br>
+<B>show</B><br>
+</td>
+<td valign=top>
+<B>hide</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="buttonbox.n.html"> "buttonbox" </A> widget manual entry for details on the above
+inherited methods.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>activate</B><br>
+</td>
+<td valign=top>
+<B>deactivate</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="dialogshell.n.html"> "dialogshell" </A> widget manual entry for details on the above
+inherited methods.
+
+</pre><H2>WIDGET-SPECIFIC METHODS</H2>
+<DL>
+<DT> <I>pathName <B>cget</B> <I>option</I>
+</I></B>
+<DD> Returns the current value of the configuration option given
+by <I>option</I>.
+<I>Option</I> may have any of the values accepted by
+the <B>canvasprintdialog</B> command.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>configure</B> ?<I>option</I>? ?<I>value option value ...</I>?
+</I></B>
+<DD> Query or modify the configuration options of the widget.
+If no <I>option</I> is specified, returns a list describing all of
+the available options for <I>pathName</I> (see <B>Tk_ConfigureInfo</B> for
+information on the format of this list). If <I>option</I> is specified
+with no <I>value</I>, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no <I>option</I> is specified). If
+one or more <I>option-value</I> pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+<I>Option</I> may have any of the values accepted by
+the <B>canvasprintdialog</B>
+command.
+
+</DL>
+</pre><H2>COMPONENTS</H2>
+<P>
+<pre>
+Name: <B>cpb</B>
+Class: <B>Canvasprintbox</B>
+</pre>
+<UL>
+The cpb component is the canvas print box for the canvas print dialog.
+See the "canvasprintbox" widget manual entry for details on the cpb
+component item.
+</UL>
+</table>
+
+</pre><H2>EXAMPLE</H2>
+<pre>
+ canvasprintdialog .cpb
+ .cpb activate
+</pre>
+</pre><H2>AUTHOR</H2>
+Tako Schotanus
+</pre><H2>KEYWORDS</H2>
+canvasprintdialog, canvasprintbox, dialog, widget
diff --git a/iwidgets/demos/html/checkbox.n.html b/iwidgets/demos/html/checkbox.n.html
new file mode 100644
index 00000000000..d0959b2a221
--- /dev/null
+++ b/iwidgets/demos/html/checkbox.n.html
@@ -0,0 +1,209 @@
+<TITLE>checkbox - Create and manipulate a checkbox widget</TITLE>
+<H1>checkbox - Create and manipulate a checkbox widget</H1>
+
+</pre><H2>SYNOPSIS</H2>
+<B>checkbox<I> <I>pathName </I>?<I>options</I>?
+</pre><H2>INHERITANCE</H2>
+itk::Widget &lt;- labeledframe &lt;- checkbox
+</pre><H2>STANDARD OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>background</B><br>
+<B>foreground</B><br>
+</td>
+<td valign=top>
+<B>borderWidth</B><br>
+<B>relief</B><br>
+</td>
+<td valign=top>
+<B>cursor</B><br>
+<B>selectColor</B><br>
+</td>
+<td valign=top>
+<B>disabledForeground</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/options.n.html"> "options" </A> manual entry for details on the standard options.
+</pre><H2>INHERITED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>labelBitmap</B><br>
+<B>labelPos</B><br>
+</td>
+<td valign=top>
+<B>labelFont</B><br>
+<B>labelText</B><br>
+</td>
+<td valign=top>
+<B>labelImage</B><br>
+<B>labelVariable</B><br>
+</td>
+<td valign=top>
+<B>labelMargin</B><br>
+</td>
+</table>
+<P>
+See the "labeledframe" class manual entry for details on the
+inherited options.
+</pre><H2>WIDGET-SPECIFIC OPTIONS</H2>
+<P>
+<pre>
+Name: <B>command</B>
+Class: <B>Command</B>
+Command-Line Switch: <B>-command</B>
+</pre>
+<UL>
+Specifies a Tcl command procedure to be evaluated following a change in
+the current check box selection.
+</UL>
+<P>
+</pre><HR>
+
+</pre><H2>DESCRIPTION</H2>
+<P>
+The <B>checkbox</B> command creates a check button box widget
+capable of adding, inserting, deleting, selecting, and configuring
+checkbuttons as well as obtaining the currently selected button.
+
+</pre><H2>METHODS</H2>
+<P>
+The <B>checkbox</B> command creates a new Tcl command whose
+name is <I>pathName</I>. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+<pre>
+<I>pathName option </I>?<I>arg arg ...</I>?
+</pre>
+<I>Option</I> and the <I>arg</I>s
+determine the exact behavior of the command.
+<P>
+Many of the widget commands for the <B>checkbox</B> take as one argument an
+indicator of which checkbutton of the checkbox to operate on. These indicators
+are called <I>indexes</I> and allow reference and manipulation of checkbuttons.
+Checkbox indexes may be specified in any of the following forms:
+<DL>
+<DT> <I>number</I>
+</I></B>
+<DD> Specifies the checkbutton numerically, where 0 corresponds to the top
+checkbutton of the checkbox.
+</DL>
+<DL>
+<DT> <B>end</B>
+</I></B>
+<DD> Indicates the last checkbutton of the checkbox.
+</DL>
+<DL>
+<DT> <I>pattern</I>
+</I></B>
+<DD> If the index doesn't satisfy one of the above forms then this
+form is used. <I>Pattern</I> is pattern-matched against the tag of
+each checkbutton in the checkbox, in order from top to bottom,
+until a matching entry is found. The rules of <B>Tcl_StringMatch</B>
+are used.
+
+</DL>
+</pre><H2>WIDGET-SPECIFIC METHODS</H2>
+<DL>
+<DT> <I>pathName <B>add</B> <I>tag</I> ?<I>option value option value</I>?
+</I></B>
+<DD> Adds a new checkbutton to the checkbuttond window on the bottom. The command
+takes additional options which are passed on to the checkbutton as construction
+arguments. These include the standard Tk checkbutton options. The tag is
+returned.
+</DL>
+<DL>
+<DT> <I>pathName <B>buttonconfigure</B> <I>index</I> ?<I>options</I>?
+</I></B>
+<DD> This command is similar to the <B>configure</B> command, except that
+it applies to the options for an individual checkbutton,
+whereas <B>configure</B>applies to the options for the checkbox as a whole.
+<I>Options</I> may have any of the values accepted by the <B>add</B>
+widget command. If <I>options</I> are specified, options are modified
+as indicated in the command and the command returns an empty string.
+If no <I>options</I> are specified, returns a list describing
+the current options for entry <I>index</I> (see <B>Tk_ConfigureInfo</B> for
+information on the format of this list).
+</DL>
+<DL>
+<DT> <I>pathName <B>cget</B> <I>option</I>
+</I></B>
+<DD> Returns the current value of the configuration option given
+by <I>option</I>.
+<I>Option</I> may have any of the values accepted by the <B>checkbox</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>configure</B> ?<I>option</I>? ?<I>value option value ...</I>?
+</I></B>
+<DD> Query or modify the configuration options of the widget.
+If no <I>option</I> is specified, returns a list describing all of
+the available options for <I>pathName</I> (see <B>Tk_ConfigureInfo</B> for
+information on the format of this list). If <I>option</I> is specified
+with no <I>value</I>, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no <I>option</I> is specified). If
+one or more <I>option-value</I> pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+<I>Option</I> may have any of the values accepted by the <B>checkbox</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName <B>delete</B> <I>index</I>
+</I></B>
+<DD> Deletes a specified checkbutton given an <I>index</I>.
+</DL>
+<DL>
+<DT> <I>pathName <B>deselect</B> <I>index</I>
+</I></B>
+<DD> Deselects a specified checkbutton given an <I>index</I>.
+</DL>
+<DL>
+<DT> <I>pathName <B>flash</B> <I>index</I>
+</I></B>
+<DD> Flashes a specified checkbutton given an <I>index</I>.
+</DL>
+<DL>
+<DT> <I>pathName <B>get</B> ?<I>index</I>?
+</I></B>
+<DD> Returns the tags of the currently selected checkbuttons or the
+selection status of specific checkbutton when given an index.
+</DL>
+<DL>
+<DT> <I>pathName <B>index</B> <I>index</I>
+</I></B>
+<DD> Returns the numerical index corresponding to index.
+</DL>
+<DL>
+<DT> <I>pathName <B>insert <I>index</I> <I>tag</I> ?<I>option value option value ...</I>?
+</I></B>
+<DD> Same as the <B>add</B> command except that it inserts the new
+checkbutton just before the one given by <I>index</I>, instead of appending
+to the end of the checkbox. The <I>option</I>, and <I>value</I>
+arguments have the same interpretation as for the <B>add</B> widget
+command.
+</DL>
+<DL>
+<DT> <I>pathName <B>select</B> <I>index</I>
+</I></B>
+<DD> Selects a specified checkbutton given an <I>index</I>.
+
+</DL>
+</pre><H2>EXAMPLE</H2>
+<pre>
+ checkbox .cb -labeltext Styles
+ .cb add bold -text Bold
+ .cb add italic -text Italic
+ .cb add underline -text Underline
+ .cb select underline
+
+ pack .cb -padx 10 -pady 10 -fill both -expand yes
+</pre>
+
+</pre><H2>AUTHOR</H2>
+John A. Tucker
+</pre><H2>KEYWORDS</H2>
+checkbox, widget
diff --git a/iwidgets/demos/html/combobox.n.html b/iwidgets/demos/html/combobox.n.html
new file mode 100644
index 00000000000..cbf845c748f
--- /dev/null
+++ b/iwidgets/demos/html/combobox.n.html
@@ -0,0 +1,484 @@
+<TITLE>combobox - Create and manipulate combination box widgets</TITLE>
+<H1>combobox - Create and manipulate combination box widgets</H1>
+
+</pre><H2>SYNOPSIS</H2>
+<B>combobox<I> <I>pathName </I>?<I>options</I>?
+</pre><H2>INHERITANCE</H2>
+itk::Widget &lt;- LabeledWidget &lt;- Entryfield &lt;- Combobox
+</pre><H2>STANDARD OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B></B><br>
+cursor<br>
+highlightColor<br>
+insertWidth<br>
+insertWidth<br>
+selectBorderWidth<br>
+</td>
+<td valign=top>
+<B><br>
+justify<br>
+highlightThickness<br>
+insertBackground<br>
+insertBorderWidth<br>
+textVariable<br>
+</td>
+<td valign=top>
+background<br>
+exportSelection<br>
+relief<br>
+insertOffTime<br>
+selectForeground<br>
+</B></I><br>
+</td>
+<td valign=top>
+borderWidth<br>
+foreground<br>
+width<br>
+insertOnTime<br>
+selectBackground<br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/options.n.html"> "options" </A> manual entry for details on the standard options.
+</pre><H2>ASSOCIATED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>hscrollmode</B><br>
+</td>
+<td valign=top>
+<B>textBackground</B><br>
+</td>
+<td valign=top>
+<B>textFont</B><br>
+</td>
+<td valign=top>
+<B>vscrollmode</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="scrolledlistbox.n.html"> "scrolledlistbox" </A> manual entry for details on the above inherited
+options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>show</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/entry.n.html"> "entry" </A> manual entry for details on the above inherited option.
+</pre><H2>INHERITED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>childSitePos</B><br>
+<B>invalid</B><br>
+</td>
+<td valign=top>
+<B>command</B><br>
+<B>textBackground</B><br>
+</td>
+<td valign=top>
+<B>fixed</B><br>
+<B>textFont</B><br>
+</td>
+<td valign=top>
+<B>focusCommand</B><br>
+<B>validate</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="entryfield.n.html"> "entryfield" </A> class manual entry for details on the inherited options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>labelBitmap</B><br>
+<B>labelPos</B><br>
+</td>
+<td valign=top>
+<B>labelFont</B><br>
+<B>labelText</B><br>
+</td>
+<td valign=top>
+<B>labelImage</B><br>
+<B>labelVariable</B><br>
+</td>
+<td valign=top>
+<B>labelMargin</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="labeledwidget.n.html"> "labeledwidget" </A> class manual entry for details on the
+inherited options.
+</pre><H2>WIDGET-SPECIFIC OPTIONS</H2>
+<P>
+<pre>
+Name: <B>arrowRelief</B>
+Class: <B>Relief</B>
+Command-Line Switch: <B>-arrowrelief</B>
+</pre>
+<UL>
+Specifies the relief style to use for a dropdown Combobox's arrow
+button in a normal (not depressed) state. Acceptable values
+are <B>raised</B>, <B>sunken</B>, <B>flat</B>, <B>ridge</B>, and <B>groove</B>.
+Sunken is discouraged as this is the relief used to indicate a depressed
+state. This option has no effect on simple Comboboxes. The default is raised.
+</UL>
+<P>
+<pre>
+Name: <B>completion</B>
+Class: <B>Completion</B>
+Command-Line Switch: <B>-completion</B>
+</pre>
+<UL>
+Boolean given in any of the forms acceptable to <B>Tcl_GetBoolean</B> which
+determines whether insertions into the entry field, whether from the
+keyboard or programmatically via the <B>insert</B> method, are
+automatically completed with the first matching item from the listbox. The
+default is true.
+</UL>
+<P>
+<pre>
+Name: <B>dropdown</B>
+Class: <B>Dropdown</B>
+Command-Line Switch: <B>-dropdown</B>
+</pre>
+<UL>
+Boolean describing the Combobox layout style given in any of the forms
+acceptable to <B>Tcl_GetBoolean</B>. If true, the Combobox
+will be a dropdown style
+widget which displays an entry field and an arrow button which when activated
+will pop up a scrollable list of items. If false, a simple Combobox style
+will be used which has an entry field and a scrollable list beneath it
+which is always visible. Both styles allow an optional label for the entry
+field area. The default is true.
+</UL>
+<P>
+<pre>
+Name: <B>editable</B>
+Class: <B>Editable</B>
+Command-Line Switch: <B>-editable</B>
+</pre>
+<UL>
+Boolean describing whether or not the text entry area is editable
+by the user. If true the user can add items to the combobox by entering text
+into the entry area and then pressing Return. If false, the list of items is
+non-editable and can only be changed by calling the insert or delete
+methods. (The value in the entry field can still be modified by selecting
+from the list.) Given in any of the forms acceptable to <B>Tcl_GetBoolean</B>.
+The default is true.
+</UL>
+<P>
+<pre>
+Name: <B>grab</B>
+Class: <B>Grab</B>
+Command-Line Switch: <B>-grab</B>
+</pre>
+<UL>
+This option sets the grab scope for the appearance of the listbox in
+drop-down comboboxes. It can be either global or local. The default is
+local.
+</UL>
+<P>
+<pre>
+Name: <B>listHeight</B>
+Class: <B>Height</B>
+Command-Line Switch: <B>-listheight</B>
+</pre>
+<UL>
+Height of the listbox specified in any of the forms acceptable to
+<B>Tk_GetPixels</B>. The default is 150 pixels.
+</UL>
+<P>
+<pre>
+Name: <B>margin</B>
+Class: <B>Margin</B>
+Command-Line Switch: <B>-margin</B>
+</pre>
+<UL>
+Specifies the width in pixels between the entry component and the arrow button
+for a dropdown Combobox given in any of the forms acceptable to
+<B>Tk_GetPixels</B>. This option has no effect on a simple Combobox. The
+default is 1.
+</UL>
+<P>
+<pre>
+Name: <B>popupCursor</B>
+Class: <B>Cursor</B>
+Command-Line Switch: <B>-popupcursor</B>
+</pre>
+<UL>
+Specifies the cursor to be used for dropdown style listboxes. The value
+may have any of the forms acceptable to <B>Tk_GetCursor</B>. The default is
+arrow.
+</UL>
+<P>
+<pre>
+Name: <B>selectionCommand</B>
+Class: <B>SelectionCommand</B>
+Command-Line Switch: <B>-selectioncommand</B>
+</pre>
+<UL>
+Specifies a Tcl command procedure which is called when an item in the
+listbox area is selected. The item will be selected in the list, the listbox
+will be removed if it is a dropdown Combobox, and the selected item's
+text will be inserted into the entry field before the -selectioncommand proc is
+called. The default is {}.
+</UL>
+<P>
+<pre>
+Name: <B>state</B>
+Class: <B>State</B>
+Command-Line Switch: <B>-state</B>
+</pre>
+<UL>
+Specifies the overall state of the Combobox megawidget. Can be either
+normal or disabled. If the Combobox is disabled, no text can be entered
+into the entry field, no selection can be made in the listbox, and the
+arrowBtn component is disabled. The default is normal.
+</UL>
+<P>
+<pre>
+Name: <B>unique</B>
+Class: <B>Unique</B>
+Command-Line Switch: <B>-unique</B>
+</pre>
+<UL>
+Boolean describing whether or not duplicate items are allowed in the combobox
+list. If true, then duplicates are not allowed to be inserted. If false, a
+duplicate entry causes selection of the item. Given in any of the forms
+acceptable to <B>Tcl_GetBoolean</B>. The default is true.
+</UL>
+</pre><HR>
+
+</pre><H2>DESCRIPTION</H2>
+<P>
+The <B>combobox</B> command creates an enhanced entry field widget with an
+optional associated label and a scrollable list. When an item is selected in
+the list area of a Combobox, its value is then displayed in the entry field
+text area. Functionally similar to an Optionmenu, the Combobox adds (optional)
+list scrolling and (optional) item editing and inserting capabilities.
+<P>
+There are two basic styles of Comboboxes (determined by the -dropdown option):
+dropdown and simple. The dropdown style adds an arrow button to the right of
+the entry field which when activated will pop up (and down) the scrolled
+listbox beneath the entry field. The simple (non-dropdown) Combobox
+permanently displays the listbox beneath the entry field and has no
+arrow button. Either style allows an optional entry field label.
+</pre><H2>METHODS</H2>
+<P>
+The <B>combobox</B> command creates a new Tcl command whose
+name is <I>pathName</I>. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+<pre>
+<I>pathName option </I>?<I>arg arg ...</I>?
+</pre>
+<I>Option</I> and the <I>arg</I>s
+determine the exact behavior of the command. The following
+commands are possible for Combobox widgets:
+</pre><H2>ASSOCIATED METHODS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>icursor</B><br>
+</td>
+<td valign=top>
+<B>scan</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/entry.n.html"> "entry" </A> manual entries for details on the above associated methods.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>curselection</B><br>
+<B>xview</B><br>
+</td>
+<td valign=top>
+<B>index</B><br>
+<B>yview</B><br>
+</td>
+<td valign=top>
+<B>see</B><br>
+</td>
+<td valign=top>
+<B>size</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/listbox.n.html"> "listbox" </A> manual entries for details on the above associated methods.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>getcurselection</B><br>
+</td>
+<td valign=top>
+<B>justify</B><br>
+</td>
+<td valign=top>
+<B>sort</B><br>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="scrolledlistbox.n.html"> "scrolledlistbox" </A> manual entries for details on the above associated
+methods.
+<P>
+</pre><H2>WIDGET-SPECIFIC METHODS</H2>
+<DL>
+<DT> <I>pathName <B>cget</B> <I>option</I>
+</I></B>
+<DD> Returns the current value of the configuration option given
+by <I>option</I>.
+<I>Option</I> may have any of the values accepted by the <B>combobox</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName <B>clear</B> ?<B>component</B>?
+</I></B>
+<DD> Clears the contents from one or both components. Valid component values
+are <B>list</B>, or <B>entry</B>. With no component specified, both are cleared.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>configure</B> ?<I>option</I>? ?<I>value option value ...</I>?
+</I></B>
+<DD> Query or modify the configuration options of the widget.
+If no <I>option</I> is specified, returns a list describing all of
+the available options for <I>pathName</I> (see <B>Tk_ConfigureInfo</B> for
+information on the format of this list). If <I>option</I> is specified
+with no <I>value</I>, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no <I>option</I> is specified). If
+one or more <I>option-value</I> pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+<I>Option</I> may have any of the values accepted by the <B>combobox</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName <B>delete <I>component</I> <I>first</I> ?<I>last</I>?
+</I></B>
+<DD> Delete one or more elements from a given component, <B>list</B> or <B>entry</B>.
+If a list item to be removed is currently selected (displayed in the entry
+field area), the entry field will be cleared.
+</DL>
+<DL>
+<DT> <I>pathName <B>get ?<I>index</I>? </B></I>
+</I></B>
+<DD> With no arguments, returns the contents currently in the entry
+field area. With a single argument, returns the contents of the
+listbox item at the indicated index.
+</DL>
+<DL>
+<DT> <I>pathName <B>insert</B> <I>component</I> <I>index</I> <I>element</I> ?<I>element element ...</I>?
+</I></B>
+<DD> Insert one or more new elements into the given component, <B>list</B> or
+<B>entry</B>, just before the element given by <I>index</I>.
+</DL>
+<DL>
+<DT> <I>pathName <B>selection</B> <I>option</I> <I>first</I> ?<I>last</I>?
+</I></B>
+<DD> Adjust the selection within the listbox component and updates the contents
+of the entry field component to the value of the selected item. See the
+"listbox" manual entry for more details on parameter options.
+</DL>
+</pre><H2>COMPONENTS</H2>
+<P>
+<pre>
+Name: <B>entry</B>
+Class: <B>Entry</B>
+</pre>
+<UL>
+Text entry area where the current selection is displayed. If the
+Combobox is editable and its state is normal, the user can edit the
+contents of this item.
+</UL>
+<P>
+<pre>
+Name: <B>list</B>
+Class: <B>Scrolledlistbox</B>
+</pre>
+<UL>
+Scrollable list which stores all the items which the user can select
+from. For dropdown Comboboxes, this component is hidden until the user pops it
+up by pressing on the arrow button to the right of the entry component. For
+simple Comboboxes this component is always visible just beneath the entry
+component.
+</UL>
+</pre><H2>DEFAULT BINDINGS</H2>
+<P>
+The Combobox generally has the same bindings as its primary component items -
+the Scrolledlistbox and Entryfield. However it also adds these:
+<P>
+[1] Button-1 mouse press on the arrow key of a dropdown Combobox causes the
+list to be popped up. If the combobox is non-editable, a Button-1 press on the
+entry field area will also pop up the list.
+<P>
+[2] Button-1 mouse press anywhere on the display removes a dropdown listbox
+which has been popped up, unless the keypress is upon one of the Combobox
+scrollbars which scrolls the list. If it is pressed upon an item in the list
+area, that item will be selected before the list is removed.
+<P>
+[3] Button-3 mouse press on the arrow key of a dropdown Combobox causes the
+next item to be selected. Shift-Button-3 causes the previous item to be
+selected.
+<P>
+[4] Escape keypress removes a dropdown list which has been popped up.
+<P>
+[5] The &lt;space&gt; and &lt;Return&gt; keystrokes select the current item. They also
+remove the popped up list for dropdown comboboxes.
+<P>
+[6] Up and Down arrow keypresses from the entry field and arrow button
+component cause the previous and next items in the listbox to be selected
+respectively. Ctl-P and Ctl-N are similarly mapped for emacs emulation.
+<P>
+[7] Entry field and arrow button component Shift-Up and Shift-Down arrow keys
+pop up and down the listbox of a dropdown Combobox. The arrow button component
+also maps &lt;Return&gt; and &lt;space&gt; similarly.
+
+</pre><H2>EXAMPLE</H2>
+<pre>
+ proc selectCmd {} {
+ puts stdout "[.cb2 getcurselection]"
+ }
+
+ #
+ # Non-editable Dropdown Combobox
+ #
+ combobox .cb1 -labeltext Month: \\
+ -selectioncommand {puts "selected: [.cb1 getcurselection]"} \\
+ -editable false -listheight 185 -popupcursor hand1
+ .cb1 insert list end Jan Feb Mar Apr May June Jul Aug Sept Oct Nov Dec
+
+ #
+ # Editable Dropdown Combobox
+ #
+ combobox .cb2 -labeltext "Operating System:" -selectioncommand selectCmd
+ .cb2 insert list end Linux HP-UX SunOS Solaris Irix
+ .cb2 insert entry end L
+
+ pack .cb1 -padx 10 -pady 10 -fill x
+ pack .cb2 -padx 10 -pady 10 -fill x
+
+</pre>
+</pre><H2>ORIGINAL AUTHOR</H2>
+John S. Sigler
+</pre><H2>CURRENT MAINTAINER</H2>
+Mitch Gorman (logain@erols.com)
+</pre><H2>KEYWORDS</H2>
+combobox, entryfield, scrolledlistbox, itk::Widget, entry, listbox, widget,
+iwidgets
diff --git a/iwidgets/demos/html/dateentry.n.html b/iwidgets/demos/html/dateentry.n.html
new file mode 100644
index 00000000000..28738a5f55f
--- /dev/null
+++ b/iwidgets/demos/html/dateentry.n.html
@@ -0,0 +1,238 @@
+<TITLE>dateentry - Create and manipulate a dateentry widget</TITLE>
+<H1>dateentry - Create and manipulate a dateentry widget</H1>
+
+</pre><H2>SYNOPSIS</H2>
+<B>dateentry<I> <I>pathName </I>?<I>options</I>?
+</pre><H2>INHERITANCE</H2>
+itk::Widget &lt;- LabeledWidget &lt;- Datefield &lt;- Dateentry
+</pre><H2>STANDARD OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>background</B><br>
+<B>foreground</B><br>
+<B>justify</B><br>
+</td>
+<td valign=top>
+<B>borderWidth</B><br>
+<B>highlightColor</B><br>
+<B>relief</B><br>
+</td>
+<td valign=top>
+<B>cursor</B><br>
+<B>highlightThickness</B><br>
+</td>
+<td valign=top>
+<B>exportSelection</B><br>
+<B>insertBackground</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/options.n.html"> "options" </A> manual entry for details on the standard options.
+</pre><H2>INHERITED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>disabledForeground</B><br>
+<B>labelMargin</B><br>
+<B>state</B><br>
+</td>
+<td valign=top>
+<B>labelBitmap</B><br>
+<B>labelPos</B><br>
+</td>
+<td valign=top>
+<B>labelFont</B><br>
+<B>labelText</B><br>
+</td>
+<td valign=top>
+<B>labelImage</B><br>
+<B>labelVariable</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="labeledwidget.n.html"> "labeledwidget" </A> class manual entry for details on these
+inherited options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>command</B><br>
+<B>textFont</B><br>
+</td>
+<td valign=top>
+<B>int</B><br>
+<B>iq</B><br>
+</td>
+<td valign=top>
+<B>state</B><br>
+</td>
+<td valign=top>
+<B>textBackground</B><br>
+</td>
+</table>
+<P>
+See the "datefield" class manual entry for details on these
+inherited options.
+</pre><H2>ASSOCIATED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>backwardImage</B><br>
+<B>dateFont</B><br>
+<B>outline</B><br>
+<B>titleFont</B><br>
+</td>
+<td valign=top>
+<B>buttonForeground</B><br>
+<B>dayFont</B><br>
+<B>selectColor</B><br>
+<B>weekdayBackground</B><br>
+</td>
+<td valign=top>
+<B>command</B><br>
+<B>days</B><br>
+<B>selectThickness</B><br>
+<B>weekendBackground</B><br>
+</td>
+<td valign=top>
+<B>currentDateFont</B><br>
+<B>forwardImage</B><br>
+<B>startDay</B><br>
+</td>
+</table>
+<P>
+See the "calendar" manual entry for details on the associated options.
+</pre><H2>WIDGET-SPECIFIC OPTIONS</H2>
+<P>
+<pre>
+Name: <B>grab</B>
+Class: <B>Grab</B>
+Command-Line Switch: <B>-grab</B>
+</pre>
+<UL>
+Specifies the grab level, <B>local</B> or <B>global</B>, to be obtained before
+bringing up the popup calendar. The default is global. For more information
+concerning grab levels, consult the documentation for Tk's <B>grab</B> command.
+</UL>
+<P>
+<pre>
+Name: <B>icon</B>
+Class: <B>Icon</B>
+Command-Line Switch: <B>-icon</B>
+</pre>
+<UL>
+Specifies the calendar icon image to be used in the dateentry.
+This image must have been created previously with
+the <B>image create</B> command. Should one not be provided,
+then one will be generated, pixmap if possible, bitmap otherwise.
+</UL>
+<P>
+</pre><HR>
+
+</pre><H2>DESCRIPTION</H2>
+<P>
+The <B>dateentry</B> command creates a quicken style date entry field
+with a popup calendar by combining the datefield and calendar
+widgets together. This allows a user to enter the date via the
+keyboard or by using the mouse and selecting the calendar icon
+which brings up a popup calendar.
+</pre>
+
+</pre><H2>METHODS</H2>
+<P>
+The <B>dateentry</B> command creates a new Tcl command whose
+name is <I>pathName</I>. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+<pre>
+<I>pathName option </I>?<I>arg arg ...</I>?
+</pre>
+<I>Option</I> and the <I>arg</I>s
+determine the exact behavior of the command. The following
+commands are possible for dateentry widgets:
+</pre><H2>INHERITED METHODS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>get</B><br>
+</td>
+<td valign=top>
+<B>isvalid</B><br>
+</td>
+<td valign=top>
+<B>show</B><br>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the "datefield" manual entry for details on the associated methods.
+</pre><H2>WIDGET-SPECIFIC METHODS</H2>
+<DL>
+<DT> <I>pathName <B>cget</B> <I>option</I>
+</I></B>
+<DD> Returns the current value of the configuration option given
+by <I>option</I>.
+<I>Option</I> may have any of the values accepted by the <B>dateentry</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>configure</B> ?<I>option</I>? ?<I>value option value ...</I>?
+</I></B>
+<DD> Query or modify the configuration options of the widget.
+If no <I>option</I> is specified, returns a list describing all of
+the available options for <I>pathName</I> (see <B>Tk_ConfigureInfo</B> for
+information on the format of this list). If <I>option</I> is specified
+with no <I>value</I>, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no <I>option</I> is specified). If
+one or more <I>option-value</I> pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+<I>Option</I> may have any of the values accepted by the <B>dateentry</B>
+command.
+
+</DL>
+</pre><H2>COMPONENTS</H2>
+<P>
+<pre>
+Name: <B>label</B>
+Class: <B>Label</B>
+</pre>
+<UL>
+The label component provides a label component to used to identify the date.
+See the "label" widget manual entry for details on the label component item.
+</UL>
+<P>
+<pre>
+Name: <B>iconbutton</B>
+Class: <B>Label</B>
+</pre>
+<UL>
+The iconbutton component provides a labelbutton component to act as a
+lightweight button
+displaying the calendar icon. Upon pressing the labelbutton, the calendar
+appears. See the "label" widget manual entry for details on the
+labelbutton component item.
+</UL>
+<P>
+<pre>
+Name: <B>date</B>
+Class: <B>Entry</B>
+</pre>
+<UL>
+The date component provides the entry field for date input and display.
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/entry.n.html"> "entry" </A> widget manual entry for details on the date component item.
+</UL>
+</table>
+
+</pre><H2>EXAMPLE</H2>
+<pre>
+ dateentry .de
+ pack .de
+</pre>
+</pre><H2>AUTHOR</H2>
+Mark L. Ulferts
+<P>
+</pre><H2>KEYWORDS</H2>
+dateentry, widget
diff --git a/iwidgets/demos/html/datefield.n.html b/iwidgets/demos/html/datefield.n.html
new file mode 100644
index 00000000000..8180c42ae35
--- /dev/null
+++ b/iwidgets/demos/html/datefield.n.html
@@ -0,0 +1,248 @@
+<TITLE>datefield - Create and manipulate a date field widget</TITLE>
+<H1>datefield - Create and manipulate a date field widget</H1>
+
+</pre><H2>SYNOPSIS</H2>
+<B>datefield<I> <I>pathName </I>?<I>options</I>?
+</pre><H2>INHERITANCE</H2>
+itk::Widget &lt;- LabeledWidget &lt;- datefield
+</pre><H2>STANDARD OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>background</B><br>
+<B>foreground</B><br>
+<B>justify</B><br>
+</td>
+<td valign=top>
+<B>borderWidth</B><br>
+<B>highlightColor</B><br>
+<B>relief</B><br>
+</td>
+<td valign=top>
+<B>cursor</B><br>
+<B>highlightThickness</B><br>
+</td>
+<td valign=top>
+<B>exportSelection</B><br>
+<B>insertBackground</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/options.n.html"> "options" </A> manual entry for details on the standard options.
+</pre><H2>INHERITED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>disabledForeground</B><br>
+<B>labelMargin</B><br>
+<B>state</B><br>
+</td>
+<td valign=top>
+<B>labelBitmap</B><br>
+<B>labelPos</B><br>
+</td>
+<td valign=top>
+<B>labelFont</B><br>
+<B>labelText</B><br>
+</td>
+<td valign=top>
+<B>labelImage</B><br>
+<B>labelVariable</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="labeledwidget.n.html"> "labeledwidget" </A> class manual entry for details on the
+inherited options.
+</pre><H2>WIDGET-SPECIFIC OPTIONS</H2>
+<P>
+<pre>
+Name: <B>childSitePos</B>
+Class: <B>Position</B>
+Command-Line Switch: <B>-childsitepos</B>
+</pre>
+<UL>
+Specifies the position of the child site in the date field: <B>n</B>,
+<B>s</B>, <B>e</B>, or <B>w</B>. The default is e.
+</UL>
+<P>
+<pre>
+Name: <B>command</B>
+Class: <B>Command</B>
+Command-Line Switch: <B>-command</B>
+</pre>
+<UL>
+Specifies a Tcl command to be executed upon detection of a Return key
+press event.
+</UL>
+<P>
+<pre>
+Name: <B>gmt</B>
+Class: <B>GMT</B>
+Command-Line Switch: <B>-gmt</B>
+</pre>
+<UL>
+Determines whether the date is calculated relative to Greenwich
+Mean Time. Accepts a boolean value. The default is no.
+</UL>
+<P>
+<pre>
+Name: <B>int</B>
+Class: <B>DateFormat</B>
+Command-Line Switch: <B>-int</B>
+</pre>
+<UL>
+Used to specify international date formats. This option must be
+a boolean value. When set to true, the date is formatted as
+YYYY-MM-DD. When set to false, it is formatted as MM/DD/YYYY. Note
+that this format is driven by the 'clock scan' command and that
+YYYY-MM-DD is supported in Tk 8.4 or later. The default is no.
+</UL>
+<P>
+<pre>
+Name: <B>iq</B>
+Class: <B>Iq</B>
+Command-Line Switch: <B>-iq</B>
+</pre>
+<UL>
+Specifies the level of intelligence to be shown in the actions
+taken by the datefield during the processing of keypress events.
+Valid settings include <B>high</B>, <B>average</B>, and <B>low</B>.
+With a high iq,the date prevents the user from typing in an
+invalid date. For example, if the current date is 05/31/1997 and
+the user changes the month to 04, then the day will be instantly
+modified for them to be 30. In addition, leap years are fully
+taken into account. With average iq, the month is limited to the
+values of 01-12, but it is possible to type in an invalid day.
+A setting of low iq instructs the widget to do no validity
+checking at all during date entry. With both average and low
+iq levels, it is assumed that the validity will be determined
+at a later time using the date's <B>isvalid</B> command.
+</UL>
+<P>
+<pre>
+Name: <B>state</B>
+Class: <B>State</B>
+Command-Line Switch: <B>-state</B>
+</pre>
+<UL>
+Specifies one of two states for the datefield: <B>normal</B> or <B>disabled</B>.
+If the datefield is disabled then input is not accepted. The default is
+normal.
+</UL>
+<P>
+<pre>
+Name: <B>textBackground</B>
+Class: <B>Background</B>
+Command-Line Switch: <B>-textbackground</B>
+</pre>
+<UL>
+Background color for inside textual portion of the entry field. The value
+may be given in any of the forms acceptable to <B>Tk_GetColor</B>.
+</UL>
+<P>
+<pre>
+Name: <B>textFont</B>
+Class: <B>Font</B>
+Command-Line Switch: <B>-textfont</B>
+</pre>
+<UL>
+Name of font to use for display of text in datefield. The value
+may be given in any of the forms acceptable to <B>Tk_GetFont</B>.
+</UL>
+<P>
+</pre><HR>
+
+</pre><H2>DESCRIPTION</H2>
+<P>
+The <B>datefield</B> command creates an enhanced text entry widget for
+the purpose of date entry with various degrees of built-in intelligence.
+</pre>
+
+</pre><H2>METHODS</H2>
+<P>
+The <B>datefield</B> command creates a new Tcl command whose
+name is <I>pathName</I>. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+<pre>
+<I>pathName option </I>?<I>arg arg ...</I>?
+</pre>
+<I>Option</I> and the <I>arg</I>s
+determine the exact behavior of the command. The following
+commands are possible for datefield widgets:
+</pre><H2>WIDGET-SPECIFIC METHODS</H2>
+<DL>
+<DT> <I>pathName <B>cget</B> <I>option</I>
+</I></B>
+<DD> Returns the current value of the configuration option given
+by <I>option</I>.
+<I>Option</I> may have any of the values accepted by the <B>datefield</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>configure</B> ?<I>option</I>? ?<I>value option value ...</I>?
+</I></B>
+<DD> Query or modify the configuration options of the widget.
+If no <I>option</I> is specified, returns a list describing all of
+the available options for <I>pathName</I> (see <B>Tk_ConfigureInfo</B> for
+information on the format of this list). If <I>option</I> is specified
+with no <I>value</I>, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no <I>option</I> is specified). If
+one or more <I>option-value</I> pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+<I>Option</I> may have any of the values accepted by the <B>datefield</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName <B>get</B> ?<B>format</B>?
+</I></B>
+<DD> Returns the current contents of the datefield in a format of
+string or as an integer clock value using the <B>-string</B> and <B>-clicks</B>
+format options respectively. The default is by string. Reference the
+clock command for more information on obtaining dates and their
+formats.
+</DL>
+<DL>
+<DT> <I>pathName <B>isvalid</B>
+</I></B>
+<DD> Returns a boolean indication of the validity of the currently
+displayed date value. For example, 03/03/1960 is valid whereas
+02/29/1997 is invalid.
+</DL>
+<DL>
+<DT> <I>pathName <B>show</B> <I>date</I>
+</I></B>
+<DD> Changes the currently displayed date to be that of the date
+argument. The date may be specified either as a string, an
+integer clock value or the keyword "now". Reference the clock
+command for more information on obtaining dates and their formats.
+
+</DL>
+</pre><H2>COMPONENTS</H2>
+<P>
+<pre>
+Name: <B>date</B>
+Class: <B>Entry</B>
+</pre>
+<UL>
+The date component provides the entry field for date input and display.
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/entry.n.html"> "entry" </A> widget manual entry for details on the date component item.
+</UL>
+</table>
+
+</pre><H2>EXAMPLE</H2>
+<pre>
+ proc returnCmd {} {
+ puts [.df get]
+ }
+
+ datefield .df -command returnCmd
+ pack .df -fill x -expand yes -padx 10 -pady 10
+</pre>
+</pre><H2>AUTHOR</H2>
+Mark L. Ulferts
+<P>
+</pre><H2>KEYWORDS</H2>
+datefield, widget
diff --git a/iwidgets/demos/html/dialog.n.html b/iwidgets/demos/html/dialog.n.html
new file mode 100644
index 00000000000..8a0ab079972
--- /dev/null
+++ b/iwidgets/demos/html/dialog.n.html
@@ -0,0 +1,199 @@
+<TITLE>dialog - Create and manipulate a dialog widget</TITLE>
+<H1>dialog - Create and manipulate a dialog widget</H1>
+
+</pre><H2>SYNOPSIS</H2>
+<B>dialog<I> <I>pathName </I>?<I>options</I>?
+</pre><H2>INHERITANCE</H2>
+itk::Toplevel &lt;- Shell &lt;- Dialogshell &lt;- Dialog
+</pre><H2>STANDARD OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>background</B><br>
+</td>
+<td valign=top>
+<B>cursor</B><br>
+</td>
+<td valign=top>
+<B>foreground</B><br>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/options.n.html"> "options" </A> manual entry for details on the standard options.
+</pre><H2>INHERITED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>buttonBoxPadX</B><br>
+<B>padY</B><br>
+</td>
+<td valign=top>
+<B>buttonBoxPadY</B><br>
+<B>separator</B><br>
+</td>
+<td valign=top>
+<B>buttonBoxPos</B><br>
+<B>thickness</B><br>
+</td>
+<td valign=top>
+<B>padX</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="dialogshell.n.html"> "dialogshell" </A> manual entry for details on the above inherited options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>height</B><br>
+</td>
+<td valign=top>
+<B>master</B><br>
+</td>
+<td valign=top>
+<B>modality</B><br>
+</td>
+<td valign=top>
+<B>width</B><br>
+</td>
+</table>
+<P>
+See the "shell" manual entry for details on the above inherited options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>title</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the "Toplevel" manual entry for details on the above inherited options.
+</pre><HR>
+
+</pre><H2>DESCRIPTION</H2>
+<P>
+The <B>dialog</B> command creates a dialog box providing standard
+buttons and a child site for use in derived classes. The buttons
+include ok, apply, cancel, and help. Methods and Options exist to
+configure the buttons and their containing box.
+
+</pre><H2>METHODS</H2>
+<P>
+The <B>dialog</B> command creates a new Tcl command whose
+name is <I>pathName</I>. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+<pre>
+<I>pathName option </I>?<I>arg arg ...</I>?
+</pre>
+<I>Option</I> and the <I>arg</I>s
+determine the exact behavior of the command. The following
+commands are possible for dialog widgets:
+</pre><H2>INHERITED METHODS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>add</B><br>
+<B>index</B><br>
+</td>
+<td valign=top>
+<B>buttonconfigure</B><br>
+<B>insert</B><br>
+</td>
+<td valign=top>
+<B>default</B><br>
+<B>invoke</B><br>
+</td>
+<td valign=top>
+<B>hide</B><br>
+<B>show</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="buttonbox.n.html"> "buttonbox" </A> manual entry for details on the above inherited methods.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>childsite</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="dialogshell.n.html"> "dialogshell" </A> manual entry for details on the above inherited methods.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>activate</B><br>
+</td>
+<td valign=top>
+<B>center</B><br>
+</td>
+<td valign=top>
+<B>deactivate</B><br>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the "shell" manual entry for details on the above inherited methods.
+
+</pre><H2>WIDGET-SPECIFIC METHODS</H2>
+<DL>
+<DT> <I>pathName <B>cget</B> <I>option</I>
+</I></B>
+<DD> Returns the current value of the configuration option given
+by <I>option</I>.
+<I>Option</I> may have any of the values accepted by the <B>dialog</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>configure</B> ?<I>option</I>? ?<I>value option value ...</I>?
+</I></B>
+<DD> Query or modify the configuration options of the widget.
+If no <I>option</I> is specified, returns a list describing all of
+the available options for <I>pathName</I> (see <B>Tk_ConfigureInfo</B> for
+information on the format of this list). If <I>option</I> is specified
+with no <I>value</I>, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no <I>option</I> is specified). If
+one or more <I>option-value</I> pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+<I>Option</I> may have any of the values accepted by the <B>dialog</B>
+command.
+
+</DL>
+</pre><H2>EXAMPLE</H2>
+<pre>
+ dialog .d -modality global
+ .d buttonconfigure OK -command {puts OK; .d deactivate 1}
+ .d buttonconfigure Apply -command {puts Apply}
+ .d buttonconfigure Cancel -command {puts Cancel; .d deactivate 0}
+ .d buttonconfigure Help -command {puts Help}
+
+ listbox [.d childsite].lb -relief sunken
+ pack [.d childsite].lb -expand yes -fill both
+
+ if {[.d activate]} {
+ puts "Exit via OK button"
+ } else {
+ puts "Exit via Cancel button"
+ }
+</pre>
+</pre><H2>AUTHORS</H2>
+Mark L. Ulferts
+<P>
+Bret A. Schuhmacher
+</pre><H2>KEYWORDS</H2>
+dialog, dialogshell, shell, widget
diff --git a/iwidgets/demos/html/dialogshell.n.html b/iwidgets/demos/html/dialogshell.n.html
new file mode 100644
index 00000000000..8996e2d62dc
--- /dev/null
+++ b/iwidgets/demos/html/dialogshell.n.html
@@ -0,0 +1,269 @@
+<TITLE>dialogshell - Create and manipulate a dialog shell widget</TITLE>
+<H1>dialogshell - Create and manipulate a dialog shell widget</H1>
+
+</pre><H2>SYNOPSIS</H2>
+<B>dialogshell<I> <I>pathName </I>?<I>options</I>?
+</pre><H2>INHERITANCE</H2>
+itk::Toplevel &lt;- Shell &lt;- Dialogshell
+</pre><H2>STANDARD OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>background</B><br>
+</td>
+<td valign=top>
+<B>cursor</B><br>
+</td>
+<td valign=top>
+<B>foreground</B><br>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/options.n.html"> "options" </A> manual entry for details on the standard options.
+</pre><H2>INHERITED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>height</B><br>
+</td>
+<td valign=top>
+<B>master</B><br>
+</td>
+<td valign=top>
+<B>modality</B><br>
+</td>
+<td valign=top>
+<B>width</B><br>
+</td>
+</table>
+<P>
+See the "shell" manual entry for details on the above inherited options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>title</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the "Toplevel" manual entry for details on the above inherited options.
+
+</pre><H2>WIDGET-SPECIFIC OPTIONS</H2>
+<P>
+<pre>
+Name: <B>buttonBoxPadX</B>
+Class: <B>Pad</B>
+Command-Line Switch: <B>-buttonboxpadx</B>
+</pre>
+<UL>
+Specifies a non-negative padding distance to leave between the button group and
+the outer edge of the button box in the x direction. The value may be
+given in any of the forms accpetable to <B>Tk_GetPixels</B>. The default
+is 5 pixels.
+</UL>
+<P>
+<pre>
+Name: <B>buttonBoxPadY</B>
+Class: <B>Pad</B>
+Command-Line Switch: <B>-buttonboxpady</B>
+</pre>
+<UL>
+Specifies a non-negative padding distance to leave between the button group and
+the outer edge of the button box in the y direction. The value may be
+given in any of the forms accpetable to <B>Tk_GetPixels</B>. The default
+is 5 pixels.
+</UL>
+<P>
+<pre>
+Name: <B>buttonBoxPos</B>
+Class: <B>Position</B>
+Command-Line Switch: <B>-buttonboxpos</B>
+</pre>
+<UL>
+Attaches buttons to the given side of the dialog: <B>n</B>, <B>s</B>,
+<B>e</B> or <B>w</B>. The default is s.
+</UL>
+<P>
+<pre>
+Name: <B>padX</B>
+Class: <B>Pad</B>
+Command-Line Switch: <B>-padx</B>
+</pre>
+<UL>
+Specifies a padding distance for the childsite in the X-direction in
+any of the forms acceptable to <B>Tk_GetPixels</B>. The default is 10.
+</UL>
+<P>
+<pre>
+Name: <B>padY</B>
+Class: <B>Pad</B>
+Command-Line Switch: <B>-pady</B>
+</pre>
+<UL>
+Specifies a padding distance for the childsite in the Y-direction in
+any of the forms acceptable to <B>Tk_GetPixels</B>. The default is 10.
+</UL>
+<P>
+<pre>
+Name: <B>separator</B>
+Class: <B>Separator</B>
+Command-Line Switch: <B>-separator</B>
+</pre>
+<UL>
+Specifies whether a line is drawn to separate the
+buttons from the dialog box contents in any of the forms
+acceptable to <B>Tcl_GetBoolean</B>. The default is true.
+</UL>
+<P>
+<pre>
+Name: <B>thickness</B>
+Class: <B>Thickness</B>
+Command-Line Switch: <B>-thickness</B>
+</pre>
+<UL>
+Specifies the thickness of the separator in any of the forms acceptable
+to <B>Tk_GetPixels</B>. The default is 3 pixels.
+</UL>
+</pre><HR>
+
+</pre><H2>DESCRIPTION</H2>
+<P>
+The <B>dialogshell</B> command creates a dialog shell which is a top
+level widget composed of a button box, separator, and child site area.
+The class also has methods to control button construction.
+
+</pre><H2>METHODS</H2>
+<P>
+The <B>dialogshell</B> command create a new Tcl command whose
+name is <I>pathName</I>. This command may be used to invoke various
+operations on the widget. It has the following general form:
+<pre>
+<I>pathName option </I>?<I>arg arg ...</I>?
+</pre>
+<I>Option</I> and the <I>arg</I>s
+determine the exact behavior of the command. The following
+commands are possible for dialogshell widgets:
+</pre><H2>INHERITED METHODS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>activate</B><br>
+</td>
+<td valign=top>
+<B>center</B><br>
+</td>
+<td valign=top>
+<B>deactivate</B><br>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the "shell" manual entry for details on the above inherited methods.
+</pre><H2>ASSOCIATED METHODS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>add</B><br>
+<B>hide</B><br>
+<B>show</B><br>
+</td>
+<td valign=top>
+<B>buttonconfigure</B><br>
+<B>index</B><br>
+</td>
+<td valign=top>
+<B>default</B><br>
+<B>insert</B><br>
+</td>
+<td valign=top>
+<B>delete</B><br>
+<B>invoke</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="buttonbox.n.html"> "buttonbox" </A> manual entry for details on the associated methods.
+</pre><H2>WIDGET-SPECIFIC METHODS</H2>
+<DL>
+<DT> <I>pathName <B>cget</B> <I>option</I>
+</I></B>
+<DD> Returns the current value of the configuration option given
+by <I>option</I>.
+<I>Option</I> may have any of the values accepted by the <B>dialogshell</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName <B>childsite</B>
+</I></B>
+<DD> Returns the pathname of the child site widget.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>configure</B> ?<I>option</I>? ?<I>value option value ...</I>?
+</I></B>
+<DD> Query or modify the configuration options of the widget.
+If no <I>option</I> is specified, returns a list describing all of
+the available options for <I>pathName</I> (see <B>Tk_ConfigureInfo</B> for
+information on the format of this list). If <I>option</I> is specified
+with no <I>value</I>, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no <I>option</I> is specified). If
+one or more <I>option-value</I> pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+<I>Option</I> may have any of the values accepted by the <B>dialogshell</B>
+command.
+
+</DL>
+</pre><H2>COMPONENTS</H2>
+<P>
+<pre>
+Name: <B>dschildsite</B>
+Class: <B>frame</B>
+</pre>
+<UL>
+The dschildsite component is the user child site for the dialog shell. See
+the "frame" widget manual entry for details on the dschildsite component item.
+</UL>
+<P>
+<pre>
+Name: <B>separator</B>
+Class: <B>frame</B>
+</pre>
+<UL>
+The separator component devides the area between the user child site and
+the button box. See the "frame" widget manual entry for details on the
+separator component item.
+</UL>
+<P>
+<pre>
+Name: <B>bbox</B>
+Class: <B>ButtonBox</B>
+</pre>
+<UL>
+The bbox component is the button box containing the buttons for the dialog
+shell. See the "ButtonBox" widget manual entry for details on the
+bbox component item.
+</UL>
+</table>
+
+</pre><H2>EXAMPLE</H2>
+<pre>
+ dialogshell .ds -modality none
+
+ .ds add OK -text "OK"
+ .ds add Cancel -text "Cancel"
+ .ds default OK
+
+ .ds activate
+</pre>
+</pre><H2>AUTHOR</H2>
+Mark L. Ulferts
+</pre><H2>KEYWORDS</H2>
+dialogshell, dialog, shell, widget
diff --git a/iwidgets/demos/html/disjointlistbox.n.html b/iwidgets/demos/html/disjointlistbox.n.html
new file mode 100644
index 00000000000..d860aec2466
--- /dev/null
+++ b/iwidgets/demos/html/disjointlistbox.n.html
@@ -0,0 +1,361 @@
+<TITLE>iwidgets::disjointlistbox - Create and manipulate a disjointlistbox widget</TITLE>
+<H1>iwidgets::disjointlistbox - Create and manipulate a disjointlistbox widget</H1>
+
+</pre><H2>SYNOPSIS</H2>
+<B>iwidgets::disjointlistbox<I> <I>pathName </I>?<I>options</I>?
+</pre><H2>INHERITANCE</H2>
+itk::Widget &lt;- iwidgets::Disjointlistbox
+</pre><H2>STANDARD OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B><br>
+activeForeground<br>
+buttonPlacement<br>
+highlightColor<br>
+</td>
+<td valign=top>
+activeBackground<br>
+activeRelief<br>
+clientData<br>
+highlightThickness<br>
+</td>
+<td valign=top>
+selectBorderWidth<br>
+background<br>
+cursor<br>
+disabledForeground<br>
+</td>
+<td valign=top>
+selectForeground<br>
+borderWidth<br>
+foreground<br>
+elementBorderWidth</B></I><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/options.n.html"> "options" </A> manual entry for details on the standard options.
+</pre><H2>ASSOCIATED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>lhsButtonLabel</B><br>
+</td>
+<td valign=top>
+<B>rhsButtonLabel</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/button.n.html"> "button" </A> widget manual entry for details on the above
+associated options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>labelFont</B><br>
+</td>
+<td valign=top>
+<B>lhsLabelText</B><br>
+</td>
+<td valign=top>
+<B>rhsLabelText</B><br>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the "label" widget manual entry for details on the above
+associated options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>jump</B><br>
+</td>
+<td valign=top>
+<B>troughColor</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/scrollbar.n.html"> "scrollbar" </A> widget class manual entry for details on the above
+associated options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>textBackground</B><br>
+</td>
+<td valign=top>
+<B>textFont</B><br>
+</td>
+<td valign=top>
+<B>lhsItems</B><br>
+</td>
+<td valign=top>
+<B>rhsItems</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="scrolledlistbox.n.html"> "scrolledlistbox" </A> widget manual entry for details on the above
+associated options.
+</pre><H2>WIDGET-SPECIFIC OPTIONS</H2>
+<P>
+<pre>
+Name: <B>buttonPlacement</B>
+Class: <B>ButtonPlacement</B>
+Command-Line Switch: <B>-buttonplacement</B>
+</pre>
+<UL>
+Specifies the placement of the insertion and removal buttons relative to the
+scrolledlistbox widgets<B>n</B>,
+<B>bottom</B>, or <B>center</B>. The default is bottom.
+</UL>
+<P>
+<pre>
+Name: <B>lhsLabelText</B>
+Class: <B>LabelText</B>
+Command-Line Switch: <B>-lhslabeltext</B>
+</pre>
+<UL>
+Specifies the text for the label of the lhs scrolledlistbox.
+The default is "Available".
+</UL>
+<P>
+<pre>
+Name: <B>rhsLabelText</B>
+Class: <B>LabelText</B>
+Command-Line Switch: <B>-rhslabeltext</B>
+</pre>
+<UL>
+Specifies the text for the label of the rhs scrolledlistbox.
+The default is "Available".
+</UL>
+<P>
+<pre>
+Name: <B>lhsButtonLabel</B>
+Class: <B>LabelText</B>
+Command-Line Switch: <B>-lhsbuttonlabel</B>
+</pre>
+<UL>
+Specifies the text for the button of the lhs scrolledlistbox.
+The default is "Insert &gt;&gt;".
+</UL>
+<P>
+<pre>
+Name: <B>rhsButtonLabel</B>
+Class: <B>LabelText</B>
+Command-Line Switch: <B>-rhsbuttonlabel</B>
+</pre>
+<UL>
+Specifies the text for the button of the rhs scrolledlistbox.
+The default is "&lt;&lt; Remove".
+</UL>
+<P>
+<pre>
+Name: <B>lhsSortOption</B>
+Class: <B>LhsSortOption</B>
+Command-Line Switch: <B>-lhssortoption</B>
+</pre>
+<UL>
+Specifies the sort function to be applied to the lhs scrolledlistbox
+after items are inserted. Accepts the same sort options as the scrolledlistbox
+sort method (Tcl's lsort command). If "none" is specified, the inserted
+items are appended to the end of the list, and no sorting is performed.
+The default is "increasing".
+</UL>
+<P>
+<pre>
+Name: <B>rhsSortOption</B>
+Class: <B>RhsSortOption</B>
+Command-Line Switch: <B>-rhssortoption</B>
+</pre>
+<UL>
+Specifies the sort function to be applied to the rhs scrolledlistbox
+after items are inserted. Accepts the same sort options as the scrolledlistbox
+sort method (Tcl's lsort command). If "none" is specified, the inserted
+items are appended to the end of the list, and no sorting is performed.
+The default is "increasing".
+</UL>
+<P>
+</pre><HR>
+</pre><H2>DESCRIPTION</H2>
+<P>
+The <B>iwidgets::disjointlistbox</B> command creates a disjoint pair of listboxs
+similar to the OSF/Motif "Book" printing dialog of the "FrameMaker"
+program. It is implementation constists of a two Scrolledlistboxs,
+2 buttons, and 2 labels.
+
+The disjoint behavior of this widget exists between the interaction of
+the two Scrolledlistboxes with one another. That is, a given instance
+of a Disjointlistbox will never exist, without the aid of a hack magician,
+which has Scrolledlistbox widgets with items in common. That means the
+relationship between the two is maintained similar to that of disjoint sets.
+
+Users may transfer items between the two Listbox widgets using the
+the two buttons.
+
+Options exists which include the ability to configure the "items" displayed by
+the 2 Scrolledlistboxes and to control the placement of the insertion and
+removal buttons.
+</pre><H2>METHODS</H2>
+<P>
+The <B>iwidgets::disjointlistbox</B> command creates a new Tcl command whose
+name is <I>pathName</I>. This command may be used to invoke various
+operations on the widget. It has the following general form:
+<pre>
+<I>pathName option </I>?<I>arg arg ...</I>?
+</pre>
+<I>Option</I> and the <I>arg</I>s
+determine the exact behavior of the command. The following
+commands are possible for disjointlistbox widgets:
+
+</pre><H2>WIDGET-SPECIFIC METHODS</H2>
+<DL>
+<DT> <I>pathName <B>cget</B> <I>option</I>
+</I></B>
+<DD> Returns the current value of the configuration option given
+by <I>option</I>.
+<I>Option</I> may have any of the values accepted by the <B>iwidgets::disjointlistbox</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>configure</B> ?<I>option</I>? ?<I>value option value ...</I>?
+</I></B>
+<DD> Query or modify the configuration options of the widget.
+If no <I>option</I> is specified, returns a list describing all of
+the available options for <I>pathName</I> (see <B>Tk_ConfigureInfo</B> for
+information on the format of this list). If <I>option</I> is specified
+with no <I>value</I>, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no <I>option</I> is specified). If
+one or more <I>option-value</I> pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+<I>Option</I> may have any of the values accepted by the <B>iwidgets::disjointlistbox</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName <B>setlhs</B>
+</I></B>
+<DD> Set the current contents of the left-most Scrolledlistbox with the input list
+of items. Removes all (if any) items from the right-most Scrolledlistbox
+which exist in the input list option to maintain the disjoint property
+between the two
+</DL>
+<DL>
+<DT> <I>pathName <B>setrhs</B>
+</I></B>
+<DD> Set the current contents of the right-most Scrolledlistbox with the input list
+of items. Removes all (if any) items from the left-most Scrolledlistbox
+which exist in the input list option to maintain the disjoint property
+between the two
+</DL>
+<DL>
+<DT> <I>pathName <B>getlhs</B>
+</I></B>
+<DD> Returns the current contents of the left-most Scrolledlistbox
+</DL>
+<DL>
+<DT> <I>pathName <B>getrhs</B>
+</I></B>
+<DD> Returns the current contents of the right-most Scrolledlistbox
+</DL>
+<DL>
+<DT> <I>pathName <B>insertlhs</B>
+</I></B>
+<DD> Add the input list of items to the current contents of the left-most
+Scrolledlistbox. Removes all (if any) items from the right-most Scrolledlistbox
+which exist in the input list option to maintain the disjoint property
+between the two
+</DL>
+<DL>
+<DT> <I>pathName <B>insertrhs</B>
+</I></B>
+<DD> Add the input list of items to the current contents of the right-most
+Scrolledlistbox. Removes all (if any) items from the left-most Scrolledlistbox
+which exist in the input list option to maintain the disjoint property
+between the two.
+</DL>
+<DL>
+</DL>
+</pre><H2>COMPONENTS</H2>
+<P>
+<pre>
+Name: <B>lhs</B>
+Class: <B>Scrolledlistbox</B>
+</pre>
+<UL>
+The lhs component is the scrolledlistbox for the rhs button.
+See the <A HREF="scrolledlistbox.n.html"> "scrolledlistbox" </A> widget manual entry for details on the lhs
+component item.
+</UL>
+<P>
+<pre>
+Name: <B>rhs</B>
+Class: <B>Scrolledlistbox</B>
+</pre>
+<UL>
+The rhs component is the scrolledlistbox for the rhs button.
+See the <A HREF="scrolledlistbox.n.html"> "scrolledlistbox" </A> widget manual entry for details on the rhs
+component item.
+</UL>
+<P>
+<pre>
+Name: <B>lhsbutton</B>
+Class: <B>utton</B>
+</pre>
+<UL>
+The lhsbutton component is the button for users to remove selected items
+from the lhs Scrolledlistbox.
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/button.n.html"> "button" </A> widget manual entry for details on the lhs button component.
+</UL>
+<P>
+<pre>
+Name: <B>rhsbutton</B>
+Class: <B>Button</B>
+</pre>
+<UL>
+The rhsbutton component is the button for users to remove selected items
+from the rhs Scrolledlistbox.
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/button.n.html"> "button" </A> widget manual entry for details on the rhs button component.
+</UL>
+<P>
+<pre>
+Name: <B>lhsCount</B>
+Class: <B>Label</B>
+</pre>
+<UL>
+The lhsCount component is the label for displaying a count of the current items in
+the Scrolledlistbox.
+See the "Label" widget manual entry for details on the lhsCount label component.
+</UL>
+<P>
+<pre>
+Name: <B>rhsCount</B>
+Class: <B>Label</B>
+</pre>
+<UL>
+The rhsCount component is the label for displaying a count of the current items in
+the Scrolledlistbox.
+See the "Label" widget manual entry for details on the rhsCount label component.
+</UL>
+</table>
+<UL>
+</UL>
+</pre><H2>EXAMPLE</H2>
+<pre>
+package require Iwidgets 4.0
+iwidgets::disjointlistbox .dlb
+pack .dlb -padx 10 -pady 10 -fill both -expand yes
+</pre>
+</pre><H2>AUTHOR(S)</H2>
+John A. Tucker
+</pre>
+Anthony Parent
+</pre><H2>KEYWORDS</H2>
+disjointlistbox, widget
diff --git a/iwidgets/demos/html/entryfield.n.html b/iwidgets/demos/html/entryfield.n.html
new file mode 100644
index 00000000000..ac46172e1f5
--- /dev/null
+++ b/iwidgets/demos/html/entryfield.n.html
@@ -0,0 +1,340 @@
+<TITLE>entryfield - Create and manipulate a entry field widget</TITLE>
+<H1>entryfield - Create and manipulate a entry field widget</H1>
+
+</pre><H2>SYNOPSIS</H2>
+<B>entryfield<I> <I>pathName </I>?<I>options</I>?
+</pre><H2>INHERITANCE</H2>
+itk::Widget &lt;- LabeledWidget &lt;- entryfield
+</pre><H2>STANDARD OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>background</B><br>
+<B>foreground</B><br>
+<B>insertBorderWidth</B><br>
+<B>justify</B><br>
+<B>selectForeground</B><br>
+</td>
+<td valign=top>
+<B>borderWidth</B><br>
+<B>highlightColor</B><br>
+<B>insertOffTime</B><br>
+<B>relief</B><br>
+<B>textVariable</B><br>
+</td>
+<td valign=top>
+<B>cursor</B><br>
+<B>highlightThickness</B><br>
+<B>insertOnTime</B><br>
+<B>selectBackground</B><br>
+<B>width</B><br>
+</td>
+<td valign=top>
+<B>exportSelection</B><br>
+<B>insertBackground</B><br>
+<B>insertWidth</B><br>
+<B>selectBorderWidth</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/options.n.html"> "options" </A> manual entry for details on the standard options.
+</pre><H2>ASSOCIATED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>show</B><br>
+</td>
+<td valign=top>
+<B>state</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/entry.n.html"> "entry" </A> manual entry for details on the associated options.
+</pre><H2>INHERITED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>disabledForeground</B><br>
+<B>labelMargin</B><br>
+<B>state</B><br>
+</td>
+<td valign=top>
+<B>labelBitmap</B><br>
+<B>labelPos</B><br>
+</td>
+<td valign=top>
+<B>labelFont</B><br>
+<B>labelText</B><br>
+</td>
+<td valign=top>
+<B>labelImage</B><br>
+<B>labelVariable</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="labeledwidget.n.html"> "labeledwidget" </A> class manual entry for details on the
+inherited options.
+</pre><H2>WIDGET-SPECIFIC OPTIONS</H2>
+<P>
+<pre>
+Name: <B>childSitePos</B>
+Class: <B>Position</B>
+Command-Line Switch: <B>-childsitepos</B>
+</pre>
+<UL>
+Specifies the position of the child site in the entry field: <B>n</B>,
+<B>s</B>, <B>e</B>, or <B>w</B>. The default is e.
+</UL>
+<P>
+<pre>
+Name: <B>command</B>
+Class: <B>Command</B>
+Command-Line Switch: <B>-command</B>
+</pre>
+<UL>
+Specifies a Tcl command to be executed upon detection of a Return key
+press event.
+</UL>
+<P>
+<pre>
+Name: <B>fixed</B>
+Class: <B>Fixed</B>
+Command-Line Switch: <B>-fixed</B>
+</pre>
+<UL>
+Restrict entry to the specified number of chars. A value of 0, which is the
+default, denotes no limit. The value is the maximum number of chars the
+user may type into the field, regardles of field width. For example,
+if the field width is set to 20 and the fixed value is 10, the user will
+only be able to type 10 characters into the field which is 20 characters long.
+</UL>
+<P>
+<pre>
+Name: <B>focusCommand</B>
+Class: <B>Command</B>
+Command-Line Switch: <B>-focuscommand</B>
+</pre>
+<UL>
+Specifies a Tcl command to be executed upon reception of focus.
+</UL>
+<P>
+<pre>
+Name: <B>invalid</B>
+Class: <B>Command</B>
+Command-Line Switch: <B>-invalid</B>
+</pre>
+<UL>
+Specifies a Tcl command to be executed upon determination of invalid input.
+The default is bell.
+</UL>
+<P>
+<pre>
+Name: <B>textBackground</B>
+Class: <B>Background</B>
+Command-Line Switch: <B>-textbackground</B>
+</pre>
+<UL>
+Background color for inside textual portion of the entry field. The value
+may be given in any of the forms acceptable to <B>Tk_GetColor</B>.
+</UL>
+<P>
+<pre>
+Name: <B>textFont</B>
+Class: <B>Font</B>
+Command-Line Switch: <B>-textfont</B>
+</pre>
+<UL>
+Name of font to use for display of text in entryfield. The value
+may be given in any of the forms acceptable to <B>Tk_GetFont</B>.
+</UL>
+<P>
+<pre>
+Name: <B>validate</B>
+Class: <B>Command</B>
+Command-Line Switch: <B>-validate</B>
+</pre>
+<UL>
+The validate option allows specification of a validation mechanism. Standard
+character validation such as <B>numeric</B>, <B>alphabetic</B>, <B>integer</B>,
+<B>hexidecimal</B>, <B>real</B>, and <B>alphanumeric</B> can be handled through
+the use of keywords. Should more
+extensive validation be necessary, the value may contain the name of
+a command script. The script should return a boolean value. True for
+valid, false for invalid. If false is returned, then the procedure
+associated with the invalid option will be invoked.
+If the validation script contains
+any <B>%</B> characters, then the script will not be
+executed directly. Instead, a new script will be
+generated by replacing each <B>%</B>, and the character following
+it, with information from the entryfield. The replacement
+depends on the character following the <B>%</B>, as defined in the
+list below.
+</UL>
+<DL>
+<DT> <B>%c</B>
+</I></B>
+<DD> Replaced with the current input character.
+</DL>
+<DL>
+<DT> <B>%P</B>
+</I></B>
+<DD> Replaced with the contents of the entryfield modified to include the latest
+keystoke. This is equivalent to peeking at the future contents, enabling
+rejection prior to the update.
+</DL>
+<DL>
+<DT> <B>%S</B>
+</I></B>
+<DD> Replaced with the current contents of the entryfield prior to the latest
+keystroke being added.
+</DL>
+<DL>
+<DT> <B>%W</B>
+</I></B>
+<DD> Replaced with the entryfield widget pathname.
+</DL>
+<P>
+</pre><HR>
+
+</pre><H2>DESCRIPTION</H2>
+<P>
+The <B>entryfield</B> command creates an enhanced text entry widget with an
+optional associated label. Addtional options support validation and
+establishing a upper limit on the number of characters which may be
+entered in the field.
+</pre>
+
+</pre><H2>METHODS</H2>
+<P>
+The <B>entryfield</B> command creates a new Tcl command whose
+name is <I>pathName</I>. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+<pre>
+<I>pathName option </I>?<I>arg arg ...</I>?
+</pre>
+<I>Option</I> and the <I>arg</I>s
+determine the exact behavior of the command. The following
+commands are possible for entryfield widgets:
+</pre><H2>ASSOCIATED METHODS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>delete</B><br>
+<B>insert</B><br>
+</td>
+<td valign=top>
+<B>get</B><br>
+<B>scan</B><br>
+</td>
+<td valign=top>
+<B>icursor</B><br>
+<B>selection</B><br>
+</td>
+<td valign=top>
+<B>index</B><br>
+<B>xview</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/entry.n.html"> "entry" </A> manual entry for details on the associated methods.
+</pre><H2>WIDGET-SPECIFIC METHODS</H2>
+<DL>
+<DT> <I>pathName <B>cget</B> <I>option</I>
+</I></B>
+<DD> Returns the current value of the configuration option given
+by <I>option</I>.
+<I>Option</I> may have any of the values accepted by the <B>entryfield</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName <B>childsite</B>
+</I></B>
+<DD> Returns the path name of the child site.
+</DL>
+<DL>
+<DT> <I>pathName <B>clear</B>
+</I></B>
+<DD> Clear entry widget
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>configure</B> ?<I>option</I>? ?<I>value option value ...</I>?
+</I></B>
+<DD> Query or modify the configuration options of the widget.
+If no <I>option</I> is specified, returns a list describing all of
+the available options for <I>pathName</I> (see <B>Tk_ConfigureInfo</B> for
+information on the format of this list). If <I>option</I> is specified
+with no <I>value</I>, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no <I>option</I> is specified). If
+one or more <I>option-value</I> pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+<I>Option</I> may have any of the values accepted by the <B>entryfield</B>
+command.
+
+</DL>
+</pre><H2>COMPONENTS</H2>
+<P>
+<pre>
+Name: <B>efchildsite</B>
+Class: <B>frame</B>
+</pre>
+<UL>
+The efchildsite component is the user child site for the entry field. See
+the "frame" widget manual entry for details on the efchildsite component item.
+</UL>
+<P>
+<pre>
+Name: <B>entry</B>
+Class: <B>entry</B>
+</pre>
+<UL>
+The entry component provides the entry field for user text input and display.
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/entry.n.html"> "entry" </A> widget manual entry for details on the entry component item.
+</UL>
+</table>
+
+</pre><H2>EXAMPLE</H2>
+<pre>
+ option add *textBackground white
+
+ proc returnCmd {} {
+ puts stdout "Return Pressed"
+ }
+
+ proc invalidCmd {} {
+ puts stdout "Alphabetic contents invalid"
+ }
+
+ entryfield .ef -command returnCmd
+
+ entryfield .fef -labeltext "Fixed:" -fixed 10 -width 12
+
+ entryfield .nef -labeltext "Numeric:" -validate numeric -width 12
+
+ entryfield .aef -labeltext "Alphabetic:" \\
+ -validate alphabetic -width 12 -invalid invalidCmd
+
+ entryfield .pef -labeltext "Password:" \\
+ -show \267 -width 12 -command returnCmd
+
+ Labeledwidget::alignlabels .ef .fef .nef .aef .pef
+
+ pack .ef -fill x -expand yes -padx 10 -pady 5
+ pack .fef -fill x -expand yes -padx 10 -pady 5
+ pack .nef -fill x -expand yes -padx 10 -pady 5
+ pack .aef -fill x -expand yes -padx 10 -pady 5
+ pack .pef -fill x -expand yes -padx 10 -pady 5
+</pre>
+</pre><H2>AUTHORS</H2>
+Sue Yockey
+<P>
+Mark L. Ulferts
+<P>
+</pre><H2>KEYWORDS</H2>
+entryfield, widget
diff --git a/iwidgets/demos/html/extbutton.n.html b/iwidgets/demos/html/extbutton.n.html
new file mode 100644
index 00000000000..99cc59652c7
--- /dev/null
+++ b/iwidgets/demos/html/extbutton.n.html
@@ -0,0 +1,160 @@
+<TITLE>extbutton - Extends the behavior of the Tk button</TITLE>
+<H1>extbutton - Extends the behavior of the Tk button</H1>
+
+</pre><H2>SYNOPSIS</H2>
+<B>extbutton <I>pathName </I>?<I>options</I>?
+</pre><H2>INHERITANCE</H2>
+<I>itk::Widget &lt;- extbutton</I>
+</pre><H2>STANDARD OPTIONS</H2>
+<P><I>
+<table cellpadding=5>
+<td valign=top>
+<B>activebackground</B><br>
+<B>bd</B><br>
+<B>foreground</B><br>
+<B>text</B><br>
+</td>
+<td valign=top>
+<B>activeforeground</B><br>
+<B>cursor</B><br>
+<B>image</B><br>
+</td>
+<td valign=top>
+<B>bitmap</B><br>
+<B>disabledforeground</B><br>
+<B>justify</B><br>
+</td>
+<td valign=top>
+<B>background</B><br>
+<B>font</B><br>
+<B>relief</B><br>
+</td>
+</table>
+</I>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/options.n.html"> "options" </A> manual entry for details on the standard options.
+</pre><H2>WIDGET-SPECIFIC OPTIONS</H2>
+<P>
+<pre>
+Name: <B>bitmapforeground</B>
+Class: <B>Foreground</B>
+Command-Line Switch: <B>-bitmapforeground</B>
+</pre>
+<UL>
+Configures the foreground color of the bitmap.
+</UL>
+<P>
+<pre>
+Name: <B>command</B>
+Class: <B>Command</B>
+Command-Line Switch: <B>-command</B>
+</pre>
+<UL>
+Associate a command with the extbutton. Simulates a Tk button's
+-command option. Invoked by either &lt;1&gt; events or by explicitly
+calling the public invoke() method.
+</UL>
+<P>
+<pre>
+Name: <B>defaultring</B>
+Class: <B>DefaultRing</B>
+Command-Line Switch: <B>-defaultring</B>
+</pre>
+<UL>
+Boolean describing whether the extbutton displays its default ring given in
+any of the forms acceptable to <B>Tcl_GetBoolean</B>. The default is false.
+</UL>
+<P>
+<pre>
+Name: <B>defaultringpad</B>
+Class: <B>Pad</B>
+Command-Line Switch: <B>-defaultringpad</B>
+</pre>
+<UL>
+Specifies the amount of space to be allocated to the indentation of the
+default ring ring given in any of the forms acceptable to <B>Tcl_GetPixels</B>.
+The option has no effect if the defaultring option is set to false. The
+default is 4 pixels.
+</UL>
+<P>
+<pre>
+Name: <B>imagePos</B>
+Class: <B>Position</B>
+Command-Line Switch: <B>-imagepos</B>
+</pre>
+<UL>
+Specifies the image position relative to the message text: <B>n</B>, <B>ne</B>,
+<B>nw</B>, <B>s</B>, <B>se</B>, <B>sw</B>, <B>w</B>, <B>wn</B>, <B>ws</B>, <B>e</B>,
+<B>en</B>, or <B>es</B>. The default is w.
+</UL>
+<P>
+<pre>
+Name: <B>ringBackground</B>
+Class: <B>Background</B>
+Command-Line Switch: <B>-ringbackground</B>
+</pre>
+<UL>
+Configures the background color of the default ring frame (if -defaultring
+is set to boolean true).
+</UL>
+<P>
+</pre><HR>
+
+</pre><H2>DESCRIPTION</H2>
+<P>
+The <B>extbutton</B> extends the behavior of the atomic Tk button by
+allowing text and an image or bitmap to coexist. The user may use
+the -image or -bitmap options to specify an image as well as the
+-imagepos option to specify image position relative to the text.
+Note that the extbutton is not intended to be used without an
+image/bitmap. There will be an emtpy space next to the text if
+no image/bitmap is specified.
+
+</pre><H2>METHODS</H2>
+<P>
+The <B>extbutton</B> command creates a new Tcl command whose
+name is <I>pathName</I>. This command may be used to invoke various
+operations on the widget. It has the following general form:
+<pre>
+<I>pathName option </I>?<I>arg arg ...</I>?
+</pre>
+
+</pre><H2>INHERITED METHODS</H2>
+Each of the following methods are inherited from itk::Archetype. See that
+man page for details.
+<pre>
+<I>pathName <B>cget</B>
+pathName <B>component</B>
+pathName <B>config</B>
+pathName <B>configure</B></I>
+</pre>
+
+</pre><H2>WIDGET-SPECIFIC METHODS</H2>
+<DL>
+<DT> <I><B>pathName invoke
+</I></B>
+<DD> Evaluates the command fragment associated with the -command option.
+</DL>
+<DL>
+<DT> <I><B>pathName flash
+</I></B>
+<DD> Simulates the Tk button's flash command.
+</DL>
+</pre><H2>EXAMPLES</H2>
+<pre>
+</B>
+iwidgets::extbutton .eb -text "Bitmap example" -bitmap info \
+ -background bisque -activeforeground red -bitmapforeground blue \
+ -defaultring 1 -command {puts "Bisque is beautiful"}
+pack .eb -expand 1
+
+iwidgets::extbutton .eb -text "Image example" -relief ridge -image \
+ [image create photo -file $itk::library/../iwidgets/demos/images/clear.gif] \
+ -font 9x15bold -background lightgreen -imagepos e \
+ -activebackground lightyellow
+pack .eb -expand 1
+
+</pre><H2>AUTHOR</H2>
+Chad Smith
+</pre><H2>KEYWORDS</H2>
+button, pushbutton
diff --git a/iwidgets/demos/html/extfileselectionbox.n.html b/iwidgets/demos/html/extfileselectionbox.n.html
new file mode 100644
index 00000000000..55d33027bd8
--- /dev/null
+++ b/iwidgets/demos/html/extfileselectionbox.n.html
@@ -0,0 +1,467 @@
+<TITLE>extfileselectionbox - Create and manipulate a file selection box widget</TITLE>
+<H1>extfileselectionbox - Create and manipulate a file selection box widget</H1>
+
+</pre><H2>SYNOPSIS</H2>
+<B>extfileselectionbox<I> <I>pathName </I>?<I>options</I>?
+</pre><H2>INHERITANCE</H2>
+itk::Widget &lt;- Extfileselectionbox
+</pre><H2>STANDARD OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>activeBackground</B><br>
+<B>foreground</B><br>
+<B>insertBorderWidth</B><br>
+<B>selectBackground</B><br>
+</td>
+<td valign=top>
+<B>background</B><br>
+<B>highlightColor</B><br>
+<B>insertOffTime</B><br>
+<B>selectBorderWidth</B><br>
+</td>
+<td valign=top>
+<B>borderWidth</B><br>
+<B>highlightThickness</B><br>
+<B>insertOnTime</B><br>
+<B>selectForeground</B><br>
+</td>
+<td valign=top>
+<B>cursor</B><br>
+<B>insertBackground</B><br>
+<B>insertWidth</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/options.n.html"> "options" </A> manual entry for details on the standard options.
+</pre><H2>ASSOCIATED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>popupCursor</B><br>
+</td>
+<td valign=top>
+<B>textBackground</B><br>
+</td>
+<td valign=top>
+<B>textFont</B><br>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="combobox.n.html"> "combobox" </A> widget manual entry for details on the above
+associated options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>labelFont</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="labeledwidget.n.html"> "labeledwidget" </A> widget manual entry for details on the above
+associated options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>sashCursor</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="panedwindow.n.html"> "panedwindow" </A> widget manual entry for details on the above
+associated options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>activeRelief</B><br>
+</td>
+<td valign=top>
+<B>elementBorderWidth</B><br>
+</td>
+<td valign=top>
+<B>jump</B><br>
+</td>
+<td valign=top>
+<B>troughColor</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/scrollbar.n.html"> "scrollbar" </A> widget class manual entry for details on the above
+associated options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>textBackground</B><br>
+</td>
+<td valign=top>
+<B>textFont</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="scrolledlistbox.n.html"> "scrolledlistbox" </A> widget manual entry for details on the above
+associated options.
+</pre><H2>WIDGET-SPECIFIC OPTIONS</H2>
+<P>
+<pre>
+Name: <B>childSitePos</B>
+Class: <B>Position</B>
+Command-Line Switch: <B>-childsitepos</B>
+</pre>
+<UL>
+Specifies the position of the child site in the extended fileselection
+box: <B>n</B>, <B>s</B>, <B>e</B>, <B>w</B>, <B>top</B>, or <B>bottom</B>.
+The default is s.
+</UL>
+<P>
+<pre>
+Name: <B>directory</B>
+Class: <B>Directory</B>
+Command-Line Switch: <B>-directory</B>
+</pre>
+<UL>
+Specifies the initial default directory. The default is the present
+working directory.
+</UL>
+<P>
+<pre>
+Name: <B>dirSearchCommand</B>
+Class: <B>Command</B>
+Command-Line Switch: <B>-dirsearchcommand</B>
+</pre>
+<UL>
+Specifies a Tcl command to be executed to perform a directory search.
+The command will receive the current working directory and filter
+mask as arguments. The command should return a list of files which
+will be placed into the directory list.
+</UL>
+<P>
+<pre>
+Name: <B>dirsLabel</B>
+Class: <B>Text</B>
+Command-Line Switch: <B>-dirslabel</B>
+</pre>
+<UL>
+Specifies the text of the label for the directory list. The default is
+"Directories".
+</UL>
+<P>
+<pre>
+Name: <B>dirsOn</B>
+Class: <B>DirsOn</B>
+Command-Line Switch: <B>-dirson</B>
+</pre>
+<UL>
+Specifies whether or not to display the directory list. The
+value may be given in any of the forms acceptable to <B>Tcl_GetBoolean</B>.
+The default is true.
+</UL>
+<P>
+<pre>
+Name: <B>fileSearchCommand</B>
+Class: <B>Command</B>
+Command-Line Switch: <B>-filesearchcommand</B>
+</pre>
+<UL>
+Specifies a Tcl command to be executed to perform a file search.
+The command will receive the current working directory and filter
+mask as arguments. The command should return a list of files which
+will be placed into the file list.
+</UL>
+<P>
+<pre>
+Name: <B>filesLabel</B>
+Class: <B>Text</B>
+Command-Line Switch: <B>-fileslabel</B>
+</pre>
+<UL>
+Specifies the text of the label for the files list. The default is "Files".
+</UL>
+<P>
+<pre>
+Name: <B>filesOn</B>
+Class: <B>FilesOn</B>
+Command-Line Switch: <B>-fileson</B>
+</pre>
+<UL>
+Specifies whether or not to display the files list. The
+value may be given in any of the forms acceptable to <B>Tcl_GetBoolean</B>.
+The default is true.
+</UL>
+<P>
+<pre>
+Name: <B>fileType</B>
+Class: <B>FileType</B>
+Command-Line Switch: <B>-filetype</B>
+</pre>
+<UL>
+Specify the type of files which may appear in the file list: <B>regular</B>,
+<B>directory</B>, or <B>any</B>. The default is regular.
+</UL>
+<P>
+<pre>
+Name: <B>filterCommand</B>
+Class: <B>Command</B>
+Command-Line Switch: <B>-filtercommand</B>
+</pre>
+<UL>
+Specifies a Tcl command to be executed upon hitting the Return key
+in the filter combobox widget.
+</UL>
+<P>
+<pre>
+Name: <B>filterLabel</B>
+Class: <B>Text</B>
+Command-Line Switch: <B>-filterlabel</B>
+</pre>
+<UL>
+Specifies the text of the label for the filter combobox. The default is
+"Filter".
+</UL>
+<P>
+<pre>
+Name: <B>filterOn</B>
+Class: <B>FilterOn</B>
+Command-Line Switch: <B>-filteron</B>
+</pre>
+<UL>
+Specifies whether or not to display the filter combobox. The
+value may be given in any of the forms acceptable to <B>Tcl_GetBoolean</B>.
+The default is true.
+</UL>
+<P>
+<pre>
+Name: <B>height</B>
+Class: <B>Height</B>
+Command-Line Switch: <B>-height</B>
+</pre>
+<UL>
+Specifies the height of the selection box. The value may be specified in
+any of the forms acceptable to Tk_GetPixels. The default is 300 pixels.
+</UL>
+<P>
+<pre>
+Name: <B>invalid</B>
+Class: <B>Command</B>
+Command-Line Switch: <B>-invalid</B>
+</pre>
+<UL>
+Command to be executed should the filter contents be proven
+invalid. The default is {bell}.
+</UL>
+<P>
+<pre>
+Name: <B>mask</B>
+Class: <B>Mask</B>
+Command-Line Switch: <B>-mask</B>
+</pre>
+<UL>
+Specifies the initial file mask string. The default is "*".
+</UL>
+<P>
+<pre>
+Name: <B>noMatchString</B>
+Class: <B>NoMatchString</B>
+Command-Line Switch: <B>-nomatchstring</B>
+</pre>
+<UL>
+Specifies the string to be displayed in the files list should no files
+match the mask. The default is "".
+</UL>
+<P>
+<pre>
+Name: <B>selectDirCommand</B>
+Class: <B>Command</B>
+Command-Line Switch: <B>-selectdirommand</B>
+</pre>
+<UL>
+Specifies a Tcl command to be executed following selection of a
+directory in the directory list.
+</UL>
+<P>
+<pre>
+Name: <B>selectFileCommand</B>
+Class: <B>Command</B>
+Command-Line Switch: <B>-selectfileommand</B>
+</pre>
+<UL>
+Specifies a Tcl command to be executed following selection of a
+file in the files list.
+</UL>
+<P>
+<pre>
+Name: <B>selectionCommand</B>
+Class: <B>Command</B>
+Command-Line Switch: <B>-selectioncommand</B>
+</pre>
+<UL>
+Specifies a Tcl command to be executed upon hitting the Return key
+in the selection combobox widget.
+</UL>
+<P>
+<pre>
+Name: <B>selectionLabel</B>
+Class: <B>Text</B>
+Command-Line Switch: <B>-selectionlabel</B>
+</pre>
+<UL>
+Specifies the text of the label for the selection combobox. The default
+is "Selection".
+</UL>
+<P>
+<pre>
+Name: <B>selectionOn</B>
+Class: <B>SelectionOn</B>
+Command-Line Switch: <B>-selectionon</B>
+</pre>
+<UL>
+Specifies whether or not to display the selection combobox. The
+value may be given in any of the forms acceptable to <B>Tcl_GetBoolean</B>.
+The default is true.
+</UL>
+<P>
+<pre>
+Name: <B>width</B>
+Class: <B>Width</B>
+Command-Line Switch: <B>-width</B>
+</pre>
+<UL>
+Specifies the width of the selection box. The value may be specified in
+any of the forms acceptable to Tk_GetPixels. The default is 350 pixels.
+</UL>
+<P>
+</pre><HR>
+
+</pre><H2>DESCRIPTION</H2>
+<P>
+The <B>extfileselectionbox</B> command creates an extended file
+selection box which is slightly different than the fileselectionbox widget.
+The differences are mostly cosmetic in that the listboxes are
+within a panedwindow and the entryfields for the filter and selection
+have been replaced by comboboxes. Other than that the interface is
+practically the same.
+
+</pre><H2>METHODS</H2>
+<P>
+The <B>extfileselectionbox</B> command creates a new Tcl command whose
+name is <I>pathName</I>. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+<pre>
+<I>pathName option </I>?<I>arg arg ...</I>?
+</pre>
+<I>Option</I> and the <I>arg</I>s
+determine the exact behavior of the command. The following
+commands are possible for extfileselectionbox widgets:
+
+</pre><H2>WIDGET-SPECIFIC METHODS</H2>
+<DL>
+<DT> <I>pathName <B>cget</B> <I>option</I>
+</I></B>
+<DD> Returns the current value of the configuration option given
+by <I>option</I>.
+<I>Option</I> may have any of the values accepted by the <B>extfileselectionbox</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName <B>childsite</B>
+</I></B>
+<DD> Returns the child site widget path name.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>configure</B> ?<I>option</I>? ?<I>value option value ...</I>?
+</I></B>
+<DD> Query or modify the configuration options of the widget.
+If no <I>option</I> is specified, returns a list describing all of
+the available options for <I>pathName</I> (see <B>Tk_ConfigureInfo</B> for
+information on the format of this list). If <I>option</I> is specified
+with no <I>value</I>, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no <I>option</I> is specified). If
+one or more <I>option-value</I> pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+<I>Option</I> may have any of the values accepted by the <B>extfileselectionbox</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName <B>filter</B>
+</I></B>
+<DD> Update the current contents of the extended file selection box based
+on the current filter combobox value.
+</DL>
+<DL>
+<DT> <I>pathName <B>get</B>
+</I></B>
+<DD> Returns the current value of the selection combobox widget.
+
+</DL>
+</pre><H2>COMPONENTS</H2>
+<P>
+<pre>
+Name: <B>dirs</B>
+Class: <B>Scrolledlistbox</B>
+</pre>
+<UL>
+The dirs component is the directory list box for the extended fileselection
+box. See the "scrolledlistbox" widget manual entry for details on the dirs
+component item.
+</UL>
+<P>
+<pre>
+Name: <B>files</B>
+Class: <B>Scrolledlistbox</B>
+</pre>
+<UL>
+The files component is the file list box for the extended fileselection box.
+See the <A HREF="scrolledlistbox.n.html"> "scrolledlistbox" </A> widget manual entry for details on the files
+component item.
+</UL>
+<P>
+<pre>
+Name: <B>filter</B>
+Class: <B>Combobox</B>
+</pre>
+<UL>
+The filter component is the field for user input of the filter value.
+See the <A HREF="combobox.n.html"> "combobox" </A> widget manual entry for details on the filter
+component item.
+</UL>
+<P>
+<pre>
+Name: <B>selection</B>
+Class: <B>Combobox</B>
+</pre>
+<UL>
+The selection component is the field for user input of the currently
+selected file value. See the "combobox" widget manual entry for details
+on the selection component item.
+</UL>
+</table>
+
+</pre><H2>EXAMPLE</H2>
+<pre>
+extfileselectionbox .fsb
+pack .fsb -padx 10 -pady 10 -fill both -expand yes
+</pre>
+</pre><H2>AUTHORS</H2>
+Mark L. Ulferts
+<P>
+Anthony Parent
+</pre><H2>KEYWORDS</H2>
+extfileselectionbox, widget
diff --git a/iwidgets/demos/html/extfileselectiondialog.n.html b/iwidgets/demos/html/extfileselectiondialog.n.html
new file mode 100644
index 00000000000..b3b956ace3e
--- /dev/null
+++ b/iwidgets/demos/html/extfileselectiondialog.n.html
@@ -0,0 +1,375 @@
+<TITLE>extfileselectiondialog - Create and manipulate a file selection dialog widget</TITLE>
+<H1>extfileselectiondialog - Create and manipulate a file selection dialog widget</H1>
+
+</pre><H2>SYNOPSIS</H2>
+<B>extfileselectiondialog<I> <I>pathName </I>?<I>options</I>?
+</pre><H2>INHERITANCE</H2>
+itk::Toplevel &lt;- Shell &lt;- Dialogshell &lt;- Dialog &lt;- Extfileselectiondialog
+</pre><H2>STANDARD OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>activeBackground</B><br>
+<B>foreground</B><br>
+<B>insertBorderWidth</B><br>
+<B>selectBackground</B><br>
+</td>
+<td valign=top>
+<B>background</B><br>
+<B>highlightColor</B><br>
+<B>insertOffTime</B><br>
+<B>selectBorderWidth</B><br>
+</td>
+<td valign=top>
+<B>borderWidth</B><br>
+<B>highlightThickness</B><br>
+<B>insertOnTime</B><br>
+<B>selectForeground</B><br>
+</td>
+<td valign=top>
+<B>cursor</B><br>
+<B>insertBackground</B><br>
+<B>insertWidth</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/options.n.html"> "options" </A> manual entry for details on the standard options.
+</pre><H2>ASSOCIATED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>popupCursor</B><br>
+</td>
+<td valign=top>
+<B>textBackground</B><br>
+</td>
+<td valign=top>
+<B>textFont</B><br>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="combobox.n.html"> "combobox" </A> widget manual entry for details on the above
+associated options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>childSitePos</B><br>
+<B>dirsOn</B><br>
+<B>filesOn</B><br>
+<B>invalid</B><br>
+<B>selectionOn</B><br>
+</td>
+<td valign=top>
+<B>directory</B><br>
+<B>filesLabel</B><br>
+<B>fileType</B><br>
+<B>mask</B><br>
+</td>
+<td valign=top>
+<B>dirsLabel</B><br>
+<B>filesLabelOn</B><br>
+<B>filterLabel</B><br>
+<B>noMatchString</B><br>
+</td>
+<td valign=top>
+<B>dirSearchCommand</B><br>
+<B>fileSearchCommand</B><br>
+<B>filterOn</B><br>
+<B>selectionLabel</B><br>
+</td>
+</table>
+<P>
+See the "extfileselectionbox" widget manual entry for details on the above
+associated options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>labelFont</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="labeledwidget.n.html"> "labeledwidget" </A> widget manual entry for details on the above
+associated options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>sashCursor</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="panedwindow.n.html"> "panedwindow" </A> widget manual entry for details on the above
+associated options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>labelFont</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="labeledwidget.n.html"> "labeledwidget" </A> widget manual entry for details on the above
+associated options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>activeRelief</B><br>
+</td>
+<td valign=top>
+<B>elementBorderWidth</B><br>
+</td>
+<td valign=top>
+<B>jump</B><br>
+</td>
+<td valign=top>
+<B>troughColor</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/scrollbar.n.html"> "scrollbar" </A> widget class manual entry for details on the above
+associated options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>textBackground</B><br>
+</td>
+<td valign=top>
+<B>textFont</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="scrolledlistbox.n.html"> "scrolledlistbox" </A> widget manual entry for details on the above
+associated options.
+
+</pre><H2>INHERITED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>buttonBoxPadX</B><br>
+<B>padY</B><br>
+</td>
+<td valign=top>
+<B>buttonBoxPadY</B><br>
+<B>separator</B><br>
+</td>
+<td valign=top>
+<B>buttonBoxPos</B><br>
+<B>thickness</B><br>
+</td>
+<td valign=top>
+<B>padX</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="dialogshell.n.html"> "dialogshell" </A> widget manual entry for details on the above
+inherited options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>height</B><br>
+</td>
+<td valign=top>
+<B>master</B><br>
+</td>
+<td valign=top>
+<B>modality</B><br>
+</td>
+<td valign=top>
+<B>width</B><br>
+</td>
+</table>
+<P>
+See the "shell" widget manual entry for details on the above
+inherited options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>title</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the "Toplevel" widget manual entry for details on the above
+inherited options.
+</pre><HR>
+
+</pre><H2>DESCRIPTION</H2>
+<P>
+The <B>extfileselectiondialog</B> command creates an extended file
+selection dialog which is slightly different than the
+fileselectiondialog widget.
+The differences are mostly cosmetic in that the listboxes are
+within a panedwindow and the entryfields for the filter and selection
+have been replaced by comboboxes. Other than that the interface is
+practically the same.
+
+</pre><H2>METHODS</H2>
+<P>
+The <B>extfileselectiondialog</B> command creates a new Tcl command whose
+name is <I>pathName</I>. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+<pre>
+<I>pathName option </I>?<I>arg arg ...</I>?
+</pre>
+<I>Option</I> and the <I>arg</I>s
+determine the exact behavior of the command. The following
+commands are possible for extfileselectiondialog widgets:
+</pre><H2>ASSOCIATED METHODS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>get</B><br>
+</td>
+<td valign=top>
+<B>childsite</B><br>
+</td>
+<td valign=top>
+<B>filter</B><br>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="fileselectionbox.n.html"> "fileselectionbox" </A> class manual entry for details on the
+associated methods.
+</pre><H2>INHERITED METHODS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>add</B><br>
+<B>insert</B><br>
+</td>
+<td valign=top>
+<B>buttonconfigure</B><br>
+<B>invoke</B><br>
+</td>
+<td valign=top>
+<B>default</B><br>
+<B>show</B><br>
+</td>
+<td valign=top>
+<B>hide</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="buttonbox.n.html"> "buttonbox" </A> widget manual entry for details on the above
+inherited methods.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>activate</B><br>
+</td>
+<td valign=top>
+<B>center</B><br>
+</td>
+<td valign=top>
+<B>deactivate</B><br>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the "shell" widget manual entry for details on the above
+inherited methods.
+
+</pre><H2>WIDGET-SPECIFIC METHODS</H2>
+<DL>
+<DT> <I>pathName <B>cget</B> <I>option</I>
+</I></B>
+<DD> Returns the current value of the configuration option given
+by <I>option</I>.
+<I>Option</I> may have any of the values accepted by
+the <B>extfileselectiondialog</B> command.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>configure</B> ?<I>option</I>? ?<I>value option value ...</I>?
+</I></B>
+<DD> Query or modify the configuration options of the widget.
+If no <I>option</I> is specified, returns a list describing all of
+the available options for <I>pathName</I> (see <B>Tk_ConfigureInfo</B> for
+information on the format of this list). If <I>option</I> is specified
+with no <I>value</I>, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no <I>option</I> is specified). If
+one or more <I>option-value</I> pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+<I>Option</I> may have any of the values accepted by
+the <B>extfileselectiondialog</B>
+command.
+
+</DL>
+</pre><H2>COMPONENTS</H2>
+<P>
+<pre>
+Name: <B>fsb</B>
+Class: <B>Fileselectionbox</B>
+</pre>
+<UL>
+The fsb component is the extfileselectionbox for the extfileselectiondialog.
+See the "extfileselectionbox" widget manual entry for details on the fsb
+component item.
+</UL>
+</table>
+
+</pre><H2>EXAMPLE</H2>
+<pre>
+ #
+ # Non-modal example
+ #
+ proc okCallback {} {
+ puts "You selected [.nmfsd get]"
+ .nmfsd deactivate
+ }
+
+ extfileselectiondialog .nmfsd -title Non-Modal
+ .nmfsd buttonconfigure OK -command okCallback
+
+ .nmfsd activate
+
+ #
+ # Modal example
+ #
+ extfileselectiondialog .mfsd -modality application
+ .mfsd center
+
+ if {[.mfsd activate]} {
+ puts "You selected [.mfsd get]"
+ } else {
+ puts "You cancelled the dialog"
+ }
+</pre>
+</pre><H2>AUTHORS</H2>
+Mark L. Ulferts
+<P>
+Anthony L. Parent
+</pre><H2>KEYWORDS</H2>
+extfileselectiondialog, extfileselectionbox, dialog, dialogshell, shell, widget
diff --git a/iwidgets/demos/html/feedback.n.html b/iwidgets/demos/html/feedback.n.html
new file mode 100644
index 00000000000..b2d3bca96b2
--- /dev/null
+++ b/iwidgets/demos/html/feedback.n.html
@@ -0,0 +1,168 @@
+<TITLE>feedback - Create and manipulate a feedback widget to display feedback on</TITLE>
+<H1>feedback - Create and manipulate a feedback widget to display feedback on</H1>
+
+the current status of an ongoing operation to the user.
+</pre><H2>SYNOPSIS</H2>
+<B>feedback<I> <I>pathName </I>?<I>options</I>?
+</pre><H2>INHERITANCE</H2>
+itk::Widget &lt;- Labeledwidget &lt;- Feedback
+</pre><H2>STANDARD OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>background</B><br>
+<B>highlightThickness</B><br>
+</td>
+<td valign=top>
+<B>cursor</B><br>
+</td>
+<td valign=top>
+<B>foreground</B><br>
+</td>
+<td valign=top>
+<B>highlightColor</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/options.n.html"> "options" </A> manual entry for details on the standard options.
+</pre><H2>INHERITED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>labelBitmap</B><br>
+<B>labelPos</B><br>
+</td>
+<td valign=top>
+<B>labelFont</B><br>
+<B>labelText</B><br>
+</td>
+<td valign=top>
+<B>labelImage</B><br>
+<B>labelVariable</B><br>
+</td>
+<td valign=top>
+<B>labelMargin</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="labeledwidget.n.html"> "labeledwidget" </A> class manual entry for details on the inherited options.
+</pre><H2>WIDGET-SPECIFIC OPTIONS</H2>
+<P>
+<pre>
+Name: <B>barcolor</B>
+Class: <B>BarColor</B>
+Command-Line Switch: <B>-barcolor</B>
+</pre>
+<UL>
+Specifies the color of the status bar, in any of the forms
+acceptable to <B>Tk_GetColor</B>. The default is DodgerBlue.
+</UL>
+<P>
+<pre>
+Name: <B>barheight</B>
+Class: <B>BarHeight</B>
+Command-Line Switch: <B>-barheight</B>
+</pre>
+<UL>
+Specifies the height of the status bar, in any of the forms
+acceptable to <B>Tk_GetPixels</B>. The default is 20.
+</UL>
+<P>
+<pre>
+Name: <B>troughColor</B>
+Class: <B>TroughColor</B>
+Command-Line Switch: <B>-troughcolor</B>
+</pre>
+<UL>
+Specifies the color of the frame in which the status bar sits,
+in any of the forms acceptable to <B>Tk_GetColor</B>. The default is white.
+</UL>
+<P>
+<pre>
+Name: <B>steps</B>
+Class: <B>Steps</B>
+Command-Line Switch: <B>-steps</B>
+</pre>
+<UL>
+Specifies the total number of steps for the status bar. The default is 10.
+</UL>
+<P>
+
+</pre><H2>DESCRIPTION</H2>
+<P>
+The <B>feedback</B> command creates a widget to display feedback on
+the current status of an ongoing operation to the user. Display is given as
+a percentage and as a thermometer type bar. Options exist for adding a label
+and controlling its position.
+
+</pre><H2>METHODS</H2>
+<P>
+The <B>feedback</B> command creates a new Tcl command whose
+name is <I>pathName</I>. This command may be used to invoke various
+operations on the widget. It has the following general form:
+<pre>
+<I>pathName option </I>?<I>arg arg ...</I>?
+</pre>
+<I>Option</I> and the <I>arg</I>s
+determine the exact behavior of the command. The following
+commands are possible for scrolledtext widgets:
+
+</pre><H2>WIDGET-SPECIFIC METHODS</H2>
+<DL>
+<DT> <I>pathName <B>cget</B> <I>option</I>
+</I></B>
+<DD> Returns the current value of the configuration option given
+by <I>option</I>.
+<I>Option</I> may have any of the values accepted by the <B>scrolledhtml</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>configure</B> ?<I>option</I>? ?<I>value option value ...</I>?
+</I></B>
+<DD> Query or modify the configuration options of the widget.
+If no <I>option</I> is specified, returns a list describing all of
+the available options for <I>pathName</I> (see <B>Tk_ConfigureInfo</B> for
+information on the format of this list). If <I>option</I> is specified
+with no <I>value</I>, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no <I>option</I> is specified). If
+one or more <I>option-value</I> pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+<I>Option</I> may have any of the values accepted by the <B>feedback</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>reset</B>
+</I></B>
+<DD> Reset the current number of steps completed to 0, and configures the
+percentage complete label text to 0%
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>step</B> ?<I>inc</I>?
+</I></B>
+<DD> Increase the current number of steps completed by the amount specified
+by <I>inc</I>. <I>Inc</I> defaults to 1.
+
+</DL>
+</pre><H2>EXAMPLE</H2>
+<pre>
+ feedback .fb -labeltext "Status" -steps 20
+ pack .fb -padx 10 -pady 10 -fill both -expand yes
+
+ for {set i 0} {$i &lt; 20} {incr i} {
+ .fb step
+ after 500
+ }
+</pre>
+</pre><H2>ACKNOWLEDGEMENTS</H2>
+Sam Shen
+<UL>
+This code is based largely on his feedback.tcl code from tk inspect. The
+original feedback code is copyright 1995 Lawrence Berkeley Laboratory.
+</UL>
+<P>
+</pre><H2>AUTHOR</H2>
+Kris Raney
+</pre><H2>KEYWORDS</H2>
+feedback, widget
diff --git a/iwidgets/demos/html/fileselectionbox.n.html b/iwidgets/demos/html/fileselectionbox.n.html
new file mode 100644
index 00000000000..99a9e4412f3
--- /dev/null
+++ b/iwidgets/demos/html/fileselectionbox.n.html
@@ -0,0 +1,456 @@
+<TITLE>fileselectionbox - Create and manipulate a file selection box widget</TITLE>
+<H1>fileselectionbox - Create and manipulate a file selection box widget</H1>
+
+</pre><H2>SYNOPSIS</H2>
+<B>fileselectionbox<I> <I>pathName </I>?<I>options</I>?
+</pre><H2>INHERITANCE</H2>
+itk::Widget &lt;- Fileselectionbox
+</pre><H2>STANDARD OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>activeBackground</B><br>
+<B>foreground</B><br>
+<B>insertBorderWidth</B><br>
+<B>selectBackground</B><br>
+</td>
+<td valign=top>
+<B>background</B><br>
+<B>highlightColor</B><br>
+<B>insertOffTime</B><br>
+<B>selectBorderWidth</B><br>
+</td>
+<td valign=top>
+<B>borderWidth</B><br>
+<B>highlightThickness</B><br>
+<B>insertOnTime</B><br>
+<B>selectForeground</B><br>
+</td>
+<td valign=top>
+<B>cursor</B><br>
+<B>insertBackground</B><br>
+<B>insertWidth</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/options.n.html"> "options" </A> manual entry for details on the standard options.
+</pre><H2>ASSOCIATED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>textBackground</B><br>
+</td>
+<td valign=top>
+<B>textFont</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="entryfield.n.html"> "entryfield" </A> widget manual entry for details on the above
+associated options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>labelFont</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="labeledwidget.n.html"> "labeledwidget" </A> widget manual entry for details on the above
+associated options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>activeRelief</B><br>
+</td>
+<td valign=top>
+<B>elementBorderWidth</B><br>
+</td>
+<td valign=top>
+<B>jump</B><br>
+</td>
+<td valign=top>
+<B>troughColor</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/scrollbar.n.html"> "scrollbar" </A> widget class manual entry for details on the above
+associated options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>textBackground</B><br>
+</td>
+<td valign=top>
+<B>textFont</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="scrolledlistbox.n.html"> "scrolledlistbox" </A> widget manual entry for details on the above
+associated options.
+</pre><H2>WIDGET-SPECIFIC OPTIONS</H2>
+<P>
+<pre>
+Name: <B>childSitePos</B>
+Class: <B>Position</B>
+Command-Line Switch: <B>-childsitepos</B>
+</pre>
+<UL>
+Specifies the position of the child site in the selection box: <B>n</B>,
+<B>s</B>, <B>e</B>, <B>w</B>, <B>top</B>, <B>bottom</B>, or <B>center</B>. The
+default is s.
+</UL>
+</table>
+<UL>
+Specifies a Tcl command procedure which is called when an file list item is
+double clicked. Typically this occurs when mouse button 1 is double
+clicked over a file name.
+</UL>
+<P>
+<pre>
+Name: <B>directory</B>
+Class: <B>Directory</B>
+Command-Line Switch: <B>-directory</B>
+</pre>
+<UL>
+Specifies the initial default directory. The default is the present
+working directory.
+</UL>
+<P>
+<pre>
+Name: <B>dirSearchCommand</B>
+Class: <B>Command</B>
+Command-Line Switch: <B>-dirsearchcommand</B>
+</pre>
+<UL>
+Specifies a Tcl command to be executed to perform a directory search.
+The command will receive the current working directory and filter
+mask as arguments. The command should return a list of files which
+will be placed into the directory list.
+</UL>
+<P>
+<pre>
+Name: <B>dirsLabel</B>
+Class: <B>Text</B>
+Command-Line Switch: <B>-dirslabel</B>
+</pre>
+<UL>
+Specifies the text of the label for the directory list. The default is
+"Directories".
+</UL>
+<P>
+<pre>
+Name: <B>dirsOn</B>
+Class: <B>DirsOn</B>
+Command-Line Switch: <B>-dirson</B>
+</pre>
+<UL>
+Specifies whether or not to display the directory list. The
+value may be given in any of the forms acceptable to <B>Tcl_GetBoolean</B>.
+The default is true.
+</UL>
+<P>
+<pre>
+Name: <B>fileSearchCommand</B>
+Class: <B>Command</B>
+Command-Line Switch: <B>-filesearchcommand</B>
+</pre>
+<UL>
+Specifies a Tcl command to be executed to perform a file search.
+The command will receive the current working directory and filter
+mask as arguments. The command should return a list of files which
+will be placed into the file list.
+</UL>
+<P>
+<pre>
+Name: <B>filesLabel</B>
+Class: <B>Text</B>
+Command-Line Switch: <B>-fileslabel</B>
+</pre>
+<UL>
+Specifies the text of the label for the files list. The default is "Files".
+</UL>
+<P>
+<pre>
+Name: <B>filesOn</B>
+Class: <B>FilesOn</B>
+Command-Line Switch: <B>-fileson</B>
+</pre>
+<UL>
+Specifies whether or not to display the files list. The
+value may be given in any of the forms acceptable to <B>Tcl_GetBoolean</B>.
+The default is true.
+</UL>
+<P>
+<pre>
+Name: <B>fileType</B>
+Class: <B>FileType</B>
+Command-Line Switch: <B>-filetype</B>
+</pre>
+<UL>
+Specify the type of files which may appear in the file list: <B>regular</B>,
+<B>directory</B>, or <B>any</B>. The default is regular.
+</UL>
+<P>
+<pre>
+Name: <B>filterCommand</B>
+Class: <B>Command</B>
+Command-Line Switch: <B>-filtercommand</B>
+</pre>
+<UL>
+Specifies a Tcl command to be executed upon hitting the Return key
+in the filter entry widget.
+</UL>
+<P>
+<pre>
+Name: <B>filterLabel</B>
+Class: <B>Text</B>
+Command-Line Switch: <B>-filterlabel</B>
+</pre>
+<UL>
+Specifies the text of the label for the filter entry field. The default is
+"Filter".
+</UL>
+<P>
+<pre>
+Name: <B>filterOn</B>
+Class: <B>FilterOn</B>
+Command-Line Switch: <B>-filteron</B>
+</pre>
+<UL>
+Specifies whether or not to display the filter entry. The
+value may be given in any of the forms acceptable to <B>Tcl_GetBoolean</B>.
+The default is true.
+</UL>
+<P>
+<pre>
+Name: <B>height</B>
+Class: <B>Height</B>
+Command-Line Switch: <B>-height</B>
+</pre>
+<UL>
+Specifies the height of the selection box. The value may be specified in
+any of the forms acceptable to Tk_GetPixels. The default is 360 pixels.
+</UL>
+<P>
+<pre>
+Name: <B>invalid</B>
+Class: <B>Command</B>
+Command-Line Switch: <B>-invalid</B>
+</pre>
+<UL>
+Command to be executed should the filter contents be proven
+invalid. The default is {bell}.
+</UL>
+<P>
+<pre>
+Name: <B>mask</B>
+Class: <B>Mask</B>
+Command-Line Switch: <B>-mask</B>
+</pre>
+<UL>
+Specifies the initial file mask string. The default is "*".
+</UL>
+<P>
+<pre>
+Name: <B>noMatchString</B>
+Class: <B>NoMatchString</B>
+Command-Line Switch: <B>-nomatchstring</B>
+</pre>
+<UL>
+Specifies the string to be displayed in the files list should no files
+match the mask. The default is "".
+</UL>
+<P>
+<pre>
+Name: <B>selectDirCommand</B>
+Class: <B>Command</B>
+Command-Line Switch: <B>-selectdirommand</B>
+</pre>
+<UL>
+Specifies a Tcl command to be executed following selection of a
+directory in the directory list.
+</UL>
+<P>
+<pre>
+Name: <B>selectFileCommand</B>
+Class: <B>Command</B>
+Command-Line Switch: <B>-selectfileommand</B>
+</pre>
+<UL>
+Specifies a Tcl command to be executed following selection of a
+file in the files list.
+</UL>
+<P>
+<pre>
+Name: <B>selectionCommand</B>
+Class: <B>Command</B>
+Command-Line Switch: <B>-selectioncommand</B>
+</pre>
+<UL>
+Specifies a Tcl command to be executed upon hitting the Return key
+in the selection entry widget.
+</UL>
+<P>
+<pre>
+Name: <B>selectionLabel</B>
+Class: <B>Text</B>
+Command-Line Switch: <B>-selectionlabel</B>
+</pre>
+<UL>
+Specifies the text of the label for the selection entry field. The default
+is "Selection".
+</UL>
+<P>
+<pre>
+Name: <B>selectionOn</B>
+Class: <B>SelectionOn</B>
+Command-Line Switch: <B>-selectionon</B>
+</pre>
+<UL>
+Specifies whether or not to display the selection entry. The
+value may be given in any of the forms acceptable to <B>Tcl_GetBoolean</B>.
+The default is true.
+</UL>
+<P>
+<pre>
+Name: <B>width</B>
+Class: <B>Width</B>
+Command-Line Switch: <B>-width</B>
+</pre>
+<UL>
+Specifies the width of the selection box. The value may be specified in
+any of the forms acceptable to Tk_GetPixels. The default is 470 pixels.
+</UL>
+<P>
+</pre><HR>
+
+</pre><H2>DESCRIPTION</H2>
+<P>
+The <B>fileselectionbox</B> command creates a file selection box similar
+to the OSF/Motif standard Xmfileselectionbox composite widget. The
+fileselectionbox is composed of directory and file scrolled lists as
+well as filter and selection entry fields. Bindings are in place such that
+selection of a directory list item loads the filter entry field and
+selection of a file list item loads the selection entry field. Options
+exist to control the appearance and actions of the widget.
+
+</pre><H2>METHODS</H2>
+<P>
+The <B>fileselectionbox</B> command creates a new Tcl command whose
+name is <I>pathName</I>. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+<pre>
+<I>pathName option </I>?<I>arg arg ...</I>?
+</pre>
+<I>Option</I> and the <I>arg</I>s
+determine the exact behavior of the command. The following
+commands are possible for fileselectionbox widgets:
+
+</pre><H2>WIDGET-SPECIFIC METHODS</H2>
+<DL>
+<DT> <I>pathName <B>cget</B> <I>option</I>
+</I></B>
+<DD> Returns the current value of the configuration option given
+by <I>option</I>.
+<I>Option</I> may have any of the values accepted by the <B>fileselectionbox</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName <B>childsite</B>
+</I></B>
+<DD> Returns the child site widget path name.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>configure</B> ?<I>option</I>? ?<I>value option value ...</I>?
+</I></B>
+<DD> Query or modify the configuration options of the widget.
+If no <I>option</I> is specified, returns a list describing all of
+the available options for <I>pathName</I> (see <B>Tk_ConfigureInfo</B> for
+information on the format of this list). If <I>option</I> is specified
+with no <I>value</I>, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no <I>option</I> is specified). If
+one or more <I>option-value</I> pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+<I>Option</I> may have any of the values accepted by the <B>fileselectionbox</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName <B>filter</B>
+</I></B>
+<DD> Update the current contents of the file selection box based on the current
+filter entry field value.
+</DL>
+<DL>
+<DT> <I>pathName <B>get</B>
+</I></B>
+<DD> Returns the current value of the selection entry widget.
+
+</DL>
+</pre><H2>COMPONENTS</H2>
+<P>
+<pre>
+Name: <B>dirs</B>
+Class: <B>Scrolledlistbox</B>
+</pre>
+<UL>
+The dirs component is the directory list box for the file selection box.
+See the <A HREF="scrolledlistbox.n.html"> "scrolledlistbox" </A> widget manual entry for details on the dirs
+component item.
+</UL>
+<P>
+<pre>
+Name: <B>files</B>
+Class: <B>Scrolledlistbox</B>
+</pre>
+<UL>
+The files component is the file list box for the file selection box.
+See the <A HREF="scrolledlistbox.n.html"> "scrolledlistbox" </A> widget manual entry for details on the files
+component item.
+</UL>
+<P>
+<pre>
+Name: <B>filter</B>
+Class: <B>Entryfield</B>
+</pre>
+<UL>
+The filter component is the entry field for user input of the filter value.
+See the <A HREF="entryfield.n.html"> "entryfield" </A> widget manual entry for details on the filter
+component item.
+</UL>
+<P>
+<pre>
+Name: <B>selection</B>
+Class: <B>Entryfield</B>
+</pre>
+<UL>
+The selection component is the entry field for user input of the currently
+selected file value. See the "entryfield" widget manual entry for details
+on the selection component item.
+</UL>
+</table>
+
+</pre><H2>EXAMPLE</H2>
+<pre>
+fileselectionbox .fsb
+pack .fsb -padx 10 -pady 10 -fill both -expand yes
+</pre>
+</pre><H2>AUTHOR</H2>
+Mark L. Ulferts
+</pre><H2>KEYWORDS</H2>
+fileselectionbox, widget
diff --git a/iwidgets/demos/html/fileselectiondialog.n.html b/iwidgets/demos/html/fileselectiondialog.n.html
new file mode 100644
index 00000000000..e5553189c12
--- /dev/null
+++ b/iwidgets/demos/html/fileselectiondialog.n.html
@@ -0,0 +1,339 @@
+<TITLE>fileselectiondialog - Create and manipulate a file selection dialog widget</TITLE>
+<H1>fileselectiondialog - Create and manipulate a file selection dialog widget</H1>
+
+</pre><H2>SYNOPSIS</H2>
+<B>fileselectiondialog<I> <I>pathName </I>?<I>options</I>?
+</pre><H2>INHERITANCE</H2>
+itk::Toplevel &lt;- Shell &lt;- Dialogshell &lt;- Dialog &lt;- Fileselectiondialog
+</pre><H2>STANDARD OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>activeBackground</B><br>
+<B>foreground</B><br>
+<B>insertBorderWidth</B><br>
+<B>selectBackground</B><br>
+</td>
+<td valign=top>
+<B>background</B><br>
+<B>highlightColor</B><br>
+<B>insertOffTime</B><br>
+<B>selectBorderWidth</B><br>
+</td>
+<td valign=top>
+<B>borderWidth</B><br>
+<B>highlightThickness</B><br>
+<B>insertOnTime</B><br>
+<B>selectForeground</B><br>
+</td>
+<td valign=top>
+<B>cursor</B><br>
+<B>insertBackground</B><br>
+<B>insertWidth</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/options.n.html"> "options" </A> manual entry for details on the standard options.
+</pre><H2>ASSOCIATED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>textBackground</B><br>
+</td>
+<td valign=top>
+<B>textFont</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="entryfield.n.html"> "entryfield" </A> widget manual entry for details on the above associated
+options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>childSitePos</B><br>
+<B>dirsOn</B><br>
+<B>filesOn</B><br>
+<B>invalid</B><br>
+<B>selectionOn</B><br>
+</td>
+<td valign=top>
+<B>directory</B><br>
+<B>filesLabel</B><br>
+<B>fileType</B><br>
+<B>mask</B><br>
+</td>
+<td valign=top>
+<B>dirsLabel</B><br>
+<B>filesLabelOn</B><br>
+<B>filterLabel</B><br>
+<B>noMatchString</B><br>
+</td>
+<td valign=top>
+<B>dirSearchCommand</B><br>
+<B>fileSearchCommand</B><br>
+<B>filterOn</B><br>
+<B>selectionLabel</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="fileselectionbox.n.html"> "fileselectionbox" </A> widget manual entry for details on the above
+associated options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>labelFont</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="labeledwidget.n.html"> "labeledwidget" </A> widget manual entry for details on the above
+associated options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>textBackground</B><br>
+</td>
+<td valign=top>
+<B>textFont</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="scrolledlistbox.n.html"> "scrolledlistbox" </A> widget manual entry for details on the above
+associated options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>activeRelief</B><br>
+</td>
+<td valign=top>
+<B>elementBorderWidth</B><br>
+</td>
+<td valign=top>
+<B>jump</B><br>
+</td>
+<td valign=top>
+<B>troughColor</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/scrollbar.n.html"> "scrollbar" </A> widget class manual entry for details on the above
+associated options.
+
+</pre><H2>INHERITED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>buttonBoxPadX</B><br>
+<B>padY</B><br>
+</td>
+<td valign=top>
+<B>buttonBoxPadY</B><br>
+<B>separator</B><br>
+</td>
+<td valign=top>
+<B>buttonBoxPos</B><br>
+<B>thickness</B><br>
+</td>
+<td valign=top>
+<B>padX</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="dialogshell.n.html"> "dialogshell" </A> widget manual entry for details on the above
+inherited options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>height</B><br>
+</td>
+<td valign=top>
+<B>master</B><br>
+</td>
+<td valign=top>
+<B>modality</B><br>
+</td>
+<td valign=top>
+<B>width</B><br>
+</td>
+</table>
+<P>
+See the "shell" widget manual entry for details on the above
+inherited options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>title</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the "Toplevel" widget manual entry for details on the above
+inherited options.
+</pre><HR>
+
+</pre><H2>DESCRIPTION</H2>
+<P>
+The <B>fileselectiondialog</B> command creates a file selection dialog
+similar to the OSF/Motif standard composite widget. The
+fileselectiondialog is derived from the Dialog class and is composed of
+a FileSelectionBox with attributes set to manipulate the dialog buttons.
+
+</pre><H2>METHODS</H2>
+<P>
+The <B>fileselectiondialog</B> command creates a new Tcl command whose
+name is <I>pathName</I>. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+<pre>
+<I>pathName option </I>?<I>arg arg ...</I>?
+</pre>
+<I>Option</I> and the <I>arg</I>s
+determine the exact behavior of the command. The following
+commands are possible for fileselectiondialog widgets:
+</pre><H2>ASSOCIATED METHODS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>get</B><br>
+</td>
+<td valign=top>
+<B>childsite</B><br>
+</td>
+<td valign=top>
+<B>filter</B><br>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="fileselectionbox.n.html"> "fileselectionbox" </A> class manual entry for details on the
+associated methods.
+</pre><H2>INHERITED METHODS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>add</B><br>
+<B>insert</B><br>
+</td>
+<td valign=top>
+<B>buttonconfigure</B><br>
+<B>invoke</B><br>
+</td>
+<td valign=top>
+<B>default</B><br>
+<B>show</B><br>
+</td>
+<td valign=top>
+<B>hide</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="buttonbox.n.html"> "buttonbox" </A> widget manual entry for details on the above
+inherited methods.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>activate</B><br>
+</td>
+<td valign=top>
+<B>center</B><br>
+</td>
+<td valign=top>
+<B>deactivate</B><br>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the "shell" widget manual entry for details on the above
+inherited methods.
+
+</pre><H2>WIDGET-SPECIFIC METHODS</H2>
+<DL>
+<DT> <I>pathName <B>cget</B> <I>option</I>
+</I></B>
+<DD> Returns the current value of the configuration option given
+by <I>option</I>.
+<I>Option</I> may have any of the values accepted by
+the <B>fileselectiondialog</B> command.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>configure</B> ?<I>option</I>? ?<I>value option value ...</I>?
+</I></B>
+<DD> Query or modify the configuration options of the widget.
+If no <I>option</I> is specified, returns a list describing all of
+the available options for <I>pathName</I> (see <B>Tk_ConfigureInfo</B> for
+information on the format of this list). If <I>option</I> is specified
+with no <I>value</I>, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no <I>option</I> is specified). If
+one or more <I>option-value</I> pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+<I>Option</I> may have any of the values accepted by
+the <B>fileselectiondialog</B>
+command.
+
+</DL>
+</pre><H2>COMPONENTS</H2>
+<P>
+<pre>
+Name: <B>fsb</B>
+Class: <B>Fileselectionbox</B>
+</pre>
+<UL>
+The fsb component is the file selection box for the file selection dialog.
+See the <A HREF="fileselectionbox.n.html"> "fileselectionbox" </A> widget manual entry for details on the fsb
+component item.
+</UL>
+</table>
+
+</pre><H2>EXAMPLE</H2>
+<pre>
+ #
+ # Non-modal example
+ #
+ proc okCallback {} {
+ puts "You selected [.nmfsd get]"
+ .nmfsd deactivate
+ }
+
+ fileselectiondialog .nmfsd -title Non-Modal
+ .nmfsd buttonconfigure OK -command okCallback
+
+ .nmfsd activate
+
+ #
+ # Modal example
+ #
+ fileselectiondialog .mfsd -modality application
+ .mfsd center
+
+ if {[.mfsd activate]} {
+ puts "You selected [.mfsd get]"
+ } else {
+ puts "You cancelled the dialog"
+ }
+</pre>
+</pre><H2>AUTHOR</H2>
+Mark L. Ulferts
+</pre><H2>KEYWORDS</H2>
+fileselectiondialog, fileselectionbox, dialog, dialogshell, shell, widget
diff --git a/iwidgets/demos/html/finddialog.n.html b/iwidgets/demos/html/finddialog.n.html
new file mode 100644
index 00000000000..6c578972bdb
--- /dev/null
+++ b/iwidgets/demos/html/finddialog.n.html
@@ -0,0 +1,392 @@
+<TITLE>finddialog - Create and manipulate a find dialog widget</TITLE>
+<H1>finddialog - Create and manipulate a find dialog widget</H1>
+
+</pre><H2>SYNOPSIS</H2>
+<B>finddialog<I> <I>pathName </I>?<I>options</I>?
+</pre><H2>INHERITANCE</H2>
+itk::Toplevel &lt;- Shell &lt;- Dialogshell &lt;- Finddialog
+</pre><H2>STANDARD OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>activeBackground</B><br>
+<B>cursor</B><br>
+<B>highlightColor</B><br>
+<B>insertOffTime</B><br>
+<B>selectBorderWidth</B><br>
+</td>
+<td valign=top>
+<B>activeForeground</B><br>
+<B>disabledForeground</B><br>
+<B>highlightThickness</B><br>
+<B>insertOnTime</B><br>
+<B>selectColor</B><br>
+</td>
+<td valign=top>
+<B>background</B><br>
+<B>font</B><br>
+<B>insertBackground</B><br>
+<B>insertWidth</B><br>
+<B>selectForeground</B><br>
+</td>
+<td valign=top>
+<B>borderWidth</B><br>
+<B>foreground</B><br>
+<B>insertBorderWidth</B><br>
+<B>selectBackground</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/options.n.html"> "options" </A> manual entry for details on the standard options.
+</pre><H2>ASSOCIATED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>selectColor</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the "checkbutton" widget manual entry for details on the above
+associated options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>selectColor</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="entryfield.n.html"> "entryfield" </A> widget manual entry for details on the above
+associated options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>labelFont</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="labeledwidget.n.html"> "labeledwidget" </A> widget manual entry for details on the above
+associated options.
+</pre><H2>INHERITED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>buttonBoxPadX</B><br>
+<B>padY</B><br>
+</td>
+<td valign=top>
+<B>buttonBoxPadY</B><br>
+<B>separator</B><br>
+</td>
+<td valign=top>
+<B>buttonBoxPos</B><br>
+<B>thickness</B><br>
+</td>
+<td valign=top>
+<B>padX</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="dialogshell.n.html"> "dialogshell" </A> widget manual entry for details on the above
+inherited options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>height</B><br>
+</td>
+<td valign=top>
+<B>master</B><br>
+</td>
+<td valign=top>
+<B>modality</B><br>
+</td>
+<td valign=top>
+<B>width</B><br>
+</td>
+</table>
+<P>
+See the "shell" widget manual entry for details on the above
+inherited options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>title</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the "Toplevel" widget manual entry for details on the above
+inherited options.
+</pre><H2>WIDGET-SPECIFIC OPTIONS</H2>
+<P>
+<pre>
+Name: <B>clearCommand</B>
+Class: <B>Command</B>
+Command-Line Switch: <B>-clearcommand</B>
+</pre>
+<UL>
+Specifies a command to be invoked following a clear operation.
+The option is meant to be used as means of notification that the
+clear has taken place and allow other actions to take place such
+as disabling a find again menu.
+</UL>
+<P>
+<pre>
+Name: <B>matchCommand</B>
+Class: <B>Command</B>
+Command-Line Switch: <B>-matchcommand</B>
+</pre>
+<UL>
+Specifies a command to be invoked following a find operation.
+The command is called with a match point as an argument which identifies
+where exactly where in the text or scrolledtext widget that the match
+is located. Should a match not be found the match point is {}. The
+option is meant to be used as a means of notification that the
+find operation has completed and allow other actions to take place
+such as disabling a find again menu option if the match point was {}.
+</UL>
+<P>
+<pre>
+Name: <B>patternBackground</B>
+Class: <B>Background</B>
+Command-Line Switch: <B>-patternbackground</B>
+</pre>
+<UL>
+Specifies the background color of the text matching the search
+pattern. It may have any of the forms accepted by Tk_GetColor.
+The default is gray44.
+</UL>
+<P>
+<pre>
+Name: <B>patternForeground</B>
+Class: <B>Background</B>
+Command-Line Switch: <B>-patternforeground</B>
+</pre>
+<UL>
+Specifies the foreground color of the text matching the search
+pattern. It may have any of the forms accepted by Tk_GetColor.
+The default is white.
+</UL>
+<P>
+<pre>
+Name: <B>searchBackground</B>
+Class: <B>Background</B>
+Command-Line Switch: <B>-searchbackground</B>
+</pre>
+<UL>
+Specifies the background color of the line containing the matching
+the search pattern. It may have any of the forms accepted by Tk_GetColor.
+The default is gray77.
+</UL>
+<P>
+<pre>
+Name: <B>searchForeground</B>
+Class: <B>Background</B>
+Command-Line Switch: <B>-searchforeground</B>
+</pre>
+<UL>
+Specifies the foreground color of the line containing the matching
+the search pattern. It may have any of the forms accepted by Tk_GetColor.
+The default is black.
+</UL>
+<P>
+<pre>
+Name: <B>textWidget</B>
+Class: <B>TextWidget</B>
+Command-Line Switch: <B>-textwidget</B>
+</pre>
+<UL>
+Specifies the text or scrolledtext widget to be searched.
+</UL>
+</pre><HR>
+
+</pre><H2>DESCRIPTION</H2>
+<P>
+The <B>finddialog</B> command creates a find dialog that works in
+conjunction with a text or scrolledtext widget to provide a means
+of performing search operations. The user is prompted for a text
+pattern to be found in the text or scrolledtext widget. The
+search can be for all occurances, by regular expression, considerate
+of the case, or backwards.
+
+</pre><H2>METHODS</H2>
+<P>
+The <B>finddialog</B> command creates a new Tcl command whose
+name is <I>pathName</I>. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+<pre>
+<I>pathName option </I>?<I>arg arg ...</I>?
+</pre>
+<I>Option</I> and the <I>arg</I>s
+determine the exact behavior of the command. The following
+commands are possible for finddialog widgets:
+</pre><H2>INHERITED METHODS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>add</B><br>
+<B>invoke</B><br>
+</td>
+<td valign=top>
+<B>buttonconfigure</B><br>
+<B>show</B><br>
+</td>
+<td valign=top>
+<B>default</B><br>
+</td>
+<td valign=top>
+<B>hide</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="buttonbox.n.html"> "buttonbox" </A> widget manual entry for details on the above
+inherited methods.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>activate</B><br>
+</td>
+<td valign=top>
+<B>center</B><br>
+</td>
+<td valign=top>
+<B>deactivate</B><br>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the "shell" widget manual entry for details on the above
+inherited methods.
+</pre><H2>WIDGET-SPECIFIC METHODS</H2>
+<DL>
+<DT> <I>pathName <B>cget</B> <I>option</I>
+</I></B>
+<DD> Returns the current value of the configuration option given
+by <I>option</I>.
+<I>Option</I> may have any of the values accepted by the <B>finddialog</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName <B>clear</B>
+</I></B>
+<DD> Clears the pattern in the entry field and the pattern matchin
+indicators in the text or scrolledtext widget.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>configure</B> ?<I>option</I>? ?<I>value option value ...</I>?
+</I></B>
+<DD> Query or modify the configuration options of the widget.
+If no <I>option</I> is specified, returns a list describing all of
+the available options for <I>pathName</I> (see <B>Tk_ConfigureInfo</B> for
+information on the format of this list). If <I>option</I> is specified
+with no <I>value</I>, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no <I>option</I> is specified). If
+one or more <I>option-value</I> pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+<I>Option</I> may have any of the values accepted by the <B>finddialog</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName <B>find</B>
+</I></B>
+<DD> Search for a specific text string in the text widget given by
+the -textwidget option. This method is the standard callback
+for the Find button. It is made available such that it can be
+bound to a find again action.
+
+</DL>
+</pre><H2>COMPONENTS</H2>
+<P>
+<pre>
+Name: <B>all</B>
+Class: <B>Checkbutton</B>
+</pre>
+<UL>
+The all component specifies that all the matches of the pattern should be
+found when performing the search. See the "checkbutton" widget manual
+entry for details on the all component item.
+</UL>
+<P>
+<pre>
+Name: <B>backwards</B>
+Class: <B>Checkbutton</B>
+</pre>
+<UL>
+The backwards component specifies that the search should continue in
+a backwards direction towards the beginning of the text or scrolledtext
+widget. See the "checkbutton" widget manual entry for details on the
+backwards component item.
+</UL>
+<P>
+<pre>
+Name: <B>case</B>
+Class: <B>Checkbutton</B>
+</pre>
+<UL>
+The case component specifies that the case of the pattern should be
+taken into consideration when performing the search. See the
+"checkbutton" widget manual entry for details on the case component item.
+</UL>
+<P>
+<pre>
+Name: <B>pattern</B>
+Class: <B>Entryfield</B>
+</pre>
+<UL>
+The pattern component provides the pattern entry field. See the
+"entryfield" widget manual entry for details on the pattern component item.
+</UL>
+<P>
+<pre>
+Name: <B>regexp</B>
+Class: <B>Checkbutton</B>
+</pre>
+<UL>
+The regexp component specifies that the pattern is a regular expression.
+See the "checkbutton" widget manual entry for details on the regexp
+component item.
+</UL>
+</table>
+
+</pre><H2>EXAMPLE</H2>
+<pre>
+ scrolledtext .st
+ pack .st
+ .st insert end "Now is the time for all good men\\n"
+ .st insert end "to come to the aid of their country"
+
+ finddialog .fd -textwidget .st
+ .fd center .st
+ .fd activate
+</pre>
+</pre><H2>AUTHOR</H2>
+Mark L. Ulferts
+</pre><H2>KEYWORDS</H2>
+finddialog, dialogshell, shell, widget
+
diff --git a/iwidgets/demos/html/hierarchy.n.html b/iwidgets/demos/html/hierarchy.n.html
new file mode 100644
index 00000000000..2fddd9e7030
--- /dev/null
+++ b/iwidgets/demos/html/hierarchy.n.html
@@ -0,0 +1,673 @@
+<TITLE>hierarchy - Create and manipulate a hierarchy widget</TITLE>
+<H1>hierarchy - Create and manipulate a hierarchy widget</H1>
+
+</pre><H2>SYNOPSIS</H2>
+<B>hierarchy<I> <I>pathName </I>?<I>options</I>?
+</pre><H2>INHERITANCE</H2>
+itk::Widget &lt;- Labeledwidget &lt;- Scrolledwidget &lt;- Hierarchy
+</pre><H2>STANDARD OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>activeBackground</B><br>
+<B>cursor</B><br>
+<B>highlightThickness</B><br>
+</td>
+<td valign=top>
+<B>activeForeground</B><br>
+<B>disabledForeground</B><br>
+<B>relief</B><br>
+</td>
+<td valign=top>
+<B>background</B><br>
+<B>foreground</B><br>
+<B>selectBackground</B><br>
+</td>
+<td valign=top>
+<B>borderWidth</B><br>
+<B>highlightColor</B><br>
+<B>selectForeground</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/options.n.html"> "options" </A> manual entry for details on the standard options.
+</pre><H2>ASSOCIATED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>activeRelief</B><br>
+</td>
+<td valign=top>
+<B>elementBorderWidth</B><br>
+</td>
+<td valign=top>
+<B>jump</B><br>
+</td>
+<td valign=top>
+<B>troughColor</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/scrollbar.n.html"> "scrollbar" </A> widget manual entry for details on the above
+associated options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>spacing1</B><br>
+</td>
+<td valign=top>
+<B>spacing2</B><br>
+</td>
+<td valign=top>
+<B>spacing3</B><br>
+</td>
+<td valign=top>
+<B>tabs</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/text.n.html"> "text" </A> widget manual entry for details on the above
+associated options.
+</pre><H2>INHERITED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>labelBitmap</B><br>
+<B>labelPos</B><br>
+</td>
+<td valign=top>
+<B>labelFont</B><br>
+<B>labelText</B><br>
+</td>
+<td valign=top>
+<B>labelImage</B><br>
+<B>labelVariable</B><br>
+</td>
+<td valign=top>
+<B>labelMargin</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="labeledwidget.n.html"> "labeledwidget" </A> class manual entry for details on the inherited options.
+</pre><H2>WIDGET-SPECIFIC OPTIONS</H2>
+<P>
+<pre>
+Name: <B>alwaysQuery</B>
+Class: <B>AlwaysQuery</B>
+Command-Line Switch: <B>-alwaysquery</B>
+</pre>
+<UL>
+Boolean flag which tells the hierarchy widget weather or not
+each refresh of the display should be via a new query using
+the command value of the -querycommand option or use the values
+previous found the last time the query was made. The default
+is no.
+</UL>
+<P>
+<pre>
+Name: <B>closedIcon</B>
+Class: <B>Icon</B>
+Command-Line Switch: <B>-closedicon</B>
+</pre>
+<UL>
+Specifies the name of an existing closed icon image to be used in the
+hierarchy before those nodes that are collapsed. Should one not be
+provided, then a folder icon will be generated, pixmap if possible,
+bitmap otherwise.
+</UL>
+<P>
+<pre>
+Name: <B>expanded</B>
+Class: <B>Expanded</B>
+Command-Line Switch: <B>-expanded</B>
+</pre>
+<UL>
+When true, the hierarchy will be completely expanded when it
+is first displayed. A fresh display can be triggered by
+resetting the -querycommand option. The default is false.
+</UL>
+<P>
+<pre>
+Name: <B>filter</B>
+Class: <B>Filter</B>
+Command-Line Switch: <B>-filter</B>
+</pre>
+<UL>
+When true only the branch nodes and selected items are displayed.
+This gives a compact view of important items. The default is false.
+</UL>
+<P>
+<pre>
+Name: <B>height</B>
+Class: <B>Height</B>
+Command-Line Switch: <B>-height</B>
+</pre>
+<UL>
+Specifies the height of the hierarchy as an entire unit.
+The value may be specified in any of the forms acceptable to
+<B>Tk_GetPixels</B>. Any additional space needed to display the other
+components such as labels, margins, and scrollbars force the hierarchy
+to be compressed. A value of zero along with the same value for
+the width causes the value given for the visibleitems option
+to be applied which administers geometry constraints in a different
+manner. The default height is zero.
+</UL>
+<P>
+<pre>
+Name: <B>iconCommand</B>
+Class: <B>Command</B>
+Command-Line Switch: <B>-iconcommand</B>
+</pre>
+<UL>
+Specifies a command to be executed upon user selection via mouse button
+one of any additional icons given in the values returned by the command
+associated with the -querycommand option. If this command contains "%n",
+it is replaced with the name of the node the icon belongs to. Should it
+contain "%i" then the icon name is substituted.
+</UL>
+<P>
+<pre>
+Name: <B>markBackground</B>
+Class: <B>Foreground</B>
+Command-Line Switch: <B>-markbackground</B>
+</pre>
+<UL>
+Specifies the background color to use when displaying marked nodes.
+</UL>
+<P>
+<pre>
+Name: <B>markForeground</B>
+Class: <B>Background</B>
+Command-Line Switch: <B>-markforeground</B>
+</pre>
+<UL>
+Specifies the foreground color to use when displaying marked nodes.
+</UL>
+<P>
+<pre>
+Name: <B>menuCursor</B>
+Class: <B>Cursor</B>
+Command-Line Switch: <B>-menucursor</B>
+</pre>
+<UL>
+Specifies the mouse cursor to be used for the item and background
+menus. The value may have any of the forms accept able to Tk_GetCursor.
+</UL>
+<P>
+<pre>
+Name: <B>nodeIcon</B>
+Class: <B>Icon</B>
+Command-Line Switch: <B>-nodeicon</B>
+</pre>
+<UL>
+Specifies the name of an existing node icon image to be used in the
+hierarchy before those nodes that are leafs. Should one not be provided,
+then a dog-eared page icon will be generated, pixmap if possible, bitmap
+otherwise.
+</UL>
+<P>
+<pre>
+Name: <B>openIcon</B>
+Class: <B>Icon</B>
+Command-Line Switch: <B>-openicon</B>
+</pre>
+<UL>
+Specifies the name of an existing open icon image to be used in the
+hierarchy before those nodes that are expanded. Should one not be provided,
+then an open folder icon will be generated, pixmap if possible, bitmap
+otherwise.
+</UL>
+<P>
+<pre>
+Name: <B>queryCommand</B>
+Class: <B>Command</B>
+Command-Line Switch: <B>-querycommand</B>
+</pre>
+<UL>
+Specifies the command executed to query the contents of each node. If this
+command contains "%n", it is replaced with the name of the desired
+node. In its simpilest form it should return the children of the
+given node as a list which will be depicted in the display.
+Since the names of the children are used as tags in the underlying
+text widget, each child must be unique in the hierarchy. Due to
+the unique requirement, the nodes shall be reffered to as uids
+or uid in the singular sense. The format of returned list is
+</UL>
+<UL>
+ {uid [uid ...]}
+</UL>
+<UL>
+ where uid is a unique id and primary key for the hierarchy entry
+</UL>
+<UL>
+Should the unique requirement pose a problem, the list returned
+can take on another more extended form which enables the
+association of text to be displayed with the uids. The uid must
+still be unique, but the text does not have to obey the unique
+rule. In addition, the format also allows the specification of
+additional tags to be used on the same entry in the hierarchy
+as the uid and additional icons to be displayed just before
+the node. The tags and icons are considered to be the property of
+the user in that the hierarchy widget will not depend on any of
+their values. The extended format is
+</UL>
+<UL>
+ {{uid [text [tags [icons]]]} {uid [text [tags [icons]]]} ...}
+</UL>
+<UL>
+ where uid is a unique id and primary key for the hierarchy entry
+ text is the text to be displayed for this uid
+ tags is a list of user tags to be applied to the entry
+ icons is a list of icons to be displayed in front of the text
+</UL>
+<UL>
+The hierarchy widget does a look ahead from each node to determine
+if the node has a children. This can be cost some performace with
+large hierarchies. User's can avoid this by providing a hint in
+the user tags. A tag of "leaf" or "branch" tells the hierarchy
+widget the information it needs to know thereby avoiding the look
+ahead operation.
+</UL>
+<P>
+<pre>
+Name: <B>hscrollMode</B>
+Class: <B>ScrollMode</B>
+Command-Line Switch: <B>-hscrollmode</B>
+</pre>
+<UL>
+Specifies the the display mode to be used for the horizontal
+scrollbar: <B>static, dynamic,</B> or <B>none</B>. In static mode, the
+scroll bar is displayed at all times. Dynamic mode displays the
+scroll bar as required, and none disables the scroll bar display. The
+default is static.
+</UL>
+<P>
+<pre>
+Name: <B>sbWidth</B>
+Class: <B>Width</B>
+Command-Line Switch: <B>-sbwidth</B>
+</pre>
+<UL>
+Specifies the width of the scrollbar in any of the forms
+acceptable to <B>Tk_GetPixels</B>.
+</UL>
+<P>
+<pre>
+Name: <B>scrollMargin</B>
+Class: <B>Margin</B>
+Command-Line Switch: <B>-scrollmargin</B>
+</pre>
+<UL>
+Specifies the distance between the text portion of the hierarchy and
+the scrollbars in any of the forms acceptable to <B>Tk_GetPixels</B>. The
+default is 3 pixels.
+</UL>
+<P>
+<pre>
+Name: <B>textBackground</B>
+Class: <B>Background</B>
+Command-Line Switch: <B>-textbackground</B>
+</pre>
+<UL>
+Specifies the background color for the text portion of the hierarchy in
+any of the forms acceptable to <B>Tk_GetColor</B>.
+</UL>
+<P>
+<pre>
+Name: <B>textFont</B>
+Class: <B>Font</B>
+Command-Line Switch: <B>-textfont</B>
+</pre>
+<UL>
+Specifies the font to be used in the text portion of the hierarchy.
+</UL>
+<P>
+<pre>
+Name: <B>visibleitems</B>
+Class: <B>VisibleItems</B>
+Command-Line Switch: <B>-visibleitems</B>
+</pre>
+<UL>
+Specifies the widthxheight in characters and lines for the hierarchy.
+This option is only administered if the width and height options
+are both set to zero, otherwise they take precedence. The default value
+is 80x24. With the visibleitems option engaged, geometry constraints
+are maintained only on the text portion of the hierarchy. The size of
+the other components such as
+labels, margins, and scroll bars, are additive and independent,
+effecting the overall size of the hierarchy. In contrast,
+should the width and height options have non zero values, they
+are applied to the hierarchy as a whole. The hierarchy
+is compressed or expanded to maintain the geometry constraints.
+</UL>
+<P>
+<pre>
+Name: <B>vscrollMode</B>
+Class: <B>ScrollMode</B>
+Command-Line Switch: <B>-vscrollmode</B>
+</pre>
+<UL>
+Specifies the the display mode to be used for the vertical
+scrollbar: <B>static, dynamic,</B> or <B>none</B>. In static mode, the
+scroll bar is displayed at all times. Dynamic mode displays the
+scroll bar as required, and none disables the scroll bar display. The
+default is static.
+</UL>
+<P>
+<pre>
+Name: <B>width</B>
+Class: <B>Width</B>
+Command-Line Switch: <B>-width</B>
+</pre>
+<UL>
+Specifies the width of the hierarchy as an entire unit.
+The value may be specified in any of the forms acceptable to
+<B>Tk_GetPixels</B>. Any additional space needed to display the other
+components such as labels, margins, and scrollbars force the text portion
+of the hierarchy
+to be compressed. A value of zero along with the same value for
+the height causes the value given for the visibleitems option
+to be applied which administers geometry constraints in a different
+manner. The default width is zero.
+</UL>
+<P>
+</pre><HR>
+
+</pre><H2>DESCRIPTION</H2>
+<P>
+The <B>hierarchy</B> command creates a hierarchical data view widget.
+It allows the graphical management of a a list of nodes that can be
+expanded or collapsed. Individual nodes can be highlighted.
+Clicking with the right mouse button on any item brings up a
+special item menu. Clicking on the background area brings up
+a different popup menu. Options exist to provide user control over
+the loading of the nodes and actions associated with node selection.
+Since the hierarchy is based on the scrolledtext widget, it includes
+options to control the method in which the scrollbars are displayed,
+i.e. statically or dynamically. Options also exist for adding a
+label to the hierarchy and controlling its position.
+
+</pre><H2>METHODS</H2>
+<P>
+The <B>hierarchy</B> command creates a new Tcl command whose
+name is <I>pathName</I>. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+<pre>
+<I>pathName option </I>?<I>arg arg ...</I>?
+</pre>
+<I>Option</I> and the <I>arg</I>s
+determine the exact behavior of the command. The following
+commands are possible for hierarchy widgets:
+</pre><H2>ASSOCIATED METHODS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>bbox</B><br>
+<B>dlineinfo</B><br>
+<B>insert</B><br>
+<B>tag</B><br>
+</td>
+<td valign=top>
+<B>compare</B><br>
+<B>dump</B><br>
+<B>scan</B><br>
+<B>window</B><br>
+</td>
+<td valign=top>
+<B>debug</B><br>
+<B>get</B><br>
+<B>search</B><br>
+<B>xview</B><br>
+</td>
+<td valign=top>
+<B>delete</B><br>
+<B>index</B><br>
+<B>see</B><br>
+<B>yview</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/text.n.html"> "text" </A> manual entry for details on the standard methods.
+
+</pre><H2>WIDGET-SPECIFIC METHODS</H2>
+<DL>
+<DT> <I>pathName <B>cget</B> <I>option</I>
+</I></B>
+<DD> Returns the current value of the configuration option given
+by <I>option</I>.
+<I>Option</I> may have any of the values accepted by the <B>hierarchy</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName <B>clear</B>
+</I></B>
+<DD> Removes all items from the hierarchy display including all tags and icons.
+The display will remain empty until the -filter or -querycommand
+options are set.
+</DL>
+<DL>
+<DT> <I>pathName <B>collapse</B> <I>uid</I>
+</I></B>
+<DD> Collapses the hierarchy beneath the node with the specified unique id by
+one level. Since this can take a moment for large hierarchies, the
+cursor will be changed to a watch during the collapse. Also, if any
+of the nodes beneath the node being collapsed are selected, their
+status is changed to unselected.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>configure</B> ?<I>option</I>? ?<I>value option value ...</I>?
+</I></B>
+<DD> Query or modify the configuration options of the widget.
+If no <I>option</I> is specified, returns a list describing all of
+the available options for <I>pathName</I> (see <B>Tk_ConfigureInfo</B> for
+information on the format of this list). If <I>option</I> is specified
+with no <I>value</I>, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no <I>option</I> is specified). If
+one or more <I>option-value</I> pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+<I>Option</I> may have any of the values accepted by the <B>hierarchy</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName <B>current</B>
+</I></B>
+<DD> Returns the tags for the node that was most recently selected by the
+right mouse button when the item menu was posted. Usually used by the code
+in the item menu to figure out what item is being manipulated.
+</DL>
+<DL>
+<DT> <I>pathName <B>draw</B> ?<I>when</I>?
+</I></B>
+<DD> Performs a complete redraw of the entire hierarchy. When may be either -now
+or -eventually where the latter means the draw can be performed after idle.
+</DL>
+<DL>
+<DT> <I>pathName <B>expand</B> <I>uid</I>
+</I></B>
+<DD> Expands the hierarchy beneath the node with the specified unique id by
+one level. Since this can take a moment for large hierarchies, the cursor
+will be changed to a watch during the expansion.
+</DL>
+<DL>
+<DT> <I>pathName <B>mark</B> <I>option ?arg arg ...?</I>
+</I></B>
+<DD> This command is used to manipulate marks which is quite similar to
+selection, adding a secondary means of hilighting an item in the
+hierarchy. The exact behavior of the command depends on the
+<I>option</I> argument that follows the <B>mark</B> argument. The
+following forms of the command are currently supported:
+</DL>
+<UL>
+<DL>
+<DT> <I>pathName <B>mark clear</B>
+</I></B>
+<DD> Clears all the currently marked nodes in the hierarchy.
+</DL>
+<DL>
+<DT> <I>pathName <B>mark add <I>uid </I>?<I>uid uid ...</I>?
+</I></B>
+<DD> Marks the nodes with the specified uids in the hierarchy using the
+<B>-markbackground</B> and <B>-markforeground</B> options and without
+affecting the mark state of any other nodes that were already
+marked.
+</DL>
+<DL>
+<DT> <I>pathName <B>mark remove <I>uid </I>?<I>uid uid ...</I>?
+</I></B>
+<DD> Unmarks the nodes with the specified uids in the hierarchy without
+affecting the mark state of any other nodes that were already
+marked.
+</DL>
+<DL>
+<DT> <I>pathName <B>mark get</B>
+</I></B>
+<DD> Returns a list of the unique ids that are currently marked.
+</DL>
+</UL>
+<DL>
+<DT> <I>pathName <B>refresh</B> <I>uid</I>
+</I></B>
+<DD> Performs a redraw of a specific node that has the given uid. If the node
+is not currently visible or in other words already drawn on the text,
+then no action is taken.
+</DL>
+<DL>
+<DT> <I>pathName <B>prune</B> <I>uid</I>
+</I></B>
+<DD> Removes the node specified by the given uid from the hierarchy. Should
+the node have children, then all of its children will be removed as well.
+</DL>
+<DL>
+<DT> <I>pathName <B>selection</B> <I>option </I>?<I>arg arg ...</I>?
+</I></B>
+<DD> This command is used to manipulate the selection of nodes in the
+hierarchy. The exact behavior of the command depends on the
+<I>option</I> argument that follows the <B>selection</B> argument. The
+following forms of the command are currently supported:
+</DL>
+<UL>
+<DL>
+<DT> <I>pathName <B>selection clear</B>
+</I></B>
+<DD> Clears all the currently selected nodes in the hierarchy.
+</DL>
+<DL>
+<DT> <I>pathName <B>selection add <I>uid </I>?<I>uid uid ...</I>?
+</I></B>
+<DD> Selects the nodes with the specified uids in the hierarchy using the
+<B>-selectionbackground</B> and <B>-selectionforeground</B> options and without
+affecting the selection state of any other nodes that were already
+selected.
+</DL>
+<DL>
+<DT> <I>pathName <B>selection remove <I>uid </I>?<I>uid uid ...</I>?
+</I></B>
+<DD> Deselects the nodes with the specified uids in the hierarchy without
+affecting the selection state of any other nodes that were already
+selected.
+</DL>
+<DL>
+<DT> <I>pathName <B>selection get</B>
+</I></B>
+<DD> Returns a list of the unique ids that are currently selected.
+</DL>
+</UL>
+A nodes selection status is also dependent on it being visible. If a
+node is selected and its parent is then collapsed making the selected
+node not visible, then its selection status is changed to unselected.
+<DL>
+<DT> <I>pathName <B>toggle</B> <I>uid</I>
+</I></B>
+<DD> Toggles the hierarchy beneath the node with the specified unique id. If
+the hierarchy is currently expanded, then it is collapsed, and vice-versa.
+
+</DL>
+</pre><H2>COMPONENTS</H2>
+<P>
+<pre>
+Name: <B>list</B>
+Class: <B>Text</B>
+</pre>
+<UL>
+The list component is the text widget in which the hierarchy is displayed.
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/text.n.html"> "text" </A> widget manual entry for details on the text component item.
+</UL>
+<P>
+<pre>
+Name: <B>bgMenu</B>
+Class: <B>Menu</B>
+</pre>
+<UL>
+The bgMenu component is the popup menu which is displayed upon pressing
+the right mouse button in the background, i.e. not over a specific node. Menu
+items can be added along with their commands via the component command.
+See the "menu" widget manual entry for details on the bgMenu component item.
+</UL>
+<P>
+<pre>
+Name: <B>horizsb</B>
+Class: <B>Scrollbar</B>
+</pre>
+<UL>
+The horizsb component is the horizontal scroll bar. See the "scrollbar"
+widget manual entry for details on the horizsb component item.
+</UL>
+<P>
+<pre>
+Name: <B>itemMenu</B>
+Class: <B>Menu</B>
+</pre>
+<UL>
+The itemMenu component is the popup menu which is displayed upon selection
+of a hierarchy node with the right mouse button. Menu items can be
+added along with their commands via the component command. See the "menu"
+widget manual entry for details on the itemMenu component item.
+</UL>
+<P>
+<pre>
+Name: <B>vertsb</B>
+Class: <B>Scrollbar</B>
+</pre>
+<UL>
+The vertsb component is the vertical scroll bar. See the "scrollbar" widget
+manual entry for details on the vertsb component item.
+</UL>
+</table>
+
+</pre><H2>EXAMPLE</H2>
+<pre>
+proc get_files {file} {
+ global env
+
+ if {$file == ""} {
+ set dir $env(HOME)
+ } else {
+ set dir $file
+ }
+
+ if {[catch {cd $dir}] != 0} {
+ return ""
+ }
+
+ set rlist ""
+
+ foreach file [lsort [glob -nocomplain *]] {
+ lappend rlist [list [file join $dir $file] $file]
+ }
+
+ return $rlist
+}
+
+hierarchy .h -querycommand "get_files %n" -visibleitems 30x15 \
+ -labeltext $env(HOME)
+pack .h -side left -expand yes -fill both
+</pre>
+</pre><H2>AUTHORS</H2>
+Mark L. Ulferts
+<P>
+Michael J. McLennan
+</pre><H2>KEYWORDS</H2>
+hierarchy, text, widget
diff --git a/iwidgets/demos/html/hyperhelp.n.html b/iwidgets/demos/html/hyperhelp.n.html
new file mode 100644
index 00000000000..8be35c4aa1b
--- /dev/null
+++ b/iwidgets/demos/html/hyperhelp.n.html
@@ -0,0 +1,258 @@
+<TITLE>hyperhelp - Create and manipulate a hyperhelp widget</TITLE>
+<H1>hyperhelp - Create and manipulate a hyperhelp widget</H1>
+
+</pre><H2>SYNOPSIS</H2>
+<B>hyperhelp<I> <I>pathName </I>?<I>options</I>?
+</pre><H2>INHERITANCE</H2>
+itk::Toplevel &lt;- shell &lt;- hyperhelp
+</pre><H2>STANDARD OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>activeBackground</B><br>
+<B>cursor</B><br>
+<B>highlightThickness</B><br>
+<B>insertOnTime</B><br>
+<B>relief</B><br>
+<B>selectBorderWidth</B><br>
+</td>
+<td valign=top>
+<B>background</B><br>
+<B>exportSelection</B><br>
+<B>insertBackground</B><br>
+<B>insertWidth</B><br>
+<B>repeatDelay</B><br>
+<B>selectForeground</B><br>
+</td>
+<td valign=top>
+<B>borderWidth</B><br>
+<B>foreground</B><br>
+<B>insertBorderWidth<br>
+<B>padX</B><br>
+<B>repeatInterval</B><br>
+<B>setGrid</B><br>
+</td>
+<td valign=top>
+<B>closecmd</B><br>
+<B>highlightColor</B><br>
+<B>insertOffTime</B><br>
+<B>padY</B><br>
+<B>selectBackground</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/options.n.html"> "options" </A> manual entry for details on the standard options.
+</pre><H2>ASSOCIATED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>hscrollmode</B><br>
+<B>fontsize</B><br>
+<B>width</B><br>
+<B>unknownimage</B><br>
+</td>
+<td valign=top>
+<B>vscrollmode</B><br>
+<B>fixedfont</B><br>
+<B>height</B><br>
+</td>
+<td valign=top>
+<B>textbackground</B><br>
+<B>link</B><br>
+<B>state</B><br>
+</td>
+<td valign=top>
+<B>fontname</B><br>
+<B>linkhighlight</B><br>
+<B>wrap</B><br>
+</td>
+</table>
+<P>
+See the "scrolledhtml" widget manual entry for details on the above
+associated options.
+</pre><H2>INHERITED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>modality</B><br>
+</td>
+<td valign=top>
+<B>title</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the "shell" manual entry for details on the above inherited options.
+</pre><H2>WIDGET-SPECIFIC OPTIONS</H2>
+<P>
+<pre>
+Name: <B>topics</B>
+Class: <B>Topics</B>
+Command-Line Switch: <B>-topics</B>
+</pre>
+<UL>
+Specifies a list of help topics in the form {?<I>topic</I>? ... }. <I>Topic</I>
+may either be a topic name, in which case the
+document associated with the topic should be in the file
+<B>helpdir</B>/<I>topic</I>.html, or it may be of the form
+{<I>name</I> <I>file</I>}. In the latter case, <I>name</I> is displayed in the
+topic menu, and selecting the name loads <I>file</I>. If file has a relative
+path, it is assumed to be relative to helpdir.
+</UL>
+<P>
+<pre>
+Name: <B>helpdir</B>
+Class: <B>Directory</B>
+Command-Line Switch: <B>-helpdir</B>
+</pre>
+<UL>
+Specifies the directory where help files are located.
+</UL>
+<P>
+<pre>
+Name: <B>closeCmd</B>
+Class: <B>CloseCmd</B>
+Command-Line Switch: <B>-closecmd</B>
+</pre>
+<UL>
+Specifies the tcl command to be executed when the close option is selected
+from the topics menu.
+</UL>
+<P>
+<pre>
+Name: <B>maxHistory</B>
+Class: <B>MaxHistory</B>
+Command-Line Switch: <B>-maxhistory</B>
+</pre>
+<UL>
+Specifies the maximum number of entries stored in the history list
+</UL>
+<P>
+<pre>
+Name: <B>beforelink</B>
+Class: <B>BeforeLink</B>
+Command-Line Switch: <B>-beforelink</B>
+</pre>
+<UL>
+Specifies a command to be eval'ed before a new link is displayed. The path
+of the link to be displayed is appended before evaling the command. A suggested
+use might be to busy the widget while a new page is being displayed.
+</UL>
+<P>
+<pre>
+Name: <B>afterlink</B>
+Class: <B>AfterLink</B>
+Command-Line Switch: <B>-afterlink</B>
+</pre>
+<UL>
+Specifies a command to be eval'ed after a new link is completely displayed.
+The path of the link that was displayed is appended before evaling the command.
+</UL>
+<P>
+</pre><HR>
+
+</pre><H2>DESCRIPTION</H2>
+<P>
+The <B>hyperhelp</B> command creates a shell window with a pulldown menu
+showing a list of topics. The topics are displayed by importing a HTML
+formatted file named <B>helpdir</B>/<I>topic</I>.html. For a list of
+supported HTML tags, see <B>scrolledhtml(n)</B>.
+
+</pre><H2>METHODS</H2>
+<P>
+The <B>hyperhelp</B> command creates a new Tcl command whose
+name is <I>pathName</I>. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+<pre>
+<I>pathName option </I>?<I>arg arg ...</I>?
+</pre>
+<I>Option</I> and the <I>arg</I>s
+determine the exact behavior of the command. The following
+commands are possible for dialog widgets:
+</pre><H2>INHERITED METHODS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>activate</B><br>
+</td>
+<td valign=top>
+<B>center</B><br>
+</td>
+<td valign=top>
+<B>childsite</B><br>
+</td>
+<td valign=top>
+<B>deactivate</B><br>
+</td>
+</table>
+<P>
+See the "shell" manual entry for details on the above inherited methods.
+
+</pre><H2>WIDGET-SPECIFIC METHODS</H2>
+<DL>
+<DT> <I>pathName <B>cget</B> <I>option</I>
+</I></B>
+<DD> Returns the current value of the configuration option given
+by <I>option</I>.
+<I>Option</I> may have any of the values accepted by the <B>hyperhelp</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>configure</B> ?<I>option</I>? ?<I>value option value ...</I>?
+</I></B>
+<DD> Query or modify the configuration options of the widget.
+If no <I>option</I> is specified, returns a list describing all of
+the available options for <I>pathName</I> (see <B>Tk_ConfigureInfo</B> for
+information on the format of this list). If <I>option</I> is specified
+with no <I>value</I>, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no <I>option</I> is specified). If
+one or more <I>option-value</I> pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+<I>Option</I> may have any of the values accepted by the <B>hyperhelp</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>showtopic</B> <I>topic</I>
+</I></B>
+<DD> Display html file <B>helpdir</B>/<I>topic</I>.html. <I>Topic</I> may
+optionally be of the form <I>topicname</I>#<I>anchorname</I>. In
+this form, either <I>topicname</I> or <I>anchorname</I> or both may be empty. If
+<I>topicname</I> is empty, the current topic is assumed. If <I>anchorname</I>
+is empty, the top of the document is assumed
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>followlink</B> <I>href</I>
+</I></B>
+<DD> Display html file <I>href</I>. <I>Href</I> may
+be optionally be of the form <I>filename</I>#<I>anchorname</I>. In
+this form, either <I>filename</I> or <I>anchorname</I> or both may be empty. If
+<I>filename</I> is empty, the current document is assumed. If <I>anchorname</I>
+is empty, the top of the document is assumed.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>forward</B>
+</I></B>
+<DD> Display html file one forward in history list, if applicable.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>back</B>
+</I></B>
+<DD> Display html file one back in history list, if applicable.
+
+</DL>
+</pre><H2>EXAMPLE</H2>
+<pre>
+ hyperhelp .h -topics { Intro Help } -helpdir ~/help
+ .h showtopic Intro
+
+</pre>
+</pre><H2>AUTHOR</H2>
+Kris Raney
+</pre><H2>KEYWORDS</H2>
+hyperhelp, html, help, shell, widget
diff --git a/iwidgets/demos/html/iwidgets4.0.0UserCmds.html b/iwidgets/demos/html/iwidgets4.0.0UserCmds.html
new file mode 100644
index 00000000000..8288c289e23
--- /dev/null
+++ b/iwidgets/demos/html/iwidgets4.0.0UserCmds.html
@@ -0,0 +1,66 @@
+<HTML>
+<HEADER>
+<TITLE> iwidgets4.0.0 User Commands </TITLE>
+</HEADER>
+<BODY BGCOLOR = "#FFFFFF">
+<CENTER>
+<H5>iwidgets4.0.0 User Commands</H5>
+</CENTER>
+<HR ALIGN=CENTER WIDTH="80%">
+<UL>
+<LI> <A HREF="buttonbox.n.html" TARGET="ManPage"> buttonbox </A>
+<LI> <A HREF="calendar.n.html" TARGET="ManPage"> calendar </A>
+<LI> <A HREF="canvasprintbox.n.html" TARGET="ManPage"> canvasprintbox </A>
+<LI> <A HREF="canvasprintdialog.n.html" TARGET="ManPage"> canvasprintdialog </A>
+<LI> <A HREF="checkbox.n.html" TARGET="ManPage"> checkbox </A>
+<LI> <A HREF="combobox.n.html" TARGET="ManPage"> combobox </A>
+<LI> <A HREF="dateentry.n.html" TARGET="ManPage"> dateentry </A>
+<LI> <A HREF="datefield.n.html" TARGET="ManPage"> datefield </A>
+<LI> <A HREF="dialog.n.html" TARGET="ManPage"> dialog </A>
+<LI> <A HREF="dialogshell.n.html" TARGET="ManPage"> dialogshell </A>
+<LI> <A HREF="disjointlistbox.n.html" TARGET="ManPage"> disjointlistbox </A>
+<LI> <A HREF="entryfield.n.html" TARGET="ManPage"> entryfield </A>
+<LI> <A HREF="extbutton.n.html" TARGET="ManPage"> extbutton </A>
+<LI> <A HREF="extfileselectionbox.n.html" TARGET="ManPage"> extfileselectionbox </A>
+<LI> <A HREF="extfileselectiondialog.n.html" TARGET="ManPage"> extfileselectiondialog </A>
+<LI> <A HREF="feedback.n.html" TARGET="ManPage"> feedback </A>
+<LI> <A HREF="fileselectionbox.n.html" TARGET="ManPage"> fileselectionbox </A>
+<LI> <A HREF="fileselectiondialog.n.html" TARGET="ManPage"> fileselectiondialog </A>
+<LI> <A HREF="finddialog.n.html" TARGET="ManPage"> finddialog </A>
+<LI> <A HREF="hierarchy.n.html" TARGET="ManPage"> hierarchy </A>
+<LI> <A HREF="hyperhelp.n.html" TARGET="ManPage"> hyperhelp </A>
+<LI> <A HREF="labeledframe.n.html" TARGET="ManPage"> labeledframe </A>
+<LI> <A HREF="labeledwidget.n.html" TARGET="ManPage"> labeledwidget </A>
+<LI> <A HREF="mainwindow.n.html" TARGET="ManPage"> mainwindow </A>
+<LI> <A HREF="menubar.n.html" TARGET="ManPage"> menubar </A>
+<LI> <A HREF="messagebox.n.html" TARGET="ManPage"> messagebox </A>
+<LI> <A HREF="messagedialog.n.html" TARGET="ManPage"> messagedialog </A>
+<LI> <A HREF="notebook.n.html" TARGET="ManPage"> notebook </A>
+<LI> <A HREF="optionmenu.n.html" TARGET="ManPage"> optionmenu </A>
+<LI> <A HREF="panedwindow.n.html" TARGET="ManPage"> panedwindow </A>
+<LI> <A HREF="promptdialog.n.html" TARGET="ManPage"> promptdialog </A>
+<LI> <A HREF="pushbutton.n.html" TARGET="ManPage"> pushbutton </A>
+<LI> <A HREF="radiobox.n.html" TARGET="ManPage"> radiobox </A>
+<LI> <A HREF="scopedobject.n.html" TARGET="ManPage"> scopedobject </A>
+<LI> <A HREF="scrolledcanvas.n.html" TARGET="ManPage"> scrolledcanvas </A>
+<LI> <A HREF="scrolledframe.n.html" TARGET="ManPage"> scrolledframe </A>
+<LI> <A HREF="scrolledhtml.n.html" TARGET="ManPage"> scrolledhtml </A>
+<LI> <A HREF="scrolledlistbox.n.html" TARGET="ManPage"> scrolledlistbox </A>
+<LI> <A HREF="scrolledtext.n.html" TARGET="ManPage"> scrolledtext </A>
+<LI> <A HREF="selectionbox.n.html" TARGET="ManPage"> selectionbox </A>
+<LI> <A HREF="selectiondialog.n.html" TARGET="ManPage"> selectiondialog </A>
+<LI> <A HREF="shell.n.html" TARGET="ManPage"> shell </A>
+<LI> <A HREF="spindate.n.html" TARGET="ManPage"> spindate </A>
+<LI> <A HREF="spinint.n.html" TARGET="ManPage"> spinint </A>
+<LI> <A HREF="spinner.n.html" TARGET="ManPage"> spinner </A>
+<LI> <A HREF="spintime.n.html" TARGET="ManPage"> spintime </A>
+<LI> <A HREF="tabnotebook.n.html" TARGET="ManPage"> tabnotebook </A>
+<LI> <A HREF="tabset.n.html" TARGET="ManPage"> tabset </A>
+<LI> <A HREF="timeentry.n.html" TARGET="ManPage"> timeentry </A>
+<LI> <A HREF="timefield.n.html" TARGET="ManPage"> timefield </A>
+<LI> <A HREF="toolbar.n.html" TARGET="ManPage"> toolbar </A>
+<LI> <A HREF="watch.n.html" TARGET="ManPage"> watch </A>
+</UL>
+
+</BODY>
+</HTML>
diff --git a/iwidgets/demos/html/labeledframe.n.html b/iwidgets/demos/html/labeledframe.n.html
new file mode 100644
index 00000000000..3fa283bc110
--- /dev/null
+++ b/iwidgets/demos/html/labeledframe.n.html
@@ -0,0 +1,210 @@
+<TITLE>labeledframe - Create and manipulate a labeled frame widget</TITLE>
+<H1>labeledframe - Create and manipulate a labeled frame widget</H1>
+
+</pre><H2>SYNOPSIS</H2>
+<B>labeledframe<I> <I>pathName </I>?<I>options</I>?
+</pre><H2>INHERITANCE</H2>
+itk::Archetype &lt;- labeledframe
+</pre><H2>STANDARD OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>background</B><br>
+<B>relief</B><br>
+</td>
+<td valign=top>
+<B>borderwidth</B><br>
+</td>
+<td valign=top>
+<B>cursor</B><br>
+</td>
+<td valign=top>
+<B>foreground</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/options.n.html"> "options" </A> manual entry for details on the standard options.
+</pre><H2>WIDGET-SPECIFIC OPTIONS</H2>
+<P>
+<pre>
+Name: <B>iPadX</B>
+Class: <B>IPad</B>
+Command-Line Switch: <B>-ipadx</B>
+</pre>
+<UL>
+Specifies horizontal padding space between the border and the childsite.
+The value may have any of the forms acceptable to <B>Tk_GetPixels</B>.
+The default is 0.
+</UL>
+<P>
+<pre>
+Name: <B>iPadY</B>
+Class: <B>IPad</B>
+Command-Line Switch: <B>-ipady</B>
+</pre>
+<UL>
+Specifies vertical padding space between the border and the childsite.
+The value may have any of the forms acceptable to <B>Tk_GetPixels</B>.
+The default is 0.
+</UL>
+<P>
+<pre>
+Name: <B>labelBitmap</B>
+Class: <B>Bitmap</B>
+Command-Line Switch: <B>-labelbitmap</B>
+</pre>
+<UL>
+Specifies a bitmap to display in the label, in any of the forms
+acceptable to <B>Tk_GetBitmap</B>. This option overrides the <I>labeltext</I>
+option.
+</UL>
+<P>
+<pre>
+Name: <B>labelImage</B>
+Class: <B>Image</B>
+Command-Line Switch: <B>-labelimage</B>
+</pre>
+<UL>
+Specifies a image to be used as the label. The image may be any of the
+values created by the <B>image create</B> command. This option overrides
+both the <I>labelbitmap</I> and <I>labeletext</I> options.
+</UL>
+<P>
+<pre>
+Name: <B>labelMargin</B>
+Class: <B>Margin</B>
+Command-Line Switch: <B>-labelmargin</B>
+</pre>
+<UL>
+Specifies the distance between the inner ede of the hull frames relief,
+and the label in any of the forms acceptable to <B>Tk_GetPixels</B>.
+The default is 10 pixels.
+</UL>
+<P>
+<pre>
+Name: <B>labelText</B>
+Class: <B>Text</B>
+Command-Line Switch: <B>-labeltext</B>
+</pre>
+<UL>
+Specifies the text of the label around the childsite.
+</UL>
+<P>
+<pre>
+Name: <B>labelVariable</B>
+Class: <B>Variable</B>
+Command-Line Switch: <B>-labelvariable</B>
+</pre>
+<UL>
+Specifies the text variable of the label around the childsite.
+</UL>
+<P>
+<pre>
+Name: <B>labelFont</B>
+Class: <B>Font</B>
+Command-Line Switch: <B>-labelfont</B>
+</pre>
+<UL>
+Specifies the font of the label around the childsite.
+</UL>
+<P>
+<pre>
+Name: <B>labelPos</B>
+Class: <B>Position</B>
+Command-Line Switch: <B>-labelpos</B>
+</pre>
+<UL>
+Specifies the position of the label within the grooved relief of the hull widget.
+<B> ne, n, nw, se, s, sw, en, e, es, wn, w, ws</B> Default is <B>n</B>.
+</UL>
+<P>
+</pre><HR>
+
+</pre><H2>DESCRIPTION</H2>
+<P>
+The <B>labeledframe</B> command creates a hull frame with a
+grooved relief, a label positioned within the grooved relief of
+the hull frame, and a frame childsite. The frame childsite can filled with any
+widget via a derived class or though the use of the childsite method.
+This class was designed to be a general purpose base class for supporting the
+combination of labeled frame and a childsite. The options include the
+ability to position the label at configurable locations within the
+grooved relief of the hull frame, and control the display of the label.
+</pre><H2>METHODS</H2>
+<P>
+The <B>labeledframe</B> command creates a new Tcl command whose
+name is <I>pathName</I>. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+<pre>
+<I>pathName option </I>?<I>arg arg ...</I>?
+</pre>
+<I>Option</I> and the <I>arg</I>s
+determine the exact behavior of the command. The following
+commands are possible for labeledframe widgets:
+</pre><H2>WIDGET-SPECIFIC METHODS</H2>
+<DL>
+<DT> <I>pathName <B>childsite</B>
+</I></B>
+<DD> Return the path name of the child site.
+</DL>
+<DL>
+<DT> <I>pathName <B>cget</B> <I>option</I>
+</I></B>
+<DD> Returns the current value of the configuration option given
+by <I>option</I>.
+<I>Option</I> may have any of the values accepted by the <B>labeledframe</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>configure</B> ?<I>option</I>? ?<I>value option value ...</I>?
+</I></B>
+<DD> Query or modify the configuration options of the widget.
+If no <I>option</I> is specified, returns a list describing all of
+the available options for <I>pathName</I> (see <B>Tk_ConfigureInfo</B> for
+information on the format of this list). If <I>option</I> is specified
+with no <I>value</I>, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no <I>option</I> is specified). If
+one or more <I>option-value</I> pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+<I>Option</I> may have any of the values accepted by the <B>labeledframe</B>
+command.
+
+</DL>
+</pre><H2>COMPONENTS</H2>
+<P>
+<pre>
+Name: <B>label</B>
+Class: <B>label</B>
+</pre>
+<UL>
+The label component provides the label for the labeled widget. See the
+"label" widget manual entry for details on the label component item.
+</UL>
+</table>
+<P>
+
+</pre><H2>EXAMPLE</H2>
+<UL>
+The labeledframe was primarily meant to be a base class. The
+Radiobox is a good example of a derived classe of the labeledframe class.
+In order to provide equal support for composite classes, the 'childsite' methods
+also exists. The following is an example of 'childsite' method usage.
+</UL>
+<P>
+<pre>
+ labeledframe .lw -labeltext "Entry Frame" -labelpos n
+ pack .lw -fill both -expand yes -padx 10 -pady 10
+ set cs [.lw childsite]
+
+ pack [Entryfield $cs.entry1 -labeltext "Name:"] -side top -fill x
+ pack [Spinint $cs.entry2 -labeltext "Number:"] -side top -fill x
+ pack [Pushbutton $cs.entry3 -text "Details:"] -side top -fill x
+
+</pre>
+</pre><H2>AUTHOR</H2>
+John A. Tucker
+</pre><H2>KEYWORDS</H2>
+labeledframe, widget
diff --git a/iwidgets/demos/html/labeledwidget.n.html b/iwidgets/demos/html/labeledwidget.n.html
new file mode 100644
index 00000000000..9a01a815b24
--- /dev/null
+++ b/iwidgets/demos/html/labeledwidget.n.html
@@ -0,0 +1,224 @@
+<TITLE>labeledwidget - Create and manipulate a labeled widget</TITLE>
+<H1>labeledwidget - Create and manipulate a labeled widget</H1>
+
+</pre><H2>SYNOPSIS</H2>
+<B>labeledwidget<I> <I>pathName </I>?<I>options</I>?
+</pre><H2>INHERITANCE</H2>
+itk::Widget &lt;- labeledwidget
+</pre><H2>STANDARD OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>background</B><br>
+</td>
+<td valign=top>
+<B>cursor</B><br>
+</td>
+<td valign=top>
+<B>foreground</B><br>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/options.n.html"> "options" </A> manual entry for details on the standard options.
+</pre><H2>WIDGET-SPECIFIC OPTIONS</H2>
+<P>
+<pre>
+Name: <B>disabledForeground</B>
+Class: <B>DisabledForeground</B>
+Command-Line Switch: <B>-disabledforeground</B>
+</pre>
+<UL>
+Specifies the foreground to be used when the state is disabled.
+</UL>
+<P>
+<pre>
+Name: <B>labelBitmap</B>
+Class: <B>Bitmap</B>
+Command-Line Switch: <B>-labelbitmap</B>
+</pre>
+<UL>
+Specifies a bitmap to display in the widget, in any of the forms
+acceptable to <B>Tk_GetBitmap</B>. This option overrides the <I>labeltext</I>
+option.
+</UL>
+<P>
+<pre>
+Name: <B>labelFont</B>
+Class: <B>Font</B>
+Command-Line Switch: <B>-labelfont</B>
+</pre>
+<UL>
+Specifies the font to be used for the label.
+</UL>
+<P>
+<pre>
+Name: <B>labelImage</B>
+Class: <B>Image</B>
+Command-Line Switch: <B>-labelimage</B>
+</pre>
+<UL>
+Specifies a image to be used as the label. The image may be any of the
+values created by the <B>image create</B> command. This option overrides
+both the <I>labelbitmap</I> and <I>labeletext</I> options.
+</UL>
+<P>
+<pre>
+Name: <B>labelMargin</B>
+Class: <B>Margin</B>
+Command-Line Switch: <B>-labelmargin</B>
+</pre>
+<UL>
+Specifies the distance between the childsite and label in any of the forms
+acceptable to <B>Tk_GetPixels</B>. The default is 2 pixel.
+</UL>
+<P>
+<pre>
+Name: <B>labelPos</B>
+Class: <B>Position</B>
+Command-Line Switch: <B>-labelpos</B>
+</pre>
+<UL>
+Specifies the position of the label along the side of the childsite:
+<B>nw</B>, <B>n</B>, <B>ne</B>, <B>sw</B>, <B>s</B>, <B>se</B>, <B>en</B>, <B>e</B>,
+<B>es</B>, <B>wn</B>, <B>w</B>, or <B>ws</B>. The default is w.
+</UL>
+<P>
+<pre>
+Name: <B>labelText</B>
+Class: <B>Text</B>
+Command-Line Switch: <B>-labeltext</B>
+</pre>
+<UL>
+Specifies the text of the label around the childsite.
+</UL>
+<P>
+<pre>
+Name: <B>labelVariable</B>
+Class: <B>Variable</B>
+Command-Line Switch: <B>-labelvariable</B>
+</pre>
+<UL>
+Specifies the text variable of the label around the childsite.
+</UL>
+<P>
+<pre>
+Name: <B>state</B>
+Class: <B>State</B>
+Command-Line Switch: <B>-state</B>
+</pre>
+<UL>
+Specifies one of two states for the label: <B>normal</B> or <B>disabled</B>.
+If the label is disabled then it is displayed in a disabled foreground
+color. The default is normal.
+</UL>
+<P>
+</pre><HR>
+
+</pre><H2>DESCRIPTION</H2>
+<P>
+The <B>labeledwidget</B> command creates a labeled widget which contains
+a label and child site. The child site is a frame
+which can filled with any widget via a derived class or though the use
+of the childsite method. This class
+was designed to be a general purpose base class for supporting the
+combination of label widget and a childsite. The options include the
+ability to position the label around the childsite widget, modify the
+font and margin, and control the display of the labels.
+
+</pre><H2>METHODS</H2>
+<P>
+The <B>labeledwidget</B> command creates a new Tcl command whose
+name is <I>pathName</I>. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+<pre>
+<I>pathName option </I>?<I>arg arg ...</I>?
+</pre>
+<I>Option</I> and the <I>arg</I>s
+determine the exact behavior of the command. The following
+commands are possible for labeledwidget widgets:
+</pre><H2>WIDGET-SPECIFIC METHODS</H2>
+<DL>
+<DT> <I>pathName <B>childsite</B>
+</I></B>
+<DD> Return the path name of the child site.
+</DL>
+<DL>
+<DT> <I>pathName <B>cget</B> <I>option</I>
+</I></B>
+<DD> Returns the current value of the configuration option given
+by <I>option</I>.
+<I>Option</I> may have any of the values accepted by the <B>labeledwidget</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>configure</B> ?<I>option</I>? ?<I>value option value ...</I>?
+</I></B>
+<DD> Query or modify the configuration options of the widget.
+If no <I>option</I> is specified, returns a list describing all of
+the available options for <I>pathName</I> (see <B>Tk_ConfigureInfo</B> for
+information on the format of this list). If <I>option</I> is specified
+with no <I>value</I>, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no <I>option</I> is specified). If
+one or more <I>option-value</I> pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+<I>Option</I> may have any of the values accepted by the <B>labeledwidget</B>
+command.
+
+</DL>
+</pre><H2>STATIC METHODS</H2>
+<DL>
+<DT> <B>Labeledwidget::alignlabels</B> <I>widget</I> ?<I>widget ...</I>?
+</I></B>
+<DD> The alignlabels procedure takes a list of widgets derived from
+the Labeledwidget class and uses the label margin to make each widget
+have the same total space for the combination of label and margin. The
+net effect is to left align the labels. Generally, this method is only
+useful with a label position of w, which is the default.
+
+</DL>
+</pre><H2>COMPONENTS</H2>
+<P>
+<pre>
+Name: <B>label</B>
+Class: <B>label</B>
+</pre>
+<UL>
+The label component provides the label for the labeled widget. See the
+"label" widget manual entry for details on the label component item.
+</UL>
+<P>
+<pre>
+Name: <B>lwchildsite</B>
+Class: <B>frame</B>
+</pre>
+<UL>
+The lwchildsite component is the user child site for the labeled widget. See
+the "frame" widget manual entry for details on the lwchildsite component item.
+</UL>
+</table>
+
+</pre><H2>EXAMPLE</H2>
+<UL>
+The labeledwidget was primarily meant to be a base class. The
+ScrolledListBox and EntryField are good examples of derived
+classes of the labeledwidget class. In order to provide equal
+support for composite classes, the 'childsite' methods also exists.
+The following is an example of 'childsite' method usage.
+</UL>
+<P>
+<pre>
+ labeledwidget .lw -labeltext "Canvas Widget" -labelpos s
+ pack .lw -fill both -expand yes -padx 10 -pady 10
+
+ set cw [canvas [.lw childsite].c -relief raised -width 200 -height 200]
+ pack $cw -padx 10 -pady 10
+</pre>
+</pre><H2>AUTHOR</H2>
+Mark L. Ulferts
+</pre><H2>KEYWORDS</H2>
+labeledwidget, widget
diff --git a/iwidgets/demos/html/mainwindow.n.html b/iwidgets/demos/html/mainwindow.n.html
new file mode 100644
index 00000000000..d9d52881b3d
--- /dev/null
+++ b/iwidgets/demos/html/mainwindow.n.html
@@ -0,0 +1,373 @@
+<TITLE>mainwindow - Create and manipulate a mainwindow widget</TITLE>
+<H1>mainwindow - Create and manipulate a mainwindow widget</H1>
+
+</pre><H2>SYNOPSIS</H2>
+<B>mainwindow<I> <I>pathName </I>?<I>options</I>?
+</pre><H2>INHERITANCE</H2>
+itk::Toplevel &lt;- shell &lt;- mainwindow
+</pre><H2>STANDARD OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>background</B><br>
+<B>foreground</B><br>
+</td>
+<td valign=top>
+<B>cursor</B><br>
+<B>highlightBackground</B><br>
+</td>
+<td valign=top>
+<B>disabledForeground</B><br>
+<B>highlightColor</B><br>
+</td>
+<td valign=top>
+<B>font</B><br>
+<B>highlightThickness</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/options.n.html"> "options" </A> manual entry for details on the standard options.
+</pre><H2>ASSOCIATED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>balloonBackground</B><br>
+<B>balloonForeground</B><br>
+</td>
+<td valign=top>
+<B>balloonDelay1</B><br>
+</td>
+<td valign=top>
+<B>balloonDelay2</B><br>
+</td>
+<td valign=top>
+<B>ballonFont</B><br>
+</td>
+</table>
+<P>
+See the "toolbar" manual entry for details on the above associated options.
+</pre><H2>INHERITED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>title</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the "Toplevel" manual entry for details on the above inherited options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>height</B><br>
+<B>padY</B><br>
+</td>
+<td valign=top>
+<B>master</B><br>
+<B>width</B><br>
+</td>
+<td valign=top>
+<B>modality</B><br>
+</td>
+<td valign=top>
+<B>padX</B><br>
+</td>
+</table>
+<P>
+See the "shell" manual entry for details on the above inherited options.
+
+</pre><H2>WIDGET-SPECIFIC OPTIONS</H2>
+<P>
+<pre>
+Name: <B>helpLine</B>
+Class: <B>HelpLine</B>
+Command-Line Switch: <B>-helpline</B>
+</pre>
+<UL>
+Specifies whether or not to display the help line. The value
+may be given in any of the forms acceptable to Tk_GetBoolean.
+The default is yes.
+</UL>
+<P>
+<pre>
+Name: <B>menuBarBackground</B>
+Class: <B>Background</B>
+Command-Line Switch: <B>-menubarbackground</B>
+</pre>
+<UL>
+Specifies the normal background color for the menubar.
+</UL>
+<P>
+<pre>
+Name: <B>menuBarFont</B>
+Class: <B>Font</B>
+Command-Line Switch: <B>-menubarfont</B>
+</pre>
+<UL>
+Specifies the font to use when drawing text inside the menubar.
+</UL>
+<P>
+<pre>
+Name: <B>menuBarForeround</B>
+Class: <B>Foreground</B>
+Command-Line Switch: <B>-menubarforeground</B>
+</pre>
+<UL>
+Specifies the normal foreground color for the menubar.
+</UL>
+<P>
+<pre>
+Name: <B>statusLine</B>
+Class: <B>StatusLine</B>
+Command-Line Switch: <B>-statusline</B>
+</pre>
+<UL>
+Specifies whether or not to display the status line. The value
+may be given in any of the forms acceptable to Tk_GetBoolean.
+The default is yes.
+</UL>
+<P>
+<pre>
+Name: <B>toolBarBackground</B>
+Class: <B>Background</B>
+Command-Line Switch: <B>-toolbarbackground</B>
+</pre>
+<UL>
+Specifies the normal background color for the toolbar.
+</UL>
+<P>
+<pre>
+Name: <B>toolBarFont</B>
+Class: <B>Font</B>
+Command-Line Switch: <B>-toolbarfont</B>
+</pre>
+<UL>
+Specifies the font to use when drawing text inside the toolbar.
+</UL>
+<P>
+<pre>
+Name: <B>toolBarForeround</B>
+Class: <B>Foreground</B>
+Command-Line Switch: <B>-toolbarforeground</B>
+</pre>
+<UL>
+Specifies the normal foreground color for the toolbar.
+</UL>
+</pre><HR>
+
+</pre><H2>DESCRIPTION</H2>
+<P>
+The <B>mainwindow</B> command creates a mainwindow shell which contains
+a menubar, toolbar, mousebar, childsite, status line, and help line.
+Each item may be filled and configured to suit individual needs.
+
+</pre><H2>METHODS</H2>
+<P>
+The <B>mainwindow</B> command create a new Tcl command whose
+name is <I>pathName</I>. This command may be used to invoke various
+operations on the widget. It has the following general form:
+<pre>
+<I>pathName option </I>?<I>arg arg ...</I>?
+</pre>
+<I>Option</I> and the <I>arg</I>s
+determine the exact behavior of the command. The following
+commands are possible for mainwindow widgets:
+</pre><H2>INHERITED METHODS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>activate</B><br>
+</td>
+<td valign=top>
+<B>center</B><br>
+</td>
+<td valign=top>
+<B>deactivate</B><br>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the "shell" manual entry for details on the above inherited methods.
+</pre><H2>WIDGET-SPECIFIC METHODS</H2>
+<DL>
+<DT> <I>pathName <B>cget</B> <I>option</I>
+</I></B>
+<DD> Returns the current value of the configuration option given
+by <I>option</I>.
+<I>Option</I> may have any of the values accepted by the <B>mainwindow</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName <B>childsite</B>
+</I></B>
+<DD> Returns the pathname of the child site widget.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>configure</B> ?<I>option</I>? ?<I>value option value ...</I>?
+</I></B>
+<DD> Query or modify the configuration options of the widget.
+If no <I>option</I> is specified, returns a list describing all of
+the available options for <I>pathName</I> (see <B>Tk_ConfigureInfo</B> for
+information on the format of this list). If <I>option</I> is specified
+with no <I>value</I>, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no <I>option</I> is specified). If
+one or more <I>option-value</I> pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+<I>Option</I> may have any of the values accepted by the <B>mainwindow</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName <B>menubar</B> ?<I>args</I>?
+</I></B>
+<DD> The <B>menubar</B> method provides access to the menubar. Invoked with
+no arguments it returns the pathname of the menubar. With arguments,
+they are evaluated against the menubar which in effect provides
+access to the entire API of the menubar. See the "menubar" manual
+entry for details on the commands available in the menubar.
+</DL>
+<DL>
+<DT> <I>pathName <B>mousebar</B> ?<I>args</I>?
+</I></B>
+<DD> The <B>mousebar</B> method provides access to the mousebar which is a
+vertical toolbar. Invoked with no arguments it returns the pathname
+of the mousebar. With arguments, they are evaluated against the mousebar
+which in effect provides access to the entire API of the underlying
+toolbar. See the "toolbar" manual entry for details on the commands
+available in the mousebar.
+</DL>
+<DL>
+<DT> <I>pathName <B>msgd</B> ?<I>args</I>?
+</I></B>
+<DD> The <B>msgd</B> method provides access to the messagedialog contained
+in the mainwindow. Invoked with no arguments it returns the pathname
+of the messagedialog. With arguments, they are evaluated against the
+messagedialog which in effect provides access to the entire API of the
+messagedialog. See the "messagedialog" manual
+entry for details on the commands available in the messagedialog.
+</DL>
+<DL>
+<DT> <I>pathName <B>toolbar</B> ?<I>args</I>?
+</I></B>
+<DD> The <B>toolbar</B> method provides access to the toolbar. Invoked with
+no arguments it returns the pathname of the toolbar. With arguments,
+they are evaluated against the toolbar which in effect provides
+access to the entire API of the toolbar. See the "toolbar" manual
+entry for details on the commands available in the toolbar.
+
+</DL>
+</pre><H2>COMPONENTS</H2>
+<P>
+<pre>
+Name: <B>help</B>
+Class: <B>Label</B>
+</pre>
+<UL>
+The help component provides a location for displaying any help
+strings provided in the menubar, toolbar, or mousebar. See the "label"
+widget manual entry for details on the help component item.
+</UL>
+<P>
+<pre>
+Name: <B>menubar</B>
+Class: <B>Menubar</B>
+</pre>
+<UL>
+The menubar component is the menubar located at the top of the window.
+See the "menubar" widget manual entry for details on the menubar
+component item.
+</UL>
+<P>
+<pre>
+Name: <B>mousebar</B>
+Class: <B>Toolbar</B>
+</pre>
+<UL>
+The mousebar component is the vertical toolbar located on the right side
+of the window. See the "toolbar" widget manual entry for details on
+the mousebar component item.
+</UL>
+<P>
+<pre>
+Name: <B>msgd</B>
+Class: <B>Messagedialog</B>
+</pre>
+<UL>
+The msgd component is a messagedialog which may be reconfigured as needed
+and used repeatedly throughout the application. See the "messagedialog"
+widget manual entry for details on the messagedialog component item.
+</UL>
+<P>
+<pre>
+Name: <B>status</B>
+Class: <B>Label</B>
+</pre>
+<UL>
+The status component provides a location for displaying application
+status information. See the "label" widget manual entry for details
+on the status component item.
+</UL>
+<P>
+<pre>
+Name: <B>toolbar</B>
+Class: <B>Toolbar</B>
+</pre>
+<UL>
+The toolbar component is the horizontal toolbar located on the top
+of the window. See the "toolbar" widget manual entry for details on
+the toolbar component item.
+</UL>
+</table>
+
+</pre><H2>EXAMPLE</H2>
+<pre>
+ mainwindow .mw
+
+ #
+ # Add a File menubutton
+ #
+ .mw menubar add menubutton file -text "File" -underline 0 -padx 8 -pady 2 \\
+ -menu {options -tearoff no
+ command new -label "New" -underline 0 \\
+ -helpstr "Create a new file"
+ command open -label "Open ..." -underline 0 \\
+ -helpstr "Open an existing file"
+ command save -label "Save" -underline 0 \\
+ -helpstr "Save the current file"
+ command saveas -label "Save As ..." -underline 5 \\
+ -helpstr "Save the file as a differnet name"
+ command print -label "Print" -underline 0 \\
+ -helpstr "Print the file"
+ separator sep1
+ command close -label "Close" -underline 0 \\
+ -helpstr "Close the file"
+ separator sep2
+ command exit -label "Exit" -underline 1 \\
+ -helpstr "Exit this application"
+ }
+
+ #
+ # Install a scrolledtext widget in the childsite.
+ #
+ scrolledtext [.mw childsite].st
+ pack [.mw childsite].st -fill both -expand yes
+
+ #
+ # Activate the main window.
+ #
+ .mw activate
+</pre>
+</pre><H2>AUTHORS</H2>
+Mark L. Ulferts
+<P>
+John A. Tucker
+<P>
+</pre><H2>KEYWORDS</H2>
+mainwindow, shell, widget
diff --git a/iwidgets/demos/html/menubar.n.html b/iwidgets/demos/html/menubar.n.html
new file mode 100644
index 00000000000..b045f03b441
--- /dev/null
+++ b/iwidgets/demos/html/menubar.n.html
@@ -0,0 +1,686 @@
+<TITLE>menubar - Create and manipulate menubar menu widgets</TITLE>
+<H1>menubar - Create and manipulate menubar menu widgets</H1>
+
+</pre><H2>SYNOPSIS</H2>
+<B>menubar</B> <I>pathName</I> ?<I>options</I>?
+</pre><H2>INHERITANCE</H2>
+itk::Widget &lt;- menubar
+</pre><H2>STANDARD OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>activeBackground</B><br>
+<B>activeBorderWidth</B><br>
+<B>activeForeground</B><br>
+<B>anchor</B><br>
+<B>foreground</B><br>
+</td>
+<td valign=top>
+<B>borderWidth</B><br>
+<B>cursor</B><br>
+<B>disabledForeground</B><br>
+<B>font</B><br>
+<B>padX</B><br>
+</td>
+<td valign=top>
+<B>highlightBackground</B><br>
+<B>highligthThickness</B><br>
+<B>highlightColor</B><br>
+<B>justify</B><br>
+</td>
+<td valign=top>
+<B>padY</B><br>
+<B>relief</B><br>
+<B>wrapLength</B><br>
+<B>background</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/options.n.html"> "options" </A> manual entry for details on the standard options.
+</pre><H2>WIDGET-SPECIFIC OPTIONS</H2>
+<P>
+<pre>
+Name: <B>helpVariable</B>
+Class: <B>HelpVariable</B>
+Command-Line Switch: <B>-helpvariable</B>
+</pre>
+<UL>
+Specifies the global variable to update whenever the mouse is in motion over a menu entry. This global variable is updated with the current value of the active menu entry's <B>helpStr</B>. Other widgets can "watch" this variable with the trace command, or as is the case with entry or label widgets, they can set their <B>textVariable</B> to the same global variable. This allows for a simple implementation of a help status bar. Whenever the mouse leaves a menu entry, the helpVariable is set to the empty string {}. The mainwindow(1) associates its helpstatus and its menubar in this fashion.
+</UL>
+<P>
+<pre>
+Name: <B>menuButtons</B>
+Class: <B>MenuButtons</B>
+Command-Line Switch: <B>-menubuttons</B>
+</pre>
+<UL>
+The menuButton option is a string which specifies the arrangement of menubuttons on the menubar frame. Each menubutton entry is delimited by the newline character.
+</UL>
+<table cellpadding=5>
+<td valign=top>
+<UL><br>
+-menubuttons<br>
+-text<br>
+-text<br>
+-text<br>
+</td>
+<td valign=top>
+</UL><br>
+{<br>
+File<br>
+Edit<br>
+Options<br>
+</td>
+<td valign=top>
+menubar<br>
+menubutton<br>
+menubutton<br>
+menubutton<br>
+}<br>
+</td>
+<td valign=top>
+.mb<br>
+file<br>
+edit<br>
+options<br>
+</td>
+</table>
+<UL>
+specifies that three menubuttons will be added to the menubar (file, edit, options). Each entry is translated into an add command call.
+</UL>
+<UL>
+The <B>menuButtons</B> option can accept embedded variables, commands, and
+backslash quoting. Embedded variables and commands must be enclosed in
+curly braces ({}) to ensure proper parsing of the substituted values.
+</UL>
+</pre><HR>
+</pre><H2>DESCRIPTION</H2>
+<P>
+The <B>menubar</B> command creates a new window (given by the <I>pathName</I> argument) and makes it into a <B>menubar</B> menu widget. Additional options, described above may be specified on the command line or in the option database to configure aspects of the menubar such as its colors and font. The <B>menubar</B> command returns its <I>pathName</I> argument. At the time this command is invoked, there must not exist a window named pathName, but pathName's parent must exist.
+<P>
+A <B>menubar</B> is a widget that simplifies the task of creating menu hierarchies. It encapsulates a <B>frame</B> widget, as well as <B>menubuttons</B>, <B>menus</B>, and menu <B>entries</B>. The menubar allows menus to be specified and referenced in a more consistent manner than using Tk to build menus directly.
+
+<B>Menubar</B> allows a menu tree to be expressed in a hierachical "language". The <B>menubar</B> accepts a <B>menuButtons</B> option that allows a list of menubuttons to be added to the menubar. In turn, each menubutton accepts a <B>menu</B> option that specifies a list of menu entries to be added to the menubutton's menu. Cascade entries also accept the <B>menu</B> option for specifying a list of menu entries to be added to the cascade's menu.
+
+Additionally, the menubar allows each component of the menubar system to be referenced by a simple <I>menuPathName</I> syntax. The menubar also extends the set of options for menu entries to include a <B>helpStr</B> option.
+</pre><H2>MENU PATH NAMES</H2>
+<P>
+A <I>menuPathName</I> is a series of component names separated by the `.' character. Each menubar component can be referenced via these <I>menuPathNames</I>. <I>menuPathNames</I> are similar to widget pathNames in Tk. Some correspond directly to a widget pathName (components of type <B>menu</B> or <B>menubutton</B>), others correspond to a menu entry type. Every widget and entry in a menubar can be referenced with the <I>menuPathName</I> naming convention. A menubar can have four types of components:
+<UL>
+<B>frame</B>. A menubar holds exactly one frame which manages menubuttons. The frame is always signified by the `.' character as the path name.
+</UL>
+<UL>
+<B>menubutton</B>. A menubutton corresponds directly to a Tk menubutton. See menubutton(n).
+</UL>
+<UL>
+<B>menu</B>. A menu is attached to a menubutton and corresponds directly to Tk's menu widget. A menu is always signified by the <I>menuPathName</I> ending with the keyword <B>menu</B>. See menu(n).
+</UL>
+<UL>
+<B>entry</B>. An entry corresponds directly to Tk's menu widget entries. Menus consist of a column of one line entries. Entries may be of type: <B>command</B>, <B>checkbutton</B>, <B>radiobutton</B>, <B>separator</B>, or <B>cascade</B>. For a complete description of these types see the discussion on <B>ENTRIES</B> in menu(n).
+</UL>
+<P>
+The suffix of a <I>menuPathName</I> may have the form of:
+<DL>
+<DT> <I>tkWidgetName</I>
+</I></B>
+<DD> Specifies the name of the component, either a <B>frame</B>, <B>menubutton</B>, <B>menu</B>, or an <B>entry</B>. This is the normal naming of widgets. For example, .file references a <B>menubutton</B> named <I>file</I>.
+</DL>
+<P>
+The <I>menuPathName</I> is a series of segment names, each separated by the '.' character. Segment names may be one of the following forms:
+<DL>
+<DT> <I>number</I>
+</I></B>
+<DD> Specifies the index of the the component. For menubuttons, 0 corresponds to the left-most menubutton of the menu bar frame. As an example, <I>.1</I> would correspond to the second menubutton on the menu bar frame.
+<UL>
+For entries, 0 corresponds to the top-most entry of the menu. For example, .file.0 would correspond to the first entry on the menu attached to the menubutton named <I>file</I>.
+</UL>
+</DL>
+<DL>
+<DT> <B>end</B>
+</I></B>
+<DD> Specifes the last component. For menubuttons, it specifies the right-most entry of the menu bar frame. For menu entries, it specifies the bottom-most entry of the menu.
+</DL>
+<DL>
+<DT> <B>last</B>
+</I></B>
+<DD> Same as end.
+</DL>
+<P>
+Finally, menu components always end with the <B>menu</B> keyword. These components are automatically created via the -menu option on menubuttons and cascades or via the <B>add</B> or <B>insert</B> commands.
+<DL>
+<DT> <B>menu</B>
+</I></B>
+<DD> Specifes the menu pane that is associated with the given menubutton prefix. For example, <I>.file.menu</I> specifies the menu pane attached to the <I>.file</I> menubutton.
+</DL>
+<P>
+For example, the path <I>.file.new</I> specifies the entry named new on the menu associated with the file menubutton located on the menu bar. The path <I>.file.menu</I> specifies the menu pane associated with the menubutton <I>.file</I>. The path <I>.last</I> specifies the last menu on the menu bar. The path <I>.0.last</I> would specify the first menu (file) and the last entry on that menu (quit), yielding <I>.file.quit</I>.
+
+As a restriction, the last name segment of <I>menuPathName</I> cannot be one of the keywords last, menu, end, nor may it be a numeric value (integer).
+</pre><H2>WIDGET-SPECIFIC METHODS</H2>
+<P>
+The <B>menubar</B> command creates a new Tcl command whose name is <I>pathName</I>.
+This command may be used to invoke various operations on the widget. It has
+the following general form:
+<pre>
+<I>pathName option </I>?<I>arg arg ...</I>?
+</pre>
+<I>option</I> and the <I>arg</I>s
+determine the exact behavior of the command.
+<P>
+In addition, many of the widget commands for menubar take as one argument a path name to a menu component. These path names are called <I>menuPathName</I>s. See the discussion on <B>MENUBAR PATH NAMES</B> above.
+<P>
+The following commands are possible for menubar widgets:
+<DL>
+<DT> <I>pathName</I> <B>add</B> <I>type</I> <I>menuPathName</I> ?<I>option value option value</I>?
+</I></B>
+<DD> Adds either a menu to the menu bar or a menu entry to a menu pane.
+<UL>
+If additional arguments are present, they specify <I>option</I>s available to component type <B>entry</B>. See the man pages for <B>menu</B>(1) in the section on <B>ENTRIES</B>.
+
+If <I>type</I> is one of <B>cascade</B>, <B>checkbutton</B>, <B>command</B>, <B>radiobutton</B>, or <B>separator</B> it adds a new entry to the bottom of the menu denoted by the prefix of <I>menuPathName</I>. If additonal arguments are present, they specify options available to menu <B>entry</B> widgets. In addition, the <B>helpStr</B> option is added by the menubar widget to all components of type entry.
+</UL>
+</DL>
+<UL>
+<DL>
+<DT> <B>-helpstr</B> <I>value</I>
+</I></B>
+<DD> Specifes the string to associate with the entry. When the mouse moves over the associated entry, the variable denoted by <B>helpVariable</B> is set. Another widget can bind to the helpVariable and thus display status help.
+</DL>
+</UL>
+<UL>
+If the type of the component added is <B>menubutton</B> or <B>cascade</B>, a menubutton or cascade is added to the menubar. If additional arguments are present, they specify options available to menubutton or cascade widgets. In addition, the <B>menu</B> option is added by the menubar widget to all menubutton and cascade widgets.
+</UL>
+<UL>
+<DL>
+<DT> <B>-menu</B> <I>menuSpec</I>
+</I></B>
+<DD> This is only valid for <I>menuPathName</I>s of type <B>menubutton</B> or <B>cascade</B>. Specifes an option set and/or a set of entries to place on a menu and associate with the menubutton or cascade. The <B>option</B> keyword allows the menu widget to be configured. Each item in the <I>menuSpec</I> is treated as add commands (each with the possibility of having other -menu options). In this way a menu can be recursively built.
+<UL>
+The last segment of <I>menuPathName</I> cannot be one of the keywords <B>last</B>, <B>menu</B>, <B>end</B>. Additionally, it may not be a <I>number</I>. However the <I>menuPathName</I> may be referenced in this manner (see discussion of <B>COMPONENT PATH NAMES</B>).
+</UL>
+<UL>
+Note that the same curly brace quoting rules apply to <B>-menu</B> option strings as did to <B>-menubuttons</B> option strings. See the earlier discussion on <B>umenubuttons</B> in the "<B>WIDGET-SPECIFIC OPTIONS</B>" section.
+</UL>
+</DL>
+</UL>
+<DL>
+<DT> <I>pathName</I> <B>cget</B> <I>option</I>
+</I></B>
+<DD> Returns the current value of the configuration option given by <I>option</I>.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>configure</B> ?<I>options</I> <I>value</I> <I>option</I> <I>value</I>?
+</I></B>
+<DD> Query or modify the configuration options of the widget. If no <I>option</I> is specified, returns a list describing all of the available options for <B>pathName</B> (see <B>Tk_ConfigureInfo</B> for information on the format of this list). If <I>option</I> is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>delete</B> <I>menuPathName</I> ?<I>menuPathName2</I>?
+</I></B>
+<DD> If <I>menuPathName</I> is of component type <B>Menubutton</B> or <B>Menu</B>, delete operates on menus. If <I>menuPathName</I> is of component type <B>Entry</B>, delete operates on menu entries.
+
+This command deletes all components between <I>menuPathName</I> and <I>menuPathName2</I> inclusive. If <I>menuPathName2</I> is omitted then it defaults to <I>menuPathName</I>. Returns an empty string.
+
+If <I>menuPathName</I> is of type menubar, then all menus and the menu bar frame will be destroyed. In this case <I>menuPathName2</I> is ignored.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>index</B> <I>menuPathName</I>
+</I></B>
+<DD> If <I>menuPathName</I> is of type menubutton or menu, it returns the position of the menu/menubutton on the menubar frame.
+
+If <I>menuPathName</I> is of type <B>command</B>, <B>separator</B>, <B>radiobutton</B>, <B>checkbutton</B>, or <B>cascade</B>, it returns the menu widget's numerical index for the entry corresponding to <I>menuPathName</I>. If path is not found or the path is equal to ".", a value of -1 is returned.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>insert</B> <I>menuPathName</I> <I>type</I> <I>name</I> ?<I>option</I> <I>value</I>?
+</I></B>
+<DD> Insert a new component named name before the component specified by <I>menuPathName</I>.
+<UL>
+If <I>menuPathName</I> is of type <B>Menubutton</B> or <B>Menu</B>, the new component inserted is of type <B>Menu</B> and given the name name. In this case valid <I>option</I> <I>value</I> pairs are those accepted by menubuttons.
+</UL>
+<UL>
+If <I>menuPathName</I> is of type <B>Entry</B>, the new component inserted is of type <B>entry</B> and given the name <I>name</I>. In this case, valid <I>option</I> <I>value</I> pairs are those accepted by menu entries.
+<I>Name</I> cannot be one of the keywords <B>last</B>, <B>menu</B>, <B>end</B>. Additionally, it may not be a number. However the <I>menuPathName</I> may be referenced in this manner (see discussion of <B>COMPONENT PATH NAMES</B>).
+</UL>
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>invoke</B> <I>menuPathName</I>
+</I></B>
+<DD> Invoke the action of the menu entry denoted by <I>menuPathName</I>. See the sections on the individual entries in the menu(1) man pages. If the menu entry is disabled then nothing happens. If the entry has a command associated with it then the result of that command is returned as the result of the <B>invoke</B> widget command. Otherwise the result is an empty string.
+
+If <I>menuPathName</I> is not a menu entry, an error is issued.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>menucget</B> <I>menuPathName</I> <I>option</I>
+</I></B>
+<DD> Returns the current value of the configuration option given by <I>option</I>. The component type of <I>menuPathName</I> determines the valid available options.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>menuconfigure</B> <I>menuPathName</I> ?<I>option</I> <I>value</I>?
+</I></B>
+<DD> Query or modify the configuration options of the componet of the menubar specified by <I>menuPathName</I>. If no <I>option</I> is specified, returns a list describing all of the available options for <I>menuPathName</I> (see <B>Tk_ConfigureInfo</B> for information on the format of this list). If <I>option</I> is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. The component type of <I>menuPathName</I> determines the valid available options.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>path</B> ?<I>mode</I>? <I>pattern</I>
+</I></B>
+<DD> Returns a fully formed <I>menuPathName</I> that matches <I>pattern</I>. If no match is found it returns -1. The <I>mode</I> argument indicates how the search is to be matched against <I>pattern</I> and it must have one of the following values:
+</DL>
+<UL>
+<DL>
+<DT> <B>-glob</B>
+</I></B>
+<DD> Pattern is a glob-style pattern which is matched against each component path using the same rules as the string match command.
+</DL>
+<DL>
+<DT> <B>-regexp</B>
+</I></B>
+<DD> Pattern is treated as a regular expression and matched against each component of the <I>menuPathName</I> using the same rules as the regexp command.
+The default mode is -glob.
+</DL>
+</UL>
+<DL>
+<DT> <I>pathName</I> <B>type</B> <I>menuPathName</I>
+</I></B>
+<DD> Returns the type of the component specified by <I>menuPathName</I>. For menu entries, this is the type argument passed to the <B>add</B>/<B>insert</B> widget command when the entry was created, such as <B>command</B> or <B>separator</B>. Othewise it is either a <B>menubutton</B> or a <B>menu</B>.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>yposition</B> <I>menuPathName</I>
+</I></B>
+<DD> Returns a decimal string giving the y-coordinate within the menu window of the topmost pixel in the entry specified by <I>menuPathName</I>. If the <I>menuPathName</I> is not an entry, an error is issued.
+</DL>
+</pre><H2>EXAMPLE ONE: USING GRAMMAR</H2>
+<P>
+The following example creates a menubar with "File", "Edit", "Options" menubuttons. Each of these menubuttons has an associated menu.
+In turn the File menu has menu entries, as well as the Edit
+menu and the Options menu. The Options menu is a tearoff menu
+with selectColor (for radiobuttons) set to blue.
+In addition, the Options menu has a cascade titled More,
+with several menu entries attached to it as well. An entry widget is
+provided to display help status.
+<P>
+menubar .mb -helpvariable helpVar -menubuttons {
+ menubutton file -text File -menu {
+ options -tearoff false
+ command new -label New \\
+ -helpstr "Open new document" \\
+ -command {puts NEW}
+ command close -label Close \\
+ -helpstr "Close current document" \\
+ -command {puts CLOSE}
+ separator sep1
+ command exit -label Exit -command {exit} \\
+ -helpstr "Exit application"
+ }
+ menubutton edit -text Edit -menu {
+ options -tearoff false
+ command undo -label Undo -underline 0 \\
+ -helpstr "Undo last command" \\
+ -command {puts UNDO}
+ separator sep2
+ command cut -label Cut -underline 1 \\
+ -helpstr "Cut selection to clipboard" \\
+ -command {puts CUT}
+ command copy -label Copy -underline 1 \\
+ -helpstr "Copy selection to clipboard" \\
+ -command {puts COPY}
+ command paste -label Paste -underline 0 \\
+ -helpstr "Paste clipboard contents" \\
+ -command {puts PASTE}
+ }
+ menubutton options -text Options -menu {
+ options -tearoff false -selectcolor blue
+ radiobutton byName -variable viewMode \\
+ -value NAME -label "by Name" \\
+ -helpstr "View files by name order" \\
+ -command {puts NAME}
+ radiobutton byDate -variable viewMode \\
+ -value DATE -label "by Date" \\
+ -helpstr "View files by date order" \\
+ -command {puts DATE}
+ cascade prefs -label Preferences -menu {
+ command colors -label Colors... \\
+ -helpstr "Change text colors" \\
+ -command {puts COLORS}
+ command fonts -label Fonts... \\
+ -helpstr "Change text font" \\
+ -command {puts FONT}
+ }
+ }
+
+}
+
+<table cellpadding=5>
+<td valign=top>
+frame<br>
+-height<br>
+-textvariable<br>
+-anchor<br>
+-expand<br>
+-fill<br>
+pack<br>
+-fill<br>
+</pre><H2>EXAMPLE<br>
+Alternatively<br>
+could<br>
+using<br>
+configure<br>
+menubar<br>
+-menubuttons<br>
+-text<br>
+command<br>
+command<br>
+separator<br>
+-label<br>
+edit<br>
+<P><br>
+.edit.undo<br>
+0<br>
+.edit.sep2<br>
+.edit.cut<br>
+1<br>
+.edit.copy<br>
+1<br>
+.edit.paste<br>
+0<br>
+.options<br>
+{<br>
+viewMode<br>
+-label<br>
+byDate<br>
+-value<br>
+Date"<br>
+cascade<br>
+-menu<br>
+-label<br>
+-label<br>
+.mb<br>
+nw<br>
+yes<br>
+option<br>
+the<br>
+evaluated<br>
+the<br>
+positive<br>
+is<br>
+string<br>
+commands,<br>
+However,<br>
+into<br>
+single<br>
+can<br>
+enclosing<br>
+curly<br>
+ensures,<br>
+value<br>
+will<br>
+as<br>
+and<br>
+The<br>
+this<br>
+</UL><br>
+Menu"<br>
+menubar<br>
+menubutton<br>
+menubutton<br>
+-menu<br>
+\\<br>
+-variable<br>
+-onvalue<br>
+0<br>
+-text<br>
+</td>
+<td valign=top>
+.fr<br>
+300<br>
+helpVar<br>
+nw<br>
+yes<br>
+both<br>
+.ef<br>
+x<br>
+TWO:<br>
+the<br>
+be<br>
+the<br>
+methods:<br>
+.mb<br>
+{<br>
+File<br>
+new<br>
+close<br>
+sep1<br>
+Quit<br>
+-text<br>
+.mb<br>
+-label<br>
+.mb<br>
+.mb<br>
+-label<br>
+.mb<br>
+-label<br>
+.mb<br>
+-label<br>
+.mb<br>
+-text<br>
+radiobutton<br>
+\\<br>
+"by<br>
+-variable<br>
+DATE<br>
+}<br>
+.options.prefs<br>
+{<br>
+Colors...<br>
+Fonts...<br>
+-side<br>
+-fill<br>
+</pre><H2>CAVEATS</H2><br>
+as<br>
+<B>-menu</B><br>
+by<br>
+<B>subst</B><br>
+side<br>
+that<br>
+may<br>
+and/or<br>
+substitutions<br>
+more<br>
+word.<br>
+be<br>
+candidate<br>
+braces<br>
+for<br>
+for<br>
+still<br>
+a<br>
+not<br>
+following<br>
+case:<br>
+set<br>
+set<br>
+.mb<br>
+file<br>
+edit<br>
+{<br>
+-label<br>
+{[scope<br>
+1<br>
+}<br>
+Options<br>
+</td>
+<td valign=top>
+-width<br>
+entry<br>
+pack<br>
+-fill<br>
+pack<br>
+-expand<br>
+-anchor<br>
+-expand<br>
+USING<br>
+same<br>
+created<br>
+add<br>
+<P><br>
+.mb<br>
+menubutton<br>
+-menu<br>
+-label<br>
+-label<br>
+command<br>
+}<br>
+Edit<br>
+add<br>
+Undo<br>
+add<br>
+add<br>
+Cut<br>
+add<br>
+Copy<br>
+add<br>
+Paste<br>
+add<br>
+Options<br>
+byName<br>
+-value<br>
+Name"<br>
+viewMode<br>
+-label<br>
+.mb<br>
+-label<br>
+command<br>
+command<br>
+}<br>
+left<br>
+x<br>
+The<br>
+well<br>
+option<br>
+menubar<br>
+command.<br>
+of<br>
+the<br>
+contain<br>
+backslash<br>
+might<br>
+than<br>
+These<br>
+protected<br>
+substitutions<br>
+({}).<br>
+example,<br>
+an<br>
+be<br>
+single<br>
+multiple<br>
+example<br>
+<table><br>
+fileMenuName<br>
+var<br>
+-menubuttons<br>
+-text<br>
+-text<br>
+checkbutton<br>
+Check<br>
+var]}<br>
+\\<br>
+menubutton<br>
+}<br>
+</td>
+<td valign=top>
+300<br>
+.ef<br>
+.mb<br>
+x<br>
+.fr<br>
+yes<br>
+sw<br>
+yes<br>
+METHODS</H2><br>
+menu<br>
+by<br>
+and<br>
+<table><br>
+configure<br>
+file<br>
+{<br>
+New<br>
+Close<br>
+quit<br>
+menubutton<br>
+}<br>
+command<br>
+-underline<br>
+separator<br>
+command<br>
+-underline<br>
+command<br>
+-underline<br>
+command<br>
+-underline<br>
+menubutton<br>
+-menu<br>
+-variable<br>
+NAME<br>
+radiobutton<br>
+\\<br>
+"by<br>
+add<br>
+Preferences<br>
+colors<br>
+fonts<br>
+pack<br>
+-anchor<br>
+-expand<br>
+<B>-menubuttons</B><br>
+as<br>
+is<br>
+with<br>
+The<br>
+this<br>
+option<br>
+variables,<br>
+substitutions.<br>
+expand<br>
+a<br>
+expansions<br>
+by<br>
+in<br>
+This<br>
+a<br>
+option<br>
+treated<br>
+value<br>
+values.<br>
+illustrates<br>
+<UL><br>
+"File<br>
+{}<br>
+{<br>
+{$fileMenuName}<br>
+Edit<br>
+check<br>
+\\<br>
+\\<br>
+-offvalue<br>
+options<br>
+</td>
+</table>
+<UL>
+The variable <I>fileMenuName</I> will expand to "File Menu" when the <B>subst</B> command is used on the menubutton specification. In addition, the [<B>scope</B>...] command will expand to @scope :: var. By enclosing these inside {} they stay as a single value. Note that only {} work for this. [list...], "" etc. will not protect these from the subst command.
+</UL>
+</pre><H2>ACKNOWLEDGMENTS</H2>
+<P>
+Bret Schumaker
+<UL>
+1994 - Early work on a menubar widget.
+</UL>
+<P>
+Mark Ulferts, Mark Harrison, John Sigler
+<UL>
+Invaluable feedback on grammar and usability of the menubar widget
+</UL>
+<P>
+</pre><H2>AUTHOR</H2>
+Bill W. Scott
+</pre><H2>KEYWORDS</H2>
+frame, menu, menubutton, entries, help
+
diff --git a/iwidgets/demos/html/messagebox.n.html b/iwidgets/demos/html/messagebox.n.html
new file mode 100644
index 00000000000..98b000e9ae3
--- /dev/null
+++ b/iwidgets/demos/html/messagebox.n.html
@@ -0,0 +1,358 @@
+<TITLE>messagebox - Create and manipulate a messagebox text widget</TITLE>
+<H1>messagebox - Create and manipulate a messagebox text widget</H1>
+
+</pre><H2>SYNOPSIS</H2>
+<B>messagebox<I> <I>pathName </I>?<I>options</I>?
+</pre><H2>INHERITANCE</H2>
+itk::Widget &lt;- Labeledwidget &lt;- Scrolledwidget &lt;- Messagebox
+</pre><H2>STANDARD OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>activeBackground</B><br>
+<B>cursor</B><br>
+<B>highlightColor</B><br>
+<B>relief</B><br>
+</td>
+<td valign=top>
+<B>activeForeground</B><br>
+<B>exportSelection</B><br>
+<B>highlightThickness</B><br>
+<B>setGrid</B><br>
+</td>
+<td valign=top>
+<B>background</B><br>
+<B>font</B><br>
+<B>padX</B><br>
+</td>
+<td valign=top>
+<B>borderWidth</B><br>
+<B>foreground</B><br>
+<B>padY</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/options.n.html"> "options" </A> manual entry for details on the standard options.
+</pre><H2>ASSOCIATED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>labelBitmap</B><br>
+<B>labelPos</B><br>
+</td>
+<td valign=top>
+<B>labelFont</B><br>
+<B>labelText</B><br>
+</td>
+<td valign=top>
+<B>labelImage</B><br>
+<B>labelVariable</B><br>
+</td>
+<td valign=top>
+<B>labelMargin</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="labeledwidget.n.html"> "labeledwidget" </A> class manual entry for details on the above
+associated options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>activeRelief</B><br>
+</td>
+<td valign=top>
+<B>elementBorderWidth</B><br>
+</td>
+<td valign=top>
+<B>jump</B><br>
+</td>
+<td valign=top>
+<B>troughColor</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/scrollbar.n.html"> "scrollbar" </A> widget manual entry for details on the above
+associated options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>height</B><br>
+<B>textBackground</B><br>
+</td>
+<td valign=top>
+<B>hscrollMode</B><br>
+<B>visibleItems</B><br>
+</td>
+<td valign=top>
+<B>sbWidth</B><br>
+<B>vscrollMode</B><br>
+</td>
+<td valign=top>
+<B>scrollMargin</B><br>
+<B>width</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="scrolledtext.n.html"> "scrolledtext" </A> widget manual entry for details on the above
+associated options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>spacing1</B><br>
+</td>
+<td valign=top>
+<B>spacing2</B><br>
+</td>
+<td valign=top>
+<B>spacing3</B><br>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/text.n.html"> "text" </A> widget manual entry for details on the above
+associated options.
+
+</pre><H2>WIDGET-SPECIFIC OPTIONS</H2>
+<P>
+<pre>
+Name: <B>fileName</B>
+Class: <B>FileName</B>
+Command-Line Switch: <B>-filename</B>
+</pre>
+<UL>
+Specifies the filename to be displayed in the file selection dialog when
+it pops up during a save of the messagebox contents operation.
+</UL>
+<P>
+<pre>
+Name: <B>maxLines</B>
+Class: <B>MaxLines</B>
+Command-Line Switch: <B>-maxlines</B>
+</pre>
+<UL>
+Specifies the maximum number of lines allowed in the text area of the
+messagebox. When this limit is reached, the oldest line will be deleted
+such that the total number of lines remains <I>maxlines</I>.
+</UL>
+<P>
+<pre>
+Name: <B>saveDir</B>
+Class: <B>SaveDir</B>
+Command-Line Switch: <B>-savedir</B>
+</pre>
+<UL>
+Specifies the default directory to display when the file selection dialog
+pops up during a save of the messagebox contents operation. If this
+parameter is not specified, then the files in the current working directory
+are displayed.
+</UL>
+<P>
+</pre><HR>
+
+</pre><H2>DESCRIPTION</H2>
+<P>
+The <B>messagebox</B> command creates
+a scrolled information messages area widget.
+Message types can be user defined and configured. Their options
+include foreground, background, font, bell, and their display
+mode of on or off. This allows message types to defined as needed,
+removed when no longer so, and modified when necessary. An export
+method is provided for file I/O.
+
+<P>
+The number of lines displayed may be limited with
+the default being 1000. When this limit is reached, the oldest line
+is removed. A popup menu which appears when the right mouse button
+has been pressed in the message area has been predefined. The contents
+of the popup menu by default support clearing the area and saving its
+contents to a file. Additional operations may be defined or existing
+operations removed by using the component command to access the
+popup menu.
+
+</pre><H2>MESSAGE TYPES</H2>
+<P>
+The display characteristics of messages issued to the messagebox vary
+with the message type. Types are defined by the user and they may
+be added, removed, and configured. The options of the message type
+control the display include the following:
+<DL>
+<DT> <B>-background <I>color</I>
+</I></B>
+<DD> <I>Color</I> specifies the background color to use for characters
+associated with the message type.
+It may have any of the forms accepted by <B>Tk_GetColor</B>.
+</DL>
+<DL>
+<DT> <B>-bell <I>boolean</I>
+</I></B>
+<DD> Specifies whether or not to ring the bell whenenver a message of this
+type is issued. <I>Boolean</I> may have any of the forms accepted by
+<B>Tk_GetBoolean</B>. The default is 0.
+</DL>
+<DL>
+<DT> <B>-font\ <I>fontName</I>
+</I></B>
+<DD> <I>FontName</I> is the name of a font to use for drawing
+characters. It may have any of the forms accepted
+by Tk_GetFontStruct.
+</DL>
+<DL>
+<DT> <B>-foreground <I>color</I>
+</I></B>
+<DD> <I>Color</I> specifies the foreground color to use for characters
+associated with the message type.
+It may have any of the forms accepted by <B>Tk_GetColor</B>.
+</DL>
+<DL>
+<DT> <B>-show <I>boolean</I>
+</I></B>
+<DD> Specifies whether of not to display this message type when issued.
+<I>Boolean</I> may have any of the forms accepted by
+<B>Tk_GetBoolean</B>. The default is 1.
+
+</DL>
+</pre><H2>METHODS</H2>
+<P>
+The <B>messagebox</B> command creates a new Tcl command whose
+name is <I>pathName</I>. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+<pre>
+<I>pathName option </I>?<I>arg arg ...</I>?
+</pre>
+<I>Option</I> and the <I>arg</I>s
+determine the exact behavior of the command. The following
+commands are possible for messagebox widgets:
+
+</pre><H2>WIDGET-SPECIFIC METHODS</H2>
+<DL>
+<DT> <I>pathName <B>cget</B> <I>option</I>
+</I></B>
+<DD> Returns the current value of the configuration option given
+by <I>option</I>.
+<I>Option</I> may have any of the values accepted by the <B>messagebox</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName <B>clear</B>
+</I></B>
+<DD> Clear the messagebox of all messages.
+</DL>
+<DL>
+<DT> <I>pathName <B>export</B> <I>filename</I>
+</I></B>
+<DD> Write text to a file. If <I>filename</I> exists then
+contents are replaced with text widget contents.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>configure</B> ?<I>option</I>? ?<I>value option value ...</I>?
+</I></B>
+<DD> Query or modify the configuration options of the widget.
+If no <I>option</I> is specified, returns a list describing all of
+the available options for <I>pathName</I> (see <B>Tk_ConfigureInfo</B> for
+information on the format of this list). If <I>option</I> is specified
+with no <I>value</I>, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no <I>option</I> is specified). If
+one or more <I>option-value</I> pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+<I>Option</I> may have any of the values accepted by the <B>messagebox</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName <B>type</B> <I>option</I> <I>msgtype</I> ?<I>arg arg ...</I>?
+</I></B>
+<DD> This command is used to manipulate message types. The behavior of
+the command depends on the option argument that follows the type keyword.
+The following forms of the command are supported:
+</DL>
+<UL>
+<DL>
+</DL>
+<DL>
+<DT> <I>pathName <B>type add</B> <I>msgtype</I> ?<I>option value ...</I>?
+</I></B>
+<DD> Adds a new message type given by <I>msgtype</I> with the display
+properties defined by the option value pairs.
+See MESSAGE TYPES for information on the options that
+are supported.
+</DL>
+<DL>
+<DT> <I>pathName <B>type cget</B> <I>msgtype option</I>
+</I></B>
+<DD> Returns the value of a configuration option for a message type.
+<I>Msgtype</I> identifies the message type, and <I>option</I>
+specifies a particular configuration option, which must be one of
+the ones listed in the section MESSAGE TYPES.
+</DL>
+<DL>
+<DT> <I>pathName <B>type configure <I>msgtype</I> ?<I>option value ...</I>?
+</I></B>
+<DD> Query or modify the configuration options for a message type.
+If no <I>option</I> is specified, returns a list describing all of
+the available options for the message type <I>msgtype</I>.
+If <I>option</I> is specified with no <I>value</I>, then the command
+returns a list describing the one named option.
+If one or more <I>option-value</I> pairs are specified, then the command
+modifies the given option(s) to have the given value(s); in
+this case the command returns an empty string.
+See MESSAGE TYPES for information on the options that
+are supported.
+<I>pathName <B>type remove</B> <I>msgtype</I>
+Removes an existing message type given by <I>msgtype</I>.
+</DL>
+</UL>
+<DL>
+<DT> <I>pathName <B>issue</B> <I>string</I> <I>?level?</I> <I>?tags?</I>
+</I></B>
+<DD> Print a <I>string</I> to the text area at the given level and with
+any additional tags specified.
+
+</DL>
+</pre><H2>COMPONENTS</H2>
+<P>
+<pre>
+Name: <B>itemMenu</B>
+Class: <B>Menu</B>
+</pre>
+<UL>
+This is the popup menu that gets displayed when you right-click in the
+text area of the messagebox. Its contents may be modified via the component
+command.
+</UL>
+<P>
+<pre>
+Name: <B>text</B>
+Class: <B>Scrolledtext</B>
+</pre>
+<UL>
+The text component is the scrolledtext widget. See the "scrolledtext" widget
+manual entry for details on the text component item.
+</UL>
+</table>
+
+</pre><H2>EXAMPLE</H2>
+<pre>
+ messagebox .mb -hscrollmode dynamic -labeltext "Messages" -labelpos n \\
+ -height 120 -width 550 -savedir "/tmp" -textbackground #d9d9d9
+
+ pack .mb -padx 5 -pady 5 -fill both -expand yes
+
+ .mb type add ERROR -background red -foreground white -bell 1
+ .mb type add WARNING -background yellow -foreground black
+ .mb type add INFO -background white -foreground black
+
+ .mb issue "This is an error message in red with a beep" ERROR
+ .mb issue "This warning message in yellow" WARNING
+ .mb issue "This is an informational message" INFO
+</pre>
+</pre><H2>AUTHORS</H2>
+Alfredo Jahn V
+<P>
+Mark L. Ulferts
+<P>
+</pre><H2>KEYWORDS</H2>
+messagebox, scrolledtext, text, widget
+
diff --git a/iwidgets/demos/html/messagedialog.n.html b/iwidgets/demos/html/messagedialog.n.html
new file mode 100644
index 00000000000..c4a32cf8b8c
--- /dev/null
+++ b/iwidgets/demos/html/messagedialog.n.html
@@ -0,0 +1,279 @@
+<TITLE>messagedialog - Create and manipulate a message dialog widget</TITLE>
+<H1>messagedialog - Create and manipulate a message dialog widget</H1>
+
+</pre><H2>SYNOPSIS</H2>
+<B>messagedialog<I> <I>pathName </I>?<I>options</I>?
+</pre><H2>INHERITANCE</H2>
+itk::Toplevel &lt;- Shell &lt;- Dialogshell &lt;- Dialog &lt;- Messagedialog
+</pre><H2>STANDARD OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>background</B><br>
+<B>foreground</B><br>
+</td>
+<td valign=top>
+<B>bitmap</B><br>
+<B>image</B><br>
+</td>
+<td valign=top>
+<B>cursor</B><br>
+<B>text</B><br>
+</td>
+<td valign=top>
+<B>font</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/options.n.html"> "options" </A> manual entry for details on the standard options.
+</pre><H2>INHERITED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>buttonBoxPadX</B><br>
+<B>padY</B><br>
+</td>
+<td valign=top>
+<B>buttonBoxPadY</B><br>
+<B>separator</B><br>
+</td>
+<td valign=top>
+<B>buttonBoxPos</B><br>
+<B>thickness</B><br>
+</td>
+<td valign=top>
+<B>padX</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="dialogshell.n.html"> "dialogshell" </A> widget manual entry for details on the above
+inherited options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>master</B><br>
+</td>
+<td valign=top>
+<B>modality</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the "shell" widget manual entry for details on the above
+inherited options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>title</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the "Toplevel" widget manual entry for details on the above
+inherited options.
+<P>
+</pre><H2>WIDGET-SPECIFIC OPTIONS</H2>
+<P>
+<pre>
+Name: <B>imagePos</B>
+Class: <B>Position</B>
+Command-Line Switch: <B>-imagepos</B>
+</pre>
+<UL>
+Specifies the image position relative to the message text: <B>n</B>, <B>s</B>,
+<B>e</B>, or <B>w</B>. The default is w.
+</UL>
+<P>
+<pre>
+Name: <B>textPadX</B>
+Class: <B>Pad</B>
+Command-Line Switch: <B>-textpadx</B>
+</pre>
+<UL>
+Specifies a non-negative value indicating how much extra space to request for
+the message text in the X direction. The value may have any of the forms
+acceptable to Tk_GetPixels.
+</UL>
+<P>
+<pre>
+Name: <B>textPadY</B>
+Class: <B>Pad</B>
+Command-Line Switch: <B>-textpady</B>
+</pre>
+<UL>
+Specifies a non-negative value indicating how much extra space to request for
+the message text in the X direction. The value may have any of the forms
+acceptable to Tk_GetPixels.
+</UL>
+<P>
+</pre><HR>
+
+</pre><H2>DESCRIPTION</H2>
+<P>
+The <B>messagedialog</B> command creates a message dialog composite widget.
+The messagedialog is derived from the Dialog class and is composed of
+an image and associated message text with commands to manipulate the
+dialog buttons.
+
+</pre><H2>METHODS</H2>
+<P>
+The <B>messagedialog</B> command creates a new Tcl command whose
+name is <I>pathName</I>. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+<pre>
+<I>pathName option </I>?<I>arg arg ...</I>?
+</pre>
+<I>Option</I> and the <I>arg</I>s
+determine the exact behavior of the command. The following
+commands are possible for messagedialog widgets:
+
+</pre><H2>INHERITED METHODS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>add</B><br>
+<B>insert</B><br>
+</td>
+<td valign=top>
+<B>buttonconfigure</B><br>
+<B>invoke</B><br>
+</td>
+<td valign=top>
+<B>default</B><br>
+<B>show</B><br>
+</td>
+<td valign=top>
+<B>hide</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="buttonbox.n.html"> "buttonbox" </A> widget manual entry for details on the above
+inherited methods.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>childsite</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="dialogshell.n.html"> "dialogshell" </A> widget manual entry for details on the above
+inherited methods.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>activate</B><br>
+</td>
+<td valign=top>
+<B>center</B><br>
+</td>
+<td valign=top>
+<B>deactivate</B><br>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="dialogshell.n.html"> "dialogshell" </A> widget manual entry for details on the above
+inherited methods.
+</pre><H2>WIDGET-SPECIFIC METHODS</H2>
+<DL>
+<DT> <I>pathName <B>cget</B> <I>option</I>
+</I></B>
+<DD> Returns the current value of the configuration option given
+by <I>option</I>.
+<I>Option</I> may have any of the values accepted by the <B>messagedialog</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>configure</B> ?<I>option</I>? ?<I>value option value ...</I>?
+</I></B>
+<DD> Query or modify the configuration options of the widget.
+If no <I>option</I> is specified, returns a list describing all of
+the available options for <I>pathName</I> (see <B>Tk_ConfigureInfo</B> for
+information on the format of this list). If <I>option</I> is specified
+with no <I>value</I>, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no <I>option</I> is specified). If
+one or more <I>option-value</I> pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+<I>Option</I> may have any of the values accepted by the <B>messagedialog</B>
+command.
+
+</DL>
+</pre><H2>COMPONENTS</H2>
+<P>
+<pre>
+Name: <B>image</B>
+Class: <B>Label</B>
+</pre>
+<UL>
+The image component is the bitmap or image of the message dialog. See
+the "label" widget manual entry for details on the image component item.
+</UL>
+<P>
+<pre>
+Name: <B>message</B>
+Class: <B>Label</B>
+</pre>
+<UL>
+The message component provides the textual portion of the message dialog.
+See the "label" widget manual entry for details on the message component item.
+</UL>
+</table>
+
+</pre><H2>EXAMPLE</H2>
+<pre>
+ #
+ # Standard question message dialog used for confirmation.
+ #
+ messagedialog .md -title "Message Dialog" -text "Are you sure ?" \\
+ -bitmap questhead -modality global
+
+ .md buttonconfigure OK -text Yes
+ .md buttonconfigure Cancel -text No
+
+ if {[.md activate]} {
+ .md configure -text "Are you really sure ?"
+ if {[.md activate]} {
+ puts stdout "Yes"
+ } else {
+ puts stdout "No"
+ }
+ } else {
+ puts stdout "No"
+ }
+
+ destroy .md
+
+ #
+ # Copyright notice with automatic deactivation.
+ #
+ messagedialog .cr -title "Copyright" -bitmap @dsc.xbm -imagepos n \\
+ -text "Copyright 1995 DSC Communications Corporation\\n \\
+ All rights reserved"
+
+ .cr hide Cancel
+
+ .cr activate
+ after 10000 ".cr deactivate"
+</pre>
+</pre><H2>AUTHOR</H2>
+Mark L. Ulferts
+</pre><H2>KEYWORDS</H2>
+messagedialog, dialog, dialogshell, shell, widget
diff --git a/iwidgets/demos/html/notebook.n.html b/iwidgets/demos/html/notebook.n.html
new file mode 100644
index 00000000000..62c90dced17
--- /dev/null
+++ b/iwidgets/demos/html/notebook.n.html
@@ -0,0 +1,509 @@
+<TITLE>notebook - create and manipulate notebook widgets</TITLE>
+<H1>notebook - create and manipulate notebook widgets</H1>
+
+</pre><H2>SYNOPSIS</H2>
+<B>notebook</B> <I>pathName</I> ?<I>options</I>?
+</pre><H2>INHERITANCE</H2>
+itk::Widget &lt;- notebook
+</pre><H2>STANDARD OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>background</B><br>
+<B>cursor</B><br>
+</td>
+<td valign=top>
+<B>foreground</B><br>
+<B>height</B><br>
+</td>
+<td valign=top>
+<B>scrollCommand</B><br>
+</td>
+<td valign=top>
+<B>width</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/options.n.html"> "options" </A> manual entry for details on the standard options.
+</pre><H2>WIDGET-SPECIFIC OPTIONS</H2>
+<P>
+<pre>
+Name: <B>auto</B>
+Class: <B>Auto</B>
+Command-Line Switch: <B>-auto</B>
+</pre>
+<UL>
+Specifies whether to use the automatic packing/unpacking algorithm of the
+notebook. A value of <B>true</B> indicates that page frames will be unpacked
+and packed acoording to the algorithm described in the <B>select</B> command.
+A value of <B>false</B> leaves the current page packed and subsequent selects,
+next, or previous commands do not switch pages automatically. In either
+case the page's associated command (see the <B>add</B> command's description
+of the <B>command</B> option) is invoked. The value may have any of the
+forms accepted by the <B>Tcl_GetBoolean</B>, such as true, false, 0, 1, yes,
+or no.
+</UL>
+<UL>
+For example, if a series of pages in a notebook simply change certain display
+configurations of a graphical display, the <B>-auto</B> flag could be used.
+By setting it, the <B>-command</B> procs could do the appropriate reconfiguring
+of the page when the page is switched.
+</UL>
+</pre><HR>
+</pre><H2>DESCRIPTION</H2>
+<P>
+The <B>notebook</B> command creates a new window (given by the pathName
+argument) and makes it into a notebook widget. Additional options, described
+above may be specified on the command line or in the option database to
+configure aspects of the notebook such as its colors, font, and text.
+The <B>notebook</B> command returns its <I>pathName</I> argument. At the time
+this command is invoked, there must not exist a window named pathName, but
+pathName's parent must exist.
+
+A notebook is a widget that contains a set of pages. It displays one page from
+the set as the selected page. When a page is selected, the page's contents are
+displayed in the page area. When first created a notebook has no pages. Pages
+may be added or deleted using widget commands described below.
+
+</pre><H2>NOTEBOOK PAGES</H2>
+<P>
+A notebook's pages area contains a single child site <B>frame</B>. When a new
+page is created it is a child of this frame. The page's child site frame
+serves as a geometry container for applications to pack widgets into. It is
+this frame that is automatically unpacked or packed when the <B>auto</B>
+option is <B>true</B>. This creates the effect of one page being visible at
+a time. When a new page is selected, the previously selected page's child
+site frame is automatically unpacked from the notebook's child site frame
+and the newly selected page's child site is packed into the notebook's
+child site frame.
+
+However, sometimes it is desirable to handle page changes in a different
+manner. By specifying the <B>auto</B> option as <B>false</B>, child site
+packing can be disabled and done differently. For example, all widgets might
+be packed into the first page's child site frame. Then when a new page is
+selected, the application can reconfigure the widgets and give the appearance
+that the page was flipped.
+
+In both cases the <B>command</B> option for a page specifies a Tcl Command to
+execute when the page is selected. In the case of <B>auto</B> being <B>true</B>,
+it is called between the unpacking of the previously selected page and the
+packing of the newly selected page.
+
+</pre><H2>WIDGET-SPECIFIC METHODS</H2>
+<P>
+The <B>notebookfR command creates a new Tcl command whose name
+is <I>pathName</I>. This command may be used to invoke various operations
+on the widget. It has the following general form:
+<pre>
+<I>pathName option </I>?<I>arg arg ...</I>?
+</pre>
+<I>option</I> and the <I>arg</I>s
+determine the exact behavior of the command.
+<P>
+Many of the widget commands for a notebook take as one argument an indicator
+of which page of the notebook to operate on. These indicators are called
+indexes and may be specified in any of the following forms:
+<DL>
+<DT> <I>number</I>
+</I></B>
+<DD> Specifies the index of the the component. For menus, 0 corresponds to the
+left-most menu of the menu bar. For entries, 0 corresponds to the top-most
+entry of the menu.
+<I>number</I>
+Specifies the page numerically, where 0 corresponds to the first page in
+the notebook, 1 to the second, and so on.
+</DL>
+<DL>
+<DT> <B>select</B>
+</I></B>
+<DD> Specifies the currently selected page's index. If no page is currently
+selected, the value -1 is returned.
+</DL>
+<DL>
+<DT> <B>end</B>
+</I></B>
+<DD> Specifes the last page in the notebooks's index. If the notebook is empty
+this will return -1.
+</DL>
+<DL>
+<DT> <I>pattern</I>
+</I></B>
+<DD> If the index doesn't satisfy the form of a number, then this form is used.
+Pattern is pattern-matched against the <B>label</B> of each page in the
+notebook, in order from the first to the last page, until a matching entry
+is found. The rules of <B>Tcl_StringMatch</B> are used.
+</DL>
+<P>
+'.............................................................................
+The following commands are possible for notebook widgets:
+<DL>
+<DT> <I>pathName</I> <B>add</B> ?<I>option value</I>?
+</I></B>
+<DD> Add a new page at the end of the notebook. A new child site frame is
+created. Returns the child site pathName. If additional arguments are
+present, they specify any of the following options:
+</DL>
+<UL>
+<DL>
+<DT> <B>-background</B> <I>value</I>
+</I></B>
+<DD> Specifies a background color to use for displaying the child site frame
+of this page. If this option is specified as an empty string (the default),
+then the background option for the overall notebook is used.
+</DL>
+<DL>
+<DT> <B>-command</B> <I>value</I>
+</I></B>
+<DD> Specifies a Tcl command to be executed when this page is selected. This
+allows the programmer a hook to reconfigure this page's widgets or any other
+page's widgets.
+<UL>
+If the notebook has the auto option set to true, when a page is selected
+this command will be called immediately after the previously selected page
+is unpacked and immediately before this page is selected. The index value
+select is valid during this Tcl command. `index select' will return this
+page's page number.
+</UL>
+<UL>
+If the auto option is set to false, when a page is selected the unpack and
+pack calls are bypassed. This Tcl command is still called.
+</UL>
+</DL>
+<DL>
+<DT> <B>-foreground</B> <I>value</I>
+</I></B>
+<DD> Specifies a foreground color to use for displaying tab labels when tabs are
+in their normal unselected state. If this option is specified as an empty
+string (the default), then the foreground option for the overall notebook
+is used.
+</DL>
+<DL>
+<DT> <B>-label</B> <I>value</I>
+</I></B>
+<DD> Specifies a string to associate with this page. This label serves as an
+additional identifier used to reference the page. This label may be used
+for the index value in widget commands.
+</DL>
+</UL>
+<DL>
+<DT> <I>pathName</I> <B>childSite</B> ?<I>index</I>?
+</I></B>
+<DD> If passed no arguments, returns a list of pathNames for all the pages in
+the notebook. If the notebook is empty, an empty list is returned
+<UL>
+If index is passed, it returns the pathName for the page's child site
+frame specified by index. Widgets that are created with this pathName will
+be displayed when the associated page is selected. If index is not a valid
+index, an empty string is returned.
+</UL>
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>cget</B> <I>option</I>
+</I></B>
+<DD> Returns the current value of the configuration option given by <I>option</I>.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>configure</B> ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
+</I></B>
+<DD> Query or modify the configuration options of the widget. If no <I>option</I>
+is specified, returns a list describing all of the available options
+for <I>pathName</I> (see <B>Tk_ConfigureInfo</B> for information on the
+format of this list). If <I>option</I> is specified with no <I>value</I>,
+then the command returns a list describing the one named option (this
+list will be identical to the corresponding sublist of the value returned
+if no option is specified). If one or more option-value pairs are specified,
+then the command modifies the given widget option(s) to have the given
+value(s); in this case the command returns an empty string. <I>Option</I>
+may have any of the values accepted by the <B>notebook</B> command.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>delete</B> <I>index1</I> ?i</B></I>ndex2?
+</I></B>
+<DD> Delete all of the pages between <I>index1</I> and <I>index2</I> inclusive.
+If <I>index2</I> is omitted then it defaults to <I>index1</I>. Returns an
+empty string.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>index</B> <I>index</I>
+</I></B>
+<DD> Returns the numerical index corresponding to <I>index</I>.
+</DL>
+<DL>
+<DT> <B>pathName</B> <B>insert</B> <I>index</I> ?<I>option</I> <I>value</I>?
+</I></B>
+<DD> Insert a new page in the notebook before the page specified by <I>index</I>.
+A new child site <B>frame</B> is created. See the <B>add</B> command for
+valid options. Returns the child site pathName.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>next</B>
+</I></B>
+<DD> Advances the selected page to the next page (order is determined by insertion
+order). If the currently selected page is the last page in the notebook,
+the selection wraps around to the first page in the notebook.
+<UL>
+For notebooks with auto set to true the current page's child site is
+unpacked from the notebook's child site frame. Then the next page's child
+site is packed into the notebooks child site frame. The Tcl command given
+with the command option will be invoked between these two operations.
+</UL>
+<UL>
+For notebooks with auto set to false the Tcl command given with the
+command option will be invoked.
+</UL>
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>pagecget</B> <I>index</I> ?<I>option</I>?
+</I></B>
+<DD> Returns the current value of the configuration option given by <I>option</I>
+for the page specified by <I>index</I>. The valid available options are the
+same as available to the <B>add</B> command.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>pageconfigure</B> <I>index</I> ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
+</I></B>
+<DD> This command is similar to the configure command, except that it applies to
+the options for an individual page, whereas configure applies to the options
+for the notebook. Options may have any of the values accepted by the add
+widget command. If options are specified, options are modified as indicated
+in the command and the command returns an empty string. If no options are
+specified, returns a list describing the current options for
+page <I>index</I> (see <B>Tk_ConfigureInfo</B> for information on the
+format of this list).
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>prev</B>
+</I></B>
+<DD> Moves the selected page to the previous page (order is determined by
+insertion order). If the currently selected page is the first page in the
+notebook, the selection wraps around to the last page in the notebook.
+<UL>
+For notebooks with <B>auto</B> set to <B>true</B> the current page's child
+site is unpacked from the notebook's child site frame. Then the previous
+page's child site is packed into the notebooks child site frame. The Tcl
+command given with the command option will be invoked between these two
+operations.
+</UL>
+<UL>
+For notebooks with <B>auto</B> set to <B>false</B> the Tcl command given with
+the command option will be invoked.
+</UL>
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>select</B> <I>index</I>
+</I></B>
+<DD> Selects the page specified by <I>index</I> as the currently selected page.
+<UL>
+For notebooks with <B>auto</B> set to <B>true</B> the current page's child
+site is unpacked from the notebook's child site frame. Then the index page's
+child site is packed into the notebooks child site frame. The Tcl command
+given with the command option will be invoked between these two operations.
+</UL>
+<UL>
+For notebooks with <B>auto</B> set to <B>false</B> the Tcl command given with
+the command option will be invoked.
+</UL>
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>view</B>
+</I></B>
+<DD> Returns the currently selected page. This command is for compatibility
+with the scrollbar widget.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>view</B> <I>index</I>
+</I></B>
+<DD> Selects the page specified by <I>index</I> as the currently selected page.
+This command is for compatibility with the scrollbar widget.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>view</B> <I>moveto</I> <I>fraction</I>
+</I></B>
+<DD> Uses the fraction value to determine the corresponding page to move to.
+This command is for compatibility with the scrollbar widget.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>view</B> <I>scroll</I> <I>num</I> <I>what</I>
+</I></B>
+<DD> Uses the <I>num</I> value to determine how many pages to move forward or
+backward (num can be negative or positive). The <I>what</I> argument is
+ignored. This command is for compatibility with the scrollbar widget.
+
+</DL>
+</pre><H2>EXAMPLE</H2>
+<P>
+Following is an example that creates a notebook with two pages. In this example, we use a scrollbar widget to control the notebook widget.
+<table cellpadding=5>
+<td valign=top>
+<UL><br>
+the<br>
+pack<br>
+-width<br>
+pack<br>
+\\<br>
+-expand<br>
+left<br>
+\\<br>
+#<br>
+to<br>
+#<br>
+"Page<br>
+add<br>
+.nb<br>
+Two"<br>
+Get<br>
+frames<br>
+pages.<br>
+childsite<br>
+[.nb<br>
+</UL><br>
+buttons<br>
+of<br>
+$page1CS.b<br>
+pack<br>
+-text<br>
+$page2CS.b<br>
+Select<br>
+of<br>
+select<br>
+#<br>
+and<br>
+#<br>
+together,<br>
+scrollbar<br>
+".nb<br>
+-scrollcommand<br>
+.scroll<br>
+yes<br>
+</td>
+<td valign=top>
+</UL><br>
+notebook<br>
+it.<br>
+100<br>
+.nb<br>
+-fill<br>
+yes<br>
+\\<br>
+-pady<br>
+Add<br>
+the<br>
+"Page<br>
+Two",<br>
+-label<br>
+add<br>
+</UL><br>
+the<br>
+of<br>
+set<br>
+0]<br>
+childsite<br>
+<UL><br>
+on<br>
+the<br>
+-text<br>
+$page1CS.b<br>
+"Button<br>
+</UL><br>
+the<br>
+the<br>
+0<br>
+Create<br>
+associate<br>
+and<br>
+then<br>
+ScrollBar<br>
+view"<br>
+".scroll<br>
+-fill<br>
+-pady<br>
+</td>
+<td valign=top>
+#<br>
+widget<br>
+notebook<br>
+-height<br>
+-anchor<br>
+both<br>
+\\<br>
+-padx<br>
+10<br>
+two<br>
+notebook,<br>
+One"<br>
+respectively.<br>
+"Page<br>
+-label<br>
+<UL><br>
+child<br>
+these<br>
+page1CS<br>
+set<br>
+"Page<br>
+#<br>
+each<br>
+notebook<br>
+"Button<br>
+button<br>
+Two"<br>
+<UL><br>
+first<br>
+notebook<br>
+</UL><br>
+the<br>
+teh<br>
+the<br>
+pack<br>
+.scroll<br>
+.nb<br>
+set"<br>
+y<br>
+10<br>
+</td>
+<td valign=top>
+Create<br>
+and<br>
+.nb<br>
+100<br>
+nw<br>
+\\<br>
+-side<br>
+10<br>
+<UL><br>
+pages<br>
+labelled<br>
+and<br>
+.nb<br>
+One"<br>
+"Page<br>
+#<br>
+site<br>
+two<br>
+[.nb<br>
+page2CS<br>
+Two"]<br>
+Create<br>
+page<br>
+button<br>
+One"<br>
+$page2CS.b<br>
+pack<br>
+#<br>
+page<br>
+.nb<br>
+<UL><br>
+scrollbar<br>
+scrollbar<br>
+notebook<br>
+the<br>
+-command<br>
+configure<br>
+pack<br>
+-expand<br>
+</UL><br>
+</td>
+</table>
+</pre><H2>AUTHOR</H2>
+Bill W. Scott
+</pre><H2>KEYWORDS</H2>
+notebook page
diff --git a/iwidgets/demos/html/optionmenu.n.html b/iwidgets/demos/html/optionmenu.n.html
new file mode 100644
index 00000000000..3405556da24
--- /dev/null
+++ b/iwidgets/demos/html/optionmenu.n.html
@@ -0,0 +1,316 @@
+<TITLE>optionmenu - Create and manipulate a option menu widget</TITLE>
+<H1>optionmenu - Create and manipulate a option menu widget</H1>
+
+</pre><H2>SYNOPSIS</H2>
+<B>optionmenu<I> <I>pathName </I>?<I>options</I>?
+</pre><H2>INHERITANCE</H2>
+itk::Widget &lt;- Labeledwidget &lt;- optionmenu
+</pre><H2>STANDARD OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>activeBackground</B><br>
+<B>borderWidth</B><br>
+<B>foreground</B><br>
+</td>
+<td valign=top>
+<B>activeBorderWidth</B><br>
+<B>cursor</B><br>
+<B>highlightColor</B><br>
+</td>
+<td valign=top>
+<B>activeForeground</B><br>
+<B>disabledForeground</B><br>
+<B>highlightThickness</B><br>
+</td>
+<td valign=top>
+<B>background</B><br>
+<B>font</B><br>
+<B>relief</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/options.n.html"> "options" </A> manual entry for details on the standard options.
+</pre><H2>INHERITED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>disabledForeground</B><br>
+<B>labelMargin</B><br>
+<B>state</B><br>
+</td>
+<td valign=top>
+<B>labelBitmap</B><br>
+<B>labelPos</B><br>
+</td>
+<td valign=top>
+<B>labelFont</B><br>
+<B>labelText</B><br>
+</td>
+<td valign=top>
+<B>labelImage</B><br>
+<B>labelVariable</B><br>
+</td>
+</table>
+<P>
+See the "LabeledWidget" manual entry for details on the inherited options.
+</pre><H2>WIDGET-SPECIFIC OPTIONS</H2>
+<P>
+<pre>
+Name: <B>clickTime</B>
+Class: <B>ClickTime</B>
+Command-Line Switch: <B>-clicktime</B>
+</pre>
+<UL>
+Interval time, in msec, used to determine that a single mouse
+click has occurred. Used to post menu on a "quick" mouse click.
+<B>Note</B>: changing this value may cause the sigle-click
+functionality to not work properly. The default is 150 msec.
+</UL>
+<P>
+<pre>
+Name: <B>command</B>
+Class: <B>Command</B>
+Command-Line Switch: <B>-command</B>
+</pre>
+<UL>
+Specifies a Tcl command procedure to be evaluated following a change in
+the current option menu selection.
+</UL>
+<P>
+<pre>
+Name: <B>cyclicOn</B>
+Class: <B>CyclicOn</B>
+Command-Line Switch: <B>-cyclicon</B>
+</pre>
+<UL>
+Turns on/off the 3rd mouse button capability. The value may be specified
+in any of the forms acceptable to <B>Tcl_GetBoolean</B>. This feature
+allows the right mouse button to cycle through the popup
+menu list without poping it up. The right mouse button cycles through
+the menu in reverse order. The default is true.
+</UL>
+<P>
+<pre>
+Name: <B>popupCursor</B>
+Class: <B>Cursor</B>
+Command-Line Switch: <B>-popupcursor</B>
+</pre>
+<UL>
+Specifies the mouse cursor to be used for the popup menu. The value may
+have any of the forms acceptable to <B>Tk_GetCursor</B>.
+</UL>
+<P>
+<pre>
+Name: <B>state</B>
+Class: <B>State</B>
+Command-Line Switch: <B>-state</B>
+</pre>
+<UL>
+Specified one of two states for the optionmenu: <B>normal</B>, or
+<B>disabled</B>. If the optionmenu is disabled, then option menu
+selection is ignored.
+</UL>
+<P>
+<pre>
+Name: <B>width</B>
+Class: <B>Width</B>
+Command-Line Switch: <B>-width</B>
+</pre>
+<UL>
+Specifies a fixed size for the menu button label in any of the forms
+acceptable to \Tk_GetPixels</B></I>. If the text
+is too small to fit in the label, the text is clipped.
+Note: Normally, when a new list is created, or new items are
+added to an existing list, the menu button label is resized
+automatically. Setting this option overrides that functionality.
+</UL>
+<P>
+</pre><HR>
+
+</pre><H2>DESCRIPTION</H2>
+<P>
+The <B>optionmenu</B> command creates an option menu widget with options
+to manage it. An option menu displays a frame containing a label and a button.
+A pop-up menu will allow for the value of the button to change.
+
+</pre><H2>METHODS</H2>
+<P>
+The <B>optionmenu</B> command creates a new Tcl command whose
+name is <I>pathName</I>. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+<pre>
+<I>pathName option </I>?<I>arg arg ...</I>?
+</pre>
+<I>Option</I> and the <I>arg</I>s
+determine the exact behavior of the command.
+<P>
+Many of the widget commands for an optionmenu take as one argument an
+indicator of which entry of the option menu to operate on. These
+indicators are called <I>index</I>es and may be specified in
+any of the following forms:
+<DL>
+<DT> <I>number</I>
+</I></B>
+<DD> Specifies the entry numerically, where 0 corresponds
+to the top-most entry of the option menu, 1 to the entry below it, and
+so on.
+</DL>
+<DL>
+<DT> <B>end</B>
+</I></B>
+<DD> Indicates the bottommost entry in the menu. If there are no
+entries in the menu then -1 is returned.
+</DL>
+<DL>
+<DT> <B>select</B>
+</I></B>
+<DD> Returns the numerical index of the currently selected option menu entry.
+If no entries exist in the menu, then -1 is returned.
+</DL>
+<DL>
+<DT> <I>pattern</I>
+</I></B>
+<DD> If the index doesn't satisfy one of the above forms then this
+form is used. <I>Pattern</I> is pattern-matched against the label of
+each entry in the option menu, in order from the top down, until a
+matching entry is found. The rules of <B>Tcl_StringMatch</B>
+are used.
+</DL>
+<P>
+The following widget commands are possible for optionmenu widgets:
+
+</pre><H2>WIDGET-SPECIFIC METHODS</H2>
+<DL>
+<DT> <I>pathName <B>cget</B> <I>option</I>
+</I></B>
+<DD> Returns the current value of the configuration option given
+by <I>option</I>.
+<I>Option</I> may have any of the values accepted by the <B>optionmenu</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>configure</B> ?<I>option</I>? ?<I>value option value ...</I>?
+</I></B>
+<DD> Query or modify the configuration options of the widget.
+If no <I>option</I> is specified, returns a list describing all of
+the available options for <I>pathName</I> (see <B>Tk_ConfigureInfo</B> for
+information on the format of this list). If <I>option</I> is specified
+with no <I>value</I>, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no <I>option</I> is specified). If
+one or more <I>option-value</I> pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+<I>Option</I> may have any of the values accepted by the <B>optionmenu</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName <B>delete <I>first</I> ?<I>last</I>?
+</I></B>
+<DD> Delete all of the option menu entries between <I>first</I> and
+<I>last</I> inclusive. If <I>last</I> is omitted then it defaults
+to <I>first</I>.
+</DL>
+<DL>
+<DT> <I>pathName <B>disable <I>index</I>
+</I></B>
+<DD> Disable the option menu entry specified by <I>index</I>.
+Disabling a menu item will prevent the user from being able to select
+this item from the menu. This only effects the state of the item
+in the menu, in other words, should the item be the currently
+selected item, the programmer is responsible for determining this condition
+and taking appropriate action.
+</DL>
+<DL>
+<DT> <I>pathName <B>enable <I>index</I>
+</I></B>
+<DD> Enable the option menu entry specified by <I>index</I>.
+Enabling a menu item allows the user to select this item from the menu.
+</DL>
+<DL>
+<DT> <I>pathName <B>get</B> ?<I>first</I>? ?<I>last</I>?
+</I></B>
+<DD> If no arguments are specified, this operation returns the currently
+selected option menu item. Otherwise, it returns the name of the
+option at index <I>first</I>, or a range of options between <I>first</I>
+and <I>last</I>.
+</DL>
+<DL>
+<DT> <I>pathName <B>index <I>index</I>
+</I></B>
+<DD> Returns the numerical index corresponding to <I>index</I>.
+</DL>
+<DL>
+<DT> <I>pathName <B>insert <I>index string</I> ?<I>string</I>?
+</I></B>
+<DD> Insert an item, or list of items, into the menu at location <I>index</I>.
+</DL>
+<DL>
+<DT> <I>pathName <B>select <I>index</I>
+</I></B>
+<DD> Select an item from the option menu to be displayed as the currently
+selected item.
+</DL>
+<DL>
+<DT> <I>pathName <B>sort <I>mode</I>
+</I></B>
+<DD> Sort the current menu in either <B>ascending</B>, or <B>descending</B> order.
+The values <B>increasing</B>, or <B>decreasing</B> are also accepted.
+
+</DL>
+</pre><H2>COMPONENTS</H2>
+<P>
+<pre>
+Name: <B>menuBtn</B>
+Class: <B>Menubutton</B>
+</pre>
+<UL>
+The menuBtn component is the option menu button which displays the current
+choice from the popup menu. See the "menubutton" widget manual entry
+for details on the menuBtn component item.
+</UL>
+<P>
+<pre>
+Name: <B>popupMenu</B>
+Class: <B>Menu</B>
+</pre>
+<UL>
+The popupMenu component is menu displayed upon selection of the menu button.
+The menu contains the choices for the option menu. See the "menu" widget
+manual entry for details on the popupMenu component item.
+</UL>
+</table>
+
+</pre><H2>EXAMPLE</H2>
+<pre>
+ optionmenu .om -labelmargin 5 \\
+ -labelon true -labelpos w -labeltext "Operating System :"
+
+ .om insert end Unix VMS Linux OS/2 {Windows NT} DOS
+ .om sort ascending
+ .om select Linux
+
+ pack .om -padx 10 -pady 10
+</pre>
+</pre><H2>ACKNOWLEDGEMENTS:</H2>
+Michael J. McLennan
+<UL>
+Borrowed some ideas (next &amp; previous) from OptionButton class.
+</UL>
+<P>
+Steven B. Jaggers
+<UL>
+Provided an initial prototype in [incr Tcl].
+</UL>
+<P>
+Bret Schuhmacher
+<UL>
+Helped with popup menu functionality.
+</UL>
+<P>
+</pre><H2>AUTHOR</H2>
+Alfredo Jahn
+</pre><H2>KEYWORDS</H2>
+optionmenu, widget
diff --git a/iwidgets/demos/html/panedwindow.n.html b/iwidgets/demos/html/panedwindow.n.html
new file mode 100644
index 00000000000..293b61e4621
--- /dev/null
+++ b/iwidgets/demos/html/panedwindow.n.html
@@ -0,0 +1,352 @@
+<TITLE>panedwindow - Create and manipulate a paned window widget</TITLE>
+<H1>panedwindow - Create and manipulate a paned window widget</H1>
+
+</pre><H2>SYNOPSIS</H2>
+<B>panedwindow<I> <I>pathName </I>?<I>options</I>?
+</pre><H2>INHERITANCE</H2>
+itk::Widget &lt;- panedwindow
+</pre><H2>STANDARD OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>background</B><br>
+</td>
+<td valign=top>
+<B>cursor</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/options.n.html"> "options" </A> manual entry for details on the standard options.
+</pre><H2>WIDGET-SPECIFIC OPTIONS</H2>
+<P>
+<pre>
+Name: <B>height</B>
+Class: <B>Height</B>
+Command-Line Switch: <B>-height</B>
+</pre>
+<UL>
+Specifies the overall height of the paned window in any of the forms
+acceptable to <B>Tk_GetPixels</B>. The default is 10 pixels.
+</UL>
+<P>
+<pre>
+Name: <B>orient</B>
+Class: <B>Orient</B>
+Command-Line Switch: <B>-orient</B>
+</pre>
+<UL>
+Specifies the orientation of the separators: <B>vertical</B> or
+<B>horizontal</B>. The default is horizontal.
+</UL>
+<P>
+<pre>
+Name: <B>sashBorderWidth</B>
+Class: <B>BorderWidth</B>
+Command-Line Switch: <B>-sashborderwidth</B>
+</pre>
+<UL>
+Specifies a value indicating the width of the 3-D border to draw
+around the outside of the sash in any of the forms acceptable to
+<B>Tk_GetPixels</B>. The default is 2 pixels.
+</UL>
+<P>
+<pre>
+Name: <B>sashCursor</B>
+Class: <B>Cursor</B>
+Command-Line Switch: <B>-sashcursor</B>
+</pre>
+<UL>
+Specifies the type of cursor to be displayed in the sash. The default
+is crosshair.
+</UL>
+<P>
+<pre>
+Name: <B>sashHeight</B>
+Class: <B>Height</B>
+Command-Line Switch: <B>-sashheight</B>
+</pre>
+<UL>
+Specifies the height of the sash in any of the forms acceptable to
+<B>Tk_GetPixels</B>. The default is 10 pixels.
+</UL>
+<P>
+<pre>
+Name: <B>sashIndent</B>
+Class: <B>SashIndent</B>
+Command-Line Switch <B>sashindent</B>
+</pre>
+<UL>
+Specifies the placement of the sash along the panes in any of the forms
+acceptable to <B>Tk_GetPixels</B>. A positive
+value causes the sash to be offset from the near (left/top) side
+of the pane, and a negative value causes the sash to be offset from
+the far (right/bottom) side. If the offset is greater than the
+width, then the sash is placed flush against the side. The
+default is -10 pixels.
+</UL>
+<P>
+<pre>
+Name: <B>sashWidth</B>
+Class: <B>Width</B>
+Command-Line Switch: <B>-sashwidth</B>
+</pre>
+<UL>
+Specifies the width of the sash in any of the forms acceptable to
+<B>Tk_GetPixels</B>. The default is 10 pixels.
+</UL>
+<P>
+<pre>
+Name: <B>showHandle</B>
+Class: <B>ShowHandle</B>
+Command-Line Switch: <B>-showhandle</B>
+</pre>
+<UL>
+Specifies whether or not to display the sashes on the window panes.
+The default is 1, and valid options are 0 and 1.
+</UL>
+<P>
+<pre>
+Name: <B>thickness</B>
+Class: <B>Thickness</B>
+Command-Line Switch: <B>-thickness</B>
+</pre>
+<UL>
+Specifies the thickness of the separators in any of the forms acceptable to
+<B>Tk_GetPixels</B>. The default is 3 pixels.
+</UL>
+<P>
+<P>
+<pre>
+Name: <B>width</B>
+Class: <B>Width</B>
+Command-Line Switch: <B>-width</B>
+</pre>
+<UL>
+Specifies the overall width of the paned window in any of the forms
+acceptable to <B>Tk_GetPixels</B>. The default is 10 pixels.
+</UL>
+<P>
+</pre><HR>
+
+</pre><H2>DESCRIPTION</H2>
+<P>
+The <B>panedwindow</B> command creates a multiple paned window widget
+capable of orienting the panes
+either vertically or horizontally. Each pane is itself a frame acting
+as a child site for other widgets. The border separating each pane
+contains a sash which allows user positioning of the panes relative to
+one another.
+
+</pre><H2>METHODS</H2>
+<P>
+The <B>panedwindow</B> command creates a new Tcl command whose
+name is <I>pathName</I>. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+<pre>
+<I>pathName option </I>?<I>arg arg ...</I>?
+</pre>
+<I>Option</I> and the <I>arg</I>s
+determine the exact behavior of the command.
+<P>
+Many of the widget commands for the <B>panedwindow</B> take as one argument an
+indicator of which pane of the paned window to operate on. These indicators
+are called <I>indexes</I> and allow reference and manipulation of panes
+regardless of their current map state. Paned window indexes may be
+specified in any of the following forms:
+<DL>
+<DT> <I>number</I>
+</I></B>
+<DD> Specifies the pane numerically, where 0 corresponds to the nearest
+(top/left-most) pane of the paned window.
+</DL>
+<DL>
+<DT> <B>end</B>
+</I></B>
+<DD> Indicates the farthest (bottom/right-most) pane of the paned window.
+</DL>
+<DL>
+<DT> <I>pattern</I>
+</I></B>
+<DD> If the index doesn't satisfy one of the above forms then this
+form is used. <I>Pattern</I> is pattern-matched against the tag of
+each pane in the panedwindow, in order from left/top to right/left,
+until a matching entry is found. The rules of <B>Tcl_StringMatch</B>
+are used.
+
+</DL>
+</pre><H2>WIDGET-SPECIFIC METHODS</H2>
+<DL>
+<DT> <I>pathName <B>add</B> <I>tag</I> ?<I>option value option value</I>?
+</I></B>
+<DD> Adds a new pane to the paned window on the far side (right/bottom). The
+following options may be specified:
+</DL>
+<UL>
+<DL>
+<DT> <B>-margin</B> <I>value</I>
+</I></B>
+<DD> Specifies the border distance between the pane and pane contents is any of
+the forms acceptable to <B>Tk_GetPixels</B>. The default is 8 pixels.
+</DL>
+<DL>
+<DT> <B>-minimum</B> <I>value</I>
+</I></B>
+<DD> Specifies the minimum size that a pane's contents may reach not
+inclusive of twice the margin in any of the forms acceptable to
+<B>Tk_GetPixels</B>. The default is 10 pixels.
+
+The <B>add</B> method returns the path name of the pane.
+</DL>
+</UL>
+<DL>
+<DT> <I>pathName <B>cget</B> <I>option</I>
+</I></B>
+<DD> Returns the current value of the configuration option given
+by <I>option</I>.
+<I>Option</I> may have any of the values accepted by the <B>panedwindow</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName <B>childsite</B> ?<I>index</I>?
+</I></B>
+<DD> Returns a list of the child site path names or a specific child site given
+an index. The list is constructed from the near side (left/top) to the far
+side (right/bottom).
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>configure</B> ?<I>option</I>? ?<I>value option value ...</I>?
+</I></B>
+<DD> Query or modify the configuration options of the widget.
+If no <I>option</I> is specified, returns a list describing all of
+the available options for <I>pathName</I> (see <B>Tk_ConfigureInfo</B> for
+information on the format of this list). If <I>option</I> is specified
+with no <I>value</I>, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no <I>option</I> is specified). If
+one or more <I>option-value</I> pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+<I>Option</I> may have any of the values accepted by the <B>panedwindow</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName <B>delete</B> <I>index</I>
+</I></B>
+<DD> Deletes a specified pane given an <I>index</I>.
+</DL>
+<DL>
+<DT> <I>pathName <B>fraction</B> <I>percentage</I> <I>percentage</I> ?<I>percentage percentage ...</I>?
+</I></B>
+<DD> Sets the visible percentage of the panes. Specifies a set of
+percentages which are applied to the visible panes from the near side
+(left/top). The number of percentages must be equal to the current number
+of visible (mapped) panes and add up to 100.
+</DL>
+<DL>
+<DT> <I>pathName <B>hide</B> <I>index</I>
+</I></B>
+<DD> Changes the visiblity of the specified pane, allowing a previously displayed
+pane to be visually removed rather than deleted.
+</DL>
+<DL>
+<DT> <I>pathName <B>index</B> <I>index</I>
+</I></B>
+<DD> Returns the numerical index corresponding to index.
+</DL>
+<DL>
+<DT> <I>pathName <B>insert <I>index</I> <I>tag</I> ?<I>option value option value ...</I>?
+</I></B>
+<DD> Same as the <B>add</B> command except that it inserts the new
+pane just before the one given by <I>index</I>, instead of appending
+to the end of the panedwindow. The <I>option</I>, and <I>value</I>
+arguments have the same interpretation as for the <B>add</B> widget
+command.
+</DL>
+<DL>
+<DT> <I>pathName <B>paneconfigure</B> <I>index</I> ?<I>options</I>?
+</I></B>
+<DD> This command is similar to the <B>configure</B> command, except that
+it applies to the options for an individual pane, whereas <B>configure</B>
+applies to the options for the paned window as a whole.
+<I>Options</I> may have any of the values accepted by the <B>add</B>
+widget command. If <I>options</I> are specified, options are modified
+as indicated in the command and the command returns an empty string.
+If no <I>options</I> are specified, returns a list describing
+the current options for entry <I>index</I> (see <B>Tk_ConfigureInfo</B> for
+information on the format of this list).
+</DL>
+<DL>
+<DT> <I>pathName <B>reset</B>
+</I></B>
+<DD> Redisplays the pane window using default percentages.
+</DL>
+<DL>
+<DT> <I>pathName <B>show</B> <I>index</I>
+</I></B>
+<DD> Changes the visiblity of the specified pane, allowing a previously hidden
+pane to be displayed.
+
+</DL>
+</pre><H2>NOTES</H2>
+<UL>
+Dynamic changing of the margin and or minimum options to values which
+make the current configuration invalid will block subsequent sash
+movement until the fractions are modified via the fraction method.
+For example a panedwindow is created with three panes and the minimum
+and margin options are at their default settings. Next the user moves
+the sashes to compact the panes to one side. Now, if the minimum is
+increased on the most compressed pane via the paneconfigure method to
+a large enough value, then sash movement is blocked
+until the fractions are adjusted. This situation is unusual and under
+normal operation of the panedwindow, this problem will never occur.
+</UL>
+<P>
+
+</pre><H2>EXAMPLE</H2>
+<pre>
+ panedwindow .pw -width 300 -height 300
+ .pw add top
+ .pw add middle -margin 10
+ .pw add bottom -margin 10 -minimum 10
+
+ pack .pw -fill both -expand yes
+
+ foreach pane [.pw childSite] {
+ button $pane.b -text $pane -relief raised -borderwidth 2
+ pack $pane.b -fill both -expand yes
+ }
+
+ .pw fraction 50 30 20
+ .pw paneconfigure 0 -minimum 20
+ .pw paneconfigure bottom -margin 15
+</pre>
+</pre><H2>ACKNOWLEDGEMENTS:</H2>
+<P>
+Jay Schmidgall
+<UL>
+1994 - Base logic posted to comp.lang.tcl
+</UL>
+<P>
+Joe Hidebrand &lt;hildjj@fuentez.com&gt;
+<UL>
+07/25/94 - Posted first multipane version to comp.lang.tcl
+</UL>
+<P>
+<UL>
+07/28/94 - Added support for vertical panes
+</UL>
+<P>
+Ken Copeland &lt;ken@hilco.com&gt;
+<UL>
+09/28/95 - Smoothed out the sash movement and added squeezable panes.
+</UL>
+<P>
+</pre><H2>AUTHOR</H2>
+Mark L. Ulferts
+</pre><H2>KEYWORDS</H2>
+panedwindow, widget
diff --git a/iwidgets/demos/html/promptdialog.n.html b/iwidgets/demos/html/promptdialog.n.html
new file mode 100644
index 00000000000..f8234a1ea5b
--- /dev/null
+++ b/iwidgets/demos/html/promptdialog.n.html
@@ -0,0 +1,313 @@
+<TITLE>promptdialog - Create and manipulate a prompt dialog widget</TITLE>
+<H1>promptdialog - Create and manipulate a prompt dialog widget</H1>
+
+</pre><H2>SYNOPSIS</H2>
+<B>promptdialog<I> <I>pathName </I>?<I>options</I>?
+</pre><H2>INHERITANCE</H2>
+itk::Toplevel &lt;- dialogshell &lt;- dialog &lt;- promptdialog
+</pre><H2>STANDARD OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>background</B><br>
+<B>foreground</B><br>
+<B>insertBorderWidth</B><br>
+<B>relief</B><br>
+</td>
+<td valign=top>
+<B>borderWidth</B><br>
+<B>highlightColor</B><br>
+<B>insertOffTime</B><br>
+<B>selectBackground</B><br>
+</td>
+<td valign=top>
+<B>cursor</B><br>
+<B>highlightThickness</B><br>
+<B>insertOnTime</B><br>
+<B>selectBorderWidth</B><br>
+</td>
+<td valign=top>
+<B>exportSelection</B><br>
+<B>insertBackground</B><br>
+<B>insertWidth</B><br>
+<B>selectForeground</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/options.n.html"> "options" </A> manual entry for details on the standard options.
+</pre><H2>ASSOCIATED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>show</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/entry.n.html"> "entry" </A> widget manual entry for details on the above
+associated options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>invalid</B><br>
+</td>
+<td valign=top>
+<B>textBackground</B><br>
+</td>
+<td valign=top>
+<B>textFont</B><br>
+</td>
+<td valign=top>
+<B>validate</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="entryfield.n.html"> "entryfield" </A> widget manual entry for details on the above
+associated options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>labelFont</B><br>
+</td>
+<td valign=top>
+<B>labelPos</B><br>
+</td>
+<td valign=top>
+<B>labelText</B><br>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="labeledwidget.n.html"> "labeledwidget" </A> widget manual entry for details on the above
+associated options.
+</pre><H2>INHERITED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>buttonBoxPadX</B><br>
+<B>padY</B><br>
+</td>
+<td valign=top>
+<B>buttonBoxPadY</B><br>
+<B>separator</B><br>
+</td>
+<td valign=top>
+<B>buttonBoxPos</B><br>
+<B>thickness</B><br>
+</td>
+<td valign=top>
+<B>padX</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="dialogshell.n.html"> "dialogshell" </A> widget manual entry for details on the above
+inherited options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>height</B><br>
+</td>
+<td valign=top>
+<B>master</B><br>
+</td>
+<td valign=top>
+<B>modality</B><br>
+</td>
+<td valign=top>
+<B>width</B><br>
+</td>
+</table>
+<P>
+See the "shell" widget manual entry for details on the above
+inherited options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>title</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the "Toplevel" widget manual entry for details on the above
+inherited options.
+<P>
+</pre><HR>
+
+</pre><H2>DESCRIPTION</H2>
+<P>
+The <B>promptdialog</B> command creates a prompt dialog similar to the
+OSF/Motif standard prompt dialog composite widget. The promptdialog
+is derived from the dialog class and is composed of a EntryField
+with commands to manipulate the dialog buttons.
+
+</pre><H2>METHODS</H2>
+<P>
+The <B>promptdialog</B> command creates a new Tcl command whose
+name is <I>pathName</I>. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+<pre>
+<I>pathName option </I>?<I>arg arg ...</I>?
+</pre>
+<I>Option</I> and the <I>arg</I>s
+determine the exact behavior of the command. The following
+commands are possible for promptdialog widgets:
+</pre><H2>ASSOCIATED METHODS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>delete</B><br>
+<B>insert</B><br>
+</td>
+<td valign=top>
+<B>get</B><br>
+<B>scan</B><br>
+</td>
+<td valign=top>
+<B>icursor</B><br>
+<B>selection</B><br>
+</td>
+<td valign=top>
+<B>index</B><br>
+<B>xview</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/entry.n.html"> "entry" </A> widget manual entry for details on the above
+associated methods.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>clear</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="entryfield.n.html"> "entryfield" </A> widget manual entry for details on the above
+associated methods.
+</pre><H2>INHERITED METHODS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>add</B><br>
+<B>invoke</B><br>
+</td>
+<td valign=top>
+<B>buttonconfigure</B><br>
+<B>show</B><br>
+</td>
+<td valign=top>
+<B>default</B><br>
+</td>
+<td valign=top>
+<B>hide</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="buttonbox.n.html"> "buttonbox" </A> widget manual entry for details on the above
+inherited methods.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>childsite</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="dialogshell.n.html"> "dialogshell" </A> widget manual entry for details on the above
+inherited methods.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>activate</B><br>
+</td>
+<td valign=top>
+<B>center</B><br>
+</td>
+<td valign=top>
+<B>deactivate</B><br>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the "shell" widget manual entry for details on the above
+inherited methods.
+
+</pre><H2>WIDGET-SPECIFIC METHODS</H2>
+<DL>
+<DT> <I>pathName <B>cget</B> <I>option</I>
+</I></B>
+<DD> Returns the current value of the configuration option given
+by <I>option</I>.
+<I>Option</I> may have any of the values accepted by the <B>promptdialog</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>configure</B> ?<I>option</I>? ?<I>value option value ...</I>?
+</I></B>
+<DD> Query or modify the configuration options of the widget.
+If no <I>option</I> is specified, returns a list describing all of
+the available options for <I>pathName</I> (see <B>Tk_ConfigureInfo</B> for
+information on the format of this list). If <I>option</I> is specified
+with no <I>value</I>, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no <I>option</I> is specified). If
+one or more <I>option-value</I> pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+<I>Option</I> may have any of the values accepted by the <B>promptdialog</B>
+command.
+
+</DL>
+</pre><H2>COMPONENTS</H2>
+<P>
+<pre>
+Name: <B>prompt</B>
+Class: <B>Entryfield</B>
+</pre>
+<UL>
+The prompt component is the entry field for user input in the prompt
+dialog. See the "entryfield" widget manual entry for details on
+the prompt component item.
+</UL>
+</table>
+
+</pre><H2>EXAMPLE</H2>
+<pre>
+ option add *textBackground white
+
+ promptdialog .pd -modality global -title Password -labeltext Password: -show *
+ .pd hide Apply
+
+ if {[.pd activate]} {
+ puts "Password entered: [.pd get]"
+ } else {
+ puts "Password prompt cancelled"
+ }
+</pre>
+</pre><H2>AUTHOR</H2>
+Mark L. Ulferts
+</pre><H2>KEYWORDS</H2>
+promptdialog, dialog, dialogshell, shell, widget
diff --git a/iwidgets/demos/html/pushbutton.n.html b/iwidgets/demos/html/pushbutton.n.html
new file mode 100644
index 00000000000..d9a647e5a80
--- /dev/null
+++ b/iwidgets/demos/html/pushbutton.n.html
@@ -0,0 +1,175 @@
+<TITLE>pushbutton - Create and manipulate a push button widget</TITLE>
+<H1>pushbutton - Create and manipulate a push button widget</H1>
+
+</pre><H2>SYNOPSIS</H2>
+<B>pushbutton<I> <I>pathName </I>?<I>options</I>?
+</pre><H2>INHERITANCE</H2>
+itk::Widget &lt;- pushbutton
+</pre><H2>STANDARD OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>activeBackground</B><br>
+<B>borderWidth</B><br>
+<B>font</B><br>
+<B>highlightThickness</B><br>
+<B>state</B><br>
+</td>
+<td valign=top>
+<B>activeForeground</B><br>
+<B>command</B><br>
+<B>foreground</B><br>
+<B>image</B><br>
+<B>text</B><br>
+</td>
+<td valign=top>
+<B>background</B><br>
+<B>cursor</B><br>
+<B>highlightBackground</B><br>
+<B>padX</B><br>
+<B>underline</B><br>
+</td>
+<td valign=top>
+<B>bitmap</B><br>
+<B>disabledForeground</B><br>
+<B>highlightColor</B><br>
+<B>padY</B><br>
+<B>wrapLength</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/options.n.html"> "options" </A> manual entry for details on the standard options.
+</pre><H2>WIDGET-SPECIFIC OPTIONS</H2>
+<P>
+<pre>
+Name: <B>defaultRing</B>
+Class: <B>DefaultRing</B>
+Command-Line Switch: <B>-defaultring</B>
+</pre>
+<UL>
+Boolean describing whether the button displays its default ring given in
+any of the forms acceptable to <B>Tcl_GetBoolean</B>. The default is false.
+</UL>
+<P>
+<pre>
+Name: <B>defaultRingPad</B>
+Class: <B>Pad</B>
+Command-Line Switch: <B>-defaultringpad</B>
+</pre>
+<UL>
+Specifies the amount of space to be allocated to the indentation of the
+default ring ring given in any of the forms acceptable to <B>Tcl_GetPixels</B>.
+The option has no effect if the defaultring option is set to false. The
+default is 2 pixels.
+</UL>
+<P>
+<pre>
+Name: <B>height</B>
+Class: <B>Height</B>
+Command-Line Switch: <B>-height</B>
+</pre>
+<UL>
+Specifies the height of the button inclusive of any default ring given in
+any of the forms acceptable to <B>Tk_GetPixels</B>. A value of zero lets
+the push button determine the height based on the requested height plus
+highlightring and defaultringpad.
+</UL>
+<P>
+<pre>
+Name: <B>width</B>
+Class: <B>Width</B>
+Command-Line Switch: <B>-width</B>
+</pre>
+<UL>
+Specifies the width of the button inclusive of any default ring given in
+any of the forms acceptable to <B>Tk_GetPixels</B>. A value of zero lets
+the push button determine the width based on the requested width plus
+highlightring and defaultringpad.
+</UL>
+<P>
+</pre><HR>
+
+</pre><H2>DESCRIPTION</H2>
+<P>
+The <B>pushbutton</B> command creates a push button with an
+optional default ring used for default designation and traversal.
+
+</pre><H2>METHODS</H2>
+<P>
+The <B>pushbutton</B> command creates a new Tcl command whose
+name is <I>pathName</I>. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+<pre>
+<I>pathName option </I>?<I>arg arg ...</I>?
+</pre>
+<I>Option</I> and the <I>arg</I>s
+determine the exact behavior of the command. The following
+commands are possible for pushbutton widgets:
+</pre><H2>ASSOCIATED METHODS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>flash</B><br>
+</td>
+<td valign=top>
+<B>invoke</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/button.n.html"> "button" </A> manual entry for details on the associated methods.
+
+</pre><H2>WIDGET-SPECIFIC METHODS</H2>
+<DL>
+<DT> <I>pathName <B>cget</B> <I>option</I>
+</I></B>
+<DD> Returns the current value of the configuration option given
+by <I>option</I>.
+<I>Option</I> may have any of the values accepted by the <B>pushbutton</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>configure</B> ?<I>option</I>? ?<I>value option value ...</I>?
+</I></B>
+<DD> Query or modify the configuration options of the widget.
+If no <I>option</I> is specified, returns a list describing all of
+the available options for <I>pathName</I> (see <B>Tk_ConfigureInfo</B> for
+information on the format of this list). If <I>option</I> is specified
+with no <I>value</I>, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no <I>option</I> is specified). If
+one or more <I>option-value</I> pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+<I>Option</I> may have any of the values accepted by the <B>pushbutton</B>
+command.
+
+</DL>
+</pre><H2>COMPONENTS</H2>
+<P>
+<pre>
+Name: <B>pushbutton</B>
+Class: <B>Button</B>
+</pre>
+<UL>
+The pushbutton component is the button surrounded by the optional default ring.
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/button.n.html"> "button" </A> widget manual entry for details on the pushbutton
+component item.
+</UL>
+</table>
+
+</pre><H2>EXAMPLE</H2>
+<pre>
+pushbutton .pb -text "Hello" -command {puts "Hello World"} -defaultring 1
+pack .pb -padx 10 -pady 10
+</pre>
+</pre><H2>AUTHOR</H2>
+Bret A. Schuhmacher
+<P>
+Mark L. Ulferts
+</pre><H2>KEYWORDS</H2>
+pushbutton, widget
diff --git a/iwidgets/demos/html/radiobox.n.html b/iwidgets/demos/html/radiobox.n.html
new file mode 100644
index 00000000000..b5d45c5773a
--- /dev/null
+++ b/iwidgets/demos/html/radiobox.n.html
@@ -0,0 +1,211 @@
+<TITLE>radiobox - Create and manipulate a radiobox widget</TITLE>
+<H1>radiobox - Create and manipulate a radiobox widget</H1>
+
+</pre><H2>SYNOPSIS</H2>
+<B>radiobox<I> <I>pathName </I>?<I>options</I>?
+</pre><H2>INHERITANCE</H2>
+itk::Widget &lt;- labeledframe &lt;- radiobox
+</pre><H2>STANDARD OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>background</B><br>
+<B>foreground</B><br>
+</td>
+<td valign=top>
+<B>borderWidth</B><br>
+<B>relief</B><br>
+</td>
+<td valign=top>
+<B>cursor</B><br>
+<B>selectColor</B><br>
+</td>
+<td valign=top>
+<B>disabledForeground</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/options.n.html"> "options" </A> manual entry for details on the standard options.
+</pre><H2>INHERITED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>labelBitmap</B><br>
+<B>labelPos</B><br>
+</td>
+<td valign=top>
+<B>labelFont</B><br>
+<B>labelText</B><br>
+</td>
+<td valign=top>
+<B>labelImage</B><br>
+<B>labelVariable</B><br>
+</td>
+<td valign=top>
+<B>labelMargin</B><br>
+</td>
+</table>
+<P>
+See the "labeledframe" class manual entry for details on the
+inherited options.
+</pre><H2>WIDGET-SPECIFIC OPTIONS</H2>
+<P>
+<pre>
+Name: <B>command</B>
+Class: <B>Command</B>
+Command-Line Switch: <B>-command</B>
+</pre>
+<UL>
+Specifies a Tcl command procedure to be evaluated following a change in
+the current radio box selection.
+</UL>
+<P>
+</pre><HR>
+
+</pre><H2>DESCRIPTION</H2>
+<P>
+The <B>radiobox</B> command creates a radio button box widget
+capable of adding, inserting, deleting, selecting, and configuring
+radiobuttons as well as obtaining the currently selected button.
+
+</pre><H2>METHODS</H2>
+<P>
+The <B>radiobox</B> command creates a new Tcl command whose
+name is <I>pathName</I>. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+<pre>
+<I>pathName option </I>?<I>arg arg ...</I>?
+</pre>
+<I>Option</I> and the <I>arg</I>s
+determine the exact behavior of the command.
+<P>
+Many of the widget commands for the <B>radiobox</B> take as one argument an
+indicator of which radiobutton of the radiobox to operate on. These indicators
+are called <I>indexes</I> and allow reference and manipulation of radiobuttons.
+Radiobox indexes may be specified in any of the following forms:
+<DL>
+<DT> <I>number</I>
+</I></B>
+<DD> Specifies the radiobutton numerically, where 0 corresponds to the top
+radiobutton of the radiobox.
+</DL>
+<DL>
+<DT> <B>end</B>
+</I></B>
+<DD> Indicates the last radiobutton of the radiobox.
+</DL>
+<DL>
+<DT> <I>pattern</I>
+</I></B>
+<DD> If the index doesn't satisfy one of the above forms then this
+form is used. <I>Pattern</I> is pattern-matched against the tag of
+each radiobutton in the radiobox, in order from top to bottom,
+until a matching entry is found. The rules of <B>Tcl_StringMatch</B>
+are used.
+
+</DL>
+</pre><H2>WIDGET-SPECIFIC METHODS</H2>
+<DL>
+<DT> <I>pathName <B>add</B> <I>tag</I> ?<I>option value option value</I>?
+</I></B>
+<DD> Adds a new radiobutton to the radiobuttond window on the bottom. The command
+takes additional options which are passed on to the radiobutton as construction
+arguments. These include the standard Tk radiobutton options. The tag is
+returned.
+</DL>
+<DL>
+<DT> <I>pathName <B>buttonconfigure</B> <I>index</I> ?<I>options</I>?
+</I></B>
+<DD> This command is similar to the <B>configure</B> command, except that
+it applies to the options for an individual radiobutton,
+whereas <B>configure</B>applies to the options for the radiobox as a whole.
+<I>Options</I> may have any of the values accepted by the <B>add</B>
+widget command. If <I>options</I> are specified, options are modified
+as indicated in the command and the command returns an empty string.
+If no <I>options</I> are specified, returns a list describing
+the current options for entry <I>index</I> (see <B>Tk_ConfigureInfo</B> for
+information on the format of this list).
+</DL>
+<DL>
+<DT> <I>pathName <B>cget</B> <I>option</I>
+</I></B>
+<DD> Returns the current value of the configuration option given
+by <I>option</I>.
+<I>Option</I> may have any of the values accepted by the <B>radiobox</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>configure</B> ?<I>option</I>? ?<I>value option value ...</I>?
+</I></B>
+<DD> Query or modify the configuration options of the widget.
+If no <I>option</I> is specified, returns a list describing all of
+the available options for <I>pathName</I> (see <B>Tk_ConfigureInfo</B> for
+information on the format of this list). If <I>option</I> is specified
+with no <I>value</I>, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no <I>option</I> is specified). If
+one or more <I>option-value</I> pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+<I>Option</I> may have any of the values accepted by the <B>radiobox</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName <B>delete</B> <I>index</I>
+</I></B>
+<DD> Deletes a specified radiobutton given an <I>index</I>.
+</DL>
+<DL>
+<DT> <I>pathName <B>deselect</B> <I>index</I>
+</I></B>
+<DD> Deselects a specified radiobutton given an <I>index</I>.
+</DL>
+<DL>
+<DT> <I>pathName <B>flash</B> <I>index</I>
+</I></B>
+<DD> Flashes a specified radiobutton given an <I>index</I>.
+</DL>
+<DL>
+<DT> <I>pathName <B>get</B>
+</I></B>
+<DD> Returns the tag of the currently selected radiobutton.
+</DL>
+<DL>
+<DT> <I>pathName <B>index</B> <I>index</I>
+</I></B>
+<DD> Returns the numerical index corresponding to index.
+</DL>
+<DL>
+<DT> <I>pathName <B>insert <I>index</I> <I>tag</I> ?<I>option value option value ...</I>?
+</I></B>
+<DD> Same as the <B>add</B> command except that it inserts the new
+radiobutton just before the one given by <I>index</I>, instead of appending
+to the end of the radiobox. The <I>option</I>, and <I>value</I>
+arguments have the same interpretation as for the <B>add</B> widget
+command.
+</DL>
+<DL>
+<DT> <I>pathName <B>select</B> <I>index</I>
+</I></B>
+<DD> Selects a specified radiobutton given an <I>index</I>.
+
+</DL>
+</pre><H2>EXAMPLE</H2>
+<pre>
+ radiobox .rb -labeltext Fonts
+ .rb add times -text Times
+ .rb add helvetica -text Helvetica
+ .rb add courier -text Courier
+ .rb add symbol -text Symbol
+ .rb select courier
+
+ pack .rb -padx 10 -pady 10 -fill both -expand yes
+</pre>
+
+</pre><H2>AUTHORS</H2>
+Michael J. McLennan
+<P>
+Mark L. Ulferts
+</pre><H2>KEYWORDS</H2>
+radiobox, widget
diff --git a/iwidgets/demos/html/scopedobject.n.html b/iwidgets/demos/html/scopedobject.n.html
new file mode 100644
index 00000000000..a89effceaea
--- /dev/null
+++ b/iwidgets/demos/html/scopedobject.n.html
@@ -0,0 +1,96 @@
+<TITLE>scopedobject - Create and manipulate a scoped \[incr Tcl\] class object.</TITLE>
+<H1>scopedobject - Create and manipulate a scoped \[incr Tcl\] class object.</H1>
+
+</pre><H2>SYNOPSIS</H2>
+<B>scopedobject<I> <I>objName </I>?<I>options</I>?
+</pre><H2>INHERITANCE</H2>
+None
+</pre><H2>STANDARD OPTIONS</H2>
+<P>
+<pre>
+Name: <B>enterscopecommand:</B>
+Command-Line Switch: <B>-enterscopecommand</B>
+</pre>
+<UL>
+Specifies a Tcl command to invoke when an object enters scope
+(i.e. when it is created..). The default is {}.
+</UL>
+<P>
+<pre>
+Name: <B>enterscopecommand:</B>
+Command-Line Switch: <B>-enterscopecommand</B>
+</pre>
+<UL>
+Specifies a Tcl command to invoke when an object exits scope
+(i.e. when it is deleted..). The default is {}.
+</UL>
+<P>
+</pre><HR>
+
+</pre><H2>DESCRIPTION</H2>
+<P>
+The <B>scopedobject</B> command creates a base class for defining
+Itcl classes which posses scoped behavior like Tcl variables.
+The objects are only accessible within the procedure in which
+they are instantiated and are deleted when the procedure returns.
+This class was designed to be a general purpose base class for
+supporting scoped incr Tcl classes. The options include the
+execute a Tcl script command when an object enters and exits its
+scope.
+</pre><H2>METHODS</H2>
+<P>
+The <B>scopedobject</B> command creates a new Tcl command whose
+name is <I>pathName</I>. This
+command may be used to invoke various operations on the object.
+It has the following general form:
+<pre>
+<I>pathName option </I>?<I>arg arg ...</I>?
+</pre>
+<I>Option</I> and the <I>arg</I>s
+determine the exact behavior of the command. The following
+commands are possible for scopedobject objects:
+</pre><H2>OBJECT-SPECIFIC METHODS</H2>
+<DL>
+<DT> <I>pathName <B>cget</B> <I>option</I>
+</I></B>
+<DD> Returns the current value of the configuration option given
+by <I>option</I>.
+<I>Option</I> may have any of the values accepted by the <B>scopedobject</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>configure</B> ?<I>option</I>? ?<I>value option value ...</I>?
+</I></B>
+<DD> Query or modify the configuration options of the object.
+If no <I>option</I> is specified, returns a list describing all of
+the available options for <I>pathName</I>. If <I>option</I> is specified
+with no <I>value</I>, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no <I>option</I> is specified). If
+one or more <I>option-value</I> pairs are specified, then the command
+modifies the given objects option(s) to have the given value(s); in
+this case the command returns an empty string.
+<I>Option</I> may have any of the values accepted by the <B>scopedobject</B>
+command.
+
+</DL>
+</pre><H2>EXAMPLE</H2>
+<UL>
+The scopedobject was primarily meant to be a base class. The
+following is an example of usage without inheritance:
+</UL>
+<P>
+<pre>
+ proc scopedobject_demo {} {
+ scopedobject #auto \
+ -exitscopecommand {puts "enter scopedobject_demo"} \
+ -exitscopecommand {puts "exit scopedobject_demo"}
+ }
+
+ scopedobject_demo
+
+</pre>
+</pre><H2>AUTHOR</H2>
+John A. Tucker
+</pre><H2>KEYWORDS</H2>
+scopedobject, object
diff --git a/iwidgets/demos/html/scrolledcanvas.n.html b/iwidgets/demos/html/scrolledcanvas.n.html
new file mode 100644
index 00000000000..95e019d5967
--- /dev/null
+++ b/iwidgets/demos/html/scrolledcanvas.n.html
@@ -0,0 +1,343 @@
+<TITLE>scrolledcanvas - Create and manipulate scrolled canvas widgets</TITLE>
+<H1>scrolledcanvas - Create and manipulate scrolled canvas widgets</H1>
+
+</pre><H2>SYNOPSIS</H2>
+<B>scrolledcanvas<I> <I>pathName </I>?<I>options</I>?
+</pre><H2>INHERITANCE</H2>
+itk::Widget &lt;- Labeledwidget &lt;- Scrolledwidget &lt;- Scrolledcanvas
+</pre><H2>STANDARD OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>activeBackground</B><br>
+<B>exportSelection</B><br>
+<B>highlightThickness</B><br>
+<B>insertWidth</B><br>
+<B>selectForeground</B><br>
+</td>
+<td valign=top>
+<B>background</B><br>
+<B>font</B><br>
+<B>insertBorderWidth</B><br>
+<B>relief</B><br>
+</td>
+<td valign=top>
+<B>borderWidth</B><br>
+<B>foreground</B><br>
+<B>insertOffTime</B><br>
+<B>selectBackground</B><br>
+</td>
+<td valign=top>
+<B>cursor</B><br>
+<B>highlightColor</B><br>
+<B>insertOnTime</B><br>
+<B>selectBorderWidth</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/options.n.html"> "options" </A> manual entry for details on the standard options.
+</pre><H2>ASSOCIATED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>closeEnough</B><br>
+<B>yScrollIncrement</B><br>
+</td>
+<td valign=top>
+<B>confine</B><br>
+</td>
+<td valign=top>
+<B>scrollRegion</B><br>
+</td>
+<td valign=top>
+<B>xScrollIncrement</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/canvas.n.html"> "canvas" </A> widget manual entry for details on the above
+associated options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>activeRelief</B><br>
+</td>
+<td valign=top>
+<B>elementBorderWidth</B><br>
+</td>
+<td valign=top>
+<B>jump</B><br>
+</td>
+<td valign=top>
+<B>troughColor</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/scrollbar.n.html"> "scrollbar" </A> widget manual entry for details on the above
+associated options.
+</pre><H2>INHERITED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>disabledForeground</B><br>
+<B>labelMargin</B><br>
+<B>state</B><br>
+</td>
+<td valign=top>
+<B>labelBitmap</B><br>
+<B>labelPos</B><br>
+</td>
+<td valign=top>
+<B>labelFont</B><br>
+<B>labelText</B><br>
+</td>
+<td valign=top>
+<B>labelImage</B><br>
+<B>labelVariable</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="labeledwidget.n.html"> "labeledwidget" </A> class manual entry for details on the inherited options.
+</pre><H2>WIDGET-SPECIFIC OPTIONS</H2>
+<P>
+<pre>
+Name: <B>autoMargin</B>
+Class: <B>AutoMargin</B>
+Command-Line Switch: <B>-automargin</B>
+</pre>
+<UL>
+Specifies the autoresize extra margin to reserve. This option is only
+effective with autoresize turned on. The default is 10.
+</UL>
+<P>
+<pre>
+Name: <B>autoResize</B>
+Class: <B>AutoResize</B>
+Command-Line Switch: <B>-autoresize</B>
+</pre>
+<UL>
+Automatically adjusts the scrolled region to be the bounding
+box covering all the items in the canvas following the execution
+of any method which creates or destroys items. Thus, as new
+items are added, the scrollbars adjust accordingly.
+</UL>
+<P>
+<pre>
+Name: <B>height</B>
+Class: <B>Height</B>
+Command-Line Switch: <B>-height</B>
+</pre>
+<UL>
+Specifies the height of the scrolled canvas widget in any of the forms
+acceptable to <B>Tk_GetPixels</B>. The default height is 30 pixels.
+</UL>
+<P>
+<pre>
+Name: <B>hscrollMode</B>
+Class: <B>ScrollMode</B>
+Command-Line Switch: <B>-hscrollmode</B>
+</pre>
+<UL>
+Specifies the the display mode to be used for the horizontal
+scrollbar: <B>static, dynamic,</B> or <B>none</B>. In static mode, the
+scroll bar is displayed at all times. Dynamic mode displays the
+scroll bar as required, and none disables the scroll bar display. The
+default is static.
+</UL>
+<P>
+<pre>
+Name: <B>sbWidth</B>
+Class: <B>Width</B>
+Command-Line Switch: <B>-sbwidth</B>
+</pre>
+<UL>
+Specifies the width of the scrollbar in any of the forms acceptable
+to <B>Tk_GetPixels</B>. The default width is 15 pixels..
+</UL>
+<P>
+<pre>
+Name: <B>scrollMargin</B>
+Class: <B>ScrollMargin</B>
+Command-Line Switch: <B>-scrollmargin</B>
+</pre>
+<UL>
+Specifies the distance between the canvas and scrollbar in any of the
+forms acceptable to <B>Tk_GetPixels</B>. The default is 3 pixels.
+</UL>
+<P>
+<pre>
+Name: <B>textBackground</B>
+Class: <B>Background</B>
+Command-Line Switch <B>-textbackground</B>
+</pre>
+<UL>
+Specifies the background color for the canvas. This allows the background
+within the canvas to be different from the normal background color.
+</UL>
+<P>
+<pre>
+Name: <B>vscrollMode</B>
+Class: <B>ScrollMode</B>
+Command-Line Switch: <B>-vscrollmode</B>
+</pre>
+<UL>
+Specifies the the display mode to be used for the vertical
+scrollbar: <B>static, dynamic,</B> or <B>none</B>. In static mode, the
+scroll bar is displayed at all times. Dynamic mode displays the
+scroll bar as required, and none disables the scroll bar display. The
+default is static.
+</UL>
+<P>
+<pre>
+Name: <B>width</B>
+Class: <B>Width</B>
+Command-Line Switch: <B>-width</B>
+</pre>
+<UL>
+Specifies the width of the scrolled canvas widget in any of the forms
+acceptable to <B>Tk_GetPixels</B>. The default height is 30 pixels.
+</UL>
+</pre><HR>
+
+</pre><H2>DESCRIPTION</H2>
+<P>
+The <B>scrolledcanvas</B> command creates
+a scrolled canvas with additional options to manage
+horizontal and vertical scrollbars. This includes options to control
+which scrollbars are displayed and the method, i.e. statically or
+dynamically.
+
+</pre><H2>METHODS</H2>
+<P>
+The <B>scrolledcanvas</B> command creates a new Tcl command whose
+name is <I>pathName</I>. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+<pre>
+<I>pathName option </I>?<I>arg arg ...</I>?
+</pre>
+<I>Option</I> and the <I>arg</I>s
+determine the exact behavior of the command. The following
+commands are possible for scrolledcanvas widgets:
+</pre><H2>ASSOCIATED METHODS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>addtag</B><br>
+<B>canvasy<B><br>
+<B>delete</B><br>
+<B>gettags</B><br>
+<B>itemconfigure</B><br>
+<B>raise</B><br>
+<B>type</B><br>
+</td>
+<td valign=top>
+<B>bbox</B><br>
+<B>coords</B><br>
+<B>dtag</B><br>
+<B>icursor</B><br>
+<B>lower</B><br>
+<B>scale</B><br>
+<B>xview</B><br>
+</td>
+<td valign=top>
+<B>bind</B><br>
+<B>create</B><br>
+<B>find</B><br>
+<B>index</B><br>
+<B>move</B><br>
+<B>scan</B><br>
+<B>yview</B><br>
+</td>
+<td valign=top>
+<B>canvasx</B><br>
+<B>dchars</B><br>
+<B>focus</B><br>
+<B>insert</B><br>
+<B>postscript</B><br>
+<B>select</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/canvas.n.html"> "canvas" </A> manual entry for details on the associated methods.
+
+</pre><H2>WIDGET-SPECIFIC METHODS</H2>
+<DL>
+<DT> <I>pathName <B>cget</B> <I>option</I>
+</I></B>
+<DD> Returns the current value of the configuration option given
+by <I>option</I>.
+<I>Option</I> may have any of the values accepted by the <B>scrolledcanvas</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName <B>childsite</B>
+</I></B>
+<DD> Returns the child site widget path name.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>configure</B> ?<I>option</I>? ?<I>value option value ...</I>?
+</I></B>
+<DD> Query or modify the configuration options of the widget.
+If no <I>option</I> is specified, returns a list describing all of
+the available options for <I>pathName</I> (see <B>Tk_ConfigureInfo</B> for
+information on the format of this list). If <I>option</I> is specified
+with no <I>value</I>, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no <I>option</I> is specified). If
+one or more <I>option-value</I> pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+<I>Option</I> may have any of the values accepted by the <B>scrolledcanvas</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName <B>justify <I>direction</I>
+</I></B>
+<DD> Justifies the canvas contents via the scroll bars in one of four directions:
+<B>left</B>, <B>right</B>, <B>top</B>, or <B>bottom</B>.
+
+</DL>
+</pre><H2>COMPONENTS</H2>
+<P>
+<pre>
+Name: <B>canvas</B>
+Class: <B>Canvas</B>
+</pre>
+<UL>
+The canvas component is the canvas widget. See the "canvas" widget
+manual entry for details on the canvas component item.
+</UL>
+<P>
+<pre>
+Name: <B>horizsb</B>
+Class: <B>Scrollbar</B>
+</pre>
+<UL>
+The horizsb component is the horizontal scroll bar. See the "ScrollBar"
+widget manual entry for details on the horizsb component item.
+</UL>
+<P>
+<pre>
+Name: <B>vertsb</B>
+Class: <B>Scrollbar</B>
+</pre>
+<UL>
+The vertsb component is the vertical scroll bar. See the "ScrollBar" widget
+manual entry for details on the vertsb component item.
+</UL>
+</table>
+
+</pre><H2>EXAMPLE</H2>
+<pre>
+ scrolledcanvas .sc
+
+ .sc create rectangle 100 100 400 400 -fill red
+ .sc create rectangle 300 300 600 600 -fill green
+ .sc create rectangle 200 200 500 500 -fill blue
+
+ pack .sc -padx 10 -pady 10 -fill both -expand yes
+</pre>
+</pre><H2>AUTHOR</H2>
+Mark L. Ulferts
+</pre><H2>KEYWORDS</H2>
+scrolledcanvas, canvas, widget
diff --git a/iwidgets/demos/html/scrolledframe.n.html b/iwidgets/demos/html/scrolledframe.n.html
new file mode 100644
index 00000000000..470b4a07a66
--- /dev/null
+++ b/iwidgets/demos/html/scrolledframe.n.html
@@ -0,0 +1,258 @@
+<TITLE>scrolledframe - Create and manipulate scrolled frame widgets</TITLE>
+<H1>scrolledframe - Create and manipulate scrolled frame widgets</H1>
+
+</pre><H2>SYNOPSIS</H2>
+<B>scrolledframe<I> <I>pathName </I>?<I>options</I>?
+</pre><H2>INHERITANCE</H2>
+itk::Widget &lt;- Labeledwidget &lt;-Scrolledwidget &lt;- Scrolledframe
+</pre><H2>STANDARD OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>activeBackground</B><br>
+<B>font</B><br>
+<B>relief</B><br>
+</td>
+<td valign=top>
+<B>background</B><br>
+<B>foreground</B><br>
+<B>selectBackground</B><br>
+</td>
+<td valign=top>
+<B>borderWidth</B><br>
+<B>highlightColor</B><br>
+<B>selectBorderWidth</B><br>
+</td>
+<td valign=top>
+<B>cursor</B><br>
+<B>highlightThickness</B><br>
+<B>selectForeground</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/options.n.html"> "options" </A> manual entry for details on the standard options.
+</pre><H2>ASSOCIATED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>activeRelief</B><br>
+</td>
+<td valign=top>
+<B>elementBorderWidth</B><br>
+</td>
+<td valign=top>
+<B>jump</B><br>
+</td>
+<td valign=top>
+<B>troughColor</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/scrollbar.n.html"> "scrollbar" </A> manual entry for details on the associated options.
+</pre><H2>INHERITED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>LabelBitmap</B><br>
+<B>labelPos</B><br>
+</td>
+<td valign=top>
+<B>labelFont</B><br>
+<B>labelText</B><br>
+</td>
+<td valign=top>
+<B>labelImage</B><br>
+<B>labelVariable</B><br>
+</td>
+<td valign=top>
+<B>labelMargin</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="labeledwidget.n.html"> "labeledwidget" </A> class manual entry for details on the inherited options.
+</pre><H2>WIDGET-SPECIFIC OPTIONS</H2>
+<P>
+<pre>
+Name: <B>height</B>
+Class: <B>Height</B>
+Command-Line Switch: <B>-height</B>
+</pre>
+<UL>
+Specifies the height of the scrolled frame widget in any of the forms acceptable to <B>Tk_GetPixels</B>. The default height is 100 pixels.
+</UL>
+<P>
+<pre>
+Name: <B>hscrollMode</B>
+Class: <B>ScrollMode</B>
+Command-Line Switch: <B>-hscrollmode</B>
+</pre>
+<UL>
+Specifies the the display mode to be used for the horizontal
+scrollbar: <B>static</B>, <B>dynamic</B>, or <B>none</B>. In static mode, the
+scroll bar is displayed at all times. Dynamic mode displays the
+scroll bar as required, and none disables the scroll bar display. The
+default is static.
+</UL>
+<P>
+<pre>
+Name: <B>sbWidth</B>
+Class: <B>Width</B>
+Command-Line Switch: <B>-sbwidth</B>
+</pre>
+<UL>
+Specifies the width of the scrollbar in any of the forms acceptable
+to <B>Tk_GetPixels</B>. The default width is 15 pixels.
+</UL>
+<P>
+<pre>
+Name: <B>scrollMargin</B>
+Class: <B>Margin</B>
+Command-Line Switch: <B>-scrollmargin</B>
+</pre>
+<UL>
+Specifies the distance between the frame and scrollbar in any of the
+forms acceptable to <B>Tk_GetPixels</B>. The default is 3 pixels.
+</UL>
+<P>
+<pre>
+Name: <B>vscrollMode</B>
+Class: <B>ScrollMode</B>
+Command-Line Switch: <B>-vscrollmode</B>
+</pre>
+<UL>
+Specifies the the display mode to be used for the vertical
+scrollbar: <B>static</B>, <B>dynamic</B>, or <B>none</B>. In static mode, the
+scroll bar is displayed at all times. Dynamic mode displays the
+scroll bar as required, and none disables the scroll bar display. The
+default is static.
+</UL>
+<P>
+<pre>
+Name: <B>width</B>
+Class: <B>Width</B>
+Command-Line Switch: <B>-width</B>
+</pre>
+<UL>
+Specifies the width of the scrolled frame widget in any of the forms
+acceptable to <B>Tk_GetPixels</B>. The default height is 100 pixels.
+</UL>
+</pre><HR>
+
+</pre><H2>DESCRIPTION</H2>
+<P>
+The <B>scrolledframe</B> combines the functionallity of scrolling with that
+of a typical frame widget to implement a clipable viewing area whose visible
+region may be modified with the scroll bars. This enables the contruction
+of visually larger areas than which could normally be displayed, containing
+a heterogenous mix of other widgets. Options exist which allow full control
+over which scrollbars are displayed and the method, i.e. statically or
+dynamically. The frame itself may be accessed by the <B>childsite</B>
+method and then filled with other widget combinations.
+
+</pre><H2>METHODS</H2>
+<P>
+The <B>scrolledframe</B> command creates a new Tcl command whose
+name is <I>pathName</I>. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+<pre>
+<I>pathName option </I>?<I>arg arg ...</I>?
+</pre>
+<I>Option</I> and the <I>arg</I>s
+determine the exact behavior of the command. The following
+commands are possible for scrolledframe widgets:
+</pre><H2>ASSOCIATED METHODS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>xview</B><br>
+</td>
+<td valign=top>
+<B>yview</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/canvas.n.html"> "canvas" </A> manual entry for details on the associated methods.
+
+</pre><H2>WIDGET-SPECIFIC METHODS</H2>
+<DL>
+<DT> <I>pathName <B>cget</B> <I>option</I>
+</I></B>
+<DD> Returns the current value of the configuration option given
+by <I>option</I>.
+<I>Option</I> may have any of the values accepted by the <B>scrolledframe</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName <B>childsite</B>
+</I></B>
+<DD> Return the path name of the child site.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>configure</B> ?<I>option</I>? ?<I>value option value ...</I>?
+</I></B>
+<DD> Query or modify the configuration options of the widget.
+If no <I>option</I> is specified, returns a list describing all of
+the available options for <I>pathName</I> (see <B>Tk_ConfigureInfo</B> for
+information on the format of this list). If <I>option</I> is specified
+with no <I>value</I>, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no <I>option</I> is specified). If
+one or more <I>option-value</I> pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+<I>Option</I> may have any of the values accepted by the <B>scrolledframe</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName <B>justify <I>direction</I>
+</I></B>
+<DD> Justifies the frame contents via the scroll bars in one of four directions:
+<B>left</B>, <B>right</B>, <B>top</B>, or <B>bottom</B>.
+
+</DL>
+</pre><H2>COMPONENTS</H2>
+<P>
+<pre>
+Name: <B>horizsb</B>
+Class: <B>Scrollbar</B>
+</pre>
+<UL>
+The horizsb component is the horizontal scroll bar. See the "ScrollBar"
+widget manual entry for details on the horizsb component item.
+</UL>
+<P>
+<pre>
+Name: <B>vertsb</B>
+Class: <B>Scrollbar</B>
+</pre>
+<UL>
+The vertsb component is the vertical scroll bar. See the "ScrollBar" widget
+manual entry for details on the vertsb component item.
+</UL>
+</table>
+
+</pre><H2>EXAMPLE</H2>
+<pre>
+scrolledframe .sf -width 150 -height 180 -labelon yes -labeltext scrolledframe
+
+set cs [.sf childsite]
+pack [button $cs.b1 -text Hello] -pady 10
+pack [button $cs.b2 -text World] -pady 10
+pack [button $cs.b3 -text "This is a test"] -pady 10
+pack [button $cs.b4 -text "This is a really big button"] -pady 10
+pack [button $cs.b5 -text "This is another really big button"] -pady 10
+pack [button $cs.b6 -text "This is the last really big button"] -pady 10
+
+pack .sf -expand yes -fill both -padx 10 -pady 10
+</pre>
+</pre><H2>AUTHORS</H2>
+Mark L. Ulferts
+<P>
+Sue Yockey
+</pre><H2>KEYWORDS</H2>
+scrolledframe, frame, widget
diff --git a/iwidgets/demos/html/scrolledhtml.n.html b/iwidgets/demos/html/scrolledhtml.n.html
new file mode 100644
index 00000000000..331a4ebb1f8
--- /dev/null
+++ b/iwidgets/demos/html/scrolledhtml.n.html
@@ -0,0 +1,406 @@
+<TITLE>scrolledhtml - Create and manipulate a scrolled text widget with the capability</TITLE>
+<H1>scrolledhtml - Create and manipulate a scrolled text widget with the capability</H1>
+
+of displaying HTML formatted documents.
+</pre><H2>SYNOPSIS</H2>
+<B>scrolledhtml<I> <I>pathName </I>?<I>options</I>?
+</pre><H2>INHERITANCE</H2>
+itk::Widget &lt;- Labeledwidget &lt;- Scrolledtext &lt;- Scrolledhtml
+</pre><H2>STANDARD OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>activeBackground</B><br>
+<B>exportSelection</B><br>
+<B>insertBackground</B><br>
+<B>insertWidth</B><br>
+<B>repeatDelay</B><br>
+<B>selectForeground</B><br>
+</td>
+<td valign=top>
+<B>background</B><br>
+<B>foreground</B><br>
+<B>insertBorderWidth</B><br>
+<B>padX</B><br>
+<B>repeatInterval</B><br>
+<B>setGrid</B><br>
+</td>
+<td valign=top>
+<B>borderWidth</B><br>
+<B>highlightColor</B><br>
+<B>insertOffTime</B><br>
+<B>padY</B><br>
+<B>selectBackground</B><br>
+</td>
+<td valign=top>
+<B>cursor</B><br>
+<B>highlightThickness</B><br>
+<B>insertOnTime</B><br>
+<B>relief</B><br>
+<B>selectBorderWidth</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/options.n.html"> "options" </A> manual entry for details on the standard options.
+</pre><H2>ASSOCIATED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>activeRelief</B><br>
+</td>
+<td valign=top>
+<B>elementBorderWidth</B><br>
+</td>
+<td valign=top>
+<B>jump</B><br>
+</td>
+<td valign=top>
+<B>troughColor</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/scrollbar.n.html"> "scrollbar" </A> widget manual entry for details on the above
+associated options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>spacing1</B><br>
+<B>tabs</B><br>
+</td>
+<td valign=top>
+<B>spacing2</B><br>
+<B>wrap</B><br>
+</td>
+<td valign=top>
+<B>spacing3</B><br>
+</td>
+<td valign=top>
+<B>state</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/text.n.html"> "text" </A> widget manual entry for details on the above
+associated options.
+</pre><H2>INHERITED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>labelBitmap</B><br>
+<B>labelPos</B><br>
+<B>hscrollMode</B><br>
+<B>vscrollMode</B><br>
+</td>
+<td valign=top>
+<B>labelFont</B><br>
+<B>labelText</B><br>
+<B>sbWidth</B><br>
+<B>width</B><br>
+</td>
+<td valign=top>
+<B>labelImage</B><br>
+<B>labelVariable</B><br>
+<B>scrollMargin</B><br>
+</td>
+<td valign=top>
+<B>labelMargin</B><br>
+<B>height</B><br>
+<B>visibleitems</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="scrolledtext.n.html"> "scrolledtext" </A> class manual entry for details on the inherited options.
+</pre><H2>WIDGET-SPECIFIC OPTIONS</H2>
+<P>
+<pre>
+Name: <B>feedback</B>
+Class: <B>FeedBack</B>
+Command-Line Switch: <B>-feedback</B>
+</pre>
+<UL>
+Specifies the callback command to use to give feedback on current
+status. The command is executed in the form <I>command</I> <I>&lt;number of
+characters remaining&gt;</B></I>
+</UL>
+<P>
+<pre>
+Name: <B>fixedfont</B>
+Class: <B>FixedFont</B>
+Command-Line Switch: <B>-fixedfont</B>
+</pre>
+<UL>
+Specifies the name of the font to be used for fixed-width character
+text (such as &lt;pre&gt;...&lt;/pre&gt; or &lt;tt&gt;...&lt;/tt&gt;.) The size, style, and
+other font attributes are determined by the format tags in the
+document. The default is courier.
+</UL>
+<P>
+<pre>
+Name: <B>fontname</B>
+Class: <B>FontName</B>
+Command-Line Switch: <B>-fontname</B>
+</pre>
+<UL>
+Specifies the name of the font to be used for normal-width character
+spaced text. The size, style, and other font attributes are
+determined by the format tags in the document. The default is times.
+</UL>
+<P>
+<pre>
+Name: <B>fontsize</B>
+Class: <B>FontSize</B>
+Command-Line Switch: <B>-fontsize</B>
+</pre>
+<UL>
+Specifies the general size of the fonts used. One of small, medium,
+large, or huge. The default is medium.
+</UL>
+<P>
+<pre>
+Name: <B>foreground</B>
+Class: <B>Foreground</B>
+Command-Line Switch: <B>-foreground</B>
+</pre>
+<UL>
+Specifies the color of text other than hypertext links, in any
+of the forms acceptable to <B>Tk_GetColor</B>. This value may
+be overridden in a particular document by the <I>text</I> attribute
+of the <B>Body</B> HTML tag.
+</UL>
+<P>
+<pre>
+Name: <B>link</B>
+Class: <B>Link</B>
+Command-Line Switch: <B>-link</B>
+</pre>
+<UL>
+Specifies the default color of hypertext links in any of the forms
+acceptable to <B>Tk_GetColor</B>. This value may be overridden in a
+particular document by the <I>link</I> attribute of the <B>Body</B>
+HTML tag. The default is blue.
+</UL>
+<P>
+<pre>
+Name: <B>linkcommand</B>
+Class: <B>LinkCommand</B>
+Command-Line Switch: <B>-linkcommand</B>
+</pre>
+<UL>
+Specifies the command to execute when the user clicks on a hypertext
+link. Execution is of the form <B>linkcommand href</B>, where <B>href</B> is
+the value given in the <I>href</I> attribute of the <B>A</B> HTML tag.
+</UL>
+<P>
+<pre>
+Name: <B>alink</B>
+Class: <B>alink</B>
+Command-Line Switch: <B>-alink</B>
+</pre>
+<UL>
+Specifies the color of hypertext links when the cursor is over the link
+in any of the forms acceptable to <B>Tk_GetColor</B>. The default is red.
+</UL>
+<P>
+<pre>
+Name: <B>textBackground</B>
+Class: <B>Background</B>
+Command-Line Switch: <B>-textbackground</B>
+</pre>
+<UL>
+Specifies the background color for the text area in any of
+the forms acceptable to <B>Tk_GetColor</B>. This value may be
+overridden in a particular document by the <I>bgcolor</I> attribute
+of the <B>Body</B> HTML tag.
+</UL>
+<P>
+<pre>
+Name: <B>unknownimage</B>
+Class: <B>UnknownImage</B>
+Command-Line Switch: <B>-unknownimage</B>
+</pre>
+<UL>
+Specifies the name of the image file to display when an <B>img</B>
+specified in the html document cannot be loaded.
+</UL>
+<P>
+<pre>
+Name: <B>update</B>
+Class: <B>Update</B>
+Command-Line Switch: <B>-alink</B>
+</pre>
+<UL>
+A boolean value indicating whether to call update during html rendering.
+</UL>
+<P>
+</pre><HR>
+
+</pre><H2>DESCRIPTION</H2>
+<P>
+The <B>scrolledhtml</B> command creates
+a scrolled text widget with the additional capability to display
+html formatted documents.
+An import method is provided to read an html document file, and
+a render method is provided to display a html formatted text string.
+
+</pre><H2>METHODS</H2>
+<P>
+The <B>scrolledhtml</B> command creates a new Tcl command whose
+name is <I>pathName</I>. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+<pre>
+<I>pathName option </I>?<I>arg arg ...</I>?
+</pre>
+<I>Option</I> and the <I>arg</I>s
+determine the exact behavior of the command. The following
+commands are possible for scrolledhtml widgets:
+</pre><H2>ASSOCIATED METHODS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>bbox</B><br>
+<B>dlineinfo</B><br>
+<B>mark</B><br>
+<B>tag</B><br>
+</td>
+<td valign=top>
+<B>compare</B><br>
+<B>get</B><br>
+<B>scan</B><br>
+<B>window</B><br>
+</td>
+<td valign=top>
+<B>debug</B><br>
+<B>index</B><br>
+<B>search</B><br>
+<B>xview</B><br>
+</td>
+<td valign=top>
+<B>delete</B><br>
+<B>insert</B><br>
+<B>see</B><br>
+<B>yview</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/text.n.html"> "text" </A> manual entry for details on the standard methods.
+</pre><H2>INHERITED METHODS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>export</B><br>
+</td>
+<td valign=top>
+<B>clear</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the "scrolledhtml" manual entry for details on the inherited methods.
+
+</pre><H2>WIDGET-SPECIFIC METHODS</H2>
+<DL>
+<DT> <I>pathName <B>cget</B> <I>option</I>
+</I></B>
+<DD> Returns the current value of the configuration option given
+by <I>option</I>.
+<I>Option</I> may have any of the values accepted by the <B>scrolledhtml</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>configure</B> ?<I>option</I>? ?<I>value option value ...</I>?
+</I></B>
+<DD> Query or modify the configuration options of the widget.
+If no <I>option</I> is specified, returns a list describing all of
+the available options for <I>pathName</I> (see <B>Tk_ConfigureInfo</B> for
+information on the format of this list). If <I>option</I> is specified
+with no <I>value</I>, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no <I>option</I> is specified). If
+one or more <I>option-value</I> pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+<I>Option</I> may have any of the values accepted by the <B>scrolledhtml</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>import</B> ?<I>option</I>? <I>href</I>
+</I></B>
+<DD> Load html formatted text from a file. <I>Href</I> must exist.
+If <I>option</I> is -link, <I>href</I> is assumed to be relative
+to the application's current working directory. Otherwise,
+<I>href</I> is assumed to be relative to the path of the last
+page loaded. <I>Href</I> is either a filename, or a reference
+of the form <I>filename</I>#<I>anchorname</I>. In the latter form,
+fIFilename</B></I> and/or <I>anchorname</I> may be empty.
+If <I>filename</I> is empty, the current document is assumed.
+If <I>anchorname</I> is empty, the top of the document is assumed.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>pwd</B>
+</I></B>
+<DD> Print the current working directory of the widget, i.e. the directory of the
+last page loaded.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>render</B> <I>htmltext</I> ?<I>wd</I>?
+</I></B>
+<DD> Display HTML formatted text <I>htmltext</I>. <I>Wd</I> gives the base
+path to use for all links and images in the document. <I>Wd</I> defaults
+to the application's current working directory.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>title</B>
+</I></B>
+<DD> Return the title of the current page, as given in the &lt;title&gt;...&lt;/title&gt;
+field in the document.
+
+</DL>
+</pre><H2>HTML COMPLIANCE</H2>
+<P>
+This widget is compliant with HTML 3.2 with the following exceptions:
+<P>
+No features requiring a connection to an http server are supported.
+<P>
+Some image alignments aren't supported, because they are not supported by
+the text widget.
+<P>
+The &lt;br&gt; attributes dealing with image alignments aren't supported.
+<P>
+Automatic table sizing is not supported very well, due to limitations of the
+text widget
+</UL>
+</pre><H2>EXAMPLE</H2>
+<pre>
+ option add *textBackground white
+
+ scrolledhtml .sh -fontname helvetica -linkcommand "this import -link"
+
+ pack .sh -padx 10 -pady 10 -fill both -expand yes
+
+ .sh import ~/public_html/index.html
+</pre>
+</pre><H2>BUGS</H2>
+<UL>
+Cells in a table can be caused to overlap. ex:
+ &lt;table border width="100%"&gt;
+ &lt;tr&gt;&lt;td&gt;cell1&lt;/td&gt;&lt;td align=right rowspan=2&gt;cell2&lt;/td&gt;&lt;/tr&gt;
+ &lt;tr&gt;&lt;td colspan=2&gt;cell3 w/ overlap&lt;/td&gt;
+ &lt;/table&gt;
+It hasn't been fixed because 1) it's a pain to fix, 2) it will slow
+tables down by a significant amount, and 3) netscape has the same
+bug, as of V3.01.
+</UL>
+</pre><H2>ACKNOWLEDGEMENTS</H2>
+Sam Shen
+<UL>
+This code is based largely on his tkhtml.tcl code from tk inspect. Tkhtml
+is copyright 1995 Lawrence Berkeley Laboratory.
+</UL>
+<P>
+</pre><H2>AUTHOR</H2>
+Kris Raney
+</pre><H2>KEYWORDS</H2>
+scrolledhtml, html, text, widget
diff --git a/iwidgets/demos/html/scrolledlistbox.n.html b/iwidgets/demos/html/scrolledlistbox.n.html
new file mode 100644
index 00000000000..e8bc410193c
--- /dev/null
+++ b/iwidgets/demos/html/scrolledlistbox.n.html
@@ -0,0 +1,452 @@
+<TITLE>iwidgets::scrolledlistbox - Create and manipulate scrolled listbox widgets</TITLE>
+<H1>iwidgets::scrolledlistbox - Create and manipulate scrolled listbox widgets</H1>
+
+</pre><H2>SYNOPSIS</H2>
+<B>iwidgets::scrolledlistbox<I> <I>pathName </I>?<I>options</I>?
+</pre><H2>INHERITANCE</H2>
+itk::Widget &lt;- iwidgets::Labeledwidget &lt;- iwidgets::Scrolledwidget &lt;- iwidgets::Scrolledlistbox
+</pre><H2>STANDARD OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B><br>
+cursor<br>
+highlightThickness<br>
+selectForeground</B></I><br>
+</td>
+<td valign=top>
+activeBackground<br>
+exportSelection<br>
+relief<br>
+</td>
+<td valign=top>
+background<br>
+foreground<br>
+selectBackground<br>
+</td>
+<td valign=top>
+borderWidth<br>
+highlightColor<br>
+selectBorderWidth<br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/options.n.html"> "options" </A> manual entry for details on the standard options.
+</pre><H2>ASSOCIATED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>selectMode</B><br>
+</td>
+<td valign=top>
+<B>listvariable</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/listbox.n.html"> "listbox" </A> widget manual entry for details on the above
+associated options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>activeRelief</B><br>
+</td>
+<td valign=top>
+<B>elementBorderwidth</B><br>
+</td>
+<td valign=top>
+<B>jump</B><br>
+</td>
+<td valign=top>
+<B>troughColor</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/scrollbar.n.html"> "scrollbar" </A> widget manual entry for details on the above
+associated options.
+</pre><H2>INHERITED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>disabledForeground</B><br>
+<B>labelMargin</B><br>
+<B>state</B><br>
+</td>
+<td valign=top>
+<B>labelBitmap</B><br>
+<B>labelPos</B><br>
+<B>sticky</B><br>
+</td>
+<td valign=top>
+<B>labelFont</B><br>
+<B>labelText</B><br>
+</td>
+<td valign=top>
+<B>labelImage</B><br>
+<B>labelVariable</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="labeledwidget.n.html"> "labeledwidget" </A> class manual entry for details on the inherited
+options.
+</pre><H2>WIDGET-SPECIFIC OPTIONS</H2>
+<P>
+<pre>
+Name: <B>dblClickCommand</B>
+Class: <B>Command</B>
+Command-Line Switch: <B>-dblclickcommand</B>
+</pre>
+<UL>
+Specifies a Tcl command procedure which is called when an item is
+double clicked. Typically this occurs when mouse button 1 is double
+clicked over an item. Selection policy does not matter.
+</UL>
+<P>
+<pre>
+Name: <B>height</B>
+Class: <B>Height</B>
+Command-Line Switch: <B>-height</B>
+</pre>
+<UL>
+Specifies the height of the scrolled list box as an entire unit.
+The value may be specified in any of the forms acceptable to
+<B>Tk_GetPixels</B>. Any additional space needed to display the other
+components such as labels, margins, and scrollbars force the listbox
+to be compressed. A value of zero along with the same value for
+the width causes the value given for the visibleitems option
+to be applied which administers geometry constraints in a different
+manner. The default height is zero.
+</UL>
+<P>
+<pre>
+Name: <B>hscrollMode</B>
+Class: <B>ScrollMode</B>
+Command-Line Switch: <B>-hscrollmode</B>
+</pre>
+<UL>
+Specifies the the display mode to be used for the horizontal
+scrollbar: <B>static, dynamic,</B> or <B>none</B>. In static mode, the
+scroll bar is displayed at all times. Dynamic mode displays the
+scroll bar as required, and none disables the scroll bar display. The
+default is static.
+</UL>
+<P>
+<pre>
+Name: <B>sbWidth</B>
+Class: <B>Width</B>
+Command-Line Switch: <B>-sbwidth</B>
+</pre>
+<UL>
+Specifies the width of the scrollbar in any of the forms acceptable
+to <B>Tk_GetPixels</B>. The default width is 15 pixels..
+</UL>
+<P>
+<pre>
+Name: <B>scrollMargin</B>
+Class: <B>Margin</B>
+Command-Line Switch: <B>-scrollmargin</B>
+</pre>
+<UL>
+Specifies the distance between the listbox and scrollbar in any of the
+forms acceptable to <B>Tk_GetPixels</B>. The default is 3 pixels.
+</UL>
+<P>
+<pre>
+Name: <B>selectionCommand</B>
+Class: <B>Command</B>
+Command-Line Switch: <B>-selectioncommand</B>
+</pre>
+<UL>
+Specifies a Tcl command procedure which is called when an item is
+selected. Selection policy does not matter.
+</UL>
+<P>
+<pre>
+Name: <B>state</B>
+Class: <B>State</B>
+Command-Line Switch: <B>-state</B>
+</pre>
+<UL>
+Specifies one of two states for the listbox: <B>normal</B> or <B>disabled</B>.
+If the listbox is disabled then selection is ignored. The default is
+normal.
+</UL>
+<P>
+<pre>
+Name: <B>textBackground</B>
+Class: <B>Background</B>
+Command-Line Switch <B>-textbackground</B>
+</pre>
+<UL>
+Specifies the background color for the listbox. This allows the background
+within the listbox to be different from the normal background color.
+</UL>
+<P>
+<pre>
+Name: <B>textFont</B>
+Class: <B>Font</B>
+Command-Line Switch: <B>-textfont</B>
+</pre>
+<UL>
+Specifies the font to be used for text in the listbox. This allows for
+the font associated with text internal to the scrolled listbox to be
+different than the font for labels.
+</UL>
+<P>
+<pre>
+Name: <B>visibleitems</B>
+Class: <B>VisibleItems</B>
+Command-Line Switch: <B>-visibleitems</B>
+</pre>
+<UL>
+Specifies the widthxheight in characters and lines for the listbox.
+This option is only administered if the width and height options
+are both set to zero, otherwise they take precedence. The default value
+is 20x10. With the visibleitems option engaged, geometry constraints
+are maintained only on the listbox. The size of the other components such as
+labels, margins, and scroll bars, are additive and independent,
+effecting the overall size of the scrolled list box. In contrast,
+should the width and height options have non zero values, they
+are applied to the scrolled list box as a whole. The listbox
+is compressed or expanded to maintain the geometry constraints.
+</UL>
+<P>
+<pre>
+Name: <B>vscrollMode</B>
+Class: <B>ScrollMode</B>
+Command-Line Switch: <B>-vscrollmode</B>
+</pre>
+<UL>
+Specifies the the display mode to be used for the vertical
+scrollbar: <B>static, dynamic,</B> or <B>none</B>. In static mode, the
+scroll bar is displayed at all times. Dynamic mode displays the
+scroll bar as required, and none disables the scroll bar display. The
+default is static.
+</UL>
+<P>
+<pre>
+Name: <B>width</B>
+Class: <B>Width</B>
+Command-Line Switch: <B>-width</B>
+</pre>
+<UL>
+Specifies the width of the scrolled list box as an entire unit.
+The value may be specified in any of the forms acceptable to
+<B>Tk_GetPixels</B>. Any additional space needed to display the other
+components such as labels, margins, and scrollbars force the listbox
+to be compressed. A value of zero along with the same value for
+the height causes the value given for the visibleitems option
+to be applied which administers geometry constraints in a different
+manner. The default width is zero.
+</UL>
+</pre><HR>
+
+</pre><H2>DESCRIPTION</H2>
+<P>
+The <B>iwidgets::scrolledlistbox</B> command creates
+a scrolled listbox with additional options to manage
+horizontal and vertical scrollbars. This includes options to control
+which scrollbars are displayed and the method, i.e. statically or
+dynamically.
+
+</pre><H2>METHODS</H2>
+<P>
+The <B>iwidgets::scrolledlistbox</B> command creates a new Tcl command whose
+name is <I>pathName</I>. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+<pre>
+<I>pathName option </I>?<I>arg arg ...</I>?
+</pre>
+<I>Option</I> and the <I>arg</I>s
+determine the exact behavior of the command.
+<P>
+Many of the widget commands for a scrolledlistbox take as one argument an
+indicator of which entry of the list box to operate on. These
+indicators are called <I>index</I>es and may be specified in
+any of the following forms:
+<DL>
+<DT> <I>number</I>
+</I></B>
+<DD> Specifies the element as a numerical index, where 0 corresponds
+to the first element in the listbox.
+</DL>
+<DL>
+<DT> <B>active</B>
+</I></B>
+<DD> Indicates the element that has the location cursor. This element
+will be displayed with an underline when the listbox has the
+keyboard focus, and it is specified with the <B>activate</B>
+widget command.
+</DL>
+<DL>
+<DT> <B>anchor</B>
+</I></B>
+<DD> Indicates the anchor point for the selection, which is set with the
+<B>selection anchor</B> widget command.
+</DL>
+<DL>
+<DT> <B>end</B>
+</I></B>
+<DD> Indicates the end of the listbox.
+For some commands this means just after the last element;
+for other commands it means the last element.
+</DL>
+<DL>
+<DT> <B>@<I>x<B>,<I>y</I>
+</I></B>
+<DD> Indicates the element that covers the point in the listbox window
+specified by <I>x</I> and <I>y</I> (in pixel coordinates). If no
+element covers that point, then the closest element to that
+point is used.
+</DL>
+<DL>
+<DT> <I>pattern</I>
+</I></B>
+<DD> If the index doesn't satisfy one of the above forms then this
+form is used. <I>Pattern</I> is pattern-matched against the items in
+the list box, in order from the top down, until a matching entry is found.
+The rules of <B>Tcl_StringMatch</B> are used.
+</DL>
+<P>
+The following widget commands are possible for scrolledlistbox widgets:
+
+</pre><H2>ASSOCIATED METHODS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>activate</B><br>
+<B>get</B><br>
+<B>nearest</B><br>
+<B>size</B><br>
+</td>
+<td valign=top>
+<B>bbox</B><br>
+<B>index</B><br>
+<B>scan</B><br>
+<B>xview</B><br>
+</td>
+<td valign=top>
+<B>curselection</B><br>
+<B>insert</B><br>
+<B>see</B><br>
+<B>yview</B><br>
+</td>
+<td valign=top>
+<B>delete</B><br>
+<B>itemconfigure</B><br>
+<B>selection</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/listbox.n.html"> "listbox" </A> manual entry for details on the associated methods.
+
+</pre><H2>WIDGET-SPECIFIC METHODS</H2>
+<DL>
+<DT> <I>pathName <B>cget</B> <I>option</I>
+</I></B>
+<DD> Returns the current value of the configuration option given
+by <I>option</I>.
+<I>Option</I> may have any of the values accepted by the <B>iwidgets::scrolledlistbox</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName <B>clear</B>
+</I></B>
+<DD> Clears the listbox of all items.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>configure</B> ?<I>option</I>? ?<I>value option value ...</I>?
+</I></B>
+<DD> Query or modify the configuration options of the widget.
+If no <I>option</I> is specified, returns a list describing all of
+the available options for <I>pathName</I> (see <B>Tk_ConfigureInfo</B> for
+information on the format of this list). If <I>option</I> is specified
+with no <I>value</I>, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no <I>option</I> is specified). If
+one or more <I>option-value</I> pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+<I>Option</I> may have any of the values accepted by the <B>iwidgets::scrolledlistbox</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName <B>getcurselection</B>
+</I></B>
+<DD> Returns the contents of the listbox element indicated by the current
+selection indexes. Short cut version of get and curselection command
+combination.
+</DL>
+<DL>
+<DT> <I>pathName <B>justify <I>direction</I>
+</I></B>
+<DD> Justifies the list contents via teh scroll bars in one of four directions:
+<B>left</B>, <B>right</B>, <B>top</B>, or <B>bottom</B>.
+</DL>
+<DL>
+<DT> <I>pathName <B>selecteditemcount</B>
+</I></B>
+<DD> Returns the number of items currently selected in the list.
+</DL>
+<DL>
+<DT> <I>pathName <B>sort</B> <I>order</I>
+</I></B>
+<DD> Sort the current list in any of the forms accepted by Tcl's lsort command.
+Also accepts either <B>ascending</B> or <B>descending</B> order.
+
+</DL>
+</pre><H2>COMPONENTS</H2>
+<P>
+<pre>
+Name: <B>listbox</B>
+Class: <B>listbox</B>
+</pre>
+<UL>
+The listbox component is the listbox widget. See the "listbox" widget
+manual entry for details on the listbox component item.
+</UL>
+<P>
+<pre>
+Name: <B>horizsb</B>
+Class: <B>Scrollbar</B>
+</pre>
+<UL>
+The horizsb component is the horizontal scroll bar. See the "scrollbar"
+widget manual entry for details on the horizsb component item.
+</UL>
+<P>
+<pre>
+Name: <B>vertsb</B>
+Class: <B>Scrollbar</B>
+</pre>
+<UL>
+The vertsb component is the vertical scroll bar. See the "scrollbar" widget
+manual entry for details on the vertsb component item.
+</UL>
+</table>
+
+</pre><H2>EXAMPLE</H2>
+<pre>
+ package require Iwidgets 4.0
+ option add *textBackground white
+ proc selCmd {} {
+ puts stdout "[.slb getcurselection]"
+ }
+ proc defCmd {} {
+ puts stdout "Double Click"
+ return [selCmd]
+ }
+ iwidgets::scrolledlistbox .slb -selection single \\
+ -vscrollmode static -hscrollmode dynamic -labeltext "List" \\
+ -selectioncommand selCmd -dblclickcommand defCmd
+ pack .slb -padx 10 -pady 10 -fill both -expand yes
+ .slb insert end {Hello {Out There} World}
+</pre>
+</pre><H2>AUTHOR</H2>
+<A HREF="mailto:mulferts@spd.dsccc.com">Mark L. Ulferts</A>
+</pre><H2>KEYWORDS</H2>
+scrolledlistbox, listbox, widget
diff --git a/iwidgets/demos/html/scrolledtext.n.html b/iwidgets/demos/html/scrolledtext.n.html
new file mode 100644
index 00000000000..df3b0574397
--- /dev/null
+++ b/iwidgets/demos/html/scrolledtext.n.html
@@ -0,0 +1,367 @@
+<TITLE>scrolledtext - Create and manipulate a scrolled text widget</TITLE>
+<H1>scrolledtext - Create and manipulate a scrolled text widget</H1>
+
+</pre><H2>SYNOPSIS</H2>
+<B>scrolledtext<I> <I>pathName </I>?<I>options</I>?
+</pre><H2>INHERITANCE</H2>
+itk::Widget &lt;- Labeledwidget &lt;- Scrolledwidget &lt;- Scrolledtext
+</pre><H2>STANDARD OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>activeBackground</B><br>
+<B>exportSelection</B><br>
+<B>insertBackground</B><br>
+<B>insertWidth</B><br>
+<B>selectBackground</B><br>
+</td>
+<td valign=top>
+<B>background</B><br>
+<B>foreground</B><br>
+<B>insertBorderWidth</B><br>
+<B>padX</B><br>
+<B>selectBorderWidth</B><br>
+</td>
+<td valign=top>
+<B>borderWidth</B><br>
+<B>highlightColor</B><br>
+<B>insertOffTime</B><br>
+<B>padY</B><br>
+<B>selectForeground</B><br>
+</td>
+<td valign=top>
+<B>cursor</B><br>
+<B>highlightThickness</B><br>
+<B>insertOnTime</B><br>
+<B>relief</B><br>
+<B>setGrid</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/options.n.html"> "options" </A> manual entry for details on the standard options.
+</pre><H2>ASSOCIATED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>activeRelief</B><br>
+</td>
+<td valign=top>
+<B>elementBorderWidth</B><br>
+</td>
+<td valign=top>
+<B>jump</B><br>
+</td>
+<td valign=top>
+<B>troughColor</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/scrollbar.n.html"> "scrollbar" </A> widget manual entry for details on the above
+associated options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>spacing1</B><br>
+<B>tabs</B><br>
+</td>
+<td valign=top>
+<B>spacing2</B><br>
+<B>wrap</B><br>
+</td>
+<td valign=top>
+<B>spacing3</B><br>
+</td>
+<td valign=top>
+<B>state</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/text.n.html"> "text" </A> widget manual entry for details on the above
+associated options.
+</pre><H2>INHERITED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>disabledForeground</B><br>
+<B>labelMargin</B><br>
+<B>state</B><br>
+</td>
+<td valign=top>
+<B>labelBitmap</B><br>
+<B>labelPos</B><br>
+</td>
+<td valign=top>
+<B>labelFont</B><br>
+<B>labelText</B><br>
+</td>
+<td valign=top>
+<B>labelImage</B><br>
+<B>labelVariable</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="labeledwidget.n.html"> "labeledwidget" </A> class manual entry for details on the inherited options.
+</pre><H2>WIDGET-SPECIFIC OPTIONS</H2>
+<P>
+<pre>
+Name: <B>height</B>
+Class: <B>Height</B>
+Command-Line Switch: <B>-height</B>
+</pre>
+<UL>
+Specifies the height of the scrolled text as an entire unit.
+The value may be specified in any of the forms acceptable to
+<B>Tk_GetPixels</B>. Any additional space needed to display the other
+components such as labels, margins, and scrollbars force the text
+to be compressed. A value of zero along with the same value for
+the width causes the value given for the visibleitems option
+to be applied which administers geometry constraints in a different
+manner. The default height is zero.
+</UL>
+<P>
+<pre>
+Name: <B>hscrollMode</B>
+Class: <B>ScrollMode</B>
+Command-Line Switch: <B>-hscrollmode</B>
+</pre>
+<UL>
+Specifies the the display mode to be used for the horizontal
+scrollbar: <B>static, dynamic,</B> or <B>none</B>. In static mode, the
+scroll bar is displayed at all times. Dynamic mode displays the
+scroll bar as required, and none disables the scroll bar display. The
+default is static.
+</UL>
+<P>
+<pre>
+Name: <B>sbWidth</B>
+Class: <B>Width</B>
+Command-Line Switch: <B>-sbwidth</B>
+</pre>
+<UL>
+Specifies the width of the scrollbar in any of the forms
+acceptable to <B>Tk_GetPixels</B>.
+</UL>
+<P>
+<pre>
+Name: <B>scrollMargin</B>
+Class: <B>Margin</B>
+Command-Line Switch: <B>-scrollmargin</B>
+</pre>
+<UL>
+Specifies the distance between the text area and scrollbar in any of the forms
+acceptable to <B>Tk_GetPixels</B>. The default is 3 pixels.
+</UL>
+<P>
+<pre>
+Name: <B>textBackground</B>
+Class: <B>Background</B>
+Command-Line Switch: <B>-textbackground</B>
+</pre>
+<UL>
+Specifies the background color for the text area in any of the forms
+acceptable to <B>Tk_GetColor</B>.
+</UL>
+<P>
+<pre>
+Name: <B>textFont</B>
+Class: <B>Font</B>
+Command-Line Switch: <B>-textfont</B>
+</pre>
+<UL>
+Specifies the font to be used in the scrolled text area.
+</UL>
+<P>
+<pre>
+Name: <B>visibleitems</B>
+Class: <B>VisibleItems</B>
+Command-Line Switch: <B>-visibleitems</B>
+</pre>
+<UL>
+Specifies the widthxheight in characters and lines for the text.
+This option is only administered if the width and height options
+are both set to zero, otherwise they take precedence. The default value
+is 80x24. With the visibleitems option engaged, geometry constraints
+are maintained only on the text. The size of the other components such as
+labels, margins, and scroll bars, are additive and independent,
+effecting the overall size of the scrolled text. In contrast,
+should the width and height options have non zero values, they
+are applied to the scrolled text as a whole. The text
+is compressed or expanded to maintain the geometry constraints.
+</UL>
+<P>
+<pre>
+Name: <B>vscrollMode</B>
+Class: <B>ScrollMode</B>
+Command-Line Switch: <B>-vscrollmode</B>
+</pre>
+<UL>
+Specifies the the display mode to be used for the vertical
+scrollbar: <B>static, dynamic,</B> or <B>none</B>. In static mode, the
+scroll bar is displayed at all times. Dynamic mode displays the
+scroll bar as required, and none disables the scroll bar display. The
+default is static.
+</UL>
+<P>
+<pre>
+Name: <B>width</B>
+Class: <B>Width</B>
+Command-Line Switch: <B>-width</B>
+</pre>
+<UL>
+Specifies the width of the scrolled text as an entire unit.
+The value may be specified in any of the forms acceptable to
+<B>Tk_GetPixels</B>. Any additional space needed to display the other
+components such as labels, margins, and scrollbars force the text
+to be compressed. A value of zero along with the same value for
+the height causes the value given for the visibleitems option
+to be applied which administers geometry constraints in a different
+manner. The default width is zero.
+</UL>
+<P>
+</pre><HR>
+
+</pre><H2>DESCRIPTION</H2>
+<P>
+The <B>scrolledtext</B> command creates
+a scrolled text widget with additional options to manage
+the scrollbars. This includes options to control the method
+in which the scrollbars are displayed, i.e. statically or dynamically.
+Options also exist for adding a label to the scrolled text area and
+controlling its position. Import/export of methods are provided for
+file I/O.
+
+</pre><H2>METHODS</H2>
+<P>
+The <B>scrolledtext</B> command creates a new Tcl command whose
+name is <I>pathName</I>. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+<pre>
+<I>pathName option </I>?<I>arg arg ...</I>?
+</pre>
+<I>Option</I> and the <I>arg</I>s
+determine the exact behavior of the command. The following
+commands are possible for scrolledtext widgets:
+</pre><H2>ASSOCIATED METHODS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>bbox</B><br>
+<B>dlineinfo</B><br>
+<B>mark</B><br>
+<B>tag</B><br>
+</td>
+<td valign=top>
+<B>compare</B><br>
+<B>get</B><br>
+<B>scan</B><br>
+<B>window</B><br>
+</td>
+<td valign=top>
+<B>debug</B><br>
+<B>index</B><br>
+<B>search</B><br>
+<B>xview</B><br>
+</td>
+<td valign=top>
+<B>delete</B><br>
+<B>insert</B><br>
+<B>see</B><br>
+<B>yview</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/text.n.html"> "text" </A> manual entry for details on the standard methods.
+
+</pre><H2>WIDGET-SPECIFIC METHODS</H2>
+<DL>
+<DT> <I>pathName <B>cget</B> <I>option</I>
+</I></B>
+<DD> Returns the current value of the configuration option given
+by <I>option</I>.
+<I>Option</I> may have any of the values accepted by the <B>scrolledtext</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName <B>childsite</B>
+</I></B>
+<DD> Returns the child site widget path name.
+</DL>
+<DL>
+<DT> <I>pathName <B>clear</B>
+</I></B>
+<DD> Clear the text area of all characters.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>configure</B> ?<I>option</I>? ?<I>value option value ...</I>?
+</I></B>
+<DD> Query or modify the configuration options of the widget.
+If no <I>option</I> is specified, returns a list describing all of
+the available options for <I>pathName</I> (see <B>Tk_ConfigureInfo</B> for
+information on the format of this list). If <I>option</I> is specified
+with no <I>value</I>, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no <I>option</I> is specified). If
+one or more <I>option-value</I> pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+<I>Option</I> may have any of the values accepted by the <B>scrolledtext</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName <B>import</B> <I>filename</I> ?<I>index</I>?
+</I></B>
+<DD> Load the text from a file into the text area at the <I>index</I>. The
+<I>filename</I> must exist.
+</DL>
+<DL>
+<DT> <I>pathName <B>export</B> <I>filename</I>
+</I></B>
+<DD> Write text to a file. If <I>filename</I> exists then contents are
+replaced with text widget contents.
+
+</DL>
+</pre><H2>COMPONENTS</H2>
+<P>
+<pre>
+Name: <B>text</B>
+Class: <B>Text</B>
+</pre>
+<UL>
+The text component is the text widget. See the "text" widget
+manual entry for details on the text component item.
+</UL>
+<P>
+<pre>
+Name: <B>horizsb</B>
+Class: <B>Scrollbar</B>
+</pre>
+<UL>
+The horizsb component is the horizontal scroll bar. See the "scrollbar"
+widget manual entry for details on the horizsb component item.
+</UL>
+<P>
+<pre>
+Name: <B>vertsb</B>
+Class: <B>Scrollbar</B>
+</pre>
+<UL>
+The vertsb component is the vertical scroll bar. See the "scrollbar" widget
+manual entry for details on the vertsb component item.
+</UL>
+</table>
+
+</pre><H2>EXAMPLE</H2>
+<pre>
+ option add *textBackground white
+
+ scrolledtext .st -scrollmode dynamic -labeltext "Password File"
+
+ pack .st -padx 10 -pady 10 -fill both -expand yes
+
+ .st import /etc/passwd
+</pre>
+</pre><H2>AUTHOR</H2>
+Mark L. Ulferts
+</pre><H2>KEYWORDS</H2>
+scrolledtext, text, widget
diff --git a/iwidgets/demos/html/selectionbox.n.html b/iwidgets/demos/html/selectionbox.n.html
new file mode 100644
index 00000000000..1616969fae2
--- /dev/null
+++ b/iwidgets/demos/html/selectionbox.n.html
@@ -0,0 +1,389 @@
+<TITLE>selectionbox - Create and manipulate a selection box widget</TITLE>
+<H1>selectionbox - Create and manipulate a selection box widget</H1>
+
+</pre><H2>SYNOPSIS</H2>
+<B>selectionbox<I> <I>pathName </I>?<I>options</I>?
+</pre><H2>INHERITANCE</H2>
+itk::Widget &lt;- selectionbox
+</pre><H2>STANDARD OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>activeBackground</B><br>
+<B>exportSelection</B><br>
+<B>insertBackground</B><br>
+<B>insertWidth</B><br>
+<B>selectBackground</B><br>
+</td>
+<td valign=top>
+<B>background</B><br>
+<B>foreground</B><br>
+<B>insertBorderWidth</B><br>
+<B>relief</B><br>
+<B>selectBorderWidth</B><br>
+</td>
+<td valign=top>
+<B>borderWidth</B><br>
+<B>highlightColor</B><br>
+<B>insertOffTime</B><br>
+<B>repeatDelay</B><br>
+<B>selectForeground</B><br>
+</td>
+<td valign=top>
+<B>cursor</B><br>
+<B>highlightThickness</B><br>
+<B>insertOnTime</B><br>
+<B>repeatInterval</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/options.n.html"> "options" </A> manual entry for details on the standard options.
+</pre><H2>ASSOCIATED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>textBackground</B><br>
+</td>
+<td valign=top>
+<B>textFont</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="entryfield.n.html"> "entryfield" </A> widget class manual entry for details on the above
+associated options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>labelFont</B><br>
+</td>
+<td valign=top>
+<B>labelMargin</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="labeledwidget.n.html"> "labeledwidget" </A> class manual entry for details on the above
+associated options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>activeRelief</B><br>
+</td>
+<td valign=top>
+<B>elementBorderWidth</B><br>
+</td>
+<td valign=top>
+<B>jump</B><br>
+</td>
+<td valign=top>
+<B>troughColor</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/scrollbar.n.html"> "scrollbar" </A> widget class manual entry for details on the above
+associated options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>dblClickCommand</B><br>
+<B>textBackground</B><br>
+</td>
+<td valign=top>
+<B>hscrollMode</B><br>
+<B>textFont</B><br>
+</td>
+<td valign=top>
+<B>sbWidth</B><br>
+<B>vscrollMode</B><br>
+</td>
+<td valign=top>
+<B>scrollMargin</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="scrolledlistbox.n.html"> "scrolledlistbox" </A> widget class manual entry for details on the above
+associated options.
+
+</pre><H2>WIDGET-SPECIFIC OPTIONS</H2>
+<P>
+<pre>
+Name: <B>childSitePos</B>
+Class: <B>Position</B>
+Command-Line Switch: <B>-childsitepos</B>
+</pre>
+<UL>
+Specifies the position of the child site in the selection box: <B>n</B>,
+<B>s</B>, <B>e</B>, <B>w</B>, or <B></B>. The default is center
+</UL>
+<P>
+<pre>
+Name: <B>height</B>
+Class: <B>Height</B>
+Command-Line Switch: <B>-height</B>
+</pre>
+<UL>
+Specifies the height of the selection box. The value may be specified in
+any of the forms acceptable to Tk_GetPixels. The default is 320 pixels.
+</UL>
+<P>
+<pre>
+Name: <B>itemsCommand</B>
+Class: <B>Command</B>
+Command-Line Switch: <B>-itemscommand</B>
+</pre>
+<UL>
+Specifies a command to be evaluated following selection of an item.
+</UL>
+<P>
+<pre>
+Name: <B>itemsLabel</B>
+Class: <B>Text</B>
+Command-Line Switch: <B>-itemslabel</B>
+</pre>
+<UL>
+Specifies the text of the label for the items list. The default is "List".
+</UL>
+<P>
+<pre>
+Name: <B>itemsLabelPos</B>
+Class: <B>Position</B>
+Command-Line Switch: <B>-itemslabelpos</B>
+</pre>
+<UL>
+Specifies the position of the label along the side of the items
+list: <B>n</B>, <B>ne</B>, <B>e</B>, <B>se</B>, <B>s</B>, <B>sw</B>, <B>w</B>,
+or <B>nw</B>. The default is nw.
+</UL>
+<P>
+<pre>
+Name: <B>itemsOn</B>
+Class: <B>ItemsOn</B>
+Command-Line Switch: <B>-itemson</B>
+</pre>
+<UL>
+Specifies whether or not to display the items list in any
+of the forms acceptable to <B>Tcl_GetBoolean</B>. The default is true.
+</UL>
+<P>
+<pre>
+Name: <B>margin</B>
+Class: <B>Margin</B>
+Command-Line Switch: <B>-margin</B>
+</pre>
+<UL>
+Specifies distance between the items list and selection entry in any of
+the forms acceptable to <B>Tk_GetPixels</B>. The default is 7 pixels.
+</UL>
+<P>
+<pre>
+Name: <B>selectionCommand</B>
+Class: <B>Command</B>
+Command-Line Switch: <B>-selectioncommand</B>
+</pre>
+<UL>
+Specifies a Tcl procedure to be associated with a return key press event
+in the selection entry field.
+</UL>
+<P>
+<pre>
+Name: <B>selectionLabel</B>
+Class: <B>Text</B>
+Command-Line Switch: <B>-selectionlabel</B>
+</pre>
+<UL>
+Specifies the text of the label for the selection entry field. The default
+is "Selection".
+</UL>
+<P>
+<pre>
+Name: <B>selectionLabelPos</B>
+Class: <B>Position</B>
+Command-Line Switch: <B>-selectionlabelpos</B>
+</pre>
+<UL>
+Specifies the position of the label along the side of the selection:
+<B>n</B>, <B>ne</B>, <B>e</B>, <B>se</B>, <B>s</B>, <B>sw</B>, <B>w</B>,
+or <B>nw</B>. The default is nw.
+</UL>
+<P>
+<pre>
+Name: <B>selectionOn</B>
+Class: <B>SelectionOn</B>
+Command-Line Switch: <B>-selectionon</B>
+</pre>
+<UL>
+Specifies whether or not to display the selection entry in any
+of the forms acceptable to <B>Tcl_GetBoolean</B>. The default is true.
+</UL>
+<P>
+<pre>
+Name: <B>width</B>
+Class: <B>Width</B>
+Command-Line Switch: <B>-width</B>
+</pre>
+<UL>
+Specifies the width of the selection box. The value may be specified in
+any of the forms acceptable to Tk_GetPixels. The default is 260 pixels.
+</UL>
+<P>
+</pre><HR>
+
+</pre><H2>DESCRIPTION</H2>
+<P>
+The <B>selectionbox</B> command creates a scrolled list of items and
+a selection entry field. The user may choose any of the items displayed
+in the scrolled list of alternatives and the selection field will be
+filled with the choice. The user is also free to enter a new value in
+the selection entry field. Both the list and entry areas have labels.
+A child site is also provided in which the user may create other widgets
+to be used in conjunction with the selection box.
+
+</pre><H2>METHODS</H2>
+<P>
+The <B>selectionbox</B> command creates a new Tcl command whose
+name is <I>pathName</I>. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+<pre>
+<I>pathName option </I>?<I>arg arg ...</I>?
+</pre>
+<I>Option</I> and the <I>arg</I>s
+determine the exact behavior of the command.
+
+</pre><H2>ASSOCIATED METHODS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>curselection</B><br>
+<B>scan</B><br>
+</td>
+<td valign=top>
+<B>delete</B><br>
+<B>selection</B><br>
+</td>
+<td valign=top>
+<B>index</B><br>
+<B>size</B><br>
+</td>
+<td valign=top>
+<B>nearest</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/listbox.n.html"> "listbox" </A> widget class manual entry for details on the
+associated methods.
+
+</pre><H2>WIDGET-SPECIFIC METHODS</H2>
+<DL>
+<DT> <I>pathName <B>cget</B> <I>option</I>
+</I></B>
+<DD> Returns the current value of the configuration option given
+by <I>option</I>.
+<I>Option</I> may have any of the values accepted by the <B>selectionbox</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName <B>childsite</B>
+</I></B>
+<DD> Returns the child site widget path name.
+</DL>
+<DL>
+<DT> <I>pathName <B>clear</B> <I>component</I>
+</I></B>
+<DD> Delete the contents of either the selection entry widget or
+items list. The <I>component</I> argument may be either <B>items</B>
+or <B>selection</B>.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>configure</B> ?<I>option</I>? ?<I>value option value ...</I>?
+</I></B>
+<DD> Query or modify the configuration options of the widget.
+If no <I>option</I> is specified, returns a list describing all of
+the available options for <I>pathName</I> (see <B>Tk_ConfigureInfo</B> for
+information on the format of this list). If <I>option</I> is specified
+with no <I>value</I>, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no <I>option</I> is specified). If
+one or more <I>option-value</I> pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+<I>Option</I> may have any of the values accepted by the <B>selectionbox</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName <B>get</B>
+</I></B>
+<DD> Returns the current value of the selection entry widget.
+</DL>
+<DL>
+<DT> <I>pathName <B>insert</B> <I>component</I> <I>args</I>
+</I></B>
+<DD> Insert element(s) into either the selection entry widget or
+items list. The <I>component</I> argument may be either <B>items</B>
+or <B>selection</B>. The <I>args</I> follow the rules of either an entry
+or list widget depending on the <I>component</I> value.
+</DL>
+<DL>
+<DT> <I>pathName <B>selectitem</B>
+</I></B>
+<DD> Replace the selection entry field contents with the currently
+selected items value.
+
+</DL>
+</pre><H2>COMPONENTS</H2>
+<P>
+<pre>
+Name: <B>childsite</B>
+Class: <B>Frame</B>
+</pre>
+<UL>
+The childsite component is the user child site for the selection box. See
+the "frame" widget manual entry for details on the childsite component item.
+</UL>
+<P>
+<pre>
+Name: <B>items</B>
+Class: <B>Scrolledlistbox</B>
+</pre>
+<UL>
+The items component provides the scrolled list box of items for the selection
+box. See the "scrolledlistbox" widget manual entry for details on the
+items component item.
+</UL>
+<P>
+<pre>
+Name: <B>selection</B>
+Class: <B>Entryfield</B>
+</pre>
+<UL>
+The selection component provides the entry field in the selection box for
+display of the selected item in the items component. See the "entryfield"
+widget manual entry for details on the selection component item.
+</UL>
+</table>
+
+</pre><H2>EXAMPLE</H2>
+<pre>
+ option add *textBackground white
+
+ selectionbox .sb -items {Hello {Out There} World}
+ pack .sb -padx 10 -pady 10 -fill both -expand yes
+
+ set cs [label [.sb childsite].label -text "Child Site"]
+ pack $cs -fill x -padx 10 -pady 10
+
+ .sb insert items 2 {Cruel Cruel}
+
+ .sb selection set 1
+</pre>
+</pre><H2>AUTHOR</H2>
+Mark L. Ulferts
+</pre><H2>KEYWORDS</H2>
+selectionbox, widget
diff --git a/iwidgets/demos/html/selectiondialog.n.html b/iwidgets/demos/html/selectiondialog.n.html
new file mode 100644
index 00000000000..cb22a66712d
--- /dev/null
+++ b/iwidgets/demos/html/selectiondialog.n.html
@@ -0,0 +1,314 @@
+<TITLE>selectiondialog - Create and manipulate a selection dialog widget</TITLE>
+<H1>selectiondialog - Create and manipulate a selection dialog widget</H1>
+
+</pre><H2>SYNOPSIS</H2>
+<B>selectiondialog<I> <I>pathName </I>?<I>options</I>?
+</pre><H2>INHERITANCE</H2>
+itk::Toplevel &lt;- Shell &lt;- Dialogshell &lt;- Dialog &lt;- Selectiondialog
+</pre><H2>STANDARD OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>activeBackground</B><br>
+<B>exportSelection</B><br>
+<B>insertBackground</B><br>
+<B>insertWidth</B><br>
+</td>
+<td valign=top>
+<B>background</B><br>
+<B>foreground</B><br>
+<B>insertBorderWidth</B><br>
+<B>selectBackground</B><br>
+</td>
+<td valign=top>
+<B>borderWidth</B><br>
+<B>highlightColor</B><br>
+<B>insertOffTime</B><br>
+<B>selectBorderWidth</B><br>
+</td>
+<td valign=top>
+<B>cursor</B><br>
+<B>highlightThickness</B><br>
+<B>insertOnTime</B><br>
+<B>selectForeground</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/options.n.html"> "options" </A> manual entry for details on the standard options.
+</pre><H2>ASSOCIATED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>textBackground</B><br>
+</td>
+<td valign=top>
+<B>textFont</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="entryfield.n.html"> "entryfield" </A> widget manual entry for details on the above
+associated options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>labelFont</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="labeledwidget.n.html"> "labeledwidget" </A> widget manual entry for details on the above
+associated options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>activeRelief</B><br>
+</td>
+<td valign=top>
+<B>elementBorderWidth</B><br>
+</td>
+<td valign=top>
+<B>jump</B><br>
+</td>
+<td valign=top>
+<B>troughColor</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/scrollbar.n.html"> "scrollbar" </A> widget class manual entry for details on the above
+associated options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>textBackground</B><br>
+</td>
+<td valign=top>
+<B>textFont</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="scrolledlistbox.n.html"> "scrolledlistbox" </A> widget class manual entry for details on the above
+associated options.
+<B>childsitepos</B> <B>itemsCommand</B> <B>itemsLabel</B> <B>itemsOn</B>
+<B>selectionCommand</B> <B>selectionLabel</B> <B>selectionOn</B>
+</table>
+<P>
+See the <A HREF="selectionbox.n.html"> "selectionbox" </A> widget manual entry for details on the above
+associated options.
+</pre><H2>INHERITED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>buttonBoxPadX</B><br>
+<B>padY</B><br>
+</td>
+<td valign=top>
+<B>buttonBoxPadY</B><br>
+<B>separator</B><br>
+</td>
+<td valign=top>
+<B>buttonBoxPos</B><br>
+<B>thickness</B><br>
+</td>
+<td valign=top>
+<B>padX</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="dialogshell.n.html"> "dialogshell" </A> widget manual entry for details on the above
+inherited options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>height</B><br>
+</td>
+<td valign=top>
+<B>master</B><br>
+</td>
+<td valign=top>
+<B>modality</B><br>
+</td>
+<td valign=top>
+<B>width</B><br>
+</td>
+</table>
+<P>
+See the "shell" widget manual entry for details on the above
+inherited options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>title</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the "Toplevel" widget manual entry for details on the above
+inherited options.
+</pre><HR>
+
+</pre><H2>DESCRIPTION</H2>
+<P>
+The <B>selectiondialog</B> command creates a selection box similar to
+the OSF/Motif standard selection
+dialog composite widget. The selectiondialog is derived from the
+Dialog class and is composed of a selectionbox with commands
+to manipulate the dialog buttons.
+
+</pre><H2>METHODS</H2>
+<P>
+The <B>selectiondialog</B> command creates a new Tcl command whose
+name is <I>pathName</I>. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+<pre>
+<I>pathName option </I>?<I>arg arg ...</I>?
+</pre>
+<I>Option</I> and the <I>arg</I>s
+determine the exact behavior of the command. The following
+commands are possible for selectiondialog widgets:
+</pre><H2>ASSOCIATED METHODS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>childsite</B><br>
+<B>selectitem</B><br>
+</td>
+<td valign=top>
+<B>clear</B><br>
+</td>
+<td valign=top>
+<B>get</B><br>
+</td>
+<td valign=top>
+<B>insert</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="selectionbox.n.html"> "selectionbox" </A> widget manual entry for details on the above
+associated methods.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>curselection</B><br>
+<B>scan</B><br>
+</td>
+<td valign=top>
+<B>delete</B><br>
+<B>selection</B><br>
+</td>
+<td valign=top>
+<B>index</B><br>
+<B>size</B><br>
+</td>
+<td valign=top>
+<B>nearest</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/listbox.n.html"> "listbox" </A> widget manual entry for details on the above
+associated methods.
+</pre><H2>INHERITED METHODS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>add</B><br>
+<B>invoke</B><br>
+</td>
+<td valign=top>
+<B>buttonconfigure</B><br>
+<B>show</B><br>
+</td>
+<td valign=top>
+<B>default</B><br>
+</td>
+<td valign=top>
+<B>hide</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="buttonbox.n.html"> "buttonbox" </A> widget manual entry for details on the above
+inherited methods.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>activate</B><br>
+</td>
+<td valign=top>
+<B>center</B><br>
+</td>
+<td valign=top>
+<B>deactivate</B><br>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the "shell" widget manual entry for details on the above
+inherited methods.
+</pre><H2>WIDGET-SPECIFIC METHODS</H2>
+<DL>
+<DT> <I>pathName <B>cget</B> <I>option</I>
+</I></B>
+<DD> Returns the current value of the configuration option given
+by <I>option</I>.
+<I>Option</I> may have any of the values accepted by the <B>selectiondialog</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>configure</B> ?<I>option</I>? ?<I>value option value ...</I>?
+</I></B>
+<DD> Query or modify the configuration options of the widget.
+If no <I>option</I> is specified, returns a list describing all of
+the available options for <I>pathName</I> (see <B>Tk_ConfigureInfo</B> for
+information on the format of this list). If <I>option</I> is specified
+with no <I>value</I>, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no <I>option</I> is specified). If
+one or more <I>option-value</I> pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+<I>Option</I> may have any of the values accepted by the <B>selectiondialog</B>
+command.
+
+</DL>
+</pre><H2>COMPONENTS</H2>
+<P>
+<pre>
+Name: <B>selectionbox</B>
+Class: <B>Selectionbox</B>
+</pre>
+<UL>
+The selectionbox component is the selection box for the selection
+dialog. See the "selectionbox" widget manual entry for details on the
+selectionbox component item.
+</UL>
+</table>
+
+</pre><H2>EXAMPLE</H2>
+<pre>
+ selectiondialog .sd
+ .sd activate
+</pre>
+</pre><H2>AUTHOR</H2>
+Mark L. Ulferts
+</pre><H2>KEYWORDS</H2>
+selectiondialog, selectionbox, dialog, dialogshell, shell, widget
+
diff --git a/iwidgets/demos/html/shell.n.html b/iwidgets/demos/html/shell.n.html
new file mode 100644
index 00000000000..e34939beeec
--- /dev/null
+++ b/iwidgets/demos/html/shell.n.html
@@ -0,0 +1,219 @@
+<TITLE>shell - Create and manipulate a shell widget</TITLE>
+<H1>shell - Create and manipulate a shell widget</H1>
+
+</pre><H2>SYNOPSIS</H2>
+<B>shell<I> <I>pathName </I>?<I>options</I>?
+</pre><H2>INHERITANCE</H2>
+itk::Toplevel &lt;- shell
+</pre><H2>STANDARD OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>background</B><br>
+</td>
+<td valign=top>
+<B>cursor</B><br>
+</td>
+<td valign=top>
+<B>foreground</B><br>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/options.n.html"> "options" </A> manual entry for details on the standard options.
+</pre><H2>INHERITED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>title</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the "Toplevel" manual entry for details on the above inherited options.
+
+</pre><H2>WIDGET-SPECIFIC OPTIONS</H2>
+<P>
+<pre>
+Name: <B>height</B>
+Class: <B>Height</B>
+Command-Line Switch: <B>-height</B>
+</pre>
+<UL>
+Specifies the height of the shell. The value may be specified in
+any of the forms acceptable to <B>Tk_GetPixels</B>. A value of zero
+causes the height to be adjusted to the required value based on
+the size requests of the components placed in the childsite.
+Otherwise, the height is fixed. The default is zero. NOTE: This
+may cause some amount of flickering on slower machines. To prevent it
+simply set the width and height to a appropriate value.
+</UL>
+<P>
+<pre>
+Name: <B>master</B>
+Class: <B>Window</B>
+Command-Line Switch: <B>-master</B>
+</pre>
+<UL>
+Defines the shell as being a transient window with the master window
+given by the master option. The master window should be either another
+existing toplevel window or {} for no master. The default is {} for
+shells and "." for dialogs.
+</UL>
+<P>
+<pre>
+Name: <B>modality</B>
+Class: <B>Modality</B>
+Command-Line Switch: <B>-modality</B>
+</pre>
+<UL>
+Allows the shell to grab control of the screen in one of three different ways:
+<B>application</B>, <B>system</B>, or <B>none</B>.
+Application modal prevents any other toplevel windows within the application
+which are direct children of '.' from gaining focus. System modal locks
+the screen and prevents all windows from gaining focus regardless of
+application. A modality of none performs no grabs at all. The default
+is none.
+</UL>
+<P>
+<pre>
+Name: <B>padX</B>
+Class: <B>Pad</B>
+Command-Line Switch: <B>-padx</B>
+</pre>
+<UL>
+Specifies a padding distance for the childsite in the X-direction in
+any of the forms acceptable to <B>Tk_GetPixels</B>. The default is 10.
+</UL>
+<P>
+<pre>
+Name: <B>padY</B>
+Class: <B>Pad</B>
+Command-Line Switch: <B>-pady</B>
+</pre>
+<UL>
+Specifies a padding distance for the childsite in the Y-direction in
+any of the forms acceptable to <B>Tk_GetPixels</B>. The default is 10.
+</UL>
+<P>
+<pre>
+Name: <B>width</B>
+Class: <B>Width</B>
+Command-Line Switch: <B>-width</B>
+</pre>
+<UL>
+Specifies the width of the shell. The value may be specified in
+any of the forms acceptable to <B>Tk_GetPixels</B>. A value of zero
+causes the width to be adjusted to the required value based on
+the size requests of the components placed in the childsite.
+Otherwise, the width is fixed. The default is zero. NOTE: This
+may cause some amount of flickering on slower machines. To prevent it
+simply set the width and height to a appropriate value.
+</UL>
+</pre><HR>
+
+</pre><H2>DESCRIPTION</H2>
+<P>
+The <B>shell</B> command creates a shell which is a top
+level widget which supports modal operation.
+
+</pre><H2>METHODS</H2>
+<P>
+The <B>shell</B> command create a new Tcl command whose
+name is <I>pathName</I>. This command may be used to invoke various
+operations on the widget. It has the following general form:
+<pre>
+<I>pathName option </I>?<I>arg arg ...</I>?
+</pre>
+<I>Option</I> and the <I>arg</I>s
+determine the exact behavior of the command. The following
+commands are possible for shell widgets:
+</pre><H2>WIDGET-SPECIFIC METHODS</H2>
+<DL>
+<DT> <I>pathName <B>activate</B>
+</I></B>
+<DD> Display the shell and wait based on the modality. For application
+and system modal activations, perform a grab operation, and wait
+for the result. The result may be returned via an argument to the
+<B>deactivate</B> method.
+</DL>
+<DL>
+<DT> <I>pathName <B>center</B> <I>?widget?</I>
+</I></B>
+<DD> Centers the shell with respect to another widget. The widget argument
+is optional. If provided, it should be the path of another widget with
+to center upon. If absent, then the shell will be centered on the screen
+as a whole.
+</DL>
+<DL>
+<DT> <I>pathName <B>cget</B> <I>option</I>
+</I></B>
+<DD> Returns the current value of the configuration option given
+by <I>option</I>.
+<I>Option</I> may have any of the values accepted by the <B>shell</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName <B>childsite</B>
+</I></B>
+<DD> Returns the pathname of the child site widget.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>configure</B> ?<I>option</I>? ?<I>value option value ...</I>?
+</I></B>
+<DD> Query or modify the configuration options of the widget.
+If no <I>option</I> is specified, returns a list describing all of
+the available options for <I>pathName</I> (see <B>Tk_ConfigureInfo</B> for
+information on the format of this list). If <I>option</I> is specified
+with no <I>value</I>, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no <I>option</I> is specified). If
+one or more <I>option-value</I> pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+<I>Option</I> may have any of the values accepted by the <B>shell</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName <B>deactivate</B> ?<I>arg</I>?
+</I></B>
+<DD> Deactivate the display of the shell. The method takes an optional
+argument to be passed to the <B>activate</B> method which returns the value.
+The optional argument is only effective for application and system
+modal dialogs.
+
+</DL>
+</pre><H2>COMPONENTS</H2>
+<P>
+<pre>
+Name: <B>shellchildsite</B>
+Class: <B>frame</B>
+</pre>
+<UL>
+The shellchildsite component is the user child site for the shell. See
+the "frame" widget manual entry for details on the shellchildsite
+component item.
+</UL>
+</table>
+
+</pre><H2>EXAMPLE</H2>
+<pre>
+ shell .sh -modality application -padx 20 -pady 20 -title Shell
+
+ pack [label [.sh childsite].l -text SHELL]
+
+ .sh center
+ .sh activate
+</pre>
+</pre><H2>AUTHOR</H2>
+Mark L. Ulferts
+<P>
+Kris Raney
+</pre><H2>KEYWORDS</H2>
+shell, widget
diff --git a/iwidgets/demos/html/spindate.n.html b/iwidgets/demos/html/spindate.n.html
new file mode 100644
index 00000000000..474925c7995
--- /dev/null
+++ b/iwidgets/demos/html/spindate.n.html
@@ -0,0 +1,614 @@
+<TITLE>spindate - Create and manipulate time spinner widgets</TITLE>
+<H1>spindate - Create and manipulate time spinner widgets</H1>
+
+</pre><H2>SYNOPSIS</H2>
+<B>spindate<I> <I>pathName </I>?<I>options</I>?
+</pre><H2>INHERITANCE</H2>
+itk::Widget &lt;- Spindate
+
+</pre><H2>STANDARD OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>background</B><br>
+</td>
+<td valign=top>
+<B>cursor</B><br>
+</td>
+<td valign=top>
+<B>foreground</B><br>
+</td>
+<td valign=top>
+<B>relief</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/options.n.html"> "options" </A> manual entry for details on the standard options.
+</pre><H2>ASSOCIATED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>textBackground</B><br>
+</td>
+<td valign=top>
+<B>textFont</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="entryfield.n.html"> "entryfield" </A> manual entry for details on the above associated options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>labelFont</B><br>
+</td>
+<td valign=top>
+<B>labelMargin</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="labeledwidget.n.html"> "labeledwidget" </A> manual entry for details on the above associated
+options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>arrowOrient</B><br>
+</td>
+<td valign=top>
+<B>repeatDelay</B><br>
+</td>
+<td valign=top>
+<B>repeatInterval</B><br>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="spinner.n.html"> "spinner" </A> manual entry for details on the above associated options.
+
+</pre><H2>WIDGET-SPECIFIC OPTIONS</H2>
+<P>
+<pre>
+Name: <B>dateMargin</B>
+Class: <B>Margin</B>
+Command-Line Switch: <B>-datemargin</B>
+</pre>
+<UL>
+Specifies the margin space between the month, day, and year spinners is
+any of the forms accpetable to <B>Tcl_GetPixels</B>. The default is 1 pixel.
+</UL>
+<P>
+<pre>
+Name: <B>dayLabel</B>
+Class: <B>Text</B>
+Command-Line Switch: <B>-daylabel</B>
+</pre>
+<UL>
+Specifies the text of the label for the day spinner. The default is
+"Day".
+</UL>
+<P>
+<pre>
+Name: <B>dayOn</B>
+Class: <B>dayOn</B>
+Command-Line Switch: <B>-dayon</B>
+</pre>
+<UL>
+Specifies whether or not to display the day spinner in any of the forms
+acceptable to <B>Tcl_GetBoolean</B>. The default is true.
+</UL>
+<P>
+<pre>
+Name: <B>dayWidth</B>
+Class: <B>Width</B>
+Command-Line Switch: <B>-daywidth</B>
+</pre>
+<UL>
+Specifies the width of the day spinner in any of the forms acceptable to
+<B>Tcl_GetPixels</B>. The default is 3 pixels.
+</UL>
+<P>
+<pre>
+Name: <B>labelPos</B>
+Class: <B>Position</B>
+Command-Line Switch: <B>-labelpos</B>
+</pre>
+<UL>
+Specifies the position of the label along the sides of the various
+spinners: <B>n</B>, <B>e</B>, <B>s</B>, or <B>w</B>. The default is w.
+</UL>
+<P>
+<pre>
+Name: <B>monthFormat</B>
+Class: <B>MonthFormat</B>
+Command-Line Switch: <B>-monthformat</B>
+</pre>
+<UL>
+Specifies the format of month display, <B>integer</B> (1-12) or <B>brief</B>
+strings (Jan - Dec), or <B>full</B> strings (January - December).
+</UL>
+<P>
+<pre>
+Name: <B>monthLabel</B>
+Class: <B>Text</B>
+Command-Line Switch: <B>-monthlabel</B>
+</pre>
+<UL>
+Specifies the text of the label for the month spinner. The default is "Month".
+</UL>
+<P>
+<pre>
+Name: <B>monthOn</B>
+Class: <B>monthOn</B>
+Command-Line Switch: <B>-monthon</B>
+</pre>
+<UL>
+Specifies whether or not to display the month spinner in any of the forms
+acceptable to <B>Tcl_GetBoolean</B>. The default is true.
+</UL>
+<P>
+<pre>
+Name: <B>monthWidth</B>
+Class: <B>Width</B>
+Command-Line Switch: <B>-monthwidth</B>
+</pre>
+<UL>
+Specifies the width of the month spinner in any of the forms acceptable to
+<B>Tcl_GetPixels</B>. The default is 3 pixels.
+</UL>
+<P>
+<pre>
+Name: <B>orient</B>
+Class: <B>Orient</B>
+Command-Line Switch: <B>-orient</B>
+</pre>
+<UL>
+Specifies the orientation of the month, day, and year spinners: <B>vertical</B> or <B>horizontal</B>. The default is horizontal.
+</UL>
+<P>
+<pre>
+Name: <B>yearDigits</B>
+Class: <B>YearDigits</B>
+Command-Line Switch: <B>-yeardigits</B>
+</pre>
+<UL>
+Specifies the number of digits to be displayed as the value for the year
+spinner. The valid values are 2 and 4. The default is 2.
+</UL>
+<P>
+<pre>
+Name: <B>yearLabel</B>
+Class: <B>Text</B>
+Command-Line Switch: <B>-yearlabel</B>
+</pre>
+<UL>
+Specifies the text of the label for the year spinner. The default is
+"Year"
+</UL>
+<P>
+<pre>
+Name: <B>yearOn</B>
+Class: <B>yearOn</B>
+Command-Line Switch: <B>-yearon</B>
+</pre>
+<UL>
+Specifies whether or not to display the year spinner in any of the forms
+acceptable to <B>Tcl_GetBoolean</B>. The default is true.
+</UL>
+<P>
+<pre>
+Name: <B>yearWidth</B>
+Class: <B>Width</B>
+Command-Line Switch: <B>-yearwidth</B>
+</pre>
+<UL>
+Specifies the width of the year spinner in any of the forms acceptable to
+<B>Tcl_GetPixels</B>. The default is 3 pixels.
+</UL>
+<P>
+<table cellpadding=5>
+<td valign=top>
+</pre><HR><br>
+<B>spindate</B><br>
+set<br>
+use<br>
+entry.<br>
+an<br>
+year<br>
+<P><br>
+creates<br>
+command<br>
+<I>pathName</I>.<br>
+be<br>
+various<br>
+widget.<br>
+following<br>
+<I>pathName<br>
+...</I>?<br>
+the<br>
+exact<br>
+command.<br>
+are<br>
+widgets:<br>
+<DT><br>
+</I></B><br>
+current<br>
+configuration<br>
+<I>option</I>.<br>
+any<br>
+accepted<br>
+command.<br>
+<I>pathName</I><br>
+option<br>
+<DD><br>
+the<br>
+the<br>
+<I>option</I><br>
+a<br>
+of<br>
+for<br>
+for<br>
+format<br>
+If<br>
+with<br>
+the<br>
+list<br>
+named<br>
+will<br>
+the<br>
+the<br>
+no<br>
+If<br>
+<I>option-value</I><br>
+then<br>
+the<br>
+to<br>
+value(s);<br>
+the<br>
+empty<br>
+have<br>
+values<br>
+<B>spindate</B><br>
+<DT><br>
+</I></B><br>
+current<br>
+spindate<br>
+format<br>
+as<br>
+value<br>
+and<br>
+respectively.<br>
+by<br>
+clock<br>
+information<br>
+and<br>
+<DL><br>
+<I>date</I><br>
+the<br>
+to<br>
+the<br>
+date<br>
+either<br>
+an<br>
+or<br>
+Reference<br>
+for<br>
+obtaining<br>
+formats.<br>
+<table><br>
+<B>Spinner</B><br>
+</td>
+<td valign=top>
+</pre><H2>DESCRIPTION</H2><br>
+command<br>
+of<br>
+in<br>
+The<br>
+month,<br>
+spinner<br>
+The<br>
+a<br>
+whose<br>
+This<br>
+used<br>
+operations<br>
+It<br>
+general<br>
+option<br>
+</pre><br>
+<I>arg</I>s<br>
+behavior<br>
+The<br>
+possible<br>
+</pre><H2>WIDGET-SPECIFIC<br>
+<I>pathName<br>
+<DD><br>
+value<br>
+option<br>
+<I>Option</I><br>
+of<br>
+by<br>
+</DL><br>
+<B>configure</B><br>
+value<br>
+Query<br>
+configuration<br>
+widget.<br>
+is<br>
+list<br>
+the<br>
+<I>pathName</I><br>
+information<br>
+of<br>
+<I>option</I><br>
+no<br>
+command<br>
+describing<br>
+option<br>
+be<br>
+corresponding<br>
+value<br>
+<I>option</I><br>
+one<br>
+pairs<br>
+the<br>
+given<br>
+have<br>
+in<br>
+command<br>
+string.<br>
+any<br>
+accepted<br>
+command.<br>
+<I>pathName<br>
+<DD><br>
+contents<br>
+widget<br>
+of<br>
+an<br>
+using<br>
+<B>-clicks</B><br>
+The<br>
+string.<br>
+command<br>
+on<br>
+their<br>
+<DT><br>
+</I></B><br>
+currently<br>
+be<br>
+date<br>
+may<br>
+as<br>
+integer<br>
+the<br>
+the<br>
+more<br>
+dates<br>
+</DL><br>
+Name:<br>
+</td>
+<td valign=top>
+<P><br>
+creates<br>
+spinners<br>
+date<br>
+set<br>
+day,<br>
+widget.<br>
+<B>spindate</B><br>
+new<br>
+name<br>
+command<br>
+to<br>
+on<br>
+has<br>
+form:<br>
+</I>?<I>arg<br>
+<I>Option</I><br>
+determine<br>
+of<br>
+following<br>
+for<br>
+METHODS</H2><br>
+<B>cget</B><br>
+Returns<br>
+of<br>
+given<br>
+may<br>
+the<br>
+the<br>
+<DL><br>
+?<I>option</I>?<br>
+...</I>?<br>
+or<br>
+options<br>
+If<br>
+specified,<br>
+describing<br>
+available<br>
+(see<br>
+on<br>
+this<br>
+is<br>
+<I>value</I>,<br>
+returns<br>
+the<br>
+(this<br>
+identical<br>
+sublist<br>
+returned<br>
+is<br>
+or<br>
+are<br>
+command<br>
+widget<br>
+the<br>
+this<br>
+returns<br>
+<I>Option</I><br>
+of<br>
+by<br>
+</DL><br>
+<B>get</B><br>
+Returns<br>
+of<br>
+in<br>
+string<br>
+integer<br>
+the<br>
+format<br>
+default<br>
+Reference<br>
+for<br>
+obtaining<br>
+formats.<br>
+<I>pathName<br>
+<DD><br>
+displayed<br>
+that<br>
+argument.<br>
+be<br>
+a<br>
+clock<br>
+keyword<br>
+clock<br>
+information<br>
+and<br>
+</pre><H2>COMPONENTS</H2><br>
+<B>month</B><br>
+</td>
+<td valign=top>
+The<br>
+a<br>
+for<br>
+value<br>
+includes<br>
+and<br>
+</pre><H2>METHODS</H2><br>
+command<br>
+Tcl<br>
+is<br>
+may<br>
+invoke<br>
+the<br>
+the<br>
+<pre><br>
+arg<br>
+and<br>
+the<br>
+the<br>
+commands<br>
+spindate<br>
+<DL><br>
+<I>option</I><br>
+the<br>
+the<br>
+by<br>
+have<br>
+values<br>
+<B>spindate</B><br>
+<DT><br>
+?<I>value<br>
+</I></B><br>
+modify<br>
+of<br>
+no<br>
+returns<br>
+all<br>
+options<br>
+<B>Tk_ConfigureInfo</B><br>
+the<br>
+list).<br>
+specified<br>
+then<br>
+a<br>
+one<br>
+list<br>
+to<br>
+of<br>
+if<br>
+specified).<br>
+more<br>
+specified,<br>
+modifies<br>
+option(s)<br>
+given<br>
+case<br>
+an<br>
+may<br>
+the<br>
+the<br>
+<DL><br>
+?<B>format</B>?<br>
+the<br>
+the<br>
+a<br>
+or<br>
+clock<br>
+<B>-string</B><br>
+options<br>
+is<br>
+the<br>
+more<br>
+dates<br>
+</DL><br>
+<B>show</B><br>
+Changes<br>
+date<br>
+of<br>
+The<br>
+specified<br>
+string,<br>
+value<br>
+"now".<br>
+command<br>
+on<br>
+their<br>
+<P><br>
+Class:<br>
+</td>
+</table>
+<UL>
+The month spinner component is the month spinner of the date spinner.
+See the Spinner widget manual entry for details on the month component item.
+</UL>
+<P>
+<pre>
+Name: <B>day</B>
+Class: <B>Spinint</B>
+</pre>
+<UL>
+The day spinner component is the day spinner of the date spinner.
+See the SpinInt widget manual entry for details on the day component item.
+</UL>
+<P>
+<pre>
+Name: <B>year</B>
+Class: <B>Spinint</B>
+</pre>
+<UL>
+The year spinner component is the year spinner of the date spinner.
+See the SpinInt widget manual entry for details on the year component item.
+</UL>
+</table>
+
+</pre><H2>EXAMPLE</H2>
+<pre>
+spindate .sd
+pack .sd -padx 10 -pady 10
+</pre>
+</pre><H2>AUTHORS</H2>
+Sue Yockey
+<P>
+Mark L. Ulferts
+</pre><H2>KEYWORDS</H2>
+spindate, spinint, spinner, entryfield, entry, widget
+
diff --git a/iwidgets/demos/html/spinint.n.html b/iwidgets/demos/html/spinint.n.html
new file mode 100644
index 00000000000..1ba9b0eaa00
--- /dev/null
+++ b/iwidgets/demos/html/spinint.n.html
@@ -0,0 +1,269 @@
+<TITLE>spinint - Create and manipulate a integer spinner widget</TITLE>
+<H1>spinint - Create and manipulate a integer spinner widget</H1>
+
+</pre><H2>SYNOPSIS</H2>
+<B>spinint<I> <I>pathName </I>?<I>options</I>?
+</pre><H2>INHERITANCE</H2>
+itk::Widget &lt;- Labeledwidget &lt;- Spinner &lt;- Spinint
+</pre><H2>STANDARD OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>background</B><br>
+<B>foreground</B><br>
+<B>insertBorderWidth</B><br>
+<B>justify</B><br>
+<B>selectForeground</B><br>
+</td>
+<td valign=top>
+<B>borderWidth</B><br>
+<B>highlightColor</B><br>
+<B>insertOffTime</B><br>
+<B>relief</B><br>
+<B>textVariable</B><br>
+</td>
+<td valign=top>
+<B>cursor</B><br>
+<B>highlightThickness</B><br>
+<B>insertOnTime</B><br>
+<B>selectBackground</B><br>
+</td>
+<td valign=top>
+<B>exportSelection</B><br>
+<B>insertBackground</B><br>
+<B>insertWidth</B><br>
+<B>selectBorderWidth</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/options.n.html"> "options" </A> manual entry for details on the standard options.
+</pre><H2>ASSOCIATED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>show</B><br>
+</td>
+<td valign=top>
+<B>state</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/entry.n.html"> "entry" </A> manual entry for details on the associated options.
+</pre><H2>INHERITED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>command</B><br>
+<B>invalid</B><br>
+<B>width</B><br>
+</td>
+<td valign=top>
+<B>childSitePos</B><br>
+<B>textBackground</B><br>
+</td>
+<td valign=top>
+<B>fixed</B><br>
+<B>textFont</B><br>
+</td>
+<td valign=top>
+<B>focusCommand</B><br>
+<B>validate</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="entryfield.n.html"> "entryfield" </A> widget manual entry for details on the above
+inherited options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>disabledForeground</B><br>
+<B>labelMargin</B><br>
+<B>state</B><br>
+</td>
+<td valign=top>
+<B>labelBitmap</B><br>
+<B>labelPos</B><br>
+</td>
+<td valign=top>
+<B>labelFont</B><br>
+<B>labelText</B><br>
+</td>
+<td valign=top>
+<B>labelImage</B><br>
+<B>labelVariable</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="labeledwidget.n.html"> "labeledwidget" </A> widget manual entry for details on the above
+inherited options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>arroworient</B><br>
+<B>repeatInterval</B><br>
+</td>
+<td valign=top>
+<B>decrement</B><br>
+</td>
+<td valign=top>
+<B>increment</B><br>
+</td>
+<td valign=top>
+<B>repeatDelay</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="spinner.n.html"> "spinner" </A> widget manual entry for details on the above
+inherited options.
+
+</pre><H2>WIDGET-SPECIFIC OPTIONS</H2>
+<P>
+<pre>
+Name: <B>range</B>
+Class: <B>Range</B>
+Command-Line Switch: <B>-range</B>
+</pre>
+<UL>
+Specifies a two element list of minimum and maximum integer values. The
+default is no range, {{} {}}.
+</UL>
+<P>
+<pre>
+Name: <B>step</B>
+Class: <B>Step</B>
+Command-Line Switch: <B>-step</B>
+</pre>
+<UL>
+Specifies the increment/decrement value. The default is 1.
+</UL>
+<P>
+<pre>
+Name: <B>wrap</B>
+Class: <B>Wrap</B>
+Command-Line Switch: <B>-wrap</B>
+</pre>
+<UL>
+Specifies whether to wrap the spinner value upon reaching the minimum
+or maximum value in any of the forms acceptable to <B>Tcl_GetBoolean</B>.
+The default is true.
+</UL>
+<P>
+</pre><HR>
+
+</pre><H2>DESCRIPTION</H2>
+<P>
+The <B>spinint</B> command creates a spinint widget. The spinint allows
+"spinning" of integer values within a specified range with wrap support.
+The spinner arrows may be drawn horizontally or vertically.
+</pre>
+
+</pre><H2>METHODS</H2>
+<P>
+The <B>spinint</B> command creates a new Tcl command whose
+name is <I>pathName</I>. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+<pre>
+<I>pathName option </I>?<I>arg arg ...</I>?
+</pre>
+<I>Option</I> and the <I>arg</I>s
+determine the exact behavior of the command. The following
+commands are possible for spinint widgets:
+</pre><H2>ASSOCIATED METHODS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>delete</B><br>
+<B>insert</B><br>
+<B>xview</B><br>
+</td>
+<td valign=top>
+<B>get</B><br>
+<B>peek</B><br>
+</td>
+<td valign=top>
+<B>icursor</B><br>
+<B>scan</B><br>
+</td>
+<td valign=top>
+<B>index</B><br>
+<B>selection</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/entry.n.html"> "entry" </A> manual entry for details on the associated methods.
+</pre><H2>INHERITED METHODS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>childsite</B><br>
+</td>
+<td valign=top>
+<B>clear</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="entryfield.n.html"> "entryfield" </A> manual entry for details on the associated methods.
+</pre><H2>WIDGET-SPECIFIC METHODS</H2>
+<DL>
+<DT> <I>pathName <B>cget</B> <I>option</I>
+</I></B>
+<DD> Returns the current value of the configuration option given
+by <I>option</I>.
+<I>Option</I> may have any of the values accepted by the <B>spinint</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>configure</B> ?<I>option</I>? ?<I>value option value ...</I>?
+</I></B>
+<DD> Query or modify the configuration options of the widget.
+If no <I>option</I> is specified, returns a list describing all of
+the available options for <I>pathName</I> (see <B>Tk_ConfigureInfo</B> for
+information on the format of this list). If <I>option</I> is specified
+with no <I>value</I>, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no <I>option</I> is specified). If
+one or more <I>option-value</I> pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+<I>Option</I> may have any of the values accepted by the <B>spinint</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName <B>down</B>
+</I></B>
+<DD> Decrement the spinner value by the value given in the step option.
+</DL>
+<DL>
+<DT> <I>pathName <B>up</B>
+</I></B>
+<DD> Increment the spinner value by the value given in the step option.
+
+</DL>
+</pre><H2>COMPONENTS</H2>
+<UL>
+See the "Spinner" widget manual entry for details on the integer spinner
+component items.
+
+</UL>
+</pre><H2>EXAMPLE</H2>
+<pre>
+ option add *textBackground white
+
+ spinint .si -labeltext "Temperature" -labelpos w \\
+ -fixed yes -width 5 -range {32 212}
+
+ pack .si -pady 10
+</pre>
+</pre><H2>AUTHOR</H2>
+<A HREF="mailto:syockey@spd.dsccc.com">Sue Yockey</A>
+</pre><H2>KEYWORDS</H2>
+spinint, widget
diff --git a/iwidgets/demos/html/spinner.n.html b/iwidgets/demos/html/spinner.n.html
new file mode 100644
index 00000000000..6f2df317dd6
--- /dev/null
+++ b/iwidgets/demos/html/spinner.n.html
@@ -0,0 +1,308 @@
+<TITLE>spinner - Create and manipulate a spinner widget</TITLE>
+<H1>spinner - Create and manipulate a spinner widget</H1>
+
+</pre><H2>SYNOPSIS</H2>
+<B>spinner<I> <I>pathName </I>?<I>options</I>?
+</pre><H2>INHERITANCE</H2>
+itk::Widget &lt;- Labeledwidget &lt;- Spinner
+</pre><H2>STANDARD OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>background</B><br>
+<B>foreground</B><br>
+<B>insertBorderWidth</B><br>
+<B>justify</B><br>
+<B>selectForeground</B><br>
+</td>
+<td valign=top>
+<B>borderWidth</B><br>
+<B>highlightColor</B><br>
+<B>insertOffTime</B><br>
+<B>relief</B><br>
+<B>textVariable</B><br>
+</td>
+<td valign=top>
+<B>cursor</B><br>
+<B>highlightThickness</B><br>
+<B>insertOnTime</B><br>
+<B>selectBackground</B><br>
+</td>
+<td valign=top>
+<B>exportSelection</B><br>
+<B>insertBackground</B><br>
+<B>insertWidth</B><br>
+<B>selectBorderWidth</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/options.n.html"> "options" </A> manual entry for details on the standard options.
+</pre><H2>ASSOCIATED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>show</B><br>
+</td>
+<td valign=top>
+<B>state</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/entry.n.html"> "entry" </A> manual entry for details on the associated options.
+</pre><H2>INHERITED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>childSitePos</B><br>
+<B>invalid</B><br>
+<B>width</B><br>
+</td>
+<td valign=top>
+<B>command</B><br>
+<B>textBackground</B><br>
+</td>
+<td valign=top>
+<B>fixed</B><br>
+<B>textFont</B><br>
+</td>
+<td valign=top>
+<B>focusCommand</B><br>
+<B>validate</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="entryfield.n.html"> "entryfield" </A> widget manual entry for details on the above
+inherited options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>disabledForeground</B><br>
+<B>labelMargin</B><br>
+<B>state</B><br>
+</td>
+<td valign=top>
+<B>labelBitmap</B><br>
+<B>labelPos</B><br>
+</td>
+<td valign=top>
+<B>labelFont</B><br>
+<B>labelText</B><br>
+</td>
+<td valign=top>
+<B>labelImage</B><br>
+<B>labelVariable</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="labeledwidget.n.html"> "labeledwidget" </A> widget manual entry for details on the above
+inherited options.
+</pre><H2>WIDGET-SPECIFIC OPTIONS</H2>
+<P>
+<pre>
+Name: <B>arrowOrient</B>
+Class: <B>Orient</B>
+Command-Line Switch: <B>-arroworient</B>
+</pre>
+<UL>
+Specifies placement of arrow buttons: <B>horizontal</B> or <B>vertical</B>.
+The default is vertical.
+</UL>
+<P>
+<pre>
+Name: <B>decrement</B>
+Class: <B>Command</B>
+Command-Line Switch: <B>-decrement</B>
+</pre>
+<UL>
+Tcl command to be executed when down arrow is pressed.
+</UL>
+<P>
+<pre>
+Name: <B>increment</B>
+Class: <B>Command</B>
+Command-Line Switch: <B>-increment</B>
+</pre>
+<UL>
+Tcl command to be executed when up arrow is pressed.
+</UL>
+<P>
+<pre>
+Name: <B>repeatDelay</B>
+Class: <B>RepeatDelay</B>
+Command-Line Switch: <B>-repeatdelay</B>
+</pre>
+<UL>
+Specifies the initial delay in milliseconds before the spinner repeat action
+on the arrow buttons engages. The default is 300 milliseconds.
+</UL>
+<P>
+<pre>
+Name: <B>repeatInterval</B>
+Class: <B>RepeatInterval</B>
+Command-Line Switch: <B>-repeatinterval</B>
+</pre>
+<UL>
+Specifies the repeat delay in milliseconds between selections of the arrow
+buttons. A repeatinterval of 0 disables button repeat. The default is
+100 milliseconds.
+</UL>
+<P>
+</pre><HR>
+
+</pre><H2>DESCRIPTION</H2>
+<P>
+The <B>spinner</B> command creates a spinner widget. The spinner is
+comprised of an entryfield plus up and down arrow buttons.
+Arrows may be drawn horizontally or vertically.
+</pre>
+
+</pre><H2>METHODS</H2>
+<P>
+The <B>spinner</B> command creates a new Tcl command whose
+name is <I>pathName</I>. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+<pre>
+<I>pathName option </I>?<I>arg arg ...</I>?
+</pre>
+<I>Option</I> and the <I>arg</I>s
+determine the exact behavior of the command. The following
+commands are possible for spinner widgets:
+</pre><H2>ASSOCIATED METHODS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>delete</B><br>
+<B>insert</B><br>
+</td>
+<td valign=top>
+<B>get</B><br>
+<B>scan</B><br>
+</td>
+<td valign=top>
+<B>icursor</B><br>
+<B>selection</B><br>
+</td>
+<td valign=top>
+<B>index</B><br>
+<B>xview</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/entry.n.html"> "entry" </A> manual entry for details on the associated methods.
+</pre><H2>INHERITED METHODS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>childsite</B><br>
+</td>
+<td valign=top>
+<B>clear</B><br>
+</td>
+<td valign=top>
+<B>peek</B><br>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="entryfield.n.html"> "entryfield" </A> manual entry for details on the associated methods.
+</pre><H2>WIDGET-SPECIFIC METHODS</H2>
+<DL>
+<DT> <I>pathName <B>cget</B> <I>option</I>
+</I></B>
+<DD> Returns the current value of the configuration option given
+by <I>option</I>.
+<I>Option</I> may have any of the values accepted by the <B>spinner</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>configure</B> ?<I>option</I>? ?<I>value option value ...</I>?
+</I></B>
+<DD> Query or modify the configuration options of the widget.
+If no <I>option</I> is specified, returns a list describing all of
+the available options for <I>pathName</I> (see <B>Tk_ConfigureInfo</B> for
+information on the format of this list). If <I>option</I> is specified
+with no <I>value</I>, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no <I>option</I> is specified). If
+one or more <I>option-value</I> pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+<I>Option</I> may have any of the values accepted by the <B>spinner</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName <B>down</B>
+</I></B>
+<DD> Derived classes may overload this method to specialize functionality.
+</DL>
+<DL>
+<DT> <I>pathName <B>up</B>
+</I></B>
+<DD> Derived classes may overload this method to specialize functionality.
+
+</DL>
+</pre><H2>COMPONENTS</H2>
+<P>
+<pre>
+Name: <B>downarrow</B>
+Class: <B>Canvas</B>
+</pre>
+<UL>
+The downarrow component is the downward pointing button of the spinner. See
+the "canvas" widget manual entry for details on the downarrow component item.
+</UL>
+<P>
+<pre>
+Name: <B>uparrow</B>
+Class: <B>Canvas</B>
+</pre>
+<UL>
+The uparrow component is the upward pointing button of the spinner. See
+the "canvas" widget manual entry for details on the uparrow component item.
+</UL>
+</table>
+
+</pre><H2>EXAMPLE</H2>
+<pre>
+ set months {January February March April May June July \\
+ August September October November December}
+
+ proc blockInput {char} {
+ return 0
+ }
+
+ proc spinMonth {step} {
+ global months
+
+ set index [expr [lsearch $months [.sm get]] + $step]
+
+ if {$index &lt; 0} {set index 11}
+ if {$index &gt; 11} {set index 0}
+
+ .sm delete 0 end
+ .sm insert 0 [lindex $months $index]
+ }
+
+ spinner .sm -labeltext "Month : " -width 10 -fixed 10 -validate blockInput \\
+ -decrement {spinMonth -1} -increment {spinMonth 1}
+ .sm insert 0 January
+
+ pack .sm -padx 10 -pady 10
+</pre>
+</pre><H2>ACKNOWLEDGEMENTS:</H2>
+<P>
+Ken Copeland &lt;ken@hilco.com&gt;
+<UL>
+10/18/95 - Added auto-repeat action to spinner arrow buttons.
+</UL>
+<P>
+</pre><H2>AUTHOR</H2>
+Sue Yockey
+</pre><H2>KEYWORDS</H2>
+spinner, widget
diff --git a/iwidgets/demos/html/spintime.n.html b/iwidgets/demos/html/spintime.n.html
new file mode 100644
index 00000000000..8fdb55d80b1
--- /dev/null
+++ b/iwidgets/demos/html/spintime.n.html
@@ -0,0 +1,604 @@
+<TITLE>spintime - Create and manipulate time spinner widgets</TITLE>
+<H1>spintime - Create and manipulate time spinner widgets</H1>
+
+</pre><H2>SYNOPSIS</H2>
+<B>spintime<I> <I>pathName </I>?<I>options</I>?
+</pre><H2>INHERITANCE</H2>
+itk::Widget &lt;- Spintime
+
+</pre><H2>STANDARD OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>background</B><br>
+</td>
+<td valign=top>
+<B>cursor</B><br>
+</td>
+<td valign=top>
+<B>foreground</B><br>
+</td>
+<td valign=top>
+<B>relief</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/options.n.html"> "options" </A> manual entry for details on the standard options.
+</pre><H2>ASSOCIATED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>textBackground</B><br>
+</td>
+<td valign=top>
+<B>textFont</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="entryfield.n.html"> "entryfield" </A> manual entry for details on the above associated options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>labelFont</B><br>
+</td>
+<td valign=top>
+<B>labelMargin</B><br>
+</td>
+<td valign=top>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="labeledwidget.n.html"> "labeledwidget" </A> manual entry for details on the above associated
+options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>arrowOrient</B><br>
+</td>
+<td valign=top>
+<B>repeatDelay</B><br>
+</td>
+<td valign=top>
+<B>repeatInterval</B><br>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the <A HREF="spinner.n.html"> "spinner" </A> manual entry for details on the above associated options.
+
+</pre><H2>WIDGET-SPECIFIC OPTIONS</H2>
+<P>
+<pre>
+Name: <B>labelPos</B>
+Class: <B>Position</B>
+Command-Line Switch: <B>-labelpos</B>
+</pre>
+<UL>
+Specifies the position of the label along the sides of the various
+spinners: <B>n</B>, <B>e</B>, <B>s</B>, or <B>w</B>. The default is w.
+</UL>
+<P>
+<pre>
+Name: <B>hourLabel</B>
+Class: <B>Text</B>
+Command-Line Switch: <B>-hourlabel</B>
+</pre>
+<UL>
+Specifies the text of the label for the hour spinner. The default is "Hour".
+</UL>
+<P>
+<pre>
+Name: <B>hourOn</B>
+Class: <B>hourOn</B>
+Command-Line Switch: <B>-houron</B>
+</pre>
+<UL>
+Specifies whether or not to display the hour spinner in any of the forms
+acceptable to <B>Tcl_GetBoolean</B>. The default is true.
+</UL>
+<P>
+<pre>
+Name: <B>hourWidth</B>
+Class: <B>Width</B>
+Command-Line Switch: <B>-hourwidth</B>
+</pre>
+<UL>
+Specifies the width of the hour spinner in any of the forms acceptable to
+<B>Tcl_GetPixels</B>. The default is 3 pixels.
+</UL>
+<P>
+<pre>
+Name: <B>militaryOn</B>
+Class: <B>militaryOn</B>
+Command-Line Switch: <B>-militaryon</B>
+</pre>
+<UL>
+Specifies use of a 24 hour clock for hour display in any of the forms
+acceptable to <B>Tcl_GetBoolean</B>. The default is true.
+</UL>
+<P>
+<pre>
+Name: <B>minuteLabel</B>
+Class: <B>Text</B>
+Command-Line Switch: <B>-minutelabel</B>
+</pre>
+<UL>
+Specifies the text of the label for the minute spinner. The default is
+"Minute".
+</UL>
+<P>
+<pre>
+Name: <B>minuteOn</B>
+Class: <B>minuteOn</B>
+Command-Line Switch: <B>-minuteon</B>
+</pre>
+<UL>
+Specifies whether or not to display the minute spinner in any of the forms
+acceptable to <B>Tcl_GetBoolean</B>. The default is true.
+</UL>
+<P>
+<pre>
+Name: <B>minuteWidth</B>
+Class: <B>Width</B>
+Command-Line Switch: <B>-minutewidth</B>
+</pre>
+<UL>
+Specifies the width of the minute spinner in any of the forms acceptable to
+<B>Tcl_GetPixels</B>. The default is 3 pixels.
+</UL>
+<P>
+<pre>
+Name: <B>orient</B>
+Class: <B>Orient</B>
+Command-Line Switch: <B>-orient</B>
+</pre>
+<UL>
+Specifies the orientation of the hour, minute, and second spinners: <B>vertical</B> or <B>horizontal</B>. The default is horizontal.
+</UL>
+<P>
+<pre>
+Name: <B>secondLabel</B>
+Class: <B>Text</B>
+Command-Line Switch: <B>-secondlabel</B>
+</pre>
+<UL>
+Specifies the text of the label for the second spinner. The default is
+"Second"
+</UL>
+<P>
+<pre>
+Name: <B>secondOn</B>
+Class: <B>secondOn</B>
+Command-Line Switch: <B>-secondon</B>
+</pre>
+<UL>
+Specifies whether or not to display the second spinner in any of the forms
+acceptable to <B>Tcl_GetBoolean</B>. The default is true.
+</UL>
+<P>
+<pre>
+Name: <B>secondWidth</B>
+Class: <B>Width</B>
+Command-Line Switch: <B>-secondwidth</B>
+</pre>
+<UL>
+Specifies the width of the second spinner in any of the forms acceptable to
+<B>Tcl_GetPixels</B>. The default is 3 pixels.
+</UL>
+<P>
+<pre>
+Name: <B>timeMargin</B>
+Class: <B>Margin</B>
+Command-Line Switch: <B>-timemargin</B>
+</pre>
+<UL>
+Specifies the margin space between the hour, minute, and second spinners is
+any of the forms accpetable to <B>Tcl_GetPixels</B>. The default is 1 pixel.
+</UL>
+<P>
+<table cellpadding=5>
+<td valign=top>
+</pre><HR><br>
+<B>spintime</B><br>
+set<br>
+use<br>
+entry.<br>
+an<br>
+second<br>
+<P><br>
+creates<br>
+command<br>
+<I>pathName</I>.<br>
+be<br>
+various<br>
+widget.<br>
+following<br>
+<I>pathName<br>
+...</I>?<br>
+the<br>
+exact<br>
+command.<br>
+are<br>
+widgets:<br>
+<DT><br>
+</I></B><br>
+current<br>
+configuration<br>
+<I>option</I>.<br>
+any<br>
+accepted<br>
+command.<br>
+<I>pathName</I><br>
+option<br>
+<DD><br>
+the<br>
+the<br>
+<I>option</I><br>
+a<br>
+of<br>
+for<br>
+for<br>
+format<br>
+If<br>
+with<br>
+the<br>
+list<br>
+named<br>
+will<br>
+the<br>
+the<br>
+no<br>
+If<br>
+<I>option-value</I><br>
+then<br>
+the<br>
+to<br>
+value(s);<br>
+the<br>
+empty<br>
+have<br>
+values<br>
+<B>spintime</B><br>
+<DT><br>
+</I></B><br>
+current<br>
+spintime<br>
+format<br>
+as<br>
+value<br>
+and<br>
+respectively.<br>
+by<br>
+clock<br>
+information<br>
+and<br>
+<DL><br>
+<I>time</I><br>
+the<br>
+to<br>
+the<br>
+time<br>
+either<br>
+an<br>
+or<br>
+Reference<br>
+for<br>
+obtaining<br>
+format.<br>
+<table><br>
+<B>Spinint</B><br>
+</td>
+<td valign=top>
+</pre><H2>DESCRIPTION</H2><br>
+command<br>
+of<br>
+in<br>
+The<br>
+hour,<br>
+spinner<br>
+The<br>
+a<br>
+whose<br>
+This<br>
+used<br>
+operations<br>
+It<br>
+general<br>
+option<br>
+</pre><br>
+<I>arg</I>s<br>
+behavior<br>
+The<br>
+possible<br>
+</pre><H2>WIDGET-SPECIFIC<br>
+<I>pathName<br>
+<DD><br>
+value<br>
+option<br>
+<I>Option</I><br>
+of<br>
+by<br>
+</DL><br>
+<B>configure</B><br>
+value<br>
+Query<br>
+configuration<br>
+widget.<br>
+is<br>
+list<br>
+the<br>
+<I>pathName</I><br>
+information<br>
+of<br>
+<I>option</I><br>
+no<br>
+command<br>
+describing<br>
+option<br>
+be<br>
+corresponding<br>
+value<br>
+<I>option</I><br>
+one<br>
+pairs<br>
+the<br>
+given<br>
+have<br>
+in<br>
+command<br>
+string.<br>
+any<br>
+accepted<br>
+command.<br>
+<I>pathName<br>
+<DD><br>
+contents<br>
+widget<br>
+of<br>
+an<br>
+using<br>
+<B>-clicks</B><br>
+The<br>
+string.<br>
+command<br>
+on<br>
+its<br>
+<DT><br>
+</I></B><br>
+currently<br>
+be<br>
+time<br>
+may<br>
+as<br>
+integer<br>
+the<br>
+the<br>
+more<br>
+times<br>
+</DL><br>
+Name:<br>
+</td>
+<td valign=top>
+<P><br>
+creates<br>
+spinners<br>
+time<br>
+set<br>
+minute,<br>
+widget.<br>
+<B>spintime</B><br>
+new<br>
+name<br>
+command<br>
+to<br>
+on<br>
+has<br>
+form:<br>
+</I>?<I>arg<br>
+<I>Option</I><br>
+determine<br>
+of<br>
+following<br>
+for<br>
+METHODS</H2><br>
+<B>cget</B><br>
+Returns<br>
+of<br>
+given<br>
+may<br>
+the<br>
+the<br>
+<DL><br>
+?<I>option</I>?<br>
+...</I>?<br>
+or<br>
+options<br>
+If<br>
+specified,<br>
+describing<br>
+available<br>
+(see<br>
+on<br>
+this<br>
+is<br>
+<I>value</I>,<br>
+returns<br>
+the<br>
+(this<br>
+identical<br>
+sublist<br>
+returned<br>
+is<br>
+or<br>
+are<br>
+command<br>
+widget<br>
+the<br>
+this<br>
+returns<br>
+<I>Option</I><br>
+of<br>
+by<br>
+</DL><br>
+<B>get</B><br>
+Returns<br>
+of<br>
+in<br>
+string<br>
+integer<br>
+the<br>
+format<br>
+default<br>
+Reference<br>
+for<br>
+obtaining<br>
+formats.<br>
+<I>pathName<br>
+<DD><br>
+displayed<br>
+that<br>
+argument.<br>
+be<br>
+a<br>
+clock<br>
+keyword<br>
+clock<br>
+information<br>
+and<br>
+</pre><H2>COMPONENTS</H2><br>
+<B>hour</B><br>
+</td>
+<td valign=top>
+The<br>
+a<br>
+for<br>
+value<br>
+includes<br>
+and<br>
+</pre><H2>METHODS</H2><br>
+command<br>
+Tcl<br>
+is<br>
+may<br>
+invoke<br>
+the<br>
+the<br>
+<pre><br>
+arg<br>
+and<br>
+the<br>
+the<br>
+commands<br>
+spintime<br>
+<DL><br>
+<I>option</I><br>
+the<br>
+the<br>
+by<br>
+have<br>
+values<br>
+<B>spintime</B><br>
+<DT><br>
+?<I>value<br>
+</I></B><br>
+modify<br>
+of<br>
+no<br>
+returns<br>
+all<br>
+options<br>
+<B>Tk_ConfigureInfo</B><br>
+the<br>
+list).<br>
+specified<br>
+then<br>
+a<br>
+one<br>
+list<br>
+to<br>
+of<br>
+if<br>
+specified).<br>
+more<br>
+specified,<br>
+modifies<br>
+option(s)<br>
+given<br>
+case<br>
+an<br>
+may<br>
+the<br>
+the<br>
+<DL><br>
+?<B>format</B>?<br>
+the<br>
+the<br>
+a<br>
+or<br>
+clock<br>
+<B>-string</B><br>
+options<br>
+is<br>
+the<br>
+more<br>
+time<br>
+</DL><br>
+<B>show</B><br>
+Changes<br>
+time<br>
+of<br>
+The<br>
+specified<br>
+string,<br>
+value<br>
+"now".<br>
+command<br>
+on<br>
+its<br>
+<P><br>
+Class:<br>
+</td>
+</table>
+<UL>
+The hour component is the hour spinner of the time spinner. See the
+SpinInt widget manual entry for details on the hour component item.
+</UL>
+<P>
+<pre>
+Name: <B>minute</B>
+Class: <B>Spinint</B>
+</pre>
+<UL>
+The minute component is the minute spinner of the time spinner. See
+the SpinInt widget manual entry for details on the minute component item.
+</UL>
+<P>
+<pre>
+Name: <B>second</B>
+Class: <B>Spinint</B>
+</pre>
+<UL>
+The second component is the second spinner of the time spinner. See the
+SpinInt widget manual entry for details on the second component item.
+</UL>
+</table>
+
+</pre><H2>EXAMPLE</H2>
+<pre>
+spintime .st
+pack .st -padx 10 -pady 10
+</pre>
+</pre><H2>AUTHORS</H2>
+Sue Yockey
+<P>
+Mark L. Ulferts
+</pre><H2>KEYWORDS</H2>
+spintime, spinint, spinner, entryfield, entry, widget
+
diff --git a/iwidgets/demos/html/tabnotebook.n.html b/iwidgets/demos/html/tabnotebook.n.html
new file mode 100644
index 00000000000..97064a914dc
--- /dev/null
+++ b/iwidgets/demos/html/tabnotebook.n.html
@@ -0,0 +1,860 @@
+<TITLE>tabnotebook - create and manipulate tabnotebook widgets</TITLE>
+<H1>tabnotebook - create and manipulate tabnotebook widgets</H1>
+
+</pre><H2>SYNOPSIS</H2>
+<B>tabnotebook</B> <I>pathName</I>? <I>options</I>?
+</pre><H2>INHERITANCE</H2>
+itk::Widget &lt;- tabnotebook
+</pre><H2>STANDARD OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>background</B><br>
+<B>cursor</B><br>
+</td>
+<td valign=top>
+<B>disabledForeground</B><br>
+<B>font</B><br>
+</td>
+<td valign=top>
+<B>foreground</B><br>
+<B>height</B><br>
+</td>
+<td valign=top>
+<B>scrollCommand</B><br>
+<B>width</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/options.n.html"> "options" </A> manual entry for details on the standard options.
+</pre><H2>WIDGET-SPECIFIC OPTIONS</H2>
+<P>
+<pre>
+Name: <B>angle</B>
+Class: <B>Angle</B>
+Command-Line Switch: <B>-angle</B>
+</pre>
+<UL>
+Specifes the angle of slope from the inner edge to the outer edge of the tab.
+An angle of 0 specifies square tabs. Valid ranges are 0 to 45 degrees
+inclusive. Default is 15 degrees. If <B>tabPos</B> is e or w, this option
+is ignored.
+</UL>
+<P>
+<pre>
+Name: <B>auto</B>
+Class: <B>Auto</B>
+Command-Line Switch: <B>-auto</B>
+</pre>
+<UL>
+Specifies whether to use the automatic packing/unpacking algorithm of the
+notebook. A value of true indicates that page frames will be unpacked and
+packed acoording to the algorithm described in the select command. A value
+of <B>false</B> leaves the current page packed and
+subsequent <B>selects</B>, <B>next</B>, or <B>previous</B> commands do not
+switch pages automatically. In either case the page's associated
+command (see the <B>add</B> command's description of the command option) is
+invoked. The value may have any of the forms accepted by
+the <B>Tcl_GetBoolean</B>, such as <B>true</B>, <B>false</B>, <B>0</B>,
+<B>1</B>, <B>yes</B>, or <B>no</B>.
+</UL>
+<P>
+<pre>
+Name: <B>backdrop</B>
+Class: <B>Backdrop</B>
+Command-Line Switch: <B>-backdrop</B>
+</pre>
+<UL>
+Specifies a background color to use when filling in the backdrop area
+behind the tabs.
+</UL>
+<P>
+<pre>
+Name: <B>background</B>
+Class: <B>Background</B>
+Command-Line Switch: <B>-background</B>
+</pre>
+<UL>
+Specifies a background color to use for displaying a page and its associated
+tab. This can be thought of as the selected tab background color, since the
+tab associated with the selected page is the selected tab.
+</UL>
+<P>
+<pre>
+Name: <B>bevelAmount</B>
+Class: <B>BevelAmount</B>
+Command-Line Switch: <B>-bevelamount</B>
+</pre>
+<UL>
+Specifes the size of tab corners. A value of 0 with <B>angle</B> set to
+0 results in square tabs. A <B>bevelAmount</B> of 4, means that the tab will
+be drawn with angled corners that cut in 4 pixels from the edge of
+the tab. The default is 0.
+</UL>
+<P>
+<pre>
+Name: <B>borderWidth</B>
+Class: <B>BorderWidth</B>
+Command-Line Switch: <B>-borderwidth</B>
+</pre>
+<UL>
+Specifies the width of shadowed border to place around the notebook area of
+the tabnotebook. The default value is 2.
+</UL>
+<P>
+<pre>
+Name: <B>disabledForeground</B>
+Class: <B>DisabledForeground</B>
+Command-Line Switch: <B>-disabledforeground</B>
+</pre>
+<UL>
+Specifies a foreground color to use for displaying a tab's label when
+its <B>state</B> is disabled.
+</UL>
+<P>
+<pre>
+Name: <B>equalTabs</B>
+Class: <B>EqualTabs</B>
+Command-Line Switch: <B>-equaltabs</B>
+</pre>
+<UL>
+Specifies whether to force tabs to be equal sized or not. A value
+of <B>true</B> means constrain tabs to be equal sized. A value
+of <B>false</B> allows each tab to size based on the text label size. The
+value may have any of the forms accepted by the <B>Tcl_GetBoolean</B>, such
+as <B>true</B>, <B>false</B>, <B>0</B>, <B>1</B>, <B>yes</B>, or <B>no</B>.
+</UL>
+<UL>
+For horizontally positioned tabs (<B>tabpos</B> is either <B>s</B> or <B>n</B>),
+<B>true</B> forces all tabs to be equal width (the width being equal to
+the longest label plus any <B>padX</B> specified). Horizontal tabs are
+always equal in height.
+</UL>
+<UL>
+For vertically positioned tabs (<B>tabpos</B> is either <B>w</B> or <B>e</B>),
+<B>true</B> forces all tabs to be equal height (the height being equal to the
+height of the label with the largest font). Vertically oriented tabs
+are always equal in width.
+</UL>
+<P>
+<pre>
+Name: <B>foreground</B>
+Class: <B>Foreground</B>
+Command-Line Switch: <B>-foreground</B>
+</pre>
+<UL>
+Specifies a foreground color to use for displaying a page and its associated
+tab label. This can be thought of as the selected tab background color,
+since the tab associated with the selected page is the selected tab.
+</UL>
+<P>
+<pre>
+Name: <B>gap</B>
+Class: <B>Gap</B>
+Command-Line Switch: <B>-gap</B>
+</pre>
+<UL>
+Specifies the amount of pixel space to place between each tab. Value may
+be any pixel offset value. In addition, a special keyword <B>overlap</B>
+can be used as the value to achieve a standard overlap of tabs. This value
+may have any of the forms acceptable to <B>Tk_GetPixels</B>.
+</UL>
+<P>
+<pre>
+Name: <B>margin</B>
+Class: <B>Margin</B>
+Command-Line Switch: <B>-Bmargin</B>
+</pre>
+<UL>
+Specifies the amount of space to place between the outside edge of the
+tabnotebook and the outside edge of its tabs. If <B>tabPos</B> is <B>s</B>,
+this is the amount of space between the bottom edge of the tabnotebook and
+the bottom edge of the set of tabs. If <B>tabPos</B> is <B>n</B>, this is
+the amount of space between the top edge of the tabnotebook and the top
+edge of the set of tabs. If <B>tabPos</B> is <B>e</B>, this is the amount of
+space between the right edge of the tabnotebook and the right edge of the
+set of tabs. If <B>tabPos</B> is <B>w</B>, this is the amount of space
+between the left edge of the tabnotebook and the left edge of the set
+of tabs. This value may have any of the forms acceptable to <B>Tk_GetPixels</B>.
+</UL>
+<P>
+<pre>
+Name: <B>padX</B>
+Class: <B>PadX</B>
+Command-Line Switch: <B>-padx</B>
+</pre>
+<UL>
+Specifies a non-negative value indicating how much extra space to request
+for a tab around its label in the X-direction. When computing how large
+a window it needs, the tab will add this amount to the width it would
+normally need The tab will end up with extra internal space to the left
+and right of its text label. This value may have any of the forms acceptable
+to <B>Tk_GetPixels</B>.
+</UL>
+<P>
+<pre>
+Name: <B>padY</B>
+Class: <B>PadY</B>
+Command-Line Switch: <B>-pady</B>
+</pre>
+<UL>
+Specifies a non-negative value indicating how much extra space to request for
+a tab around its label in the Y-direction. When computing how large a
+window it needs, the tab will add this amount to the height it would normally
+need The tab will end up with extra internal space to the top and bottom of
+its text label. This value may have any of the forms acceptable
+to <B>Tk_GetPixels</B>.
+</UL>
+<P>
+<pre>
+Name: <B>raiseSelect</B>
+Class: <B>RaiseSelect</B>
+Command-Line Switch: <B>-raiseselect</B>
+</pre>
+<UL>
+Specifes whether to slightly raise the selected tab from the rest of the
+tabs. The selected tab is drawn 2 pixels closer to the outside of the
+tabnotebook than the unselected tabs. A value of <B>true</B> says to
+raise selected tabs, a value of <B>false</B> turns this feature off. The
+default is <B>false</B>. The value may have any of the forms accepted
+by the <B>Tcl_GetBoolean</B>, such as <B>true</B>, <B>false</B>, <B>0</B>,
+<B>1</B>, <B>yes</B>, or <B>no</B>.
+</UL>
+<P>
+<pre>
+Name: <B>start</B>
+Class: <B>Start</B>
+Command-Line Switch: <B>-start</B>
+</pre>
+<UL>
+Specifies the amount of space to place between the left or top edge of the
+tabnotebook and the starting edge of its tabs. For horizontally positioned
+tabs, this is the amount of space between the left edge of the notebook and
+the left edge of the first tab. For vertically positioned tabs, this is the
+amount of space between the top of the notebook and the top of the first
+tab. This value may change if the user performs a MButton-2 scroll on the
+tabs. This value may have any of the forms acceptable to <B>Tk_GetPixels</B>.
+</UL>
+<P>
+<pre>
+Name: <B>state</B>
+Class: <B>State</B>
+Command-Line Switch: <B>-state</B>
+</pre>
+<UL>
+Sets the active state of the tabnotebook. Specifying <B>normal</B> allows
+all pages to be selectable. Specifying <B>disabled</B> disables the notebook
+causing all page tabs to be drawn in the <B>disabledForeground</B> color.
+</UL>
+<P>
+<pre>
+Name: <B>tabBackground</B>
+Class: <B>TabBackground</B>
+Command-Line Switch: <B>-tabbackground</B>
+</pre>
+<UL>
+Specifies a background color to use for displaying tab backgrounds when
+they are in their unselected state. This is the background associated with
+tabs on all pages other than the selected page.
+</UL>
+<P>
+<pre>
+Name: <B>tabBorders</B>
+Class: <B>TabBorders</B>
+Command-Line Switch: <B>-tabborders</B>
+</pre>
+<UL>
+Specifies whether to draw the borders of tabs that are not selected.
+Specifying <B>true</B> (the default) draws these borders,
+specifying <B>false</B> draws only the border around the selected tab. The
+value may have any of the forms accepted by the <B>Tcl_GetBoolean</B>,
+such as <B>true</B>, <B>false</B>, <B>0</B>, <B>1</B>,<B> yes</B>, or <B>no</B>.
+</UL>
+<P>
+<pre>
+Name: <B>tabForeground</B>
+Class: <B>TabForeground</B>
+Command-Line Switch: <B>-tabforeground</B>
+</pre>
+<UL>
+Specifies a foreground color to use for displaying tab labels when they
+are in their unselected state. This is the foreground associated with tabs
+on all pages other than the selected page.
+</UL>
+<P>
+<pre>
+Name: <B>tabPos</B>
+Class: <B>TabPos</B>
+Command-Line Switch: <B>-tabpos</B>
+</pre>
+<UL>
+Specifies the location of the set of tabs in relation to the notebook
+area. Must be n, s, e, or w. Defaults to s.
+</UL>
+</pre><HR>
+</pre><H2>DESCRIPTION</H2>
+<P>
+The <B>tabnotebook</B> command creates a new window (given by the pathName
+argument) and makes it into a <B>tabnotebook</B> widget. Additional options,
+described above may be specified on the command line or in the option
+database to configure aspects of the tabnotebook such as its colors, font,
+and text. The tabnotebook command returns its pathName argument. At the
+time this command is invoked, there must not exist a window named
+pathName, but pathName's parent must exist.
+<P>
+A <B>tabnotebook</B> is a widget that contains a set of tabbed pages. It
+displays one page from the set as the selected page. A Tab displays the
+label for the page to which it is attached and serves as a page
+selector. When a page's tab is selected, the page's contents are displayed
+in the page area. The selected tab has a three-dimensional effect to make
+it appear to float above the other tabs. The tabs are displayed as a group
+along either the left, top, right, or bottom edge. When first created a
+tabnotebook has no pages. Pages may be added or deleted using widget
+commands described below.
+<P>
+A special option may be provided to the tabnotebook. The <B>-auto</B>
+option specifies whether the tabnotebook will automatically handle the
+unpacking and packing of pages when pages are selected. A value of
+true signifies that the notebook will automatically manage it. This is the
+default value. A value of false signifies the notebook will not perform
+automatic switching of pages.
+</pre><H2>NOTEBOOK PAGES</H2>
+A tabnotebook's pages area contains a single child site frame. When a
+new page is created it is a child of this frame. The page's child site
+frame serves as a geometry container for applications to pack widgets
+into. It is this frame that is automatically unpacked or packed when
+the auto option is true. This creates the effect of one page being visible
+at a time. When a new page is selected, the previously selected page's
+child site frame is automatically unpacked from the tabnotebook's child
+site frame and the newly selected page's child site is packed into the
+tabnotebook's child site frame.
+<P>
+However, sometimes it is desirable to handle page changes in a different
+manner. By specifying the <B>auto</B> option as <B>false</B>, child site
+packing can be disabled and done differently. For example, all widgets
+might be packed into the first page's child site <B>frame</B>. Then when
+a new page is selected, the application can reconfigure the widgets
+and give the appearance that the page was flipped.
+<P>
+In both cases the command option for a page specifies a Tcl Command
+to execute when the page is selected. In the case of <B>auto</B>
+being <B>true</B>, it is between the unpacking of the previously selected
+page and the packing of the newly selected page.
+<P>
+Notebook pages can also be controlled with scroll bars or other widgets
+that obey the <B>scrollcommand</B> protocol. By giving a scrollbar
+a <B>-command</B> to call the tabnotebook's <B>select</B> method, the
+tabnotebook can be controlled with a scrollbar.
+<P>
+The notebook area is implemented with the notebook mega widget.
+</pre><H2>TABS</H2>
+Tabs appear along the edge of the notebook area. Tabs are drawn to appear
+attached to their associated page. When a tab is clicked on, the associated
+page is selected and the tab is drawn as raised above all other tabs and as
+a seamless part of its notebook page. Tabs can be controlled in their
+location along the edges, the angle tab sides are drawn with, gap between
+tabs, starting margin of tabs, internal padding around text labels in
+a tab, the font, and its label.
+<P>
+The Tab area is implemented with the <B>tabset</B> mega widget.
+See <B>tabset(1)</B>. Tabs may be oriented along either the north, south,
+east, or west sides with the <B>tabPos</B> option. North and south tabs
+may appear as angled, square, or bevelled. West and east tabs may appear
+as square or bevelled. By changing tab gaps, tab angles, bevelling,
+orientations, colors, fonts, start locations, and margins; tabs may appear
+in a wide variety of styles. For example, it is possible to implement
+Microsoft-style tabs, Borland property tab styles, or Borland Delphi
+style tabs all with the same tabnotebook.
+</pre><H2>WIDGET-SPECIFIC METHODS</H2>
+<P>
+The <B>tabnotebook</B> command creates a new Tcl command whose name
+is <I>pathName</I>. This command may be used to invoke various operations
+on the widget. It has the following general form:
+<pre>
+<I>pathName option </I>?<I>arg arg ...</I>?
+</pre>
+<I>option</I> and the <I>arg</I>s
+determine the exact behavior of the command.
+<P>
+Many of the widget commands for a notebook take as one argument an
+indicator of which page of the notebook to operate on. These indicators are
+called indexes and may be specified in any of the following forms:
+<DL>
+<DT> <I>number</I>
+</I></B>
+<DD> Specifies the page numerically, where 0 corresponds to the first page
+in the notebook, 1 to the second, and so on.
+</DL>
+<DL>
+<DT> <B>select</B>
+</I></B>
+<DD> Specifies the currently selected page's index. If no page is currently
+selected, the value -1 is returned.
+</DL>
+<DL>
+<DT> <B>end</B>
+</I></B>
+<DD> Specifes the last page in the tabnotebook's index. If the notebook is empty
+this will return -1.
+</DL>
+<DL>
+<DT> <I>pattern</I>
+</I></B>
+<DD> If the index doesn't satisfy any of the above forms, then this form is
+used. Pattern is pattern-matched against the label of each page in the
+notebook, in order from the first to the last page, until a matching entry
+is found. The rules of Tcl_StringMatch are used.
+'.............................................................................
+The following commands are possible for tabnotebook widgets:
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>add</B> ?<I>option</I> <I>value</I> <I>option</I> <I>value</I> ...?
+</I></B>
+<DD> Add a new page at the end of the tabnotebook. A new child site frame is
+created. Returns the child site pathName. If additional arguments are
+present, they specify any of the following options:
+</DL>
+<UL>
+<DL>
+<DT> <B>-angle</B> <I>value</I>
+</I></B>
+<DD> Specifes the angle of slope from the inner edge to the outer edge of the
+tab. An angle of 0 specifies square tabs. Valid ranges are 0 to 45 degrees
+inclusive. Default is 15 degrees. If this option is specified as an empty
+string (the default), then the angle option for the overall tabnotebook
+is used. This is generally only set at the tabnotebook level. Tabs normally
+will want to share the same angle value.
+</DL>
+<DL>
+<DT> <B>-background</B> <I>value</I>
+</I></B>
+<DD> Specifies a background color to use for displaying tabs when they are
+selected and for displaying the current page. If this option is specified
+as an empty string (the default), then the background option for the
+overall tabnotebook is used.
+</DL>
+<DL>
+<DT> <B>-bevelamount</B> <I>value</I>
+</I></B>
+<DD> Specifes the size of tab corners. A value of 0 with angle set to 0
+results in square tabs. A bevelAmount of 4, means that the tab will be
+drawn with angled corners that cut in 4 pixels from the edge of the tab.
+The default is 0. This is generally only set at the tabnotebook level.
+Tabs normally will want to share the same bevelAmount.
+</DL>
+<DL>
+<DT> <B>-bitmap</B> <I>value</I>
+</I></B>
+<DD> If label is a non-empty string, specifies a bitmap to display in this
+page's tab. Bitmap may be of any of the forms accepted by Tk_GetPixmap.
+</DL>
+<DL>
+<DT> <B>-command</B> <I>value</I>
+</I></B>
+<DD> Specifies a Tcl command to be executed when this page is selected. This
+allows the programmer a hook to reconfigure this page's widgets or any
+other page's widgets.
+<UL>
+If the tabnotebook has the auto option set to true, when a page is
+selected this command will be called immediately after the previously
+selected page is unpacked and immediately before this page is selected. The
+index value select is valid during this Tcl command. `index select' will
+return this page's page number.
+</UL>
+<UL>
+If the auto option is set to false, when a page is selected the unpack
+and pack calls are bypassed. This Tcl command is still called.
+</UL>
+</DL>
+<DL>
+<DT> <B>-disabledforeground</B> <I>value</I>
+</I></B>
+<DD> Specifies a foreground color to use for displaying tab labels when tabs
+are in their disable state. If this option is specified as an empty
+string (the default), then the disabledforeground option for the overall
+tabnotebook is used.
+</DL>
+<DL>
+<DT> <B>-font</B> <I>value</I>
+</I></B>
+<DD> Specifies the font to use when drawing a text label on a page tab. If
+this option is specified as an empty string then the font option for the
+overall tabnotebook is used..
+</DL>
+<DL>
+<DT> <B>-foreground</B> <I>value</I>
+</I></B>
+<DD> Specifies a foreground color to use for displaying tab labels when they are
+selected. If this option is specified as an empty string (the default),
+then the foreground option for the overall tabnotebook is used.
+</DL>
+<DL>
+<DT> <B>-label</B> <I>value</I>
+</I></B>
+<DD> Specifies a string to display as an identifying label for a notebook
+page. This label serves as an additional identifier used to reference the
+page. This label may be used for the index value in widget commands.
+</DL>
+<DL>
+<DT> <B>-tabbackground</B> <I>value</I>
+</I></B>
+<DD> Specifies a background color to use for displaying a tab when it is not
+elected. If this option is specified as an empty string (the default), then
+the tabBackground option for the overall tabnotebook is used.
+</DL>
+<DL>
+<DT> <B>-tabforeground</B> <I>value</I>
+</I></B>
+<DD> Specifies a foreground color to use for displaying the tab's text label
+when it is not selected. If this option is specified as an empty
+string (the default), then the tabForeground option for the overall
+tabnotebook is used.
+</DL>
+<DL>
+<DT> <B>-padx</B> <I>value</I>
+</I></B>
+<DD> Specifies a non-negative value indicating how much extra space to request
+for a tab around its label in the X-direction. When computing how large a
+window it needs, the tab will add this amount to the width it would
+normally need The tab will end up with extra internal space to the
+left and right of its text label. This value may have any of the forms
+acceptable to Tk_GetPixels. If this option is specified as an empty
+string (the default), then the padX option for the overall tabnotebook is used
+</DL>
+<DL>
+<DT> <B>-pady</B> <I>value</I>
+</I></B>
+<DD> Specifies a non-negative value indicating how much extra space to request
+for a tab around its label in the Y-direction. When computing how large
+a window it needs, the tab will add this amount to the height it would
+normally need The tab will end up with extra internal space to the top and
+bottom of its text label. This value may have any of the forms acceptable
+to Tk_GetPixels. If this option is specified as an empty string (the
+default), then the padY option for the overall tabnotebook is used
+</DL>
+<DL>
+<DT> <B>-state</B> <I>value</I>
+</I></B>
+<DD> Specifies one of two states for the page: normal or disabled. In normal state
+unselected tabs are displayed using the tabforeground and tabbackground
+option from the tabnotebook or the page. Selected tabs and pages are
+displayed using the foreground and background option from the tabnotebook or
+the page. The disabled state means that the page and its tab is
+insensitive: it doesn't respond to mouse button presses or releases. In this
+state the entry is displayed according to its disabledForeground option for
+the tabnotebook and the background/tabbackground option from the page or
+the tabnotebook.
+</DL>
+</UL>
+<DL>
+<DT> '&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;
+</I></B>
+<DD> <I>pathName</I> <B>childSite</B> ?<I>index</I>?
+If passed no arguments, returns a list of pathNames for all the pages
+in the tabnotebook. If the tab notebook is empty, an empty list is returned
+<UL>
+If <I>index</I> is passed, it returns the <I>pathName</I> for the page's
+child site <B>frame</B> specified by <I>index</I>. Widgets that are created
+with this <I>pathName</I> will be displayed when the associated page is
+selected. If <I>index</I> is not a valid index, an empty string is returned.
+</UL>
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>configure</B> ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
+</I></B>
+<DD> Query or modify the configuration options of the widget. If no <I>option</I>
+is specified, returns a list describing all of the available options
+for <I>pathName</I> (see <B>Tk_ConfigureInfo</B> for information on the
+format of this list). If option is specified with no value, then the
+command returns a list describing the one named option (this list will be
+identical to the corresponding sublist of the value returned if no option
+is specified). If one or more option-value pairs are specified, then the
+command modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string. <I>Option</I> may have any
+of the values accepted by the tabnotebook command.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>delete</B> <I>index1</I> ?<I>index2</I>?
+</I></B>
+<DD> Delete all of the pages between <I>index1</I> and <I>index2</I> inclusive.
+If <I>index2</I> is omitted then it defaults to <I>index1</I>. Returns an
+empty string.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>index</B> <I>index</I>
+</I></B>
+<DD> Returns the numerical index corresponding to <I>index</I>.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>insert</B> <I>index</I> ?<I>option</I> <I>value</I> <I>option</I> <I>value</I> ...?
+</I></B>
+<DD> Insert a new page in the tabnotebook before the page specified
+by <I>index</I>. A new child site <B>frame</B> is created. The additional
+arguments are the same as for the <B>add</B> command. Returns the
+child site <I>pathName</I>.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>next</B>
+</I></B>
+<DD> Advances the selected page to the next page (order is determined by
+insertion order). If the currently selected page is the last page in
+the notebook, the selection wraps around to the first page in the
+notebook. It behaves as if the user selected the new page.
+<UL>
+For notebooks with <B>auto</B> set to <B>true</B> the current page's
+child site is unpacked from the notebook's child site frame. Then the next
+page's child site is packed into the notebook's child site frame. The
+Tcl command given with the command option will be invoked between these
+two operations.
+</UL>
+<UL>
+For notebooks with <B>auto</B> set to <B>false</B> the Tcl command given
+with the command option will be invoked.
+</UL>
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>pageconfigure</B> <I>index</I> ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
+</I></B>
+<DD> This command is similar to the <B>configure</B> command, except that it
+applies to the options for an individual page, whereas configure applies
+to the options for the tabnotebook as a whole. <I>Options</I> may have
+any of the values accepted by the add widget command. If options are
+specified, options are modified as indicated in the command and the
+command returns an empty string. If no options are specified, returns a
+list describing the current options for page index (see <B>Tk_ConfigureInfo</B>
+for information on the format of this list).
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>prev</B>
+</I></B>
+<DD> Moves the selected page to the previous page (order is determined by
+insertion order). If the currently selected page is the first page in
+the notebook, the selection wraps around to the last page in the notebook. It
+behaves as if the user selected the new page.
+<UL>
+For notebooks with <B>auto</B> set to <B>true</B> the current page's
+child site is unpacked from the notebook's child site <B>frame</B>. Then the
+previous page's child site is packed into the notebook's child site frame.
+The Tcl command given with the command option will be invoked between these
+two operations.
+</UL>
+<UL>
+For notebooks with <B>auto</B> set to <B>false</B> the Tcl command given
+with the command option will be invoked.
+</UL>
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>select</B> <I>index</I>
+</I></B>
+<DD> Selects the page specified by <I>index</I> as the currently selected page.
+It behaves as if the user selected the new page.
+<UL>
+For notebooks with <B>auto</B> set to <B>true</B> the current page's child
+site is unpacked from the notebook's child site frame. Then the <I>index</I>
+page's child site is packed into the notebook's child site frame. The
+Tcl command given with the command option will be invoked between these two
+operations.
+</UL>
+<UL>
+For notebooks with <B>auto</B> set to <B>false</B> the Tcl command given
+with the command option will be invoked.
+</UL>
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>view</B>
+</I></B>
+<DD> Returns the currently selected page. This command is for compatibility with
+the <B>scrollbar</B> widget.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>view</B> <I>index</I>
+</I></B>
+<DD> Selects the page specified by <I>index</I> as the currently selected page.
+This command is for compatibility with the <B>scrollbar</B> widget.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>view</B> <B>moveto</B> <I>fraction</I>
+</I></B>
+<DD> Uses the <I>fraction</I> value to determine the corresponding page to move to.
+This command is for compatibility with the <B>scrollbar</B> widget.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>view</B> <B>scroll</B> <I>num</I> <I>what</I>
+</I></B>
+<DD> Uses the <I>num</I> value to determine how many pages to move forward or
+backward (<I>num</I> can be negative or positive). The <I>what</I> argument
+is ignored. This command is for compatibility with the <B>scrollbar</B> widget.
+</DL>
+</pre><H2>COMPONENTS</H2>
+<P>
+Generally all behavior of the internal components, <B>tabset</B>
+and <B>notebook</B> are controlled via the <B>pageconfigure</B> method.
+The following section documents these two components.
+<P>
+<pre>
+Name: <B>tabset</B>
+Class: <B>Tabset</B>
+</pre>
+<UL>
+This is the tabset component. It implements the tabs that are associated
+with the notebook component.
+</UL>
+<UL>
+See the "<B>Tabset</B>" widget manual entry for details on
+the <B>tabset</B> component item.
+</UL>
+<P>
+<pre>
+Name: <B>notebook</B>
+Class: <B>Notebook</B>
+</pre>
+<UL>
+This is the notebook component. It implements the notebook that contains the
+pages of the tabnotebook.
+</UL>
+<UL>
+See the "<B>Notebook</B>" widget manual entry for details on
+the <B>notebook</B> component item.
+</UL>
+</table>
+</pre><H2>EXAMPLE</H2>
+<P>
+Following is an example that creates a tabnotebook with two pages.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<UL><br>
+the<br>
+pack<br>
+-width<br>
+pack<br>
+nw<br>
+\\<br>
+-side<br>
+10<br>
+<UL><br>
+pages<br>
+#<br>
+and<br>
+add<br>
+.tn<br>
+Two"<br>
+Get<br>
+frames<br>
+pages.<br>
+childsite<br>
+[.tn<br>
+</UL><br>
+buttons<br>
+of<br>
+$page1CS.b<br>
+pack<br>
+-text<br>
+$page2CS.b<br>
+Select<br>
+of<br>
+select<br>
+</td>
+<td valign=top>
+</UL><br>
+tabnotebook<br>
+it.<br>
+100<br>
+.tn<br>
+\\<br>
+-expand<br>
+left<br>
+\\<br>
+#<br>
+to<br>
+labelled<br>
+"Page<br>
+-label<br>
+add<br>
+</UL><br>
+the<br>
+of<br>
+set<br>
+0]<br>
+childsite<br>
+<UL><br>
+on<br>
+the<br>
+-text<br>
+$page1CS.b<br>
+"Button<br>
+</UL><br>
+the<br>
+the<br>
+0<br>
+</td>
+<td valign=top>
+#<br>
+widget<br>
+tabnotebook<br>
+-height<br>
+\\<br>
+-fill<br>
+yes<br>
+\\<br>
+-pady<br>
+Add<br>
+the<br>
+"Page<br>
+Two"<br>
+"Page<br>
+-label<br>
+<UL><br>
+child<br>
+these<br>
+page1CS<br>
+set<br>
+"Page<br>
+#<br>
+each<br>
+tabnotebook.<br>
+"Button<br>
+button<br>
+Two"<br>
+<UL><br>
+first<br>
+tabnotebook.<br>
+</UL><br>
+</td>
+<td valign=top>
+Create<br>
+and<br>
+.tn<br>
+100<br>
+-anchor<br>
+both<br>
+\\<br>
+-padx<br>
+10<br>
+two<br>
+tabnotebook,<br>
+One"<br>
+.tn<br>
+One"<br>
+"Page<br>
+#<br>
+site<br>
+two<br>
+[.tn<br>
+page2CS<br>
+Two"]<br>
+Create<br>
+page<br>
+button<br>
+One"<br>
+$page2CS.b<br>
+pack<br>
+#<br>
+page<br>
+.tn<br>
+</td>
+</table>
+</pre><H2>AUTHOR</H2>
+Bill W. Scott
+</pre><H2>KEYWORDS</H2>
+tab tabset notebook tabnotebook page
diff --git a/iwidgets/demos/html/tabset.n.html b/iwidgets/demos/html/tabset.n.html
new file mode 100644
index 00000000000..90e6f7b856c
--- /dev/null
+++ b/iwidgets/demos/html/tabset.n.html
@@ -0,0 +1,681 @@
+<TITLE>tabset - create and manipulate tabs as as set</TITLE>
+<H1>tabset - create and manipulate tabs as as set</H1>
+
+</pre><H2>SYNOPSIS</H2>
+<B>tabset</B> <I>pathName</I> ?<I>options</I>?
+</pre><H2>INHERITANCE</H2>
+itk::Widget &lt;- tabset
+</pre><H2>STANDARD OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>background</B><br>
+<B>foreground</B><br>
+<B>width</B><br>
+</td>
+<td valign=top>
+<B>font</B><br>
+<B>selectForeground</B><br>
+</td>
+<td valign=top>
+<B>selectBackground</B><br>
+<B>disabledForeground</B><br>
+</td>
+<td valign=top>
+<B>cursor</B><br>
+<B>height</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/options.n.html"> "options" </A> manual entry for details on the standard options.
+</pre><H2>WIDGET-SPECIFIC OPTIONS</H2>
+<P>
+<pre>
+Name: <B>angle</B>
+Class: <B>Angle</B>
+Command-Line Switch: <B>-angle</B>
+</pre>
+<UL>
+Specifes the angle of slope from the inner edge to the outer edge of the
+tab. An angle of 0 specifies square tabs. Valid ranges are 0 to 45 degrees
+inclusive. Default is 15 degrees. If tabPos is e or w, this option is ignored.
+</UL>
+<P>
+<pre>
+Name: <B>backdrop</B>
+Class: <B>Backdrop</B>
+Command-Line Switch: <B>-backdrop</B>
+</pre>
+<UL>
+Specifies a background color to use when filling in the area behind the tabs.
+</UL>
+<P>
+<pre>
+Name: <B>bevelAmount</B>
+Class: <B>BevelAmount</B>
+Command-Line Switch: <B>-bevelamount</B>
+</pre>
+<UL>
+Specifes the size of tab corners. A value of 0 with angle set to 0 results
+in square tabs. A <B>bevelAmount</B> of 4, means that the tab will be
+drawn with angled corners that cut in 4 pixels from the edge of the
+tab. The default is 0.
+</UL>
+<P>
+<pre>
+Name: <B>command</B>
+Class: <B>Command</B>
+Command-Line Switch: <B>-command</B>
+Specifes the prefix of a Tcl command to invoke to change the view in the
+widget associated with the tabset. When a user selects a tab, a Tcl command
+is invoked. The actual command consists of this option followed by a space
+and a number. The number is the numerical index of the tab that has been
+selected.
+<P>
+<table>
+Name: <B>equalTabs</B>
+Class: <B>EqualTabs</B>
+Command-Line Switch: <B>-equaltabs</B>
+</pre>
+<UL>
+Specifies whether to force tabs to be equal sized or not. A value
+of <B>true</B> means constrain tabs to be equal sized. A value
+of <B>false</B> allows each tab to size based on the text label size. The
+value may have any of the forms accepted by the <B>Tcl_GetBoolean</B>, such
+as <B>true</B>, <B>false</B>, <B>0</B>, <B>1</B>, <B>yes</B>, or <B>no</B>.
+</UL>
+<UL>
+For horizontally positioned tabs (<B>tabPos</B> is either <B>s</B>
+or <B>n</B>), <B>true</B> forces all tabs to be equal width (the width being
+equal to the longest label plus any padX specified). Horizontal tabs are
+always equal in height.
+</UL>
+<UL>
+For vertically positioned tabs (<B>tabPos</B> is either <B>w</B> or <B>e</B>),
+<B>true</B> forces all tabs to be equal height (the height being equal to
+the height of the label with the largest font). Vertically oriented tabs are
+always equal in width.
+</UL>
+<P>
+<pre>
+Name: <B>gap</B>
+Class: <B>Gap</B>
+Command-Line Switch: <B>-gap</B>
+</pre>
+<UL>
+Specifies the amount of pixel space to place between each tab. Value may
+be any pixel offset value. In addition, a special keyword <B>overlap</B>
+can be used as the value to achieve a standard overlap of tabs. This value
+may have any of the forms acceptable to <B>Tk_GetPixels</B>.
+</UL>
+<P>
+<pre>
+Name: <B>margin</B>
+Class: <B>Margin</B>
+Command-Line Switch: <B>-margin</B>
+</pre>
+<UL>
+Specifies the amount of space to place between the outside edge of the
+tabset and the outside edge of its tabs. If <B>tabPos</B> is <B>s</B>, this
+is the amount of space between the bottom edge of the tabset and the
+bottom edge of the set of tabs. If <B>tabPos</B> is <B>n</B>, this is the
+amount of space between the top edge of the tabset and the top edge of the
+set of tabs. If <B>tabPos</B> is <B>e</B>, this is the amount of space between
+the right edge of the tabset and the right edge of the set of tabs.
+If <B>tabPos</B> is <B>w</B>, this is the amount of space between the left
+edge of the tabset and the left edge of the set of tabs. This value may
+have any of the forms acceptable to <B>Tk_GetPixels</B>.
+</UL>
+<P>
+<pre>
+Name: <B>padX</B>
+Class: <B>PadX</B>
+Command-Line Switch: <B>-padx</B>
+</pre>
+<UL>
+Specifies a non-negative value indicating how much extra space to request for
+a tab around its label in the X-direction. When computing how large a
+window it needs, the tab will add this amount to the width it would normally
+need The tab will end up with extra internal space to the left and right of
+its text label. This value may have any of the forms acceptable
+to <B>Tk_GetPixels</B>.
+</UL>
+<P>
+<pre>
+Name: <B>padY</B>
+Class: <B>PadY</B>
+Command-Line Switch: <B>-pady</B>
+</pre>
+<UL>
+Specifies a non-negative value indicating how much extra space to request
+for a tab around its label in the Y-direction. When computing how large a
+window it needs, the tab will add this amount to the height it would
+normally need The tab will end up with extra internal space to the top and
+bottom of its text label. This value may have any of the forms acceptable
+to <B>Tk_GetPixels</B>.
+</UL>
+<P>
+<pre>
+Name: <B>raiseSelect</B>
+Class: <B>RaiseSelect</B>
+Command-Line Switch: <B>-raiseselect</B>
+</pre>
+<UL>
+Specifes whether to slightly raise the selected tab from the rest of the
+tabs. The selected tab is drawn 2 pixels closer to the outside edge of the
+tabset than the unselected tabs. A value of true says to raise selected
+tabs, a value of false turns this off. The default is false. The value may
+have any of the forms accepted by the <B>Tcl_GetBoolean</B>, such
+as <B>true</B>, <B>false</B>, <B>0</B>, <B>1</B>, <B>yes</B>, or <B>no</B>.
+</UL>
+<P>
+<pre>
+Name: <B>start</B>
+Class: <B>Start</B>
+Command-Line Switch: <B>-start</B>
+</pre>
+<UL>
+Specifies the amount of space to place between the left or top edge of the
+tabset and the starting edge of its tabs. For horizontally positioned tabs,
+this is the amount of space between the left edge of the tabset and the left
+edge of the first tab. For vertically positioned tabs, this is the amount
+of space between the top of the tabset and the top of the first tab. This
+value may change if the user performs a MButton-2 scroll on the tabs. This
+value may have any of the forms acceptable to <B>Tk_GetPixels</B>.
+</UL>
+<P>
+<pre>
+Name: <B>state</B>
+Class: <B>State</B>
+Command-Line Switch: <B>-state</B>
+</pre>
+<UL>
+Sets the active state of the tabset. Specifying <B>normal</B> allows all
+tabs to be selectable. Specifying <B>disabled</B> disables the tabset
+causing all tabs to be drawn in the disabledForeground color.
+</UL>
+<P>
+<pre>
+Name: <B>tabBorders</B>
+Class: <B>TabBorders</B>
+Command-Line Switch: <B>-tabborders</B>
+</pre>
+<UL>
+Specifies whether to draw the borders of tabs that are not selected.
+Specifying true (the default) draws these borders, specifying false
+draws only the border around the selected tab. The value may have any
+of the forms accepted by the <B>Tcl_GetBoolean</B>, such
+as <B>true</B>, <B>false,</B> <B>0</B>, <B>1</B>, <B>yes</B>, or <B>no</B>.
+</UL>
+<P>
+<pre>
+Name: <B>tabPos</B>
+Class: <B>TabPos</B>
+Command-Line Switch: <B>-tabpos</B>
+</pre>
+<UL>
+Specifies the location of the set of tabs in relation to another widget. Must
+be <B>n</B>, <B>s</B>, <B>e</B>, or <B>w</B>. Defaults to <B>s</B>. North tabs
+open downward, South tabs open upward. West tabs open to the right, east
+tabs open to the left.
+</UL>
+</pre><HR>
+</pre><H2>DESCRIPTION</H2>
+<P>
+The <B>tabset</B> command creates a new window (given by the pathName
+argument) and makes it into a <B>tabset</B> widget. Additional <I>options</I>,
+described above may be specified on the command line or in the option
+database to configure aspects of the tabset such as its colors, font, and
+text. The <B>tabset</B> command returns its <I>pathName</I> argument. At the
+time this command is invoked, there must not exist a window
+named <I>pathName</I>, but pathName's parent must exist.
+<P>
+A <B>tabset</B> is a widget that contains a set of Tab buttons. It displays
+these tabs in a row or column depending on it tabpos. When a tab is
+clicked on, it becomes the only tab in the tab set that is selected. All
+other tabs are deselected. The Tcl command prefix associated with this
+tab (through the command tab configure option) is invoked with the tab
+index number appended to its argument list. This allows the tabset to
+control another widget such as a Notebook.
+</pre><H2>TABS</H2>
+Tabs are drawn to appear attached to another widget. The tabset draws an
+edge boundary along one of its edges. This edge is known as the attachment
+edge. This edge location is dependent on the value of <B>tabPos</B>. For
+example, if <B>tabPos</B> is <B>s</B>, the attachment edge wil be on the
+top side of the tabset (in order to attach to the bottom or south side of
+its attached widget). The selected tab is draw with a 3d relief to appear
+above the other tabs. This selected tab "opens" toward attachment edge.
+<P>
+Tabs can be controlled in their location along the edges, the angle that
+tab sides are drawn with, gap between tabs, starting margin of tabs,
+internal padding around labels in a tab, the font, and its text or bitmap.
+</pre><H2>WIDGET-SPECIFIC METHODS</H2>
+<P>
+The <B>tabset</B> command creates a new Tcl command whose name
+is <I>pathName</I>. This command may be used to invoke various operations on
+the widget. It has the following general form:
+<pre>
+<I>pathName option </I>?<I>arg arg ...</I>?
+</pre>
+<I>option</I> and the <I>arg</I>s
+determine the exact behavior of the command.
+<P>
+Many of the widget commands for a tabset take as one argument an indicator
+of which tab of the tabset to operate on. These indicators are called indexes
+and may be specified in any of the following forms:
+<DL>
+<DT> <I>number</I>
+</I></B>
+<DD> Specifies the tab numerically, where 0 corresponds to the first tab in
+the tab set, 1 to the second, and so on.
+</DL>
+<DL>
+<DT> <B>select</B>
+</I></B>
+<DD> Specifies the currently selected tab's index. If no tab is currently
+selected, the value -1 is returned.
+</DL>
+<DL>
+<DT> <B>end</B>
+</I></B>
+<DD> Specifes the last tab in the tabset's index. If the tabset is empty this
+will return -1.
+</DL>
+<DL>
+<DT> <I>pattern</I>
+</I></B>
+<DD> If the index doesn't satisfy any of the above forms, then this form is
+used. Pattern is pattern-matched against the label of each tab in the
+tabset, in order from the first to the last tab, until a matching entry is
+found. The rules of Tcl_StringMatch are used.
+</DL>
+<P>
+'.............................................................................
+The following commands are possible for tabset widgets:
+<UL>
+<DL>
+<DT> <I>pathName</I> <B>add</B> ?<I>option</I> <I>value</I> <I>option</I> <I>value</I> ...?
+</I></B>
+<DD> Add a new tab at the end of the tabset. Returns the child
+site <I>pathName</I>. If additional arguments are present, they specify
+any of the following options:
+</DL>
+<UL>
+<DL>
+<DT> <B>-angle</B> <I>value</I>
+</I></B>
+<DD> Specifes the angle of slope from the inner edge to the outer edge of
+the tab. An angle of 0 specifies square tabs. Valid ranges are 0 to
+45 degrees inclusive. Default is 15 degrees. If this option is specified as
+an empty string (the default), then the angle option for the overall tabset
+is used.
+</DL>
+<DL>
+<DT> <B>-background</B> <I>value</I>
+</I></B>
+<DD> Specifies a background color to use for displaying tabs when they are in
+their normal state (unselected). If this option is specified as an empty
+string (the default), then the background option for the overall tabset is
+used.
+</DL>
+<DL>
+<DT> <B>-bevelamount</B> <I>value</I>
+</I></B>
+<DD> Specifes the size of tab corners. A value of 0 with angle set to 0 results
+in square tabs. A bevelAmount of 4, means that the tab will be drawn with
+angled corners that cut in 4 pixels from the edge of the tab. The default is
+0. This is generally only set at the tabset configuration level. Tabs
+normally will want to share the same bevelAmount.
+</DL>
+<DL>
+<DT> <B>-bitmap</B> <I>value</I>
+</I></B>
+<DD> If label is a non-empty string, specifies a bitmap to display in the
+tab. Bitmap may be of any of the forms accepted by Tk_GetBitmap.
+</DL>
+<DL>
+<DT> <B>-disabledforeground</B> <I>value</I>
+</I></B>
+<DD> Specifies a foreground color to use for displaying tab labels when tabs are
+in their disable state. If this option is specified as an empty
+string (the default), then the disabledforeground option for the overall
+tabset is used.
+</DL>
+<DL>
+<DT> <B>-font</B> <I>value</I>
+</I></B>
+<DD> Specifies the font to use when drawing the label on a tab. If this option
+is specified as an empty string then the font option for the overall
+tabset is used.
+</DL>
+<DL>
+<DT> <B>-foreground</B> <I>value</I>
+</I></B>
+<DD> Specifies a foreground color to use for displaying tab labels when tabs
+are in their normal unselected state. If this option is specified as an
+empty string (the default), then the foreground option for the overall
+tabset is used.
+</DL>
+<DL>
+<DT> <B>-image</B> <I>value</I>
+</I></B>
+<DD> If label is a non-empty string, specifies an image to display in the
+tab. Image must have been created with the image create command. Typically,
+if the image option is specified then it overrides other options that
+specify a bitmap or textual value to display in the widget; the image
+option may be reset to an empty string to re-enable a bitmap or text display.
+</DL>
+<DL>
+<DT> <B>-label</B> <I>value</I>
+</I></B>
+<DD> Specifies a text string to be placed in the tabs label. If this value is
+set, the bitmap option is overridden and this option is used instead. This
+label serves as an additional identifier used to reference the tab. This
+label may be used for the index value in widget commands.
+</DL>
+<DL>
+<DT> <B>-selectbackground</B> <I>value</I>
+</I></B>
+<DD> Specifies a background color to use for displaying the selected tab. If
+this option is specified as an empty string (the default), then the
+selectBackground option for the overall tabset is used.
+</DL>
+<DL>
+<DT> <B>-selectforeground</B> <I>value</I>
+</I></B>
+<DD> Specifies a foreground color to use for displaying the selected tab. If
+this option is specified as an empty string (the default), then the
+selectForeground option for the overall tabset is used.
+</DL>
+<DL>
+<DT> <B>-padx</B> <I>value</I>
+</I></B>
+<DD> Specifies a non-negative value indicating how much extra space to request
+for a tab around its label in the X-direction. When computing how large
+a window it needs, the tab will add this amount to the width it would
+normally need The tab will end up with extra internal space to the left
+and right of its text label. This value may have any of the forms acceptable
+to Tk_GetPixels. If this option is specified as an empty string (the
+default), then the padX option for the overall tabset is used
+</DL>
+<DL>
+<DT> <B>-pady</B> <I>value</I>
+</I></B>
+<DD> Specifies a non-negative value indicating how much extra space to request
+for a tab around its label in the Y-direction. When computing how large
+a window it needs, the tab will add this amount to the height it would
+normally need The tab will end up with extra internal space to the top
+and bottom of its text label. This value may have any of the forms
+acceptable to Tk_GetPixels. If this option is specified as an empty
+string (the default), then the padY option for the overall tabset is used
+</DL>
+<DL>
+<DT> <B>-state</B> <I>value</I>
+</I></B>
+<DD> Sets the state of the tab. Specifying normal allows this tab to be
+selectable. Specifying disabled disables the this tab causing its tab label
+to be drawn in the disabledForeground color. The tab will not respond to
+events until the state is set back to normal.
+</DL>
+</UL>
+<DL>
+<DT> <I>pathName</I> <B>configure</B> ?<I>option</I>? ?<I>value</I> <I>option</I> <I>value</I> ...?
+</I></B>
+<DD> Query or modify the configuration options of the widget. If no <I>option</I>
+is specified, returns a list describing all of the available options
+for <I>pathName</I> (see <B>Tk_ConfigureInfo</B> for information on the
+format of this list). If option is specified with no value, then the
+command returns a list describing the one named option (this list will be
+identical to the corresponding sublist of the value returned if no option
+is specified). If one or more option-value pairs are specified, then the
+command modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string. <I>Option</I> may have any
+of the values accepted by the tabset command.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>delete</B> <I>index1</I> ?<I>index2</I>?
+</I></B>
+<DD> Delete all of the tabs between <I>index1</I> and <I>index2</I> inclusive.
+If <I>index2</I> is omitted then it defaults to <I>index1</I>. Returns an
+empty string.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>index</B> <I>index</I>
+</I></B>
+<DD> Returns the numerical index corresponding to <I>index</I>.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>insert</B> <I>index</I> ?<I>option</I> <I>value</I> <I>option</I> <I>value</I> ...?
+</I></B>
+<DD> Insert a new tab in the tabset before the tab specified by <I>index</I>. The
+additional arguments are the same as for the <B>add</B> command. Returns
+the tab's <I>pathName</I>.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>next</B>
+</I></B>
+<DD> Advances the selected tab to the next tab (order is determined by insertion
+order). If the currently selected tab is the last tab in the tabset, the
+selection wraps around to the first tab. It behaves as if the user
+selected the next tab.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>tabconfigure</B> <I>index</I> ?<I>option</I>? ?<I>value</I>?
+</I></B>
+<DD> This command is similar to the <B>configure</B> command, except that it
+applies to the options for an individual tab, whereas configure applies to
+the options for the tabset as a whole. Options may have any of the values
+accepted by the <B>add</B> widget command. If options are specified, options
+are modified as indicated in the command and the command returns an empty
+string. If no options are specified, returns a list describing the current
+options for tab index (see <B>Tk_ConfigureInfo</B> for information on
+the format of this list).
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>prev</B>
+</I></B>
+<DD> Moves the selected tab to the previous tab (order is determined by insertion
+order). If the currently selected tab is the first tab in the tabset, the
+selection wraps around to the last tab in the tabset. It behaves as if
+the user selected the previous tab.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>select</B> <I>index</I>
+</I></B>
+<DD> Selects the tab specified by <I>index</I> as the currently selected tab. It
+behaves as if the user selected the new tab.
+
+</DL>
+</pre><H2>EXAMPLE </H2>
+<P>
+Following is an example that creates a tabset with two tabs and a list box
+that the tabset controls. In addition selecting an item from the list
+also selects the corresponding tab.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<UL><br>
+a<br>
+how<br>
+item<br>
+list<br>
+from<br>
+callback.<br>
+item<br>
+selection<br>
+.l<br>
+.l<br>
+<UL><br>
+proc<br>
+to<br>
+#<br>
+pixel<br>
+list..<br>
+y<br>
+whichItem<br>
+.ts<br>
+</UL><br>
+a<br>
+items<br>
+#<br>
+1<br>
+selectTab<br>
+-selectmode<br>
+.l<br>
+.l<br>
+.l<br>
+pack<br>
+&lt;ButtonPress-1&gt;<br>
+}<br>
+Create<br>
+its<br>
+selectItem<br>
+labels<br>
+(one<br>
+.ts<br>
+add<br>
+add<br>
+select<br>
+-fill<br>
+</UL><br>
+</td>
+<td valign=top>
+</UL><br>
+proc<br>
+to<br>
+#<br>
+given<br>
+the<br>
+proc<br>
+}<br>
+clear<br>
+selection<br>
+see<br>
+#<br>
+that<br>
+select<br>
+given<br>
+coordinate<br>
+proc<br>
+}<br>
+[.l<br>
+select<br>
+<UL><br>
+listbox<br>
+(one<br>
+and<br>
+press<br>
+procedure.<br>
+single<br>
+insert<br>
+insert<br>
+selection<br>
+.l<br>
+{<br>
+</UL><br>
+a<br>
+-command<br>
+#<br>
+to<br>
+and<br>
+-command<br>
+-label<br>
+-label<br>
+0<br>
+x<br>
+</td>
+<td valign=top>
+#<br>
+that<br>
+select<br>
+from<br>
+an<br>
+tabset<br>
+selectItem<br>
+{<br>
+[.l<br>
+set<br>
+$item<br>
+Define<br>
+knows<br>
+a<br>
+a<br>
+from<br>
+selectTab<br>
+{<br>
+nearest<br>
+$whichItem<br>
+#<br>
+with<br>
+and<br>
+bind<br>
+to<br>
+listbox<br>
+-exportselection<br>
+end<br>
+end<br>
+set<br>
+bind<br>
+selectTab<br>
+<UL><br>
+tabset,<br>
+to<br>
+Add<br>
+the<br>
+two).<br>
+selectItem<br>
+1<br>
+2<br>
+pack<br>
+-expand<br>
+</td>
+<td valign=top>
+Define<br>
+knows<br>
+an<br>
+a<br>
+index<br>
+-command<br>
+{<br>
+.l<br>
+curselection]<br>
+$item<br>
+}<br>
+a<br>
+how<br>
+tab<br>
+y<br>
+the<br>
+{<br>
+set<br>
+$y]<br>
+}<br>
+Create<br>
+two<br>
+two)<br>
+button<br>
+the<br>
+.l<br>
+false<br>
+one<br>
+two<br>
+0<br>
+.l<br>
+%y<br>
+#<br>
+set<br>
+call<br>
+two<br>
+tabset<br>
+tabset<br>
+.ts<br>
+.ts<br>
+.ts<br>
+.ts<br>
+no<br>
+</td>
+</table>
+</pre><H2>AUTHOR</H2>
+Bill W. Scott
+</pre><H2>KEYWORDS</H2>
+tab tabset notebook tabnotebook
diff --git a/iwidgets/demos/html/timeentry.n.html b/iwidgets/demos/html/timeentry.n.html
new file mode 100644
index 00000000000..020bc03789e
--- /dev/null
+++ b/iwidgets/demos/html/timeentry.n.html
@@ -0,0 +1,256 @@
+<TITLE>timeentry - Create and manipulate a timeentry widget</TITLE>
+<H1>timeentry - Create and manipulate a timeentry widget</H1>
+
+</pre><H2>SYNOPSIS</H2>
+<B>timeentry<I> <I>pathName </I>?<I>options</I>?
+</pre><H2>INHERITANCE</H2>
+itk::Widget &lt;- LabeledWidget &lt;- Timefield &lt;- Timeentry
+</pre><H2>STANDARD OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>background</B><br>
+<B>foreground</B><br>
+<B>justify</B><br>
+</td>
+<td valign=top>
+<B>borderWidth</B><br>
+<B>highlightColor</B><br>
+<B>relief</B><br>
+</td>
+<td valign=top>
+<B>cursor</B><br>
+<B>highlightThickness</B><br>
+</td>
+<td valign=top>
+<B>exportSelection</B><br>
+<B>insertBackground</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/options.n.html"> "options" </A> manual entry for details on the standard options.
+</pre><H2>INHERITED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>disabledForeground</B><br>
+<B>labelMargin</B><br>
+<B>state</B><br>
+</td>
+<td valign=top>
+<B>labelBitmap</B><br>
+<B>labelPos</B><br>
+</td>
+<td valign=top>
+<B>labelFont</B><br>
+<B>labelText</B><br>
+</td>
+<td valign=top>
+<B>labelImage</B><br>
+<B>labelVariable</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="labeledwidget.n.html"> "labeledwidget" </A> class manual entry for details on these
+inherited options.
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>command</B><br>
+<B>textFont</B><br>
+</td>
+<td valign=top>
+<B>format</B><br>
+</td>
+<td valign=top>
+<B>seconds</B><br>
+</td>
+<td valign=top>
+<B>textBackground</B><br>
+</td>
+</table>
+<P>
+See the "timefield" class manual entry for details on these
+inherited options.
+</pre><H2>ASSOCIATED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>hourRadius</B><br>
+<B>pivotRadius</B><br>
+<B>clockColor</B><br>
+<B>watchWidth</B><br>
+</td>
+<td valign=top>
+<B>hourColor</B><br>
+<B>pivotColor</B><br>
+<B>clockStipple</B><br>
+</td>
+<td valign=top>
+<B>minuteRadius</B><br>
+<B>secondRadius</B><br>
+<B>tickColor</B><br>
+</td>
+<td valign=top>
+<B>minuteColor</B><br>
+<B>secondColor</B><br>
+<B>watchHeight</B><br>
+</td>
+</table>
+<P>
+See the "watch" manual entry for details on the associated options.
+</pre><H2>WIDGET-SPECIFIC OPTIONS</H2>
+<P>
+<pre>
+Name: <B>closeText</B>
+Class: <B>Text</B>
+Command-Line Switch: <B>-closetext</B>
+</pre>
+<UL>
+Specifies the text to be displayed on the close button of the watch
+popup. The default is Close.
+</UL>
+<P>
+<pre>
+Name: <B>grab</B>
+Class: <B>Grab</B>
+Command-Line Switch: <B>-grab</B>
+</pre>
+<UL>
+Specifies the grab level, <B>local</B> or <B>global</B>, to be obtained before
+bringing up the popup watch. The default is global. For more information
+concerning grab levels, consult the documentation for Tk's <B>grab</B> command.
+</UL>
+<P>
+<pre>
+Name: <B>icon</B>
+Class: <B>Icon</B>
+Command-Line Switch: <B>-icon</B>
+</pre>
+<UL>
+Specifies the watch icon image to be used in the timeentry.
+This image must have been created previously with
+the <B>image create</B> command. Should one not be provided,
+then one will be generated, pixmap if possible, bitmap otherwise.
+</UL>
+<P>
+<pre>
+Name: <B>state</B>
+Class: <B>State</B>
+Command-Line Switch: <B>-state</B>
+</pre>
+<UL>
+Specifies the state of the widget which may be <B>disabled</B> or
+<B>normal</B>. A disabled state prevents selection of the timefield
+or time icon button.
+</UL>
+<P>
+</pre><HR>
+
+</pre><H2>DESCRIPTION</H2>
+<P>
+The <B>timeentry</B> command creates a time entry field
+with a popup watch by combining the timefield and watch
+widgets together. This allows a user to enter the time via the
+keyboard or by using the mouse and selecting the watch icon
+which brings up a popup watch.
+</pre>
+
+</pre><H2>METHODS</H2>
+<P>
+The <B>timeentry</B> command creates a new Tcl command whose
+name is <I>pathName</I>. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+<pre>
+<I>pathName option </I>?<I>arg arg ...</I>?
+</pre>
+<I>Option</I> and the <I>arg</I>s
+determine the exact behavior of the command. The following
+commands are possible for timeentry widgets:
+</pre><H2>INHERITED METHODS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>get</B><br>
+</td>
+<td valign=top>
+<B>isvalid</B><br>
+</td>
+<td valign=top>
+<B>show</B><br>
+</td>
+<td valign=top>
+</td>
+</table>
+<P>
+See the "timefield" manual entry for details on the associated methods.
+</pre><H2>WIDGET-SPECIFIC METHODS</H2>
+<DL>
+<DT> <I>pathName <B>cget</B> <I>option</I>
+</I></B>
+<DD> Returns the current value of the configuration option given
+by <I>option</I>.
+<I>Option</I> may have any of the values accepted by the <B>timeentry</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>configure</B> ?<I>option</I>? ?<I>value option value ...</I>?
+</I></B>
+<DD> Query or modify the configuration options of the widget.
+If no <I>option</I> is specified, returns a list describing all of
+the available options for <I>pathName</I> (see <B>Tk_ConfigureInfo</B> for
+information on the format of this list). If <I>option</I> is specified
+with no <I>value</I>, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no <I>option</I> is specified). If
+one or more <I>option-value</I> pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+<I>Option</I> may have any of the values accepted by the <B>timeentry</B>
+command.
+
+</DL>
+</pre><H2>COMPONENTS</H2>
+<P>
+<pre>
+Name: <B>label</B>
+Class: <B>Label</B>
+</pre>
+<UL>
+The label component provides a label component to used to identify the time.
+See the "label" widget manual entry for details on the label component item.
+</UL>
+<P>
+<pre>
+Name: <B>iconbutton</B>
+Class: <B>Label</B>
+</pre>
+<UL>
+The iconbutton component provides a labelbutton component to act as a
+lightweight button
+displaying the watch icon. Upon pressing the labelbutton, the watch
+appears. See the "label" widget manual entry for details on the
+labelbutton component item.
+</UL>
+<P>
+<pre>
+Name: <B>time</B>
+Class: <B>Entry</B>
+</pre>
+<UL>
+The time component provides the entry field for time input and display.
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/entry.n.html"> "entry" </A> widget manual entry for details on the time component item.
+</UL>
+</table>
+
+</pre><H2>EXAMPLE</H2>
+<pre>
+ timeentry .te
+ pack .te
+</pre>
+</pre><H2>AUTHOR</H2>
+Mark L. Ulferts
+<P>
+</pre><H2>KEYWORDS</H2>
+timeentry, widget
diff --git a/iwidgets/demos/html/timefield.n.html b/iwidgets/demos/html/timefield.n.html
new file mode 100644
index 00000000000..2c405b352e8
--- /dev/null
+++ b/iwidgets/demos/html/timefield.n.html
@@ -0,0 +1,206 @@
+<TITLE>timefield - Create and manipulate a time field widget</TITLE>
+<H1>timefield - Create and manipulate a time field widget</H1>
+
+</pre><H2>SYNOPSIS</H2>
+<B>timefield<I> <I>pathName </I>?<I>options</I>?
+</pre><H2>INHERITANCE</H2>
+itk::Widget &lt;- LabeledWidget &lt;- timefield
+</pre><H2>STANDARD OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>background</B><br>
+<B>foreground</B><br>
+<B>justify</B><br>
+</td>
+<td valign=top>
+<B>borderWidth</B><br>
+<B>highlightColor</B><br>
+<B>relief</B><br>
+</td>
+<td valign=top>
+<B>cursor</B><br>
+<B>highlightThickness</B><br>
+</td>
+<td valign=top>
+<B>exportSelection</B><br>
+<B>insertBackground</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/options.n.html"> "options" </A> manual entry for details on the standard options.
+</pre><H2>INHERITED OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>disabledForeground</B><br>
+<B>labelMargin</B><br>
+<B>state</B><br>
+</td>
+<td valign=top>
+<B>labelBitmap</B><br>
+<B>labelPos</B><br>
+</td>
+<td valign=top>
+<B>labelFont</B><br>
+<B>labelText</B><br>
+</td>
+<td valign=top>
+<B>labelImage</B><br>
+<B>labelVariable</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="labeledwidget.n.html"> "labeledwidget" </A> class manual entry for details on the
+inherited options.
+</pre><H2>WIDGET-SPECIFIC OPTIONS</H2>
+<P>
+<pre>
+Name: <B>childSitePos</B>
+Class: <B>Position</B>
+Command-Line Switch: <B>-childsitepos</B>
+</pre>
+<UL>
+Specifies the position of the child site in the time field: <B>n</B>,
+<B>s</B>, <B>e</B>, or <B>w</B>. The default is e.
+</UL>
+<P>
+<pre>
+Name: <B>command</B>
+Class: <B>Command</B>
+Command-Line Switch: <B>-command</B>
+</pre>
+<UL>
+Specifies a Tcl command to be executed upon detection of a Return key
+press event.
+</UL>
+<P>
+<pre>
+Name: <B>state</B>
+Class: <B>State</B>
+Command-Line Switch: <B>-state</B>
+</pre>
+<UL>
+Specifies one of two states for the timefield: <B>normal</B> or <B>disabled</B>.
+If the timefield is disabled then input is not accepted. The default is
+normal.
+</UL>
+<P>
+<pre>
+Name: <B>textBackground</B>
+Class: <B>Background</B>
+Command-Line Switch: <B>-textbackground</B>
+</pre>
+<UL>
+Background color for inside textual portion of the entry field. The value
+may be given in any of the forms acceptable to <B>Tk_GetColor</B>.
+</UL>
+<P>
+<pre>
+Name: <B>textFont</B>
+Class: <B>Font</B>
+Command-Line Switch: <B>-textfont</B>
+</pre>
+<UL>
+Name of font to use for display of text in timefield. The value
+may be given in any of the forms acceptable to <B>Tk_GetFont</B>.
+</UL>
+<P>
+</pre><HR>
+
+</pre><H2>DESCRIPTION</H2>
+<P>
+The <B>timefield</B> command creates an enhanced text entry widget for
+the purpose of time entry with various degrees of built-in intelligence.
+</pre>
+
+</pre><H2>METHODS</H2>
+<P>
+The <B>timefield</B> command creates a new Tcl command whose
+name is <I>pathName</I>. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+<pre>
+<I>pathName option </I>?<I>arg arg ...</I>?
+</pre>
+<I>Option</I> and the <I>arg</I>s
+determine the exact behavior of the command. The following
+commands are possible for timefield widgets:
+</pre><H2>WIDGET-SPECIFIC METHODS</H2>
+<DL>
+<DT> <I>pathName <B>cget</B> <I>option</I>
+</I></B>
+<DD> Returns the current value of the configuration option given
+by <I>option</I>.
+<I>Option</I> may have any of the values accepted by the <B>timefield</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>configure</B> ?<I>option</I>? ?<I>value option value ...</I>?
+</I></B>
+<DD> Query or modify the configuration options of the widget.
+If no <I>option</I> is specified, returns a list describing all of
+the available options for <I>pathName</I> (see <B>Tk_ConfigureInfo</B> for
+information on the format of this list). If <I>option</I> is specified
+with no <I>value</I>, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no <I>option</I> is specified). If
+one or more <I>option-value</I> pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+<I>Option</I> may have any of the values accepted by the <B>timefield</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName <B>get</B> ?<B>format</B>?
+</I></B>
+<DD> Returns the current contents of the timefield in a format of
+string or as an integer clock value using the <B>-string</B> and <B>-clicks</B>
+format options respectively. The default is by string. Reference the
+clock command for more information on obtaining times and their
+formats.
+</DL>
+<DL>
+<DT> <I>pathName <B>isvalid</B>
+</I></B>
+<DD> Returns a boolean indication of the validity of the currently
+displayed time value. For example, 12:59:59 is valid whereas
+25:59:59 is invalid.
+</DL>
+<DL>
+<DT> <I>pathName <B>show</B> <I>time</I>
+</I></B>
+<DD> Changes the currently displayed time to be that of the time
+argument. The time may be specified either as a string, an
+integer clock value or the keyword "now" (the default).
+Reference the clock command for more information on obtaining
+times and their formats.
+
+</DL>
+</pre><H2>COMPONENTS</H2>
+<P>
+<pre>
+Name: <B>time</B>
+Class: <B>Entry</B>
+</pre>
+<UL>
+The time component provides the entry field for time input and display.
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/entry.n.html"> "entry" </A> widget manual entry for details on the time component item.
+</UL>
+</table>
+
+</pre><H2>EXAMPLE</H2>
+<pre>
+ proc returnCmd {} {
+ puts [.tf get]
+ }
+
+ timefield .tf -command returnCmd
+ pack .tf -fill x -expand yes -padx 10 -pady 10
+</pre>
+</pre><H2>AUTHOR</H2>
+John A. Tucker
+</pre>
+Mark L. Ulferts
+</pre><H2>KEYWORDS</H2>
+timefield, widget
diff --git a/iwidgets/demos/html/toolbar.n.html b/iwidgets/demos/html/toolbar.n.html
new file mode 100644
index 00000000000..456fd675b61
--- /dev/null
+++ b/iwidgets/demos/html/toolbar.n.html
@@ -0,0 +1,351 @@
+<TITLE><B>toolbar</B> - Create and manipulate a tool bar</TITLE>
+<H1><B>toolbar</B> - Create and manipulate a tool bar</H1>
+
+</pre><H2>SYNOPSIS</H2>
+<B>toolbar</B> <I>pathName</I> ?<I>options</I>?
+</pre><H2>STANDARD OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>activeBackground</B><br>
+<B>activeForeground</B><br>
+<B>background</B><br>
+<B>borderWidth</B><br>
+<B>cursor</B><br>
+</td>
+<td valign=top>
+<B>disabledForeground</B><br>
+<B>font</B><br>
+<B>foreground</B><br>
+<B>highlightBackground</B><br>
+<B>highlightColor</B><br>
+</td>
+<td valign=top>
+<B>highlightThickness</B><br>
+<B>insertBackground</B><br>
+<B>insertForeground</B><br>
+<B>orient</B><br>
+<B>selectBackground</B><br>
+</td>
+<td valign=top>
+<B>selectBorderWidth</B><br>
+<B>selectColor</B><br>
+<B>selectForeground</B><br>
+<B>state</B><br>
+<B>troughColor</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/options.n.html"> "options" </A> manual entry for details on the standard options. For widgets
+added to the toolbar, these options will be propogated if the widget supports
+the option. For example, all widgets that support a font option will be changed
+if the the toolbar's font option is configured.
+</pre><H2>WIDGET-SPECIFIC OPTIONS</H2>
+<P>
+<pre>
+Name: <B>balloonBackground</B>
+Class: <B>BalloonBackground</B>
+Command-Line Switch: <B>-ballooonbackground</B>
+</pre>
+<UL>
+Specifies the background color of the balloon help displayed at the bottom
+center of a widget on the toolbar that has a non empty string for its
+balloonStr option. The default color is yellow.
+</UL>
+<P>
+<pre>
+Name: <B>balloonDelay1</B>
+Class: <B>BalloonDelay1</B>
+Command-Line Switch: <B>-balloondelay1</B>
+</pre>
+<UL>
+Specifies the length of time (in milliseconds) to wait before initially
+posting a balloon help hint window. This delay is in effect whenever 1)
+the mouse leaves the toolbar, or 2) a toolbar item is selected with the
+mouse button.
+</UL>
+<P>
+<pre>
+Name: <B>balloonDelay2</B>
+Class: <B>BalloonDelay2</B>
+Command-Line Switch: <B>-balloondelay2</B>
+</pre>
+<UL>
+Specifies the length of time (in milliseconds) to wait before continuing to
+post balloon help hint windows. This delay is in effect after the first
+time a balloon hint window is activated. It remains in effect until 1) the
+mouse leaves the toolbar, or 2) a toolbar item is selected with the mouse
+button.
+</UL>
+<P>
+<pre>
+Name: <B>balloonFont</B>
+Class: <B>BalloonFont</B>
+Command-Line Switch: <B>-balloonfont</B>
+</pre>
+<UL>
+Specifies the font of the balloon help text displayed at the bottom center
+of a widget on the toolbar that has a non empty string for its
+balloonStr option. The default font is 6x10.
+</UL>
+<P>
+<pre>
+Name: <B>balloonForeground</B>
+Class: <B>BalloonForeground</B>
+Command-Line Switch: <B>-ballooonforeground</B>
+</pre>
+<UL>
+Specifies the foreground color of the balloon help displayed at the
+bottom center of a widget on the toolbar that has a non empty string for
+its balloonStr option. The default color is black.
+</UL>
+<P>
+<pre>
+Name: <B>helpVariable</B>
+Class: <B>HelpVariable</B>
+Command-Line Switch: <B>-helpvariable</B>
+</pre>
+<UL>
+Specifies the global variable to update whenever the mouse is in motion
+over a toolbar widget. This global variable is updated with the current
+value of the active widget's helpStr. Other widgets can "watch" this
+variable with the trace command, or as is the case with entry or label
+widgets, they can set their textVariable to the same global variable. This
+allows for a simple implementation of a help status bar. Whenever the
+mouse leaves a menu entry, the helpVariable is set to the empty string {}.
+</UL>
+<P>
+<pre>
+Name: <B>orient</B>
+Class: <B>Orient</B>
+Command-Line Switch: <B>-orient</B>
+</pre>
+<UL>
+Specifies the orientation of the toolbar. Must be either horizontal or
+vertical.
+</UL>
+</pre><HR>
+</pre><H2>DESCRIPTION</H2>
+The <B>toolbar</B> command creates a new window (given by the pathName
+argument) and makes it into a <B>toolbar</B> widget. Additional options,
+described above may be specified on the command line or in the option
+database to configure aspects of the toolbar such as its colors, font,
+and orientation. The <B>toolbar</B> command returns its pathName argument. At
+the time this command is invoked, there must not exist a window named
+pathName, but pathName's parent must exist.
+<P>
+A <B>toolbar</B> is a widget that displays a collection of widgets arranged
+either in a row or a column (depending on the value of the -orient option).
+This collection of widgets is usually for user convenience to give access
+to a set of commands or settings. Any widget may be placed on a toolbar.
+However, command or value-oriented widgets (such as button, radiobutton,
+etc.) are usually the most useful kind of widgets to appear on a toolbar.
+<P>
+In addition, the toolbar adds two new options to all widgets that are added to
+it. These are the <B>helpStr</B> and <B>balloonStr</B> options. See the
+discussion for the widget command add below.
+
+</pre><H2>WIDGET-SPECIFIC METHODS</H2>
+<P>
+The toolbar command creates a new Tcl command whose name is pathName. This
+command may be used to invoke various operations on the widget. It has the
+following general form:
+<pre>
+<I>pathName</I> <I>option</I> <I>?arg arg ...?</I>
+</pre>
+Option and args determine the exact behavior of the command.
+<P>
+Many of the widget commands for a toolbar take as one argument an indicator of
+which widget item of the toolbar to operate on. The indicator is called
+an <B>index</B> and may be specified in any of the following forms:
+<DL>
+<DT> <I>number</I>
+</I></B>
+<DD> Specifies the widget numerically, where 0 corresponds to the first
+widget in the notebook, 1 to the second, and so on. (For horizontal, 0 is the
+leftmost; for vertical, 0 is the topmost).
+</DL>
+<DL>
+<DT> <B>end</B>
+</I></B>
+<DD> Specifes the last widget in the toolbar's index. If the toolbar is
+empty this will return -1.
+</DL>
+<DL>
+<DT> <B>last</B>
+</I></B>
+<DD> Same as end.
+</DL>
+<DL>
+<DT> <I>pattern</I>
+</I></B>
+<DD> If the index doesn't satisfy any of the above forms, then this form is
+used. Pattern is pattern-matched against the widgetName of each widget in the
+toolbar, in order from the first to the last widget, until a matching entry is
+found. An exact match must occur.
+</DL>
+<P>
+The following commands are possible for toolbar widgets:
+<DL>
+<DT> <I>pathName</I> <B>add</B> <I>widgetCommand</I> <I>widgetName</I> <I>?option value?</I>
+</I></B>
+<DD> Adds a widget with the command widgetCommand whose name is widgetName to the
+toolbar. If widgetCommand is radiobutton or checkbutton, its packing is
+slightly padded to match the geometry of button widgets. In addition, the
+indicatorOn option is false by default and the selectColor is that of the
+toolbar background by default. This allows Radiobutton and Checkbutton widgets
+to be added as icons by simply setting their bitmap or image options. If
+additional arguments are present, they are the set of available options
+that the widget type of <I>widgetCommand</I> supports. In addition they may
+also be one of the following options:
+</DL>
+<UL>
+<DL>
+<DT> <B>-helpstr</B> <I>value</I>
+</I></B>
+<DD> Specifes the help string to associate with the widget. When the mouse moves
+over the widget, the variable denoted by <B>helpVariable</B> is set
+to <B>helpStr</B>. Another widget can bind to the helpVariable and thus
+track status help.
+</DL>
+<DL>
+<DT> <B>-balloonstr</B> <I>value</I>
+</I></B>
+<DD> Specifes the string to display in a balloon window for this widget. A
+balloon window is a small popup window centered at the bottom of the
+widget. Usually the <B>balloonStr</B> value is the name of the item on the
+toolbar. It is sometimes known as a hint window.
+<UL>
+When the mouse moves into an item on the toolbar, a timer is set based on
+the value of <B>balloonDelay1</B>. If the mouse stays inside the item
+for <B>balloonDelay1</B>, the balloon window will pop up displaying
+the <B>balloonStr</B> value. Once the balloon window is posted, a new
+timer based on <B>balloonDelay2</B> is set. This is typically a shorter
+timer. If the mouse is moved to another item, the window is unposted and
+a new window will be posted over the item if the shorter delay time is
+satisfied.
+</UL>
+<UL>
+While the balloon window is posted, it can also be unposted if the item
+is selected. In this case the timer is reset to <B>balloonDelay1</B>.
+Whenever the mouse leaves the toolbar, the timer is also reset
+to <B>balloonDelay1</B>.
+</UL>
+<UL>
+This window posting/unposting model is the same model used in the
+Windows95 environment.
+</UL>
+</DL>
+</UL>
+<DL>
+<DT> <I>pathName</I> <B>cget</B> <I>option</I>
+</I></B>
+<DD> Returns the current value of the configuration option given by <I>option</I>.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>configure</B> ?<I>option</I> <I>value</I>?
+</I></B>
+<DD> Query or modify the configuration options of the widget. If no <I>option</I> is
+specified, returns a list describing all of the available options for pathName
+(see Tk_ConfigureInfo for information on the format of this list). If
+<I>option</I> is specified with no value, then the command returns a
+list describing the one
+named option (this list will be identical to the corresponding sublist of the
+value returned if no option is specified). If one or more option-value pairs
+are specified, then the command modifies the given widget option(s) to have the
+given value(s); in this case the command returns an empty string.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>delete</B> <I>index</I> ?<I>index2</I>?
+</I></B>
+<DD> This command deletes all items between <I>index</I> and <I>index2</I>
+inclusive. If <I>index2</I> is omitted then it defaults to <I>index</I>.
+Returns an empty string.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>index</B> <I>index</I>
+</I></B>
+<DD> Returns the widget's numerical index for the entry corresponding
+to <I>index</I>. If <I>index</I> is not found, -1 is returned.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>insert</B> <I>beforeIndex</I> <I>widgetCommand</I> <I>widgetName</I> <I>?option value?</I>
+</DL>
+<DL>
+<DT> Insert a new item named <I>widgetName</I> with the
+</I></B>
+<DD> command <I>widgetCommand</I> before the item specified by <I>beforeIndex</I>.
+If <I>widgetCommand</I> is <B>radiobutton</B> or <B>checkbutton</B>, its
+packing is slightly padded to match the geometry of button widgets. In
+addition, the <B>indicatorOn</B> option is <B>false</B> by default and the
+<B>selectColor</B> is that of the toolbar background by default. This allows
+<B>Radiobutton</B> and <B>Checkbutton</B> widgets to be added as icons by
+simply setting their <B>bitmap</B> or <B>image</B> options. The set of
+available options is the same as specified in the <B>ad</B> command.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>itemcget</B> <I>index</I> <I>option</I>
+</I></B>
+<DD> Returns the current value of the configuration option given by <I>option</I> for
+index. The item type of <I>index</I> determines the valid available options.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>itemconfigure</B> <I>index</I> <I>?option value?</I>
+</I></B>
+<DD> Query or modify the configuration options of the widget of the toolbar
+specified by <I>index</I>. If no option is specified,
+returns a list describing all of
+the available options for <I>index</I>
+(see <B>Tk_ConfigureInfo</B> for information on the
+format of this list). If <I>option</I> is specified with no value,
+then the command
+returns a list describing the one named option (this list will be identical to
+the corresponding sublist of the value returned if no option is specified). If
+one or more option-value pairs are specified, then the command modifies the
+given widget option(s) to have the given value(s); in this case the command
+returns an empty string. The item type of <I>index</I> determines the valid
+available options. The set of available options is the same as specified
+in the <B>ad</B> command.
+</DL>
+</pre><H2>EXAMPLE</H2>
+<pre>
+ toolbar .tb -helpvariable statusVar
+
+ .tb add button item1 \\
+ -helpstr "Save It" -bitmap @./icons/Tool_32_box.xbm \\
+ -balloonstr "Save" -command {puts 1}
+ .tb add button item2 \\
+ -helpstr "Save It" -bitmap @./icons/Tool_32_brush.xbm \\
+ -balloonstr "Save" -command {puts 1}
+ .tb add button item3 \\
+ -helpstr "Save It" -bitmap @./icons/Tool_32_cut.xbm \\
+ -balloonstr "Save" -command {puts 1}
+ .tb add button item4 \\
+ -helpstr "Save It" -bitmap @./icons/Tool_32_draw.xbm \\
+ -balloonstr "Save" -command {puts 1}
+ .tb add button item5 \\
+ -bitmap @./icons/Tool_32_erase.xbm -helpstr "Play It" \\
+ -command {puts 2}
+ .tb add frame filler \\
+ -borderwidth 1 -width 10 -height 10
+ .tb add radiobutton item6 \\
+ -bitmap @./icons/Tool_32_oval.xbm -command {puts 4} \\
+ -variable result -value OPEN -helpstr "Radio Button # 1" \\
+ -balloonstr "Radio"
+ .tb add radiobutton item7 \\
+ -bitmap @./icons/Tool_32_line.xbm -command {puts 5} \\
+ -variable result -value CLOSED
+ .tb add checkbutton item8 \\
+ -bitmap @./icons/Tool_32_text.xbm -command {puts 6} \\
+ -variable checkit -onvalue yes -offvalue no
+ .tb add checkbutton check2 \\
+ -bitmap @./icons/Tool_32_points.xbm -command {puts 7} \\
+ -variable checkit2 -onvalue yes -offvalue no
+
+ pack .tb -side top -anchor nw
+</pre>
+</pre><H2>AUTHOR</H2>
+Bill Scott
+</pre><H2>KEYWORDS</H2>
+toolbar, button, radiobutton, checkbutton, iwidgets, widget
+
diff --git a/iwidgets/demos/html/watch.n.html b/iwidgets/demos/html/watch.n.html
new file mode 100644
index 00000000000..41aa4d3ab56
--- /dev/null
+++ b/iwidgets/demos/html/watch.n.html
@@ -0,0 +1,324 @@
+<TITLE>watch - Create and manipulate time with a watch widgets</TITLE>
+<H1>watch - Create and manipulate time with a watch widgets</H1>
+
+</pre><H2>SYNOPSIS</H2>
+<B>watch<I> <I>pathName </I>?<I>options</I>?
+</pre><H2>INHERITANCE</H2>
+itk::Widget &lt;- Watch
+
+</pre><H2>STANDARD OPTIONS</H2>
+<P>
+<table cellpadding=5>
+<td valign=top>
+<B>background</B><br>
+</td>
+<td valign=top>
+<B>cursor</B><br>
+</td>
+<td valign=top>
+<B>foreground</B><br>
+</td>
+<td valign=top>
+<B>relief</B><br>
+</td>
+</table>
+<P>
+See the <A HREF="http://www.sco.com/Technology/tcl/man/tk_man/options.n.html"> "options" </A> manual entry for details on the standard options.
+</pre><H2>ASSOCIATED OPTIONS</H2>
+<P>
+See the "Canvas" manual entry for details on the above associated options.
+
+</pre><H2>WIDGET-SPECIFIC OPTIONS</H2>
+<P>
+<pre>
+Name: <B>clockColor</B>
+Class: <B>ColorfR
+Command-Line Switch: <B>-clockcolor</B>
+</pre>
+<UL>
+Fill color for the main oval encapsulating the watch, in any of the forms
+acceptable to <B>Tk_GetColor</B>. The default is "White".
+</UL>
+<table cellpadding=5>
+<td valign=top>
+<P><br>
+<B>BitmapfR<br>
+</td>
+<td valign=top>
+Name:<br>
+Command-Line<br>
+</td>
+<td valign=top>
+<B>clockStipple</B><br>
+Switch:<br>
+</td>
+<td valign=top>
+Class:<br>
+<B>-clockstipple</B><br>
+</td>
+</table>
+<UL>
+Bitmap for the main oval encapsulating the watch, in any of the forms
+acceptable to <B>Tk_GetBitmap</B>. The default is "".
+</UL>
+<P>
+<pre>
+Name: <B>height</B>
+Class: <B>Height</B>
+Command-Line Switch: <B>-height</B>
+</pre>
+<UL>
+Specifies the height of the watch widget in any of the forms
+acceptable to <B>Tk_GetPixels</B>. The default height is 175 pixels.
+</UL>
+<P>
+<pre>
+Name: <B>hourColor</B>
+Class: <B>ColorfR
+Command-Line Switch: <B>-hourcolor</B>
+</pre>
+<UL>
+Fill color for the hour hand, in any of the forms acceptable to <B>Tk_GetColor</B>.
+The default is "Red".
+</UL>
+<P>
+<pre>
+Name: <B>hourRadius</B>
+Class: <B>Radius</B>
+Command-Line Switch: <B>-hourradius</B>
+</pre>
+<UL>
+Specifies the radius of the hour hand as a percentage of the radius
+from the center to the out perimeter of the clock.
+The value must be a fraction &lt;= 1. The default is ".5".
+</UL>
+<P>
+<pre>
+Name: <B>minuteColor</B>
+Class: <B>ColorfR
+Command-Line Switch: <B>-minutecolor</B>
+</pre>
+<UL>
+Fill color for the minute hand, in any of the forms acceptable to <B>Tk_GetColor</B>.
+The default is "Yellow".
+</UL>
+<P>
+<pre>
+Name: <B>minuteRadius</B>
+Class: <B>Radius</B>
+Command-Line Switch: <B>-minuteradius</B>
+</pre>
+<UL>
+Specifies the radius of the minute hand as a percentage of the radius
+from the center to the out perimeter of the clock.
+The value must be a fraction &lt;= 1. The default is ".8".
+</UL>
+<P>
+<pre>
+Name: <B>pivotColor</B>
+Class: <B>ColorfR
+Command-Line Switch: <B>-pivotcolor</B>
+</pre>
+<UL>
+Fill color for the circle in which the watch hands rotate
+in any of the forms acceptable to <B>Tk_GetColor</B>.
+The default is "White".
+</UL>
+<P>
+<pre>
+Name: <B>pivotRadius</B>
+Class: <B>Radius</B>
+Command-Line Switch: <B>-pivotradius</B>
+</pre>
+<UL>
+Specifies the radius of the circle in which the watch hands rotate
+as a percentage of the radius. The value must be a fraction &lt;= 1.
+The default is ".1".
+</UL>
+<P>
+<pre>
+Name: <B>secondColor</B>
+Class: <B>ColorfR
+Command-Line Switch: <B>-secondcolor</B>
+</pre>
+<UL>
+Fill color for the second hand, in any of the forms acceptable to <B>Tk_GetColor</B>.
+The default is "Black".
+</UL>
+<P>
+<pre>
+Name: <B>secondRadius</B>
+Class: <B>Radius</B>
+Command-Line Switch: <B>-secondradius</B>
+</pre>
+<UL>
+Specifies the radius of the second hand as a percentage of the radius
+from the center to the out perimeter of the clock.
+The value must be a fraction &lt;= 1. The default is ".9".
+</UL>
+<P>
+<pre>
+Name: <B>showAmPm</B>
+Class: <B>ShosAmPm</B>
+Command-Line Switch: <B>-showampm</B>
+</pre>
+<UL>
+Specifies whether the AM/PM radiobuttons should be displayed, in any
+of the forms acceptable to <B>Tcl_GetBoolean</B>. The default is yes.
+</UL>
+<P>
+<pre>
+Name: <B>state</B>
+Class: <B>State</B>
+Command-Line Switch: <B>-state</B>
+</pre>
+<UL>
+Specifies the editable state for the hands on the watch. In a normal
+state, the user can select and move the hands via mouse button 1. The
+valid values are <B>normal</B>, and <B>disabled</B>. The defult is normal.
+</UL>
+<P>
+<pre>
+Name: <B>tickColor</B>
+Class: <B>ColorfR
+Command-Line Switch: <B>-tickcolor</B>
+</pre>
+<UL>
+Fill color for the 60 ticks around the perimeter of the watch,
+in any of the forms acceptable to <B>Tk_GetColor</B>. The default is "Black".
+</UL>
+<P>
+<pre>
+Name: <B>width</B>
+Class: <B>Width</B>
+Command-Line Switch: <B>-width</B>
+</pre>
+<UL>
+Specifies the width of the watch widget in any of the forms
+acceptable to <B>Tk_GetPixels</B>. The default height is 155 pixels.
+</UL>
+</pre><HR>
+
+</pre><H2>DESCRIPTION</H2>
+<P>
+
+The <B>watch</B> command creates a watch with hour, minute, and
+second hands modifying the time value.
+
+</pre><H2>METHODS</H2>
+<P>
+The <B>watch</B> command creates a new Tcl command whose
+name is <I>pathName</I>. This command may be used to invoke various
+operations on the widget. It has the following general form:
+<pre>
+<I>pathName option </I>?<I>arg arg ...</I>?
+</pre>
+<I>Option</I> and the <I>arg</I>s
+determine the exact behavior of the command. The following
+commands are possible for watch widgets:
+
+</pre><H2>WIDGET-SPECIFIC METHODS</H2>
+<DL>
+<DT> <I>pathName <B>cget</B> <I>option</I>
+</I></B>
+<DD> Returns the current value of the configuration option given
+by <I>option</I>.
+<I>Option</I> may have any of the values accepted by the <B>watch</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName</I> <B>configure</B> ?<I>option</I>? ?<I>value option value ...</I>?
+</I></B>
+<DD> Query or modify the configuration options of the widget.
+If no <I>option</I> is specified, returns a list describing all of
+the available options for <I>pathName</I> (see <B>Tk_ConfigureInfo</B> for
+information on the format of this list). If <I>option</I> is specified
+with no <I>value</I>, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no <I>option</I> is specified). If
+one or more <I>option-value</I> pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+<I>Option</I> may have any of the values accepted by the <B>watch</B>
+command.
+</DL>
+<DL>
+<DT> <I>pathName <B>get</B> ?<B>format</B>?
+</I></B>
+<DD> Returns the current time of the watch in a format of
+string or as an integer clock value using the <B>-string</B> and <B>-clicks</B>
+format options respectively. The default is by string. Reference the
+clock command for more information on obtaining time and its
+formats.
+</DL>
+<DL>
+<DT> <I>pathName <B>show</B> <I>time</I>
+</I></B>
+<DD> Changes the currently displayed time to be that of the time
+argument. The time may be specified either as a string, an
+integer clock value or the keyword "now". Reference the clock
+command for more information on obtaining time and its format.
+</DL>
+<DL>
+<DT> <I>pathName <B>watch</B> ?<B>args</B>?
+</I></B>
+<DD> Evaluates the specifieds <B>args</B> against the canvas component.
+
+</DL>
+</pre><H2>COMPONENTS</H2>
+<P>
+<pre>
+Name: <B>canvas</B>
+Class: <B>Canvas</B>
+</pre>
+<UL>
+The canvas component is the where the clock is drawn. See the
+Canvas widget manual entry for details.
+</UL>
+<P>
+<pre>
+Name: <B>frame</B>
+Class: <B>Frame</B>
+</pre>
+<UL>
+The frame component is the where the "AM" and "PM" radiobuttons are displayed.
+See the Frame widget manual entry for details.
+</UL>
+<P>
+<pre>
+Name: <B>am</B>
+Class: <B>Radiobutton</B>
+</pre>
+<UL>
+The am component indicates whether on not the time is relative to "AM".
+See the Radiobutton widget manual entry for details.
+</UL>
+<P>
+<pre>
+Name: <B>pm</B>
+Class: <B>Radiobutton</B>
+</pre>
+<UL>
+The pm component indicates whether on not the time is relative to "PM".
+See the Radiobutton widget manual entry for details.
+</UL>
+</table>
+
+</pre><H2>EXAMPLE</H2>
+<pre>
+watch .w -state disabled -showampm no -width 155 -height 155
+pack .w -padx 10 -pady 10 -fill both -expand yes
+
+while {1} {
+ after 1000
+ .w show
+ update
+}
+</pre>
+</pre><H2>AUTHORS</H2>
+John Tucker
+<P>
+Mark L. Ulferts
+</pre><H2>KEYWORDS</H2>
+watch, hand, ticks, pivot, widget
+
diff --git a/iwidgets/demos/hyperhelp b/iwidgets/demos/hyperhelp
new file mode 100644
index 00000000000..72c8dc6c9b0
--- /dev/null
+++ b/iwidgets/demos/hyperhelp
@@ -0,0 +1,14 @@
+# ----------------------------------------------------------------------
+# DEMO: hyperhelp in [incr Widgets]
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+
+option add *textBackground seashell
+
+button .push -text "Help..." -command {
+ set win [iwidgets::hyperhelp .#auto -title "Hyperhelp demo" -modality none \
+ -topics {demo} -helpdir [file join ${iwidgets::library} demos]]
+ $win showtopic demo
+ $win activate
+}
+pack .push
diff --git a/iwidgets/demos/images/box.xbm b/iwidgets/demos/images/box.xbm
new file mode 100644
index 00000000000..7498e15de2d
--- /dev/null
+++ b/iwidgets/demos/images/box.xbm
@@ -0,0 +1,14 @@
+#define Tool_32_box_width 32
+#define Tool_32_box_height 32
+static unsigned char Tool_32_box_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x0f, 0x20, 0x00, 0x00, 0x08,
+ 0x20, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00, 0x08,
+ 0x20, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00, 0x08,
+ 0x20, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00, 0x08,
+ 0x20, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00, 0x08,
+ 0x20, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00, 0x08,
+ 0xe0, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };
diff --git a/iwidgets/demos/images/clear.gif b/iwidgets/demos/images/clear.gif
new file mode 100644
index 00000000000..bd45628aa7a
--- /dev/null
+++ b/iwidgets/demos/images/clear.gif
Binary files differ
diff --git a/iwidgets/demos/images/close.gif b/iwidgets/demos/images/close.gif
new file mode 100644
index 00000000000..f91b9e9d1eb
--- /dev/null
+++ b/iwidgets/demos/images/close.gif
Binary files differ
diff --git a/iwidgets/demos/images/copy.gif b/iwidgets/demos/images/copy.gif
new file mode 100644
index 00000000000..7319f1dcb0a
--- /dev/null
+++ b/iwidgets/demos/images/copy.gif
Binary files differ
diff --git a/iwidgets/demos/images/cut.gif b/iwidgets/demos/images/cut.gif
new file mode 100644
index 00000000000..4258b175912
--- /dev/null
+++ b/iwidgets/demos/images/cut.gif
Binary files differ
diff --git a/iwidgets/demos/images/exit.gif b/iwidgets/demos/images/exit.gif
new file mode 100644
index 00000000000..e462be033f6
--- /dev/null
+++ b/iwidgets/demos/images/exit.gif
Binary files differ
diff --git a/iwidgets/demos/images/find.gif b/iwidgets/demos/images/find.gif
new file mode 100644
index 00000000000..dddcb8044b7
--- /dev/null
+++ b/iwidgets/demos/images/find.gif
Binary files differ
diff --git a/iwidgets/demos/images/help.gif b/iwidgets/demos/images/help.gif
new file mode 100644
index 00000000000..bc8f18c00dc
--- /dev/null
+++ b/iwidgets/demos/images/help.gif
Binary files differ
diff --git a/iwidgets/demos/images/line.xbm b/iwidgets/demos/images/line.xbm
new file mode 100644
index 00000000000..4622ae978b7
--- /dev/null
+++ b/iwidgets/demos/images/line.xbm
@@ -0,0 +1,14 @@
+#define lineOp_width 32
+#define lineOp_height 32
+static unsigned char lineOp_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00,
+ 0x80, 0x07, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00,
+ 0x00, 0x3c, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0xe0, 0x01, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x80, 0x07, 0x00,
+ 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x3c, 0x00,
+ 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xe0, 0x01,
+ 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/iwidgets/demos/images/mag.gif b/iwidgets/demos/images/mag.gif
new file mode 100644
index 00000000000..4a5be66e76b
--- /dev/null
+++ b/iwidgets/demos/images/mag.gif
Binary files differ
diff --git a/iwidgets/demos/images/new.gif b/iwidgets/demos/images/new.gif
new file mode 100644
index 00000000000..9c68ad35f55
--- /dev/null
+++ b/iwidgets/demos/images/new.gif
Binary files differ
diff --git a/iwidgets/demos/images/open.gif b/iwidgets/demos/images/open.gif
new file mode 100644
index 00000000000..bed862c8c41
--- /dev/null
+++ b/iwidgets/demos/images/open.gif
Binary files differ
diff --git a/iwidgets/demos/images/oval.xbm b/iwidgets/demos/images/oval.xbm
new file mode 100644
index 00000000000..856bd43785c
--- /dev/null
+++ b/iwidgets/demos/images/oval.xbm
@@ -0,0 +1,14 @@
+#define ovalOp_width 32
+#define ovalOp_height 32
+static unsigned char ovalOp_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x0f, 0x00,
+ 0x00, 0x1c, 0x70, 0x00, 0x00, 0x03, 0x80, 0x01, 0x80, 0x00, 0x00, 0x02,
+ 0x40, 0x00, 0x00, 0x04, 0x20, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10,
+ 0x10, 0x00, 0x00, 0x10, 0x08, 0x00, 0x00, 0x20, 0x08, 0x00, 0x00, 0x20,
+ 0x08, 0x00, 0x00, 0x20, 0x08, 0x00, 0x00, 0x20, 0x10, 0x00, 0x00, 0x10,
+ 0x10, 0x00, 0x00, 0x10, 0x20, 0x00, 0x00, 0x08, 0x40, 0x00, 0x00, 0x04,
+ 0x80, 0x00, 0x00, 0x02, 0x00, 0x03, 0x80, 0x01, 0x00, 0x1c, 0x70, 0x00,
+ 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/iwidgets/demos/images/paste.gif b/iwidgets/demos/images/paste.gif
new file mode 100644
index 00000000000..9974f23bf57
--- /dev/null
+++ b/iwidgets/demos/images/paste.gif
Binary files differ
diff --git a/iwidgets/demos/images/points.xbm b/iwidgets/demos/images/points.xbm
new file mode 100644
index 00000000000..c50aa4c5f3d
--- /dev/null
+++ b/iwidgets/demos/images/points.xbm
@@ -0,0 +1,14 @@
+#define dotPencilOp_width 32
+#define dotPencilOp_height 32
+static unsigned char dotPencilOp_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x12, 0x00,
+ 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x80, 0x04, 0x00,
+ 0x00, 0x80, 0x04, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00,
+ 0x00, 0x20, 0x01, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x90, 0x00, 0x00,
+ 0x00, 0x90, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00,
+ 0x00, 0x24, 0x00, 0x18, 0x00, 0x24, 0x00, 0x18, 0x00, 0x12, 0x00, 0x00,
+ 0x00, 0x12, 0x00, 0x30, 0x00, 0x0e, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00,
+ 0x00, 0x06, 0x0c, 0x30, 0x00, 0x00, 0x0c, 0x30, 0x00, 0x30, 0xa0, 0x01,
+ 0x00, 0x60, 0xb0, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };
diff --git a/iwidgets/demos/images/poly.gif b/iwidgets/demos/images/poly.gif
new file mode 100644
index 00000000000..2b595bb9b7f
--- /dev/null
+++ b/iwidgets/demos/images/poly.gif
Binary files differ
diff --git a/iwidgets/demos/images/print.gif b/iwidgets/demos/images/print.gif
new file mode 100644
index 00000000000..d321f17457e
--- /dev/null
+++ b/iwidgets/demos/images/print.gif
Binary files differ
diff --git a/iwidgets/demos/images/ruler.gif b/iwidgets/demos/images/ruler.gif
new file mode 100644
index 00000000000..00d26febf6a
--- /dev/null
+++ b/iwidgets/demos/images/ruler.gif
Binary files differ
diff --git a/iwidgets/demos/images/save.gif b/iwidgets/demos/images/save.gif
new file mode 100644
index 00000000000..d1ceb1a5c40
--- /dev/null
+++ b/iwidgets/demos/images/save.gif
Binary files differ
diff --git a/iwidgets/demos/images/select.gif b/iwidgets/demos/images/select.gif
new file mode 100644
index 00000000000..f885c9ca5ff
--- /dev/null
+++ b/iwidgets/demos/images/select.gif
Binary files differ
diff --git a/iwidgets/demos/images/text.xbm b/iwidgets/demos/images/text.xbm
new file mode 100644
index 00000000000..ffb06863031
--- /dev/null
+++ b/iwidgets/demos/images/text.xbm
@@ -0,0 +1,14 @@
+#define font_edit_width 32
+#define font_edit_height 32
+static unsigned char font_edit_bits[] = {
+ 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x1c,
+ 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x80, 0x7b,
+ 0x00, 0x00, 0x80, 0x7e, 0x00, 0x00, 0xc0, 0xfd, 0x00, 0x00, 0x60, 0xfb,
+ 0x00, 0x00, 0xb0, 0xf7, 0x00, 0x00, 0xd0, 0xef, 0x00, 0x00, 0xf8, 0xdf,
+ 0x00, 0x00, 0xd4, 0x7f, 0x00, 0x00, 0xaa, 0x1f, 0x00, 0x00, 0x15, 0x0f,
+ 0x00, 0x80, 0x82, 0x06, 0x03, 0x40, 0x01, 0x01, 0x07, 0xa0, 0x80, 0x00,
+ 0x0f, 0x10, 0x40, 0x00, 0x1f, 0x08, 0x20, 0x00, 0x3b, 0xe4, 0x1f, 0x00,
+ 0x73, 0x1a, 0x00, 0x00, 0xe3, 0x07, 0x00, 0x00, 0xc3, 0x01, 0x00, 0x00,
+ 0xe3, 0x03, 0x00, 0x00, 0x7b, 0x07, 0x00, 0x00, 0x1f, 0x06, 0x00, 0x00,
+ 0x07, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+ 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };
diff --git a/iwidgets/demos/iwidgets.gif b/iwidgets/demos/iwidgets.gif
new file mode 100644
index 00000000000..93864ff25f4
--- /dev/null
+++ b/iwidgets/demos/iwidgets.gif
Binary files differ
diff --git a/iwidgets/demos/labeledframe b/iwidgets/demos/labeledframe
new file mode 100644
index 00000000000..bfb9a81bdc4
--- /dev/null
+++ b/iwidgets/demos/labeledframe
@@ -0,0 +1,47 @@
+# ----------------------------------------------------------------------
+# DEMO: labeledframe in [incr Widgets]
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+
+set tk_strictMotif 1
+
+iwidgets::Labeledframe .pr -labelpos ne -labeltext "Print range"
+set cs [.pr childsite]
+
+radiobutton $cs.all \
+ -highlightthickness 0 \
+ -anchor w \
+ -justify left \
+ -text "All" \
+ -underline 0 \
+ -value 1
+
+radiobutton $cs.range \
+ -highlightthickness 0 \
+ -anchor w \
+ -justify left \
+ -text "Pages" \
+ -underline 2 \
+ -value 0
+
+iwidgets::entryfield $cs.from \
+ -highlightthickness 0 \
+ -labelpos w \
+ -labeltext "from:" \
+ -width 10
+
+[$cs.from component label] configure -justify left -underline 0
+
+iwidgets::entryfield $cs.to \
+ -highlightthickness 0 \
+ -labelpos w \
+ -labeltext "to:" \
+ -width 10
+
+[$cs.to component label] configure -justify left -underline 0
+
+pack $cs.all -side top -fill x -anchor w
+pack $cs.range -side left -fill x -anchor w
+pack $cs.from -side left -fill x -anchor w
+pack $cs.to -side left -fill x -anchor w
+pack .pr -fill both
diff --git a/iwidgets/demos/labeledwidget b/iwidgets/demos/labeledwidget
new file mode 100644
index 00000000000..2c6cb9d6d0d
--- /dev/null
+++ b/iwidgets/demos/labeledwidget
@@ -0,0 +1,23 @@
+# ----------------------------------------------------------------------
+# DEMO: labeledwidget in [incr Widgets]
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+
+. configure -background white
+
+iwidgets::labeledwidget .lw -labeltext "Label Text:"
+pack .lw -padx 4 -pady 4
+
+set win [.lw childsite]
+label $win.ex -text "(put your widgets here)" \
+ -background black -foreground white \
+ -width 30 -height 3
+pack $win.ex -expand yes -fill both -padx 4 -pady 4
+
+iwidgets::optionmenu .pos -labeltext "Position:" -command {
+ .lw configure -labelpos [.pos get]
+}
+pack .pos -padx 4 -pady 4
+
+.pos insert end e n ne nw s se sw w
+.pos select w
diff --git a/iwidgets/demos/mainwindow b/iwidgets/demos/mainwindow
new file mode 100644
index 00000000000..695b3e7d1df
--- /dev/null
+++ b/iwidgets/demos/mainwindow
@@ -0,0 +1,163 @@
+# ----------------------------------------------------------------------
+# DEMO: mainwindow in [incr Widgets]
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+
+wm withdraw .
+iwidgets::mainwindow .mw
+
+set imagedir [file join ${iwidgets::library} demos images]
+
+#
+# Add a File menubutton
+#
+.mw menubar add menubutton file -text "File" -underline 0 -padx 8 -pady 2 \
+ -menu {options -tearoff no
+ command new -label "New" -underline 0 \
+ -helpstr "Create a new file"
+ command open -label "Open ..." -underline 0 \
+ -helpstr "Open an existing file"
+ command save -label "Save" -underline 0 \
+ -helpstr "Save the current file"
+ command saveas -label "Save As ..." -underline 5 \
+ -helpstr "Save the file as a differnet name"
+ command print -label "Print" -underline 0 \
+ -helpstr "Print the file"
+ separator sep1
+ command close -label "Close" -underline 0 \
+ -helpstr "Close the file"
+ separator sep2
+ command exit -label "Exit" -underline 1 \
+ -helpstr "Exit this application"
+ }
+
+#
+# Add the Edit menubutton.
+#
+.mw menubar add menubutton edit -text "Edit" -underline 0 -padx 8 -pady 2 \
+ -menu {options -tearoff no
+ command cut -label "Cut" -underline 2 \
+ -helpstr "Cut the selection into the clipboard"
+ command copy -label "Copy" -underline 0 \
+ -helpstr "Copy the selection to the clipboard"
+ command paste -label "Paste" -underline 0 \
+ -helpstr "Paste the clipboard to the current point"
+ separator sep3
+ command find -label "Find" -underline 2 \
+ -helpstr "Search the text"
+ separator sep4
+ command clear -label "Clear" -underline 2 \
+ -helpstr "Clear the selection"
+ }
+
+#
+# Add the Help menubutton.
+#
+.mw menubar add menubutton help -text "Help" -underline 0 -padx 8 -pady 2 \
+ -menu {options -tearoff no
+ command onwindow -label "On Window" -underline 3 \
+ -helpstr "Obtain help on the window"
+ command onkeys -label "On Keys" -underline 3 \
+ -helpstr "Obtain help on the keys"
+ command index -label "Index" -underline 0 \
+ -helpstr "View the help index"
+ command onhelp -label "On Help" -underline 2 \
+ -helpstr "Obtain help on help"
+ command onversion -label "On Version" -underline 2 \
+ -helpstr "View the version information"
+ }
+
+#
+# Add items to the toolbar.
+#
+.mw toolbar add frame filler1 -width 108 -relief raised -borderwidth 2
+
+.mw toolbar add button new \
+ -image [image create photo -file [file join $imagedir new.gif]] \
+ -helpstr "Create a new file" \
+ -balloonstr "New"
+
+.mw toolbar add button open \
+ -image [image create photo -file [file join $imagedir open.gif]] \
+ -helpstr "Open an existing file" \
+ -balloonstr "Open"
+
+.mw toolbar add button close \
+ -image [image create photo -file [file join $imagedir close.gif]] \
+ -helpstr "Close the file" \
+ -balloonstr "Close"
+
+.mw toolbar add frame filler2 -width 20 -relief raised -borderwidth 2
+
+.mw toolbar add button cut \
+ -image [image create photo -file [file join $imagedir cut.gif]] \
+ -helpstr "Cut the selection into the cut buffer" \
+ -balloonstr "Cut"
+
+.mw toolbar add button copy \
+ -image [image create photo -file [file join $imagedir copy.gif]] \
+ -helpstr "Copy the selection to the cut buffer" \
+ -balloonstr "Copy"
+
+.mw toolbar add button paste \
+ -image [image create photo -file [file join $imagedir paste.gif]] \
+ -helpstr "Paste the cut buffer to the current point" \
+ -balloonstr "Paste"
+
+.mw toolbar add button clear \
+ -image [image create photo -file [file join $imagedir clear.gif]] \
+ -helpstr "Clear the selection" \
+ -balloonstr "Clear"
+
+.mw toolbar add frame filler3 -relief raised -borderwidth 2
+
+#
+# Add items to the menubar.
+#
+.mw mousebar add button save \
+ -image [image create photo -file [file join $imagedir save.gif]] \
+ -helpstr "Save the current file"
+
+.mw mousebar add button print \
+ -image [image create photo -file [file join $imagedir print.gif]] \
+ -helpstr "Print the file"
+
+.mw mousebar add button find \
+ -image [image create photo -file [file join $imagedir find.gif]] \
+ -helpstr "Search the text"
+
+.mw mousebar add frame filler1 -height 20 -relief raised -borderwidth 2
+
+.mw mousebar add button help \
+ -image [image create photo -file [file join $imagedir help.gif]] \
+ -helpstr "Obtain help for this window"
+
+.mw mousebar add frame filler2 -relief raised -borderwidth 2
+
+.mw mousebar add button exit \
+ -image [image create photo -file [file join $imagedir exit.gif]] \
+ -helpstr "Exit this application"
+
+.mw mousebar add frame filler3 -height 5
+
+#
+# Change the packing of the last fillers in the tool and mouse bar
+# so that it expands across and down the rest of the mainwindow.
+#
+pack [.mw toolbar component filler3] -expand yes -fill both
+pack [.mw mousebar component filler2] -expand yes -fill both
+
+
+#
+# Install a scrolledtext widget in the childsite.
+#
+iwidgets::scrolledtext [.mw childsite].st -visibleitems 40x8
+pack [.mw childsite].st -fill both -expand yes
+
+#
+# Activate the main window.
+#
+.mw activate
+
+
+
diff --git a/iwidgets/demos/menubar b/iwidgets/demos/menubar
new file mode 100644
index 00000000000..ef51d96e939
--- /dev/null
+++ b/iwidgets/demos/menubar
@@ -0,0 +1,76 @@
+# ----------------------------------------------------------------------
+# DEMO: menubar in [incr Widgets]
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+
+iwidgets::menubar .mb -helpvariable helpVar -menubuttons {
+ menubutton file -text "File" -menu {
+ options -tearoff false
+
+ command new -label "New" \
+ -helpstr "Open new document" \
+ -command {puts "selected: New"}
+
+ command close -label "Close" \
+ -helpstr "Close current document" \
+ -command {puts "selected: Close"}
+
+ separator sep1
+
+ command exit -label "Exit" -command {exit} \
+ -helpstr "Exit application"
+ }
+
+ menubutton edit -text "Edit" -menu {
+ options -tearoff false
+
+ command undo -label "Undo" -underline 0 \
+ -helpstr "Undo last command" \
+ -command {puts "selected: Undo"}
+
+ separator sep2
+
+ command cut -label "Cut" -underline 1 \
+ -helpstr "Cut selection to clipboard" \
+ -command {puts CUT}
+
+ command copy -label "Copy" -underline 1 \
+ -helpstr "Copy selection to clipboard" \
+ -command {puts "selected: Copy"}
+
+ command paste -label "Paste" -underline 0 \
+ -helpstr "Paste clipboard contents into document" \
+ -command {puts "selected: Paste"}
+ }
+
+ menubutton options -text "Options" -menu {
+ options -tearoff false -selectcolor blue
+
+ radiobutton byName -variable viewMode \
+ -value NAME -label "by Name" \
+ -helpstr "View files by name order" \
+ -command {puts "selected: by Name"}
+
+ radiobutton byDate -variable viewMode \
+ -value DATE -label "by Date" \
+ -helpstr "View files by date order" \
+ -command {puts "selected: by Date"}
+
+ cascade prefs -label "Preferences" -menu {
+ command colors -label Colors... \
+ -helpstr "Change text colors" \
+ -command {puts "selected: Colors..."}
+
+ command fonts -label "Fonts..." \
+ -helpstr "Change text font" \
+ -command {puts "selected: Fonts..."}
+ }
+ }
+}
+pack .mb -fill x
+
+frame .fr -width 200 -height 200 -background white
+pack .fr -fill both
+
+label .help -anchor w -textvariable helpVar -width 40
+pack .help -fill x
diff --git a/iwidgets/demos/messagebox b/iwidgets/demos/messagebox
new file mode 100644
index 00000000000..e2288222197
--- /dev/null
+++ b/iwidgets/demos/messagebox
@@ -0,0 +1,32 @@
+# ----------------------------------------------------------------------
+# DEMO: messagebox in [incr Widgets]
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+
+. configure -background white
+
+iwidgets::messagebox .mb -hscrollmode dynamic -labeltext "Messages" \
+ -labelpos n -visibleitems 50x8
+
+pack .mb -padx 5 -pady 5 -fill both -expand yes
+
+.mb type add ERROR -background red -foreground white -bell 1
+.mb type add WARNING -background yellow -foreground black
+.mb type add INFO -background white -foreground black
+
+frame .cntls -background white
+pack .cntls -padx 5 -pady 5 -fill x
+button .cntls.error -text "Error" -command {
+ .mb issue "This is an error message in red with a beep" ERROR
+}
+pack .cntls.error -side left -expand yes
+
+button .cntls.warning -text "Warning" -command {
+ .mb issue "This warning message in yellow" WARNING
+}
+pack .cntls.warning -side left -expand yes
+
+button .cntls.info -text "Info" -command {
+ .mb issue "This is an informational message" INFO
+}
+pack .cntls.info -side left -expand yes
diff --git a/iwidgets/demos/messagedialog b/iwidgets/demos/messagedialog
new file mode 100644
index 00000000000..95edf3128a0
--- /dev/null
+++ b/iwidgets/demos/messagedialog
@@ -0,0 +1,20 @@
+# ----------------------------------------------------------------------
+# DEMO: messagedialog in [incr Widgets]
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+
+button .b -text "Confirm..." -command {
+ if {[.md activate]} {
+ puts "selected: Yes"
+ } else {
+ puts "selected: No"
+ }
+}
+pack .b
+
+iwidgets::messagedialog .md -title "Message Dialog" -modality application \
+ -bitmap questhead -text "Are you sure?"
+
+.md hide Help
+.md buttonconfigure OK -text "Yes"
+.md buttonconfigure Cancel -text "No"
diff --git a/iwidgets/demos/notebook b/iwidgets/demos/notebook
new file mode 100644
index 00000000000..0a749daab71
--- /dev/null
+++ b/iwidgets/demos/notebook
@@ -0,0 +1,71 @@
+# ----------------------------------------------------------------------
+# DEMO: notebook in [incr Widgets]
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+
+option add *textBackground seashell
+option add *Scale.width 8
+. configure -background white
+
+iwidgets::optionmenu .pages -labeltext "Page:" -command {
+ .nb view [.pages get]
+}
+pack .pages -padx 4 -pady 4
+.pages insert end "Personal Info" "Favorite Color" "Blank Page"
+
+
+iwidgets::notebook .nb -width 3i -height 2.6i
+pack .nb -padx 4 -pady 4
+
+# Page #1
+# ----------------------------------------------------------------------
+set page [.nb add -label "Personal Info"]
+
+iwidgets::entryfield $page.name -labeltext "Name:" -labelpos nw
+pack $page.name
+iwidgets::entryfield $page.addr -labeltext "Address:" -labelpos nw
+pack $page.addr
+iwidgets::entryfield $page.addr2 -labeltext "City, State:" -labelpos nw
+pack $page.addr2
+iwidgets::entryfield $page.email -labeltext "E-mail:" -labelpos nw
+pack $page.email
+
+
+# Page #2
+# ----------------------------------------------------------------------
+set page [.nb add -label "Favorite Color"]
+
+frame $page.sample -width 20 -height 20 \
+ -borderwidth 2 -relief raised
+pack $page.sample -fill both -pady 4
+scale $page.r -label "Red" -orient horizontal \
+ -from 0 -to 255 -command "set_color $page"
+pack $page.r -fill x
+scale $page.g -label "Green" -orient horizontal \
+ -from 0 -to 255 -command "set_color $page"
+pack $page.g -fill x
+scale $page.b -label "Blue" -orient horizontal \
+ -from 0 -to 255 -command "set_color $page"
+pack $page.b -fill x
+
+proc set_color {page {val 0}} {
+ set r [$page.r get]
+ set g [$page.g get]
+ set b [$page.b get]
+ set color [format "#%.2x%.2x%.2x" $r $g $b]
+ $page.sample configure -background $color
+}
+set_color $page
+
+
+# Page #3
+# ----------------------------------------------------------------------
+set page [.nb add -label "Blank Page"]
+
+label $page.title -text "(put your widgets here)" \
+ -background black -foreground white \
+ -width 25 -height 3
+pack $page.title -expand yes -fill both
+
+
+.nb view "Personal Info"
diff --git a/iwidgets/demos/optionmenu b/iwidgets/demos/optionmenu
new file mode 100644
index 00000000000..d74a0bfb19c
--- /dev/null
+++ b/iwidgets/demos/optionmenu
@@ -0,0 +1,12 @@
+# ----------------------------------------------------------------------
+# DEMO: optionmenu in [incr Widgets]
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+
+iwidgets::optionmenu .cb -labeltext "Font:" -labelpos w -command {
+ puts "selected: [.cb get]"
+}
+pack .cb
+
+.cb insert end Ariel Courier Helvetica Knarly Lucida \
+ Rumpus Symbol Times "Zapf Dingbats"
diff --git a/iwidgets/demos/panedwindow b/iwidgets/demos/panedwindow
new file mode 100644
index 00000000000..d538301c79c
--- /dev/null
+++ b/iwidgets/demos/panedwindow
@@ -0,0 +1,30 @@
+# ----------------------------------------------------------------------
+# DEMO: panedwindow in [incr Widgets]
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+
+. configure -background white
+
+iwidgets::panedwindow .pw -width 3i -height 3i
+pack .pw -padx 4 -pady 4
+
+.pw add "top"
+set pane [.pw childsite "top"]
+label $pane.l -text "(put some widgets here)" \
+ -background black -foreground white
+pack $pane.l -expand yes -fill both
+
+.pw add "bottom"
+set pane [.pw childsite "bottom"]
+label $pane.l -text "(put other widgets here)" \
+ -background black -foreground white
+pack $pane.l -expand yes -fill both
+
+.pw fraction 40 60
+
+
+iwidgets::optionmenu .orient -labeltext "Orientation:" -command {
+ .pw configure -orient [.orient get]
+}
+pack .orient -padx 4 -pady 4
+.orient insert end horizontal vertical
diff --git a/iwidgets/demos/promptdialog b/iwidgets/demos/promptdialog
new file mode 100644
index 00000000000..a1702b895e2
--- /dev/null
+++ b/iwidgets/demos/promptdialog
@@ -0,0 +1,21 @@
+# ----------------------------------------------------------------------
+# DEMO: promptdialog in [incr Widgets]
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+
+option add *textBackground seashell
+
+button .b -text "Get Password..." -command {
+ if {[.pd activate]} {
+ puts "password: [.pd get]"
+ } else {
+ puts "cancelled"
+ }
+}
+pack .b
+
+iwidgets::promptdialog .pd -title "Prompt Dialog" -modality application \
+ -labeltext "Password:" -show "*"
+
+.pd hide Apply
+.pd hide Help
diff --git a/iwidgets/demos/pushbutton b/iwidgets/demos/pushbutton
new file mode 100644
index 00000000000..17c80b2dadb
--- /dev/null
+++ b/iwidgets/demos/pushbutton
@@ -0,0 +1,17 @@
+# ----------------------------------------------------------------------
+# DEMO: pushbutton in [incr Widgets]
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+
+. configure -background white
+
+iwidgets::pushbutton .pb -text "Push Me" -defaultring yes -command {
+ puts "Hello, World!"
+}
+pack .pb -padx 4 -pady 4
+
+checkbutton .default -text "Default ring" -variable defring \
+ -command {.pb configure -defaultring $defring}
+pack .default -padx 4 -pady 4
+
+.default invoke
diff --git a/iwidgets/demos/radiobox b/iwidgets/demos/radiobox
new file mode 100644
index 00000000000..17ed34e9141
--- /dev/null
+++ b/iwidgets/demos/radiobox
@@ -0,0 +1,14 @@
+# ----------------------------------------------------------------------
+# DEMO: radiobox in [incr Widgets]
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+
+iwidgets::radiobox .rb -labeltext "Size:" -labelpos nw
+pack .rb -padx 4 -pady 4 -fill both
+
+.rb add small -text "Small"
+.rb add med -text "Medium"
+.rb add large -text "Large"
+.rb add xlarge -text "Biggie"
+
+.rb select med
diff --git a/iwidgets/demos/scopedobject b/iwidgets/demos/scopedobject
new file mode 100644
index 00000000000..81fb31a6359
--- /dev/null
+++ b/iwidgets/demos/scopedobject
@@ -0,0 +1,16 @@
+#!/bin/sh
+# \
+ exec wish8.4 -f $0 $*
+
+package require Iwidgets 4.0
+
+#
+# Demo script for the Scopedobject class
+#
+proc scopedobject_demo {} {
+ iwidgets::scopedobject #auto \
+ -exitscopecommand {puts "enter scopedobject_demo"} \
+ -exitscopecommand {puts "exit scopedobject_demo"}
+}
+
+scopedobject_demo
diff --git a/iwidgets/demos/scrolledcanvas b/iwidgets/demos/scrolledcanvas
new file mode 100644
index 00000000000..2caf6a4c5a5
--- /dev/null
+++ b/iwidgets/demos/scrolledcanvas
@@ -0,0 +1,45 @@
+# ----------------------------------------------------------------------
+# DEMO: scrolledcanvas in [incr Widgets]
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+
+option add *textBackground seashell
+. configure -background white
+
+iwidgets::scrolledcanvas .canv -labeltext "Scrolledcanvas" \
+ -vscrollmode dynamic -hscrollmode dynamic -autoresize yes
+
+pack .canv -expand yes -fill both -padx 4 -pady 4
+.canv xview moveto 0
+.canv yview moveto 0
+
+
+button .zoomin -text "Zoom In" -command {
+ .canv scale all 0 0 2 2
+ .canv configure -scrollregion [.canv bbox all]
+}
+pack .zoomin -side left -expand yes -padx 4 -pady 4
+
+button .zoomout -text "Zoom Out" -command {
+ .canv scale all 0 0 0.5 0.5
+ .canv xview moveto 0
+ .canv yview moveto 0
+ .canv configure -scrollregion [.canv bbox all]
+}
+pack .zoomout -side left -expand yes -padx 4 -pady 4
+
+
+bind [.canv component canvas] <ButtonPress-1> {add_rectangle %W %x %y}
+bind [.canv component canvas] <B1-Motion> {add_rectangle %W %x %y}
+
+proc add_rectangle {win x y} {
+ set x [$win canvasx $x]
+ set y [$win canvasy $y]
+
+ $win create rectangle \
+ [expr $x-4] [expr $y-4] \
+ [expr $x+4] [expr $y+4] \
+ -outline "" -fill red
+
+ $win configure -scrollregion [$win bbox all]
+}
diff --git a/iwidgets/demos/scrolledframe b/iwidgets/demos/scrolledframe
new file mode 100644
index 00000000000..6a227c9195d
--- /dev/null
+++ b/iwidgets/demos/scrolledframe
@@ -0,0 +1,29 @@
+# ----------------------------------------------------------------------
+# DEMO: scrolledframe in [incr Widgets]
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+
+option add *textBackground seashell
+
+iwidgets::scrolledframe .sf -width 4i -height 2i -labeltext "Scrolledframe"
+pack .sf
+
+set win [.sf childsite]
+
+set all ""
+foreach option [.sf configure] {
+ if {[llength $option] == 5} {
+ set name [lindex $option 0]
+ set val [lindex $option end]
+
+ set entry [iwidgets::entryfield $win.#auto]
+ pack $entry -fill x
+
+ $entry configure -labeltext $name \
+ -command ".sf configure $name \[$entry get\]"
+ $entry insert 0 $val
+
+ lappend all $entry
+ }
+}
+eval iwidgets::Labeledwidget::alignlabels $all
diff --git a/iwidgets/demos/scrolledhtml b/iwidgets/demos/scrolledhtml
new file mode 100644
index 00000000000..b7e06cce35c
--- /dev/null
+++ b/iwidgets/demos/scrolledhtml
@@ -0,0 +1,14 @@
+# ----------------------------------------------------------------------
+# DEMO: scrolledhtml in [incr Widgets]
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+
+option add *textBackground seashell
+
+iwidgets::scrolledhtml .sh -labeltext "Scrolledhtml" \
+ -width 5i -height 3i \
+ -wrap word -linkcommand ".sh import -link" -padx 10
+
+pack .sh
+
+.sh import [file join ${iwidgets::library} demos demo.html]
diff --git a/iwidgets/demos/scrolledlistbox b/iwidgets/demos/scrolledlistbox
new file mode 100644
index 00000000000..71d3d0c7a63
--- /dev/null
+++ b/iwidgets/demos/scrolledlistbox
@@ -0,0 +1,30 @@
+# ----------------------------------------------------------------------
+# DEMO: scrolledlistbox in [incr Widgets]
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+
+option add *textBackground seashell
+. configure -background white
+
+iwidgets::scrolledlistbox .slb -labeltext "Scrolledlistbox" \
+ -vscrollmode dynamic -hscrollmode none \
+ -selectmode single \
+ -labelpos nw -selectioncommand {
+ puts "click: [.slb getcurselection]"
+ }
+
+pack .slb -padx 4 -pady 4
+
+.slb insert 0 Hello World! Cruel
+.slb delete "Hello"
+.slb insert 0 "Goodbye"
+
+button .add -text "Add" -command {
+ .slb insert end "Goodbye!"
+}
+pack .add -padx 4 -pady 4
+
+button .del -text "Delete" -command {
+ .slb delete 0
+}
+pack .del -padx 4 -pady 4
diff --git a/iwidgets/demos/scrolledtext b/iwidgets/demos/scrolledtext
new file mode 100644
index 00000000000..aa7205a8ece
--- /dev/null
+++ b/iwidgets/demos/scrolledtext
@@ -0,0 +1,13 @@
+# ----------------------------------------------------------------------
+# DEMO: scrolledtext in [incr Widgets]
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+
+option add *textBackground seashell
+
+iwidgets::scrolledtext .st -labeltext "Scrolledtext" -wrap none \
+ -vscrollmode static -hscrollmode dynamic \
+ -width 5i -height 2i
+pack .st
+
+.st import [file join ${iwidgets::library} demos scrolledtext]
diff --git a/iwidgets/demos/selectionbox b/iwidgets/demos/selectionbox
new file mode 100644
index 00000000000..2957b910ddc
--- /dev/null
+++ b/iwidgets/demos/selectionbox
@@ -0,0 +1,12 @@
+# ----------------------------------------------------------------------
+# DEMO: selectionbox in [incr Widgets]
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+
+option add *textBackground seashell
+
+iwidgets::selectionbox .sb -selectionlabel "Font:" -height 2i
+pack .sb
+
+.sb insert items end Ariel Courier Helvetica Knarly Lucida \
+ Rumpus Symbol Times "Zapf Dingbats"
diff --git a/iwidgets/demos/selectiondialog b/iwidgets/demos/selectiondialog
new file mode 100644
index 00000000000..15569f74dcb
--- /dev/null
+++ b/iwidgets/demos/selectiondialog
@@ -0,0 +1,22 @@
+# ----------------------------------------------------------------------
+# DEMO: selectiondialog in [incr Widgets]
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+
+option add *textBackground seashell
+
+iwidgets::selectiondialog .sd -modality application
+.sd configure -selectionlabel "Font:"
+
+.sd insert items end Ariel Courier Helvetica Knarly Lucida \
+ Rumpus Symbol Times "Zapf Dingbats"
+
+button .select -text "Font..." -command {
+ if {[.sd activate]} {
+ puts "selected: [.sd get]"
+ } else {
+ puts "cancelled"
+ }
+}
+pack .select -side left
+
diff --git a/iwidgets/demos/shell b/iwidgets/demos/shell
new file mode 100644
index 00000000000..7b76e9a583c
--- /dev/null
+++ b/iwidgets/demos/shell
@@ -0,0 +1,11 @@
+# ----------------------------------------------------------------------
+# DEMO: selectiondialog in [incr Widgets]
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+
+iwidgets::shell .sh -modality none -padx 20 -pady 20 -title Shell
+
+pack [label [.sh childsite].l -text SHELL]
+
+.sh center
+.sh activate
diff --git a/iwidgets/demos/spindate b/iwidgets/demos/spindate
new file mode 100644
index 00000000000..024a8760055
--- /dev/null
+++ b/iwidgets/demos/spindate
@@ -0,0 +1,9 @@
+# ----------------------------------------------------------------------
+# DEMO: spindate in [incr Widgets]
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+
+option add *textBackground seashell
+
+iwidgets::spindate .sd -monthformat brief
+pack .sd
diff --git a/iwidgets/demos/spinint b/iwidgets/demos/spinint
new file mode 100644
index 00000000000..65ca2136e1d
--- /dev/null
+++ b/iwidgets/demos/spinint
@@ -0,0 +1,29 @@
+# ----------------------------------------------------------------------
+# DEMO: spinint in [incr Widgets]
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+
+option add *textBackground seashell
+. configure -background white
+
+iwidgets::spinint .times -labeltext "Countdown:" -range {0 10} -width 3
+pack .times -padx 10 -pady 10
+
+.times delete 0 end
+.times insert end "5"
+
+frame .test
+pack .test -padx 10 -pady 10
+button .test.go -text "Go" -command {
+ set count [.times get]
+ while {$count >= 0} {
+ .test.readout configure -text $count
+ update
+ after 200
+ incr count -1
+ }
+ .test.readout configure -text "blast-off!"
+}
+pack .test.go -side left
+label .test.readout -width 15 -background seashell
+pack .test.readout -side left -padx 4 -pady 4
diff --git a/iwidgets/demos/spinner b/iwidgets/demos/spinner
new file mode 100644
index 00000000000..703bfa1d7d7
--- /dev/null
+++ b/iwidgets/demos/spinner
@@ -0,0 +1,28 @@
+# ----------------------------------------------------------------------
+# DEMO: spinner in [incr Widgets]
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+
+option add *textBackground seashell
+
+proc spinMonth {win step} {
+ set months {
+ January February March April
+ May June July August September
+ October November December
+ }
+
+ set index [expr [lsearch $months [$win get]] + $step]
+
+ if {$index < 0} {set index 11}
+ if {$index > 11} {set index 0}
+
+ $win delete 0 end
+ $win insert 0 [lindex $months $index]
+}
+
+iwidgets::spinner .sm -labeltext "Month:" -width 10 -fixed 10 \
+ -decrement {spinMonth .sm -1} -increment {spinMonth .sm 1}
+
+pack .sm
+.sm insert 0 "January"
diff --git a/iwidgets/demos/spintime b/iwidgets/demos/spintime
new file mode 100644
index 00000000000..f9674c01a82
--- /dev/null
+++ b/iwidgets/demos/spintime
@@ -0,0 +1,9 @@
+# ----------------------------------------------------------------------
+# DEMO: spintime in [incr Widgets]
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+
+option add *textBackground seashell
+
+iwidgets::spintime .st
+pack .st
diff --git a/iwidgets/demos/tabnotebook b/iwidgets/demos/tabnotebook
new file mode 100644
index 00000000000..b81a97f93e5
--- /dev/null
+++ b/iwidgets/demos/tabnotebook
@@ -0,0 +1,72 @@
+# ----------------------------------------------------------------------
+# DEMO: tabnotebook in [incr Widgets]
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+
+option add *textBackground seashell
+option add *Tabnotebook.backdrop DimGray
+option add *Scale.width 8
+. configure -background white
+
+iwidgets::tabnotebook .tnb -width 5i -height 3i
+pack .tnb -padx 4 -pady 4
+
+# Page #1
+# ----------------------------------------------------------------------
+set page [.tnb add -label "Personal Info"]
+
+iwidgets::entryfield $page.name -labeltext "Name:" -labelpos nw
+pack $page.name
+iwidgets::entryfield $page.addr -labeltext "Address:" -labelpos nw
+pack $page.addr
+iwidgets::entryfield $page.addr2 -labeltext "City, State:" -labelpos nw
+pack $page.addr2
+iwidgets::entryfield $page.email -labeltext "E-mail:" -labelpos nw
+pack $page.email
+
+
+# Page #2
+# ----------------------------------------------------------------------
+set page [.tnb add -label "Favorite Color"]
+
+frame $page.sample -width 20 -height 20 \
+ -borderwidth 2 -relief raised
+pack $page.sample -fill both -pady 4
+scale $page.r -label "Red" -orient horizontal \
+ -from 0 -to 255 -command "set_color $page"
+pack $page.r -fill x
+scale $page.g -label "Green" -orient horizontal \
+ -from 0 -to 255 -command "set_color $page"
+pack $page.g -fill x
+scale $page.b -label "Blue" -orient horizontal \
+ -from 0 -to 255 -command "set_color $page"
+pack $page.b -fill x
+
+proc set_color {page {val 0}} {
+ set r [$page.r get]
+ set g [$page.g get]
+ set b [$page.b get]
+ set color [format "#%.2x%.2x%.2x" $r $g $b]
+ $page.sample configure -background $color
+}
+set_color $page
+
+
+# Page #3
+# ----------------------------------------------------------------------
+set page [.tnb add -label "Blank Page"]
+
+label $page.title -text "(put your widgets here)" \
+ -background black -foreground white \
+ -width 25 -height 3
+pack $page.title -expand yes -fill both
+
+
+iwidgets::optionmenu .orient -labeltext "Tabs:" -command {
+ .tnb configure -tabpos [.orient get]
+}
+pack .orient -padx 4 -pady 4
+.orient insert end n s e w
+
+.tnb view "Personal Info"
+.tnb configure -tabpos [.orient get]
diff --git a/iwidgets/demos/tabset b/iwidgets/demos/tabset
new file mode 100644
index 00000000000..efc0f1580d4
--- /dev/null
+++ b/iwidgets/demos/tabset
@@ -0,0 +1,16 @@
+# ----------------------------------------------------------------------
+# DEMO: tabset in [incr Widgets]
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+
+proc showTab {num} {
+ puts "selected: [.ts tabcget $num -label]"
+}
+
+iwidgets::tabset .ts -command showTab
+pack .ts
+
+for {set i 1} {$i <= 5} {incr i} {
+ .ts add -label "#$i"
+}
+.ts select 0
diff --git a/iwidgets/demos/timeentry b/iwidgets/demos/timeentry
new file mode 100644
index 00000000000..e6c24113ade
--- /dev/null
+++ b/iwidgets/demos/timeentry
@@ -0,0 +1,7 @@
+# ----------------------------------------------------------------------
+# DEMO: timeentry in [incr Widgets]
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+
+iwidgets::timeentry .de -labeltext "Time:"
+pack .de -fill x -expand yes -padx 10 -pady 10
diff --git a/iwidgets/demos/timefield b/iwidgets/demos/timefield
new file mode 100644
index 00000000000..1f9377d314c
--- /dev/null
+++ b/iwidgets/demos/timefield
@@ -0,0 +1,12 @@
+# ----------------------------------------------------------------------
+# DEMO: timefield in [incr Widgets]
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+
+proc returnCmd {} {
+ puts [.df get]
+}
+
+iwidgets::timefield .df -labeltext "Time:" -command returnCmd
+pack .df -fill x -expand yes -padx 10 -pady 10
+
diff --git a/iwidgets/demos/toolbar b/iwidgets/demos/toolbar
new file mode 100644
index 00000000000..5b0175785fd
--- /dev/null
+++ b/iwidgets/demos/toolbar
@@ -0,0 +1,45 @@
+# ----------------------------------------------------------------------
+# DEMO: toolbar in [incr Widgets]
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+
+label .status -textvariable statusVar -width 40 -anchor w
+pack .status -side bottom
+
+iwidgets::toolbar .tb -helpvariable statusVar -orient vertical
+pack .tb -side left -anchor nw -padx 4 -pady 4
+
+set imagedir [file join ${iwidgets::library} demos images]
+
+.tb add button select \
+ -helpstr "Select drawing elements" \
+ -image [image create photo -file [file join $imagedir select.gif]] \
+ -balloonstr "Selection tool" \
+ -command {puts "tool: select"}
+
+.tb add button magnify \
+ -helpstr "Magnify drawing area" \
+ -image [image create photo -file [file join $imagedir mag.gif]] \
+ -balloonstr "Zoom tool" \
+ -command {puts "tool: magnify"}
+
+.tb add button ruler \
+ -helpstr "Measure distances on drawing" \
+ -image [image create photo -file [file join $imagedir ruler.gif]] \
+ -balloonstr "Ruler tool" \
+ -command {puts "tool: ruler"}
+
+.tb add frame filler \
+ -borderwidth 1 \
+ -width 10 \
+ -height 10
+
+.tb add button poly \
+ -helpstr "Draw a polygon" \
+ -image [image create photo -file [file join $imagedir poly.gif]] \
+ -balloonstr "Polygon tool" \
+ -command {puts "tool: polygon"}
+
+canvas .worksp -width 2i -height 3i \
+ -borderwidth 2 -relief sunken -background white
+pack .worksp -side right -expand yes -fill both -padx 4 -pady 4
diff --git a/iwidgets/demos/watch b/iwidgets/demos/watch
new file mode 100644
index 00000000000..4c30756b816
--- /dev/null
+++ b/iwidgets/demos/watch
@@ -0,0 +1,16 @@
+# ----------------------------------------------------------------------
+# DEMO: watch in [incr Widgets]
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+
+set tk_strictMotif 1
+
+iwidgets::watch .w -state disabled -showampm no -width 155 -height 155
+pack .w -padx 10 -pady 10 -fill both -expand yes
+
+proc fix_time {} {
+ if {! [winfo exists .w]} return
+ .w show
+ after 1000 fix_time
+}
+fix_time
diff --git a/iwidgets/doc/buttonbox.n b/iwidgets/doc/buttonbox.n
new file mode 100644
index 00000000000..91e73840486
--- /dev/null
+++ b/iwidgets/doc/buttonbox.n
@@ -0,0 +1,189 @@
+'\"
+'\" Copyright (c) 1995 DSC Technologies Corporation
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) buttonbox.n 1.21 94/12/17 16:04:44
+'\"
+.so man.macros
+.HS iwidgets::buttonbox iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+iwidgets::buttonbox \- Create and manipulate a manager widget for buttons
+.SH SYNOPSIS
+\fBiwidgets::buttonbox\fI \fIpathName \fR?\fIoptions\fR?
+.SH "INHERITANCE"
+itk::Widget <- iwidgets::buttonbox
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBbackground\fR \fBcursor\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "WIDGET-SPECIFIC OPTIONS"
+.ta 4c 8c 12c
+.LP
+.nf
+Name: \fBorient\fR
+Class: \fBOrient\fR
+Command-Line Switch: \fB-orient\fR
+.fi
+.IP
+Orientation of the button box: \fBhorizontal\fR or \fBvertical\fR. The default
+is horizontal.
+.LP
+.nf
+Name: \fBpadX\fR
+Class: \fBPadX\fR
+Command-Line Switch: \fB-padx\fR
+.fi
+.IP
+Specifies a non-negative padding distance to leave between the button group and
+the outer edge of the button box in the x direction. The value may be
+given in any of the forms acceptable to \fBTk_GetPixels\fR. The default
+is 5 pixels.
+.LP
+.nf
+Name: \fBpadY\fR
+Class: \fBPadY\fR
+Command-Line Switch: \fB-pady\fR
+.fi
+.IP
+Specifies a non-negative padding distance to leave between the button group and
+the outer edge of the button box in the y direction. The value may be given
+in any of the forms acceptable to \fBTk_GetPixels\fR. The default is 5 pixels.
+.LP
+.BE
+
+.SH DESCRIPTION
+.PP
+The \fBiwidgets::buttonbox\fR command creates a manager widget for controlling
+buttons. The button box also supports the display and invocation
+of a default button. The button box can be configured either horizontally
+or vertically.
+
+.SH "METHODS"
+.PP
+The \fBiwidgets::buttonbox\fR command creates a new Tcl command whose
+name is \fIpathName\fR. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIOption\fR and the \fIarg\fRs
+determine the exact behavior of the command.
+.PP
+Many of the widget commands for the buttonbox take as one argument an
+indicator of which button of the button box to operate on. These
+indicators are called \fIindexes\fR and allow reference and manipulation
+of buttons regardless of their current map state. buttonbox indexes
+may be specified in any of the following forms:
+.TP 12
+\fInumber\fR
+Specifies the button numerically, where 0 corresponds to the
+left/top-most button of the button box.
+.TP 12
+\fBend\fR
+Indicates the right/bottom-most button of the button box.
+.TP 12
+\fBdefault\fR
+Indicates the current default button of the button box. This is the
+button with the default ring displayed.
+.TP 12
+\fIpattern\fR
+If the index doesn't satisfy one of the above forms then this
+form is used. \fIPattern\fR is pattern-matched against the tag of
+each button in the button box, in order from left/top to right/left,
+until a matching entry is found. The rules of \fBTcl_StringMatch\fR
+are used.
+
+.SH "WIDGET-SPECIFIC METHODS"
+.TP
+\fIpathName \fBadd\fR \fItag\fR \fIargs\fR
+Add a button distinguished by \fItag\fR to the end of the button box.
+If additional arguments are present they specify options to be applied
+to the button. See \fBPushButton\fR for information on the options
+available.
+.TP
+\fIpathName \fBbuttonconfigure\fR \fIindex\fR ?\fIoptions\fR?
+This command is similar to the \fBconfigure\fR command, except that
+it applies to the options for an individual button,
+whereas \fBconfigure\fR applies to the options for the button box as a whole.
+\fIOptions\fR may have any of the values accepted by the \fBPushButton\fR
+command. If \fIoptions\fR are specified, options are modified
+as indicated in the command and the command returns an empty string.
+If no \fIoptions\fR are specified, returns a list describing
+the current options for entry \fIindex\fR (see \fBTk_ConfigureInfo\fR for
+information on the format of this list).
+.TP
+\fIpathName \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given
+by \fIoption\fR.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::buttonbox\fR
+command.
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR?
+Query or modify the configuration options of the widget.
+If no \fIoption\fR is specified, returns a list describing all of
+the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for
+information on the format of this list). If \fIoption\fR is specified
+with no \fIvalue\fR, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no \fIoption\fR is specified). If
+one or more \fIoption\-value\fR pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::buttonbox\fR
+command.
+.TP
+\fIpathName \fBdefault\fR \fIindex\fR
+Sets the default button to the button given by \fIindex\fR. This causes
+the default ring to appear arround the specified button.
+.TP
+\fIpathName \fBdelete\fR \fIindex\fR
+Deletes the button given by \fIindex\fR from the button box.
+.TP
+\fIpathName \fBhide\fR \fIindex\fR
+Hides the button denoted by \fIindex\fR. This doesn't remove the button
+permanently, just inhibits its display.
+.TP
+\fIpathName \fBindex \fIindex\fR
+Returns the numerical index corresponding to \fIindex\fR.
+.TP
+\fIpathName \fBinsert \fIindex\fR \fItag\fR ?\fIoption value option value ...\fR?
+Same as the \fBadd\fR command except that it inserts the new
+button just before the one given by \fIindex\fR, instead of appending
+to the end of the button box. The \fIoption\fR, and \fIvalue\fR
+arguments have the same interpretation as for the \fBadd\fR widget
+command.
+.TP
+\fIpathName \fBinvoke\fR \fI?index?\fR
+Invoke the command associated with a button. If no arguments
+are given then the current default button is invoked, otherwise the argument
+is expected to be a button \fIindex\fR.
+.TP
+\fIpathName \fBshow\fR \fIindex\fR
+Display a previously hidden button denoted by \fIindex\fR.
+.SH EXAMPLE
+.DS
+ package require Iwidgets 4.0
+ iwidgets::buttonbox .bb
+
+ .bb add Yes -text Yes -command "puts Yes"
+ .bb add No -text No -command "puts No"
+ .bb add Maybe -text Maybe -command "puts Maybe"
+ .bb default Yes
+
+ pack .bb -expand yes -fill both
+.DE
+.SH AUTHOR
+Bret A. Schuhmacher
+.DE
+Mark L. Ulferts
+.SH KEYWORDS
+buttonbox, pushbutton, button, widget
diff --git a/iwidgets/doc/calendar.n b/iwidgets/doc/calendar.n
new file mode 100644
index 00000000000..8395c8b4e45
--- /dev/null
+++ b/iwidgets/doc/calendar.n
@@ -0,0 +1,335 @@
+'\"
+'\" Copyright (c) 1997 DSC Technologies Corporation
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) calendar.n 1.0 97/04/30 16:04:44
+'\"
+.so man.macros
+.HS iwidgets::calendar iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+iwidgets::calendar \- Create and manipulate a monthly calendar
+.SH SYNOPSIS
+\fBiwidgets::calendar\fI \fIpathName \fR?\fIoptions\fR?
+.SH "INHERITANCE"
+itk::Widget <- iwidgets::calendar
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBbackground\fR \fBcursor\fR \fBforeground\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "ASSOCIATED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBint\fR
+.fi
+.LP
+See the "datefield" manual entry for details on this option. Note that
+this option is needed when the calendar is used in conjunction
+with the dateentry widget. It is necessary for support of international
+date formats in versions of Tk < 8.4.
+.SH "WIDGET-SPECIFIC OPTIONS"
+.LP
+.nf
+Name: \fBbackwardImage\fR
+Class: \fBImage\fR
+Command-Line Switch: \fB-backwardimage\fR
+.fi
+.IP
+Specifies a image to be displayed on the backwards calendar
+button. This image must have been created previously with
+the \fBimage create\fR command. If none is specified, a default
+is provided.
+.LP
+.nf
+Name: \fBbuttonForeground\fR
+Class: \fBForeground\fR
+Command-Line Switch: \fB-buttonforeground\fR
+.fi
+.IP
+Specifies the foreground color of the forward and backward buttons
+in any of the forms acceptable to \fBTk_GetColor\fR. The default
+color is blue.
+.LP
+.nf
+Name: \fBcommand\fR
+Class: \fBCommand\fR
+Command-Line Switch: \fB-command\fR
+.fi
+.IP
+Specifies a Tcl script to executed upon selection of a date in the
+calendar. If the command script contains any \fB%\fR characters,
+then the script will not be executed directly. Instead, a new
+script will be generated by replacing each \fB%\fR, and the
+character following it, with information from the calendar. The
+replacement depends on the character following the \fB%\fR, as
+defined in the list below.
+.TP
+\fB%d\fR
+Replaced with the date selected in the format mm/dd/yyyy.
+.LP
+.nf
+Name: \fBcurrentDateFont\fR
+Class: \fBFont\fR
+Command-Line Switch: \fB-currentdatefont\fR
+.fi
+.IP
+Specifies the font used for the current date text in any of the forms
+acceptable to \fBTk_GetFont\fR.
+.LP
+.nf
+Name: \fBdateFont\fR
+Class: \fBFont\fR
+Command-Line Switch: \fB-datefont\fR
+.fi
+.IP
+Specifies the font used for the days of the month text in any of the forms
+acceptable to \fBTk_GetFont\fR.
+.LP
+.nf
+Name: \fBdayFont\fR
+Class: \fBFont\fR
+Command-Line Switch: \fB-dayfont\fR
+.fi
+.IP
+Specifies the font used for the days of the week text in any of the forms
+acceptable to \fBTk_GetFont\fR.
+.LP
+.nf
+Name: \fBdays\fR
+Class: \fBdays\fR
+Command-Line Switch: \fB-days\fR
+.fi
+.IP
+Specifies a list of values to be used for the days of the week
+text to displayed above the days of the month. The default value
+is {Su Mo Tu We Th Fr Sa}.
+.LP
+.nf
+Name: \fBforewardImage\fR
+Class: \fBImage\fR
+Command-Line Switch: \fB-forewardimage\fR
+.fi
+.IP
+Specifies a image to be displayed on the forewards calendar
+button. This image must have been created previously with
+the \fBimage create\fR command. If none is specified, a default
+is provided.
+.LP
+.nf
+Name: \fBheight\fR
+Class: \fBHeight\fR
+Command-Line Switch: \fB-height\fR
+.fi
+.IP
+Specifies a desired window height that the calendar widget should
+request from its geometry manager. The value may be specified in any
+of the forms acceptable to \fBTk_GetPixels\fR. The default height
+is 165 pixels.
+.LP
+.nf
+Name: \fBoutline\fR
+Class: \fBOutline\fR
+Command-Line Switch: \fB-outline\fR
+.fi
+.IP
+Specifies the outline color used to surround the days of the month text in
+any of the forms acceptable to \fBTk_GetColor\fR. The default is the
+same color as the background.
+.LP
+.nf
+Name: \fBselectColor\fR
+Class: \fBForeground\fR
+Command-Line Switch: \fB-selectcolor\fR
+.fi
+.IP
+Specifies the color of the ring displayed that distinguishes the
+currently selected date in any of the forms acceptable to
+\fBTk_GetColor\fR. The default is red.
+.LP
+.nf
+Name: \fBselectThickness\fR
+Class: \fBSelectThickness\fR
+Command-Line Switch: \fB-selectthickness\fR
+.fi
+.IP
+Specifies the thickness of the ring displayed that distinguishes
+the currently selected date. The default is 3 pixels.
+.LP
+.nf
+Name: \fBstartday\fR
+Class: \fBDay\fR
+Command-Line Switch: \fB-startday\fR
+.fi
+.IP
+Specifies the starting day for the week: \fBsunday\fR, \fBmonday\fR,
+\fBtuesday\fR, \fBwednesday\fR, \fBthursday\fR, \fBfriday\fR, or
+\fBsaturday\fR. The default is sunday.
+.LP
+.nf
+Name: \fBtitleFont\fR
+Class: \fBFont\fR
+Command-Line Switch: \fB-titlefont\fR
+.fi
+.IP
+Specifies the font used for the title text which consists of the
+month and year. The font may be given in any of the forms
+acceptable to \fBTk_GetFont\fR.
+.LP
+.nf
+Name: \fBweekdayBackground\fR
+Class: \fBBackground\fR
+Command-Line Switch: \fB-weekdaybackground\fR
+.fi
+.IP
+Specifies the background color for the weekdays which allows it to
+be visually distinguished from the weekend. The color may be given
+in any of the forms acceptable to \fBTk_GetColor\fR. The default is
+the same as the background.
+.LP
+.nf
+Name: \fBweekendBackground\fR
+Class: \fBBackground\fR
+Command-Line Switch: \fB-weekendbackground\fR
+.fi
+.IP
+Specifies the background color for the weekends which allows it to
+be visually distinguished from the weekdays. The color may be given
+in any of the forms acceptable to \fBTk_GetColor\fR. The default is
+the same as the background.
+.LP
+.nf
+Name: \fBwidth\fR
+Class: \fBWidth\fR
+Command-Line Switch: \fB-width\fR
+.fi
+.IP
+Specifies a desired window width that the calendar widget should
+request from its geometry manager. The value may be specified in any
+of the forms acceptable to \fBTk_GetPixels\fR. The default width
+is 200 pixels.
+.LP
+.BE
+
+.SH DESCRIPTION
+.PP
+The \fBiwidgets::calendar\fR command creates a calendar widget for the selection
+of a date, displaying a single month at a time. Buttons exist on the
+top to change the month in effect turning the pages of a calendar. As
+a page is turned, the dates for the month are modified. Selection of
+a date visually marks that date. The selected value can be monitored
+via the -command option or just retrieved using the get command.
+
+.SH "METHODS"
+.PP
+The \fBiwidgets::calendar\fR command creates a new Tcl command whose
+name is \fIpathName\fR. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIOption\fR and the \fIarg\fRs
+determine the exact behavior of the command. The following
+commands are possible for calendar widgets:
+
+.SH "WIDGET-SPECIFIC METHODS"
+.TP
+\fIpathName \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given
+by \fIoption\fR.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::calendar\fR
+command.
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR?
+Query or modify the configuration options of the widget.
+If no \fIoption\fR is specified, returns a list describing all of
+the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for
+information on the format of this list). If \fIoption\fR is specified
+with no \fIvalue\fR, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no \fIoption\fR is specified). If
+one or more \fIoption\-value\fR pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::calendar\fR
+command.
+.TP
+\fIpathName \fBget\fR ?\fBformat\fR?
+Returns the currently selected date in a format of
+string or as an integer clock value using the \fB-string\fR and \fB-clicks\fR
+format options respectively. The default is by string. Reference the
+clock command for more information on obtaining dates and their
+formats.
+.TP
+\fIpathName \fBselect\fR \fIdate\fR
+Changes the currently selected date to the value specified which
+must be in the form of a date string, an integer clock value or as
+the keyword "now". Reference the clock
+command for more information on obtaining dates and their formats.
+Note that selecting a date does not change the
+month being shown to that of the date given. This chore is left
+to the \fBshow\fR command.
+.TP
+\fIpathName \fBshow\fR \fIdate\fR
+Changes the currently displayed date to be that of the date
+argument which must be in the form of a date string, an
+integer clock value or as
+the keyword "now". Reference the clock
+command for more information on obtaining dates and their formats.
+
+.SH "COMPONENTS"
+.LP
+.nf
+Name: \fBforward\fR
+Class: \fBButton\fR
+.fi
+.IP
+The forward component provides the button on the upper right of the
+calendar that changes the month to be the next. See the "button"
+widget manual entry for details on the forward component item.
+.LP
+.nf
+Name: \fBpage\fR
+Class: \fBCanvas\fR
+.fi
+.IP
+The page component provides the canvas on which the title, days of the
+week, and days of the month appear. See the "canvas" widget manual
+entry for details on the page component item.
+.LP
+.nf
+Name: \fBbackward\fR
+Class: \fBButton\fR
+.fi
+.TP
+The backward component provides the button on the upper right of the
+calendar that changes the month to be the next. See the "button"
+widget manual entry for details on the backward component item.
+
+.SH EXAMPLE
+.DS
+ package require Iwidgets 4.0
+ proc selectCmd {date} {
+ puts $date
+ }
+
+ iwidgets::calendar .c -command {selectCmd %d} \\
+ -weekendbackground mistyrose \\
+ -weekdaybackground ghostwhite -outline black \\
+ -startday wednesday -days {We Th Fr Sa Su Mo Tu}
+ pack .c
+.DE
+.SH AUTHOR
+Mark L. Ulferts
+.DE
+Michael J. McLennan
+.SH KEYWORDS
+calendar, widget
diff --git a/iwidgets/doc/canvasprintbox.n b/iwidgets/doc/canvasprintbox.n
new file mode 100644
index 00000000000..c580fd6fc43
--- /dev/null
+++ b/iwidgets/doc/canvasprintbox.n
@@ -0,0 +1,268 @@
+'\"
+'\" iwidgets::canvasprintbox (c) 1995 Tako Schotanus
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\"
+.so man.macros
+.HS iwidgets::canvasprintbox iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+iwidgets::canvasprintbox \- Create and manipulate a canvas print box widget
+.SH SYNOPSIS
+\fBiwidgets::canvasprintbox\fI \fIpathName \fR?\fIoptions\fR?
+.SH "INHERITANCE"
+itk::Widget <- iwidgets::Canvasprintbox
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fB
+activeBackground background borderWidth cursor
+foreground highlightBackground highlightColor highlightThickness
+insertBackground insertBorderWidth insertOffTime insertOnTime
+insertWidth relief repeatDelay repeatInterval
+selectBackground selectBorderWidth selectForeground\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "ASSOCIATED OPTIONS"
+.IP
+.LP
+.SH "WIDGET-SPECIFIC OPTIONS"
+.LP
+.nf
+Name: \fBfilename\fR
+Class: \fBFileName\fR
+Command-Line Switch: \fB-filename\fR
+.fi
+.IP
+The file to write the postscript output to (Only when output
+is set to "file"). If posterizing is turned on and \fBhpagecnt\fR
+and/or \fBvpagecnt\fR is more than 1, x.y is appended to the filename
+where x is the horizontal page number and y the vertical page number.
+.LP
+.nf
+Name: \fBhpagecnt\fR
+Class: \fBPageCnt\fR
+Command-Line Switch: \fB-hpagecnt\fR
+.fi
+.IP
+Is used in combination with \fBposterize\fR to determine over
+how many pages the output should be distributed. This
+attribute specifies how many pages should be used horizontaly.
+Any change to this attribute will automatically update the "stamp".
+Defaults to 1.
+.LP
+.nf
+Name: \fBorient\fR
+Class: \fBOrient\fR
+Command-Line Switch: \fB-orient\fR
+.fi
+.IP
+Determines the orientation of the output to the printer (or file).
+It can take the value "portrait" or "landscape" (default). Changes
+to this attribute will be reflected immediately in the "stamp".
+Defaults to "landscape" but will be changed automaticaly to the value
+deemed appropiate for the current canvas. Setting this attribute
+when the canvasprintbox is first constructed (instead of using the
+"configure" method) will turn off the auto adjustment of this attribute.
+.LP
+.nf
+Name: \fBoutput\fR
+Class: \fBOutput\fR
+Command-Line Switch: \fB-output\fR
+.fi
+.IP
+Specifies where the postscript output should go: to the printer
+or to a file. Can take on the values "printer" or "file".
+The corresponding entry-widget will reflect the contents of
+either the \fBprintcmd\fR attribute or the \fBfilename\fR attribute.
+Defaults to "printer".
+.LP
+.nf
+Name: \fBpageSize\fR
+Class: \fBPageSize\fR
+Command-Line Switch: \fB-pagesize\fR
+.fi
+.IP
+The pagesize the printer supports. Changes to this attribute
+will be reflected immediately in the "stamp".
+Defaults to "a4".
+.LP
+.nf
+Name: \fBposterize\fR
+Class: \fBPosterize\fR
+Command-Line Switch: \fB-posterize\fR
+.fi
+.IP
+Indicates if posterizing is turned on or not. Posterizing
+the output means that it is possible to distribute the
+output over more than one page. This way it is possible to
+print a canvas/region which is larger than the specified
+pagesize without stretching. If used in combination with
+stretching it can be used to "blow up" the contents of a
+canvas to as large as size as you want (See attributes:
+hpagecnt and vpagecnt). Any change to this attribute will
+automatically update the "stamp".
+Defaults to 0.
+.LP
+.nf
+Name: \fBprintCmd\fR
+Class: \fBPrintCmd\fR
+Command-Line Switch: \fB-printcmd\fR
+.fi
+.IP
+The command to execute when printing the postscript output.
+The command will get the postscript directed to its standard
+input (Only when output is set to "printer").
+Defaults to "lpr".
+.LP
+.nf
+Name: \fBprintRegion\fR
+Class: \fBPrintRegion\fR
+Command-Line Switch: \fB-printregion\fR
+.fi
+.IP
+A list of four coordinates specifying which part of the canvas to print.
+An empty list means that the canvas' entire \fBscrollregion\fR should be
+printed. Any change to this attribute will automatically update the "stamp".
+Defaults to an empty list.
+.LP
+.nf
+Name: \fBstretch\fR
+Class: \fBStretch\fR
+Command-Line Switch: \fB-stretch\fR
+.fi
+.IP
+Determines if the output should be stretched to fill the
+page (as defined by the attribute pagesize) as large as
+possible. The aspect-ratio of the output will be retained
+and the output will never fall outside of the boundaries
+of the page.
+Defaults to 0 but will be changed automaticaly to the value
+deemed appropiate for the current canvas. Setting this attribute
+when the canvasprintbox is first constructed (instead of using the
+"configure" method) will turn off the auto adjustment of this attribute.
+.LP
+.nf
+Name: \fBvPageCnt\fR
+Class: \fBPageCnt\fR
+Command-Line Switch: \fB-vpagecnt\fR
+.fi
+.IP
+Is used in combination with "posterize" to determine over
+how many pages the output should be distributed. This
+attribute specifies how many pages should be used verticaly.
+Any change to this attribute will automatically update the "stamp".
+Defaults to 1.
+.LP
+.BE
+
+.SH DESCRIPTION
+.PP
+Implements a print box for printing the contents of a canvas widget
+to a printer or a file. It is possible to specify page orientation, the
+number of pages to print the image on and if the output should be
+stretched to fit the page. Options exist to control the appearance and
+actions of the widget.
+
+.SH "METHODS"
+.PP
+The \fBiwidgets::canvasprintbox\fR command creates a new Tcl command whose
+name is \fIpathName\fR. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIOption\fR and the \fIarg\fRs
+determine the exact behavior of the command. The following
+commands are possible for canvasprintbox widgets:
+
+.SH "WIDGET-SPECIFIC METHODS"
+.TP
+\fIpathName \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given
+by \fIoption\fR.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::canvasprintbox\fR
+command.
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR?
+Query or modify the configuration options of the widget.
+If no \fIoption\fR is specified, returns a list describing all of
+the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for
+information on the format of this list). If \fIoption\fR is specified
+with no \fIvalue\fR, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no \fIoption\fR is specified). If
+one or more \fIoption\-value\fR pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::canvasprintbox\fR
+command.
+.TP
+\fIpathName\fR \fBgetoutput\fR
+Returns the value of the \fBprintercmd\fR or \fBfilename\fR option
+depending on the current setting of \fBoutput\fR.
+.TP
+\fIpathName\fR \fBprint\fR
+Perfrom the actual printing of the canvas using the current settings of
+all the attributes. Returns a boolean indicating wether the printing was
+successful or not.
+.TP
+\fIpathName\fR \fBrefresh\fR
+Retrieves the current value for all edit fields and updates
+the stamp accordingly. Is useful for Apply-buttons.
+.TP
+\fIpathName\fR \fBsetcanvas\fR \fIcanvas\fR
+This is used to set the \fIcanvas\fR that has to be printed.
+A stamp-sized copy will automatically be drawn to show how the
+output would look with the current settings.
+.TP
+\fIpathName \fBstop\fR
+Stops the drawing of the "stamp". I'm currently unable to detect
+when a Canvasprintbox gets destroyed or withdrawn. It's therefore
+advised that you perform a stop before you do something like that.
+.SH "COMPONENTS"
+.LP
+.nf
+Name: \fBprtflentry\fR
+Class: \fBEntry\fR
+.fi
+.IP
+The prtflentry component is the entry field for user input of the
+\fBfilename\fR or \fBprinter\fR command (depending on the value of
+\fBoutput\fR).
+.LP
+.nf
+Name: \fBhpcnt\fR
+Class: \fBEntry\fR
+.fi
+.IP
+The hpcnt component is the entry field for user input of the number of
+pages to use horizontaly when \fBposterize\fR is turned on.
+.fi
+.nf
+Name: \fBvpcnt\fR
+Class: \fBEntry\fR
+.fi
+.IP
+The vpcnt component is the entry field for user input of the number of
+pages to use verticaly when \fBposterize\fR is turned on.
+.fi
+
+.SH EXAMPLE
+.DS
+package require Iwidgets 4.0
+iwidgets::canvasprintbox .fsb -orient landscape -stretch 1
+pack .fsb -padx 10 -pady 10 -fill both -expand yes
+.DE
+.SH AUTHOR
+Tako Schotanus
+.LP
+Tako.Schotanus@bouw.tno.nl
+.SH KEYWORDS
+canvasprintbox, widget
diff --git a/iwidgets/doc/canvasprintdialog.n b/iwidgets/doc/canvasprintdialog.n
new file mode 100644
index 00000000000..9005767d3b1
--- /dev/null
+++ b/iwidgets/doc/canvasprintdialog.n
@@ -0,0 +1,169 @@
+'\"
+'\" iwidgets::canvasprintdialog (c) 1995 Mark L. Ulferts
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) canvasprintdialog.n 1.21 94/12/17 16:04:44
+'\"
+.so man.macros
+.HS iwidgets::canvasprintdialog iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+iwidgets::canvasprintdialog \- Create and manipulate a canvas print dialog widget
+.SH SYNOPSIS
+\fBiwidgets::canvasprintdialog\fI \fIpathName \fR?\fIoptions\fR?
+.SH "INHERITANCE"
+itk::Toplevel <- iwidgets::Dialogshell <- iwidgets::Dialog <- iwidgets::Canvasprintdialog
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fB
+activeBackground background borderWidth cursor
+foreground highlightBackground highlightColor highlightThickness
+insertBackground insertBorderWidth insertOffTime insertOnTime
+insertWidth relief repeatDelay repeatInterval
+selectBackground selectBorderWidth selectForeground\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "ASSOCIATED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBfilename\fR \fBhpagecnt\fR \fBorient\fR \fBoutput\fR
+\fBpagesize\fR \fBposterize\fR \fBprintcmd\fR \fBprintregion\fR
+\fBvpagecnt\fR
+.fi
+.LP
+See the "canvasprintbox" widget manual entry for details on the above
+associated options.
+
+.SH "INHERITED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBbuttonBoxPadX\fR \fBbuttonBoxPadY\fR \fBbuttonBoxPos\fR \fBpadX\fR
+\fBpadY\fR \fBseparator\fR \fBthickness\fR
+.fi
+.LP
+See the "dialogshell" widget manual entry for details on the above
+inherited options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBmaster\fR \fBmodality\fR
+.fi
+.LP
+See the "shell" widget manual entry for details on the above
+inherited options.
+.LP
+.LP
+.nf
+.ta 4c 8c 12c
+\fBtitle\fR
+.fi
+.LP
+See the "Toplevel" widget manual entry for details on the above
+inherited options.
+.LP
+.SH "WIDGET-SPECIFIC OPTIONS"
+.LP
+.BE
+
+.SH DESCRIPTION
+.PP
+The \fBiwidgets::canvasprintdialog\fR command creates a print dialog for printing
+the contents of a canvas widget to a printer or a file. It is possible
+to specify page orientation, the number of pages to print the image on
+and if the output should be stretched to fit the page.
+
+.SH "METHODS"
+.PP
+The \fBiwidgets::canvasprintdialog\fR command creates a new Tcl command whose
+name is \fIpathName\fR. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIOption\fR and the \fIarg\fRs
+determine the exact behavior of the command. The following
+commands are possible for canvasprintdialog widgets:
+.SH "ASSOCIATED METHODS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBgetoutput\fR \fBsetcanvas\fR \fBrefresh\fR \fBprint\fR
+.fi
+.LP
+See the "canvasprintbox" class manual entry for details on the
+associated methods.
+.SH "INHERITED METHODS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBadd\fR \fBbuttonconfigure\fR \fBdefault\fR \fBhide\fR
+\fBinsert\fR \fBinvoke\fR \fBshow\fR
+.fi
+.LP
+See the "buttonbox" widget manual entry for details on the above
+inherited methods.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBactivate\fR \fBdeactivate\fR
+.fi
+.LP
+See the "dialogshell" widget manual entry for details on the above
+inherited methods.
+
+.SH "WIDGET-SPECIFIC METHODS"
+.TP
+\fIpathName \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given
+by \fIoption\fR.
+\fIOption\fR may have any of the values accepted by
+the \fBiwidgets::canvasprintdialog\fR command.
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR?
+Query or modify the configuration options of the widget.
+If no \fIoption\fR is specified, returns a list describing all of
+the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for
+information on the format of this list). If \fIoption\fR is specified
+with no \fIvalue\fR, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no \fIoption\fR is specified). If
+one or more \fIoption\-value\fR pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+\fIOption\fR may have any of the values accepted by
+the \fBiwidgets::canvasprintdialog\fR
+command.
+
+.SH "COMPONENTS"
+.LP
+.nf
+Name: \fBcpb\fR
+Class: \fBCanvasprintbox\fR
+.fi
+.IP
+The cpb component is the canvas print box for the canvas print dialog.
+See the "canvasprintbox" widget manual entry for details on the cpb
+component item.
+.fi
+
+.SH EXAMPLE
+.DS
+ package require Iwidgets 4.0
+ iwidgets::canvasprintdialog .cpb
+ .cpb activate
+.DE
+.SH AUTHOR
+Tako Schotanus
+.LP
+Tako.Schotanus@bouw.tno.nl
+.SH KEYWORDS
+canvasprintdialog, canvasprintbox, dialog, widget
diff --git a/iwidgets/doc/checkbox.n b/iwidgets/doc/checkbox.n
new file mode 100644
index 00000000000..eaa60062d6c
--- /dev/null
+++ b/iwidgets/doc/checkbox.n
@@ -0,0 +1,178 @@
+'\"
+'\" Copyright (c) 1995 DSC Technologies Corporation
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) checkbox.n 1.21 94/12/17 16:04:44
+'\"
+.so man.macros
+.HS iwidgets::checkbox iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+iwidgets::checkbox \- Create and manipulate a checkbox widget
+.SH SYNOPSIS
+\fBiwidgets::checkbox\fI \fIpathName \fR?\fIoptions\fR?
+.SH "INHERITANCE"
+itk::Widget <- iwidgets::Labeledframe <- iwidgets::Checkbox
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBbackground\fR \fBborderWidth\fR \fBcursor\fR \fBdisabledForeground\fR
+\fBforeground\fR \fBrelief\fR \fBselectColor\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "INHERITED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBlabelBitmap\fR \fBlabelFont\fR \fBlabelImage\fR \fBlabelMargin\fR
+\fBlabelPos\fR \fBlabelText\fR \fBlabelVariable\fR
+.fi
+.LP
+See the "labeledframe" class manual entry for details on the
+inherited options.
+.SH "WIDGET-SPECIFIC OPTIONS"
+.LP
+.nf
+Name: \fBcommand\fR
+Class: \fBCommand\fR
+Command-Line Switch: \fB-command\fR
+.fi
+.IP
+Specifies a Tcl command procedure to be evaluated following a change in
+the current check box selection.
+.LP
+.nf
+Name: \fBorient\fR
+Class: \fBOrient\fR
+Command-Line Switch: \fB-orient\fR
+Default Value: \fBvertical\fR
+.fi
+.IP
+Specifies the orientation of the checkbuttons within the checkbox. Valid
+values are either "horizontal" or "vertical".
+.LP
+.BE
+
+.SH DESCRIPTION
+.PP
+The \fBiwidgets::checkbox\fR command creates a check button box widget
+capable of adding, inserting, deleting, selecting, and configuring
+checkbuttons as well as obtaining the currently selected button.
+
+.SH "METHODS"
+.PP
+The \fBiwidgets::checkbox\fR command creates a new Tcl command whose
+name is \fIpathName\fR. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIOption\fR and the \fIarg\fRs
+determine the exact behavior of the command.
+.PP
+Many of the widget commands for the \fBcheckbox\fR take as one argument an
+indicator of which checkbutton of the checkbox to operate on. These indicators
+are called \fIindexes\fR and allow reference and manipulation of checkbuttons.
+Checkbox indexes may be specified in any of the following forms:
+.TP 12
+\fInumber\fR
+Specifies the checkbutton numerically, where 0 corresponds to the top
+checkbutton of the checkbox.
+.TP 12
+\fBend\fR
+Indicates the last checkbutton of the checkbox.
+.TP 12
+\fIpattern\fR
+If the index doesn't satisfy one of the above forms then this
+form is used. \fIPattern\fR is pattern-matched against the tag of
+each checkbutton in the checkbox, in order from top to bottom,
+until a matching entry is found. The rules of \fBTcl_StringMatch\fR
+are used.
+
+.SH "WIDGET-SPECIFIC METHODS"
+.TP
+\fIpathName \fBadd\fR \fItag\fR ?\fIoption value option value\fR?
+Adds a new checkbutton to the checkbuttond window on the bottom. The command
+takes additional options which are passed on to the checkbutton as construction
+arguments. These include the standard Tk checkbutton options. The tag is
+returned.
+.TP
+\fIpathName \fBbuttonconfigure\fR \fIindex\fR ?\fIoptions\fR?
+This command is similar to the \fBconfigure\fR command, except that
+it applies to the options for an individual checkbutton,
+whereas \fBconfigure\fRapplies to the options for the checkbox as a whole.
+\fIOptions\fR may have any of the values accepted by the \fBadd\fR
+widget command. If \fIoptions\fR are specified, options are modified
+as indicated in the command and the command returns an empty string.
+If no \fIoptions\fR are specified, returns a list describing
+the current options for entry \fIindex\fR (see \fBTk_ConfigureInfo\fR for
+information on the format of this list).
+.TP
+\fIpathName \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given
+by \fIoption\fR.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::checkbox\fR
+command.
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR?
+Query or modify the configuration options of the widget.
+If no \fIoption\fR is specified, returns a list describing all of
+the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for
+information on the format of this list). If \fIoption\fR is specified
+with no \fIvalue\fR, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no \fIoption\fR is specified). If
+one or more \fIoption\-value\fR pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::checkbox\fR
+command.
+.TP
+\fIpathName \fBdelete\fR \fIindex\fR
+Deletes a specified checkbutton given an \fIindex\fR.
+.TP
+\fIpathName \fBdeselect\fR \fIindex\fR
+Deselects a specified checkbutton given an \fIindex\fR.
+.TP
+\fIpathName \fBflash\fR \fIindex\fR
+Flashes a specified checkbutton given an \fIindex\fR.
+.TP
+\fIpathName \fBget\fR ?\fIindex\fR?
+Returns the tags of the currently selected checkbuttons or the
+selection status of specific checkbutton when given an index.
+.TP
+\fIpathName \fBindex\fR \fIindex\fR
+Returns the numerical index corresponding to index.
+.TP
+\fIpathName \fBinsert \fIindex\fR \fItag\fR ?\fIoption value option value ...\fR?
+Same as the \fBadd\fR command except that it inserts the new
+checkbutton just before the one given by \fIindex\fR, instead of appending
+to the end of the checkbox. The \fIoption\fR, and \fIvalue\fR
+arguments have the same interpretation as for the \fBadd\fR widget
+command.
+.TP
+\fIpathName \fBselect\fR \fIindex\fR
+Selects a specified checkbutton given an \fIindex\fR.
+
+.SH EXAMPLE
+.DS
+ package require Iwidgets 4.0
+ iwidgets::checkbox .cb -labeltext Styles
+ .cb add bold -text Bold
+ .cb add italic -text Italic
+ .cb add underline -text Underline
+ .cb select underline
+
+ pack .cb -padx 10 -pady 10 -fill both -expand yes
+.DE
+
+.SH AUTHOR
+John A. Tucker
+.SH KEYWORDS
+checkbox, widget
diff --git a/iwidgets/doc/combobox.n b/iwidgets/doc/combobox.n
new file mode 100644
index 00000000000..40201644345
--- /dev/null
+++ b/iwidgets/doc/combobox.n
@@ -0,0 +1,376 @@
+'\"
+'\" Copyright (c) 1995 John S. Sigler
+'\" Copyright (c) 1997 Mitch Gorman
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) Combobox.n
+'\"
+.so man.macros
+.HS iwidgets::combobox iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+iwidgets::combobox \- Create and manipulate combination box widgets
+.SH SYNOPSIS
+\fBiwidgets::combobox\fI \fIpathName \fR?\fIoptions\fR?
+.SH "INHERITANCE"
+itk::Widget <- iwidgets::LabeledWidget <- iwidgets::Entryfield <- iwidgets::Combobox
+.SH "STANDARD OPTIONS"
+.LP
+.ta 4c 8c 12c
+.nf
+\fB
+background borderWidth cursor justify
+exportSelection foreground highlightColor highlightThickness
+insertWidth insertBackground insertOffTime insertOnTime
+insertWidth insertBorderWidth relief selectForeground
+selectBackground selectBorderWidth textVariable width\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "ASSOCIATED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBhscrollmode\fR \fBtextBackground\fR \fBtextFont\fR \fBvscrollmode\fR
+.fi
+.LP
+See the "scrolledlistbox" manual entry for details on the above inherited
+options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBshow\fR
+.fi
+.LP
+See the "entry" manual entry for details on the above inherited option.
+.SH "INHERITED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBchildSitePos\fR \fBcommand\fR \fBfixed\fR \fBfocusCommand\fR
+\fBinvalid\fR \fBtextBackground\fR \fBtextFont\fR \fBvalidate\fR
+.fi
+.LP
+See the "entryfield" class manual entry for details on the inherited options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBlabelBitmap\fR \fBlabelFont\fR \fBlabelImage\fR \fBlabelMargin\fR
+\fBlabelPos\fR \fBlabelText\fR \fBlabelVariable\fR \fBsticky\fR
+.fi
+.LP
+See the "labeledwidget" class manual entry for details on the
+inherited options.
+.SH "WIDGET-SPECIFIC OPTIONS"
+.LP
+.nf
+Name: \fBarrowRelief\fR
+Class: \fBRelief\fR
+Command-Line Switch: \fB-arrowrelief\fR
+.fi
+.IP
+Specifies the relief style to use for a dropdown Combobox's arrow
+button in a normal (not depressed) state. Acceptable values
+are \fBraised\fR, \fBsunken\fR, \fBflat\fR, \fBridge\fR, and \fBgroove\fR.
+Sunken is discouraged as this is the relief used to indicate a depressed
+state. This option has no effect on simple Comboboxes. The default is raised.
+.LP
+.nf
+Name: \fBcompletion\fR
+Class: \fBCompletion\fR
+Command-Line Switch: \fB-completion\fR
+.fi
+.IP
+Boolean given in any of the forms acceptable to \fBTcl_GetBoolean\fR which
+determines whether insertions into the entry field, whether from the
+keyboard or programmatically via the \fBinsert\fR method, are
+automatically completed with the first matching item from the listbox. The
+default is true.
+.LP
+.nf
+Name: \fBdropdown\fR
+Class: \fBDropdown\fR
+Command-Line Switch: \fB-dropdown\fR
+.fi
+.IP
+Boolean describing the Combobox layout style given in any of the forms
+acceptable to \fBTcl_GetBoolean\fR. If true, the Combobox
+will be a dropdown style
+widget which displays an entry field and an arrow button which when activated
+will pop up a scrollable list of items. If false, a simple Combobox style
+will be used which has an entry field and a scrollable list beneath it
+which is always visible. Both styles allow an optional label for the entry
+field area. The default is true.
+.LP
+.nf
+Name: \fBeditable\fR
+Class: \fBEditable\fR
+Command-Line Switch: \fB-editable\fR
+.fi
+.IP
+Boolean describing whether or not the text entry area is editable
+by the user. If true the user can add items to the combobox by entering text
+into the entry area and then pressing Return. If false, the list of items is
+non-editable and can only be changed by calling the insert or delete
+methods. (The value in the entry field can still be modified by selecting
+from the list.) Given in any of the forms acceptable to \fBTcl_GetBoolean\fR.
+The default is true.
+.LP
+.nf
+Name: \fBgrab\fR
+Class: \fBGrab\fR
+Command-Line Switch: \fB-grab\fR
+.fi
+.IP
+This option sets the grab scope for the appearance of the listbox in
+drop-down comboboxes. It can be either global or local. The default is
+local.
+.LP
+.nf
+Name: \fBlistHeight\fR
+Class: \fBHeight\fR
+Command-Line Switch: \fB-listheight\fR
+.fi
+.IP
+Height of the listbox specified in any of the forms acceptable to
+\fBTk_GetPixels\fR. The default is 150 pixels.
+.LP
+.nf
+Name: \fBmargin\fR
+Class: \fBMargin\fR
+Command-Line Switch: \fB-margin\fR
+.fi
+.IP
+Specifies the width in pixels between the entry component and the arrow button
+for a dropdown Combobox given in any of the forms acceptable to
+\fBTk_GetPixels\fR. This option has no effect on a simple Combobox. The
+default is 1.
+.LP
+.nf
+Name: \fBpopupCursor\fR
+Class: \fBCursor\fR
+Command-Line Switch: \fB-popupcursor\fR
+.fi
+.IP
+Specifies the cursor to be used for dropdown style listboxes. The value
+may have any of the forms acceptable to \fBTk_GetCursor\fR. The default is
+arrow.
+.LP
+.nf
+Name: \fBselectionCommand\fR
+Class: \fBSelectionCommand\fR
+Command-Line Switch: \fB-selectioncommand\fR
+.fi
+.IP
+Specifies a Tcl command procedure which is called when an item in the
+listbox area is selected. The item will be selected in the list, the listbox
+will be removed if it is a dropdown Combobox, and the selected item's
+text will be inserted into the entry field before the -selectioncommand proc is
+called. The default is {}.
+.LP
+.nf
+Name: \fBstate\fR
+Class: \fBState\fR
+Command-Line Switch: \fB-state\fR
+.fi
+.IP
+Specifies the overall state of the Combobox megawidget. Can be either
+normal or disabled. If the Combobox is disabled, no text can be entered
+into the entry field, no selection can be made in the listbox, and the
+arrowBtn component is disabled. The default is normal.
+.LP
+.nf
+Name: \fBunique\fR
+Class: \fBUnique\fR
+Command-Line Switch: \fB-unique\fR
+.fi
+.IP
+Boolean describing whether or not duplicate items are allowed in the combobox
+list. If true, then duplicates are not allowed to be inserted. If false, a
+duplicate entry causes selection of the item. Given in any of the forms
+acceptable to \fBTcl_GetBoolean\fR. The default is true.
+.BE
+
+.SH DESCRIPTION
+.PP
+The \fBiwidgets::combobox\fR command creates an enhanced entry field widget with an
+optional associated label and a scrollable list. When an item is selected in
+the list area of a Combobox, its value is then displayed in the entry field
+text area. Functionally similar to an Optionmenu, the Combobox adds (optional)
+list scrolling and (optional) item editing and inserting capabilities.
+.PP
+There are two basic styles of Comboboxes (determined by the -dropdown option):
+dropdown and simple. The dropdown style adds an arrow button to the right of
+the entry field which when activated will pop up (and down) the scrolled
+listbox beneath the entry field. The simple (non-dropdown) Combobox
+permanently displays the listbox beneath the entry field and has no
+arrow button. Either style allows an optional entry field label.
+.SH "METHODS"
+.PP
+The \fBiwidgets::combobox\fR command creates a new Tcl command whose
+name is \fIpathName\fR. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIOption\fR and the \fIarg\fRs
+determine the exact behavior of the command. The following
+commands are possible for Combobox widgets:
+.SH "ASSOCIATED METHODS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBicursor\fR \fBscan\fR
+.fi
+.LP
+See the "entry" manual entries for details on the above associated methods.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBcurselection\fR \fBindex\fR \fBsee\fR \fBsize\fR
+\fBxview\fR \fByview\fR
+.fi
+.LP
+See the "listbox" manual entries for details on the above associated methods.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBgetcurselection\fR \fBjustify\fR \fBsort\fR
+.fi
+.LP
+See the "scrolledlistbox" manual entries for details on the above associated
+methods.
+.LP
+.SH "WIDGET-SPECIFIC METHODS"
+.TP
+\fIpathName \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given
+by \fIoption\fR.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::combobox\fR
+command.
+.TP
+\fIpathName \fBclear\fR ?\fBcomponent\fR?
+Clears the contents from one or both components. Valid component values
+are \fBlist\fR, or \fBentry\fR. With no component specified, both are cleared.
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR?
+Query or modify the configuration options of the widget.
+If no \fIoption\fR is specified, returns a list describing all of
+the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for
+information on the format of this list). If \fIoption\fR is specified
+with no \fIvalue\fR, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no \fIoption\fR is specified). If
+one or more \fIoption\-value\fR pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::combobox\fR
+command.
+.TP
+\fIpathName \fBdelete \fIcomponent\fR \fIfirst\fR ?\fIlast\fR?
+Delete one or more elements from a given component, \fBlist\fR or \fBentry\fR.
+If a list item to be removed is currently selected (displayed in the entry
+field area), the entry field will be cleared.
+.TP
+\fIpathName \fBget ?\fIindex\fR? \fR
+With no arguments, returns the contents currently in the entry
+field area. With a single argument, returns the contents of the
+listbox item at the indicated index.
+.TP
+\fIpathName \fBinsert\fR \fIcomponent\fR \fIindex\fR \fIelement\fR ?\fIelement element ...\fR?
+Insert one or more new elements into the given component, \fBlist\fR or
+\fBentry\fR, just before the element given by \fIindex\fR.
+.TP
+\fIpathName \fBselection\fR \fIoption\fR \fIfirst\fR ?\fIlast\fR?
+Adjust the selection within the listbox component and updates the contents
+of the entry field component to the value of the selected item. See the
+"listbox" manual entry for more details on parameter options.
+.SH "COMPONENTS"
+.LP
+.nf
+Name: \fBentry\fR
+Class: \fBEntry\fR
+.fi
+.IP
+Text entry area where the current selection is displayed. If the
+Combobox is editable and its state is normal, the user can edit the
+contents of this item.
+.LP
+.nf
+Name: \fBlist\fR
+Class: \fBScrolledlistbox\fR
+.fi
+.IP
+Scrollable list which stores all the items which the user can select
+from. For dropdown Comboboxes, this component is hidden until the user pops it
+up by pressing on the arrow button to the right of the entry component. For
+simple Comboboxes this component is always visible just beneath the entry
+component.
+.SH "DEFAULT BINDINGS"
+.PP
+The Combobox generally has the same bindings as its primary component items -
+the Scrolledlistbox and Entryfield. However it also adds these:
+.PP
+[1] Button-1 mouse press on the arrow key of a dropdown Combobox causes the
+list to be popped up. If the combobox is non-editable, a Button-1 press on the
+entry field area will also pop up the list.
+.PP
+[2] Button-1 mouse press anywhere on the display removes a dropdown listbox
+which has been popped up, unless the keypress is upon one of the Combobox
+scrollbars which scrolls the list. If it is pressed upon an item in the list
+area, that item will be selected before the list is removed.
+.PP
+[3] Button-3 mouse press on the arrow key of a dropdown Combobox causes the
+next item to be selected. Shift-Button-3 causes the previous item to be
+selected.
+.PP
+[4] Escape keypress removes a dropdown list which has been popped up.
+.PP
+[5] The <space> and <Return> keystrokes select the current item. They also
+remove the popped up list for dropdown comboboxes.
+.PP
+[6] Up and Down arrow keypresses from the entry field and arrow button
+component cause the previous and next items in the listbox to be selected
+respectively. Ctl-P and Ctl-N are similarly mapped for emacs emulation.
+.PP
+[7] Entry field and arrow button component Shift-Up and Shift-Down arrow keys
+pop up and down the listbox of a dropdown Combobox. The arrow button component
+also maps <Return> and <space> similarly.
+
+.SH EXAMPLE
+.DS
+ package require Iwidgets 4.0
+ proc selectCmd {} {
+ puts stdout "[.cb2 getcurselection]"
+ }
+
+ #
+ # Non-editable Dropdown Combobox
+ #
+ iwidgets::combobox .cb1 -labeltext Month: \\
+ -selectioncommand {puts "selected: [.cb1 getcurselection]"} \\
+ -editable false -listheight 185 -popupcursor hand1
+ .cb1 insert list end Jan Feb Mar Apr May June Jul Aug Sept Oct Nov Dec
+
+ #
+ # Editable Dropdown Combobox
+ #
+ iwidgets::combobox .cb2 -labeltext "Operating System:" -selectioncommand selectCmd
+ .cb2 insert list end Linux HP-UX SunOS Solaris Irix
+ .cb2 insert entry end L
+
+ pack .cb1 -padx 10 -pady 10 -fill x
+ pack .cb2 -padx 10 -pady 10 -fill x
+
+.DE
+.SH ORIGINAL AUTHOR
+John S. Sigler
+.SH CURRENT MAINTAINER
+Mitch Gorman (logain@erols.com)
+.SH KEYWORDS
+combobox, entryfield, scrolledlistbox, itk::Widget, entry, listbox, widget,
+iwidgets
diff --git a/iwidgets/doc/dateentry.n b/iwidgets/doc/dateentry.n
new file mode 100644
index 00000000000..81379e8c569
--- /dev/null
+++ b/iwidgets/doc/dateentry.n
@@ -0,0 +1,177 @@
+'\"
+'\" Copyright (c) 1997 DSC Technologies Corporation
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) dateentry.n 1.0 97/04/30 16:04:44
+'\"
+.so man.macros
+.HS iwidgets::dateentry iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+iwidgets::dateentry \- Create and manipulate a dateentry widget
+.SH SYNOPSIS
+\fBiwidgets::dateentry\fI \fIpathName \fR?\fIoptions\fR?
+.SH "INHERITANCE"
+itk::Widget <- iwidgets::LabeledWidget <- iwidgets::Datefield <- iwidgets::Dateentry
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fB
+background borderWidth cursor exportSelection
+foreground highlightColor highlightThickness insertBackground
+justify relief\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "INHERITED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBdisabledForeground\fR \fBint\fR \fBlabelBitmap\fR \fBlabelFont\fR
+\fBlabelImage\fR \fBlabelMargin\fR \fBlabelPos\fR \fBlabelText\fR
+\fBlabelVariable\fR \fBstate\fR \fBsticky\fR
+.fi
+.LP
+See the "labeledwidget" class manual entry for details on these
+inherited options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBcommand\fR \fBiq\fR \fBstate\fR \fBtextBackground\fR
+\fBtextFont\fR
+.fi
+.LP
+See the "datefield" class manual entry for details on these
+inherited options.
+.SH "ASSOCIATED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBbackwardImage\fR \fBbuttonForeground\fR \fBcommand\fR \fBcurrentDateFont\fR
+\fBdateFont\fR \fBdayFont\fR \fBdays\fR \fBforwardImage\fR
+\fBoutline\fR \fBselectColor\fR \fBselectThickness\fR \fBstartDay\fR
+\fBtitleFont\fR \fBweekdayBackground\fR \fBweekendBackground\fR
+.fi
+.LP
+See the "calendar" manual entry for details on the associated options.
+.SH "WIDGET-SPECIFIC OPTIONS"
+.LP
+.nf
+Name: \fBgrab\fR
+Class: \fBGrab\fR
+Command-Line Switch: \fB-grab\fR
+.fi
+.IP
+Specifies the grab level, \fBlocal\fR or \fBglobal\fR, to be obtained before
+bringing up the popup calendar. The default is global. For more information
+concerning grab levels, consult the documentation for Tk's \fBgrab\fR command.
+.LP
+.nf
+Name: \fBicon\fR
+Class: \fBIcon\fR
+Command-Line Switch: \fB-icon\fR
+.fi
+.IP
+Specifies the calendar icon image to be used in the dateentry.
+This image must have been created previously with
+the \fBimage create\fR command. Should one not be provided,
+then one will be generated, pixmap if possible, bitmap otherwise.
+.LP
+.BE
+
+.SH DESCRIPTION
+.PP
+The \fBiwidgets::dateentry\fR command creates a quicken style date entry field
+with a popup calendar by combining the datefield and calendar
+widgets together. This allows a user to enter the date via the
+keyboard or by using the mouse and selecting the calendar icon
+which brings up a popup calendar.
+.DE
+
+.SH "METHODS"
+.PP
+The \fBiwidgets::dateentry\fR command creates a new Tcl command whose
+name is \fIpathName\fR. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIOption\fR and the \fIarg\fRs
+determine the exact behavior of the command. The following
+commands are possible for dateentry widgets:
+.SH "INHERITED METHODS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBget\fR \fBisvalid\fR \fBshow\fR
+.fi
+.LP
+See the "datefield" manual entry for details on the associated methods.
+.SH "WIDGET-SPECIFIC METHODS"
+.TP
+\fIpathName \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given
+by \fIoption\fR.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::dateentry\fR
+command.
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR?
+Query or modify the configuration options of the widget.
+If no \fIoption\fR is specified, returns a list describing all of
+the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for
+information on the format of this list). If \fIoption\fR is specified
+with no \fIvalue\fR, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no \fIoption\fR is specified). If
+one or more \fIoption\-value\fR pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::dateentry\fR
+command.
+
+.SH "COMPONENTS"
+.LP
+.nf
+Name: \fBlabel\fR
+Class: \fBLabel\fR
+.fi
+.IP
+The label component provides a label component to used to identify the date.
+See the "label" widget manual entry for details on the label component item.
+.LP
+.nf
+Name: \fBiconbutton\fR
+Class: \fBLabel\fR
+.fi
+.IP
+The iconbutton component provides a labelbutton component to act as a
+lightweight button
+displaying the calendar icon. Upon pressing the labelbutton, the calendar
+appears. See the "label" widget manual entry for details on the
+labelbutton component item.
+.LP
+.nf
+Name: \fBdate\fR
+Class: \fBEntry\fR
+.fi
+.IP
+The date component provides the entry field for date input and display.
+See the "entry" widget manual entry for details on the date component item.
+.fi
+
+.SH EXAMPLE
+.DS
+ package require Iwidgets 4.0
+ iwidgets::dateentry .de
+ pack .de
+.DE
+.SH AUTHOR
+Mark L. Ulferts
+.LP
+.SH KEYWORDS
+dateentry, widget
diff --git a/iwidgets/doc/datefield.n b/iwidgets/doc/datefield.n
new file mode 100644
index 00000000000..382f75176c5
--- /dev/null
+++ b/iwidgets/doc/datefield.n
@@ -0,0 +1,215 @@
+'\"
+'\" Copyright (c) 1997 DSC Technologies Corporation
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) datefield.n 1.0 97/04/30 16:04:44
+'\"
+.so man.macros
+.HS iwidgets::datefield iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+iwidgets::datefield \- Create and manipulate a date field widget
+.SH SYNOPSIS
+\fBiwidgets::datefield\fI \fIpathName \fR?\fIoptions\fR?
+.SH "INHERITANCE"
+itk::Widget <- iwidgets::LabeledWidget <- iwidgets::Datefield
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fB
+background borderWidth cursor exportSelection
+foreground highlightColor highlightThickness insertBackground
+justify relief\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "INHERITED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBdisabledForeground\fR \fBlabelBitmap\fR \fBlabelFont\fR \fBlabelImage\fR
+\fBlabelMargin\fR \fBlabelPos\fR \fBlabelText\fR \fBlabelVariable\fR
+\fBstate\fR \fBsticky\fR
+.fi
+.LP
+See the "labeledwidget" class manual entry for details on the
+inherited options.
+.SH "WIDGET-SPECIFIC OPTIONS"
+.LP
+.nf
+Name: \fBchildSitePos\fR
+Class: \fBPosition\fR
+Command-Line Switch: \fB-childsitepos\fR
+.fi
+.IP
+Specifies the position of the child site in the date field: \fBn\fR,
+\fBs\fR, \fBe\fR, or \fBw\fR. The default is e.
+.LP
+.nf
+Name: \fBcommand\fR
+Class: \fBCommand\fR
+Command-Line Switch: \fB-command\fR
+.fi
+.IP
+Specifies a Tcl command to be executed upon detection of a Return key
+press event.
+.LP
+.nf
+Name: \fBgmt\fR
+Class: \fBGMT\fR
+Command-Line Switch: \fB-gmt\fR
+.fi
+.IP
+Determines whether the date is calculated relative to Greenwich
+Mean Time. Accepts a boolean value. The default is no.
+.LP
+.nf
+Name: \fBint\fR
+Class: \fBDateFormat\fR
+Command-Line Switch: \fB-int\fR
+.fi
+.IP
+Used to specify international date formats. This option must be
+a boolean value. When set to true, the date is formatted as
+YYYY-MM-DD. When set to false, it is formatted as MM/DD/YYYY. Note
+that this format is driven by the 'clock scan' command and that
+YYYY-MM-DD is supported in Tk 8.4 or later. The default is no.
+.LP
+.nf
+Name: \fBiq\fR
+Class: \fBIq\fR
+Command-Line Switch: \fB-iq\fR
+.fi
+.IP
+Specifies the level of intelligence to be shown in the actions
+taken by the datefield during the processing of keypress events.
+Valid settings include \fBhigh\fR, \fBaverage\fR, and \fBlow\fR.
+With a high iq,the date prevents the user from typing in an
+invalid date. For example, if the current date is 05/31/1997 and
+the user changes the month to 04, then the day will be instantly
+modified for them to be 30. In addition, leap years are fully
+taken into account. With average iq, the month is limited to the
+values of 01-12, but it is possible to type in an invalid day.
+A setting of low iq instructs the widget to do no validity
+checking at all during date entry. With both average and low
+iq levels, it is assumed that the validity will be determined
+at a later time using the date's \fBisvalid\fR command.
+.LP
+.nf
+Name: \fBstate\fR
+Class: \fBState\fR
+Command-Line Switch: \fB-state\fR
+.fi
+.IP
+Specifies one of two states for the datefield: \fBnormal\fR or \fBdisabled\fR.
+If the datefield is disabled then input is not accepted. The default is
+normal.
+.LP
+.nf
+Name: \fBtextBackground\fR
+Class: \fBBackground\fR
+Command-Line Switch: \fB-textbackground\fR
+.fi
+.IP
+Background color for inside textual portion of the entry field. The value
+may be given in any of the forms acceptable to \fBTk_GetColor\fR.
+.LP
+.nf
+Name: \fBtextFont\fR
+Class: \fBFont\fR
+Command-Line Switch: \fB-textfont\fR
+.fi
+.IP
+Name of font to use for display of text in datefield. The value
+may be given in any of the forms acceptable to \fBTk_GetFont\fR.
+.LP
+.BE
+
+.SH DESCRIPTION
+.PP
+The \fBiwidgets::datefield\fR command creates an enhanced text entry widget for
+the purpose of date entry with various degrees of built-in intelligence.
+.DE
+
+.SH "METHODS"
+.PP
+The \fBiwidgets::datefield\fR command creates a new Tcl command whose
+name is \fIpathName\fR. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIOption\fR and the \fIarg\fRs
+determine the exact behavior of the command. The following
+commands are possible for datefield widgets:
+.SH "WIDGET-SPECIFIC METHODS"
+.TP
+\fIpathName \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given
+by \fIoption\fR.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::datefield\fR
+command.
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR?
+Query or modify the configuration options of the widget.
+If no \fIoption\fR is specified, returns a list describing all of
+the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for
+information on the format of this list). If \fIoption\fR is specified
+with no \fIvalue\fR, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no \fIoption\fR is specified). If
+one or more \fIoption\-value\fR pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::datefield\fR
+command.
+.TP
+\fIpathName \fBget\fR ?\fBformat\fR?
+Returns the current contents of the datefield in a format of
+string or as an integer clock value using the \fB-string\fR and \fB-clicks\fR
+format options respectively. The default is by string. Reference the
+clock command for more information on obtaining dates and their
+formats.
+.TP
+\fIpathName \fBisvalid\fR
+Returns a boolean indication of the validity of the currently
+displayed date value. For example, 03/03/1960 is valid whereas
+02/29/1997 is invalid.
+.TP
+\fIpathName \fBshow\fR \fIdate\fR
+Changes the currently displayed date to be that of the date
+argument. The date may be specified either as a string, an
+integer clock value or the keyword "now". Reference the clock
+command for more information on obtaining dates and their formats.
+
+.SH "COMPONENTS"
+.LP
+.nf
+Name: \fBdate\fR
+Class: \fBEntry\fR
+.fi
+.IP
+The date component provides the entry field for date input and display.
+See the "entry" widget manual entry for details on the date component item.
+.fi
+
+.SH EXAMPLE
+.DS
+ package require Iwidgets 4.0
+ proc returnCmd {} {
+ puts [.df get]
+ }
+
+ iwidgets::datefield .df -command returnCmd
+ pack .df -fill x -expand yes -padx 10 -pady 10
+.DE
+.SH AUTHOR
+Mark L. Ulferts
+.LP
+.SH KEYWORDS
+datefield, widget
diff --git a/iwidgets/doc/dialog.n b/iwidgets/doc/dialog.n
new file mode 100644
index 00000000000..55c8841018e
--- /dev/null
+++ b/iwidgets/doc/dialog.n
@@ -0,0 +1,140 @@
+'\"
+'\" Copyright (c) 1995 DSC Technologies Corporation
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) dialog.n 1.21 94/12/17 16:04:44
+'\"
+.so man.macros
+.HS iwidgets::dialog iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+iwidgets::dialog \- Create and manipulate a dialog widget
+.SH SYNOPSIS
+\fBiwidgets::dialog\fI \fIpathName \fR?\fIoptions\fR?
+.SH "INHERITANCE"
+itk::Toplevel <- iwidgets::Shell <- iwidgets::Dialogshell <- iwidgets::Dialog
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBbackground\fR \fBcursor\fR \fBforeground\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "INHERITED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBbuttonBoxPadX\fR \fBbuttonBoxPadY\fR \fBbuttonBoxPos\fR \fBpadX\fR
+\fBpadY\fR \fBseparator\fR \fBthickness\fR
+.fi
+.LP
+See the "dialogshell" manual entry for details on the above inherited options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBheight\fR \fBmaster\fR \fBmodality\fR \fBwidth\fR
+.fi
+.LP
+See the "shell" manual entry for details on the above inherited options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBtitle\fR
+.fi
+.LP
+See the "Toplevel" manual entry for details on the above inherited options.
+.BE
+
+.SH DESCRIPTION
+.PP
+The \fBiwidgets::dialog\fR command creates a dialog box providing standard
+buttons and a child site for use in derived classes. The buttons
+include ok, apply, cancel, and help. Methods and Options exist to
+configure the buttons and their containing box.
+
+.SH "METHODS"
+.PP
+The \fBiwidgets::dialog\fR command creates a new Tcl command whose
+name is \fIpathName\fR. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIOption\fR and the \fIarg\fRs
+determine the exact behavior of the command. The following
+commands are possible for dialog widgets:
+.SH "INHERITED METHODS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBadd\fR \fBbuttonconfigure\fR \fBdefault\fR \fBhide\fR
+\fBindex\fR \fBinsert\fR \fBinvoke\fR \fBshow\fR
+.fi
+.LP
+See the "buttonbox" manual entry for details on the above inherited methods.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBchildsite\fR
+.fi
+.LP
+See the "dialogshell" manual entry for details on the above inherited methods.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBactivate\fR \fBcenter\fR \fBdeactivate\fR
+.fi
+.LP
+See the "shell" manual entry for details on the above inherited methods.
+
+.SH "WIDGET-SPECIFIC METHODS"
+.TP
+\fIpathName \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given
+by \fIoption\fR.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::dialog\fR
+command.
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR?
+Query or modify the configuration options of the widget.
+If no \fIoption\fR is specified, returns a list describing all of
+the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for
+information on the format of this list). If \fIoption\fR is specified
+with no \fIvalue\fR, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no \fIoption\fR is specified). If
+one or more \fIoption\-value\fR pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::dialog\fR
+command.
+
+.SH EXAMPLE
+.DS
+ package require Iwidgets 4.0
+ iwidgets::dialog .d -modality global
+ .d buttonconfigure OK -command {puts OK; .d deactivate 1}
+ .d buttonconfigure Apply -command {puts Apply}
+ .d buttonconfigure Cancel -command {puts Cancel; .d deactivate 0}
+ .d buttonconfigure Help -command {puts Help}
+
+ listbox [.d childsite].lb -relief sunken
+ pack [.d childsite].lb -expand yes -fill both
+
+ if {[.d activate]} {
+ puts "Exit via OK button"
+ } else {
+ puts "Exit via Cancel button"
+ }
+.DE
+.SH AUTHOR
+Mark L. Ulferts
+.DE
+Bret A. Schuhmacher
+.SH KEYWORDS
+dialog, dialogshell, shell, widget
diff --git a/iwidgets/doc/dialogshell.n b/iwidgets/doc/dialogshell.n
new file mode 100644
index 00000000000..ab39484b4a3
--- /dev/null
+++ b/iwidgets/doc/dialogshell.n
@@ -0,0 +1,217 @@
+'\"
+'\" Copyright (c) 1995 DSC Technologies Corporation
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) dialogshell.n 1.21 94/12/17 16:04:44
+'\"
+.so man.macros
+.HS iwidgets::dialogshell iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+iwidgets::dialogshell \- Create and manipulate a dialog shell widget
+.SH SYNOPSIS
+\fBiwidgets::dialogshell\fI \fIpathName \fR?\fIoptions\fR?
+.SH "INHERITANCE"
+itk::Toplevel <- iwidgets::Shell <- iwidgets::Dialogshell
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBbackground\fR \fBcursor\fR \fBforeground\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "INHERITED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBheight\fR \fBmaster\fR \fBmodality\fR \fBwidth\fR
+.fi
+.LP
+See the "shell" manual entry for details on the above inherited options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBtitle\fR
+.fi
+.LP
+See the "Toplevel" manual entry for details on the above inherited options.
+
+.SH "WIDGET-SPECIFIC OPTIONS"
+.LP
+.nf
+Name: \fBbuttonBoxPadX\fR
+Class: \fBPad\fR
+Command-Line Switch: \fB-buttonboxpadx\fR
+.fi
+.IP
+Specifies a non-negative padding distance to leave between the button group and
+the outer edge of the button box in the x direction. The value may be
+given in any of the forms accpetable to \fBTk_GetPixels\fR. The default
+is 5 pixels.
+.LP
+.nf
+Name: \fBbuttonBoxPadY\fR
+Class: \fBPad\fR
+Command-Line Switch: \fB-buttonboxpady\fR
+.fi
+.IP
+Specifies a non-negative padding distance to leave between the button group and
+the outer edge of the button box in the y direction. The value may be
+given in any of the forms accpetable to \fBTk_GetPixels\fR. The default
+is 5 pixels.
+.LP
+.nf
+Name: \fBbuttonBoxPos\fR
+Class: \fBPosition\fR
+Command-Line Switch: \fB-buttonboxpos\fR
+.fi
+.IP
+Attaches buttons to the given side of the dialog: \fBn\fR, \fBs\fR,
+\fBe\fR or \fBw\fR. The default is s.
+.LP
+.nf
+Name: \fBpadX\fR
+Class: \fBPad\fR
+Command-Line Switch: \fB-padx\fR
+.fi
+.IP
+Specifies a padding distance for the childsite in the X-direction in
+any of the forms acceptable to \fBTk_GetPixels\fR. The default is 10.
+.LP
+.nf
+Name: \fBpadY\fR
+Class: \fBPad\fR
+Command-Line Switch: \fB-pady\fR
+.fi
+.IP
+Specifies a padding distance for the childsite in the Y-direction in
+any of the forms acceptable to \fBTk_GetPixels\fR. The default is 10.
+.LP
+.nf
+Name: \fBseparator\fR
+Class: \fBSeparator\fR
+Command-Line Switch: \fB-separator\fR
+.fi
+.IP
+Specifies whether a line is drawn to separate the
+buttons from the dialog box contents in any of the forms
+acceptable to \fBTcl_GetBoolean\fR. The default is true.
+.LP
+.nf
+Name: \fBthickness\fR
+Class: \fBThickness\fR
+Command-Line Switch: \fB-thickness\fR
+.fi
+.IP
+Specifies the thickness of the separator in any of the forms acceptable
+to \fBTk_GetPixels\fR. The default is 3 pixels.
+.BE
+
+.SH DESCRIPTION
+.PP
+The \fBiwidgets::dialogshell\fR command creates a dialog shell which is a top
+level widget composed of a button box, separator, and child site area.
+The class also has methods to control button construction.
+
+.SH "METHODS"
+.PP
+The \fBiwidgets::dialogshell\fR command create a new Tcl command whose
+name is \fIpathName\fR. This command may be used to invoke various
+operations on the widget. It has the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIOption\fR and the \fIarg\fRs
+determine the exact behavior of the command. The following
+commands are possible for dialogshell widgets:
+.SH "INHERITED METHODS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBactivate\fR \fBcenter\fR \fBdeactivate\fR
+.fi
+.LP
+See the "shell" manual entry for details on the above inherited methods.
+.SH "ASSOCIATED METHODS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBadd\fR \fBbuttonconfigure\fR \fBdefault\fR \fBdelete\fR
+\fBhide\fR \fBindex\fR \fBinsert\fR \fBinvoke\fR
+\fBshow\fR
+.fi
+.LP
+See the "buttonbox" manual entry for details on the associated methods.
+.SH "WIDGET-SPECIFIC METHODS"
+.TP
+\fIpathName \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given
+by \fIoption\fR.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::dialogshell\fR
+command.
+.TP
+\fIpathName \fBchildsite\fR
+Returns the pathname of the child site widget.
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR?
+Query or modify the configuration options of the widget.
+If no \fIoption\fR is specified, returns a list describing all of
+the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for
+information on the format of this list). If \fIoption\fR is specified
+with no \fIvalue\fR, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no \fIoption\fR is specified). If
+one or more \fIoption\-value\fR pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::dialogshell\fR
+command.
+
+.SH "COMPONENTS"
+.LP
+.nf
+Name: \fBdschildsite\fR
+Class: \fBframe\fR
+.fi
+.IP
+The dschildsite component is the user child site for the dialog shell. See
+the "frame" widget manual entry for details on the dschildsite component item.
+.LP
+.nf
+Name: \fBseparator\fR
+Class: \fBframe\fR
+.fi
+.IP
+The separator component devides the area between the user child site and
+the button box. See the "frame" widget manual entry for details on the
+separator component item.
+.LP
+.nf
+Name: \fBbbox\fR
+Class: \fBButtonBox\fR
+.fi
+.IP
+The bbox component is the button box containing the buttons for the dialog
+shell. See the "ButtonBox" widget manual entry for details on the
+bbox component item.
+.fi
+
+.SH EXAMPLE
+.DS
+ package require Iwidgets 4.0
+ iwidgets::dialogshell .ds -modality none
+
+ .ds add OK -text "OK"
+ .ds add Cancel -text "Cancel"
+ .ds default OK
+
+ .ds activate
+.DE
+.SH AUTHOR
+Mark L. Ulferts
+.SH KEYWORDS
+dialogshell, dialog, shell, widget
diff --git a/iwidgets/doc/disjointlistbox.n b/iwidgets/doc/disjointlistbox.n
new file mode 100644
index 00000000000..0ae3980a2a9
--- /dev/null
+++ b/iwidgets/doc/disjointlistbox.n
@@ -0,0 +1,290 @@
+'\"
+'\" Copyright (c) 1995 DSC Technologies Corporation
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) disjointlistbox.n 1.21 94/12/17 16:04:44
+'\"
+.so man.macros
+.HS iwidgets::disjointlistbox iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+iwidgets::disjointlistbox \- Create and manipulate a disjointlistbox widget
+.SH SYNOPSIS
+\fBiwidgets::disjointlistbox\fI \fIpathName \fR?\fIoptions\fR?
+.SH "INHERITANCE"
+itk::Widget <- iwidgets::Disjointlistbox
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fB
+activeBackground selectBorderWidth selectForeground
+activeForeground activeRelief background
+borderWidth buttonPlacement clientData
+cursor foreground highlightColor
+highlightThickness disabledForeground elementBorderWidth\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "ASSOCIATED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBlhsButtonLabel\fR \fBrhsButtonLabel\fR
+.fi
+.LP
+See the "button" widget manual entry for details on the above
+associated options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBlabelFont\fR \fBlhsLabelText\fR \fBrhsLabelText\fR
+.fi
+.LP
+See the "label" widget manual entry for details on the above
+associated options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBjump\fR \fBtroughColor\fR
+.fi
+.LP
+See the "scrollbar" widget class manual entry for details on the above
+associated options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBtextBackground\fR \fBtextFont\fR
+\fBlhsItems\fR \fBrhsItems\fR
+.fi
+.LP
+See the "scrolledlistbox" widget manual entry for details on the above
+associated options.
+.SH "WIDGET-SPECIFIC OPTIONS"
+.LP
+.nf
+Name: \fBbuttonPlacement\fR
+Class: \fBButtonPlacement\fR
+Command-Line Switch: \fB-buttonplacement\fR
+.fi
+.IP
+Specifies the placement of the insertion and removal buttons relative to the
+scrolledlistbox widgets\fBn\fR,
+\fBbottom\fR, or \fBcenter\fR. The default is bottom.
+.LP
+.nf
+Name: \fBlhsLabelText\fR
+Class: \fBLabelText\fR
+Command-Line Switch: \fB-lhslabeltext\fR
+.fi
+.IP
+Specifies the text for the label of the lhs scrolledlistbox.
+The default is "Available".
+.LP
+.nf
+Name: \fBrhsLabelText\fR
+Class: \fBLabelText\fR
+Command-Line Switch: \fB-rhslabeltext\fR
+.fi
+.IP
+Specifies the text for the label of the rhs scrolledlistbox.
+The default is "Available".
+.LP
+.nf
+Name: \fBlhsButtonLabel\fR
+Class: \fBLabelText\fR
+Command-Line Switch: \fB-lhsbuttonlabel\fR
+.fi
+.IP
+Specifies the text for the button of the lhs scrolledlistbox.
+The default is "Insert >>".
+.LP
+.nf
+Name: \fBrhsButtonLabel\fR
+Class: \fBLabelText\fR
+Command-Line Switch: \fB-rhsbuttonlabel\fR
+.fi
+.IP
+Specifies the text for the button of the rhs scrolledlistbox.
+The default is "<< Remove".
+.LP
+.nf
+Name: \fBlhsSortOption\fR
+Class: \fBLhsSortOption\fR
+Command-Line Switch: \fB-lhssortoption\fR
+.fi
+.IP
+Specifies the sort function to be applied to the lhs scrolledlistbox
+after items are inserted. Accepts the same sort options as the scrolledlistbox
+sort method (Tcl's lsort command). If "none" is specified, the inserted
+items are appended to the end of the list, and no sorting is performed.
+The default is "increasing".
+.LP
+.nf
+Name: \fBrhsSortOption\fR
+Class: \fBRhsSortOption\fR
+Command-Line Switch: \fB-rhssortoption\fR
+.fi
+.IP
+Specifies the sort function to be applied to the rhs scrolledlistbox
+after items are inserted. Accepts the same sort options as the scrolledlistbox
+sort method (Tcl's lsort command). If "none" is specified, the inserted
+items are appended to the end of the list, and no sorting is performed.
+The default is "increasing".
+.LP
+.BE
+.SH DESCRIPTION
+.PP
+The \fBiwidgets::disjointlistbox\fR command creates a disjoint pair of listboxs
+similar to the OSF/Motif "Book" printing dialog of the "FrameMaker"
+program. It is implementation constists of a two Scrolledlistboxs,
+2 buttons, and 2 labels.
+
+The disjoint behavior of this widget exists between the interaction of
+the two Scrolledlistboxes with one another. That is, a given instance
+of a Disjointlistbox will never exist, without the aid of a hack magician,
+which has Scrolledlistbox widgets with items in common. That means the
+relationship between the two is maintained similar to that of disjoint sets.
+
+Users may transfer items between the two Listbox widgets using the
+the two buttons.
+
+Options exists which include the ability to configure the "items" displayed by
+the 2 Scrolledlistboxes and to control the placement of the insertion and
+removal buttons.
+.SH "METHODS"
+.PP
+The \fBiwidgets::disjointlistbox\fR command creates a new Tcl command whose
+name is \fIpathName\fR. This command may be used to invoke various
+operations on the widget. It has the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIOption\fR and the \fIarg\fRs
+determine the exact behavior of the command. The following
+commands are possible for disjointlistbox widgets:
+
+.SH "WIDGET-SPECIFIC METHODS"
+.TP
+\fIpathName \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given
+by \fIoption\fR.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::disjointlistbox\fR
+command.
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR?
+Query or modify the configuration options of the widget.
+If no \fIoption\fR is specified, returns a list describing all of
+the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for
+information on the format of this list). If \fIoption\fR is specified
+with no \fIvalue\fR, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no \fIoption\fR is specified). If
+one or more \fIoption\-value\fR pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::disjointlistbox\fR
+command.
+.TP
+\fIpathName \fBsetlhs\fR
+Set the current contents of the left-most Scrolledlistbox with the input list
+of items. Removes all (if any) items from the right-most Scrolledlistbox
+which exist in the input list option to maintain the disjoint property
+between the two
+.TP
+\fIpathName \fBsetrhs\fR
+Set the current contents of the right-most Scrolledlistbox with the input list
+of items. Removes all (if any) items from the left-most Scrolledlistbox
+which exist in the input list option to maintain the disjoint property
+between the two
+.TP
+\fIpathName \fBgetlhs\fR
+Returns the current contents of the left-most Scrolledlistbox
+.TP
+\fIpathName \fBgetrhs\fR
+Returns the current contents of the right-most Scrolledlistbox
+.TP
+\fIpathName \fBinsertlhs\fR
+Add the input list of items to the current contents of the left-most
+Scrolledlistbox. Removes all (if any) items from the right-most Scrolledlistbox
+which exist in the input list option to maintain the disjoint property
+between the two
+.TP
+\fIpathName \fBinsertrhs\fR
+Add the input list of items to the current contents of the right-most
+Scrolledlistbox. Removes all (if any) items from the left-most Scrolledlistbox
+which exist in the input list option to maintain the disjoint property
+between the two.
+.TP
+.SH "COMPONENTS"
+.LP
+.nf
+Name: \fBlhs\fR
+Class: \fBScrolledlistbox\fR
+.fi
+.IP
+The lhs component is the scrolledlistbox for the rhs button.
+See the "scrolledlistbox" widget manual entry for details on the lhs
+component item.
+.LP
+.nf
+Name: \fBrhs\fR
+Class: \fBScrolledlistbox\fR
+.fi
+.IP
+The rhs component is the scrolledlistbox for the rhs button.
+See the "scrolledlistbox" widget manual entry for details on the rhs
+component item.
+.LP
+.nf
+Name: \fBlhsbutton\fR
+Class: \fButton\fR
+.fi
+.IP
+The lhsbutton component is the button for users to remove selected items
+from the lhs Scrolledlistbox.
+See the "button" widget manual entry for details on the lhs button component.
+.LP
+.nf
+Name: \fBrhsbutton\fR
+Class: \fBButton\fR
+.fi
+.IP
+The rhsbutton component is the button for users to remove selected items
+from the rhs Scrolledlistbox.
+See the "button" widget manual entry for details on the rhs button component.
+.LP
+.nf
+Name: \fBlhsCount\fR
+Class: \fBLabel\fR
+.fi
+.IP
+The lhsCount component is the label for displaying a count of the current items in
+the Scrolledlistbox.
+See the "Label" widget manual entry for details on the lhsCount label component.
+.LP
+.nf
+Name: \fBrhsCount\fR
+Class: \fBLabel\fR
+.fi
+.IP
+The rhsCount component is the label for displaying a count of the current items in
+the Scrolledlistbox.
+See the "Label" widget manual entry for details on the rhsCount label component.
+.fi
+.IP
+.SH EXAMPLE
+.DS
+package require Iwidgets 4.0
+iwidgets::disjointlistbox .dlb
+pack .dlb -padx 10 -pady 10 -fill both -expand yes
+.DE
+.SH AUTHOR(S)
+John A. Tucker
+.DE
+Anthony Parent
+.SH KEYWORDS
+disjointlistbox, widget
diff --git a/iwidgets/doc/entryfield.n b/iwidgets/doc/entryfield.n
new file mode 100644
index 00000000000..159bc4d6e48
--- /dev/null
+++ b/iwidgets/doc/entryfield.n
@@ -0,0 +1,282 @@
+'\"
+'\" Copyright (c) 1995 DSC Technologies Corporation
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) entryfield.n 1.21 94/12/17 16:04:44
+'\"
+.so man.macros
+.HS iwidgets::entryfield iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+iwidgets::entryfield \- Create and manipulate a entry field widget
+.SH SYNOPSIS
+\fBiwidgets::entryfield\fI \fIpathName \fR?\fIoptions\fR?
+.SH "INHERITANCE"
+itk::Widget <- iwidgets::LabeledWidget <- iwidgets::Entryfield
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fB
+background borderWidth cursor exportSelection
+foreground highlightColor highlightThickness insertBackground
+insertBorderWidth insertOffTime insertOnTime insertWidth
+justify relief selectBackground selectBorderWidth
+selectForeground textVariable width\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "ASSOCIATED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBshow\fR \fBstate\fR
+.fi
+.LP
+See the "entry" manual entry for details on the associated options.
+.SH "INHERITED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBdisabledForeground\fR \fBlabelBitmap\fR \fBlabelFont\fR \fBlabelImage\fR
+\fBlabelMargin\fR \fBlabelPos\fR \fBlabelText\fR \fBlabelVariable\fR
+\fBstate\fR \fBsticky\fR
+.fi
+.LP
+See the "labeledwidget" class manual entry for details on the
+inherited options.
+.SH "WIDGET-SPECIFIC OPTIONS"
+.LP
+.nf
+Name: \fBchildSitePos\fR
+Class: \fBPosition\fR
+Command-Line Switch: \fB-childsitepos\fR
+.fi
+.IP
+Specifies the position of the child site in the entry field: \fBn\fR,
+\fBs\fR, \fBe\fR, or \fBw\fR. The default is e.
+.LP
+.nf
+Name: \fBcommand\fR
+Class: \fBCommand\fR
+Command-Line Switch: \fB-command\fR
+.fi
+.IP
+Specifies a Tcl command to be executed upon detection of a Return key
+press event.
+.LP
+.nf
+Name: \fBfixed\fR
+Class: \fBFixed\fR
+Command-Line Switch: \fB-fixed\fR
+.fi
+.IP
+Restrict entry to the specified number of chars. A value of 0, which is the
+default, denotes no limit. The value is the maximum number of chars the
+user may type into the field, regardles of field width. For example,
+if the field width is set to 20 and the fixed value is 10, the user will
+only be able to type 10 characters into the field which is 20 characters long.
+.LP
+.nf
+Name: \fBfocusCommand\fR
+Class: \fBCommand\fR
+Command-Line Switch: \fB-focuscommand\fR
+.fi
+.IP
+Specifies a Tcl command to be executed upon reception of focus.
+.LP
+.nf
+Name: \fBinvalid\fR
+Class: \fBCommand\fR
+Command-Line Switch: \fB-invalid\fR
+.fi
+.IP
+Specifies a Tcl command to be executed upon determination of invalid input.
+The default is bell.
+.LP
+.nf
+Name: \fBtextBackground\fR
+Class: \fBBackground\fR
+Command-Line Switch: \fB-textbackground\fR
+.fi
+.IP
+Background color for inside textual portion of the entry field. The value
+may be given in any of the forms acceptable to \fBTk_GetColor\fR.
+.LP
+.nf
+Name: \fBtextFont\fR
+Class: \fBFont\fR
+Command-Line Switch: \fB-textfont\fR
+.fi
+.IP
+Name of font to use for display of text in entryfield. The value
+may be given in any of the forms acceptable to \fBTk_GetFont\fR.
+.LP
+.nf
+Name: \fBpasting\fR
+Class: \fBBehavior\fR
+Command-Line Switch: \fB-pasting\fR
+.fi
+.IP
+Option to enable/disable pasting into the entry component of the
+entryfield. Valid values are 0 (disabled) or 1 (enabled).
+Defaults to 1.
+.LP
+.nf
+Name: \fBvalidate\fR
+Class: \fBCommand\fR
+Command-Line Switch: \fB-validate\fR
+.fi
+.IP
+The validate option allows specification of a validation mechanism. Standard
+character validation such as \fBnumeric\fR, \fBalphabetic\fR, \fBinteger\fR,
+\fBhexidecimal\fR, \fBreal\fR, and \fBalphanumeric\fR can be handled through
+the use of keywords. Should more
+extensive validation be necessary, the value may contain the name of
+a command script. The script should return a boolean value. True for
+valid, false for invalid. If false is returned, then the procedure
+associated with the invalid option will be invoked.
+If the validation script contains
+any \fB%\fR characters, then the script will not be
+executed directly. Instead, a new script will be
+generated by replacing each \fB%\fR, and the character following
+it, with information from the entryfield. The replacement
+depends on the character following the \fB%\fR, as defined in the
+list below.
+.TP
+\fB%c\fR
+Replaced with the current input character.
+.TP
+\fB%P\fR
+Replaced with the contents of the entryfield modified to include the latest
+keystoke. This is equivalent to peeking at the future contents, enabling
+rejection prior to the update.
+.TP
+\fB%S\fR
+Replaced with the current contents of the entryfield prior to the latest
+keystroke being added.
+.TP
+\fB%W\fR
+Replaced with the entryfield widget pathname.
+.LP
+.BE
+
+.SH DESCRIPTION
+.PP
+The \fBiwidgets::entryfield\fR command creates an enhanced text entry widget with an
+optional associated label. Addtional options support validation and
+establishing a upper limit on the number of characters which may be
+entered in the field.
+.DE
+
+.SH "METHODS"
+.PP
+The \fBiwidgets::entryfield\fR command creates a new Tcl command whose
+name is \fIpathName\fR. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIOption\fR and the \fIarg\fRs
+determine the exact behavior of the command. The following
+commands are possible for entryfield widgets:
+.SH "ASSOCIATED METHODS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBdelete\fR \fBget\fR \fBicursor\fR \fBindex\fR
+\fBinsert\fR \fBscan\fR \fBselection\fR \fBxview\fR
+.fi
+.LP
+See the "entry" manual entry for details on the associated methods.
+.SH "WIDGET-SPECIFIC METHODS"
+.TP
+\fIpathName \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given
+by \fIoption\fR.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::entryfield\fR
+command.
+.TP
+\fIpathName \fBchildsite\fR
+Returns the path name of the child site.
+.TP
+\fIpathName \fBclear\fR
+Clear entry widget
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR?
+Query or modify the configuration options of the widget.
+If no \fIoption\fR is specified, returns a list describing all of
+the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for
+information on the format of this list). If \fIoption\fR is specified
+with no \fIvalue\fR, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no \fIoption\fR is specified). If
+one or more \fIoption\-value\fR pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::entryfield\fR
+command.
+
+.SH "COMPONENTS"
+.LP
+.nf
+Name: \fBefchildsite\fR
+Class: \fBframe\fR
+.fi
+.IP
+The efchildsite component is the user child site for the entry field. See
+the "frame" widget manual entry for details on the efchildsite component item.
+.LP
+.nf
+Name: \fBentry\fR
+Class: \fBentry\fR
+.fi
+.IP
+The entry component provides the entry field for user text input and display.
+See the "entry" widget manual entry for details on the entry component item.
+.fi
+
+.SH EXAMPLE
+.DS
+ package require Iwidgets 4.0
+ option add *textBackground white
+
+ proc returnCmd {} {
+ puts stdout "Return Pressed"
+ }
+
+ proc invalidCmd {} {
+ puts stdout "Alphabetic contents invalid"
+ }
+
+ iwidgets::entryfield .ef -command returnCmd
+
+ iwidgets::entryfield .fef -labeltext "Fixed:" -fixed 10 -width 12
+
+ iwidgets::entryfield .nef -labeltext "Numeric:" -validate numeric -width 12
+
+ iwidgets::entryfield .aef -labeltext "Alphabetic:" \\
+ -validate alphabetic -width 12 -invalid invalidCmd
+
+ iwidgets::entryfield .pef -labeltext "Password:" \\
+ -show \267 -width 12 -command returnCmd
+
+ iwidgets::Labeledwidget::alignlabels .ef .fef .nef .aef .pef
+
+ pack .ef -fill x -expand yes -padx 10 -pady 5
+ pack .fef -fill x -expand yes -padx 10 -pady 5
+ pack .nef -fill x -expand yes -padx 10 -pady 5
+ pack .aef -fill x -expand yes -padx 10 -pady 5
+ pack .pef -fill x -expand yes -padx 10 -pady 5
+.DE
+.SH AUTHOR
+Sue Yockey
+.DE
+Mark L. Ulferts
+.LP
+.SH KEYWORDS
+entryfield, widget
diff --git a/iwidgets/doc/extbutton.n b/iwidgets/doc/extbutton.n
new file mode 100644
index 00000000000..89ec19ef20f
--- /dev/null
+++ b/iwidgets/doc/extbutton.n
@@ -0,0 +1,149 @@
+'\"
+'\" Copyright (c) 1995 DSC Technologies Corporation
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) extbutton.n 1.21 01/04/23 16:04:44
+'\"
+.so man.macros
+.HS iwidgets::extbutton iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+iwidgets::extbutton \- Extends the behavior of the Tk button by allowing
+a bitmap or image to coexist with text.
+.SH SYNOPSIS
+\fBiwidgets::extbutton\fI \fIpathName \fR?\fIoptions\fR?
+.SH "INHERITANCE"
+itk::Widget <- iwidgets::Extbutton
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fB
+activebackground activeforeground bitmap
+background bd cursor
+disabledforeground font foreground
+image justify relief text\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "WIDGET-SPECIFIC OPTIONS"
+.ta 4c 8c 12c
+.LP
+.nf
+Name: \fBbitmapforeground\fR
+Class: \fBForeground\fR
+Command-Line Switch: \fB-bitmapforeground\fR
+.fi
+.IP
+Configures the foreground color of the bitmap.
+.LP
+.nf
+Name: \fBcommand\fR
+Class: \fBCommand\fR
+Command-Line Switch: \fB-command\fR
+.fi
+.IP
+Associate a command with the extbutton. Simulates a Tk button's
+-command option. Invoked by either <1> events or by explicitly
+calling the public invoke() method.
+.LP
+.nf
+Name: \fBdefaultring\fR
+Class: \fBDefaultRing\fR
+Command-Line Switch: \fB-defaultring\fR
+.fi
+.IP
+Boolean describing whether the extbutton displays its default ring given in
+any of the forms acceptable to \fBTcl_GetBoolean\fR. The default is false.
+.LP
+.nf
+Name: \fBdefaultringpad\fR
+Class: \fBPad\fR
+Command-Line Switch: \fB-defaultringpad\fR
+.fi
+.IP
+Specifies the amount of space to be allocated to the indentation of the
+default ring ring given in any of the forms acceptable to \fBTcl_GetPixels\fR.
+The option has no effect if the defaultring option is set to false. The
+default is 4 pixels.
+.LP
+.nf
+Name: \fBimagePos\fR
+Class: \fBPosition\fR
+Command-Line Switch: \fB-imagepos\fR
+.fi
+.IP
+Specifies the image position relative to the message text: \fBn\fR, \fBne\fR,
+\fBnw\fR, \fBs\fR, \fBse\fR, \fBsw\fR, \fBw\fR, \fBwn\fR, \fBws\fR, \fBe\fR,
+\fBen\fR, or \fBes\fR. The default is w.
+.LP
+.nf
+Name: \fBringBackground\fR
+Class: \fBBackground\fR
+Command-Line Switch: \fB-ringbackground\fR
+.fi
+.IP
+Configures the background color of the default ring frame (if -defaultring
+is set to boolean true).
+.LP
+.BE
+
+.SH DESCRIPTION
+.PP
+The \fBextbutton\fR extends the behavior of the atomic Tk button by
+allowing text and an image or bitmap to coexist. The user may use
+the -image or -bitmap options to specify an image as well as the
+-imagepos option to specify image position relative to the text.
+Note that the extbutton is not intended to be used without an
+image/bitmap. There will be an emtpy space next to the text if
+no image/bitmap is specified.
+
+.SH "METHODS"
+.PP
+The \fBiwidgets::extbutton\fR command creates a new Tcl command whose
+name is \fIpathName\fR. This command may be used to invoke various
+operations on the widget. It has the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+
+.SH "INHERITED METHODS"
+Each of the following methods are inherited from itk::Archetype. See that
+man page for details.
+.DS C
+\fIpathName \fBcget\fR
+\fIpathName \fBcomponent\fR
+\fIpathName \fBconfig\fR
+\fIpathName \fBconfigure\fR
+.DE
+
+.SH "WIDGET-SPECIFIC METHODS"
+.TP
+\fIpathName \fBinvoke\fR
+Evaluates the command fragment associated with the -command option.
+.TP
+\fIpathName \fBflash\fR
+Simulates the Tk button's flash command.
+.DE
+
+.SH EXAMPLES
+.DS
+package require Iwidgets 4.0
+iwidgets::extbutton .eb -text "Bitmap example" -bitmap info \\
+ -background bisque -activeforeground red -bitmapforeground blue \\
+ -defaultring 1 -command {puts "Bisque is beautiful"}
+pack .eb -expand 1
+
+iwidgets::extbutton .eb -text "Image example" -relief ridge -image \\
+ [image create photo -file $itk::library/../iwidgets/demos/images/clear.gif] \\
+ -font 9x15bold -background lightgreen -imagepos e \\
+ -activebackground lightyellow
+pack .eb -expand 1
+.DE
+.SH AUTHOR
+Chad Smith
+.SH KEYWORDS
+button, pushbutton
diff --git a/iwidgets/doc/extfileselectionbox.n b/iwidgets/doc/extfileselectionbox.n
new file mode 100644
index 00000000000..970eaa90e15
--- /dev/null
+++ b/iwidgets/doc/extfileselectionbox.n
@@ -0,0 +1,395 @@
+'\"
+'\" Copyright (c) 1995 DSC Technologies Corporation
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) extfileselectionbox.n 1.21 94/12/17 16:04:44
+'\"
+.so man.macros
+.HS iwidgets::extfileselectionbox iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+iwidgets::extfileselectionbox \- Create and manipulate a file selection box widget
+.SH SYNOPSIS
+\fBiwidgets::extfileselectionbox\fI \fIpathName \fR?\fIoptions\fR?
+.SH "INHERITANCE"
+itk::Widget <- iwidgets::Extfileselectionbox
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fB
+activeBackground background borderWidth cursor
+foreground highlightColor highlightThickness insertBackground
+insertBorderWidth insertOffTime insertOnTime insertWidth
+selectBackground selectBorderWidth selectForeground\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "ASSOCIATED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBpopupCursor\fR \fBtextBackground\fR \fBtextFont\fR
+.fi
+.LP
+See the "combobox" widget manual entry for details on the above
+associated options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBlabelFont\fR
+.fi
+.LP
+See the "labeledwidget" widget manual entry for details on the above
+associated options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBsashCursor\fR
+.fi
+.LP
+See the "panedwindow" widget manual entry for details on the above
+associated options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBactiveRelief\fR \fBelementBorderWidth\fR \fBjump\fR \fBtroughColor\fR
+.fi
+.LP
+See the "scrollbar" widget class manual entry for details on the above
+associated options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBtextBackground\fR \fBtextFont\fR
+.fi
+.LP
+See the "scrolledlistbox" widget manual entry for details on the above
+associated options.
+.SH "WIDGET-SPECIFIC OPTIONS"
+.LP
+.nf
+Name: \fBautomount\fR
+Class: \fBAutomount\fR
+Command-Line Switch: \fB-automount\fR
+.fi
+.IP
+Specifies a list of directory prefixes to ignore. Typically, this
+option would be used as follows:
+ -automount {export tmp_mnt}
+.LP
+.nf
+Name: \fBchildSitePos\fR
+Class: \fBPosition\fR
+Command-Line Switch: \fB-childsitepos\fR
+.fi
+.IP
+Specifies the position of the child site in the extended fileselection
+box: \fBn\fR, \fBs\fR, \fBe\fR, \fBw\fR, \fBtop\fR, or \fBbottom\fR.
+The default is s.
+.LP
+.nf
+Name: \fBdirectory\fR
+Class: \fBDirectory\fR
+Command-Line Switch: \fB-directory\fR
+.fi
+.IP
+Specifies the initial default directory. The default is the present
+working directory.
+.LP
+.nf
+Name: \fBdirSearchCommand\fR
+Class: \fBCommand\fR
+Command-Line Switch: \fB-dirsearchcommand\fR
+.fi
+.IP
+Specifies a Tcl command to be executed to perform a directory search.
+The command will receive the current working directory and filter
+mask as arguments. The command should return a list of files which
+will be placed into the directory list.
+.LP
+.nf
+Name: \fBdirsLabel\fR
+Class: \fBText\fR
+Command-Line Switch: \fB-dirslabel\fR
+.fi
+.IP
+Specifies the text of the label for the directory list. The default is
+"Directories".
+.LP
+.nf
+Name: \fBdirsOn\fR
+Class: \fBDirsOn\fR
+Command-Line Switch: \fB-dirson\fR
+.fi
+.IP
+Specifies whether or not to display the directory list. The
+value may be given in any of the forms acceptable to \fBTcl_GetBoolean\fR.
+The default is true.
+.LP
+.nf
+Name: \fBfileSearchCommand\fR
+Class: \fBCommand\fR
+Command-Line Switch: \fB-filesearchcommand\fR
+.fi
+.IP
+Specifies a Tcl command to be executed to perform a file search.
+The command will receive the current working directory and filter
+mask as arguments. The command should return a list of files which
+will be placed into the file list.
+.LP
+.nf
+Name: \fBfilesLabel\fR
+Class: \fBText\fR
+Command-Line Switch: \fB-fileslabel\fR
+.fi
+.IP
+Specifies the text of the label for the files list. The default is "Files".
+.LP
+.nf
+Name: \fBfilesOn\fR
+Class: \fBFilesOn\fR
+Command-Line Switch: \fB-fileson\fR
+.fi
+.IP
+Specifies whether or not to display the files list. The
+value may be given in any of the forms acceptable to \fBTcl_GetBoolean\fR.
+The default is true.
+.LP
+.nf
+Name: \fBfileType\fR
+Class: \fBFileType\fR
+Command-Line Switch: \fB-filetype\fR
+.fi
+.IP
+Specify the type of files which may appear in the file list: \fBregular\fR,
+\fBdirectory\fR, or \fBany\fR. The default is regular.
+.LP
+.nf
+Name: \fBfilterCommand\fR
+Class: \fBCommand\fR
+Command-Line Switch: \fB-filtercommand\fR
+.fi
+.IP
+Specifies a Tcl command to be executed upon hitting the Return key
+in the filter combobox widget.
+.LP
+.nf
+Name: \fBfilterLabel\fR
+Class: \fBText\fR
+Command-Line Switch: \fB-filterlabel\fR
+.fi
+.IP
+Specifies the text of the label for the filter combobox. The default is
+"Filter".
+.LP
+.nf
+Name: \fBfilterOn\fR
+Class: \fBFilterOn\fR
+Command-Line Switch: \fB-filteron\fR
+.fi
+.IP
+Specifies whether or not to display the filter combobox. The
+value may be given in any of the forms acceptable to \fBTcl_GetBoolean\fR.
+The default is true.
+.LP
+.nf
+Name: \fBheight\fR
+Class: \fBHeight\fR
+Command-Line Switch: \fB-height\fR
+.fi
+.IP
+Specifies the height of the selection box. The value may be specified in
+any of the forms acceptable to Tk_GetPixels. The default is 300 pixels.
+.LP
+.nf
+Name: \fBinvalid\fR
+Class: \fBCommand\fR
+Command-Line Switch: \fB-invalid\fR
+.fi
+.IP
+Command to be executed should the filter contents be proven
+invalid. The default is {bell}.
+.LP
+.nf
+Name: \fBmask\fR
+Class: \fBMask\fR
+Command-Line Switch: \fB-mask\fR
+.fi
+.IP
+Specifies the initial file mask string. The default is "*".
+.LP
+.nf
+Name: \fBnoMatchString\fR
+Class: \fBNoMatchString\fR
+Command-Line Switch: \fB-nomatchstring\fR
+.fi
+.IP
+Specifies the string to be displayed in the files list should no files
+match the mask. The default is "".
+.LP
+.nf
+Name: \fBselectDirCommand\fR
+Class: \fBCommand\fR
+Command-Line Switch: \fB-selectdirommand\fR
+.fi
+.IP
+Specifies a Tcl command to be executed following selection of a
+directory in the directory list.
+.LP
+.nf
+Name: \fBselectFileCommand\fR
+Class: \fBCommand\fR
+Command-Line Switch: \fB-selectfileommand\fR
+.fi
+.IP
+Specifies a Tcl command to be executed following selection of a
+file in the files list.
+.LP
+.nf
+Name: \fBselectionCommand\fR
+Class: \fBCommand\fR
+Command-Line Switch: \fB-selectioncommand\fR
+.fi
+.IP
+Specifies a Tcl command to be executed upon hitting the Return key
+in the selection combobox widget.
+.LP
+.nf
+Name: \fBselectionLabel\fR
+Class: \fBText\fR
+Command-Line Switch: \fB-selectionlabel\fR
+.fi
+.IP
+Specifies the text of the label for the selection combobox. The default
+is "Selection".
+.LP
+.nf
+Name: \fBselectionOn\fR
+Class: \fBSelectionOn\fR
+Command-Line Switch: \fB-selectionon\fR
+.fi
+.IP
+Specifies whether or not to display the selection combobox. The
+value may be given in any of the forms acceptable to \fBTcl_GetBoolean\fR.
+The default is true.
+.LP
+.nf
+Name: \fBwidth\fR
+Class: \fBWidth\fR
+Command-Line Switch: \fB-width\fR
+.fi
+.IP
+Specifies the width of the selection box. The value may be specified in
+any of the forms acceptable to Tk_GetPixels. The default is 350 pixels.
+.LP
+.BE
+
+.SH DESCRIPTION
+.PP
+The \fBiwidgets::extfileselectionbox\fR command creates an extended file
+selection box which is slightly different than the fileselectionbox widget.
+The differences are mostly cosmetic in that the listboxes are
+within a panedwindow and the entryfields for the filter and selection
+have been replaced by comboboxes. Other than that the interface is
+practically the same.
+
+.SH "METHODS"
+.PP
+The \fBiwidgets::extfileselectionbox\fR command creates a new Tcl command whose
+name is \fIpathName\fR. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIOption\fR and the \fIarg\fRs
+determine the exact behavior of the command. The following
+commands are possible for extfileselectionbox widgets:
+
+.SH "WIDGET-SPECIFIC METHODS"
+.TP
+\fIpathName \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given
+by \fIoption\fR.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::extfileselectionbox\fR
+command.
+.TP
+\fIpathName \fBchildsite\fR
+Returns the child site widget path name.
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR?
+Query or modify the configuration options of the widget.
+If no \fIoption\fR is specified, returns a list describing all of
+the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for
+information on the format of this list). If \fIoption\fR is specified
+with no \fIvalue\fR, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no \fIoption\fR is specified). If
+one or more \fIoption\-value\fR pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::extfileselectionbox\fR
+command.
+.TP
+\fIpathName \fBfilter\fR
+Update the current contents of the extended file selection box based
+on the current filter combobox value.
+.TP
+\fIpathName \fBget\fR
+Returns the current value of the selection combobox widget.
+
+.SH "COMPONENTS"
+.LP
+.nf
+Name: \fBdirs\fR
+Class: \fBScrolledlistbox\fR
+.fi
+.IP
+The dirs component is the directory list box for the extended fileselection
+box. See the "scrolledlistbox" widget manual entry for details on the dirs
+component item.
+.LP
+.nf
+Name: \fBfiles\fR
+Class: \fBScrolledlistbox\fR
+.fi
+.IP
+The files component is the file list box for the extended fileselection box.
+See the "scrolledlistbox" widget manual entry for details on the files
+component item.
+.LP
+.nf
+Name: \fBfilter\fR
+Class: \fBCombobox\fR
+.fi
+.IP
+The filter component is the field for user input of the filter value.
+See the "combobox" widget manual entry for details on the filter
+component item.
+.LP
+.nf
+Name: \fBselection\fR
+Class: \fBCombobox\fR
+.fi
+.IP
+The selection component is the field for user input of the currently
+selected file value. See the "combobox" widget manual entry for details
+on the selection component item.
+.fi
+
+.SH EXAMPLE
+.DS
+package require Iwidgets 4.0
+iwidgets::extfileselectionbox .fsb
+pack .fsb -padx 10 -pady 10 -fill both -expand yes
+.DE
+.SH AUTHOR(S)
+Mark L. Ulferts
+.DE
+Anthony Parent
+.SH KEYWORDS
+extfileselectionbox, widget
diff --git a/iwidgets/doc/extfileselectiondialog.n b/iwidgets/doc/extfileselectiondialog.n
new file mode 100644
index 00000000000..eee4611d30c
--- /dev/null
+++ b/iwidgets/doc/extfileselectiondialog.n
@@ -0,0 +1,239 @@
+'\"
+'\" Copyright (c) 1997 DSC Technologies Corporation
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) extfileselectiondialog.n 1.21 94/12/17 16:04:44
+'\"
+.so man.macros
+.HS iwidgets::extfileselectiondialog iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+iwidgets::extfileselectiondialog \- Create and manipulate a file selection dialog widget
+.SH SYNOPSIS
+\fBiwidgets::extfileselectiondialog\fI \fIpathName \fR?\fIoptions\fR?
+.SH "INHERITANCE"
+itk::Toplevel <- iwidgets::Shell <- iwidgets::Dialogshell <- iwidgets::Dialog <- iwidgets::Extfileselectiondialog
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fB
+activeBackground background borderWidth cursor
+foreground highlightColor highlightThickness insertBackground
+insertBorderWidth insertOffTime insertOnTime insertWidth
+selectBackground selectBorderWidth selectForeground\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "ASSOCIATED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBpopupCursor\fR \fBtextBackground\fR \fBtextFont\fR
+.fi
+.LP
+See the "combobox" widget manual entry for details on the above
+associated options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBchildSitePos\fR \fBdirectory\fR \fBdirsLabel\fR \fBdirSearchCommand\fR
+\fBdirsOn\fR \fBfilesLabel\fR \fBfilesLabelOn\fR \fBfileSearchCommand\fR
+\fBfilesOn\fR \fBfileType\fR \fBfilterLabel\fR \fBfilterOn\fR
+\fBinvalid\fR \fBmask\fR \fBnoMatchString\fR \fBselectionLabel\fR
+\fBselectionOn\fR
+.fi
+.LP
+See the "extfileselectionbox" widget manual entry for details on the above
+associated options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBlabelFont\fR
+.fi
+.LP
+See the "labeledwidget" widget manual entry for details on the above
+associated options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBsashCursor\fR
+.fi
+.LP
+See the "panedwindow" widget manual entry for details on the above
+associated options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBlabelFont\fR
+.fi
+.LP
+See the "labeledwidget" widget manual entry for details on the above
+associated options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBactiveRelief\fR \fBelementBorderWidth\fR \fBjump\fR \fBtroughColor\fR
+.fi
+.LP
+See the "scrollbar" widget class manual entry for details on the above
+associated options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBtextBackground\fR \fBtextFont\fR
+.fi
+.LP
+See the "scrolledlistbox" widget manual entry for details on the above
+associated options.
+
+.SH "INHERITED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBbuttonBoxPadX\fR \fBbuttonBoxPadY\fR \fBbuttonBoxPos\fR \fBpadX\fR
+\fBpadY\fR \fBseparator\fR \fBthickness\fR
+.fi
+.LP
+See the "dialogshell" widget manual entry for details on the above
+inherited options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBheight\fR \fBmaster\fR \fBmodality\fR \fBwidth\fR
+.fi
+.LP
+See the "shell" widget manual entry for details on the above
+inherited options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBtitle\fR
+.fi
+.LP
+See the "Toplevel" widget manual entry for details on the above
+inherited options.
+.BE
+
+.SH DESCRIPTION
+.PP
+The \fBiwidgets::extfileselectiondialog\fR command creates an extended file
+selection dialog which is slightly different than the
+fileselectiondialog widget.
+The differences are mostly cosmetic in that the listboxes are
+within a panedwindow and the entryfields for the filter and selection
+have been replaced by comboboxes. Other than that the interface is
+practically the same.
+
+.SH "METHODS"
+.PP
+The \fBiwidgets::extfileselectiondialog\fR command creates a new Tcl command whose
+name is \fIpathName\fR. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIOption\fR and the \fIarg\fRs
+determine the exact behavior of the command. The following
+commands are possible for extfileselectiondialog widgets:
+.SH "ASSOCIATED METHODS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBget\fR \fBchildsite\fR \fBfilter\fR
+.fi
+.LP
+See the "fileselectionbox" class manual entry for details on the
+associated methods.
+.SH "INHERITED METHODS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBadd\fR \fBbuttonconfigure\fR \fBdefault\fR \fBhide\fR
+\fBinsert\fR \fBinvoke\fR \fBshow\fR
+.fi
+.LP
+See the "buttonbox" widget manual entry for details on the above
+inherited methods.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBactivate\fR \fBcenter\fR \fBdeactivate\fR
+.fi
+.LP
+See the "shell" widget manual entry for details on the above
+inherited methods.
+
+.SH "WIDGET-SPECIFIC METHODS"
+.TP
+\fIpathName \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given
+by \fIoption\fR.
+\fIOption\fR may have any of the values accepted by
+the \fBiwidgets::extfileselectiondialog\fR command.
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR?
+Query or modify the configuration options of the widget.
+If no \fIoption\fR is specified, returns a list describing all of
+the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for
+information on the format of this list). If \fIoption\fR is specified
+with no \fIvalue\fR, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no \fIoption\fR is specified). If
+one or more \fIoption\-value\fR pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+\fIOption\fR may have any of the values accepted by
+the \fBiwidgets::extfileselectiondialog\fR
+command.
+
+.SH "COMPONENTS"
+.LP
+.nf
+Name: \fBfsb\fR
+Class: \fBFileselectionbox\fR
+.fi
+.IP
+The fsb component is the extfileselectionbox for the extfileselectiondialog.
+See the "extfileselectionbox" widget manual entry for details on the fsb
+component item.
+.fi
+
+.SH EXAMPLE
+.DS
+ package require Iwidgets 4.0
+ #
+ # Non-modal example
+ #
+ proc okCallback {} {
+ puts "You selected [.nmfsd get]"
+ .nmfsd deactivate
+ }
+
+ iwidgets::extfileselectiondialog .nmfsd -title Non-Modal
+ .nmfsd buttonconfigure OK -command okCallback
+
+ .nmfsd activate
+
+ #
+ # Modal example
+ #
+ iwidgets::extfileselectiondialog .mfsd -modality application
+ .mfsd center
+
+ if {[.mfsd activate]} {
+ puts "You selected [.mfsd get]"
+ } else {
+ puts "You cancelled the dialog"
+ }
+.DE
+.SH AUTHOR
+Mark L. Ulferts
+.DE
+Anthony L. Parent
+.SH KEYWORDS
+extfileselectiondialog, extfileselectionbox, dialog, dialogshell, shell, widget
diff --git a/iwidgets/doc/feedback.n b/iwidgets/doc/feedback.n
new file mode 100644
index 00000000000..475f9ae36f6
--- /dev/null
+++ b/iwidgets/doc/feedback.n
@@ -0,0 +1,145 @@
+'\"
+'\" Copyright (c) 1996 DSC Technologies Corporation
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) feedback.n
+'\"
+.so man.macros
+.HS iwidgets::feedback iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+iwidgets::feedback \- Create and manipulate a feedback widget to display feedback on
+the current status of an ongoing operation to the user.
+.SH SYNOPSIS
+\fBiwidgets::feedback\fI \fIpathName \fR?\fIoptions\fR?
+.SH "INHERITANCE"
+itk::Widget <- iwidgets::Labeledwidget <- iwidgets::Feedback
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBbackground\fR \fBcursor\fR \fBforeground\fR \fBhighlightColor\fR
+\fBhighlightThickness\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "INHERITED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBlabelBitmap\fR \fBlabelFont\fR \fBlabelImage\fR \fBlabelMargin\fR
+\fBlabelPos\fR \fBlabelText\fR \fBlabelVariable\fR \fBsticky\fR
+.fi
+.LP
+See the "labeledwidget" class manual entry for details on the inherited options.
+.SH "WIDGET-SPECIFIC OPTIONS"
+.LP
+.nf
+Name: \fBbarcolor\fR
+Class: \fBBarColor\fR
+Command-Line Switch: \fB-barcolor\fR
+.fi
+.IP
+Specifies the color of the status bar, in any of the forms
+acceptable to \fBTk_GetColor\fR. The default is DodgerBlue.
+.LP
+.nf
+Name: \fBbarheight\fR
+Class: \fBBarHeight\fR
+Command-Line Switch: \fB-barheight\fR
+.fi
+.IP
+Specifies the height of the status bar, in any of the forms
+acceptable to \fBTk_GetPixels\fR. The default is 20.
+.LP
+.nf
+Name: \fBtroughColor\fR
+Class: \fBTroughColor\fR
+Command-Line Switch: \fB-troughcolor\fR
+.fi
+.IP
+Specifies the color of the frame in which the status bar sits,
+in any of the forms acceptable to \fBTk_GetColor\fR. The default is white.
+.LP
+.nf
+Name: \fBsteps\fR
+Class: \fBSteps\fR
+Command-Line Switch: \fB-steps\fR
+.fi
+.IP
+Specifies the total number of steps for the status bar. The default is 10.
+.LP
+
+.SH DESCRIPTION
+.PP
+The \fBiwidgets::feedback\fR command creates a widget to display feedback on
+the current status of an ongoing operation to the user. Display is given as
+a percentage and as a thermometer type bar. Options exist for adding a label
+and controlling its position.
+
+.SH "METHODS"
+.PP
+The \fBiwidgets::feedback\fR command creates a new Tcl command whose
+name is \fIpathName\fR. This command may be used to invoke various
+operations on the widget. It has the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIOption\fR and the \fIarg\fRs
+determine the exact behavior of the command. The following
+commands are possible for scrolledtext widgets:
+
+.SH "WIDGET-SPECIFIC METHODS"
+.TP
+\fIpathName \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given
+by \fIoption\fR.
+\fIOption\fR may have any of the values accepted by the \fBscrolledhtml\fR
+command.
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR?
+Query or modify the configuration options of the widget.
+If no \fIoption\fR is specified, returns a list describing all of
+the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for
+information on the format of this list). If \fIoption\fR is specified
+with no \fIvalue\fR, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no \fIoption\fR is specified). If
+one or more \fIoption\-value\fR pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::feedback\fR
+command.
+.TP
+\fIpathName\fR \fBreset\fR
+Reset the current number of steps completed to 0, and configures the
+percentage complete label text to 0%
+.TP
+\fIpathName\fR \fBstep\fR ?\fIinc\fR?
+Increase the current number of steps completed by the amount specified
+by \fIinc\fR. \fIInc\fR defaults to 1.
+
+.SH EXAMPLE
+.DS
+ package require Iwidgets 4.0
+ iwidgets::feedback .fb -labeltext "Status" -steps 20
+ pack .fb -padx 10 -pady 10 -fill both -expand yes
+
+ for {set i 0} {$i < 20} {incr i} {
+ .fb step
+ after 500
+ }
+.DE
+.SH ACKNOWLEDGEMENTS
+Sam Shen
+.IP
+This code is based largely on his feedback.tcl code from tk inspect. The
+original feedback code is copyright 1995 Lawrence Berkeley Laboratory.
+.LP
+.SH AUTHOR
+Kris Raney
+.SH KEYWORDS
+feedback, widget
diff --git a/iwidgets/doc/fileselectionbox.n b/iwidgets/doc/fileselectionbox.n
new file mode 100644
index 00000000000..35fabbcaf36
--- /dev/null
+++ b/iwidgets/doc/fileselectionbox.n
@@ -0,0 +1,391 @@
+'\"
+'\" Copyright (c) 1995 DSC Technologies Corporation
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) fileselectionbox.n 1.21 94/12/17 16:04:44
+'\"
+.so man.macros
+.HS iwidgets::fileselectionbox iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+iwidgets::fileselectionbox \- Create and manipulate a file selection box widget
+.SH SYNOPSIS
+\fBiwidgets::fileselectionbox\fI \fIpathName \fR?\fIoptions\fR?
+.SH "INHERITANCE"
+itk::Widget <- iwidgets::Fileselectionbox
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fB
+activeBackground background borderWidth cursor
+foreground highlightColor highlightThickness insertBackground
+insertBorderWidth insertOffTime insertOnTime insertWidth
+selectBackground selectBorderWidth selectForeground\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "ASSOCIATED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBtextBackground\fR \fBtextFont\fR
+.fi
+.LP
+See the "entryfield" widget manual entry for details on the above
+associated options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBlabelFont\fR
+.fi
+.LP
+See the "labeledwidget" widget manual entry for details on the above
+associated options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBactiveRelief\fR \fBelementBorderWidth\fR \fBjump\fR \fBtroughColor\fR
+.fi
+.LP
+See the "scrollbar" widget class manual entry for details on the above
+associated options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBtextBackground\fR \fBtextFont\fR
+.fi
+.LP
+See the "scrolledlistbox" widget manual entry for details on the above
+associated options.
+.SH "WIDGET-SPECIFIC OPTIONS"
+.LP
+.nf
+Name: \fBautomount\fR
+Class: \fBAutomount\fR
+Command-Line Switch: \fB-automount\fR
+.fi
+.IP
+Specifies a list of directory prefixes to ignore. Typically, this
+option would be used as follows:
+ -automount {export tmp_mnt}
+.LP
+.nf
+Name: \fBchildSitePos\fR
+Class: \fBPosition\fR
+Command-Line Switch: \fB-childsitepos\fR
+.fi
+.IP
+Specifies the position of the child site in the selection box: \fBn\fR,
+\fBs\fR, \fBe\fR, \fBw\fR, \fBtop\fR, \fBbottom\fR, or \fBcenter\fR. The
+default is s.
+.fi
+.IP
+Specifies a Tcl command procedure which is called when an file list item is
+double clicked. Typically this occurs when mouse button 1 is double
+clicked over a file name.
+.LP
+.nf
+Name: \fBdirectory\fR
+Class: \fBDirectory\fR
+Command-Line Switch: \fB-directory\fR
+.fi
+.IP
+Specifies the initial default directory. The default is the present
+working directory.
+.LP
+.nf
+Name: \fBdirSearchCommand\fR
+Class: \fBCommand\fR
+Command-Line Switch: \fB-dirsearchcommand\fR
+.fi
+.IP
+Specifies a Tcl command to be executed to perform a directory search.
+The command will receive the current working directory and filter
+mask as arguments. The command should return a list of files which
+will be placed into the directory list.
+.LP
+.nf
+Name: \fBdirsLabel\fR
+Class: \fBText\fR
+Command-Line Switch: \fB-dirslabel\fR
+.fi
+.IP
+Specifies the text of the label for the directory list. The default is
+"Directories".
+.LP
+.nf
+Name: \fBdirsOn\fR
+Class: \fBDirsOn\fR
+Command-Line Switch: \fB-dirson\fR
+.fi
+.IP
+Specifies whether or not to display the directory list. The
+value may be given in any of the forms acceptable to \fBTcl_GetBoolean\fR.
+The default is true.
+.LP
+.nf
+Name: \fBfileSearchCommand\fR
+Class: \fBCommand\fR
+Command-Line Switch: \fB-filesearchcommand\fR
+.fi
+.IP
+Specifies a Tcl command to be executed to perform a file search.
+The command will receive the current working directory and filter
+mask as arguments. The command should return a list of files which
+will be placed into the file list.
+.LP
+.nf
+Name: \fBfilesLabel\fR
+Class: \fBText\fR
+Command-Line Switch: \fB-fileslabel\fR
+.fi
+.IP
+Specifies the text of the label for the files list. The default is "Files".
+.LP
+.nf
+Name: \fBfilesOn\fR
+Class: \fBFilesOn\fR
+Command-Line Switch: \fB-fileson\fR
+.fi
+.IP
+Specifies whether or not to display the files list. The
+value may be given in any of the forms acceptable to \fBTcl_GetBoolean\fR.
+The default is true.
+.LP
+.nf
+Name: \fBfileType\fR
+Class: \fBFileType\fR
+Command-Line Switch: \fB-filetype\fR
+.fi
+.IP
+Specify the type of files which may appear in the file list: \fBregular\fR,
+\fBdirectory\fR, or \fBany\fR. The default is regular.
+.LP
+.nf
+Name: \fBfilterCommand\fR
+Class: \fBCommand\fR
+Command-Line Switch: \fB-filtercommand\fR
+.fi
+.IP
+Specifies a Tcl command to be executed upon hitting the Return key
+in the filter entry widget.
+.LP
+.nf
+Name: \fBfilterLabel\fR
+Class: \fBText\fR
+Command-Line Switch: \fB-filterlabel\fR
+.fi
+.IP
+Specifies the text of the label for the filter entry field. The default is
+"Filter".
+.LP
+.nf
+Name: \fBfilterOn\fR
+Class: \fBFilterOn\fR
+Command-Line Switch: \fB-filteron\fR
+.fi
+.IP
+Specifies whether or not to display the filter entry. The
+value may be given in any of the forms acceptable to \fBTcl_GetBoolean\fR.
+The default is true.
+.LP
+.nf
+Name: \fBheight\fR
+Class: \fBHeight\fR
+Command-Line Switch: \fB-height\fR
+.fi
+.IP
+Specifies the height of the selection box. The value may be specified in
+any of the forms acceptable to Tk_GetPixels. The default is 360 pixels.
+.LP
+.nf
+Name: \fBinvalid\fR
+Class: \fBCommand\fR
+Command-Line Switch: \fB-invalid\fR
+.fi
+.IP
+Command to be executed should the filter contents be proven
+invalid. The default is {bell}.
+.LP
+.nf
+Name: \fBmask\fR
+Class: \fBMask\fR
+Command-Line Switch: \fB-mask\fR
+.fi
+.IP
+Specifies the initial file mask string. The default is "*".
+.LP
+.nf
+Name: \fBnoMatchString\fR
+Class: \fBNoMatchString\fR
+Command-Line Switch: \fB-nomatchstring\fR
+.fi
+.IP
+Specifies the string to be displayed in the files list should no files
+match the mask. The default is "".
+.LP
+.nf
+Name: \fBselectDirCommand\fR
+Class: \fBCommand\fR
+Command-Line Switch: \fB-selectdirommand\fR
+.fi
+.IP
+Specifies a Tcl command to be executed following selection of a
+directory in the directory list.
+.LP
+.nf
+Name: \fBselectFileCommand\fR
+Class: \fBCommand\fR
+Command-Line Switch: \fB-selectfileommand\fR
+.fi
+.IP
+Specifies a Tcl command to be executed following selection of a
+file in the files list.
+.LP
+.nf
+Name: \fBselectionCommand\fR
+Class: \fBCommand\fR
+Command-Line Switch: \fB-selectioncommand\fR
+.fi
+.IP
+Specifies a Tcl command to be executed upon hitting the Return key
+in the selection entry widget.
+.LP
+.nf
+Name: \fBselectionLabel\fR
+Class: \fBText\fR
+Command-Line Switch: \fB-selectionlabel\fR
+.fi
+.IP
+Specifies the text of the label for the selection entry field. The default
+is "Selection".
+.LP
+.nf
+Name: \fBselectionOn\fR
+Class: \fBSelectionOn\fR
+Command-Line Switch: \fB-selectionon\fR
+.fi
+.IP
+Specifies whether or not to display the selection entry. The
+value may be given in any of the forms acceptable to \fBTcl_GetBoolean\fR.
+The default is true.
+.LP
+.nf
+Name: \fBwidth\fR
+Class: \fBWidth\fR
+Command-Line Switch: \fB-width\fR
+.fi
+.IP
+Specifies the width of the selection box. The value may be specified in
+any of the forms acceptable to Tk_GetPixels. The default is 470 pixels.
+.LP
+.BE
+
+.SH DESCRIPTION
+.PP
+The \fBiwidgets::fileselectionbox\fR command creates a file selection box similar
+to the OSF/Motif standard Xmfileselectionbox composite widget. The
+fileselectionbox is composed of directory and file scrolled lists as
+well as filter and selection entry fields. Bindings are in place such that
+selection of a directory list item loads the filter entry field and
+selection of a file list item loads the selection entry field. Options
+exist to control the appearance and actions of the widget.
+
+.SH "METHODS"
+.PP
+The \fBiwidgets::fileselectionbox\fR command creates a new Tcl command whose
+name is \fIpathName\fR. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIOption\fR and the \fIarg\fRs
+determine the exact behavior of the command. The following
+commands are possible for fileselectionbox widgets:
+
+.SH "WIDGET-SPECIFIC METHODS"
+.TP
+\fIpathName \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given
+by \fIoption\fR.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::fileselectionbox\fR
+command.
+.TP
+\fIpathName \fBchildsite\fR
+Returns the child site widget path name.
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR?
+Query or modify the configuration options of the widget.
+If no \fIoption\fR is specified, returns a list describing all of
+the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for
+information on the format of this list). If \fIoption\fR is specified
+with no \fIvalue\fR, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no \fIoption\fR is specified). If
+one or more \fIoption\-value\fR pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::fileselectionbox\fR
+command.
+.TP
+\fIpathName \fBfilter\fR
+Update the current contents of the file selection box based on the current
+filter entry field value.
+.TP
+\fIpathName \fBget\fR
+Returns the current value of the selection entry widget.
+
+.SH "COMPONENTS"
+.LP
+.nf
+Name: \fBdirs\fR
+Class: \fBScrolledlistbox\fR
+.fi
+.IP
+The dirs component is the directory list box for the file selection box.
+See the "scrolledlistbox" widget manual entry for details on the dirs
+component item.
+.LP
+.nf
+Name: \fBfiles\fR
+Class: \fBScrolledlistbox\fR
+.fi
+.IP
+The files component is the file list box for the file selection box.
+See the "scrolledlistbox" widget manual entry for details on the files
+component item.
+.LP
+.nf
+Name: \fBfilter\fR
+Class: \fBEntryfield\fR
+.fi
+.IP
+The filter component is the entry field for user input of the filter value.
+See the "entryfield" widget manual entry for details on the filter
+component item.
+.LP
+.nf
+Name: \fBselection\fR
+Class: \fBEntryfield\fR
+.fi
+.IP
+The selection component is the entry field for user input of the currently
+selected file value. See the "entryfield" widget manual entry for details
+on the selection component item.
+.fi
+
+.SH EXAMPLE
+.DS
+package require Iwidgets 4.0
+iwidgets::fileselectionbox .fsb
+pack .fsb -padx 10 -pady 10 -fill both -expand yes
+.DE
+.SH AUTHOR(S)
+Mark L. Ulferts
+.SH KEYWORDS
+fileselectionbox, widget
diff --git a/iwidgets/doc/fileselectiondialog.n b/iwidgets/doc/fileselectiondialog.n
new file mode 100644
index 00000000000..37e6f958601
--- /dev/null
+++ b/iwidgets/doc/fileselectiondialog.n
@@ -0,0 +1,218 @@
+'\"
+'\" Copyright (c) 1995 DSC Technologies Corporation
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) fileselectiondialog.n 1.21 94/12/17 16:04:44
+'\"
+.so man.macros
+.HS iwidgets::fileselectiondialog iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+iwidgets::fileselectiondialog \- Create and manipulate a file selection dialog widget
+.SH SYNOPSIS
+\fBiwidgets::fileselectiondialog\fI \fIpathName \fR?\fIoptions\fR?
+.SH "INHERITANCE"
+itk::Toplevel <- iwidgets::Shell <- iwidgets::Dialogshell <- iwidgets::Dialog <- iwidgets::Fileselectiondialog
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fB
+activeBackground background borderWidth cursor
+foreground highlightColor highlightThickness insertBackground
+insertBorderWidth insertOffTime insertOnTime insertWidth
+selectBackground selectBorderWidth selectForeground\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "ASSOCIATED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBtextBackground\fR \fBtextFont\fR
+.fi
+.LP
+See the "entryfield" widget manual entry for details on the above associated
+options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBchildSitePos\fR \fBdirectory\fR \fBdirsLabel\fR \fBdirSearchCommand\fR
+\fBdirsOn\fR \fBfilesLabel\fR \fBfilesLabelOn\fR \fBfileSearchCommand\fR
+\fBfilesOn\fR \fBfileType\fR \fBfilterLabel\fR \fBfilterOn\fR
+\fBinvalid\fR \fBmask\fR \fBnoMatchString\fR \fBselectionLabel\fR
+\fBselectionOn\fR
+.fi
+.LP
+See the "fileselectionbox" widget manual entry for details on the above
+associated options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBlabelFont\fR
+.fi
+.LP
+See the "labeledwidget" widget manual entry for details on the above
+associated options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBtextBackground\fR \fBtextFont\fR
+.fi
+.LP
+See the "scrolledlistbox" widget manual entry for details on the above
+associated options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBactiveRelief\fR \fBelementBorderWidth\fR \fBjump\fR \fBtroughColor\fR
+.fi
+.LP
+See the "scrollbar" widget class manual entry for details on the above
+associated options.
+
+.SH "INHERITED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBbuttonBoxPadX\fR \fBbuttonBoxPadY\fR \fBbuttonBoxPos\fR \fBpadX\fR
+\fBpadY\fR \fBseparator\fR \fBthickness\fR
+.fi
+.LP
+See the "dialogshell" widget manual entry for details on the above
+inherited options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBheight\fR \fBmaster\fR \fBmodality\fR \fBwidth\fR
+.fi
+.LP
+See the "shell" widget manual entry for details on the above
+inherited options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBtitle\fR
+.fi
+.LP
+See the "Toplevel" widget manual entry for details on the above
+inherited options.
+.BE
+
+.SH DESCRIPTION
+.PP
+The \fBiwidgets::fileselectiondialog\fR command creates a file selection dialog
+similar to the OSF/Motif standard composite widget. The
+fileselectiondialog is derived from the Dialog class and is composed of
+a FileSelectionBox with attributes set to manipulate the dialog buttons.
+
+.SH "METHODS"
+.PP
+The \fBiwidgets::fileselectiondialog\fR command creates a new Tcl command whose
+name is \fIpathName\fR. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIOption\fR and the \fIarg\fRs
+determine the exact behavior of the command. The following
+commands are possible for fileselectiondialog widgets:
+.SH "ASSOCIATED METHODS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBget\fR \fBchildsite\fR \fBfilter\fR
+.fi
+.LP
+See the "fileselectionbox" class manual entry for details on the
+associated methods.
+.SH "INHERITED METHODS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBadd\fR \fBbuttonconfigure\fR \fBdefault\fR \fBhide\fR
+\fBinsert\fR \fBinvoke\fR \fBshow\fR
+.fi
+.LP
+See the "buttonbox" widget manual entry for details on the above
+inherited methods.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBactivate\fR \fBcenter\fR \fBdeactivate\fR
+.fi
+.LP
+See the "shell" widget manual entry for details on the above
+inherited methods.
+
+.SH "WIDGET-SPECIFIC METHODS"
+.TP
+\fIpathName \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given
+by \fIoption\fR.
+\fIOption\fR may have any of the values accepted by
+the \fBiwidgets::fileselectiondialog\fR command.
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR?
+Query or modify the configuration options of the widget.
+If no \fIoption\fR is specified, returns a list describing all of
+the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for
+information on the format of this list). If \fIoption\fR is specified
+with no \fIvalue\fR, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no \fIoption\fR is specified). If
+one or more \fIoption\-value\fR pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+\fIOption\fR may have any of the values accepted by
+the \fBiwidgets::fileselectiondialog\fR
+command.
+
+.SH "COMPONENTS"
+.LP
+.nf
+Name: \fBfsb\fR
+Class: \fBFileselectionbox\fR
+.fi
+.IP
+The fsb component is the file selection box for the file selection dialog.
+See the "fileselectionbox" widget manual entry for details on the fsb
+component item.
+.fi
+
+.SH EXAMPLE
+.DS
+ package require Iwidgets 4.0
+ #
+ # Non-modal example
+ #
+ proc okCallback {} {
+ puts "You selected [.nmfsd get]"
+ .nmfsd deactivate
+ }
+
+ iwidgets::fileselectiondialog .nmfsd -title Non-Modal
+ .nmfsd buttonconfigure OK -command okCallback
+
+ .nmfsd activate
+
+ #
+ # Modal example
+ #
+ iwidgets::fileselectiondialog .mfsd -modality application
+ .mfsd center
+
+ if {[.mfsd activate]} {
+ puts "You selected [.mfsd get]"
+ } else {
+ puts "You cancelled the dialog"
+ }
+.DE
+.SH AUTHOR
+Mark L. Ulferts
+.SH KEYWORDS
+fileselectiondialog, fileselectionbox, dialog, dialogshell, shell, widget
diff --git a/iwidgets/doc/finddialog.n b/iwidgets/doc/finddialog.n
new file mode 100644
index 00000000000..dfc1372a55e
--- /dev/null
+++ b/iwidgets/doc/finddialog.n
@@ -0,0 +1,294 @@
+'\"
+'\" Copyright (c) 1995 DSC Technologies Corporation
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) finddialog.n 1.21 94/12/17 16:04:44
+'\"
+.so man.macros
+.HS iwidgets::finddialog iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+iwidgets::finddialog \- Create and manipulate a find dialog widget
+.SH SYNOPSIS
+\fBiwidgets::finddialog\fI \fIpathName \fR?\fIoptions\fR?
+.SH "INHERITANCE"
+itk::Toplevel <- iwidgets::Shell <- iwidgets::Dialogshell <- iwidgets::Finddialog
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fB
+activeBackground activeForeground background borderWidth
+cursor disabledForeground font foreground
+highlightColor highlightThickness insertBackground insertBorderWidth
+insertOffTime insertOnTime insertWidth selectBackground
+selectBorderWidth selectColor selectForeground\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "ASSOCIATED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBselectColor\fR
+.fi
+.LP
+See the "checkbutton" widget manual entry for details on the above
+associated options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBselectColor\fR
+.fi
+.LP
+See the "entryfield" widget manual entry for details on the above
+associated options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBlabelFont\fR
+.fi
+.LP
+See the "labeledwidget" widget manual entry for details on the above
+associated options.
+.SH "INHERITED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBbuttonBoxPadX\fR \fBbuttonBoxPadY\fR \fBbuttonBoxPos\fR \fBpadX\fR
+\fBpadY\fR \fBseparator\fR \fBthickness\fR
+.fi
+.LP
+See the "dialogshell" widget manual entry for details on the above
+inherited options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBheight\fR \fBmaster\fR \fBmodality\fR \fBwidth\fR
+.fi
+.LP
+See the "shell" widget manual entry for details on the above
+inherited options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBtitle\fR
+.fi
+.LP
+See the "Toplevel" widget manual entry for details on the above
+inherited options.
+.SH "WIDGET-SPECIFIC OPTIONS"
+.LP
+.nf
+Name: \fBclearCommand\fR
+Class: \fBCommand\fR
+Command-Line Switch: \fB-clearcommand\fR
+.fi
+.IP
+Specifies a command to be invoked following a clear operation.
+The option is meant to be used as means of notification that the
+clear has taken place and allow other actions to take place such
+as disabling a find again menu.
+.LP
+.nf
+Name: \fBmatchCommand\fR
+Class: \fBCommand\fR
+Command-Line Switch: \fB-matchcommand\fR
+.fi
+.IP
+Specifies a command to be invoked following a find operation.
+The command is called with a match point as an argument which identifies
+where exactly where in the text or scrolledtext widget that the match
+is located. Should a match not be found the match point is {}. The
+option is meant to be used as a means of notification that the
+find operation has completed and allow other actions to take place
+such as disabling a find again menu option if the match point was {}.
+.LP
+.nf
+Name: \fBpatternBackground\fR
+Class: \fBBackground\fR
+Command-Line Switch: \fB-patternbackground\fR
+.fi
+.IP
+Specifies the background color of the text matching the search
+pattern. It may have any of the forms accepted by Tk_GetColor.
+The default is gray44.
+.LP
+.nf
+Name: \fBpatternForeground\fR
+Class: \fBBackground\fR
+Command-Line Switch: \fB-patternforeground\fR
+.fi
+.IP
+Specifies the foreground color of the text matching the search
+pattern. It may have any of the forms accepted by Tk_GetColor.
+The default is white.
+.LP
+.nf
+Name: \fBsearchBackground\fR
+Class: \fBBackground\fR
+Command-Line Switch: \fB-searchbackground\fR
+.fi
+.IP
+Specifies the background color of the line containing the matching
+the search pattern. It may have any of the forms accepted by Tk_GetColor.
+The default is gray77.
+.LP
+.nf
+Name: \fBsearchForeground\fR
+Class: \fBBackground\fR
+Command-Line Switch: \fB-searchforeground\fR
+.fi
+.IP
+Specifies the foreground color of the line containing the matching
+the search pattern. It may have any of the forms accepted by Tk_GetColor.
+The default is black.
+.LP
+.nf
+Name: \fBtextWidget\fR
+Class: \fBTextWidget\fR
+Command-Line Switch: \fB-textwidget\fR
+.fi
+.IP
+Specifies the text or scrolledtext widget to be searched.
+.BE
+
+.SH DESCRIPTION
+.PP
+The \fBiwidgets::finddialog\fR command creates a find dialog that works in
+conjunction with a text or scrolledtext widget to provide a means
+of performing search operations. The user is prompted for a text
+pattern to be found in the text or scrolledtext widget. The
+search can be for all occurances, by regular expression, considerate
+of the case, or backwards.
+
+.SH "METHODS"
+.PP
+The \fBiwidgets::finddialog\fR command creates a new Tcl command whose
+name is \fIpathName\fR. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIOption\fR and the \fIarg\fRs
+determine the exact behavior of the command. The following
+commands are possible for finddialog widgets:
+.SH "INHERITED METHODS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBadd\fR \fBbuttonconfigure\fR \fBdefault\fR \fBhide\fR
+\fBinvoke\fR \fBshow\fR
+.fi
+.LP
+See the "buttonbox" widget manual entry for details on the above
+inherited methods.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBactivate\fR \fBcenter\fR \fBdeactivate\fR
+.fi
+.LP
+See the "shell" widget manual entry for details on the above
+inherited methods.
+.SH "WIDGET-SPECIFIC METHODS"
+.TP
+\fIpathName \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given
+by \fIoption\fR.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::finddialog\fR
+command.
+.TP
+\fIpathName \fBclear\fR
+Clears the pattern in the entry field and the pattern matchin
+indicators in the text or scrolledtext widget.
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR?
+Query or modify the configuration options of the widget.
+If no \fIoption\fR is specified, returns a list describing all of
+the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for
+information on the format of this list). If \fIoption\fR is specified
+with no \fIvalue\fR, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no \fIoption\fR is specified). If
+one or more \fIoption\-value\fR pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::finddialog\fR
+command.
+.TP
+\fIpathName \fBfind\fR
+Search for a specific text string in the text widget given by
+the -textwidget option. This method is the standard callback
+for the Find button. It is made available such that it can be
+bound to a find again action.
+
+.SH "COMPONENTS"
+.LP
+.nf
+Name: \fBall\fR
+Class: \fBCheckbutton\fR
+.fi
+.IP
+The all component specifies that all the matches of the pattern should be
+found when performing the search. See the "checkbutton" widget manual
+entry for details on the all component item.
+.LP
+.nf
+Name: \fBbackwards\fR
+Class: \fBCheckbutton\fR
+.fi
+.IP
+The backwards component specifies that the search should continue in
+a backwards direction towards the beginning of the text or scrolledtext
+widget. See the "checkbutton" widget manual entry for details on the
+backwards component item.
+.LP
+.nf
+Name: \fBcase\fR
+Class: \fBCheckbutton\fR
+.fi
+.IP
+The case component specifies that the case of the pattern should be
+taken into consideration when performing the search. See the
+"checkbutton" widget manual entry for details on the case component item.
+.LP
+.nf
+Name: \fBpattern\fR
+Class: \fBEntryfield\fR
+.fi
+.IP
+The pattern component provides the pattern entry field. See the
+"entryfield" widget manual entry for details on the pattern component item.
+.LP
+.nf
+Name: \fBregexp\fR
+Class: \fBCheckbutton\fR
+.fi
+.IP
+The regexp component specifies that the pattern is a regular expression.
+See the "checkbutton" widget manual entry for details on the regexp
+component item.
+.fi
+
+.SH EXAMPLE
+.DS
+ package require Iwidgets 4.0
+ iwidgets::scrolledtext .st
+ pack .st
+ .st insert end "Now is the time for all good men\\n"
+ .st insert end "to come to the aid of their country"
+
+ iwidgets::finddialog .fd -textwidget .st
+ .fd center .st
+ .fd activate
+.DE
+.SH AUTHOR
+Mark L. Ulferts
+.SH KEYWORDS
+finddialog, dialogshell, shell, widget
+
diff --git a/iwidgets/doc/generateHtml.sh b/iwidgets/doc/generateHtml.sh
new file mode 100644
index 00000000000..d49a60744d9
--- /dev/null
+++ b/iwidgets/doc/generateHtml.sh
@@ -0,0 +1,10 @@
+#!/bin/ksh
+#
+
+manpages=`\ls *.n`
+
+for doc in $manpages
+do
+ echo "Generating html/$doc.html"
+ nroff -man $doc | rman -f html > html/$doc.html
+done
diff --git a/iwidgets/doc/hierarchy.n b/iwidgets/doc/hierarchy.n
new file mode 100644
index 00000000000..d6fc6aa1375
--- /dev/null
+++ b/iwidgets/doc/hierarchy.n
@@ -0,0 +1,629 @@
+'\"
+'\" Copyright (c) 1997 DSC Technologies Corporation
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) hierarchy.n 1.21 94/12/17 16:04:44
+'\"
+.so man.macros
+.HS iwidgets::hierarchy iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+iwidgets::hierarchy \- Create and manipulate a hierarchy widget
+.SH SYNOPSIS
+\fBiwidgets::hierarchy\fI \fIpathName \fR?\fIoptions\fR?
+.SH "INHERITANCE"
+itk::Widget <- iwidgets::Labeledwidget <- iwidgets::Scrolledwidget <- iwidgets::Hierarchy
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fB
+activeBackground activeForeground background borderWidth
+cursor disabledForeground foreground highlightColor
+highlightThickness relief selectBackground selectForeground\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "ASSOCIATED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBactiveRelief\fR \fBelementBorderWidth\fR \fBjump\fR \fBtroughColor\fR
+.fi
+.LP
+See the "scrollbar" widget manual entry for details on the above
+associated options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBspacing1\fR \fBspacing2\fR \fBspacing3\fR \fBtabs\fR
+.fi
+.LP
+See the "text" widget manual entry for details on the above
+associated options.
+.SH "INHERITED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBlabelBitmap\fR \fBlabelFont\fR \fBlabelImage\fR \fBlabelMargin\fR
+\fBlabelPos\fR \fBlabelText\fR \fBlabelVariable\fR \fBsticky\fR
+.fi
+.LP
+See the "labeledwidget" class manual entry for details on the inherited options.
+.SH "WIDGET-SPECIFIC OPTIONS"
+.LP
+.nf
+Name: \fBalwaysQuery\fR
+Class: \fBAlwaysQuery\fR
+Command-Line Switch: \fB-alwaysquery\fR
+.fi
+.IP
+Boolean flag which tells the hierarchy widget weather or not
+each refresh of the display should be via a new query using
+the command value of the -querycommand option or use the values
+previous found the last time the query was made. The default
+is no.
+.LP
+.nf
+Name: \fBclosedIcon\fR
+Class: \fBIcon\fR
+Command-Line Switch: \fB-closedicon\fR
+.fi
+.IP
+Specifies the name of an existing closed icon image to be used in the
+hierarchy before those nodes that are collapsed. Should one not be
+provided, then a folder icon will be generated, pixmap if possible,
+bitmap otherwise.
+.LP
+.nf
+Name: \fBdblClickCommand\fR
+Class: \fBCommand\fR
+Command-Line Switch: \fB-dblclickcommand\fR
+.fi
+.IP
+Specifies a command to be executed upon user double clicking via mouse button
+one of the text label of an entry. If this command contains "%n", it is
+replaced with the name of the selected node. Should it contain "%s" then a
+boolean indicator of the node's current selection status is substituted.
+.LP
+.nf
+Name: \fBexpanded\fR
+Class: \fBExpanded\fR
+Command-Line Switch: \fB-expanded\fR
+.fi
+.IP
+When true, the hierarchy will be completely expanded when it
+is first displayed. A fresh display can be triggered by
+resetting the -querycommand option. The default is false.
+.LP
+.nf
+Name: \fBfilter\fR
+Class: \fBFilter\fR
+Command-Line Switch: \fB-filter\fR
+.fi
+.IP
+When true only the branch nodes and selected items are displayed.
+This gives a compact view of important items. The default is false.
+.LP
+.nf
+Name: \fBheight\fR
+Class: \fBHeight\fR
+Command-Line Switch: \fB-height\fR
+.fi
+.IP
+Specifies the height of the hierarchy as an entire unit.
+The value may be specified in any of the forms acceptable to
+\fBTk_GetPixels\fR. Any additional space needed to display the other
+components such as labels, margins, and scrollbars force the hierarchy
+to be compressed. A value of zero along with the same value for
+the width causes the value given for the visibleitems option
+to be applied which administers geometry constraints in a different
+manner. The default height is zero.
+.LP
+.nf
+Name: \fBiconCommand\fR
+Class: \fBCommand\fR
+Command-Line Switch: \fB-iconcommand\fR
+.fi
+.IP
+Specifies a command to be executed upon user selection via mouse button
+one of any additional icons given in the values returned by the command
+associated with the -querycommand option. If this command contains "%n",
+it is replaced with the name of the node the icon belongs to. Should it
+contain "%i" then the icon name is substituted.
+.LP
+.nf
+Name: \fBiconDblCommand\fR
+Class: \fBCommand\fR
+Command-Line Switch: \fB-icondblcommand\fR
+.fi
+.IP
+Specifies a command to be executed upon user double clicking via mouse button
+one of the icon of an entry. If this command contains "%n", it is replaced
+with the name of the node the icon belongs to. Should it contain "%i" then
+the icon name is substituted.
+.LP
+.nf
+Name: \fBimageCommand\fR
+Class: \fBCommand\fR
+Command-Line Switch: \fB-imagecommand\fR
+.fi
+.IP
+Specifies a command to be executed upon user selecting an image of an entry.
+If this command contains "%n", it is replaced with the name of the selected
+node. Should it contain "%s" then a boolean indicator of the node's current
+selection status is substituted.
+.LP
+.nf
+Name: \fBimageDblCommand\fR
+Class: \fBCommand\fR
+Command-Line Switch: \fB-imagedblcommand\fR
+.fi
+.IP
+Specifies a command to be executed upon user double clicking via mouse button
+one of the image of an entry. If this command contains "%n", it is replaced
+with the name of the node the icon belongs to. Should it contain "%i" then
+the icon name is substituted.
+.LP
+.nf
+Name: \fBimageMenuLoadCommand\fR
+Class: \fBCommand\fR
+Command-Line Switch: \fB-imagemenuloadcommand\fR
+.fi
+.IP
+Specifies a command to be executed upon user selection via mouse button three,
+on the image or icon, that will dynamically load the itemMenu for the widget.
+.LP
+.nf
+Name: \fBmarkBackground\fR
+Class: \fBForeground\fR
+Command-Line Switch: \fB-markbackground\fR
+.fi
+.IP
+Specifies the background color to use when displaying marked nodes.
+.LP
+.nf
+Name: \fBmarkForeground\fR
+Class: \fBBackground\fR
+Command-Line Switch: \fB-markforeground\fR
+.fi
+.IP
+Specifies the foreground color to use when displaying marked nodes.
+.LP
+.nf
+Name: \fBmenuCursor\fR
+Class: \fBCursor\fR
+Command-Line Switch: \fB-menucursor\fR
+.fi
+.IP
+Specifies the mouse cursor to be used for the item and background
+menus. The value may have any of the forms accept able to Tk_GetCursor.
+.LP
+.nf
+Name: \fBnodeIcon\fR
+Class: \fBIcon\fR
+Command-Line Switch: \fB-nodeicon\fR
+.fi
+.IP
+Specifies the name of an existing node icon image to be used in the
+hierarchy before those nodes that are leafs. Should one not be provided,
+then a dog-eared page icon will be generated, pixmap if possible, bitmap
+otherwise.
+.LP
+.nf
+Name: \fBopenIcon\fR
+Class: \fBIcon\fR
+Command-Line Switch: \fB-openicon\fR
+.fi
+.IP
+Specifies the name of an existing open icon image to be used in the
+hierarchy before those nodes that are expanded. Should one not be provided,
+then an open folder icon will be generated, pixmap if possible, bitmap
+otherwise.
+.LP
+.nf
+Name: \fBqueryCommand\fR
+Class: \fBCommand\fR
+Command-Line Switch: \fB-querycommand\fR
+.fi
+.IP
+Specifies the command executed to query the contents of each node. If this
+command contains "%n", it is replaced with the name of the desired
+node. In its simpilest form it should return the children of the
+given node as a list which will be depicted in the display.
+Since the names of the children are used as tags in the underlying
+text widget, each child must be unique in the hierarchy. Due to
+the unique requirement, the nodes shall be reffered to as uids
+or uid in the singular sense. The format of returned list is
+.IP
+ {uid [uid ...]}
+.IP
+ where uid is a unique id and primary key for the hierarchy entry
+.IP
+Should the unique requirement pose a problem, the list returned
+can take on another more extended form which enables the
+association of text to be displayed with the uids. The uid must
+still be unique, but the text does not have to obey the unique
+rule. In addition, the format also allows the specification of
+additional tags to be used on the same entry in the hierarchy
+as the uid and additional icons to be displayed just before
+the node. The tags and icons are considered to be the property of
+the user in that the hierarchy widget will not depend on any of
+their values. The extended format is
+.IP
+ {{uid [text [tags [icons]]]} {uid [text [tags [icons]]]} ...}
+.IP
+ where uid is a unique id and primary key for the hierarchy entry
+ text is the text to be displayed for this uid
+ tags is a list of user tags to be applied to the entry
+ icons is a list of icons to be displayed in front of the text
+.IP
+The hierarchy widget does a look ahead from each node to determine
+if the node has a children. This can be cost some performace with
+large hierarchies. User's can avoid this by providing a hint in
+the user tags. A tag of "leaf" or "branch" tells the hierarchy
+widget the information it needs to know thereby avoiding the look
+ahead operation.
+.LP
+.nf
+Name: \fBhscrollMode\fR
+Class: \fBScrollMode\fR
+Command-Line Switch: \fB-hscrollmode\fR
+.fi
+.IP
+Specifies the the display mode to be used for the horizontal
+scrollbar: \fBstatic, dynamic,\fR or \fBnone\fR. In static mode, the
+scroll bar is displayed at all times. Dynamic mode displays the
+scroll bar as required, and none disables the scroll bar display. The
+default is static.
+.LP
+.nf
+Name: \fBsbWidth\fR
+Class: \fBWidth\fR
+Command-Line Switch: \fB-sbwidth\fR
+.fi
+.IP
+Specifies the width of the scrollbar in any of the forms
+acceptable to \fBTk_GetPixels\fR.
+.LP
+.nf
+Name: \fBscrollMargin\fR
+Class: \fBMargin\fR
+Command-Line Switch: \fB-scrollmargin\fR
+.fi
+.IP
+Specifies the distance between the text portion of the hierarchy and
+the scrollbars in any of the forms acceptable to \fBTk_GetPixels\fR. The
+default is 3 pixels.
+.LP
+.nf
+Name: \fBselectCommand\fR
+Class: \fBCommand\fR
+Command-Line Switch: \fB-selectcommand\fR
+.fi
+.IP
+Specifies a Tcl command to be evaluated when you select a node in the
+hierarchy via left mouse click. If "%n" is included in the command, it is
+substituted with the node name. Similarly, "%s" is substituted with the
+node's current selection status: 1 for selected, 0 otherwise.
+.LP
+Name: \fBtextBackground\fR
+Class: \fBBackground\fR
+Command-Line Switch: \fB-textbackground\fR
+.fi
+.IP
+Specifies the background color for the text portion of the hierarchy in
+any of the forms acceptable to \fBTk_GetColor\fR.
+.LP
+.nf
+Name: \fBtextFont\fR
+Class: \fBFont\fR
+Command-Line Switch: \fB-textfont\fR
+.fi
+.IP
+Specifies the font to be used in the text portion of the hierarchy.
+.LP
+.nf
+Name: \fBtextMenuLoadCommand\fR
+Class: \fBCommand\fR
+Command-Line Switch: \fB-textmenuloadcommand\fR
+.fi
+.IP
+Specifies a command to be executed upon user selection via mouse button three,
+that will dynamically load the itemMenu for the widget.
+.LP
+.nf
+Name: \fBvisibleitems\fR
+Class: \fBVisibleItems\fR
+Command-Line Switch: \fB-visibleitems\fR
+.fi
+.IP
+Specifies the widthxheight in characters and lines for the hierarchy.
+This option is only administered if the width and height options
+are both set to zero, otherwise they take precedence. The default value
+is 80x24. With the visibleitems option engaged, geometry constraints
+are maintained only on the text portion of the hierarchy. The size of
+the other components such as
+labels, margins, and scroll bars, are additive and independent,
+effecting the overall size of the hierarchy. In contrast,
+should the width and height options have non zero values, they
+are applied to the hierarchy as a whole. The hierarchy
+is compressed or expanded to maintain the geometry constraints.
+.LP
+.nf
+Name: \fBvscrollMode\fR
+Class: \fBScrollMode\fR
+Command-Line Switch: \fB-vscrollmode\fR
+.fi
+.IP
+Specifies the the display mode to be used for the vertical
+scrollbar: \fBstatic, dynamic,\fR or \fBnone\fR. In static mode, the
+scroll bar is displayed at all times. Dynamic mode displays the
+scroll bar as required, and none disables the scroll bar display. The
+default is static.
+.LP
+.nf
+Name: \fBwidth\fR
+Class: \fBWidth\fR
+Command-Line Switch: \fB-width\fR
+.fi
+.IP
+Specifies the width of the hierarchy as an entire unit.
+The value may be specified in any of the forms acceptable to
+\fBTk_GetPixels\fR. Any additional space needed to display the other
+components such as labels, margins, and scrollbars force the text portion
+of the hierarchy
+to be compressed. A value of zero along with the same value for
+the height causes the value given for the visibleitems option
+to be applied which administers geometry constraints in a different
+manner. The default width is zero.
+.LP
+
+
+.BE
+
+.SH DESCRIPTION
+.PP
+The \fBiwidgets::hierarchy\fR command creates a hierarchical data view widget.
+It allows the graphical management of a a list of nodes that can be
+expanded or collapsed. Individual nodes can be highlighted.
+Clicking with the right mouse button on any item brings up a
+special item menu. Clicking on the background area brings up
+a different popup menu. Options exist to provide user control over
+the loading of the nodes and actions associated with node selection.
+Since the hierarchy is based on the scrolledtext widget, it includes
+options to control the method in which the scrollbars are displayed,
+i.e. statically or dynamically. Options also exist for adding a
+label to the hierarchy and controlling its position.
+
+.SH "METHODS"
+.PP
+The \fBiwidgets::hierarchy\fR command creates a new Tcl command whose
+name is \fIpathName\fR. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIOption\fR and the \fIarg\fRs
+determine the exact behavior of the command. The following
+commands are possible for hierarchy widgets:
+.SH "ASSOCIATED METHODS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBbbox\fR \fBcompare\fR \fBdebug\fR \fBdelete\fR
+\fBdlineinfo\fR \fBdump\fR \fBget\fR \fBindex\fR
+\fBinsert\fR \fBscan\fR \fBsearch\fR \fBsee\fR
+\fBtag\fR \fBwindow\fR \fBxview\fR \fByview\fR
+.fi
+.LP
+See the "text" manual entry for details on the standard methods.
+
+.SH "WIDGET-SPECIFIC METHODS"
+.TP
+\fIpathName \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given
+by \fIoption\fR.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::hierarchy\fR
+command.
+.TP
+\fIpathName \fBclear\fR
+Removes all items from the hierarchy display including all tags and icons.
+The display will remain empty until the -filter or -querycommand
+options are set.
+.TP
+\fIpathName \fBcollapse\fR \fIuid\fR
+Collapses the hierarchy beneath the node with the specified unique id by
+one level. Since this can take a moment for large hierarchies, the
+cursor will be changed to a watch during the collapse. Also, if any
+of the nodes beneath the node being collapsed are selected, their
+status is changed to unselected.
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR?
+Query or modify the configuration options of the widget.
+If no \fIoption\fR is specified, returns a list describing all of
+the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for
+information on the format of this list). If \fIoption\fR is specified
+with no \fIvalue\fR, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no \fIoption\fR is specified). If
+one or more \fIoption\-value\fR pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::hierarchy\fR
+command.
+.TP
+\fIpathName \fBcurrent\fR
+Returns the tags for the node that was most recently selected by the
+right mouse button when the item menu was posted. Usually used by the code
+in the item menu to figure out what item is being manipulated.
+.TP
+\fIpathName \fBdraw\fR ?\fIwhen\fR?
+Performs a complete redraw of the entire hierarchy. When may be either -now
+or -eventually where the latter means the draw can be performed after idle.
+.TP
+\fIpathName \fBexpand\fR \fIuid\fR
+Expands the hierarchy beneath the node with the specified unique id by
+one level. Since this can take a moment for large hierarchies, the cursor
+will be changed to a watch during the expansion.
+.TP
+\fIpathName \fBexpanded\fR \fIuid\fR
+Returns the current state of expansion for the node with the specified unique
+id.
+.TP
+\fIpathName \fBexpState\fR
+Returns a list of all expanded nodes in the tree.
+.TP
+\fIpathName \fBmark\fR \fIoption ?arg arg ...?\fR
+This command is used to manipulate marks which is quite similar to
+selection, adding a secondary means of hilighting an item in the
+hierarchy. The exact behavior of the command depends on the
+\fIoption\fR argument that follows the \fBmark\fR argument. The
+following forms of the command are currently supported:
+.RS
+.TP
+\fIpathName \fBmark clear\fR
+Clears all the currently marked nodes in the hierarchy.
+.TP
+\fIpathName \fBmark add \fIuid \fR?\fIuid uid ...\fR?
+Marks the nodes with the specified uids in the hierarchy using the
+\fB-markbackground\fR and \fB-markforeground\fR options and without
+affecting the mark state of any other nodes that were already
+marked.
+.TP
+\fIpathName \fBmark remove \fIuid \fR?\fIuid uid ...\fR?
+Unmarks the nodes with the specified uids in the hierarchy without
+affecting the mark state of any other nodes that were already
+marked.
+.TP
+\fIpathName \fBmark get\fR
+Returns a list of the unique ids that are currently marked.
+.RE
+.TP
+\fIpathName \fBrefresh\fR \fIuid\fR
+Performs a redraw of a specific node that has the given uid. If the node
+is not currently visible or in other words already drawn on the text,
+then no action is taken.
+.TP
+\fIpathName \fBprune\fR \fIuid\fR
+Removes the node specified by the given uid from the hierarchy. Should
+the node have children, then all of its children will be removed as well.
+.TP
+\fIpathName \fBselection\fR \fIoption \fR?\fIarg arg ...\fR?
+This command is used to manipulate the selection of nodes in the
+hierarchy. The exact behavior of the command depends on the
+\fIoption\fR argument that follows the \fBselection\fR argument. The
+following forms of the command are currently supported:
+.RS
+.TP
+\fIpathName \fBselection clear\fR
+Clears all the currently selected nodes in the hierarchy.
+.TP
+\fIpathName \fBselection add \fIuid \fR?\fIuid uid ...\fR?
+Selects the nodes with the specified uids in the hierarchy using the
+\fB-selectionbackground\fR and \fB-selectionforeground\fR options and without
+affecting the selection state of any other nodes that were already
+selected.
+.TP
+\fIpathName \fBselection remove \fIuid \fR?\fIuid uid ...\fR?
+Deselects the nodes with the specified uids in the hierarchy without
+affecting the selection state of any other nodes that were already
+selected.
+.TP
+\fIpathName \fBselection get\fR
+Returns a list of the unique ids that are currently selected.
+.RE
+A nodes selection status is also dependent on it being visible. If a
+node is selected and its parent is then collapsed making the selected
+node not visible, then its selection status is changed to unselected.
+.TP
+\fIpathName \fBtoggle\fR \fIuid\fR
+Toggles the hierarchy beneath the node with the specified unique id. If
+the hierarchy is currently expanded, then it is collapsed, and vice-versa.
+
+.SH "COMPONENTS"
+.LP
+.nf
+Name: \fBlist\fR
+Class: \fBText\fR
+.fi
+.IP
+The list component is the text widget in which the hierarchy is displayed.
+See the "text" widget manual entry for details on the text component item.
+.LP
+.nf
+Name: \fBbgMenu\fR
+Class: \fBMenu\fR
+.fi
+.IP
+The bgMenu component is the popup menu which is displayed upon pressing
+the right mouse button in the background, i.e. not over a specific node. Menu
+items can be added along with their commands via the component command.
+See the "menu" widget manual entry for details on the bgMenu component item.
+.LP
+.nf
+Name: \fBhorizsb\fR
+Class: \fBScrollbar\fR
+.fi
+.IP
+The horizsb component is the horizontal scroll bar. See the "scrollbar"
+widget manual entry for details on the horizsb component item.
+.LP
+.nf
+Name: \fBitemMenu\fR
+Class: \fBMenu\fR
+.fi
+.IP
+The itemMenu component is the popup menu which is displayed upon selection
+of a hierarchy node with the right mouse button. Menu items can be
+added along with their commands via the component command. See the "menu"
+widget manual entry for details on the itemMenu component item.
+.LP
+.nf
+Name: \fBvertsb\fR
+Class: \fBScrollbar\fR
+.fi
+.IP
+The vertsb component is the vertical scroll bar. See the "scrollbar" widget
+manual entry for details on the vertsb component item.
+.fi
+
+.SH EXAMPLE
+.DS
+package require Iwidgets 4.0
+proc get_files {file} {
+ global env
+
+ if {$file == ""} {
+ set dir $env(HOME)
+ } else {
+ set dir $file
+ }
+
+ if {[catch {cd $dir}] != 0} {
+ return ""
+ }
+
+ set rlist ""
+
+ foreach file [lsort [glob -nocomplain *]] {
+ lappend rlist [list [file join $dir $file] $file]
+ }
+
+ return $rlist
+}
+
+iwidgets::hierarchy .h -querycommand "get_files %n" -visibleitems 30x15 \
+ -labeltext $env(HOME)
+pack .h -side left -expand yes -fill both
+.DE
+.SH AUTHOR
+Mark L. Ulferts
+.DE
+Michael J. McLennan
+.SH KEYWORDS
+hierarchy, text, widget
diff --git a/iwidgets/doc/hyperhelp.n b/iwidgets/doc/hyperhelp.n
new file mode 100644
index 00000000000..1f668a2b3c4
--- /dev/null
+++ b/iwidgets/doc/hyperhelp.n
@@ -0,0 +1,196 @@
+'\"
+'\" Copyright (c) 1996 DSC Technologies Corporation
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) Hyperhelp.n
+'\"
+.so man.macros
+.HS iwidgets::hyperhelp iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+iwidgets::hyperhelp \- Create and manipulate a hyperhelp widget
+.SH SYNOPSIS
+\fBiwidgets::hyperhelp\fI \fIpathName \fR?\fIoptions\fR?
+.SH "INHERITANCE"
+itk::Toplevel <- iwidgets::Shell <- iwidgets::Hyperhelp
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+.ta 5c 10c
+\fBactiveBackground\fR \fBbackground\fR \fBborderWidth\fR
+\fBclosecmd\fR \fBcursor\fR \fBexportSelection\fR
+\fBforeground\fR \fBhighlightColor\fR \fBhighlightThickness\fR
+\fBinsertBackground\fR \fBinsertBorderWidth \fBinsertOffTime\fR
+\fBinsertOnTime\fR \fBinsertWidth\fR \fBpadX\fR
+\fBpadY\fR \fBrelief\fR \fBrepeatDelay\fR
+\fBrepeatInterval\fR \fBselectBackground\fR \fBselectBorderWidth\fR
+\fBselectForeground\fR \fBsetGrid\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "ASSOCIATED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBhscrollmode\fR \fBvscrollmode\fR \fBtextbackground\fR \fBfontname\fR
+\fBfontsize\fR \fBfixedfont\fR \fBlink\fR \fBlinkhighlight\fR
+\fBwidth\fR \fBheight\fR \fBstate\fR \fBwrap\fR
+\fBunknownimage\fR
+.fi
+.LP
+See the "scrolledhtml" widget manual entry for details on the above
+associated options.
+.SH "INHERITED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBmodality\fR \fBtitle\fR
+.fi
+.LP
+See the "shell" manual entry for details on the above inherited options.
+.SH "WIDGET-SPECIFIC OPTIONS"
+.LP
+.nf
+Name: \fBtopics\fR
+Class: \fBTopics\fR
+Command-Line Switch: \fB-topics\fR
+.fi
+.IP
+Specifies a list of help topics in the form {?\fItopic\fR? ... }. \fITopic\fR
+may either be a topic name, in which case the
+document associated with the topic should be in the file
+\fBhelpdir\fR/\fItopic\fR.html, or it may be of the form
+{\fIname\fR \fIfile\fR}. In the latter case, \fIname\fR is displayed in the
+topic menu, and selecting the name loads \fIfile\fR. If file has a relative
+path, it is assumed to be relative to helpdir.
+.LP
+.nf
+Name: \fBhelpdir\fR
+Class: \fBDirectory\fR
+Command-Line Switch: \fB-helpdir\fR
+.fi
+.IP
+Specifies the directory where help files are located.
+.LP
+.nf
+Name: \fBcloseCmd\fR
+Class: \fBCloseCmd\fR
+Command-Line Switch: \fB-closecmd\fR
+.fi
+.IP
+Specifies the tcl command to be executed when the close option is selected
+from the topics menu.
+.LP
+.nf
+Name: \fBmaxHistory\fR
+Class: \fBMaxHistory\fR
+Command-Line Switch: \fB-maxhistory\fR
+.fi
+.IP
+Specifies the maximum number of entries stored in the history list
+.LP
+.nf
+Name: \fBbeforelink\fR
+Class: \fBBeforeLink\fR
+Command-Line Switch: \fB-beforelink\fR
+.fi
+.IP
+Specifies a command to be eval'ed before a new link is displayed. The path
+of the link to be displayed is appended before evaling the command. A suggested
+use might be to busy the widget while a new page is being displayed.
+.LP
+.nf
+Name: \fBafterlink\fR
+Class: \fBAfterLink\fR
+Command-Line Switch: \fB-afterlink\fR
+.fi
+.IP
+Specifies a command to be eval'ed after a new link is completely displayed.
+The path of the link that was displayed is appended before evaling the command.
+.LP
+.BE
+
+.SH DESCRIPTION
+.PP
+The \fBiwidgets::hyperhelp\fR command creates a shell window with a pulldown menu
+showing a list of topics. The topics are displayed by importing a HTML
+formatted file named \fBhelpdir\fR/\fItopic\fR.html. For a list of
+supported HTML tags, see \fBscrolledhtml(n)\fR.
+
+.SH "METHODS"
+.PP
+The \fBiwidgets::hyperhelp\fR command creates a new Tcl command whose
+name is \fIpathName\fR. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIOption\fR and the \fIarg\fRs
+determine the exact behavior of the command. The following
+commands are possible for dialog widgets:
+.SH "INHERITED METHODS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBactivate\fR \fBcenter\fR \fBchildsite\fR \fBdeactivate\fR
+.fi
+.LP
+See the "shell" manual entry for details on the above inherited methods.
+
+.SH "WIDGET-SPECIFIC METHODS"
+.TP
+\fIpathName \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given
+by \fIoption\fR.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::hyperhelp\fR
+command.
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR?
+Query or modify the configuration options of the widget.
+If no \fIoption\fR is specified, returns a list describing all of
+the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for
+information on the format of this list). If \fIoption\fR is specified
+with no \fIvalue\fR, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no \fIoption\fR is specified). If
+one or more \fIoption\-value\fR pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::hyperhelp\fR
+command.
+.TP
+\fIpathName\fR \fBshowtopic\fR \fItopic\fR
+Display html file \fBhelpdir\fR/\fItopic\fR.html. \fITopic\fR may
+optionally be of the form \fItopicname\fR#\fIanchorname\fR. In
+this form, either \fItopicname\fR or \fIanchorname\fR or both may be empty. If
+\fItopicname\fR is empty, the current topic is assumed. If \fIanchorname\fR
+is empty, the top of the document is assumed
+.TP
+\fIpathName\fR \fBfollowlink\fR \fIhref\fR
+Display html file \fIhref\fR. \fIHref\fR may
+be optionally be of the form \fIfilename\fR#\fIanchorname\fR. In
+this form, either \fIfilename\fR or \fIanchorname\fR or both may be empty. If
+\fIfilename\fR is empty, the current document is assumed. If \fIanchorname\fR
+is empty, the top of the document is assumed.
+.TP
+\fIpathName\fR \fBforward\fR
+Display html file one forward in history list, if applicable.
+.TP
+\fIpathName\fR \fBback\fR
+Display html file one back in history list, if applicable.
+
+.SH EXAMPLE
+.DS
+ package require Iwidgets 4.0
+ iwidgets::hyperhelp .h -topics { Intro Help } -helpdir ~/help
+ .h showtopic Intro
+
+.DE
+.SH AUTHOR
+Kris Raney
+.SH KEYWORDS
+hyperhelp, html, help, shell, widget
diff --git a/iwidgets/doc/iwidgets.ps b/iwidgets/doc/iwidgets.ps
new file mode 100644
index 00000000000..4880e2e0355
--- /dev/null
+++ b/iwidgets/doc/iwidgets.ps
@@ -0,0 +1,13149 @@
+%!PS-Adobe-3.0
+%%BoundingBox: (atend)
+%%Pages: (atend)
+%%PageOrder: (atend)
+%%DocumentFonts: (atend)
+%%Creator: Frame 4.0
+%%DocumentData: Clean7Bit
+%%EndComments
+%%BeginProlog
+%
+% Frame ps_prolog 4.0, for use with Frame 4.0 products
+% This ps_prolog file is Copyright (c) 1986-1993 Frame Technology
+% Corporation. All rights reserved. This ps_prolog file may be
+% freely copied and distributed in conjunction with documents created
+% using FrameMaker, FrameBuilder and FrameViewer as long as this
+% copyright notice is preserved.
+%
+% Frame products normally print colors as their true color on a color printer
+% or as shades of gray, based on luminance, on a black-and white printer. The
+% following flag, if set to True, forces all non-white colors to print as pure
+% black. This has no effect on bitmap images.
+/FMPrintAllColorsAsBlack true def
+%
+% Frame products can either set their own line screens or use a printer's
+% default settings. Three flags below control this separately for no
+% separations, spot separations and process separations. If a flag
+% is true, then the default printer settings will not be changed. If it is
+% false, Frame products will use their own settings from a table based on
+% the printer's resolution.
+/FMUseDefaultNoSeparationScreen true def
+/FMUseDefaultSpotSeparationScreen true def
+/FMUseDefaultProcessSeparationScreen false def
+%
+% For any given PostScript printer resolution, Frame products have two sets of
+% screen angles and frequencies for printing process separations, which are
+% recomended by Adobe. The following variable chooses the higher frequencies
+% when set to true or the lower frequencies when set to false. This is only
+% effective if the appropriate FMUseDefault...SeparationScreen flag is false.
+/FMUseHighFrequencyScreens true def
+%
+% PostScript Level 2 printers contain an "Accurate Screens" feature which can
+% improve process separation rendering at the expense of compute time. This
+% flag is ignored by PostScript Level 1 printers.
+/FMUseAcccurateScreens true def
+%
+% The following PostScript procedure defines the spot function that Frame
+% products will use for process separations. You may un-comment-out one of
+% the alternative functions below, or use your own.
+%
+% Dot function
+/FMSpotFunction {abs exch abs 2 copy add 1 gt
+ {1 sub dup mul exch 1 sub dup mul add 1 sub }
+ {dup mul exch dup mul add 1 exch sub }ifelse } def
+%
+% Line function
+% /FMSpotFunction { pop } def
+%
+% Elipse function
+% /FMSpotFunction { dup 5 mul 8 div mul exch dup mul exch add
+% sqrt 1 exch sub } def
+%
+%
+/FMversion (4.0) def
+/FMLevel1 /languagelevel where {pop languagelevel} {1} ifelse 2 lt def
+/FMPColor
+ FMLevel1 {
+ false
+ /colorimage where {pop pop true} if
+ } {
+ true
+ } ifelse
+def
+/FrameDict 400 dict def
+systemdict /errordict known not {/errordict 10 dict def
+ errordict /rangecheck {stop} put} if
+% The readline in PS 23.0 doesn't recognize cr's as nl's on AppleTalk
+FrameDict /tmprangecheck errordict /rangecheck get put
+errordict /rangecheck {FrameDict /bug true put} put
+FrameDict /bug false put
+mark
+% Some PS machines read past the CR, so keep the following 3 lines together!
+currentfile 5 string readline
+00
+0000000000
+cleartomark
+errordict /rangecheck FrameDict /tmprangecheck get put
+FrameDict /bug get {
+ /readline {
+ /gstring exch def
+ /gfile exch def
+ /gindex 0 def
+ {
+ gfile read pop
+ dup 10 eq {exit} if
+ dup 13 eq {exit} if
+ gstring exch gindex exch put
+ /gindex gindex 1 add def
+ } loop
+ pop
+ gstring 0 gindex getinterval true
+ } bind def
+ } if
+/FMshowpage /showpage load def
+/FMquit /quit load def
+/FMFAILURE {
+ dup = flush
+ FMshowpage
+ /Helvetica findfont 12 scalefont setfont
+ 72 200 moveto
+ show FMshowpage
+ FMquit
+ } def
+/FMVERSION {
+ FMversion ne {
+ (Frame product version does not match ps_prolog!) FMFAILURE
+ } if
+ } def
+/FMBADEPSF {
+ (PostScript Lang. Ref. Man., 2nd Ed., H.2.4 says EPS must not call X )
+ dup dup (X) search pop exch pop exch pop length
+ 4 -1 roll
+ putinterval
+ FMFAILURE
+ } def
+/FMLOCAL {
+ FrameDict begin
+ 0 def
+ end
+ } def
+/concatprocs
+ {
+ /proc2 exch cvlit def/proc1 exch cvlit def/newproc proc1 length proc2 length add array def
+ newproc 0 proc1 putinterval newproc proc1 length proc2 putinterval newproc cvx
+}def
+FrameDict begin
+/FMnone 0 def
+/FMcyan 1 def
+/FMmagenta 2 def
+/FMyellow 3 def
+/FMblack 4 def
+/FMcustom 5 def
+/FrameNegative false def
+/FrameSepIs FMnone def
+/FrameSepBlack 0 def
+/FrameSepYellow 0 def
+/FrameSepMagenta 0 def
+/FrameSepCyan 0 def
+/FrameSepRed 1 def
+/FrameSepGreen 1 def
+/FrameSepBlue 1 def
+/FrameCurGray 1 def
+/FrameCurPat null def
+/FrameCurColors [ 0 0 0 1 0 0 0 ] def
+/FrameColorEpsilon .001 def
+/eqepsilon {
+ sub dup 0 lt {neg} if
+ FrameColorEpsilon le
+} bind def
+/FrameCmpColorsCMYK {
+ 2 copy 0 get exch 0 get eqepsilon {
+ 2 copy 1 get exch 1 get eqepsilon {
+ 2 copy 2 get exch 2 get eqepsilon {
+ 3 get exch 3 get eqepsilon
+ } {pop pop false} ifelse
+ }{pop pop false} ifelse
+ } {pop pop false} ifelse
+} bind def
+/FrameCmpColorsRGB {
+ 2 copy 4 get exch 0 get eqepsilon {
+ 2 copy 5 get exch 1 get eqepsilon {
+ 6 get exch 2 get eqepsilon
+ }{pop pop false} ifelse
+ } {pop pop false} ifelse
+} bind def
+/RGBtoCMYK {
+ 1 exch sub
+ 3 1 roll
+ 1 exch sub
+ 3 1 roll
+ 1 exch sub
+ 3 1 roll
+ 3 copy
+ 2 copy
+ le { pop } { exch pop } ifelse
+ 2 copy
+ le { pop } { exch pop } ifelse
+ dup dup dup
+ 6 1 roll
+ 4 1 roll
+ 7 1 roll
+ sub
+ 6 1 roll
+ sub
+ 5 1 roll
+ sub
+ 4 1 roll
+} bind def
+/CMYKtoRGB {
+ dup dup 4 -1 roll add
+ 5 1 roll 3 -1 roll add
+ 4 1 roll add
+ 1 exch sub dup 0 lt {pop 0} if 3 1 roll
+ 1 exch sub dup 0 lt {pop 0} if exch
+ 1 exch sub dup 0 lt {pop 0} if exch
+} bind def
+/FrameSepInit {
+ 1.0 RealSetgray
+} bind def
+/FrameSetSepColor {
+ /FrameSepBlue exch def
+ /FrameSepGreen exch def
+ /FrameSepRed exch def
+ /FrameSepBlack exch def
+ /FrameSepYellow exch def
+ /FrameSepMagenta exch def
+ /FrameSepCyan exch def
+ /FrameSepIs FMcustom def
+ setCurrentScreen
+} bind def
+/FrameSetCyan {
+ /FrameSepBlue 1.0 def
+ /FrameSepGreen 1.0 def
+ /FrameSepRed 0.0 def
+ /FrameSepBlack 0.0 def
+ /FrameSepYellow 0.0 def
+ /FrameSepMagenta 0.0 def
+ /FrameSepCyan 1.0 def
+ /FrameSepIs FMcyan def
+ setCurrentScreen
+} bind def
+
+/FrameSetMagenta {
+ /FrameSepBlue 1.0 def
+ /FrameSepGreen 0.0 def
+ /FrameSepRed 1.0 def
+ /FrameSepBlack 0.0 def
+ /FrameSepYellow 0.0 def
+ /FrameSepMagenta 1.0 def
+ /FrameSepCyan 0.0 def
+ /FrameSepIs FMmagenta def
+ setCurrentScreen
+} bind def
+
+/FrameSetYellow {
+ /FrameSepBlue 0.0 def
+ /FrameSepGreen 1.0 def
+ /FrameSepRed 1.0 def
+ /FrameSepBlack 0.0 def
+ /FrameSepYellow 1.0 def
+ /FrameSepMagenta 0.0 def
+ /FrameSepCyan 0.0 def
+ /FrameSepIs FMyellow def
+ setCurrentScreen
+} bind def
+
+/FrameSetBlack {
+ /FrameSepBlue 0.0 def
+ /FrameSepGreen 0.0 def
+ /FrameSepRed 0.0 def
+ /FrameSepBlack 1.0 def
+ /FrameSepYellow 0.0 def
+ /FrameSepMagenta 0.0 def
+ /FrameSepCyan 0.0 def
+ /FrameSepIs FMblack def
+ setCurrentScreen
+} bind def
+
+/FrameNoSep {
+ /FrameSepIs FMnone def
+ setCurrentScreen
+} bind def
+/FrameSetSepColors {
+ FrameDict begin
+ [ exch 1 add 1 roll ]
+ /FrameSepColors
+ exch def end
+ } bind def
+/FrameColorInSepListCMYK {
+ FrameSepColors {
+ exch dup 3 -1 roll
+ FrameCmpColorsCMYK
+ { pop true exit } if
+ } forall
+ dup true ne {pop false} if
+ } bind def
+/FrameColorInSepListRGB {
+ FrameSepColors {
+ exch dup 3 -1 roll
+ FrameCmpColorsRGB
+ { pop true exit } if
+ } forall
+ dup true ne {pop false} if
+ } bind def
+/RealSetgray /setgray load def
+/RealSetrgbcolor /setrgbcolor load def
+/RealSethsbcolor /sethsbcolor load def
+end
+/setgray {
+ FrameDict begin
+ FrameSepIs FMnone eq
+ { RealSetgray }
+ {
+ FrameSepIs FMblack eq
+ { RealSetgray }
+ { FrameSepIs FMcustom eq
+ FrameSepRed 0 eq and
+ FrameSepGreen 0 eq and
+ FrameSepBlue 0 eq and {
+ RealSetgray
+ } {
+ 1 RealSetgray pop
+ } ifelse
+ } ifelse
+ } ifelse
+ end
+} bind def
+/setrgbcolor {
+ FrameDict begin
+ FrameSepIs FMnone eq
+ { RealSetrgbcolor }
+ {
+ 3 copy [ 4 1 roll ]
+ FrameColorInSepListRGB
+ {
+ FrameSepBlue eq exch
+ FrameSepGreen eq and exch
+ FrameSepRed eq and
+ { 0 } { 1 } ifelse
+ }
+ {
+ FMPColor {
+ RealSetrgbcolor
+ currentcmykcolor
+ } {
+ RGBtoCMYK
+ } ifelse
+ FrameSepIs FMblack eq
+ {1.0 exch sub 4 1 roll pop pop pop} {
+ FrameSepIs FMyellow eq
+ {pop 1.0 exch sub 3 1 roll pop pop} {
+ FrameSepIs FMmagenta eq
+ {pop pop 1.0 exch sub exch pop } {
+ FrameSepIs FMcyan eq
+ {pop pop pop 1.0 exch sub }
+ {pop pop pop pop 1} ifelse } ifelse } ifelse } ifelse
+ } ifelse
+ RealSetgray
+ }
+ ifelse
+ end
+} bind def
+/sethsbcolor {
+ FrameDict begin
+ FrameSepIs FMnone eq
+ { RealSethsbcolor }
+ {
+ RealSethsbcolor
+ currentrgbcolor
+ setrgbcolor
+ }
+ ifelse
+ end
+} bind def
+FrameDict begin
+/setcmykcolor where {
+ pop /RealSetcmykcolor /setcmykcolor load def
+} {
+ /RealSetcmykcolor {
+ 4 1 roll
+ 3 { 3 index add 0 max 1 min 1 exch sub 3 1 roll} repeat
+ setrgbcolor pop
+ } bind def
+} ifelse
+userdict /setcmykcolor {
+ FrameDict begin
+ FrameSepIs FMnone eq
+ { RealSetcmykcolor }
+ {
+ 4 copy [ 5 1 roll ]
+ FrameColorInSepListCMYK
+ {
+ FrameSepBlack eq exch
+ FrameSepYellow eq and exch
+ FrameSepMagenta eq and exch
+ FrameSepCyan eq and
+ { 0 } { 1 } ifelse
+ }
+ {
+ FrameSepIs FMblack eq
+ {1.0 exch sub 4 1 roll pop pop pop} {
+ FrameSepIs FMyellow eq
+ {pop 1.0 exch sub 3 1 roll pop pop} {
+ FrameSepIs FMmagenta eq
+ {pop pop 1.0 exch sub exch pop } {
+ FrameSepIs FMcyan eq
+ {pop pop pop 1.0 exch sub }
+ {pop pop pop pop 1} ifelse } ifelse } ifelse } ifelse
+ } ifelse
+ RealSetgray
+ }
+ ifelse
+ end
+ } bind put
+FMLevel1 not {
+
+ /patProcDict 5 dict dup begin
+ <0f1e3c78f0e1c387> { 3 setlinewidth -1 -1 moveto 9 9 lineto stroke
+ 4 -4 moveto 12 4 lineto stroke
+ -4 4 moveto 4 12 lineto stroke} bind def
+ <0f87c3e1f0783c1e> { 3 setlinewidth -1 9 moveto 9 -1 lineto stroke
+ -4 4 moveto 4 -4 lineto stroke
+ 4 12 moveto 12 4 lineto stroke} bind def
+ <8142241818244281> { 1 setlinewidth -1 9 moveto 9 -1 lineto stroke
+ -1 -1 moveto 9 9 lineto stroke } bind def
+ <03060c183060c081> { 1 setlinewidth -1 -1 moveto 9 9 lineto stroke
+ 4 -4 moveto 12 4 lineto stroke
+ -4 4 moveto 4 12 lineto stroke} bind def
+ <8040201008040201> { 1 setlinewidth -1 9 moveto 9 -1 lineto stroke
+ -4 4 moveto 4 -4 lineto stroke
+ 4 12 moveto 12 4 lineto stroke} bind def
+ end def
+ /patDict 15 dict dup begin
+ /PatternType 1 def
+ /PaintType 2 def
+ /TilingType 3 def
+ /BBox [ 0 0 8 8 ] def
+ /XStep 8 def
+ /YStep 8 def
+ /PaintProc {
+ begin
+ patProcDict bstring known {
+ patProcDict bstring get exec
+ } {
+ 8 8 true [1 0 0 -1 0 8] bstring imagemask
+ } ifelse
+ end
+ } bind def
+ end def
+} if
+/combineColor {
+ FrameSepIs FMnone eq
+ {
+ graymode FMLevel1 or not {
+
+ [/Pattern [/DeviceCMYK]] setcolorspace
+ FrameCurColors 0 4 getinterval aload pop FrameCurPat setcolor
+ } {
+ FrameCurColors 3 get 1.0 ge {
+ FrameCurGray RealSetgray
+ } {
+ FMPColor graymode and {
+ 0 1 3 {
+ FrameCurColors exch get
+ 1 FrameCurGray sub mul
+ } for
+ RealSetcmykcolor
+ } {
+ 4 1 6 {
+ FrameCurColors exch get
+ graymode {
+ 1 exch sub 1 FrameCurGray sub mul 1 exch sub
+ } {
+ 1.0 lt {FrameCurGray} {1} ifelse
+ } ifelse
+ } for
+ RealSetrgbcolor
+ } ifelse
+ } ifelse
+ } ifelse
+ } {
+ FrameCurColors 0 4 getinterval aload
+ FrameColorInSepListCMYK {
+ FrameSepBlack eq exch
+ FrameSepYellow eq and exch
+ FrameSepMagenta eq and exch
+ FrameSepCyan eq and
+ FrameSepIs FMcustom eq and
+ { FrameCurGray } { 1 } ifelse
+ } {
+ FrameSepIs FMblack eq
+ {FrameCurGray 1.0 exch sub mul 1.0 exch sub 4 1 roll pop pop pop} {
+ FrameSepIs FMyellow eq
+ {pop FrameCurGray 1.0 exch sub mul 1.0 exch sub 3 1 roll pop pop} {
+ FrameSepIs FMmagenta eq
+ {pop pop FrameCurGray 1.0 exch sub mul 1.0 exch sub exch pop } {
+ FrameSepIs FMcyan eq
+ {pop pop pop FrameCurGray 1.0 exch sub mul 1.0 exch sub }
+ {pop pop pop pop 1} ifelse } ifelse } ifelse } ifelse
+ } ifelse
+ graymode FMLevel1 or not {
+
+ [/Pattern [/DeviceGray]] setcolorspace
+ FrameCurPat setcolor
+ } {
+ graymode not FMLevel1 and {
+
+ dup 1 lt {pop FrameCurGray} if
+ } if
+ RealSetgray
+ } ifelse
+ } ifelse
+} bind def
+/savematrix {
+ orgmatrix currentmatrix pop
+ } bind def
+/restorematrix {
+ orgmatrix setmatrix
+ } bind def
+/dmatrix matrix def
+/dpi 72 0 dmatrix defaultmatrix dtransform
+ dup mul exch dup mul add sqrt def
+
+/freq dpi dup 72 div round dup 0 eq {pop 1} if 8 mul div def
+/sangle 1 0 dmatrix defaultmatrix dtransform exch atan def
+/dpiranges [ 2540 2400 1693 1270 1200 635 600 0 ] def
+/CMLowFreqs [ 100.402 94.8683 89.2289 100.402 94.8683 66.9349 63.2456 47.4342 ] def
+/YLowFreqs [ 95.25 90.0 84.65 95.25 90.0 70.5556 66.6667 50.0 ] def
+/KLowFreqs [ 89.8026 84.8528 79.8088 89.8026 84.8528 74.8355 70.7107 53.033 ] def
+/CLowAngles [ 71.5651 71.5651 71.5651 71.5651 71.5651 71.5651 71.5651 71.5651 ] def
+/MLowAngles [ 18.4349 18.4349 18.4349 18.4349 18.4349 18.4349 18.4349 18.4349 ] def
+/YLowTDot [ true true false true true false false false ] def
+/CMHighFreqs [ 133.87 126.491 133.843 108.503 102.523 100.402 94.8683 63.2456 ] def
+/YHighFreqs [ 127.0 120.0 126.975 115.455 109.091 95.25 90.0 60.0 ] def
+/KHighFreqs [ 119.737 113.137 119.713 128.289 121.218 89.8026 84.8528 63.6395 ] def
+/CHighAngles [ 71.5651 71.5651 71.5651 70.0169 70.0169 71.5651 71.5651 71.5651 ] def
+/MHighAngles [ 18.4349 18.4349 18.4349 19.9831 19.9831 18.4349 18.4349 18.4349 ] def
+/YHighTDot [ false false true false false true true false ] def
+/PatFreq [ 10.5833 10.0 9.4055 10.5833 10.0 10.5833 10.0 9.375 ] def
+/screenIndex {
+ 0 1 dpiranges length 1 sub { dup dpiranges exch get 1 sub dpi le {exit} {pop} ifelse } for
+} bind def
+/getCyanScreen {
+ FMUseHighFrequencyScreens { CHighAngles CMHighFreqs} {CLowAngles CMLowFreqs} ifelse
+ screenIndex dup 3 1 roll get 3 1 roll get /FMSpotFunction load
+} bind def
+/getMagentaScreen {
+ FMUseHighFrequencyScreens { MHighAngles CMHighFreqs } {MLowAngles CMLowFreqs} ifelse
+ screenIndex dup 3 1 roll get 3 1 roll get /FMSpotFunction load
+} bind def
+/getYellowScreen {
+ FMUseHighFrequencyScreens { YHighTDot YHighFreqs} { YLowTDot YLowFreqs } ifelse
+ screenIndex dup 3 1 roll get 3 1 roll get { 3 div
+ {2 { 1 add 2 div 3 mul dup floor sub 2 mul 1 sub exch} repeat
+ FMSpotFunction } } {/FMSpotFunction load } ifelse
+ 0.0 exch
+} bind def
+/getBlackScreen {
+ FMUseHighFrequencyScreens { KHighFreqs } { KLowFreqs } ifelse
+ screenIndex get 45.0 /FMSpotFunction load
+} bind def
+/getSpotScreen {
+ getBlackScreen
+} bind def
+/getCompositeScreen {
+ getBlackScreen
+} bind def
+/FMSetScreen
+ FMLevel1 { /setscreen load
+ }{ {
+ 8 dict begin
+ /HalftoneType 1 def
+ /SpotFunction exch def
+ /Angle exch def
+ /Frequency exch def
+ /AccurateScreens FMUseAcccurateScreens def
+ currentdict end sethalftone
+ } bind } ifelse
+def
+/setDefaultScreen {
+ FMPColor {
+ orgrxfer cvx orggxfer cvx orgbxfer cvx orgxfer cvx setcolortransfer
+ }
+ {
+ orgxfer cvx settransfer
+ } ifelse
+ orgfreq organgle orgproc cvx setscreen
+} bind def
+/setCurrentScreen {
+ FrameSepIs FMnone eq {
+ FMUseDefaultNoSeparationScreen {
+ setDefaultScreen
+ } {
+ getCompositeScreen FMSetScreen
+ } ifelse
+ } {
+ FrameSepIs FMcustom eq {
+ FMUseDefaultSpotSeparationScreen {
+ setDefaultScreen
+ } {
+ getSpotScreen FMSetScreen
+ } ifelse
+ } {
+ FMUseDefaultProcessSeparationScreen {
+ setDefaultScreen
+ } {
+ FrameSepIs FMcyan eq {
+ getCyanScreen FMSetScreen
+ } {
+ FrameSepIs FMmagenta eq {
+ getMagentaScreen FMSetScreen
+ } {
+ FrameSepIs FMyellow eq {
+ getYellowScreen FMSetScreen
+ } {
+ getBlackScreen FMSetScreen
+ } ifelse
+ } ifelse
+ } ifelse
+ } ifelse
+ } ifelse
+ } ifelse
+} bind def
+end
+ /gstring FMLOCAL
+ /gfile FMLOCAL
+ /gindex FMLOCAL
+ /orgrxfer FMLOCAL
+ /orggxfer FMLOCAL
+ /orgbxfer FMLOCAL
+ /orgxfer FMLOCAL
+ /orgproc FMLOCAL
+ /orgrproc FMLOCAL
+ /orggproc FMLOCAL
+ /orgbproc FMLOCAL
+ /organgle FMLOCAL
+ /orgrangle FMLOCAL
+ /orggangle FMLOCAL
+ /orgbangle FMLOCAL
+ /orgfreq FMLOCAL
+ /orgrfreq FMLOCAL
+ /orggfreq FMLOCAL
+ /orgbfreq FMLOCAL
+ /yscale FMLOCAL
+ /xscale FMLOCAL
+ /edown FMLOCAL
+ /manualfeed FMLOCAL
+ /paperheight FMLOCAL
+ /paperwidth FMLOCAL
+/FMDOCUMENT {
+ array /FMfonts exch def
+ /#copies exch def
+ FrameDict begin
+ 0 ne /manualfeed exch def
+ /paperheight exch def
+ /paperwidth exch def
+ 0 ne /FrameNegative exch def
+ 0 ne /edown exch def
+ /yscale exch def
+ /xscale exch def
+ FMLevel1 {
+ manualfeed {setmanualfeed} if
+ /FMdicttop countdictstack 1 add def
+ /FMoptop count def
+ setpapername
+ manualfeed {true} {papersize} ifelse
+ {manualpapersize} {false} ifelse
+ {desperatepapersize} {false} ifelse
+ { (Can't select requested paper size for Frame print job!) FMFAILURE } if
+ count -1 FMoptop {pop pop} for
+ countdictstack -1 FMdicttop {pop end} for
+ }
+ {{1 dict dup /PageSize [paperwidth paperheight]put setpagedevice}stopped
+ { (Can't select requested paper size for Frame print job!) FMFAILURE } if
+ {1 dict dup /ManualFeed manualfeed put setpagedevice } stopped pop }
+ ifelse
+
+ FMPColor {
+ currentcolorscreen
+ cvlit /orgproc exch def
+ /organgle exch def
+ /orgfreq exch def
+ cvlit /orgbproc exch def
+ /orgbangle exch def
+ /orgbfreq exch def
+ cvlit /orggproc exch def
+ /orggangle exch def
+ /orggfreq exch def
+ cvlit /orgrproc exch def
+ /orgrangle exch def
+ /orgrfreq exch def
+ currentcolortransfer
+ FrameNegative {
+ 1 1 4 {
+ pop { 1 exch sub } concatprocs 4 1 roll
+ } for
+ 4 copy
+ setcolortransfer
+ } if
+ cvlit /orgxfer exch def
+ cvlit /orgbxfer exch def
+ cvlit /orggxfer exch def
+ cvlit /orgrxfer exch def
+ } {
+ currentscreen
+ cvlit /orgproc exch def
+ /organgle exch def
+ /orgfreq exch def
+
+ currenttransfer
+ FrameNegative {
+ { 1 exch sub } concatprocs
+ dup settransfer
+ } if
+ cvlit /orgxfer exch def
+ } ifelse
+ end
+} def
+/pagesave FMLOCAL
+/orgmatrix FMLOCAL
+/landscape FMLOCAL
+/pwid FMLOCAL
+/FMBEGINPAGE {
+ FrameDict begin
+ /pagesave save def
+ 3.86 setmiterlimit
+ /landscape exch 0 ne def
+ landscape {
+ 90 rotate 0 exch dup /pwid exch def neg translate pop
+ }{
+ pop /pwid exch def
+ } ifelse
+ edown { [-1 0 0 1 pwid 0] concat } if
+ 0 0 moveto paperwidth 0 lineto paperwidth paperheight lineto
+ 0 paperheight lineto 0 0 lineto 1 setgray fill
+ xscale yscale scale
+ /orgmatrix matrix def
+ gsave
+} def
+/FMENDPAGE {
+ grestore
+ pagesave restore
+ end
+ showpage
+ } def
+/FMFONTDEFINE {
+ FrameDict begin
+ findfont
+ ReEncode
+ 1 index exch
+ definefont
+ FMfonts 3 1 roll
+ put
+ end
+ } def
+/FMFILLS {
+ FrameDict begin dup
+ array /fillvals exch def
+ dict /patCache exch def
+ end
+ } def
+/FMFILL {
+ FrameDict begin
+ fillvals 3 1 roll put
+ end
+ } def
+/FMNORMALIZEGRAPHICS {
+ newpath
+ 0.0 0.0 moveto
+ 1 setlinewidth
+ 0 setlinecap
+ 0 0 0 sethsbcolor
+ 0 setgray
+ } bind def
+ /fx FMLOCAL
+ /fy FMLOCAL
+ /fh FMLOCAL
+ /fw FMLOCAL
+ /llx FMLOCAL
+ /lly FMLOCAL
+ /urx FMLOCAL
+ /ury FMLOCAL
+/FMBEGINEPSF {
+ end
+ /FMEPSF save def
+ /showpage {} def
+% See Adobe's "PostScript Language Reference Manual, 2nd Edition", page 714.
+% "...the following operators MUST NOT be used in an EPS file:" (emphasis ours)
+ /banddevice {(banddevice) FMBADEPSF} def
+ /clear {(clear) FMBADEPSF} def
+ /cleardictstack {(cleardictstack) FMBADEPSF} def
+ /copypage {(copypage) FMBADEPSF} def
+ /erasepage {(erasepage) FMBADEPSF} def
+ /exitserver {(exitserver) FMBADEPSF} def
+ /framedevice {(framedevice) FMBADEPSF} def
+ /grestoreall {(grestoreall) FMBADEPSF} def
+ /initclip {(initclip) FMBADEPSF} def
+ /initgraphics {(initgraphics) FMBADEPSF} def
+ /initmatrix {(initmatrix) FMBADEPSF} def
+ /quit {(quit) FMBADEPSF} def
+ /renderbands {(renderbands) FMBADEPSF} def
+ /setglobal {(setglobal) FMBADEPSF} def
+ /setpagedevice {(setpagedevice) FMBADEPSF} def
+ /setshared {(setshared) FMBADEPSF} def
+ /startjob {(startjob) FMBADEPSF} def
+ /lettertray {(lettertray) FMBADEPSF} def
+ /letter {(letter) FMBADEPSF} def
+ /lettersmall {(lettersmall) FMBADEPSF} def
+ /11x17tray {(11x17tray) FMBADEPSF} def
+ /11x17 {(11x17) FMBADEPSF} def
+ /ledgertray {(ledgertray) FMBADEPSF} def
+ /ledger {(ledger) FMBADEPSF} def
+ /legaltray {(legaltray) FMBADEPSF} def
+ /legal {(legal) FMBADEPSF} def
+ /statementtray {(statementtray) FMBADEPSF} def
+ /statement {(statement) FMBADEPSF} def
+ /executivetray {(executivetray) FMBADEPSF} def
+ /executive {(executive) FMBADEPSF} def
+ /a3tray {(a3tray) FMBADEPSF} def
+ /a3 {(a3) FMBADEPSF} def
+ /a4tray {(a4tray) FMBADEPSF} def
+ /a4 {(a4) FMBADEPSF} def
+ /a4small {(a4small) FMBADEPSF} def
+ /b4tray {(b4tray) FMBADEPSF} def
+ /b4 {(b4) FMBADEPSF} def
+ /b5tray {(b5tray) FMBADEPSF} def
+ /b5 {(b5) FMBADEPSF} def
+ FMNORMALIZEGRAPHICS
+ [/fy /fx /fh /fw /ury /urx /lly /llx] {exch def} forall
+ fx fw 2 div add fy fh 2 div add translate
+ rotate
+ fw 2 div neg fh 2 div neg translate
+ fw urx llx sub div fh ury lly sub div scale
+ llx neg lly neg translate
+ /FMdicttop countdictstack 1 add def
+ /FMoptop count def
+ } bind def
+/FMENDEPSF {
+ count -1 FMoptop {pop pop} for
+ countdictstack -1 FMdicttop {pop end} for
+ FMEPSF restore
+ FrameDict begin
+ } bind def
+FrameDict begin
+/setmanualfeed {
+%%BeginFeature *ManualFeed True
+ statusdict /manualfeed true put
+%%EndFeature
+ } bind def
+/max {2 copy lt {exch} if pop} bind def
+/min {2 copy gt {exch} if pop} bind def
+/inch {72 mul} def
+/pagedimen {
+ paperheight sub abs 16 lt exch
+ paperwidth sub abs 16 lt and
+ {/papername exch def} {pop} ifelse
+ } bind def
+ /papersizedict FMLOCAL
+/setpapername {
+ /papersizedict 14 dict def
+ papersizedict begin
+ /papername /unknown def
+ /Letter 8.5 inch 11.0 inch pagedimen
+ /LetterSmall 7.68 inch 10.16 inch pagedimen
+ /Tabloid 11.0 inch 17.0 inch pagedimen
+ /Ledger 17.0 inch 11.0 inch pagedimen
+ /Legal 8.5 inch 14.0 inch pagedimen
+ /Statement 5.5 inch 8.5 inch pagedimen
+ /Executive 7.5 inch 10.0 inch pagedimen
+ /A3 11.69 inch 16.5 inch pagedimen
+ /A4 8.26 inch 11.69 inch pagedimen
+ /A4Small 7.47 inch 10.85 inch pagedimen
+ /B4 10.125 inch 14.33 inch pagedimen
+ /B5 7.16 inch 10.125 inch pagedimen
+ end
+ } bind def
+/papersize {
+ papersizedict begin
+ /Letter {lettertray letter} def
+ /LetterSmall {lettertray lettersmall} def
+ /Tabloid {11x17tray 11x17} def
+ /Ledger {ledgertray ledger} def
+ /Legal {legaltray legal} def
+ /Statement {statementtray statement} def
+ /Executive {executivetray executive} def
+ /A3 {a3tray a3} def
+ /A4 {a4tray a4} def
+ /A4Small {a4tray a4small} def
+ /B4 {b4tray b4} def
+ /B5 {b5tray b5} def
+ /unknown {unknown} def
+ papersizedict dup papername known {papername} {/unknown} ifelse get
+ end
+ statusdict begin stopped end
+ } bind def
+/manualpapersize {
+ papersizedict begin
+ /Letter {letter} def
+ /LetterSmall {lettersmall} def
+ /Tabloid {11x17} def
+ /Ledger {ledger} def
+ /Legal {legal} def
+ /Statement {statement} def
+ /Executive {executive} def
+ /A3 {a3} def
+ /A4 {a4} def
+ /A4Small {a4small} def
+ /B4 {b4} def
+ /B5 {b5} def
+ /unknown {unknown} def
+ papersizedict dup papername known {papername} {/unknown} ifelse get
+ end
+ stopped
+ } bind def
+/desperatepapersize {
+ statusdict /setpageparams known
+ {
+ paperwidth paperheight 0 1
+ statusdict begin
+ {setpageparams} stopped
+ end
+ } {true} ifelse
+ } bind def
+/DiacriticEncoding [
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /space /exclam /quotedbl
+/numbersign /dollar /percent /ampersand /quotesingle /parenleft
+/parenright /asterisk /plus /comma /hyphen /period /slash /zero /one
+/two /three /four /five /six /seven /eight /nine /colon /semicolon
+/less /equal /greater /question /at /A /B /C /D /E /F /G /H /I /J /K
+/L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /backslash
+/bracketright /asciicircum /underscore /grave /a /b /c /d /e /f /g /h
+/i /j /k /l /m /n /o /p /q /r /s /t /u /v /w /x /y /z /braceleft /bar
+/braceright /asciitilde /.notdef /Adieresis /Aring /Ccedilla /Eacute
+/Ntilde /Odieresis /Udieresis /aacute /agrave /acircumflex /adieresis
+/atilde /aring /ccedilla /eacute /egrave /ecircumflex /edieresis
+/iacute /igrave /icircumflex /idieresis /ntilde /oacute /ograve
+/ocircumflex /odieresis /otilde /uacute /ugrave /ucircumflex
+/udieresis /dagger /.notdef /cent /sterling /section /bullet
+/paragraph /germandbls /registered /copyright /trademark /acute
+/dieresis /.notdef /AE /Oslash /.notdef /.notdef /.notdef /.notdef
+/yen /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/ordfeminine /ordmasculine /.notdef /ae /oslash /questiondown
+/exclamdown /logicalnot /.notdef /florin /.notdef /.notdef
+/guillemotleft /guillemotright /ellipsis /.notdef /Agrave /Atilde
+/Otilde /OE /oe /endash /emdash /quotedblleft /quotedblright
+/quoteleft /quoteright /.notdef /.notdef /ydieresis /Ydieresis
+/fraction /currency /guilsinglleft /guilsinglright /fi /fl /daggerdbl
+/periodcentered /quotesinglbase /quotedblbase /perthousand
+/Acircumflex /Ecircumflex /Aacute /Edieresis /Egrave /Iacute
+/Icircumflex /Idieresis /Igrave /Oacute /Ocircumflex /.notdef /Ograve
+/Uacute /Ucircumflex /Ugrave /dotlessi /circumflex /tilde /macron
+/breve /dotaccent /ring /cedilla /hungarumlaut /ogonek /caron
+] def
+/ReEncode {
+ dup
+ length
+ dict begin
+ {
+ 1 index /FID ne
+ {def}
+ {pop pop} ifelse
+ } forall
+ 0 eq {/Encoding DiacriticEncoding def} if
+ currentdict
+ end
+ } bind def
+FMPColor
+
+ {
+ /BEGINBITMAPCOLOR {
+ BITMAPCOLOR} def
+ /BEGINBITMAPCOLORc {
+ BITMAPGRAYc} def
+ /BEGINBITMAPTRUECOLOR {
+ BITMAPTRUECOLOR } def
+ /BEGINBITMAPTRUECOLORc {
+ BITMAPTRUECOLORc } def
+ }
+
+ {
+ /BEGINBITMAPCOLOR {
+ BITMAPGRAY} def
+ /BEGINBITMAPCOLORc {
+ BITMAPGRAYc} def
+ /BEGINBITMAPTRUECOLOR {
+ BITMAPTRUEGRAY } def
+ /BEGINBITMAPTRUECOLORc {
+ BITMAPTRUEGRAYc } def
+ }
+ifelse
+/K {
+ FMPrintAllColorsAsBlack {
+ dup 1 eq 2 index 1 eq and 3 index 1 eq and not
+ {7 {pop} repeat 0 0 0 1 0 0 0} if
+ } if
+ FrameCurColors astore
+ pop combineColor
+} bind def
+/graymode true def
+ /bwidth FMLOCAL
+ /bpside FMLOCAL
+ /bstring FMLOCAL
+ /onbits FMLOCAL
+ /offbits FMLOCAL
+ /xindex FMLOCAL
+ /yindex FMLOCAL
+ /x FMLOCAL
+ /y FMLOCAL
+/setPatternMode {
+ FMLevel1 {
+ /bwidth exch def
+ /bpside exch def
+ /bstring exch def
+ /onbits 0 def /offbits 0 def
+ freq sangle landscape {90 add} if
+ {/y exch def
+ /x exch def
+ /xindex x 1 add 2 div bpside mul cvi def
+ /yindex y 1 add 2 div bpside mul cvi def
+ bstring yindex bwidth mul xindex 8 idiv add get
+ 1 7 xindex 8 mod sub bitshift and 0 ne FrameNegative {not} if
+ {/onbits onbits 1 add def 1}
+ {/offbits offbits 1 add def 0}
+ ifelse
+ }
+ setscreen
+ offbits offbits onbits add div FrameNegative {1.0 exch sub} if
+ /FrameCurGray exch def
+ } {
+ pop pop
+ dup patCache exch known {
+ patCache exch get
+ } {
+ dup
+ patDict /bstring 3 -1 roll put
+ patDict
+ 9 PatFreq screenIndex get div dup matrix scale
+ makepattern
+ dup
+ patCache 4 -1 roll 3 -1 roll put
+ } ifelse
+ /FrameCurGray 0 def
+ /FrameCurPat exch def
+ } ifelse
+ /graymode false def
+ combineColor
+} bind def
+/setGrayScaleMode {
+ graymode not {
+ /graymode true def
+ FMLevel1 {
+ setCurrentScreen
+ } if
+ } if
+ /FrameCurGray exch def
+ combineColor
+} bind def
+/normalize {
+ transform round exch round exch itransform
+ } bind def
+/dnormalize {
+ dtransform round exch round exch idtransform
+ } bind def
+/lnormalize {
+ 0 dtransform exch cvi 2 idiv 2 mul 1 add exch idtransform pop
+ } bind def
+/H {
+ lnormalize setlinewidth
+ } bind def
+/Z {
+ setlinecap
+ } bind def
+
+/PFill {
+ graymode FMLevel1 or not {
+ gsave 1 setgray eofill grestore
+ } if
+} bind def
+/PStroke {
+ graymode FMLevel1 or not {
+ gsave 1 setgray stroke grestore
+ } if
+ stroke
+} bind def
+ /fillvals FMLOCAL
+/X {
+ fillvals exch get
+ dup type /stringtype eq
+ {8 1 setPatternMode}
+ {setGrayScaleMode}
+ ifelse
+ } bind def
+/V {
+ PFill gsave eofill grestore
+ } bind def
+/Vclip {
+ clip
+ } bind def
+/Vstrk {
+ currentlinewidth exch setlinewidth PStroke setlinewidth
+ } bind def
+/N {
+ PStroke
+ } bind def
+/Nclip {
+ strokepath clip newpath
+ } bind def
+/Nstrk {
+ currentlinewidth exch setlinewidth PStroke setlinewidth
+ } bind def
+/M {newpath moveto} bind def
+/E {lineto} bind def
+/D {curveto} bind def
+/O {closepath} bind def
+ /n FMLOCAL
+/L {
+ /n exch def
+ newpath
+ normalize
+ moveto
+ 2 1 n {pop normalize lineto} for
+ } bind def
+/Y {
+ L
+ closepath
+ } bind def
+ /x1 FMLOCAL
+ /x2 FMLOCAL
+ /y1 FMLOCAL
+ /y2 FMLOCAL
+/R {
+ /y2 exch def
+ /x2 exch def
+ /y1 exch def
+ /x1 exch def
+ x1 y1
+ x2 y1
+ x2 y2
+ x1 y2
+ 4 Y
+ } bind def
+ /rad FMLOCAL
+/rarc
+ {rad
+ arcto
+ } bind def
+/RR {
+ /rad exch def
+ normalize
+ /y2 exch def
+ /x2 exch def
+ normalize
+ /y1 exch def
+ /x1 exch def
+ mark
+ newpath
+ {
+ x1 y1 rad add moveto
+ x1 y2 x2 y2 rarc
+ x2 y2 x2 y1 rarc
+ x2 y1 x1 y1 rarc
+ x1 y1 x1 y2 rarc
+ closepath
+ } stopped {x1 y1 x2 y2 R} if
+ cleartomark
+ } bind def
+/RRR {
+ /rad exch def
+ normalize /y4 exch def /x4 exch def
+ normalize /y3 exch def /x3 exch def
+ normalize /y2 exch def /x2 exch def
+ normalize /y1 exch def /x1 exch def
+ newpath
+ normalize moveto
+ mark
+ {
+ x2 y2 x3 y3 rarc
+ x3 y3 x4 y4 rarc
+ x4 y4 x1 y1 rarc
+ x1 y1 x2 y2 rarc
+ closepath
+ } stopped
+ {x1 y1 x2 y2 x3 y3 x4 y4 newpath moveto lineto lineto lineto closepath} if
+ cleartomark
+ } bind def
+/C {
+ grestore
+ gsave
+ R
+ clip
+ setCurrentScreen
+} bind def
+/CP {
+ grestore
+ gsave
+ Y
+ clip
+ setCurrentScreen
+} bind def
+ /FMpointsize FMLOCAL
+/F {
+ FMfonts exch get
+ FMpointsize scalefont
+ setfont
+ } bind def
+/Q {
+ /FMpointsize exch def
+ F
+ } bind def
+/T {
+ moveto show
+ } bind def
+/RF {
+ rotate
+ 0 ne {-1 1 scale} if
+ } bind def
+/TF {
+ gsave
+ moveto
+ RF
+ show
+ grestore
+ } bind def
+/P {
+ moveto
+ 0 32 3 2 roll widthshow
+ } bind def
+/PF {
+ gsave
+ moveto
+ RF
+ 0 32 3 2 roll widthshow
+ grestore
+ } bind def
+/S {
+ moveto
+ 0 exch ashow
+ } bind def
+/SF {
+ gsave
+ moveto
+ RF
+ 0 exch ashow
+ grestore
+ } bind def
+/B {
+ moveto
+ 0 32 4 2 roll 0 exch awidthshow
+ } bind def
+/BF {
+ gsave
+ moveto
+ RF
+ 0 32 4 2 roll 0 exch awidthshow
+ grestore
+ } bind def
+/G {
+ gsave
+ newpath
+ normalize translate 0.0 0.0 moveto
+ dnormalize scale
+ 0.0 0.0 1.0 5 3 roll arc
+ closepath
+ PFill fill
+ grestore
+ } bind def
+/Gstrk {
+ savematrix
+ newpath
+ 2 index 2 div add exch 3 index 2 div sub exch
+ normalize 2 index 2 div sub exch 3 index 2 div add exch
+ translate
+ scale
+ 0.0 0.0 1.0 5 3 roll arc
+ restorematrix
+ currentlinewidth exch setlinewidth PStroke setlinewidth
+ } bind def
+/Gclip {
+ newpath
+ savematrix
+ normalize translate 0.0 0.0 moveto
+ dnormalize scale
+ 0.0 0.0 1.0 5 3 roll arc
+ closepath
+ clip newpath
+ restorematrix
+ } bind def
+/GG {
+ gsave
+ newpath
+ normalize translate 0.0 0.0 moveto
+ rotate
+ dnormalize scale
+ 0.0 0.0 1.0 5 3 roll arc
+ closepath
+ PFill
+ fill
+ grestore
+ } bind def
+/GGclip {
+ savematrix
+ newpath
+ normalize translate 0.0 0.0 moveto
+ rotate
+ dnormalize scale
+ 0.0 0.0 1.0 5 3 roll arc
+ closepath
+ clip newpath
+ restorematrix
+ } bind def
+/GGstrk {
+ savematrix
+ newpath
+ normalize translate 0.0 0.0 moveto
+ rotate
+ dnormalize scale
+ 0.0 0.0 1.0 5 3 roll arc
+ closepath
+ restorematrix
+ currentlinewidth exch setlinewidth PStroke setlinewidth
+ } bind def
+/A {
+ gsave
+ savematrix
+ newpath
+ 2 index 2 div add exch 3 index 2 div sub exch
+ normalize 2 index 2 div sub exch 3 index 2 div add exch
+ translate
+ scale
+ 0.0 0.0 1.0 5 3 roll arc
+ restorematrix
+ PStroke
+ grestore
+ } bind def
+/Aclip {
+ newpath
+ savematrix
+ normalize translate 0.0 0.0 moveto
+ dnormalize scale
+ 0.0 0.0 1.0 5 3 roll arc
+ closepath
+ strokepath clip newpath
+ restorematrix
+} bind def
+/Astrk {
+ Gstrk
+} bind def
+/AA {
+ gsave
+ savematrix
+ newpath
+
+ 3 index 2 div add exch 4 index 2 div sub exch
+
+ normalize 3 index 2 div sub exch 4 index 2 div add exch
+ translate
+ rotate
+ scale
+ 0.0 0.0 1.0 5 3 roll arc
+ restorematrix
+ PStroke
+ grestore
+ } bind def
+/AAclip {
+ savematrix
+ newpath
+ normalize translate 0.0 0.0 moveto
+ rotate
+ dnormalize scale
+ 0.0 0.0 1.0 5 3 roll arc
+ closepath
+ strokepath clip newpath
+ restorematrix
+} bind def
+/AAstrk {
+ GGstrk
+} bind def
+ /x FMLOCAL
+ /y FMLOCAL
+ /w FMLOCAL
+ /h FMLOCAL
+ /xx FMLOCAL
+ /yy FMLOCAL
+ /ww FMLOCAL
+ /hh FMLOCAL
+ /FMsaveobject FMLOCAL
+ /FMoptop FMLOCAL
+ /FMdicttop FMLOCAL
+/BEGINPRINTCODE {
+ /FMdicttop countdictstack 1 add def
+ /FMoptop count 7 sub def
+ /FMsaveobject save def
+ userdict begin
+ /showpage {} def
+ FMNORMALIZEGRAPHICS
+ 3 index neg 3 index neg translate
+ } bind def
+/ENDPRINTCODE {
+ count -1 FMoptop {pop pop} for
+ countdictstack -1 FMdicttop {pop end} for
+ FMsaveobject restore
+ } bind def
+/gn {
+ 0
+ { 46 mul
+ cf read pop
+ 32 sub
+ dup 46 lt {exit} if
+ 46 sub add
+ } loop
+ add
+ } bind def
+ /str FMLOCAL
+/cfs {
+ /str sl string def
+ 0 1 sl 1 sub {str exch val put} for
+ str def
+ } bind def
+/ic [
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0223
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0223
+ 0
+ {0 hx} {1 hx} {2 hx} {3 hx} {4 hx} {5 hx} {6 hx} {7 hx} {8 hx} {9 hx}
+ {10 hx} {11 hx} {12 hx} {13 hx} {14 hx} {15 hx} {16 hx} {17 hx} {18 hx}
+ {19 hx} {gn hx} {0} {1} {2} {3} {4} {5} {6} {7} {8} {9} {10} {11} {12}
+ {13} {14} {15} {16} {17} {18} {19} {gn} {0 wh} {1 wh} {2 wh} {3 wh}
+ {4 wh} {5 wh} {6 wh} {7 wh} {8 wh} {9 wh} {10 wh} {11 wh} {12 wh}
+ {13 wh} {14 wh} {gn wh} {0 bl} {1 bl} {2 bl} {3 bl} {4 bl} {5 bl} {6 bl}
+ {7 bl} {8 bl} {9 bl} {10 bl} {11 bl} {12 bl} {13 bl} {14 bl} {gn bl}
+ {0 fl} {1 fl} {2 fl} {3 fl} {4 fl} {5 fl} {6 fl} {7 fl} {8 fl} {9 fl}
+ {10 fl} {11 fl} {12 fl} {13 fl} {14 fl} {gn fl}
+ ] def
+ /sl FMLOCAL
+ /val FMLOCAL
+ /ws FMLOCAL
+ /im FMLOCAL
+ /bs FMLOCAL
+ /cs FMLOCAL
+ /len FMLOCAL
+ /pos FMLOCAL
+/ms {
+ /sl exch def
+ /val 255 def
+ /ws cfs
+ /im cfs
+ /val 0 def
+ /bs cfs
+ /cs cfs
+ } bind def
+400 ms
+/ip {
+ is
+ 0
+ cf cs readline pop
+ { ic exch get exec
+ add
+ } forall
+ pop
+
+ } bind def
+/rip {
+
+
+ bis ris copy pop
+ is
+ 0
+ cf cs readline pop
+ { ic exch get exec
+ add
+ } forall
+ pop pop
+ ris gis copy pop
+ dup is exch
+
+ cf cs readline pop
+ { ic exch get exec
+ add
+ } forall
+ pop pop
+ gis bis copy pop
+ dup add is exch
+
+ cf cs readline pop
+ { ic exch get exec
+ add
+ } forall
+ pop
+
+ } bind def
+/wh {
+ /len exch def
+ /pos exch def
+ ws 0 len getinterval im pos len getinterval copy pop
+ pos len
+ } bind def
+/bl {
+ /len exch def
+ /pos exch def
+ bs 0 len getinterval im pos len getinterval copy pop
+ pos len
+ } bind def
+/s1 1 string def
+/fl {
+ /len exch def
+ /pos exch def
+ /val cf s1 readhexstring pop 0 get def
+ pos 1 pos len add 1 sub {im exch val put} for
+ pos len
+ } bind def
+/hx {
+ 3 copy getinterval
+ cf exch readhexstring pop pop
+ } bind def
+ /h FMLOCAL
+ /w FMLOCAL
+ /d FMLOCAL
+ /lb FMLOCAL
+ /bitmapsave FMLOCAL
+ /is FMLOCAL
+ /cf FMLOCAL
+/wbytes {
+ dup dup
+ 24 eq { pop pop 3 mul }
+ { 8 eq {pop} {1 eq {7 add 8 idiv} {3 add 4 idiv} ifelse} ifelse } ifelse
+ } bind def
+/BEGINBITMAPBWc {
+ 1 {} COMMONBITMAPc
+ } bind def
+/BEGINBITMAPGRAYc {
+ 8 {} COMMONBITMAPc
+ } bind def
+/BEGINBITMAP2BITc {
+ 2 {} COMMONBITMAPc
+ } bind def
+/COMMONBITMAPc {
+
+ /r exch def
+ /d exch def
+ gsave
+
+ 3 index 2 div add exch
+ 4 index 2 div add exch
+ translate
+ rotate
+ 1 index 2 div neg
+ 1 index 2 div neg
+ translate
+ scale
+ /h exch def /w exch def
+ /lb w d wbytes def
+ sl lb lt {lb ms} if
+ /bitmapsave save def
+ r
+ /is im 0 lb getinterval def
+ ws 0 lb getinterval is copy pop
+ /cf currentfile def
+ w h d [w 0 0 h neg 0 h]
+ {ip} image
+ bitmapsave restore
+ grestore
+ } bind def
+/BEGINBITMAPBW {
+ 1 {} COMMONBITMAP
+ } bind def
+/BEGINBITMAPGRAY {
+ 8 {} COMMONBITMAP
+ } bind def
+/BEGINBITMAP2BIT {
+ 2 {} COMMONBITMAP
+ } bind def
+/COMMONBITMAP {
+ /r exch def
+ /d exch def
+ gsave
+
+ 3 index 2 div add exch
+ 4 index 2 div add exch
+ translate
+ rotate
+ 1 index 2 div neg
+ 1 index 2 div neg
+ translate
+ scale
+ /h exch def /w exch def
+ /bitmapsave save def
+ r
+ /is w d wbytes string def
+ /cf currentfile def
+ w h d [w 0 0 h neg 0 h]
+ {cf is readhexstring pop} image
+ bitmapsave restore
+ grestore
+ } bind def
+/ngrayt 256 array def
+/nredt 256 array def
+/nbluet 256 array def
+/ngreent 256 array def
+ /gryt FMLOCAL
+ /blut FMLOCAL
+ /grnt FMLOCAL
+ /redt FMLOCAL
+ /indx FMLOCAL
+ /cynu FMLOCAL
+ /magu FMLOCAL
+ /yelu FMLOCAL
+ /k FMLOCAL
+ /u FMLOCAL
+FMLevel1 {
+/colorsetup {
+ currentcolortransfer
+ /gryt exch def
+ /blut exch def
+ /grnt exch def
+ /redt exch def
+ 0 1 255 {
+ /indx exch def
+ /cynu 1 red indx get 255 div sub def
+ /magu 1 green indx get 255 div sub def
+ /yelu 1 blue indx get 255 div sub def
+ /k cynu magu min yelu min def
+ /u k currentundercolorremoval exec def
+% /u 0 def
+ nredt indx 1 0 cynu u sub max sub redt exec put
+ ngreent indx 1 0 magu u sub max sub grnt exec put
+ nbluet indx 1 0 yelu u sub max sub blut exec put
+ ngrayt indx 1 k currentblackgeneration exec sub gryt exec put
+ } for
+ {255 mul cvi nredt exch get}
+ {255 mul cvi ngreent exch get}
+ {255 mul cvi nbluet exch get}
+ {255 mul cvi ngrayt exch get}
+ setcolortransfer
+ {pop 0} setundercolorremoval
+ {} setblackgeneration
+ } bind def
+}
+{
+/colorSetup2 {
+ [ /Indexed /DeviceRGB 255
+ {dup red exch get 255 div
+ exch dup green exch get 255 div
+ exch blue exch get 255 div}
+ ] setcolorspace
+} bind def
+} ifelse
+ /tran FMLOCAL
+/fakecolorsetup {
+ /tran 256 string def
+ 0 1 255 {/indx exch def
+ tran indx
+ red indx get 77 mul
+ green indx get 151 mul
+ blue indx get 28 mul
+ add add 256 idiv put} for
+ currenttransfer
+ {255 mul cvi tran exch get 255.0 div}
+ exch concatprocs settransfer
+} bind def
+/BITMAPCOLOR {
+ /d 8 def
+ gsave
+
+ 3 index 2 div add exch
+ 4 index 2 div add exch
+ translate
+ rotate
+ 1 index 2 div neg
+ 1 index 2 div neg
+ translate
+ scale
+ /h exch def /w exch def
+ /bitmapsave save def
+ FMLevel1 {
+ colorsetup
+ /is w d wbytes string def
+ /cf currentfile def
+ w h d [w 0 0 h neg 0 h]
+ {cf is readhexstring pop} {is} {is} true 3 colorimage
+ } {
+ colorSetup2
+ /is w d wbytes string def
+ /cf currentfile def
+ 7 dict dup begin
+ /ImageType 1 def
+ /Width w def
+ /Height h def
+ /ImageMatrix [w 0 0 h neg 0 h] def
+ /DataSource {cf is readhexstring pop} bind def
+ /BitsPerComponent d def
+ /Decode [0 255] def
+ end image
+ } ifelse
+ bitmapsave restore
+ grestore
+ } bind def
+/BITMAPCOLORc {
+ /d 8 def
+ gsave
+
+ 3 index 2 div add exch
+ 4 index 2 div add exch
+ translate
+ rotate
+ 1 index 2 div neg
+ 1 index 2 div neg
+ translate
+ scale
+ /h exch def /w exch def
+ /lb w d wbytes def
+ sl lb lt {lb ms} if
+ /bitmapsave save def
+ FMLevel1 {
+ colorsetup
+ /is im 0 lb getinterval def
+ ws 0 lb getinterval is copy pop
+ /cf currentfile def
+ w h d [w 0 0 h neg 0 h]
+ {ip} {is} {is} true 3 colorimage
+ } {
+ colorSetup2
+ /is im 0 lb getinterval def
+ ws 0 lb getinterval is copy pop
+ /cf currentfile def
+ 7 dict dup begin
+ /ImageType 1 def
+ /Width w def
+ /Height h def
+ /ImageMatrix [w 0 0 h neg 0 h] def
+ /DataSource {ip} bind def
+ /BitsPerComponent d def
+ /Decode [0 255] def
+ end image
+ } ifelse
+ bitmapsave restore
+ grestore
+ } bind def
+/BITMAPTRUECOLORc {
+ /d 24 def
+ gsave
+
+ 3 index 2 div add exch
+ 4 index 2 div add exch
+ translate
+ rotate
+ 1 index 2 div neg
+ 1 index 2 div neg
+ translate
+ scale
+ /h exch def /w exch def
+ /lb w d wbytes def
+ sl lb lt {lb ms} if
+ /bitmapsave save def
+
+ /is im 0 lb getinterval def
+ /ris im 0 w getinterval def
+ /gis im w w getinterval def
+ /bis im w 2 mul w getinterval def
+
+ ws 0 lb getinterval is copy pop
+ /cf currentfile def
+ w h 8 [w 0 0 h neg 0 h]
+ {w rip pop ris} {gis} {bis} true 3 colorimage
+ bitmapsave restore
+ grestore
+ } bind def
+/BITMAPTRUECOLOR {
+ gsave
+
+ 3 index 2 div add exch
+ 4 index 2 div add exch
+ translate
+ rotate
+ 1 index 2 div neg
+ 1 index 2 div neg
+ translate
+ scale
+ /h exch def /w exch def
+ /bitmapsave save def
+ /is w string def
+ /gis w string def
+ /bis w string def
+ /cf currentfile def
+ w h 8 [w 0 0 h neg 0 h]
+ { cf is readhexstring pop }
+ { cf gis readhexstring pop }
+ { cf bis readhexstring pop }
+ true 3 colorimage
+ bitmapsave restore
+ grestore
+ } bind def
+/BITMAPTRUEGRAYc {
+ /d 24 def
+ gsave
+
+ 3 index 2 div add exch
+ 4 index 2 div add exch
+ translate
+ rotate
+ 1 index 2 div neg
+ 1 index 2 div neg
+ translate
+ scale
+ /h exch def /w exch def
+ /lb w d wbytes def
+ sl lb lt {lb ms} if
+ /bitmapsave save def
+
+ /is im 0 lb getinterval def
+ /ris im 0 w getinterval def
+ /gis im w w getinterval def
+ /bis im w 2 mul w getinterval def
+ ws 0 lb getinterval is copy pop
+ /cf currentfile def
+ w h 8 [w 0 0 h neg 0 h]
+ {w rip pop ris gis bis w gray} image
+ bitmapsave restore
+ grestore
+ } bind def
+/ww FMLOCAL
+/r FMLOCAL
+/g FMLOCAL
+/b FMLOCAL
+/i FMLOCAL
+/gray {
+ /ww exch def
+ /b exch def
+ /g exch def
+ /r exch def
+ 0 1 ww 1 sub { /i exch def r i get .299 mul g i get .587 mul
+ b i get .114 mul add add r i 3 -1 roll floor cvi put } for
+ r
+ } bind def
+/BITMAPTRUEGRAY {
+ gsave
+
+ 3 index 2 div add exch
+ 4 index 2 div add exch
+ translate
+ rotate
+ 1 index 2 div neg
+ 1 index 2 div neg
+ translate
+ scale
+ /h exch def /w exch def
+ /bitmapsave save def
+ /is w string def
+ /gis w string def
+ /bis w string def
+ /cf currentfile def
+ w h 8 [w 0 0 h neg 0 h]
+ { cf is readhexstring pop
+ cf gis readhexstring pop
+ cf bis readhexstring pop w gray} image
+ bitmapsave restore
+ grestore
+ } bind def
+/BITMAPGRAY {
+ 8 {fakecolorsetup} COMMONBITMAP
+ } bind def
+/BITMAPGRAYc {
+ 8 {fakecolorsetup} COMMONBITMAPc
+ } bind def
+/ENDBITMAP {
+ } bind def
+end
+ /ALDsave FMLOCAL
+ /ALDmatrix matrix def ALDmatrix currentmatrix pop
+/StartALD {
+ /ALDsave save def
+ savematrix
+ ALDmatrix setmatrix
+ } bind def
+/InALD {
+ restorematrix
+ } bind def
+/DoneALD {
+ ALDsave restore
+ } bind def
+/I { setdash } bind def
+/J { [] 0 setdash } bind def
+%%EndProlog
+%%BeginSetup
+(4.0) FMVERSION
+1 1 0 0 612 792 0 1 10 FMDOCUMENT
+0 0 /Times-Bold FMFONTDEFINE
+1 0 /Times-Roman FMFONTDEFINE
+2 0 /Times-BoldItalic FMFONTDEFINE
+3 0 /Times-Italic FMFONTDEFINE
+4 0 /Courier FMFONTDEFINE
+5 0 /Courier-Bold FMFONTDEFINE
+32 FMFILLS
+0 0 FMFILL
+1 0.1 FMFILL
+2 0.3 FMFILL
+3 0.5 FMFILL
+4 0.7 FMFILL
+5 0.9 FMFILL
+6 0.97 FMFILL
+7 1 FMFILL
+8 <0f1e3c78f0e1c387> FMFILL
+9 <0f87c3e1f0783c1e> FMFILL
+10 <cccccccccccccccc> FMFILL
+11 <ffff0000ffff0000> FMFILL
+12 <8142241818244281> FMFILL
+13 <03060c183060c081> FMFILL
+14 <8040201008040201> FMFILL
+16 1 FMFILL
+17 0.9 FMFILL
+18 0.7 FMFILL
+19 0.5 FMFILL
+20 0.3 FMFILL
+21 0.1 FMFILL
+22 0.03 FMFILL
+23 0 FMFILL
+24 <f0e1c3870f1e3c78> FMFILL
+25 <f0783c1e0f87c3e1> FMFILL
+26 <3333333333333333> FMFILL
+27 <0000ffff0000ffff> FMFILL
+28 <7ebddbe7e7dbbd7e> FMFILL
+29 <fcf9f3e7cf9f3f7e> FMFILL
+30 <7fbfdfeff7fbfdfe> FMFILL
+%%EndSetup
+%%Page: "1" 1
+%%BeginPaperSize: Letter
+%%EndPaperSize
+612 792 0 FMBEGINPAGE
+[0 0 0 1 0 0 0]
+[ 0 1 1 0 1 0 0]
+[ 1 0 1 0 0 1 0]
+[ 1 1 0 0 0 0 1]
+[ 1 0 0 0 0 1 1]
+[ 0 1 0 0 1 0 1]
+[ 0 0 1 0 1 1 0]
+ 7 FrameSetSepColors
+FrameNoSep
+0 0 0 1 0 0 0 K
+J
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+0 12 Q
+0 X
+0 0 0 1 0 0 0 K
+(Intr) 151.94 469 T
+(oduction) 172.39 469 T
+1 10 Q
+(T) 72 450.33 T
+(ypically) 77.41 450.33 T
+(, T) 108.98 450.33 T
+(cl/Tk application development leads to the) 119.39 450.33 T
+(redundant creation of widget combination patterns) 72 438.33 T
+(which can be singled out for replacement with higher) 72 426.33 T
+(level abstractions. For example, a label is usually asso-) 72 414.33 T
+(ciated with an entry widget, listboxes frequently have) 72 402.33 T
+(attached scrollbars, and dialogs require buttons and) 72 390.33 T
+(modality) 72 378.33 T
+(. This is due to the simplicity of the Tk widget) 106.91 378.33 T
+(set. Seasoned developers commonly package this code,) 72 366.33 T
+(attempting to create a composite widget in a set of pro-) 72 354.33 T
+(cedures which allows for consistent creation of the wid-) 72 342.33 T
+(get combination. This may provide centralization of) 72 330.33 T
+(logic, but the procedures lack the encapsulation of a) 72 318.33 T
+(pure widget and end up \337ooding global name space. At) 72 306.33 T
+(this point, some developers may resort to C code.) 72 294.33 T
+(What was really needed was the ability to combine Tk) 72 270.33 T
+(widgets together into abstract building blocks called) 72 258.33 T
+(\322Mega-W) 72 246.33 T
+(idgets\323 at the VHLL layer) 111.58 246.33 T
+(. The [incr T) 215.45 246.33 T
+(cl] [1]) 265.29 246.33 T
+(and [incr Tk] [2] extensions provide this capability) 72 234.33 T
+(,) 274.93 234.33 T
+(allowing mega-widget development in an object-ori-) 72 222.33 T
+(ented paradigm using T) 72 210.33 T
+(cl/Tk rather than C. The next) 166.01 210.33 T
+(step was to build a mega-widget set in these extensions) 72 198.33 T
+(which replaces the redundant widget combination pat-) 72 186.33 T
+-0.1 (terns and provides a foundation for future development.) 72 174.33 P
+([incr W) 72 162.33 T
+(idgets] is one such extension.) 102.42 162.33 T
+([incr W) 72 144.33 T
+(idgets] is an object-oriented, extensible set of) 102.42 144.33 T
+-0.6 (mega-widgets, delivering many general purpose widgets) 72 132.33 P
+(such as option menus, selection boxes, and dialogs) 72 120.33 T
+(whose counterparts are found in Motif. Since [incr W) 72 108.33 T
+(id-) 285.72 108.33 T
+(gets] is based on [incr Tk], the Tk framework of con\336g-) 72 96.33 T
+(uration options and widget commands is maintained. In) 72 84.33 T
+(other words, they look, act, and feel like Tk widgets.) 315 470.33 T
+([incr W) 315 458.33 T
+(idgets] blends with the standard Tk widgets,) 345.42 458.33 T
+-0.28 (raising the level of programming and making it easier to) 315 446.33 P
+(consistently develop well styled applications.) 315 434.33 T
+(The idea of extending the basic Tk widget set is not) 315 410.33 T
+(original. Other mega-widget extensions exist such as) 315 398.33 T
+(T) 315 386.33 T
+(ix [3] and itcl-widgets [4]. V) 320.76 386.33 T
+(isually) 435.14 386.33 T
+(, [incr W) 461.16 386.33 T
+(idgets]) 496.58 386.33 T
+-0.03 (covers some of the same ground, successfully replacing) 315 374.33 P
+(many of the same typical combinations. [incr W) 315 362.33 T
+(idgets]) 507.35 362.33 T
+(dif) 315 350.33 T
+(fers in the degree of its reusability) 325.93 350.33 T
+(, extensibility) 461.92 350.33 T
+(, \337ex-) 515.72 350.33 T
+(ibility) 315 338.33 T
+(, and adherence to the Motif style guide.) 338.25 338.33 T
+(The [incr W) 315 314.33 T
+(idgets] mega-widget set is also distin-) 363.47 314.33 T
+(guished by its consistent use of style, built-in intelli-) 315 302.33 T
+(gence, high degree of \337exibility) 315 290.33 T
+(, ease of extending base) 441.83 290.33 T
+(level functionality) 315 278.33 T
+(, and its object-oriented implementa-) 387.4 278.33 T
+(tion. Its use has resulted in increased productivity) 315 266.33 T
+(, reli-) 512.66 266.33 T
+(ability) 315 254.33 T
+(, and style guide adherence. This paper) 339.91 254.33 T
+(concentrates on these unique aspects of the widget set) 315 242.33 T
+(and the presentation of its innovative concepts. A picto-) 315 230.33 T
+(rial tour with sample code segments will be given as an) 315 218.33 T
+(appendix.) 315 206.33 T
+0 12 Q
+(Mega-W) 390.28 175 T
+(idgets) 434.72 175 T
+1 10 Q
+(Mega-widgets has been a hot topic within the T) 315 150.33 T
+(cl/Tk) 504.83 150.33 T
+(community) 315 138.33 T
+(. The discussion centers on the bene\336ts,) 359.91 138.33 T
+(frameworks, mechanisms, and implementation tech-) 315 126.33 T
+(niques. It was McLennan [1] who originally coined the) 315 114.33 T
+(term in his work with [incr T) 315 102.33 T
+(cl], expanding on the con-) 430.4 102.33 T
+(cept with [incr Tk]. He proposes that mega-widgets) 315 90.33 T
+(should seamlessly extend the Tk widget set. They) 315 78.33 T
+72 495 540 720 R
+7 X
+V
+0 14 Q
+0 X
+([incr W) 263.16 710.67 T
+(idgets]) 309.18 710.67 T
+(An Object Oriented Mega-W) 192.98 692.67 T
+(idget Set) 367.31 692.67 T
+2 9 Q
+(Revised 10/31/95 - Originally present at USENIX T) 176.36 678 T
+(cl/Tk W) 365.8 678 T
+(orkshop 95) 394.38 678 T
+1 12 Q
+(Mark L. Ulferts) 268.18 652 T
+3 10 Q
+(DSC Communications Corporation) 235.16 637.33 T
+(mulferts@spd.dsccc.com) 256.13 623.33 T
+(http://www) 242.19 609.33 T
+(.wn.com/biz/iwidgets) 285.91 609.33 T
+0 12 Q
+(Abstract) 283.67 576 T
+3 10 Q
+(The intr) 72 551.33 T
+(oduction of [incr T) 103.58 551.33 T
+(cl] and [incr Tk] allows an object oriented appr) 178.5 551.33 T
+(oach to Tk widget construction. \322Mega-) 370.91 551.33 T
+(widgets\323 developed in these extensions seamlessly expand the Tk base widget set. Each of these object-oriented wid-) 72 539.33 T
+-0.03 (gets may themselves be extended, using either inheritance or composition. This paper pr) 72 527.33 P
+-0.03 (esents one such general pur-) 425.14 527.33 P
+(pose hierar) 72 515.33 T
+(chy called [incr W) 117.46 515.33 T
+(idgets] which maintains the Motif look-and-feel and establishes several new concepts,) 191.06 515.33 T
+(including extensible child sites and \337exible lar) 72 503.33 T
+(ge scale component con\336guration.) 257.73 503.33 T
+FMENDPAGE
+%%EndPage: "1" 1
+%%Page: "2" 2
+612 792 0 FMBEGINPAGE
+[0 0 0 1 0 0 0]
+[ 0 1 1 0 1 0 0]
+[ 1 0 1 0 0 1 0]
+[ 1 1 0 0 0 0 1]
+[ 1 0 0 0 0 1 1]
+[ 0 1 0 0 1 0 1]
+[ 0 0 1 0 1 1 0]
+ 7 FrameSetSepColors
+FrameNoSep
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+1 10 Q
+0 X
+0 0 0 1 0 0 0 K
+(should behave like standard Tk widgets, but are com-) 72 713.33 T
+(posed of many Tk widgets and possibly other mega-) 72 701.33 T
+(widgets as components. The implementation must) 72 689.33 T
+(ensure that users notice no signi\336cant dif) 72 677.33 T
+(ferences. Stan-) 235.69 677.33 T
+(dard commands such as \324con\336gure\325 and \324cget\325 must) 72 665.33 T
+(exist and options should be propagated to all compo-) 72 653.33 T
+(nents. Thus, con\336guration of a mega-widgets \322-back-) 72 641.33 T
+(ground\323 or \322-relief\323 option should have the expected) 72 629.33 T
+(results on its components.) 72 617.33 T
+-0.15 (The [incr T) 72 593.33 P
+-0.15 (cl] and [incr Tk] extensions fully address the) 116.55 593.33 P
+(issues of framework and mechanism for mega-widget) 72 581.33 T
+(production. They have established themselves as the) 72 569.33 T
+(defacto standard object-oriented extensions and have) 72 557.33 T
+(been chosen to provide the backbone for the [incr W) 72 545.33 T
+(id-) 281.82 545.33 T
+(gets] set. Using these extensions, each mega-widget) 72 533.33 T
+(becomes a \322class\323, de\336ning a unique type of widget) 72 521.33 T
+(object in a separate namespace. This ensures that data) 72 509.33 T
+(and commands associated with an object are encapsu-) 72 497.33 T
+(lated, eliminating global name space pollution.) 72 485.33 T
+0 12 Q
+(Example) 161.83 454 T
+1 10 Q
+-0.24 (At this point, an example of mega-widget usage can pro-) 72 429.33 P
+(vide a taste of [incr W) 72 417.33 T
+(idgets] capabilities and illustrate) 160.74 417.33 T
+(the bene\336ts. The example centers around the construc-) 72 405.33 T
+-0.17 (tion of a typical login screen which prompts the user for) 72 393.33 P
+(user name and password. New requirements will be) 72 381.33 T
+-0.03 (incremental, leading to the development of a new mega-) 72 369.33 P
+(widget which is implemented as an extension of an) 72 357.33 T
+(existing one.) 72 345.33 T
+-0.3 (A primitive login screen is composed of two \336elds, each) 72 321.33 P
+(having a label and entry widget. The T) 72 309.33 T
+(cl/Tk code) 226.27 309.33 T
+(required is shown in Figure 1. [incr W) 72 297.33 T
+(idgets] provides) 224.91 297.33 T
+(an Entry\336eld class which replaces this standard widget) 72 285.33 T
+(combination. This is shown in Figure 2. At this point,) 72 273.33 T
+(mega-widget usage is mostly a matter of convenience) 72 261.33 T
+(and minor savings in code, yet with a few additional) 72 249.33 T
+(requirements the bene\336ts begin to escalate.) 72 237.33 T
+(Now let\325) 72 213.33 T
+(s add new requirements which might be) 106.72 213.33 T
+(required for a normal login screen. First, the labels) 72 201.33 T
+(should be left aligned. Next, the user \336eld width should) 72 189.33 T
+(be limited to a maximum of 10 characters with input) 72 177.33 T
+(restricted to alphabetic characters and illegal character) 72 165.33 T
+(entry ringing the bell. As for the password, input must) 72 153.33 T
+-0.05 (be masked and the return key should invoke a login pro-) 72 141.33 P
+(cedure. W) 72 129.33 T
+(e\325ll also present a more aesthetic interface by) 112.29 129.33 T
+(varying the textual background in the mega-widget.) 72 117.33 T
+(Since this last requirement applies to both Entry\336elds,) 72 105.33 T
+-0.03 (the option database will be used. Figure 3 illustrates the) 72 93.33 P
+-0.48 (code needed to implement these new requirements using) 72 81.33 P
+([incr W) 315 200.33 T
+(idgets]. Even without the presentation of com-) 345.42 200.33 T
+-0.18 (parative straight T) 315 188.33 P
+-0.18 (cl/Tk code, its safe to say that the ben-) 387.27 188.33 P
+(e\336ts have increased.) 315 176.33 T
+(This example gives just a sampling of the label control) 315 152.33 T
+(capabilities built into those classes based on the) 315 140.33 T
+(Labeledwidget class such as the Entry\336eld mega-wid-) 315 128.33 T
+-0.18 (get. The label\325) 315 116.33 P
+-0.18 (s position relative to its associated widget) 372.12 116.33 P
+-0.04 (may be speci\336ed using standard directions: nw) 315 104.33 P
+-0.04 (, n, ne, e,) 501.29 104.33 P
+-0.4 (se, s, sw) 315 92.33 P
+-0.4 (, and w) 346.88 92.33 P
+-0.4 (. The label need not be limited to text, the) 374.58 92.33 P
+(class supports both bitmaps and images as well. A mar-) 315 80.33 T
+315 207 540 720 C
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+315 243 540 360 R
+7 X
+0 0 0 1 0 0 0 K
+V
+0.5 H
+2 Z
+0 X
+N
+315 396 540 720 R
+7 X
+V
+0 X
+N
+%%BeginBinary: 6824
+251 117 129.09 60.17 0 365.92 648
+/red <
+72FFFFFFFFFFFFFFFFFFFFFFFFFF66F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF80808080
+8080808080808080808080808080808080808080404040404040404040404040
+4040404040404040404040000000000000000000000000000000000039C069DD
+00FF0000003333330033CCDD9999112277005544FFCC66AABBFF33EE9999CC7A
+EFD39765E1A36FE700FF5500557FB22EB099FFFFB07AFFCC0087AFB4CD73E6A2
+4DBF88F558D7439D50D080C0C080C0808060C000FFA000FFBE8BD28BD9B3FF72
+20C0A040C040D060F0E010B499A0FF0019BF2FFF6223852F465F4770FF0000FF
+> store
+/green <
+9F0000000000000000000000000099DEFFFFFFBFBFBFBFBF8080808080404040
+40000000FFFFFFFFFFBFBFBFBF808080808040404040400000000000FFFFFFFF
+FFBFBFBFBFBF8080808040404040400000000000FFFFFFFFFFBFBFBFBFBF8080
+8080804040400000000000FFFFFFBFBFBFBFBF80808040404040400063E0B500
+996699FF00663399BBFF99DD99FF112277005544CCCC66AABB6600EE6600CC69
+E3B59765E1A36FE700FF1A006B7FB28B3099FFFFB094FFF700CEEEEE0073E6A2
+4DBF88F558D74DB38080C0C080C080808060C08000A08040BE5BB477D9B3FF77
+2070A0402040D0F0F0E010B489A0E4FF19264F00B641DE4F829E4780FF0000FF
+> store
+/blue <
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3BF8040FFBF804000FFBF804000FFBF80
+00BF8040FFBF804000FF804000FFBF804000FFBF804000FFBF804000FFBF8040
+00FFBF804000FFBF4000FFBF804000FFBF804000FFBF804000FFBF804000FFBF
+804000FFBF00FFBF804000BF8040FFBF804000FFBF40FFBF8040004063E0B500
+FF3399FF88666666009966DDFFFF112277DD554499FFCCAABBCC99EE9966CC69
+E3B59765E1A36FE7BFCC8BEE2F7FB257606BFBB3B015322480FAEEB40073E6A2
+4DBF88F558D756CAD050C080C08080C08060C080FF000040BE7A8C65D9B3E085
+2070C0802040D06050E010B476A0C40070264F00FC5AE050B4A0FF9000FF00FF
+> store
+ BEGINBITMAPCOLORc
+z"z"z"
+6F6F7R4F6F76F6F7J"
+S3F78z8z8z
+4F9R3F94F9
+
+;z"
+S*F7F6<z"z"z"z
+0F6F7R#F6F70F6F70F6=z8z8z8z
+/F9R"F9/F9/F9
+J%J#F'
+O<FEFEFEFE5FEFEFEFEFEFEF9FEJ"8"J'Js"
+O<F9F9FFEFEF9F9F9FEP2F6F7J#8#J"Jr
+P#FEFEF9F94F9P3F9J$:*8'?#8"9$8'8$:$8'
+OGFEFEFEFEFEFEFEF9F9FEFEFEFEFEFEF9FEFEFEFEF9FEFEFEFEFEFEF9FEFEFEFEFEFEFEFEFEFEFEF9FEFE@s"J1:"8%<"9#8)8"808%J$
+F6F7O2FEFEFEF9FEFEFEF9FEFEF9F9FEFEF9F9F9FEF9FEFEF9FEFEFEFEFEF9FEFEF9F9FEFEFEFEF9FEFEF9FEFEFEF9FEFEF9F9FEF9FEFEO.F6F6F7ArJ$H"@#9"9%:$9"<"<"J"
+F9O5F9F9F9F9F9F9FEF9F9F9F9F9F9F9FEFEF9O2F9@sJ"?'I"8#H%9%J#
+F7O1FEF9FEFEFEFEF9FEF9F9F9F9F9F9F9F9F9F9O6F7F7@tJ":$9&J">%?%9%J$
+F9O/FEFEF9FEFEF9F9F9F95FEFEF9FEFEFEF9FEFEFEF9FEFEO6F9F9F9J"8$9(8(8$8"9"<08"808"9"
+O<FEFEFEFEF9F9FEFEFEF9F9FEFEFEFEFEF9FEFEF9FEFEFEF9FEFEFEFEF9F9F9F9FEFEFEF9F9FEFEF9F9FEFEFEF9F9F9F9FEFEFEF9F9FEFEFEJs9$9";"x;':$8%:$:$8sJs
+O<F9F9F9F9F9FEF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9O;F7J&Jt
+OMFEF9F9F9F9PLF9J(
+OMF9FEFEFEFEFEF9=z8z8z8z
+/F7R"F7/F7/F7rF"J"F"F%
+F7F7R#F7F7F7F7F7F7'z&
+F6F6F6F6F6F7S)EEF6F6F6F6F68$J%
+F9F9F9S+F9F9F9F7
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+J5
+O+QEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEJ5
+O*QGFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFFJ#z#
+O*EEFEQCEEFFEEJ#J#
+O*FEEEQCEEFFJ#J#
+O*EEFEQCFFEEJ#9#J#J#
+4FEFEFEFE=FEEEQCEEFFJ#J#
+O*EEFEQCFFEEJ%9%8)<#J#
+=FEFEFEFEFEFEFEFEFEFEEEFEFEEEFEFEFEEEQCEEFFJ.9"A#J#
+<FEFEEEEEFEFEEEFEFEEEEEFEFEFEEEFEQCFFEEJ%A&<#J#
+>FEEEEEEEEEEEEEEEEEFEEEQCEEFFJ&:#;"A#J#
+<EEEEFEFEFEFEFEEEEEFEQCFFEEJ"8"9%E#J#
+>EEFEEEEEEEEEFEEEQCEEFFJ-=#=#<#J#
+4EEFEFEEEFEFEEEEEFEFEEEEEFEFEFEFEEEFEQCFFEEJ":.E#J#
+7FEEEFEFEFEFEEEEEEEFEFEFEFEEEFEEEQCEEFFJ&9%9%8#:#<#J#
+5EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFEQCFFEEJ#J#
+O*FEEEQCEEFFJ#J#
+O*EEFEQCFFEEJ#J#
+O*FEEEQCEEFFJ5
+O*QGEEFEEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEJ5
+O*QGFEEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFJz
+O*QGEE
+
+
+
+
+
+
+
+
+
+
+
+
+J5
+OJQ'FEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEJ5
+OIQ(FEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEFEEEJ#z"
+OIEEFEQ%EEFFJ#J#
+OIFEEEQ$FFEEJ#J#
+OIEEFEQ$EEFFJ'J#@#J#
+4FEFEFEFEFEFEO#FEFEFEEEQ$FFEEJ&J#J#
+6EEEEEEFEFEO.EEFEQ$EEFFJ%9%9%8#8#8#8%8);#<#J#
+<FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEEEFEFEEEFEFEFEFEFEEEQ$FFEEJ5B'9"8%B#J#
+;4FEFEEEEEFEFEEEFEFEEEEEFEFEEEFEFEEEEEFEFEFEFEEEEEFEFEFEFEFEEEFEEEFEQ$EEFFJ(=%9):$A#9":#<#J#
+6FEFEFEFEEEEEEEFEEEEEEEFEEEEEEEEEEEFEFEFEFEEEEEEEEEEEEEFEEEQ$FFEEJ%8$9&8&J"H#J#
+6EEEEEEEEFEFEFEEEEEFEFEFEEEEEFEFEFE6EEEEFEQ$EEFFJ%;"8"9"8"J#J#
+;FEFEEEEEEEFEEEFEHFEEEQ$FFEEJ%9%:)G":#<#J#
+BFEFEEEEEFEFEEEEEEEFEFEEEEEFEFEEEFEFEFEEEFEQ$EEFFJ5B'<%B#J#
+;4EEFEFEFEEEFEFEEEFEFEFEFEEEEEEEFEFEFEFEEEEEFEFEFEFEEEEEFEFEEEFEEEQ$FFEEJ#<v9%:#8#:%8#:&8#<#J#
+4EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFEQ$EEFFJ#J#
+OIFEEEQ$FFEEJ#J#
+OIEEFEQ$EEFFJ#J#
+OIFEEEQ$FFEEJ5
+OIQ(EEFEEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFF&J5B%
+F7F7F7F7F7ODQ(FEEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEFFEEF7F7F7F7&JzC&
+F6F6F6F6F6ODQ'EEF6F6F6F6F68$J%
+F9F9F9S+F9F9F9F7
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<z"z"z
+0F6F7R4F6F71F6;z8z8z
+1F9R3F91F9
+
+7z8z8z
+5F7R3F74F7"J"J"
+F76F7R4F7
+ENDBITMAP
+%%EndBinary
+324 399.57 531 639 R
+7 X
+V
+4 8 Q
+0 X
+(frame .login) 324 633.67 T
+(pack .login -padx 10 -pady 10) 324 623.67 T
+(frame .login.userFrame) 324 603.67 T
+(label .login.userFrame.userLabel \134) 324 593.67 T
+( -text \322User:\323) 324 583.67 T
+(entry .login.userFrame.userEntry) 324 573.67 T
+(pack .login.userFrame -f) 324 553.67 T
+(ill x -pady 5) 439.2 553.67 T
+(pack .login.userFrame.userLabel \134) 324 543.67 T
+( -side left) 324 533.67 T
+(pack .login.userFrame.userEntry \134) 324 523.67 T
+( -side left -expand yes -f) 324 513.67 T
+(ill x) 463.2 513.67 T
+(frame .login.passwdFrame) 324 493.67 T
+(label .login.passwdFrame.passwdLabel \134) 324 483.67 T
+( -text \322Password:\323) 324 473.67 T
+(entry .login.passwdFrame.passwdEntry) 324 463.67 T
+(pack .login.passwdFrame -f) 324 443.67 T
+(ill x -pady 5) 448.8 443.67 T
+(pack .login.passwdFrame.passwdLabel \134) 324 433.67 T
+( -side left) 324 423.67 T
+(pack .login.passwdFrame.passwdEntry \134) 324 413.67 T
+( -side left -expand yes -f) 324 403.67 T
+(ill x) 463.2 403.67 T
+324 252 531 351 R
+7 X
+V
+0 X
+(frame .login) 324 345.67 T
+(pack .login -padx 10 -pady 10) 324 335.67 T
+(entryf) 324 315.67 T
+(ield .login.user \134) 352.8 315.67 T
+( -labeltext \322User:\323) 324 305.67 T
+(pack .login.user -f) 324 295.67 T
+(ill x -pady 5) 415.2 295.67 T
+(entryf) 324 275.67 T
+(ield .login.passwd \134) 352.8 275.67 T
+( -labeltext \322Password:\323) 324 265.67 T
+(pack .login.passwd -f) 324 255.67 T
+(ill x -pady 5) 424.8 255.67 T
+0 10 Q
+(FIGURE 2) 346.21 227.18 T
+1 F
+( - [incr W) 392.6 227.18 T
+(idgets] Login screen) 431.35 227.18 T
+0 F
+(FIGURE 1) 359.33 380.18 T
+1 F
+( - T) 405.72 380.18 T
+(cl/Tk Login screen) 419.46 380.18 T
+0 -208 1000 792 C
+FMENDPAGE
+%%EndPage: "2" 2
+%%Page: "3" 3
+612 792 0 FMBEGINPAGE
+[0 0 0 1 0 0 0]
+[ 0 1 1 0 1 0 0]
+[ 1 0 1 0 0 1 0]
+[ 1 1 0 0 0 0 1]
+[ 1 0 0 0 0 1 1]
+[ 0 1 0 0 1 0 1]
+[ 0 0 1 0 1 1 0]
+ 7 FrameSetSepColors
+FrameNoSep
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+1 10 Q
+0 X
+0 0 0 1 0 0 0 K
+(gin between the label and its associated widget may be) 72 429.62 T
+(given. Alignment is provided by adjusting the mar) 72 417.62 T
+(gins) 273.48 417.62 T
+(of a group of Labeledwidget based mega-widgets.) 72 405.62 T
+(Currently) 72 381.62 T
+(, our login screen lacks a method of cancella-) 109.68 381.62 T
+(tion barring closure from the window manager decora-) 72 369.62 T
+(tion. Since this is not the most elegant method of) 72 357.62 T
+-0.24 (window removal, \322OK\323 and \322Cancel\323 buttons seem like) 72 345.62 P
+(worthy additions. A well styled application would also) 72 333.62 T
+-0.22 (make the buttons be of equal width and signify a default) 72 321.62 P
+(button associated with striking the return key through) 72 309.62 T
+(the appearance of an encompassing sunken ring. The) 72 297.62 T
+(Buttonbox class provides this functionality) 72 285.62 T
+(, making but-) 243.02 285.62 T
+(ton management simple. As a manager widget, the But-) 72 273.62 T
+(tonbox controls the orientation, separation, and size of) 72 261.62 T
+-0.18 (its button components. Buttons are added with the \324add\325) 72 249.62 P
+(command. The \324default\325 command allows speci\336cation) 72 237.62 T
+(of a button within a sunken ring. Figure 4 presents the) 72 225.47 T
+(improved login screen.) 72 213.47 T
+-0.01 (Expanding further) 72 189.47 P
+-0.01 (, a truly useful login screen should be) 144.63 189.47 P
+(a modal toplevel dialog widget. The [incr W) 72 177.47 T
+(idgets] Dia-) 249.35 177.47 T
+(log class supports global, application, and non-modal) 72 165.47 T
+(dialogs. The dif) 72 153.47 T
+(ference being the degree of blocking.) 134.87 153.47 T
+(Global modal dialogs block all applications, whereas) 72 141.47 T
+(application modal dialogs only block the current appli-) 72 129.47 T
+-0.24 (cation. This allows processing of the dialog contents fol-) 72 117.47 P
+(lowing user response and dialog termination. Non-) 72 105.47 T
+(modal dialogs are non-blocking, enabling the applica-) 72 93.47 T
+(tion to continue. In this case, the actions attached to the) 72 81.47 T
+72 436.29 297 720 C
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+72 470.14 297 720 R
+7 X
+0 0 0 1 0 0 0 K
+V
+0.5 H
+2 Z
+0 X
+N
+%%BeginBinary: 7011
+254 115 130.63 59.14 0 121.37 651.86
+/red <
+72FFFFFFFFFFFFFFFFFFFFFFFFFF66F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF80808080
+8080808080808080808080808080808080808080404040404040404040404040
+4040404040404040404040000000000000000000000000000000000039C069DD
+00FF0000003333330033CCDD9999112277005544FFCC66AABBFF33EE9999CC7A
+EFD39765E1A36FE700FF5500557FB22EB099FFFFB07AFFCC0087AFB4CD73E6A2
+4DBF88F558D7439D50D080C0C080C0808060C000FFA000FFBE8BD28BD9B3FF72
+20C0A040C040D060F0E010B499A0FF0019BF2FFF6223852F465F4770FF0000FF
+> store
+/green <
+9F0000000000000000000000000099DEFFFFFFBFBFBFBFBF8080808080404040
+40000000FFFFFFFFFFBFBFBFBF808080808040404040400000000000FFFFFFFF
+FFBFBFBFBFBF8080808040404040400000000000FFFFFFFFFFBFBFBFBFBF8080
+8080804040400000000000FFFFFFBFBFBFBFBF80808040404040400063E0B500
+996699FF00663399BBFF99DD99FF112277005544CCCC66AABB6600EE6600CC69
+E3B59765E1A36FE700FF1A006B7FB28B3099FFFFB094FFF700CEEEEE0073E6A2
+4DBF88F558D74DB38080C0C080C080808060C08000A08040BE5BB477D9B3FF77
+2070A0402040D0F0F0E010B489A0E4FF19264F00B641DE4F829E4780FF0000FF
+> store
+/blue <
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3BF8040FFBF804000FFBF804000FFBF80
+00BF8040FFBF804000FF804000FFBF804000FFBF804000FFBF804000FFBF8040
+00FFBF804000FFBF4000FFBF804000FFBF804000FFBF804000FFBF804000FFBF
+804000FFBF00FFBF804000BF8040FFBF804000FFBF40FFBF8040004063E0B500
+FF3399FF88666666009966DDFFFF112277DD554499FFCCAABBCC99EE9966CC69
+E3B59765E1A36FE7BFCC8BEE2F7FB257606BFBB3B015322480FAEEB40073E6A2
+4DBF88F558D756CAD050C080C08080C08060C080FF000040BE7A8C65D9B3E085
+2070C0802040D06050E010B476A0C40070264F00FC5AE050B4A0FF9000FF00FF
+> store
+ BEGINBITMAPCOLORc
+z"z"z"
+6F6F7R7F6F76F6F7J"
+S6F78z8z8z
+4F9R6F94F9
+
+;z"
+S-F7F6<z"z"z"z
+0F6F7R&F6F70F6F70F6=z8z8z8z
+/F9R%F9/F9/F9
+J%J#F'
+O=FEFEFEFE5FEFEFEFEFEFEF9FEJ"8"J'Js"
+O=F9F9FFEFEF9F9F9FEP4F6F7J#8#J"Jr
+P$FEFEF9F94F9P5F9J$:*8'?#8"9$8'8$:$8'
+OHFEFEFEFEFEFEFEF9F9FEFEFEFEFEFEF9FEFEFEFEF9FEFEFEFEFEFEF9FEFEFEFEFEFEFEFEFEFEFEF9FEFE@s"J1:"8%<"9#8)8"808%J$
+F6F7O3FEFEFEF9FEFEFEF9FEFEF9F9FEFEF9F9F9FEF9FEFEF9FEFEFEFEFEF9FEFEF9F9FEFEFEFEF9FEFEF9FEFEFEF9FEFEF9F9FEF9FEFEO0F6F6F7ArJ$H"@#9"9%:$9"<"<"J"
+F9O6F9F9F9F9F9F9FEF9F9F9F9F9F9F9FEFEF9O4F9@sJ"?'I"8#H%9%J#
+F7O2FEF9FEFEFEFEF9FEF9F9F9F9F9F9F9F9F9F9O8F7F7@tJ":$9&J">%?%9%J$
+F9O0FEFEF9FEFEF9F9F9F95FEFEF9FEFEFEF9FEFEFEF9FEFEO8F9F9F9J"8$9(8(8$8"9"<08"808"9"
+O=FEFEFEFEF9F9FEFEFEF9F9FEFEFEFEFEF9FEFEF9FEFEFEF9FEFEFEFEF9F9F9F9FEFEFEF9F9FEFEF9F9FEFEFEF9F9F9F9FEFEFEF9F9FEFEFEJs9$9";"x;':$8%:$:$8sJs
+O=F9F9F9F9F9FEF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9O=F7J&Jt
+P FEF9F9F9F9Q F9J(
+P F9FEFEFEFEFEF9=z8z8z8z
+/F7R%F7/F7/F7rF"J"F"F%
+F7F7R&F7F7F7F7F7F7'z&
+F6F6F6F6F6F7S,EEF6F6F6F6F68$J%
+F9F9F9S.F9F9F9F7
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+J5
+OKQ(C3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEJ5
+OKQ(FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3J#z"
+OKC3FEQ%C3FFJ#J#
+OKFEC3Q$FFC3J#9#J#F$<$J#
+4FEFEFEFEO0C3FEFEFEFEFEFEFEP6C3FFJ#F#<%G"J#
+OKFEC3C3C3FEC3C3C3FEP$FFC3J%9%8)J#J#
+=FEFEFEFEFEFEFEFEFEFEEEFEFEEEFEFEGC3FEQ$C3FFJ.9"J)8#8#?&9$9&8&9$J#
+<FEFEEEEEFEFEEEFEFEEEEEFEFEFELFEC3C3FEFEFEC3FEFEFEFEFEFEFEFEFEFEFEFEFEFEC3FEFEFEFEFEFEFEFEFEFEFEOIFFC3J%A&J,9"@&8&8&8&8&J#
+>FEEEEEEEEEEEEEEEEEGC3FEC3C3FEC3FEC3FEC3C3C3C3FEC3C3C3FEC3C3C3FEC3FEC3C3C3C3FEC3C3C3FEC3C3C3FEOHC3FFJ&:#;"J#J$G&J#
+<EEEEFEFEFEFEFEEELFEC3?FEFEFEC3FEFEFEC3OHFFC3J"8"9%J#J%G%J#
+>EEFEEEEEEEEEO"C3FE?C3C3C3C3C3C3C3FEOHC3FFJ-=#=#J#J"D$J#
+4EEFEFEEEFEFEEEEEFEFEEEEEFEFEFEFEGFEC3BFEFEC3FEOLFFC3J":.J%;59&8%:,J#
+7FEEEFEFEFEFEEEEEEEFEFEFEFEEEO"C3FEC3FE4FEC3C3FEFEFEC3FEC3FEFEFEFEFEFEC3FEFEFEFEC3FEFEFEC3FEFEFEFEC3FEFEFEC3C3C3FEFEFEC3OHC3FFJ&9%9%8#:#J"t8z:$9%;$9$J#
+5EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEGFEC31C3C3C3C3C3C3C3C3C3C3C3C3C3C3OIFFC3J#J#
+OKC3FEQ$C3FFJ#J#
+OKFEC3Q$FFC3J#J#
+OKC3FEQ$C3FFJ5
+OKQ(FEC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3J5
+OKQ(C3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFJz
+OKQ(EE
+
+
+
+
+
+
+
+
+
+
+Jz
+OIQ,FE
+J5
+OKQ'C3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3J5
+OKQ(FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3J#z"
+OKC3FEQ%C3FFJ#J#J#
+OKFEC3CFEFEP-FFC3J'J#B#J#
+4FEFEFEFEFEFEO#FEFEC3FEQ$C3FFJ&J#J#
+6EEEEEEFEFEO0FEC3Q$FFC3J%9%9%8#8#8#8%8);#>#J#
+<FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEEEFEFEEEFEFEFEFEC3FEQ$C3FFJ5B'9"8%D#J#
+;4FEFEEEEEFEFEEEFEFEEEEEFEFEEEFEFEEEEEFEFEFEFEEEEEFEFEFEFEFEEEFEFEC3Q$FFC3J(=%9):$A#9":#>#J#
+6FEFEFEFEEEEEEEFEEEEEEEFEEEEEEEEEEEFEFEFEFEEEEEEEEEEEEEC3FEQ$C3FFJ%8$9&8&J"J#:"<"<"<"<"J#
+6EEEEEEEEFEFEFEEEEEFEFEFEEEEEFEFEFE6EE4FEC3FEFEFEFEFEP1FFC3J%;"8"9"8"J#:"<"<"<"<"J#
+;FEFEEEEEEEFEEEFEJC3FEC3C3C3C3C3P1C3FFJ%9%:)G":#>#J#
+BFEFEEEEEFEFEEEEEEEFEFEEEEEFEFEEEFEFEFEFEC3Q$FFC3J5B'<%D#J#
+;4EEFEFEFEEEFEFEEEFEFEFEFEEEEEEEFEFEFEFEEEEEFEFEFEFEEEEEFEFEEEC3FEQ$C3FFJ#<v9%:#8#:%8#:&8#>#J#
+4EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFEC3Q$FFC3J#J#
+OKC3FEQ$C3FFJ#J#
+OKFEC3Q$FFC3J#J#J#
+OKC3FECC3C3P-C3FFJ5
+OKQ(FEC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3&J5C%
+F7F7F7F7F7OFQ(C3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFF7F7F7F7&JzC&
+F6F6F6F6F6OFQ(FEF6F6F6F6F68$J%
+F9F9F9S.F9F9F9F7Jz
+OIQ,EE
+
+
+
+
+
+
+
+
+
+
+
+
+
+<z"z"z
+0F6F7R7F6F71F6;z8z8z
+1F9R6F91F9
+
+7z8z8z
+5F7R6F74F7"J"J"
+F76F7R7F7
+ENDBITMAP
+%%EndBinary
+81 477 288 645.14 R
+7 X
+V
+4 8 Q
+0 X
+(option add *textBackground \322GhostWhite\323) 81 639.81 T
+(frame .login) 81 619.81 T
+(entryf) 81 609.81 T
+(ield .login.user -labeltext \322User:\323 \134) 109.8 609.81 T
+( -width 10 -f) 81 599.81 T
+(ixed 10 \134) 157.8 599.81 T
+( -validate alphabetic -invalid bell) 81 589.81 T
+(entryf) 81 569.81 T
+(ield .login.passwd) 109.8 569.81 T
+( -labeltext \322Password:\323 \134) 81 559.81 T
+( -show \134267 -command LoginProc) 81 549.81 T
+(Labeledwidget::alignlabels \134) 81 529.81 T
+(.login.user .login.passwd) 100.2 519.81 T
+(pack .login -padx 10 -pady 10) 81 499.81 T
+(pack .login.user -f) 81 489.81 T
+(ill x -pady 5) 172.2 489.81 T
+(pack .login.passwd -f) 81 479.81 T
+(ill x -pady 5) 181.8 479.81 T
+0 10 Q
+(FIGURE 3) 94.3 452.18 T
+1 F
+( - Login screen with aligned labels) 140.69 452.18 T
+0 0 612 792 C
+1 10 Q
+0 X
+0 0 0 1 0 0 0 K
+(buttons should perform all processing of the dialog con-) 315 326.33 T
+(tents.) 315 314.33 T
+(The Dialog mega-widget class also contains a pre-) 315 296.33 T
+(de\336ned extensible location called a \322child site\323. This is) 315 284.33 T
+(an internally packed standard Tk frame which may be) 315 272.33 T
+(used as a parent for whole combinations of user speci-) 315 260.33 T
+-0.36 (\336ed widgets. Figure 5 illustrates the position of the child) 315 248.33 P
+-0.25 (site frame in an instance of the Dialog class. In the login) 315 236.33 P
+(screen example, this frame can be \336lled with the user) 315 224.33 T
+(name and password Entry\336eld mega-widgets.) 315 212.33 T
+315 333 540 720 C
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+315 362.14 540 720 R
+7 X
+0 0 0 1 0 0 0 K
+V
+0.5 H
+2 Z
+0 X
+N
+%%BeginBinary: 4964
+254 173 130.63 88.97 0 355.37 622.03
+/red <
+72FFFFFFFFFFFFFFFFFFFFFFFFFF66F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF80808080
+8080808080808080808080808080808080808080404040404040404040404040
+4040404040404040404040000000000000000000000000000000000039C069DD
+00FF0000003333330033CCDD9999112277005544FFCC66AABBFF33EE9999CC7A
+EFD39765E1A36FE700FF5500557FB22EB099FFFFB07AFFCC0087AFB4CD73E6A2
+4DBF88F558D7439D50D080C0C080C0808060C000FFA000FFBE8BD28BD9B3FF72
+20C0A040C040D060F0E010B499A0FF0019BF2FFF6223852F465F4770FF0000FF
+> store
+/green <
+9F0000000000000000000000000099DEFFFFFFBFBFBFBFBF8080808080404040
+40000000FFFFFFFFFFBFBFBFBF808080808040404040400000000000FFFFFFFF
+FFBFBFBFBFBF8080808040404040400000000000FFFFFFFFFFBFBFBFBFBF8080
+8080804040400000000000FFFFFFBFBFBFBFBF80808040404040400063E0B500
+996699FF00663399BBFF99DD99FF112277005544CCCC66AABB6600EE6600CC69
+E3B59765E1A36FE700FF1A006B7FB28B3099FFFFB094FFF700CEEEEE0073E6A2
+4DBF88F558D74DB38080C0C080C080808060C08000A08040BE5BB477D9B3FF77
+2070A0402040D0F0F0E010B489A0E4FF19264F00B641DE4F829E4780FF0000FF
+> store
+/blue <
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3BF8040FFBF804000FFBF804000FFBF80
+00BF8040FFBF804000FF804000FFBF804000FFBF804000FFBF804000FFBF8040
+00FFBF804000FFBF4000FFBF804000FFBF804000FFBF804000FFBF804000FFBF
+804000FFBF00FFBF804000BF8040FFBF804000FFBF40FFBF8040004063E0B500
+FF3399FF88666666009966DDFFFF112277DD554499FFCCAABBCC99EE9966CC69
+E3B59765E1A36FE7BFCC8BEE2F7FB257606BFBB3B015322480FAEEB40073E6A2
+4DBF88F558D756CAD050C080C08080C08060C080FF000040BE7A8C65D9B3E085
+2070C0802040D06050E010B476A0C40070264F00FC5AE050B4A0FF9000FF00FF
+> store
+ BEGINBITMAPCOLORc
+z"z"z"
+6F6F7R7F6F76F6F7J"
+S6F78z8z8z
+4F9R6F94F9
+
+;z"
+S-F7F6<z"z"z"z
+0F6F7R&F6F70F6F70F6=z8z8z8z
+/F9R%F9/F9/F9
+J%J#F'
+O=FEFEFEFE5FEFEFEFEFEFEF9FEJ"8"J'Js"
+O=F9F9FFEFEF9F9F9FEP4F6F7J#8#J"Jr
+P$FEFEF9F94F9P5F9J$:*8'?#8"9$8'8$:$8'
+OHFEFEFEFEFEFEFEF9F9FEFEFEFEFEFEF9FEFEFEFEF9FEFEFEFEFEFEF9FEFEFEFEFEFEFEFEFEFEFEF9FEFE@s"J1:"8%<"9#8)8"808%J$
+F6F7O3FEFEFEF9FEFEFEF9FEFEF9F9FEFEF9F9F9FEF9FEFEF9FEFEFEFEFEF9FEFEF9F9FEFEFEFEF9FEFEF9FEFEFEF9FEFEF9F9FEF9FEFEO0F6F6F7ArJ$H"@#9"9%:$9"<"<"J"
+F9O6F9F9F9F9F9F9FEF9F9F9F9F9F9F9FEFEF9O4F9@sJ"?'I"8#H%9%J#
+F7O2FEF9FEFEFEFEF9FEF9F9F9F9F9F9F9F9F9F9O8F7F7@tJ":$9&J">%?%9%J$
+F9O0FEFEF9FEFEF9F9F9F95FEFEF9FEFEFEF9FEFEFEF9FEFEO8F9F9F9J"8$9(8(8$8"9"<08"808"9"
+O=FEFEFEFEF9F9FEFEFEF9F9FEFEFEFEFEF9FEFEF9FEFEFEF9FEFEFEFEF9F9F9F9FEFEFEF9F9FEFEF9F9FEFEFEF9F9F9F9FEFEFEF9F9FEFEFEJs9$9";"x;':$8%:$:$8sJs
+O=F9F9F9F9F9FEF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9O=F7J&Jt
+P FEF9F9F9F9Q F9J(
+P F9FEFEFEFEFEF9=z8z8z8z
+/F7R%F7/F7/F7rF"J"F"F%
+F7F7R&F7F7F7F7F7F7'z&
+F6F6F6F6F6F7S,EEF6F6F6F6F68$J%
+F9F9F9S.F9F9F9F7
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Jz
+OKQ(A2J"
+S$FFJz"
+OMQ$C3FF
+J#9#J$<$
+4FEFEFEFEOBFEFEFEFEFEFEJ#<%G"
+P/C3C3FEC3C3C3FEJ%9%8)
+=FEFEFEFEFEFEFEFEFEFEEEFEFEEEFEFEJ.9"J&8#8#?&9$9&8&9$
+<FEFEEEEEFEFEEEFEFEEEEEFEFEFEO!FEFEFEC3FEFEFEFEFEFEFEFEFEFEFEFEFEFEC3FEFEFEFEFEFEFEFEFEFEFEJ%A&J)9"@&8&8&8&8&
+>FEEEEEEEEEEEEEEEEEJC3FEC3FEC3FEC3C3C3C3FEC3C3C3FEC3C3C3FEC3FEC3C3C3C3FEC3C3C3FEC3C3C3FEJ&:#;"J$G&
+<EEEEFEFEFEFEFEEEO?FEFEFEC3FEFEFEC3J"8"9%J%G%
+>EEFEEEEEEEEEOCC3C3C3C3C3C3C3FEJ-=#=#J"D$
+4EEFEFEEEFEFEEEEEFEFEEEEEFEFEFEFEO=FEFEC3FEJ":.J";59&8%:,
+7FEEEFEFEFEFEEEEEEEFEFEFEFEEEO%FE4FEC3C3FEFEFEC3FEC3FEFEFEFEFEFEC3FEFEFEFEC3FEFEFEC3FEFEFEFEC3FEFEFEC3C3C3FEFEFEC3J&9%9%8#:#Jr8z:$9%;$9$
+5EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEJC31C3C3C3C3C3C3C3C3C3C3C3C3C3C3
+
+
+JZ
+OMQ$J"
+OLFFJz
+OKQ(EE
+
+
+
+
+
+
+
+
+
+
+Jz
+OIQ,FE
+Jz
+OKQ(A2J"
+S$FFJz"
+OMQ$C3FFJ#
+PBFEFEJ'J#
+4FEFEFEFEFEFEO#FEFEJ&
+6EEEEEEFEFEJ%9%9%8#8#8#8%8);#
+<FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEEEFEFEEEFEFEFEFEJ5B'9"8%
+;4FEFEEEEEFEFEEEFEFEEEEEFEFEEEFEFEEEEEFEFEFEFEEEEEFEFEFEFEFEEEFEJ(=%9):$A#9":#
+6FEFEFEFEEEEEEEFEEEEEEEFEEEEEEEEEEEFEFEFEFEEEEEEEEEEEEEJ%8$9&8&J"J"<"<"<"<"
+6EEEEEEEEFEFEFEEEEEFEFEFEEEEEFEFEFE6EE:FEFEFEFEFEJ%;"8"9"8"J"<"<"<"<"
+;FEFEEEEEEEFEEEFEO"C3C3C3C3C3J%9%:)G":#
+BFEFEEEEEFEFEEEEEEEFEFEEEEEFEFEEEFEFEFEJ5B'<%
+;4EEFEFEFEEEFEFEEEFEFEFEFEEEEEEEFEFEFEFEEEEEFEFEFEFEEEEEFEFEEEJ#<v9%:#8#:%8#:&8#
+4EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
+
+J#
+PBC3C3JZ
+OMQ$J"
+OLFFJz
+OKQ(FE
+Jz
+OIQ,EE
+
+
+
+
+
+
+
+
+
+
+
+
+Jz
+EOAECJ"
+P7FFJz"
+GO=EEFF
+
+
+JZJZ
+KO5AO5J"J"
+P1ECP'ECJz"Jz"
+MO1EEECDO1EEEC
+
+
+
+
+J%:#9#J%J#
+O7FEFEFEFEFEFEFEFEO=FEFEFEFE=FEFEJ'=$J'
+O6FEFEEEEEFEFEFEFEEEO<FEFEEEEEFEFEJ$8$;$J$8(8&9%9%
+O5FEFEEEEEFEFEFEFEEEO<FEFEEEEEEEEEFEFEFEFEFEFEEEFEFEFEFEFEFEFEFEFEFEJ$J'93
+OAFEFEEEODFEFEEEEEFEFEFEEEFEFEEEFEFEEEEEFEFEEEFEFEEEEEFEFEJ#=">#
+Q:EEEEEEEEEEJ$J$I#
+OAEEFEFEOEFEFEFEFEFEJ$J%I%
+OBEEFEFEOCFEFEEEEEEEEEEEEEJ$8$<$J$8#H#;#
+O5EEFEFEFEFEEEEEFEFEO;EEFEFEFEFEFEFEFEFEJ'>$J.=.
+O6EEFEFEFEFEEEEEFEFEO;EEFEFEFEFEEEEEFEFEFEEEFEFEEEFEFEFEFEEEEEEEFEFEFEFEEEJ%:#:#J%8s8#8%9%8#
+O7EEEEEEEEEEEEEEEEO<EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
+
+
+
+
+
+
+
+JzJz
+MO1ECEO1ECJ"J"
+LECP'ECJzJz
+KO5EEAO5EE
+
+
+JZ
+GO=J"
+FFFJz
+EOAEE&J%
+F7F7F7F7F7S-F7F7F7F7&J&
+F6F6F6F6F6S-F6F6F6F6F68$J%
+F9F9F9S.F9F9F9F7
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<z"z"z
+0F6F7R7F6F71F6;z8z8z
+1F9R6F91F9
+
+7z8z8z
+5F7R6F74F7"J"J"
+F76F7R7F7
+ENDBITMAP
+%%EndBinary
+323.29 369 530.29 616.29 R
+7 X
+V
+4 8 Q
+0 X
+(option add *textBackground \322GhostWhite\323) 323.29 610.95 T
+(frame .login) 323.29 590.95 T
+(entryf) 323.29 580.95 T
+(ield .login.user -labeltext \322User:\323 \134) 352.09 580.95 T
+( -width 10 -f) 323.29 570.95 T
+(ixed 10 \134) 400.09 570.95 T
+( -validate alphabetic -invalid bell \134) 323.29 560.95 T
+( -command {.login.bbox invoke}) 323.29 550.95 T
+(entryf) 323.29 540.95 T
+(ield .login.passwd \134) 352.09 540.95 T
+( -labeltext \322Password:\323 -show \134267 \134) 323.29 530.95 T
+( -command {.login.bbox invoke}) 323.29 520.95 T
+(Labeledwidget::alignlabels \134) 323.29 500.95 T
+( .login.user .login.passwd) 323.29 490.95 T
+(buttonbox .login.bbox -orient horizontal) 323.29 470.95 T
+(.login.bbox add OK -text OK \134) 323.29 460.95 T
+( -command LoginProc) 323.29 450.95 T
+(.login.bbox add Cancel -text Cancel \134) 323.29 440.95 T
+( -command exit) 323.29 430.95 T
+(.login.bbox default OK) 323.29 420.95 T
+(pack .login -padx 10 -pady 10) 323.29 400.95 T
+(pack .login.user -f) 323.29 390.95 T
+(ill x -pady 5) 414.48 390.95 T
+(pack .login.passwd -f) 323.29 380.95 T
+(ill x -pady 5) 424.08 380.95 T
+(pack .login.bbox -f) 323.29 370.95 T
+(ill x) 414.48 370.95 T
+0 10 Q
+(FIGURE 4) 347.35 348.02 T
+1 F
+( - Login screen with buttons) 393.74 348.02 T
+0 0 612 792 C
+315 72 540 189 C
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+315 90.72 540 180 R
+7 X
+0 0 0 1 0 0 0 K
+V
+0.5 H
+2 Z
+0 X
+N
+%%BeginBinary: 4028
+196 140 100.8 72 0 376.2 99
+/red <
+72FFFFFFFFFFFFFFFFFFFFFFFFFF66F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF80808080
+8080808080808080808080808080808080808080404040404040404040404040
+4040404040404040404040000000000000000000000000000000000039C069DD
+00FF0000003333330033CCDD9999112277005544FFCC66AABBFF33EE9999CC7A
+EFD39765E1A36FE700FF5500557FB22EB099FFFFB07AFFCC0087AFB4CD73E6A2
+4DBF88F558D7439D50D080C0C080C0808060C000FFA000FFBE8BD28BD9B3FF72
+20C0A040C040D060F0E010B499A0FF0019BF2FFF6223852F465F4770FF0000FF
+> store
+/green <
+9F0000000000000000000000000099DEFFFFFFBFBFBFBFBF8080808080404040
+40000000FFFFFFFFFFBFBFBFBF808080808040404040400000000000FFFFFFFF
+FFBFBFBFBFBF8080808040404040400000000000FFFFFFFFFFBFBFBFBFBF8080
+8080804040400000000000FFFFFFBFBFBFBFBF80808040404040400063E0B500
+996699FF00663399BBFF99DD99FF112277005544CCCC66AABB6600EE6600CC69
+E3B59765E1A36FE700FF1A006B7FB28B3099FFFFB094FFF700CEEEEE0073E6A2
+4DBF88F558D74DB38080C0C080C080808060C08000A08040BE5BB477D9B3FF77
+2070A0402040D0F0F0E010B489A0E4FF19264F00B641DE4F829E4780FF0000FF
+> store
+/blue <
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3BF8040FFBF804000FFBF804000FFBF80
+00BF8040FFBF804000FF804000FFBF804000FFBF804000FFBF804000FFBF8040
+00FFBF804000FFBF4000FFBF804000FFBF804000FFBF804000FFBF804000FFBF
+804000FFBF00FFBF804000BF8040FFBF804000FFBF40FFBF8040004063E0B500
+FF3399FF88666666009966DDFFFF112277DD554499FFCCAABBCC99EE9966CC69
+E3B59765E1A36FE7BFCC8BEE2F7FB257606BFBB3B015322480FAEEB40073E6A2
+4DBF88F558D756CAD050C080C08080C08060C080FF000040BE7A8C65D9B3E085
+2070C0802040D06050E010B476A0C40070264F00FC5AE050B4A0FF9000FF00FF
+> store
+ BEGINBITMAPCOLORc
+z"z"z"
+6F6F7Q+F6F76F6F7J"
+R*F78z8z8z
+4F9Q*F94F9
+
+;z"
+R!F7F6<z"z
+0F6F7Q<F6=z8z
+/F9Q;F9
+Jr:#@$
+OGFEFEFEFEFEFEJ"8&E"
+OGF9F9F9F9FEFEF9J$8#J#
+OMF9FEFEF9F9;FEFEJ$9%@$:&
+P#FEFEFEFEFEFEFEFEFEFEFEFEFEFEF9@s"J"<%=/
+F6F7O>F9F9F9FEFEFEFEFEF9FEFEFEF9FEFEF9F9FEFEArJ$A$
+F9OEF9FEFEF9F9F9@sJ%G'
+F7ODFEFEF9F9F9FEFEFEFEF9@tJ$?"A$9&
+F9O:FEFEF9FEFEF9FEFEF9F9F9F9J"8&8"8'8$8*8&
+OGFEFEFEFEFEF9FEFEF9F9FEFEF9FEF9FEFEF9F9F9FEFEFEF9F9FEFEFEFEFEJr9%8v9$9";"
+OGF9F9F9F9F9F9F9F9F9F9FEJ&
+P=FEF9F9F9F9J(
+P=F9FEFEFEFEFEF9=z8z
+/F7Q;F7rF"J%
+F7F7Q<F7F7F7F7'z&
+F6F6F6F6F6F7R EEF6F6F6F6F68$J%
+F9F9F9R"F9F9F9F7
+
+
+
+
+
+
+
+Jz
+CPBFE
+
+
+
+J$8"8#B$@#D#G%8";$?#
+KFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFJ(8"J#D#G)
+IFFFFFEFEFEFFFFFF9FFFFFFFFFFFFFEFEFEFEFFFFJ$9"9"J#D#F$:"
+HFFFFFEFEFE9FEFEFEFEFFFFFEFEJ"G$J"<$
+O!FEFEFEFEO$FEFEFEFEJ$<"J"
+GFFFFFEFEO8FE
+J%<%J$I"A%<$8%=$
+O(FFFFFFFFFFFFFFFF6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFJ';#J'F"8"@#>$8%;(
+O'FFFEFEFEFFFFFEFE6FFFFFEFEFEFFFEFFFEFEFEFEFEFEFEFEFEFFFFFEFEFEFFFFJ"9$J$9"G"8$J$9$
+O'FEFEFFFF;FFFFFEFEFEFFFFFF>FFFFFEFEFFFFJ#9#J"
+P4FEFEFFFFEFFJ$J$8"J$;"
+OHFFFFFE9FEFEFEFF:FFFFFEFEJ"8"JR
+P9FEFF;J"Jt
+P:FE=FE
+
+J$<"J$J"J&
+GFEFFFFFFEFEFFFF5FFAFFFEFEFFFFJ"<$J"
+P3FFFFFFFECFFJ$9$J$9"H":$G$9#8$:$
+HFEFFFFFFFFFEFFEFFFFFFFFFFFFFEFEFFFFFFFEFEFFFFFFFFFEJ(8"8"9"8"9#8#<#8#<'8"D);#8#>':)
+IFEFEFFFFFFFEFEFFFFFFFFFFFFFFFFFFFFFFFFFEFEFFFFFFFEFFFEFEFFFFFFFFFEFEFFFFFFFFFEFFFFFFFFFEFEFEFFFFFFFFFEFEJ$:%9%9'<'>rC"8%='?%=%
+KFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
+
+
+
+
+Jz
+CPBEE
+
+
+
+
+
+
+
+
+<z
+R EC=z"
+QLEEFF=Z
+QL<z
+R EE
+
+
+
+
+
+
+
+Ez
+OAECJ"
+P!FFGz"
+O=EEFF
+
+
+JZJZ
+5O54O5J"J"
+OIECOHECJz"Jz"
+7O1EEEC7O1EEEC
+
+
+
+
+J%:#9#J%J#
+O!FEFEFEFEFEFEFEFEO0FEFEFEFE=FEFEJ'=$J'
+O FEFEEEEEFEFEFEFEEEO/FEFEEEEEFEFEJ$8$;$J$8(8&9%9%
+MFEFEEEEEFEFEFEFEEEO/FEFEEEEEEEEEFEFEFEFEFEFEEEFEFEFEFEFEFEFEFEFEFEJ$J'93
+O+FEFEEEO7FEFEEEEEFEFEFEEEFEFEEEFEFEEEEEFEFEEEFEFEEEEEFEFEJ#=">#
+PEEEEEEEEEEEJ$J$I#
+O+EEFEFEO8FEFEFEFEFEJ$J%I%
+O,EEFEFEO6FEFEEEEEEEEEEEEEJ$8$<$J$8#H#;#
+MEEFEFEFEFEEEEEFEFEO.EEFEFEFEFEFEFEFEFEJ'>$J.=.
+O EEFEFEFEFEEEEEFEFEO.EEFEFEFEFEEEEEFEFEFEEEFEFEEEFEFEFEFEEEEEEEFEFEFEFEEEJ%:#:#J%8s8#8%9%8#
+O!EEEEEEEEEEEEEEEEO/EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
+
+
+
+
+
+
+&J%
+F7F7F7F7F7R!F7F7F7F7&HzJzG&
+F6F6F6F6F6O1EC8O1ECF6F6F6F6F68$G"J"J%
+F9F9F9ECOHECOCF9F9F9F7JzJz
+5O5EE4O5EE
+
+
+GZ
+O=F"
+FFEz
+OAEE
+
+
+
+
+
+
+
+<z"z"z
+0F6F7Q+F6F71F6;z8z8z
+1F9Q*F91F9
+
+7z8z8z
+5F7Q*F74F7"J"J"
+F76F7Q+F7
+ENDBITMAP
+%%EndBinary
+0 10 Q
+(FIGURE 5) 369 74.89 T
+1 F
+( - Dialog child site) 415.39 74.89 T
+0 0 612 792 C
+FMENDPAGE
+%%EndPage: "3" 3
+%%Page: "4" 4
+612 792 0 FMBEGINPAGE
+[0 0 0 1 0 0 0]
+[ 0 1 1 0 1 0 0]
+[ 1 0 1 0 0 1 0]
+[ 1 1 0 0 0 0 1]
+[ 1 0 0 0 0 1 1]
+[ 0 1 0 0 1 0 1]
+[ 0 0 1 0 1 1 0]
+ 7 FrameSetSepColors
+FrameNoSep
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+1 10 Q
+0 X
+0 0 0 1 0 0 0 K
+-0.02 (Once a dialog is created, it is displayed based on modal-) 72 713.33 P
+(ity via the \324activate\325 command. For application and glo-) 72 701.33 T
+(bal modal dialogs, control is not immediately returned.) 72 689.33 T
+-0.06 (Instead, it is delayed until invocation of the \324deactivate\325) 72 677.33 P
+(command which accepts an optional ar) 72 665.33 T
+(gument that is) 227.62 665.33 T
+(returned as a result of the \324activate\325 command. This) 72 653.33 T
+-0.08 (allows user control of dialog unmapping, status noti\336ca-) 72 641.33 P
+(tion, and determination.) 72 629.33 T
+(For example, two buttons could be added to a global) 72 607.33 T
+-0.17 (modal dialog, each button specifying a command which) 72 595.33 P
+(executes the \324deactivate\325 command with a unique ar) 72 583.33 T
+(gu-) 279.82 583.33 T
+(ment. The application could then activate the dialog,) 72 571.33 T
+(wait for deactivation, and perform actions based on the) 72 559.33 T
+(return value. This could all be placed in an \322if\323 state-) 72 547.33 T
+(ment. The Dialog class uses this optional deactivation) 72 535.33 T
+(ar) 72 523.33 T
+(gument to provide default return values of zero and) 79.59 523.33 T
+(one for the \322OK\323 and \322Cancel\323 buttons as indicators of) 72 511.33 T
+-0.06 (the dialog exit status. This ability proves useful for stan-) 72 499.33 P
+(dard dialog management.) 72 487.33 T
+-0.34 (Figure 6 illustrates the new login screen implemented as) 72 463.33 P
+(an application modal Dialog composed of the two) 72 451.33 T
+(Entry\336elds. The need for explicit default button bind-) 72 439.33 T
+72 76 297 436 C
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+72 98.29 297 436 R
+7 X
+0 0 0 1 0 0 0 K
+V
+0.5 H
+2 Z
+0 X
+N
+%%BeginBinary: 7633
+254 176 130.63 90.51 0 123.86 339.34
+/red <
+3EC472FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF80808080
+8080808080808080808080808080808080808080404040404040404040404040
+4040404040404040404040000000000000000000000000000000000039C069DD
+00FF0000003333330033CCDD9999112277005544FFCC66AABBFF33EE9999CC7A
+EFD39765E1A36FE700FF5500B2557F2EAFB4CD73E6A24DBF008799FFFFF5B0B0
+7AFFCC88BE8BD28BD9B3FF72439D58D750D080C0C080C0808060C000FFA000FF
+20C0A040C040D060F0E010B4A099FF0019BF2FFF6223852F465F4770FF0000FF
+> store
+/green <
+57D79F00000000000000000000000000FFFFFFBFBFBFBFBF8080808080404040
+40000000FFFFFFFFFFBFBFBFBF808080808040404040400000000000FFFFFFFF
+FFBFBFBFBFBF8080808040404040400000000000FFFFFFFFFFBFBFBFBFBF8080
+8080804040400000000000FFFFFFBFBFBFBFBF80808040404040400063E0B500
+996699FF00663399BBFF99DD99FF112277005544CCCC66AABB6600EE6600CC69
+E3B59765E1A36FE700FF1A00B26B7F8BEEEE0073E6A24DBF00CE99FFFFF530B0
+94FFF788BE5BB477D9B3FF774DB358D78080C0C080C080808060C08000A08040
+2070A0402040D0F0F0E010B4A089E4FF19264F00B641DE4F829E4780FF0000FF
+> store
+/blue <
+8CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF8040FFBF804000FFBF804000FFBF80
+00BF8040FFBF804000FF804000FFBF804000FFBF804000FFBF804000FFBF8040
+00FFBF804000FFBF4000FFBF804000FFBF804000FFBF804000FFBF804000FFBF
+804000FFBF00FFBF804000BF8040FFBF804000FFBF40FFBF8040004063E0B500
+FF3399FF88666666009966DDFFFF112277DD554499FFCCAABBCC99EE9966CC69
+E3B59765E1A36FE7BFCC8BEEB22F7F57EEB40073E6A24DBF80FA6BFBB3F560B0
+15322488BE7A8C65D9B3E08556CA58D7D050C080C08080C08060C080FF000040
+2070C0802040D06050E010B4A076C40070264F00FC5AE050B4A0FF9000FF00FF
+> store
+ BEGINBITMAPCOLORc
+z"z"z"
+6F6F7R7F6F76F6F7J"
+S6F78z8z8z
+4F9R6F94F9
+
+;z"
+S-F7F6<z"z
+0F6F7RHF6=z8z
+/F9RGF9
+J%J#F'
+P FEFEFEFE5FEFEFEFEFEFEF9FEJ"8"J'
+P F9F9FFEFEF9F9F9FEJ#8#J"
+P5FEFEF9F94F9J$:*8'?#8"9$8'8$:$8'
+P+FEFEFEFEFEFEFEF9F9FEFEFEFEFEFEF9FEFEFEFEF9FEFEFEFEFEFEF9FEFEFEFEFEFEFEFEFEFEFEF9FEFE@s"J1:"8%<"9#8)8"808%
+F6F7ODFEFEFEF9FEFEFEF9FEFEF9F9FEFEF9F9F9FEF9FEFEF9FEFEFEFEFEF9FEFEF9F9FEFEFEFEF9FEFEF9FEFEFEF9FEFEF9F9FEF9FEFEArJ$H"@#9"9%:$9"<"<"
+F9OGF9F9F9F9F9F9FEF9F9F9F9F9F9F9FEFEF9@sJ"?'I"8#H%9%
+F7OCFEF9FEFEFEFEF9FEF9F9F9F9F9F9F9F9F9F9@tJ":$9&J">%?%9%
+F9OAFEFEF9FEFEF9F9F9F95FEFEF9FEFEFEF9FEFEFEF9FEFEJ"8$9(8(8$8"9"<08"808"9"
+P FEFEFEFEF9F9FEFEFEF9F9FEFEFEFEFEF9FEFEF9FEFEFEF9FEFEFEFEF9F9F9F9FEFEFEF9F9FEFEF9F9FEFEFEF9F9F9F9FEFEFEF9F9FEFEFEJs9$9";"x;':$8%:$:$8s
+P F9F9F9F9F9FEF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9J&
+P1FEF9F9F9F9J(
+P1F9FEFEFEFEFEF9=z8z
+/F7RGF7rF"J%
+F7F7RHF7F7F7F7'z&
+F6F6F6F6F6F7S,EEF6F6F6F6F68$J%
+F9F9F9S.F9F9F9F7
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+J5
+OKQ(BDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEJ5
+OKQ(FEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDJ#z"
+OKBDFEQ%BDFFJ#J#
+OKFEBDQ$FFBDJ#9#J#F$<$J#
+4FEFEFEFEO0BDFEFEFEFEFEFEFEP6BDFFJ#F#<%G"J#
+OKFEBDBDBDFEBDBDBDFEP$FFBDJ%9%8)J#J#
+=FEFEFEFEFEFEFEFEFEFEEEFEFEEEFEFEGBDFEQ$BDFFJ.9"J)8#8#?&9$9&8&9$J#
+<FEFEEEEEFEFEEEFEFEEEEEFEFEFELFEBDBDFEFEFEBDFEFEFEFEFEFEFEFEFEFEFEFEFEFEBDFEFEFEFEFEFEFEFEFEFEFEOIFFBDJ%A&J,9"@&8&8&8&8&J#
+>FEEEEEEEEEEEEEEEEEGBDFEBDBDFEBDFEBDFEBDBDBDBDFEBDBDBDFEBDBDBDFEBDFEBDBDBDBDFEBDBDBDFEBDBDBDFEOHBDFFJ&:#;"J#J$G&J#
+<EEEEFEFEFEFEFEEELFEBD?FEFEFEBDFEFEFEBDOHFFBDJ"8"9%J#J%G%J#
+>EEFEEEEEEEEEO"BDFE?BDBDBDBDBDBDBDFEOHBDFFJ-=#=#J#J"D$J#
+4EEFEFEEEFEFEEEEEFEFEEEEEFEFEFEFEGFEBDBFEFEBDFEOLFFBDJ":.J%;59&8%:,J#
+7FEEEFEFEFEFEEEEEEEFEFEFEFEEEO"BDFEBDFE4FEBDBDFEFEFEBDFEBDFEFEFEFEFEFEBDFEFEFEFEBDFEFEFEBDFEFEFEFEBDFEFEFEBDBDBDFEFEFEBDOHBDFFJ&9%9%8#:#J"t8z:$9%;$9$J#
+5EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEGFEBD1BDBDBDBDBDBDBDBDBDBDBDBDBDBDOIFFBDJ#J#
+OKBDFEQ$BDFFJ#J#
+OKFEBDQ$FFBDJ#J#
+OKBDFEQ$BDFFJ5
+OKQ(FEBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDJ5
+OKQ(BDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFJz
+OKQ(EE
+
+
+
+
+
+
+
+
+
+
+Jz
+OIQ,FE
+J5
+OKQ'BDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDJ5
+OKQ(FEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDJ#z"
+OKBDFEQ%BDFFJ#J#J#
+OKFEBDCFEFEP-FFBDJ'J#B#J#
+4FEFEFEFEFEFEO#FEFEBDFEQ$BDFFJ&J#J#
+6EEEEEEFEFEO0FEBDQ$FFBDJ%9%9%8#8#8#8%8);#>#J#
+<FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEEEFEFEEEFEFEFEFEBDFEQ$BDFFJ5B'9"8%D#J#
+;4FEFEEEEEFEFEEEFEFEEEEEFEFEEEFEFEEEEEFEFEFEFEEEEEFEFEFEFEFEEEFEFEBDQ$FFBDJ(=%9):$A#9":#>#J#
+6FEFEFEFEEEEEEEFEEEEEEEFEEEEEEEEEEEFEFEFEFEEEEEEEEEEEEEBDFEQ$BDFFJ%8$9&8&J"J#:"<"<"<"<"J#
+6EEEEEEEEFEFEFEEEEEFEFEFEEEEEFEFEFE6EE4FEBDFEFEFEFEFEP1FFBDJ%;"8"9"8"J#:"<"<"<"<"J#
+;FEFEEEEEEEFEEEFEJBDFEBDBDBDBDBDP1BDFFJ%9%:)G":#>#J#
+BFEFEEEEEFEFEEEEEEEFEFEEEEEFEFEEEFEFEFEFEBDQ$FFBDJ5B'<%D#J#
+;4EEFEFEFEEEFEFEEEFEFEFEFEEEEEEEFEFEFEFEEEEEFEFEFEFEEEEEFEFEEEBDFEQ$BDFFJ#<v9%:#8#:%8#:&8#>#J#
+4EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFEBDQ$FFBDJ#J#
+OKBDFEQ$BDFFJ#J#
+OKFEBDQ$FFBDJ#J#J#
+OKBDFECBDBDP-BDFFJ5
+OKQ(FEBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDJ5
+OKQ(BDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFJz
+OKQ(FE
+Jz
+OIQ,EE
+
+
+
+
+
+
+
+
+
+
+
+
+
+<z
+S,ED=z"
+S*EEFF=Z
+S*<z
+S,EE
+
+
+
+
+
+
+
+Jz
+BOAEDJ"
+P4FFJz"
+DO=EEFF
+
+
+JZJZ
+HO5GO5J"J"
+P.EDP-EDJz"Jz"
+JO1EEEDJO1EEED
+
+
+
+
+J%:#9#J%J#
+O4FEFEFEFEFEFEFEFEOCFEFEFEFE=FEFEJ'=$J'
+O3FEFEEEEEFEFEFEFEEEOBFEFEEEEEFEFEJ$8$;$J$8(8&9%9%
+O2FEFEEEEEFEFEFEFEEEOBFEFEEEEEEEEEFEFEFEFEFEFEEEFEFEFEFEFEFEFEFEFEFEJ$J'93
+O>FEFEEEOJFEFEEEEEFEFEFEEEFEFEEEFEFEEEEEFEFEEEFEFEEEEEFEFEJ#=">#
+Q=EEEEEEEEEEJ$J$I#
+O>EEFEFEOKFEFEFEFEFEJ$J%I%
+O?EEFEFEOIFEFEEEEEEEEEEEEEJ$8$<$J$8#H#;#
+O2EEFEFEFEFEEEEEFEFEOAEEFEFEFEFEFEFEFEFEJ'>$J.=.
+O3EEFEFEFEFEEEEEFEFEOAEEFEFEFEFEEEEEFEFEFEEEFEFEEEFEFEFEFEEEEEEEFEFEFEFEEEJ%:#:#J%8s8#8%9%8#
+O4EEEEEEEEEEEEEEEEOBEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
+
+
+
+
+
+
+&J%
+F7F7F7F7F7S-F7F7F7F7&JzJzJ&
+F6F6F6F6F6EO1EDKO1EDEF6F6F6F6F68$J"J"J%
+F9F9F9DEDP-EDP)F9F9F9F7JzJz
+HO5EEGO5EE
+
+
+JZ
+DO=J"
+CFFJz
+BOAEE
+
+
+
+
+
+
+
+<z"z"z
+0F6F7R7F6F71F6;z8z8z
+1F9R6F91F9
+
+7z8z8z
+5F7R6F74F7"J"J"
+F76F7R7F7
+ENDBITMAP
+%%EndBinary
+81.71 104.71 288.71 333.71 R
+7 X
+V
+4 8 Q
+0 X
+(option add *textBackground \322GhostWhite\323) 81.71 328.38 T
+(dialog .login -modality application) 81.71 308.38 T
+(.login hide Apply) 81.71 298.38 T
+(.login hide Help) 81.71 288.38 T
+(set cs [.login childsite]) 81.71 268.38 T
+(entryf) 81.71 248.38 T
+(ield $cs.user -labeltext \322User:\323 \134) 110.51 248.38 T
+( -width 10 -f) 81.71 238.38 T
+(ixed 10 \134) 158.51 238.38 T
+( -validate alphabetic) 81.71 228.38 T
+(entryf) 81.71 218.38 T
+(ield $cs.passwd \134) 110.51 218.38 T
+( -labeltext \322Password:\323 -show \134267) 81.71 208.38 T
+(pack $cs.user -f) 81.71 188.38 T
+(ill x -pady 5) 158.51 188.38 T
+(pack $cs.passwd -f) 81.71 178.38 T
+(ill x -pady 5) 168.11 178.38 T
+(Labeledwidget::alignlabels \134) 81.71 158.38 T
+( $cs.user $cs.passwd) 81.71 148.38 T
+(if {[.login activate]} {) 81.71 128.38 T
+( LoginProc [$cs.user get] [$cs.passwd get]) 81.71 118.38 T
+(}) 81.71 108.38 T
+0 10 Q
+(FIGURE 6) 135 83.61 T
+1 F
+( - Login dialog) 181.39 83.61 T
+0 0 612 792 C
+1 10 Q
+0 X
+0 0 0 1 0 0 0 K
+(ings has been left to the Dialog class, making the appli-) 315 713.33 T
+(cation even cleaner) 315 701.33 T
+(.The comparative amount of T) 391.64 701.33 T
+(cl/Tk) 512.86 701.33 T
+(code required to provide the same \337exible functionality) 315 689.33 T
+(would be quite substantial.) 315 677.33 T
+(Since [incr W) 315 653.33 T
+(idgets] was designed to be a means rather) 370.14 653.33 T
+-0.03 (than an end, each mega-widget is itself extensible. [incr) 315 641.33 P
+(Tk] provides the mechanism and framework to build) 315 629.33 T
+(new mega-widgets based upon existing ones using) 315 617.33 T
+(object-oriented techniques such as inheritance and com-) 315 605.33 T
+(position. [incr W) 315 593.33 T
+(idgets] provides \322child sites\323 which) 382.65 593.33 T
+(enable the visual aspects of a mega-widget to be aug-) 315 581.33 T
+(mented.) 315 569.33 T
+(The login screen example could bene\336t from this capa-) 315 545.33 T
+(bility) 315 533.33 T
+(. A new \322Login\323 mega-widget derived from the) 335.47 533.33 T
+(Dialog class can be created, encapsulating the combina-) 315 521.33 T
+-0.14 (tion of widgets required to implement login screen func-) 315 509.33 P
+-0.18 (tionality and enable reuse across many new projects. As) 315 497.33 P
+(a mega-widget, the Login class should maintain the) 315 485.33 T
+(standard options such as background and cursor) 315 473.33 T
+(. It) 506.08 473.33 T
+(should also provide unique options for specifying the) 315 461.33 T
+(labels of the entry widgets so they may be easily modi-) 315 449.33 T
+-0.4 (\336ed. Figure 7 shows the [incr T) 315 437.33 P
+-0.4 (cl]/[incr Tk] code needed) 437.74 437.33 P
+(to implement the \322Login\323 mega-widget class.) 315 425.33 T
+(The Login mega-widget can now be reused in new) 315 401.33 T
+-0.39 (applications. It can be used as the front end to a database) 315 389.33 P
+(or a system administration tool. Since the labels were) 315 377.33 T
+(made public, the Login class can even be international-) 315 365.33 T
+(ized. For example, the \322-userlabel\323, \322-passwdlabel\323) 315 353.33 T
+(options could be given in a foreign dialect or read from) 315 341.33 T
+(a language speci\336c con\336guration \336le. Since the Login) 315 329.33 T
+(class was derived from the Dialog class, the button) 315 317.33 T
+(labels may be modi\336ed as well. T) 315 305.33 T
+(o illustrate, Figure 8) 449.01 305.33 T
+(depicts an instance of the Login mega-widget in Span-) 315 293.33 T
+(ish.) 315 281.33 T
+(One \336nal point. It should be noted that the lack of an) 315 257.33 T
+-0.12 (option being made public does not make it inaccessible.) 315 245.33 P
+(The dilemma is that keeping all options tends to cause) 315 233.33 T
+-0.1 (option explosion, yet only providing a few limits useful-) 315 221.33 P
+(ness. As a general rule, standard options should be kept) 315 209.33 T
+(as well as frequently used options. In the Login mega-) 315 197.33 T
+(widget, standard options were kept and each label was) 315 185.33 T
+(provided a unique option due to a high degree of antici-) 315 173.33 T
+-0.36 (pated usage. Other options such as \322-foreground\323 can be) 315 161.33 P
+(accessed on an as needed basis via the [incr Tk] \324com-) 315 149.33 T
+-0.37 (ponent\325 command or using the option database. Figure 9) 315 137.33 P
+(illustrates both of these methods of component access.) 315 125.33 T
+FMENDPAGE
+%%EndPage: "4" 4
+%%Page: "5" 5
+612 792 0 FMBEGINPAGE
+[0 0 0 1 0 0 0]
+[ 0 1 1 0 1 0 0]
+[ 1 0 1 0 0 1 0]
+[ 1 1 0 0 0 0 1]
+[ 1 0 0 0 0 1 1]
+[ 0 1 0 0 1 0 1]
+[ 0 0 1 0 1 1 0]
+ 7 FrameSetSepColors
+FrameNoSep
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+72 225 540 729 R
+7 X
+0 0 0 1 0 0 0 K
+V
+4 8 Q
+0 X
+( itcl::class Login {) 72 713.67 T
+( inherit) 72 703.67 T
+5 F
+(iwidgets::Dialog) 139.2 703.67 T
+4 F
+( constructor {args} {) 72 683.67 T
+( itk_component add user {) 72 673.67 T
+( Entryf) 72 663.67 T
+(ield $itk_interior.user -labeltext \322User:\323 -width 10 \134) 168 663.67 T
+( -f) 72 653.67 T
+(ixed 10 -validate alphabetic) 268.8 653.67 T
+( } {) 72 643.67 T
+( keep -cursor -background) 72 633.67 T
+( }) 72 623.67 T
+( pack $itk_component\050user\051 -f) 72 613.67 T
+(ill x -pady 5) 254.4 613.67 T
+( itk_component add passwd {) 72 593.67 T
+( Entryf) 72 583.67 T
+(ield $itk_interior.passwd -labeltext \322Password:\323 -show \134267) 163.2 583.67 T
+( } {) 72 573.67 T
+( keep -cursor -background) 72 563.67 T
+( }) 72 553.67 T
+( pack $itk_component\050passwd\051 -f) 72 543.67 T
+(ill x -pady 5) 264 543.67 T
+( hide Help) 72 523.67 T
+( hide Apply) 72 513.67 T
+( eval itk_initialize $args) 72 493.67 T
+( }) 72 483.67 T
+( itk_option def) 72 463.67 T
+(ine -userlabel userLabel Text \322User:\323 {) 168 463.67 T
+( $itk_component\050user\051 conf) 72 453.67 T
+(igure -labeltext $itk_option\050-userlabel\051) 240 453.67 T
+( Labeledwidget::alignlabels $itk_component\050user\051 $itk_component\050passwd\051) 72 443.67 T
+( }) 72 433.67 T
+( itk_option def) 72 413.67 T
+(ine -passwdlabel passwdLabel Text \322Password:\323 {) 168 413.67 T
+( $itk_component\050passwd\051 conf) 72 403.67 T
+(igure -labeltext $itk_option\050-passwdlabel\051) 249.6 403.67 T
+( Labeledwidget::alignlabels $itk_component\050user\051 $itk_component\050passwd\051) 72 393.67 T
+( }) 72 383.67 T
+( method name {} {) 72 363.67 T
+( return [$itk_component\050user\051 get]) 72 353.67 T
+( }) 72 343.67 T
+( method passwd {} {) 72 323.67 T
+( return [$itk_component\050passwd\051 get]) 72 313.67 T
+( }) 72 303.67 T
+( }) 72 293.67 T
+( Login .login -title \322Login Screen\323 -modality application) 72 273.67 T
+( if {[.login activate]} {) 72 253.67 T
+( LoginProc [.login name] [.login passwd]) 72 243.67 T
+( }) 72 233.67 T
+72 225 540 729 R
+0.5 H
+2 Z
+N
+72 207 540 216 R
+7 X
+V
+0 10 Q
+0 X
+(FIGURE 7) 189.15 209.33 T
+1 F
+( - [incr T) 235.54 209.33 T
+(cl]/[incr Tk] Login mega-widget class) 270.66 209.33 T
+72 90 540 198 R
+7 X
+V
+4 8 Q
+0 X
+( Login .login -title \322Spanish Login Screen\323 \134) 72 182.67 T
+( -userlabel \322Nombre:\323 \134) 72 172.67 T
+( -passwdlabel \322Contrasena:\323 \134) 72 162.67 T
+( -modality application) 72 152.67 T
+( .login buttonconf) 72 142.67 T
+(igure OK -text \322Bien\323) 187.2 142.67 T
+( .login buttonconf) 72 132.67 T
+(igure Cancel -text \322Cancelar\323) 187.2 132.67 T
+( if {[.login activate]} {) 72 112.67 T
+( LoginProc [.login name] [.login passwd]) 72 102.67 T
+( }) 72 92.67 T
+72 90 540 198 R
+N
+%%BeginBinary: 8344
+280 176 144 90.51 0 360 98.49
+/red <
+72FFFFFFFFFFFFFFFFFFFFFFFFFF66F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF80808080
+8080808080808080808080808080808080808080404040404040404040404040
+4040404040404040404040000000000000000000000000000000000039C069DD
+00FF0000003333330033CCDD9999112277005544FFCC66AABBFF33EE9999CC7A
+EFD3557F9765E1A36FE700FF5500B22EB099FFFFB07AFFCC0087AFB48858D7CD
+73E6A24DBFF5439D50D080C0C080C0808060C000FFA000FF20C0A040C040D060
+F0E010B4BE8BD28BD9B3FF72A099FF00192FBFFF6223852F465F4770FF0000FF
+> store
+/green <
+9F0000000000000000000000000099DEFFFFFFBFBFBFBFBF8080808080404040
+40000000FFFFFFFFFFBFBFBFBF808080808040404040400000000000FFFFFFFF
+FFBFBFBFBFBF8080808040404040400000000000FFFFFFFFFFBFBFBFBFBF8080
+8080804040400000000000FFFFFFBFBFBFBFBF80808040404040400063E0B500
+996699FF00663399BBFF99DD99FF112277005544CCCC66AABB6600EE6600CC69
+E3B56B7F9765E1A36FE700FF1A00B28B3099FFFFB094FFF700CEEEEE8858D700
+73E6A24DBFF54DB38080C0C080C080808060C08000A080402070A0402040D0F0
+F0E010B4BE5BB477D9B3FF77A089E4FF194F2600B641DE4F829E4780FF0000FF
+> store
+/blue <
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3BF8040FFBF804000FFBF804000FFBF80
+00BF8040FFBF804000FF804000FFBF804000FFBF804000FFBF804000FFBF8040
+00FFBF804000FFBF4000FFBF804000FFBF804000FFBF804000FFBF804000FFBF
+804000FFBF00FFBF804000BF8040FFBF804000FFBF40FFBF8040004063E0B500
+FF3399FF88666666009966DDFFFF112277DD554499FFCCAABBCC99EE9966CC69
+E3B52F7F9765E1A36FE7BFCC8BEEB257606BFBB3B015322480FAEEB48858D700
+73E6A24DBFF556CAD050C080C08080C08060C080FF0000402070C0802040D060
+50E010B4BE7A8C65D9B3E085A076C400704F2600FC5AE050B4A0FF9000FF00FF
+> store
+ BEGINBITMAPCOLORc
+z"z"z"
+6F6F7S#F6F76F6F7J"
+T"F78z8z8z
+4F9S"F94F9
+
+;z"
+SGF7F6<z"z
+0F6F7S4F6=z8z
+/F9S3F9
+J'J#>$@%J#F'
+O@FEFEFEFEF9FE;FEFEFEFEFEFEFEFEFE5FEFEFEFEFEFEF9FEJ'J"B"8"J'
+O?FEFEF9F9F9FEFF9F9F9FFEFEF9F9F9FEJ"J#J#8#J"
+ODF9<F9F9JFEFEF9F94F9J#8(:%9'9$9%;#H$:*8'?#8"9$8'8$:$8'
+OAFEFEF9FEFEFEF9FEFEFEFEFEFEFEFEFEF9FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF9F9FEFEFEFEFEFEF9FEFEFEFEF9FEFEFEFEFEFEF9FEFEFEFEFEFEFEFEFEFEFEF9FEFE@s"J"9%8&9%8"8%8":%;%E1:"8%<"9#8)8"808%
+F6F7O,F9FEFEF9F9FEF9FEFEFEF9F9FEFEF9FEF9FEFEF9FEF9F9F9FEF9FEFEFEFEFEF9FEFEFEF9FEFEF9F9FEFEF9F9F9FEF9FEFEF9FEFEFEFEFEF9FEFEF9F9FEFEFEFEF9FEFEF9FEFEFEF9FEFEF9F9FEF9FEFEArJ#9"9$:$="A%:"J$H"@#9"9%:$9"<"<"
+F9O.F9F9FEF9F9F9F9FEFEF9FEFEFEF9F94F9F9F9F9F9F9FEF9F9F9F9F9F9F9FEFEF9@sJ"8#A%H"9"J"?'I"8#H%9%
+F7O-FEF9F9FEFEF9F9F9FE5FEF9FEFEFEFEF9FEF9F9F9F9F9F9F9F9F9F9@tJ">$<"H%J":$9&J">%?%9%
+F9O-FEFEF9FEFEFEF9F9F95FEFEF9FEFEF9F9F9F95FEFEF9FEFEFEF9FEFEFEF9FEFEJ'9+8$8"9$8"8'8"9";"8$9(8(8$8"9"<08"808"9"
+O@F9FEFEFEFEF9F9FEFEF9F9F9F9FEFEF9FEF9FEFEFEF9FEFEFEFEFEF9F9FEFEFEFEFEFEFEF9F9FEFEFEF9F9FEFEFEFEFEF9FEFEF9FEFEFEF9FEFEFEFEF9F9F9F9FEFEFEF9F9FEFEF9F9FEFEFEF9F9F9F9FEFEFEF9F9FEFEFEJ';#:z8s;s9$9";"x;':$8%:$:$8s
+O?F9F9F9F9F9F9F9F99F9F9F9F9F9F9F9FEF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9J&
+Q-FEF9F9F9F9J"8"J(
+OFFEFEO1F9FEFEFEFEFEF9=z8z
+/F7S3F7rF"J%
+F7F7S4F7F7F7F7'z&
+F6F6F6F6F6F7SFEEF6F6F6F6F68$J%
+F9F9F9SHF9F9F9F7
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+J5
+P7Q(C5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEJ5
+P7Q(FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5J#z"
+P7C5FEQ%C5FFJ#J#
+P7FEC5Q$FFC5J#9#I#J#F$<$J#
+4FEFEFEFEFEFEO5C5FEFEFEFEFEFEFEP6C5FFJ"J#F#<%G"J#
+6FEP FEC5C5C5FEC5C5C5FEP$FFC5J%8*;#8+9#J#J#
+=FEFEFEFEFEEEFEFEFEEEFEFEFEFEFEFEFEEEFEFEEEFEFEFEFEFEFEO!C5FEQ$C5FFJ#:'8*9%9"8'J)8#8#?&9$9&8&9$J#
+6EEFEFEFEEEEEFEFEFEEEEEFEFEEEEEFEFEFEEEFEFEFEFEFEEEEEFEFEO%FEC5C5FEFEFEC5FEFEFEFEFEFEFEFEFEFEFEFEFEFEC5FEFEFEFEFEFEFEFEFEFEFEOIFFC5J"=#>#J,9"@&8&8&8&8&J#
+O"EEEEEEEEEEO!C5FEC5C5FEC5FEC5FEC5C5C5C5FEC5C5C5FEC5C5C5FEC5FEC5C5C5C5FEC5C5C5FEC5C5C5FEOHC5FFJ#J":#J#J$G&J#
+7EEFE>EEFEFEO'FEC5?FEFEFEC5FEFEFEC5OHFFC5J%J#J%G%J#
+O.EEEEEEEEO%C5FE?C5C5C5C5C5C5C5FEOHC5FFJ"J"C#8#J#J"D$J#
+8EE7FEFEFEFEFEO!FEC5BFEFEC5FEOLFFC5J'D%<'J%;59&8%:,J#
+<EEFEFEFEFEEEEEFEFEEEEEFEFEFEFEEEO%C5FEC5FE4FEC5C5FEFEFEC5FEC5FEFEFEFEFEFEC5FEFEFEFEC5FEFEFEC5FEFEFEFEC5FEFEFEC5C5C5FEFEFEC5OHC5FFJ#9#8%8#8#8s8#:%9#J"t8z:$9%;$9$J#
+4EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEO!FEC51C5C5C5C5C5C5C5C5C5C5C5C5C5C5OIFFC5J#J#
+P7C5FEQ$C5FFJ#J#
+P7FEC5Q$FFC5J#J#
+P7C5FEQ$C5FFJ5
+P7Q(FEC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5J5
+P7Q(C5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFJz
+P7Q(EE
+
+
+
+
+
+
+
+
+
+
+Jz
+P5Q,FE
+J5
+P7Q'C5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5J5
+P7Q(FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5FEC5J#z"
+P7C5FEQ%C5FFJ#J#J#
+P7FEC5CFEFEP-FFC5J%F#J#J#
+6FEFEFEFEFEFEO9C5FEQ$C5FFJ'J#J#
+5FEFEEEEEFEFEOJFEC5Q$FFC5J$8(8&8"8-9%9%8&9%9#J#J#
+4FEFEEEEEEEEEFEFEFEFEFEFEEEFEFEFEFEEEFEFEEEFEFEEEFEFEFEFEFEFEFEFEFEFEFEFEFEFEEEFEFEFEFEFEFEFEFE:C5FEQ$C5FFJ'9'8"9"859,J#J#
+;FEFEEEEEFEFEFEEEFEFEEEEEEEFE4FEFEEEEEFEFEEEFEFEEEEEFEFEEEFEFEEEEEFEFEFEEEFEFEEEFEFEEEEEFEFE>FEC5Q$FFC5J"B%=%@":#<#J#J#
+DEEEEEEEEEEFEEEEEEEEEEEEEEEEE:C5FEQ$C5FFJ"9$9&:#A$J#:"<"<"<"<"J#
+O"EEFEFEFEEEEEFEFEFEFEFEFEFEFE@FEC5FEFEFEFEFEP1FFC5J%;"8"9%>%J#:"<"<"<"<"J#
+O%FEFEEEEEEEFEEEEEEEEEFEFEEEEE@C5FEC5C5C5C5C5P1C5FFJ$8#H"B%=#F#J#J#
+4EEFEFEFEFEFEFEFEEEEEFEFEFEFE:FEC5Q$FFC5J-?%;5>(J#J#
+5EEFEFEFEFEEEEEFEFEFEFEEEEEFEFEEE4EEFEFEFEEEFEFEEEFEFEFEFEEEEEEEFEFEFEFEEEEEFEFEFEEEFEFE=C5FEQ$C5FFJ%8%8#8#9&:v9%8#8#8tJ#J#
+6EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE:FEC5Q$FFC5J#J#
+P7C5FEQ$C5FFJ#J#
+P7FEC5Q$FFC5J#J#J#
+P7C5FECC5C5P-C5FFJ5
+P7Q(FEC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5J5
+P7Q(C5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFC5FFJz
+P7Q(FE
+Jz
+P5Q,EE
+
+
+
+
+
+
+
+
+
+
+
+
+
+<z
+SFED=z"
+SDEEFF=Z
+SD<z
+SFEE
+
+
+
+
+
+
+
+Jz
+KOAEDJ"
+P=FFJz"
+MO=EEFF
+
+
+JZJZ
+O#O5O"O5J"J"
+P7EDP6EDJz"Jz"
+O%O1EEEDO%O1EEED
+
+
+
+
+J'8#J%J#
+O7FEFEFEFEFEFEFEFEP#FEFEFEFE=FEFEJ)J'
+O9EEEEEEFEFEEEEEEEP"FEFEEEEEFEFEJ#8%8&J$8(8&9%9%<%8&
+O?FEFEFEFEFEFEFEFEEEFEFEOBFEFEEEEEEEEEFEFEFEFEFEFEEEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEEEFEFEJ'9%J'93:'9"
+OBFEFEEEEEFEFEFEEEFEFEOHFEFEEEEEFEFEFEEEFEFEEEFEFEEEEEFEFEEEFEFEEEEEFEFEFEFEEEEEFEFEFEJ&C"J#=">#A#>#
+O9FEFEFEFEEEEEOKEEEEEEEEEEEEEEEEEEJ&<#J$I#=$;"
+O9EEEEEEFEFEFEFEP$FEFEFEFEFEFEFEFEEEJ%J%I%:%
+ODEEEEEEEEP!FEFEEEEEEEEEEEEEFEFEEEEEJ#J$8#H#;#
+OFFEFEOHEEFEFEFEFEFEFEFEFEJ&:'J.=.:(
+O9FEFEFEFEEEEEFEFEFEFEEEOIEEFEFEFEFEEEEEFEFEFEEEFEFEEEFEFEFEFEEEEEEEFEFEFEFEEEEEFEFEFEEEFEFEJ'8#8%8#8#J%8s8#8%9%8#8s
+O7EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEOCEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
+
+
+
+
+
+
+&J%
+F7F7F7F7F7SGF7F7F7F7&JzJzJ&
+F6F6F6F6F6O O1EDO&O1EDMF6F6F6F6F68$J"J"J%
+F9F9F9MEDP6EDP1F9F9F9F7JzJz
+O#O5EEO"O5EE
+
+
+JZ
+MO=J"
+LFFJz
+KOAEE
+
+
+
+
+
+
+
+<z"z"z
+0F6F7S#F6F71F6;z8z8z
+1F9S"F91F9
+
+7z8z8z
+5F7S"F74F7"J"J"
+F76F7S#F7
+ENDBITMAP
+%%EndBinary
+72 72 540 81 R
+7 X
+V
+0 10 Q
+0 X
+(FIGURE 8) 237.26 74.33 T
+1 F
+( - Spanish login screen) 283.64 74.33 T
+FMENDPAGE
+%%EndPage: "5" 5
+%%Page: "6" 6
+612 792 0 FMBEGINPAGE
+[0 0 0 1 0 0 0]
+[ 0 1 1 0 1 0 0]
+[ 1 0 1 0 0 1 0]
+[ 1 1 0 0 0 0 1]
+[ 1 0 0 0 0 1 1]
+[ 0 1 0 0 1 0 1]
+[ 0 0 1 0 1 1 0]
+ 7 FrameSetSepColors
+FrameNoSep
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+0 12 Q
+0 X
+0 0 0 1 0 0 0 K
+(Bene\336ts) 164.17 572 T
+1 10 Q
+(The bene\336ts of mega-widget usage increase proportion-) 72 547.33 T
+(ally with the complexity of the application. This was) 72 535.33 T
+(readily apparent in the login screen example. Replace-) 72 523.33 T
+-0.44 (ment of the more elemental patterns was mostly a matter) 72 511.33 P
+(of convenience. Y) 72 499.33 T
+(et as requirements were added, the) 144.03 499.33 T
+(code savings became substantial. As the example) 72 487.33 T
+(reached a medium level of complexity) 72 475.33 T
+(, the bene\336ts) 224.93 475.33 T
+-0.24 (extended to consistent usage of style. Productivity gains) 72 463.33 P
+(also became quite noticeable.) 72 451.33 T
+(As applications increase in size, invariably requiring a) 72 427.33 T
+(main window and numerous dialogs, mega-widget) 72 415.33 T
+-0.33 (usage of) 72 403.33 P
+-0.33 (fers signi\336cant productivity gains and increased) 105.09 403.33 P
+(reliability) 72 391.33 T
+(. This could also be seen in the example as) 110.24 391.33 T
+(well. A savings of a sizable amount of straight T) 72 379.33 T
+(cl/Tk) 265.72 379.33 T
+-0.46 (code was achieved and implementation of such things as) 72 367.33 P
+(modality was abstracted into the Dialog mega-widget) 72 355.33 T
+(and it\325) 72 343.33 T
+(s base classes. Since the Dialog class is encapsu-) 97.28 343.33 T
+(lated and tested, the Login mega-widget was built on a) 72 331.33 T
+-0.24 (sound foundation. Errors typical of \322cut and paste\323 built) 72 319.33 P
+(applications, such as for) 72 307.33 T
+(getting to release a grab, have) 168.47 307.33 T
+(been eliminated. Developers are free to concentrate on) 72 295.33 T
+(the application and not low level problems.) 72 283.33 T
+(T) 72 259.33 T
+(o draw an analogy to current building construction) 77.41 259.33 T
+-0.24 (techniques, Tk widgets are bricks and mega-widgets are) 72 247.33 P
+-0.19 (pre-formed walls built with bricks. It is much quicker to) 72 235.33 P
+(construct a lar) 72 223.33 T
+(ge building using walls than bricks.) 128.47 223.33 T
+(Although in the construction industry) 72 211.33 T
+(, this creates a lot) 221.35 211.33 T
+(of cookie cutter) 72 199.33 T
+(, identical, and boring buildings, appli-) 134.36 199.33 T
+-0.46 (cation users appreciate this consistency) 72 187.33 P
+-0.46 (, especially when) 226.72 187.33 P
+(it increases usability) 72 175.33 T
+(. A user shouldn\325) 153.01 175.33 T
+(t be confused dur-) 221.71 175.33 T
+(ing the operation of an application by being presented) 72 163.33 T
+(variant combinations of the same widget patterns. Each) 72 151.33 T
+(one having a unique behavior which users must learn) 72 139.33 T
+(during operation, rather than from prior experiences) 72 127.33 T
+(with other more standard interfaces.) 72 115.33 T
+(The signi\336cance of a consistent style should not be) 72 91.33 T
+(overlooked. It doesn\325) 72 79.33 T
+(t always appear in typical T) 157.08 79.33 T
+(cl/Tk) 267.19 79.33 T
+72 598 297 720 C
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+72 626 297 707 R
+7 X
+0 0 0 1 0 0 0 K
+V
+0.5 H
+2 Z
+0 X
+N
+81 635 288 698 R
+7 X
+V
+4 8 Q
+0 X
+(option add *Login*user.foreground Red) 81 692.67 T
+1 10 Q
+( Or) 81 669.33 T
+4 8 Q
+(.login component user conf) 81 650.67 T
+(igure \134) 205.8 650.67 T
+( -foreground Red) 81 640.67 T
+0 10 Q
+(FIGURE 9) 109.91 610.17 T
+1 F
+( -Login component access) 156.3 610.17 T
+0 0 612 792 C
+1 10 Q
+0 X
+0 0 0 1 0 0 0 K
+-0.28 (applications. This stems from Tk itself. Its greatest asset) 315 713.33 P
+-0.38 (is also a liability: a simple and easy to use widget set. Tk) 315 701.33 P
+(can make it easy for novice programmers to construct) 315 689.33 T
+(interfaces which conform to random personal styles) 315 677.33 T
+(rather than any known industry standards. Many) 315 665.33 T
+-0.34 (unusual applications have been produced with Tk which) 315 653.33 P
+(have sunken buttons, raised entries, or are packed with) 315 641.33 T
+(such a lack of padding as to create \322brick walls\323 of wid-) 315 629.33 T
+(gets. Applications which exhibit these qualities can be) 315 617.33 T
+(found at the T) 315 605.33 T
+(cl/Tk archive site. Mega-widgets can) 370.68 605.33 T
+(lessen the occurrence of these visual works of art while) 315 593.33 T
+(maintaining simplicity and ease of use. For example,) 315 581.33 T
+(use of the [incr W) 315 569.33 T
+(idgets] Buttonbox mega-widget can) 386.8 569.33 T
+(stop the button \322brick wall\323 ef) 315 557.33 T
+(fect.) 436.19 557.33 T
+0 12 Q
+(Look-and-Feel) 389.83 526 T
+1 10 Q
+(It is visually evident from the example that the look-) 315 501.33 T
+(and-feel of [incr W) 315 489.33 T
+(idgets] is Motif. Adherence to the) 391.51 489.33 T
+(style guide is close. Little ef) 315 477.33 T
+(fort has been spent attempt-) 427.59 477.33 T
+(ing to make minor improvements. This is even more) 315 465.33 T
+(clear in some of the lar) 315 453.33 T
+(ger [incr W) 406.74 453.33 T
+(idget] dialog mega-) 452.43 453.33 T
+(widget classes such as the FileSelectionDialog. The) 315 441.33 T
+(Motif likeness is also evident in the initial selection of) 315 429.33 T
+(classes which comprise the mega-widget set, including) 315 417.33 T
+(most of the Motif favorites. It even extends beyond) 315 405.33 T
+(appearance to behavior and options.) 315 393.33 T
+(The Motif look-and-feel was chosen because of its) 315 369.33 T
+-0.17 (strength in the industry and customer requirements. The) 315 357.33 P
+-0.12 (demand of the current [incr W) 315 345.33 P
+-0.12 (idgets] customer base is a) 435.35 345.33 P
+(Motif appearance and behavior) 315 333.33 T
+(, regardless of the under-) 439.28 333.33 T
+(lying implementation. Thus, very few liberties were) 315 321.33 T
+(taken in the visual style and behavioral aspects of [incr) 315 309.33 T
+(W) 315 297.33 T
+(idgets]. Instead, concepts such as extensible child) 324.04 297.33 T
+(sites and \337exible component con\336guration option sets) 315 285.33 T
+(have been implemented which allow developer diver-) 315 273.33 T
+(gence from the Motif style on an as needed basis.) 315 261.33 T
+0 12 Q
+(Extensibility) 395.16 230 T
+1 10 Q
+-0.01 (The extensibility of [incr W) 315 211.33 P
+-0.01 (idgets] is based on a similar) 426.2 211.33 P
+(concept found in Motif called \322child sites\323 which allow) 315 199.33 T
+(the basic functionality and visual appearance of an) 315 187.33 T
+(existing mega-widget to be augmented. The idea is sim-) 315 175.33 T
+(ple, yet it yields a powerful mechanism by which mega-) 315 163.33 T
+-0.1 (widgets become malleable and reusable. They allow for) 315 151.33 P
+(the possibility of unanticipated future requirements,) 315 139.33 T
+(making for a much less restrictive widget set.) 315 127.33 T
+(Consider an application which requires a icon selection) 315 103.33 T
+(dialog, visually displaying the icon as the textual name) 315 91.33 T
+-0.08 (is selected from the list. Also, suppose we would like to) 315 79.33 P
+FMENDPAGE
+%%EndPage: "6" 6
+%%Page: "7" 7
+612 792 0 FMBEGINPAGE
+[0 0 0 1 0 0 0]
+[ 0 1 1 0 1 0 0]
+[ 1 0 1 0 0 1 0]
+[ 1 1 0 0 0 0 1]
+[ 1 0 0 0 0 1 1]
+[ 0 1 0 0 1 0 1]
+[ 0 0 1 0 1 1 0]
+ 7 FrameSetSepColors
+FrameNoSep
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+1 10 Q
+0 X
+0 0 0 1 0 0 0 K
+(see this canvas on which the icon is presented lie) 72 713.33 T
+(between the listbox and entry widget. This could easily) 72 701.33 T
+(be implemented using the [incr W) 72 689.33 T
+(idgets] Selectiondia-) 207.97 689.33 T
+(log mega-widget which maintains a child site, as) 72 677.33 T
+(depicted in Figure 10.) 72 665.18 T
+(The advantages of child sites can be seen by examining) 72 641.18 T
+(the opposite situation. Had the SelectionDialog been) 72 629.18 T
+(designed minus a child site, the user would have been) 72 617.18 T
+72 72 297 603 C
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+72 90 297 594 R
+7 X
+0 0 0 1 0 0 0 K
+V
+0.5 H
+2 Z
+0 X
+N
+%%BeginBinary: 12737
+222 379 114.17 194.91 0 128.83 387
+/red <
+3EC472FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF80808080
+8080808080808080808080808080808080808080404040404040404040404040
+4040404040404040404040000000000000000000000000000000000039C069DD
+00FF0000003333330033CCDD9999112277005544FFCC66AABBFF33EE9999CC7A
+EFD39765E1A36FE700FF5500B2557F2EAFB4CD73E6A24DBF008799FFFFF5B0B0
+7AFFCC88BE8BD28BD9B3FF72439D58D750D080C0C080C0808060C000FFA000FF
+20C0A040C040D060F0E010B4A099FF0019BF2FFF6223852F465F4770FF0000FF
+> store
+/green <
+57D79F00000000000000000000000000FFFFFFBFBFBFBFBF8080808080404040
+40000000FFFFFFFFFFBFBFBFBF808080808040404040400000000000FFFFFFFF
+FFBFBFBFBFBF8080808040404040400000000000FFFFFFFFFFBFBFBFBFBF8080
+8080804040400000000000FFFFFFBFBFBFBFBF80808040404040400063E0B500
+996699FF00663399BBFF99DD99FF112277005544CCCC66AABB6600EE6600CC69
+E3B59765E1A36FE700FF1A00B26B7F8BEEEE0073E6A24DBF00CE99FFFFF530B0
+94FFF788BE5BB477D9B3FF774DB358D78080C0C080C080808060C08000A08040
+2070A0402040D0F0F0E010B4A089E4FF19264F00B641DE4F829E4780FF0000FF
+> store
+/blue <
+8CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF8040FFBF804000FFBF804000FFBF80
+00BF8040FFBF804000FF804000FFBF804000FFBF804000FFBF804000FFBF8040
+00FFBF804000FFBF4000FFBF804000FFBF804000FFBF804000FFBF804000FFBF
+804000FFBF00FFBF804000BF8040FFBF804000FFBF40FFBF8040004063E0B500
+FF3399FF88666666009966DDFFFF112277DD554499FFCCAABBCC99EE9966CC69
+E3B59765E1A36FE7BFCC8BEEB22F7F57EEB40073E6A24DBF80FA6BFBB3F560B0
+15322488BE7A8C65D9B3E08556CA58D7D050C080C08080C08060C080FF000040
+2070C0802040D06050E010B4A076C40070264F00FC5AE050B4A0FF9000FF00FF
+> store
+ BEGINBITMAPCOLORc
+z"z"z"
+6F6F7QEF6F76F6F7J"
+RDF78z8z8z
+4F9QDF94F9
+
+;z"
+R;F7F6<z"z
+0F6F7R(F6=z8z
+/F9R'F9
+J%J'>$H"
+O>FEFEFEFE>FEFEFEFEF9FEFEFEFEFEJ"8"J'?"I"
+O>F9F9=FEFEF9F9F9FEF9FEJ"
+P6F9J$:$9'?#8"9$?$:$8"8#8$9'
+OEFEFEFEFEFEFEFEFEFEF9FEFEFEFEF9FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF9FEFE@s"J18%<"9#8'<08,8"
+F6F7O0FEFEFEF9FEFEF9FEFEFEF9FEFEFEF9F9FEF9FEFEF9FEFEFEFEFEF9FEFEFEFEFEF9FEFEF9FEFEFEF9FEFEF9F9F9F9FEFEFEF9FEFEFEF9F9FEArJ%9$<"@#9":"A";%>$<$
+F9O3F9F9F9F9F9F9F9F9F9F9FEFEFEF9F9F9F9F9F9F9F9F9F9@sJ"8#;%>%
+F7OMFEF9F9F9F9F9F9F9F9F9F9@tJ%9$G">%>%9%>$
+F9O2FEF9FEFEFEF9FEFEFEF9FEFEFEF9FEFEFEF9FEFEFEF9FEJ"838"9"<0808.8"
+O>FEFEF9F9F9FEFEFEF9F9F9F9FEFEFEF9F9F9FEFEFEF9FEFEFEFEF9F9F9F9FEFEFEF9F9FEFEF9F9F9FEFEFEF9F9F9F9FEFEFEF9F9FEFEF9F9F9FEFEFEF9F9F9FEFEJ%9$:$9s;':$8%9$:$:#9$9%
+O>F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9
+
+=z8z
+/F7R'F7rF"J%
+F7F7R(F7F7F7F7'z&
+F6F6F6F6F6F7R:EEF6F6F6F6F68$J%
+F9F9F9R<F9F9F9F7
+
+
+
+
+
+
+
+
+
+
+
+
+J#
+4FEFE
+J%9%8&9%
+8FEFEFEFEFEFEFEFEFEFEEEFEFEFEFEFEFEJ.9,
+7FEFEEEEEFEFEEEFEFEEEEEFEFEFEEEFEFEEEFEFEEEEEFEFEJ#@"<%
+;EEEEEEFEEEEEEEJ&
+LEEEEFEFEFEJ"8"
+O EEFEJ#E%
+;FEFEFEFEEEEEJ.>'
+7EEFEFEFEFEEEEEEEFEFEFEFEEEEEFEFEFEFEEEJ#8%9%8#8#8%
+4EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
+
+
+
+
+
+
+
+H5=z
+Q6BDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFE3EDH5J"
+Q6FEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBD9FFH#z"?r"r"
+BDFEQ3BDFFE6EDE6FFH#J#E"
+FEBDQ2FFBDFFH&I#J#G"
+BDFEBDFEFEFEFEPHBDFFEDH%J"J#D"
+FEBDBDBD4BDPIFFBDFFH#J#F$
+BDFEQ2BDFFEEEDEDH#9$:$8&:$J#C$
+FEBDFEFEFEFEFEFEFEFEFEBDFEFEFEFEPEFFBDFFFFEEH#9%8-9%J#G$
+BDFEBDBDBDFEFEBDBDBDFEBDBDFEBDFEBDFEBDBDBDFEPDBDFFEEEDEDH#J#B$
+FEBDQ2FFBDFFFFEEH#J#H$
+BDFEQ2BDFFEEEDEDH#J#A$
+FEBDQ2FFBDFFFFEEH*8(;(J#I$
+BDFEBDFEBDFEFEFEBDBDFEFEFEBDBDFEFEFEBDFEFEFEBDPDBDFFEEEDEDH"r:$8wJ#@$
+FEBDBDBDBDBDPEFFBDFFFFEEH#J#J$
+BDFEQ2BDFF4EEEDEDH#J#?#u
+FEBDQ2FFBDFFFFEDH#J#@"B"
+BDFEQ2BDFFEDEDH#J#?z
+FEBDQ2FFBD/E6H#J#?Z
+BDFEQ2BDFF/H#J#J"
+FEBDQ2FFBD7EDH#J#Av"
+BDFEQ2BDFFEEEDH#J#
+FEBDQ2FFBDH#J#
+BDFEQ2BDFFH#8$:$8&8&9&9$:$:$J#
+FEBDFEFEFEFEFEFEFEFEFEBDFEFEBDFEFEFEFEBDFEFEFEFEFEFEFEFEFEFEFEFEP*FFBDH)848&8&8&8&J#
+BDFEBDFEBDBDBDFEFEBDBDBDFEBDBDFEBDFEBDFEBDBDFEBDBDBDFEBDFEBDBDBDFEBDBDBDFEFEBDBDBDFEFEBDBDBDFEP)BDFFH#;"J$9&8&J#
+FEBDBD?FEFEFEBDFEFEFEBDBDFEFEFEBDP)FFBDH#J%9%9%J#
+BDFEEBDBDBDBDBDBDBDFEBDBDBDFEP)BDFFH#;"J"8"<"J#
+FEBDFEBFEFEFEP-FFBDH)8(;"8%8%9&8&8&J#
+BDFEBDBDFEFEFEBDBDFEFEFEBDBDFEFEFEFEFEBDFEFEFEFEBDFEFEFEBDBDFEFEFEBDBDFEFEFEBDP)BDFFH#8$:$8r8$9%:$:$:$J#
+FEBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDP*FFBDH#J#
+BDFEQ2BDFFH#J$J#
+FEBD5FEFEFEPHFFBDH#J$J#
+BDFE5BDBDBDPHBDFFH#J#
+FEBDQ2FFBDH5
+Q6BDFEE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFE6FFBDFFH$z#
+FEBDFFQ1E6FFBDH$J$
+BDFEE6Q0FEBDFFH$J$
+FEBDFFQ0E6FFBDH$J$
+BDFEE6Q0FEBDFFH(:$9&9$J$
+FEBDFFE6FEFEFEFEFEFEFEE6FEFEFEFEFEFEPEE6FFBDH)8&8&8&J$
+BDFEE6FEE6E6E6FEFEE6E6E6FEE6FEE6E6E6FEE6E6E6FEPDFEBDFFH$:"G$J$
+FEBDFFE6FEFEFEPEE6FFBDH$J%J$
+BDFEE66E6E6E6E6PDFEBDFFH$:"J"J$
+FEBDFFFE4FEPDE6FFBDH)8&8%9&J$
+BDFEE6E6FEFEFEE6E6FEFEFEE6FEFEFEFEE6FEFEFEE6PDFEBDFFH(:$9%:$J$
+FEBDFFE6E6E6E6E6E6E6E6E6E6E6E6E6E6PEE6FFBDH$J$
+BDFEE6Q0FEBDFFH$J$
+FEBDFFQ0E6FFBDH$J$
+BDFEE6Q0FEBDFFH5
+Q6FEBDFFE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FEE6FFBDH#z"
+BDFEQ3BDFFH#J#
+FEBDQ2FFBDH#:#J#
+BDFEFEFEQ,BDFFH#:"J#
+FEBDBDQ-FFBDH#J#
+BDFEQ2BDFFH#8$:$:$J#
+FEBDFEFEFEFEFEFEFEFEFEPMFFBDH(9&8&J#
+BDFEBDFEBDBDBDFEBDBDBDFEFEBDBDBDFEPLBDFFH#>&<"J#
+FEBDBDFEFEFEBDBDPLFFBDH#?%J#
+BDFEBDBDBDFEQ%BDFFH#>"@"J#
+FEBDFEFEPLFFBDH08&J#
+BDFEBDBDFEFEFEBDFEBDBDFEFEFEBDBDFEFEFEBDPLBDFFH#8&8$:$J#
+FEBDBDBDBDBDBDBDBDBDBDBDBDPMFFBDH#J#
+BDFEQ2BDFFH#J#
+FEBDQ2FFBDH#J#
+BDFEQ2BDFFH#J#
+FEBDQ2FFBDH#J#
+BDFEQ2BDFFH#J#
+FEBDQ2FFBDH#J#
+BDFEQ2BDFFH#J#
+FEBDQ2FFBDH#J#
+BDFEQ2BDFFH#8$8&9%:$:$J#
+FEBDFEFEFEFEFEFEBDFEFEFEFEFEFEFEFEFEFEFEP?FFBDH08&8&8&J#
+BDFEBDFEBDBDBDFEBDBDFEBDFEBDFEBDBDBDBDFEFEBDBDBDFEFEBDBDBDFEP>BDFFH#8$A$="8&J#
+FEBDFEFEFEFEFEFEBDBDFEFEFEBDP>FFBDH#8%?%A%J#
+BDFEBDBDBDBDFEBDBDBDBDBDBDFEP>BDFFH#;"J"8"J#
+FEBDFE4FEFEPBFFBDH+;/8&J#
+BDFEBDBDFEFEFEBDBDFEFEBDBDFEFEFEBDFEBDBDFEFEFEBDBDFEFEFEBDP>BDFFH#8$8r8&8$:$J#
+FEBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDP?FFBDH#J#
+BDFEQ2BDFFH#J#
+FEBDQ2FFBDH#J#
+BDFEQ2BDFFH#J#
+FEBDQ2FFBDH#J#
+BDFEQ2BDFFH#J#
+FEBDQ2FFBDH&I#J#J#
+BDFEBDFEFEFEFE>FEFEP(BDFFH%J"J"J#
+FEBDBDBD4BD?BDP)FFBDH#J#
+BDFEQ2BDFFH#;#9$8(8$:$9%9&9$J#
+FEBDFEFEFEFEFEFEFEFEBDFEFEFEFEFEFEFEFEFEFEFEFEFEFEBDFEFEFEFEFEFEP)FFBDH#:$8.8%8&8&8&8%J#
+BDFEFEBDBDFEBDBDBDFEBDBDFEBDBDBDFEBDBDBDBDFEFEBDBDBDFEBDBDBDBDFEBDFEBDBDBDFEBDBDBDP)BDFFH#9#;$J$J#
+FEBDFEBDFEFEFE9FEFEFEP7FFBDH#9#;%8&F%J#
+BDFEBDFEBDBDBDBDBDFEBDFEBDFEBDBDBDP7BDFFH#:#=":"J#
+FEBDBDFEFEFEPMFFBDH%9*9$8'8&8,9'J#Av
+BDFEBDFEBDFEFEBDBDFEFEFEBDBDFEBDFEBDFEFEFEBDBDFEFEFEBDBDFEFEFEBDFEBDFEFEFEFEBDFEFEFEBDFEP'BDFFEDH&9#8$?&:$:u:&J#@"
+FEBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDP'FFBDEDH#J#?z
+BDFEQ2BDFF/E6H#F$J#
+FEBDFEFEBDPMFFBDH#F#J#
+BDFEBDBDQ BDFFH#J#
+FEBDQ2FFBDH#J#
+BDFEQ2BDFFH#J#
+FEBDQ2FFBDH#E$G#J#
+BDFEFEFEFEFEFEP;BDFFH#8"B#H"J#
+FEBDFEBDBDBDP<FFBDH#J#
+BDFEQ2BDFFH)9$A$8&;#:$8&:$J#
+FEBDBDFEFEFEFEFEFEFEFEFEFEFEFEBDFEFEFEFEFEFEFEFEFEBDFEFEFEFEFEFEP#FFBDH)8&?-9%8-8&J#
+BDFEBDBDFEBDBDBDFEBDBDBDFEFEBDBDBDFEBDBDFEBDBDBDFEFEBDBDFEFEBDBDBDFEBDBDFEFEBDBDFEFEBDBDBDFEP"BDFFH#?$A$A"C"<$J#?Z
+FEBDFEFEFEFEFEFEBDBDFEFEFEP#FFBD/H#?%@%J%J#?"C"
+BDFEBDBDBDBDBDBDBDBD?BDBDBDBDP"BDFFE6EDH#<";"C"J"J#Bt$
+FEBDFEFEFEBFEP"FFBDEEEDEDE6H#8,8-959(J#@$
+BDFEBDFEFEFEBDBDBDFEFEFEBDFEFEFEFEFEFEBDBDFEFEFEBD6FEFEFEBDBDFEFEFEBDFEFEFEBDBDFEFEFEBDBDFEFEFEFEBDBDFEFEFEBDP"BDFFE6FFFFH#9$9$9'8$:$8r8$8$8#8$J#J$
+FEBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDP#FFBD4EDEDE6H#J#A$
+BDFEQ2BDFFE6FFFFH#J$J#I$
+FEBD<FEFEFEPAFFBDEDEDE6H#J$J#B$
+BDFE<BDBDBDPABDFFE6FFFFH#J#H$
+FEBDQ2FFBDEDEDE6H#J#C$
+BDFEQ2BDFFE6FFFFH#J#G$
+FEBDQ2FFBDEDEDE6H#J#J#D$
+BDFE<FEFEPBBDFFE6FFEDH#8"J"J#H"
+FEBDFE9BDPCFFBDE6H#J#E"
+BDFEQ2BDFFE6H)8&8%:$;#J#G"
+FEBDBDFEFEFEFEFEFEBDFEFEFEFEFEFEFEFEFEFEFEFEP?FFBDE6H5?Z
+Q6BDFEBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFF/H5>"
+Q6FEBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFHz=z
+Q6EE3EE
+
+
+
+
+HZ
+R"J"
+R3EDJz"
+4QLEEED
+
+
+
+
+
+
+
+J#
+P6FEFEJ"8"
+P5FEFEJ"
+P;FEJ&
+P8EEEEFEFEFEJ":"
+P8FEFEJ"
+P5EEJ"8":"
+P6EEFEFEJ">#:#
+P1FEEEEEFEFEJ$:"="8"
+P0FEFEFEEEFEFEJ"9"
+P7FEFEJ"<"
+P3FEFEJ";"<"9#
+P0EEFEEEEEEEJ"8"
+P>EEFEJ"?"8"
+P5FEEEFEJ"8#8#
+P0FEEEFEEEEEJ"C"
+P/FEFEJ"9#;";"
+P.FEEEFEEEFEJ#9"="
+P1EEFEEEFEJ"="
+P:EEEEJ"8"@$
+P-FEEEEEEEEEJ#?"
+P6FEFEEEJ"
+P2EEJ"8#
+P0FEEEEEJ"=$
+P-EEEEEEEEJ$
+P8FEFEFEJ$<"9"
+P.EEEEEEFEFE
+J#=$
+P5FEFEEEEEEEJ$
+P2FEFEFEJ$
+P/FEFEFEJ#
+P-FEFEJ"
+P;EEJ"
+P,FEJ"
+P:EEJ#D#
+P*FEFEFEFEJ#H"
+P(FEFEFEJ"
+P=FE
+J#
+P&FEFEJ#J$
+P$FEFE8FEFEFEJ"J"
+P#FE=FE
+
+J"
+PBFE
+J#J"
+P#EEEE=EEJz
+P%=EE
+
+
+
+
+
+Jz
+4QLEDI"
+EDHz
+R"EE
+
+
+
+
+
+
+
+
+
+
+
+
+J#
+4FEFE
+J%9%8&
+8FEFEFEFEFEFEFEFEFEFEEEFEFEJ.9%
+7FEFEEEEEFEFEEEFEFEEEEEFEFEFEEEFEFEJ#@"
+;EEEEEE
+
+J#
+;FEFEJ.
+7EEFEFEFEFEEEEEEEFEFEFEFEEEJ#8%9%8#8#
+4EEEEEEEEEEEEEEEEEEEEEEEEEEEE
+
+
+
+
+
+
+
+
+H5
+R!BDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDH5
+R!FEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFEBDFFH#z#
+BDFEQKBDFFBDH#J#
+FEBDQKBDFFH#J#
+BDFEQKFFBDH#J#
+FEBDQKBDFFH#J#
+BDFEQKFFBDH#9$:$9&9$J#
+FEBDFEFEFEFEFEFEFEBDFEFEFEFEFEFEQ0BDFFH#8&8&8&8&J#
+BDFEFEBDBDBDFEFEBDBDBDFEBDFEBDBDBDFEBDBDBDFEQ/FFBDH#<"G$J#
+FEBDBDFEFEFEQ0BDFFH#J%J#
+BDFE8BDBDBDBDQ/FFBDH#<"J"J#
+FEBDFE4FEQ/BDFFH#8&8&8%9&J#
+BDFEBDFEFEFEBDBDFEFEFEBDFEFEFEFEBDFEFEFEBDQ/FFBDH#9$:$9%:$J#
+FEBDBDBDBDBDBDBDBDBDBDBDBDBDBDQ0BDFFH#J#
+BDFEQKFFBDH#J#
+FEBDQKBDFFH#J#
+BDFEQKFFBDH5
+R!FEBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFH5
+R!BDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDFFBDHz
+R!EE
+
+
+
+
+
+
+
+
+
+
+<z
+R:ED=z"
+R8EEFF=Z
+R8<z
+R:EE
+
+
+
+
+
+
+
+Jz
+9O?EDJ"
+P)FFJz"
+;O;EEFF
+
+
+JZJZ
+?O3>O3J"J"
+P#EDP"EDJz"Jz"
+AO/EEEDAO/EEED
+
+
+
+
+J%:#9#J%J#
+O+FEFEFEFEFEFEFEFEO8FEFEFEFE=FEFEJ'=$J'
+O*FEFEEEEEFEFEFEFEEEO7FEFEEEEEFEFEJ$8$;$J$8(8&9%9%
+O)FEFEEEEEFEFEFEFEEEO7FEFEEEEEEEEEFEFEFEFEFEFEEEFEFEFEFEFEFEFEFEFEFEJ$J'93
+O5FEFEEEO?FEFEEEEEFEFEFEEEFEFEEEFEFEEEEEFEFEEEFEFEEEEEFEFEJ#=">#
+Q)EEEEEEEEEEJ$J$I#
+O5EEFEFEO@FEFEFEFEFEJ$J%I%
+O6EEFEFEO>FEFEEEEEEEEEEEEEJ$8$<$J$8#H#;#
+O)EEFEFEFEFEEEEEFEFEO6EEFEFEFEFEFEFEFEFEJ'>$J.=.
+O*EEFEFEFEFEEEEEFEFEO6EEFEFEFEFEEEEEFEFEFEEEFEFEEEFEFEFEFEEEEEEEFEFEFEFEEEJ%:#:#J%8s8#8%9%8#
+O+EEEEEEEEEEEEEEEEO7EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
+
+
+
+
+&J%
+F7F7F7F7F7R;F7F7F7F7&JzJzJ&
+F6F6F6F6F6<O/EDBO/ED;F6F6F6F6F68$J"J"J%
+F9F9F9;EDP"EDOKF9F9F9F7JzJz
+?O3EE>O3EE
+
+
+JZ
+;O;J"
+:FFJz
+9O?EE
+
+
+
+
+
+
+
+<z"z"z
+0F6F7QEF6F71F6;z8z8z
+1F9QDF91F9
+
+7z8z8z
+5F7QDF74F7"J"J"
+F76F7QEF7
+ENDBITMAP
+%%EndBinary
+81 99 288 378 R
+7 X
+V
+4 8 Q
+0 X
+(selectiondialog .iconSel \134) 81 372.67 T
+( -title \322Icon Selector\323 \134) 81 362.67 T
+( -itemslabel Icons \134) 81 352.67 T
+( -selectionlabel Icon \134) 81 342.67 T
+( -itemscommand SelectProc) 81 332.67 T
+(.iconSel hide Help) 81 322.67 T
+(.iconSel hide Apply) 81 312.67 T
+(set cs [.iconSel childsite]) 81 292.67 T
+(canvas $cs.canvas -height 70 \134) 81 282.67 T
+( -relief raised -borderwidth 2) 81 272.67 T
+(pack $cs.canvas -f) 81 262.67 T
+(ill x -expand yes) 167.4 262.67 T
+(proc SelectProc {} {) 81 242.67 T
+( .iconSel selectitem) 81 232.67 T
+( set c [.iconSel childsite].canvas) 81 222.67 T
+( $c delete all) 81 212.67 T
+( $c create bitmap \134) 81 202.67 T
+( [expr [winfo width $c] / 2] \134) 81 192.67 T
+( [expr [winfo height $c] / 2] \134) 81 182.67 T
+( -bitmap @~/xbm/[.iconSel get].xbm) 81 172.67 T
+(}) 81 162.67 T
+(.iconSel insert items end bomb compress \134) 81 142.67 T
+( core dsc emacs keyboard telephone \134) 81 132.67 T
+( trash workstation) 81 122.67 T
+(.iconSel activate) 81 102.67 T
+0 10 Q
+(FIGURE 10) 113.41 74.17 T
+1 F
+( - Icon selector dialog) 164.8 74.17 T
+0 0 612 792 C
+1 10 Q
+0 X
+0 0 0 1 0 0 0 K
+(forced to create the icon selector from scratch or) 315 713.33 T
+(become aware of its internal packing and attempt to) 315 701.33 T
+(repack around the canvas. A take-it-or) 315 689.33 T
+(-leave-it design) 468.08 689.33 T
+(such as this would be limiting, sacri\336cing possibilities) 315 677.33 T
+(of reuse.) 315 665.33 T
+(The means by which a child site may be \336lled is not a) 315 641.33 T
+-0.05 (limiting factor in the [incr W) 315 629.33 P
+-0.05 (idgets] set. Either composi-) 430.16 629.33 P
+(tion or inheritance may be used. In the login screen) 315 617.33 T
+-0.11 (example, both of these mechanisms were demonstrated.) 315 605.33 P
+(First composition was used. Later) 315 593.33 T
+(, as the Login mega-) 449.87 593.33 T
+-0.47 (widget class was produced, the same child site was \336lled) 315 581.33 P
+(by means of [incr T) 315 569.33 T
+(cl]\325) 393.17 569.33 T
+(s inheritance feature. The imple-) 406.5 569.33 T
+(mentation of child sites and the means by which they) 315 557.33 T
+(may be accessed in [incr W) 315 545.33 T
+(idgets] deserves closer) 424.84 545.33 T
+(inspection.) 315 533.33 T
+([incr Tk] has several base classes from which the [incr) 315 509.33 T
+-0.44 (W) 315 497.33 P
+-0.44 (idgets] class hierarchy is derived. As base classes they) 324.04 497.33 P
+(provide option management, standard methods, and a) 315 485.33 T
+(parent for components called the \322hull\323 widget. The) 315 473.33 T
+(path to this widget is contained in a protected class vari-) 315 461.33 T
+(able named \322itk_interior\323. Many mega-widgets within) 315 449.33 T
+-0.22 ([incr W) 315 437.33 P
+-0.22 (idgets] successively maintain this variable in the) 345.2 437.33 P
+(hierarchy) 315 425.33 T
+(. As a mega-widget is constructed, new com-) 352.11 425.33 T
+-0.09 (ponents are built of) 315 413.33 P
+-0.09 (f the path stored in the \322itk_interior\323) 392.04 413.33 P
+(variable. The mega-widget may also construct a new) 315 401.33 T
+(hull and store its path in \322itk_interior\323 for a future) 315 389.33 T
+-0.47 (derived class to use. A \324childsite\325 method is provided for) 315 377.33 P
+(composition support.) 315 365.33 T
+0 12 Q
+(Flexibility) 401.5 334 T
+1 10 Q
+(Frequently) 315 309.33 T
+(, a mega-widget straight out of the box) 357.68 309.33 T
+-0.28 (doesn\325) 315 297.33 P
+-0.28 (t exactly \336t the bill. Developers need to tweak the) 341.48 297.33 P
+(visual layout here and there to meet their application) 315 285.33 T
+(requirements. [incr W) 315 273.33 T
+(idgets] provides this capability) 402.63 273.33 T
+(with the viewpoint that \337exibility yields reuse. Each) 315 261.33 T
+(mega-widget was designed to allow modi\336cation of the) 315 249.33 T
+(visual aspects of the components through a rich option) 315 237.33 T
+(suite. As with standard Tk widgets, options may be) 315 225.33 T
+(speci\336ed at construction time and subsequently there) 315 213.33 T
+(after with the \324con\336gure\325 command.) 315 201.33 T
+(This is a very useful feature. For example, all the mega-) 315 177.33 T
+-0.03 (widgets which support scrollbar attachment do so at the) 315 165.33 P
+(developer) 315 153.33 T
+(\325) 354.8 153.33 T
+(s discretion. One may choose to have each) 357.58 153.33 T
+(scrollbar independently displayed either statically) 315 141.33 T
+(,) 513.21 141.33 T
+(dynamically) 315 129.33 T
+(, or never) 363.79 129.33 T
+(. A dynamic scrollbar would) 401.28 129.33 T
+(appear as needed based on the number of elements in) 315 117.33 T
+(the widget and their ability to \336t in the allotted space,) 315 105.33 T
+(whereas a static one is always displayed. Thus, scroll-) 315 93.33 T
+(bars have built-in intelligence.) 315 81.33 T
+FMENDPAGE
+%%EndPage: "7" 7
+%%Page: "8" 8
+612 792 0 FMBEGINPAGE
+[0 0 0 1 0 0 0]
+[ 0 1 1 0 1 0 0]
+[ 1 0 1 0 0 1 0]
+[ 1 1 0 0 0 0 1]
+[ 1 0 0 0 0 1 1]
+[ 0 1 0 0 1 0 1]
+[ 0 0 1 0 1 1 0]
+ 7 FrameSetSepColors
+FrameNoSep
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+1 10 Q
+0 X
+0 0 0 1 0 0 0 K
+(Similarly) 72 713.33 T
+(, Buttonbox usage is not limited to horizontal) 108.58 713.33 T
+(button display management. Instead, buttons may be) 72 701.33 T
+(oriented vertically as well as horizontally) 72 689.33 T
+(. Also, each) 236.6 689.33 T
+(button may be referred to by its associated tag in com-) 72 677.33 T
+(mands which allow them to be hidden, shown, con\336g-) 72 665.33 T
+(ured, or made the default.) 72 653.33 T
+(Flexibility is built into the lar) 72 629.33 T
+(ger scale mega-widgets as) 189.34 629.33 T
+(well. The Selectionbox class allows speci\336cation of) 72 617.33 T
+(labels, their position relative to their associated widget,) 72 605.33 T
+(and control over the display of the each element. The) 72 593.33 T
+(Fileselectionbox provides this same ability) 72 581.33 T
+(. Thus, the) 242.46 581.33 T
+(\336lter or selection labeled entries can be unmanaged as) 72 569.33 T
+(well as the \336le and directory lists.) 72 557.33 T
+(Lar) 72 533.33 T
+(ge scale \337exibility presents signi\336cant advantages.) 85.7 533.33 T
+(Applications may be designed in a more interactive) 72 521.33 T
+(manner) 72 509.33 T
+(. Consider the icon selector dialog example) 101.44 509.33 T
+(again. Suppose an alternate presentation of the dialog) 72 497.33 T
+(was to be considered. One in which the icon canvas) 72 485.33 T
+(appears above the list, the selection entry widget is) 72 473.33 T
+(removed, and an apply button is added. This could be) 72 461.33 T
+(quickly examined by con\336guring the components as) 72 449.33 T
+(given in Figure 1) 72 437.33 T
+(1.) 140.24 437.33 T
+(The ability to recon\336gure components also allows pro-) 72 413.33 T
+(grams to be built which change appearance on the \337y) 72 401.33 T
+(.) 284.36 401.33 T
+(An application which demands multiple \337avors of a) 72 389.33 T
+(mega-widget with dif) 72 377.33 T
+(ferent looks can create one) 157.92 377.33 T
+(instance and change the options between uses. This can) 72 365.33 T
+-0.16 (be much more ef) 72 353.33 P
+-0.16 (\336cient, since construction time is much) 138.81 353.33 P
+-0.22 (more costly than the time required to con\336gure and map) 72 341.33 P
+(the widget.) 72 329.33 T
+72 72 297 324 C
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+72 90.42 297 313.99 R
+7 X
+0 0 0 1 0 0 0 K
+V
+0.5 H
+2 Z
+0 X
+N
+%%BeginBinary: 12524
+260 357 133.71 183.6 0 116.86 127.83
+/red <
+3EC472FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF80808080
+8080808080808080808080808080808080808080404040404040404040404040
+4040404040404040404040000000000000000000000000000000000039C069DD
+00FF0000003333330033CCDD9999112277005544FFCC66AABBFF33EE9999CC7A
+EFD3557F9765E1A36FE700FF5500B22EAFB4CD73E6A24DBF0087F599FFFFB07A
+FFCCB088439D58D750D080C0C080C0808060C000FFA000FF20C0A040C040D060
+F0E010B4BE8BD28BD9B3FF7299FFA00019BF2FFF6223852F465F4770FF0000FF
+> store
+/green <
+57D79F00000000000000000000000000FFFFFFBFBFBFBFBF8080808080404040
+40000000FFFFFFFFFFBFBFBFBF808080808040404040400000000000FFFFFFFF
+FFBFBFBFBFBF8080808040404040400000000000FFFFFFFFFFBFBFBFBFBF8080
+8080804040400000000000FFFFFFBFBFBFBFBF80808040404040400063E0B500
+996699FF00663399BBFF99DD99FF112277005544CCCC66AABB6600EE6600CC69
+E3B56B7F9765E1A36FE700FF1A00B28BEEEE0073E6A24DBF00CEF599FFFFB094
+FFF730884DB358D78080C0C080C080808060C08000A080402070A0402040D0F0
+F0E010B4BE5BB477D9B3FF7789E4A0FF19264F00B641DE4F829E4780FF0000FF
+> store
+/blue <
+8CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF8040FFBF804000FFBF804000FFBF80
+00BF8040FFBF804000FF804000FFBF804000FFBF804000FFBF804000FFBF8040
+00FFBF804000FFBF4000FFBF804000FFBF804000FFBF804000FFBF804000FFBF
+804000FFBF00FFBF804000BF8040FFBF804000FFBF40FFBF8040004063E0B500
+FF3399FF88666666009966DDFFFF112277DD554499FFCCAABBCC99EE9966CC69
+E3B52F7F9765E1A36FE7BFCC8BEEB257EEB40073E6A24DBF80FAF56BFBB3B015
+3224608856CA58D7D050C080C08080C08060C080FF0000402070C0802040D060
+50E010B4BE7A8C65D9B3E08576C4A00070264F00FC5AE050B4A0FF9000FF00FF
+> store
+ BEGINBITMAPCOLORc
+z"z"z"
+6F6F7R=F6F76F6F7J"
+S<F78z8z8z
+4F9R<F94F9
+
+;z"
+S3F7F6<z"z
+0F6F7S F6=z8z
+/F9RMF9
+J%J'>$H"
+P#FEFEFEFE>FEFEFEFEF9FEFEFEFEFEJ"8"J'?"I"
+P#F9F9=FEFEF9F9F9FEF9FEJ"
+PIF9J$:$9'?#8"9$?$:$8"8#8$9'
+P*FEFEFEFEFEFEFEFEFEF9FEFEFEFEF9FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF9FEFE@s"J18%<"9#8'<08,8"
+F6F7OCFEFEFEF9FEFEF9FEFEFEF9FEFEFEF9F9FEF9FEFEF9FEFEFEFEFEF9FEFEFEFEFEF9FEFEF9FEFEFEF9FEFEF9F9F9F9FEFEFEF9FEFEFEF9F9FEArJ%9$<"@#9":"A";%>$<$
+F9OFF9F9F9F9F9F9F9F9F9F9FEFEFEF9F9F9F9F9F9F9F9F9F9@sJ"8#;%>%
+F7P2FEF9F9F9F9F9F9F9F9F9F9@tJ%9$G">%>%9%>$
+F9OEFEF9FEFEFEF9FEFEFEF9FEFEFEF9FEFEFEF9FEFEFEF9FEJ"838"9"<0808.8"
+P#FEFEF9F9F9FEFEFEF9F9F9F9FEFEFEF9F9F9FEFEFEF9FEFEFEFEF9F9F9F9FEFEFEF9F9FEFEF9F9F9FEFEFEF9F9F9F9FEFEFEF9F9FEFEF9F9F9FEFEFEF9F9F9FEFEJ%9$:$9s;':$8%9$:$:#9$9%
+P#F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9
+
+=z8z
+/F7RMF7rF"J%
+F7F7S F7F7F7F7'z&
+F6F6F6F6F6F7S2EDF6F6F6F6F68$J%
+F9F9F9S4F9F9F9F7
+
+
+
+
+
+
+
+
+
+HZ
+RHJ"
+S+ECJz"
+4RDEDEC
+
+
+
+
+
+
+
+J#
+PJFEFEJ"8"
+PIFEFEJ"
+Q!FEJ&
+PLEDEDFEFEFEJ":"
+PLFEFEJ"
+PIEDJ"8":"
+PJEDFEFEJ">#:#
+PEFEEDEDFEFEJ$:"="8"
+PDFEFEFEEDFEFEJ"9"
+PKFEFEJ"<"
+PGFEFEJ";"<"9#
+PDEDFEEDEDEDJ"8"
+Q$EDFEJ"?"8"
+PIFEEDFEJ"8#8#
+PDFEEDFEEDEDJ"C"
+PCFEFEJ"9#;";"
+PBFEEDFEEDFEJ#9"="
+PEEDFEEDFEJ"="
+Q EDEDJ"8"@$
+PAFEEDEDEDEDJ#?"
+PJFEFEEDJ"
+PFEDJ"8#
+PDFEEDEDJ"=$
+PAEDEDEDEDJ$
+PLFEFEFEJ$<"9"
+PBEDEDEDFEFE
+J#=$
+PIFEFEEDEDEDJ$
+PFFEFEFEJ$
+PCFEFEFEJ#
+PAFEFEJ"
+Q!EDJ"
+P@FEJ"
+Q EDJ#D#
+P>FEFEFEFEJ#H"
+P<FEFEFEJ"
+Q#FE
+J#
+P:FEFEJ#J$
+P8FEFE8FEFEFEJ"J"
+P7FE=FE
+
+J"
+Q(FE
+J#J"
+P7EDED=EDJz
+P9=ED
+
+
+
+
+
+Jz
+4RDECI"
+ECHz
+RHED
+
+
+
+
+
+J#
+4FEFE
+J%9%8&9%
+8FEFEFEFEFEFEFEFEFEFEEDFEFEFEFEFEFEJ.9,
+7FEFEEDEDFEFEEDFEFEEDEDFEFEFEEDFEFEEDFEFEEDEDFEFEJ#@"<%
+;EDEDEDFEEDEDEDJ&
+LEDEDFEFEFEJ"8"
+O EDFEJ#E%
+;FEFEFEFEEDEDJ.>'
+7EDFEFEFEFEEDEDEDFEFEFEFEEDEDFEFEFEFEEDJ#8%9%8#8#8%
+4EDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDED
+
+
+
+
+
+
+
+H5=z
+R.BAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFE3ECH5J"
+R.FEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBAFEBA9FFH#z"?r"r"
+BAFER+BAFFDEECDEFFH#J#E"
+FEBAR*FFBAFFH&I#J#G"
+BAFEBAFEFEFEFEQ@BAFFECH%J"J#D"
+FEBABABA4BAQAFFBAFFH#J#F$
+BAFER*BAFFEDECECH#9$:$8&:$J#C$
+FEBAFEFEFEFEFEFEFEFEFEBAFEFEFEFEQ=FFBAFFFFEDH#9%8-9%J#G$
+BAFEBABABAFEFEBABABAFEBABAFEBAFEBAFEBABABAFEQ<BAFFEDECECH#J#B$
+FEBAR*FFBAFFFFEDH#J#H$
+BAFER*BAFFEDECECH#J#A$
+FEBAR*FFBAFFFFEDH*8(;(J#I$
+BAFEBAFEBAFEFEFEBABAFEFEFEBABAFEFEFEBAFEFEFEBAQ<BAFFEDECECH"r:$8wJ#@$
+FEBABABABABAQ=FFBAFFFFEDH#J#J$
+BAFER*BAFF4EDECECH#J#?#u
+FEBAR*FFBAFFFFECH#J#@"B"
+BAFER*BAFFECECH#J#?z
+FEBAR*FFBA/DEH#J#?Z
+BAFER*BAFF/H#J#J"
+FEBAR*FFBA7ECH#J#Av"
+BAFER*BAFFEDECH#J#
+FEBAR*FFBAH#J#
+BAFER*BAFFH#8$:$8&8&9&9$:$:$J#
+FEBAFEFEFEFEFEFEFEFEFEBAFEFEBAFEFEFEFEBAFEFEFEFEFEFEFEFEFEFEFEFEQ"FFBAH)848&8&8&8&J#
+BAFEBAFEBABABAFEFEBABABAFEBABAFEBAFEBAFEBABAFEBABABAFEBAFEBABABAFEBABABAFEFEBABABAFEFEBABABAFEQ!BAFFH#;"J$9&8&J#
+FEBABA?FEFEFEBAFEFEFEBABAFEFEFEBAQ!FFBAH#J%9%9%J#
+BAFEEBABABABABABABAFEBABABAFEQ!BAFFH#;"J"8"<"J#
+FEBAFEBFEFEFEQ%FFBAH)8(;"8%8%9&8&8&J#
+BAFEBABAFEFEFEBABAFEFEFEBABAFEFEFEFEFEBAFEFEFEFEBAFEFEFEBABAFEFEFEBABAFEFEFEBAQ!BAFFH#8$:$8r8$9%:$:$:$J#
+FEBABABABABABABABABABABABABABABABABABABABABABABABAQ"FFBAH#J#
+BAFER*BAFFH#J$J#
+FEBA5FEFEFEQ@FFBAH#J$J#
+BAFE5BABABAQ@BAFFH#J#
+FEBAR*FFBAH5
+R.BAFEDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFBAFFH$z#
+FEBAFFR)DEFFBAH$J$
+BAFEDER(FEBAFFH$J$
+FEBAFFR(DEFFBAH$J$
+BAFEDER(FEBAFFH(:$9&9$J$
+FEBAFFDEFEFEFEFEFEFEFEDEFEFEFEFEFEFEQ=DEFFBAH)8&8&8&J$
+BAFEDEFEDEDEDEFEFEDEDEDEFEDEFEDEDEDEFEDEDEDEFEQ<FEBAFFH$:"G$J$
+FEBAFFDEFEFEFEQ=DEFFBAH$J%J$
+BAFEDE6DEDEDEDEQ<FEBAFFH$:"J"J$
+FEBAFFFE4FEQ<DEFFBAH)8&8%9&J$
+BAFEDEDEFEFEFEDEDEFEFEFEDEFEFEFEFEDEFEFEFEDEQ<FEBAFFH(:$9%:$J$
+FEBAFFDEDEDEDEDEDEDEDEDEDEDEDEDEDEQ=DEFFBAH$J$
+BAFEDER(FEBAFFH$J$
+FEBAFFR(DEFFBAH$J$
+BAFEDER(FEBAFFH5
+R.FEBAFFDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFFBAH#z"
+BAFER+BAFFH#J#
+FEBAR*FFBAH#:#J#
+BAFEFEFER$BAFFH#:"J#
+FEBABAR%FFBAH#J#
+BAFER*BAFFH#8$:$:$J#
+FEBAFEFEFEFEFEFEFEFEFEQEFFBAH(9&8&J#
+BAFEBAFEBABABAFEBABABAFEFEBABABAFEQDBAFFH#>&<"J#
+FEBABAFEFEFEBABAQDFFBAH#?%J#
+BAFEBABABAFEQKBAFFH#>"@"J#
+FEBAFEFEQDFFBAH08&J#
+BAFEBABAFEFEFEBAFEBABAFEFEFEBABAFEFEFEBAQDBAFFH#8&8$:$J#
+FEBABABABABABABABABABABABAQEFFBAH#J#
+BAFER*BAFFH#J#
+FEBAR*FFBAH#J#
+BAFER*BAFFH#J#
+FEBAR*FFBAH#J#
+BAFER*BAFFH#J#
+FEBAR*FFBAH#J#
+BAFER*BAFFH#J#
+FEBAR*FFBAH#J#
+BAFER*BAFFH#8$8&9%:$:$J#
+FEBAFEFEFEFEFEFEBAFEFEFEFEFEFEFEFEFEFEFEQ7FFBAH08&8&8&J#
+BAFEBAFEBABABAFEBABAFEBAFEBAFEBABABABAFEFEBABABAFEFEBABABAFEQ6BAFFH#8$A$="8&J#
+FEBAFEFEFEFEFEFEBABAFEFEFEBAQ6FFBAH#8%?%A%J#
+BAFEBABABABAFEBABABABABABAFEQ6BAFFH#;"J"8"J#
+FEBAFE4FEFEQ:FFBAH+;/8&J#
+BAFEBABAFEFEFEBABAFEFEBABAFEFEFEBAFEBABAFEFEFEBABAFEFEFEBAQ6BAFFH#8$8r8&8$:$J#
+FEBABABABABABABABABABABABABABABABAQ7FFBAH#J#
+BAFER*BAFFH#J#
+FEBAR*FFBAH#J#
+BAFER*BAFFH#J#
+FEBAR*FFBAH#J#
+BAFER*BAFFH#J#
+FEBAR*FFBAH&I#J#J#
+BAFEBAFEFEFEFE>FEFEQ BAFFH%J"J"J#
+FEBABABA4BA?BAQ!FFBAH#J#
+BAFER*BAFFH#;#9$8(8$:$9%9&9$J#
+FEBAFEFEFEFEFEFEFEFEBAFEFEFEFEFEFEFEFEFEFEFEFEFEFEBAFEFEFEFEFEFEQ!FFBAH#:$8.8%8&8&8&8%J#
+BAFEFEBABAFEBABABAFEBABAFEBABABAFEBABABABAFEFEBABABAFEBABABABAFEBAFEBABABAFEBABABAQ!BAFFH#9#;$J$J#
+FEBAFEBAFEFEFE9FEFEFEQ/FFBAH#9#;%8&F%J#
+BAFEBAFEBABABABABAFEBAFEBAFEBABABAQ/BAFFH#:#=":"J#
+FEBABAFEFEFEQEFFBAH%9*9$8'8&8,9'J#
+BAFEBAFEBAFEFEBABAFEFEFEBABAFEBAFEBAFEFEFEBABAFEFEFEBABAFEFEFEBAFEBAFEFEFEFEBAFEFEFEBAFEPMBAFFH&9#8$?&:$:u:&J#
+FEBABABABABABABABABABABABABABABABABABABABABABABAPMFFBAH#J#
+BAFER*BAFFH#F$J#
+FEBAFEFEBAQEFFBAH#F#J#
+BAFEBABAQFBAFFH#J#
+FEBAR*FFBAH#J#
+BAFER*BAFFH#J#
+FEBAR*FFBAH#E$G#J#
+BAFEFEFEFEFEFEQ3BAFFH#8"B#H"J#
+FEBAFEBABABAQ4FFBAH#J#
+BAFER*BAFFH)9$A$8&;#:$8&:$J#
+FEBABAFEFEFEFEFEFEFEFEFEFEFEFEBAFEFEFEFEFEFEFEFEFEBAFEFEFEFEFEFEPIFFBAH)8&?-9%8-8&J#
+BAFEBABAFEBABABAFEBABABAFEFEBABABAFEBABAFEBABABAFEFEBABAFEFEBABABAFEBABAFEFEBABAFEFEBABABAFEPHBAFFH#?$A$A"C"<$J#
+FEBAFEFEFEFEFEFEBABAFEFEFEPIFFBAH#?%@%J%J#
+BAFEBABABABABABABABA?BABABABAPHBAFFH#<";"C"J"J#
+FEBAFEFEFEBFEPHFFBAH#8,8-959(J#
+BAFEBAFEFEFEBABABAFEFEFEBAFEFEFEFEFEFEBABAFEFEFEBA6FEFEFEBABAFEFEFEBAFEFEFEBABAFEFEFEBABAFEFEFEFEBABAFEFEFEBAPHBAFFH#9$9$9'8$:$8r8$8$8#8$J#
+FEBABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAPIFFBAH#J#
+BAFER*BAFFH#J$J#
+FEBA<FEFEFEQ9FFBAH#J$J#
+BAFE<BABABAQ9BAFFH#J#
+FEBAR*FFBAH#J#
+BAFER*BAFFH#J#
+FEBAR*FFBAH#J#J#
+BAFE<FEFEQ:BAFFH#8"J"J#
+FEBAFE9BAQ;FFBAH#J#
+BAFER*BAFFH)8&8%:$;#J#
+FEBABAFEFEFEFEFEFEBAFEFEFEFEFEFEFEFEFEFEFEFEQ7FFBAH)8&8&8&9%J#
+BAFEBABAFEBABABABAFEBABABABABABABAFEFEBABABAFEFEBABAFEQ6BAFFH#F$9&9"J#
+FEBAFEFEFEBAFEFEFEBABAQ9FFBAH#E%:%J#
+BAFEFEBABABABABABAFEQ=BAFFH#<"E"J#
+FEBAFEFEQAFFBAH#8+95J#
+BAFEBAFEFEFEBABAFEFEFEFE4BAFEFEFEBAFEBABAFEFEFEBABAFEFEFEBAFEFEFEQ5BAFFH#9$8%:&8$8rJ#Av
+FEBABABABABABABABABABABABABABABABABAQ5FFBAECH#J#@"
+BAFER*BAFFECH#J#?z
+FEBAR*FFBA/DEH#J#?Z
+BAFER*BAFF/H#J#?"C"
+FEBAR*FFBADEECH#J#Bt$
+BAFER*BAFFEDECECDEH#J#@$
+FEBAR*FFBADEFFFFH#J#J"J#J$
+BAFE6FEFEDFEPIBAFF4ECECDEH#J"E"C"="J#A$
+FEBA6BAFEFEBAPIFFBADEFFFFH#J#I$
+BAFER*BAFFECECDEH+8$9&;#9$9&8%9&8$;$8&J#B$
+FEBABAFEFEFEBAFEFEFEFEFEFEFEBAFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEBAFEFEFEP:FFBADEFFFFH18&:$8&8&8&8&8#;-J#H$
+BAFEBABAFEBABABAFEBABAFEBABABAFEBAFEBABABAFEBABAFEBABABAFEBAFEBABABABABABABAFEBAFEBABABABABAFEBABABAFEBABAFEFEBABAFEP9BAFFECECDEH#:"I#:&@$J"J#C$
+FEBAFEFEBABAFEFEFEBAFEFEFE9BAP<FFBADEFFFFH#J#;%?%J#G$
+BAFE8BAFEBABABAFEFEBABABAQ(BAFFECECDEH#8&H#9"A"C"J#D$
+FEBABAFEBAFEBABAFEFEFEFEPMFFBADEFFECH#?&8%8"9*9-8,8*9"J#H"
+BAFEBAFEFEFEBAFEFEFEFEFEBAFEFEBABAFEFEFEBABAFEFEFEBABABAFEFEFEBAFEBAFEFEFEBABAFEFEFEFEFEBAFEFEFEBABAFEFEFEFEP8BAFFDEH#9$:$9%8#9#8$;$9&9$8&9$8$8#J#E"
+FEBABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAP8FFBADEH#J#G"
+BAFER*BAFFDEH5?Z
+R.FEBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBA/H5>"
+R.BAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFBAFFFFHz=z
+R.ED3ED
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<z
+S2EC=z"
+S0EDFF=Z
+S0<z
+S2ED
+
+
+
+
+
+
+
+Ez
+O9ECJ"
+OGFFGz"
+O5EDFF
+
+
+JZJZJZ
+5O-4O-4O-J"J"J"
+OAECO@ECO@ECJz"Jz"Jz"
+7O)EDEC7O)EDEC7O)EDEC
+
+
+
+
+J%:#9#J#G#J%J#
+LFEFEFEFEFEFEFEFEO+FEFEFEFEO)FEFEFEFE=FEFEJ'=$J"8"J'
+KFEFEEDEDFEFEFEFEEDO*FEFEO:FEFEEDEDFEFEJ$8$;$J#9&8&;#9#J$8(8&9%9%
+JFEFEEDEDFEFEFEFEEDO,EDEDFEFEEDFEFEFEFEEDFEFEFEFEFEFEMFEFEEDEDEDEDFEFEFEFEFEFEEDFEFEFEFEFEFEFEFEFEFEJ$J":"9%9%J'93
+O(FEFEEDO+FEFEFEEDFEFEFEEDFEFEO1FEFEEDEDFEFEFEEDFEFEEDFEFEEDEDFEFEEDFEFEEDEDFEFEJ"<"=(J#=">#
+P?EDEDEDFEFEEDFEFEEDO&EDEDEDEDEDJ$J#J$I#
+O(EDFEFEO-FEFEOBFEFEFEFEFEJ$J)H&J%I%
+O)EDFEFEO)FEFEEDEDEDEDFEFEEDFEFEFEEDO'FEFEEDEDEDEDEDEDJ$8$<$J"<"J$8#H#;#
+JEDFEFEFEFEEDEDFEFEO2FEFEO-EDFEFEFEFEFEFEFEFEJ'>$J%9%<"J.=.
+KEDFEFEFEFEEDEDFEFEO1EDFEFEEDEDFEFEEDEDO$EDFEFEFEFEEDEDFEFEFEEDFEFEEDFEFEFEFEEDEDEDFEFEFEFEEDJ%:#:#J#:#9#;#8#;"J%8s8#8%9%8#
+LEDEDEDEDEDEDEDEDO'EDEDEDEDEDEDEDEDEDEDEDO#EDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDJ"
+Q"FEJ$
+Q!FEFEEDJ#;#?#
+P=EDEDEDEDEDED
+
+&J%
+F7F7F7F7F7S3F7F7F7F7&HzJzJzH&
+F6F6F6F6F6O)EC8O)EC8O)ECF6F6F6F6F68$G"J"J"J%
+F9F9F9ECO@ECO@ECO<F9F9F9F7JzJzJz
+5O-ED4O-ED4O-ED
+
+
+GZ
+O5F"
+FFEz
+O9ED
+
+
+
+
+
+
+
+<z"z"z
+0F6F7R=F6F71F6;z8z8z
+1F9R<F91F9
+
+7z8z8z
+5F7R<F74F7"J"J"
+F76F7R=F7
+ENDBITMAP
+%%EndBinary
+87.14 96.14 285.14 123.14 R
+7 X
+V
+4 8 Q
+0 X
+(.iconSel conf) 87.14 117.81 T
+(igure -childsitepos n \134) 149.54 117.81 T
+( -selectionon no) 87.14 107.81 T
+(.iconSel show Apply) 87.14 97.81 T
+0 10 Q
+(FIGURE 1) 98.29 76.02 T
+(1) 144.13 76.02 T
+1 F
+( - Alternate icon selector dialog) 149.13 76.02 T
+0 0 612 792 C
+1 10 Q
+0 X
+0 0 0 1 0 0 0 K
+(For example, consider an application which must con-) 315 560.33 T
+(\336rm a user request prior to performing the operation. In) 315 548.33 T
+(addition, due to the serious nature of the operation, the) 315 536.33 T
+(user must con\336rm positively twice. The following code) 315 524.33 T
+(segment creates the initial message dialog and con\336g-) 315 512.33 T
+(ures the message to ask \322Are you sure ?\323. The dialog is) 315 500.33 T
+(then mapped with the \324activate\325 command. If the user) 315 488.33 T
+(responds positively) 315 476.33 T
+(, then the message is changed to) 391.85 476.33 T
+(\322Are you really sure ?\323 and redisplayed. Only with two) 315 464.33 T
+-0.35 (af) 315 452.33 P
+-0.35 (\336rmative replies does the script perform the operation.) 322.59 452.33 P
+-0.18 (Figure 12 depicts the dialog presentations with dif) 315 440.33 P
+-0.18 (ferent) 514.36 440.33 P
+(messages and the associated code.) 315 428.33 T
+(This same instance of the message dialog can be recon-) 315 132.33 T
+(\336gured into a error dialog. All the options can be) 315 120.33 T
+(dynamically changed. It is possible to not only change) 315 108.33 T
+-0.05 (the bitmap but its location as well. Furthermore, we can) 315 96.33 P
+(modify the text of the buttons and make the dialog non-) 315 84.33 T
+315 153 540 425 C
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+315 182 540 416 R
+7 X
+0 0 0 1 0 0 0 K
+V
+0.5 H
+2 Z
+0 X
+N
+0 0 0 1 0 0 0 K
+%%BeginBinary: 4520
+217 162 86.8 64.8 0 327.2 342.2
+/red <
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000008EEF9AFF2CAEB6CF71E7
+A24DF70055BE928AB2D3FF00F7557DDBB2002CFF6120822C455D4571FF0000FF
+> store
+/green <
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000082D78AE78AEFEF0071E7
+A24DF70055BE827530B6FFFFDF697DDBB2004D00B641DF4D829E4582FF0000FF
+> store
+/blue <
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000006DB675C755EFB60071E7
+A24DF77D55BE9265618EE300B22C7DDBB28A4D00FF59E351B6A2FF9200FF00FF
+> store
+ BEGINBITMAPCOLORc
+z"z"z"
+7F6F7Q>F6F77F6F7J"
+R?F78z8z8z
+5F9Q=F95F9
+
+
+<z"
+R4F7F6=z"z
+0F6F7R!F6>z8z
+/F9R F9
+J'J'J"9#
+O<FEFEFEFEF9FE4FEFEFEF9FEFE?FEFEFEJ'J$J"
+O;FEFEF9F9F9FE4FEFEF9BFEJ$9"J%J#
+O:FEFEF9F97F9F9F9F9CF9F9J$9'9"8&8-8#:%9"8&:$9'
+OEFEFEFEFEFEFEF9FEFEFEFEFEFEFEFEFEFEFEF9FEFEFEFEFEF9FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF9FEFEAs"J,8%8"8$:"8"8"8):%8"8$:*8%
+F6F7O-F9F9FEFEFEF9FEFEFEF9F9FEF9FEFEF9F9F9F9F9FEF9FEF9FEFEFEF9FEFEF9F9FEFEF9F9F9F9FEFEFEF9FEFEFEF9F9FEF9FEFEBrJ$<"H$9"9"<$F$<"
+F9O2F9F9F9F9F9F9F9F9F9F9FEFEF9F9F9F9AsJ"J%
+F7O.FEO!FEFEF9F9AtJ$9":$J"F$
+F9O&F9FEFEFEFEF9FELFEFEF9FEJ28"9$8$8$8"8"8"9"9'8"8&8,8"9"
+O;F9FEFEFEFEFEF9F9F9F9FEFEFEF9F9F9FEFEFEF9FEFEF9FEFEF9FEFEFEFEFEFEF9F9FEFEF9FEF9FEFEF9FEFEF9F9F9FEFEFEF9F9F9FEFEFEJ&:$9z8w8'9r9$9s
+O<F9F9F9F9F9F9F9F97F9F9F9F9F9F9F9F9F9F9F9F9F9
+
+>z8z
+/F7R F7sF"J&
+F7F7R!F7F7F7F7F7(z'
+F6F6F6F6F6F6F7R3D9F6F6F6F6F6F68%J&
+F9F9F9F9R5F9F9F9F9F7
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Ju
+BFEJ-
+AFEFED9FED9FED9FED9FED9FEJ/
+@FEFED9FED9FED9FED9FED9FED9FEJ&r%
+?FEFED9FED9FED9FED9FEJ%=&
+@D9FED9FEFED9FED9FEJ$?%
+@FED9FEFED9FED9J$9$9%J#J%
+@D9FED9D9FED9D9FED9FEBFEFEO?FEFEFEFEJ$9$9&J"8"J'
+@FED9FEFED9FEFED9FED9FE@FEFEO=FEFED9D9FEFEJ$9$9'J#9+<#9#8%8#8#<%8#8.
+@D9FED9D9FED9D9FED9FED9FE@D9D9FEFED9FEFED9FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFED9FEFED9FEFED9FEFEFEFEJ*9(J":"9"8'C'B'@"8'<'
+@FED9FED9FED9FED9FEFED9FED9FED9FE=FEFEFEFEFED9D9FEFEFEFED9D9FEFEFEFED9D9FEFEFEFEFED9D9FEFED9D9D9FEFED9J):(J#A(J%A#D$
+@D9FED9FED9FED9FED9FED9FEFEFED9GD9D9D9FEFED9FEFED95FED9D9D9D9D9FEFED9J(:(J#;":#J&A":#
+@FED9FED9FED9FED9FED9FED9D9D9@FEFED9FEFEAD9D9FEFEFED9FEFEJ(:'J)=%<&J"8"E%>#
+?D9FEFED9FED9FED9FED9FED9FE?FEFED9D9D9D9FEFED9D9D9D9D9FEFEFED96D9FED9D9D9D9D9D9J'9(J#J"=%<"B#>#
+@D9FEFED9FED9D9FED9FED9FED9O"FEFE7FEFEFED9D9FEFEFEFEFEJ&9'J'=";,=,>'
+AD9FEFED9FEFED9FED9FED9MD9FEFEFEFED9D9D9FEFEFEFED9D9D9FEFED9D9FEFEFEFED9D9D9FEFED9D9FEFEFEFED9J.J#:%:%@":%9&<%9s:%?#
+BD9FEFED9FED9FED9FED9FED9FE@D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9J,J"
+DD9FED9FED9FED9FED9FED9O,FEJ+J$
+DFED9FEFEFED9FED9D9D9O,FEFED9J#9$J#
+DD9FEFED9FEO.D9D9J#9$
+DFED9D9FED9J+
+BFEFED9FED9FED9FED9FEJ+
+CD9FED9FED9FED9FED9FEJv
+BD9
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+=z
+R3D8>z"
+R1D9FF>Z
+R1=z
+R3D9
+
+
+
+Jz
+BO1FE
+Jz
+DO-D9
+Jz
+FO)D8J"
+P FFJz"
+HO%D9FF
+
+
+JZJZ
+LKJKJ"J"
+OHD8OFD8Jz"Jz"
+O GD9D8MGD9D8
+
+
+
+
+J#:#J#9#
+O(FEFEFEFEOBFEFEFEFEJ"
+Q&FEJ$8)9%J%
+O(D9FEFEFEFED9D9FEFEFEFEFEFEFEFEO?FEFEFEFEJ.J#:'
+O0FEFED9D9FEFED9FEFED9D9FEFEO7D9FEFEFED9D9FEFEJ'@%
+O)D9FEFEFEFED9FED9D9D9J"8":#9&J#
+O*D9D9FEFED9D9FEFEFEO9D9FEJ%9"8"
+O2D9D9D9D9D9FEJ(J"
+O4FEFED9FEFED9D9O;D9J.J'
+O0D9FEFEFEFED9D9D9FEFEFEFED9O=D9FEFEFEFED9J#:%9%J#9#8%
+O+D9D9D9D9D9D9D9D9D9D9O6D9D9D9D9D9D9D9D9
+
+
+
+
+
+
+'J&
+F7F7F7F7F7F7R4F7F7F7F7F7'JzJzJ'
+F6F6F6F6F6F6HGD8O GD8HF6F6F6F6F6F68%J"J"J&
+F9F9F9F9GD8OFD8OBF9F9F9F9F7JzJz
+LKD9JKD9
+
+
+JZ
+HO%J"
+GFFJz
+FO)D9
+Jz
+DO-FE
+Jz
+BO1D9
+
+
+
+=z"z"z
+0F6F7Q>F6F71F6<z8z8z
+1F9Q=F91F9
+
+
+7z8z8z
+6F7Q=F75F7"J"J"
+F77F7Q>F7
+ENDBITMAP
+%%EndBinary
+%%BeginBinary: 4795
+254 162 101.6 64.8 0 420.4 342.2
+/red <
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000008EEF9AFF2CAEB6CF71E7
+A24DF70055BE928AB2D3FF0055F7DB7DB2002CFF6120822C455D4571FF0000FF
+> store
+/green <
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000082D78AE78AEFEF0071E7
+A24DF70055BE827530B6FFFF69DFDB7DB2004D00B641DF4D829E4582FF0000FF
+> store
+/blue <
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000006DB675C755EFB60071E7
+A24DF77D55BE9265618EE3002CB2DB7DB28A4D00FF59E351B6A2FF9200FF00FF
+> store
+ BEGINBITMAPCOLORc
+z"z"z"
+7F6F7R5F6F77F6F7J"
+S6F78z8z8z
+5F9R4F95F9
+
+
+<z"
+S+F7F6=z"z
+0F6F7RFF6>z8z
+/F9REF9
+J'J'J"9#
+P FEFEFEFEF9FE4FEFEFEF9FEFE?FEFEFEJ'J$J"
+OMFEFEF9F9F9FE4FEFEF9BFEJ$9"J%J#
+OLFEFEF9F97F9F9F9F9CF9F9J$9'9"8&8-8#:%9"8&:$9'
+P)FEFEFEFEFEFEF9FEFEFEFEFEFEFEFEFEFEFEF9FEFEFEFEFEF9FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF9FEFEAs"J,8%8"8$:"8"8"8):%8"8$:*8%
+F6F7O?F9F9FEFEFEF9FEFEFEF9F9FEF9FEFEF9F9F9F9F9FEF9FEF9FEFEFEF9FEFEF9F9FEFEF9F9F9F9FEFEFEF9FEFEFEF9F9FEF9FEFEBrJ$<"H$9"9"<$F$<"
+F9ODF9F9F9F9F9F9F9F9F9F9FEFEF9F9F9F9AsJ"J%
+F7O@FEO!FEFEF9F9AtJ$9":$J"F$
+F9O8F9FEFEFEFEF9FELFEFEF9FEJ28"9$8$8$8"8"8"9"9'8"8&8,8"9"
+OMF9FEFEFEFEFEF9F9F9F9FEFEFEF9F9F9FEFEFEF9FEFEF9FEFEF9FEFEFEFEFEFEF9F9FEFEF9FEF9FEFEF9FEFEF9F9F9FEFEFEF9F9F9FEFEFEJ&:$9z8w8'9r9$9s
+P F9F9F9F9F9F9F9F97F9F9F9F9F9F9F9F9F9F9F9F9F9
+
+>z8z
+/F7REF7sF"J&
+F7F7RFF7F7F7F7F7(z'
+F6F6F6F6F6F6F7S*D9F6F6F6F6F6F68%J&
+F9F9F9F9S,F9F9F9F9F7
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Ju
+BFEJ-
+AFEFED9FED9FED9FED9FED9FEJ/
+@FEFED9FED9FED9FED9FED9FED9FEJ&r%
+?FEFED9FED9FED9FED9FEJ%=&
+@D9FED9FEFED9FED9FEJ$?%
+@FED9FEFED9FED9J$9$9%J#J&J%
+@D9FED9D9FED9D9FED9FEBFEFEO2FEFED9FEFEMFEFEFEFEJ$9$9&J"8"J'
+@FED9FEFED9FEFED9FED9FE@FEFEP4FEFED9D9FEFEJ$9$9'J#9+<#9#8%8#8#;+9%>#9#<%8#8.
+@D9FED9D9FED9D9FED9FED9FE@D9D9FEFED9FEFED9FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFED9FEFED9FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFED9FEFED9FEFED9FEFEFEFEJ*9(J":"9"8'C'D"8.I'@"8'<'
+@FED9FED9FED9FED9FEFED9FED9FED9FE=FEFEFEFEFED9D9FEFEFEFED9D9FEFEFEFEFED9D9FEFED9FEFED9D9FEFEFEFED9D9FEFEFEFEFED9D9FEFED9D9D9FEFED9J):(J#A(J#=#A(=%A#D$
+@D9FED9FED9FED9FED9FED9FEFEFED9GD9D9D9FEFED9FEFED96D9D9D9D9D9FEFED9FEFED9FED9D9D9D9D9FEFED9J(:(J#;":#J":#:$J&A":#
+@FED9FED9FED9FED9FED9FED9D9D9@FEFED9FEFECD9FEFEFEFEFE5D9D9FEFEFED9FEFEJ(:'J)=%<&J*@&>"8"E%>#
+?D9FEFED9FED9FED9FED9FED9FE?FEFED9D9D9D9FEFED9D9D9D9D9FEFEFED9;D9D9D9D9D9FEFED9D9D9FEFEFED9D9FED9D9D9D9D9D9J'9(J#J"F#J%<"B#>#
+@D9FEFED9FED9D9FED9FED9FED9O"FEFE7FEFEFE:FEFED9D9FEFEFEFEFEJ&9'J'=";,B/>"?,>'
+AD9FEFED9FEFED9FED9FED9MD9FEFEFEFED9D9D9FEFEFEFED9D9D9FEFED9D9FEFEFEFED9D9D9FEFEFED9FEFED9D9FEFEFEFED9D9D9FEFED9D9FEFEFEFED9J.J#:%:%@":%9&;#:%9v;">%9s:%?#
+BD9FEFED9FED9FED9FED9FED9FE@D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9J,J"J"
+DD9FED9FED9FED9FED9FED9O,FEO$FEJ+J$J$
+DFED9FEFEFED9FED9D9D9O,FEFED9O"FEFED9J#9$J#J#
+DD9FEFED9FEO.D9D9O#D9D9J#9$
+DFED9D9FED9J+
+BFEFED9FED9FED9FED9FEJ+
+CD9FED9FED9FED9FED9FEJv
+BD9
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+=z
+S*D8>z"
+S(D9FF>Z
+S(=z
+S*D9
+
+
+
+Jz
+O O1FE
+Jz
+O"O-D9
+Jz
+O$O)D8J"
+P,FFJz"
+O&O%D9FF
+
+
+JZJZ
+O*KO)KJ"J"
+P&D8P%D8Jz"Jz"
+O,GD9D8O,GD9D8
+
+
+
+
+J#:#J#9#
+O4FEFEFEFEP!FEFEFEFEJ"
+Q?FEJ$8)9%J%
+O4D9FEFEFEFED9D9FEFEFEFEFEFEFEFEOLFEFEFEFEJ.J#:'
+O<FEFED9D9FEFED9FEFED9D9FEFEODD9FEFEFED9D9FEFEJ'@%
+O5D9FEFEFEFED9FED9D9D9J"8":#9&J#
+O6D9D9FEFED9D9FEFEFEOFD9FEJ%9"8"
+O>D9D9D9D9D9FEJ(J"
+O@FEFED9FEFED9D9OHD9J.J'
+O<D9FEFEFEFED9D9D9FEFEFEFED9OJD9FEFEFEFED9J#:%9%J#9#8%
+O7D9D9D9D9D9D9D9D9D9D9OCD9D9D9D9D9D9D9D9
+
+
+
+
+
+
+'J&
+F7F7F7F7F7F7S+F7F7F7F7F7'JzJzJ'
+F6F6F6F6F6F6O&GD8O-GD8O&F6F6F6F6F6F68%J"J"J&
+F9F9F9F9O%D8P%D8P F9F9F9F9F7JzJz
+O*KD9O)KD9
+
+
+JZ
+O&O%J"
+O%FFJz
+O$O)D9
+Jz
+O"O-FE
+Jz
+O O1D9
+
+
+
+=z"z"z
+0F6F7R5F6F71F6<z8z8z
+1F9R4F91F9
+
+
+7z8z8z
+6F7R4F75F7"J"J"
+F77F7R5F7
+ENDBITMAP
+%%EndBinary
+0 0 0 1 0 0 0 K
+324 191 531 335 R
+7 X
+V
+4 8 Q
+0 X
+(messagedialog .md -modality application \134) 324 329.67 T
+( -title Conf) 324 319.67 T
+(irmation -bitmap questhead \134) 391.2 319.67 T
+( -text \322Are you sure ?\323) 324 309.67 T
+(.md buttonconf) 324 299.67 T
+(igure OK -text \322Yes\323) 391.2 299.67 T
+(.md buttonconf) 324 289.67 T
+(igure Cancel -text \322No\323) 391.2 289.67 T
+(.md hide Help) 324 279.67 T
+(if {[.md activate]} {) 324 259.67 T
+( .md conf) 324 249.67 T
+(igure \134) 381.6 249.67 T
+( -text \322Are you really sure ?\323) 324 239.67 T
+( if {[.md activate]} {) 324 229.67 T
+( # Perform operation) 324 219.67 T
+( }) 324 209.67 T
+(}) 324 199.67 T
+0 10 Q
+(FIGURE 12) 354.44 166.17 T
+1 F
+( - Con\336rmation dialog) 405.83 166.17 T
+0 0 612 792 C
+315 567 540 720 C
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+315 585 540 720 R
+7 X
+0 0 0 1 0 0 0 K
+V
+0.5 H
+2 Z
+0 X
+N
+0 0 0 1 0 0 0 K
+%%BeginBinary: 4792
+337 137 121.32 49.32 0 364.68 661.68
+/red <
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000868EEF9AFF2CAEB6CF71E7
+A24DF70055BE928AB2D3FF00F7557DDBB2002CFF6120822C455D4571FF0000FF
+> store
+/green <
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000DF82D78AE78AEFEF0071E7
+A24DF70055BE827530B6FFFFDF697DDBB2004D00B641DF4D829E4582FF0000FF
+> store
+/blue <
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000E36DB675C755EFB60071E7
+A24DF77D55BE9265618EE300B22C7DDBB28A4D00FF59E351B6A2FF9200FF00FF
+> store
+ BEGINBITMAPCOLORc
+z"z"z"
+7F6F7T,F6F77F6F7J"
+U-F78z8z8z
+5F9T+F95F9
+
+
+<z"
+U"F7F6=z"z
+0F6F7T=F6>z8z
+/F9T<F9
+Js
+Q5FEJ"8$
+Q5F9F9F9F9J"
+Q;F9J18$9'
+Q:FEF9F9F9FEFEFEF9FEFEFEFEFEF9FEFEFEFEFEFEFEFEF9FEFEAs"J#:"8"8"8"8*8"
+F6F7Q$FEFEF9FEF9FEFEFEFEF9FEFEFEF9F9FEBrJ#=$9$8$<$
+F9Q%F9F9F9F9F9F9F9F9F9F9F9F9F9F9AsJ$
+F7Q'F9F9FEAtJ"F$
+F9Q'FEFEF9FEJ"8$9"8"8"8"8*8"
+Q5FEFEFEFEFEFEFEFEF9F9FEFEFEF9F9F9FEFEJx8%:$9%
+Q5F9F9F9F9F9F9F9F9F9F9F9F9
+
+>z8z
+/F7T<F7sF"J&
+F7F7T=F7F7F7F7F7(z$z'
+F6F6F6F6F6F6F7S!D9D8D8D8OKD9F6F6F6F6F6F68%J#J&
+F9F9F9F9S#D9FFOLF9F9F9F9F7
+
+
+Jz
+S1O@FE
+Jz
+S3O=D9
+Jz
+S5O9D8J"
+TMFFJz"
+S7O5D9FF
+
+
+JZ
+S;O-J"
+TGD8Jz"
+S=O)D9D8
+
+
+
+
+J'@#
+SGFEFEFEFEFEFEFEFEJ&
+SID9D9D9FEFEJ%8"8*9#
+T"FEFEFEFEFEFED9FEFED9FEFEFEFEFEFEJ)8"9"
+T!FEFED9D9FEFED9D9D9FEJ&F*
+SIFEFEFEFED9D9D9D9FEFED9FEFED9J#<#@"
+SID9D9FEFED9J$9%B&
+SKD9FEFED9D9D9D9D9FEFEFED9J#;"
+T%FEFEFEJ'8%="
+T!D9FEFEFEFED9D9FEFED9D9J#9#8%:&="
+SGD9D9D9D9D9D9D9D9D9D9D9D9D9D9JsJ"
+P:FEQ@FEJ+J$
+P9FEFED9FED9FED9FED9FEQ>FEFED9J-J#
+P8FEFED9FED9FED9FED9FED9FEQ=D9D9J%r$
+P7FEFED9FED9FED9FEJ'<%
+P6FEFED9FED9FED9FED9FEJ'<%
+P7D9FED9FED9FED9FED9FEJ(=#
+P7FED9D9D9FED9FEFED9J#8%<#
+P7D9FED9FED9FED9FEJ#9%;#Jz
+P7FED9D9FED9FEFED9PDO)D8J#:%:#J"
+P7D9FED9FED9FED9FEPCD8J#;%9#Jz
+P7FED9D9FED9FEFED9PBO-D9J#<)
+P7D9FED9FED9FEFEFED9FEJ%<(
+P6D9FED9FED9FED9FED9FED9J%=%
+P7D9FED9FEFED9FED9J$r$JZ
+P8D9FED9FED9FED9P@O5J,J"
+P9D9FED9FED9FED9FED9FED9P@FFJ*Jz
+P:D9FED9FED9FED9FED9P@O9D9Jr
+P;D9Jz
+S3O=FE
+Jz
+S1O@D9
+
+
+
+
+
+J#9#E#;#C#J#F#
+O%FEFEFEFEFEFEFEFEFEFEO1FEFEFEFEJ#
+QHD9D9J&9%;#<%<"8"8%=%9%9%9%9%9%=#;%8#9&8%9%
+O-FEFED9FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFED9FEFEFEFEFEFEFEFEFEFEJ,9%:';"8);5;%9'B.JZ
+O/FED9FEFED9FEFED9D9FEFEFED9FEFEFEFED9D9FEFED9D9D9FEFED9D9FEFEIFEFED9D9FEFED9FEFED9D9FEFED9FEFED9D9FEFED9FEFED9D9FEFED9FEFED9D9FEFED9FEFED9D9FEFEFEFED9FEFEFED9D9FEFEFEFED9D9FEFED9FEFED9D9FEFEO1O-J":#="J#?#;#@%9%>"@(>#J"
+O/D9D9D9D9BD9D9D9D9D9D9FED9D9D9FED9D9D9D9D9FEFED9FEFED9D9D9PDD8J$E#J$I#9&8&E#J#Jz"
+O5FEFEFEFEFE8FEFEFEFEFED9D9FEFEFED9D9FEFEFEFEFE7FEFEO5O)D9D8J%E%J%I%9"8"9"8"D%8&D%
+O4FEFED9D9D9D9D9D95FEFED9D9D9D9D9D9D9FED9FED9D9D9D9D9FEFEFED9D9D9D9D9J(G"A#?"J#;#;(9%@"=#F#;#
+O%D9FEFED9FEFED9FEFEFEFE6FEFEFEFEFEFED9FEFED9D9FEFED9D9FEFEFEFEFEFEFEJ"A(8%:'<+;5;%9'9$<.
+O(FED9FEFEFED9FEFED9FEFED9D9FEFEFEFED9D9FEFED9D9FEFEFEFED9ID9FEFEFED9FEFED9FEFEFEFED9D9D9FEFEFEFED9D9D9FEFEFEFED9D9D9FEFEFEFED9D9D9FEFEFEFED9D9FEFED9D9FEFEFEFED9D9FED9D9FEFEFEFED9D9D9FEFEFEFED9J&8#8#8v8#8%>#8%=v9%9%9%9%=&8%;":#8%9%
+O&D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9
+J%J#
+SGFEFEFEFE=FEFEJ'
+SFFEFED9D9FEFEJ$8(8&9%9%
+SEFEFED9D9D9D9FEFEFEFEFEFED9FEFEFEFEFEFEFEFEFEFEJ'93
+SLFEFED9D9FEFEFED9FEFED9FEFED9D9FEFED9FEFED9D9FEFEJ#=">#
+SLD9D9D9D9D9J$I#
+SMFEFEFEFEFEJ%I%
+SLFEFED9D9D9D9D9D9J$8#H#;#
+SED9FEFEFEFEFEFEFEFEJ.=.
+SFD9FEFEFEFED9D9FEFEFED9FEFED9FEFEFEFED9D9D9FEFEFEFED9J%8s8#8%9%8#
+SGD9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9
+
+
+
+
+
+
+'J&
+F7F7F7F7F7F7U"F7F7F7F7F7'JzF'
+F6F6F6F6F6F6S7O)D8F6F6F6F6F6F68%J"J&
+F9F9F9F9S6D8O:F9F9F9F9F7Jz
+S;O-D9
+
+
+
+
+
+
+
+
+
+
+
+
+J"
+S)FF=z"z"z
+0F6F7T,F6F71F6<z8z8z
+1F9T+F91F9
+
+
+7z8z8z
+6F7T+F75F7"J"J"
+F77F7T,F7
+ENDBITMAP
+%%EndBinary
+0 0 0 1 0 0 0 K
+324 594 531 657 R
+7 X
+V
+4 8 Q
+0 X
+(.md conf) 324 651.67 T
+(igure -bitmap error -imagepos n \134) 362.4 651.67 T
+( -text \322Unable to access device\323 \134) 324 641.67 T
+( -modality none -buttonboxpos e) 324 631.67 T
+(.md buttonconf) 324 621.67 T
+(igure OK -text \322Retry\323) 391.2 621.67 T
+(.md buttonconf) 324 611.67 T
+(igure Cancel -text \322Cancel\323) 391.2 611.67 T
+(.md activate) 324 601.67 T
+0 10 Q
+(FIGURE 13) 377.68 569.18 T
+1 F
+( - Error dialog) 429.07 569.18 T
+0 0 612 792 C
+FMENDPAGE
+%%EndPage: "8" 8
+%%Page: "9" 9
+612 792 0 FMBEGINPAGE
+[0 0 0 1 0 0 0]
+[ 0 1 1 0 1 0 0]
+[ 1 0 1 0 0 1 0]
+[ 1 1 0 0 0 0 1]
+[ 1 0 0 0 0 1 1]
+[ 0 1 0 0 1 0 1]
+[ 0 0 1 0 1 1 0]
+ 7 FrameSetSepColors
+FrameNoSep
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+1 10 Q
+0 X
+0 0 0 1 0 0 0 K
+-0.22 (modal. W) 72 713.33 P
+-0.22 (e\325ll also change the orientation and position of) 110.42 713.33 P
+(the buttons to be vertical along the right hand side. Fig-) 72 701.33 T
+(ure 13 shows the \336nal product. It is important to note,) 72 689.33 T
+-0.47 (that no new message dialog has been created, instead the) 72 677.33 P
+(existing one has been recon\336gured.) 72 665.33 T
+0 12 Q
+(Lessons Learned) 141.33 634 T
+1 10 Q
+(One element which is essential to any successful devel-) 72 609.33 T
+(opment ef) 72 597.33 T
+(fort is the establishment of \336rm objectives.) 112.09 597.33 T
+-0.29 ([incr W) 72 585.33 P
+-0.29 (idgets] was short on neither aggressive goals nor) 102.13 585.33 P
+(talented developers willing to contribute in a team envi-) 72 573.33 T
+(ronment. Many lessons were learned during this ef) 72 561.33 T
+(fort) 274.56 561.33 T
+(as the team achieved a truly reusable, \337exible, and) 72 549.33 T
+(extensible mega-widget set. The lessons centered on) 72 537.33 T
+(inheritance, con\336gurability) 72 525.33 T
+(, testability) 179.67 525.33 T
+(, and reusability) 223.47 525.33 T
+(.) 286.98 525.33 T
+(Inheritance proved to be a valuable tool during [incr) 72 501.33 T
+(W) 72 489.33 T
+(idgets] development. The impact of changes due to) 81.04 489.33 T
+(Tk 4.0 were signi\336cantly lessened. For example, as) 72 477.33 T
+(image support was added to Tk, a single option was) 72 465.33 T
+(added to the Labeledwidget class which was then inher-) 72 453.33 T
+-0.26 (ited by derived classes in the hierarchy) 72 441.33 P
+-0.26 (. Also, bugs \336xed) 225.28 441.33 P
+-0.45 (in base classes applied to all derived ones. This made for) 72 429.33 P
+(quick and easy maintenance. On a similar note, errors) 72 417.33 T
+(introduced in lower level classes had broader ef) 72 405.33 T
+(fects.) 262.6 405.33 T
+(Fortunately) 72 393.33 T
+(, this was rare and easily detected due to the) 117.46 393.33 T
+(magni\336ed repercussions.) 72 381.33 T
+(Maximum recon\336gurability comes at the price of) 72 357.33 T
+(quickly multiplying options in an inheritance hierarchy) 72 345.33 T
+(.) 291.89 345.33 T
+(In an ef) 72 333.33 T
+(fort to avoid the usability problems associated) 102.36 333.33 T
+-0.26 (with Motif) 72 321.33 P
+-0.26 (\325) 115.35 321.33 P
+-0.26 (s bulky resource set, [incr W) 118.13 321.33 P
+-0.26 (idgets] imposed) 231.41 321.33 P
+(an 80/20 rule. If 80% of the user community could be) 72 309.33 T
+(viewed as having no interest in an option, it was) 72 297.33 T
+(excluded. Users could always use the built-in [incr Tk]) 72 285.33 T
+(\324component\325 command to con\336gure an option.) 72 273.33 T
+-0.16 (The incorporation of a regression test suit was a de\336nite) 72 249.33 P
+(plus. The [incr W) 72 237.33 T
+(idgets] test suite is a blatant rip-of) 142.14 237.33 T
+(f of) 278.06 237.33 T
+(the work done by Ousterhout and May-Pumphrey for) 72 225.33 T
+(T) 72 213.33 T
+(cl/Tk [6]. The test suite consistently exposed \337aws) 77.41 213.33 T
+(which hand testing left hidden. Especially those bugs) 72 201.33 T
+(dealing with lar) 72 189.33 T
+(ge scale component con\336guration. The) 134.59 189.33 T
+(test suite also doubles as a good visual demo.) 72 177.33 T
+(Absolutely no reuse of any kind occurs until a widget) 72 155.33 T
+-0.41 (set becomes well documented. This includes man pages,) 72 143.33 P
+-0.41 (user) 72 131.33 P
+-0.41 (\325) 89.03 131.33 P
+-0.41 (s guides, and demos. Unless documented, reuse is a) 91.81 131.33 P
+(localized event at best. There is no such thing as self-) 72 119.33 T
+-0.03 (documenting code. Instead, the demand is for self-docu-) 72 107.33 P
+(menting engineers.) 72 95.33 T
+0 12 Q
+(Pr) 397.95 712 T
+(ospective) 410.39 712 T
+1 10 Q
+([incr W) 315 687.33 T
+(idgets] is an ongoing development ef) 345.42 687.33 T
+(fort. The) 493.28 687.33 T
+(mega-widgets presented in this paper represent those) 315 675.33 T
+(ready for release. Each has a man page, demo, and) 315 663.33 T
+(regression test script. Many other mega-widgets are) 315 651.33 T
+(under construction which have not reached release sta-) 315 639.33 T
+(tus. They include classes such as T) 315 627.33 T
+(oolbar) 454 627.33 T
+(, Combobox,) 479.15 627.33 T
+(T) 315 615.33 T
+(able, Calendar) 320.41 615.33 T
+(, Gage, Menubar) 377.77 615.33 T
+(, and Mainwindow) 444.57 615.33 T
+(.) 519.19 615.33 T
+-0.36 (Once complete, each new class will be incorporated into) 315 603.33 P
+(the [incr W) 315 591.33 T
+(idgets] distribution.) 360.14 591.33 T
+(Public contributions to the [incr W) 315 567.33 T
+(idgets] mega-widget) 453.76 567.33 T
+(set are welcome and encouraged. Those mega-widgets) 315 555.33 T
+-0.08 (which currently compose [incr W) 315 543.33 P
+-0.08 (idgets] should be used) 448.67 543.33 P
+(as a model. Contributed mega-widgets should meet or) 315 531.33 T
+(exceed the objectives set forth in this paper such as) 315 519.33 T
+(extensible child sites, \337exible component con\336gura-) 315 507.33 T
+(tions, and style consistency) 315 495.33 T
+(. The coding and comment) 423.79 495.33 T
+(style must also be maintained. Man pages, demos, and) 315 483.33 T
+(test scripts are mandatory) 315 471.33 T
+(.) 416.83 471.33 T
+0 12 Q
+(Conclusion) 398.83 440 T
+1 10 Q
+([incr W) 315 415.33 T
+(idgets] of) 345.42 415.33 T
+(fers a strong object-oriented founda-) 383.29 415.33 T
+(tion which addresses the need for a \337exible and extensi-) 315 403.33 T
+-0.1 (ble mega-widget set. Its usage replaces common widget) 315 391.33 P
+-0.51 (combinations with higher level abstractions, simplifying) 315 379.33 P
+(code, reducing errors, increasing readability) 315 367.33 T
+(, adding) 490.41 367.33 T
+(productivity) 315 355.33 T
+(, and promoting a singular look-and-feel.) 363.24 355.33 T
+(The ability to extend [incr W) 315 343.33 T
+(idgets] enables developers) 430.97 343.33 T
+(to create new mega-widgets based on previous work.) 315 331.33 T
+(In short, [incr W) 315 309.33 T
+(idgets] is a library of reusable mega-) 381.25 309.33 T
+(widgets that can be easily extended, allowing quicker) 315 297.33 T
+-0.08 (development of lar) 315 285.33 P
+-0.08 (ge scale applications. It has been suc-) 390.21 285.33 P
+(cessfully used in several projects, including mission-) 315 273.33 T
+(critical telecommunication applications delivered to) 315 261.33 T
+(Japan, Great Britain, and Australia. As development) 315 249.33 T
+(continues, existing classes are being extended and new) 315 237.33 T
+(classes are being added. Development time has been) 315 225.33 T
+(drastically reduced. New dialogs can be created in) 315 213.33 T
+(hours. Whole applications in days. Reuse is a reality) 315 201.33 T
+(.) 523.77 201.33 T
+(New projects are bene\336tting from the work of others.) 315 189.33 T
+([incr W) 315 177.33 T
+(idgets] is an [incr Tk] success story) 345.42 177.33 T
+(.) 486.41 177.33 T
+0 12 Q
+(Acknowledgments) 380.5 146 T
+1 10 Q
+([incr W) 315 123.33 T
+(idgets] was produced by a dedicated team com-) 345.42 123.33 T
+(prised of Mark Ulferts, Sue Y) 315 111.33 T
+(ockey) 433.42 111.33 T
+(, Alfredo Jahn, John) 456.65 111.33 T
+(Sigler) 315 99.33 T
+(, and Bret Schuhmacher at DSC Communications) 338.49 99.33 T
+(Corp. Signi\336cant advice and counselling was adminis-) 315 87.33 T
+(tered by Mark Harrison, also employed by DSC.) 315 75.33 T
+FMENDPAGE
+%%EndPage: "9" 9
+%%Page: "10" 10
+612 792 0 FMBEGINPAGE
+[0 0 0 1 0 0 0]
+[ 0 1 1 0 1 0 0]
+[ 1 0 1 0 0 1 0]
+[ 1 1 0 0 0 0 1]
+[ 1 0 0 0 0 1 1]
+[ 0 1 0 0 1 0 1]
+[ 0 0 1 0 1 1 0]
+ 7 FrameSetSepColors
+FrameNoSep
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+1 10 Q
+0 X
+0 0 0 1 0 0 0 K
+(Michael J. McLennan, A) 72 713.33 T
+(T&T Bell Labs, allowed the) 170.59 713.33 T
+(team to beta test [incr Tk] and supported the ef) 72 701.33 T
+(fort) 259.28 701.33 T
+(through the infusion of innovative ideas.) 72 689.33 T
+0 12 Q
+(Refer) 156.62 658 T
+(ences) 185.05 658 T
+1 10 Q
+([1] Michael J. McLennan, \322[incr T) 72 635.33 T
+(cl] - Object-Oriented) 209.87 635.33 T
+(Programming in T) 86 623.33 T
+(cl\323, Proceedings of the T) 159.19 623.33 T
+(cl/Tk) 258.19 623.33 T
+(W) 86 611.33 T
+(orkshop 1993, Berkeley Ca.) 94.64 611.33 T
+(http://www) 86 599.33 T
+(.wn.com/biz/itcl) 130.91 599.33 T
+([2] Michael J. McLennan, \322[incr Tk] Building Extensi-) 72 577.33 T
+(ble W) 86 565.33 T
+(idgets with [incr T) 109.76 565.33 T
+(cl]\323, Proceedings of the T) 183.22 565.33 T
+(cl/) 285.55 565.33 T
+(Tk W) 86 553.33 T
+(orkshop 1994, New Orleans La.) 108.25 553.33 T
+(http://www) 86 541.33 T
+(.wn.com/biz/itk) 130.91 541.33 T
+([3] Ioi K. Lam, T) 72 519.33 T
+(ix,) 141.08 519.33 T
+(http://www) 86.67 507.33 T
+(.cis.upenn.edu/~ioi/tix/tix.html) 131.58 507.33 T
+([4] Nat Pryce, itcl-widgets,) 72 485.33 T
+(http://www-dse.doc.ic.ac.uk:80/~np2/itcl_widgets/) 86.67 473.33 T
+-0.03 ([5] John Ousterhout, \322T) 72 451.33 P
+-0.03 (cl and the Tk T) 166.75 451.33 P
+-0.03 (oolkit\323, Addison-) 227.03 451.33 P
+(W) 86 439.33 T
+(esley) 94.64 439.33 T
+(, 1994. http://playground.sun.com/~ouster/) 114.54 439.33 T
+0 12 Q
+(Appendix) 159.49 408 T
+([incr W) 133.83 394 T
+(idgets] T) 173.27 394 T
+(our) 217.17 394 T
+1 10 Q
+-0.02 ([incr Tk] provides the base classes for all the mega-wid-) 72 371.33 P
+(get classes of [incr W) 72 359.33 T
+(idgets]. The dialog classes are) 158.24 359.33 T
+-0.41 (derived from itk::T) 72 347.33 P
+-0.41 (oplevel, all other classes are based on) 147.14 347.33 P
+(itk::W) 72 335.33 T
+(idget. The [incr Tk] classes provide for compo-) 97.16 335.33 T
+(nent, option, and method de\336nition and management.) 315 713.33 T
+(The [incr W) 315 701.33 T
+(idget] classes are the specialization of the) 363.47 701.33 T
+([incr Tk] base classes, where each level re\336nes and aug-) 315 689.33 T
+-0.25 (ments the methods and options of the base classes. Each) 315 677.18 P
+-0.29 ([incr W) 315 665.18 P
+-0.29 (idgets] class will be brie\337y discussed and a short) 345.13 665.18 P
+(example presented. Figure 14 depicts the class hierar-) 315 653.18 T
+(chy) 315 641.18 T
+(.) 328.79 641.18 T
+0 12 Q
+(Labeledwidget) 389.83 609.85 T
+1 10 Q
+(The Labeledwidget is the most primitive mega-widget) 315 591.18 T
+(in the set, providing label support in the other classes.) 315 579.18 T
+(The class contains a label, a mar) 315 567.18 T
+(gin, and a child site) 444.51 567.18 T
+(which can be \336lled with other widgets. The options pro-) 315 555.18 T
+(vide the ability to position the label around the child) 315 543.18 T
+(site, modify the font, adjust the mar) 315 531.18 T
+(gin distance, and) 457.59 531.18 T
+(enable/disable label display) 315 519.18 T
+(.) 424.89 519.18 T
+(The following example creates a Labeledwidget with a) 315 495.18 T
+(canvas widget in the child site. The label is set to \322Can-) 315 483.18 T
+(vas\323 and initially located south of the child site. Next,) 315 471.18 T
+(the label is moved around the child site and mar) 315 459.18 T
+(gin set) 506.74 459.18 T
+(to various distances.) 315 447.18 T
+0 12 Q
+(Entry\336eld) 401.5 415.85 T
+1 10 Q
+(The Entry\336eld class associates a label with an entry) 315 397.18 T
+-0.18 (widget, providing text entry) 315 385.18 P
+-0.18 (, length, validation, and edit-) 425.46 385.18 P
+(ing enhancements. Since the class is based on the) 315 373.18 T
+(Labeledwidget class, all the options and methods for) 315 361.18 T
+72 72 540 315 R
+7 X
+V
+99.66 87.38 512.34 305 C
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+234.66 98 505.03 297.5 R
+7 X
+0 0 0 1 0 0 0 K
+V
+0.5 H
+2 Z
+9 X
+N
+106.88 109.75 228.38 250.75 R
+7 X
+V
+8 X
+N
+112.03 179.75 164.53 189.5 R
+7 X
+V
+0 X
+N
+1 7 Q
+(itk::Archetype) 117.63 181.01 T
+178.28 126.75 226.28 136.5 R
+7 X
+V
+0 X
+N
+(itk::T) 183.4 128.01 T
+(oplevel) 198.47 128.01 T
+176.78 232.5 224.78 242.25 R
+7 X
+V
+0 X
+N
+(itk::W) 181.9 233.76 T
+(idget) 199.51 233.76 T
+248.19 200.84 289.44 210.59 R
+7 X
+V
+0 X
+N
+(Buttonbox) 252.58 202.09 T
+248.19 265.17 299.19 274.92 R
+7 X
+V
+0 X
+N
+(Selectionbox) 253.62 266.43 T
+248.19 184.76 292.44 194.51 R
+7 X
+V
+0 X
+N
+(Pushbutton) 252.9 186.01 T
+248.19 249.09 310.14 258.84 R
+7 X
+V
+0 X
+N
+(Fileselectionbox) 254.79 250.34 T
+248.19 216.92 300.69 226.67 R
+7 X
+V
+0 X
+N
+(Panedwindow) 253.78 218.18 T
+248.19 233.01 300.69 242.76 R
+7 X
+V
+0 X
+N
+(Labeledwidget) 253.78 234.26 T
+251.28 126.75 294.03 136.5 R
+7 X
+V
+0 X
+N
+(Dialogshell) 255.84 128.01 T
+320.78 126.75 357.53 136.5 R
+7 X
+V
+0 X
+N
+(Dialog) 324.7 128.01 T
+382.78 151.25 441.28 161 R
+7 X
+V
+0 X
+N
+(Messagedialog) 389.02 152.51 T
+382.78 118.58 443.53 128.33 R
+7 X
+V
+0 X
+N
+(Selectiondialog) 389.26 119.84 T
+382.78 102.25 453.84 112 R
+7 X
+V
+0 X
+N
+(Fileselectiondialog) 390.36 103.51 T
+382.78 134.92 435.28 144.67 R
+7 X
+V
+0 X
+N
+(Promptdialog) 388.38 136.17 T
+338.07 254.84 390.57 264.59 R
+7 X
+V
+0 X
+N
+(Scrolledlistbox) 343.67 256.09 T
+338.07 239.59 390.57 249.34 R
+7 X
+V
+0 X
+N
+(Optionmenu) 343.67 240.84 T
+338.07 224.34 390.57 234.09 R
+7 X
+V
+0 X
+N
+(Entry\336eld) 343.67 225.59 T
+338.07 209.09 390.57 218.84 R
+7 X
+V
+0 X
+N
+(Scrolledtext) 343.67 210.34 T
+415.1 224.46 448.85 234.21 R
+7 X
+V
+0 X
+N
+(Spinner) 418.7 225.72 T
+458.72 224.07 497.72 233.82 R
+7 X
+V
+0 X
+N
+(Spinint) 462.88 225.32 T
+165.38 184.25 171.38 184.25 2 L
+N
+171.38 236.75 171.38 131 2 L
+N
+171.88 132 177.88 132 2 L
+N
+171.63 236.5 177.63 236.5 2 L
+N
+226.88 131 251.63 131 2 L
+N
+294.38 131.75 320.63 131.75 2 L
+N
+357.38 131 373.13 131 2 L
+N
+373.13 155.75 373.13 107 2 L
+N
+373.13 155.75 382.88 155.75 2 L
+N
+373.63 107.25 383.38 107.25 2 L
+N
+372.88 123.75 382.63 123.75 2 L
+N
+373.38 139 383.13 139 2 L
+N
+237.28 284.77 237.28 156.44 2 L
+N
+237.53 270.01 249.53 270.01 2 L
+N
+237.28 253.76 249.28 253.76 2 L
+N
+237.03 238.26 249.03 238.26 2 L
+N
+237.53 221.26 249.53 221.26 2 L
+N
+237.28 205.01 249.28 205.01 2 L
+N
+237.03 189.51 249.03 189.51 2 L
+N
+237.27 237.93 224.95 237.93 2 L
+N
+325.66 259.89 325.66 183.62 2 L
+N
+326.2 259.89 337.98 259.89 2 L
+N
+326.16 243.86 337.95 243.86 2 L
+N
+326.13 228.89 337.91 228.89 2 L
+N
+325.56 213.39 337.34 213.39 2 L
+N
+301.02 236.86 325.13 236.86 2 L
+N
+390.48 229.36 415.13 229.36 2 L
+N
+449.41 228.82 460.13 228.82 2 L
+N
+102.94 91.81 507.95 300.87 R
+N
+0 10 Q
+([incr Tk]) 111.38 114.25 T
+([incr W) 237.38 102.25 T
+(idgets]) 270.25 102.25 T
+338.78 194.14 391.28 203.89 R
+7 X
+V
+0 X
+N
+326.06 198.52 337.84 198.52 2 L
+N
+339.04 179.26 391.54 189.01 R
+7 X
+V
+0 X
+N
+1 7 Q
+(Scrolledframe) 344.64 180.52 T
+326.53 183.57 338.32 183.57 2 L
+N
+(Scrolledcanvas) 341.88 195.5 T
+248.66 168.36 287.99 178.11 R
+7 X
+V
+0 X
+N
+(Spindate) 254.09 169.61 T
+249.43 152.58 286.55 162.33 R
+7 X
+V
+0 X
+N
+(Spintime) 254.87 153.84 T
+248.54 280.7 299.54 290.45 R
+7 X
+V
+0 X
+N
+(Combobox) 253.98 281.95 T
+248.34 284.77 237.22 284.77 2 L
+N
+248.34 172.55 237.22 172.55 2 L
+N
+249.45 157 237.78 157 2 L
+N
+0 0 612 792 C
+0 10 Q
+0 X
+0 0 0 1 0 0 0 K
+(FIGURE 14) 207.44 74.18 T
+1 F
+( - [incr W) 258.83 74.18 T
+(idgets] class hierarchy) 297.58 74.18 T
+FMENDPAGE
+%%EndPage: "10" 10
+%%Page: "11" 11
+612 792 0 FMBEGINPAGE
+[0 0 0 1 0 0 0]
+[ 0 1 1 0 1 0 0]
+[ 1 0 1 0 0 1 0]
+[ 1 1 0 0 0 0 1]
+[ 1 0 0 0 0 1 1]
+[ 0 1 0 0 1 0 1]
+[ 0 0 1 0 1 1 0]
+ 7 FrameSetSepColors
+FrameNoSep
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+1 10 Q
+0 X
+0 0 0 1 0 0 0 K
+-0.35 (Labeledwidgets are supported in Entry\336elds. Also, most) 72 470.33 P
+(of the methods for the standard Tk entry widget are pro-) 72 458.33 T
+(vided such as insert, delete, get, and scan.) 72 446.33 T
+0 12 Q
+(Pushbutton) 154.82 118 T
+1 10 Q
+(The Pushbutton class of) 72 99.33 T
+(fers the standard Tk button wid-) 167.65 99.33 T
+(get with the ability to display as a default button with a) 72 87.33 T
+-0.35 (recessed ring. The primary use for the Pushbutton is as a) 72 75.33 P
+72 477 297 720 C
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+72 504 297 720 R
+7 X
+0 0 0 1 0 0 0 K
+V
+0.5 H
+2 Z
+0 X
+N
+%%BeginBinary: 2913
+134 174 40.2 52.2 0 81 657
+/red <
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000000000000000000000000069FBB29AFF2CAEB6CF71E7
+A24DF70055BE928AB2D3FF00F7557DDBB2002CFF6120822C455D4571FF0000FF
+> store
+/green <
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000000000000000000000000086FFDF8AE78AEFEF0071E7
+A24DF70055BE827530B6FFFFDF697DDBB2004D00B641DF4D829E4582FF0000FF
+> store
+/blue <
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000008EFFEF75C755EFB60071E7
+A24DF77D55BE9265618EE300B22C7DDBB28A4D00FF59E351B6A2FF9200FF00FF
+> store
+ BEGINBITMAPCOLORc
+z"z"z"
+7F4F5OGF4F57F4F5J"
+PHF58z8z8z
+5F8OFF85F8
+
+
+<z"
+P=F5F4=z"z"z"z
+0F4F5O6F4F50F4F50F4>z8z8z8z
+/F8O5F8/F8/F8
+J#>$
+O)FEFEFEFEFEJ"Js"
+O3F8O"F4F5J#Jr
+O)F8F8O,F8J09%;#
+JFEFEFEF8FEFEFEFEF8FEFEFEFEFEFEFEFEFEFEFEFEAs"J"9"8':%;%J$
+F4F56F8F8F8F8F8FEF8F8FEF8F8F8FEF8FEFE<F4F4F5BrJ$9%=%:"J"
+F88F8FEFEFEF8FEF8FEFEFEF8F8@F8AsJ"9"J#
+F5HF8FEDF5F5AtJ)=%J$
+F88F8FEFEF8F8FEFEF8FEF8F8F8EF8F8F8J"8"8'8"9"
+O(FEFEFEFEFEF8F8FEFEFEJ#8#9t8sJs
+MF8F8F8F8F8F8IF5Jt
+P6F8
+>z8z8z8z
+/F5O5F5/F5/F5sF"J"F"F&
+F5F5O6F5F5F5F5F5F5F5(z'
+F4F4F4F4F4F4F5P<D9F4F4F4F4F4F48%J&
+F8F8F8F8P>F8F8F8F8F5
+
+
+
+
+
+
+
+Gz
+P(FE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Gz
+P(D9
+
+
+
+
+
+J%
+O"FEFEFEFEJ'
+O!FEFED9D9FEFEJ$8(8&8#9#8%9%
+O FEFED9D9D9D9FEFEFEFEFEFED9FEFEFEFEFEFEFEFEFEFEFEFEFEFEJ'9%?.
+O'FEFED9D9FEFEFED9FEFEFEFED9D9FEFED9FEFED9D9FEFEJ#=":+=%
+O'D9D9D9D9FEFED9FEFED9D9D9D9FED9D9D9J$I$9&
+O(FEFEFEFEFEFED9D9FEFEFEJ%A&8%;"8"
+O'FEFED9D9D9FEFEFED9FEFED9D9D9FEJ$8#J%
+O D9FEFEFEFE=FEFED9D9'J.?$9.J&
+F5F5F5F5F5F5ID9FEFEFEFED9D9FEFEFED9FEFED9FED9D9FEFEFED9FEFED9FEFEFEFED9GF5F5F5F5F5'J%8s8#:";vJ'
+F4F4F4F4F4F4JD9D9D9D9D9D9D9D9D9HF4F4F4F4F4F48%J&
+F8F8F8F8P>F8F8F8F8F5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+=z"z"z
+0F4F5OGF4F51F4<z8z8z
+1F8OFF81F8
+
+
+7z8z8z
+6F5OFF55F5"J"J"
+F57F5OGF5
+ENDBITMAP
+%%EndBinary
+%%BeginBinary: 2909
+189 151 56.7 45.3 0 125.83 657
+/red <
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000000000000000000000000069FBB29AFF2CAEB6CF71E7
+A24DF70055BE928AB2D3FF00F7557DDBB2002CFF6120822C455D4571FF0000FF
+> store
+/green <
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000000000000000000000000086FFDF8AE78AEFEF0071E7
+A24DF70055BE827530B6FFFFDF697DDBB2004D00B641DF4D829E4582FF0000FF
+> store
+/blue <
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000008EFFEF75C755EFB60071E7
+A24DF77D55BE9265618EE300B22C7DDBB28A4D00FF59E351B6A2FF9200FF00FF
+> store
+ BEGINBITMAPCOLORc
+z"z"z"
+7F4F5Q"F4F57F4F5J"
+R#F58z8z8z
+5F8Q!F85F8
+
+
+<z"
+QFF5F4=z"z"z"z
+0F4F5P?F4F50F4F50F4>z8z8z8z
+/F8P>F8/F8/F8
+J#>$
+ODFEFEFEFEFEJ"Js"
+P F8O>F4F5J#Jr
+ODF8F8OHF8J09%;#
+O7FEFEFEF8FEFEFEFEF8FEFEFEFEFEFEFEFEFEFEFEFEAs"J"9"8':%;%J$
+F4F5O#F8F8F8F8F8FEF8F8FEF8F8F8FEF8FEFEO*F4F4F5BrJ$9%=%:"J"
+F8O%F8FEFEFEF8FEF8FEFEFEF8F8O.F8AsJ"9"J#
+F5O5F8FEO2F5F5AtJ)=%J$
+F8O%F8FEFEF8F8FEFEF8FEF8F8F8O3F8F8F8J"8"8'8"9"
+OCFEFEFEFEFEF8F8FEFEFEJ#8#9t8sJs
+O:F8F8F8F8F8F8O7F5Jt
+Q?F8
+>z8z8z8z
+/F5P>F5/F5/F5sF"J"F"F&
+F5F5P?F5F5F5F5F5F5F5(z'
+F4F4F4F4F4F4F5QED9F4F4F4F4F4F48%J&
+F8F8F8F8QGF8F8F8F8F5
+
+
+
+
+
+
+
+Gz
+P(FE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+J%
+PDFEFEFEFEJ'
+PCFEFED9D9FEFEJ$8(8&8#9#8%9%
+PBFEFED9D9D9D9FEFEFEFEFEFED9FEFEFEFEFEFEFEFEFEFEFEFEFEFEJ'9%?.
+PIFEFED9D9FEFEFED9FEFEFEFED9D9FEFED9FEFED9D9FEFEJ#=":+=%
+PID9D9D9D9FEFED9FEFED9D9D9D9FED9D9D9J$I$9&
+PJFEFEFEFEFEFED9D9FEFEFEJ%A&8%;"8"
+PIFEFED9D9D9FEFEFED9FEFED9D9D9FEJ$8#J%
+PBD9FEFEFEFE=FEFED9D9J.?$9.
+PCD9FEFEFEFED9D9FEFEFED9FEFED9FED9D9FEFEFED9FEFED9FEFEFEFED9J%8s8#:";v
+PDD9D9D9D9D9D9D9D9D9
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+'J&
+F5F5F5F5F5F5QFF5F5F5F5F5'J'
+F4F4F4F4F4F4QFF4F4F4F4F4F48%J&
+F8F8F8F8QGF8F8F8F8F5
+
+
+
+
+Gz
+P(D9
+
+
+
+
+
+
+
+
+=z"z"z
+0F4F5Q"F4F51F4<z8z8z
+1F8Q!F81F8
+
+
+7z8z8z
+6F5Q!F55F5"J"J"
+F57F5Q"F5
+ENDBITMAP
+%%EndBinary
+%%BeginBinary: 2925
+134 180 40.2 54 0 188.67 657
+/red <
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000000000000000000000000069FBB29AFF2CAEB6CF71E7
+A24DF70055BE928AB2D3FF00F7557DDBB2002CFF6120822C455D4571FF0000FF
+> store
+/green <
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000000000000000000000000086FFDF8AE78AEFEF0071E7
+A24DF70055BE827530B6FFFFDF697DDBB2004D00B641DF4D829E4582FF0000FF
+> store
+/blue <
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000008EFFEF75C755EFB60071E7
+A24DF77D55BE9265618EE300B22C7DDBB28A4D00FF59E351B6A2FF9200FF00FF
+> store
+ BEGINBITMAPCOLORc
+z"z"z"
+7F6F7OGF6F77F6F7J"
+PHF78z8z8z
+5F9OFF95F9
+
+
+<z"
+P=F7F6=z"z"z"z
+0F6F7O6F6F70F6F70F6>z8z8z8z
+/F9O5F9/F9/F9
+J#>$
+O)FEFEFEFEFEJ"Js"
+O3F9O"F6F7J#Jr
+O)F9F9O,F9J09%;#
+JFEFEFEF9FEFEFEFEF9FEFEFEFEFEFEFEFEFEFEFEFEAs"J"9"8':%;%J$
+F6F76F9F9F9F9F9FEF9F9FEF9F9F9FEF9FEFE<F6F6F7BrJ$9%=%:"J"
+F98F9FEFEFEF9FEF9FEFEFEF9F9@F9AsJ"9"J#
+F7HF9FEDF7F7AtJ)=%J$
+F98F9FEFEF9F9FEFEF9FEF9F9F9EF9F9F9J"8"8'8"9"
+O(FEFEFEFEFEF9F9FEFEFEJ#8#9t8sJs
+MF9F9F9F9F9F9IF7Jt
+P6F9
+>z8z8z8z
+/F7O5F7/F7/F7sF"J"F"F&
+F7F7O6F7F7F7F7F7F7F7(z'
+F6F6F6F6F6F6F7P<D9F6F6F6F6F6F68%J&
+F9F9F9F9P>F9F9F9F9F7
+
+
+
+
+
+
+
+
+
+
+
+
+
+J%
+O"FEFEFEFEJ'
+O!FEFED9D9FEFEJ$8(8&8#9#8%9%
+O FEFED9D9D9D9FEFEFEFEFEFED9FEFEFEFEFEFEFEFEFEFEFEFEFEFEJ'9%?.
+O'FEFED9D9FEFEFED9FEFEFEFED9D9FEFED9FEFED9D9FEFEJ#=":+=%
+O'D9D9D9D9FEFED9FEFED9D9D9D9FED9D9D9J$I$9&
+O(FEFEFEFEFEFED9D9FEFEFEJ%A&8%;"8"
+O'FEFED9D9D9FEFEFED9FEFED9D9D9FEJ$8#J%
+O D9FEFEFEFE=FEFED9D9J.?$9.
+O!D9FEFEFEFED9D9FEFEFED9FEFED9FED9D9FEFEFED9FEFED9FEFEFEFED9J%8s8#:";v
+O"D9D9D9D9D9D9D9D9D9
+
+
+
+
+
+
+
+
+
+
+
+
+Gz
+P(FE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+'J&
+F7F7F7F7F7F7P=F7F7F7F7F7'J'
+F6F6F6F6F6F6P=F6F6F6F6F6F68%J&
+F9F9F9F9P>F9F9F9F9F7
+
+
+
+
+Gz
+P(D9
+
+
+
+
+
+
+
+
+=z"z"z
+0F6F7OGF6F71F6<z8z8z
+1F9OFF91F9
+
+
+7z8z8z
+6F7OFF75F7"J"J"
+F77F7OGF7
+ENDBITMAP
+%%EndBinary
+%%BeginBinary: 2903
+194 151 58.2 45.3 0 233.27 657
+/red <
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000000000000000000000000069FBB29AFF2CAEB6CF71E7
+A24DF70055BE928AB2D3FF00F7557DDBB2002CFF6120822C455D4571FF0000FF
+> store
+/green <
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000000000000000000000000086FFDF8AE78AEFEF0071E7
+A24DF70055BE827530B6FFFFDF697DDBB2004D00B641DF4D829E4582FF0000FF
+> store
+/blue <
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000008EFFEF75C755EFB60071E7
+A24DF77D55BE9265618EE300B22C7DDBB28A4D00FF59E351B6A2FF9200FF00FF
+> store
+ BEGINBITMAPCOLORc
+z"z"z"
+7F4F5Q'F4F57F4F5J"
+R(F58z8z8z
+5F8Q&F85F8
+
+
+<z"
+QKF5F4=z"z"z"z
+0F4F5PDF4F50F4F50F4>z8z8z8z
+/F8PCF8/F8/F8
+J#>$
+OGFEFEFEFEFEJ"Js"
+P#F8O@F4F5J#Jr
+OGF8F8OJF8J09%;#
+O:FEFEFEF8FEFEFEFEF8FEFEFEFEFEFEFEFEFEFEFEFEAs"J"9"8':%;%J$
+F4F5O&F8F8F8F8F8FEF8F8FEF8F8F8FEF8FEFEO,F4F4F5BrJ$9%=%:"J"
+F8O(F8FEFEFEF8FEF8FEFEFEF8F8O0F8AsJ"9"J#
+F5O8F8FEO4F5F5AtJ)=%J$
+F8O(F8FEFEF8F8FEFEF8FEF8F8F8O5F8F8F8J"8"8'8"9"
+OFFEFEFEFEFEF8F8FEFEFEJ#8#9t8sJs
+O=F8F8F8F8F8F8O9F5Jt
+QDF8
+>z8z8z8z
+/F5PCF5/F5/F5sF"J"F"F&
+F5F5PDF5F5F5F5F5F5F5(z'
+F4F4F4F4F4F4F5QJD9F4F4F4F4F4F48%J&
+F8F8F8F8QLF8F8F8F8F5
+
+
+
+
+
+
+
+Jz
+O?P(FE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+J%
+7FEFEFEFEJ'
+6FEFED9D9FEFEJ$8(8&8#9#8%9%
+5FEFED9D9D9D9FEFEFEFEFEFED9FEFEFEFEFEFEFEFEFEFEFEFEFEFEJ'9%?.
+<FEFED9D9FEFEFED9FEFEFEFED9D9FEFED9FEFED9D9FEFEJ#=":+=%
+<D9D9D9D9FEFED9FEFED9D9D9D9FED9D9D9J$I$9&
+=FEFEFEFEFEFED9D9FEFEFEJ%A&8%;"8"
+<FEFED9D9D9FEFEFED9FEFED9D9D9FEJ$8#J%
+5D9FEFEFEFE=FEFED9D9J.?$9.
+6D9FEFEFEFED9D9FEFEFED9FEFED9FED9D9FEFEFED9FEFED9FEFEFEFED9J%8s8#:";v
+7D9D9D9D9D9D9D9D9D9
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+'J&
+F5F5F5F5F5F5QKF5F5F5F5F5'J'
+F4F4F4F4F4F4QKF4F4F4F4F4F48%J&
+F8F8F8F8QLF8F8F8F8F5
+
+
+
+
+Jz
+O?P(D9
+
+
+
+
+
+
+
+
+=z"z"z
+0F4F5Q'F4F51F4<z8z8z
+1F8Q&F81F8
+
+
+7z8z8z
+6F5Q&F55F5"J"J"
+F57F5Q'F5
+ENDBITMAP
+%%EndBinary
+81 513 285.67 644.15 R
+7 X
+V
+4 8 Q
+0 X
+(labeledwidget .lw -labeltext \322Canvas\323 \134) 81 638.82 T
+( -labelpos s) 81 628.82 T
+(set childsite [.lw childsite]) 81 618.82 T
+(canvas $childsite.c -relief raised \134) 81 608.82 T
+-0.22 ( -width 100 -height 100 -background black) 81 598.82 P
+(pack $childsite.c) 81 578.82 T
+(pack .lw -f) 81 568.82 T
+(ill both -expand yes \134) 133.8 568.82 T
+( -padx 10 -pady 10) 81 558.82 T
+(.lw conf) 81 538.82 T
+(igure -labelpos w -labelmargin 10) 119.4 538.82 T
+(.lw conf) 81 528.82 T
+(igure -labelpos e -labelmargin 5) 119.4 528.82 T
+(.lw conf) 81 518.82 T
+(igure -labelpos n -labelmargin 7) 119.4 518.82 T
+0 10 Q
+(FIGURE 15) 124.93 486.1 T
+1 F
+( - Labeledwidget) 176.32 486.1 T
+0 0 612 792 C
+72 146 297 443 C
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+72 182 297 443 R
+7 X
+0 0 0 1 0 0 0 K
+V
+0.5 H
+2 Z
+0 X
+N
+%%BeginBinary: 4942
+279 127 143.49 65.31 0 108.51 368.69
+/red <
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000007DFFCF9AFFFF699A69FBB29AFF2CAEB6CF71E7
+A24DF70055BE928AB2D3FF00F7557DDBB2002CFF6120822C455D4571FF0000FF
+> store
+/green <
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000006DFFB669F7AE869A86FFDF8AE78AEFEF0071E7
+A24DF70055BE827530B6FFFFDF697DDBB2004D00B641DF4D829E4582FF0000FF
+> store
+/blue <
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000005DDF9E71FFBA8E9A8EFFEF75C755EFB60071E7
+A24DF77D55BE9265618EE300B22C7DDBB28A4D00FF59E351B6A2FF9200FF00FF
+> store
+ BEGINBITMAPCOLORc
+z"z"z"
+7F6F7S F6F77F6F7J"
+T!F78z8z8z
+5F9RMF95F9
+
+
+<z"
+SDF7F6=z"z"z"z
+0F6F7R=F6F70F6F70F6>z8z8z8z
+/F9R<F9/F9/F9
+JsB"Es8#?$<$<%B$C$@#;$9#J"
+EFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEO#FEJ"8$C"F"8$E">">"8"B"E"I"J"Js"
+EF9F9F9F9FEF9F9F9F9F9F9F9F9F9F9F9O)FEFF6F7J"J"9#J%@#<#Jr
+KF9CF9F9F9O9FEF9FEFEF9F9FEFEOBF9J+9"80;"9$:$?#I%<#;$J$9-9'8#;$8'9"8#
+JFEF9F9F9FEFEFEF9FEFEFEFEFEFEFEFEF9FEFEFEFEFEF9FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE;FEFEFEFEFEFEFEF9F9FEFEFEF9FEFEFEFEFEF9FEFEFEFEFEFEFEFEFEFEF9FEFEFEFEFEAs"J#:"8%8"8$8":&9#8$:'<&I%:-B'>":)8%8"8)8)8%8"8#J$
+F6F74FEFEF9FEF9FEFEF9F9F9F9FEF9F9F9FEF9FEFEF9F9F9FEFEFEF9FEFEFEFEFEF9FEF9F9FEFEFEF9FEFEFEF9FEFEFEF9FEFEFEF9F9F9FEFEF9FEFEF9F9FEFEF9F9FEF9FEFEF9FEF9FEFEFEF9FEFEFEFEFEF9FEFEF9F9FEF9FEFEF9F9F95F6F6F7BrJ#="C*:#B"@$H$<$<"E$J">"9">"<"J"
+F95F9F9F9F9F9F9F9FEFEF9FEF9F9F9FEF9F9F9F9FEFEF9F9F9FEFEFEFE9F9F9F9FEF9@F9AsJ$J"@%J'D%A)B'J%J#
+F77F9F9FEAF9F9F9F9F9:FEF9FEFEF9F9F9F9F9F9FEF9F9F9F9F9FEFEF9FEFEFEFEF99F9F9F9F9DF7F7AtJ"J%H%>$D";">";%J&J%J$
+F97FE7F9FEFEF9FEF9FEFEFEF9FEFEFEFEFEF9FEFE?FEF9F9F9F9:FEF9FEFEDF9F9F9J"8$9"8"9"8&8"?"8";"8+8(8";"8$9%8"808";$9"8$8$8"8(8"9$8"9"9+8"9"8$
+EFEFEFEFEFEFEFEF9FEFEF9FEFEFEFEFEFEF9F9F9FEFEFEF9F9FEFEF9F9F9FEFEF9FEFEFEFEFEF9FEFEF9FEF9FEFEFEF9F9F9F9F9FEFEFEF9F9FEFEFEFEFEFEFEF9FEFEF9FEFEFEFEFEFEFEF9FEFEFEF9FEFEFEFEF9F9F9FEFEFEF9F9FEFEFEF9FEFEJz9r;"9%;%9$8%9';s8w;$8%;$9z;"z9$8s9#Js
+E1F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F90F9FE5F9F9F9F9F9F9F9DF7J%J&Jt
+O3FEFEFEF9P-FEF9F9F9F9OBF9J"J(
+O5F9P.F9FEFEFEFEFEF9>z8z8z8z
+/F7R<F7/F7/F7sF"J"F"F&
+F7F7R=F7F7F7F7F7F7F7(z'
+F6F6F6F6F6F6F7SCD9F6F6F6F6F6F68%J&
+F9F9F9F9SEF9F9F9F9F7
+
+
+
+Jz
+P7Q(D4J"
+S>FFJZ
+P9Q%
+
+J#9#
+5FEFEFEFEJ"
+7FEJ%8*9%9#
+>FEFEFEFEFED9FEFEFED9FEFEFEFEFEFEFEFEFEJ#:'81
+7D9FEFEFED9D9FEFEFED9D9FEFED9D9FEFED9FEFED9D9FEFEJ#J#
+=D9D98D9D9J#:$F#
+8D9FEFEFEFEFEFEJ%F%
+=FEFED9D9D9D9D9D9J"J#8#
+9D99FEFEFEFEJ(A'
+=D9FEFEFED9FEFED9FEFEFEFED9J#9#8s8#8#8%9#
+5D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9
+
+
+J"
+P8FFJz
+P7Q(D9
+
+
+
+
+
+
+
+
+
+
+
+Jz
+P7Q(D4J"
+S>FFJZ
+P9Q%
+
+J#=#;#
+8FEFEFEFEFEFEJ"8"
+7FEFEJ#:#;#:+9%9%9#
+8D9D9FEFEFEFEFEFED9FEFED9FEFEFEFEFEFEFEFEFEFEFEFEFEFEJ":'9%;"85
+6FEFED9FEFED9FEFEFED9FEFE4FEFED9D9FEFED9FEFED9D9FEFED9FEFED9D9FEFEJ"<"<#?%9%8#
+@D9D9D9D9FED9D9D9FED9D9D9D9D9J#I":#9&8&
+8FEFED9FEFED9D9FEFEFED9D9FEFEFEJ)J%9"8"9"8"
+5FEFED9D9D9D9FEFE5D9D9D9D9D9FED9FEJ"<"B(9%:#
+@FEFEFEFED9FEFED9D9FEFED9D9FEFEJ%9%>5
+=D9FEFED9D9FEFED94D9FEFEFEFED9D9D9FEFEFEFED9D9D9FEFEFEFED9J#:s8s:%9%9%9#
+5D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9
+
+
+J"
+P8FFJz
+P7Q(D9
+
+
+
+
+
+
+
+
+
+
+
+Jz
+P7Q(D4J"
+S>FFJZ
+P9Q%
+
+J*J#9#I#
+5FEFEFEFEFEFED9FEFE?FEFEFEFEFEFEJ&J"
+7D9D9D9FEFECFEJ#9%8&9%E#8-;#9%8)
+?FEFEFEFEFEFEFEFED9FEFEFEFEFEFEFEFEFEFED9FED9FEFEFED9FEFEFEFEFEFEFEFEFEFEFED9FEFED9FEFE'J,9,>#B*9,9"J&
+F7F7F7F7F7F78FED9FEFED9FEFED9D9FEFEFED9FEFED9FEFED9D9FEFED9FEFED9D9FEFED9D9FEFEFED9FEFED9FEFED9D9FEFEFEQ>F7F7F7F7F7'G&8"C"J"D&J'
+F6F6F6F6F6F6FEFEFEFED9D9D9LD9D9D9D9D9D9Q9F6F6F6F6F6F68%G%J#A#J#;"J&
+F9F9F9F9D9D9D9D98FEFED9FE>FEFED9Q?F9F9F9F9F7J%J%
+O%D9D9D9D9ID9D9D9D9J#@"<"F">#=#
+O'FEFED9FEFEFEFEFEFEJ'>'D%F,
+CD9FEFEFEFED9D9FEFEFEFED9D9FEFED9D9FEFED9D9D9FEFEFEFED9J#;#8#8%8#8#8%=#9#8s8#8s9%8#:#
+5D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9
+
+
+J"
+P8FFJz
+P7Q(D9
+
+
+
+
+
+=z"z"z
+0F6F7S F6F71F6<z8z8z
+1F9RMF91F9
+
+
+7z8z8z
+6F7RMF75F7"J"J"
+F77F7S F7
+ENDBITMAP
+%%EndBinary
+81 191 288 353 R
+7 X
+V
+4 8 Q
+0 X
+(entryf) 81 347.67 T
+(ield .name -validate alphabetic \134) 109.8 347.67 T
+( -labeltext Name:) 81 337.67 T
+(entryf) 81 317.67 T
+(ield .address -labeltext Address:) 109.8 317.67 T
+( -validate alphanumeric) 81 307.67 T
+(entryf) 81 287.67 T
+(ield .phone -validate numeric \134) 109.8 287.67 T
+( -labeltext \322Phone Number:\323) 81 277.67 T
+(Labeledwidget::alignlabels \134) 81 257.67 T
+( .name .address .phone) 81 247.67 T
+(foreach wid [list .name .address .phone] {) 81 227.67 T
+( pack $wid -pady 5 -padx 10 \134) 81 217.67 T
+( -f) 81 207.67 T
+(ill x -expand yes) 129 207.67 T
+(}) 81 197.67 T
+0 10 Q
+(FIGURE 16) 134.64 164.09 T
+1 F
+( - Entry\336eld) 186.03 164.09 T
+0 0 612 792 C
+1 10 Q
+0 X
+0 0 0 1 0 0 0 K
+(child of the Buttonbox class. In addition to furnishing) 315 713.33 T
+(the standard methods and options for Tk button, the) 315 701.33 T
+(Pushbutton provides options for enabling/disabling the) 315 689.33 T
+(display of the default ring and geometry requirements.) 315 677.33 T
+0 12 Q
+(Optionmenu) 395.16 483 T
+1 10 Q
+-0.46 (The Optionmenu class allows selection of one item from) 315 464.33 P
+(a set of items. Only the selected item is displayed, until) 315 452.33 T
+(the user selects the option menu button and a popup) 315 440.33 T
+(menu appears with all the choices available for selec-) 315 428.33 T
+(tion. Once a new item is chosen, the currently selected) 315 416.33 T
+(item is replaced and the popup is removed from the dis-) 315 404.33 T
+(play) 315 392.33 T
+(. Commands exist for manipulating the menu list) 331.57 392.33 T
+(contents as well. These include the ability to insert,) 315 380.33 T
+(delete, select, disable, enable, and sort items.) 315 368.33 T
+0 12 Q
+(Spinner) 407.16 130 T
+1 10 Q
+(Spinners constitute a set of widgets which provide) 315 111.33 T
+(EntryField functionality combined with increment and) 315 99.33 T
+(decrement arrow buttons which may be oriented in a) 315 87.33 T
+(vertical, top and bottom, fashion or in a horizontal, side) 315 75.33 T
+315 511 540 674 C
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+315 531.86 540 647 R
+7 X
+0 0 0 1 0 0 0 K
+V
+0.5 H
+2 Z
+0 X
+N
+%%BeginBinary: 3350
+147 103 75.6 52.97 0 396 584
+/red <
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000008EEF9AFF2CAEB6CF71E7
+A24DF70055BE928AB2D3FF00F7557DDBB2002CFF6120822C455D4571FF0000FF
+> store
+/green <
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000082D78AE78AEFEF0071E7
+A24DF70055BE827530B6FFFFDF697DDBB2004D00B641DF4D829E4582FF0000FF
+> store
+/blue <
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000006DB675C755EFB60071E7
+A24DF77D55BE9265618EE300B22C7DDBB28A4D00FF59E351B6A2FF9200FF00FF
+> store
+ BEGINBITMAPCOLORc
+z"z"z"
+7F4F5P&F4F57F4F5J"
+Q'F58z8z8z
+5F8P%F85F8
+
+
+<z"
+PJF5F4=z"z"z"z
+0F4F5OCF4F50F4F50F4>z8z8z8z
+/F8OBF8/F8/F8
+JrG$<'D":"
+:FEFEFEFEFEFEFEFEFEFEFEFEJ"8&F">"8%B":"Js"
+:F8F8F8F8FEFEF8F8F8F8FEFEFEFEKF4F5Jr
+PDF8J(9%;#B(8"8$8#8$9'
+CFEFEFEF8FEFEFEFEFEFEFEFEFEFEFEFEF8FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF8FEFEAs"A&9":%;%;%8"9":"8$8,8%A$
+F4F5FEFEF8F8F8F8FEF8F8F8FEF8FEFEFEFEFEF8F8F8F8F8F8F8F8F8FEFEFEF8FEFEFEF8F8FEF8FEFEF4F4F5Br@%B%:">&J$<"E"
+F8FEFEFEF8FEFEFEF8F8F8F8F8FEFE6F8F8F8F8F8As@$B"9"J#
+F5F8F8F8F8FEO2F5F5AtI":%J"F$J$
+F8FEFEF8F8F88FEFEF8FE5F8F8F8J"8"<%8"8'8"9$8&8%8"8$8.8"9"
+:FEFEF8FEFEF8FEFEFEFEF8F8FEFEFEF8FEFEFEFEFEF8F8FEFEF8FEF8FEFEF8FEFEF8F8F8FEFEFEF8F8F8FEFEFEJ%=v8z:'9#9#9$9sJs
+:F8F8F8F8F80F8F8F8F8F8F8F8F8F8F8F8F8F8F8F88F5Jt
+PCF8
+>z8z8z8z
+/F5OBF5/F5/F5sF"J"F"F&
+F5F5OCF5F5F5F5F5F5F5(z'
+F4F4F4F4F4F4F5PID9F4F4F4F4F4F48%J&
+F8F8F8F8PKF8F8F8F8F5
+
+
+
+
+
+
+
+
+
+Iz
+P1FE
+Jz
+5P-D9
+Jz
+7P)D8J"
+P?FFJz"
+9P%D9FF
+
+
+JZ
+=OKJ"
+P9D8Jz"
+?OGD9D8
+
+
+
+
+J'E#<'@#9#
+GFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEJ&J&
+ID9D9D9FEFE8D9D9D9FEFEJ#8#8%;#A#8%8$8"8%8&
+O FEFEFEFEFEFEFEFEFEFEFEFEFEFED9FEFED9FEFEFEFEFEFEFEFED9FEFEJ'9%G"8$8)9%
+O'FEFED9D9FEFEFED9FEFED9D9D9D9D9D9FEFED9D9FEFEFED9FEFEJ&?%9"=&J"
+IFEFEFEFED9FED9D9D9D9FEFEFEFED9;D9J%>&B&
+ID9D9D9D9D9D9FEFEFED9D9D9FEFEJ"8"
+O)D9FEJ"9%J"=":"
+O#FEFEFED9D96FEFEFEJ%9'A+:0
+O D9FEFED9D9FEFEFEFED9FEFEFEFED9D9D9FEFED9D9FEFED9D9D9FEFED9D9FEFEFEFED9J#<&8%8#8#8'9&9#9#8%8#8#
+GD9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9
+
+
+
+
+
+
+
+Jz
+?OGD8J"
+>D8Jz
+=OKD9
+
+
+'IZH&
+F5F5F5F5F5F5P%F5F5F5F5F5'H"J'
+F4F4F4F4F4F4FFP7F4F4F4F4F4F48%GzG&
+F8F8F8F8P)D9F8F8F8F8F5
+Jz
+5P-FE
+Iz
+P1D9
+
+
+
+
+
+
+
+
+
+
+=z"z"z
+0F4F5P&F4F51F4<z8z8z
+1F8P%F81F8
+
+
+7z8z8z
+6F5P%F55F5"J"J"
+F57F5P&F5
+ENDBITMAP
+%%EndBinary
+324 539 531 575 R
+7 X
+V
+4 8 Q
+0 X
+(pushbutton .pb -text PushButton \134) 324 569.67 T
+( -defaultring yes) 324 559.67 T
+(pack .pb -padx 12 -pady 12) 324 549.67 T
+0 10 Q
+(FIGURE 17) 380.43 514.17 T
+1 F
+( - Pushbutton) 431.83 514.17 T
+0 0 612 792 C
+315 158 540 365 C
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+315 178.14 540 356 R
+7 X
+0 0 0 1 0 0 0 K
+V
+0.5 H
+2 Z
+0 X
+N
+%%BeginBinary: 4071
+264 73 135.77 37.54 0 359.23 311
+/red <
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000008EEF9AFF2CAEB6CF71E7
+A24DF70055BE928AB2D3FF00F7557DDBB2002CFF6120822C455D4571FF0000FF
+> store
+/green <
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000082D78AE78AEFEF0071E7
+A24DF70055BE827530B6FFFFDF697DDBB2004D00B641DF4D829E4582FF0000FF
+> store
+/blue <
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000006DB675C755EFB60071E7
+A24DF77D55BE9265618EE300B22C7DDBB28A4D00FF59E351B6A2FF9200FF00FF
+> store
+ BEGINBITMAPCOLORc
+z"z"z"
+7F6F7R?F6F77F6F7J"
+S@F78z8z8z
+5F9R>F95F9
+
+
+<z"
+S5F7F6=z"z"z"z
+0F6F7R.F6F70F6F70F6>z8z8z8z
+/F9R-F9/F9/F9
+J&C"9#I%9%
+OFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEJ(A"J"?"Js"
+OEFEFEF9F9F9FEFEFE9F9F9P.F6F7J$9$E#Jr
+ODFEFEF9F9FEFEF9F9PMF9J'9"8&:$9';'<$8'9(
+OMFEFEFEF9FEFEFEFEFEFEFEFEFEFEFEFEFEFEF9FEFEF9FEFEF9FEF9FEFEFEFEFEFEF9FEFEFEFEFEF9FEFEFEAs"J"8(8$:*8%D)8%8"9"J$
+F6F7O9F9FEF9FEFEFEF9F9F9F9F9FEFEFEF9FEFEFEF9F9FEF9FEFEFEFEFEF9FEFEF9F9FEF9FEFEF9F9O8F6F6F7BrJ$E$<"J"<"J"
+F9O=F9F9F9F9F9F9F94FEF9OCF9AsJ%=%J#
+F7P3F9FEFEF9F9F9F9F9OGF7F7AtJ$9$9$E$J%D"J$
+F9O0F9FEFEFEFEF9FEF9FEFEF9FE:FEF9FEFEFEO8F9F9F9J(:&8&8,8"9&:"8+8"9"8%8"
+OEF9FEFEFEFEFEF9F9FEFEF9F9F9FEFEF9FEFEF9F9F9FEFEFEF9F9F9FEFEFEF9FEFEFEFEFEF9F9F9FEFEFEF9F9FEFEFEF9FEFEF9FEJ&<#;r9$9z9$8s9'Js
+OFF9F9F9F9F9F9F9F9F9F9F94F9F9F9F9F9F9F9F9F9F9F9OCF7Jt
+S.F9J"8"
+OMFEFE>z8z8z8z
+/F7R-F7/F7/F7sF"J"F"F&
+F7F7R.F7F7F7F7F7F7F7(z'
+F6F6F6F6F6F6F7S4D9F6F6F6F6F6F68%J&
+F9F9F9F9S6F9F9F9F9F7
+
+
+
+
+
+
+
+JZ
+Q'P*J"
+S0D8Jz"
+Q)P&D9D8
+
+
+J%J#8#J&H#J#:#
+7FEFEFEFE>FEFEFEFE5FEFEFEFEFEFEFEO*FEFEFEFEJ'J#J(J#
+6FEFED9D9FEFEAD9D94FEFED9D9D9FEFEOCD9D9J$8*9%8+8"8+9&D#9#8%8"8"8%8*9%9#J)8#8&8#JW
+5FEFED9D9FEFED9FEFED9FEFEFEFEFEFEFEFED9FEFED9FEFEFEFEFEFED9FEFED9FEFED9FEFEFEFED9FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFED9FEFEFED9FEFEFEFEFEFEFEFEFE@FEFED9FEFED9FEFEFEFEFEFED9FEFEFEFE=J,9"8)8"<*>(?)8)81J%J"
+@FED9FEFED9FEFED9D9FEFEFEFEFED9D9FEFED9D9D9FED9FEFED9FEFED9FED9FEFEFED9D9D9FEFED9D9FEFED9D9D9D9FEFED9D9FEFEFED9D9FEFED9D9FEFED9FEFED9D9FEFEIFED9FEFEO(D8J"D%E"="?&8(9%J%8#J"A'Js"
+@D9D9D9D9D9D9D9D9D9FEFEFED9FEFED9FEFED9FED9D9D9:FED9D9D9D9D9ED9D9FEFEFEFED9?D9D8J#;"9$J"8"?&?#D&J"8"
+GFEFED9FEFEFEAD9FED9D9FEFEFEFEFED9D9FEFEFEO)D9D9J%<%J#8":&:"8">%D"8"J"8"Js
+GD9D9D9D9FEFED9D9>FEFED9D9FEFEFED9D9FED9D9D9D9D9FEO(FEFE@D8J$8$9">#G"C"J%=":#B%:#J"9'J"
+5D9FEFEFEFED9FEFEFEFEFE8FEFED9D9FEFEFEFEFED9D9FEFEMFEFEFED9D9FEFE>D8'F':,<-@%>(9";'8+B'J%@%JwJ&
+F7F7F7F7F7F7D9FEFEFEFED9D9FEFED9D9D9FEFEFEFED9D9FEFEFED9FEFED9D9FEFED9D9FEFED9D9FEFEFEFEFED9D9D9FEFEFEFED9D9FEFED9D9FEFEFEFED9D9FEFEFEFED9@FEFEFEFED9FEFED9FD96F7F7F7F7F7'G%<#9%8#:'8s8#8#@&<":%:#8%8#8#8#8%9#Jv8#8s8#J'
+F6F6F6F6F6F6D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9:D9D9D9D9D9D9O1F6F6F6F6F6F68%J#J"J&
+F9F9F9F9O3FEFE4FEQ:F9F9F9F9F7J'E$
+O9D9FEFEFEFED9FEFED9J#J%F#
+>D9D9HD9D9D9D9D9D9
+Jz
+Q)P&D8J"
+Q(D8Jz
+Q'P*D9
+
+
+
+
+
+
+
+
+=z"z"z
+0F6F7R?F6F71F6<z8z8z
+1F9R>F91F9
+
+
+7z8z8z
+6F7R>F75F7"J"J"
+F77F7R?F7
+ENDBITMAP
+%%EndBinary
+324 185 531 302 R
+7 X
+V
+4 8 Q
+0 X
+(Optionmenu .om \134) 324 296.67 T
+( -labeltext \322Operating Systems:\323 \134) 324 286.67 T
+( -items {SunOS HP/UX AIX OS/2 Windows} \134) 324 276.67 T
+( -command SelectProc) 324 266.67 T
+(pack .om -padx 10 -pady 10) 324 256.67 T
+(.om insert end Linux VMS) 324 236.67 T
+(.om disable DOS) 324 226.67 T
+(.om delete 1 2) 324 216.67 T
+(.om sort ascending) 324 206.67 T
+(.om select Linux) 324 196.67 T
+(.om conf) 324 186.67 T
+(igure -cyclicon true) 362.4 186.67 T
+0 10 Q
+(FIGURE 18) 375.73 160.17 T
+1 F
+( - Optionmenu) 427.11 160.17 T
+0 0 612 792 C
+FMENDPAGE
+%%EndPage: "11" 11
+%%Page: "12" 12
+612 792 0 FMBEGINPAGE
+[0 0 0 1 0 0 0]
+[ 0 1 1 0 1 0 0]
+[ 1 0 1 0 0 1 0]
+[ 1 1 0 0 0 0 1]
+[ 1 0 0 0 0 1 1]
+[ 0 1 0 0 1 0 1]
+[ 0 0 1 0 1 1 0]
+ 7 FrameSetSepColors
+FrameNoSep
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+1 10 Q
+0 X
+0 0 0 1 0 0 0 K
+(by side, manner) 72 713.33 T
+(. A value may be entered into the entry) 135.05 713.33 T
+(area explicitly or the buttons may be pressed which) 72 701.33 T
+(cycle up and down through the choices. This latter) 72 689.33 T
+(behavior is one of spinning.) 72 677.33 T
+(The following code segment creates a month spinner) 72 653.33 T
+(based on the Spinner class. The months are stored in a) 72 641.33 T
+(list from which the spinMonth procedure cycles. The) 72 629.33 T
+(Spinner increment and decrement options invoke this) 72 617.33 T
+(procedure with a direction ar) 72 605.33 T
+(gument which is 1 or -1.) 187.34 605.33 T
+(The Spinner disables input by making the blockInput) 72 593.33 T
+(procedure the validation procedure which always) 72 581.33 T
+(returns invalid.) 72 569.33 T
+72 167 297 566 C
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+72 206 297 548 R
+7 X
+0 0 0 1 0 0 0 K
+V
+0.5 H
+2 Z
+0 X
+N
+%%BeginBinary: 3312
+179 73 92.06 37.54 0 144 503
+/red <
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000096FB7DFFCF9A96FB69FBB29AFF2CAEB6CF71E7
+A24DF70055BE928AB2D3FF00F7557DDBB2002CFF6120822C455D4571FF0000FF
+> store
+/green <
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000096FB6DFFB66996FB86FFDF8AE78AEFEF0071E7
+A24DF70055BE827530B6FFFFDF697DDBB2004D00B641DF4D829E4582FF0000FF
+> store
+/blue <
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000009AFF5DDF9E719AFF8EFFEF75C755EFB60071E7
+A24DF77D55BE9265618EE300B22C7DDBB28A4D00FF59E351B6A2FF9200FF00FF
+> store
+ BEGINBITMAPCOLORc
+z"z"z"
+7F6F7PFF6F77F6F7J"
+QGF78z8z8z
+5F9PEF95F9
+
+
+<z"
+Q<F7F6=z"z"z"z
+0F6F7P5F6F70F6F70F6>z8z8z8z
+/F9P4F9/F9/F9
+J'@#
+O*FEFEFEFEF9FEFEFEJ'Js"
+O)FEFEF9F9F9FEP&F6F7J"A#Jr
+O.F9F9F9OHF9J#8(9$8'9';$8'
+O+FEFEF9FEFEFEF9FEFEFEFEFEFEFEFEF9FEFEFEFEFEF9FEFEFEFEFEFEFEFEF9FEFEAs"J"9%8(:"8%8"8%8)8"J$
+F6F7CF9FEFEF9F9FEF9FEFEFEF9F9F9FEF9FEFEF9FEF9FEFEFEFEFEF9FEFEF9F9FEHF6F6F7BrJ#9"9$A">">"<$J"
+F9EF9F9FEF9F9F9F9F9FEF9F9F9GF9AsJ"8#J%J#
+F7DFEF9F9DF9F9F9F9MF7F7AtJ">$J%J$
+F9DFEFEF9FE<FEF9FEFEMF9F9F9J'9(8$8"9$8"9+8"
+O*F9FEFEFEFEF9F9FEFEF9F9F9FEFEF9FEFEFEF9FEFEFEF9F9F9FEFEFEF9F9FEFEJ';#9z9$8%Js
+O)F9F9F9F9F9F9F9F96F9F9F9F9F9F9F9F9O(F7Jt
+Q5F9J"8"
+O0FEFE>z8z8z8z
+/F7P4F7/F7/F7sF"J"F"F&
+F7F7P5F7F7F7F7F7F7F7(z'
+F6F6F6F6F6F6F7Q;D9F6F6F6F6F6F68%J&
+F9F9F9F9Q=F9F9F9F9F7
+
+
+
+
+
+
+
+
+Jz8U
+O:O>D3J"9s"
+Q)FFD9D8Jz"="
+O<O:D4FFFEJ"
+Q1FEJ"
+Q/FEJ#;#F#8#J"J"
+5FEFEFEFEFEFEFEFE<FEO=FEJ"
+Q.FEJ"9":%8&8"8":#=#J$9%9"9"9$9&9"J"
+7FEFEFEFEFEFEFEFED9FEFEFEFEFEFEFEFE4FEFEFEFED4FEFEFEFEFEFEFEFED4FED4FEFEEFEJ'9'8"9%J&9%?&9#J'
+?FEFED9D9FEFEFED9FEFED9D9D9FED9FEFE;FED4D4D4FEFED4D4FEFED4D4D4FEFED4FD9D9D9D9D9D9J$C"A"?#I"="B"="Js
+8FED9FED9D9D9D9D4D4D4D4FD8J"9"J$H$@#JT
+7D9D9O*FEFEFEFEFEFEFED4?J"J"<%G%=#Jr#
+9FEO$FEFED4D4D4FED4D4D4D4FEBFED9D8J$J"B#J"J"
+8D9FED96FEFEFEDFEO$D9'J'?%J&8'>%9'<$J"D&
+F7F7F7F7F7F79D9FEFEFEFED9D9FEFED9:D4FEFEFED4D4FEFEFED4FED4FEFED4D4FEFEFED4FED4FED4FD9F7F7F7F7F7'E#8"8#8%8#8#9&8#<#C$:r9"9%9rJ"I'
+F6F6F6F6F6F6D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D4D4D4D4D4D4D4D4D4D4HD9F6F6F6F6F6F68%J#J"F&
+F9F9F9F9P2FED4FD9F9F9F9F9F7J#J"
+P7FED4DD9J"J"
+P7D4GD9JZ>"
+O<O:D9J"Js
+O;FFO?D8Jz8u
+O:O>D9D9
+
+
+
+
+
+
+
+
+
+=z"z"z
+0F6F7PFF6F71F6<z8z8z
+1F9PEF91F9
+
+
+7z8z8z
+6F7PEF75F7"J"J"
+F77F7PFF7
+ENDBITMAP
+%%EndBinary
+81 215 288 494 R
+7 X
+V
+4 8 Q
+0 X
+(set months {January February March April \134) 81 488.67 T
+-0.25 ( May June July August September \134) 81 478.67 P
+( October November December}) 81 468.67 T
+(proc blockInput {} {return 0}) 81 448.67 T
+(proc spinMonth {direction} {) 81 428.67 T
+( global months) 81 418.67 T
+( set index \134) 81 408.67 T
+( [expr [lsearch $months [.sm get]] + \134) 81 398.67 T
+( $direction]) 81 388.67 T
+( if {$index < 0} {set index 11}) 81 368.67 T
+( if {$index > 11} {set index 0}) 81 358.67 T
+( .sm delete 0 end) 81 338.67 T
+( .sm insert 0 [lindex $months $index]) 81 328.67 T
+(}) 81 318.67 T
+(spinner .sm \134) 81 298.67 T
+( -labeltext \322Month : \322 \134) 81 288.67 T
+( -width 10 -f) 81 278.67 T
+(ixed 10 \134) 157.8 278.67 T
+( -validate blockInput \134) 81 268.67 T
+( -decrement {spinMonth -1} \134) 81 258.67 T
+( -increment {spinMonth 1}) 81 248.67 T
+(.sm insert 0 January) 81 238.67 T
+(pack .sm -padx 10 -pady 10) 81 228.67 T
+0 10 Q
+(FIGURE 19) 143.17 181.17 T
+1 F
+( - Spinner) 194.56 181.17 T
+0 0 612 792 C
+0 12 Q
+0 X
+0 0 0 1 0 0 0 K
+(Spinint) 408.82 712 T
+1 10 Q
+(The most common data type for which spinning behav-) 315 693.33 T
+(ior is useful is that of integers. The Spinint class of) 315 681.33 T
+(fers) 518.42 681.33 T
+(this capability by specializing the Spinner class. Addi-) 315 669.33 T
+-0.07 (tional options are provided which allow speci\336cation of) 315 657.33 P
+-0.25 (a step and range values which vary and limit the cycling.) 315 645.33 P
+( The following example creates a water temperature) 315 621.33 T
+-0.54 (integer spinner widget labeled appropriately) 315 609.33 P
+-0.54 (. The widget) 488.84 609.33 P
+(options limit the range of values to between freezing) 315 597.33 T
+(and boiling, speci\336es a step value of two, enables wrap-) 315 585.33 T
+(ping, and orients the buttons in a side by side fashion.) 315 573.33 T
+0 12 Q
+(Spindate) 404.83 394.71 T
+1 10 Q
+(The spindate class creates a set of spinners for use in) 315 370.05 T
+-0.29 (date entry) 315 358.05 P
+-0.29 (. The set includes three spinners con\336gured to) 353.77 358.05 P
+(support day) 315 346.05 T
+(, month and year entry) 361.29 346.05 T
+(. Options allow con-) 450.9 346.05 T
+(trol over the display of each spinner) 315 334.05 T
+(, the format of the) 458.46 334.05 T
+(month, and the orientation.) 315 322.05 T
+315 422.71 540 570 C
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+315 450.43 540 561 R
+7 X
+0 0 0 1 0 0 0 K
+V
+0.5 H
+2 Z
+0 X
+N
+%%BeginBinary: 4730
+255 73 131.14 37.54 0 363.14 513.86
+/red <
+3EC472FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF80808080
+8080808080808080808080808080808080808080404040404040404040404040
+4040404040404040404040000000000000000000000000000000000039C069DD
+00FF0000003333330033CCDD9999112277005544FFCC66AABBFF33EE9999CC7A
+EFD39765E1A36FE700FF5500557FB22EAFB4CD73E6A24DBF99FFFFB07AFFB0CC
+F5008788439D58D750D080C0C080C0808060C000FFA000FF20C0A040C040D0BE
+8BD28BD9B3FF7260F0E010B499FFA00019BF2FFF6223852F465F4770FF0000FF
+> store
+/green <
+57D79F00000000000000000000000000FFFFFFBFBFBFBFBF8080808080404040
+40000000FFFFFFFFFFBFBFBFBF808080808040404040400000000000FFFFFFFF
+FFBFBFBFBFBF8080808040404040400000000000FFFFFFFFFFBFBFBFBFBF8080
+8080804040400000000000FFFFFFBFBFBFBFBF80808040404040400063E0B500
+996699FF00663399BBFF99DD99FF112277005544CCCC66AABB6600EE6600CC69
+E3B59765E1A36FE700FF1A006B7FB28BEEEE0073E6A24DBF99FFFFB094FF30F7
+F500CE884DB358D78080C0C080C080808060C08000A080402070A0402040D0BE
+5BB477D9B3FF77F0F0E010B489E4A0FF19264F00B641DE4F829E4780FF0000FF
+> store
+/blue <
+8CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF8040FFBF804000FFBF804000FFBF80
+00BF8040FFBF804000FF804000FFBF804000FFBF804000FFBF804000FFBF8040
+00FFBF804000FFBF4000FFBF804000FFBF804000FFBF804000FFBF804000FFBF
+804000FFBF00FFBF804000BF8040FFBF804000FFBF40FFBF8040004063E0B500
+FF3399FF88666666009966DDFFFF112277DD554499FFCCAABBCC99EE9966CC69
+E3B59765E1A36FE7BFCC8BEE2F7FB257EEB40073E6A24DBF6BFBB3B015326024
+F580FA8856CA58D7D050C080C08080C08060C080FF0000402070C0802040D0BE
+7A8C65D9B3E0856050E010B476C4A00070264F00FC5AE050B4A0FF9000FF00FF
+> store
+ BEGINBITMAPCOLORc
+z"z"z"
+6F6F7R8F6F76F6F7J"
+S7F78z8z8z
+4F9R7F94F9
+
+;z"
+S.F7F6<z"z"z"z
+0F6F7R'F6F70F6F70F6=z8z8z8z
+/F9R&F9/F9/F9
+J'@#A%B"
+P#FEFEFEFEF9FEFEFEFEFEFEFEFEJ'J"8"A"Js"
+P"FEFEF9F9F9FE8F9F9FEP$F6F7J"A#Jr
+P'F9F9F9P@F9J#8(9$8'>'9"8#
+P$FEFEF9FEFEFEF9FEFEFEFEFEFEFEFEF9FEFEFEFEFEF9FEFEFEFEFE@s"J"9%8(:"8%="8%8"8#J$
+F6F7O=F9FEFEF9F9FEF9FEFEFEF9F9F9FEF9FEFEF9FEF9FEFEF9F9F9OAF6F6F7ArJ#9"9$A"C"J"
+F9O?F9F9FEF9F9F9F9F9OLF9@sJ"8#J#
+F7O>FEF9F9P?F7F7@tJ">$J$
+F9O>FEFEF9FEP7F9F9F9J'9(8$8"9$8$8"9"8$
+P#F9FEFEFEFEF9F9FEFEF9F9F9FEFEF9FEFEFEF9FEFEF9FEFEFEF9FEFEJ';#9z9#Js
+P"F9F9F9F9F9F9F9F9;F9F9F9P"F7Jt
+S&F9J"8"
+P)FEFE=z8z8z8z
+/F7R&F7/F7/F7rF"J"F"F%
+F7F7R'F7F7F7F7F7F7'z&
+F6F6F6F6F6F7S-EDF6F6F6F6F68$J%
+F9F9F9S/F9F9F9F7
+
+
+
+
+
+
+
+
+
+J5=4;4
+Q&IC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FFEDFFEDFFEDFFEDFFEDFFEDFFEDFFEDFFEDFFFFEDFFEDFFEDFFEDFFEDFFEDFFEDFFEDFFEDFFJ5<"r#u:"z$
+Q&IFEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FEC0FFFFEDFEFEEDFF0FEEDEDEDJ#z#<"<"A":"H"
+Q&C0FEEC0FFC0EDFEFEEDFEJ#J#<"?">":"E"8"
+Q&FEC0EC0FFFFFEEDFFEDEDJ#J#<";"B":#G"
+Q&C0FEEFFC0EDFEFEEDEDFEI#8#8#>#HsJ#J#9$:$J#<"@"=":"D"9"
+FEFEFEFEFEFEFEFEFEMFEFE@FEC0FEFEFEFEFEFE8C0FFFFFEEDFFEDEDJ$8$J#8&8&J#<":"C":$F"
+O+EDEDEDEDEDEDOAC0FEFEC0C0C0FEFEC0C0C0FE7FFC0EDFEFEEDEDEDFEJ%8"8"8%8&C%8*8&9%8+8"8%8.9#>#8"<"J#<"A"<":"C":"
+>FEFEFEFEFEFEFEFEFEFEFEFEEDFEFEFEFEFEFEFEEDFEFEFEEDFEFEFEFEFEEDFEFEFEFEFEFEFEFEEDFEFEEDFEFEFEFEFEFEEDFEFEFEFEEDFEFEEDFEFEEDFEFEFEFEFEFEFEC0C0C0;C0FFFFFEEDFFEDEDI">*8)9"D'8*9,9"8)8"@"8'B#:$;#J#<"9"D":"8"E"
+EDEDFEFEEDEDFEFEEDEDEDEDFEFEEDEDFEFEFEFEFEEDEDFEFEFEEDEDFEFEEDEDFEFEFEEDFEFEEDFEFEEDEDFEFEFEFEFEEDEDFEFEEDEDEDFEFEFEEDEDFEFEC0FEFEFEC0FEC07FFC0EDFEFEEDEDFEJ":"8#J#J"D%J#>#>#:$:#J#<"B";":"B";"
+5FEFEEDED4EDED@EDEDEDEDED4EDEDEDEDFEC0C0C0FEFEC08C0FFFFFEEDFFEDEDJ$@#;"F#J#;"9$G":#D#@#J#<"8"E":"9"D"
+>FEFEFEFEFEEDFEFE7FEFEEDFEFEFEEDFEFEC0FEFEC09FFC0EDFEFEEDEDFEJ.@%J%J%<%J%B#8"<#J#<"C":":"A"<"
+4EDFEFEEDEDFEFEEDEDFEFEEDEDEDEDEDED4EDEDEDED5EDEDEDEDFEFEEDED6EDEDEDEDFEC0FEFEC0:C0FFFFFEEDFFEDEDJ":#J#D">#G"9"B#8#>#J#<$F":":"C"
+HFEFEFE6FEFEFEFEFEFEFEFEFEFEFEC0FEEFFC0EDEDFEFEEDEDFEJ3H'D,<1>'B#8&9%J#<"D"9":"@"="
+=EDFEFEFEEDFEFEEDEDFEFEEDEDFEFEFEFEEDEDFEFEFEFEEDEDFEFEEDEDEDFEFEFEFEEDEDFEFEFEEDFEFEEDEDFEFEEDEDFEFEEDEDFEFEFEFEEDFEC0C0FEFEFEC0FEFEFEFE7C0FFFFFEEDFFEDED&F#8#9'8#8%8#@#:%8#8#8#:#9%8#:'8#8s:%9#>#9$9&J#<#G":";"B"D%
+F7F7F7F7F7EDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDC0FEC0C0C0C0C0C0C0C07FFC0EDFEFEEDEDFEF7F7F7F7&J#J#<"E"8":"?">"D&
+F6F6F6F6F6Q!FEC0EC0FFFFFEEDFFEDEDF6F6F6F6F68$J#J#<"H":"<"A"E%
+F9F9F9Q!C0FEEFFC0EDFEEDEDFEF9F9F9F7J#J#J#<"F$:">"?"
+OEEDEDO-FEC0EC0FFFFFEEDEDFFEDEDJ5<z":"="@"
+Q&IC0FEC0FFC0FFC0FFC0FFC0FFC0FFC0FFC0FFC0FFC0FFC0FFC0FFC0FFC0FFC0FFC0FFC0FFC0FFC0FFC03EDFEEDEDFEJ5<5:5
+Q&IFEC0FFC0FFC0FFC0FFC0FFC0FFC0FFC0FFC0FFC0FFC0FFC0FFC0FFC0FFC0FFC0FFC0FFC0FFC0FFC0FF4FFEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEED4FFEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDFEEDJz<z;z
+Q&IED3ED3ED
+
+
+
+
+
+
+
+
+
+
+<z"z"z
+0F6F7R8F6F71F6;z8z8z
+1F9R7F91F9
+
+7z8z8z
+5F7R7F74F7"J"J"
+F76F7R8F7
+ENDBITMAP
+%%EndBinary
+324.71 455.86 531.71 509.86 R
+7 X
+V
+4 8 Q
+0 X
+(spinint .temp -labelpos w \134) 324.71 504.52 T
+( -labeltext \322Water Temperature:\323 \134) 324.71 494.52 T
+( -f) 324.71 484.52 T
+(ixed 5 -width 5 -range {32 212} \134) 353.51 484.52 T
+( -step 2 -wrap yes -orient horizontal) 324.71 474.52 T
+(pack .temp -padx 10 -pady 10) 324.71 464.52 T
+0 10 Q
+(FIGURE 20) 386.68 437.46 T
+1 F
+( - Spinint) 438.07 437.46 T
+0 0 612 792 C
+315 72 540 720 C
+315.14 153.14 540 318.71 C
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+315.72 187.85 538.57 309.71 R
+0.5 H
+2 Z
+0 X
+0 0 0 1 0 0 0 K
+N
+349 194.57 520 221.57 R
+7 X
+V
+1 10 Q
+0 X
+(spindate .sd -monthformat string) 349 214.91 T
+(pack .sd -padx 10 -pady 10) 349 202.91 T
+%%BeginBinary: 7044
+138 123 70.97 63.26 0 387.14 237.71
+/red <
+C472FFFFFFFFFFFFFFFFFFFFFFFFFF66F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF808080
+8080808080808080808080808080808080808080804040404040404040404040
+4040404040404040404040400000000000000000000000002EAFB4CD73E6A2F5
+99FFFFB0B07AFFCC00878858D7439D50D080C0C080C08060C000FFA000FF20C0
+A0C0D060F0E010B499FFBE8B8BD900FFA0000000000039C069DD00FF00000033
+33330033CCDD9999112277005544FFCC66AABBFF33EE9999CC7AEFD3BF804040
+9765E1A36FE700FF55004DB2D272B36419BF2FFF6223852F465F4770FF0000FF
+> store
+/green <
+D79F0000000000000000000000000099DEFFFFFFBFBFBFBFBF80808080804040
+4040000000FFFFFFFFFFBFBFBFBF808080808040404040400000000000FFFFFF
+FFFFBFBFBFBFBF8080808040404040400000000000FFFFFFFFFFBFBFBFBFBF80
+808080804040400000000000FFFFFFBFBFBFBFBF808080408BEEEE0073E6A2F5
+99FFFF30B094FFF700CE8858D74DB38080C0C080C0808060C08000A080402070
+A020D0F0F0E010B489E4BE5B77D9FFFFA0404040400063E0B500996699FF0066
+3399BBFF99DD99FF112277005544CCCC66AABB6600EE6600CC69E3B5BF804040
+9765E1A36FE700FF1A004DB2B477B39519264F00B641DE4F829E4780FF0000FF
+> store
+/blue <
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3BF8040FFBF804000FFBF804000FFBF
+8000BF8040FFBF804000FF804000FFBF804000FFBF804000FFBF804000FFBF80
+4000FFBF804000FFBF4000FFBF804000FFBF804000FFBF804000FFBF804000FF
+BF804000FFBF00FFBF804000BF8040FFBF804000FFBF40FF57EEB40073E6A2F5
+6BFBB360B015322480FA8858D756CAD050C080C08080C060C080FF0000402070
+C020D06050E010B476C4BE7A65D900E0A0BF8040004063E0B500FF3399FF8866
+6666009966DDFFFF112277DD554499FFCCAABBCC99EE9966CC69E3B5BF808040
+9765E1A36FE7BFCC8BEE4DB28C85B3ED70264F00FC5AE050B4A0FF9000FF00FF
+> store
+ BEGINBITMAPCOLORc
+z"z"z"
+6F6F7OMF6F76F6F7J"
+PLF78z8z8z
+4F9OLF94F9
+
+;z"
+PCF7F6<z"z"z"z
+0F6F7O<F6F70F6F70F6=z8z8z8z
+/F9O;F9/F9/F9
+J#E$B"
+O!FEFEFEFEFEFEJ"C"Js"
+O2F9FEHF6F7J#Jr
+O!F9F9O9F9Jr$9$8';#<%9"8#8$
+AFEF9FEFEFEFEFEFEFEFEF9FEFEFEFEFEFEFEFEFEFEFEFEFEFE@s"C'8(:"8%8&<%8"8)G$
+F6F7FEF9F9F9FEF9FEF9FEFEFEF9F9F9FEF9FEFEFEFEFEF9FEF9F9FEFEF9F9F9FEFEFEF9FEFEF6F6F7ArE%9$A"=$;$B"J"
+F9FEFEFEF9F9F9F9F9F9F9F9F9FEFEFE4F9@sD"9"J%A%G#
+F7F9FE@FEFEF9F9F9F9F9F9F7F7@tC%:$I$="A%G$
+F9FEF9F9F9FEF9FEFEF9FEFEFEF9FEFEF9F9F9J%9(8$8"9(8'8"8+
+AFEFEFEF9F9FEFEF9F9F9FEFEF9FEFEFEF9F9F9FEFEF9FEF9F9FEFEF9FEF9FEFEF9F9F9FEFEFEF9J%;#9x9'8'9#9$Js
+@F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9@F7Jt
+P;F9J"8"
+EFEFE=z8z8z8z
+/F7O;F7/F7/F7rF"J"F"F%
+F7F7O<F7F7F7F7F7F7'z&
+F6F6F6F6F6F7PBADF6F6F6F6F68$J%
+F9F9F9PDF9F9F9F7
+
+
+
+
+
+
+
+J2
+P*FFADFFADFFADFFADFFADFFADFFADFFADFFJ4
+P)FFADFFADFFADFFADFFADFFADFFADFFADFFADFEJ5:#z#
+O1B7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFEADFF/ADFEADJ5:#="=#
+O1BFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFFADFEADFEJ#z":#<$<#
+O17FFE?7FFFADFFFEFEFEFEADJ#J#:#;"9";#
+O1FE7F>FF7FFFADFEFEADFEJ#J#:#:";":#
+O17FFE>7FFFADFFFEFEFEADJ#;#F#8#B#<"J#:#9"="9#
+4FEFEFEFEFEFEFEFEFE7FFE7FF7FFFADFEFEADFEJ#J#:#8"?"8#
+O17FFE>7FFFADFFFEFEFEADJ"9":%8&8"8":#?#@$9%@#:#8v8#
+6FEFEFEFEFEFEFEFEADFEFEFEFEFEFEFE7FFEFEFEFE7FFEFEFF7FFFADADADFEJ'9'8"9%>#?&9%?#:4
+>FEFEADADFEFEFEADFEFEADADADFEADFEFE7FFEFE7F7F7FFEFE7F7FFE7FFFADFFADFEADFEADFEADFEADFEADFEADFEADFEADJ$C"A"A#?"="B#:4
+7FEADFEADADFE7F7F7FFF7FFFADFEADFEADFEADFEADFEADFEADFEADFEADFEJ"9"J#@$G#:4
+6ADADD7FFEFEFEFE7FFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADJ"J#8"<%G#:4
+8FEFFE7FFEFE7F7F7FFF7FFFADFFADFFADFFADFFADFFADFFADFFADFFADFEJ$J"D#J#:#z#
+7ADFEAD6FE7FFE>7FFFADFF/ADFEADJ'?%D#8&8'E#:#8v8#
+>ADFEFEFEFEADADFEFEADFE7F7FFEFEFE7F7FFEFEFE7FFEFF7FFFADFEADFEJ#8"8#8%8#8#9&8#>#9$:r9"?#:#8"?"8#
+4ADADADADADADADADADADADADADADADADADADADAD7FFE7F7F7F7F7F7FFFADFFADADFEADJ#J#:#9"="9#
+O1FE7F>FF7FFFADADADADFEJ#J#:#:";":#
+O17FFE>7FFFADFFADADFEADJ#J#:#;"9";#
+O1FE7F>FF7FFFADADADADFEJ5:#<$<#
+O1B7FFE7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFFADFFADFEADFEADJ5:#="=#
+O1BFE7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFFADADADFEJz:4
+O1BADADFFADFEADFEADFEADFEADFEADFEADFEADFEADJ4
+P)FFADFEADFEADFEADFEADFEADFEADFEADFEADFEJz
+P)3ADJ2
+P*FFADFFADFFADFFADFFADFFADFFADFFADFFJ4
+P)FFADFFADFFADFFADFFADFFADFFADFFADFFADFEJ5:#z#
+O1B7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFEADFF/ADFEADJ5:#="=#
+O1BFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFFADFEADFEJ#z":#<$<#
+O17FFE?7FFFADFFFEFEFEFEADJ#J#:#;"9";#
+O1FE7F>FF7FFFADFEFEADFEJ#J#:#:";":#
+O17FFE>7FFFADFFFEFEFEADJ&J#:"J#:#9"="9#
+4FEFEFEFEFEFFE7FFE9FF7FFFADFEFEADFEJ%J#8#J#:#8"?"8#
+6ADADFEFEE7FFEFEFE:7FFFADFFFEFEFEADJ$8%8#9#J#8#J#:#8v8#
+8ADFEFEFEFEFEFEFEFEFEFE5FE7F7F7F:FF7FFFADADADFEJ'J#J#:4
+<FEFEADADFEFE=7FFE>7FFFADFFADFEADFEADFEADFEADFEADFEADFEADFEADJ#;(J#J#:4
+<ADADADFEFEADFEFEAD5FE7F>FF7FFFADFEADFEADFEADFEADFEADFEADFEADFEADFEJ$J#J#:4
+=FEFEFE?7FFE>7FFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADJ%:&J#J#:4
+<FEFEADADADFEFEFEAD6FE7F>FF7FFFADFFADFFADFFADFFADFFADFFADFFADFFADFEJ$J#J#:#z#
+8FEFEADD7FFE>7FFFADFF/ADFEADJ%8(8"J#J#:#8v8#
+6FEFEFEADADFEFEFEADFEFEAD9FE7F>FF7FFFADFEADFEJ&:':"J#:"J#:#8"?"8#
+4ADADADADADADADADADADADAD77FFE7F97FFFADFFADADFEADJ"J#J#:#9"="9#
+EFE9FE7F>FF7FFFADADADADFEJ$J#J#:#:";":#
+DFEFEAD87FFE>7FFFADFFADADFEADJ#J#J#:#;"9";#
+DADAD9FE7F>FF7FFFADADADADFEJ5:#<$<#
+O1B7FFE7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFFADFFADFEADFEADJ5:#="=#
+O1BFE7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFFADADADFEJz:4
+O1BADADFFADFEADFEADFEADFEADFEADFEADFEADFEADJ4
+P)FFADFEADFEADFEADFEADFEADFEADFEADFEADFEJz
+P)3ADJ2
+P*FFADFFADFFADFFADFFADFFADFFADFFADFFJ4
+P)FFADFFADFFADFFADFFADFFADFFADFFADFFADFEJ5:#z#
+O1B7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFEADFF/ADFEADJ5:#="=#
+O1BFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFFADFEADFEJ#z":#<$<#
+O17FFE?7FFFADFFFEFEFEFEADJ#J#:#;"9";#
+O1FE7F>FF7FFFADFEFEADFEJ#J#:#:";":#
+O17FFE>7FFFADFFFEFEFEADI#:#J#9$9&F#:#9"="9#
+FEFEFEFEDFE7FFEFEFEFEFEFEFEFEFF7FFFADFEFEADFEJ#8&9%F#:#8"?"8#
+O17FFEFE7F7F7FFE7F7F7F7F7FFFADFFFEFEFEADI$8)9%8&G#J#:#8v8#
+ADFEFEFEFEADADFEFEFEFEFEFEFEFEFEFEADFEFEFE7F>FF7FFFADADADFEJ.9"I#@$G#:4
+;FEFEADADFEFEADFEFEADADFEFEFE7FFEFEFEFE7FFFADFFADFEADFEADFEADFEADFEADFEADFEADFEADJ'>#>#G#8%9&F#:4
+4ADFEFEFEFEADADADADADFE7F7FFEFEFE7F7F7F7FFEFF7FFFADFEADFEADFEADFEADFEADFEADFEADFEADFEJ"8":#:$;"I#9$J#:4
+5ADADFEFEFEFEFEAD7FFE7F7F7F87FFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADJ*J#?"J#:4
+=ADADADADADFEFEADAD9FE7FFE4FF7FFFADFFADFFADFFADFFADFFADFFADFFADFFADFEJ#J#8"J#:#z#
+?FEFE>7FFEFE;7FFFADFF/ADFEADJ/J#8&8&F#:#8v8#
+;ADFEFEFEFEADADADFEFEFEADFEFE6FE7F7FFEFEFE7F7FFEFEFE7FFF7FFFADFEADFE&G#:%9sJ#9$:$G#:#8"?"8#B%
+F7F7F7F7F7ADADADADADADAD47FFE7F7F7F7F7F7F7FFFADFFADADFEADF7F7F7F7&J#J#:#9"="9#B&
+F6F6F6F6F6O,FE7F>FF7FFFADADADADFEF6F6F6F6F68$J#J#:#:";":#C%
+F9F9F9O,7FFE>7FFFADFFADADFEADF9F9F9F7J#J#:#;"9";#
+O1FE7F>FF7FFFADADADADFEJ5:#<$<#
+O1B7FFE7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFFADFFADFEADFEADJ5:#="=#
+O1BFE7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFFADADADFEJz:4
+O1BADADFFADFEADFEADFEADFEADFEADFEADFEADFEADJ4
+P)FFADFEADFEADFEADFEADFEADFEADFEADFEADFEJz
+P)3AD
+
+
+
+
+
+
+
+
+<z"z"z
+0F6F7OMF6F71F6;z8z8z
+1F9OLF91F9
+
+7z8z8z
+5F7OLF74F7"J"J"
+F76F7OMF7
+ENDBITMAP
+%%EndBinary
+0 F
+(FIGURE 21) 387.86 168.32 T
+1 F
+( - Spindate) 439.25 168.32 T
+315 72 540 720 C
+0 0 612 792 C
+FMENDPAGE
+%%EndPage: "12" 12
+%%Page: "13" 13
+612 792 0 FMBEGINPAGE
+[0 0 0 1 0 0 0]
+[ 0 1 1 0 1 0 0]
+[ 1 0 1 0 0 1 0]
+[ 1 1 0 0 0 0 1]
+[ 1 0 0 0 0 1 1]
+[ 0 1 0 0 1 0 1]
+[ 0 0 1 0 1 1 0]
+ 7 FrameSetSepColors
+FrameNoSep
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+0 12 Q
+0 X
+0 0 0 1 0 0 0 K
+(Spintime) 161.5 712 T
+1 10 Q
+(The spintime class is simiar to the spindate class sup-) 72 687.33 T
+(porting time entry rather than date. The three spinners) 72 675.33 T
+(are hour) 72 663.33 T
+(, minute, and second.) 104.64 663.33 T
+0 12 Q
+(Scr) 146.6 485 T
+(olledlistbox) 163.72 485 T
+1 10 Q
+(The Scrolledlistbox extends the standard Tk listbox) 72 466.33 T
+-0.51 (widget with prede\336ned vertical and horizontal scrollbars) 72 454.33 P
+-0.08 (and an associated label. The set of options available has) 72 442.33 P
+-0.06 (also been amended to include options which allow spec-) 72 430.33 P
+(i\336cation of the list items. All the usual methods exist,) 72 418.33 T
+-0.41 (plus new ones for sorting the list contents and a short cut) 72 406.33 P
+(version to acquire the current selection.) 72 394.33 T
+72 72 297 720 C
+72 513 297 660 C
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+72 534 297 651 R
+7 X
+0 0 0 1 0 0 0 K
+V
+0.5 H
+2 Z
+0 X
+N
+108 543 270 570 R
+7 X
+V
+1 10 Q
+0 X
+(spintime .st) 108 563.33 T
+(pack .st -padx 10 -pady 10) 108 551.33 T
+%%BeginBinary: 6922
+138 123 70.97 63.26 0 145.03 578.74
+/red <
+C472FFFFFFFFFFFFFFFFFFFFFFFFFF66F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF808080
+8080808080808080808080808080808080808080804040404040404040404040
+4040404040404040404040400000000000000000000000002EAFB4CD73E6A2F5
+99FFFFB0B07AFFCC00878858D7439D50D080C0C080C08060C000FFA000FF20C0
+A0C0D060F0E010B499FFBE8B8BD900FFA0000000000039C069DD00FF00000033
+33330033CCDD9999112277005544FFCC66AABBFF33EE9999CC7AEFD3BF804040
+9765E1A36FE700FF55004DB2D272B36419BF2FFF6223852F465F4770FF0000FF
+> store
+/green <
+D79F0000000000000000000000000099DEFFFFFFBFBFBFBFBF80808080804040
+4040000000FFFFFFFFFFBFBFBFBF808080808040404040400000000000FFFFFF
+FFFFBFBFBFBFBF8080808040404040400000000000FFFFFFFFFFBFBFBFBFBF80
+808080804040400000000000FFFFFFBFBFBFBFBF808080408BEEEE0073E6A2F5
+99FFFF30B094FFF700CE8858D74DB38080C0C080C0808060C08000A080402070
+A020D0F0F0E010B489E4BE5B77D9FFFFA0404040400063E0B500996699FF0066
+3399BBFF99DD99FF112277005544CCCC66AABB6600EE6600CC69E3B5BF804040
+9765E1A36FE700FF1A004DB2B477B39519264F00B641DE4F829E4780FF0000FF
+> store
+/blue <
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3BF8040FFBF804000FFBF804000FFBF
+8000BF8040FFBF804000FF804000FFBF804000FFBF804000FFBF804000FFBF80
+4000FFBF804000FFBF4000FFBF804000FFBF804000FFBF804000FFBF804000FF
+BF804000FFBF00FFBF804000BF8040FFBF804000FFBF40FF57EEB40073E6A2F5
+6BFBB360B015322480FA8858D756CAD050C080C08080C060C080FF0000402070
+C020D06050E010B476C4BE7A65D900E0A0BF8040004063E0B500FF3399FF8866
+6666009966DDFFFF112277DD554499FFCCAABBCC99EE9966CC69E3B5BF808040
+9765E1A36FE7BFCC8BEE4DB28C85B3ED70264F00FC5AE050B4A0FF9000FF00FF
+> store
+ BEGINBITMAPCOLORc
+z"z"z"
+6F6F7OMF6F76F6F7J"
+PLF78z8z8z
+4F9OLF94F9
+
+;z"
+PCF7F6<z"z"z"z
+0F6F7O<F6F70F6F70F6=z8z8z8z
+/F9O;F9/F9/F9
+J#C"9#
+O FEFEFEFEFEJ"Js"
+O.FEO,F6F7J#G#Jr
+O F9F9F9F9O'F9Jr$9$8'9"8&8'8#;$
+@FEF9FEFEFEFEFEFEFEFEF9FEFEFEFEFEFEFEFEFEFEFEF9FEFEFEFEFEFEFE@s"B'8(:"8%8"8$:"8)8'G$
+F6F7FEF9F9F9FEF9FEF9FEFEFEF9F9F9FEF9FEFEF9F9F9F9F9FEF9FEFEFEF9FEFEFEFEFEF9FEFEF6F6F7ArD%9$A"H"9">"J"
+F9FEFEFEF9F9F9F9F9F9F9FE4F9@sC"9"J%G#
+F7F9FEO"F9F9F9F9F7F7@tB%:$J%G$
+F9FEF9F9F9FEF9FEJFEF9FEFEF9F9F9J%9(8$8"9"8&8$8"9"9)
+@FEFEFEF9F9FEFEF9F9F9FEFEF9FEFEFEF9FEFEF9FEFEF9FEFEFEFEF9F9F9FEFEFEF9J%;#9x9z9$Js
+?F9F9F9F9F9F9F94F9F9F9F9@F7Jt
+P;F9J"8"
+DFEFE=z8z8z8z
+/F7O;F7/F7/F7rF"J"F"F%
+F7F7O<F7F7F7F7F7F7'z&
+F6F6F6F6F6F7PBADF6F6F6F6F68$J%
+F9F9F9PDF9F9F9F7
+
+
+
+
+
+
+
+J2
+P*FFADFFADFFADFFADFFADFFADFFADFFADFFJ4
+P)FFADFFADFFADFFADFFADFFADFFADFFADFFADFEJ5:#z#
+O8;7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FADFF/ADFEADJ5:#="=#
+O8;FE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFFFFADFEADFEJ#z#:#<$<#
+O87FFE77FFF7FADFFFEFEFEFEADJ#J#:#;"9";#
+O8FE7F77FFFFFADFEFEADFEJ#J#:#:";":#
+O87FFE7FF7FADFFFEFEFEADJ#9#J#:";$@#:#9"="9#
+4FEFEFEFEKFE7FFEFEFEFE7FFFFFADFEFEADFEJ#8#;&?#:#8"?"8#
+O87FFEFEFEFE7F7F7FFEFF7FADFFFEFEFEADJ%8#8)J#8#;"C#:#8v8#
+=FEFEFEFEFEFEFEFEADFEFEADFEFE7FE7F7F7F7F7FFFFFADADADFEJ'@"J#B#?#:4
+<FEFEADADFEFEFE97FFEFE7FFF7FADFFADFEADFEADFEADFEADFEADFEADFEADFEADJ$J#J#A#@#:4
+6FEFEFE4ADAD7FE7FFE7F7FFFFFADFEADFEADFEADFEADFEADFEADFEADFEADFEJ$I"J#@#A#:4
+6ADADADAD97FFEFE7FFF7FADFFADFFADFFADFFADFFADFFADFFADFFADFFADJ#?#B#:4
+O8FE7FFE7F7FFFFFADFFADFFADFFADFFADFFADFFADFFADFFADFEJ"J#J#:#z#
+FFE?7FFE7FF7FADFF/ADFEADJ,J#@%?#:#8v8#
+<ADFEFEFEFEADADADFEFEAD?FE7FFEFEFEFE7FFFFFADFEADFEJ#9#8%9sJ#:":&?#:#8"?"8#
+4ADADADADADADADADAD:7FFE7F7F7F7F7F7FFF7FADFFADADFEADJ#J#:#9"="9#
+O8FE7F77FFFFFADADADADFEJ#J#:#:";":#
+O87FFE7FF7FADFFADADFEADJ#J#:#;"9";#
+O8FE7F77FFFFFADADADADFEJ5:#<$<#
+O8;7FFE7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FADFFADFEADFEADJ5:#="=#
+O8;FE7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFFFFADADADFEJz:4
+O8;ADADFFADFEADFEADFEADFEADFEADFEADFEADFEADJ4
+P)FFADFEADFEADFEADFEADFEADFEADFEADFEADFEJz
+P)3ADJ2
+P*FFADFFADFFADFFADFFADFFADFFADFFADFFJ4
+P)FFADFFADFFADFFADFFADFFADFFADFFADFFADFEJ5:#z#
+O8;7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FADFF/ADFEADJ5:#="=#
+O8;FE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFFFFADFEADFEJ#z#:#<$<#
+O87FFE77FFF7FADFFFEFEFEFEADJ#J#:#;"9";#
+O8FE7F77FFFFFADFEFEADFEJ#J#:#:";":#
+O87FFE7FF7FADFFFEFEFEADJ#;&F#J#9$:$@#:#9"="9#
+4FEFEFEFEADFEFEFEFE4FE7FFEFEFEFEFEFE7FFFFFADFEFEADFEJ#J#8&8&?#:#8"?"8#
+>ADADF7FFEFE7F7F7FFEFE7F7F7FFEFF7FADFFFEFEFEADJ"9"9)8#8%8"8%C#8"J#:#8v8#
+6FEFEFEFEADFEFEADFEFEFEFEFEFEADFEFEFEFEFEFEFE7F7F47FFFFFADADADFEJ%>"8)B#:$F#:4
+CFEADFEFEADADADFEFEADADFEFE7FFEFEFE7FFF7FADFFADFEADFEADFEADFEADFEADFEADFEADFEADJ$?"J#:$F#:4
+7FEADFEADBFE7F7F7FFE7FFFFFADFEADFEADFEADFEADFEADFEADFEADFEADFEJ"9"J#D#J#:4
+6ADAD;FEFE7FFE7FF7FADFFADFFADFFADFFADFFADFFADFFADFFADFFADJ"J%B#8"J#:4
+8FE=ADADADADFE7FFE47FFFFFADFFADFFADFFADFFADFFADFFADFFADFFADFEJ$G"=":#B#J#:#z#
+7ADFEADFEFEFEFE7FFE7FF7FADFF/ADFEADJ%:+B#8&8&?#:#8v8#
+HADFEFEADADFEFEADADFEFEFEFEADFE7F7FFEFEFE7F7FFEFEFE7F7FFFFFADFEADFEJ#8"8s8#8&9#8%C#9$:$@#:#8"?"8#
+4ADADADADADADADADADADADADADADADADAD7FFE7F7F7F7F7F7FFF7FADFFADADFEADJ#J#:#9"="9#
+O8FE7F77FFFFFADADADADFEJ#J#:#:";":#
+O87FFE7FF7FADFFADADFEADJ#J#:#;"9";#
+O8FE7F77FFFFFADADADADFEJ5:#<$<#
+O8;7FFE7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FADFFADFEADFEADJ5:#="=#
+O8;FE7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFFFFADADADFEJz:4
+O8;ADADFFADFEADFEADFEADFEADFEADFEADFEADFEADJ4
+P)FFADFEADFEADFEADFEADFEADFEADFEADFEADFEJz
+P)3ADJ2
+P*FFADFFADFFADFFADFFADFFADFFADFFADFFJ4
+P)FFADFFADFFADFFADFFADFFADFFADFFADFFADFEJ5:#z#
+O8;7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FADFF/ADFEADJ5:#="=#
+O8;FE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFE7FFFFFADFEADFEJ#z#:#<$<#
+O87FFE77FFF7FADFFFEFEFEFEADJ#J#:#;"9";#
+O8FE7F77FFFFFADFEFEADFEJ#J#:#:";":#
+O87FFE7FF7FADFFFEFEFEADJ&J#>#9$G#:#9"="9#
+5FEFEFEFEFEBFEFEFE7FFEFEFE7FFFFFADFEFEADFEJ(J#8&F#:#8"?"8#
+4FEFEADADADFEFEK7FFEFE7F7F7FFEFF7FADFFFEFEFEADJ%9%9%8&9#A#J#:#8v8#
+=FEFEFEFEFEFEFEFEFEFEFEFEFEFEADFEFEFEFEFE7F77FFFFFADADADFEJ59*@#J#:4
+4<ADFEFEFEADADADADFEFEADADFEFEADFEFEADADFEFEADFEFEADADFEFEFEADFEFEADFEFEADFE7FFE7FF7FADFFADFEADFEADFEADFEADFEADFEADFEADFEADJ&C#@"="@#J#:4
+5ADADFEFEFEADADADADFE7F77FFFFFADFEADFEADFEADFEADFEADFEADFEADFEADFEJ"8"9#J#J#:4
+7ADFEFEFEF7FFE7FF7FADFFADFFADFFADFFADFFADFFADFFADFFADFFADJ#8";%J#J#:4
+4FEFEADADADADADDFE7F77FFFFFADFFADFFADFFADFFADFFADFFADFFADFFADFEJ#;#H"@#J#:#z#
+@FEFEFEFEFE7FFE7FF7FADFF/ADFEADJ5>%@#8&F#:#8v8#
+4<ADFEFEFEFEFEADADADFEFEFEFEADADADFEFEFEFEADADADFEFEFEFEADADFEFEADFE7F7FFEFEFE7F7FFFFFADFEADFE&F&9%9%9%8#8#8&>#9$G#:#8"?"8#B%
+F7F7F7F7F7ADADADADADADADADADADADADADADADADADADADADADADADADADAD7FFE7F7F7FFF7FADFFADADFEADF7F7F7F7&J#J#:#9"="9#B&
+F6F6F6F6F6O3FE7F77FFFFFADADADADFEF6F6F6F6F68$J#J#:#:";":#C%
+F9F9F9O37FFE7FF7FADFFADADFEADF9F9F9F7J#J#:#;"9";#
+O8FE7F77FFFFFADADADADFEJ5:#<$<#
+O8;7FFE7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FADFFADFEADFEADJ5:#="=#
+O8;FE7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFFFFADADADFEJz:4
+O8;ADADFFADFEADFEADFEADFEADFEADFEADFEADFEADJ4
+P)FFADFEADFEADFEADFEADFEADFEADFEADFEADFEJz
+P)3AD
+
+
+
+
+
+
+
+
+<z"z"z
+0F6F7OMF6F71F6;z8z8z
+1F9OLF91F9
+
+7z8z8z
+5F7OLF74F7"J"J"
+F76F7OMF7
+ENDBITMAP
+%%EndBinary
+0 F
+(FIGURE 22) 138.16 518.18 T
+1 F
+( - Spintime) 189.55 518.18 T
+72 72 297 720 C
+0 0 612 792 C
+72 137.14 297 391 C
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+71.29 159.14 296.29 381.71 R
+7 X
+0 0 0 1 0 0 0 K
+V
+0.5 H
+2 Z
+0 X
+N
+%%BeginBinary: 7528
+158 221 81.26 113.66 0 149.43 262.63
+/red <
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000096FB7DFFCF8AFFE79AFF2CAEB6CF71E7
+A24DF70055BE928AB2D3FF0055F7DB7DB2002CFF6120822C455D4571FF0000FF
+> store
+/green <
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000096FB6DFFB67DFFCF8AE78AEFEF0071E7
+A24DF70055BE827530B6FFFF69DFDB7DB2004D00B641DF4D829E4582FF0000FF
+> store
+/blue <
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000009AFF5DDF9E69FBB275C755EFB60071E7
+A24DF77D55BE9265618EE3002CB2DB7DB28A4D00FF59E351B6A2FF9200FF00FF
+> store
+ BEGINBITMAPCOLORc
+z"z"z"
+7F6F7P1F6F77F6F7J"
+Q2F78z8z8z
+5F9P0F95F9
+
+
+<z"
+Q'F7F6=z"z"z"z
+0F6F7P F6F70F6F70F6>z8z8z8z
+/F9OMF9/F9/F9
+J#>$
+O5FEFEFEFEFEJ"Js"
+O?F9O.F6F7J#Jr
+O5F9F9O8F9J09%;#
+O(FEFEFEF9FEFEFEFEF9FEFEFEFEFEFEFEFEFEFEFEFEAs"J"9"8':%;%J$
+F6F7BF9F9F9F9F9FEF9F9FEF9F9F9FEF9FEFEHF6F6F7BrJ$9%=%:"J"
+F9DF9FEFEFEF9FEF9FEFEFEF9F9LF9AsJ"9"J#
+F7O&F9FEO"F7F7AtJ)=%J$
+F9DF9FEFEF9F9FEFEF9FEF9F9F9O#F9F9F9J"8"8'8"9"
+O4FEFEFEFEFEF9F9FEFEFEJ#8#9t8sJs
+O+F9F9F9F9F9F9O'F7Jt
+Q F9
+>z8z8z8z
+/F7OMF7/F7/F7sF"J"F"F&
+F7F7P F7F7F7F7F7F7F7(z'
+F6F6F6F6F6F6F7Q&D9F6F6F6F6F6F68%J&
+F9F9F9F9Q(F9F9F9F9F7
+
+
+
+
+
+
+
+
+
+
+
+
+J#
+OJFEFE
+J#8#8#8%9%9#;%
+O-FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEJ39'
+O8FEFED9D9FEFED9FEFED9D9FEFED9FEFED9FEFEFED9D9FEFEJ$:$H";%
+O-D9FEFEFEFED9D9FED9D9D9J#;#@&
+O:FEFEFEFED9D9FEFEFEJ%9%@"8"
+O:D9D9D9D9D9D9D9D9D9FEJ)<#;#:"9%
+O.D9FEFED9D9FEFED9FEFEFEFEFEFEFED9D9J39'
+O8D9FEFEFEFED9D9D9FEFEFEFED9D9D9FEFED9D9FEFEFEFED9J#8#:%9%9&8%
+O/D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9
+
+
+
+
+
+Gz
+P&D1
+Iz=z
+P"D03D8J"J"
+P4FF9FFJz"@r"r"
+5OLD6FFD7D8D7FFJzG"
+6OKD7FFJ#J"
+JFEFEOHD8J$F"J"
+7FEFEFED7OFFFJ&J$
+6FED7D7D7FEP*D9D8D8J&8%:$:,8%:$:$J$
+=FED7FEFEFEFEFEFEFEFEFEFEFEFEFED7FED7FED7FEFEFEFEFEFEFEFEFEFEFEFEFELFFFFD9J"8&8&9%8-8&8&8&J$
+:D7D7FED7D7D7D7D7D7D7FED7D7D7FEFED7D7D7FED7D7D7FED7D7D7D7D7D7D7FEFED7D7D7FEFED7D7D7FEO!D9D8D8J$J$9&8&J$
+EFEFEFE9FEFEFED7FEFEFED7D7FEFEFED7JFFFFD9J"?%J%:%9%J$
+:FEFED7D7D78FED7D7D7D7D7D7FED7D7D7FEO"D9D8D8J"<"J$
+O9FEFEMFFFFD9J&8%9-8%9%9-8&J$
+6D7FEFEFED7FEFEFEFED7FEFEFED7FEFED7FEFEFED7D7FEFEFEFEFEFEFED7FEFEFED7FED7D7FEFEFED7D7FEFEFED7O#D9D8D8J$9%:u:$9%:&8$:$J$
+7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7IFFFFD9J$
+PID9D8D8J%J#u
+O%FEFEFED7O5FFFFD8J$J"B"
+O%D7D7D7O7D8D8Jz
+P>/D7JZ
+P>/J"
+PLD8J$:$<"Jv"
+EFEFEFEFEFEFEFEO8D9D8J&@#;#="
+6FEFEFEFEFED7D7D7D7D7J'
+6D7FED7D7D7FEJ%G$;$:,8%:$:$
+>FEFEFEFEFEFEFEFEFEFEFEFEFED7FED7FED7FEFEFEFEFEFEFEFEFEFEFEFEFEJ&F#;&8-8&8&8&
+>D7D7D7D7FED7D7FED7D7D7FEFED7D7D7FED7D7D7FED7D7D7D7D7D7D7FEFED7D7D7FEFED7D7D7FEJ$J&G$9&8&
+?FEFEFE8D7FEFEFED7FEFEFED7FEFEFED7D7FEFEFED7J%J%F%:%9%
+>FED7D7D79D7D7D7FEFED7D7D7D7D7D7FED7D7D7FEJ"J"<"
+O,FE;FEFEJ'858&8%9%9-8&
+6FEFEFEFEFED7:D7FEFEFED7FED7FEFEFEFEFEFED7FEFEFEFEFEFED7FEFEFEFEFED7FEFEFED7D7FEFEFEFEFEFEFED7FEFEFED7FED7D7FEFEFED7D7FEFEFED7J&:z9$:$9%:&8$:$
+6D7D7D7D7D79D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7
+J%
+O4FEFEFED7J$
+O4D7D7D7Jz
+6OKD5Jz
+5OLD1
+J#>"@#J#
+<FEFEFEFEFE>FEFEJ$8"?"@"J"
+7FEFEFED1D1D1?D1J&
+6FED1D1D1FEJ#9$;$<+8$:$:$
+?FEFEFEFEFEFEFEFEFEFED1FEFEFED1FEFEFEFEFEFEFEFEFEFEFEFEJ"9%8#;&:28&8%
+:D1FED1D1FED1D1FED1D1D1FEFED1D1D1D1FED1D1D1FED1D1FED1D1D1FEFED1D1D1FEFED1D1D1J"F"9#<";$:$
+>D1D1FED1FEFEFEFEFEFEFEJ"J#B%9%
+:FE8D1FED1D1D1D1D1D1D1D1J":#9&<"<"
+O!FED1FED1FED1FED1FEFEJ48(9$>&8&8'
+6D1FEFEFED1D1FEFEFED1FEFEFED1FEFEFEFEFED1FEFEFED1D1FED1FEFED1FEFEFED1D1FEFEFED1D1FEFEFED1FEJ$8x9$8#9#8$:$:$:&
+7D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1
+
+
+
+Jz
+5OLD6Jz
+6OKD7J#
+CFEFEJ%>"
+7FEFEFEFED7J%
+7D7D7FED7J$;#8&:$:$8&:,8%:$:$
+>FEFEFEFEFEFED7FEFEFEFEFEFEFEFEFEFED7FEFEFEFEFEFED7FED7FED7FEFEFEFEFEFEFEFEFEFEFEFEFEJ&9,8&8-8-8&8&8&
+=FED7D7D7FEFED7D7FED7D7FEFED7D7FEFED7D7D7FEFED7D7D7FED7D7FEFED7D7FEFED7D7D7FED7D7D7FED7D7D7D7D7D7D7FEFED7D7D7FEFED7D7D7FEJ"<";&@"J$9&8&
+ED7D7D7FEFEFED7D74FEFEFED7FEFEFED7D7FEFEFED7J"J%J%:%9%
+6FE<D7D7D7FE>FED7D7D7D7D7D7FED7D7D7FEJ"J"<"
+O$FEIFEFEJ%919(8*9'9%9-8&
+6D7FEFED7D7FEFEFED7D7FEFEFED7FEFEFEFEFEFEFED7D7FEFEFED7D7FEFEFED7D7FEFEFEFED7D7FEFEFEFEFEFEFED7FEFEFED7FED7D7FEFEFED7D7FEFEFED7J#;$8u8#8$:$8$8#8$9%:&8$:$
+7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7D7
+J%
+O:FEFEFED7J$
+O:D7D7D7Jz
+6OKD5Jz
+5OLD1
+J"
+OCFEJ&H"J"
+6FEFEFEFEFEFECD1J'
+6D1FED1D1FEFEJ"8#8)9)8#8&9$8,9&:$
+:D1FEFEFEFED1FED1FEFEFEFEFEFEFEFED1FEFEFEFEFED1FEFEFEFEFEFEFEFEFED1FEFEFED1FEFEFEFED1FEFEFEFEFEFEJ"8"9"8'8(9"9&81:'8&
+:FED1D1D1FEFED1D1FED1FED1D1D1D1D1D1D1FED1D1D1FED1D1D1FED1D1FED1D1D1FED1D1D1D1D1FEFED1D1FEFED1D1D1FEJ%@"J$H"<$
+8FEFEFED1D1;FEFEFED1FEFEFEJ$J%8&G%
+8D1D1D1GD1D1D1D1D1FED1FED1D1D1D1D1J"I":"J"
+O#FEFEFE6FEJ%:*9"829&9$9*9(
+6FEFEFEFED1FEFEFED1FEFEFEFEFED1FEFEFED1D1D1FEFEFED1FED1FEFEFEFED1FEFEFED1D1FED1FEFEFEFEFED1FEFEFEFED1D1FEFEFED1J%;s8#9$9u:$;":t8#8$
+6D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1
+Jv
+P@D8J"
+P?D8Jz
+P>/D7
+
+J&
+O FEFED1FEFEJ%I"8"
+7FEFEFEFED1D1J%
+6FED1D1D1J"8%8&:$:$8#8#8&
+:D1FEFEFEFEFED1FEFEFEFEFEFEFEFEFEFEFEFEFEFED1FEFEFEJ#:-8%:'9"9&
+7FEFED1D1D1D1FED1D1FEFED1D1FEFED1D1D1D1D1D1FED1D1D1D1FED1D1D1J&9$:"
+6D1D1FEFEFEFEFEFED1J#9%
+8D1D1FED1D1D1J"
+6FEJ%8*9/8,
+7FEFEFED1D1FEFEFED1FEFEFEFEFED1D1FEFEFED1FEFED1FEFEFED1D1FEFEFED1FED1FEFEFEFEJ%:s8#8u:u
+6D1D1D1D1D1D1D1D1D1
+
+
+
+
+
+JZ
+P>/J$J"C"
+7FEFEFEP$D7D8J&Jt$
+6FED1D1D1FEP&D9D8D8D7J$:$:$:$:,8%:$:$J$
+>FEFEFEFEFEFEFEFEFEFEFEFEFEFEFED1FED1FED1FEFEFEFEFEFEFEFEFEFEFEFEFEBD7FFFFJ"8&8&8&8&8-8&8&8&J$
+:D1FED1D1D1FEFED1D1D1FEFED1D1D1FEFED1D1D1FEFED1D1D1FED1D1D1FED1D1D1D1D1D1D1FEFED1D1D1FEFED1D1D1FEKD8D8D7J#F&9$H$9&8&J$
+9FEFED1FEFEFED1FEFEFEFEFEFED1FEFEFED1D1FEFEFED1BD7FFFFJ"H%9%F%:%9%J$
+9D1D1D1D1FED1D1D1D1FED1D1D1D1D1D1FED1D1D1FEJD8D8D7J"@"J"<"J$
+KFEFE7FEFEGD7FFFFJ&8&8&8&8&8%9%9-8&J$
+6D1FEFEFED1D1FEFEFED1D1FEFEFED1D1FEFEFED1D1FEFEFED1D1FEFEFEFEFEFEFED1FEFEFED1FED1D1FEFEFED1D1FEFEFED1ID8D8D7J$:$:$:$:$:$9%:&8$:$J$
+7D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1ED7FFFFJ$
+PFD8D8D7J%J$
+O,FEFEFED1O3D7FFD8J$J"
+O,D1D1D1O8D7J"
+PDD7J"
+PFD7JZAZ
+5OL/J"J"
+4FFP(FFIz=z
+P"D13D9
+Gz
+P&D9
+
+
+
+
+
+Iz
+P"D8J"
+P4FFJy#Z&x"
+5D7FFD7O*D7D7D7FFFFD7FFJ$J";#
+AFFFFD8O*D8FFFFJ%:z">#
+?FFFFFFD8O&D9D8FFFFJ#8"J#8#
+=FFFFD9O2D9D9FFFFJ#8#J#8#
+;FFFFD9D9O5D9D9FFFFJ#8#J#8#
+9FFFFD9D9O9D9D9FFFFJ#8#J#8#
+7FFFFD9D9O=D9D9FFFFJ'J&
+5D8D8D8D8D9D9OAD9D8D8D8D8J#8#J"9"
+5D7D7D8D8OAD8D7J#8#J#8#
+7D7D7D8D8O=D8D8D7D7J#8#J#8#
+9D7D7D8D8O9D8D8D7D7'J#8#J#8#J&
+F7F7F7F7F7F75D7D7D8D8O5D8D8D7D7MF7F7F7F7F7'J#8"J#8#J'
+F6F6F6F6F6F67D7D7D8O2D8D8D7D7O!F6F6F6F6F6F68%J#<z?#J&
+F9F9F9F99D7D7O&D8D7D7O$F9F9F9F9F7J#9"J$
+AD7D7D8O,D8D7D7JZ
+5OLJ"
+4FFIz
+P"D9
+
+
+
+
+
+
+
+
+
+
+=z"z"z
+0F6F7P1F6F71F6<z8z8z
+1F9P0F91F9
+
+
+7z8z8z
+6F7P0F75F7"J"J"
+F77F7P1F7
+ENDBITMAP
+%%EndBinary
+80.29 166 287.29 256 R
+7 X
+V
+4 8 Q
+0 X
+(scrolledlistbox .slb -vscrollmode static \134) 80.29 250.67 T
+( -hscrollmode dynamic -selection SelProc \134) 80.29 240.67 T
+( -items {Crabgrass Dallisgrass Nutsedge} \134) 80.29 230.67 T
+( -scrollmargin 5 -labelpos n\134) 80.29 220.67 T
+( -labeltext \322Weeds\323) 80.29 210.67 T
+(pack .slb -padx 10 -pady 10) 80.29 200.67 T
+(.slb insert 2 Sandbur Goosegrass) 80.29 180.67 T
+(.slb insert end Chickweed Johnsongrass) 80.29 170.67 T
+0 10 Q
+(FIGURE 23) 128.5 146.89 T
+1 F
+( - Scrolledlistbox) 179.89 146.89 T
+0 0 612 792 C
+0 12 Q
+0 X
+0 0 0 1 0 0 0 K
+(Scr) 396.95 712 T
+(olledtext) 414.06 712 T
+1 10 Q
+-0.28 (The Scrolledtext widget provides all the functionality of) 315 693.33 P
+(the standard Tk text widget along with scrollbar and) 315 681.33 T
+(label control. The set of methods has been extended to) 315 669.33 T
+(include import and export \336le capabilities.) 315 657.33 T
+0 12 Q
+(Scr) 391.28 395 T
+(olledframe) 408.4 395 T
+1 10 Q
+(The Scrolledframe combines the functionality of scroll-) 315 376.33 T
+(ing with that of a typical frame widget to implement a) 315 364.33 T
+-0.13 (clipable viewing area whose visible region may be mod-) 315 352.33 P
+-0.49 (i\336ed with the scrollbars. This enables the construction of) 315 340.33 P
+(visually lar) 315 328.33 T
+(ger areas than which could normally be dis-) 359.54 328.33 T
+-0.34 (played, containing a heterogenous mix of widgets. Once) 315 316.33 P
+-0.49 (created, the Scrolledframe child site can be accessed and) 315 304.33 P
+(\336lled with widgets.) 315 292.33 T
+0 12 Q
+(Scr) 389.27 261 T
+(olledcanvas) 406.39 261 T
+1 10 Q
+(The Scrolledcanvas applies scrollbars and display) 315 242.33 T
+-0.25 (options to a standard Tk canvas widget. All the standard) 315 230.33 P
+-0.17 (canvas commands and options have been maintained. A) 315 218.33 P
+-0.46 (new option, autoresize, has been added which allows the) 315 206.33 P
+(user to engage automatic resizing of the scroll region to) 315 194.33 T
+(be the bounding box covering all the items. The region) 315 182.33 T
+(is adjusted continuously as items are created and) 315 170.33 T
+(destroyed via the canvas commands, ef) 315 158.33 T
+(fecting the dis-) 471.45 158.33 T
+(play of the scrollbars.) 315 146.33 T
+315 423 540 654 C
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+315 447 540 636 R
+7 X
+0 0 0 1 0 0 0 K
+V
+0.5 H
+2 Z
+0 X
+N
+%%BeginBinary: 17963
+503 189 201.2 75.6 0 324 546
+/red <
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000096FB7DFFCF8AFFE79AFF2CAEB6CF71E7
+A24DF70055BE928AB2D3FF0055F7DB7DB2002CFF6120822C455D4571FF0000FF
+> store
+/green <
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000096FB6DFFB67DFFCF8AE78AEFEF0071E7
+A24DF70055BE827530B6FFFF69DFDB7DB2004D00B641DF4D829E4582FF0000FF
+> store
+/blue <
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000009AFF5DDF9E69FBB275C755EFB60071E7
+A24DF77D55BE9265618EE3002CB2DB7DB28A4D00FF59E351B6A2FF9200FF00FF
+> store
+ BEGINBITMAPCOLORc
+z"z"z"
+7F6F7WHF6F77F6F7J"
+XIF78z8z8z
+5F9WGF95F9
+
+
+<z"
+X>F7F6=z"z"z"z
+0F6F7W7F6F70F6F70F6>z8z8z8z
+/F9W6F9/F9/F9
+JrJ$<s8#8$
+R,FEO%FEFEFEFEFEFEFEFEFEJ"8&J">"8$>"Js"
+R,F9F9F9F9FEFEO$F9F9F9F9F9F9R5F6F7J"9#Jr
+SGF9F9F9R9F9J%:%8r*8$9'8#D"9$?$
+R6FEFEFEFEFEFEFEFEFEF9FEFEFEFEF9FEFEFEFEFEFEFEFEFEF9FEFEFEFEFEFEFEFEFEFEFEAs"J$9%8%8'9"8/8"8&A#8$?'J$
+F6F7QKFEFEF9F9F9FEFEFEF9F9F9FEF9F9F9FEF9F9F9F9F9FEF9FEFEFEF9FEFEFEF9F9FEFEFEFEF9FEFEFEF9F9F9FEFEFEF9FEFEQKF6F6F7BrJ%9$;%8)9%9$<$8$A#G"J"
+F9QJFEFEFEF9F9FEFEFEFEFEF9FEFEFEF9F9F9FEFEFEF9FEF9F9F9F9F9F9F9F9F9F9F9F9FER F9AsJ$9%:"9$9"J"E%J#
+F7QJF9F9F9FEFEF9F9F9FEF9F9FELF9F9F9F9F9QKF7F7AtJ":%8%9):$A$J%J$
+F9R$FEFEF9F9F9FEF9F9F9F9FEFEF9F9FEFEF9FEF9FEFEF9FE=FEF9FEFEQKF9F9F9J"8";%8"8%8%B*8"8&8";"8";"8$8)
+R,FEFEF9FEFEF9FEFEFEFEF9FEFEFEF9F9F9FEFEFEF9F9F9FEFEF9F9FEFEF9FEFEFEFEFEF9FEFEF9F9F9FEFEFEF9J%<v8%:#8#;$9%:';%;t9$Js
+R,F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9R,F7Jt
+X7F9
+>z8z8z8z
+/F7W6F7/F7/F7sF"J"F"F&
+F7F7W7F7F7F7F7F7F7F7(z'
+F6F6F6F6F6F6F7X=D9F6F6F6F6F6F68%J&
+F9F9F9F9X?F9F9F9F9F7
+
+
+
+
+
+
+
+
+
+
+
+
+J#>#A#J#
+RAFEFEFEFEFEFEKFEFE
+J'8"8"8%;'9%9%9%8#8#8#8#
+RBD9D9FEFEFEFEFEFEFEFEFEFED9FEFED9FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEJ"8)8)8":5B%
+R@FEFEFED9D9FEFED9D9D9D9FEFED9D9FEFEFE9FED9FEFED9FEFED9D9FEFED9FEFED9D9FEFED9FEFED9D9FEFEFEFED9FEJ#=":#=%9):$:"
+S%D9D9D9D9D9FED9D9D9FED9D9D9D9D9FEFEFEFED9D9J"9#G"?$9&8&
+RAD9FEFED9FEFEFED9D9FEFEFED9D9FEFEFEJ%J%;"8"9"8"
+RED9D9D9D98FEFED9D9D9FED9FEJ"=#;":%;"A%9%:);"
+R?FEFEFEFEFEFED9FEFEFEFED9D9FEFED9D9D9FEFED9D9FEFED9FEJ'8+=5B%
+RCD9FEFEFEFED9D9FEFED9D9FEFEFEFED99D9FEFED9D9D9FEFEFED9FEFED9FEFEFEFED9D9D9FEFEFEFED9D9FEFED9J#9%:#8%8#;#9v9%:#8#:&
+R?D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9
+
+J#
+S,D9D9
+
+
+Gz
+W=D1
+Iz=z
+W9D03D8J"J"
+WKFF9FFJz"@r"r"
+5W5D1FFD7D8D7FFJ"
+X-FFJ$J":&A"J#:"J$J"9$J":#J"E$:$J"
+9FEFEFEGFEFEFEFEFEFEFEP4FEFEFEO3FEFEFE@FEFEFEFE<FEFEFE5FEFEFEFEFEFEFEO@D8J%9"J"A#<$@#B$J(wC";"J"J$J#8%9"J#:"J#E#;#J"
+8FED1D1D1FE5FEFEFED1D1D1FEFEFEFEFEO4FEFEFEFEFEFED1FED1D1:FEEFED1D1@FED1FED1D1D1FE7FED1D15FED1D1D1D1D1O>FFJ#;"8#?#B#J&9-J$
+O3D1D1D1FED1D1D1D1D1O5D1FED1D1D1D1D1FED1D1FED1FED1D1FEFET)D9D8D8J&8,@&J$8&:$8&8-:$8#8#9$B"D"A$9$:&9$:$9&9$9.A#:#:$8&:$<#8&8,C#9$:$8(:)8#8#J$
+7FEFEFEFEFEFEFEFEFEFED1FED1FEFEFEFEFEFEFEFEMFED1FEFED1FEFEFEFEFEFEFED1FEFEFEFEFEFED1FEFEFEFEFEFED1FEFEFEFEFEFEFEFEFEFEFEFED1FEFEFEFEFEFEFED1FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFED1FEFEFED1FEFEFED1FEFEFEFED1FEFEFEFEFEFEFEFED1FEFEFEFEFED1FEFEFEFEFEFEFEFEFEFED1FED1FEFEFEFED1FEFEFEFEFEFEFEFEFED1FEFEFEFED1D1FED1FEFEFEFEFEFEFEOHFFFFD9J&8-:":&:"J"C"@'858(9"9&@"8$;":"@%9#;&8&8&8&8&8.9"B%8-8&?&8-:"A%9.=)9"J$
+7D1FED1D1D1D1FED1D1D1D1D1FED1D1D1FEFED1D1FED1D1FE4FEFED1FEFED1D1FE:FED1D1D1FED1D1FEFED1D1FED1D1FED1D1D1FED1D1FED1FED1FEFED1D1D1FED1D1D1FED1D1D1FEFED1D1D1D1FEFED1D1D1D1D1D1FED1D1D1FED1D1D1FEFED1D1D1FED1FED1D1D1FED1D1D1FED1FED1D1D1D1D1FED1D1D1FED1FEFED1D1FEFED1D1D1FED1D1FED1FED1FEFED1D1D1FED1FED1D1D1D1FED1D1D1D1D1FED1D1D1FEFEFED1D1D1FED1D1D1FED1D1FED1D1D1FED1D1FEFED1D1FED1D1D1OMD9D8D8J";$;"J"C":&9"C"J&@"C%J$="J"<#:"J$;#J"<#A$B#:"J$
+O D1FED1FED14D1D1FEFEFEFEFED1D1AD1FEFEFED1D1FEFEFED1?FEFEFED1@D1FED1D14FEFEFEFED1:D1FED1FEFEFEFED1D1P#FFFFD9J$I#J$J&J%A"B$J%J&J%J%8&J$
+O&D1D1D1FED19D1D1D18D1FED1FED18D1D1D1FED1D1D1D1@D1D1D1D1>D1FED1FED1FD1D1D1D1O&D1D1D1D1D1FED1FED1P4D9D8D8J"J"J"J"<"="G"B#J"9#F"F#E":";#J$
+CFEP"FE9FEO4FEFEFEFEFED1=FEFED1FEFED1FEFEFED1P(FFFFD9J%:&8%:"C":&A":&:"9+9,9"8$8";(8->%:+A-8%9&8&9,8%:$;"@0;(?%:&8%:"A-9$?$95J$
+7FEFEFEFED1FEFEFED1FEFEFED1FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFED1FEFEFEFEFEFEFED1D1FEFEFED1D1FEFEFEFED1FED1FEFED1D1FEFEFED1D1FEFEFED1FED1D1FEFEFED1FEFEFEFEFEFEFEFEFED1FEFEFEFED1FEFEFED1FED1FEFEFEFEFEFEFEFEFED1FEFEFED1D1FEFEFED1D1FEFEFED1D1D1FEFEFED1FEFEFEFED1FED1FEFEFEFED1FEFEFED1D1FEFEFED1D1FEFED1D1FEFEFED1FEFEFEFED1FEFEFED1FEFEFED1FED1FEFEFED1FED1D1FEFEFED1D1FED1FEFEFE6FED1D1FEFEFED1FED1FEFEFEFEFEFED1FEFEFEFEFEFEO?D9D8D8J%;$9$;"C":&:"<":&:"9u8#8$8$8#=r8$:&8$?%:uBv8%:$:$;$9$9%B":#:r8$8r8$9#;%;$9$;":#<&8$;":#:$8#8zJ$
+7D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1FED1D1D1D1D1D1D1D1D1FED1D1D1D1D1D1D1D1D1D1D1D1FED1D1D1D1D1D1D1D1D1D1FED1D1D1D1D1D13D1O6FFFFD9J"J"J"J"J$
+SFD1BD1BD1;D1P3D9D8D8J$J$J$J$J#u
+DFEFEFEOKFEFED1P?FEFED1O4FEFEFEQ#FFFFD8J$J#J#J$J"B"
+DD1D1D1OKD1D1P@D1D1O5D1D1D1Q$D8D8J"J#J";$B"J"J#J":$A$<"J"C":#J"E$:$Jz
+HFE4FEFEGFEFEFEFEFE<FE4FEFEO FEFEFEFEFEFEFEFEOAFEFEFEFE5FEFEFEFEFEFEFEO8/D7J"J"J#;&?#A#9#A"J"J":#B#="B"J#B#:"J#E#;#
+HD14D1FFEFEFED1D1D1FEFEFEFEFEFEFED14D1O!D1D1D1D1D1D1FEO3FED1FED1D15FED1D1D1D1D1J#I#A(
+P(D1D1D1D1D1FEFED1FEFED1J&9%9%:$9&9$:$8&?(J%9%:$9&9$:$8&:$?&9%9$J$;$9&@$:$9.8$9&B#B#9$:$8(:)8#8#
+6FEFEFED1FEFEFEFEFEFEFEFEFEFEFEFEFED1FEFEFEFEFEFEFEFEFEFEFEFED1FEFEFEFED1FEFEFEO$FEFEFEFEFEFEFEFEFEFEFEFED1FEFEFEFEFEFEFEFEFEFEFEFED1FEFEFEFEFEFEFED1FEFEFEFEFEFEFEFE9FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFED1FEFEFED1FEFEFED1FEFEFEFEFEFEFED1FEFEFEFED1FED1FEFEFEFEFEFEFEFEFED1FEFEFEFED1D1FED1FEFEFEFEFEFEFEJ'8&8$:&8&8%9-:"9#9#9"A&:"C";$9&8$:&8&8%9-8&>'8&8#J#;&8&?&8&848&:"C"A%9.=)9"
+6D1FED1FED1FED1D1D1D1FED1D1D1FED1D1D1FED1FED1D1D1FED1D1D1FED1D1D1FED1D1FED1FED1FEFED1D1D1D1FED1FEFEFED1FEFED1FED1D1D1D1D1FED1D1D1FED1D1D1FED1FED1D1D1FED1D1D1FED1D1D1FED1D1FED1FED1FEFED1D1D1FED1FED1FED1FED1D1D1D1FED1D1:D1D1FED1D1D1FED1FED1D1D1FED1D1D1FEFED1D1D1FED1FED1D1D1D1D1FED1D1D1FED1D1FED1D1D1FED1FED1D1D1FEFEFED1D1D1FED1D1D1FED1D1FED1D1D1FED1D1FEFED1D1FED1D1D1J$J";$;"A&:"C"B$J$J&F&9$H$B"<#;"<#A$B#:"
+?FEFEFEO!D1D1FED1D1FED1D1D1FED1D1FEFEFEO5FEFEFEFD1FEFEFED1D1FEFEFED1FEFEFEFEFEFED1FED1D1FED1FEFEFEFED1D1J%J$J%J%J%G%9%?&9%J%8&
+>FED1D1D1O'FED1FEO&FED1D1D1O4FED1D1D1GD1D1D1FED1D1D1FED1D1D1D1D1FED1FED1D1D1D1D1MD1D1D1D1D1FED1FED1J&J"J"A">"@"A">"G#B#E":";#
+OHFED1D1D1FEO D1P8FEFEFEFEFEFEFED1FED1FEFEFED1J";)>&8%9/;"9"9";"9":&8&:":&:"9/>&8%9/;(>";/8'>-8&9&>&8&8%:$9&8%;"C"A-9$?$95
+6FEFED1D1FEFEFED1FED1FEFEFED1FEFEFEFED1FEFEFED1FED1D1FEFEFED1D1FEFEFEFEFEFEFEFEFEFEFED1FEFEFED1FEFEFEFEFEFEFEFEFEFED1FEFEFED1D1FEFEFED1FED1FEFEFED1FEFEFEFED1FEFEFED1FED1D1FEFEFED1D1FEFED1D1FEFEFED1FEFED1D1FEFEFED1FED1FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFED1FEFEFEFEFED1FEFEFED1D1FEFEFED1D1FEFEFED1D1FEFEFED1FEFEFEFED1FED1D1FEFEFED1FEFEFEFEFEFED1FEFEFED1FED1D1FEFEFED1D1FED1FEFEFE6FED1D1FEFEFED1FED1FEFEFEFEFEFED1FEFEFEFEFEFEJr8&?$9%:&8$8r9"9#9#9":&9$;":&:"9r8&?$9%:&8$8r8$?r8v8'>w9$;$@$:$9%;";$9%;":#=":#<&8$;":#:$8#8z
+6D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1FED1D1FED1D1D1D1D1D1D1D1D1D1FED1D1D1D1D1D13D1J"C"J"
+U"D1D1;D1J%J%
+EFEFEFED1P0FEFEFED1J$J$
+ED1D1D1P1D1D1D1J";$B"J$J"C":#J"E$:$
+O5FEFEFEFEFEO FEFEFEO,FEFEFEFE5FEFEFEFEFEFEFEJ"A#;&?#A#9#J#J#B#:"J#E#;#
+O'FEFEFEFED1D1D1FEFEFEFEFEFEFE=D1D1O,FED1FED1D15FED1D1D1D1D1J#I#A(
+O3D1D1D1D1D1FEFED1FEFED1J&9%8&@&J%8&8#8#8%F&9%:&8$:$C#B#9$:$8(:)8#8#
+6FEFEFED1FEFEFEFEFEFED1FEFEFEFEFEFEFEFEO%FEFEFEFEFED1FEFEFEFEFEFEFEFEFEFEFEFED1FEFEFEFEFEFEFEFEFEFED1FEFEFEFEFEFEFEFED1FED1FEFEFEFEFEFEFEFEFED1FEFEFEFED1D1FED1FEFEFEFEFEFEFEJ'8-:":&:"J"C";$9/9"9&E'8&8-8&:"C"A%9.=)9"
+6D1FED1FED1FED1D1D1D1FED1D1FEFED1D1FEFED1D1FED1D1FE4FEFED1FED1D1D1D1D1FED1D1FEFED1D1FED1D1D1D1D1D1D1FED1FED1D1D1FED1D1D1D1FEFED1D1D1FED1D1FED1D1D1FEFED1D1D1FEFEFEFED1D1D1FED1D1D1FED1D1FED1D1D1FED1D1FEFED1D1FED1D1D1J$:"=";$;"A%;"C"B$:"C$J$A$9&:"<#;"<#A$B#:"
+?FEFEFED1D1FED1FED1D1FEFEFED1D1FEFEFED1FEFEFE9FEFEFEFEFEFED1FEFEFED1D1FED1D1FED1FEFEFEFED1D1J%H$H$J%G%J%A%9%J%8&
+>FED1D1D1D1D1D1D1D1D1?FED1D1D1FED1D1D18FED1D1D1D1D1D1D1D1D1D1FEFD1D1D1D1D1FED1FED1J#J"J"8"D#B#E":";#
+O=FED19D1O9FEFEFED1FED1FEFEFED1J";,9"9"C":&8%;":&:"9295?%8,9&8&:"C"A-9$?$95
+6FEFED1D1FEFEFED1FEFEFEFEFEFEFEFEFEFEFEFEFEFEFED1FEFEFEFEFEFEFEFEFEFED1FEFEFED1D1FEFEFED1FEFEFEFE6FED1D1FEFEFED1FED1D1FEFEFED1FED1FEFEFEFEFEFEFEFEFED1D1FEFEFED1FED1D1FEFEFED1FEFEFED1D1FEFEFED1FEFED1FEFEFED1FED1D1FEFEFED1D1FED1FEFEFE6FED1D1FEFEFED1FED1FEFEFEFEFEFED1FEFEFEFEFEFEJr8s8#9"C":&8$<":&:"9r8s8#8&8w?$:&8$:$:$;":#=":#<&8$;":#:$8#8z
+6D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1FED1D1FED1D1D1D1D1D1D1D1D1D1FED1D1D1D1D1D13D1J"C"J"
+R'D1D1;D1J$C%
+Q*FEFEFEFEFEFED1J$C$
+Q*D1D1D1D1D1D1J&9$:$A$J$J"J$>"F$I#
+O:FEFEFEFEFEFEFEFEFEFEFEFEFEFEP5FEFEFE@FEO"FEFEFEFEFEFEFEFEFEJ"J%8&8&?&J"J"F$J#J"F$?"E$J"
+O&FE4D1D1D1D1FED1D1D1FEFED1D1D1FEFED1D1D1FEFFEO)FEFED1D1@FED1>FEFED1D1D1FED1D14D1
+J(8#9$:$9&J(8#9$:$9&?%:$:$:$8#8)9&B#:#:$8&:$<#9(8#9$:$9&B#9$9$9&<#9$9%:$;#
+8FEFEFED1FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEO-FEFEFED1FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFED1FED1FEFEFEFEFEFEFEFEFED1FEFEFEFEFEFEFEFED1FEFEFEFEFED1FEFEFED1FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFED1FEFEFEFEFEFEFED1FEFEFEFED1FEFEFEFEFEFEFEFEFEFEFEFEJ(9"9&8&8&:"<";$I"C":(9"9&8&8&?&8&8&8(9"8'8&:"B%8-8&?(9"9&8&8&:"B%8#:'@%8&8&9%
+7FED1D1D1FED1D1D1FED1D1D1FEFED1D1D1FED1FED1D1D1FEFEFEFEFEFEFEFED1D1D1FED1D1D1FED1D1D1FEFED1D1D1FED1FED1D1D1D1D1D1D1FEFED1D1D1FEFED1D1D1FEFED1D1D1FED1D1D1D1FEFED1D1FED1FED1D1D1FEFED1D1FEFED1D1D1FED1D1FED1FED1FEFED1D1D1FEFED1D1D1FED1D1D1FED1D1D1FEFED1D1D1FED1FED1D1D1FED1D1D1FED1D1D1FEFED1D1FED1D1D1FED1D1D1D1FEFED1D1D1FEFED1D1FEJ$9&A"<":&H"C"I$9&G$="<"G"D"<#:"J$;#H$9&A"<#H"=#A$9&9"
+FFEFEFED1FEFEFED1D1D1D1D1D1D1FED1D1FEFEFED1FEFEFED1FEFEFED1D1D1D1FED1D14FEFEFEFED1FEFEFED1FEFEFED1D1FED1D1FED1FEFEFED1FEFEFED1D1J%9%J%9%F%J%J%9%J%:%
+FD1D1D1D1D1D1D1FEOBD1D1D1D1D1D1D1FEFED1D1D1OCD1D1D1D18D1D1D1D1D1D1D1FEO,FED1D1D1D1D1D1FEJ"8"A"D"J"8"A"I"<"J"?#J"9#J"8"A"?#J#H"
+IFEFEFEFEO.FEFEFEFEFE<FEFED1=FEFED16FEFEFEFED1:FED1FEJ%9-8&9&9"<"9'8&8&:":&:":%9-8&9&>-8&8&8*9"8&9"@0;(?%9-8&9&9"@'8*9"='85
+7D1FEFEFED1FEFEFED1FED1D1FEFEFED1D1FEFEFED1D1FEFEFED1FEFED1FEFEFEFED1D1FEFEFED1D1FEFEFED1FED1FEFEFED1FED1FEFEFED1FEFEFED1FED1D1FEFEFED1D1FEFEFED1D1FEFEFED1D1FEFEFED1FED1D1FEFEFED1D1FEFEFED1D1FEFEFED1D1FEFEFED1FEFEFEFEFED1FEFEFED1FEFEFEFED1FEFEFED1D1FEFEFED1D1FEFED1D1FEFEFED1D1FEFEFED1FEFEFED1FED1D1FEFEFED1D1FEFEFED1D1FEFEFED1FEFED1FEFEFED1FEFEFEFEFED1FEFEFEFEFED1FEFEFED14D1FEFEFED1FED1D1FEFEFED1D1FEFEFED1FEFEFEJ$:&8$:$;$:"<":%:$:$;";$;";$:&8$:$;$@&8$:$:$:s8#9$:":#:r8$8r8$9#<$:&8$:$;$:":#:&9t8&:&:&8$8r
+8D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1FED1D1D1D1D1D1D1D1D1FED1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1FED1D1D1D1D1D1D1D1D1D1FED1D1D1D1D1D1D1D1D1D1D1D1D1D1D1J"J"J"J"
+R<D1BD1O"D1;D1J%J%J%
+8FEFEFED1OIFEFEFED1PLFEFEFED1J$J$J$JZ
+8D1D1D1OJD1D1D1PMD1D1D1R9/J#C$<$J";$:$B";$:$J$<$J$J$C$<$J$>"F$I#J"
+6FEFEFEFEFEFEFEFEO FEFEFEFEFEFEFEFEFEFEFEFEFEFEO-FEFEFEFEFEFEJFEFEFE@FEFEFEFEFEFEFEFEFEJFEFEFEFEFEFEFEFEFEO:D8J"D#<%G"J#;&8&?#;&8&>'J+<%G"J$J$D#<%G"J$?"E$J"Jv"
+6D1D1D1FED1D1D1FE:FEFEFED1D1D1FEFED1D1D1FEFEFEFED1D1D1FEFED1D1D1FEFEFEFED1FEFEDFEFEFED1FEFEFED1D1D1FED1D1D1FE7FED1D1@FED1D1D1D1FED1D1D1FE7FED1D1D1FED1D14D1O/D9D8J#J#J$8"J(
+P!D1D1:D1D19D1FED1D1DD1FED1D1D1FED1J&8#?&9$9&8&9$J#9%9&9$8&J&9$9&8&9$C#:#:$8&:$<#;&8#?&9$9&8&9$C#9$9$9&<#9$9%:$;#
+:FEFED1FEFEFEFEFEFEFEFEFEFEFEFEFED1FEFEFEFEFEFEFEFEFEFEFEO=FED1FEFEFEFEFED1FEFEFEFEFEFEFED1FEFEFE8FEFEFEFEFEFEFEFEFED1FEFEFEFEFEFEFEFEFEFEFEFED1FEFEFEFEFEFEFEFED1FEFEFEFEFED1FEFED1FEFEFEFEFEFEFEFEFEFEFEFEFED1FEFEFEFEFEFEFEFEFEFEFEFED1FEFEFEFEFEFEFED1FEFEFEFED1FEFEFEFEFEFEFEFEFEFEFEFEJ&9"@&8&8&8&8&:"<"J"J";#:&8&8-J&8&8&8&8&:"B%8-8&A&9"@&8&8&8&8&:"B%8#:'@%8&8&9%
+9FED1D1D1D1D1D1FED1D1D1FED1D1D1FED1FED1D1D1D1FED1D1D1FED1D1D1FEFEFE;FE;FEFED1D1D1D1D1FED1FED1D1D1FED1D1D1FED1D1FEFED1D1FE7D1FED1D1D1FED1D1D1FED1FED1D1D1D1FED1D1D1FED1D1D1FEFEFED1D1FEFED1D1D1FED1D1FED1FED1FEFED1D1D1FEFED1D1D1D1D1D1FED1D1D1FED1D1D1FED1FED1D1D1D1FED1D1D1FED1D1D1FEFED1D1D1FED1D1D1FEFED1D1FED1D1D1FED1D1D1D1FEFED1D1D1FEFED1D1FEJ#J$G&:"<"J"J"<";$A$:"J$G&:"<#:"J$;#:#J$G&:"<#H"=#A$9&9"
+8FED1:FEFEFED1FEFEFED1D1D1;D1;D1FEFEFEFEFEFEFED1BFEFEFED1FEFEFED1D1FED1D14FEFEFEFED1FED1:FEFEFED1FEFEFED1D1FED1D1FED1FEFEFED1FEFEFED1D1J#J%G%J$9%A%J%G%J%@#J%G%J%:%
+8D1FE:D1D1D1D1D1D1D1FEO;D1D1FEFED1D1D1D1D1D1D1FD1D1D1D1D1D1D1FEFD1D1D1D1D1FE:D1D1D1D1D1D1D1FEO%FED1D1D1D1D1D1FEJ#J"D$J#J"G$J"D$D#J"9#<#J"D$D#J#H"
+9D1FE<FEFED1FEOAD1FE4FEFED1FE5FEFED1FEFED1=FEFED1D1FE<FEFED1FEFED1:FED1FEJ"959&8%:,:"<":&8&8&:":&8&8&:"9$9.9*9">&8,9&8%:,:"@0;(>"959&8%:,:"@'8*9"='85
+6FE6D1FEFED1D1FEFEFED1FED1FEFEFEFEFEFED1FEFEFEFED1FEFEFED1FEFEFEFED1FEFEFED1D1D1FEFEFED1FEFEFEFEFEFEFED1FEFEFED1D1FEFEFED1FEFEFEFEFEFED1FEFEFED1D1FEFEFED1FEFEFEFEFED1D1FEFEFED1FED1FEFEFEFED1FEFEFED1D1FEFEFEFED1FEFEFED1FEFEFEFEFEFED1FEFEFEFED1FEFEFED1FEFEFEFED1FEFEFED1D1D1FEFEFED1FEFEFEFED1FEFEFED1D1FEFEFED1D1FEFED1D1FEFEFED1FE6D1FEFED1D1FEFEFED1FED1FEFEFEFEFEFED1FEFEFEFED1FEFEFED1FEFEFEFED1FEFEFED1D1D1FEFEFED1FEFED1FEFEFED1FEFEFEFEFED1FEFEFEFEFED1FEFEFED14D1FEFEFED1FED1D1FEFEFED1D1FEFEFED1FEFEFEJ#9#8z:$9%;$9$;"<":&9$:$;":&9$:$;"9$8#8u:$8$8#?$9v:$9%;$9$;":#:r8$8r8$9#:#9#8z:$9%;$9$;":#:&9t8&:&:&8$8r
+6D1D1D1D11D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1FED1D1D1D1D1D1D1D1D1FED1D1D1D1D11D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1FED1D1D1D1D1D1D1D1D1D1FED1D1D1D1D1D1D1D1D1D1D1D1D1D1D1J"J"J"J"
+S1D1BD1O7D1;D1Jv
+X)D8J"
+X(D8J$<$J";$;"C";$:$J#J$<$J$J"E$<$J$>"F$I#Jz
+EFEFEFEFEFEFEO FEFEFEFEFEFEFEFEFEFEFEFE>FEFE4FEFEFEFEFEFEJFEFEFE@FEFEFEFEFEFEFEJFEFEFEFEFEFEFEFEFEO3/D7J#<%G"J#;&8#B#;&8&>#9#D"C+<%G"J$J#E#<%G"J$?"E$J"JZ
+ED1D1FED1D1D1FE:FEFEFED1D1D1FEFEFEFEFEFED1D1D1FEFED1D1D1FEFEFEFEFED1FEFEFED1FEFEFED1D1D1FED1D1D1FE7FED1D1@FED1D1D1FED1D1D1FE7FED1D1D1FED1D14D1O4/J#B#B#J(J(J"C"
+P!D1D1D1D1D1D19D1FEFED1FEFED1<D1FED1D1D1FED1T!D7D8J&8#8#?&9$9&8&9$J%9&;#J&9$9&8&9$C#:#:$8&:$<)8#8#?&9$9&8&9$C#9$9$9&<#9$9%:$;#Jt$
+6FEFEFED1FEFEFEFEFEFEFEFEFEFEFEFEFEFED1FEFEFEFEFEFEFEFEFEFEFEOBFEFEFEFEFED1FEFEFEFEFE7FEFEFEFEFEFEFEFEFED1FEFEFEFEFEFEFEFEFEFEFEFED1FEFEFEFEFEFEFEFED1FEFEFEFEFED1D1FEFEFED1FEFEFEFEFEFEFEFEFEFEFEFEFEFED1FEFEFEFEFEFEFEFEFEFEFEFED1FEFEFEFEFEFEFED1FEFEFEFED1FEFEFEFEFEFEFEFEFEFEFEFEO3D9D8D8D7J)9"@&8&8&8&8&:"<"J"J";$9&8&:$J&8&8&8&8&:"B%8-8&>)9"@&8&8&8&8&:"B%8#:'@%8&8&9%J$
+6D1FED1FED1FED1D1D1D1FED1D1D1FED1D1D1FED1FED1D1D1D1FED1D1D1FED1D1D1FEFEFE;FE;FED1FED1D1D1D1D1FED1FED1D1D1FED1D17D1FED1D1D1FED1D1D1FED1FED1D1D1D1FED1D1D1FED1D1D1FEFEFED1D1FEFED1D1D1FED1D1FED1FED1FEFED1D1D1FED1FED1FED1FED1D1D1D1FED1D1D1FED1D1D1FED1FED1D1D1D1FED1D1D1FED1D1D1FEFED1D1D1FED1D1D1FEFED1D1FED1D1D1FED1D1D1D1FEFED1D1D1FEFED1D1FEO0D7FFFFJ$G&:"<"J"J"B$A#J$G&:"<#:"J$;#J$G&:"<#H"=#A$9&9"J$
+O&FEFEFED1FEFEFED1D1D1;D1;D1FEFEFEFED1AFEFEFED1FEFEFED1D1FED1D14FEFEFEFED1@FEFEFED1FEFEFED1D1FED1D1FED1FEFEFED1FEFEFED1D1O=D8D8D7J%G%J%A#J%G%J%J%G%J%:%J$
+O&D1D1D1D1D1D1D1FEOAFED1D1D1D1FEAD1D1D1D1D1D1D1FEFD1D1D1D1FD1D1D1D1D1D1D1FEO%FED1D1D1D1D1D1FEO8D7FFFFJ"D$J"J#A$J"D$D#J"9#J"D$D#J#H"J$
+O)FEFED1FEO@D14D1FEFED1FE5FEFED1FEFED1=FEFED1DFEFED1FEFED1:FED1FEODD8D8D7J";59&8%:,:"<":&8&8&:":&8&8&:"948"9$>&8,9&8%:,:"@0;(>";59&8%:,:"@'8*9"='85J$
+6FE4FED1D1FEFEFED1FED1FEFEFEFEFEFED1FEFEFEFED1FEFEFED1FEFEFEFED1FEFEFED1D1D1FEFEFED1FEFEFEFEFEFEFED1FEFEFED1FEFEFEFEFEFEFEFEFEFEFED1FEFEFED1D1FEFEFED1FEFEFEFED1FEFEFED1D1FEFEFED1FED1FEFEFEFEFED1FEFED1FEFEFED1FEFEFEFEFEFED1FEFEFEFED1FEFEFED1FEFEFEFED1FEFEFED1D1D1FEFEFED1FEFEFEFED1FEFEFED1D1FEFEFED1D1FEFED1D1FEFEFED1FE4FED1D1FEFEFED1FED1FEFEFEFEFEFED1FEFEFEFED1FEFEFED1FEFEFEFED1FEFEFED1D1D1FEFEFED1FEFED1FEFEFED1FEFEFEFEFED1FEFEFEFEFED1FEFEFED14D1FEFEFED1FED1D1FEFEFED1D1FEFEFED1FEFEFEO1D7FFFFJr8z:$9%;$9$;"<":&9$9&:":&9$:$;"9r8u8#9#?$9v:$9%;$9$;":#:r8$8r8$9#:r8z:$9%;$9$;":#:&9t8&:&:&8$8rJ$
+6D11D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1FED1D1D1D1D1D1D1D1D1FED1D11D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1FED1D1D1D1D1D1D1D1D1D1FED1D1D1D1D1D1D1D1D1D1D1D1D1D1D1O7D8D8D7J"J"J"J"J$
+S*D1BD1O7D1;D1P%D7FFFFJ$
+X/D8D8D7J$
+X,D7FFD8J"
+X0D7J"
+X-D7J"
+X/D7JZAZ
+5W5/J"J"
+4FFW?FFIz=z
+W9D13D9
+Gz
+W=D9
+
+
+
+Iz
+W9D8J"
+WKFFJy#Z$x"
+5D7FFD7VCD7FFFFD7FFJ$J"9#
+AFFFFD8VCD8FFFFJ%:z"<#
+?FFFFFFD8V?D9D8FFFFJ#8"J#8#
+=FFFFD9VID9D9FFFFJ#8#J#8#
+;FFFFD9D9VLD9D9FFFFJ#8#J#8#
+9FFFFD9D9W"D9D9FFFFJ#8#J#8#
+7FFFFD9D9W&D9D9FFFFJ'J&
+5D8D8D8D8D9D9W*D9D8D8D8D8J#8#J"9"
+5D7D7D8D8W*D8D7J#8#J#8#
+7D7D7D8D8W&D8D8D7D7J#8#J#8#
+9D7D7D8D8W"D8D8D7D7'J#8#J#8#J&
+F7F7F7F7F7F75D7D7D8D8VLD8D8D7D7MF7F7F7F7F7'J#8"J#8#J'
+F6F6F6F6F6F67D7D7D8VID8D8D7D7O!F6F6F6F6F6F68%J#<z=#J&
+F9F9F9F99D7D7V?D8D7D7O$F9F9F9F9F7J#9"J$
+AD7D7D8VCD8D7D7JZ
+5W5J"
+4FFIz
+W9D9
+
+
+
+
+
+
+
+
+
+
+=z"z"z
+0F6F7WHF6F71F6<z8z8z
+1F9WGF91F9
+
+
+7z8z8z
+6F7WGF75F7"J"J"
+F77F7WHF7
+ENDBITMAP
+%%EndBinary
+324 456 531 537 R
+7 X
+V
+4 8 Q
+0 X
+(scrolledtext .st -labelpos n \134) 324 531.67 T
+( -labeltext \322/etc/passwd\323 \134) 324 521.67 T
+( -vscrollmode static \134) 324 511.67 T
+( -hscrollmode static) 324 501.67 T
+(pack .st -padx 10 -pady 10 -f) 324 491.67 T
+(ill both \134) 463.2 491.67 T
+( -expand yes) 324 481.67 T
+(.st import /etc/passwd) 324 461.67 T
+0 10 Q
+(FIGURE 24) 376.64 431.17 T
+1 F
+( - Scrolledtext) 428.02 431.17 T
+0 0 612 792 C
+FMENDPAGE
+%%EndPage: "13" 13
+%%Page: "14" 14
+612 792 0 FMBEGINPAGE
+[0 0 0 1 0 0 0]
+[ 0 1 1 0 1 0 0]
+[ 1 0 1 0 0 1 0]
+[ 1 1 0 0 0 0 1]
+[ 1 0 0 0 0 1 1]
+[ 0 1 0 0 1 0 1]
+[ 0 0 1 0 1 1 0]
+ 7 FrameSetSepColors
+FrameNoSep
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+0 12 Q
+0 X
+0 0 0 1 0 0 0 K
+(Buttonbox) 157.49 272.29 T
+1 10 Q
+(The Buttonbox performs geometry management for) 72 253.62 T
+(Pushbutton instances. Public commands exist which) 72 241.62 T
+(enable the user to add new Pushbuttons, de\336ne the) 72 229.62 T
+(default, and control their display) 72 217.62 T
+(. Options enable the) 201.61 217.62 T
+(user to establish the orientation. This class is used to) 72 205.62 T
+(manage the buttons for all dialogs in the [incr W) 72 193.62 T
+(idgets]) 265.74 193.62 T
+(mega-widget set.) 72 181.62 T
+0 12 Q
+(Panedwindow) 148.49 150.29 T
+1 10 Q
+(The Panedwindow class is composed of panes, separa-) 72 125.62 T
+(tors, and sashes for adjustment of the separators. Each) 72 113.62 T
+(pane is a child site and the class provides a command) 72 101.62 T
+(which returns the paths for the sites. The user may \336ll) 72 89.62 T
+(them with further widget combinations.) 72 77.62 T
+72 298.29 297 720 C
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+72 324 297 715.57 R
+7 X
+0 0 0 1 0 0 0 K
+V
+0.5 H
+2 Z
+0 X
+N
+%%BeginBinary: 5902
+489 391 195.6 156.4 0 85.29 548.57
+/red <
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000096FB7DFFCF9AFFFF69FBB29AFF2CAEB6CF71E7
+A24DF70055BE928AB2D3FF00F7557DDBB2002CFF6120822C455D4571FF0000FF
+> store
+/green <
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000096FB6DFFB669F7AE86FFDF8AE78AEFEF0071E7
+A24DF70055BE827530B6FFFFDF697DDBB2004D00B641DF4D829E4582FF0000FF
+> store
+/blue <
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000009AFF5DDF9E71FFBA8EFFEF75C755EFB60071E7
+A24DF77D55BE9265618EE300B22C7DDBB28A4D00FF59E351B6A2FF9200FF00FF
+> store
+ BEGINBITMAPCOLORc
+z"z"z"
+7F4F5W:F4F57F4F5J"
+X;F58z8z8z
+5F8W9F85F8
+
+
+<z"
+X0F5F4=z"z"z"z
+0F4F5W)F4F50F4F50F4>z8z8z8z
+/F8W(F8/F8/F8
+J'J$8$C$8s
+R$FEFEFEFEF8FE6FEFEFEFEFEFEFEFEFEFEJ'J":"E":"8$Js"
+R#FEFEF8F8F8FE7F8F8F8F8F8F8F8REF4F5J"J"Jr
+R(F8O)F8REF8J#8"9$8'8$E$:#@"9,9'8#;$
+R%FEFEF8FEFEFEFEFEFEF8FEFEFEFEFEFEFEFEFEFEFEFEFEFEF8FEFEF8FEFEFEFEFEFEFEF8FEFEFEFEFEFEFEAs"J"9#8)8"8(A-=#8$8":%8"8)8'J$
+F4F5Q=F8FEFEFEFEFEF8FEFEF8F8FEFEFEFEF8FEFEFEFEFEFEF8FEFEF8FEFEFEF8FEFEFEF8F8F8FEF8F8FEFEF8FEF8FEFEFEF8FEFEFEFEFEF8FEFEQAF4F4F5BrJ#9"9%:$8$F";$=#=(="9">"J"
+F8Q?F8F8FEF8F8F8F8F8F8F8F8F8F8FEF8F8F8F8F8F8F8F8F8F8FEFEF8F8FEQDF8AsJ"8#J%E"?%I%J#
+F5Q>FEF8F8DF8F8F8F8F8FEFEF8F8F8F8F8F8QAF5F5AtJ">%?$E%9$J"I%J$
+F8Q>FEFEF8FEFEFEF8FEFEF8FEFEFEF8FE6FEFEF8FEFEQAF8F8F8J08"8*8$8/8$8";"8"8%8$8"9"9)
+R$F8FEFEFEFEF8F8F8F8FEFEFEF8F8FEFEF8F8FEFEFEF8F8F8FEFEF8FEFEF8F8F8FEFEFEF8F8F8F8FEFEF8FEF8FEFEFEFEF8FEFEF8FEF8FEFEFEFEF8F8F8FEFEFEF8J':$8%:$9t9$:v;%9z9$Js
+R#F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F83F8F8F8F8R"F5Jt
+X)F8
+>z8z8z8z
+/F5W(F5/F5/F5sF"J"F"F&
+F5F5W)F5F5F5F5F5F5F5(z$z'
+F4F4F4F4F4F4F5WGD8D9D9D93CFF4F4F4F4F4F48%J"J(
+F8F8F8F8WGFF5D0F4F8F8F8F8F5?z"<r"r"
+WCD9FFD1D8D1D0J$
+X+FFD8D8
+J"9"
+X*FFD8J"
+X,D9J(
+X)FFFFD9D9D9D8D8J"
+X(FFJ"9$
+X*D9D9D8D8J$;$
+X'FFFFD9D9D8D8
+J$=$
+X&FFFFD9D9D8D8Ju
+X'D8J#B"
+X%FFD8D8J"X"
+X%D1D1J"
+X2D8Jz9zJz9zDt"
+8QHCD3CF>QHCD3CFD9D8J"J"J"J"
+R1FF5D0R7FF5D0Jz"<r"r"Jz"<r"r"
+:QDCEFFD1D8D1D0AQDCEFFD1D8D1D0J$J$
+R=FFD8D8RKFFD8D8
+J"9"J"9"
+R<FFD8RIFFD8J"J"
+R>D9RMD9J(J(
+R;FFFFD9D9D9D8D8RGFFFFD9D9D9D8D8J"J"
+R:FFRMFFJ"9$J"9$
+R<D9D9D8D8RGD9D9D8D8J$;$J$;$
+R9FFFFD9D9D8D8RCFFFFD9D9D8D8
+J$=$J$=$
+R8FFFFD9D9D8D8RAFFFFD9D9D8D8JuJu
+R9D8RDD8J#B"J#B"
+R7FFD8D8R?FFD8D8J"X"J"X"
+R7D1D1R?D1D1J"J"
+RDD8RMD8Jt"Jt"
+R:D9D8RDD9D8
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JtJt
+R:D8RED8J"J"
+R9D8RMD8JZJZ
+R7/R?/J"C"J"C"Ft
+R7D1D8R?D1D8D8J#t$J#t$E"
+R8D1FFD9D8D8D1R@D1FFD9D8D8D1D8J"J"Jx
+R:FFRMFF9D1J">$J">$
+R9D1D8D8D1RBD1D8D8D1J"="J"="
+R;FFD1REFFD1J"<"J"<"
+R:D1D8RFD1D8J"9$J"9$
+R<FFD8D8D1RGFFD8D8D1J"J"
+R;D1RMD1J&J&
+R=FFD9D8D8D1RIFFD9D8D8D1J&J&
+R<D1FFD8D8D1RID1FFD8D8D1
+J$J$
+R=D1D8D1RKD1D8D1JZ=zJZ=z
+:QD/D0BQD/D0J"J"J"J"
+9FFQJD0O"FFQJD0Jz9zJz9z
+8QHD93D9>QHD93D9
+
+JzJz
+8QHCFO&QHCFJ"J"
+R1D0RMD0Jw"z#v"Jw"z#v"
+:D1FFQ*D1FFFFD1D0O)D1FFQ*D1FFFFD1D0J$Z8#J$Z8#
+DFFFFD8Q*FFFFO=FFFFD8Q*FFFFJ$J":"J$J":"
+CFFFFD8Q*D8FFO;FFFFD8Q*D8FFJ%:z"9&J%:z"9&
+AFFFFFFD9Q&D9D8D9D9FFFFFFO7FFFFFFD9Q&D9D8D9D9FFFFFFJ&J&J&J&
+?FFFFFFD9D9Q1D9D9FFFFFFO3FFFFFFD9D9Q1D9D9FFFFFFJ"8"J"8"J"8"J"8"
+>FFD9Q5D9FFO1FFD9Q5D9FFJ&J&J&J&
+<FFFFFFD9D9Q7D9D9FFFFFFO-FFFFFFD9D9Q7D9D9FFFFFFJ&J%J&J%
+:D8D8D8D9D9Q;D9D8D8D8O*D8D8D8D9D9Q;D9D8D8D8J&J"8"J&J"8"
+:D1D1D8D8D8Q;D8D1O*D1D1D8D8D8Q;D8D1J&J&J&J&
+<D1D1D8D8D8Q7D8D8D8D1D1O-D1D1D8D8D8Q7D8D8D8D1D1J"8"J"8"J"8"J"8"
+>D1D8Q5D8D1O1D1D8Q5D8D1J&J&J&J&
+?D1D1D8D8D8Q1D8D8D8D1D1O3D1D1D8D8D8Q1D8D8D8D1D1J%:z:&J%:z:&
+AD1D1D8D8Q&D8D8D8D8D1D1O7D1D1D8D8Q&D8D8D8D8D1D1J":"J"J":"J"
+CD1D8Q,D1O;D1D8Q,D1J$z%J$z%
+DD1D1D8Q*D1FFD8D1D1O=D1D1D8Q*D1FFD8D1D1JzJz
+:QDD0O*QDD0J"J"
+9D0RMD0JzJz
+8QHD9O&QHD9
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Jz9zJz9z
+8QHCD3CF>QHCD3CFJ"J"J"J"
+R1FF5D0R7FF5D0Jz"<r"r"Jz"<r"r"
+:QDCEFFD1D8D1D0AQDCEFFD1D8D1D0J$J$
+R=FFD8D8RKFFD8D8
+J"9"J"9"
+R<FFD8RIFFD8J"J"
+R>D9RMD9J(J(
+R;FFFFD9D9D9D8D8RGFFFFD9D9D9D8D8J"J"
+R:FFRMFFJ"9$J"9$
+R<D9D9D8D8RGD9D9D8D8J$;$J$;$
+R9FFFFD9D9D8D8RCFFFFD9D9D8D8
+J$=$J$=$
+R8FFFFD9D9D8D8RAFFFFD9D9D8D8JuJu
+R9D8RDD8J#B"J#B"
+R7FFD8D8R?FFD8D8J"X"J"X"
+R7D1D1R?D1D1J"J"
+RDD8RMD8Jt"Jt"
+R:D9D8RDD9D8
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+JZ
+X%/J"C"
+X%D1D8J#t$
+X&D1FFD9D8D8D1J"
+X(FFJ">$
+X'D1D8D8D1J"="
+X)FFD1J"<"
+X(D1D8J"9$
+X*FFD8D8D1J"
+X)D1J&
+X+FFD9D8D8D1J&
+X*D1FFD8D8D1
+J$
+X+D1D8D1?Z8Q8Z8Q8Z=z
+R'RD2/D0>"J"
+FFWID0=z9z
+WGD93D9
+
+=z
+WGCF'J"J&
+F5F5F5F5F5F5WGD06F5F5F5F5F5'9w"z#v"J'
+F4F4F4F4F4F4D1FFW)D1FFFFD1D07F4F4F4F4F4F48%C$ZA#J&
+F8F8F8F8FFFFD8W FFFFBF8F8F8F8F5H$J"C"
+FFFFD8W D8FFF%:z"B&
+FFFFFFD9VJD9D8D9D9FFFFFFD&J&
+FFFFFFD9D9W0D9D9FFFFFFC"8"J"8"
+FFD9W4D9FFA&J&
+FFFFFFD9D9W6D9D9FFFFFF?&J%
+D8D8D8D9D9W:D9D8D8D8?&J"8"
+D1D1D8D8D8W:D8D1A&J&
+D1D1D8D8D8W6D8D8D8D1D1C"8"J"8"
+D1D8W4D8D1D&J&
+D1D1D8D8D8W0D8D8D8D1D1F%:zC&
+D1D1D8D8VJD8D8D8D8D1D1H":"J"
+D1D8W+D1I$z@$
+D1D1D8W D1D8D1D1?z
+WCD0>"
+D0=z"z"z
+0F4F5W:F4F51F4<z8z8z
+1F8W9F81F8
+
+
+7z8z8z
+6F5W9F55F5"J"J"
+F57F5W:F5
+ENDBITMAP
+%%EndBinary
+81 333 288 531 R
+7 X
+V
+4 8 Q
+0 X
+(scrolledframe .sf -vscrollmode static \134) 81 525.67 T
+( -hscrollmode static \134) 81 515.67 T
+( -width 475 -height 360) 81 505.67 T
+(set childsite [.sf childsite]) 81 495.67 T
+(pack [frame $childsite.topframe]) 81 475.67 T
+(pack [frame $childsite.botframe]) 81 465.67 T
+(scrolledlistbox $childsite.topframe.slb1) 81 445.67 T
+(pack $childsite.topframe.slb1 -side left) 81 435.67 T
+(scrolledlistbox $childsite.topframe.slb2) 81 415.67 T
+(pack $childsite.topframe.slb2 -side left) 81 405.67 T
+(scrolledlistbox $childsite.botframe.slb3) 81 385.67 T
+(pack $childsite.botframe.slb3 -side left) 81 375.67 T
+(scrolledlistbox $childsite.botframe.slb3) 81 365.67 T
+(pack $childsite.botframe.slb3 -side left) 81 355.67 T
+(pack .sf -expand yes -f) 81 335.67 T
+(ill both) 191.4 335.67 T
+0 10 Q
+(FIGURE 25) 125.51 308.17 T
+1 F
+( - Scrolledframe) 176.9 308.17 T
+0 0 612 792 C
+1 10 Q
+0 X
+0 0 0 1 0 0 0 K
+-0.17 (The Panedwindow of) 315 116.48 P
+-0.17 (fers signi\336cant control over its pre-) 400.03 116.48 P
+(sentation through a lar) 315 104.48 T
+(ge set of options. The option set) 404.53 104.48 T
+(allows speci\336cation of the distance between a pane and) 315 92.48 T
+(its contents, the minimum size a pane\325) 315 80.48 T
+(s contents may) 468.05 80.48 T
+315 527.86 540 720 C
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+315 558 540 718.14 R
+7 X
+0 0 0 1 0 0 0 K
+V
+0.5 H
+2 Z
+0 X
+N
+%%BeginBinary: 3593
+264 89 135.77 45.77 0 369 657
+/red <
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000008EEF9AFF2CAEB6CF71E7
+A24DF70055BE928AB2D3FF00F7557DDBB2002CFF6120822C455D4571FF0000FF
+> store
+/green <
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000082D78AE78AEFEF0071E7
+A24DF70055BE827530B6FFFFDF697DDBB2004D00B641DF4D829E4582FF0000FF
+> store
+/blue <
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000006DB675C755EFB60071E7
+A24DF77D55BE9265618EE300B22C7DDBB28A4D00FF59E351B6A2FF9200FF00FF
+> store
+ BEGINBITMAPCOLORc
+z"z"z"
+7F6F7R?F6F77F6F7J"
+S@F78z8z8z
+5F9R>F95F9
+
+
+<z"
+S5F7F6=z"z"z"z
+0F6F7R.F6F70F6F70F6>z8z8z8z
+/F9R-F9/F9/F9
+J'D":"I'
+OJFEFEFEFEFEFEFEFEFEFEFEFEFEFEJ"8%B":"J"8%Js"
+OJF9F9F9FEFEFEFE4F9F9F9FEFEP,F6F7Jr
+S/F9J(8"8$8#8$9'D$9(
+P%FEFEFEF9FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF9FEFEFEFEFEFEFEFEF9FEFEFEAs"J%8"9":"8$8,8%;%8*9$J$
+F6F7O9FEFEFEF9F9F9F9F9F9F9F9F9FEFEFEF9FEFEFEF9F9FEF9FEFEFEFEFEF9FEFEFEF9FEFEFEF9F9F9FEF9O;F6F6F7BrJ&J$<">&9$:&J"
+F9O:F9F9F9FEFE6F9F9F9F9F9F9F9FEFEF9F9F9F9FEFEFEF9O=F9AsJ#
+F7R;F7F7AtJ"F$J$:&J$
+F9OCFEFEF9FE7FEF9FEFEF9F9FEFEO<F9F9F9J"8&8%8"8$8.8"9$829"
+OJFEFEFEFEFEF9F9FEFEF9FEF9FEFEF9FEFEF9F9F9FEFEFEF9F9F9FEFEFEF9FEFEFEFEFEF9F9F9F9FEFEFEF9F9F9FEFEFEFEJr:'9#9#9$9z:$9rJs
+OJF9F9F9F9F9F9F9F9F9F9F9F9F9F90F9F9F9F9F9OIF7Jt
+S.F9
+>z8z8z8z
+/F7R-F7/F7/F7sF"J"F"F&
+F7F7R.F7F7F7F7F7F7F7(z'
+F6F6F6F6F6F6F7S4D9F6F6F6F6F6F68%J&
+F9F9F9F9S6F9F9F9F9F7
+
+
+Bz
+OBFE
+Dz
+O>D9
+Fz
+O:D8J"
+OIFFHz"
+O6D9FF
+
+
+JZJZJZ
+6O.4O.4O.J"J"J"
+OCD8OAD8OAD8Jz"Jz"Jz"
+8O*D9D87O*D9D87O*D9D8
+
+
+
+
+J#:#J#9#J#;#F#
+HFEFEFEFEO>FEFEFEFEO/FEFEFEFEFEFEJ"
+PBFEJ$8)9%J%J"9":%8#9#:#9%
+HD9FEFEFEFED9D9FEFEFEFEFEFEFEFEO;FEFEFEFEO+FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEJ.J#:'J'A,
+O"FEFED9D9FEFED9FEFED9D9FEFEO3D9FEFEFED9D9FEFEO2FEFED9D9FEFEFED9FEFED9FEFED9D9FEFEJ'@%J$:#;(9"
+ID9FEFEFEFED9FED9D9D9PJFED9FED9D9D9FEFED9FEFED9D9J"8":#9&J#J"9":$J#
+JD9D9FEFED9D9FEFEFEO5D9FEO3D9D9FEFEFE4FEFEJ%9"8"J";%:&A%
+O$D9D9D9D9D9FEPKFEFEFED9D9D9FEFEFED9D9D9D9D9J(J"J$J">#
+O&FEFED9FEFED9D9O7D9O4D9FED95FEFEFEJ.J'J(8"=,
+O"D9FEFEFEFED9D9D9FEFEFEFED9O9D9FEFEFEFED9O2D9FEFEFED9FEFED9D9FEFED9D9D9FEFEFEFED9J#:%9%J#9#8%J#8"8#8':"9&9%
+KD9D9D9D9D9D9D9D9D9D9O2D9D9D9D9D9D9D9D9O)D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9D9J"
+R;FEJ$
+R:FEFED9J#
+R:D9D9
+
+
+
+'J&
+F7F7F7F7F7F7S5F7F7F7F7F7'HzJzJzG'
+F6F6F6F6F6F6O*D88O*D88O*D8F6F6F6F6F6F68%G"J"J"J&
+F9F9F9F9D8OAD8OAD8O<F9F9F9F9F7JzJzJz
+6O.D94O.D94O.D9
+
+
+HZ
+O6G"
+FFFz
+O:D9
+Dz
+O>FE
+Bz
+OBD9
+
+
+
+=z"z"z
+0F6F7R?F6F71F6<z8z8z
+1F9R>F91F9
+
+
+7z8z8z
+6F7R>F75F7"J"J"
+F77F7R?F7
+ENDBITMAP
+%%EndBinary
+351 567 513 648 R
+7 X
+V
+4 8 Q
+0 X
+(buttonbox .bb -padx 10 -pady 10) 351 642.67 T
+(.bb add Yes -text Yes) 351 622.67 T
+(.bb add No -text No) 351 612.67 T
+(.bb add Maybe -text Maybe) 351 602.67 T
+(.bb default Yes) 351 592.67 T
+(pack .bb -expand yes -f) 351 572.67 T
+(ill both) 461.4 572.67 T
+0 10 Q
+(FIGURE 26) 376.52 542.16 T
+1 F
+(- Buttonbox) 430.42 542.16 T
+0 0 612 792 C
+315 135.14 540 505.86 C
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+315 170.71 540 494.43 R
+7 X
+0 0 0 1 0 0 0 K
+V
+0.5 H
+2 Z
+0 X
+N
+%%BeginBinary: 5963
+314 531 94.2 159.3 0 427.8 323.98
+/red <
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000007D96FB7DFFCF8AFFE79AFF2CAEB6CF71E7
+A24DF70055BE928AB2D3FF00F7557DDBB2002CFF6120822C455D4571FF0000FF
+> store
+/green <
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000006D96FB6DFFB67DFFCF8AE78AEFEF0071E7
+A24DF70055BE827530B6FFFFDF697DDBB2004D00B641DF4D829E4582FF0000FF
+> store
+/blue <
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000005D9AFF5DDF9E69FBB275C755EFB60071E7
+A24DF77D55BE9265618EE300B22C7DDBB28A4D00FF59E351B6A2FF9200FF00FF
+> store
+ BEGINBITMAPCOLORc
+z"z"z"
+7F6F7SCF6F77F6F7J"
+TDF78z8z8z
+5F9SBF95F9
+
+
+<z"
+T9F7F6=z"z"z"z
+0F6F7S2F6F70F6F70F6>z8z8z8z
+/F9S1F9/F9/F9
+JrJ$8.8#E$
+P'FE>FEFEFEFEFEFEFEF9FEFEFEFEF9FEFEFEFEFEFEFEFEJ"8&J":"8$8&I"Js"
+P'F9F9F9F9FEFE=F9F9F9F9F9F9F9F9FEF9F9P<F6F7J#Jr
+Q2F9F9PMF9J%9';$:#<,8$8';#=$8-
+P1FEFEFEFEFEFEFEF9FEFEFEFEFEFEFEF9FEFEF9FEF9FEFEF9FEF9FEFEFEFEFEFEF9FEFEFEFEFEFEFEFEFEFEF9FEFEFEFEF9FEFEFEAs"J$9%8"8%8-H":"8%8&:)9"8&J$
+F6F7OFFEFEF9F9F9FEFEF9FEF9FEFEFEFEFEF9FEFEF9FEFEFEF9FEF9F9FEF9FEFEFEFEFEF9FEFEFEFEF9FEFEFEF9F9F9F9F9FEF9OEF6F6F7BrJ%9$=">";$J"=$<$9$9%J"
+F9OEFEFEFEF9F9FEFEF9FEF9F9F9:F9F9F9F9F9F9F9F9FEFEFEF9FEF9OGF9AsJ$9%E%B*J#
+F7OEF9F9F9FEFEF9F9F9F9F9F9F9FEFEF9F9F9FEFEF9PDF7F7AtJ"E%9$J$<$:)J$
+F9OMFEFEF9FEFEFEF9FEBFEF9FEFEF9FEF9FEFEF9F9FEFEF9OGF9F9F9J"8";%8$8"9/8"E"8$8"9(8*
+P'FEFEF9FEFEF9FEF9FEFEFEF9F9F9FEFEFEF9F9F9F9FEFEF9FEFEFEF9FEFEFEF9F9F9FEFEF9FEF9F9F9FEFEFEF9F9J%<z9$:':#9#:x9'9$;#8#Js
+P'F9F9F9F9/F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9P(F7Jt
+T2F9
+>z8z8z8z
+/F7S1F7/F7/F7sF"J"F"F&
+F7F7S2F7F7F7F7F7F7F7(z'
+F6F6F6F6F6F6F7T8D9F6F6F6F6F6F68%J&
+F9F9F9F9T:F9F9F9F9F7
+
+
+
+
+
+Ez
+S<D1
+Gz=z
+S8D03D8J"J"
+SHFF9FFIz"@r"r"
+S4D1FFD7D8D7FFJ"
+T*FFJ"
+T,D8J"
+T)FFJ$
+T+D9D8D8J$
+T(FFFFD9J$
+T,D9D8D8J$
+T'FFFFD9J$
+T-D9D8D8J$
+T&FFFFD9J$
+T.D9D8D8J$
+T%FFFFD9J$
+T/D9D8D8J#u
+T$FFFFD8J"B"
+T%D8D8Jz
+T$/D7JZ
+T$/J"
+T2D8Jv"
+T&D9D8
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Jv
+T&D8J"
+T%D8Jz
+T$/D7JZ
+T$/J"C"
+T$D7D8Jt$
+T'D9D8D8D7J$
+T%D7FFFFJ$
+T/D8D8D7J$
+T&D7FFFFJ$
+T.D8D8D7J$
+T'D7FFFFJ$
+T-D8D8D7J$
+T(D7FFFFJ$
+T,D8D8D7J$
+T)D7FFD8J"
+T-D7J"
+T*D7J"
+T,D7IZAZ
+S4/H"J"
+FFS>FFGz=z
+S8D13D9
+Ez
+S<D9
+
+
+
+Gz
+S8D8J"
+SHFFIy#Z$x"
+D7FFD7RBD7FFFFD7FFJ$J"9#
+?FFFFD8RBD8FFFFJ%:z"<#
+=FFFFFFD8R>D9D8FFFFJ#8"J#8#
+;FFFFD9RHD9D9FFFFJ#8#J#8#
+9FFFFD9D9RKD9D9FFFFJ#8#J#8#
+7FFFFD9D9S!D9D9FFFFJ#8#J#8#
+5FFFFD9D9S%D9D9FFFFI'J&
+D8D8D8D8D9D9S)D9D8D8D8D8I#8#J"9"
+D7D7D8D8S)D8D7J#8#J#8#
+5D7D7D8D8S%D8D8D7D7J#8#J#8#
+7D7D7D8D8S!D8D8D7D7J#8#J#8#
+9D7D7D8D8RKD8D8D7D7J#8"J#8#
+;D7D7D8RHD8D8D7D7J#<z=#
+=D7D7R>D8D7D7J#9"J$
+?D7D7D8RBD8D7D7IZ
+S4H"
+FFGz
+S8D9
+
+
+
+JU
+T+J"
+T4D8J(
+T-D9D9D9D9D9D9D8
+=z@u
+T$D8D8>z@t"
+T#D9D9FF>Z@T
+T#=z@u
+T$D9D9J'
+T-D8D8D8D8D8D8J"
+T,D8Ju
+T+D9
+
+Ez
+S<D1
+Gz=z
+S8D03D8J"J"
+SHFF9FFIz"@r"r"
+S4D1FFD7D8D7FFJ"
+T*FFJ"
+T,D8J"
+T)FFJ$
+T+D9D8D8J$
+T(FFFFD9J$
+T,D9D8D8J$
+T'FFFFD9J$
+T-D9D8D8J$
+T&FFFFD9J$
+T.D9D8D8J$
+T%FFFFD9J$
+T/D9D8D8J#u
+T$FFFFD8J"B"
+T%D8D8Jz
+T$/D7JZ
+T$/J"
+T2D8Jv"
+T&D9D8
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Jv
+T&D8J"
+T%D8Jz
+T$/D7JZ
+T$/J"C"
+T$D7D8Jt$
+T'D9D8D8D7J$
+T%D7FFFFJ$
+T/D8D8D7J$
+T&D7FFFFJ$
+T.D8D8D7J$
+T'D7FFFFJ$
+T-D8D8D7J$
+T(D7FFFFJ$
+T,D8D8D7J$
+T)D7FFD8J"
+T-D7J"
+T*D7J"
+T,D7IZAZ
+S4/H"J"
+FFS>FFGz=z
+S8D13D9
+Ez
+S<D9
+
+
+
+Gz
+S8D8J"
+SHFFIy#Z$x"
+D7FFD7RBD7FFFFD7FFJ$J"9#
+?FFFFD8RBD8FFFFJ%:z"<#
+=FFFFFFD8R>D9D8FFFFJ#8"J#8#
+;FFFFD9RHD9D9FFFFJ#8#J#8#
+9FFFFD9D9RKD9D9FFFFJ#8#J#8#
+7FFFFD9D9S!D9D9FFFFJ#8#J#8#
+5FFFFD9D9S%D9D9FFFFI'J&
+D8D8D8D8D9D9S)D9D8D8D8D8I#8#J"9"
+D7D7D8D8S)D8D7J#8#J#8#
+5D7D7D8D8S%D8D8D7D7J#8#J#8#
+7D7D7D8D8S!D8D8D7D7J#8#J#8#
+9D7D7D8D8RKD8D8D7D7J#8"J#8#
+;D7D7D8RHD8D8D7D7J#<z=#
+=D7D7R>D8D7D7J#9"J$
+?D7D7D8RBD8D7D7IZ
+S4H"
+FFGz
+S8D9
+
+
+JU
+T+J"
+T4D8J(
+T-D9D9D9D9D9D9D8
+=z@u
+T$D8D8>z@t"
+T#D9D9FF>Z@T
+T#=z@u
+T$D9D9J'
+T-D8D8D8D8D8D8J"
+T,D8Ju
+T+D9
+
+Ez
+S<D1
+Gz=z
+S8D03D8J"J"
+SHFF9FFIz"@r"r"
+S4D1FFD7D8D7FFJ"
+T*FFJ"
+T,D8J"
+T)FFJ$
+T+D9D8D8J$
+T(FFFFD9J$
+T,D9D8D8J$
+T'FFFFD9J$
+T-D9D8D8J$
+T&FFFFD9J$
+T.D9D8D8J$
+T%FFFFD9J$
+T/D9D8D8J#u
+T$FFFFD8J"B"
+T%D8D8Jz
+T$/D7JZ
+T$/J"
+T2D8Jv"
+T&D9D8
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Jv
+T&D8J"
+T%D8Jz
+T$/D7JZ
+T$/J"C"
+T$D7D8Jt$
+T'D9D8D8D7J$
+T%D7FFFFJ$
+T/D8D8D7J$
+T&D7FFFFJ$
+T.D8D8D7J$
+T'D7FFFFJ$
+T-D8D8D7J$
+T(D7FFFFJ$
+T,D8D8D7J$
+T)D7FFD8J"
+T-D7J"
+T*D7J"
+T,D7IZAZ
+S4/H"J"
+FFS>FFGz=z
+S8D13D9
+Ez
+S<D9
+
+
+
+Gz
+S8D8J"
+SHFFIy#Z$x"
+D7FFD7RBD7FFFFD7FFJ$J"9#
+?FFFFD8RBD8FFFFJ%:z"<#
+=FFFFFFD8R>D9D8FFFFJ#8"J#8#
+;FFFFD9RHD9D9FFFFJ#8#J#8#
+9FFFFD9D9RKD9D9FFFFJ#8#J#8#
+7FFFFD9D9S!D9D9FFFFJ#8#J#8#
+5FFFFD9D9S%D9D9FFFFI'J&
+D8D8D8D8D9D9S)D9D8D8D8D8I#8#J"9"
+D7D7D8D8S)D8D7'E#8#J#8#J&
+F7F7F7F7F7F7D7D7D8D8S%D8D8D7D7GF7F7F7F7F7'G#8#J#8#J'
+F6F6F6F6F6F6D7D7D8D8S!D8D8D7D7IF6F6F6F6F6F68%I#8#J#8#J&
+F9F9F9F9D7D7D8D8RKD8D8D7D7LF9F9F9F9F7J#8"J#8#
+;D7D7D8RHD8D8D7D7J#<z=#
+=D7D7R>D8D7D7J#9"J$
+?D7D7D8RBD8D7D7IZ
+S4H"
+FFGz
+S8D9
+
+
+
+
+
+
+
+
+=z"z"z
+0F6F7SCF6F71F6<z8z8z
+1F9SBF91F9
+
+
+7z8z8z
+6F7SBF75F7"J"J"
+F77F7SCF7
+ENDBITMAP
+%%EndBinary
+325.43 185.43 532.43 307.29 R
+7 X
+V
+4 8 Q
+0 X
+(panedwindow .pw -width 300 -height 500) 325.43 301.95 T
+(.pw add top) 325.43 291.95 T
+(.pw add bottom) 325.43 281.95 T
+(.pw insert 1 middle) 325.43 271.95 T
+(pack .pw -f) 325.43 261.95 T
+(ill both -expand yes) 378.23 261.95 T
+(foreach pane [.pw childsite] {) 325.43 241.95 T
+( scrolledlistbox $pane.slb \134) 325.43 231.95 T
+( -vscrollmode static \134) 325.43 221.95 T
+( -hscrollmode static) 325.43 211.95 T
+( pack $pane.slb -f) 325.43 201.95 T
+(ill both -expand yes) 426.23 201.95 T
+(}) 325.43 191.95 T
+0 10 Q
+(FIGURE 27) 368.71 146.32 T
+1 F
+( - Panedwindow) 420.1 146.32 T
+(Child Sites) 327.49 408.8 T
+447.31 453.58 459 456.29 450.52 447.79 448.91 450.68 4 Y
+V
+378 411.29 448.92 450.68 2 L
+N
+438.46 414.59 450 411.29 438.46 407.98 438.46 411.29 4 Y
+V
+378 411.29 438.46 411.29 2 L
+N
+441.97 375.2 450 366.29 438.46 369.6 440.22 372.4 4 Y
+V
+378 411.29 440.22 372.4 2 L
+N
+0 0 612 792 C
+FMENDPAGE
+%%EndPage: "14" 14
+%%Page: "15" 15
+612 792 0 FMBEGINPAGE
+[0 0 0 1 0 0 0]
+[ 0 1 1 0 1 0 0]
+[ 1 0 1 0 0 1 0]
+[ 1 1 0 0 0 0 1]
+[ 1 0 0 0 0 1 1]
+[ 0 1 0 0 1 0 1]
+[ 0 0 1 0 1 1 0]
+ 7 FrameSetSepColors
+FrameNoSep
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+1 10 Q
+0 X
+0 0 0 1 0 0 0 K
+(reach, the orientation of separators, the thickness of the) 72 713.33 T
+(separators, as well as the dimensions, position, and cur-) 72 701.33 T
+(sor associated with the sash.) 72 689.33 T
+0 12 Q
+(Combobox) 156.5 658 T
+1 10 Q
+(The combobox class is an enhanced entry \336eld widget) 72 633.33 T
+(with an optional associated label and a scrollable list.) 72 621.33 T
+(When an item is selected in the list area of a combobox) 72 609.33 T
+(it\325) 72 597.33 T
+(s value is then displayed in the entry \336eld text area.) 80.34 597.33 T
+(Functionally similar to an optionmenu, the combobox) 72 585.33 T
+(adds list scrolling, item editing and inserting capabili-) 72 573.33 T
+(ties.) 72 561.33 T
+(There are two basic styles of comboboxes, determined) 72 104.22 T
+(by the dropdown option, dropdown and simple. The) 72 92.22 T
+(dropdown style adds an arrow button to the right of the) 72 80.22 T
+72 124.89 297 558 C
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+72 146.43 297 548.57 R
+7 X
+0 0 0 1 0 0 0 K
+V
+0.5 H
+2 Z
+0 X
+N
+81 152.57 288 341.57 R
+7 X
+V
+1 10 Q
+0 X
+(# Non-editable Dropdown Combobox) 81 334.9 T
+(combobox .cb1 -labeltext Month: \134) 81 322.9 T
+( -editable false -items {Jan Feb Mar \134) 81 310.9 T
+( Apr May June Jul Aug Sept Oct Nov Dec}) 81 298.9 T
+(# Editable Dropdown Combobox) 81 274.91 T
+(combobox .cb2 -labeltext \322Operating System:\323 \134) 81 262.91 T
+( -items {Linux HP-UX SunOS Solaris Irix}) 81 250.91 T
+(# Simple Combobox) 81 226.91 T
+(combobox .cb3 -labeltext Fonts: -labelpos nw \134) 81 214.91 T
+( -dropdown false -items [exec xlsfonts]) 81 202.91 T
+(pack .cb1 -padx 10 -pady 10 -\336ll x) 81 178.91 T
+(pack .cb2 -padx 10 -pady 10 -\336ll x) 81 166.91 T
+(pack .cb3 -padx 10 -pady 10 -\336ll x) 81 154.91 T
+%%BeginBinary: 38844
+329 407 157.92 195.36 0 108 347
+/red <
+C472FFFFFFFFFFFFFFFFFFFFFFFFFF66F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFFFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF808080
+8080808080808080808080808080808080808080804040404040404040404040
+4040404040404040404040400000000000000000000000002EAFB4CD73E6A2F5
+99FFFFB0B07AFFCC00878858D7439D50D080C0C080C08060C000FFA000FF20C0
+A0C0D060F0E010B499FFBE8B8BD900FFA0000000000039C069DD00FF00000033
+33330033CCDD9999112277005544FFCC66AABBFF33EE9999CC7AEFD3BF804040
+9765E1A36FE700FF55004DB2D272B36419BF2FFF6223852F465F4770FF0000FF
+> store
+/green <
+D79F0000000000000000000000000099DEFFFFFFBFBFBFBFBF80808080804040
+4040000000FFFFFFFFFFBFBFBFBF808080808040404040400000000000FFFFFF
+FFFFBFBFBFBFBF8080808040404040400000000000FFFFFFFFFFBFBFBFBFBF80
+808080804040400000000000FFFFFFBFBFBFBFBF808080408BEEEE0073E6A2F5
+99FFFF30B094FFF700CE8858D74DB38080C0C080C0808060C08000A080402070
+A020D0F0F0E010B489E4BE5B77D9FFFFA0404040400063E0B500996699FF0066
+3399BBFF99DD99FF112277005544CCCC66AABB6600EE6600CC69E3B5BF804040
+9765E1A36FE700FF1A004DB2B477B39519264F00B641DE4F829E4780FF0000FF
+> store
+/blue <
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3BF8040FFBF804000FFBF804000FFBF
+8000BF8040FFBF804000FF804000FFBF804000FFBF804000FFBF804000FFBF80
+4000FFBF804000FFBF4000FFBF804000FFBF804000FFBF804000FFBF804000FF
+BF804000FFBF00FFBF804000BF8040FFBF804000FFBF40FF57EEB40073E6A2F5
+6BFBB360B015322480FA8858D756CAD050C080C08080C060C080FF0000402070
+C020D06050E010B476C4BE7A65D900E0A0BF8040004063E0B500FF3399FF8866
+6666009966DDFFFF112277DD554499FFCCAABBCC99EE9966CC69E3B5BF808040
+9765E1A36FE7BFCC8BEE4DB28C85B3ED70264F00FC5AE050B4A0FF9000FF00FF
+> store
+ BEGINBITMAPCOLORc
+z"z"z"
+6F6F7T&F6F76F6F7J"
+U%F78z8z8z
+4F9T%F94F9
+
+;z"
+TJF7F6<z"z"z"z
+0F6F7SCF6F70F6F70F6=z8z8z8z
+/F9SBF9/F9/F9
+J$C$
+Q+FEFEFEFEFEFEJ"E"Js"
+Q+F9F9Q&F6F7Jr
+TCF9J$:$9'8#<#;$<#;$9(
+P@FEFEFEFEFEFEFEFEFEF9FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF9FEFEFE@s"J18):.909$J$
+F6F7P+FEFEFEF9FEFEF9FEFEFEF9FEFEFEF9F9FEF9FEFEFEF9FEFEFEF9FEFEFEF9FEFEFEF9FEFEFEFEF9FEFEFEF9FEFEFEF9FEFEFEF9F9F9FEF9P/F6F6F7ArJ%9$<"9"=$;$;$;$:&J"
+F9P.F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FEFEFEF9P1F9@sJ#
+F7T"F7F7@tJ%9$J";$=";$:&J$
+F9P-FEF9FEFEFEF9FE4FEFEF9FEFEFEF9FEFEF9F9FEFEP0F9F9F9J18"9"9"8/839"
+P>F9F9FEFEFEF9F9F9F9FEFEFEF9F9F9FEFEFEFEF9FEFEFEF9F9F9F9F9FEFEFEF9F9F9FEFEFEF9F9F9F9F9FEFEFEF9F9F9FEFEFEFEJ$:$9z;$9&;$9rJs
+P@F9F9F9F9F9F92F9F9F9F9F9F9F9F9F9F9F9F9F9P=F7Jt
+TBF9
+=z8z8z8z
+/F7SBF7/F7/F7rF"J"F"F%
+F7F7SCF7F7F7F7F7F7'z&
+F6F6F6F6F6F7TIADF6F6F6F6F68$J%
+F9F9F9TKF9F9F9F7
+
+
+
+
+
+
+
+
+
+J5=4
+O6RAFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEFFADFFADFFADFFADFFADFFADFFADFFADFFADFFJ5<5
+O5RBFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEAD4FFADFFADFFADFFADFFADFFADFFADFFADFFADFFADJ#z"<#z"
+O5ADFER?ADFFADFF1ADFEJ#J#<#F#
+O5FEADR>FFADFFADFEADJ#J#<#F#
+O5ADFER>ADFFADFFADFEJ#;#F#8#F#<"J#<#9u9#
+4FEFEFEFEFEFEFEFEFEADFER7FFADFFADFEFEADJ#J#<#9"B#
+O5ADFER>ADFFADFFADADFEJ"9":%8&8"8":#9#>#?"9"8%:$J#<#B"9#
+6FEFEFEFEFEFEFEFEADFEFEFEFEFEFEFEFEFEADFEFEFEADFEFEFEFEFER#FFADFFADADFEADJ'9'8"9%B#G%8&J#<#:"A#
+>FEFEADADFEFEFEADFEFEADADADFEADFEFEADFEFEADADFEFEADADADFER"ADFFADFFADADFEJ$C"A";#>#G"J#<#A":#
+7FEADFEADADADADFEADADR,FFADFFADADFEADJ"9"J#J$J#<#;"@#
+6ADADHADFE8FEFEFER#ADFFADFFADADFEJ"J#8"J%J#<#@";#
+8FEJFEADFE5ADADADADR"FFADFFADADFEADJ$J">#>#B"D"J#<#<"?#
+7ADFEAD6FEFEFEADFEFEFER"ADFFADFFADADFEJ'?%H#8&8%@&J#<#?"<#
+>ADFEFEFEFEADADFEFEADFEADADFEFEFEADADFEFEADADFEFEFEADR"FFADFFADADFEADJ#8"8#8%8#8#9&8#8#>#9$:%8"9"9$J#<#=">#
+4ADADADADADADADADADADADADADADADADADADADADADADADFEADADADADADADADADADADADADR#ADFFADFFADADFEJ#J#<#>"=#
+O5FEADR>FFADFFADADFEADJ#J#<#F#
+O5ADFER>ADFFADFFADFEJ#J#<#F#
+O5FEADR>FFADFFADFEADJ5<5
+O5RBADFEADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFF4ADFFADFEADFEADFEADFEADFEADFEADFEADFEADFEJ5<5
+O5RBFEADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFAD4FFADFEADFEADFEADFEADFEADFEADFEADFEADFEADJz=z
+O5RAAD3AD
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+J5=4
+Q"Q'FEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEFFADFFADFFADFFADFFADFFADFFADFFADFFADFFJ5<5
+Q!Q(FEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEAD4FFADFFADFFADFFADFFADFFADFFADFFADFFADFFADJ#z"<#z"
+Q!ADFEQ%ADFFADFF1ADFEJ#J#<#F#
+Q!FEADQ$FFADFFADFEADJ#J#<#F#
+Q!ADFEQ$ADFFADFFADFEJ%J#8#J&H#J#8"<"J#<#9u9#
+6FEFEFEFE>FEFEFEFE5FEFEFEFEFEFEFE?FEADFEFEPHFFADFFADFEFEADJ'J#J(J#?"J#<#9"B#
+5FEFEADADFEFEAADAD4FEFEADADADFEFEO$ADFEADPHADFFADFFADADFEJ$8*9%8+8"8+9&D#9#8%8"8"8%8*9#>#?"8%9"9$:"J#<#B"9#
+4FEFEADADFEFEADFEFEADFEFEFEFEFEFEFEFEADFEFEADFEFEFEFEFEFEADFEFEADFEFEADFEFEFEFEADFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEADFEFEFEADFEFEFEFEFEFEADFEFEADFEFEFEFEADFEFEP3FFADFFADADFEADJ,9"8)8"<*>(?)8)8*B#C%>#8#J#<#:"A#
+?FEADFEFEADFEFEADADFEFEFEFEFEADADFEFEADADADFEADFEFEADFEFEADFEADFEFEFEADADADFEFEADADFEFEADADADADFEFEADADFEFEFEADADFEFEADADFEFEADFEFEADADFEADFEFEADP3ADFFADFFADADFEJ"D%E"="?&8(9%J#>#C"B%J#<#A":#
+?ADADADADADADADADADFEFEFEADFEFEADFEFEADFEADADAD9ADADFEADADADFEFEADP4FFADFFADADFEADJ#;"9$J"8"?&?#J#J#<#;"@#
+FFEFEADFEFEFEAADFEADADFEFEFEFEFE9ADFEQ$ADFFADFFADADFEJ%<%J#8":&:"8">%J#J%J#<#@";#
+FADADADADFEFEADAD>FEFEADADFEFEFEADADFEADADADAD7FEAD:FEADADFEP4FFADFFADADFEADJ$8$9">#G"C"J%=":#C#>#J"8#8#J#<#<"?#
+4ADFEFEFEFEADFEFEFEFEFE8FEFEADADFEFEFEFEFEADFE6FEFEADADFEP3ADFFADFFADADFEJ':,<-@%>(9";'8+J#9%B%J#<#?"<#
+5ADFEFEFEFEADADFEFEADADADFEFEFEFEADADFEFEFEADFEFEADADFEFEADADFEFEADADFEFEFEFEFEADADADFEFEFEFEADADFEFEADADFEFEFEFEAD7FEADFEFEFEFEADFEFEADP;FFADFFADADFEADJ%<#9%8#:'8s8#8#@&<":%:#8%8#8#8#8#>#8&8"8"9"9':"J#<#=">#
+6ADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADFEADADADADADADADADADADADADADADADP3ADFFADFFADADFEJ#J"J#J#<#>"=#
+O8FEFE4FEO FEADQ$FFADFFADADFEADJ'E$J#J#<#F#
+O8ADFEFEFEFEADFEFEADMADFEQ$ADFFADFFADFEJ#J%F#J#J#<#F#
+=ADADHADADADADADADO FEADQ$FFADFFADFEADJ5<5
+Q!Q(ADFEADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFF4ADFFADFEADFEADFEADFEADFEADFEADFEADFEADFEJ5<5
+Q!Q(FEADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFAD4FFADFEADFEADFEADFEADFEADFEADFEADFEADFEADJz=z
+Q!Q'AD3AD
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Js$
+4FEADFEFEJ'
+6ADADADADADADJ#;%9%9#
+:FEFEFEFEFEFEFEFEFEFEFEFEJ.
+@FEFEADADFEFEADFEFEADADFEFEJ$F%8#
+6FEFEFEFEADADADADADJ$?#9&
+6ADADADFEFEADADFEFEFEJ%9"8"
+BADADADADADFEJ(:#
+DFEFEADFEFEADADFEFEJ.
+@ADFEFEFEFEADADADFEFEFEFEADJ#:&8%9%9#
+4ADADADADADADADADADADADADADADADADAD
+
+
+
+
+
+
+
+
+I5
+T/FEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEH5
+T0FEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADH#z"
+ADFET-ADFFH#J#
+FEADT,FFADH#J#
+ADFET,ADFFH#J#
+FEADT,FFADH#J#
+ADFET,ADFFH#J#
+FEADT,FFADH#J#
+ADFET,ADFFH#J#
+FEADT,FFADH#J#
+ADFET,ADFFH#J#
+FEADT,FFADH#J#
+ADFET,ADFFH#J#
+FEADT,FFADH#J#
+ADFET,ADFFH#J#
+FEADT,FFADH#J#
+ADFET,ADFFH#J#
+FEADT,FFADH5
+T0ADFEADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFH5
+T0FEADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADHz
+T/AD
+
+
+
+
+I5?2
+SCFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEFEADFEADFEADFEADFEADFEADFEADFEADFEH5=4
+SEFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFFFEADFEADFEADFEADFEADFEADFEADFEADFEADFFH#z#=#r"r#
+ADFESAADFFADADFE98FE98FFADH#J#=#<#=#
+FEADSAADFFFEADFFADADFFH#J#=#<$<#
+ADFESAFFADADFEADFEADFFADH#J"?"J"J"C"<"J"I$B$C";$:$C"8#=#;%<#
+FEAD4FEFEO FE5FEFEFEO-FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEADFFFEADADFFADFEADFFH#J"J&@&@#;&8&@#9#=#;&;#
+ADFEO?ADP=FEADADADFEFEADADADFEFEFEFEADADADFEFEADADADFEFEFEFFADADFEFFADADADFEFFADH#@$:#;$;#:$B$:$9"9"8&9$9$A#:$=#C$A%:$9(8":$J#J#9#=#:#8#;#
+FEADFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEADFEADFEFEFEFEFEADFEFEFEFEFEFEFEFEFEFEFEFEADFEFEFEFEFEFEADFEADFEADFEFEFEFEFEO&ADAD;ADADADFFFEADFFADFEADADFFH#?&8%9&9%8&@&8&@#:&9#@%8&;%A&A%8&9#8'8&J#=#:#8$:#
+ADFEFEADADADFEFEADADFEFEADADADFEFEADADFEFEADADADFEFEADADADFEFEADADADFEFEADFEADADADFEFEADFEADADFEFEADADADFEFEADADFEFEADADADFEFEADADFEFEADADADFEFEADFEADFEFEADFEFEADADADFEOGFFADADFEADFFADFEADFFADH#?"?"A"J"G"C"A"H"J"C"9"8":"J#=#9$9#:#
+FEADADADAD8ADADADADAD;ADADADADADOKADFFFEADADFFADADFEADFFH):$J$9&J$=&J&@&J$<&9&@&@&J&>#=#9#;#9#
+ADFEADFEFEFEFEFEFEFEFE9FEFEFEFEFEFEFEFE@FEFEFEFEFEFEFEFE;FEFEFEFEFEFEFEFEFEFE?FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE8FEFEFEFEFEFFADADFEFFADADFEFFADH"r9%J%8&J%<&J&@&J%<&9&@&@&J&>#=#8#<#9#
+FEADFEADADAD9ADADADADADADADADAD@ADADADADADADADADAD;ADADADADADADADADADAD>FEADADADADADADADADADADADADADADADADADADADADADADAD8ADADADADADADFFFEADFFADFEADADFFH#I"A"?"D"B"D"E"H"J#=#8#<$8#
+ADFEFEFEFEFEFEFEFEFEQ%FFADADFEADFFADFEADFFADH#?,9&9%8&@&8&8%@&E%8&;%A&G&E'J&@&G&8&E#='=#8#
+FEADADFEFEFEADFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEFEADADFEFEFEADFE4ADFEFEFEADADFEFEFEADADFEFEFEADADFEFEFEADADFFFEAD98ADFFADADFEADFFH#@&8%9$9%:$B$:$:%8"9"9$9"A%:$9"9%A$A"9"9$9"9"8"8"9rI$B$C";$:$C"8#=&?&
+ADFEADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADFFADADFE98FFADADFE98FFADH#J#=4
+FEADSAADFFFEADFFADFEADFEADFEADFEADFEADFEAD98ADFFH#J#=4
+ADFESAFFADADFEADFEADFEADFEADFEADFEADFEADFEADFFADH#J#=#z#
+FEADSAADFFFEAD/98ADFFH#J#=4
+ADFESAFFADADFEADFFADFFADFFADFFADFFADFFADFFADFFADH#J#=4
+FEADSAADFFFEADFFADFFADFFADFFADFFADFFADFFADFEADFFH#J#=%v%
+ADFESAFFADADFEADFFADFEADFFADH#J#=4
+FEADSAADFFFEADFFADFEADFEADFEADFEADFEADFEADFEADFFH#J"?"J"J"C"<"J"I$B$A&8&@&8(=4
+ADFE4FEFEO FE5FEFEFEO-FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFADADFEADFEADFEADFEADFEADFEADFEADFEADFFADH#J"J&@&@%:%@%:'=#z#
+FEADO?ADP=FEADADADFEFEADADADFEADADADADADADADADADADADADADADADADADFFFEAD/98ADFFH#@$:#;$;#:$B$:$9"9"8&9$9$A#:$=#C$A%:$9(8":$J#J#=#=#E#
+ADFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEADFEADFEFEFEFEFEADFEFEFEFEFEFEFEFEFEFEFEFEADFEFEFEFEFEFEADFEADFEADFEFEFEFEFEO)FEAD4FEADFFADADFEFFADH#?&8%9&9%8&@&8&@#:&9#@%8&;%A&A%8&9#8'8&J$I'=#E#
+FEADFEADADADFEFEADADFEFEADADADFEFEADADFEFEADADADFEFEADADADFEFEADADADFEFEADFEADADADFEFEADFEADADFEFEADADADFEFEADADFEFEADADADFEFEADADFEFEADADADFEFEADFEADFEFEADFEFEADADADFEO-FEFEFEFEFEFEADADFFFEADADFFH#?"?"A"J"G"C"A"H"J"C"9"8":"J#9&B#9(=#E#
+ADFEADADAD8ADADADADAD;ADADADADADO+FEADADADADADFEFEADADADADADFEFFADADFEFFADH):$J$9&J$=&J&@&J$<&9&@&@&G&E#=#E#
+FEADADFEFEFEFEFEFEFEFE9FEFEFEFEFEFEFEFE@FEFEFEFEFEFEFEFE;FEFEFEFEFEFEFEFEFEFE?FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEADFFFEADADFFH)9%J%8&J%<&J&@&J%<&9&@&@&@"<&@":#=#E#
+ADFEADADADADADADFEADADAD9ADADADADADADADADAD@ADADADADADADADADAD;ADADADADADADADADADAD>FEADADADADADADADADADADADADADADADADADADADADADADADFEADADADADADFEFFADADFEFFADH#I"A"?"D"B"D"E"H"J#J#?#=#E#
+FEADFEFEFEFEFEFEFEFEP2FEAD4FEADADFFFEADADFFH#?,9&9%8&@&8&8%@&E%8&;%A&G&E'J&@&G&G(=#E#
+ADFEADFEFEFEADFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEFEADADFEFEFEADFE4ADFEFEFEADADFEFEFEADADFEFEFEADADFEFEFEADFFADADFEFFADH#@&8%9$9%:$B$:$:%8"9"9$9"A%:$9"9%A$A"9"9$9"9"8"8"9rI$B$B"<$B"<'=#E#
+FEADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADFFFEADADFFH#J#=#E#
+ADFESAFFADADFEFFADH#J#=#E#
+FEADSAADFFFEADADFFH#J#=#E#
+ADFESAFFADADFEFFADH#J#=#E#
+FEADSAADFFFEADADFFH#J#=#E#
+ADFESAFFADADFEFFADH#J#=#E#
+FEADSAADFFFEADADFFH#J#=#E#
+ADFESAFFADADFEFFADH#J"?"J"J"C"<"J"J";$C";$:$A&8)=#E#
+FEAD4FEFEO FE5FEFEFEO-FE4FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEADADFFFEADADFFH#J"J#;&@#;&8&@%:(=#E#
+ADFEO?ADP=FEFEFEADADADFEFEFEFEADADADFEFEADADADFEADADADADADADADADADFFADADFEFFADH#@$:#;$;#:$B$:$9"9"8&9$9$A#:$=#C$A%:$9(8":$J#J#J#>#=#E#
+FEADFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEADFEADFEFEFEFEFEADFEFEFEFEFEFEFEFEFEFEFEFEADFEFEFEFEFEFEADFEADFEADFEFEFEFEFE6ADAD4ADAD>FEADADFFFEADADFFH#?&8%9&9%8&@&8&@#:&9#@%8&;%A&A%8&9#8'8&J$8#=#E#
+ADFEFEADADADFEFEADADFEFEADADADFEFEADADFEFEADADADFEFEADADADFEFEADADADFEFEADFEADADADFEFEADFEADADFEFEADADADFEFEADADFEFEADADADFEFEADADFEFEADADADFEFEADFEADFEFEADFEFEADADADFEOBFEFEFEFFADADFEFFADH#?"?"A"J"G"C"A"H"J"C"9"8":"J#9)=#E#
+FEADADADAD8ADADADADAD;ADADADADADO@FEADADADADADFEADADFFFEADADFFH):$J$9&J$=&J&@&J$<&9&G&J&F#=#E#
+ADFEADFEFEFEFEFEFEFEFE9FEFEFEFEFEFEFEFE@FEFEFEFEFEFEFEFE;FEFEFEFEFEFEFEFEFEFE?FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE8FEFEFEFEFEFFADADFEFFADH"r9%J%8&J%<&J&@&J%<&9&G&J&@";#=#E#
+FEADFEADADAD9ADADADADADADADADAD@ADADADADADADADADAD;ADADADADADADADADADAD>FEADADADADADADADADADADADADADADADADADAD8ADADADADADFEADFFFEADADFFH#I"A"?"D"B"D"E"H"J#@#=#E#
+ADFEFEFEFEFEFEFEFEFEPGFEADFFADADFEFFADH#?,9&9%8&@&8&8%@&E%8&;%A&G&E'J&G&8&G)=#E#
+FEADADFEFEFEADFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEFEADADFEFEFEADFE;ADFEFEFEADADFEFEFEADADFEFEFEADADFEFEFEADADADFFFEADADFFH#@&8%9$9%:$B$:$:%8"9"9$9"A%:$9"9%A$A"9"9$9"9"8"8"9rJ";$C";$:$B"<$8#=#E#
+ADFEADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD4ADADADADADADADADADADADADADADADFFADADFEFFADH#J#=#E#
+FEADSAADFFFEADADFFH#J#=#E#
+ADFESAFFADADFEFFADH#J#=#E#
+FEADSAADFFFEADADFFH#J#=#E#
+ADFESAFFADADFEFFADH#J#=#E#
+FEADSAADFFFEADADFFH#J#=#E#
+ADFESAFFADADFEFFADH#J#=#E#
+FEADSAADFFFEADADFFH#J"?"J"J"C"<"J"J"<"C$:$C";$:$8#=#E#
+ADFE4FEFEO FE5FEFEFEO-FE4FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFADADFEFFADH#J"J#;#C&8&@#;&8)=#E#
+FEADO?ADP=FEFEFEFEFEADADADFEFEADADADFEFEFEFEADADADFEFEADADADFEADADFFFEADADFFH#@$:#;$;#:$B$:$9"9"8&9$9$A#:$=#C$A%:$9(8":$J#;#J#H#=#E#
+ADFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEADFEADFEFEFEFEFEADFEFEFEFEFEFEFEFEFEFEFEFEADFEFEFEFEFEFEADFEADFEADFEFEFEFEFE6ADADADADCADADFFADADFEFFADH#?&8%9&9%8&@&8&@#:&9#@%8&;%A&A%8&9#8'8&J&J#=#E#
+FEADFEADADADFEFEADADFEFEADADADFEFEADADFEFEADADADFEFEADADADFEFEADADADFEFEADFEADADADFEFEADFEADADFEFEADADADFEFEADADFEFEADADADFEFEADADFEFEADADADFEFEADFEADFEFEADFEFEADADADFEKADFEFEFEADEADFFFEADADFFH#?"?"A"J"G"C"A"H"J"C"9"8":"J&J#=#E#
+ADFEADADAD8ADADADADAD;ADADADADADO!FEADADADFEEFFADADFEFFADH):$J$9&J$=&J&@&J$<&9&G&G&J#=#E#
+FEADADFEFEFEFEFEFEFEFE9FEFEFEFEFEFEFEFE@FEFEFEFEFEFEFEFE;FEFEFEFEFEFEFEFEFEFE?FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE7ADFFFEADADFFH)9%J%8&J%<&J&@&J%<&9&G&G&J#=#E#
+ADFEADADADADADADFEADADAD9ADADADADADADADADAD@ADADADADADADADADAD;ADADADADADADADADADAD>FEADADADADADADADADADADADADADADADADADADADADADADAD7FFADADFEFFADH#I"A"?"D"B"D"E"H"J#=#E#
+FEADFEFEFEFEFEFEFEFEQ%ADFFFEADADFFH#?,9&9%8&@&8&8%@&E%8&;%A&G&E'J&8&G&8)=#E#
+ADFEADFEFEFEADFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEFEADADFEFEFEADFEJADFEFEFEADADFEFEFEADADFEFEFEADADFEFEFEADADFFADADFEFFADH#@&8%9$9%:$B$:$:%8"9"9$9"A%:$9"9%A$A"9"9$9"9"8"8"9rJ"<"C$:$C";$:$8#=#E#
+FEADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD4ADADADADADADADADADADADADADADADADFFFEADADFFH#J#=#E#
+ADFESAFFADADFEFFADH#J#=#E#
+FEADSAADFFFEADADFFH#J#=#E#
+ADFESAFFADADFEFFADH#J#=#E#
+FEADSAADFFFEADADFFH#J#=#E#
+ADFESAFFADADFEFFADH#J#=#E#
+FEADSAADFFFEADADFFH#J#=#E#
+ADFESAFFADADFEFFADH#J"?"J"J"C"<"J"J";$C";$:$A&8)=#E#
+FEAD4FEFEO FE5FEFEFEO-FE4FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEADADFFFEADADFFH#J"J#;&@#;&8&@%:(=#E#
+ADFEO?ADP=FEFEFEADADADFEFEFEFEADADADFEFEADADADFEADADADADADADADADADFFADADFEFFADH#@$:#;$;#:$B$:$9"9"8&9$9$A#:$=#C$A%:$9(8":$J#;"D#;"J#>#=#E#
+FEADFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEADFEADFEFEFEFEFEADFEFEFEFEFEFEFEFEFEFEFEFEADFEFEFEFEFEFEADFEADFEADFEFEFEFEFE6ADADADADADAD8FEADADFFFEADADFFH#?&8%9&9%8&@&8&@#:&9#@%8&;%A&A%8&9#8'8&J#J#J$8#=#E#
+ADFEFEADADADFEFEADADFEFEADADADFEFEADADFEFEADADADFEFEADADADFEFEADADADFEFEADFEADADADFEFEADFEADADFEFEADADADFEFEADADFEFEADADADFEFEADADFEFEADADADFEFEADFEADFEFEADFEFEADADADFE?FEAD4FEAD9FEFEFEFFADADFEFFADH#?"?"A"J"G"C"A"H"J"C"9"8":"J#J#J#9)=#E#
+FEADADADAD8ADADADADAD;ADADADADADBFEAD4FEAD4FEADADADADADFEADADFFFEADADFFH):$J$9&J$=&J&@&J$<&9&A#:&A#A&F#=#E#
+ADFEADFEFEFEFEFEFEFEFE9FEFEFEFEFEFEFEFE@FEFEFEFEFEFEFEFE;FEFEFEFEFEFEFEFEFEFE?FEFEFEFEFEFEFEFEFEFEFEFEFEFEADFEFEFEFEFEFEADFEFEFEFEFEFFADADFEFFADH"r9%J%8&J%<&J&@&J%<&9&@#;&@#B&@";#=#E#
+FEADFEADADAD9ADADADADADADADADAD@ADADADADADADADADAD;ADADADADADADADADADAD>FEADADADADADADADADADADADADADFEADADADADADADFEADADADADADADFEADFFFEADADFFH#I"A"?"D"B"D"E"H"J#@#=#E#
+ADFEFEFEFEFEFEFEFEFEPGFEADFFADADFEFFADH#?,9&9%8&@&8&8%@&E%8&;%A&G&E'J%H%8&G)=#E#
+FEADADFEFEFEADFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEFEADADFEFEFEADFE<FEFEFEFEFEFEFEFEADFEFEFEADADFEFEFEADADADFFFEADADFFH#@&8%9$9%:$B$:$:%8"9"9$9"A%:$9"9%A$A"9"9$9"9"8"8"9rJ":&B":&9$B"<$8#=#E#
+ADFEADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD4ADADADADADADADADADADADADADADADADADADADFFADADFEFFADH#J#=#E#
+FEADSAADFFFEADADFFH#J#=#E#
+ADFESAFFADADFEFFADH#J#=#E#
+FEADSAADFFFEADADFFH#J#=#E#
+ADFESAFFADADFEFFADH#J#=#E#
+FEADSAADFFFEADADFFH#J#=#E#
+ADFESAFFADADFEFFADH#J#=#E#
+FEADSAADFFFEADADFFH#J"?"J"J"C"<"J"J"="C";$:$C";$8#=#E#
+ADFE4FEFEO FE5FEFEFEO-FE4FEFEFEFEFEFEFEFEFEFEFEFEFEFFADADFEFFADH#J"J#="B#;&8&@#;)=#E#
+FEADO?ADP=FEFEFEFEFEFEADADADFEFEADADADFEFEFEFEADADADFEADADFFFEADADFFH#@$:#;$;#:$B$:$9"9"8&9$9$A#:$=#C$A%:$9(8":$J#<#B#J#A#=#E#
+ADFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEADFEADFEFEFEFEFEADFEFEFEFEFEFEFEFEFEFEFEFEADFEFEFEFEFEFEADFEADFEADFEFEFEFEFE6ADADFEADADAD;ADADFFADADFEFFADH#?&8%9&9%8&@&8&@#:&9#@%8&;%A&A%8&9#8'8&J#=#E#
+FEADFEADADADFEFEADADFEFEADADADFEFEADADFEFEADADADFEFEADADADFEFEADADADFEFEADFEADADADFEFEADFEADADFEFEADADADFEFEADADFEFEADADADFEFEADADFEFEADADADFEFEADFEADFEFEADFEFEADADADFEOGADFFFEADADFFH#?"?"A"J"G"C"A"H"J"C"9"8":"J#J#=#E#
+ADFEADADAD8ADADADADAD;ADADADADAD@FEADO)FFADADFEFFADH):$J$9&J$=&J&@&J$<&9&?#<&J&F#=#E#
+FEADADFEFEFEFEFEFEFEFE9FEFEFEFEFEFEFEFE@FEFEFEFEFEFEFEFE;FEFEFEFEFEFEFEFEFEFE?FEFEFEFEFEFEFEFEFEFEFEFEFEFEADFEFEFEFEFE8FEFEFEFEFEADFFFEADADFFH)9%J%8&J%<&J&@&J%<&9&@&8&J&F#=#E#
+ADFEADADADADADADFEADADAD9ADADADADADADADADAD@ADADADADADADADADAD;ADADADADADADADADADAD>FEADADADADADADADADADADADADADFEFEFEFEFEADADADADAD8ADADADADADFFADADFEFFADH#I"A"?"D"B"D"E"H"J'J#=#E#
+FEADFEFEFEFEFEFEFEFEOGADADADADFEADO&ADFFFEADADFFH#?,9&9%8&@&8&8%@&E%8&;%A&G&E'J&8&G)=#E#
+ADFEADFEFEFEADFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEFEADADFEFEFEADFEO#ADFEFEFEADADFEFEFEADADFEFEFEADADFFADADFEFFADH#@&8%9$9%:$B$:$:%8"9"9$9"A%:$9"9%A$A"9"9$9"9"8"8"9rJ"="C";$:$C";$8#=#E#
+FEADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD4ADADADADADADADADADADADADADADFFFEADADFFH#J#=#E#
+ADFESAFFADADFEFFADH#J#=#E#
+FEADSAADFFFEADADFFH#J#=#E#
+ADFESAFFADADFEFFADH#J#=#E#
+FEADSAADFFFEADADFFH#J#=#E#
+ADFESAFFADADFEFFADH#J#=#E#
+FEADSAADFFFEADADFFH#J#=#E#
+ADFESAFFADADFEFFADH#J"?"J"J"C"<"J"J"="C"=":$A&8)=#E#
+FEAD4FEFEO FE5FEFEFEO-FE4FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEADADFFFEADADFFH#J"J#="B#=":&@%:(=#E#
+ADFEO?ADP=FEFEFEFEFEFEFEADADADFEADADADADADADADADADFFADADFEFFADH#@$:#;$;#:$B$:$9"9"8&9$9$A#:$=#C$A%:$9(8":$J#<#B#<#J#>#=#E#
+FEADFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEADFEADFEFEFEFEFEADFEFEFEFEFEFEFEFEFEFEFEFEADFEFEFEFEFEFEADFEADFEADFEFEFEFEFE6ADADFEADADADFEAD6FEADADFFFEADADFFH#?&8%9&9%8&@&8&@#:&9#@%8&;%A&A%8&9#8'8&J$8#=#E#
+ADFEFEADADADFEFEADADFEFEADADADFEFEADADFEFEADADADFEFEADADADFEFEADADADFEFEADFEADADADFEFEADFEADADFEFEADADADFEFEADADFEFEADADADFEFEADADFEFEADADADFEFEADFEADFEFEADFEFEADADADFEOBFEFEFEFFADADFEFFADH#?"?"A"J"G"C"A"H"J"C"9"8":"J#J#J#9)=#E#
+FEADADADAD8ADADADADAD;ADADADADAD@FEAD4FEAD6FEADADADADADFEADADFFFEADADFFH):$J$9&J$=&J&@&J$<&9&?#<&?#C&F#=#E#
+ADFEADFEFEFEFEFEFEFEFE9FEFEFEFEFEFEFEFE@FEFEFEFEFEFEFEFE;FEFEFEFEFEFEFEFEFEFE?FEFEFEFEFEFEFEFEFEFEFEFEFEFEADFEFEFEFEFEFEADFEFEFEFEFEFFADADFEFFADH"r9%J%8&J%<&J&@&J%<&9&@&8&@&?&@";#=#E#
+FEADFEADADAD9ADADADADADADADADAD@ADADADADADADADADAD;ADADADADADADADADADAD>FEADADADADADADADADADADADADADFEFEFEFEFEADADADADADFEFEFEFEFEADADADADADFEADFFFEADADFFH#I"A"?"D"B"D"E"H"J'F'H#@#=#E#
+ADFEFEFEFEFEFEFEFEFEOGADADADADFEADADADADADFEADFEADFFADADFEFFADH#?,9&9%8&@&8&8%@&E%8&;%A&G&E'J&G)=#E#
+FEADADFEFEFEADFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEFEADADFEFEFEADFEO*ADFEFEFEADADFEFEFEADADADFFFEADADFFH#@&8%9$9%:$B$:$:%8"9"9$9"A%:$9"9%A$A"9"9$9"9"8"8"9rJ"="C"=":$B"<$8#=#E#
+ADFEADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD4ADADADADADADADADADADADFFADADFEFFADH#J#=#E#
+FEADSAADFFFEADADFFH#J#=#E#
+ADFESAFFADADFEFFADH#J#=#E#
+FEADSAADFFFEADADFFH#J#=#E#
+ADFESAFFADADFEFFADH#J#=#E#
+FEADSAADFFFEADADFFH#J#=#E#
+ADFESAFFADADFEFFADH#J#=#E#
+FEADSAADFFFEADADFFH#J"?"J"J"C"<"J"J":&B";$:$C";$8#=#E#
+ADFE4FEFEO FE5FEFEFEO-FE4FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFADADFEFFADH#J"J#;%A#;&8&@#;)=#E#
+FEADO?ADP=FEFEADADADADFEFEFEADADADFEFEADADADFEFEFEFEADADADFEADADFFFEADADFFH#@$:#;$;#:$B$:$9"9"8&9$9$A#:$=#C$A%:$9(8":$J#>#@#;"J#A#=#E#
+ADFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEADFEADFEFEFEFEFEADFEFEFEFEFEFEFEFEFEFEFEFEADFEFEFEFEFEFEADFEADFEADFEFEFEFEFE6ADADFEADADADAD5ADADFFADADFEFFADH#?&8%9&9%8&@&8&@#:&9#@%8&;%A&A%8&9#8'8&J#J#=#E#
+FEADFEADADADFEFEADADFEFEADADADFEFEADADFEFEADADADFEFEADADADFEFEADADADFEFEADFEADADADFEFEADFEADADFEFEADADADFEFEADADFEFEADADADFEFEADADFEFEADADADFEFEADFEADFEFEADFEFEADADADFEO'FEAD>ADFFFEADADFFH#?"?"A"J"G"C"A"H"J"C"9"8":"J#J#J#=#E#
+ADFEADADAD8ADADADADAD;ADADADADADBFEAD4FEAD?FFADADFEFFADH):$J$9&J$=&J&@&J$<&9&G&A#A&F#=#E#
+FEADADFEFEFEFEFEFEFEFE9FEFEFEFEFEFEFEFE@FEFEFEFEFEFEFEFE;FEFEFEFEFEFEFEFEFEFE?FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEADFEFEFEFEFEADFFFEADADFFH)9%J%8&J%<&J&@&J%<&9&G&@#B&F#=#E#
+ADFEADADADADADADFEADADAD9ADADADADADADADADAD@ADADADADADADADADAD;ADADADADADADADADADAD>FEADADADADADADADADADADADADADADADADADADFEADADADADADADFFADADFEFFADH#I"A"?"D"B"D"E"H"J#J#=#E#
+FEADFEFEFEFEFEFEFEFEOIFEADO(ADFFFEADADFFH#?,9&9%8&@&8&8%@&E%8&;%A&G&E'J%8&G)=#E#
+ADFEADFEFEFEADFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEFEADADFEFEFEADFEO$FEFEFEFEADFEFEFEADADFEFEFEADADFFADADFEFFADH#@&8%9$9%:$B$:$:%8"9"9$9"A%:$9"9%A$A"9"9$9"9"8"8"9rJ";"E":&9$C";$8#=#E#
+FEADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD4ADADADADADADADADADADADADADADADADFFFEADADFFH#J#=#E#
+ADFESAFFADADFEFFADH#J#=#E#
+FEADSAADFFFEADADFFH#J#=#E#
+ADFESAFFADADFEFFADH#J#=#E#
+FEADSAADFFFEADADFFH#J#=#E#
+ADFESAFFADADFEFFADH#J#=#E#
+FEADSAADFFFEADADFFH#J#=#E#
+ADFESAFFADADFEFFADH#J"?"J"J"C"<"J"J";$C";$:$A&8)=#E#
+FEAD4FEFEO FE5FEFEFEO-FE4FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEADADFFFEADADFFH#J"J#;&@#;&8&@%:(=#E#
+ADFEO?ADP=FEFEFEADADADFEFEFEFEADADADFEFEADADADFEADADADADADADADADADFFADADFEFFADH#@$:#;$;#:$B$:$9"9"8&9$9$A#:$=#C$A%:$9(8":$J#J#J#>#=#E#
+FEADFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEADFEADFEFEFEFEFEADFEFEFEFEFEFEFEFEFEFEFEFEADFEFEFEFEFEFEADFEADFEADFEFEFEFEFE6ADAD4ADAD>FEADADFFFEADADFFH#?&8%9&9%8&@&8&@#:&9#@%8&;%A&A%8&9#8'8&J&G&J$8#=#E#
+ADFEFEADADADFEFEADADFEFEADADADFEFEADADFEFEADADADFEFEADADADFEFEADADADFEFEADFEADADADFEFEADFEADADFEFEADADADFEFEADADFEFEADADADFEFEADADFEFEADADADFEFEADFEADFEFEADFEFEADADADFE<ADFEFEFEADADFEFEFEAD9FEFEFEFFADADFEFFADH#?"?"A"J"G"C"A"H"J"C"9"8":"J&G&I#9)=#E#
+FEADADADAD8ADADADADAD;ADADADADAD@FEADADADFEFEADADADFEFEADADADADADFEADADFFFEADADFFH):$J$9&J$=&J&@&J$<&9&G&J&F#=#E#
+ADFEADFEFEFEFEFEFEFEFE9FEFEFEFEFEFEFEFE@FEFEFEFEFEFEFEFE;FEFEFEFEFEFEFEFEFEFE?FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE8FEFEFEFEFEFFADADFEFFADH"r9%J%8&J%<&J&@&J%<&9&G&J&@";#=#E#
+FEADFEADADAD9ADADADADADADADADAD@ADADADADADADADADAD;ADADADADADADADADADAD>FEADADADADADADADADADADADADADADADADADAD8ADADADADADFEADFFFEADADFFH#I"A"?"D"B"D"E"H"J#@#=#E#
+ADFEFEFEFEFEFEFEFEFEPGFEADFFADADFEFFADH#?,9&9%8&@&8&8%@&E%8&;%A&G&E'J&G&8&G)=#E#
+FEADADFEFEFEADFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEFEADADFEFEFEADFE;ADFEFEFEADADFEFEFEADADFEFEFEADADFEFEFEADADADFFFEADADFFH#@&8%9$9%:$B$:$:%8"9"9$9"A%:$9"9%A$A"9"9$9"9"8"8"9rJ";$C";$:$B"<$8#=#E#
+ADFEADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD4ADADADADADADADADADADADADADADADFFADADFEFFADH#J#=#E#
+FEADSAADFFFEADADFFH#J#=#E#
+ADFESAFFADADFEFFADH#J#=#E#
+FEADSAADFFFEADADFFH#J#=#E#
+ADFESAFFADADFEFFADH#J#=#E#
+FEADSAADFFFEADADFFH#J#=#E#
+ADFESAFFADADFEFFADH#J#=#E#
+FEADSAADFFFEADADFFH#J"?"J"J"C"<"J"I$:$C"=":$C";$8#=#E#
+ADFE4FEFEO FE5FEFEFEO-FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFADADFEFFADH#J"J&8&@#=":&@#;)=#E#
+FEADO?ADP=FEADADADFEFEADADADFEFEFEFEFEADADADFEFEFEFEADADADFEADADFFFEADADFFH#@$:#;$;#:$B$:$9"9"8&9$9$A#:$=#C$A%:$9(8":$J"J#<#I#A#=#E#
+ADFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEADFEADFEFEFEFEFEADFEFEFEFEFEFEFEFEFEFEFEFEADFEFEFEFEFEFEADFEADFEADFEFEFEFEFE6AD5ADADFEADADADFFADADFEFFADH#?&8%9&9%8&@&8&@#:&9#@%8&;%A&A%8&9#8'8&J#J#=#E#
+FEADFEADADADFEFEADADFEFEADADADFEFEADADFEFEADADADFEFEADADADFEFEADADADFEFEADFEADADADFEFEADFEADADFEFEADADADFEFEADADFEFEADADADFEFEADADFEFEADADADFEFEADFEADFEFEADFEFEADADADFE8FEADO-ADFFFEADADFFH#?"?"A"J"G"C"A"H"J"C"9"8":"J#J#J#=#E#
+ADFEADADAD8ADADADADAD;ADADADADAD;FEAD9FEADAFFADADFEFFADH):$J$9&J$=&J&@&J$<&9&:#A&?#C&F#=#E#
+FEADADFEFEFEFEFEFEFEFE9FEFEFEFEFEFEFEFE@FEFEFEFEFEFEFEFE;FEFEFEFEFEFEFEFEFEFE?FEFEFEFEFEFEFEFEFEFEFEFEFEFEADFEFEFEFEFEFEADFEFEFEFEFEADFFFEADADFFH)9%J%8&J%<&J&@&J%<&9&9#B&@&?&F#=#E#
+ADFEADADADADADADFEADADAD9ADADADADADADADADAD@ADADADADADADADADAD;ADADADADADADADADADAD>FEADADADADADADADADADADADADADFEADADADADADADFEFEFEFEFEADADADADADFFADADFEFFADH#I"A"?"D"B"D"E"H"J'J#=#E#
+FEADFEFEFEFEFEFEFEFEP/ADADADADFEAD>ADFFFEADADFFH#?,9&9%8&@&8&8%@&E%8&;%A&G&E'J%8&J&G)=#E#
+ADFEADFEFEFEADFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEFEADADFEFEFEADFE5FEFEFEFEADFEFEFEAD8ADFEFEFEADADFEFEFEADADFFADADFEFFADH#@&8%9$9%:$B$:$:%8"9"9$9"A%:$9"9%A$A"9"9$9"9"8"8"9rH&9$C"=":$C";$8#=#E#
+FEADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADFFFEADADFFH#J#=#E#
+ADFESAFFADADFEFFADH#J#=#E#
+FEADSAADFFFEADADFFH#J#=#E#
+ADFESAFFADADFEFFADH#J#=#E#
+FEADSAADFFFEADADFFH#J#=#E#
+ADFESAFFADADFEFFADH#J#=4
+FEADSAADFFFEADFFADFFADFFADFFADFFADFFADFFADFFADFFH#J#=4
+ADFESAFFADADFE98FFADFFADFFADFFADFFADFFADFFADFFADH#J"?"J"J"C"<"J"I$<"B$<":$A&8)=&t&
+FEAD4FEFEO FE5FEFEFEO-FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEADADFFFEAD98ADFFADFEAD98ADFFH#J"J&:"B&:":&@%:(='>&
+ADFEO?ADP=FEADADADFEFEFEADADADFEFEFEADADADFEADADADADADADADADADFFADADFE9898ADFFADFE98FFADH#@$:#;$;#:$B$:$9"9"8&9$9$A#:$=#C$A%:$9(8":$J"=#B"=#J#>#=#8#>&
+FEADFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEADFEADFEFEFEFEFEADFEFEFEFEFEFEFEFEFEFEFEFEADFEFEFEFEFEFEADFEADFEADFEFEFEFEFE6ADFEADADFEAD6FEADADFFFEADFFADFE9898ADFFH#?&8%9&9%8&@&8&@#:&9#@%8&;%A&A%8&9#8'8&J#J#J$8#=#8#=#8#
+ADFEFEADADADFEFEADADFEFEADADADFEFEADADFEFEADADADFEFEADADADFEFEADADADFEFEADFEADADADFEFEADFEADADFEFEADADADFEFEADADFEFEADADADFEFEADADFEFEADADADFEFEADFEADFEFEADFEFEADADADFE8FEAD4FEAD@FEFEFEFFADADFE98FFFEADFFADH#?"?"A"J"G"C"A"H"J"C"9"8":"J#9#E#9#J#9)=#9#;$8#
+FEADADADAD8ADADADADAD;ADADADADAD;FEADFEADFEADFEAD6FEADADADADADFEADADFFFEADADFFFEAD98ADFFH):$J$9&J$=&J&@&J$<&9&:#9#<&:#9#C&F#=#9$:#9#
+ADFEADFEFEFEFEFEFEFEFE9FEFEFEFEFEFEFEFE@FEFEFEFEFEFEFEFE;FEFEFEFEFEFEFEFEFEFE?FEFEFEFEFEFEFEFEFEFEFEFEFEFEADFEADFEFEFEFEFEFEADFEADFEFEFEFEFEFFADADFE98ADFFADFEFFADH"r9%J%8&J%<&J&@&J%<&9&9#;&8&9#;&?&@";#=#:#:#9#
+FEADFEADADAD9ADADADADADADADADAD@ADADADADADADADADAD;ADADADADADADADADADAD>FEADADADADADADADADADADADADADFEADFEFEFEFEFEADADADADADFEADFEFEFEFEFEADADADADADFEADFFFEADFFADFE98ADFFH#I"A"?"D"B"D"E"H"J'F'H#@#=#:#9#:#
+ADFEFEFEFEFEFEFEFEFEOGADADADADFEADADADADADFEADFEADFFADADFE98FFFEADFFADH#?,9&9%8&@&8&8%@&E%8&;%A&G&E'J%H%?&G)=#;':#
+FEADADFEFEFEADFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEADADFEFEFEADADFEFEFEADADFEFEFEADFE5FEFEFEFEFEFEFEFEADFEFEFEADADFEFEFEADADADFFFEADADFFADFEAD98ADFFH#@&8%9$9%:$B$:$:%8"9"9$9"A%:$9"9%A$A"9"9$9"9"8"8"9rH&;"A&;":$B"<$8#=#;&;#
+ADFEADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADFFADADFE98ADFEADFEFFADH#J#=#<%;#
+FEADSAADFFFEADFFADFE98ADFFH#J#=#<$<#
+ADFESAFFADADFE98FEADFFADH#J#=#=#<#
+FEADSAADFFFEADAD98ADFFH5=4
+SEADFEADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADADFEADFFADFFADFFADFFADFFADFFADFFADFFADH5=4
+SEFEADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFFEADFFADFFADFFADFFADFFADFFADFFADFFADFFHz=z
+SEAD3AD
+
+
+
+
+
+I5
+SCFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEH5
+SEFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFFH#y5z#x#
+ADFE98PAAD98ADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADP198ADFF98FFADH#B5J%A#
+FEADPCFFADFE98FFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFEP1FFADFFADADFFH#@)z#J'?#
+ADFEADFFADFEAD98ADFFP;ADFEADP1ADFFADFFADFFFFADH#>+J#J)=#
+FEADFFADFFADADADFE98FFADP;ADFEP1FFADADADFFADFFADADFFH#<&8&J#J#8';#
+ADFEADFFADFFADFEAD98ADFFP;FEADP1ADFFADADADFFADFFFFADH#:'9&J#J#;&9#
+FEADFFADFFADADADADFE98FFADP;ADFEP1FFADADFFADFFADADFFH#8&<&J#J#<*
+ADFEADFFADFFADFEAD98ADFFP;FEADP1ADFFADADADFFADFF98FFADH)=&J#J#?'
+FEADFEADFEADADADADFE98FFADP;ADFEP1FFADADFEADFEADFFH)=&J#J#?'
+ADFE9898ADFEADFEFEAD98ADFFP;FEADP1ADFFFEADFE98FFADH#8&<&J#J#<*
+FEAD9898FEADFEADFE98FFADP;ADFEP1FFADFEADFEAD989898ADFFH#:'9&J#J#;&9#
+ADFE9898ADFEADFEFEAD98ADFFP;FEADP1ADFFFEADFE9898FFAD&C#<&8&J#J#8';#J%
+F7F7F7F7F7FEAD9898FEADFEADFE98FFADP;ADFEP1FFADFEADFEAD9898ADFFFF7F7F7F7&C#>+J#J)=#J&
+F6F6F6F6F6ADFE9898ADFEADFEAD98ADFFP;FEADP1ADFFADFEADFE9898FFADFF6F6F6F6F68$C#@5J'?#J%
+F9F9F9FEADPE9898FEADFE98FFADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEP1FFADFEAD9898ADFFGF9F9F9F7H#B5J%A#
+ADFEPC9898AD98ADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADFEADP1ADFE9898FFADH5
+SEFEADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFH5
+SEADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADFFADIz
+SCAD
+
+
+
+
+
+
+
+
+
+
+<z"z"z
+0F6F7T&F6F71F6;z8z8z
+1F9T%F91F9
+
+7z8z8z
+5F7T%F74F7"J"J"
+F76F7T&F7
+ENDBITMAP
+%%EndBinary
+0 F
+(FIGURE 28) 133.57 131.32 T
+1 F
+(- Combobox) 187.46 131.32 T
+0 0 612 792 C
+1 10 Q
+0 X
+0 0 0 1 0 0 0 K
+(entry \336eld which when activated will pop up the) 315 713.33 T
+(scrolledlistbox beneath the entry \336eld. The simple non-) 315 701.33 T
+(dropdown combobox permanently displays the listbox) 315 689.33 T
+(beneath the entry \336eld and has no arrow button. Either) 315 677.33 T
+(style allows an optional entry \336eld label.) 315 665.33 T
+0 12 Q
+(Selectionbox) 395.17 634 T
+1 10 Q
+-0.43 (The Selectionbox class combines a scrolled list of items,) 315 615.33 P
+(an editable entry \336eld for the selected item, and labels) 315 603.33 T
+(for the list and entry \336eld, allowing the user to select or) 315 591.33 T
+(enter one item from a list of alternatives. The Selection-) 315 579.33 T
+-0.32 (box also provides a child site and an option to control its) 315 567.33 P
+(position.) 315 555.33 T
+0 12 Q
+(Fileselectionbox) 386.5 291.14 T
+1 10 Q
+(The Fileselectionbox presents a \336le selector similar to) 315 266.48 T
+(that found in the Motif widget set. It consists of a \336le) 315 254.48 T
+(and directory list as well as a \336lter and selection entry) 315 242.48 T
+-0.25 (widget. A child site also exists which may be positioned) 315 230.48 P
+(at several locations via an option. An extensive option) 315 218.48 T
+(set is provided which enables speci\336cation of initial) 315 206.48 T
+(directory) 315 194.48 T
+(, search commands, \336lter mask, no match) 350.45 194.48 T
+(string, and mar) 315 182.48 T
+(gins.) 375.09 182.48 T
+0 12 Q
+(Dialogshell) 399.16 151.14 T
+1 10 Q
+(The Dialogshell class provides base class support for) 315 128.48 T
+(top level [incr W) 315 116.48 T
+(idgets] modal dialogs. This includes) 382.64 116.48 T
+(dialog mapping, button management, separator control,) 315 104.48 T
+(and a child site. The \324activate\325 command maps the dia-) 315 92.48 T
+-0.3 (log and waits based on the modality) 315 80.48 P
+-0.3 (. Non-modal dialogs) 456.45 80.48 P
+315 72 540 720 C
+315 319.14 540 552 C
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+315 347 540 543 R
+7 X
+0 0 0 1 0 0 0 K
+V
+0.5 H
+2 Z
+0 X
+N
+%%BeginBinary: 13238
+226 306 116.23 157.37 0 369.77 381
+/red <
+7266F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF80808080
+8080808080808080808080808080808080808080404040404040404040404040
+4040404040404040404040000000000000000000000000000000000039C069DD
+00FF0000003333330033CCDD9999112277005544FFCC66AABBFF33EE9999CC7A
+EFD39765E1A36FE700557FFF5500B22E99FFFFB07AFFB0CC0087AFB4CD73E6A2
+4DBF88F5439D58D750D080C0C080C0808060C000FFA000FF20C0A040C040D060
+F0E010B499FFA0BE8BD28BD9B3FF720019BF2FFF6223852F465F4770FF0000FF
+> store
+/green <
+9F99DE00000000000000000000000000FFFFFFBFBFBFBFBF8080808080404040
+40000000FFFFFFFFFFBFBFBFBF808080808040404040400000000000FFFFFFFF
+FFBFBFBFBFBF8080808040404040400000000000FFFFFFFFFFBFBFBFBFBF8080
+8080804040400000000000FFFFFFBFBFBFBFBF80808040404040400063E0B500
+996699FF00663399BBFF99DD99FF112277005544CCCC66AABB6600EE6600CC69
+E3B59765E1A36FE7006B7FFF1A00B28B99FFFFB094FF30F700CEEEEE0073E6A2
+4DBF88F54DB358D78080C0C080C080808060C08000A080402070A0402040D0F0
+F0E010B489E4A0BE5BB477D9B3FF77FF19264F00B641DE4F829E4780FF0000FF
+> store
+/blue <
+FFFFB3FFFFFFFFFFFFFFFFFFFFFFFFFFBF8040FFBF804000FFBF804000FFBF80
+00BF8040FFBF804000FF804000FFBF804000FFBF804000FFBF804000FFBF8040
+00FFBF804000FFBF4000FFBF804000FFBF804000FFBF804000FFBF804000FFBF
+804000FFBF00FFBF804000BF8040FFBF804000FFBF40FFBF8040004063E0B500
+FF3399FF88666666009966DDFFFF112277DD554499FFCCAABBCC99EE9966CC69
+E3B59765E1A36FE7BF2F7FCC8BEEB2576BFBB3B01532602480FAEEB40073E6A2
+4DBF88F556CA58D7D050C080C08080C08060C080FF0000402070C0802040D060
+50E010B476C4A0BE7A8C65D9B3E0850070264F00FC5AE050B4A0FF9000FF00FF
+> store
+ BEGINBITMAPCOLORc
+z"z"z"
+6F6F7QIF6F76F6F7J"
+RHF78z8z8z
+4F9QHF94F9
+
+;z"
+R?F7F6<z"z"z"z
+0F6F7Q8F6F70F6F70F6=z8z8z8z
+/F9Q7F9/F9/F9
+J'>$H"9#I'
+O0FEFEFEFEF9FEFEFEFEFEFEFEFEFEFEFEFEFEJ'?"I"J"8%Js"
+O/FEFEF9F9F9FEF9FE9F9F9F9FEFEO@F6F7J"J#Jr
+O4F9BF9F9P-F9J#8"9$?$:$8"8&:$9'D$9(
+O1FEFEF9FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF9FEFEFEFEFEFEFEFEF9FEFEFE@s"J"9#8'<08$:*8%;%8*9$J$
+F6F7JF9FEFEFEFEFEF9FEFEFEFEFEF9FEFEF9FEFEFEF9FEFEF9F9F9F9F9FEFEFEF9FEFEFEF9F9FEF9FEFEFEFEFEF9FEFEFEF9FEFEFEF9F9F9FEF9O!F6F6F7ArJ#9":"A";%C$<">&9$:&J"
+F9LF9F9FEFEFEF9F9F9F9F9F9F9F9F9F9F9FEFEF9F9F9F9FEFEFEF9O#F9@sJ"8#;%>%J#
+F7KFEF9F9F9F9F9F9F9F9F9F9P.F7F7@tJ">%>%9%C$J$:&J$
+F9KFEFEF9FEFEFEF9FEFEFEF9FEFEFEF9FE7FEF9FEFEF9F9FEFEO"F9F9F9J0808&8,8"9$829"
+O0F9FEFEFEFEF9F9F9F9FEFEFEF9F9FEFEF9F9F9FEFEFEF9F9F9F9FEFEFEF9F9FEFEF9FEFEF9F9F9FEFEFEF9F9F9FEFEFEF9FEFEFEFEFEF9F9F9F9FEFEFEF9F9F9FEFEFEFEJ':$8%9$:$:r9$9z:$9rJs
+O/F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F90F9F9F9F9F9O/F7Jt
+R7F9
+=z8z8z8z
+/F7Q7F7/F7/F7rF"J"F"F%
+F7F7Q8F7F7F7F7F7F7'z&
+F6F6F6F6F6F7R>E5F6F6F6F6F68$J%
+F9F9F9R@F9F9F9F7
+
+
+
+
+
+
+
+
+
+
+
+
+J#8#
+4FEFEFEFE
+J"8"8%8*9%
+7FEFEFEFEFEFEFEE5FEFEFEE5FEFEFEFEFEFEFEJ"8)81
+7E5E5E5FEFEE5E5FEFEFEE5E5FEFEE5E5FEFEE5FEFEE5E5FEFEJ%
+O"FEE5E5E5J#D&
+>FEFEE5E5FEFEFEJ%D"8"
+>E5E5E5E5E5FEJ":#B%
+;FEFEFEFEFEE5E5J+B'
+8E5FEFEE5E5FEFEFEFEE5E5FEFEFEFEE5J#9#8%8#8#8#8%
+4E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5
+
+
+
+
+
+
+
+H5>2
+Q:C3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEFEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEH5=4
+Q:FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FFH#z"=#r"r#
+C3FEQ7C3FFE5FEDEFEDEFFE5H#J#=#<#=#
+FEC3Q6FFC3FEE5FFE5E5FFH#J#=#<$<#
+C3FEQ6C3FFE5FEE5FEE5FFE5H#J#=#;%<#
+FEC3Q6FFC3FEE5E5FFE5FEE5FFH#J#=#;&;#
+C3FEQ6C3FFE5FEFFE5E5E5FEFFE5H#J#=#:#8#;#
+FEC3Q6FFC3FEE5FFE5FEE5E5FFH#J#=#:#8$:#
+C3FEQ6C3FFE5FEE5FFE5FEE5FFE5H#J#=#9$9#:#
+FEC3Q6FFC3FEE5E5FFE5E5FEE5FFH#J#=#9#;#9#
+C3FEQ6C3FFE5FEFFE5E5FEFFE5H#J#=#8#<#9#
+FEC3Q6FFC3FEE5FFE5FEE5E5FFH#J#=#8#<$8#
+C3FEQ6C3FFE5FEE5FFE5FEE5FFE5H#J#='=#8#
+FEC3Q6FFC3FEE5DEE5FFE5E5FEE5FFH#J#=&?&
+C3FEQ6C3FFE5FEDEFFE5E5FEDEFFE5H#J#=4
+FEC3Q6FFC3FEE5FFE5FEE5FEE5FEE5FEE5FEE5FEE5DEE5FFH#J#=4
+C3FEQ6C3FFE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FFE5H#J#=#z#
+FEC3Q6FFC3FEE5/DEE5FFH#J#=4
+C3FEQ6C3FFE5FEE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5H#J#=4
+FEC3Q6FFC3FEE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FEE5FFH#J#=%v%
+C3FEQ6C3FFE5FEE5FFE5FEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=%A%
+FEC3Q6FFC3FEE5FFE5E5FEE5FFH#J#=%A%
+C3FEQ6C3FFE5FEE5FFFEE5FFE5H#J#=4
+FEC3Q6FFC3FEE5FFE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FFH#J#=4
+C3FEQ6C3FFE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FFE5H#J#=#z#
+FEC3Q6FFC3FEE5/DEE5FFH#J#=4
+C3FEQ6C3FFE5FEE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5H#J#=4
+FEC3Q6FFC3FEE5DEE5FFE5FFE5FFE5FFE5FFE5FFE5FEE5FFH#J#=%v%
+C3FEQ6C3FFE5FEDEFFE5FEDEFFE5H#J#=&?&
+FEC3Q6FFC3FEE5DEDEFFFEE5DEE5FFH#J#=#8#='
+C3FEQ6C3FFE5FEE5FFFEE5DEDEFFE5H#J#=#8$<#8#
+FEC3Q6FFC3FEE5DEE5FFE5FEE5FFH#J#=#9#<#8#
+C3FEQ6C3FFE5FEFFE5FEDEFFE5H#J#=#9#;#9#
+FEC3Q6FFC3FEE5DEFFFEE5E5FFH#J#=#:#9$9#
+C3FEQ6C3FFE5FEE5FFFEE5DEFFE5H#J#=#:$8#:#
+FEC3Q6FFC3FEE5DEE5FFE5FEE5FFH#J#=#;#8#:#
+C3FEQ6C3FFE5FEFFE5FEDEFFE5H#J#=#;&;#
+FEC3Q6FFC3FEE5DEFFE5FEE5E5FFH#J#=#<%;#
+C3FEQ6C3FFE5FEE5FEE5DEFFE5H#J#=#<$<#
+FEC3Q6FFC3FEE5DEE5FEE5FFH#J#=#=#<#
+C3FEQ6C3FFE5FEFEDEFFE5H5=4
+Q:FEC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FEE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFH5=4
+Q:C3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5Hz>z
+Q:E51E5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+J&?#F#8#
+5FEFEFEFEFEFEFEFEFEFEFEJ(J#
+4FEFEE5E5E5FEFE>E5E5J%<%9%8"8%8%8&
+=FEFEFEFEFEFEFEFEFEFEFEFEFEFEE5FEFEFEFEFEFEFEFEE5FEFEJ/:08":'9%
+4E5FEFEFEE5E5E5E5FEFEE5E5FEFEFEFEE5E5FEFEE5FEFEE5E5FEFEE5E5E5FEFEE5E5FEFEFEE5FEFEJ&J#H"
+5E5E5FEFEFE7E5E5E5J"8"9#>#
+7E5FEFEFEFEFEJ#8";%<%
+4FEFEE5E5E5E5E5E5E5E5E5J#>#;#;"
+@FEFEFEFEFEFEFEJ/:.8%9'
+4E5FEFEFEFEFEE5E5E5FEFEFEFEE5E5FEFEFEFEE5E5E5FEFEFEFEE5E5FEFEE5E5FEFEFEFEE5J&9%8#8%9%:&8%8#8#
+5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5
+
+
+
+
+
+
+
+
+H5
+R%C3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3H5
+R%FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FEC3FFH#z#
+C3FER!C3FFC3H#J#
+FEC3R!C3FFH#J#
+C3FER!FFC3H#J#
+FEC3R!C3FFH#J#
+C3FER!FFC3H#J#
+FEC3R!C3FFH#J#
+C3FER!FFC3H#J#
+FEC3R!C3FFH#J#
+C3FER!FFC3H#J#
+FEC3R!C3FFH#J#
+C3FER!FFC3&C#J#C%
+F7F7F7F7F7FEC3R!C3FFF7F7F7F7&C#J#C&
+F6F6F6F6F6C3FER!FFC3F6F6F6F6F68$C#J#D%
+F9F9F9FEC3R!C3FFF9F9F9F7H#J#
+C3FER!FFC3H5
+R%FEC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFH5
+R%C3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3FFC3Hz
+R%E5
+
+
+
+
+
+
+
+
+
+
+<z"z"z
+0F6F7QIF6F71F6;z8z8z
+1F9QHF91F9
+
+7z8z8z
+5F7QHF74F7"J"J"
+F76F7QIF7
+ENDBITMAP
+%%EndBinary
+360 354 495 372 R
+7 X
+V
+4 8 Q
+0 X
+(selectionbox .sb) 360 366.67 T
+(pack .sb -padx 10 -pady 10) 360 356.67 T
+0 10 Q
+(FIGURE 29) 371.53 329.1 T
+1 F
+( - Selectionbox) 422.92 329.1 T
+315 72 540 720 C
+0 0 612 792 C
+FMENDPAGE
+%%EndPage: "15" 15
+%%Page: "16" 16
+612 792 0 FMBEGINPAGE
+[0 0 0 1 0 0 0]
+[ 0 1 1 0 1 0 0]
+[ 1 0 1 0 0 1 0]
+[ 1 1 0 0 0 0 1]
+[ 1 0 0 0 0 1 1]
+[ 0 1 0 0 1 0 1]
+[ 0 0 1 0 1 1 0]
+ 7 FrameSetSepColors
+FrameNoSep
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+1 10 Q
+0 X
+0 0 0 1 0 0 0 K
+(return control immediately) 72 465.48 T
+(, whereas global and applica-) 178.56 465.48 T
+(tion modal dialogs wait until the \324deactivate\325 command) 72 453.48 T
+(is invoked. The \324deactivate\325 command accepts an) 72 441.48 T
+(optional ar) 72 429.48 T
+(gument which becomes the return value of) 114.87 429.48 T
+(the \324activate\325 command. This provides dialog deactiva-) 72 417.48 T
+(tion status noti\336cation.) 72 405.48 T
+0 12 Q
+(Dialog) 167.83 374.14 T
+1 10 Q
+(The Dialog class is a specialized version of the Dia-) 72 351.48 T
+(logShell with four prede\336ned buttons tagged, \322OK\323,) 72 339.48 T
+(\322Cancel\323, \322Apply\323, and \322Help\323. By default the Dialog) 72 327.48 T
+(class provides automatic deactivation and status return) 72 315.48 T
+(following selection of either the \322OK\323 or \322Cancel\323 but-) 72 303.48 T
+(ton. The status indicator is 1 for \322OK\323 and 0 for \322Can-) 72 291.48 T
+(cel\323. Automatic deactivation may be disabled, enabling) 72 279.48 T
+(more user control over deactivation and status noti\336ca-) 72 267.48 T
+(tion. In this case, the user must invoke the deactivate) 72 255.48 T
+-0.43 (method explicitly and is free to pass a status return value) 72 243.48 P
+(as needed.) 72 231.48 T
+0 12 Q
+(Messagedialog) 147.17 200.14 T
+1 10 Q
+(The Messagedialog class provides a bitmap and mes-) 72 181.48 T
+(sage text within a dialog context. Options control the) 72 169.48 T
+(position of the bitmap and message. All the standard) 72 157.48 T
+(dialog control options are also available.) 72 145.48 T
+72 472.14 297 720 C
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+72 501 297 718.71 R
+7 X
+0 0 0 1 0 0 0 K
+V
+0.5 H
+2 Z
+0 X
+N
+%%BeginBinary: 31814
+365 317 187.71 163.03 0 90 543.43
+/red <
+7266F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF80808080
+8080808080808080808080808080808080808080404040404040404040404040
+4040404040404040404040000000000000000000000000000000000039C069DD
+00FF0000003333330033CCDD9999112277005544FFCC66AABBFF33EE9999CC7A
+EFD39765E1A36FE700557FFF5500B22E99FFFFB07AFFB0CC0087AFB4CD73E6A2
+4DBF88F5439D58D750D080C0C080C0808060C000FFA000FF20C0A040C040D060
+F0E010B499FFA0BE8BD28BD9B3FF720019BF2FFF6223852F465F4770FF0000FF
+> store
+/green <
+9F99DE00000000000000000000000000FFFFFFBFBFBFBFBF8080808080404040
+40000000FFFFFFFFFFBFBFBFBF808080808040404040400000000000FFFFFFFF
+FFBFBFBFBFBF8080808040404040400000000000FFFFFFFFFFBFBFBFBFBF8080
+8080804040400000000000FFFFFFBFBFBFBFBF80808040404040400063E0B500
+996699FF00663399BBFF99DD99FF112277005544CCCC66AABB6600EE6600CC69
+E3B59765E1A36FE7006B7FFF1A00B28B99FFFFB094FF30F700CEEEEE0073E6A2
+4DBF88F54DB358D78080C0C080C080808060C08000A080402070A0402040D0F0
+F0E010B489E4A0BE5BB477D9B3FF77FF19264F00B641DE4F829E4780FF0000FF
+> store
+/blue <
+FFFFB3FFFFFFFFFFFFFFFFFFFFFFFFFFBF8040FFBF804000FFBF804000FFBF80
+00BF8040FFBF804000FF804000FFBF804000FFBF804000FFBF804000FFBF8040
+00FFBF804000FFBF4000FFBF804000FFBF804000FFBF804000FFBF804000FFBF
+804000FFBF00FFBF804000BF8040FFBF804000FFBF40FFBF8040004063E0B500
+FF3399FF88666666009966DDFFFF112277DD554499FFCCAABBCC99EE9966CC69
+E3B59765E1A36FE7BF2F7FCC8BEEB2576BFBB3B01532602480FAEEB40073E6A2
+4DBF88F556CA58D7D050C080C08080C08060C080FF0000402070C0802040D060
+50E010B476C4A0BE7A8C65D9B3E0850070264F00FC5AE050B4A0FF9000FF00FF
+> store
+ BEGINBITMAPCOLORc
+z"z"z"
+6F6F7TJF6F76F6F7J"
+UIF78z8z8z
+4F9TIF94F9
+
+;z"
+U@F7F6<z"z"z"z
+0F6F7T9F6F70F6F70F6=z8z8z8z
+/F9T8F9/F9/F9
+Js8#8$@'>$H"9#I'
+P:FEFEFEFEFEFEFEFEFEFEF9FEFEFEFEFEFEFEFEFEFEFEFEFEJ"8$>"A'?"I"J"8%Js"
+P:F9F9F9F9F9FEFEF9F9F9FEF9FE9F9F9F9FEFEPJF6F7J"9#I"J#Jr
+P@F9F9F9F9BF9F9Q7F9J"9$?$:#8"9$?$:$8"8&:$9'D$9(
+P?FEFEFEFEFEFEFEFEFEF9FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF9FEFEFEFEFEFEFEFEF9FEFEFE@s"J#8$?)9#8'<08$:*8%;%8*9$J$
+F6F7P*FEFEF9F9F9FEFEFEF9FEFEF9F9FEFEFEFEFEF9FEFEFEFEFEF9FEFEF9FEFEFEF9FEFEF9F9F9F9F9FEFEFEF9FEFEFEF9F9FEF9FEFEFEFEFEF9FEFEFEF9FEFEFEF9F9F9FEF9P+F6F6F7ArJ#G":#9":"A";%C$<">&9$:&J"
+F9P+F9F9FEF9F9FEFEFEF9F9F9F9F9F9F9F9F9F9F9FEFEF9F9F9F9FEFEFEF9P-F9@sJ"E'8#;%>%J#
+F7P-F9F9F9F9F9F9FEF9F9F9F9F9F9F9F9F9F9Q8F7F7@tJ%8">%>%9%C$J$:&J$
+F9P<FEF9FEFEFEFEF9FEFEFEF9FEFEFEF9FEFEFEF9FE7FEF9FEFEF9F9FEFEP,F9F9F9J"8";"8$8)80808&8,8"9$829"
+P:FEFEFEFEF9FEFEF9F9F9FEFEFEF9F9FEFEFEFEF9F9F9F9FEFEFEF9F9FEFEF9F9F9FEFEFEF9F9F9F9FEFEFEF9F9FEFEF9FEFEF9F9F9FEFEFEF9F9F9FEFEFEF9FEFEFEFEFEF9F9F9F9FEFEFEF9F9F9FEFEFEFEJ%;t9$8':$8%9$:$:r9$9z:$9rJs
+P:F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F90F9F9F9F9F9P9F7Jt
+U8F9
+=z8z8z8z
+/F7T8F7/F7/F7rF"J"F"F%
+F7F7T9F7F7F7F7F7F7'z&
+F6F6F6F6F6F7U?E5F6F6F6F6F68$J%
+F9F9F9UAF9F9F9F7
+
+
+
+
+
+
+
+
+
+
+
+
+Js$8#
+4FEE5FEFEFEFEJ'
+6E5E5E5E5E5E5J#:"8"8%8&
+:FEFEFEFEFEFEFEFEFEFEE5FEFEJ"8)9"
+@E5E5E5FEFEE5E5FEFEFEJ$J#
+6FEFEFE6E5E5J$D#;"
+6E5E5E5FEFEE5J%
+GE5E5E5E5J":#
+DFEFEFEJ+
+AE5FEFEE5E5FEFEFEFEE5J#:&9#8%8#
+4E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5
+
+
+
+
+
+
+
+
+H5
+U&FFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEH5
+U&FEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFH#Z
+FFFEU#H#
+FEFFH#:":&9$>"E$<$J"J"J"9"C"=#J"B$8#A":#J"
+FFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFECFEBFEO"FEFEFEFEFEGFEFEFEFEFEFEFEFEFECFEH#8#<%8&<#E#<%G"F#J#J#9"C"="H"I#B(A#:"J#9"
+FEFFFEFEFFFFFFFFFEFFFFFFFEFEFFFFFFFEFFFFFFFEFEFFAFEFFO!FEFFFFFFFFFEFEFEFEFFFFFFFEFFFFFEFFFFCFEFFFEH#8#J#
+FFFEFFFFS&FFFFH#J)8#8#?&9$9&8&9$<):$9&9$<#9$:$8&8&:$8&<#8$9,;$:&8$9&9$J$<#9$:$8&:$:$<#8&
+FEFF:FEFFFFFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFEFFFFFEFEFEFFFEFEFEFEFEFFFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFFFEFEFEFEFFFEFEFEFEFEFFFEFEFEFEFFFEFEFEFEFEFEFFFEFEFEFFFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFE@FEFEFEFEFFFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFFFEFEFEFEFEH#@$9"8#>)9"@&8&8&8&8&>'8&8&8&?&848-?#:+;%9-8&8&J%?%9-8&8&?&
+FFFEFEFEFEFFFEFFFFFEFFFEFFFEFFFFFFFFFEFFFFFFFEFFFFFFFEFFFEFFFFFFFFFEFFFFFFFEFFFFFFFEFFFEFFFEFFFEFEFFFFFFFEFFFEFFFFFFFEFFFFFFFEFEFFFFFFFEFEFFFFFFFEFFFFFEFFFEFFFEFFFFFEFFFEFFFEFEFFFFFFFEFFFFFEFEFFFFFEFFFFFFFEFFFFFFFEFFFFFFFFFEFFFFFFFEFFFFFFFEFFFFFEFFFFFFFEFFFEFFFFFFFEFFFFFFFE?FFFFFFFEFEFFFFFFFEFFFFFFFEFFFFFEFFFEFFFEFEFFFFFFFEFEFFFFFFFEFFFFFEFFFFH#?&:#;#J$G&:#A$D":#="J"=#B"J$@&8&J#A$G&:#:$
+FEFFFFFFFFFFFEFEFFFEFF@FEFEFEFFFEFEFEFFFEFFFEFEFEFFFEFFFF?FFFEFFFE:FEFEFEFFFEFEFEFFFEFEFEFEFE@FEFFFEFEFEFFFEFEFEFFFEFFFEFFFEH#G#J%G%G%J%@%8PJ%G%@$
+FFFEFEFFHFFFFFFFFFFFFFFFEFFFFFFFFP0FFFFFFFFFFFFFFFEMFFFFFFFFFFFFFFFEFFFFFFH#>"=#8"9#J"D$=#E"C"9#>"J#A&J"=$J#E"F"=#
+FEFFFEFEFFFEFEFFDFEFEFFFEFEFFFEFEFEFFFEFFEFFFFFEFFFEFF;FEFEFFFEJFEFFFEFEFEFFH#8-9$?";59&8%:,>";(8%9&?&8(;#;,9">&?&8,9&9,?&9";-?/;(8&
+FFFEFEFEFEFEFEFFFFFEFEFEFEFFFEFEFEFE4FEFFFFFEFEFEFFFEFFFEFEFEFEFEFEFFFEFEFEFEFFFEFEFEFFFEFEFEFEFFFEFEFEFFFFFFFEFEFEFFFEFEFFFFFEFEFEFFFEFEFEFEFFFEFEFEFFFFFEFEFEFFFFFEFEFEFFFFFEFEFEFEFFFFFEFEFEFFFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFEFEFEFFFEFFFFFEFEFEFFFEFEFEFFFFFEFEFEFFFFFFFEFEFEFFFEFEFEFEFEFEFFFEFEFEFFFFFEFFFEFEFEFFFFFEFEFEFFFEFFFFFEFEFEFFFFFEFEFFFFFEFEFEFFFFFEFEFEFFH#8P8%9P8#:R8Z:$9%;$9$9#:R8$9%:$9#<$:$8Y8$8$8&;P9$9P9P8$:$;$9$@P9"<$8P9#<P8$8R8$:$9#
+FEFFFFFFFFFFFEFF1FFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFEFFH#J"J"J"J"J"J"
+FFFE7FFO0FFBFFO"FFP%FFIFFH#J%
+FEFFR6FEFEFEFFH#J$
+FFFER6FFFFFFH#
+FEFFH"
+FFHz
+U&E5
+
+
+
+
+
+
+
+
+
+
+
+
+J&9#J#D#Js$
+4FEFEFEFEFEFEFE5FEFEFEFEP>FEE5FEFEJ%8#J#J'
+6E5E5FEFEE5E5EE5E5P@E5E5E5E5E5E5J29%8"8"8%8(8%9%J#;%9%
+8E5FEFEE5FEFEE5FEFEE5FEFEE5FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEE5FEFEFEFEFEFEFEFEFEFEFEFEP7FEFEFEFEFEFEFEFEFEFEJ"808)9";.J.
+AFEFEFEE5E5FEFEE5FEFEE5E5FEFEE5E5E5E5FEFEE5E5FEFEFEFEFEE5E5FEFEE5FEFEE5E5FEFEP<FEFEE5E5FEFEE5FEFEE5E5FEFEJ#A#F#B%J$F%
+BE5E5E5E5E5E5FEE5E5E5P2FEFEFEFEE5E5E5J":#J"=#9&J$?#9&
+AE5FEFE8E5FEFEE5E5FEFEFEP3E5E5E5FEFEE5E5FEFEFEJ%J%9"8"J%9"8"
+FE5E5E5E5>E5E5E5E5E5FEP>E5E5E5E5E5FEJ$C#;#;"I(J(
+8FEFEE5FEFEFEFEFEFEFEE5FEFEE5E5PBFEFEE5FEFEE5E5J%@.8+?.J.
+6FEFEFEE5E5FEFEFEFEE5E5E5FEFEFEFEE5E5FEFEE5E5FEFEFEFEE5E5FEFEFEFEE5E5E5FEFEFEFEE5P<E5FEFEFEFEE5E5E5FEFEFEFEE5J&9&:%9%:#8%8#9#8%9%J#:&8%9%
+4E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5P1E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5
+
+
+
+
+
+
+
+H5>2C5>2
+PIFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEPHFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEH5>4B5=4
+PHFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FFPHFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FFH5?#r"r#B#Z>#r"r#
+PGFFFEDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEE5FEDEFEDEFFE5FFFEPEE5FEDEFEDEFFE5H#z"?#<#=#B#J#<#=#
+FEFFPDDEFEFEE5FFE5E5FFFEFFPMFEE5FFE5E5FFH#J"B$8#A":#J"J"?#<$<#B#J"J#<$<#
+FFFE8FEFEFEFEFEFEFEFEFECFE>DEE5FEE5FEE5FFE5FFFE4FEP8E5FEE5FEE5FFE5H#8"I#B(A#:"J#J"?#;%<#B#I(A"<"H&J#;%<#
+FEFFFEFEFEFEDEDEDEFEDEDEFEDEDECFEDE>FEFEE5E5FFE5FEE5FFFEFFFEFFFEFEFEFEFEFEFEFEFEFEFEFEO7FEE5E5FFE5FEE5FFH#J#J"?#;&;#B#J'J'J#;&;#
+FFFE6DEDEP,DEE5FEFFE5E5E5FEFFE5FFFE5FFFEFFFFFFFEDFFFEFFFFFFFEO6E5FEFFE5E5E5FEFFE5H)9$J$<#9$:$8&:$:$<#J"?#:#8#;#B#8$:$<#>#8#8&8&9$8&A$8(J#:#8#;#
+FEFFDEFEFEFEFEFEFEFEFE@FEFEFEFEDEFEFEFEFEFEFEFEFEFEDEFEFEFEFEFEFEFEFEDE?FEFEE5FFE5FEE5E5FFFEFFFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFFFEFEFEO'FEE5FFE5FEE5E5FFH)8&J%?%9-8&8&J"?#:#8$:#B)8&@'9"9&8&8-9%8)9#J#:#8$:#
+FFFEDEDEFEDEDEDEFEDEDEDEFE?DEDEDEFEFEDEDEDEFEDEDEDEFEDEDEFEDEFEDEFEFEDEDEDEFEFEDEDEDEFEFDEE5FEE5FFE5FEE5FFE5FFFEFFFEFFFFFFFEFEFFFFFFFEFEFEFEFFFFFFFFFFFEFFFFFFFFFEFFFFFFFEFFFFFFFEFFFFFEFEFFFFFEFEFEFEFFFEFFFFFFFEFFFFFFFFFFO'E5FEE5FFE5FEE5FFE5H#>&8&J#A$G&:#J"?#9$9#:#B#>&:#:%J"<%@$J#9$9#:#
+FEFFDEFEFEFEDEFEFEFEFEFE@FEDEFEFEFEDEFEFEFEDEFEDE@FEFEE5E5FFE5E5FEE5FFFEFFFFFEFEFEFFFEFFFFFFFFFE?FFFFFFFFFEFFFEFFO)FEE5E5FFE5E5FEE5FFH#?%8&J%G%J"?#9#;#9#B#?%J$J#9#;#9#
+FFFEDEDEDEFEDEDEDEDEDEMDEDEDEDEDEDEDEFEFDEE5FEFFE5E5FEFFE5FFFEFFFFFFFEO4FEFFFEO)E5FEFFE5E5FEFFE5H#<$J#E"F"=#J"?#8#<#9#B#>"=#J"<"J&J#8#<#9#
+FEFFFEDEFEJFEDEFEFEFEDEAFEFEE5FFE5FEE5E5FFFEFFFEFEFF7FEFE=FEFFFFFFFEO(FEE5FFE5FEE5E5FFH#8,?&9";-?/;(8&@"J"?#8#<$8#B)8&>'8'8&809(8(;"J#8#<$8#
+FFFEDEFEFEFEDEDEDEFEFEFEDEFEFEFEFEFEFEDEFEFEFEDEDEFEDEFEFEFEDEDEFEFEFEDEFEDEDEFEFEFEDEDEFEFEDEDEFEFEFEDEDEFEFEFEDEFE;DEE5FEE5FFE5FEE5FFE5FFFEFFFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFFFFFEFEFEFFFEFFFEFEFEFFFFFEFEFEFFFFFFFEFEFEFFFFFEFEFEFEFEFEFEFEFEFFFFFEFEFEFFFFFEFEO'E5FEE5FFE5FEE5FFE5H#9$9$@&9"<$8&9#<&8$8r8$:$9#<"J"?'=#8#B#8$:$9#:P:P9$:$9$8$8R:$8#9#J'=#8#
+FEFFDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEFEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEFEDEDE;FEFEE5DEE5FFE5E5FEE5FFFEFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFO'FEE5DEE5FFE5E5FEE5FFH#J"J"J"?&?&B#E"J&?&
+FFFEO$DEIDECDEE5FEDEFFE5E5FEDEFFE5FFFEFFP=E5FEDEFFE5E5FEDEFFE5H#J"?4B#J4
+FEFFPDFEFEE5FFE5FEE5FEE5FEE5FEE5FEE5FEE5DEE5FFFEFFPMFEE5FFE5FEE5FEE5FEE5FEE5FEE5FEE5DEE5FFH#J"?4B#J4
+FFFEPDDEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FFE5FFFEPME5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FFE5H5?#z#B#J#z#
+PGFEFFFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEFEE5/DEE5FFFEFFPMFEE5/DEE5FFH#Z?4B#J4
+FFFEPEE5FEE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFFEPME5FEE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5H#J4B#J4
+FEFFQ FEE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FEE5FFFEFFPMFEE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FEE5FFH#J"B$8#A":#J"J%v%B#J"@"A$J%v%
+FFFE8FEFEFEFEFEFEFEFEFECFEHE5FEE5FFE5FEE5FFE5FFFE4FEFEFEFEFEOME5FEE5FFE5FEE5FFE5H#8"I#B(A#:"J#J%A%B#I(;"A#J%A%
+FEFFFEFEFEFEFFFFFFFEFFFFFEFFFFCFEFFHFEE5FFE5E5FEE5FFFEFFFEFFFEFEFEFEFEFFFFFFP FEE5FFE5E5FEE5FFH#J#J%A%B#J'J%A%
+FFFE6FFFFP6E5FEE5FFFEE5FFE5FFFE5FFFEFFFFFFFEP2E5FEE5FFFEE5FFE5H)9$J$<#9$:$8&:$:$<#J%A%B#8$:$<#?$:%A$:&J%A%
+FEFFFFFEFEFEFEFEFEFEFE@FEFEFEFEFFFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFFIFEE5FFE5E5FEE5FFFEFFFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFFFEO<FEE5FFE5E5FEE5FFH)8&J%?%9-8&8&J%A%B)8&F#;&?&8'J%A%
+FFFEFFFFFEFFFFFFFEFFFFFFFE?FFFFFFFEFEFFFFFFFEFFFFFFFEFFFFFEFFFEFFFEFEFFFFFFFEFEFFFFFFFEO"E5FEE5FFFEE5FFE5FFFEFFFEFFFFFFFEFEFFFFFFFEFFFFFFFFFFFFFEFEFFFFFFFEFEFFFFFFFEFFO<E5FEE5FFFEE5FFE5H#>&8&J#A$G&:#J%A%B#>&:#H$J%A%
+FEFFFFFEFEFEFFFEFEFEFEFE@FEFFFEFEFEFFFEFEFEFFFEFFJFEE5FFE5E5FEE5FFFEFFFFFEFEFEFFFEFFFEFEFEP%FEE5FFE5E5FEE5FFH#?%8PJ%G%J%A%B#?%J%J%A%
+FFFEFFFFFFFEMFFFFFFFFFFFFFFFEO"E5FEE5FFFEE5FFE5FFFEFFFFFFFE7FEFFFFFFP%E5FEE5FFFEE5FFE5H#<$J#E"F"=#J%A%B#>"=#J%A%
+FEFFFEFFFEJFEFFFEFEFEFFKFEE5FFE5E5FEE5FFFEFFFEFEFFP;FEE5FFE5E5FEE5FFH#8,?&9";-?/;(8&@"<"J%A%B)8&>'8&848%J%A%
+FFFEFFFEFEFEFFFFFFFEFEFEFFFEFEFEFEFEFEFFFEFEFEFFFFFEFFFEFEFEFFFFFEFEFEFFFEFFFFFEFEFEFFFFFEFEFFFFFEFEFEFFFFFEFEFEFFFEFE>E5FEE5FFFEE5FFE5FFFEFFFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFFFEFEFEFEFEFFFEFEFEFFFEFFFEFEFEFEFEFEFFFFFEFEFEFFFFFEFEFEO>E5FEE5FFFEE5FFE5H#9$9$@P9"<$8P9#<P8$8R8$:$9#<"<"J%A%B#8$:$9#:P9P9W8$:$J%A%
+FEFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFEFFFFFF>FEE5FFE5E5FEE5FFFEFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFO>FEE5FFE5E5FEE5FFH#J"J"J%A%B#E"J%A%
+FFFEO$FFIFFME5FEE5FFFEE5FFE5FFFEFFP=E5FEE5FFFEE5FFE5H#J%A%B#J%J%A%
+FEFFQ FEE5FFE5E5FEE5FFFEFFO,FEFEFEFFO=FEE5FFE5E5FEE5FFH#J%A%B#J$J%A%
+FFFEQ E5FEE5FFFEE5FFE5FFFEO,FFFFFFO>E5FEE5FFFEE5FFE5H#J%A%B#J%A%
+FEFFQ FEE5FFE5E5FEE5FFFEFFPMFEE5FFE5E5FEE5FFH#J%A%B#J%A%
+FFFEQ E5FEE5FFFEE5FFE5FFFEPME5FEE5FFFEE5FFE5H#J%A%B#J%A%
+FEFFQ FEE5FFE5E5FEE5FFFEFFPMFEE5FFE5E5FEE5FFH#J"B$8#A":#J"J%A%B#J"@"A$J#C$:$J%A%
+FFFE8FEFEFEFEFEFEFEFEFECFEHE5FEE5FFFEE5FFE5FFFE4FEFEFEFEFE8FEFEFEFEFEFEFEFEJE5FEE5FFFEE5FFE5H#8"I#B(A#:"J#8$8(8%J%A%B#I(;"A#J'D#;#J%A%
+FEFFFEFEFEFEFFFFFFFEFFFFFEFFFFCFEFFFEFEFEFEFEFEFFFEFEFEFEFEFEFE4FEE5FFE5E5FEE5FFFEFFFEFFFEFEFEFEFEFFFFFF4FEFEFEFEFFFFFFFFFFFFKFEE5FFE5E5FEE5FFH#J#J3J%A%B#J'J%J%A%
+FFFE6FFFFO=FEFFFFFFFEFFFFFEFFFFFFFEFFFFFEFFFFFF5E5FEE5FFFEE5FFE5FFFE5FFFEFFFFFFFEEFEFFFFFFO7E5FEE5FFFEE5FFE5H)9$J$<#9$:$8&:$:$<#J"J%A%B#8$:$<#?$:%A$:&;":#:$J%A%
+FEFFFFFEFEFEFEFEFEFEFE@FEFEFEFEFFFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFF4FF4FEE5FFE5E5FEE5FFFEFFFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFFFEFFFEFEFEFEFEO)FEE5FFE5E5FEE5FFH)8&J%?%9-8&8&C"9$:#J%A%B)8&F#;&?&8'8#;%8&J%A%
+FFFEFFFFFEFFFFFFFEFFFFFFFE?FFFFFFFEFEFFFFFFFEFFFFFFFEFFFFFEFFFEFFFEFEFFFFFFFEFEFFFFFFFEFFFEFFFEFEFE6E5FEE5FFFEE5FFE5FFFEFFFEFFFFFFFEFEFFFFFFFEFFFFFFFFFFFFFEFEFFFFFFFEFEFFFFFFFEFFFEFEFEFFFFFEFEFFFFFFFEO(E5FEE5FFFEE5FFE5H#>&8&J#A$G&:#@"9"8&J%A%B#>&:#H$J&9"<$J%A%
+FEFFFFFEFEFEFFFEFEFEFEFE@FEFFFEFEFEFFFEFEFEFFFEFFFFFFFFFFFEFEFE4FEE5FFE5E5FEE5FFFEFFFFFEFEFEFFFEFFFEFEFE8FFFFFEFEFEFFFEFEFEO)FEE5FFE5E5FEE5FFH#?%8PJ%G%C"A#J%A%B#?%J%J#A%J4
+FFFEFFFFFFFEMFFFFFFFFFFFFFFFEFEFFFF5E5FEE5FFFEE5FFE5FFFEFFFFFFFE7FEFFFFFF:FFFFFFFFFFFFO(E5FEE5FFE5FEE5FEE5FEE5FEE5FEE5FEE5FFE5H#<$J#E"F"=#C":"J%A%B#>"=#J"G"J4
+FEFFFEFFFEJFEFFFEFEFEFFFEFE8FEE5FFE5E5FEE5FFFEFFFEFEFFO FEFEO(FEE5FFE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FFH#8,?&9";-?/;(8&?&9$:%J%A%B)8&>'8&848%:38.J#z#
+FFFEFFFEFEFEFFFFFFFEFEFEFFFEFEFEFEFEFEFFFEFEFEFFFFFEFFFEFEFEFFFFFEFEFEFFFEFFFFFEFEFEFFFFFEFEFFFFFEFEFEFFFFFEFEFEFFFFFEFEFEFFFFFEFFFEFEFEFF4E5FEE5FFFEE5FFE5FFFEFFFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFFFEFEFEFEFEFFFEFEFEFFFEFFFEFEFEFEFEFEFFFFFEFEFEFFFFFEFEFEFEFEFEFFFFFEFEFEFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFEFFFEFEFEFEFEFEGE5FE/DEFFE5H#9$9$@P9"<$8P9#<P8$8R8$:$9#<$;":%J%A%B#8$:$9#:P9P9W8$:$9%8R8$9XJ#E#
+FEFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFF5FEE5FFE5E5FEE5FFFEFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFGFEE5E5FFH#J"J"J%A%B#E"J#E#
+FFFEO$FFIFFME5FEE5FFFEE5FFE5FFFEFFP=E5FEFFE5H#J%A%B#J%J#E#
+FEFFQ FEE5FFE5E5FEE5FFFEFFO,FEFEFEFFO=FEE5E5FFH#J%A%B#J$J#E#
+FFFEQ E5FEE5FFFEE5FFE5FFFEO,FFFFFFO>E5FEFFE5H#J%A%B#J#E#
+FEFFQ FEE5FFE5E5FEE5FFFEFFPMFEE5E5FFH#J%A%B#J#E#
+FFFEQ E5FEE5FFFEE5FFE5FFFEPME5FEFFE5H#J%A%B#J#E#
+FEFFQ FEE5FFE5E5FEE5FFFEFFPMFEE5E5FFH#J%A%B#J"J"A$=#J#E#
+FFFEQ E5FEE5FFFEE5FFE5FFFE4FEMFEFEFEFEFEFEO!E5FEFFE5H#J%A%B#I)@"H':"A#>"J#E#
+FEFFQ FEE5FFE5E5FEE5FFFEFFFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFO"FEE5E5FFH#J%A%B#J&J&J#E#
+FFFEQ E5FEE5FFFEE5FFE5FFFE5FFFEFFFFFF>FFFEFFFFFFO>E5FEFFE5H#J%A%B#8$:$<#:*9&8.9":$;$A$J#E#
+FEFFQ FEE5FFE5E5FEE5FFFEFFFEFEFEFEFEFEFEFFFEFFFFFFFEFFFEFEFEFEFEFEFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEO"FEE5E5FFH#J%A%B)8&@":'8&8#P'8"8"8#;&?%J#E#
+FFFEQ E5FEE5FFFEE5FFE5FFFEFFFEFFFFFFFEFEFFFFFFFEFEFFFEFEFFFFFEFFFEFFFFFFFFFEFEFFFFFFFEFFFEFFFFFFFEFFFFFFFEFEFFFFFFO"E5FEFFE5H#J%A%B#>&:#:"<"J"C$J#E#
+FEFFQ FEE5FFE5E5FEE5FFFEFFFFFEFEFEFFFEFFFFFF;FFFEFEFEO0FEE5E5FFH#J%A%B#?%A"J&:"B%J#E#
+FFFEQ E5FEE5FFFEE5FFE5FFFEFFFFFFFEFF9FFFEFFFEFFFFFFFFFFFFO/E5FEFFE5H#J%A%B#>"=#>"D"@"J"J#E#
+FEFFQ FEE5FFE5E5FEE5FFFEFFFEFEFFFEFEFE6FEO/FEE5E5FFH#J%A%B)8&>&8$9"8+:$8%:&8&8.J#E#
+FFFEQ E5FEE5FFFEE5FFE5FFFEFFFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFEFEFEFEFFFEFEFEFFFFFEFEFEFEFFFEFFFEFEFEFEFEFEFEFEFEFFFEFEFEFFFEFEFEFEFEFEFFFFFEFEFEFFFEO E5FEFFE5H#J%A%B#8$:$9#:U8#9$8%?%:P9$9Q8PJ#E#
+FEFFQ FEE5FFE5E5FEE5FFFEFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFO FEE5E5FFH#J%A%B#E"J#E#
+FFFEQ E5FEE5FFFEE5FFE5FFFEFFP=E5FEFFE5H#J%A%B#J$J#E#
+FEFFQ FEE5FFE5E5FEE5FFFEFFO$FEFEFFOFFEE5E5FFH#J%A%B#J#J#E#
+FFFEQ E5FEE5FFFEE5FFE5FFFEO$FFFFOGE5FEFFE5H#J%A%B#J#E#
+FEFFQ FEE5FFE5E5FEE5FFFEFFPMFEE5E5FFH#J%A%B5@#E#
+FFFEQ E5FEE5FFFEE5FFE5PEFFFEDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEE5FEFFE5H#J%A%B#z?#E#
+FEFFQ FEE5FFE5E5FEE5FFFEFFPDDEFEE5E5FFH#J%A%B#J"@":$J$J"J#E#
+FFFEQ E5FEE5FFFEE5FFE5FFFE4FEFEFEFEFE9FEFEFE;FEJE5FEFFE5H#J%A%B#I):":#C%?#J"="G&J#E#
+FEFFQ FEE5FFE5E5FEE5FFFEFFFEDEFEFEFEFEFEFEDEDEDEFEFEFEFEDEDE4FEDEFEFEFEFEFE4FEE5E5FFH#J%A%B#J&J%J'I#E#
+FFFEQ E5FEE5FFFEE5FFE5FFFE5DEFEDEDEDE8FEDEDEDEO,DEFEDEDEDEFEE5FEFFE5H#J%A%B#8$:$<#:":$B$="9$A$:$9&8$;$8&A$8#?#E#
+FEFFQ FEE5FFE5E5FEE5FFFEFFFEFEFEFEFEFEFEDEFEFEFEFEFEFEFEDEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEDEFEFEFEFEFEFEFEFEFEE5E5FFH#J%A%B)8&@"8"8#B&9#:&?&8&8&8#;-9%8)?#E#
+FFFEQ E5FEE5FFFEE5FFE5FFFEDEFEDEDEDEFEFEDEDEDEFEFEDEDEDEFEDEDEDEFEFEFEFEDEDEDEFEFEDEDEDEFEFEDEDEDEFEDEFEDEDEDEDEDEFEDEDEDEFEDEDEFEFEDEDEFEFEFEFEDEFEDEDEDEFEDEDEDEE5FEFFE5H#J%A%B#>&:#:"J$9&9$A$="J"<%I#E#
+FEFFQ FEE5FFE5E5FEE5FFFEFFDEFEFEFEDEFEDEDE4FEFEFEDEDEFEFEFEFEFEFEFEFEFEDE8DEDEDEDEFEFEE5E5FFH#J%A%B#?%A"I%:#:%@%J#E#
+FFFEQ E5FEE5FFFEE5FFE5FFFEDEDEDEFEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEO/E5FEFFE5H#J%A%B#>"=#J"8"@"C"<"="J"?#E#
+FEFFQ FEE5FFE5E5FEE5FFFEFFFEFEDE=FEFEFEFEFEFEDFEFEE5E5FFH#J%A%B)8&>%:&8-9%8&8-8&9,8*9(8(@#E#
+FFFEQ E5FEE5FFFEE5FFE5FFFEDEDEFEFEFEDEDEFEFEFEDEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEDEDEFEFEFEDEFEFEFEDEDEFEFEFEDEFEFEFEFEFEFEDEDEFEFEFEDEDEFEFEFEDEDEFEFEFEDEDEFEFEFEFEFEDEFEFEFEDEDEFEFEFEFEFEFEFEFEFEDEDEFEFEFEDEDEFEE5FEFFE5H#J%A%B#8$:$9#:%:&8'8$9%:$9'8$:$;$8&9$8$8r:$8#?#E#
+FEFFQ FEE5FFE5E5FEE5FFFEFFDEDEDEDEDEDEFEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEFEE5E5FFH#J%A%B#E"J#E#
+FFFEQ E5FEE5FFFEE5FFE5FFFEDEP=E5FEFFE5H#J%A%B#J#E#
+FEFFQ FEE5FFE5E5FEE5FFFEFFPMFEE5E5FFH#J%A%B#J#E#
+FFFEQ E5FEE5FFFEE5FFE5FFFEPME5FEFFE5H#J%A%B5@#E#
+FEFFQ FEE5FFE5E5FEE5FFPEFEFFFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEFEE5E5FFH#J%A%B#Z?#E#
+FFFEQ E5FEE5FFFEE5FFE5FFFEPDE5FEFFE5H#J%A%B#J#E#
+FEFFQ FEE5FFE5E5FEE5FFFEFFPMFEE5E5FFH#J%A%B#J"@":$J$J"J"D#E#
+FFFEQ E5FEE5FFFEE5FFE5FFFE4FEFEFEFEFE9FEFEFE;FE;FEE5FEFFE5H#J%A%B#I):":#C%?#J"="G&;"D#E#
+FEFFQ FEE5FFE5E5FEE5FFFEFFFEFFFEFEFEFEFEFEFFFFFFFEFEFEFEFFFF4FEFFFEFEFEFEFEFFFEE5E5FFH#J%A%B#J&J%J'I#E#
+FFFEQ E5FEE5FFFEE5FFE5FFFE5FFFEFFFFFF8FEFFFFFFO,FFFEFFFFFFFEE5FEFFE5H#J%A%B#8$:$<#:":$B$="9$A$:$9&8$;$8&@$:"?#E#
+FEFFQ FEE5FFE5E5FEE5FFFEFFFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEE5E5FFH#J%A%B)8&@"8"8#B&9#:&?&8&8&8#;-?#;"?#E#
+FFFEQ E5FEE5FFFEE5FFE5FFFEFFFEFFFFFFFEFEFFFFFFFEFEFFFFFFFEFFFFFFFEFEFEFEFFFFFFFEFEFFFFFFFEFEFFFFFFFEFFFEFFFFFFFFFFFEFFFFFFFEFFFFFEFEFFFFFEFFFFFFE5FEFFE5H#J%A%B#>&:#:"J$9&9$A$="J"J#E#
+FEFFQ FEE5FFE5E5FEE5FFFEFFFFFEFEFEFFFEFFFF4FEFEFEFFFFFEFEFEFEFEFEFEFEFEFF8FF=FEE5E5FFH#J%A%B#?%A"I%:#:%@%J"?#E#
+FFFEQ E5FEE5FFFEE5FFE5FFFEFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFO%FEE5FEFFE5H#J%A%B#>"=#J"8"@"C"<"="J#E#
+FEFFQ FEE5FFE5E5FEE5FFFEFFFEFEFF=FEFEFEFEFEFEO FEE5E5FFH#J%A%B)8&>%:&8-9%8&8-8&9,8*9(8&8"?#E#
+FFFEQ E5FEE5FFFEE5FFE5FFFEFFFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFEFEFEFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFEFFFFFEFEFEFFFFFEFEFEFFFFFEFEFEFFFFFEFEFEFEFEFFFEFEFEFFFFFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFFE5FEFFE5H#J4B#8$:$9#:%:P8Q8$9%:$9Q8$:$;$8P9$8$8R9PB#E#
+FEFFQ FEE5FFE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FFFEFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE5E5FFH#J4B#E"J#E#
+FFFEQ E5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FFE5FFFEFFP=E5FEFFE5H#J#z#B#J#E#
+FEFFQ FEE5/DEE5FFFEFFPMFEE5E5FFH#J4B#J4
+FFFEQ E5FEE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFFEPME5FEE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5H#J4B#J4
+FEFFQ FEE5DEE5FFE5FFE5FFE5FFE5FFE5FFE5FEE5FFFEFFPMFEE5DEE5FFE5FFE5FFE5FFE5FFE5FFE5FEE5FFH#J%v%B#J%v%
+FFFEQ E5FEDEFFE5FEDEFFE5FFFEPME5FEDEFFE5FEDEFFE5H#J&?&B#J&?&
+FEFFQ FEE5DEDEFFFEE5DEE5FFFEFFPMFEE5DEDEFFFEE5DEE5FFH#J#8#='B#J"D#C$D#A"=#J#8#='
+FFFEQ E5FEE5FFFEE5DEDEFFE5FFFE4FEFEFEFEFEFEFEFEFEFEFEO!E5FEE5FFFEE5DEDEFFE5H#J#8$<#8#B#I&A"D#E"8(9"="H"J#8$<#8#
+FEFFQ FEE5DEE5FFE5FEE5FFFEFFFEFFFEFEFEFFFFFFFFFEFEFEFFFEFEFEFFFFFE=FEE5DEE5FFE5FEE5FFH#J#9#<#8#B#J$J(J#9#<#8#
+FFFEQ E5FEFFE5FEDEFFE5FFFE5FFFEFFO FFFEFFFFFFFEFFO.E5FEFFE5FEDEFFE5H#J#9#;#9#B#8$:$<#?%:$:$A$:$;":$;$:&8$9&J#9#;#9#
+FEFFQ FEE5DEFFFEE5E5FFFEFFFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFE:FEE5DEFFFEE5E5FFH#J#:#9$9#B)8&F&9%8&?&8%@#;%9-8&J#:#9$9#
+FFFEQ E5FEE5FFFEE5DEFFE5FFFEFFFEFFFFFFFEFEFFFFFFFEFFFFFFFFFEFFFFFFFEFEFFFFFFFEFEFFFFFFFEFEFFFFFFFFFFFEFFFFFFFEFFFFFFFEFFFFFEFFFFFFFEFFFEFFFFFF:E5FEE5FFFEE5DEFFE5H#J#:$8#:#B#>&:#A$A$A$J$J#:$8#:#
+FEFFQ FEE5DEE5FFE5FEE5FFFEFFFFFEFEFEFFFEFFFEFEFEFEFEFEFEFEFEGFEFEFEBFEE5DEE5FFE5FEE5FFH#J#;#8#:#B#?%C"8%A%@%@$J%J#;#8#:#
+FFFEQ E5FEFFE5FEDEFFE5FFFEFFFFFFFEFEFEFFFFFFFFFFFFFFFFFFFFFFFEFFFE9FFFFFFFFAE5FEFFE5FEDEFFE5H#J#;&;#B#>"=#J"C"?"9"J"="J#;&;#
+FEFFQ FEE5DEFFE5FEE5E5FFFEFFFEFEFF=FEFEFFFF;FEFE9FEE5DEFFE5FEE5E5FFH#J#<%;#B)8&>&9-8&8-8'>&8,9&9&J#<%;#
+FFFEQ E5FEE5FEE5DEFFE5FFFEFFFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFFFEFEFEFFFEFEFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFEFFFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFEFFFEFEFEFFFEFFFFFEFEFEFFFEFEFEFFFFFEFEFEFF9E5FEE5FEE5DEFFE5H#J#<$<#B#8$:$9#:Q9U:$9Q8$:P8$9P9P8$:$;$J#<$<#
+FEFFQ FEE5DEE5FEE5FFFEFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:FEE5DEE5FEE5FFH#J#=#<#B#E"J#=#<#
+FFFEQ E5FEFEDEFFE5FFFEFFP=E5FEFEDEFFE5H#J4B#J"J4
+FEFFQ FEE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFFEFFP$FFHFEE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFH"J4B"J4
+FFQ!E5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFQ E5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5Hz>zCz>z
+PIE51E5PHE51E5
+
+
+
+
+
+I5J5
+PGFEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEHPGFEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEH5J5
+PIFEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FFFPHFEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5H#y"z5x#J#y"z5x#
+E5FEDEE5O:DE=FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5DEE5FFDEFFE5FE5FEDEE5O9DE=E5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5DEDEDEDEDEDEFFE5DEE5FFH#B$J5A#J#B$J5<%A#
+FEE5FFE5FEO:?E5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FEDEFFE5FFE5E5FFFFEE5FFE5FEO95FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FEE5FFE5FFFFE5H#@&J"z*?#J#@&J#z#<'?#
+E5FEE5FFE5FEE5O:FF7E5FEE5DEE5FFE5FFE5FFFFE5FE5FEE5FFE5FEE5O9E5FF1E5FEE5FFE5FFE5FFE5E5FFH#>(J#J,=#J#>(J#G#<)=#
+FEE5FFE5FFE5E5E5FEO:E5FF6E5FEDEFFE5E5E5FFE5FFE5E5FFFFEE5FFE5FFE5E5E5FEO9FFE5E5FEE5FFE5E5E5FFE5FFFFE5H#<&8#J#J&8';#J#<&8#J#G#<#9&;#
+E5FEE5FFE5FFE5FEE5O:FFE56FEE5DEE5FFE5E5E5FFE5FFFFE5FE5FEE5FFE5FFE5FEE5O9E5FFFEE5FFE5E5FFE5FFE5E5FFH#:'9#J#J&;&9#J#:'9#J#G#<#:'9#
+FEE5FFE5FFE5E5E5E5FEO:E5FF6E5FEDEFFE5E5FFE5FFE5E5FFFFEE5FFE5FFE5E5E5E5FEO9FFE5E5FEE5FFE5E5E5FFE5FFFFE5H#8&<#J#J&<*J#8&<#J#G#<#=)
+E5FEE5FFE5FFE5FEE5O:FFE56FEE5DEE5FFE5E5E5FFE5FFDEFFE5FE5FEE5FFE5FFE5FEE5O9E5FFFEE5FFE5E5FFE5FFE5DEE5FFH)=#J#J&?'J)=#J#G#<#>(
+FEE5FEE5FEE5E5E5E5FEO:E5FF6E5FEDEFFE5E5FEE5FEE5FFFFEE5FEE5FEE5E5E5E5FEO9FFE5E5FEE5FFE5FEE5FEE5FFE5H)=#J#J&?'J)=#J#G#<#>(
+E5FEDEDEE5FEE5FEFEE5O:FFE56FEE5DEE5FFFEE5FEDEFFE5FE5FEDEDEE5FEE5FEFEE5O9E5FFFEE5FFE5FEE5FEE5DEE5FFH#8&<#J#J&<*J#8&<#J#G#<#=)
+FEE5DEDEFEE5FEE5FEO:E5FF6E5FEDEFFE5FEE5FEE5DEDEDEE5FFFFEE5DEDEFEE5FEE5FEO9FFE5E5FEE5FFFEE5FEDEDEDEFFE5H#:'9#J#J&;&9#J#:'9#J#G#<#:'9#
+E5FEDEDEE5FEE5FEFEE5O:FFE56FEE5DEE5FFFEE5FEDEDEFFE5FE5FEDEDEE5FEE5FEFEE5O9E5FFFEE5FFE5FEE5FEE5DEDEE5FFH#<&8#J#J&8';#J#<&8#J#G#<#9&;#
+FEE5DEDEFEE5FEE5FEO:E5FF6E5FEDEFFE5FEE5FEE5DEDEE5FFFFEE5DEDEFEE5FEE5FEO9FFE5E5FEE5FFFEE5FEDEDEFFE5H#>(J#J,=#J#>(J#G#<)=#
+E5FEDEDEE5FEE5FEE5O:FFE56FEE5DEE5FFE5FEE5FEDEDEFFE5FE5FEDEDEE5FEE5FEE5O9E5FFFEE5FFE5FEE5FEE5DEDEE5FFH#@&J5?#J#@&J5<'?#
+FEE5DEDEFEE5FEO:AE5FFE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEDEFFE5FEE5DEDEE5FFFFEE5DEDEFEE5FEO95FFE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FFE5FEDEDEFFE5H#B$J5A#J#B$J5<%A#
+E5FEDEDEE5O:?FFE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5DEE5FEDEDEFFE5FE5FEDEDEE5O95E5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FEE5FFE5DEDEE5FFH5J5
+PIFEE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFFPHFEE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5H5J5
+PIE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FPHE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFE5FFIzJz
+PGE5HPGE5
+
+
+
+
+
+
+
+
+
+
+
+
+J&?#F#8#
+5FEFEFEFEFEFEFEFEFEFEFEJ(J#
+4FEFEE5E5E5FEFE>E5E5J%<%9%8"8%8%8&
+=FEFEFEFEFEFEFEFEFEFEFEFEFEFEE5FEFEFEFEFEFEFEFEE5FEFEJ/:08":'9%
+4E5FEFEFEE5E5E5E5FEFEE5E5FEFEFEFEE5E5FEFEE5FEFEE5E5FEFEE5E5E5FEFEE5E5FEFEFEE5FEFEJ&J#H"
+5E5E5FEFEFE7E5E5E5J"8"9#>#
+7E5FEFEFEFEFEJ#8";%<%
+4FEFEE5E5E5E5E5E5E5E5E5J#>#;#;"
+@FEFEFEFEFEFEFEJ/:.8%9'
+4E5FEFEFEFEFEE5E5E5FEFEFEFEE5E5FEFEFEFEE5E5E5FEFEFEFEE5E5FEFEE5E5FEFEFEFEE5J&9%8#8%9%:&8%8#8#
+5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5
+
+
+
+
+
+
+Fz
+U*FE
+H5
+U%FFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFH5
+U&FEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFH#Z
+FFFEU#H#J#
+FEFFO1FEFEH#J"J"9"C"=#J"B$8#A":#J"@":$J$J"
+FFFE5FEO"FEFEFEFEFEGFEFEFEFEFEFEFEFEFECFEFEFEFEFE9FEFEFE;FEH#J#J#9"C"="H"I#B(A#:"J):":#C%?#J"="G&
+FEFF4FEFFO!FEFFFFFFFFFEFEFEFEFFFFFFFEFFFFFEFFFFCFEFFFEFEFEFEFEFEFFFFFFFEFEFEFEFFFF4FEFFFEFEFEFEFEH#J#J&J%J'
+FFFEPKFFFFO<FFFEFFFFFF8FEFFFFFFO,FFFEFFFFFFFEH#8&9$<#9$:$8&8&:$8&<#8$9,;$:&8$9&9$J$<#9$:$8&:$:$<#:":$B$="9$A$:$9&8$;$8&A$8(
+FEFFFEFFFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFFFEFEFEFEFFFEFEFEFEFEFFFEFEFEFEFFFEFEFEFEFEFEFFFEFEFEFFFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFE@FEFEFEFEFFFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFFFEFEFEH#8&8&?&848-?#:+;%9-8&8&J%?%9-8&8&@"8"8#B&9#:&?&8&8&8#;-9%8)9#
+FFFEFFFEFFFFFFFEFFFFFFFEFEFFFFFFFEFEFFFFFFFEFFFFFEFFFEFFFEFFFFFEFFFEFFFEFEFFFFFFFEFFFFFEFEFFFFFEFFFFFFFEFFFFFFFEFFFFFFFFFEFFFFFFFEFFFFFFFEFFFFFEFFFFFFFEFFFEFFFFFFFEFFFFFFFE?FFFFFFFEFEFFFFFFFEFFFFFFFEFFFFFEFFFEFFFEFEFFFFFFFEFEFFFFFFFEFEFFFFFFFEFFFFFFFEFEFEFEFFFFFFFEFEFFFFFFFEFEFFFFFFFEFFFEFFFFFFFFFFFEFFFFFFFEFFFFFEFEFFFFFEFEFEFEFFFEFFFFFFFEFFFFFFFFFFH#C":#="J"=#B"J$@&8&J#A$G&:#:"J$9&9$A$="J"<%@$
+FEFFFFFEFFFF?FFFEFFFE:FEFEFEFFFEFEFEFFFEFEFEFEFE@FEFFFEFEFEFFFEFEFEFFFEFFFF4FEFEFEFFFFFEFEFEFEFEFEFEFEFEFF8FFFFFFFFFEFFFEFFH#J%@%8PJ%G%A"I%:#:%@%J$
+FFFEP0FFFFFFFFFFFFFFFEMFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFO&FEFFFEH#C"9#>"J#A&J"=$J#E"F"=#J"8"@"C"<"="J&
+FEFFFEFEFFFEFFEFFFFFEFFFEFF;FEFEFFFEJFEFFFEFEFEFF=FEFEFEFEFEFEDFEFFFFFFFEH#8%9&?&8(;#;,B&?&8,9&9,?&9";-?/;(8&>%:&8-9%8&8-8&9,8*9(8(;"
+FFFEFEFEFEFEFFFEFEFEFFFFFEFEFEFFFFFEFEFEFFFFFEFEFEFEFFFFFEFEFEFFFFFEFEFEFEFEFEFEFEFEFEFEFEFEFFFEFEFEFFFEFFFFFEFEFEFFFEFEFEFFFFFEFEFEFFFFFFFEFEFEFFFEFEFEFEFEFEFFFEFEFEFFFFFEFFFEFEFEFFFFFEFEFEFFFEFFFFFEFEFEFFFFFEFEFFFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFEFEFEFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFEFFFFFEFEFEFFFFFEFEFEFFFFFEFEFEFFFFFEFEFEFEFEFFFEFEFEFFFFFEFEFEFEFEFEFEFEFEFFFFFEFEFEFFFFFEFE&C#8%:$9#<$:$8Y8$8$8"8#;P9$9P9P8$:$;$9$@P9"<$8P9#<P8$8R8$:$9#:%:P8Q8$9%:$9Q8$:$;$8P9$8$8R:$8#9#F%
+F7F7F7F7F7FEFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F7F7F7&C#F"J"J"J"J&
+F6F6F6F6F6FFFEFFO"FFP%FFIFFPIF6F6F6F6F68$C#J%J%
+F9F9F9FEFFP)FEFEFEFFS%F9F9F9F7H#J#J$
+FFFEO1FFFFDFFFFFFH#
+FEFFH"
+FFHz
+U&FE
+Fz
+U*E5
+
+
+
+
+
+
+
+
+<z"z"z
+0F6F7TJF6F71F6;z8z8z
+1F9TIF91F9
+
+7z8z8z
+5F7TIF74F7"J"J"
+F76F7TJF7
+ENDBITMAP
+%%EndBinary
+117 510 261 528 R
+7 X
+V
+4 8 Q
+0 X
+(f) 117 522.67 T
+(ileselectionbox .fsb) 121.8 522.67 T
+(pack .fsb -padx 10 -pady 10) 117 512.67 T
+0 10 Q
+(FIGURE 30) 118.67 485.17 T
+1 F
+( - Fileselectionbox) 170.06 485.17 T
+0 0 612 792 C
+0 12 Q
+0 X
+0 0 0 1 0 0 0 K
+(Pr) 392.27 377.71 T
+(omptdialog) 404.72 377.71 T
+1 10 Q
+(Based on the Dialog class, the Promptdialog provides a) 315 359.05 T
+(Motif style prompt dialog.) 315 347.05 T
+315 403.71 540 720 C
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+315 430.57 540 716.86 R
+7 X
+0 0 0 1 0 0 0 K
+V
+0.5 H
+2 Z
+0 X
+N
+331.57 439.43 529.57 558.71 R
+7 X
+V
+4 8 Q
+0 X
+(messagedialog .cr -title Copyright \134) 331.57 553.38 T
+( -bitmap @dsc.xbm -imagepos n \134) 331.57 543.38 T
+( -text \322Copyright 1995\134) 331.57 533.38 T
+( DSC Communications Corporation\134n\134) 331.57 523.38 T
+( All rights reserved\323) 331.57 513.38 T
+(.cr hide Apply) 331.57 503.38 T
+(.cr hide Cancel) 331.57 493.38 T
+(.cr hide Help) 331.57 483.38 T
+(.cr activate) 331.57 463.38 T
+(update) 331.57 453.38 T
+(after 10000 \322.cr deactivate\323) 331.57 443.38 T
+0 10 Q
+(FIGURE 31) 373.47 412.6 T
+1 F
+( - Messagedialog) 424.86 412.6 T
+%%BeginBinary: 11506
+368 342 147.2 136.8 0 356.8 566.43
+/red <
+3EC472FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF80808080
+8080808080808080808080808080808080808080404040404040404040404040
+4040404040404040404040000000000000000000000000000000000039C069DD
+00FF0000003333330033CCDD9999112277005544FFCC66AABBFF33EE9999CC7A
+EFD3557F9765E1A36FE700FF5500B22EAFB4CD73E6A24DBF0087F599FFFFB07A
+FFCCB088439D58D750D080C0C080C0808060C000FFA000FF20C0A040C040D060
+F0E010B4BE8BD28BD9B3FF7299FFA00019BF2FFF6223852F465F4770FF0000FF
+> store
+/green <
+57D79F00000000000000000000000000FFFFFFBFBFBFBFBF8080808080404040
+40000000FFFFFFFFFFBFBFBFBF808080808040404040400000000000FFFFFFFF
+FFBFBFBFBFBF8080808040404040400000000000FFFFFFFFFFBFBFBFBFBF8080
+8080804040400000000000FFFFFFBFBFBFBFBF80808040404040400063E0B500
+996699FF00663399BBFF99DD99FF112277005544CCCC66AABB6600EE6600CC69
+E3B56B7F9765E1A36FE700FF1A00B28BEEEE0073E6A24DBF00CEF599FFFFB094
+FFF730884DB358D78080C0C080C080808060C08000A080402070A0402040D0F0
+F0E010B4BE5BB477D9B3FF7789E4A0FF19264F00B641DE4F829E4780FF0000FF
+> store
+/blue <
+8CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF8040FFBF804000FFBF804000FFBF80
+00BF8040FFBF804000FF804000FFBF804000FFBF804000FFBF804000FFBF8040
+00FFBF804000FFBF4000FFBF804000FFBF804000FFBF804000FFBF804000FFBF
+804000FFBF00FFBF804000BF8040FFBF804000FFBF40FFBF8040004063E0B500
+FF3399FF88666666009966DDFFFF112277DD554499FFCCAABBCC99EE9966CC69
+E3B52F7F9765E1A36FE7BFCC8BEEB257EEB40073E6A24DBF80FAF56BFBB3B015
+3224608856CA58D7D050C080C08080C08060C080FF0000402070C0802040D060
+50E010B4BE7A8C65D9B3E08576C4A00070264F00FC5AE050B4A0FF9000FF00FF
+> store
+ BEGINBITMAPCOLORc
+z"z"z"
+6F6F7TMF6F76F6F7J"
+ULF78z8z8z
+4F9TLF94F9
+
+;z"
+UCF7F6<z"z
+0F6F7U0F6=z8z
+/F9U/F9
+J'J#?$>"
+Q8FEFEFEFEF9FE?FEFEFEFEFEFEJ'J"?"
+Q7FEFEF9F9F9FEKF9FEJ$9"J#<#
+Q6FEFEF9F9@F9F9FEFEJ$8'829&;#9"8#
+QAFEFEFEFEFEFEF9FEFEFEFEFEFEF9FEFEFEFEFEFEF9FEFEFEFEFEFEFEFEFEF9FEFEFEFEFE@s"J+8'8'8"8":':%8"8#
+F6F7Q*F9F9FEFEFEF9FEFEFEF9FEF9FEFEFEF9F9F9F9FEF9F9FEF9FEFEF9F9FEFEFEF9FEFEF9F9F9ArJ$;$9':$E"
+F9Q/F9F9F9F9F9F9F9FEFEF9FEF9F9F9F9F9@sJ"J'
+F7Q+FECF9FEFEFEFEF9@tJ$9":$;$:%C&
+F9Q#F9FEFEFEFEF9FEFEF9FEF9FEFEF9FEF9F9F9F9J09&>"8"8"8"8(8"9"8$
+Q7F9FEFEFEFEFEF9F9F9F9FEFEFEF9F9F9FEFEF9F9FEFEFEFEFEFEFEFEFEF9FEFEFEF9FEFEJ&:$<#<"9%8';"s9#
+Q8F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FEF9F9F9J%E&
+R FEFEFEF9FEF9F9F9F9J"8"<"F(
+QFFEFEF9F9FEFEFEFEFEF9=z8z
+/F7U/F7rF"J%
+F7F7U0F7F7F7F7'z&
+F6F6F6F6F6F7UBEDF6F6F6F6F68$J%
+F9F9F9UDF9F9F9F7
+
+
+
+
+
+
+
+
+
+J"9"9"9"
+R$FEFEFEFEJzJz
+R 5FEO7;FEJ"9z8"J%J%J'J'
+O'FEEFEFEOEFEFEFEFE5FEFEFEFEO-FEFEFEFEFEFE;FEFEFEFEFEFEJrJzJ$J&J$J&
+O$FEE/FEO6FEFEFE=FEFEFEFEFEO%FEFEFEGFEFEFEFEFEJ'J#J"J$J%
+P1FEFEFEFEFEFEO.FEFEEFEO!FEFEFEO!FEFEFEFEJ"J%J"J$J%
+O#FEO3FEFEFEFEO)FEOFFEFEFEO(FEFEFEFEJ%J#AwJ$HzJ"
+P;FEFEFEFEO#FEFEEDO-FEFEFE1ED:FEJ"J$J"@$B%D"J#F&G%J"
+O"FEO<FEFEFEMFEEDEDEDEDEDEDEDFEFFEFEEDEDEDEDEDEDEDEDED6EDJ#JzJ#J#?#J"J#D%J$I"
+O"EDED@2ED:FEFEIFEFEEDED4EDO#FEFEEDEDEDED:EDEDEDFEJ&J&H'J%J"@"J$J"D#J#
+O$EDEDEDEDED6EDEDEDEDEDEDEDEDEDEDED6FEFEEDFEDFEED5EDEDEDO!FEEDEDAEDEDJ#H#J%J"J"?"J#J#B$J#
+O)EDEDEDED=EDEDEDED4FEDFEED:EDEDKFEFEEDEDEDEEDEDJ"F"J$I#J"A"J#J#B#J#
+O+EDEDCEDEDEDFEFE@FEED:FEEDHFEFEEDEDJEDEDJ"J$H#J"J$>"J"C"J"
+O,EDO(EDEDEDFEFEHED<EDEDEDFE=FEEDO EDJ"H"J"?"J"J#B#J"
+P9EDFE<FEED?FEDFEFEEDEDO"EDJ%G$J"J#J"C"J"
+P8EDEDEDEDFEFEFE8FEJEDEDBFEEDO%EDJ"J"J"J"J"B#J"
+O-EDO.EDO'EDBED@FEEDEDO'EDJ#G"J"J"B"J"
+P=EDEDFE6FEO?FEEDO*EDJ#F"J"J"J"B"J"
+P?EDEDFE?EDDED=FEEDO,EDJ"F$G"J"B"J"
+PAEDFEEDFEFEO>FEEDO.EDJ"F#J"B"J"
+PBEDFEEDP!FEEDO7FEJ"F"J"J"B"J"
+PCEDFEO4ED9FEEDO1EDJ"J"J"H"B"
+Q'FE:EDLFEFEEDJ#F"D"J":"G"B"J"
+PDEDEDFEFEO$EDEDFEEDO4EDJ"F"J"
+PFEDFEOHFEJ"F"J"J"8"J"J"
+PGEDFE7FEHEDED>EDO6EDJ"J#G"B"
+PHEDOCEDEDFEEDJ"E"J"
+PIEDFEODFEJ"F"J"
+PIFEFEP"EDJ#J"B"J":"
+PIEDEDP$FEEDO:EDFEJ"E#J"J"J"
+PKEDFEFE4FEO*FEOMEDJ"J"J%
+Q.EDOLEDO<EDEDEDEDJ"E"J"
+PLEDFEO>FEJ"
+QDFEJ"E"J"J"C"
+PMEDFE5FEO&FEEDJ"
+PMFEJ#E"<"D"J"C"
+PMEDEDFEEDFEO$FEEDJ"
+QGFEJ"
+QHFEJ"E"<"F"J"
+Q!EDFEEDFEO FEJ"J"
+QJFEO-EDJ"
+QKFEJ"E"<"H$J"
+Q"EDFEEDFEFEFEHFEJ"
+Q:EDJ#J"
+R!FEFEO&EDJ"J"
+Q;ED5FEJ"J#J#J"
+Q#ED7FEED5FEFEBFEJ"J$
+Q;ED8FEEDFEJ"J"
+Q=ED7FEJ"@"J#
+Q3FEED8FEFEJ"J"
+Q?ED9FEJ"J#
+Q@ED9FEFEJ"J"J$J"
+Q$ED<ED:FEEDFE6FEJ"J"
+QBED:FEJ"J"J"
+Q$FE>ED;FEJ"J"J$
+Q$ED?ED;FEFEFEJ#
+QEEDEDJ#J"
+QGEDED:FEJ"J$
+QIED:FEEDFEJ"J#
+QKED9FEEDJ"J$J#
+Q$FEEEDEDED9FEFEJ"J#J"
+Q$EDHEDED:FEJ"J"J#
+Q$FEJED8FEEDJ#J"
+R"EDED7FEJ"J"J"@"
+Q3ED>ED7FEEDJ#J"
+R%EDED6FEJ"
+R'EDJ"J"J"
+R)ED4FE8FEJ$J"
+R(EDEDED4FEJ"J#
+Q2EDFEDEDJ"J"
+Q#FEO)EDJ"G"="
+R.EDFEEDJ"J"
+R/EDHFEJ"J"F"
+Q1EDLEDFEJ"J"
+Q"FEO.EDJ#J"E"
+R1FEED6EDFEJ"J"F"
+Q0EDO EDFEJ"
+R3EDJ"J"E"
+Q!FEOHEDFEJ"J"
+Q/EDO$EDJ"J"E"
+R4FE6EDFEJ"C"J#
+Q FEEDO%EDEDJ"
+RLEDJ"C":#J"
+PMFEEDFEFEOHFEJ"8"J"E"J"
+Q1FEFEO8EDFEO>FEJ"C">"J%
+PLFEEDFEQ7FEFEFEFEJ"C"J"E"J"
+PKFEEDOBEDFEO;FEJ"
+R6EDJ"C"A#J"E"J"
+PJFEEDFEFEO7EDFEO9FEJ"C"J"A"C"E"
+Q)EDEDLFEEDEDFEJ"B#C"J"J"E"J";"
+PIFEEDFEFELED:EDFEO6FEEDJ"D"="J"
+PHFEEDEDO$FEJ"C"F"J"E"J"
+PGFEEDFEO9EDFEO4FEJ"C"J"G"E"J"
+PFFEEDO:EDEDFEO2FEJ"C"I"J"E"J"
+PEFEEDFEO:EDFEO8EDJ"J"C"J"E"J"
+O<FEO'FEEDP"EDFEO/FEJ"C"J"J"@"J"E"J"
+PCFEED6FEHFEED5EDFEO-FEJ"C"J"J"E#J"
+PBFEED8FEO;EDFEFEO*FEJ#J"B#F"?"J"@"J"F"J"?"
+O=FEFEO"FEEDEDEDFEEFEED8EDFEO(FEEDJ"F"J#B#J#J"F"J"
+O-FEEDO FEFEEDFEO=EDFE9EDFEO&FEJ"J"C$J$J"A"J"F#J"@"
+O>FEMFEEDEDED<FEEDFEAFEED:EDFEFEO#FEEDJ"J#B#J#J"@"J#F"J#
+O?FEJFEFEEDED@FEED@FEED=EDEDFEO FEFEJ"I"J$C"J"A$J"@"J"F#J"B"
+O,FEFEFFEFEFEED7EDFEEDFE=FEED@EDFEFEKFEEDJ$J#D#J"J"@"J#F#J#
+OAFEEDFEAFEFEEDEDEFE=FEEDBEDEDFEFEGFEFEJ"J"J$D"J"D"J"@"J"G$J#
+O+FE6FE?FEFEFEED;FEFE:FEEDEEDFEFEFEBFEFEJ$J$J%E"8"J#D$J#@"J#H#J#F"
+O(FEFEFE9FEFEFE7FEFEFEFEEDED:EDEDFEFEFE5FEFEEDGEDEDFEFE>FEFEEDJ&Jr8":tG"8"J#G#A"J#H%J$
+O#FEFEFEFEFE?FEFEFEEDEDO!FEFEFEFEEDJEDEDFEFEFEFE7FEFEFEJ$JrJ&J%?%A"J#J&C&J"
+O FEFEFEKFE7EDEDEDEDEDO%FEFEFEFEFEFEFEFEEDO EDED4FEFEFEFEFEFEFEFEFEFE4EDJ#J$JtD$J$JxJ$
+P;EDEDFEDEDED4FEEDEDEDO!EDEDED6FE6EDEDEDJ"J$8"J"J#J$J$
+O EDO7EDEDEDEDHEDHEDEDO'EDEDEDO%EDEDEDJ&J%J#J$J$
+P3EDEDEDEDEDO!EDEDEDEDBEDEDO,EDEDEDMEDEDEDJ"JrJ$J$J%J&
+O!EDO*EDO*EDEDED<EDEDEDO1EDEDEDEDDEDEDEDEDEDJzJ&I%J'J'
+O"O*EDO4EDEDEDEDEDEDEDEDEDO8EDEDEDEDEDED8EDEDEDEDEDEDJzJz
+QE3EDOB8ED
+
+
+
+
+
+
+
+
+
+Jz
+O"SHFE
+
+
+Jz
+O"SHED
+
+
+
+
+
+
+
+
+
+
+J"H"J"8"J"@#J#
+O+FEFEP@FEFE=FEFEFEO4FEFEJ#9%A#8%A%>%>&=%>&<$=&=$=%B%9#C"Bw>&A#9$A&=$>(
+O&FEFEEDFEFEFEFEFEEDFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEEDFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEEDEDFEFEFEJ%:"A%9%@"9"@">"D">"9"<$="C"="D%9%A$C$9%>"9"?%9&?"C"=$8"8"
+O$FEFEFEEDEDFEFEEDEDEDEDFEFEEDFEEDEDEDEDEDEDFEEDEDEDEDFEFEEDEDEDEDFEFEFEFEFEEDEDEDEDEDEDEDEDEDFEFEEDEDEDEDFEFEFEEDEDFEFEEDEDFEJ"8"<"?$=$J"J"<"J%="J"@#I"?"8"C"J$
+O#FEEDEDFEFEEDEDFEFE4FEO0FEED6FEFEFEEDED;EDEDEDFEEDFEFE6EDFEEDJ"8">"="C"C"<"F";#8"J"9"J"J"J"J"9"J"
+O"FEEDEDFEFEFEEDFEFEEDFE?EDFEHED9EDBED5EDFE6EDJ"8"?"J"B"J"9":"J"8"J"9"J"A"8"@"9"C"8"
+OBEDFEED7EDED@EDFEFE5FEED4FEFEJFEEDFEEDFEFEFEJ"J"J"9#E"8"9#J"9"9"J"J"J"F"9#
+O!FE6ED:FEFEEDEDFEFEEDEEDFEEDO EDO!ED8EDEDFEFEJ"F"J"J"J"J$8"J"J"8"C":#
+O$EDFE:EDCFEBEDO&EDEDEDFEKFE9EDFEEDFEFEJ":"J"8"J"J"J"8"C";"
+P)EDFEO-EDFEO!FEO#ED:EDFEEDFEJ"F"J"8$;"B"8%J":"8"J$J"J"C#:"
+O$FEED;EDFEEDFEEDEDFEEDFEEDDFEEDFEO!FEFEFEO FE>FEEDEDFEJ"J"J"J"J">#J'8"J"9"D#
+O!ED6FE<FE7FEFEDFEFEKFEFEEDEDEDEDFEO8EDFEEDEDJ"8"B"9";"C"9"J"J"8"I"J"E"
+OBFEEDEDEDFEEDEDKED9EDFEEDO0EDEDJ"8">"="8"J"<"J"="<"8"J"8">"I"A"<"
+O"EDFEFEEDFEOLFEEDEFEFEEDFEGEDFEFEEDFEEDJ"I"?"8"J#H"J"8"="?"J"B"H"A";$
+O#EDEDFEEDO5FEEDED8EDFEFEEDO#EDEDEDFEFEFEEDJ%;"@%:%?";$E";$F"8";"J"J"8";$<"A"J$<$A"J"
+O$EDFEFEFEFEEDFEFEFEFEFEEDEDFEEDFEEDFEEDFEEDEDFEFE5ED8EDFEFEFEEDFEFEHEDFEFEFEFEEDFE4FEJ%8%@*@"8#9"9#9"<"8#9":"9"?+?"8"G#9"@+<"8#:":">#9#?#9"@+?#8"="?"8'
+O%EDEDFEFEFEFEFEEDEDEDFEFEFEFEFEEDEDFEFEFEEDFEFEFEFEFEFEEDFEFEEDEDFEFEFEFEFEFEEDEDFEFEFEFEFEEDEDEDFEFEEDFEFEFEEDFEFEFEFEFEFEFEFEFEFEFEFEEDEDFEFEFEFEFEFEEDEDFEFEFEEDEDFEFEFEFEEDEDJ#8$C&B&='<&>&A'A%>#='C'=&:'>r?'B'A&>#>'
+O'EDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDED
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+J%J#>#<#>#:%9%9&<&;&;%>%J#F#8#J%J#8#
+IFEFEFEFE<FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFELFEFEFEFEFEFE=FEFEFEFEHFEFEFEFEJ'J#J#;.:$>%9(9'<'J#J#J'J#
+HFEFEEDEDFEFE;EDED8FEFEFEFEEDEDFEFEEDFEFEEDEDFEFEEDEDEDEDEDFEFEFEFEEDEDEDFEFEFEFEEDEDFEFEFEFEEDEDFEFEKEDED4EDED<FEFEEDEDFEFEKEDEDJ$8(8&8#9+8&:#8"8";#I$C$A$8#;$8(8*8*8#8)8#8%9%8"8%8%8&9%=$8(8+9%8+8"8%8%8&
+GFEFEEDEDEDEDFEFEFEFEFEFEEDFEFEFEFEFEFEEDFEFEEDFEFEFEFEFEFEEDFEFEFEFEFEFEEDEDFEFEEDEDFEFEFEFEEDEDEDFEFEEDEDEDEDFEFEFEFEFEEDFEFEFEEDFEFEFEFEEDFEFEFEEDFEFEFEFEFEFEFEEDFEFEEDFEFEFEFEFEFEFEFEFEFEFEFEFEFEEDFEFEFEFEFEFEFEFEEDFEFEFEFEFEFEFEFEEDEDEDEDFEFEFEFEFEFEEDFEFEFEFEEDFEFEFEFEFEFEFEFEEDFEFEEDFEFEFEFEFEFEEDFEFEFEFEFEFEFEFEEDFEFEJ'9%A";%;'8"J$F(J'8*8*@%:08":'9,C'9":,9"8)8":'9%
+O FEFEEDEDFEFEFEEDFEFEFEFEFEEDFEFEEDFEFEEDEDED<FEFEFEEDFEFEFEEDEDED5FEFEEDEDFEFEFEEDEDFEFEEDEDFEFEFEEDEDFEFEEDEDFEFEFEEDFEFEFEFEEDEDFEFEEDFEFEEDEDFEFEEDEDEDFEFEEDEDFEFEFEEDFEFEEDFEFEEDEDFEFEFEFEEDEDFEFEFEFEEDFEFEEDFEFEEDEDFEFEFEFEFEEDEDFEFEEDEDEDFEFEEDEDFEFEFEEDFEFEJ":(:#<";"J%9%9'F&J"A&J"<%J#8"D%J"
+O)EDEDFEFEEDFEFEEDEDEDEDED4EDFEFEFEEDFEFEFEEDEDEDEDFEFEEDEDFEFEFEO.EDEDEDEDEDED6EDFEEDEDED7EDEDEDEDEDEDED6EDJ"J$:$J"8"J$J&J"H"9$
+O8EDDEDEDEDEDEDED;EDFEO=FEFEFE9EDEDFEFEFE7EDEDFEFEFEJ&J#I#8"J%J"8"J%
+O/EDFEFEFEEDO(FEFEFEFEEDO>FEFEEDED;EDFELFEFEEDEDJ$8#?"J"D"A#;#J$A$8#;$8#J"G#B"G%>$8#D"J"
+GEDFEFEFEFEFE7FEFEFEFEFEFE5FEFEEDEDFEFEFEFEEDFEFEFEFE@FEFEFEFEFEFEEDEDEDFEFEFEFEFE;FEJ-9%9"C%A%A5>%9(9'<-J%C49'>'=->,<-9'
+HEDFEFEFEFEEDEDFEFEFEFEEDEDFEFEEDEDEDFEFEEDEDFEFEED4EDFEFEFEFEEDEDEDFEFEFEFEEDEDEDFEFEFEFEEDFEFEFEEDEDFEFEFEFEFEEDEDFEFEFEFEEDEDFEFEFEFEEDEDFEFEFEFEED7EDFEFEEDEDFEFEFEFEEDEDEDFEFEFEEDFEFEEDEDFEFEEDEDFEFEFEFEEDEDFEFEFEFEEDEDFEFEFEFEEDEDFEFEFEFEEDEDFEFEEDEDEDFEFEFEFEEDEDFEFEFEEDFEFEEDEDFEFEEDEDFEFEFEFEEDJ%8%;#<"9#9#8#:#8#9#=#:%9%9%=&;&;%>%8%8#8#8&8#8#8s8&8%9'8&8%8#8#8%?%8%8#<#9%8#:'8&8%8#8#
+IEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDJ"C#
+O0FEFEFEJ$B'
+O/FEFEEDEDFEFEFEFEEDJ#<#D%J#
+O'EDEDEDEDEDEDEDEDR1EDED
+J#9&@#>#<#J#
+PJFEFEFEFEEDFEFEFEFEFEFEFEFEO1FEFEJ"8"G#
+PIFEFEEDEDJ#C(8&:#8"8"8%<+9%9%8(9#8%9#
+PJEDEDFEFEEDFEFEFEFEFEFEEDFEFEFEFEFEFEFEFEFEFEFEFEEDFEFEEDFEFEFEFEFEFEFEFEFEFEFEFEFEFEEDFEFEFEFEFEFEFEFEFEFEFEFEJ":"C";%;'8)="859"@,
+PHFEFEFEFEFEEDFEFEEDFEFEEDEDEDEDFEFEEDEDFEFEFE4FEFEEDEDFEFEEDFEFEEDEDFEFEEDFEFEEDEDFEFEFEFEFEEDEDFEFEEDFEFEEDFEJ#<";"A%>#?%A*A"
+Q.EDEDEDEDFEEDEDEDEDEDFEEDEDEDEDEDEDFEFEEDFEFEEDEDJ#E"J&>":#9&:#;"B#
+PJFEFEED8EDEDFEFEFEEDFEFEEDEDFEFEFEFEFEEDFEFEJ)J"8"B%9"8"9%=&:%
+PGFEFEEDEDEDEDFEFEGEDFEEDEDEDEDEDFEEDEDEDEDEDFEFEFEEDEDEDEDEDJ"D&F(=#H#:"
+Q6FEFEFEFEEDEDFEFEEDFEFEEDEDFEFEFEFEFEJ%A+@5>$9,
+Q3EDFEFEEDEDFEFEEDEDFEFEFEFEED4EDFEFEFEFEEDEDEDFEFEFEFEEDEDEDFEFEFEFEEDEDFEEDEDFEFEFEFEEDEDEDFEFEEDJ#:r;#9#8#:#8#9#8%<#:%9%9%8#<";%9&
+PGEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDJ#
+Q3FEFEJ'
+Q3EDFEFEFEFEEDJ%
+Q4EDEDEDED
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<z
+UBEC=z"
+U@EDFF=Z
+U@<z
+UBED
+
+
+
+
+
+
+
+Jz
+Q0O-ECJ"
+R<FFJz"
+Q2O)EDFF
+
+
+JZ
+Q6O!J"
+R6ECJz"
+Q8KEDEC
+
+
+
+
+J%:#9#
+QFFEFEFEFEFEFEFEFEJ'=$
+QEFEFEEDEDFEFEFEFEEDJ$8$;$
+QDFEFEEDEDFEFEFEFEEDJ$
+R"FEFEED
+J$
+R"EDFEFEJ$
+R#EDFEFEJ$8$<$
+QDEDFEFEFEFEEDEDFEFEJ'>$
+QEEDFEFEFEFEEDEDFEFEJ%:#:#
+QFEDEDEDEDEDEDEDED
+
+
+
+
+
+
+&J%
+F7F7F7F7F7UCF7F7F7F7&JzJ&
+F6F6F6F6F6Q3KECQ3F6F6F6F6F68$J"J%
+F9F9F9Q2ECR1F9F9F9F7Jz
+Q6O!ED
+
+
+JZ
+Q2O)J"
+Q1FFJz
+Q0O-ED
+
+
+
+
+
+
+
+<z"z"z
+0F6F7TMF6F71F6;z8z8z
+1F9TLF91F9
+
+7z8z8z
+5F7TLF74F7"J"J"
+F76F7TMF7
+ENDBITMAP
+%%EndBinary
+0 0 612 792 C
+315 72 540 720 C
+315 183.73 540 343.71 C
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+315 206.57 540 334.71 R
+7 X
+0 0 0 1 0 0 0 K
+V
+0.5 H
+2 Z
+0 X
+N
+%%BeginBinary: 4263
+283 155 145.54 79.71 0 351 246
+/red <
+7266F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF80808080
+8080808080808080808080808080808080808080404040404040404040404040
+4040404040404040404040000000000000000000000000000000000039C069DD
+00FF0000003333330033CCDD9999112277005544FFCC66AABBFF33EE9999CC7A
+EFD39765E1A36FE700557FFF5500B22E99FFFFB07AFFB0CC0087AFB4CD73E6A2
+4DBF88F5439D58D750D080C0C080C0808060C000FFA000FF20C0A040C040D060
+F0E010B499FFA0BE8BD28BD9B3FF720019BF2FFF6223852F465F4770FF0000FF
+> store
+/green <
+9F99DE00000000000000000000000000FFFFFFBFBFBFBFBF8080808080404040
+40000000FFFFFFFFFFBFBFBFBF808080808040404040400000000000FFFFFFFF
+FFBFBFBFBFBF8080808040404040400000000000FFFFFFFFFFBFBFBFBFBF8080
+8080804040400000000000FFFFFFBFBFBFBFBF80808040404040400063E0B500
+996699FF00663399BBFF99DD99FF112277005544CCCC66AABB6600EE6600CC69
+E3B59765E1A36FE7006B7FFF1A00B28B99FFFFB094FF30F700CEEEEE0073E6A2
+4DBF88F54DB358D78080C0C080C080808060C08000A080402070A0402040D0F0
+F0E010B489E4A0BE5BB477D9B3FF77FF19264F00B641DE4F829E4780FF0000FF
+> store
+/blue <
+FFFFB3FFFFFFFFFFFFFFFFFFFFFFFFFFBF8040FFBF804000FFBF804000FFBF80
+00BF8040FFBF804000FF804000FFBF804000FFBF804000FFBF804000FFBF8040
+00FFBF804000FFBF4000FFBF804000FFBF804000FFBF804000FFBF804000FFBF
+804000FFBF00FFBF804000BF8040FFBF804000FFBF40FFBF8040004063E0B500
+FF3399FF88666666009966DDFFFF112277DD554499FFCCAABBCC99EE9966CC69
+E3B59765E1A36FE7BF2F7FCC8BEEB2576BFBB3B01532602480FAEEB40073E6A2
+4DBF88F556CA58D7D050C080C08080C08060C080FF0000402070C0802040D060
+50E010B476C4A0BE7A8C65D9B3E0850070264F00FC5AE050B4A0FF9000FF00FF
+> store
+ BEGINBITMAPCOLORc
+z"z"z"
+6F6F7S&F6F76F6F7J"
+T%F78z8z8z
+4F9S%F94F9
+
+;z"
+SJF7F6<z"z
+0F6F7S7F6=z8z
+/F9S6F9
+JrJ"<r:#@$
+P*FEGFEFEFEFEFEFEFEJ"8&J"="8&E"
+P*F9F9F9F9FEFEEFEF9F9F9F9FEFEF9J$8#J#
+Q7F9FEFEF9F9;FEFEJ'8$9'8#8'9"8#D$9%@$:&
+P3FEFEFEF9FEFEFEFEFEFEFEFEF9FEFEFEFEFEFEFEF9FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF9@s"J&8"8*8+8(8#D"<%=/
+F6F7OJFEFEF9F9F9FEFEFEFEF9FEFEFEF9F9FEF9FEFEFEF9FEFEF9F9FEF9FEFEFEF9F9F9F9F9F9F9FEFEFEFEFEF9FEFEFEF9FEFEF9F9FEFEArJ%;$8$<"9"=$J$A$
+F9OIFEFEFEF9F9F9F9F9F9F9F9F9F9F9F9<F9FEFEF9F9F9@sJ$J%G'
+F7OIF9F9F9O0FEFEF9F9F9FEFEFEFEF9@tJ$H$H$?"A$9&
+F9P(FEF9FEFEF9FEFEFEF9FEFEF9FEFEF9F9F9F9J"8";"8"8*8"9"9"9&8$;"8&8"8'8$8*8&
+P*FEFEFEFEF9F9FEFEFEF9F9F9FEFEFEFEF9FEFEF9F9F9FEFEFEFEFEFEFEF9FEFEF9F9FEFEF9FEF9FEFEF9F9F9FEFEFEF9F9FEFEFEFEFEJ%;%:$9w:#;#;r9%8v9$9";"
+P*F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FEJ&
+R'FEF9F9F9F9J"8"J(
+PMFEFEO$F9FEFEFEFEFEF9=z8z
+/F7S6F7rF"J%
+F7F7S7F7F7F7F7'z&
+F6F6F6F6F6F7SIE5F6F6F6F6F68$J%
+F9F9F9SKF9F9F9F7
+
+
+
+
+
+
+
+
+
+
+
+
+J&?#F#8#
+5FEFEFEFEFEFEFEFEFEFEFEJ(J#
+4FEFEE5E5E5FEFE>E5E5J%<%9%8"8%8%8&
+=FEFEFEFEFEFEFEFEFEFEFEFEFEFEE5FEFEFEFEFEFEFEFEE5FEFEJ/:08":'9%
+4E5FEFEFEE5E5E5E5FEFEE5E5FEFEFEFEE5E5FEFEE5FEFEE5E5FEFEE5E5E5FEFEE5E5FEFEFEE5FEFEJ&J#H"
+5E5E5FEFEFE7E5E5E5J"8"9#>#
+7E5FEFEFEFEFEJ#8";%<%
+4FEFEE5E5E5E5E5E5E5E5E5J#>#;#;"
+@FEFEFEFEFEFEFEJ/:.8%9'
+4E5FEFEFEFEFEE5E5E5FEFEFEFEE5E5FEFEFEFEE5E5E5FEFEFEFEE5E5FEFEE5E5FEFEFEFEE5J&9%8#8%9%:&8%8#8#
+5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5
+
+
+
+
+
+
+
+
+Hz
+S0A2J"
+SAFFJZ
+4S-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+I"
+FFHz
+S0E5
+
+
+
+
+
+
+
+
+
+
+<z
+SIE4=z"
+SGE5FF=Z
+SG<z
+SIE5
+
+
+
+
+
+
+
+Ez
+OAE4J"
+P!FFGz"
+O=E5FF
+
+
+JZJZJZ
+5O54O54O5J"J"J"
+OIE4OHE4OHE4Jz"Jz"Jz"
+7O1E5E47O1E5E47O1E5E4
+
+
+
+
+J%:#9#J%J#J#9#>#
+O!FEFEFEFEFEFEFEFEO0FEFEFEFE=FEFEO*FEFEFEFEFEFEJ'=$J'
+O FEFEE5E5FEFEFEFEE5O/FEFEE5E5FEFEJ$8$;$J$8(8&9%9%J%;&
+MFEFEE5E5FEFEFEFEE5O/FEFEE5E5E5E5FEFEFEFEFEFEE5FEFEFEFEFEFEFEFEFEFEO7FEFEFEFEFEFEE5FEFEJ$J'93J'<%
+O+FEFEE5O7FEFEE5E5FEFEFEE5FEFEE5FEFEE5E5FEFEE5FEFEE5E5FEFEO5FEFEE5E5FEFEFEE5FEFEJ#=">#J$E"
+PEE5E5E5E5E5O6FEFEFEE5J$J$I#J$;#
+O+E5FEFEO8FEFEFEFEFEO1E5E5E5FEFEJ$J%I%J%
+O,E5FEFEO6FEFEE5E5E5E5E5E5O7E5E5E5E5J$8$<$J$8#H#;#J#<"
+ME5FEFEFEFEE5E5FEFEO.E5FEFEFEFEFEFEFEFEO9FEFEFEJ'>$J.=.J'<%
+O E5FEFEFEFEE5E5FEFEO.E5FEFEFEFEE5E5FEFEFEE5FEFEE5FEFEFEFEE5E5E5FEFEFEFEE5O5E5FEFEFEFEE5E5FEFEE5J%:#:#J%8s8#8%9%8#J#9#8%8#:#
+O!E5E5E5E5E5E5E5E5O/E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5O*E5E5E5E5E5E5E5E5E5E5E5E5
+
+J#
+S#E5E5
+
+
+
+&J%
+F7F7F7F7F7SJF7F7F7F7&HzJzJzG&
+F6F6F6F6F6O1E48O1E48O1E4F6F6F6F6F68$G"J"J"J%
+F9F9F9E4OHE4OHE4OCF9F9F9F7JzJzJz
+5O5E54O5E54O5E5
+
+
+GZ
+O=F"
+FFEz
+OAE5
+
+
+
+
+
+
+
+<z"z"z
+0F6F7S&F6F71F6;z8z8z
+1F9S%F91F9
+
+7z8z8z
+5F7S%F74F7"J"J"
+F76F7S&F7
+ENDBITMAP
+%%EndBinary
+378 217.71 477 235.71 R
+7 X
+V
+4 8 Q
+0 X
+(promptdialog .pd) 378 230.38 T
+(.pd activate) 378 220.38 T
+0 10 Q
+(FIGURE 32) 368.58 188.61 T
+1 F
+( - Promptdialog) 419.97 188.61 T
+315 72 540 720 C
+0 0 612 792 C
+FMENDPAGE
+%%EndPage: "16" 16
+%%Page: "17" 17
+612 792 0 FMBEGINPAGE
+[0 0 0 1 0 0 0]
+[ 0 1 1 0 1 0 0]
+[ 1 0 1 0 0 1 0]
+[ 1 1 0 0 0 0 1]
+[ 1 0 0 0 0 1 1]
+[ 0 1 0 0 1 0 1]
+[ 0 0 1 0 1 1 0]
+ 7 FrameSetSepColors
+FrameNoSep
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+0 12 Q
+0 X
+0 0 0 1 0 0 0 K
+(Selectiondialog) 145.83 712 T
+1 10 Q
+-0.19 (The Selectiondialog class provides a dialog based Selec-) 72 693.33 P
+(tionbox.) 72 681.33 T
+72 377.72 297 720 C
+72 440.98 297 678 C
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+72 471 297 669 R
+7 X
+0 0 0 1 0 0 0 K
+V
+0.5 H
+2 Z
+0 X
+N
+%%BeginBinary: 5294
+262 379 104.8 151.6 0 135 508.4
+/red <
+7266F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF80808080
+8080808080808080808080808080808080808080404040404040404040404040
+4040404040404040404040000000000000000000000000000000000039C069DD
+00FF0000003333330033CCDD9999112277005544FFCC66AABBFF33EE9999CC7A
+EFD39765E1A36FE700557FFF5500B22E99FFFFB07AFFB0CC0087AFB4CD73E6A2
+4DBF88F5439D58D750D080C0C080C0808060C000FFA000FF20C0A040C040D060
+F0E010B499FFA0BE8BD28BD9B3FF720019BF2FFF6223852F465F4770FF0000FF
+> store
+/green <
+9F99DE00000000000000000000000000FFFFFFBFBFBFBFBF8080808080404040
+40000000FFFFFFFFFFBFBFBFBF808080808040404040400000000000FFFFFFFF
+FFBFBFBFBFBF8080808040404040400000000000FFFFFFFFFFBFBFBFBFBF8080
+8080804040400000000000FFFFFFBFBFBFBFBF80808040404040400063E0B500
+996699FF00663399BBFF99DD99FF112277005544CCCC66AABB6600EE6600CC69
+E3B59765E1A36FE7006B7FFF1A00B28B99FFFFB094FF30F700CEEEEE0073E6A2
+4DBF88F54DB358D78080C0C080C080808060C08000A080402070A0402040D0F0
+F0E010B489E4A0BE5BB477D9B3FF77FF19264F00B641DE4F829E4780FF0000FF
+> store
+/blue <
+FFFFB3FFFFFFFFFFFFFFFFFFFFFFFFFFBF8040FFBF804000FFBF804000FFBF80
+00BF8040FFBF804000FF804000FFBF804000FFBF804000FFBF804000FFBF8040
+00FFBF804000FFBF4000FFBF804000FFBF804000FFBF804000FFBF804000FFBF
+804000FFBF00FFBF804000BF8040FFBF804000FFBF40FFBF8040004063E0B500
+FF3399FF88666666009966DDFFFF112277DD554499FFCCAABBCC99EE9966CC69
+E3B59765E1A36FE7BF2F7FCC8BEEB2576BFBB3B01532602480FAEEB40073E6A2
+4DBF88F556CA58D7D050C080C08080C08060C080FF0000402070C0802040D060
+50E010B476C4A0BE7A8C65D9B3E0850070264F00FC5AE050B4A0FF9000FF00FF
+> store
+ BEGINBITMAPCOLORc
+z"z"z"
+6F6F7R?F6F76F6F7J"
+S>F78z8z8z
+4F9R>F94F9
+
+;z"
+S5F7F6<z"z
+0F6F7S"F6=z8z
+/F9S!F9
+J'>$H"9#Jr:#@$
+OHFEFEFEFEF9FEFEFEFEFEFEFE7FEFEFEFEFEFEJ'?"I"J"8&E"
+OGFEFEF9F9F9FEF9FE=F9F9F9F9FEFEF9J"J#J$8#J#
+OLF9BF9F9=F9FEFEF9F9;FEFEJ#8"9$?$:$8"8&:$9'G$9%@$:&
+OIFEFEF9FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF9FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF9@s"J"9#8'<08$:*8%F"<%=/
+F6F7O4F9FEFEFEFEFEF9FEFEFEFEFEF9FEFEF9FEFEFEF9FEFEF9F9F9F9F9FEFEFEF9FEFEFEF9F9FEF9FEFEF9F9F9FEFEFEFEFEF9FEFEFEF9FEFEF9F9FEFEArJ#9":"A";%C$<"J$A$
+F9O6F9F9FEFEFEF9F9F9F9F9F9F9F99F9FEFEF9F9F9@sJ"8#;%>%J%G'
+F7O5FEF9F9F9F9F9F9F9F9F9F9O(FEFEF9F9F9FEFEFEFEF9@tJ">%>%9%C$J$?"A$9&
+F9O5FEFEF9FEFEFEF9FEFEFEF9FEFEFEF9FE6FEFEF9FEFEF9FEFEF9F9F9F9J0808&8,8"9";"8&8"8'8$8*8&
+OHF9FEFEFEFEF9F9F9F9FEFEFEF9F9FEFEF9F9F9FEFEFEF9F9F9F9FEFEFEF9F9FEFEF9FEFEF9F9F9FEFEFEF9F9F9FEFEFEFEFEFEFEFEF9FEFEF9F9FEFEF9FEF9FEFEF9F9F9FEFEFEF9F9FEFEFEFEFEJ':$8%9$:$:r9$9s;r9%8v9$9";"
+OGF9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FEJ&
+R"FEF9F9F9F9J(
+R"F9FEFEFEFEFEF9=z8z
+/F7S!F7rF"J%
+F7F7S"F7F7F7F7'z&
+F6F6F6F6F6F7S4E5F6F6F6F6F68$J%
+F9F9F9S6F9F9F9F7
+
+
+
+
+
+
+
+
+
+
+
+
+J#8#
+4FEFEFEFE
+J"8"8%8*9%
+7FEFEFEFEFEFEFEE5FEFEFEE5FEFEFEFEFEFEFEJ"8)81
+7E5E5E5FEFEE5E5FEFEFEE5E5FEFEE5E5FEFEE5FEFEE5E5FEFEJ%
+O"FEE5E5E5J#D&
+>FEFEE5E5FEFEFEJ%D"8"
+>E5E5E5E5E5FEJ":#B%
+;FEFEFEFEFEE5E5J+B'
+8E5FEFEE5E5FEFEFEFEE5E5FEFEFEFEE5J#9#8%8#8#8#8%
+4E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5
+
+
+
+
+
+
+
+Hz=z
+R0A23E4J"J"
+RAFF9FFJZ@r"r"
+4R-DEE4DEFFJ"
+S#FFJ"
+S%E4J"
+S"FFJ$
+S$E5E4E4J$
+S!FFFFE5J$
+S%E5E4E4J$
+S FFFFE5J$
+S&E5E4E4J$
+RMFFFFE5J$
+S'E5E4E4J$
+RLFFFFE5J$
+S(E5E4E4J#u
+RKFFFFE4J"B"
+RLE4E4Jz
+RK/DEJZ
+RK/J"
+S+E4Jv"
+RME5E4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Jv
+RME4J"
+RLE4Jz
+RK/DEJZ
+RK/J"C"
+RKDEE4Jt$
+S E5E4E4DEJ$
+RLDEFFFFJ$
+S(E4E4DEJ$
+RMDEFFFFJ$
+S'E4E4DEJ$
+S DEFFFFJ$
+S&E4E4DEJ$
+S!DEFFFFJ$
+S%E4E4DEJ$
+S"DEFFE4J"
+S&DEJ"
+S#DEJ"
+S%DEJZ
+RK/I"J"
+FFR6FFHz=z
+R0E53E5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+J&?#F#8#
+5FEFEFEFEFEFEFEFEFEFEFEJ(J#
+4FEFEE5E5E5FEFE>E5E5J%<%9%8"8%8%8&
+=FEFEFEFEFEFEFEFEFEFEFEFEFEFEE5FEFEFEFEFEFEFEFEE5FEFEJ/:08":'9%
+4E5FEFEFEE5E5E5E5FEFEE5E5FEFEFEFEE5E5FEFEE5FEFEE5E5FEFEE5E5E5FEFEE5E5FEFEFEE5FEFEJ&J#H"
+5E5E5FEFEFE7E5E5E5J"8"9#>#
+7E5FEFEFEFEFEJ#8";%<%
+4FEFEE5E5E5E5E5E5E5E5E5J#>#;#;"
+@FEFEFEFEFEFEFEJ/:.8%9'
+4E5FEFEFEFEFEE5E5E5FEFEFEFEE5E5FEFEFEFEE5E5E5FEFEFEFEE5E5FEFEE5E5FEFEFEFEE5J&9%8#8%9%:&8%8#8#
+5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5
+
+
+
+
+
+
+
+
+Hz
+RIA2J"
+S,FFJZ
+4RF
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+I"
+FFHz
+RIE5
+
+
+
+
+
+
+
+
+
+
+<z
+S4E4=z"
+S2E5FF=Z
+S2<z
+S4E5
+
+
+
+
+
+
+
+Ez
+O:E4J"
+OHFFGz"
+O6E5FF
+
+
+JZJZJZ
+5O.4O.4O.J"J"J"
+OBE4OAE4OAE4Jz"Jz"Jz"
+7O*E5E47O*E5E47O*E5E4
+
+
+
+
+J%:#9#J%J#J#9#>#
+KFEFEFEFEFEFEFEFEO)FEFEFEFE=FEFEO$FEFEFEFEFEFEJ'=$J'
+JFEFEE5E5FEFEFEFEE5O(FEFEE5E5FEFEJ$8$;$J$8(8&9%9%J%;&
+IFEFEE5E5FEFEFEFEE5O(FEFEE5E5E5E5FEFEFEFEFEFEE5FEFEFEFEFEFEFEFEFEFEO1FEFEFEFEFEFEE5FEFEJ$J'93J'<%
+O'FEFEE5O0FEFEE5E5FEFEFEE5FEFEE5FEFEE5E5FEFEE5FEFEE5E5FEFEO/FEFEE5E5FEFEFEE5FEFEJ#=">#J$E"
+P:E5E5E5E5E5O0FEFEFEE5J$J$I#J$;#
+O'E5FEFEO1FEFEFEFEFEO+E5E5E5FEFEJ$J%I%J%
+O(E5FEFEO/FEFEE5E5E5E5E5E5O1E5E5E5E5J$8$<$J$8#H#;#J#<"
+IE5FEFEFEFEE5E5FEFEO'E5FEFEFEFEFEFEFEFEO3FEFEFEJ'>$J.=.J'<%
+JE5FEFEFEFEE5E5FEFEO'E5FEFEFEFEE5E5FEFEFEE5FEFEE5FEFEFEFEE5E5E5FEFEFEFEE5O/E5FEFEFEFEE5E5FEFEE5J%:#:#J%8s8#8%9%8#J#9#8%8#:#
+KE5E5E5E5E5E5E5E5O(E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5O$E5E5E5E5E5E5E5E5E5E5E5E5
+
+J#
+R@E5E5
+
+
+
+&J%
+F7F7F7F7F7S5F7F7F7F7&HzJzJzG&
+F6F6F6F6F6O*E48O*E48O*E4F6F6F6F6F68$G"J"J"J%
+F9F9F9E4OAE4OAE4O<F9F9F9F7JzJzJz
+5O.E54O.E54O.E5
+
+
+GZ
+O6F"
+FFEz
+O:E5
+
+
+
+
+
+
+
+<z"z"z
+0F6F7R?F6F71F6;z8z8z
+1F9R>F91F9
+
+7z8z8z
+5F7R>F74F7"J"J"
+F76F7R?F7
+ENDBITMAP
+%%EndBinary
+135 480 243 498 R
+7 X
+V
+4 8 Q
+0 X
+(selectiondialog .sd) 135 492.67 T
+(.sd activate) 135 482.67 T
+0 10 Q
+(FIGURE 33) 123.53 453.1 T
+1 F
+( - Selectiondialog) 174.92 453.1 T
+72 377.72 297 720 C
+0 0 612 792 C
+0 12 Q
+0 X
+0 0 0 1 0 0 0 K
+(Fileselectiondialog) 380.17 712 T
+1 10 Q
+(The Fileselectiondialog is a dialog based Fileselection-) 315 687.33 T
+(box.) 315 675.33 T
+315 406.97 540 672 C
+0 0 0 1 0 0 0 K
+0 0 0 1 0 0 0 K
+315 438 540 663 R
+7 X
+0 0 0 1 0 0 0 K
+V
+0.5 H
+2 Z
+0 X
+N
+%%BeginBinary: 33477
+462 429 184.8 171.6 0 337.2 482.4
+/red <
+7266F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFFFFFFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBF80808080
+8080808080808080808080808080808080808080404040404040404040404040
+4040404040404040404040000000000000000000000000000000000039C069DD
+00FF0000003333330033CCDD9999112277005544FFCC66AABBFF33EE9999CC7A
+EFD39765E1A36FE700557FFF5500B22E99FFFFB07AFFB0CC0087AFB4CD73E6A2
+4DBF88F5439D58D750D080C0C080C0808060C000FFA000FF20C0A040C040D060
+F0E010B499FFA0BE8BD28BD9B3FF720019BF2FFF6223852F465F4770FF0000FF
+> store
+/green <
+9F99DE00000000000000000000000000FFFFFFBFBFBFBFBF8080808080404040
+40000000FFFFFFFFFFBFBFBFBF808080808040404040400000000000FFFFFFFF
+FFBFBFBFBFBF8080808040404040400000000000FFFFFFFFFFBFBFBFBFBF8080
+8080804040400000000000FFFFFFBFBFBFBFBF80808040404040400063E0B500
+996699FF00663399BBFF99DD99FF112277005544CCCC66AABB6600EE6600CC69
+E3B59765E1A36FE7006B7FFF1A00B28B99FFFFB094FF30F700CEEEEE0073E6A2
+4DBF88F54DB358D78080C0C080C080808060C08000A080402070A0402040D0F0
+F0E010B489E4A0BE5BB477D9B3FF77FF19264F00B641DE4F829E4780FF0000FF
+> store
+/blue <
+FFFFB3FFFFFFFFFFFFFFFFFFFFFFFFFFBF8040FFBF804000FFBF804000FFBF80
+00BF8040FFBF804000FF804000FFBF804000FFBF804000FFBF804000FFBF8040
+00FFBF804000FFBF4000FFBF804000FFBF804000FFBF804000FFBF804000FFBF
+804000FFBF00FFBF804000BF8040FFBF804000FFBF40FFBF8040004063E0B500
+FF3399FF88666666009966DDFFFF112277DD554499FFCCAABBCC99EE9966CC69
+E3B59765E1A36FE7BF2F7FCC8BEEB2576BFBB3B01532602480FAEEB40073E6A2
+4DBF88F556CA58D7D050C080C08080C08060C080FF0000402070C0802040D060
+50E010B476C4A0BE7A8C65D9B3E0850070264F00FC5AE050B4A0FF9000FF00FF
+> store
+ BEGINBITMAPCOLORc
+z"z"z"
+6F6F7W!F6F76F6F7J"
+X F78z8z8z
+4F9W F94F9
+
+;z"
+WEF7F6<z"z
+0F6F7W2F6=z8z
+/F9W1F9
+Js8#8$D'>$H"9#Jr:#@$
+Q@FEFEFEFEFEFEFEFEFEFEF9FEFEFEFEFEFEFE7FEFEFEFEFEFEJ"8$>"E'?"I"J"8&E"
+Q@F9F9F9F9F9FEFEF9F9F9FEF9FE=F9F9F9F9FEFEF9J"9#J"J#J$8#J#
+QFF9F9F97F9BF9F9=F9FEFEF9F9;FEFEJ"9$?$>#8"9$?$:$8"8&:$9'G$9%@$:&
+QEFEFEFEFEFEFEFEFEFEF9FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF9FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF9@s"J#8$?';"9#8'<08$:*8%F"<%=/
+F6F7Q0FEFEF9F9F9FEFEFEF9FEFEF9FEFEFEFEFEF9FEFEFEFEFEF9FEFEF9FEFEFEF9FEFEF9F9F9F9F9FEFEFEF9FEFEFEF9F9FEF9FEFEF9F9F9FEFEFEFEFEF9FEFEFEF9FEFEF9F9FEFEArJ#G">#9":"A";%C$<"J$A$
+F9Q1F9F9FEF9F9FEFEFEF9F9F9F9F9F9F9F99F9FEFEF9F9F9@sJ"E%;"8#;%>%J%G'
+F7Q3F9F9F9F9F9FEF9F9F9F9F9F9F9F9F9F9O(FEFEF9F9F9FEFEFEFEF9@tJ%<">%>%9%C$J$?"A$9&
+F9QBFEF9FEFEFEFEF9FEFEFEF9FEFEFEF9FEFEFEF9FE6FEFEF9FEFEF9FEFEF9F9F9F9J"8";"8$8)<0808&8,8"9";"8&8"8'8$8*8&
+Q@FEFEFEFEF9FEFEF9F9F9FEFEFEF9F9FEFEFEFEF9F9F9F9FEFEFEF9F9FEFEF9F9F9FEFEFEF9F9F9F9FEFEFEF9F9FEFEF9FEFEF9F9F9FEFEFEF9F9F9FEFEFEFEFEFEFEFEF9FEFEF9F9FEFEF9FEF9FEFEF9F9F9FEFEFEF9F9FEFEFEFEFEJ%;t9$<':$8%9$:$:r9$9s;r9%8v9$9";"
+Q@F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FEJ&
+T9FEF9F9F9F9J(
+T9F9FEFEFEFEFEF9=z8z
+/F7W1F7rF"J%
+F7F7W2F7F7F7F7'z&
+F6F6F6F6F6F7WDE5F6F6F6F6F68$J%
+F9F9F9WFF9F9F9F7
+
+
+
+
+
+
+
+
+
+
+
+
+Js$8#
+4FEE5FEFEFEFEJ'
+6E5E5E5E5E5E5J#:"8"8%8&
+:FEFEFEFEFEFEFEFEFEFEE5FEFEJ"8)9"
+@E5E5E5FEFEE5E5FEFEFEJ$J#
+6FEFEFE6E5E5J$D#;"
+6E5E5E5FEFEE5J%
+GE5E5E5E5J":#
+DFEFEFEJ+
+AE5FEFEE5E5FEFEFEFEE5J#:&9#8%8#
+4E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5
+
+
+
+
+
+
+
+
+H5
+W+FFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFH5
+W*FEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFH#Z
+FFFEW'H#
+FEFFH#J$J"J":&9$>"E$<$J"J"J"9"C"=#J"B$8#A":#J"
+FFFECFEFEFE@FE8FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFECFEBFEO"FEFEFEFEFEGFEFEFEFEFEFEFEFEFECFEH#J"?$J#J#<%8&<#E#<%G"F#J#J#9"C"="H"I#B(A#:"J#9"
+FEFF8FEFEFFFF@FEFF6FEFEFFFFFFFFFEFFFFFFFEFEFFFFFFFEFFFFFFFEFEFFAFEFFO!FEFFFFFFFFFEFEFEFEFFFFFFFEFFFFFEFFFFCFEFFFEH#J#J#
+FFFEP!FFFFS&FFFFH#>&8&9&;#:#:$8&:$<#9$8#8)J)8#8#?&9$9&8&9$<):$9&9$<#9$:$8&8&:$8&<#8$9,;$:&8$9&9$J$<#9$:$8&:$:$<#8&
+FEFFFEFEFEFFFEFEFFFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFFFEFEFEFEFEFFFEFEFEFEFEFEFEFFFEFFFEFEFE;FEFFFFFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFEFFFFFEFEFEFFFEFEFEFEFEFFFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFFFEFEFEFEFFFEFEFEFEFEFFFEFEFEFEFFFEFEFEFEFEFEFFFEFEFEFFFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFE@FEFEFEFEFFFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFFFEFEFEFEFEH#>.8&@%8-8&?(9"8'@$9"8#>)9"@&8&8&8&8&>'8&8&8&?&848-?#:+;%9-8&8&J%?%9-8&8&?&
+FFFEFFFEFFFEFFFEFFFFFEFEFFFFFEFFFEFFFFFFFEFFFFFEFEFFFFFFFEFFFFFEFFFEFFFEFEFFFFFFFEFEFFFFFFFEFFFFFFFFFEFEFFFFFEFEFEFEFFFEFFFFFEFFFEFFFEFFFFFFFFFEFFFFFFFEFFFFFFFEFFFEFFFFFFFFFEFFFFFFFEFFFFFFFEFFFEFFFEFFFEFEFFFFFFFEFFFEFFFFFFFEFFFFFFFEFEFFFFFFFEFEFFFFFFFEFFFFFEFFFEFFFEFFFFFEFFFEFFFEFEFFFFFFFEFFFFFEFEFFFFFEFFFFFFFEFFFFFFFEFFFFFFFFFEFFFFFFFEFFFFFFFEFFFFFEFFFFFFFEFFFEFFFFFFFEFFFFFFFE?FFFFFFFEFEFFFFFFFEFFFFFFFEFFFFFEFFFEFFFEFEFFFFFFFEFEFFFFFFFEFFFFFEFFFFH#G"D#:"J$;#9&@"B&:#;#J$G&:#A$D":#="J"=#B"J$@&8&J#A$G&:#:$
+FEFFFFFEFFFF4FEFEFEFEFFFFFEFEFEFFFFFFFFFFFFFEFEFFFEFF@FEFEFEFFFEFEFEFFFEFFFEFEFEFFFEFFFF?FFFEFFFE:FEFEFEFFFEFEFEFFFEFEFEFEFE@FEFFFEFEFEFFFEFEFEFFFEFFFEFFFEH#J%@%J#J%G%G%J%@%8PJ%G%@$
+FFFEO-FFFFFFFFFFFFFFFE?FEFFHFFFFFFFFFFFFFFFEFFFFFFFFP0FFFFFFFFFFFFFFFEMFFFFFFFFFFFFFFFEFFFFFFH#J"8#J"9#:"J"=#8"9#J"D$=#E"C"9#>"J#A&J"=$J#E"F"=#
+FEFF<FEFEFF=FEFEFFFE:FEFEFFFEFEFFDFEFEFFFEFEFFFEFEFEFFFEFFEFFFFFEFFFEFF;FEFEFFFEJFEFFFEFEFEFFH#>";%9"8&=0;(?&8*9/9$?";59&8%:,>";(8%9&?&8(;#;,9">&?&8,9&9,?&9";-?/;(8&
+FFFEFEFEFEFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFFFEFEFEFFFFFEFEFFFFFEFEFEFFFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFFFEFEFEFEFEFFFFFEFEFEFEFFFEFEFEFE4FEFFFFFEFEFEFFFEFFFEFEFEFEFEFEFFFEFEFEFEFFFEFEFEFFFEFEFEFEFFFEFEFEFFFFFFFEFEFEFFFEFEFFFFFEFEFEFFFEFEFEFEFFFEFEFEFFFFFEFEFEFFFFFEFEFEFFFFFEFEFEFEFFFFFEFEFEFFFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFEFEFEFFFEFFFFFEFEFEFFFEFEFEFFFFFEFEFEFFFFFFFEFEFEFFFEFEFEFEFEFEFFFEFEFEFFFFFEFFFEFEFEFFFFFEFEFEFFFEFFFFFEFEFEFFFFFEFEFFFFFEFEFEFFFFFEFEFEFFH#>U8#9$8#:R8$8R8$9#<$:S8S8%9P8#:R8Z:$9%;$9$9#:R8$9%:$9#<$:$8Y8$8$8&;P9$9P9P8$:$;$9$@P9"<$8P9#<P8$8R8$:$9#
+FEFFFFFFFFFFFFFEFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFEFF1FFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFEFFH#J"J"J"J"J"J"J"J"
+FFFE>FFBFFO"FFO0FFBFFO"FFP%FFIFFH$rJ%
+FEFFFFFET-FEFEFEFFH#SJ$
+FFFET-FFFFFFH#
+FEFFH"
+FFHz
+W+E5
+
+
+
+
+
+
+
+
+
+
+
+
+J&9#J#D#Js$
+4FEFEFEFEFEFEFE5FEFEFEFEQ@FEE5FEFEJ%8#J#J'
+6E5E5FEFEE5E5EE5E5QBE5E5E5E5E5E5J29%8"8"8%8(8%9%J#;%9%
+8E5FEFEE5FEFEE5FEFEE5FEFEE5FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEE5FEFEFEFEFEFEFEFEFEFEFEFEQ9FEFEFEFEFEFEFEFEFEFEJ"808)9";.J.
+AFEFEFEE5E5FEFEE5FEFEE5E5FEFEE5E5E5E5FEFEE5E5FEFEFEFEFEE5E5FEFEE5FEFEE5E5FEFEQ>FEFEE5E5FEFEE5FEFEE5E5FEFEJ#A#F#B%J$F%
+BE5E5E5E5E5E5FEE5E5E5Q4FEFEFEFEE5E5E5J":#J"=#9&J$?#9&
+AE5FEFE8E5FEFEE5E5FEFEFEQ5E5E5E5FEFEE5E5FEFEFEJ%J%9"8"J%9"8"
+FE5E5E5E5>E5E5E5E5E5FEQ@E5E5E5E5E5FEJ$C#;#;"I(J(
+8FEFEE5FEFEFEFEFEFEFEE5FEFEE5E5QDFEFEE5FEFEE5E5J%@.8+?.J.
+6FEFEFEE5E5FEFEFEFEE5E5E5FEFEFEFEE5E5FEFEE5E5FEFEFEFEE5E5FEFEFEFEE5E5E5FEFEFEFEE5Q>E5FEFEFEFEE5E5E5FEFEFEFEE5J&9&:%9%:#8%8#9#8%9%J#:&8%9%
+4E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5Q3E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5
+
+
+
+
+
+
+
+H5=zB5=z
+QKFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFF3E4QKFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFF3E4H5J"B5J"
+QJFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFF:FFQJFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFF:FFH5Ar"r"C#ZAr"r"
+QIFFFEDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEDEE4DEFFFFFEQGDEE4DEFFH#z"G"J#J"
+FEFFQFDEFEFF6FEFFR*FFH#<"9"C"=#J"B$8#A":#J"J"I"J#J"J"
+FFFEFEFEFEFEFEGFEFEFEFEFEFEFEFEFECFE=DEE44FFFEBFEQ7E4H#;#9"C"="H"I#B(A#:"J#J"F"J#J(A"<"H&J"
+FEFFFEDEDEDEDEFEFEFEFEDEDEDEFEDEDEFEDEDECFEDE=FEFF7FEFFAFEFFFEFEFEFEFEFEFEFEFEFEFEFEP3FFH#J#J"H$I#J'J'J$
+FFFEO9DEDEP+DEE5E4E4FFFECFFFEFFFFFFFEDFFFEFFFFFFFEP4E5E4E4H#:#8$9,;$:&8$9&9$J$<#9$:$8&:$:$<#J"E$J#8$8&:$:$<#>#8#8&8&9$8&A$8(J$
+FEFFFEDEFEFEFEFEFEFEDEFEFEFEDEFEFEFEFEFEFEFEFEFEDEFEFEFEFEFEFEFEFEFEFEFEFE@FEFEFEFEDEFEFEFEFEFEFEFEFEFEDEFEFEFEFEFEFEFEFEDE>FEFFFFE56FEFFFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFFFEFEFEP"FFFFE5H#>#:+;%9-8&8&J%?%9-8&8&J"I$H08&8&@'9"9&8&8-9%8)9#J$
+FFFEDEDEDEFEDEDEDEFEDEDEDEDEFEDEDEDEFEDEDEDEFEDEDEFEDEDEDEFEDEFEDEDEDEFEDEDEDEFE?DEDEDEFEFEDEDEDEFEDEDEDEFEDEDEFEDEFEDEFEFEDEDEDEFEFEDEDEDEFEEDEE5E4E4FFFEFFFEFFFFFFFEFFFFFEFFFEFFFEFEFFFFFFFEFEFFFFFFFEFEFEFEFFFFFFFFFFFEFFFFFFFFFEFFFFFFFEFFFFFFFEFFFFFEFEFFFFFEFEFEFEFFFEFFFFFFFEFFFFFFFFFFP&E5E4E4H#9#B"J$@&8&J#A$G&:#J"D$J#8$G&:#:%J"<%@$J$
+FEFFFEDEFE:FEFEFEDEFEFEFEDEFEFEFEFEFE@FEDEFEFEFEDEFEFEFEDEFEDE?FEFFFFE57FEFFFEFEFEFFFEFEFEFFFEFFFFFFFFFE?FFFFFFFFFEFFFEFFP#FFFFE5H#J%@%8&J%G%J"J$G#8%G%J$J$
+FFFELDEDEDEDEDEDEDEFEDEDEDEDEDEMDEDEDEDEDEDEDEFEEDE4E5E4E4FFFEFFFFFFFFFFFFFFFEO4FEFFFEP)E5E4E4H#8#A&J"=$J#E"F"=#J"C$J#;"F"=#J"<"J&J$
+FEFFFEDEDEFEDEFEDE;FEFEDEFEJFEDEFEFEFEDE@FEFFFFE58FEFFFEFEFEFF7FEFE=FEFFFFFFFEP!FFFFE5H#>&?&8,9&9,?&9";-?/;(8&@"J"J$F+;(8&>'8'8&809(8(;"J$
+FFFEFEFEFEFEFEFEFEFEFEFEDEFEFEFEDEFEDEDEFEFEFEDEFEFEFEDEDEFEFEFEDEDEDEFEFEFEDEFEFEFEFEFEFEDEFEFEFEDEDEFEDEFEFEFEDEDEFEFEFEDEFEDEDEFEFEFEDEDEFEFEDEDEFEFEFEDEDEFEFEFEDEFE:DE5E5E4E4FFFEFFFFFEFEFEFFFFFEFEFFFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFFFFFEFEFEFFFEFFFEFEFEFFFFFEFEFEFFFFFFFEFEFEFFFFFEFEFEFEFEFEFEFEFEFFFFFEFEFEFFFFFEFEP(E5E4E4H&;&9$9&9&8$:$;$9$@&9"<$8&9#<&8$8r8$:$9#<"J"B$J#8$8R8$:$9#:P:P9$:$9$8$8R:$8#9#J$
+FEFFDEFEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEFEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEFEDEDE:FEFFFFE59FEFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFOMFFFFE5H%J"J"J"J$E#J"J$
+FFFEDEDEP%DEIDEBDE6E5E4E4FFFE=FFQ?E5E4E4H#J%J"A#uG#J#u
+FEFFEFEFEFEDEPKFEFFFFE4FEFFR$FFFFE4H#J$J"B"B"D#J"B"
+FFFEEDEDEDEPLDEE4E4FFFER%E4E4H5AzD#Jz
+QIFEFFFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFE/DEFEFFR$/DEH#ZAZD#JZ
+FFFEQG/FFFER$/H#J"D#J"
+FEFFR2E4FEFFR2E4H#<"9"C"=#J"B$8#A":#J"Jv"E#J"@"A$Jv"
+FFFEFEFEFEFEFEGFEFEFEFEFEFEFEFEFECFEKE5E4FFFEBFEFEFEFEFEPFE5E4H#;#9"C"="H"I#B(A#:"J#J#J(;"A#
+FEFFFEFFFFFFFFFEFEFEFEFFFFFFFEFFFFFEFFFFCFEFFO8FEFFAFEFFFEFEFEFEFEFFFFFFH#J#J#J'
+FFFEO9FFFFQ&FFFECFFFEFFFFFFFEH#:#8$9,;$:&8$9&9$J$<#9$:$8&:$:$<#J#8$8&:$:$<#?$:%A$:&
+FEFFFEFFFEFEFEFEFEFEFFFEFEFEFFFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFE@FEFEFEFEFFFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFFO9FEFFFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFFFEH#>#:+;%9-8&8&J%?%9-8&8&J08&8&F#;&?&8'
+FFFEFFFFFFFEFFFFFFFEFFFFFFFFFEFFFFFFFEFFFFFFFEFFFFFEFFFFFFFEFFFEFFFFFFFEFFFFFFFE?FFFFFFFEFEFFFFFFFEFFFFFFFEFFFFFEFFFEFFFEFEFFFFFFFEFEFFFFFFFEO@FFFEFFFEFFFFFFFEFFFFFEFFFEFFFEFEFFFFFFFEFEFFFFFFFEFFFFFFFFFFFFFEFEFFFFFFFEFEFFFFFFFEFFH#9#B"J$@&8&J#A$G&:#J#8$G&:#H$
+FEFFFEFFFE:FEFEFEFFFEFEFEFFFEFEFEFEFE@FEFFFEFEFEFFFEFEFEFFFEFFO:FEFFFEFEFEFFFEFEFEFFFEFFFEFEFEH#J%@%8PJ%G%J#8%G%J%
+FFFELFFFFFFFFFFFFFFFEMFFFFFFFFFFFFFFFEO@FFFEFFFFFFFFFFFFFFFE7FEFFFFFFH#8#A&J"=$J#E"F"=#J#;"F"=#
+FEFFFEFFFFFEFFFEFF;FEFEFFFEJFEFFFEFEFEFFO;FEFFFEFEFEFFH#>&?&8,9&9,?&9";-?/;(8&@"<"J+;(8&>'8&848%
+FFFEFEFEFEFEFEFEFEFEFEFEFFFEFEFEFFFEFFFFFEFEFEFFFEFEFEFFFFFEFEFEFFFFFFFEFEFEFFFEFEFEFEFEFEFFFEFEFEFFFFFEFFFEFEFEFFFFFEFEFEFFFEFFFFFEFEFEFFFFFEFEFFFFFEFEFEFFFFFEFEFEFFFEFEO.FFFEFFFFFEFEFEFFFFFEFEFFFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFFFEFEFEFEFEFFFEFEFEFFFEFFFEFEFEFEFEFEFFFFFEFEFEFFFFFEFEFEH&;P9$9P9P8$:$;$9$@P9"<$8P9#<P8$8R8$:$9#<"<"J#8$8R8$:$9#:P9P9W8$:$
+FEFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFEFFFFFFO.FEFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFH%J"J"J#J"
+FFFEFFFFP%FFIFFO=FFFE=FFH#J%J#J%
+FEFFEFEFEFEFFQFFEFFO:FEFEFEFFH#J$J#J$
+FFFEEFFFFFFQGFFFEO:FFFFFFH#J#
+FEFFRAFEFFH#J#
+FFFERAFFFEH#J#
+FEFFRAFEFFH#<"9"C"=#J"B$8#A":#J"J#J"@"A$J#C$:$
+FFFEFEFEFEFEFEGFEFEFEFEFEFEFEFEFECFEO8FFFEBFEFEFEFEFE8FEFEFEFEFEFEFEFEH#;#9"C"="H"I#B(A#:"J#8$8(8%J#J(;"A#J'D#;#
+FEFFFEFFFFFFFFFEFEFEFEFFFFFFFEFFFFFEFFFFCFEFFFEFEFEFEFEFEFFFEFEFEFEFEFEFEO$FEFFAFEFFFEFEFEFEFEFFFFFF4FEFEFEFEFFFFFFFFFFFFH#J#J3J#J'J%
+FFFEO9FFFFO=FEFFFFFFFEFFFFFEFFFFFFFEFFFFFEFFFFFFO%FFFECFFFEFFFFFFFEEFEFFFFFFH#:#8$9,;$:&8$9&9$J$<#9$:$8&:$:$<#J"J#8$8&:$:$<#?$:%A$:&;":#:$
+FEFFFEFFFEFEFEFEFEFEFFFEFEFEFFFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFE@FEFEFEFEFFFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFF4FFO$FEFFFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFFFEFFFEFEFEFEFEH#>#:+;%9-8&8&J%?%9-8&8&C"9$:#J08&8&F#;&?&8'8#;%8&
+FFFEFFFFFFFEFFFFFFFEFFFFFFFFFEFFFFFFFEFFFFFFFEFFFFFEFFFFFFFEFFFEFFFFFFFEFFFFFFFE?FFFFFFFEFEFFFFFFFEFFFFFFFEFFFFFEFFFEFFFEFEFFFFFFFEFEFFFFFFFEFFFEFFFEFEFEO&FFFEFFFEFFFFFFFEFFFFFEFFFEFFFEFEFFFFFFFEFEFFFFFFFEFFFFFFFFFFFFFEFEFFFFFFFEFEFFFFFFFEFFFEFEFEFFFFFEFEFFFFFFFEH#9#B"J$@&8&J#A$G&:#@"9"8&J#8$G&:#H$J&9"<$
+FEFFFEFFFE:FEFEFEFFFEFEFEFFFEFEFEFEFE@FEFFFEFEFEFFFEFEFEFFFEFFFFFFFFFFFEFEFEO$FEFFFEFEFEFFFEFEFEFFFEFFFEFEFE8FFFFFEFEFEFFFEFEFEH#J%@%8PJ%G%C"A#J#8%G%J%J#A%
+FFFELFFFFFFFFFFFFFFFEMFFFFFFFFFFFFFFFEFEFFFFO%FFFEFFFFFFFFFFFFFFFE7FEFFFFFF:FFFFFFFFFFFFH#8#A&J"=$J#E"F"=#C":"J#;"F"=#J"G"
+FEFFFEFFFFFEFFFEFF;FEFEFFFEJFEFFFEFEFEFFFEFEO(FEFFFEFEFEFFO FEFEH#>&?&8,9&9,?&9";-?/;(8&?&9$:%J+;(8&>'8&848%:38.
+FFFEFEFEFEFEFEFEFEFEFEFEFFFEFEFEFFFEFFFFFEFEFEFFFEFEFEFFFFFEFEFEFFFFFFFEFEFEFFFEFEFEFEFEFEFFFEFEFEFFFFFEFFFEFEFEFFFFFEFEFEFFFEFFFFFEFEFEFFFFFEFEFFFFFEFEFEFFFFFEFEFEFFFFFEFEFEFFFFFEFFFEFEFEFFO$FFFEFFFFFEFEFEFFFFFEFEFFFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFFFEFEFEFEFEFFFEFEFEFFFEFFFEFEFEFEFEFEFFFFFEFEFEFFFFFEFEFEFEFEFEFFFFFEFEFEFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFEFFFEFEFEFEFEFEH&;P9$9P9P8$:$;$9$@P9"<$8P9#<P8$8R8$:$9#<$;":%J#8$8R8$:$9#:P9P9W8$:$9%8R8$9X
+FEFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFO%FEFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFH%J"J"J#J"
+FFFEFFFFP%FFIFFO=FFFE=FFH#J%J#J%
+FEFFEFEFEFEFFQFFEFFO:FEFEFEFFH#J$J#J$
+FFFEEFFFFFFQGFFFEO:FFFFFFH#J#
+FEFFRAFEFFH#J#
+FFFERAFFFEH#J#
+FEFFRAFEFFH#J#J"J"A$=#
+FFFERAFFFEBFEMFEFEFEFEFEFEH#J#J)@"H':"A#>"
+FEFFRAFEFFAFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFH#J#J&J&
+FFFERAFFFECFFFEFFFFFF>FFFEFFFFFFH#J#8$8&:$:$<#:*9&8.9":$;$A$
+FEFFRAFEFFFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFFFEFFFFFFFEFFFEFEFEFEFEFEFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEH#J08&8&@":'8&8#P'8"8"8#;&?%
+FFFERAFFFEFFFEFFFFFFFEFFFFFEFFFEFFFEFEFFFFFFFEFEFFFFFFFEFEFFFEFEFFFFFEFFFEFFFFFFFFFEFEFFFFFFFEFFFEFFFFFFFEFFFFFFFEFEFFFFFFH#J#8$G&:#:"<"J"C$
+FEFFRAFEFFFEFEFEFFFEFEFEFFFEFFFFFF;FFFEFEFEH#J#8%G%A"J&:"B%
+FFFERAFFFEFFFFFFFFFFFFFFFEFF9FFFEFFFEFFFFFFFFFFFFH#J#;"F"=#>"D"@"J"
+FEFFRAFEFFFEFEFEFFFEFEFE6FEH#J+;(8&>&8$9"8+:$8%:&8&8.
+FFFERAFFFEFFFFFEFEFEFFFFFEFEFFFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFEFEFEFEFFFEFEFEFFFFFEFEFEFEFFFEFFFEFEFEFEFEFEFEFEFEFFFEFEFEFFFEFEFEFEFEFEFFFFFEFEFEFFFEH#J#8$8R8$:$9#:U8#9$8%?%:P9$9Q8P
+FEFFRAFEFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFH#J#J"
+FFFERAFFFE=FFH#J#J$
+FEFFRAFEFFO2FEFEFFH#J#J#
+FFFERAFFFEO2FFFFH#J#
+FEFFRAFEFFH#J#
+FFFERAFFFEH#J#
+FEFFRAFEFFH#J#J"@":$J$J"
+FFFERAFFFEBFEFEFEFEFE9FEFEFE;FEH#J#J):":#C%?#J"="G&
+FEFFRAFEFFAFEFFFEFEFEFEFEFEFFFFFFFEFEFEFEFFFF4FEFFFEFEFEFEFEH#J#J&J%J'
+FFFERAFFFECFFFEFFFFFF8FEFFFFFFO,FFFEFFFFFFFEH#J#8$8&:$:$<#:":$B$="9$A$:$9&8$;$8&A$8(
+FEFFRAFEFFFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFFFEFEFEH#J08&8&@"8"8#B&9#:&?&8&8&8#;-9%8)9#
+FFFERAFFFEFFFEFFFFFFFEFFFFFEFFFEFFFEFEFFFFFFFEFEFFFFFFFEFEFFFFFFFEFFFFFFFEFEFEFEFFFFFFFEFEFFFFFFFEFEFFFFFFFEFFFEFFFFFFFFFFFEFFFFFFFEFFFFFEFEFFFFFEFEFEFEFFFEFFFFFFFEFFFFFFFFFFH#J#8$G&:#:"J$9&9$A$="J"<%@$
+FEFFRAFEFFFEFEFEFFFEFEFEFFFEFFFF4FEFEFEFFFFFEFEFEFEFEFEFEFEFEFF8FFFFFFFFFEFFFEFFH#J#8%G%A"I%:#:%@%J$
+FFFERAFFFEFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFO&FEFFFEH#J#;"F"=#J"8"@"C"<"="J&
+FEFFRAFEFFFEFEFEFF=FEFEFEFEFEFEDFEFFFFFFFEH#J+;(8&>%:&8-9%8&8-8&9,8*9(8(;"
+FFFERAFFFEFFFFFEFEFEFFFFFEFEFFFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFEFEFEFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFEFFFFFEFEFEFFFFFEFEFEFFFFFEFEFEFFFFFEFEFEFEFEFFFEFEFEFFFFFEFEFEFEFEFEFEFEFEFFFFFEFEFEFFFFFEFEH#J#8$8R8$:$9#:%:P8Q8$9%:$9Q8$:$;$8P9$8$8R:$8#9#
+FEFFRAFEFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFH#J#J"
+FFFERAFFFE=FFH#J#
+FEFFRAFEFFH#J#Jv
+FFFERAFFFER&E4H#J#J"
+FEFFRAFEFFR%E4H#J5Az
+FFFERAQIFFFEDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDEFFDE/DEH#J#z"
+FEFFRAFEFFQFDEFEH#J#J"@":$J$J"J"A$J"
+FFFERAFFFEBFEFEFEFEFE9FEFEFE;FE;FEFEFEFE9DEH#J#J):":#C%?#J"="G&;"A#J"
+FEFFRAFEFFAFEDEFEFEFEFEFEFEDEDEDEFEFEFEFEDEDE4FEDEFEFEFEFEFEDEDEDE:FEH#J#J&J%J'J"
+FFFERAFFFECDEFEDEDEDE8FEDEDEDEO,DEFEDEDEDEFELDEH#J#8$8&:$:$<#:":$B$="9$A$:$9&8$;$8&@$:%A$:&>"
+FEFFRAFEFFFEFEFEFEFEFEDEFEFEFEFEFEFEFEFEDEFEFEFEFEFEFEFEDEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEDEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEDEFEFEH#J08&8&@"8"8#B&9#:&?&8&8&8#;-?#;&?&8'>"
+FFFERAFFFEDEFEDEDEDEFEDEDEFEDEFEDEFEFEDEDEDEFEFEDEDEDEFEFEDEDEDEFEDEDEDEFEFEFEFEDEDEDEFEFEDEDEDEFEFEDEDEDEFEDEFEDEDEDEDEDEFEDEDEDEFEDEDEFEFEDEDEFEDEDEDEDEDEDEFEFEDEDEDEFEFEDEDEDEFEDEDEH#J#8$G&:#:"J$9&9$A$="J"J$J"
+FEFFRAFEFFFEFEFEDEFEFEFEDEFEDEDE4FEFEFEDEDEFEFEFEFEFEFEFEFEFEDE8DE4FEFEFE?FEH#J#8%G%A"I%:#:%@%J%J"
+FFFERAFFFEDEDEDEDEDEDEDEFEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEO%FEDEDEDE?DEH#J#;"F"=#J"8"@"C"<"="J"
+FEFFRAFEFFFEFEFEDE=FEFEFEFEFEFEO9FEH#J+;(8&>%:&8-9%8&8-8&9,8*9(8&848%@"
+FFFERAFFFEDEDEFEFEFEDEDEFEFEDEDEFEFEFEDEDEFEFEFEDEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEDEDEFEFEFEDEFEFEFEDEDEFEFEFEDEFEFEFEFEFEFEDEDEFEFEFEDEDEFEFEFEDEDEFEFEFEDEDEFEFEFEFEFEDEFEFEFEDEDEFEFEFEFEFEFEFEFEFEDEFEFEFEFEFEDEFEFEFEDEFEDEFEFEFEFEFEFEDEDEFEFEFEDEDEFEFEFEDEH#J#8$8r8$:$9#:%:&8'8$9%:$9'8$:$;$8&9$8$8r9&9w8$:$@"
+FEFFRAFEFFDEDEDEDEDEDEDEDEDEDEFEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEFEH#J#J"J"
+FFFERAFFFE=DEQ(DEH#J#J%?"
+FEFFRAFEFFQ9FEFEFEDEFEH#J#J$@"
+FFFERAFFFEQ9DEDEDEDEH#J5
+FEFFRAQIFEFFFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEDEFEH#J#Z
+FFFERAFFFEQGH#J#
+FEFFRAFEFFH#J#J"D#C$D#A"=#
+FFFERAFFFEBFEFEFEFEFEFEFEFEFEFEFEH#J#J&A"D#E"8(9"="H"
+FEFFRAFEFFAFEFFFEFEFEFFFFFFFFFEFEFEFFFEFEFEFFFFFEH#J#J$J(
+FFFERAFFFECFFFEFFO FFFEFFFFFFFEFFH#J#8$8&:$:$<#?%:$:$A$:$;":$;$:&8$9&
+FEFFRAFEFFFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEH#J08&8&F&9%8&?&8%@#;%9-8&
+FFFERAFFFEFFFEFFFFFFFEFFFFFEFFFEFFFEFEFFFFFFFEFEFFFFFFFEFFFFFFFFFEFFFFFFFEFEFFFFFFFEFEFFFFFFFEFEFFFFFFFFFFFEFFFFFFFEFFFFFFFEFFFFFEFFFFFFFEFFFEFFFFFFH#J#8$G&:#A$A$A$J$
+FEFFRAFEFFFEFEFEFFFEFEFEFFFEFFFEFEFEFEFEFEFEFEFEGFEFEFEH#J#8%G%C"8%A%@%@$J%
+FFFERAFFFEFFFFFFFFFFFFFFFEFEFEFFFFFFFFFFFFFFFFFFFFFFFEFFFE9FFFFFFFFH#J#;"F"=#J"C"?"9"J"="
+FEFFRAFEFFFEFEFEFF=FEFEFFFF;FEFEH#J+;(8&>&9-8&8-8'>&8,9&9&
+FFFERAFFFEFFFFFEFEFEFFFFFEFEFFFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFFFEFEFEFFFEFEFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFEFFFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFEFFFEFEFEFFFEFFFFFEFEFEFFFEFEFEFFFFFEFEFEFFH#J#8$8R8$:$9#:Q9U:$9Q8$:P8$9P9P8$:$;$
+FEFFRAFEFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFH#J#J"
+FFFERAFFFE=FFH#J#J%
+FEFFRAFEFFP/FEFEFEFFH#J#J$
+FFFERAFFFEP/FFFFFFH#J#
+FEFFRAFEFFH#J#
+FFFERAFFFEH#J#
+FEFFRAFEFFH#J#J"J"A$
+FFFERAFFFEBFEO-FEFEFEFEH#J#J%9#J&;"A#
+FEFFRAFEFFAFEFFFEFEFEFEJFEFEFEFEFEFFFFFFH#J#J(J'
+FFFERAFFFECFFFEFEFFFEFEFFJFFFEFFFFFFFEH#J#8$8&:$:$<#@$:$:$9%:&8$@$:%A$:&
+FEFFRAFEFFFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFEH#J08&8&@$9&8&8&8&8-?#;&?&8'
+FFFERAFFFEFFFEFFFFFFFEFFFFFEFFFEFFFEFEFFFFFFFEFEFFFFFFFEFFFEFFFEFFFFFFFEFEFFFFFFFEFEFFFFFFFEFFFFFFFFFEFEFFFFFFFEFFFFFEFFFFFFFEFFFFFFFFFFFFFEFEFFFFFFFEFEFFFFFFFEFFH#J#8$G&:#A$9&8&9$A$H$
+FEFFRAFEFFFEFEFEFFFEFEFEFFFEFFFEFEFEFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFEFEFEFEH#J#8%G%G%9%9%8%A%F%
+FFFERAFFFEFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFEFFFFFFFEFEFFFFFFFFFFFFFFFEFFFFFFH#J#;"F"=#<">"8"<"J"
+FEFFRAFEFFFEFEFEFFFFFEFEFE8FEH#J+;(8&>.8&8&8,9-8&848%
+FFFERAFFFEFFFFFEFEFEFFFFFEFEFFFFFEFEFEFFFFFEFEFEFFFEFEFEFFFEFEFEFFFFFEFEFEFFFFFEFEFEFFFFFEFEFEFFFFFEFEFEFFFEFFFFFEFEFEFFFEFEFEFFFFFEFEFEFEFEFFFEFEFEFEFEFFFEFEFEFFFEFFFEFEFEFEFEFEFFFFFEFEFEFFFFFEFEFEH#J#8$8R8$:$9#:R8$:$:$:P8$:$8P9P9W8$:$
+FEFFRAFEFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFH#J#J"
+FFFERAFFFE=FFH#J#J%J%
+FEFFRAFEFFO:FEFEFEFFMFEFEFEFFH#J#J$J$
+FFFERAFFFEO:FFFFFFO FFFFFFH#J#
+FEFFRAFEFFH#J#
+FFFERAFFFEH#J#
+FEFFRAFEFFH#J#J"J"
+FFFERAFFFEBFE8FEH#J#J#8$A"="G#9#
+FEFFRAFEFFAFEFFFEFEFEFEFFFEFEFEFEH#J#J&J(
+FFFERAFFFEDFEFFFFFFFEDFFFEFEFFFEFEFFH#J#8$8&:$:$<#>&9&8$;$8&A$8&8#8#
+FEFFRAFEFFFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFFFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEH#J08&8&E'8&8#;-9$9/9"
+FFFERAFFFEFFFEFFFFFFFEFFFFFEFFFEFFFEFEFFFFFFFEFEFFFFFFFEFFFEFFFFFFFEFFFEFFFFFFFFFFFEFFFFFFFEFFFFFEFEFFFFFEFFFEFFFEFFFFFFFEFFFFFEFEFFFFFEFFFFFFH#J#8$G&:#J"C$:"
+FEFFRAFEFFFEFEFEFFFEFEFEFFFEFFGFFFEFEFEFFH#J#8%G%J%
+FFFERAFFFEFFFFFFFFFFFFFFFEO-FFFFFFFFH#J#;"F"=#J"J">"
+FEFFRAFEFFFEFEFEFF7FE8FFFEH#J+;(8&?&9%9,8*939)
+FFFERAFFFEFFFFFEFEFEFFFFFEFEFFFFFEFEFEFFFFFEFEFEFFFFFEFEFEFFFEFEFEFFFFFEFEFEFFFFFEFEFEFEFEFFFEFEFEFFFFFEFEFEFEFEFEFEFFFEFEFEFFFFFEFEFEFFFFFEFEFEFEFFFFFEFEFEFFFEH#J#8$8R8$:$9#<$:$;$8P9$8$8T8$8$8#8P
+FEFFRAFEFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFH#J#J"
+FFFERAFFFE=FFH#J#J$
+FEFFRAFEFFJFEFEFEH#JvF#J$
+FFFER&E4FFFEJFFFFFFH#J"J#
+FEFFR%E4;FEFFH#JzD#
+FFFER$/DEFFFEH#JZD#JZ
+FEFFR$/FEFFR$/H#J"C"D#J"J#A"D#J"C"
+FFFER$DEE4FFFEBFE@FEFEFEFEFEOMDEE4H#Jt$D#J(J"8(9"D"Jt$
+FEFFR'E5E4E4DEFEFFAFEFFFEFEFEFEFE;FFFEFEFEFFFEFEFEFFFFP#E5E4E4DEH#J$J#J'J(J$
+FFFER%DEFFFF9FFFECFFFEFFFFFEFE=FFFEFFFFFFFEFFP4DEFFFFH#J$E#8$8&:$:$<#;"9%8&:$:$;":$9&:$:$8(J$
+FEFFR/E4E4DEFEFFFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFFFFFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFEFFFEFEFEOIE4E4DEH#J$J08&8&B"9-8&8%@#:'8%9.J$
+FFFER&DEFFFF8FFFEFFFEFFFFFFFEFFFFFEFFFEFFFEFEFFFFFFFEFEFFFFFFFEFEFFFFFFFFFEFFFFFEFEFFFFFEFEFFFFFFFEFEFFFFFFFFFFFFFEFEFFFFFEFEFFFFFFFEFFFFFFFEFFFFFEFFFFFFFEFFO@DEFFFFH#J$F#8$G&:#:%9$:"<$J"J"J$
+FEFFR.E4E4DEFEFFFEFEFEFFFEFEFEFFFEFFFEFEFEFFFEFEFEFFFEFEFE9FF5FEOKE4E4DEH#J$J#8%G%@$9%A%@$J$
+FFFER'DEFFFF7FFFEFFFFFFFFFFFFFFFEFFFFFFFEFFFFFFFFFFFFFFFEFFFEP8DEFFFFH#J$G#;"F"=#J"?"9"J&J$
+FEFFR-E4E4DEFEFFFEFEFEFF=FEFFFF>FFFEFFFEFFOHE4E4DEH#J$J+;(8&>%:*9(8'>*9/J$
+FFFER(DEFFFF6FFFEFFFFFEFEFEFFFFFEFEFFFFFEFEFEFFFFFEFEFEFFFEFEFEFEFFFEFEFEFFFEFEFEFEFEFFFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFEFFFEFEFEFEFFFFFEFEFEFFFEFFFFFEFEFEFFOJDEFFFFH#J$H#8$8R8$:$9#:%;S8#8$:P8$9T8#8P8$:$J$
+FEFFR,E4E4DEFEFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFOHE4E4DEH#J$J#J"J$
+FFFER)DEFFE45FFFE=FFQ9DEFFE4H#J"I#J"
+FEFFR-DEFEFFR-DEH#J"J#J"
+FFFER*DE6FFFER*DEH#J"J#J"
+FEFFR,DE4FEFFR,DEH#JZD#JZ
+FFFER$/FFFER$/H#J"J#J"
+FEFFR#FF=FEFFR#FFHz=zBz=z
+QKE53E5QKE53E5
+
+
+
+
+
+HzJz
+QKE4FQKE4J"J"
+R.FFRBFFJy"zZ$x"Jy"zZ$x"
+4DEFFP DEO(DEFFFFDEFFIDEFFP+DEKDEFFFFDEFFJ$J"9#J$J"9#
+@FFFFE4Q'E4FFFFO3FFFFE4Q'E4FFFFJ%Jz"<#J%Jz"<#
+>FFFFFFE4P#O$E5E4FFFFO/FFFFFFE4P.GE5E4FFFFJ#8"J#8#J#8"J#8#
+<FFFFE5Q-E5E5FFFFO+FFFFE5Q-E5E5FFFFJ#8#J#8#J#8#J#8#
+:FFFFE5E5Q0E5E5FFFFO'FFFFE5E5Q0E5E5FFFFJ#8#J#8#J#8#J#8#
+8FFFFE5E5Q4E5E5FFFFO#FFFFE5E5Q4E5E5FFFFJ#8#J#8#J#8#J#8#
+6FFFFE5E5Q8E5E5FFFFMFFFFE5E5Q8E5E5FFFFJ'J&J'J&
+4E4E4E4E4E5E5Q<E5E4E4E4E4JE4E4E4E4E5E5Q<E5E4E4E4E4J#8#J"9"J#8#J"9"
+4DEDEE4E4Q<E4DEJDEDEE4E4Q<E4DEJ#8#J#8#J#8#J#8#
+6DEDEE4E4Q8E4E4DEDEMDEDEE4E4Q8E4E4DEDEJ#8#J#8#J#8#J#8#
+8DEDEE4E4Q4E4E4DEDEO#DEDEE4E4Q4E4E4DEDEJ#8#J#8#J#8#J#8#
+:DEDEE4E4Q0E4E4DEDEO'DEDEE4E4Q0E4E4DEDEJ#8"J#8#J#8"J#8#
+<DEDEE4Q-E4E4DEDEO+DEDEE4Q-E4E4DEDEJ#Jz=#J#Jz=#
+>DEDEP%O$E4DEDEO/DEDEP0GE4DEDEJ#J"J$J#J"J$
+@DEDEP"E4O(E4DEDEO3DEDEP-E4KE4DEDEJZJZ
+4QGJQGI"J"
+FFRBFFHzJz
+QKE5FQKE5
+
+
+
+
+
+
+
+
+
+
+
+
+J&?#F#8#
+5FEFEFEFEFEFEFEFEFEFEFEJ(J#
+4FEFEE5E5E5FEFE>E5E5J%<%9%8"8%8%8&
+=FEFEFEFEFEFEFEFEFEFEFEFEFEFEE5FEFEFEFEFEFEFEFEE5FEFEJ/:08":'9%
+4E5FEFEFEE5E5E5E5FEFEE5E5FEFEFEFEE5E5FEFEE5FEFEE5E5FEFEE5E5E5FEFEE5E5FEFEFEE5FEFEJ&J#H"
+5E5E5FEFEFE7E5E5E5J"8"9#>#
+7E5FEFEFEFEFEJ#8";%<%
+4FEFEE5E5E5E5E5E5E5E5E5J#>#;#;"
+@FEFEFEFEFEFEFEJ/:.8%9'
+4E5FEFEFEFEFEE5E5E5FEFEFEFEE5E5FEFEFEFEE5E5E5FEFEFEFEE5E5FEFEE5E5FEFEFEFEE5J&9%8#8%9%:&8%8#8#
+5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5
+
+
+
+
+
+
+Fz
+W/FE
+H5
+W+FFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFH5
+W*FEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFH#Z
+FFFEW'H#J#
+FEFFVMFEFEH#?$<$J"J"J"9"C"=#J"B$8#A":#J"@":$J$J"J"A$
+FFFEFEFEFEFEFEFECFEBFEO"FEFEFEFEFEGFEFEFEFEFEFEFEFEFECFEFEFEFEFE9FEFEFE;FE;FEFEFEFEH#?#<%G"F#J#J#9"C"="H"I#B(A#:"J):":#C%?#J"="G&;"A#
+FEFFFFFFFEFFFFFFFEFEFFAFEFFO!FEFFFFFFFFFEFEFEFEFFFFFFFEFFFFFEFFFFCFEFFFEFEFEFEFEFEFFFFFFFEFEFEFEFFFF4FEFFFEFEFEFEFEFFFFFFH#J#J&J%J'
+FFFER5FFFFO<FFFEFFFFFF8FEFFFFFFO,FFFEFFFFFFFEH&8#?&9$9&8&9$<):$9&9$<#9$:$8&8&:$8&<#8$9,;$:&8$9&9$J$<#9$:$8&:$:$<#:":$B$="9$A$:$9&8$;$8&@$:%A$:$
+FEFFFFFEFEFEFEFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFEFFFFFEFEFEFFFEFEFEFEFEFFFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFFFEFEFEFEFFFEFEFEFEFEFFFEFEFEFEFFFEFEFEFEFEFEFFFEFEFEFFFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFE@FEFEFEFEFFFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEH%9"@&8&8&8&8&>'8&8&8&?&848-?#:+;%9-8&8&J%?%9-8&8&@"8"8#B&9#:&?&8&8&8#;-?#;&?&8&
+FFFEFFFFFFFFFEFFFFFFFEFFFFFFFEFFFEFFFFFFFFFEFFFFFFFEFFFFFFFEFFFEFFFEFFFEFEFFFFFFFEFFFEFFFFFFFEFFFFFFFEFEFFFFFFFEFEFFFFFFFEFFFFFEFFFEFFFEFFFFFEFFFEFFFEFEFFFFFFFEFFFFFEFEFFFFFEFFFFFFFEFFFFFFFEFFFFFFFFFEFFFFFFFEFFFFFFFEFFFFFEFFFFFFFEFFFEFFFFFFFEFFFFFFFE?FFFFFFFEFEFFFFFFFEFFFFFFFEFFFFFEFFFEFFFEFEFFFFFFFEFEFFFFFFFEFEFFFFFFFEFFFFFFFEFEFEFEFFFFFFFEFEFFFFFFFEFEFFFFFFFEFFFEFFFFFFFFFFFEFFFFFFFEFFFFFEFEFFFFFEFFFFFFFFFFFFFEFEFFFFFFFEFEFFFFFFFEH#J$G&:#A$D":#="J"=#B"J$@&8&J#A$G&:#:"J$9&9$A$="J"J$
+FEFF8FEFEFEFFFEFEFEFFFEFFFEFEFEFFFEFFFF?FFFEFFFE:FEFEFEFFFEFEFEFFFEFEFEFEFE@FEFFFEFEFEFFFEFEFEFFFEFFFF4FEFEFEFFFFFEFEFEFEFEFEFEFEFEFF8FF4FEFEFEH#J%G%G%J%@%8PJ%G%A"I%:#:%@%J%
+FFFE8FFFFFFFFFFFFFFFEFFFFFFFFP0FFFFFFFFFFFFFFFEMFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFO%FEFFFFFFH#J"D$=#E"C"9#>"J#A&J"=$J#E"F"=#J"8"@"C"<"="
+FEFF;FEFEFFFEFEFFFEFEFEFFFEFFEFFFFFEFFFEFF;FEFEFFFEJFEFFFEFEFEFF=FEFEFEFEFEFEH#839&8%:,>";(8%9&?&8(;#;,9">&?&8,9&9,?&9";-?/;(8&>%:&8-9%8&8-8&9,8*9(8&848%
+FFFEFFFEFEFEFFFEFFFEFEFEFEFEFEFFFEFEFEFEFFFEFEFEFFFEFEFEFEFFFEFEFEFFFFFFFEFEFEFFFEFEFFFFFEFEFEFFFEFEFEFEFFFEFEFEFFFFFEFEFEFFFFFEFEFEFFFFFEFEFEFEFFFFFEFEFEFFFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFEFEFEFFFEFFFFFEFEFEFFFEFEFEFFFFFEFEFEFFFFFFFEFEFEFFFEFEFEFEFEFEFFFEFEFEFFFFFEFFFEFEFEFFFFFEFEFEFFFEFFFFFEFEFEFFFFFEFEFFFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFEFEFEFFFEFEFEFFFFFEFEFEFFFEFEFEFEFEFEFFFFFEFEFEFFFFFEFEFEFFFFFEFEFEFFFFFEFEFEFEFEFFFEFEFEFFFFFEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFFFEFEFEFFFEFFFEFEFEFEFEFEFFFFFEFEFEFFFFFEFEFEH#9Z:$9%;$9$9#:R8$9%:$9#<$:$8Y8$8$8&;P9$9P9P8$:$;$9$@P9"<$8P9#<P8$8R8$:$9#:%:P8Q8$9%:$9Q8$:$;$8P9$8$8R9P9W8$:$
+FEFF1FFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFH#J"J"J"J"J"
+FFFEO%FFBFFO"FFP%FFIFFH#J%J%
+FEFFQAFEFEFEFFS$FEFEFEFFH#J$JQ
+FFFEQAFFFFFFS%H#
+FEFFH"
+FFHz
+W+FE
+Fz
+W/E5
+
+
+
+
+
+
+
+
+<z
+WDE4=z"
+WBE5FF=Z
+WB<z
+WDE5
+
+
+
+
+
+
+
+Jz
+AOAE4J"
+P3FFJz"
+CO=E5FF
+
+
+JZJZJZJZ
+GO5FO5FO5FO5J"J"J"J"
+P-E4P,E4P,E4P,E4Jz"Jz"Jz"Jz"
+IO1E5E4IO1E5E4IO1E5E4IO1E5E4
+
+
+
+
+J%:#9#Js$8#J%J#J#9#>#
+O3FEFEFEFEFEFEFEFEODFEE5FEFEFEFEOJFEFEFEFE=FEFEO<FEFEFEFEFEFEJ'=$J'J'
+O2FEFEE5E5FEFEFEFEE5OFE5E5E5E5E5E5P"FEFEE5E5FEFEJ$8$;$J#:"8"8%8&J$8(8&9%9%J%;&
+O1FEFEE5E5FEFEFEFEE5OKFEFEFEFEFEFEFEFEFEFEE5FEFEO:FEFEE5E5E5E5FEFEFEFEFEFEE5FEFEFEFEFEFEFEFEFEFEOIFEFEFEFEFEFEE5FEFEJ$J"8)9"J'93J'<%
+O=FEFEE5P$E5E5E5FEFEE5E5FEFEFEOCFEFEE5E5FEFEFEE5FEFEE5FEFEE5E5FEFEE5FEFEE5E5FEFEOGFEFEE5E5FEFEFEE5FEFEJ$J#J#=">#J$E"
+Q:FEFEFE6E5E5OAE5E5E5E5E5OHFEFEFEE5J$J$D#;"J$I#J$;#
+O=E5FEFEOHE5E5E5FEFEE5ODFEFEFEFEFEOCE5E5E5FEFEJ$J%J%I%J%
+O>E5FEFEP*E5E5E5E5OGFEFEE5E5E5E5E5E5OIE5E5E5E5J$8$<$J":#J$8#H#;#J#<"
+O1E5FEFEFEFEE5E5FEFEP&FEFEFEO@E5FEFEFEFEFEFEFEFEOKFEFEFEJ'>$J+J.=.J'<%
+O2E5FEFEFEFEE5E5FEFEP"E5FEFEE5E5FEFEFEFEE5OAE5FEFEFEFEE5E5FEFEFEE5FEFEE5FEFEFEFEE5E5E5FEFEFEFEE5OGE5FEFEFEFEE5E5FEFEE5J%:#:#J#:&9#8%8#J%8s8#8%9%8#J#9#8%8#:#
+O3E5E5E5E5E5E5E5E5OCE5E5E5E5E5E5E5E5E5E5E5E5E5E5E5O?E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5O<E5E5E5E5E5E5E5E5E5E5E5E5
+
+J#
+V8E5E5
+
+
+
+&J%
+F7F7F7F7F7WEF7F7F7F7&JzJzJzJzJ&
+F6F6F6F6F6DO1E4JO1E4JO1E4JO1E4EF6F6F6F6F68$J"J"J"J"J%
+F9F9F9CE4P,E4P,E4P,E4P)F9F9F9F7JzJzJzJz
+GO5E5FO5E5FO5E5FO5E5
+
+
+JZ
+CO=J"
+BFFJz
+AOAE5
+
+
+
+
+
+
+
+<z"z"z
+0F6F7W!F6F71F6;z8z8z
+1F9W F91F9
+
+7z8z8z
+5F7W F74F7"J"J"
+F76F7W!F7
+ENDBITMAP
+%%EndBinary
+369 447 495 465 R
+7 X
+V
+4 8 Q
+0 X
+(f) 369 459.67 T
+(ileselectiondialog .fsd) 373.8 459.67 T
+(.fsd activate) 369 449.67 T
+0 10 Q
+(FIGURE 34) 359.58 420.1 T
+1 F
+( - Fileselectiondialog) 410.98 420.1 T
+0 0 612 792 C
+FMENDPAGE
+%%EndPage: "17" 17
+%%Trailer
+%%BoundingBox: 0 0 612 792
+%%PageOrder: Ascend
+%%Pages: 17
+%%DocumentFonts: Times-Bold
+%%+ Times-Roman
+%%+ Times-BoldItalic
+%%+ Times-Italic
+%%+ Courier
+%%+ Courier-Bold
+%%EOF
diff --git a/iwidgets/doc/labeledframe.n b/iwidgets/doc/labeledframe.n
new file mode 100644
index 00000000000..d4426c4e7ad
--- /dev/null
+++ b/iwidgets/doc/labeledframe.n
@@ -0,0 +1,195 @@
+'\"
+'\" Copyright (c) 1997 DSC Technologies Corporation
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) labeledframe.n 1.21 97/1/30 16:04:44
+'\"
+.so man.macros
+.HS iwidgets::labeledframe iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+iwidgets::labeledframe \- Create and manipulate a labeled frame widget
+.SH SYNOPSIS
+\fBiwidgets::labeledframe\fI \fIpathName \fR?\fIoptions\fR?
+.SH "INHERITANCE"
+itk::Archetype <- iwidgets::Labeledframe
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBbackground\fR \fBborderwidth\fR \fBcursor\fR
+\fBforeground\fR \fBrelief\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "WIDGET-SPECIFIC OPTIONS"
+.LP
+.nf
+Name: \fBiPadX\fR
+Class: \fBIPad\fR
+Command-Line Switch: \fB-ipadx\fR
+.fi
+.IP
+Specifies horizontal padding space between the border and the childsite.
+The value may have any of the forms acceptable to \fBTk_GetPixels\fR.
+The default is 0.
+.LP
+.nf
+Name: \fBiPadY\fR
+Class: \fBIPad\fR
+Command-Line Switch: \fB-ipady\fR
+.fi
+.IP
+Specifies vertical padding space between the border and the childsite.
+The value may have any of the forms acceptable to \fBTk_GetPixels\fR.
+The default is 0.
+.LP
+.nf
+Name: \fBlabelBitmap\fR
+Class: \fBBitmap\fR
+Command-Line Switch: \fB-labelbitmap\fR
+.fi
+.IP
+Specifies a bitmap to display in the label, in any of the forms
+acceptable to \fBTk_GetBitmap\fR. This option overrides the \fIlabeltext\fR
+option.
+.LP
+.nf
+Name: \fBlabelImage\fR
+Class: \fBImage\fR
+Command-Line Switch: \fB-labelimage\fR
+.fi
+.IP
+Specifies a image to be used as the label. The image may be any of the
+values created by the \fBimage create\fR command. This option overrides
+both the \fIlabelbitmap\fR and \fIlabeletext\fR options.
+.LP
+.nf
+Name: \fBlabelMargin\fR
+Class: \fBMargin\fR
+Command-Line Switch: \fB-labelmargin\fR
+.fi
+.IP
+Specifies the distance between the inner ede of the hull frames relief,
+and the label in any of the forms acceptable to \fBTk_GetPixels\fR.
+The default is 10 pixels.
+.LP
+.nf
+Name: \fBlabelText\fR
+Class: \fBText\fR
+Command-Line Switch: \fB-labeltext\fR
+.fi
+.IP
+Specifies the text of the label around the childsite.
+.LP
+.nf
+Name: \fBlabelVariable\fR
+Class: \fBVariable\fR
+Command-Line Switch: \fB-labelvariable\fR
+.fi
+.IP
+Specifies the text variable of the label around the childsite.
+.LP
+.nf
+Name: \fBlabelFont\fR
+Class: \fBFont\fR
+Command-Line Switch: \fB-labelfont\fR
+.fi
+.IP
+Specifies the font of the label around the childsite.
+.LP
+.nf
+Name: \fBlabelPos\fR
+Class: \fBPosition\fR
+Command-Line Switch: \fB-labelpos\fR
+.fi
+.IP
+Specifies the position of the label within the grooved relief of the hull widget.
+\fB ne, n, nw, se, s, sw, en, e, es, wn, w, ws\fR Default is \fBn\fR.
+.LP
+.BE
+
+.SH DESCRIPTION
+.PP
+The \fBiwidgets::labeledframe\fR command creates a hull frame with a
+grooved relief, a label positioned within the grooved relief of
+the hull frame, and a frame childsite. The frame childsite can filled with any
+widget via a derived class or though the use of the childsite method.
+This class was designed to be a general purpose base class for supporting the
+combination of labeled frame and a childsite. The options include the
+ability to position the label at configurable locations within the
+grooved relief of the hull frame, and control the display of the label.
+.SH "METHODS"
+.PP
+The \fBiwidgets::labeledframe\fR command creates a new Tcl command whose
+name is \fIpathName\fR. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIOption\fR and the \fIarg\fRs
+determine the exact behavior of the command. The following
+commands are possible for labeledframe widgets:
+.SH "WIDGET-SPECIFIC METHODS"
+.TP
+\fIpathName \fBchildsite\fR
+Return the path name of the child site.
+.TP
+\fIpathName \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given
+by \fIoption\fR.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::labeledframe\fR
+command.
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR?
+Query or modify the configuration options of the widget.
+If no \fIoption\fR is specified, returns a list describing all of
+the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for
+information on the format of this list). If \fIoption\fR is specified
+with no \fIvalue\fR, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no \fIoption\fR is specified). If
+one or more \fIoption\-value\fR pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::labeledframe\fR
+command.
+
+.SH "COMPONENTS"
+.LP
+.nf
+Name: \fBlabel\fR
+Class: \fBlabel\fR
+.fi
+.IP
+The label component provides the label for the labeled widget. See the
+"label" widget manual entry for details on the label component item.
+.fi
+.LP
+
+.SH EXAMPLE
+.IP
+The labeledframe was primarily meant to be a base class. The
+Radiobox is a good example of a derived classe of the labeledframe class.
+In order to provide equal support for composite classes, the 'childsite' methods
+also exists. The following is an example of 'childsite' method usage.
+.LP
+.DS
+ package require Iwidgets 4.0
+ iwidgets::labeledframe .lw -labeltext "Entry Frame" -labelpos n
+ pack .lw -fill both -expand yes -padx 10 -pady 10
+ set cs [.lw childsite]
+
+ pack [iwidgets::entryfield $cs.entry1 -labeltext "Name:"] -side top -fill x
+ pack [iwidgets::spinint $cs.entry2 -labeltext "Number:"] -side top -fill x
+ pack [iwidgets::pushbutton $cs.entry3 -text "Details:"] -side top -fill x
+
+.DE
+.SH AUTHOR
+John A. Tucker
+.SH KEYWORDS
+labeledframe, widget
diff --git a/iwidgets/doc/labeledwidget.n b/iwidgets/doc/labeledwidget.n
new file mode 100644
index 00000000000..ac40596cb05
--- /dev/null
+++ b/iwidgets/doc/labeledwidget.n
@@ -0,0 +1,217 @@
+'\"
+'\" Copyright (c) 1995 DSC Technologies Corporation
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) labeledwidget.n 1.21 94/12/17 16:04:44
+'\"
+.so man.macros
+.HS iwidgets::labeledwidget iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+iwidgets::labeledwidget \- Create and manipulate a labeled widget
+.SH SYNOPSIS
+\fBiwidgets::labeledwidget\fI \fIpathName \fR?\fIoptions\fR?
+.SH "INHERITANCE"
+itk::Widget <- iwidgets::Labeledwidget
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBbackground\fR \fBcursor\fR \fBforeground\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "WIDGET-SPECIFIC OPTIONS"
+.LP
+.nf
+Name: \fBdisabledForeground\fR
+Class: \fBDisabledForeground\fR
+Command-Line Switch: \fB-disabledforeground\fR
+.fi
+.IP
+Specifies the foreground to be used when the state is disabled.
+.LP
+.nf
+Name: \fBlabelBitmap\fR
+Class: \fBBitmap\fR
+Command-Line Switch: \fB-labelbitmap\fR
+.fi
+.IP
+Specifies a bitmap to display in the widget, in any of the forms
+acceptable to \fBTk_GetBitmap\fR. This option overrides the \fIlabeltext\fR
+option.
+.LP
+.nf
+Name: \fBlabelFont\fR
+Class: \fBFont\fR
+Command-Line Switch: \fB-labelfont\fR
+.fi
+.IP
+Specifies the font to be used for the label.
+.LP
+.nf
+Name: \fBlabelImage\fR
+Class: \fBImage\fR
+Command-Line Switch: \fB-labelimage\fR
+.fi
+.IP
+Specifies a image to be used as the label. The image may be any of the
+values created by the \fBimage create\fR command. This option overrides
+both the \fIlabelbitmap\fR and \fIlabeletext\fR options.
+.LP
+.nf
+Name: \fBlabelMargin\fR
+Class: \fBMargin\fR
+Command-Line Switch: \fB-labelmargin\fR
+.fi
+.IP
+Specifies the distance between the childsite and label in any of the forms
+acceptable to \fBTk_GetPixels\fR. The default is 2 pixel.
+.LP
+.nf
+Name: \fBlabelPos\fR
+Class: \fBPosition\fR
+Command-Line Switch: \fB-labelpos\fR
+.fi
+.IP
+Specifies the position of the label along the side of the childsite:
+\fBnw\fR, \fBn\fR, \fBne\fR, \fBsw\fR, \fBs\fR, \fBse\fR, \fBen\fR, \fBe\fR,
+\fBes\fR, \fBwn\fR, \fBw\fR, or \fBws\fR. The default is w.
+.LP
+.nf
+Name: \fBlabelText\fR
+Class: \fBText\fR
+Command-Line Switch: \fB-labeltext\fR
+.fi
+.IP
+Specifies the text of the label around the childsite.
+.LP
+.nf
+Name: \fBlabelVariable\fR
+Class: \fBVariable\fR
+Command-Line Switch: \fB-labelvariable\fR
+.fi
+.IP
+Specifies the text variable of the label around the childsite.
+.LP
+.nf
+Name: \fBstate\fR
+Class: \fBState\fR
+Command-Line Switch: \fB-state\fR
+.fi
+.IP
+Specifies one of two states for the label: \fBnormal\fR or \fBdisabled\fR.
+If the label is disabled then it is displayed in a disabled foreground
+color. The default is normal.
+.LP
+.nf
+Name: \fBsticky\fR
+Class: \fBSticky\fR
+Command-Line Switch: \fB-sticky\fR
+.fi
+.IP
+Specifies the "sticky-ness" of the childsite. The default value is nsew,
+which is the the same behavior of the labeledwidget before this option was
+added.
+.LP
+.BE
+
+.SH DESCRIPTION
+.PP
+The \fBiwidgets::labeledwidget\fR command creates a labeled widget which contains
+a label and child site. The child site is a frame
+which can filled with any widget via a derived class or though the use
+of the childsite method. This class
+was designed to be a general purpose base class for supporting the
+combination of label widget and a childsite. The options include the
+ability to position the label around the childsite widget, modify the
+font and margin, and control the display of the labels.
+
+.SH "METHODS"
+.PP
+The \fBiwidgets::labeledwidget\fR command creates a new Tcl command whose
+name is \fIpathName\fR. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIOption\fR and the \fIarg\fRs
+determine the exact behavior of the command. The following
+commands are possible for labeledwidget widgets:
+.SH "WIDGET-SPECIFIC METHODS"
+.TP
+\fIpathName \fBchildsite\fR
+Return the path name of the child site.
+.TP
+\fIpathName \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given
+by \fIoption\fR.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::labeledwidget\fR
+command.
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR?
+Query or modify the configuration options of the widget.
+If no \fIoption\fR is specified, returns a list describing all of
+the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for
+information on the format of this list). If \fIoption\fR is specified
+with no \fIvalue\fR, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no \fIoption\fR is specified). If
+one or more \fIoption\-value\fR pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::labeledwidget\fR
+command.
+
+.SH "STATIC METHODS"
+.TP
+\fBiwidgets::Labeledwidget::alignlabels\fR \fIwidget\fR ?\fIwidget ...\fR?
+The alignlabels procedure takes a list of widgets derived from
+the Labeledwidget class and uses the label margin to make each widget
+have the same total space for the combination of label and margin. The
+net effect is to left align the labels. Generally, this method is only
+useful with a label position of w, which is the default.
+
+.SH "COMPONENTS"
+.LP
+.nf
+Name: \fBlabel\fR
+Class: \fBlabel\fR
+.fi
+.IP
+The label component provides the label for the labeled widget. See the
+"label" widget manual entry for details on the label component item.
+.LP
+.nf
+Name: \fBlwchildsite\fR
+Class: \fBframe\fR
+.fi
+.IP
+The lwchildsite component is the user child site for the labeled widget. See
+the "frame" widget manual entry for details on the lwchildsite component item.
+.fi
+
+.SH EXAMPLE
+.IP
+The labeledwidget was primarily meant to be a base class. The
+ScrolledListBox and EntryField are good examples of derived
+classes of the labeledwidget class. In order to provide equal
+support for composite classes, the 'childsite' methods also exists.
+The following is an example of 'childsite' method usage.
+.LP
+.DS
+ package require Iwidgets 4.0
+ iwidgets::labeledwidget .lw -labeltext "Canvas Widget" -labelpos s
+ pack .lw -fill both -expand yes -padx 10 -pady 10
+
+ set cw [canvas [.lw childsite].c -relief raised -width 200 -height 200]
+ pack $cw -padx 10 -pady 10
+.DE
+.SH AUTHOR
+Mark L. Ulferts
+.SH KEYWORDS
+labeledwidget, widget
diff --git a/iwidgets/doc/mainwindow.n b/iwidgets/doc/mainwindow.n
new file mode 100644
index 00000000000..984a00b4327
--- /dev/null
+++ b/iwidgets/doc/mainwindow.n
@@ -0,0 +1,308 @@
+'\"
+'\" Copyright (c) 1995 DSC Technologies Corporation
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) mainwindow.n 1.21 94/12/17 16:04:44
+'\"
+.so man.macros
+.HS iwidgets::mainwindow iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+iwidgets::mainwindow \- Create and manipulate a mainwindow widget
+.SH SYNOPSIS
+\fBiwidgets::mainwindow\fI \fIpathName \fR?\fIoptions\fR?
+.SH "INHERITANCE"
+itk::Toplevel <- iwidgets::Shell <- iwidgets::Mainwindow
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fB
+background cursor disabledForeground font
+foreground highlightBackground highlightColor highlightThickness\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "ASSOCIATED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBballoonBackground\fR \fBballoonDelay1\fR \fBballoonDelay2\fR \fBballonFont\fR
+\fBballoonForeground\fR
+.fi
+.LP
+See the "toolbar" manual entry for details on the above associated options.
+.SH "INHERITED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBtitle\fR
+.fi
+.LP
+See the "Toplevel" manual entry for details on the above inherited options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBheight\fR \fBmaster\fR \fBmodality\fR \fBpadX\fR
+\fBpadY\fR \fBwidth\fR
+.fi
+.LP
+See the "shell" manual entry for details on the above inherited options.
+
+.SH "WIDGET-SPECIFIC OPTIONS"
+.LP
+.nf
+Name: \fBhelpLine\fR
+Class: \fBHelpLine\fR
+Command-Line Switch: \fB-helpline\fR
+.fi
+.IP
+Specifies whether or not to display the help line. The value
+may be given in any of the forms acceptable to Tk_GetBoolean.
+The default is yes.
+.LP
+.nf
+Name: \fBmenuBarBackground\fR
+Class: \fBBackground\fR
+Command-Line Switch: \fB-menubarbackground\fR
+.fi
+.IP
+Specifies the normal background color for the menubar.
+.LP
+.nf
+Name: \fBmenuBarFont\fR
+Class: \fBFont\fR
+Command-Line Switch: \fB-menubarfont\fR
+.fi
+.IP
+Specifies the font to use when drawing text inside the menubar.
+.LP
+.nf
+Name: \fBmenuBarForeround\fR
+Class: \fBForeground\fR
+Command-Line Switch: \fB-menubarforeground\fR
+.fi
+.IP
+Specifies the normal foreground color for the menubar.
+.LP
+.nf
+Name: \fBstatusLine\fR
+Class: \fBStatusLine\fR
+Command-Line Switch: \fB-statusline\fR
+.fi
+.IP
+Specifies whether or not to display the status line. The value
+may be given in any of the forms acceptable to Tk_GetBoolean.
+The default is yes.
+.LP
+.nf
+Name: \fBtoolBarBackground\fR
+Class: \fBBackground\fR
+Command-Line Switch: \fB-toolbarbackground\fR
+.fi
+.IP
+Specifies the normal background color for the toolbar.
+.LP
+.nf
+Name: \fBtoolBarFont\fR
+Class: \fBFont\fR
+Command-Line Switch: \fB-toolbarfont\fR
+.fi
+.IP
+Specifies the font to use when drawing text inside the toolbar.
+.LP
+.nf
+Name: \fBtoolBarForeround\fR
+Class: \fBForeground\fR
+Command-Line Switch: \fB-toolbarforeground\fR
+.fi
+.IP
+Specifies the normal foreground color for the toolbar.
+.BE
+
+.SH DESCRIPTION
+.PP
+The \fBiwidgets::mainwindow\fR command creates a mainwindow shell which contains
+a menubar, toolbar, mousebar, childsite, status line, and help line.
+Each item may be filled and configured to suit individual needs.
+
+.SH "METHODS"
+.PP
+The \fBiwidgets::mainwindow\fR command create a new Tcl command whose
+name is \fIpathName\fR. This command may be used to invoke various
+operations on the widget. It has the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIOption\fR and the \fIarg\fRs
+determine the exact behavior of the command. The following
+commands are possible for mainwindow widgets:
+.SH "INHERITED METHODS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBactivate\fR \fBcenter\fR \fBdeactivate\fR
+.fi
+.LP
+See the "shell" manual entry for details on the above inherited methods.
+.SH "WIDGET-SPECIFIC METHODS"
+.TP
+\fIpathName \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given
+by \fIoption\fR.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::mainwindow\fR
+command.
+.TP
+\fIpathName \fBchildsite\fR
+Returns the pathname of the child site widget.
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR?
+Query or modify the configuration options of the widget.
+If no \fIoption\fR is specified, returns a list describing all of
+the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for
+information on the format of this list). If \fIoption\fR is specified
+with no \fIvalue\fR, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no \fIoption\fR is specified). If
+one or more \fIoption\-value\fR pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::mainwindow\fR
+command.
+.TP
+\fIpathName \fBmenubar\fR ?\fIargs\fR?
+The \fBmenubar\fR method provides access to the menubar. Invoked with
+no arguments it returns the pathname of the menubar. With arguments,
+they are evaluated against the menubar which in effect provides
+access to the entire API of the menubar. See the "menubar" manual
+entry for details on the commands available in the menubar.
+.TP
+\fIpathName \fBmousebar\fR ?\fIargs\fR?
+The \fBmousebar\fR method provides access to the mousebar which is a
+vertical toolbar. Invoked with no arguments it returns the pathname
+of the mousebar. With arguments, they are evaluated against the mousebar
+which in effect provides access to the entire API of the underlying
+toolbar. See the "toolbar" manual entry for details on the commands
+available in the mousebar.
+.TP
+\fIpathName \fBmsgd\fR ?\fIargs\fR?
+The \fBmsgd\fR method provides access to the messagedialog contained
+in the mainwindow. Invoked with no arguments it returns the pathname
+of the messagedialog. With arguments, they are evaluated against the
+messagedialog which in effect provides access to the entire API of the
+messagedialog. See the "messagedialog" manual
+entry for details on the commands available in the messagedialog.
+.TP
+\fIpathName \fBtoolbar\fR ?\fIargs\fR?
+The \fBtoolbar\fR method provides access to the toolbar. Invoked with
+no arguments it returns the pathname of the toolbar. With arguments,
+they are evaluated against the toolbar which in effect provides
+access to the entire API of the toolbar. See the "toolbar" manual
+entry for details on the commands available in the toolbar.
+
+.SH "COMPONENTS"
+.LP
+.nf
+Name: \fBhelp\fR
+Class: \fBLabel\fR
+.fi
+.IP
+The help component provides a location for displaying any help
+strings provided in the menubar, toolbar, or mousebar. See the "label"
+widget manual entry for details on the help component item.
+.LP
+.nf
+Name: \fBmenubar\fR
+Class: \fBMenubar\fR
+.fi
+.IP
+The menubar component is the menubar located at the top of the window.
+See the "menubar" widget manual entry for details on the menubar
+component item.
+.LP
+.nf
+Name: \fBmousebar\fR
+Class: \fBToolbar\fR
+.fi
+.IP
+The mousebar component is the vertical toolbar located on the right side
+of the window. See the "toolbar" widget manual entry for details on
+the mousebar component item.
+.LP
+.nf
+Name: \fBmsgd\fR
+Class: \fBMessagedialog\fR
+.fi
+.IP
+The msgd component is a messagedialog which may be reconfigured as needed
+and used repeatedly throughout the application. See the "messagedialog"
+widget manual entry for details on the messagedialog component item.
+.LP
+.nf
+Name: \fBstatus\fR
+Class: \fBLabel\fR
+.fi
+.IP
+The status component provides a location for displaying application
+status information. See the "label" widget manual entry for details
+on the status component item.
+.LP
+.nf
+Name: \fBtoolbar\fR
+Class: \fBToolbar\fR
+.fi
+.IP
+The toolbar component is the horizontal toolbar located on the top
+of the window. See the "toolbar" widget manual entry for details on
+the toolbar component item.
+.fi
+
+.SH EXAMPLE
+.DS
+ package require Iwidgets 4.0
+ iwidgets::mainwindow .mw
+
+ #
+ # Add a File menubutton
+ #
+ .mw menubar add menubutton file -text "File" -underline 0 -padx 8 -pady 2 \\
+ -menu {options -tearoff no
+ command new -label "New" -underline 0 \\
+ -helpstr "Create a new file"
+ command open -label "Open ..." -underline 0 \\
+ -helpstr "Open an existing file"
+ command save -label "Save" -underline 0 \\
+ -helpstr "Save the current file"
+ command saveas -label "Save As ..." -underline 5 \\
+ -helpstr "Save the file as a differnet name"
+ command print -label "Print" -underline 0 \\
+ -helpstr "Print the file"
+ separator sep1
+ command close -label "Close" -underline 0 \\
+ -helpstr "Close the file"
+ separator sep2
+ command exit -label "Exit" -underline 1 \\
+ -helpstr "Exit this application"
+ }
+
+ #
+ # Install a scrolledtext widget in the childsite.
+ #
+ iwidgets::scrolledtext [.mw childsite].st
+ pack [.mw childsite].st -fill both -expand yes
+
+ #
+ # Activate the main window.
+ #
+ .mw activate
+.DE
+.SH AUTHOR
+Mark L. Ulferts
+.DE
+John A. Tucker
+.LP
+.SH KEYWORDS
+mainwindow, shell, widget
diff --git a/iwidgets/doc/man.macros b/iwidgets/doc/man.macros
new file mode 100644
index 00000000000..c575ce6befa
--- /dev/null
+++ b/iwidgets/doc/man.macros
@@ -0,0 +1,186 @@
+'\" The definitions below are for supplemental macros used in Tcl/Tk
+'\" manual entries.
+'\"
+'\" .HS name section [date [version]]
+'\" Replacement for .TH in other man pages. See below for valid
+'\" section names.
+'\"
+'\" .AP type name in/out [indent]
+'\" Start paragraph describing an argument to a library procedure.
+'\" type is type of argument (int, etc.), in/out is either "in", "out",
+'\" or "in/out" to describe whether procedure reads or modifies arg,
+'\" and indent is equivalent to second arg of .IP (shouldn't ever be
+'\" needed; use .AS below instead)
+'\"
+'\" .AS [type [name]]
+'\" Give maximum sizes of arguments for setting tab stops. Type and
+'\" name are examples of largest possible arguments that will be passed
+'\" to .AP later. If args are omitted, default tab stops are used.
+'\"
+'\" .BS
+'\" Start box enclosure. From here until next .BE, everything will be
+'\" enclosed in one large box.
+'\"
+'\" .BE
+'\" End of box enclosure.
+'\"
+'\" .VS
+'\" Begin vertical sidebar, for use in marking newly-changed parts
+'\" of man pages.
+'\"
+'\" .VE
+'\" End of vertical sidebar.
+'\"
+'\" .DS
+'\" Begin an indented unfilled display.
+'\"
+'\" .DE
+'\" End of indented unfilled display.
+'\"
+'\" @(#) man.macros 1.1 94/08/09 13:07:19
+.\"
+'\" # Heading for Tcl/Tk man pages
+.de HS
+.ds ^3 \\0
+.if !"\\$3"" .ds ^3 \\$3
+.if '\\$2'cmds' .TH "\\$1" 1 "\\*(^3" "\\$4" "\\$5"
+.if '\\$2'lib' .TH "\\$1" 3 "\\*(^3" "\\$4" "\\$5"
+.if '\\$2'ncmds' .TH "\\$1" n "\\*(^3" "\\$4" "\\$5"
+.if '\\$2'tcl' .TH "\\$1" n "\\*(^3" Tcl "Tcl Built-In Commands"
+.if '\\$2'tk' .TH "\\$1" n "\\*(^3" Tk "Tk Commands"
+.if '\\$2'tclc' .TH "\\$1" 3 "\\*(^3" Tcl "Tcl Library Procedures"
+.if '\\$2'tkc' .TH "\\$1" 3 "\\*(^3" Tk "Tk Library Procedures"
+.if '\\$2'tclcmds' .TH "\\$1" 1 "\\*(^3" Tk "Tcl Applications"
+.if '\\$2'tkcmds' .TH "\\$1" 1 "\\*(^3" Tk "Tk Applications"
+.if '\\$2'iwid' .TH "\\$1" 1 "\\*(^3" Tk "[incr Widgets]"
+.if t .wh -1.3i ^B
+.nr ^l \\n(.l
+.ad b
+..
+'\" # Start an argument description
+.de AP
+.ie !"\\$4"" .TP \\$4
+.el \{\
+. ie !"\\$2"" .TP \\n()Cu
+. el .TP 15
+.\}
+.ie !"\\$3"" \{\
+.ta \\n()Au \\n()Bu
+\&\\$1 \\fI\\$2\\fP (\\$3)
+.\".b
+.\}
+.el \{\
+.br
+.ie !"\\$2"" \{\
+\&\\$1 \\fI\\$2\\fP
+.\}
+.el \{\
+\&\\fI\\$1\\fP
+.\}
+.\}
+..
+'\" # define tabbing values for .AP
+.de AS
+.nr )A 10n
+.if !"\\$1"" .nr )A \\w'\\$1'u+3n
+.nr )B \\n()Au+15n
+.\"
+.if !"\\$2"" .nr )B \\w'\\$2'u+\\n()Au+3n
+.nr )C \\n()Bu+\\w'(in/out)'u+2n
+..
+'\" # BS - start boxed text
+'\" # ^y = starting y location
+'\" # ^b = 1
+.de BS
+.br
+.mk ^y
+.nr ^b 1u
+.if n .nf
+.if n .ti 0
+.if n \l'\\n(.lu\(ul'
+.if n .fi
+..
+'\" # BE - end boxed text (draw box now)
+.de BE
+.nf
+.ti 0
+.mk ^t
+.ie n \l'\\n(^lu\(ul'
+.el \{\
+.\" Draw four-sided box normally, but don't draw top of
+.\" box if the box started on an earlier page.
+.ie !\\n(^b-1 \{\
+\h'-1.5n'\L'|\\n(^yu-1v'\l'\\n(^lu+3n\(ul'\L'\\n(^tu+1v-\\n(^yu'\l'|0u-1.5n\(ul'
+.\}
+.el \}\
+\h'-1.5n'\L'|\\n(^yu-1v'\h'\\n(^lu+3n'\L'\\n(^tu+1v-\\n(^yu'\l'|0u-1.5n\(ul'
+.\}
+.\}
+.fi
+.br
+.nr ^b 0
+..
+'\" # VS - start vertical sidebar
+'\" # ^Y = starting y location
+'\" # ^v = 1 (for troff; for nroff this doesn't matter)
+.de VS
+.mk ^Y
+.ie n 'mc \s12\(br\s0
+.el .nr ^v 1u
+..
+'\" # VE - end of vertical sidebar
+.de VE
+.ie n 'mc
+.el \{\
+.ev 2
+.nf
+.ti 0
+.mk ^t
+\h'|\\n(^lu+3n'\L'|\\n(^Yu-1v\(bv'\v'\\n(^tu+1v-\\n(^Yu'\h'-|\\n(^lu+3n'
+.sp -1
+.fi
+.ev
+.\}
+.nr ^v 0
+..
+'\" # Special macro to handle page bottom: finish off current
+'\" # box/sidebar if in box/sidebar mode, then invoked standard
+'\" # page bottom macro.
+.de ^B
+.ev 2
+'ti 0
+'nf
+.mk ^t
+.if \\n(^b \{\
+.\" Draw three-sided box if this is the box's first page,
+.\" draw two sides but no top otherwise.
+.ie !\\n(^b-1 \h'-1.5n'\L'|\\n(^yu-1v'\l'\\n(^lu+3n\(ul'\L'\\n(^tu+1v-\\n(^yu'\h'|0u'\c
+.el \h'-1.5n'\L'|\\n(^yu-1v'\h'\\n(^lu+3n'\L'\\n(^tu+1v-\\n(^yu'\h'|0u'\c
+.\}
+.if \\n(^v \{\
+.nr ^x \\n(^tu+1v-\\n(^Yu
+\kx\h'-\\nxu'\h'|\\n(^lu+3n'\ky\L'-\\n(^xu'\v'\\n(^xu'\h'|0u'\c
+.\}
+.bp
+'fi
+.ev
+.if \\n(^b \{\
+.mk ^y
+.nr ^b 2
+.\}
+.if \\n(^v \{\
+.mk ^Y
+.\}
+..
+'\" # DS - begin display
+.de DS
+.RS
+.nf
+.sp
+..
+'\" # DE - end display
+.de DE
+.fi
+.RE
+.sp
+..
diff --git a/iwidgets/doc/menubar.n b/iwidgets/doc/menubar.n
new file mode 100644
index 00000000000..c927a212db7
--- /dev/null
+++ b/iwidgets/doc/menubar.n
@@ -0,0 +1,348 @@
+'\"
+'\" Copyright (c) 1995 DSC Technologies Corporation
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) menubar.n
+'\"
+.so man.macros
+.HS iwidgets::menubar iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+iwidgets::menubar \- Create and manipulate menubar menu widgets
+.SH SYNOPSIS
+\fBiwidgets::menubar\fR \fIpathName\fR ?\fIoptions\fR?
+.SH "INHERITANCE"
+itk::Widget <- iwidgets::Menubar
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fB
+activeBackground activeBorderWidth activeForeground
+anchor background borderWidth
+cursor disabledForeground font
+foreground highlightBackground hightlightColor
+highligthThickness justify relief
+padX padY wrapLength\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "WIDGET-SPECIFIC OPTIONS"
+.LP
+.nf
+Name: \fBhelpVariable\fR
+Class: \fBHelpVariable\fR
+Command-Line Switch: \fB-helpvariable\fR
+.fi
+.IP
+Specifies the global variable to update whenever the mouse is in motion over a menu entry. This global variable is updated with the current value of the active menu entry's \fBhelpStr\fR. Other widgets can "watch" this variable with the trace command, or as is the case with entry or label widgets, they can set their \fBtextVariable\fR to the same global variable. This allows for a simple implementation of a help status bar. Whenever the mouse leaves a menu entry, the helpVariable is set to the empty string {}. The mainwindow(1) associates its helpstatus and its menubar in this fashion.
+.LP
+.nf
+Name: \fBmenuButtons\fR
+Class: \fBMenuButtons\fR
+Command-Line Switch: \fB-menubuttons\fR
+.fi
+.IP
+The menuButton option is a string which specifies the arrangement of menubuttons on the menubar frame. Each menubutton entry is delimited by the newline character.
+.nf
+.IP
+.ta 2c 8c 12c
+iwidgets::menubar .mb -menubuttons {
+ menubutton file -text File
+ menubutton edit -text Edit
+ menubutton options -text Options
+}
+.fi
+.IP
+specifies that three menubuttons will be added to the menubar (file, edit, options). Each entry is translated into an add command call.
+.IP
+The \fBmenuButtons\fR option can accept embedded variables, commands, and
+backslash quoting. Embedded variables and commands must be enclosed in
+curly braces ({}) to ensure proper parsing of the substituted values.
+.BE
+.SH DESCRIPTION
+.PP
+The \fBiwidgets::menubar\fR command creates a new window (given by the \fIpathName\fR argument) and makes it into a \fBmenubar\fR menu widget. Additional options, described above may be specified on the command line or in the option database to configure aspects of the menubar such as its colors and font. The \fBiwidgets::menubar\fR command returns its \fIpathName\fR argument. At the time this command is invoked, there must not exist a window named pathName, but pathName's parent must exist.
+.PP
+A \fBmenubar\fR is a widget that simplifies the task of creating menu hierarchies. It encapsulates a \fBframe\fR widget, as well as \fBmenubuttons\fR, \fBmenus\fR, and menu \fBentries\fR. The menubar allows menus to be specified and referenced in a more consistent manner than using Tk to build menus directly.
+
+\fBMenubar\fR allows a menu tree to be expressed in a hierachical "language". The \fBmenubar\fR accepts a \fBmenuButtons\fR option that allows a list of menubuttons to be added to the menubar. In turn, each menubutton accepts a \fBmenu\fR option that specifies a list of menu entries to be added to the menubutton's menu. Cascade entries also accept the \fBmenu\fR option for specifying a list of menu entries to be added to the cascade's menu.
+
+Additionally, the menubar allows each component of the menubar system to be referenced by a simple \fImenuPathName\fR syntax. The menubar also extends the set of options for menu entries to include a \fBhelpStr\fR option.
+.SH "MENU PATH NAMES"
+.PP
+A \fImenuPathName\fR is a series of component names separated by the `.' character. Each menubar component can be referenced via these \fImenuPathNames\fR. \fImenuPathNames\fR are similar to widget pathNames in Tk. Some correspond directly to a widget pathName (components of type \fBmenu\fR or \fBmenubutton\fR), others correspond to a menu entry type. Every widget and entry in a menubar can be referenced with the \fImenuPathName\fR naming convention. A menubar can have four types of components:
+.IP
+\fBframe\fR. A menubar holds exactly one frame which manages menubuttons. The frame is always signified by the `.' character as the path name.
+.IP
+\fBmenubutton\fR. A menubutton corresponds directly to a Tk menubutton. See menubutton(n).
+.IP
+\fBmenu\fR. A menu is attached to a menubutton and corresponds directly to Tk's menu widget. A menu is always signified by the \fImenuPathName\fR ending with the keyword \fBmenu\fR. See menu(n).
+.IP
+\fBentry\fR. An entry corresponds directly to Tk's menu widget entries. Menus consist of a column of one line entries. Entries may be of type: \fBcommand\fR, \fBcheckbutton\fR, \fBradiobutton\fR, \fBseparator\fR, or \fBcascade\fR. For a complete description of these types see the discussion on \fBENTRIES\fR in menu(n).
+.PP
+The suffix of a \fImenuPathName\fR may have the form of:
+.TP 14
+\fItkWidgetName\fR
+Specifies the name of the component, either a \fBframe\fR, \fBmenubutton\fR, \fBmenu\fR, or an \fBentry\fR. This is the normal naming of widgets. For example, .file references a \fBmenubutton\fR named \fIfile\fR.
+.PP
+The \fImenuPathName\fR is a series of segment names, each separated by the '.' character. Segment names may be one of the following forms:
+.TP 14
+\fInumber\fR
+Specifies the index of the the component. For menubuttons, 0 corresponds to the left-most menubutton of the menu bar frame. As an example, \fI.1\fR would correspond to the second menubutton on the menu bar frame.
+.IP
+For entries, 0 corresponds to the top-most entry of the menu. For example, .file.0 would correspond to the first entry on the menu attached to the menubutton named \fIfile\fR.
+.TP 14
+\fBend\fR
+Specifes the last component. For menubuttons, it specifies the right-most entry of the menu bar frame. For menu entries, it specifies the bottom-most entry of the menu.
+.TP 14
+\fBlast\fR
+Same as end.
+.PP
+Finally, menu components always end with the \fBmenu\fR keyword. These components are automatically created via the -menu option on menubuttons and cascades or via the \fBadd\fR or \fBinsert\fR commands.
+.TP 14
+\fBmenu\fR
+Specifes the menu pane that is associated with the given menubutton prefix. For example, \fI.file.menu\fR specifies the menu pane attached to the \fI.file\fR menubutton.
+.PP
+For example, the path \fI.file.new\fR specifies the entry named new on the menu associated with the file menubutton located on the menu bar. The path \fI.file.menu\fR specifies the menu pane associated with the menubutton \fI.file\fR. The path \fI.last\fR specifies the last menu on the menu bar. The path \fI.0.last\fR would specify the first menu (file) and the last entry on that menu (quit), yielding \fI.file.quit\fR.
+
+As a restriction, the last name segment of \fImenuPathName\fR cannot be one of the keywords last, menu, end, nor may it be a numeric value (integer).
+.SH "WIDGET-SPECIFIC METHODS"
+.PP
+The \fBiwidgets::menubar\fR command creates a new Tcl command whose name is \fIpathName\fR.
+This command may be used to invoke various operations on the widget. It has
+the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIoption\fR and the \fIarg\fRs
+determine the exact behavior of the command.
+.PP
+In addition, many of the widget commands for menubar take as one argument a path name to a menu component. These path names are called \fImenuPathName\fRs. See the discussion on \fBMENUBAR PATH NAMES\fR above.
+.PP
+The following commands are possible for menubar widgets:
+.TP
+\fIpathName\fR \fBadd\fR \fItype\fR \fImenuPathName\fR ?\fIoption value option value\fR?
+Adds either a menu to the menu bar or a menu entry to a menu pane.
+.IP
+If additional arguments are present, they specify \fIoption\fRs available to component type \fBentry\fR. See the man pages for \fBmenu\fR(1) in the section on \fBENTRIES\fR.
+
+If \fItype\fR is one of \fBcascade\fR, \fBcheckbutton\fR, \fBcommand\fR, \fBradiobutton\fR, or \fBseparator\fR it adds a new entry to the bottom of the menu denoted by the prefix of \fImenuPathName\fR. If additonal arguments are present, they specify options available to menu \fBentry\fR widgets. In addition, the \fBhelpStr\fR option is added by the menubar widget to all components of type entry.
+.RS
+.TP
+\fB-helpstr\fR \fIvalue\fR
+Specifes the string to associate with the entry. When the mouse moves over the associated entry, the variable denoted by \fBhelpVariable\fR is set. Another widget can bind to the helpVariable and thus display status help.
+.RE
+.IP
+If the type of the component added is \fBmenubutton\fR or \fBcascade\fR, a menubutton or cascade is added to the menubar. If additional arguments are present, they specify options available to menubutton or cascade widgets. In addition, the \fBmenu\fR option is added by the menubar widget to all menubutton and cascade widgets.
+.RS
+.TP
+\fB-menu\fR \fImenuSpec\fR
+This is only valid for \fImenuPathName\fRs of type \fBmenubutton\fR or \fBcascade\fR. Specifes an option set and/or a set of entries to place on a menu and associate with the menubutton or cascade. The \fBoption\fR keyword allows the menu widget to be configured. Each item in the \fImenuSpec\fR is treated as add commands (each with the possibility of having other -menu options). In this way a menu can be recursively built.
+.IP
+The last segment of \fImenuPathName\fR cannot be one of the keywords \fBlast\fR, \fBmenu\fR, \fBend\fR. Additionally, it may not be a \fInumber\fR. However the \fImenuPathName\fR may be referenced in this manner (see discussion of \fBCOMPONENT PATH NAMES\fR).
+.IP
+Note that the same curly brace quoting rules apply to \fB-menu\fR option strings as did to \fB-menubuttons\fR option strings. See the earlier discussion on \fBumenubuttons\fR in the "\fBWIDGET-SPECIFIC OPTIONS\fR" section.
+.RE
+.TP
+\fIpathName\fR \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given by \fIoption\fR.
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoptions\fR \fIvalue\fR \fIoption\fR \fIvalue\fR?
+Query or modify the configuration options of the widget. If no \fIoption\fR is specified, returns a list describing all of the available options for \fBpathName\fR (see \fBTk_ConfigureInfo\fR for information on the format of this list). If \fIoption\fR is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string.
+.TP
+\fIpathName\fR \fBdelete\fR \fImenuPathName\fR ?\fImenuPathName2\fR?
+If \fImenuPathName\fR is of component type \fBMenubutton\fR or \fBMenu\fR, delete operates on menus. If \fImenuPathName\fR is of component type \fBEntry\fR, delete operates on menu entries.
+
+This command deletes all components between \fImenuPathName\fR and \fImenuPathName2\fR inclusive. If \fImenuPathName2\fR is omitted then it defaults to \fImenuPathName\fR. Returns an empty string.
+
+If \fImenuPathName\fR is of type menubar, then all menus and the menu bar frame will be destroyed. In this case \fImenuPathName2\fR is ignored.
+.TP
+\fIpathName\fR \fBindex\fR \fImenuPathName\fR
+If \fImenuPathName\fR is of type menubutton or menu, it returns the position of the menu/menubutton on the menubar frame.
+
+If \fImenuPathName\fR is of type \fBcommand\fR, \fBseparator\fR, \fBradiobutton\fR, \fBcheckbutton\fR, or \fBcascade\fR, it returns the menu widget's numerical index for the entry corresponding to \fImenuPathName\fR. If path is not found or the path is equal to ".", a value of -1 is returned.
+.TP
+\fIpathName\fR \fBinsert\fR \fImenuPathName\fR \fItype\fR \fIname\fR ?\fIoption\fR \fIvalue\fR?
+Insert a new component named name before the component specified by \fImenuPathName\fR.
+.IP
+If \fImenuPathName\fR is of type \fBMenubutton\fR or \fBMenu\fR, the new component inserted is of type \fBMenu\fR and given the name name. In this case valid \fIoption\fR \fIvalue\fR pairs are those accepted by menubuttons.
+.IP
+If \fImenuPathName\fR is of type \fBEntry\fR, the new component inserted is of type \fBentry\fR and given the name \fIname\fR. In this case, valid \fIoption\fR \fIvalue\fR pairs are those accepted by menu entries.
+\fIName\fR cannot be one of the keywords \fBlast\fR, \fBmenu\fR, \fBend\fR. Additionally, it may not be a number. However the \fImenuPathName\fR may be referenced in this manner (see discussion of \fBCOMPONENT PATH NAMES\fR).
+.TP
+\fIpathName\fR \fBinvoke\fR \fImenuPathName\fR
+Invoke the action of the menu entry denoted by \fImenuPathName\fR. See the sections on the individual entries in the menu(1) man pages. If the menu entry is disabled then nothing happens. If the entry has a command associated with it then the result of that command is returned as the result of the \fBinvoke\fR widget command. Otherwise the result is an empty string.
+
+If \fImenuPathName\fR is not a menu entry, an error is issued.
+.TP
+\fIpathName\fR \fBmenucget\fR \fImenuPathName\fR \fIoption\fR
+Returns the current value of the configuration option given by \fIoption\fR. The component type of \fImenuPathName\fR determines the valid available options.
+.TP
+\fIpathName\fR \fBmenuconfigure\fR \fImenuPathName\fR ?\fIoption\fR \fIvalue\fR?
+Query or modify the configuration options of the componet of the menubar specified by \fImenuPathName\fR. If no \fIoption\fR is specified, returns a list describing all of the available options for \fImenuPathName\fR (see \fBTk_ConfigureInfo\fR for information on the format of this list). If \fIoption\fR is specified with no value, then the command returns a list describing the one named option (this list will be identical to the corresponding sublist of the value returned if no option is specified). If one or more option-value pairs are specified, then the command modifies the given widget option(s) to have the given value(s); in this case the command returns an empty string. The component type of \fImenuPathName\fR determines the valid available options.
+.TP
+\fIpathName\fR \fBpath\fR ?\fImode\fR? \fIpattern\fR
+Returns a fully formed \fImenuPathName\fR that matches \fIpattern\fR. If no match is found it returns -1. The \fImode\fR argument indicates how the search is to be matched against \fIpattern\fR and it must have one of the following values:
+.RS
+.TP
+\fB-glob\fR
+Pattern is a glob-style pattern which is matched against each component path using the same rules as the string match command.
+.TP
+\fB-regexp\fR
+Pattern is treated as a regular expression and matched against each component of the \fImenuPathName\fR using the same rules as the regexp command.
+The default mode is -glob.
+.RE
+.TP
+\fIpathName\fR \fBtype\fR \fImenuPathName\fR
+Returns the type of the component specified by \fImenuPathName\fR. For menu entries, this is the type argument passed to the \fBadd\fR/\fBinsert\fR widget command when the entry was created, such as \fBcommand\fR or \fBseparator\fR. Othewise it is either a \fBmenubutton\fR or a \fBmenu\fR.
+.TP
+\fIpathName\fR \fByposition\fR \fImenuPathName\fR
+Returns a decimal string giving the y-coordinate within the menu window of the topmost pixel in the entry specified by \fImenuPathName\fR. If the \fImenuPathName\fR is not an entry, an error is issued.
+.SH "EXAMPLE ONE: USING GRAMMAR"
+.PP
+The following example creates a menubar with "File", "Edit", "Options" menubuttons. Each of these menubuttons has an associated menu.
+In turn the File menu has menu entries, as well as the Edit
+menu and the Options menu. The Options menu is a tearoff menu
+with selectColor (for radiobuttons) set to blue.
+In addition, the Options menu has a cascade titled More,
+with several menu entries attached to it as well. An entry widget is
+provided to display help status.
+.DS
+package require Iwidgets 4.0
+iwidgets::menubar .mb -helpvariable helpVar -menubuttons {
+ menubutton file -text File -menu {
+ options -tearoff false
+ command new -label New \\
+ -helpstr "Open new document" \\
+ -command {puts NEW}
+ command close -label Close \\
+ -helpstr "Close current document" \\
+ -command {puts CLOSE}
+ separator sep1
+ command exit -label Exit -command {exit} \\
+ -helpstr "Exit application"
+ }
+ menubutton edit -text Edit -menu {
+ options -tearoff false
+ command undo -label Undo -underline 0 \\
+ -helpstr "Undo last command" \\
+ -command {puts UNDO}
+ separator sep2
+ command cut -label Cut -underline 1 \\
+ -helpstr "Cut selection to clipboard" \\
+ -command {puts CUT}
+ command copy -label Copy -underline 1 \\
+ -helpstr "Copy selection to clipboard" \\
+ -command {puts COPY}
+ command paste -label Paste -underline 0 \\
+ -helpstr "Paste clipboard contents" \\
+ -command {puts PASTE}
+ }
+ menubutton options -text Options -menu {
+ options -tearoff false -selectcolor blue
+ radiobutton byName -variable viewMode \\
+ -value NAME -label "by Name" \\
+ -helpstr "View files by name order" \\
+ -command {puts NAME}
+ radiobutton byDate -variable viewMode \\
+ -value DATE -label "by Date" \\
+ -helpstr "View files by date order" \\
+ -command {puts DATE}
+ cascade prefs -label Preferences -menu {
+ command colors -label Colors... \\
+ -helpstr "Change text colors" \\
+ -command {puts COLORS}
+ command fonts -label Fonts... \\
+ -helpstr "Change text font" \\
+ -command {puts FONT}
+ }
+ }
+
+}
+.if
+.nf
+frame .fr -width 300 -height 300
+entry .ef -textvariable helpVar
+pack .mb -anchor nw -fill x -expand yes
+pack .fr -fill both -expand yes
+pack .ef -anchor sw -fill x -expand yes
+.if
+.DE
+.SH "EXAMPLE TWO: USING METHODS"
+Alternatively the same menu could be created by using the add and configure methods:
+.PP
+.nf
+.ta 2c 4c 6c 8c 10c 12c 14c 16c
+.DS
+ package require Iwidgets 4.0
+ iwidgets::menubar .mb
+ .mb configure -menubuttons {
+ menubutton file -text File -menu {
+ command new -label New
+ command close -label Close
+ separator sep1
+ command quit -label Quit
+ }
+ menubutton edit -text Edit
+ }
+.if
+.PP
+ .mb add command .edit.undo -label Undo -underline 0
+ .mb add separator .edit.sep2
+ .mb add command .edit.cut -label Cut -underline 1
+ .mb add command .edit.copy -label Copy -underline 1
+ .mb add command .edit.paste -label Paste -underline 0
+
+ .mb add menubutton .options -text Options -menu {
+ radiobutton byName -variable viewMode \\
+ -value NAME -label "by Name"
+ radiobutton byDate -variable viewMode \\
+ -value DATE -label "by Date"
+}
+
+ .mb add cascade .options.prefs -label Preferences -menu {
+ command colors -label Colors...
+ command fonts -label Fonts...
+ }
+ pack .mb -side left -anchor nw -fill x -expand yes
+.DE
+.SH CAVEATS
+The \fB-menubuttons\fR option as well as the \fB-menu\fR option is evaluated by menubar with the \fBsubst\fR command. The positive side of this is that the option string may contain variables, commands, and/or backslash substitutions. However, substitutions might expand into more than a single word. These expansions can be protected by enclosing candidate substitutions in curly braces ({}). This ensures, for example, a value for an option will still be treated as a single value and not multiple values. The following example illustrates this case:
+.nf
+.IP
+.ta 2c 4c 6c
+set fileMenuName "File Menu"
+set var {}
+iwidgets::menubar .mb -menubuttons {
+ menubutton file -text {$fileMenuName}
+ menubutton edit -text Edit -menu {
+ checkbutton check \\
+ -label Check \\
+ -variable {[scope var]} \\
+ -onvalue 1 \\
+ -offvalue 0
+ }
+ menubutton options -text Options
+}
+.fi
+.IP
+The variable \fIfileMenuName\fR will expand to "File Menu" when the \fBsubst\fR command is used on the menubutton specification. In addition, the [\fBscope\fR...] command will expand to @scope :: var. By enclosing these inside {} they stay as a single value. Note that only {} work for this. [list...], "" etc. will not protect these from the subst command.
+.SH ACKNOWLEDGMENTS
+.LP
+Bret Schumaker
+.IP
+1994 - Early work on a menubar widget.
+.LP
+Mark Ulferts, Mark Harrison, John Sigler
+.IP
+Invaluable feedback on grammar and usability of the menubar widget
+.LP
+.SH AUTHOR
+Bill W. Scott
+.SH KEYWORDS
+frame, menu, menubutton, entries, help
+
diff --git a/iwidgets/doc/messagebox.n b/iwidgets/doc/messagebox.n
new file mode 100644
index 00000000000..829910890de
--- /dev/null
+++ b/iwidgets/doc/messagebox.n
@@ -0,0 +1,277 @@
+'\"
+'\" Copyright (c) 1995 DSC Technologies Corporation
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) messagebox.n 1.21 94/12/17 16:04:44
+'\"
+.so man.macros
+.HS iwidgets::messagebox iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+iwidgets::messagebox \- Create and manipulate a messagebox text widget
+.SH SYNOPSIS
+\fBiwidgets::messagebox\fI \fIpathName \fR?\fIoptions\fR?
+.SH "INHERITANCE"
+itk::Widget <- iwidgets::Labeledwidget <- iwidgets::Scrolledwidget <- iwidgets::Messagebox
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fB
+activeBackground activeForeground background borderWidth
+cursor exportSelection font foreground
+highlightColor highlightThickness padX padY
+relief setGrid\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "ASSOCIATED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBlabelBitmap\fR \fBlabelFont\fR \fBlabelImage\fR \fBlabelMargin\fR
+\fBlabelPos\fR \fBlabelText\fR \fBlabelVariable\fR
+.fi
+.LP
+See the "labeledwidget" class manual entry for details on the above
+associated options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBactiveRelief\fR \fBelementBorderWidth\fR \fBjump\fR \fBtroughColor\fR
+.fi
+.LP
+See the "scrollbar" widget manual entry for details on the above
+associated options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBheight\fR \fBhscrollMode\fR \fBsbWidth\fR \fBscrollMargin\fR
+\fBtextBackground\fR \fBvisibleItems\fR \fBvscrollMode\fR \fBwidth\fR
+.fi
+.LP
+See the "scrolledtext" widget manual entry for details on the above
+associated options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBspacing1\fR \fBspacing2\fR \fBspacing3\fR
+.fi
+.LP
+See the "text" widget manual entry for details on the above
+associated options.
+
+.SH "WIDGET-SPECIFIC OPTIONS"
+.LP
+.nf
+Name: \fBfileName\fR
+Class: \fBFileName\fR
+Command-Line Switch: \fB-filename\fR
+.fi
+.IP
+Specifies the filename to be displayed in the file selection dialog when
+it pops up during a save of the messagebox contents operation.
+.LP
+.nf
+Name: \fBmaxLines\fR
+Class: \fBMaxLines\fR
+Command-Line Switch: \fB-maxlines\fR
+.fi
+.IP
+Specifies the maximum number of lines allowed in the text area of the
+messagebox. When this limit is reached, the oldest line will be deleted
+such that the total number of lines remains \fImaxlines\fR.
+.LP
+.nf
+Name: \fBsaveDir\fR
+Class: \fBSaveDir\fR
+Command-Line Switch: \fB-savedir\fR
+.fi
+.IP
+Specifies the default directory to display when the file selection dialog
+pops up during a save of the messagebox contents operation. If this
+parameter is not specified, then the files in the current working directory
+are displayed.
+.LP
+.BE
+
+.SH DESCRIPTION
+.PP
+The \fBiwidgets::messagebox\fR command creates
+a scrolled information messages area widget.
+Message types can be user defined and configured. Their options
+include foreground, background, font, bell, and their display
+mode of on or off. This allows message types to defined as needed,
+removed when no longer so, and modified when necessary. An export
+method is provided for file I/O.
+
+.PP
+The number of lines displayed may be limited with
+the default being 1000. When this limit is reached, the oldest line
+is removed. A popup menu which appears when the right mouse button
+has been pressed in the message area has been predefined. The contents
+of the popup menu by default support clearing the area and saving its
+contents to a file. Additional operations may be defined or existing
+operations removed by using the component command to access the
+popup menu.
+
+.SH "MESSAGE TYPES"
+.PP
+The display characteristics of messages issued to the messagebox vary
+with the message type. Types are defined by the user and they may
+be added, removed, and configured. The options of the message type
+control the display include the following:
+.TP
+\fB\-background \fIcolor\fR
+\fIColor\fR specifies the background color to use for characters
+associated with the message type.
+It may have any of the forms accepted by \fBTk_GetColor\fR.
+.TP
+\fB\-bell \fIboolean\fR
+Specifies whether or not to ring the bell whenenver a message of this
+type is issued. \fIBoolean\fR may have any of the forms accepted by
+\fBTk_GetBoolean\fR. The default is 0.
+.TP
+\fB-font\ \fIfontName\fR
+\fIFontName\fR is the name of a font to use for drawing
+characters. It may have any of the forms accepted
+by Tk_GetFontStruct.
+.TP
+\fB\-foreground \fIcolor\fR
+\fIColor\fR specifies the foreground color to use for characters
+associated with the message type.
+It may have any of the forms accepted by \fBTk_GetColor\fR.
+.TP
+\fB\-show \fIboolean\fR
+Specifies whether of not to display this message type when issued.
+\fIBoolean\fR may have any of the forms accepted by
+\fBTk_GetBoolean\fR. The default is 1.
+
+.SH "METHODS"
+.PP
+The \fBiwidgets::messagebox\fR command creates a new Tcl command whose
+name is \fIpathName\fR. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIOption\fR and the \fIarg\fRs
+determine the exact behavior of the command. The following
+commands are possible for messagebox widgets:
+
+.SH "WIDGET-SPECIFIC METHODS"
+.TP
+\fIpathName \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given
+by \fIoption\fR.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::messagebox\fR
+command.
+.TP
+\fIpathName \fBclear\fR
+Clear the messagebox of all messages.
+.TP
+\fIpathName \fBexport\fR \fIfilename\fR
+Write text to a file. If \fIfilename\fR exists then
+contents are replaced with text widget contents.
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR?
+Query or modify the configuration options of the widget.
+If no \fIoption\fR is specified, returns a list describing all of
+the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for
+information on the format of this list). If \fIoption\fR is specified
+with no \fIvalue\fR, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no \fIoption\fR is specified). If
+one or more \fIoption\-value\fR pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::messagebox\fR
+command.
+.TP
+\fIpathName \fBtype\fR \fIoption\fR \fImsgtype\fR ?\fIarg arg ...\fR?
+This command is used to manipulate message types. The behavior of
+the command depends on the option argument that follows the type keyword.
+The following forms of the command are supported:
+.RS
+.TP
+.TP
+\fIpathName \fBtype add\fR \fImsgtype\fR ?\fIoption value ...\fR?
+Adds a new message type given by \fImsgtype\fR with the display
+properties defined by the option value pairs.
+See MESSAGE TYPES for information on the options that
+are supported.
+.TP
+\fIpathName \fBtype cget\fR \fImsgtype option\fR
+Returns the value of a configuration option for a message type.
+\fIMsgtype\fR identifies the message type, and \fIoption\fR
+specifies a particular configuration option, which must be one of
+the ones listed in the section MESSAGE TYPES.
+.TP
+\fIpathName \fBtype configure \fImsgtype\fR ?\fIoption value ...\fR?
+Query or modify the configuration options for a message type.
+If no \fIoption\fR is specified, returns a list describing all of
+the available options for the message type \fImsgtype\fR.
+If \fIoption\fR is specified with no \fIvalue\fR, then the command
+returns a list describing the one named option.
+If one or more \fIoption\-value\fR pairs are specified, then the command
+modifies the given option(s) to have the given value(s); in
+this case the command returns an empty string.
+See MESSAGE TYPES for information on the options that
+are supported.
+\fIpathName \fBtype remove\fR \fImsgtype\fR
+Removes an existing message type given by \fImsgtype\fR.
+.RE
+.TP
+\fIpathName \fBissue\fR \fIstring\fR \fI?level?\fR \fI?tags?\fR
+Print a \fIstring\fR to the text area at the given level and with
+any additional tags specified.
+
+.SH "COMPONENTS"
+.LP
+.nf
+Name: \fBitemMenu\fR
+Class: \fBMenu\fR
+.fi
+.IP
+This is the popup menu that gets displayed when you right-click in the
+text area of the messagebox. Its contents may be modified via the component
+command.
+.LP
+.nf
+Name: \fBtext\fR
+Class: \fBScrolledtext\fR
+.fi
+.IP
+The text component is the scrolledtext widget. See the "scrolledtext" widget
+manual entry for details on the text component item.
+.fi
+
+.SH EXAMPLE
+.DS
+ package require Iwidgets 4.0
+ iwidgets::messagebox .mb -hscrollmode dynamic \\
+ -labeltext "Messages" -labelpos n \\
+ -height 120 -width 550 -savedir "/tmp" -textbackground #d9d9d9
+
+ pack .mb -padx 5 -pady 5 -fill both -expand yes
+
+ .mb type add ERROR -background red -foreground white -bell 1
+ .mb type add WARNING -background yellow -foreground black
+ .mb type add INFO -background white -foreground black
+
+ .mb issue "This is an error message in red with a beep" ERROR
+ .mb issue "This warning message in yellow" WARNING
+ .mb issue "This is an informational message" INFO
+.DE
+.SH AUTHOR
+Alfredo Jahn V
+.DE
+Mark L. Ulferts
+.LP
+.SH KEYWORDS
+messagebox, scrolledtext, text, widget
+
diff --git a/iwidgets/doc/messagedialog.n b/iwidgets/doc/messagedialog.n
new file mode 100644
index 00000000000..991affe034f
--- /dev/null
+++ b/iwidgets/doc/messagedialog.n
@@ -0,0 +1,215 @@
+'\"
+'\" Copyright (c) 1995 DSC Technologies Corporation
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) messagedialog.n 1.21 94/12/17 16:04:44
+'\"
+.so man.macros
+.HS iwidgets::messagedialog iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+iwidgets::messagedialog \- Create and manipulate a message dialog widget
+.SH SYNOPSIS
+\fBiwidgets::messagedialog\fI \fIpathName \fR?\fIoptions\fR?
+.SH "INHERITANCE"
+itk::Toplevel <- iwidgets::Shell <- iwidgets::Dialogshell <- iwidgets::Dialog <- iwidgets::Messagedialog
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBbackground\fR \fBbitmap\fR \fBcursor\fR \fBfont\fR
+\fBforeground\fR \fBimage\fR \fBtext\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "INHERITED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBbuttonBoxPadX\fR \fBbuttonBoxPadY\fR \fBbuttonBoxPos\fR \fBpadX\fR
+\fBpadY\fR \fBseparator\fR \fBthickness\fR
+.fi
+.LP
+See the "dialogshell" widget manual entry for details on the above
+inherited options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBmaster\fR \fBmodality\fR
+.fi
+.LP
+See the "shell" widget manual entry for details on the above
+inherited options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBtitle\fR
+.fi
+.LP
+See the "Toplevel" widget manual entry for details on the above
+inherited options.
+.LP
+.SH "WIDGET-SPECIFIC OPTIONS"
+.LP
+.nf
+Name: \fBimagePos\fR
+Class: \fBPosition\fR
+Command-Line Switch: \fB-imagepos\fR
+.fi
+.IP
+Specifies the image position relative to the message text: \fBn\fR, \fBs\fR,
+\fBe\fR, or \fBw\fR. The default is w.
+.LP
+.nf
+Name: \fBtextPadX\fR
+Class: \fBPad\fR
+Command-Line Switch: \fB-textpadx\fR
+.fi
+.IP
+Specifies a non-negative value indicating how much extra space to request for
+the message text in the X direction. The value may have any of the forms
+acceptable to Tk_GetPixels.
+.LP
+.nf
+Name: \fBtextPadY\fR
+Class: \fBPad\fR
+Command-Line Switch: \fB-textpady\fR
+.fi
+.IP
+Specifies a non-negative value indicating how much extra space to request for
+the message text in the X direction. The value may have any of the forms
+acceptable to Tk_GetPixels.
+.LP
+.BE
+
+.SH DESCRIPTION
+.PP
+The \fBiwidgets::messagedialog\fR command creates a message dialog composite widget.
+The messagedialog is derived from the Dialog class and is composed of
+an image and associated message text with commands to manipulate the
+dialog buttons.
+
+.SH "METHODS"
+.PP
+The \fBiwidgets::messagedialog\fR command creates a new Tcl command whose
+name is \fIpathName\fR. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIOption\fR and the \fIarg\fRs
+determine the exact behavior of the command. The following
+commands are possible for messagedialog widgets:
+
+.SH "INHERITED METHODS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBadd\fR \fBbuttonconfigure\fR \fBdefault\fR \fBhide\fR
+\fBinsert\fR \fBinvoke\fR \fBshow\fR
+.fi
+.LP
+See the "buttonbox" widget manual entry for details on the above
+inherited methods.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBchildsite\fR
+.fi
+.LP
+See the "dialogshell" widget manual entry for details on the above
+inherited methods.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBactivate\fR \fBcenter\fR \fBdeactivate\fR
+.fi
+.LP
+See the "dialogshell" widget manual entry for details on the above
+inherited methods.
+.SH "WIDGET-SPECIFIC METHODS"
+.TP
+\fIpathName \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given
+by \fIoption\fR.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::messagedialog\fR
+command.
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR?
+Query or modify the configuration options of the widget.
+If no \fIoption\fR is specified, returns a list describing all of
+the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for
+information on the format of this list). If \fIoption\fR is specified
+with no \fIvalue\fR, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no \fIoption\fR is specified). If
+one or more \fIoption\-value\fR pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::messagedialog\fR
+command.
+
+.SH "COMPONENTS"
+.LP
+.nf
+Name: \fBimage\fR
+Class: \fBLabel\fR
+.fi
+.IP
+The image component is the bitmap or image of the message dialog. See
+the "label" widget manual entry for details on the image component item.
+.LP
+.nf
+Name: \fBmessage\fR
+Class: \fBLabel\fR
+.fi
+.IP
+The message component provides the textual portion of the message dialog.
+See the "label" widget manual entry for details on the message component item.
+.fi
+
+.SH EXAMPLE
+.DS
+ package require Iwidgets 4.0
+ #
+ # Standard question message dialog used for confirmation.
+ #
+ iwidgets::messagedialog .md -title "Message Dialog" -text "Are you sure ?" \\
+ -bitmap questhead -modality global
+
+ .md buttonconfigure OK -text Yes
+ .md buttonconfigure Cancel -text No
+
+ if {[.md activate]} {
+ .md configure -text "Are you really sure ?"
+ if {[.md activate]} {
+ puts stdout "Yes"
+ } else {
+ puts stdout "No"
+ }
+ } else {
+ puts stdout "No"
+ }
+
+ destroy .md
+
+ #
+ # Copyright notice with automatic deactivation.
+ #
+ iwidgets::messagedialog .cr -title "Copyright" -bitmap @dsc.xbm -imagepos n \\
+ -text "Copyright 1995 DSC Communications Corporation\\n \\
+ All rights reserved"
+
+ .cr hide Cancel
+
+ .cr activate
+ after 10000 ".cr deactivate"
+.DE
+.SH AUTHOR
+Mark L. Ulferts
+.SH KEYWORDS
+messagedialog, dialog, dialogshell, shell, widget
diff --git a/iwidgets/doc/mkitclman b/iwidgets/doc/mkitclman
new file mode 100644
index 00000000000..cbcd1dbb72e
--- /dev/null
+++ b/iwidgets/doc/mkitclman
@@ -0,0 +1,320 @@
+#!/bin/sh
+# \
+ exec itkwish "$0" ${1+"$@"}
+#
+# mkitclman "4 Dec 1995"
+# mkitclman - generate a man page from an itcl class
+#
+# SYNOPSIS
+# mkitclman classfile
+#
+# DESCRIPTION
+# Reads an [incr Tcl] or [incr Tk] class file as input, and outputs nroff.
+# mkitclman generates a standard format used for [incr Widget] classes. It
+# locates the class name, inheritance to one level, widget specific options,
+# and widget specific methods. Areas that the script cannot handle it
+# places and uppercased name delimited by leading and trailing '_' characters.
+#
+# [incr Tcl/Tk] 2.0 is the supported class format.
+#
+# CAVEATS
+# mkitlcman does not work with normal Tk or Tcl script files.
+# It expects only one class per file. In addition, it does not work on
+# namespace files.
+
+proc init { } {
+ global _className
+ global _inheritClass
+ global _publicMethod
+ global _publicVariable
+ global _protectedMethod
+ global _protectedVariable
+ global _privateMethod
+ global _privateVariable
+ global _options
+
+ set _className {}
+ set _inheritClass {}
+
+}
+proc namespace { args } {
+ global _className
+
+ set _className [lindex $args 0]
+ set classBody [lindex $args 1]
+
+ eval $classBody
+}
+proc class { args } {
+ global _className
+
+ set _className [lindex $args 0]
+ set classBody [lindex $args 1]
+
+ eval $classBody
+}
+proc itk_option { action switch args } {
+ global _options
+
+ if { $action == "define" } {
+ set _options($switch) $args
+ }
+}
+proc inherit { inheritClass } {
+ global _inheritClass
+ set _inheritClass $inheritClass
+}
+
+# default is public method
+proc method { name args } {
+ global _publicMethod
+
+ set _publicMethod($name) $args
+}
+
+# pick up arrays later...
+proc common { name args } {
+ global _commonVariable
+
+ # set to defaults
+ set _commonVariable($name) $args
+}
+
+proc public { type args } {
+ global _publicMethod
+ global _publicVariable
+
+ switch $type {
+ method {
+ set _publicMethod([lindex $args 0]) [lindex $args 1]
+ }
+ variable {
+ # _publicVariable(varName) = defaultValue
+ set _publicVariable([lindex $args 0]) [lindex $args 1]
+ }
+ }
+}
+
+proc protected { type args } {
+ global _protectedMethod
+ global _protectedVariable
+
+ switch $type {
+ method {
+ # _protectedMethod(methodName) = argList
+ set _protectedMethod([lindex $args 0]) [lrange $args 1 end]
+ }
+ variable {
+ # _protectedVariable(varName) = defaultValue
+ set _protectedVariable([lindex $args 0]) [lindex $args 1]
+ }
+ }
+}
+
+proc private { type args } {
+ global _privateMethod
+ global _privateVariable
+
+ switch $type {
+ method {
+ # _privateMethod(methodName) = argList
+ set _privateMethod([lindex $args 0]) [lrange $args 1 end]
+ }
+ variable {
+ # _privateVariable(varName) = defaultValue
+ set _privateVariable([lindex $args 0]) [lindex $args 1]
+ }
+ }
+}
+
+proc body { args } {
+}
+
+proc configbody { args } {
+}
+
+proc destructor { args } {
+}
+proc constructor { args } {
+}
+
+proc gen { } {
+ global _className
+ global _classBody
+ global _inheritClass
+ global _publicMethod
+ global _publicVariable
+ global _protectedMethod
+ global _protectedVariable
+ global _privateMethod
+ global _privateVariable
+ global _methodSection
+ global _optionSection
+ global _manpage
+ global _optionManFmt
+ global _methodManFmt
+ global _method
+ global _options
+ global _optionSwitch
+ global _optionName
+ global _optionClass
+
+ if { $_inheritClass != {} } {
+ set _inheritClass "$_inheritClass <-"
+ }
+ set _optionManFmt {}
+ set _methodManFmt {}
+ set _methodArgs {}
+ foreach pbv [lsort [array names _publicVariable]] {
+ set _optionSwitch "-$pbv"
+ set _optionName $pbv
+ set _optionClass "[string toupper [string index $pbv 0]][string range $pbv 1 end]"
+ lappend _optionManFmt [subst -nobackslash -nocommand $_optionSection]
+ }
+
+ foreach opt [lsort [array names _options]] {
+ set _optionSwitch $opt
+ set _optionName [lindex $_options($opt) 0]
+ set _optionClass [lindex $_options($opt) 1]
+ lappend _optionManFmt [subst -nobackslash -nocommand $_optionSection]
+ }
+ foreach pbm [lsort [array names _publicMethod]] {
+ set _method $pbm
+ eval set _methodArgs [list $_publicMethod($pbm)]
+ lappend _methodManFmt [subst -nobackslash -nocommand $_methodSection]
+ }
+ foreach ptm [lsort [array names _protectedMethod]] {
+ }
+ foreach ptv [lsort [array names _protectedVariable]] {
+ }
+ foreach pvm [lsort [array names _privateMethod]] {
+ }
+ foreach pvv [lsort [array names _privateVariable]] {
+ }
+
+ set _methodManFmt [join $_methodManFmt " "]
+ set _optionManFmt [join $_optionManFmt " "]
+
+ set _manpage [subst -nobackslash -nocommand $_manpage]
+
+ puts $_manpage
+}
+
+set _manpage {
+'\"
+'\" Copyright (c) _AUTHOR_
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) $_className.n
+'/"
+.so man.macros
+.HS $_className iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+'\"
+'\"
+.SH NAME
+$_className \- _NAME_DESCRIPTION_
+.SH SYNOPSIS
+\fB$_className\fI \fIpathName\fR ?\fIoptions\fR?
+.SH "INHERITANCE"
+$_inheritClass $_className
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+_STANDARD_OPTIONS_
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "ASSOCIATED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+_ASSOCIATED_OPTIONS_
+.fi
+.LP
+See the "_ASSOCIATED_WIDGET_" widget manual entry for details on the above
+associated options.
+.SH "INHERITED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+_INHERITED_OPTIONS_
+.fi
+.LP
+See the "_INHERITED_WIDGET_" class manual entry for details on the inherited options.
+.SH "WIDGET-SPECIFIC OPTIONS"
+.LP
+$_optionManFmt
+.BE
+.SH DESCRIPTION
+.PP
+_DESCRIPTION_
+.SH "METHODS"
+.PP
+The \fB$_className\fR command creates a new Tcl command whose
+name is \fIpathName\fR. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIOption\fR and the \fIarg\fRs
+determine the exact behavior of the command. The following
+commands are possible for $_className widgets:
+.SH "ASSOCIATED METHODS"
+.LP
+.nf
+.ta 4c 8c 12c
+_ASSOCIATED_METHODS_
+.fi
+.LP
+See the "_ASSOCIATED_WIDGET_" manual entry for details on the standard methods.
+.SH "WIDGET-SPECIFIC METHODS"
+$_methodManFmt
+.SH "COMPONENTS"
+.LP
+.nf
+Name: \fB_COMPONENT_NAME_\fR
+Class: \fB_COMPONENT_CLASS_\fR
+.fi
+.IP
+_COMPONENT_DESCRIPTION_
+See the "_COMPONENT_TYPE_" widget manual entry for details on the _COMPONENT_NAME_ component item.
+.fi
+.SH EXAMPLE
+.DS
+_EXAMPLE_CODE_
+.DE
+.SH AUTHOR
+_AUTHOR_
+.SH KEYWORDS
+_KEYWORDS_
+}
+
+set _optionSection {
+.nf
+Name: \fB$_optionName\fR
+Class: \fB$_optionClass\fR
+Command-Line Switch: \fB$_optionSwitch\fR
+.fi
+.IP
+_OPTION_DESCRIPTION_
+.LP
+}
+
+set _methodSection {
+.TP
+\fIpathName\fR \fB$_method\fR \fI$_methodArgs\fR
+_METHOD_DESCRIPTION_
+}
+
+# Add these two lines up into the man page above to enable
+
+init
+source [lindex $argv 0]
+gen
+exit
diff --git a/iwidgets/doc/notebook.n b/iwidgets/doc/notebook.n
new file mode 100644
index 00000000000..a356b8aea88
--- /dev/null
+++ b/iwidgets/doc/notebook.n
@@ -0,0 +1,321 @@
+'\"
+'\" Copyright (c) 1995 DSC Technologies Corporation
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) notebook.n
+'\"
+.so man.macros
+.HS iwidgets::notebook iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+'\"
+'\"
+.SH NAME
+iwidgets::notebook \- create and manipulate notebook widgets
+.SH SYNOPSIS
+\fBiwidgets::notebook\fR \fIpathName\fR ?\fIoptions\fR?
+.SH "INHERITANCE"
+itk::Widget <- iwidgets::Notebook
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBbackground\fR \fBforeground\fR \fBscrollCommand\fR \fBwidth\fR
+\fBcursor\fR \fBheight\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "WIDGET-SPECIFIC OPTIONS"
+.LP
+.nf
+Name: \fBauto\fR
+Class: \fBAuto\fR
+Command-Line Switch: \fB-auto\fR
+.fi
+.IP
+Specifies whether to use the automatic packing/unpacking algorithm of the
+notebook. A value of \fBtrue\fR indicates that page frames will be unpacked
+and packed acoording to the algorithm described in the \fBselect\fR command.
+A value of \fBfalse\fR leaves the current page packed and subsequent selects,
+next, or previous commands do not switch pages automatically. In either
+case the page's associated command (see the \fBadd\fR command's description
+of the \fBcommand\fR option) is invoked. The value may have any of the
+forms accepted by the \fBTcl_GetBoolean\fR, such as true, false, 0, 1, yes,
+or no.
+.IP
+For example, if a series of pages in a notebook simply change certain display
+configurations of a graphical display, the \fB-auto\fR flag could be used.
+By setting it, the \fB-command\fR procs could do the appropriate reconfiguring
+of the page when the page is switched.
+.BE
+.SH DESCRIPTION
+.PP
+The \fBiwidgets::notebook\fR command creates a new window (given by the pathName
+argument) and makes it into a notebook widget. Additional options, described
+above may be specified on the command line or in the option database to
+configure aspects of the notebook such as its colors, font, and text.
+The \fBiwidgets::notebook\fR command returns its \fIpathName\fR argument. At the time
+this command is invoked, there must not exist a window named pathName, but
+pathName's parent must exist.
+
+A notebook is a widget that contains a set of pages. It displays one page from
+the set as the selected page. When a page is selected, the page's contents are
+displayed in the page area. When first created a notebook has no pages. Pages
+may be added or deleted using widget commands described below.
+
+.SH "NOTEBOOK PAGES"
+.PP
+A notebook's pages area contains a single child site \fBframe\fR. When a new
+page is created it is a child of this frame. The page's child site frame
+serves as a geometry container for applications to pack widgets into. It is
+this frame that is automatically unpacked or packed when the \fBauto\fR
+option is \fBtrue\fR. This creates the effect of one page being visible at
+a time. When a new page is selected, the previously selected page's child
+site frame is automatically unpacked from the notebook's child site frame
+and the newly selected page's child site is packed into the notebook's
+child site frame.
+
+However, sometimes it is desirable to handle page changes in a different
+manner. By specifying the \fBauto\fR option as \fBfalse\fR, child site
+packing can be disabled and done differently. For example, all widgets might
+be packed into the first page's child site frame. Then when a new page is
+selected, the application can reconfigure the widgets and give the appearance
+that the page was flipped.
+
+In both cases the \fBcommand\fR option for a page specifies a Tcl Command to
+execute when the page is selected. In the case of \fBauto\fR being \fBtrue\fR,
+it is called between the unpacking of the previously selected page and the
+packing of the newly selected page.
+
+.SH "WIDGET-SPECIFIC METHODS"
+.PP
+The \fBiwidgets::notebookfR command creates a new Tcl command whose name
+is \fIpathName\fR. This command may be used to invoke various operations
+on the widget. It has the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIoption\fR and the \fIarg\fRs
+determine the exact behavior of the command.
+.PP
+Many of the widget commands for a notebook take as one argument an indicator
+of which page of the notebook to operate on. These indicators are called
+indexes and may be specified in any of the following forms:
+.TP
+\fInumber\fR
+Specifies the index of the the component. For menus, 0 corresponds to the
+left-most menu of the menu bar. For entries, 0 corresponds to the top-most
+entry of the menu.
+\fInumber\fR
+Specifies the page numerically, where 0 corresponds to the first page in
+the notebook, 1 to the second, and so on.
+.TP
+\fBselect\fR
+Specifies the currently selected page's index. If no page is currently
+selected, the value -1 is returned.
+.TP
+\fBend\fR
+Specifes the last page in the notebooks's index. If the notebook is empty
+this will return -1.
+.TP
+\fIpattern\fR
+If the index doesn't satisfy the form of a number, then this form is used.
+Pattern is pattern-matched against the \fBlabel\fR of each page in the
+notebook, in order from the first to the last page, until a matching entry
+is found. The rules of \fBTcl_StringMatch\fR are used.
+.PP
+'.............................................................................
+The following commands are possible for notebook widgets:
+.TP
+\fIpathName\fR \fBadd\fR ?\fIoption value\fR?
+Add a new page at the end of the notebook. A new child site frame is
+created. Returns the child site pathName. If additional arguments are
+present, they specify any of the following options:
+.RS
+.TP
+\fB-background\fR \fIvalue\fR
+Specifies a background color to use for displaying the child site frame
+of this page. If this option is specified as an empty string (the default),
+then the background option for the overall notebook is used.
+.TP
+\fB-command\fR \fIvalue\fR
+Specifies a Tcl command to be executed when this page is selected. This
+allows the programmer a hook to reconfigure this page's widgets or any other
+page's widgets.
+.IP
+If the notebook has the auto option set to true, when a page is selected
+this command will be called immediately after the previously selected page
+is unpacked and immediately before this page is selected. The index value
+select is valid during this Tcl command. `index select' will return this
+page's page number.
+.IP
+If the auto option is set to false, when a page is selected the unpack and
+pack calls are bypassed. This Tcl command is still called.
+.TP
+\fB-foreground\fR \fIvalue\fR
+Specifies a foreground color to use for displaying tab labels when tabs are
+in their normal unselected state. If this option is specified as an empty
+string (the default), then the foreground option for the overall notebook
+is used.
+.TP
+\fB-label\fR \fIvalue\fR
+Specifies a string to associate with this page. This label serves as an
+additional identifier used to reference the page. This label may be used
+for the index value in widget commands.
+.RE
+.TP
+\fIpathName\fR \fBchildSite\fR ?\fIindex\fR?
+If passed no arguments, returns a list of pathNames for all the pages in
+the notebook. If the notebook is empty, an empty list is returned
+.IP
+If index is passed, it returns the pathName for the page's child site
+frame specified by index. Widgets that are created with this pathName will
+be displayed when the associated page is selected. If index is not a valid
+index, an empty string is returned.
+.TP
+\fIpathName\fR \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given by \fIoption\fR.
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue\fR \fIoption\fR \fIvalue\fR ...?
+Query or modify the configuration options of the widget. If no \fIoption\fR
+is specified, returns a list describing all of the available options
+for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for information on the
+format of this list). If \fIoption\fR is specified with no \fIvalue\fR,
+then the command returns a list describing the one named option (this
+list will be identical to the corresponding sublist of the value returned
+if no option is specified). If one or more option-value pairs are specified,
+then the command modifies the given widget option(s) to have the given
+value(s); in this case the command returns an empty string. \fIOption\fR
+may have any of the values accepted by the \fBiwidgets::notebook\fR command.
+.TP
+\fIpathName\fR \fBdelete\fR \fIindex1\fR ?i\fRndex2?
+Delete all of the pages between \fIindex1\fR and \fIindex2\fR inclusive.
+If \fIindex2\fR is omitted then it defaults to \fIindex1\fR. Returns an
+empty string.
+.TP
+\fIpathName\fR \fBindex\fR \fIindex\fR
+Returns the numerical index corresponding to \fIindex\fR.
+.TP
+\fBpathName\fR \fBinsert\fR \fIindex\fR ?\fIoption\fR \fIvalue\fR?
+Insert a new page in the notebook before the page specified by \fIindex\fR.
+A new child site \fBframe\fR is created. See the \fBadd\fR command for
+valid options. Returns the child site pathName.
+.TP
+\fIpathName\fR \fBnext\fR
+Advances the selected page to the next page (order is determined by insertion
+order). If the currently selected page is the last page in the notebook,
+the selection wraps around to the first page in the notebook.
+.IP
+For notebooks with auto set to true the current page's child site is
+unpacked from the notebook's child site frame. Then the next page's child
+site is packed into the notebooks child site frame. The Tcl command given
+with the command option will be invoked between these two operations.
+.IP
+For notebooks with auto set to false the Tcl command given with the
+command option will be invoked.
+.TP
+\fIpathName\fR \fBpagecget\fR \fIindex\fR ?\fIoption\fR?
+Returns the current value of the configuration option given by \fIoption\fR
+for the page specified by \fIindex\fR. The valid available options are the
+same as available to the \fBadd\fR command.
+.TP
+\fIpathName\fR \fBpageconfigure\fR \fIindex\fR ?\fIoption\fR? ?\fIvalue\fR \fIoption\fR \fIvalue\fR ...?
+This command is similar to the configure command, except that it applies to
+the options for an individual page, whereas configure applies to the options
+for the notebook. Options may have any of the values accepted by the add
+widget command. If options are specified, options are modified as indicated
+in the command and the command returns an empty string. If no options are
+specified, returns a list describing the current options for
+page \fIindex\fR (see \fBTk_ConfigureInfo\fR for information on the
+format of this list).
+.TP
+\fIpathName\fR \fBprev\fR
+Moves the selected page to the previous page (order is determined by
+insertion order). If the currently selected page is the first page in the
+notebook, the selection wraps around to the last page in the notebook.
+.IP
+For notebooks with \fBauto\fR set to \fBtrue\fR the current page's child
+site is unpacked from the notebook's child site frame. Then the previous
+page's child site is packed into the notebooks child site frame. The Tcl
+command given with the command option will be invoked between these two
+operations.
+.IP
+For notebooks with \fBauto\fR set to \fBfalse\fR the Tcl command given with
+the command option will be invoked.
+.TP
+\fIpathName\fR \fBselect\fR \fIindex\fR
+Selects the page specified by \fIindex\fR as the currently selected page.
+.IP
+For notebooks with \fBauto\fR set to \fBtrue\fR the current page's child
+site is unpacked from the notebook's child site frame. Then the index page's
+child site is packed into the notebooks child site frame. The Tcl command
+given with the command option will be invoked between these two operations.
+.IP
+For notebooks with \fBauto\fR set to \fBfalse\fR the Tcl command given with
+the command option will be invoked.
+.TP
+\fIpathName\fR \fBview\fR
+Returns the currently selected page. This command is for compatibility
+with the scrollbar widget.
+.TP
+\fIpathName\fR \fBview\fR \fIindex\fR
+Selects the page specified by \fIindex\fR as the currently selected page.
+This command is for compatibility with the scrollbar widget.
+.TP
+\fIpathName\fR \fBview\fR \fImoveto\fR \fIfraction\fR
+Uses the fraction value to determine the corresponding page to move to.
+This command is for compatibility with the scrollbar widget.
+.TP
+\fIpathName\fR \fBview\fR \fIscroll\fR \fInum\fR \fIwhat\fR
+Uses the \fInum\fR value to determine how many pages to move forward or
+backward (num can be negative or positive). The \fIwhat\fR argument is
+ignored. This command is for compatibility with the scrollbar widget.
+
+.SH EXAMPLE
+.PP
+Following is an example that creates a notebook with two pages. In this example, we use a scrollbar widget to control the notebook widget.
+.nf
+.IP
+.ta 2c 8c 12c
+.DS
+package require Iwidgets 4.0
+# Create the notebook widget and pack it.
+ iwidgets::notebook .nb -width 100 -height 100
+ pack .nb -anchor nw \\
+ -fill both \\
+ -expand yes \\
+ -side left \\
+ -padx 10 \\
+ -pady 10
+.IP
+# Add two pages to the notebook, labelled
+# "Page One" and "Page Two", respectively.
+ .nb add -label "Page One"
+ .nb add -label "Page Two"
+.IP
+# Get the child site frames of these two pages.
+ set page1CS [.nb childsite 0]
+ set page2CS [.nb childsite "Page Two"]
+.IP
+# Create buttons on each page of the notebook
+ button $page1CS.b -text "Button One"
+ pack $page1CS.b
+ button $page2CS.b -text "Button Two"
+ pack $page2CS.b
+.IP
+# Select the first page of the notebook
+ .nb select 0
+.IP
+# Create the scrollbar and associate teh scrollbar
+# and the notebook together, then pack the scrollbar
+ scrollbar .scroll -command ".nb view"
+ .nb configure -scrollcommand ".scroll set"
+ pack .scroll -fill y -expand yes -pady 10
+.DE
+.fi
+.SH AUTHOR
+Bill W. Scott
+.SH KEYWORDS
+notebook page
diff --git a/iwidgets/doc/optionmenu.n b/iwidgets/doc/optionmenu.n
new file mode 100644
index 00000000000..5c2d1067fc3
--- /dev/null
+++ b/iwidgets/doc/optionmenu.n
@@ -0,0 +1,261 @@
+'\"
+'\" Copyright (c) 1995 DSC Technologies Corporation
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) optionmenu.n 1.21 94/12/17 16:04:44
+'\"
+.so man.macros
+.HS iwidgets::optionmenu iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+iwidgets::optionmenu \- Create and manipulate a option menu widget
+.SH SYNOPSIS
+\fBiwidgets::optionmenu\fI \fIpathName \fR?\fIoptions\fR?
+.SH "INHERITANCE"
+itk::Widget <- iwidgets::Labeledwidget <- iwidgets::Optionmenu
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fB
+activeBackground activeBorderWidth activeForeground background
+borderWidth cursor disabledForeground font
+foreground highlightColor highlightThickness relief\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "INHERITED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBdisabledForeground\fR \fBlabelBitmap\fR \fBlabelFont\fR \fBlabelImage\fR
+\fBlabelMargin\fR \fBlabelPos\fR \fBlabelText\fR \fBlabelVariable\fR
+\fBstate\fR \fBsticky\fR
+.fi
+.LP
+See the "LabeledWidget" manual entry for details on the inherited options.
+.SH "WIDGET-SPECIFIC OPTIONS"
+.LP
+.nf
+Name: \fBclickTime\fR
+Class: \fBClickTime\fR
+Command-Line Switch: \fB-clicktime\fR
+.fi
+.IP
+Interval time, in msec, used to determine that a single mouse
+click has occurred. Used to post menu on a "quick" mouse click.
+\fBNote\fR: changing this value may cause the sigle-click
+functionality to not work properly. The default is 150 msec.
+.LP
+.nf
+Name: \fBcommand\fR
+Class: \fBCommand\fR
+Command-Line Switch: \fB-command\fR
+.fi
+.IP
+Specifies a Tcl command procedure to be evaluated following a change in
+the current option menu selection.
+.LP
+.nf
+Name: \fBcyclicOn\fR
+Class: \fBCyclicOn\fR
+Command-Line Switch: \fB-cyclicon\fR
+.fi
+.IP
+Turns on/off the 3rd mouse button capability. The value may be specified
+in any of the forms acceptable to \fBTcl_GetBoolean\fR. This feature
+allows the right mouse button to cycle through the popup
+menu list without poping it up. The right mouse button cycles through
+the menu in reverse order. The default is true.
+.LP
+.nf
+Name: \fBpopupCursor\fR
+Class: \fBCursor\fR
+Command-Line Switch: \fB-popupcursor\fR
+.fi
+.IP
+Specifies the mouse cursor to be used for the popup menu. The value may
+have any of the forms acceptable to \fBTk_GetCursor\fR.
+.LP
+.nf
+Name: \fBstate\fR
+Class: \fBState\fR
+Command-Line Switch: \fB-state\fR
+.fi
+.IP
+Specified one of two states for the optionmenu: \fBnormal\fR, or
+\fBdisabled\fR. If the optionmenu is disabled, then option menu
+selection is ignored.
+.LP
+.nf
+Name: \fBwidth\fR
+Class: \fBWidth\fR
+Command-Line Switch: \fB-width\fR
+.fi
+.IP
+Specifies a fixed size for the menu button label in any of the forms
+acceptable to \Tk_GetPixels\fR. If the text
+is too small to fit in the label, the text is clipped.
+Note: Normally, when a new list is created, or new items are
+added to an existing list, the menu button label is resized
+automatically. Setting this option overrides that functionality.
+.LP
+.BE
+
+.SH DESCRIPTION
+.PP
+The \fBiwidgets::optionmenu\fR command creates an option menu widget with options
+to manage it. An option menu displays a frame containing a label and a button.
+A pop-up menu will allow for the value of the button to change.
+
+.SH "METHODS"
+.PP
+The \fBiwidgets::optionmenu\fR command creates a new Tcl command whose
+name is \fIpathName\fR. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+.DS
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIOption\fR and the \fIarg\fRs
+determine the exact behavior of the command.
+.PP
+Many of the widget commands for an optionmenu take as one argument an
+indicator of which entry of the option menu to operate on. These
+indicators are called \fIindex\fRes and may be specified in
+any of the following forms:
+.TP 12
+\fInumber\fR
+Specifies the entry numerically, where 0 corresponds
+to the top-most entry of the option menu, 1 to the entry below it, and
+so on.
+.TP 12
+\fBend\fR
+Indicates the bottommost entry in the menu. If there are no
+entries in the menu then -1 is returned.
+.TP 12
+\fBselect\fR
+Returns the numerical index of the currently selected option menu entry.
+If no entries exist in the menu, then -1 is returned.
+.TP 12
+\fIpattern\fR
+If the index doesn't satisfy one of the above forms then this
+form is used. \fIPattern\fR is pattern-matched against the label of
+each entry in the option menu, in order from the top down, until a
+matching entry is found. The rules of \fBTcl_StringMatch\fR
+are used.
+.PP
+The following widget commands are possible for optionmenu widgets:
+
+.SH "WIDGET-SPECIFIC METHODS"
+.TP
+\fIpathName \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given
+by \fIoption\fR.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::optionmenu\fR
+command.
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR?
+Query or modify the configuration options of the widget.
+If no \fIoption\fR is specified, returns a list describing all of
+the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for
+information on the format of this list). If \fIoption\fR is specified
+with no \fIvalue\fR, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no \fIoption\fR is specified). If
+one or more \fIoption\-value\fR pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::optionmenu\fR
+command.
+.TP
+\fIpathName \fBdelete \fIfirst\fR ?\fIlast\fR?
+Delete all of the option menu entries between \fIfirst\fR and
+\fIlast\fR inclusive. If \fIlast\fR is omitted then it defaults
+to \fIfirst\fR.
+.TP
+\fIpathName \fBdisable \fIindex\fR
+Disable the option menu entry specified by \fIindex\fR.
+Disabling a menu item will prevent the user from being able to select
+this item from the menu. This only effects the state of the item
+in the menu, in other words, should the item be the currently
+selected item, the programmer is responsible for determining this condition
+and taking appropriate action.
+.TP
+\fIpathName \fBenable \fIindex\fR
+Enable the option menu entry specified by \fIindex\fR.
+Enabling a menu item allows the user to select this item from the menu.
+.TP
+\fIpathName \fBget\fR ?\fIfirst\fR? ?\fIlast\fR?
+If no arguments are specified, this operation returns the currently
+selected option menu item. Otherwise, it returns the name of the
+option at index \fIfirst\fR, or a range of options between \fIfirst\fR
+and \fIlast\fR.
+.TP
+\fIpathName \fBindex \fIindex\fR
+Returns the numerical index corresponding to \fIindex\fR.
+.TP
+\fIpathName \fBinsert \fIindex string\fR ?\fIstring\fR?
+Insert an item, or list of items, into the menu at location \fIindex\fR.
+.TP
+\fIpathName \fBselect \fIindex\fR
+Select an item from the option menu to be displayed as the currently
+selected item.
+.TP
+\fIpathName \fBsort \fImode\fR
+Sort the current menu in either \fBascending\fR, or \fBdescending\fR order.
+The values \fBincreasing\fR, or \fBdecreasing\fR are also accepted.
+
+.SH "COMPONENTS"
+.LP
+.nf
+Name: \fBmenuBtn\fR
+Class: \fBMenubutton\fR
+.fi
+.IP
+The menuBtn component is the option menu button which displays the current
+choice from the popup menu. See the "menubutton" widget manual entry
+for details on the menuBtn component item.
+.LP
+.nf
+Name: \fBpopupMenu\fR
+Class: \fBMenu\fR
+.fi
+.IP
+The popupMenu component is menu displayed upon selection of the menu button.
+The menu contains the choices for the option menu. See the "menu" widget
+manual entry for details on the popupMenu component item.
+.fi
+
+.SH EXAMPLE
+.DS
+ package require Iwidgets 4.0
+ iwidgets::optionmenu .om -labelmargin 5 \\
+ -labelon true -labelpos w -labeltext "Operating System :"
+
+ .om insert end Unix VMS Linux OS/2 {Windows NT} DOS
+ .om sort ascending
+ .om select Linux
+
+ pack .om -padx 10 -pady 10
+.DE
+.SH ACKNOWLEDGEMENTS:
+Michael J. McLennan
+.IP
+Borrowed some ideas (next & previous) from OptionButton class.
+.LP
+Steven B. Jaggers
+.IP
+Provided an initial prototype in [incr Tcl].
+.LP
+Bret Schuhmacher
+.IP
+Helped with popup menu functionality.
+.LP
+.SH AUTHOR
+Alfredo Jahn
+.SH KEYWORDS
+optionmenu, widget
diff --git a/iwidgets/doc/panedwindow.n b/iwidgets/doc/panedwindow.n
new file mode 100644
index 00000000000..a6a8d7d4dfd
--- /dev/null
+++ b/iwidgets/doc/panedwindow.n
@@ -0,0 +1,307 @@
+'\"
+'\" Copyright (c) 1995 DSC Technologies Corporation
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) panedwindow.n 1.21 94/12/17 16:04:44
+'\"
+.so man.macros
+.HS iwidgets::panedwindow iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+iwidgets::panedwindow \- Create and manipulate a paned window widget
+.SH SYNOPSIS
+\fBiwidgets::panedwindow\fI \fIpathName \fR?\fIoptions\fR?
+.SH "INHERITANCE"
+itk::Widget <- iwidgets::Panedwindow
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBbackground\fR \fBcursor\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "WIDGET-SPECIFIC OPTIONS"
+.LP
+.nf
+Name: \fBheight\fR
+Class: \fBHeight\fR
+Command-Line Switch: \fB-height\fR
+.fi
+.IP
+Specifies the overall height of the paned window in any of the forms
+acceptable to \fBTk_GetPixels\fR. The default is 10 pixels.
+.LP
+.nf
+Name: \fBorient\fR
+Class: \fBOrient\fR
+Command-Line Switch: \fB-orient\fR
+.fi
+.IP
+Specifies the orientation of the separators: \fBvertical\fR or
+\fBhorizontal\fR. The default is horizontal.
+.LP
+.nf
+Name: \fBsashBorderWidth\fR
+Class: \fBBorderWidth\fR
+Command-Line Switch: \fB-sashborderwidth\fR
+.fi
+.IP
+Specifies a value indicating the width of the 3-D border to draw
+around the outside of the sash in any of the forms acceptable to
+\fBTk_GetPixels\fR. The default is 2 pixels.
+.LP
+.nf
+Name: \fBsashCursor\fR
+Class: \fBCursor\fR
+Command-Line Switch: \fB-sashcursor\fR
+.fi
+.IP
+Specifies the type of cursor to be displayed in the sash. The default
+is crosshair.
+.LP
+.nf
+Name: \fBsashHeight\fR
+Class: \fBHeight\fR
+Command-Line Switch: \fB-sashheight\fR
+.fi
+.IP
+Specifies the height of the sash in any of the forms acceptable to
+\fBTk_GetPixels\fR. The default is 10 pixels.
+.LP
+.nf
+Name: \fBsashIndent\fR
+Class: \fBSashIndent\fR
+Command-Line Switch \fBsashindent\fR
+.fi
+.IP
+Specifies the placement of the sash along the panes in any of the forms
+acceptable to \fBTk_GetPixels\fR. A positive
+value causes the sash to be offset from the near (left/top) side
+of the pane, and a negative value causes the sash to be offset from
+the far (right/bottom) side. If the offset is greater than the
+width, then the sash is placed flush against the side. The
+default is -10 pixels.
+.LP
+.nf
+Name: \fBsashWidth\fR
+Class: \fBWidth\fR
+Command-Line Switch: \fB-sashwidth\fR
+.fi
+.IP
+Specifies the width of the sash in any of the forms acceptable to
+\fBTk_GetPixels\fR. The default is 10 pixels.
+.LP
+.nf
+Name: \fBshowHandle\fR
+Class: \fBShowHandle\fR
+Command-Line Switch: \fB-showhandle\fR
+.fi
+.IP
+Specifies whether or not to display the sashes on the window panes.
+The default is 1, and valid options are 0 and 1.
+.LP
+.nf
+Name: \fBthickness\fR
+Class: \fBThickness\fR
+Command-Line Switch: \fB-thickness\fR
+.fi
+.IP
+Specifies the thickness of the separators in any of the forms acceptable to
+\fBTk_GetPixels\fR. The default is 3 pixels.
+.LP
+.LP
+.nf
+Name: \fBwidth\fR
+Class: \fBWidth\fR
+Command-Line Switch: \fB-width\fR
+.fi
+.IP
+Specifies the overall width of the paned window in any of the forms
+acceptable to \fBTk_GetPixels\fR. The default is 10 pixels.
+.LP
+.BE
+
+.SH DESCRIPTION
+.PP
+The \fBiwidgets::panedwindow\fR command creates a multiple paned window widget
+capable of orienting the panes
+either vertically or horizontally. Each pane is itself a frame acting
+as a child site for other widgets. The border separating each pane
+contains a sash which allows user positioning of the panes relative to
+one another.
+
+.SH "METHODS"
+.PP
+The \fBiwidgets::panedwindow\fR command creates a new Tcl command whose
+name is \fIpathName\fR. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIOption\fR and the \fIarg\fRs
+determine the exact behavior of the command.
+.PP
+Many of the widget commands for the \fBpanedwindow\fR take as one argument an
+indicator of which pane of the paned window to operate on. These indicators
+are called \fIindexes\fR and allow reference and manipulation of panes
+regardless of their current map state. Paned window indexes may be
+specified in any of the following forms:
+.TP 12
+\fInumber\fR
+Specifies the pane numerically, where 0 corresponds to the nearest
+(top/left-most) pane of the paned window.
+.TP 12
+\fBend\fR
+Indicates the farthest (bottom/right-most) pane of the paned window.
+.TP 12
+\fIpattern\fR
+If the index doesn't satisfy one of the above forms then this
+form is used. \fIPattern\fR is pattern-matched against the tag of
+each pane in the panedwindow, in order from left/top to right/left,
+until a matching entry is found. The rules of \fBTcl_StringMatch\fR
+are used.
+
+.SH "WIDGET-SPECIFIC METHODS"
+.TP
+\fIpathName \fBadd\fR \fItag\fR ?\fIoption value option value\fR?
+Adds a new pane to the paned window on the far side (right/bottom). The
+following options may be specified:
+.RS
+.TP
+\fB-margin\fR \fIvalue\fR
+Specifies the border distance between the pane and pane contents is any of
+the forms acceptable to \fBTk_GetPixels\fR. The default is 8 pixels.
+.TP
+\fB-minimum\fR \fIvalue\fR
+Specifies the minimum size that a pane's contents may reach not
+inclusive of twice the margin in any of the forms acceptable to
+\fBTk_GetPixels\fR. The default is 10 pixels.
+
+The \fBadd\fR method returns the path name of the pane.
+.RE
+.TP
+\fIpathName \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given
+by \fIoption\fR.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::panedwindow\fR
+command.
+.TP
+\fIpathName \fBchildsite\fR ?\fIindex\fR?
+Returns a list of the child site path names or a specific child site given
+an index. The list is constructed from the near side (left/top) to the far
+side (right/bottom).
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR?
+Query or modify the configuration options of the widget.
+If no \fIoption\fR is specified, returns a list describing all of
+the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for
+information on the format of this list). If \fIoption\fR is specified
+with no \fIvalue\fR, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no \fIoption\fR is specified). If
+one or more \fIoption\-value\fR pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::panedwindow\fR
+command.
+.TP
+\fIpathName \fBdelete\fR \fIindex\fR
+Deletes a specified pane given an \fIindex\fR.
+.TP
+\fIpathName \fBfraction\fR \fIpercentage\fR \fIpercentage\fR ?\fIpercentage percentage ...\fR?
+Sets the visible percentage of the panes. Specifies a set of
+percentages which are applied to the visible panes from the near side
+(left/top). The number of percentages must be equal to the current number
+of visible (mapped) panes and add up to 100.
+.TP
+\fIpathName \fBhide\fR \fIindex\fR
+Changes the visiblity of the specified pane, allowing a previously displayed
+pane to be visually removed rather than deleted.
+.TP
+\fIpathName \fBindex\fR \fIindex\fR
+Returns the numerical index corresponding to index.
+.TP
+\fIpathName \fBinsert \fIindex\fR \fItag\fR ?\fIoption value option value ...\fR?
+Same as the \fBadd\fR command except that it inserts the new
+pane just before the one given by \fIindex\fR, instead of appending
+to the end of the panedwindow. The \fIoption\fR, and \fIvalue\fR
+arguments have the same interpretation as for the \fBadd\fR widget
+command.
+.TP
+\fIpathName \fBpaneconfigure\fR \fIindex\fR ?\fIoptions\fR?
+This command is similar to the \fBconfigure\fR command, except that
+it applies to the options for an individual pane, whereas \fBconfigure\fR
+applies to the options for the paned window as a whole.
+\fIOptions\fR may have any of the values accepted by the \fBadd\fR
+widget command. If \fIoptions\fR are specified, options are modified
+as indicated in the command and the command returns an empty string.
+If no \fIoptions\fR are specified, returns a list describing
+the current options for entry \fIindex\fR (see \fBTk_ConfigureInfo\fR for
+information on the format of this list).
+.TP
+\fIpathName \fBreset\fR
+Redisplays the pane window using default percentages.
+.TP
+\fIpathName \fBshow\fR \fIindex\fR
+Changes the visiblity of the specified pane, allowing a previously hidden
+pane to be displayed.
+
+.SH "NOTES"
+.IP
+Dynamic changing of the margin and or minimum options to values which
+make the current configuration invalid will block subsequent sash
+movement until the fractions are modified via the fraction method.
+For example a panedwindow is created with three panes and the minimum
+and margin options are at their default settings. Next the user moves
+the sashes to compact the panes to one side. Now, if the minimum is
+increased on the most compressed pane via the paneconfigure method to
+a large enough value, then sash movement is blocked
+until the fractions are adjusted. This situation is unusual and under
+normal operation of the panedwindow, this problem will never occur.
+.LP
+
+.SH EXAMPLE
+.DS
+ package require Iwidgets 4.0
+ iwidgets::panedwindow .pw -width 300 -height 300
+ .pw add top
+ .pw add middle -margin 10
+ .pw add bottom -margin 10 -minimum 10
+
+ pack .pw -fill both -expand yes
+
+ foreach pane [.pw childSite] {
+ button $pane.b -text $pane -relief raised -borderwidth 2
+ pack $pane.b -fill both -expand yes
+ }
+
+ .pw fraction 50 30 20
+ .pw paneconfigure 0 -minimum 20
+ .pw paneconfigure bottom -margin 15
+.DE
+.SH ACKNOWLEDGEMENTS:
+.LP
+Jay Schmidgall
+.IP
+1994 - Base logic posted to comp.lang.tcl
+.LP
+Joe Hidebrand <hildjj@fuentez.com>
+.IP
+07/25/94 - Posted first multipane version to comp.lang.tcl
+.LP
+.IP
+07/28/94 - Added support for vertical panes
+.LP
+Ken Copeland <ken@hilco.com>
+.IP
+09/28/95 - Smoothed out the sash movement and added squeezable panes.
+.LP
+.SH AUTHOR
+Mark L. Ulferts
+.SH KEYWORDS
+panedwindow, widget
diff --git a/iwidgets/doc/promptdialog.n b/iwidgets/doc/promptdialog.n
new file mode 100644
index 00000000000..ecacaed6195
--- /dev/null
+++ b/iwidgets/doc/promptdialog.n
@@ -0,0 +1,200 @@
+'\"
+'\" Copyright (c) 1995 DSC Technologies Corporation
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) promptdialog.n 1.21 94/12/17 16:04:44
+'\"
+.so man.macros
+.HS iwidgets::promptdialog iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+iwidgets::promptdialog \- Create and manipulate a prompt dialog widget
+.SH SYNOPSIS
+\fBiwidgets::promptdialog\fI \fIpathName \fR?\fIoptions\fR?
+.SH "INHERITANCE"
+itk::Toplevel <- iwidgets::Dialogshell <- iwidgets::Dialog <- iwidgets::Promptdialog
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fB
+background borderWidth cursor exportSelection
+foreground highlightColor highlightThickness insertBackground
+insertBorderWidth insertOffTime insertOnTime insertWidth
+relief selectBackground selectBorderWidth selectForeground\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "ASSOCIATED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBshow\fR
+.fi
+.LP
+See the "entry" widget manual entry for details on the above
+associated options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBinvalid\fR \fBtextBackground\fR \fBtextFont\fR \fBvalidate\fR
+.fi
+.LP
+See the "entryfield" widget manual entry for details on the above
+associated options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBlabelFont\fR \fBlabelPos\fR \fBlabelText\fR
+.fi
+.LP
+See the "labeledwidget" widget manual entry for details on the above
+associated options.
+.SH "INHERITED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBbuttonBoxPadX\fR \fBbuttonBoxPadY\fR \fBbuttonBoxPos\fR \fBpadX\fR
+\fBpadY\fR \fBseparator\fR \fBthickness\fR
+.fi
+.LP
+See the "dialogshell" widget manual entry for details on the above
+inherited options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBheight\fR \fBmaster\fR \fBmodality\fR \fBwidth\fR
+.fi
+.LP
+See the "shell" widget manual entry for details on the above
+inherited options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBtitle\fR
+.fi
+.LP
+See the "Toplevel" widget manual entry for details on the above
+inherited options.
+.LP
+.BE
+
+.SH DESCRIPTION
+.PP
+The \fBiwidgets::promptdialog\fR command creates a prompt dialog similar to the
+OSF/Motif standard prompt dialog composite widget. The promptdialog
+is derived from the dialog class and is composed of a EntryField
+with commands to manipulate the dialog buttons.
+
+.SH "METHODS"
+.PP
+The \fBiwidgets::promptdialog\fR command creates a new Tcl command whose
+name is \fIpathName\fR. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIOption\fR and the \fIarg\fRs
+determine the exact behavior of the command. The following
+commands are possible for promptdialog widgets:
+.SH "ASSOCIATED METHODS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBdelete\fR \fBget\fR \fBicursor\fR \fBindex\fR
+\fBinsert\fR \fBscan\fR \fBselection\fR \fBxview\fR
+.fi
+.LP
+See the "entry" widget manual entry for details on the above
+associated methods.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBclear\fR
+.fi
+.LP
+See the "entryfield" widget manual entry for details on the above
+associated methods.
+.SH "INHERITED METHODS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBadd\fR \fBbuttonconfigure\fR \fBdefault\fR \fBhide\fR
+\fBinvoke\fR \fBshow\fR
+.fi
+.LP
+See the "buttonbox" widget manual entry for details on the above
+inherited methods.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBchildsite\fR
+.fi
+.LP
+See the "dialogshell" widget manual entry for details on the above
+inherited methods.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBactivate\fR \fBcenter\fR \fBdeactivate\fR
+.fi
+.LP
+See the "shell" widget manual entry for details on the above
+inherited methods.
+
+.SH "WIDGET-SPECIFIC METHODS"
+.TP
+\fIpathName \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given
+by \fIoption\fR.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::promptdialog\fR
+command.
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR?
+Query or modify the configuration options of the widget.
+If no \fIoption\fR is specified, returns a list describing all of
+the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for
+information on the format of this list). If \fIoption\fR is specified
+with no \fIvalue\fR, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no \fIoption\fR is specified). If
+one or more \fIoption\-value\fR pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::promptdialog\fR
+command.
+
+.SH "COMPONENTS"
+.LP
+.nf
+Name: \fBprompt\fR
+Class: \fBEntryfield\fR
+.fi
+.IP
+The prompt component is the entry field for user input in the prompt
+dialog. See the "entryfield" widget manual entry for details on
+the prompt component item.
+.fi
+
+.SH EXAMPLE
+.DS
+ package require Iwidgets 4.0
+ option add *textBackground white
+
+ iwidgets::promptdialog .pd -modality global -title Password -labeltext Password: -show *
+ .pd hide Apply
+
+ if {[.pd activate]} {
+ puts "Password entered: [.pd get]"
+ } else {
+ puts "Password prompt cancelled"
+ }
+.DE
+.SH AUTHOR
+Mark L. Ulferts
+.SH KEYWORDS
+promptdialog, dialog, dialogshell, shell, widget
diff --git a/iwidgets/doc/pushbutton.n b/iwidgets/doc/pushbutton.n
new file mode 100644
index 00000000000..40d670f6178
--- /dev/null
+++ b/iwidgets/doc/pushbutton.n
@@ -0,0 +1,151 @@
+'\"
+'\" Copyright (c) 1995 DSC Technologies Corporation
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) pushbutton.n 1.21 94/12/17 16:04:44
+'\"
+.so man.macros
+.HS iwidgets::pushbutton iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+iwidgets::pushbutton \- Create and manipulate a push button widget
+.SH SYNOPSIS
+\fBiwidgets::pushbutton\fI \fIpathName \fR?\fIoptions\fR?
+.SH "INHERITANCE"
+itk::Widget <- iwidgets::Pushbutton
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fB
+activeBackground activeForeground background
+bitmap borderWidth command
+cursor disabledForeground font
+foreground highlightBackground highlightColor
+highlightThickness image padX
+padY state text
+underline wrapLength\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "WIDGET-SPECIFIC OPTIONS"
+.LP
+.nf
+Name: \fBdefaultRing\fR
+Class: \fBDefaultRing\fR
+Command-Line Switch: \fB-defaultring\fR
+.fi
+.IP
+Boolean describing whether the button displays its default ring given in
+any of the forms acceptable to \fBTcl_GetBoolean\fR. The default is false.
+.LP
+.nf
+Name: \fBdefaultRingPad\fR
+Class: \fBPad\fR
+Command-Line Switch: \fB-defaultringpad\fR
+.fi
+.IP
+Specifies the amount of space to be allocated to the indentation of the
+default ring ring given in any of the forms acceptable to \fBTcl_GetPixels\fR.
+The option has no effect if the defaultring option is set to false. The
+default is 2 pixels.
+.LP
+.nf
+Name: \fBheight\fR
+Class: \fBHeight\fR
+Command-Line Switch: \fB-height\fR
+.fi
+.IP
+Specifies the height of the button inclusive of any default ring given in
+any of the forms acceptable to \fBTk_GetPixels\fR. A value of zero lets
+the push button determine the height based on the requested height plus
+highlightring and defaultringpad.
+.LP
+.nf
+Name: \fBwidth\fR
+Class: \fBWidth\fR
+Command-Line Switch: \fB-width\fR
+.fi
+.IP
+Specifies the width of the button inclusive of any default ring given in
+any of the forms acceptable to \fBTk_GetPixels\fR. A value of zero lets
+the push button determine the width based on the requested width plus
+highlightring and defaultringpad.
+.LP
+.BE
+
+.SH DESCRIPTION
+.PP
+The \fBiwidgets::pushbutton\fR command creates a push button with an
+optional default ring used for default designation and traversal.
+
+.SH "METHODS"
+.PP
+The \fBiwidgets::pushbutton\fR command creates a new Tcl command whose
+name is \fIpathName\fR. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIOption\fR and the \fIarg\fRs
+determine the exact behavior of the command. The following
+commands are possible for pushbutton widgets:
+.SH "ASSOCIATED METHODS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBflash\fR \fBinvoke\fR
+.fi
+.LP
+See the "button" manual entry for details on the associated methods.
+
+.SH "WIDGET-SPECIFIC METHODS"
+.TP
+\fIpathName \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given
+by \fIoption\fR.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::pushbutton\fR
+command.
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR?
+Query or modify the configuration options of the widget.
+If no \fIoption\fR is specified, returns a list describing all of
+the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for
+information on the format of this list). If \fIoption\fR is specified
+with no \fIvalue\fR, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no \fIoption\fR is specified). If
+one or more \fIoption\-value\fR pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::pushbutton\fR
+command.
+
+.SH "COMPONENTS"
+.LP
+.nf
+Name: \fBpushbutton\fR
+Class: \fBButton\fR
+.fi
+.IP
+The pushbutton component is the button surrounded by the optional default ring.
+See the "button" widget manual entry for details on the pushbutton
+component item.
+.fi
+
+.SH EXAMPLE
+.DS
+package require Iwidgets 4.0
+iwidgets::pushbutton .pb -text "Hello" -command {puts "Hello World"} -defaultring 1
+pack .pb -padx 10 -pady 10
+.DE
+.SH AUTHOR
+Bret A. Schuhmacher
+.DE
+Mark L. Ulferts
+.SH KEYWORDS
+pushbutton, widget
diff --git a/iwidgets/doc/radiobox.n b/iwidgets/doc/radiobox.n
new file mode 100644
index 00000000000..a273fc1ebb3
--- /dev/null
+++ b/iwidgets/doc/radiobox.n
@@ -0,0 +1,180 @@
+'\"
+'\" Copyright (c) 1995 DSC Technologies Corporation
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) radiobox.n 1.21 94/12/17 16:04:44
+'\"
+.so man.macros
+.HS iwidgets::radiobox iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+iwidgets::radiobox \- Create and manipulate a radiobox widget
+.SH SYNOPSIS
+\fBiwidgets::radiobox\fI \fIpathName \fR?\fIoptions\fR?
+.SH "INHERITANCE"
+itk::Widget <- iwidgets::Labeledframe <- iwidgets::Radiobox
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBbackground\fR \fBborderWidth\fR \fBcursor\fR \fBdisabledForeground\fR
+\fBforeground\fR \fBrelief\fR \fBselectColor\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "INHERITED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBlabelBitmap\fR \fBlabelFont\fR \fBlabelImage\fR \fBlabelMargin\fR
+\fBlabelPos\fR \fBlabelText\fR \fBlabelVariable\fR
+.fi
+.LP
+See the "labeledframe" class manual entry for details on the
+inherited options.
+.SH "WIDGET-SPECIFIC OPTIONS"
+.LP
+.nf
+Name: \fBcommand\fR
+Class: \fBCommand\fR
+Command-Line Switch: \fB-command\fR
+.fi
+.IP
+Specifies a Tcl command procedure to be evaluated following a change in
+the current radio box selection.
+.LP
+.nf
+Name: \fBorient\fR
+Class: \fBOrient\fR
+Command-Line Switch: \fB-orient\fR
+Default Value: \fBvertical\fR
+.fi
+.IP
+Specifies the orientation of the radiobuttons within the radiobox. Valid
+values are either "horizontal" or "vertical".
+.LP
+.BE
+
+.SH DESCRIPTION
+.PP
+The \fBiwidgets::radiobox\fR command creates a radio button box widget
+capable of adding, inserting, deleting, selecting, and configuring
+radiobuttons as well as obtaining the currently selected button.
+
+.SH "METHODS"
+.PP
+The \fBiwidgets::radiobox\fR command creates a new Tcl command whose
+name is \fIpathName\fR. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIOption\fR and the \fIarg\fRs
+determine the exact behavior of the command.
+.PP
+Many of the widget commands for the \fBradiobox\fR take as one argument an
+indicator of which radiobutton of the radiobox to operate on. These indicators
+are called \fIindexes\fR and allow reference and manipulation of radiobuttons.
+Radiobox indexes may be specified in any of the following forms:
+.TP 12
+\fInumber\fR
+Specifies the radiobutton numerically, where 0 corresponds to the top
+radiobutton of the radiobox.
+.TP 12
+\fBend\fR
+Indicates the last radiobutton of the radiobox.
+.TP 12
+\fIpattern\fR
+If the index doesn't satisfy one of the above forms then this
+form is used. \fIPattern\fR is pattern-matched against the tag of
+each radiobutton in the radiobox, in order from top to bottom,
+until a matching entry is found. The rules of \fBTcl_StringMatch\fR
+are used.
+
+.SH "WIDGET-SPECIFIC METHODS"
+.TP
+\fIpathName \fBadd\fR \fItag\fR ?\fIoption value option value\fR?
+Adds a new radiobutton to the radiobuttond window on the bottom. The command
+takes additional options which are passed on to the radiobutton as construction
+arguments. These include the standard Tk radiobutton options. The tag is
+returned.
+.TP
+\fIpathName \fBbuttonconfigure\fR \fIindex\fR ?\fIoptions\fR?
+This command is similar to the \fBconfigure\fR command, except that
+it applies to the options for an individual radiobutton,
+whereas \fBconfigure\fRapplies to the options for the radiobox as a whole.
+\fIOptions\fR may have any of the values accepted by the \fBadd\fR
+widget command. If \fIoptions\fR are specified, options are modified
+as indicated in the command and the command returns an empty string.
+If no \fIoptions\fR are specified, returns a list describing
+the current options for entry \fIindex\fR (see \fBTk_ConfigureInfo\fR for
+information on the format of this list).
+.TP
+\fIpathName \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given
+by \fIoption\fR.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::radiobox\fR
+command.
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR?
+Query or modify the configuration options of the widget.
+If no \fIoption\fR is specified, returns a list describing all of
+the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for
+information on the format of this list). If \fIoption\fR is specified
+with no \fIvalue\fR, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no \fIoption\fR is specified). If
+one or more \fIoption\-value\fR pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::radiobox\fR
+command.
+.TP
+\fIpathName \fBdelete\fR \fIindex\fR
+Deletes a specified radiobutton given an \fIindex\fR.
+.TP
+\fIpathName \fBdeselect\fR \fIindex\fR
+Deselects a specified radiobutton given an \fIindex\fR.
+.TP
+\fIpathName \fBflash\fR \fIindex\fR
+Flashes a specified radiobutton given an \fIindex\fR.
+.TP
+\fIpathName \fBget\fR
+Returns the tag of the currently selected radiobutton.
+.TP
+\fIpathName \fBindex\fR \fIindex\fR
+Returns the numerical index corresponding to index.
+.TP
+\fIpathName \fBinsert \fIindex\fR \fItag\fR ?\fIoption value option value ...\fR?
+Same as the \fBadd\fR command except that it inserts the new
+radiobutton just before the one given by \fIindex\fR, instead of appending
+to the end of the radiobox. The \fIoption\fR, and \fIvalue\fR
+arguments have the same interpretation as for the \fBadd\fR widget
+command.
+.TP
+\fIpathName \fBselect\fR \fIindex\fR
+Selects a specified radiobutton given an \fIindex\fR.
+
+.SH EXAMPLE
+.DS
+ package require Iwidgets 4.0
+ iwidgets::radiobox .rb -labeltext Fonts
+ .rb add times -text Times
+ .rb add helvetica -text Helvetica
+ .rb add courier -text Courier
+ .rb add symbol -text Symbol
+ .rb select courier
+
+ pack .rb -padx 10 -pady 10 -fill both -expand yes
+.DE
+
+.SH AUTHOR
+Michael J. McLennan
+.DE
+Mark L. Ulferts
+.SH KEYWORDS
+radiobox, widget
diff --git a/iwidgets/doc/scopedobject.n b/iwidgets/doc/scopedobject.n
new file mode 100644
index 00000000000..c209b5951d4
--- /dev/null
+++ b/iwidgets/doc/scopedobject.n
@@ -0,0 +1,100 @@
+'\"
+'\" Copyright (c) 1997 DSC Technologies Corporation
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) scopedobject.n 1.21 97/1/30 16:04:44
+'\"
+.so man.macros
+.HS scopedobject iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+scopedobject \- Create and manipulate a scoped \[incr Tcl\] class object.
+.SH SYNOPSIS
+\fBscopedobject\fI \fIobjName \fR?\fIoptions\fR?
+.SH "INHERITANCE"
+None
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+Name: \fBenterscopecommand:\fR
+Command-Line Switch: \fB-enterscopecommand\fR
+.fi
+.IP
+Specifies a Tcl command to invoke when an object enters scope
+(i.e. when it is created..). The default is {}.
+.LP
+.nf
+Name: \fBenterscopecommand:\fR
+Command-Line Switch: \fB-enterscopecommand\fR
+.fi
+.IP
+Specifies a Tcl command to invoke when an object exits scope
+(i.e. when it is deleted..). The default is {}.
+.LP
+.BE
+
+.SH DESCRIPTION
+.PP
+The \fBscopedobject\fR command creates a base class for defining
+Itcl classes which posses scoped behavior like Tcl variables.
+The objects are only accessible within the procedure in which
+they are instantiated and are deleted when the procedure returns.
+This class was designed to be a general purpose base class for
+supporting scoped incr Tcl classes. The options include the
+execute a Tcl script command when an object enters and exits its
+scope.
+.SH "METHODS"
+.PP
+The \fBscopedobject\fR command creates a new Tcl command whose
+name is \fIpathName\fR. This
+command may be used to invoke various operations on the object.
+It has the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIOption\fR and the \fIarg\fRs
+determine the exact behavior of the command. The following
+commands are possible for scopedobject objects:
+.SH "OBJECT-SPECIFIC METHODS"
+.TP
+\fIpathName \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given
+by \fIoption\fR.
+\fIOption\fR may have any of the values accepted by the \fBscopedobject\fR
+command.
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR?
+Query or modify the configuration options of the object.
+If no \fIoption\fR is specified, returns a list describing all of
+the available options for \fIpathName\fR. If \fIoption\fR is specified
+with no \fIvalue\fR, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no \fIoption\fR is specified). If
+one or more \fIoption\-value\fR pairs are specified, then the command
+modifies the given objects option(s) to have the given value(s); in
+this case the command returns an empty string.
+\fIOption\fR may have any of the values accepted by the \fBscopedobject\fR
+command.
+
+.SH EXAMPLE
+.IP
+The scopedobject was primarily meant to be a base class. The
+following is an example of usage without inheritance:
+.LP
+.DS
+ proc scopedobject_demo {} {
+ iwidgets::scopedobject #auto \
+ -exitscopecommand {puts "enter scopedobject_demo"} \
+ -exitscopecommand {puts "exit scopedobject_demo"}
+ }
+
+ scopedobject_demo
+
+.DE
+.SH AUTHOR
+John A. Tucker
+.SH KEYWORDS
+scopedobject, object
diff --git a/iwidgets/doc/scrolledcanvas.n b/iwidgets/doc/scrolledcanvas.n
new file mode 100644
index 00000000000..3f95a3f7d48
--- /dev/null
+++ b/iwidgets/doc/scrolledcanvas.n
@@ -0,0 +1,257 @@
+'\"
+'\" Copyright (c) 1995 DSC Technologies Corporation
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) ScrolledListBox.n 1.21 94/12/17 16:04:44
+'\"
+.so man.macros
+.HS iwidgets::scrolledcanvas iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+iwidgets::scrolledcanvas \- Create and manipulate scrolled canvas widgets
+.SH SYNOPSIS
+\fBiwidgets::scrolledcanvas\fI \fIpathName \fR?\fIoptions\fR?
+.SH "INHERITANCE"
+itk::Widget <- iwidgets::Labeledwidget <- iwidgets::Scrolledwidget <- iwidgets::Scrolledcanvas
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fB
+activeBackground background borderWidth cursor
+exportSelection font foreground highlightColor
+highlightThickness insertBorderWidth insertOffTime insertOnTime
+insertWidth relief selectBackground selectBorderWidth
+selectForeground\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "ASSOCIATED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBcloseEnough\fR \fBconfine\fR \fBscrollRegion\fR \fBxScrollIncrement\fR
+\fByScrollIncrement\fR
+.fi
+.LP
+See the "canvas" widget manual entry for details on the above
+associated options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBactiveRelief\fR \fBelementBorderWidth\fR \fBjump\fR \fBtroughColor\fR
+.fi
+.LP
+See the "scrollbar" widget manual entry for details on the above
+associated options.
+.SH "INHERITED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBdisabledForeground\fR \fBlabelBitmap\fR \fBlabelFont\fR \fBlabelImage\fR
+\fBlabelMargin\fR \fBlabelPos\fR \fBlabelText\fR \fBlabelVariable\fR
+\fBstate\fR \fBsticky\fR
+.fi
+.LP
+See the "labeledwidget" class manual entry for details on the inherited options.
+.SH "WIDGET-SPECIFIC OPTIONS"
+.LP
+.nf
+Name: \fBautoMargin\fR
+Class: \fBAutoMargin\fR
+Command-Line Switch: \fB-automargin\fR
+.fi
+.IP
+Specifies the autoresize extra margin to reserve. This option is only
+effective with autoresize turned on. The default is 10.
+.LP
+.nf
+Name: \fBautoResize\fR
+Class: \fBAutoResize\fR
+Command-Line Switch: \fB-autoresize\fR
+.fi
+.IP
+Automatically adjusts the scrolled region to be the bounding
+box covering all the items in the canvas following the execution
+of any method which creates or destroys items. Thus, as new
+items are added, the scrollbars adjust accordingly.
+.LP
+.nf
+Name: \fBheight\fR
+Class: \fBHeight\fR
+Command-Line Switch: \fB-height\fR
+.fi
+.IP
+Specifies the height of the scrolled canvas widget in any of the forms
+acceptable to \fBTk_GetPixels\fR. The default height is 30 pixels.
+.LP
+.nf
+Name: \fBhscrollMode\fR
+Class: \fBScrollMode\fR
+Command-Line Switch: \fB-hscrollmode\fR
+.fi
+.IP
+Specifies the the display mode to be used for the horizontal
+scrollbar: \fBstatic, dynamic,\fR or \fBnone\fR. In static mode, the
+scroll bar is displayed at all times. Dynamic mode displays the
+scroll bar as required, and none disables the scroll bar display. The
+default is static.
+.LP
+.nf
+Name: \fBsbWidth\fR
+Class: \fBWidth\fR
+Command-Line Switch: \fB-sbwidth\fR
+.fi
+.IP
+Specifies the width of the scrollbar in any of the forms acceptable
+to \fBTk_GetPixels\fR. The default width is 15 pixels..
+.LP
+.nf
+Name: \fBscrollMargin\fR
+Class: \fBScrollMargin\fR
+Command-Line Switch: \fB-scrollmargin\fR
+.fi
+.IP
+Specifies the distance between the canvas and scrollbar in any of the
+forms acceptable to \fBTk_GetPixels\fR. The default is 3 pixels.
+.LP
+.nf
+Name: \fBtextBackground\fR
+Class: \fBBackground\fR
+Command-Line Switch \fB-textbackground\fR
+.fi
+.IP
+Specifies the background color for the canvas. This allows the background
+within the canvas to be different from the normal background color.
+.LP
+.nf
+Name: \fBvscrollMode\fR
+Class: \fBScrollMode\fR
+Command-Line Switch: \fB-vscrollmode\fR
+.fi
+.IP
+Specifies the the display mode to be used for the vertical
+scrollbar: \fBstatic, dynamic,\fR or \fBnone\fR. In static mode, the
+scroll bar is displayed at all times. Dynamic mode displays the
+scroll bar as required, and none disables the scroll bar display. The
+default is static.
+.LP
+.nf
+Name: \fBwidth\fR
+Class: \fBWidth\fR
+Command-Line Switch: \fB-width\fR
+.fi
+.IP
+Specifies the width of the scrolled canvas widget in any of the forms
+acceptable to \fBTk_GetPixels\fR. The default height is 30 pixels.
+.BE
+
+.SH DESCRIPTION
+.PP
+The \fBiwidgets::scrolledcanvas\fR command creates
+a scrolled canvas with additional options to manage
+horizontal and vertical scrollbars. This includes options to control
+which scrollbars are displayed and the method, i.e. statically or
+dynamically.
+
+.SH "METHODS"
+.PP
+The \fBiwidgets::scrolledcanvas\fR command creates a new Tcl command whose
+name is \fIpathName\fR. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIOption\fR and the \fIarg\fRs
+determine the exact behavior of the command. The following
+commands are possible for scrolledcanvas widgets:
+.SH "ASSOCIATED METHODS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBaddtag\fR \fBbbox\fR \fBbind\fR \fBcanvasx\fR
+\fBcanvasy\fB \fBcoords\fR \fBcreate\fR \fBdchars\fR
+\fBdelete\fR \fBdtag\fR \fBfind\fR \fBfocus\fR
+\fBgettags\fR \fBicursor\fR \fBindex\fR \fBinsert\fR
+\fBitemconfigure\fR \fBlower\fR \fBmove\fR \fBpostscript\fR
+\fBraise\fR \fBscale\fR \fBscan\fR \fBselect\fR
+\fBtype\fR \fBxview\fR \fByview\fR
+.fi
+.LP
+See the "canvas" manual entry for details on the associated methods.
+
+.SH "WIDGET-SPECIFIC METHODS"
+.TP
+\fIpathName \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given
+by \fIoption\fR.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::scrolledcanvas\fR
+command.
+.TP
+\fIpathName \fBchildsite\fR
+Returns the child site widget path name.
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR?
+Query or modify the configuration options of the widget.
+If no \fIoption\fR is specified, returns a list describing all of
+the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for
+information on the format of this list). If \fIoption\fR is specified
+with no \fIvalue\fR, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no \fIoption\fR is specified). If
+one or more \fIoption\-value\fR pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::scrolledcanvas\fR
+command.
+.TP
+\fIpathName \fBjustify \fIdirection\fR
+Justifies the canvas contents via the scroll bars in one of four directions:
+\fBleft\fR, \fBright\fR, \fBtop\fR, or \fBbottom\fR.
+
+.SH "COMPONENTS"
+.LP
+.nf
+Name: \fBcanvas\fR
+Class: \fBCanvas\fR
+.fi
+.IP
+The canvas component is the canvas widget. See the "canvas" widget
+manual entry for details on the canvas component item.
+.LP
+.nf
+Name: \fBhorizsb\fR
+Class: \fBScrollbar\fR
+.fi
+.IP
+The horizsb component is the horizontal scroll bar. See the "ScrollBar"
+widget manual entry for details on the horizsb component item.
+.LP
+.nf
+Name: \fBvertsb\fR
+Class: \fBScrollbar\fR
+.fi
+.IP
+The vertsb component is the vertical scroll bar. See the "ScrollBar" widget
+manual entry for details on the vertsb component item.
+.fi
+
+.SH EXAMPLE
+.DS
+ package require Iwidgets 4.0
+ iwidgets::scrolledcanvas .sc
+
+ .sc create rectangle 100 100 400 400 -fill red
+ .sc create rectangle 300 300 600 600 -fill green
+ .sc create rectangle 200 200 500 500 -fill blue
+
+ pack .sc -padx 10 -pady 10 -fill both -expand yes
+.DE
+.SH AUTHOR
+Mark L. Ulferts
+.SH KEYWORDS
+scrolledcanvas, canvas, widget
diff --git a/iwidgets/doc/scrolledframe.n b/iwidgets/doc/scrolledframe.n
new file mode 100644
index 00000000000..415a31f5d41
--- /dev/null
+++ b/iwidgets/doc/scrolledframe.n
@@ -0,0 +1,211 @@
+'\"
+'\" Copyright (c) 1995 DSC Technologies Corporation
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) scrolledframe.n 1.21 94/12/17 16:04:44
+'\"
+.so man.macros
+.HS iwidgets::scrolledframe iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+iwidgets::scrolledframe \- Create and manipulate scrolled frame widgets
+.SH SYNOPSIS
+\fBiwidgets::scrolledframe\fI \fIpathName \fR?\fIoptions\fR?
+.SH "INHERITANCE"
+itk::Widget <- iwidgets::Labeledwidget <- iwidgets::Scrolledwidget <- iwidgets::Scrolledframe
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fB
+activeBackground background borderWidth cursor
+font foreground highlightColor highlightThickness
+relief selectBackground selectBorderWidth selectForeground\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "ASSOCIATED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBactiveRelief\fR \fBelementBorderWidth\fR \fBjump\fR \fBtroughColor\fR
+.fi
+.LP
+See the "scrollbar" manual entry for details on the associated options.
+.SH "INHERITED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBLabelBitmap\fR \fBlabelFont\fR \fBlabelImage\fR \fBlabelMargin\fR
+\fBlabelPos\fR \fBlabelText\fR \fBlabelVariable\fR \fBsticky\fR
+.fi
+.LP
+See the "labeledwidget" class manual entry for details on the inherited options.
+.SH "WIDGET-SPECIFIC OPTIONS"
+.LP
+.nf
+Name: \fBheight\fR
+Class: \fBHeight\fR
+Command-Line Switch: \fB-height\fR
+.fi
+.IP
+Specifies the height of the scrolled frame widget in any of the forms acceptable to \fBTk_GetPixels\fR. The default height is 100 pixels.
+.LP
+.nf
+Name: \fBhscrollMode\fR
+Class: \fBScrollMode\fR
+Command-Line Switch: \fB-hscrollmode\fR
+.fi
+.IP
+Specifies the the display mode to be used for the horizontal
+scrollbar: \fBstatic\fR, \fBdynamic\fR, or \fBnone\fR. In static mode, the
+scroll bar is displayed at all times. Dynamic mode displays the
+scroll bar as required, and none disables the scroll bar display. The
+default is static.
+.LP
+.nf
+Name: \fBsbWidth\fR
+Class: \fBWidth\fR
+Command-Line Switch: \fB-sbwidth\fR
+.fi
+.IP
+Specifies the width of the scrollbar in any of the forms acceptable
+to \fBTk_GetPixels\fR. The default width is 15 pixels.
+.LP
+.nf
+Name: \fBscrollMargin\fR
+Class: \fBMargin\fR
+Command-Line Switch: \fB-scrollmargin\fR
+.fi
+.IP
+Specifies the distance between the frame and scrollbar in any of the
+forms acceptable to \fBTk_GetPixels\fR. The default is 3 pixels.
+.LP
+.nf
+Name: \fBvscrollMode\fR
+Class: \fBScrollMode\fR
+Command-Line Switch: \fB-vscrollmode\fR
+.fi
+.IP
+Specifies the the display mode to be used for the vertical
+scrollbar: \fBstatic\fR, \fBdynamic\fR, or \fBnone\fR. In static mode, the
+scroll bar is displayed at all times. Dynamic mode displays the
+scroll bar as required, and none disables the scroll bar display. The
+default is static.
+.LP
+.nf
+Name: \fBwidth\fR
+Class: \fBWidth\fR
+Command-Line Switch: \fB-width\fR
+.fi
+.IP
+Specifies the width of the scrolled frame widget in any of the forms
+acceptable to \fBTk_GetPixels\fR. The default height is 100 pixels.
+.BE
+
+.SH DESCRIPTION
+.PP
+The \fBscrolledframe\fR combines the functionallity of scrolling with that
+of a typical frame widget to implement a clipable viewing area whose visible
+region may be modified with the scroll bars. This enables the contruction
+of visually larger areas than which could normally be displayed, containing
+a heterogenous mix of other widgets. Options exist which allow full control
+over which scrollbars are displayed and the method, i.e. statically or
+dynamically. The frame itself may be accessed by the \fBchildsite\fR
+method and then filled with other widget combinations.
+
+.SH "METHODS"
+.PP
+The \fBiwidgets::scrolledframe\fR command creates a new Tcl command whose
+name is \fIpathName\fR. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIOption\fR and the \fIarg\fRs
+determine the exact behavior of the command. The following
+commands are possible for scrolledframe widgets:
+.SH "ASSOCIATED METHODS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBxview\fR \fByview\fR
+.fi
+.LP
+See the "canvas" manual entry for details on the associated methods.
+
+.SH "WIDGET-SPECIFIC METHODS"
+.TP
+\fIpathName \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given
+by \fIoption\fR.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::scrolledframe\fR
+command.
+.TP
+\fIpathName \fBchildsite\fR
+Return the path name of the child site.
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR?
+Query or modify the configuration options of the widget.
+If no \fIoption\fR is specified, returns a list describing all of
+the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for
+information on the format of this list). If \fIoption\fR is specified
+with no \fIvalue\fR, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no \fIoption\fR is specified). If
+one or more \fIoption\-value\fR pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::scrolledframe\fR
+command.
+.TP
+\fIpathName \fBjustify \fIdirection\fR
+Justifies the frame contents via the scroll bars in one of four directions:
+\fBleft\fR, \fBright\fR, \fBtop\fR, or \fBbottom\fR.
+
+.SH "COMPONENTS"
+.LP
+.nf
+Name: \fBhorizsb\fR
+Class: \fBScrollbar\fR
+.fi
+.IP
+The horizsb component is the horizontal scroll bar. See the "ScrollBar"
+widget manual entry for details on the horizsb component item.
+.LP
+.nf
+Name: \fBvertsb\fR
+Class: \fBScrollbar\fR
+.fi
+.IP
+The vertsb component is the vertical scroll bar. See the "ScrollBar" widget
+manual entry for details on the vertsb component item.
+.fi
+
+.SH EXAMPLE
+.DS
+package require Iwidgets 4.0
+iwidgets::scrolledframe .sf -width 150 -height 180 \\
+ -labelon yes -labeltext scrolledframe
+
+set cs [.sf childsite]
+pack [button $cs.b1 -text Hello] -pady 10
+pack [button $cs.b2 -text World] -pady 10
+pack [button $cs.b3 -text "This is a test"] -pady 10
+pack [button $cs.b4 -text "This is a really big button"] -pady 10
+pack [button $cs.b5 -text "This is another really big button"] -pady 10
+pack [button $cs.b6 -text "This is the last really big button"] -pady 10
+
+pack .sf -expand yes -fill both -padx 10 -pady 10
+.DE
+.SH AUTHOR
+.TP
+Mark L. Ulferts
+.TP
+Sue Yockey
+.SH KEYWORDS
+scrolledframe, frame, widget
diff --git a/iwidgets/doc/scrolledhtml.n b/iwidgets/doc/scrolledhtml.n
new file mode 100644
index 00000000000..a3ae1f9d96f
--- /dev/null
+++ b/iwidgets/doc/scrolledhtml.n
@@ -0,0 +1,313 @@
+'\"
+'\" Copyright (c) 1996 DSC Technologies Corporation
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) scrolledhtml.n 1.21 94/12/17 16:04:44
+'\"
+.so man.macros
+.HS iwidgets::scrolledhtml iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+iwidgets::scrolledhtml \- Create and manipulate a scrolled text widget with the capability
+of displaying HTML formatted documents.
+.SH SYNOPSIS
+\fBiwidgets::scrolledhtml\fI \fIpathName \fR?\fIoptions\fR?
+.SH "INHERITANCE"
+itk::Widget <- iwidgets::Labeledwidget <- iwidgets::Scrolledtext <- iwidgets::Scrolledhtml
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fB
+activeBackground background borderWidth cursor
+exportSelection foreground highlightColor highlightThickness
+insertBackground insertBorderWidth insertOffTime insertOnTime
+insertWidth padX padY relief
+repeatDelay repeatInterval selectBackground selectBorderWidth
+selectForeground setGrid\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "ASSOCIATED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBactiveRelief\fR \fBelementBorderWidth\fR \fBjump\fR \fBtroughColor\fR
+.fi
+.LP
+See the "scrollbar" widget manual entry for details on the above
+associated options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBspacing1\fR \fBspacing2\fR \fBspacing3\fR \fBstate\fR
+\fBtabs\fR \fBwrap\fR
+.fi
+.LP
+See the "text" widget manual entry for details on the above
+associated options.
+.SH "INHERITED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBlabelBitmap\fR \fBlabelFont\fR \fBlabelImage\fR \fBlabelMargin\fR
+\fBlabelPos\fR \fBlabelText\fR \fBlabelVariable\fR \fBheight\fR
+\fBhscrollMode\fR \fBsbWidth\fR \fBscrollMargin\fR \fBvisibleitems\fR
+\fBvscrollMode\fR \fBwidth\fR
+.fi
+.LP
+See the "scrolledtext" class manual entry for details on the inherited options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBsticky\fR
+.fi
+.LP
+See the "labeledwidget" class manual entry for details on the inherited options.
+.SH "WIDGET-SPECIFIC OPTIONS"
+.LP
+.nf
+Name: \fBfeedback\fR
+Class: \fBFeedBack\fR
+Command-Line Switch: \fB-feedback\fR
+.fi
+.IP
+Specifies the callback command to use to give feedback on current
+status. The command is executed in the form \fIcommand\fR \fI<number of
+characters remaining>\fR
+.LP
+.nf
+Name: \fBfixedfont\fR
+Class: \fBFixedFont\fR
+Command-Line Switch: \fB-fixedfont\fR
+.fi
+.IP
+Specifies the name of the font to be used for fixed-width character
+text (such as <pre>...</pre> or <tt>...</tt>.) The size, style, and
+other font attributes are determined by the format tags in the
+document. The default is courier.
+.LP
+.nf
+Name: \fBfontname\fR
+Class: \fBFontName\fR
+Command-Line Switch: \fB-fontname\fR
+.fi
+.IP
+Specifies the name of the font to be used for normal-width character
+spaced text. The size, style, and other font attributes are
+determined by the format tags in the document. The default is times.
+.LP
+.nf
+Name: \fBfontsize\fR
+Class: \fBFontSize\fR
+Command-Line Switch: \fB-fontsize\fR
+.fi
+.IP
+Specifies the general size of the fonts used. One of small, medium,
+large, or huge. The default is medium.
+.LP
+.nf
+Name: \fBforeground\fR
+Class: \fBForeground\fR
+Command-Line Switch: \fB-foreground\fR
+.fi
+.IP
+Specifies the color of text other than hypertext links, in any
+of the forms acceptable to \fBTk_GetColor\fR. This value may
+be overridden in a particular document by the \fItext\fR attribute
+of the \fBBody\fR HTML tag.
+.LP
+.nf
+Name: \fBlink\fR
+Class: \fBLink\fR
+Command-Line Switch: \fB-link\fR
+.fi
+.IP
+Specifies the default color of hypertext links in any of the forms
+acceptable to \fBTk_GetColor\fR. This value may be overridden in a
+particular document by the \fIlink\fR attribute of the \fBBody\fR
+HTML tag. The default is blue.
+.LP
+.nf
+Name: \fBlinkcommand\fR
+Class: \fBLinkCommand\fR
+Command-Line Switch: \fB-linkcommand\fR
+.fi
+.IP
+Specifies the command to execute when the user clicks on a hypertext
+link. Execution is of the form \fBlinkcommand href\fR, where \fBhref\fR is
+the value given in the \fIhref\fR attribute of the \fBA\fR HTML tag.
+.LP
+.nf
+Name: \fBalink\fR
+Class: \fBalink\fR
+Command-Line Switch: \fB-alink\fR
+.fi
+.IP
+Specifies the color of hypertext links when the cursor is over the link
+in any of the forms acceptable to \fBTk_GetColor\fR. The default is red.
+.LP
+.nf
+Name: \fBtextBackground\fR
+Class: \fBBackground\fR
+Command-Line Switch: \fB-textbackground\fR
+.fi
+.IP
+Specifies the background color for the text area in any of
+the forms acceptable to \fBTk_GetColor\fR. This value may be
+overridden in a particular document by the \fIbgcolor\fR attribute
+of the \fBBody\fR HTML tag.
+.LP
+.nf
+Name: \fBunknownimage\fR
+Class: \fBUnknownImage\fR
+Command-Line Switch: \fB-unknownimage\fR
+.fi
+.IP
+Specifies the name of the image file to display when an \fBimg\fR
+specified in the html document cannot be loaded.
+.LP
+.nf
+Name: \fBupdate\fR
+Class: \fBUpdate\fR
+Command-Line Switch: \fB-alink\fR
+.fi
+.IP
+A boolean value indicating whether to call update during html rendering.
+.LP
+.BE
+
+.SH DESCRIPTION
+.PP
+The \fBiwidgets::scrolledhtml\fR command creates
+a scrolled text widget with the additional capability to display
+html formatted documents.
+An import method is provided to read an html document file, and
+a render method is provided to display a html formatted text string.
+
+.SH "METHODS"
+.PP
+The \fBiwidgets::scrolledhtml\fR command creates a new Tcl command whose
+name is \fIpathName\fR. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIOption\fR and the \fIarg\fRs
+determine the exact behavior of the command. The following
+commands are possible for scrolledhtml widgets:
+.SH "ASSOCIATED METHODS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBbbox\fR \fBcompare\fR \fBdebug\fR \fBdelete\fR
+\fBdlineinfo\fR \fBget\fR \fBindex\fR \fBinsert\fR
+\fBmark\fR \fBscan\fR \fBsearch\fR \fBsee\fR
+\fBtag\fR \fBwindow\fR \fBxview\fR \fByview\fR
+.fi
+.LP
+See the "text" manual entry for details on the standard methods.
+.SH "INHERITED METHODS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBexport\fR \fBclear\fR
+.fi
+.LP
+See the "scrolledhtml" manual entry for details on the inherited methods.
+
+.SH "WIDGET-SPECIFIC METHODS"
+.TP
+\fIpathName \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given
+by \fIoption\fR.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::scrolledhtml\fR
+command.
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR?
+Query or modify the configuration options of the widget.
+If no \fIoption\fR is specified, returns a list describing all of
+the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for
+information on the format of this list). If \fIoption\fR is specified
+with no \fIvalue\fR, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no \fIoption\fR is specified). If
+one or more \fIoption\-value\fR pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::scrolledhtml\fR
+command.
+.TP
+\fIpathName\fR \fBimport\fR ?\fIoption\fR? \fIhref\fR
+Load html formatted text from a file. \fIHref\fR must exist.
+If \fIoption\fR is -link, \fIhref\fR is assumed to be relative
+to the application's current working directory. Otherwise,
+\fIhref\fR is assumed to be relative to the path of the last
+page loaded. \fIHref\fR is either a filename, or a reference
+of the form \fIfilename\fR#\fIanchorname\fR. In the latter form,
+fIFilename\fR and/or \fIanchorname\fR may be empty.
+If \fIfilename\fR is empty, the current document is assumed.
+If \fIanchorname\fR is empty, the top of the document is assumed.
+.TP
+\fIpathName\fR \fBpwd\fR
+Print the current working directory of the widget, i.e. the directory of the
+last page loaded.
+.TP
+\fIpathName\fR \fBrender\fR \fIhtmltext\fR ?\fIwd\fR?
+Display HTML formatted text \fIhtmltext\fR. \fIWd\fR gives the base
+path to use for all links and images in the document. \fIWd\fR defaults
+to the application's current working directory.
+.TP
+\fIpathName\fR \fBtitle\fR
+Return the title of the current page, as given in the <title>...</title>
+field in the document.
+
+.SH "HTML COMPLIANCE"
+.LP
+This widget is compliant with HTML 3.2 with the following exceptions:
+.LP
+No features requiring a connection to an http server are supported.
+.LP
+Some image alignments aren't supported, because they are not supported by
+the text widget.
+.LP
+The <br> attributes dealing with image alignments aren't supported.
+.LP
+Automatic table sizing is not supported very well, due to limitations of the
+text widget
+.RE
+.SH EXAMPLE
+.DS
+ package require Iwidgets 4.0
+ option add *textBackground white
+
+ iwidgets::scrolledhtml .sh -fontname helvetica -linkcommand "this import -link"
+
+ pack .sh -padx 10 -pady 10 -fill both -expand yes
+
+ .sh import ~/public_html/index.html
+.DE
+.SH BUGS
+.IP
+Cells in a table can be caused to overlap. ex:
+ <table border width="100%">
+ <tr><td>cell1</td><td align=right rowspan=2>cell2</td></tr>
+ <tr><td colspan=2>cell3 w/ overlap</td>
+ </table>
+It hasn't been fixed because 1) it's a pain to fix, 2) it will slow
+tables down by a significant amount, and 3) netscape has the same
+bug, as of V3.01.
+.SH ACKNOWLEDGEMENTS
+Sam Shen
+.IP
+This code is based largely on his tkhtml.tcl code from tk inspect. Tkhtml
+is copyright 1995 Lawrence Berkeley Laboratory.
+.LP
+.SH AUTHOR
+Kris Raney
+.SH KEYWORDS
+scrolledhtml, html, text, widget
diff --git a/iwidgets/doc/scrolledlistbox.n b/iwidgets/doc/scrolledlistbox.n
new file mode 100644
index 00000000000..9e5de5cd72c
--- /dev/null
+++ b/iwidgets/doc/scrolledlistbox.n
@@ -0,0 +1,356 @@
+'\"
+'\" Copyright (c) 1995 DSC Technologies Corporation
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) scrolledlistbox.n 1.21 94/12/17 16:04:44
+'\"
+.so man.macros
+.HS iwidgets::scrolledlistbox iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+iwidgets::scrolledlistbox \- Create and manipulate scrolled listbox widgets
+.SH SYNOPSIS
+\fBiwidgets::scrolledlistbox\fI \fIpathName \fR?\fIoptions\fR?
+.SH "INHERITANCE"
+itk::Widget <- iwidgets::Labeledwidget <- iwidgets::Scrolledwidget <- iwidgets::Scrolledlistbox
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fB
+activeBackground background borderWidth cursor
+exportSelection foreground highlightColor highlightThickness
+relief selectBackground selectBorderWidth selectForeground\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "ASSOCIATED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBselectMode\fR \fBlistvariable\fR
+.fi
+.LP
+See the "listbox" widget manual entry for details on the above
+associated options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBactiveRelief\fR \fBelementBorderwidth\fR \fBjump\fR \fBtroughColor\fR
+.fi
+.LP
+See the "scrollbar" widget manual entry for details on the above
+associated options.
+.SH "INHERITED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBdisabledForeground\fR \fBlabelBitmap\fR \fBlabelFont\fR \fBlabelImage\fR
+\fBlabelMargin\fR \fBlabelPos\fR \fBlabelText\fR \fBlabelVariable\fR
+\fBstate\fR \fBsticky\fR
+.fi
+.LP
+See the "labeledwidget" class manual entry for details on the inherited
+options.
+.SH "WIDGET-SPECIFIC OPTIONS"
+.LP
+.nf
+Name: \fBdblClickCommand\fR
+Class: \fBCommand\fR
+Command-Line Switch: \fB-dblclickcommand\fR
+.fi
+.IP
+Specifies a Tcl command procedure which is called when an item is
+double clicked. Typically this occurs when mouse button 1 is double
+clicked over an item. Selection policy does not matter.
+.LP
+.nf
+Name: \fBheight\fR
+Class: \fBHeight\fR
+Command-Line Switch: \fB-height\fR
+.fi
+.IP
+Specifies the height of the scrolled list box as an entire unit.
+The value may be specified in any of the forms acceptable to
+\fBTk_GetPixels\fR. Any additional space needed to display the other
+components such as labels, margins, and scrollbars force the listbox
+to be compressed. A value of zero along with the same value for
+the width causes the value given for the visibleitems option
+to be applied which administers geometry constraints in a different
+manner. The default height is zero.
+.LP
+.nf
+Name: \fBhscrollMode\fR
+Class: \fBScrollMode\fR
+Command-Line Switch: \fB-hscrollmode\fR
+.fi
+.IP
+Specifies the the display mode to be used for the horizontal
+scrollbar: \fBstatic, dynamic,\fR or \fBnone\fR. In static mode, the
+scroll bar is displayed at all times. Dynamic mode displays the
+scroll bar as required, and none disables the scroll bar display. The
+default is static.
+.LP
+.nf
+Name: \fBsbWidth\fR
+Class: \fBWidth\fR
+Command-Line Switch: \fB-sbwidth\fR
+.fi
+.IP
+Specifies the width of the scrollbar in any of the forms acceptable
+to \fBTk_GetPixels\fR. The default width is 15 pixels..
+.LP
+.nf
+Name: \fBscrollMargin\fR
+Class: \fBMargin\fR
+Command-Line Switch: \fB-scrollmargin\fR
+.fi
+.IP
+Specifies the distance between the listbox and scrollbar in any of the
+forms acceptable to \fBTk_GetPixels\fR. The default is 3 pixels.
+.LP
+.nf
+Name: \fBselectionCommand\fR
+Class: \fBCommand\fR
+Command-Line Switch: \fB-selectioncommand\fR
+.fi
+.IP
+Specifies a Tcl command procedure which is called when an item is
+selected. Selection policy does not matter.
+.LP
+.nf
+Name: \fBstate\fR
+Class: \fBState\fR
+Command-Line Switch: \fB-state\fR
+.fi
+.IP
+Specifies one of two states for the listbox: \fBnormal\fR or \fBdisabled\fR.
+If the listbox is disabled then selection is ignored. The default is
+normal.
+.LP
+.nf
+Name: \fBtextBackground\fR
+Class: \fBBackground\fR
+Command-Line Switch \fB-textbackground\fR
+.fi
+.IP
+Specifies the background color for the listbox. This allows the background
+within the listbox to be different from the normal background color.
+.LP
+.nf
+Name: \fBtextFont\fR
+Class: \fBFont\fR
+Command-Line Switch: \fB-textfont\fR
+.fi
+.IP
+Specifies the font to be used for text in the listbox. This allows for
+the font associated with text internal to the scrolled listbox to be
+different than the font for labels.
+.LP
+.nf
+Name: \fBvisibleitems\fR
+Class: \fBVisibleItems\fR
+Command-Line Switch: \fB-visibleitems\fR
+.fi
+.IP
+Specifies the widthxheight in characters and lines for the listbox.
+This option is only administered if the width and height options
+are both set to zero, otherwise they take precedence. The default value
+is 20x10. With the visibleitems option engaged, geometry constraints
+are maintained only on the listbox. The size of the other components such as
+labels, margins, and scroll bars, are additive and independent,
+effecting the overall size of the scrolled list box. In contrast,
+should the width and height options have non zero values, they
+are applied to the scrolled list box as a whole. The listbox
+is compressed or expanded to maintain the geometry constraints.
+.LP
+.nf
+Name: \fBvscrollMode\fR
+Class: \fBScrollMode\fR
+Command-Line Switch: \fB-vscrollmode\fR
+.fi
+.IP
+Specifies the the display mode to be used for the vertical
+scrollbar: \fBstatic, dynamic,\fR or \fBnone\fR. In static mode, the
+scroll bar is displayed at all times. Dynamic mode displays the
+scroll bar as required, and none disables the scroll bar display. The
+default is static.
+.LP
+.nf
+Name: \fBwidth\fR
+Class: \fBWidth\fR
+Command-Line Switch: \fB-width\fR
+.fi
+.IP
+Specifies the width of the scrolled list box as an entire unit.
+The value may be specified in any of the forms acceptable to
+\fBTk_GetPixels\fR. Any additional space needed to display the other
+components such as labels, margins, and scrollbars force the listbox
+to be compressed. A value of zero along with the same value for
+the height causes the value given for the visibleitems option
+to be applied which administers geometry constraints in a different
+manner. The default width is zero.
+.BE
+
+.SH DESCRIPTION
+.PP
+The \fBiwidgets::scrolledlistbox\fR command creates
+a scrolled listbox with additional options to manage
+horizontal and vertical scrollbars. This includes options to control
+which scrollbars are displayed and the method, i.e. statically or
+dynamically.
+
+.SH "METHODS"
+.PP
+The \fBiwidgets::scrolledlistbox\fR command creates a new Tcl command whose
+name is \fIpathName\fR. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIOption\fR and the \fIarg\fRs
+determine the exact behavior of the command.
+.PP
+Many of the widget commands for a scrolledlistbox take as one argument an
+indicator of which entry of the list box to operate on. These
+indicators are called \fIindex\fRes and may be specified in
+any of the following forms:
+.TP 12
+\fInumber\fR
+Specifies the element as a numerical index, where 0 corresponds
+to the first element in the listbox.
+.TP 12
+\fBactive\fR
+Indicates the element that has the location cursor. This element
+will be displayed with an underline when the listbox has the
+keyboard focus, and it is specified with the \fBactivate\fR
+widget command.
+.TP 12
+\fBanchor\fR
+Indicates the anchor point for the selection, which is set with the
+\fBselection anchor\fR widget command.
+.TP 12
+\fBend\fR
+Indicates the end of the listbox.
+For some commands this means just after the last element;
+for other commands it means the last element.
+.TP 12
+\fB@\fIx\fB,\fIy\fR
+Indicates the element that covers the point in the listbox window
+specified by \fIx\fR and \fIy\fR (in pixel coordinates). If no
+element covers that point, then the closest element to that
+point is used.
+.TP 12
+\fIpattern\fR
+If the index doesn't satisfy one of the above forms then this
+form is used. \fIPattern\fR is pattern-matched against the items in
+the list box, in order from the top down, until a matching entry is found.
+The rules of \fBTcl_StringMatch\fR are used.
+.PP
+The following widget commands are possible for scrolledlistbox widgets:
+
+.SH "ASSOCIATED METHODS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBactivate\fR \fBbbox\fR \fBcurselection\fR \fBdelete\fR
+\fBget\fR \fBindex\fR \fBinsert\fR \fBitemconfigure\fR
+\fBnearest\fR \fBscan\fR \fBsee\fR \fBselection\fR
+\fBsize\fR \fBxview\fR \fByview\fR
+.fi
+.LP
+See the "listbox" manual entry for details on the associated methods.
+
+.SH "WIDGET-SPECIFIC METHODS"
+.TP
+\fIpathName \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given
+by \fIoption\fR.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::scrolledlistbox\fR
+command.
+.TP
+\fIpathName \fBclear\fR
+Clears the listbox of all items.
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR?
+Query or modify the configuration options of the widget.
+If no \fIoption\fR is specified, returns a list describing all of
+the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for
+information on the format of this list). If \fIoption\fR is specified
+with no \fIvalue\fR, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no \fIoption\fR is specified). If
+one or more \fIoption\-value\fR pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::scrolledlistbox\fR
+command.
+.TP
+\fIpathName \fBgetcurselection\fR
+Returns the contents of the listbox element indicated by the current
+selection indexes. Short cut version of get and curselection command
+combination.
+.TP
+\fIpathName \fBjustify \fIdirection\fR
+Justifies the list contents via teh scroll bars in one of four directions:
+\fBleft\fR, \fBright\fR, \fBtop\fR, or \fBbottom\fR.
+.TP
+\fIpathName \fBselecteditemcount\fR
+Returns the number of items currently selected in the list.
+.TP
+\fIpathName \fBsort\fR \fIorder\fR
+Sort the current list in any of the forms accepted by Tcl's lsort command.
+Also accepts either \fBascending\fR or \fBdescending\fR order.
+
+.SH "COMPONENTS"
+.LP
+.nf
+Name: \fBlistbox\fR
+Class: \fBlistbox\fR
+.fi
+.IP
+The listbox component is the listbox widget. See the "listbox" widget
+manual entry for details on the listbox component item.
+.LP
+.nf
+Name: \fBhorizsb\fR
+Class: \fBScrollbar\fR
+.fi
+.IP
+The horizsb component is the horizontal scroll bar. See the "scrollbar"
+widget manual entry for details on the horizsb component item.
+.LP
+.nf
+Name: \fBvertsb\fR
+Class: \fBScrollbar\fR
+.fi
+.IP
+The vertsb component is the vertical scroll bar. See the "scrollbar" widget
+manual entry for details on the vertsb component item.
+.fi
+
+.SH EXAMPLE
+.DS
+ package require Iwidgets 4.0
+ option add *textBackground white
+ proc selCmd {} {
+ puts stdout "[.slb getcurselection]"
+ }
+ proc defCmd {} {
+ puts stdout "Double Click"
+ return [selCmd]
+ }
+ iwidgets::scrolledlistbox .slb -selection single \\
+ -vscrollmode static -hscrollmode dynamic -labeltext "List" \\
+ -selectioncommand selCmd -dblclickcommand defCmd
+ pack .slb -padx 10 -pady 10 -fill both -expand yes
+ .slb insert end {Hello {Out There} World}
+.DE
+.SH AUTHOR
+Mark L. Ulferts
+.SH KEYWORDS
+scrolledlistbox, listbox, widget
diff --git a/iwidgets/doc/scrolledtext.n b/iwidgets/doc/scrolledtext.n
new file mode 100644
index 00000000000..2d6e1e68ebd
--- /dev/null
+++ b/iwidgets/doc/scrolledtext.n
@@ -0,0 +1,284 @@
+'\"
+'\" Copyright (c) 1995 DSC Technologies Corporation
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) scrolledtext.n 1.21 94/12/17 16:04:44
+'\"
+.so man.macros
+.HS iwidgets::scrolledtext iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+iwidgets::scrolledtext \- Create and manipulate a scrolled text widget
+.SH SYNOPSIS
+\fBiwidgets::scrolledtext\fI \fIpathName \fR?\fIoptions\fR?
+.SH "INHERITANCE"
+itk::Widget <- iwidgets::Labeledwidget <- iwidgets::Scrolledwidget <- iwidgets::Scrolledtext
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBactiveBackground\fR \fBbackground\fR \fBborderWidth\fR \fBcursor\fR
+\fBexportSelection\fR \fBforeground\fR \fBhighlightColor\fR
+\fBhighlightThickness\fR \fBinsertBackground\fR
+\fBinsertBorderWidth\fR \fBinsertOffTime\fR \fBinsertOnTime\fR
+\fBinsertWidth\fR \fBpadX\fR \fBpadY\fR
+\fBrelief\fR \fBselectBackground\fR
+\fBselectBorderWidth\fR \fBselectForeground\fR
+\fBsetGrid\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "ASSOCIATED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBactiveRelief\fR \fBelementBorderWidth\fR \fBjump\fR \fBtroughColor\fR
+.fi
+.LP
+See the "scrollbar" widget manual entry for details on the above
+associated options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBspacing1\fR \fBspacing2\fR \fBspacing3\fR \fBstate\fR
+\fBtabs\fR \fBwrap\fR
+.fi
+.LP
+See the "text" widget manual entry for details on the above
+associated options.
+.SH "INHERITED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBdisabledForeground\fR \fBlabelBitmap\fR \fBlabelFont\fR \fBlabelImage\fR
+\fBlabelMargin\fR \fBlabelPos\fR \fBlabelText\fR \fBlabelVariable\fR
+\fBstate\fR \fBsticky\fR
+.fi
+.LP
+See the "labeledwidget" class manual entry for details on the inherited options.
+.SH "WIDGET-SPECIFIC OPTIONS"
+.LP
+.nf
+Name: \fBheight\fR
+Class: \fBHeight\fR
+Command-Line Switch: \fB-height\fR
+.fi
+.IP
+Specifies the height of the scrolled text as an entire unit.
+The value may be specified in any of the forms acceptable to
+\fBTk_GetPixels\fR. Any additional space needed to display the other
+components such as labels, margins, and scrollbars force the text
+to be compressed. A value of zero along with the same value for
+the width causes the value given for the visibleitems option
+to be applied which administers geometry constraints in a different
+manner. The default height is zero.
+.LP
+.nf
+Name: \fBhscrollMode\fR
+Class: \fBScrollMode\fR
+Command-Line Switch: \fB-hscrollmode\fR
+.fi
+.IP
+Specifies the the display mode to be used for the horizontal
+scrollbar: \fBstatic, dynamic,\fR or \fBnone\fR. In static mode, the
+scroll bar is displayed at all times. Dynamic mode displays the
+scroll bar as required, and none disables the scroll bar display. The
+default is static.
+.LP
+.nf
+Name: \fBsbWidth\fR
+Class: \fBWidth\fR
+Command-Line Switch: \fB-sbwidth\fR
+.fi
+.IP
+Specifies the width of the scrollbar in any of the forms
+acceptable to \fBTk_GetPixels\fR.
+.LP
+.nf
+Name: \fBscrollMargin\fR
+Class: \fBMargin\fR
+Command-Line Switch: \fB-scrollmargin\fR
+.fi
+.IP
+Specifies the distance between the text area and scrollbar in any of the forms
+acceptable to \fBTk_GetPixels\fR. The default is 3 pixels.
+.LP
+.nf
+Name: \fBtextBackground\fR
+Class: \fBBackground\fR
+Command-Line Switch: \fB-textbackground\fR
+.fi
+.IP
+Specifies the background color for the text area in any of the forms
+acceptable to \fBTk_GetColor\fR.
+.LP
+.nf
+Name: \fBtextFont\fR
+Class: \fBFont\fR
+Command-Line Switch: \fB-textfont\fR
+.fi
+.IP
+Specifies the font to be used in the scrolled text area.
+.LP
+.nf
+Name: \fBvisibleitems\fR
+Class: \fBVisibleItems\fR
+Command-Line Switch: \fB-visibleitems\fR
+.fi
+.IP
+Specifies the widthxheight in characters and lines for the text.
+This option is only administered if the width and height options
+are both set to zero, otherwise they take precedence. The default value
+is 80x24. With the visibleitems option engaged, geometry constraints
+are maintained only on the text. The size of the other components such as
+labels, margins, and scroll bars, are additive and independent,
+effecting the overall size of the scrolled text. In contrast,
+should the width and height options have non zero values, they
+are applied to the scrolled text as a whole. The text
+is compressed or expanded to maintain the geometry constraints.
+.LP
+.nf
+Name: \fBvscrollMode\fR
+Class: \fBScrollMode\fR
+Command-Line Switch: \fB-vscrollmode\fR
+.fi
+.IP
+Specifies the the display mode to be used for the vertical
+scrollbar: \fBstatic, dynamic,\fR or \fBnone\fR. In static mode, the
+scroll bar is displayed at all times. Dynamic mode displays the
+scroll bar as required, and none disables the scroll bar display. The
+default is static.
+.LP
+.nf
+Name: \fBwidth\fR
+Class: \fBWidth\fR
+Command-Line Switch: \fB-width\fR
+.fi
+.IP
+Specifies the width of the scrolled text as an entire unit.
+The value may be specified in any of the forms acceptable to
+\fBTk_GetPixels\fR. Any additional space needed to display the other
+components such as labels, margins, and scrollbars force the text
+to be compressed. A value of zero along with the same value for
+the height causes the value given for the visibleitems option
+to be applied which administers geometry constraints in a different
+manner. The default width is zero.
+.LP
+.BE
+
+.SH DESCRIPTION
+.PP
+The \fBiwidgets::scrolledtext\fR command creates
+a scrolled text widget with additional options to manage
+the scrollbars. This includes options to control the method
+in which the scrollbars are displayed, i.e. statically or dynamically.
+Options also exist for adding a label to the scrolled text area and
+controlling its position. Import/export of methods are provided for
+file I/O.
+
+.SH "METHODS"
+.PP
+The \fBiwidgets::scrolledtext\fR command creates a new Tcl command whose
+name is \fIpathName\fR. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIOption\fR and the \fIarg\fRs
+determine the exact behavior of the command. The following
+commands are possible for scrolledtext widgets:
+.SH "ASSOCIATED METHODS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBbbox\fR \fBcompare\fR \fBdebug\fR \fBdelete\fR
+\fBdlineinfo\fR \fBget\fR \fBimage\fR \fBindex\fR
+\fBinsert\fR \fBmark\fR \fBscan\fR \fBsearch\fR
+\fBsee\fR \fBtag\fR \fBwindow\fR \fBxview\fR
+\fByview\fR
+.fi
+.LP
+See the "text" manual entry for details on the standard methods.
+
+.SH "WIDGET-SPECIFIC METHODS"
+.TP
+\fIpathName \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given
+by \fIoption\fR.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::scrolledtext\fR
+command.
+.TP
+\fIpathName \fBchildsite\fR
+Returns the child site widget path name.
+.TP
+\fIpathName \fBclear\fR
+Clear the text area of all characters.
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR?
+Query or modify the configuration options of the widget.
+If no \fIoption\fR is specified, returns a list describing all of
+the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for
+information on the format of this list). If \fIoption\fR is specified
+with no \fIvalue\fR, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no \fIoption\fR is specified). If
+one or more \fIoption\-value\fR pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::scrolledtext\fR
+command.
+.TP
+\fIpathName \fBimport\fR \fIfilename\fR ?\fIindex\fR?
+Load the text from a file into the text area at the \fIindex\fR. The
+\fIfilename\fR must exist.
+.TP
+\fIpathName \fBexport\fR \fIfilename\fR
+Write text to a file. If \fIfilename\fR exists then contents are
+replaced with text widget contents.
+
+.SH "COMPONENTS"
+.LP
+.nf
+Name: \fBtext\fR
+Class: \fBText\fR
+.fi
+.IP
+The text component is the text widget. See the "text" widget
+manual entry for details on the text component item.
+.LP
+.nf
+Name: \fBhorizsb\fR
+Class: \fBScrollbar\fR
+.fi
+.IP
+The horizsb component is the horizontal scroll bar. See the "scrollbar"
+widget manual entry for details on the horizsb component item.
+.LP
+.nf
+Name: \fBvertsb\fR
+Class: \fBScrollbar\fR
+.fi
+.IP
+The vertsb component is the vertical scroll bar. See the "scrollbar" widget
+manual entry for details on the vertsb component item.
+.fi
+
+.SH EXAMPLE
+.DS
+ package require Iwidgets 4.0
+ option add *textBackground white
+
+ iwidgets::scrolledtext .st -hscrollmode dynamic -labeltext "Password File"
+
+ pack .st -padx 10 -pady 10 -fill both -expand yes
+
+ .st import /etc/passwd
+.DE
+.SH AUTHOR
+Mark L. Ulferts
+.SH KEYWORDS
+scrolledtext, text, widget
diff --git a/iwidgets/doc/selectionbox.n b/iwidgets/doc/selectionbox.n
new file mode 100644
index 00000000000..9d687208bcc
--- /dev/null
+++ b/iwidgets/doc/selectionbox.n
@@ -0,0 +1,302 @@
+'\"
+'\" Copyright (c) 1995 DSC Technologies Corporation
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) selectionbox.n 1.21 94/12/17 16:04:44
+'\"
+.so man.macros
+.HS iwidgets::selectionbox iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+iwidgets::selectionbox \- Create and manipulate a selection box widget
+.SH SYNOPSIS
+\fBiwidgets::selectionbox\fI \fIpathName \fR?\fIoptions\fR?
+.SH "INHERITANCE"
+itk::Widget <- iwidgets::Selectionbox
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fB
+activeBackground background borderWidth cursor
+exportSelection foreground highlightColor highlightThickness
+insertBackground insertBorderWidth insertOffTime insertOnTime
+insertWidth relief repeatDelay repeatInterval
+selectBackground selectBorderWidth selectForeground\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "ASSOCIATED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBtextBackground\fR \fBtextFont\fR
+.fi
+.LP
+See the "entryfield" widget class manual entry for details on the above
+associated options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBlabelFont\fR \fBlabelMargin\fR
+.fi
+.LP
+See the "labeledwidget" class manual entry for details on the above
+associated options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBactiveRelief\fR \fBelementBorderWidth\fR \fBjump\fR \fBtroughColor\fR
+.fi
+.LP
+See the "scrollbar" widget class manual entry for details on the above
+associated options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBdblClickCommand\fR \fBhscrollMode\fR \fBsbWidth\fR \fBscrollMargin\fR
+\fBtextBackground\fR \fBtextFont\fR \fBvscrollMode\fR
+.fi
+.LP
+See the "scrolledlistbox" widget class manual entry for details on the above
+associated options.
+
+.SH "WIDGET-SPECIFIC OPTIONS"
+.LP
+.nf
+Name: \fBchildSitePos\fR
+Class: \fBPosition\fR
+Command-Line Switch: \fB-childsitepos\fR
+.fi
+.IP
+Specifies the position of the child site in the selection box: \fBn\fR,
+\fBs\fR, \fBe\fR, \fBw\fR, or \fB\fR. The default is center
+.LP
+.nf
+Name: \fBheight\fR
+Class: \fBHeight\fR
+Command-Line Switch: \fB-height\fR
+.fi
+.IP
+Specifies the height of the selection box. The value may be specified in
+any of the forms acceptable to Tk_GetPixels. The default is 320 pixels.
+.LP
+.nf
+Name: \fBitemsCommand\fR
+Class: \fBCommand\fR
+Command-Line Switch: \fB-itemscommand\fR
+.fi
+.IP
+Specifies a command to be evaluated following selection of an item.
+.LP
+.nf
+Name: \fBitemsLabel\fR
+Class: \fBText\fR
+Command-Line Switch: \fB-itemslabel\fR
+.fi
+.IP
+Specifies the text of the label for the items list. The default is "List".
+.LP
+.nf
+Name: \fBitemsLabelPos\fR
+Class: \fBPosition\fR
+Command-Line Switch: \fB-itemslabelpos\fR
+.fi
+.IP
+Specifies the position of the label along the side of the items
+list: \fBn\fR, \fBne\fR, \fBe\fR, \fBse\fR, \fBs\fR, \fBsw\fR, \fBw\fR,
+or \fBnw\fR. The default is nw.
+.LP
+.nf
+Name: \fBitemsOn\fR
+Class: \fBItemsOn\fR
+Command-Line Switch: \fB-itemson\fR
+.fi
+.IP
+Specifies whether or not to display the items list in any
+of the forms acceptable to \fBTcl_GetBoolean\fR. The default is true.
+.LP
+.nf
+Name: \fBmargin\fR
+Class: \fBMargin\fR
+Command-Line Switch: \fB-margin\fR
+.fi
+.IP
+Specifies distance between the items list and selection entry in any of
+the forms acceptable to \fBTk_GetPixels\fR. The default is 7 pixels.
+.LP
+.nf
+Name: \fBselectionCommand\fR
+Class: \fBCommand\fR
+Command-Line Switch: \fB-selectioncommand\fR
+.fi
+.IP
+Specifies a Tcl procedure to be associated with a return key press event
+in the selection entry field.
+.LP
+.nf
+Name: \fBselectionLabel\fR
+Class: \fBText\fR
+Command-Line Switch: \fB-selectionlabel\fR
+.fi
+.IP
+Specifies the text of the label for the selection entry field. The default
+is "Selection".
+.LP
+.nf
+Name: \fBselectionLabelPos\fR
+Class: \fBPosition\fR
+Command-Line Switch: \fB-selectionlabelpos\fR
+.fi
+.IP
+Specifies the position of the label along the side of the selection:
+\fBn\fR, \fBne\fR, \fBe\fR, \fBse\fR, \fBs\fR, \fBsw\fR, \fBw\fR,
+or \fBnw\fR. The default is nw.
+.LP
+.nf
+Name: \fBselectionOn\fR
+Class: \fBSelectionOn\fR
+Command-Line Switch: \fB-selectionon\fR
+.fi
+.IP
+Specifies whether or not to display the selection entry in any
+of the forms acceptable to \fBTcl_GetBoolean\fR. The default is true.
+.LP
+.nf
+Name: \fBwidth\fR
+Class: \fBWidth\fR
+Command-Line Switch: \fB-width\fR
+.fi
+.IP
+Specifies the width of the selection box. The value may be specified in
+any of the forms acceptable to Tk_GetPixels. The default is 260 pixels.
+.LP
+.BE
+
+.SH DESCRIPTION
+.PP
+The \fBiwidgets::selectionbox\fR command creates a scrolled list of items and
+a selection entry field. The user may choose any of the items displayed
+in the scrolled list of alternatives and the selection field will be
+filled with the choice. The user is also free to enter a new value in
+the selection entry field. Both the list and entry areas have labels.
+A child site is also provided in which the user may create other widgets
+to be used in conjunction with the selection box.
+
+.SH "METHODS"
+.PP
+The \fBiwidgets::selectionbox\fR command creates a new Tcl command whose
+name is \fIpathName\fR. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIOption\fR and the \fIarg\fRs
+determine the exact behavior of the command.
+
+.SH "ASSOCIATED METHODS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBcurselection\fR \fBdelete\fR \fBindex\fR \fBnearest\fR
+\fBscan\fR \fBselection\fR \fBsize\fR
+.fi
+.LP
+See the "listbox" widget class manual entry for details on the
+associated methods.
+
+.SH "WIDGET-SPECIFIC METHODS"
+.TP
+\fIpathName \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given
+by \fIoption\fR.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::selectionbox\fR
+command.
+.TP
+\fIpathName \fBchildsite\fR
+Returns the child site widget path name.
+.TP
+\fIpathName \fBclear\fR \fIcomponent\fR
+Delete the contents of either the selection entry widget or
+items list. The \fIcomponent\fR argument may be either \fBitems\fR
+or \fBselection\fR.
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR?
+Query or modify the configuration options of the widget.
+If no \fIoption\fR is specified, returns a list describing all of
+the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for
+information on the format of this list). If \fIoption\fR is specified
+with no \fIvalue\fR, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no \fIoption\fR is specified). If
+one or more \fIoption\-value\fR pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::selectionbox\fR
+command.
+.TP
+\fIpathName \fBget\fR
+Returns the current value of the selection entry widget.
+.TP
+\fIpathName \fBinsert\fR \fIcomponent\fR \fIargs\fR
+Insert element(s) into either the selection entry widget or
+items list. The \fIcomponent\fR argument may be either \fBitems\fR
+or \fBselection\fR. The \fIargs\fR follow the rules of either an entry
+or list widget depending on the \fIcomponent\fR value.
+.TP
+\fIpathName \fBselectitem\fR
+Replace the selection entry field contents with the currently
+selected items value.
+
+.SH "COMPONENTS"
+.LP
+.nf
+Name: \fBchildsite\fR
+Class: \fBFrame\fR
+.fi
+.IP
+The childsite component is the user child site for the selection box. See
+the "frame" widget manual entry for details on the childsite component item.
+.LP
+.nf
+Name: \fBitems\fR
+Class: \fBScrolledlistbox\fR
+.fi
+.IP
+The items component provides the scrolled list box of items for the selection
+box. See the "scrolledlistbox" widget manual entry for details on the
+items component item.
+.LP
+.nf
+Name: \fBselection\fR
+Class: \fBEntryfield\fR
+.fi
+.IP
+The selection component provides the entry field in the selection box for
+display of the selected item in the items component. See the "entryfield"
+widget manual entry for details on the selection component item.
+.fi
+
+.SH EXAMPLE
+.DS
+ package require Iwidgets 4.0
+ option add *textBackground white
+
+ iwidgets::selectionbox .sb -items {Hello {Out There} World}
+ pack .sb -padx 10 -pady 10 -fill both -expand yes
+
+ set cs [label [.sb childsite].label -text "Child Site"]
+ pack $cs -fill x -padx 10 -pady 10
+
+ .sb insert items 2 {Cruel Cruel}
+
+ .sb selection set 1
+.DE
+.SH AUTHOR
+Mark L. Ulferts
+.SH KEYWORDS
+selectionbox, widget
diff --git a/iwidgets/doc/selectiondialog.n b/iwidgets/doc/selectiondialog.n
new file mode 100644
index 00000000000..fc0ab0acf20
--- /dev/null
+++ b/iwidgets/doc/selectiondialog.n
@@ -0,0 +1,199 @@
+'\"
+'\" Copyright (c) 1995 DSC Technologies Corporation
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) selectiondialog.n 1.21 94/12/17 16:04:44
+'\"
+.so man.macros
+.HS iwidgets::selectiondialog iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+iwidgets::selectiondialog \- Create and manipulate a selection dialog widget
+.SH SYNOPSIS
+\fBiwidgets::selectiondialog\fI \fIpathName \fR?\fIoptions\fR?
+.SH "INHERITANCE"
+itk::Toplevel <- iwidgets::Shell <- iwidgets::Dialogshell <- iwidgets::Dialog <- iwidgets::Selectiondialog
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fB
+activeBackground background borderWidth cursor
+exportSelection foreground highlightColor highlightThickness
+insertBackground insertBorderWidth insertOffTime insertOnTime
+insertWidth selectBackground selectBorderWidth selectForeground\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "ASSOCIATED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBtextBackground\fR \fBtextFont\fR
+.fi
+.LP
+See the "entryfield" widget manual entry for details on the above
+associated options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBlabelFont\fR
+.fi
+.LP
+See the "labeledwidget" widget manual entry for details on the above
+associated options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBactiveRelief\fR \fBelementBorderWidth\fR \fBjump\fR \fBtroughColor\fR
+.fi
+.LP
+See the "scrollbar" widget class manual entry for details on the above
+associated options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBtextBackground\fR \fBtextFont\fR
+.fi
+.LP
+See the "scrolledlistbox" widget class manual entry for details on the above
+associated options.
+\fBchildsitepos\fR \fBitemsCommand\fR \fBitemsLabel\fR \fBitemsOn\fR
+\fBselectionCommand\fR \fBselectionLabel\fR \fBselectionOn\fR
+.fi
+.LP
+See the "selectionbox" widget manual entry for details on the above
+associated options.
+.SH "INHERITED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBbuttonBoxPadX\fR \fBbuttonBoxPadY\fR \fBbuttonBoxPos\fR \fBpadX\fR
+\fBpadY\fR \fBseparator\fR \fBthickness\fR
+.fi
+.LP
+See the "dialogshell" widget manual entry for details on the above
+inherited options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBheight\fR \fBmaster\fR \fBmodality\fR \fBwidth\fR
+.fi
+.LP
+See the "shell" widget manual entry for details on the above
+inherited options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBtitle\fR
+.fi
+.LP
+See the "Toplevel" widget manual entry for details on the above
+inherited options.
+.BE
+
+.SH DESCRIPTION
+.PP
+The \fBiwidgets::selectiondialog\fR command creates a selection box similar to
+the OSF/Motif standard selection
+dialog composite widget. The selectiondialog is derived from the
+Dialog class and is composed of a selectionbox with commands
+to manipulate the dialog buttons.
+
+.SH "METHODS"
+.PP
+The \fBiwidgets::selectiondialog\fR command creates a new Tcl command whose
+name is \fIpathName\fR. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIOption\fR and the \fIarg\fRs
+determine the exact behavior of the command. The following
+commands are possible for selectiondialog widgets:
+.SH "ASSOCIATED METHODS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBchildsite\fR \fBclear\fR \fBget\fR \fBinsert\fR
+\fBselectitem\fR
+.fi
+.LP
+See the "selectionbox" widget manual entry for details on the above
+associated methods.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBcurselection\fR \fBdelete\fR \fBindex\fR \fBnearest\fR
+\fBscan\fR \fBselection\fR \fBsize\fR
+.fi
+.LP
+See the "listbox" widget manual entry for details on the above
+associated methods.
+.SH "INHERITED METHODS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBadd\fR \fBbuttonconfigure\fR \fBdefault\fR \fBhide\fR
+\fBinvoke\fR \fBshow\fR
+.fi
+.LP
+See the "buttonbox" widget manual entry for details on the above
+inherited methods.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBactivate\fR \fBcenter\fR \fBdeactivate\fR
+.fi
+.LP
+See the "shell" widget manual entry for details on the above
+inherited methods.
+.SH "WIDGET-SPECIFIC METHODS"
+.TP
+\fIpathName \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given
+by \fIoption\fR.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::selectiondialog\fR
+command.
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR?
+Query or modify the configuration options of the widget.
+If no \fIoption\fR is specified, returns a list describing all of
+the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for
+information on the format of this list). If \fIoption\fR is specified
+with no \fIvalue\fR, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no \fIoption\fR is specified). If
+one or more \fIoption\-value\fR pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::selectiondialog\fR
+command.
+
+.SH "COMPONENTS"
+.LP
+.nf
+Name: \fBselectionbox\fR
+Class: \fBSelectionbox\fR
+.fi
+.IP
+The selectionbox component is the selection box for the selection
+dialog. See the "selectionbox" widget manual entry for details on the
+selectionbox component item.
+.fi
+
+.SH EXAMPLE
+.DS
+ package require Iwidgets 4.0
+ iwidgets::selectiondialog .sd
+ .sd activate
+.DE
+.SH AUTHOR
+Mark L. Ulferts
+.SH KEYWORDS
+selectiondialog, selectionbox, dialog, dialogshell, shell, widget
+
diff --git a/iwidgets/doc/shell.n b/iwidgets/doc/shell.n
new file mode 100644
index 00000000000..4659cfc0dfb
--- /dev/null
+++ b/iwidgets/doc/shell.n
@@ -0,0 +1,197 @@
+'\"
+'\" Copyright (c) 1995 DSC Technologies Corporation
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) shell.n 1.21 94/12/17 16:04:44
+'\"
+.so man.macros
+.HS iwidgets::shell iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+iwidgets::shell \- Create and manipulate a shell widget
+.SH SYNOPSIS
+\fBiwidgets::shell\fI \fIpathName \fR?\fIoptions\fR?
+.SH "INHERITANCE"
+itk::Toplevel <- iwidgets::Shell
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBbackground\fR \fBcursor\fR \fBforeground\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "INHERITED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBtitle\fR
+.fi
+.LP
+See the "Toplevel" manual entry for details on the above inherited options.
+
+.SH "WIDGET-SPECIFIC OPTIONS"
+.LP
+.nf
+Name: \fBheight\fR
+Class: \fBHeight\fR
+Command-Line Switch: \fB-height\fR
+.fi
+.IP
+Specifies the height of the shell. The value may be specified in
+any of the forms acceptable to \fBTk_GetPixels\fR. A value of zero
+causes the height to be adjusted to the required value based on
+the size requests of the components placed in the childsite.
+Otherwise, the height is fixed. The default is zero. NOTE: This
+may cause some amount of flickering on slower machines. To prevent it
+simply set the width and height to a appropriate value.
+.LP
+.nf
+Name: \fBmaster\fR
+Class: \fBWindow\fR
+Command-Line Switch: \fB-master\fR
+.fi
+.IP
+Defines the shell as being a transient window with the master window
+given by the master option. The master window should be either another
+existing toplevel window or {} for no master. The default is {} for
+shells and "." for dialogs.
+.LP
+.nf
+Name: \fBmodality\fR
+Class: \fBModality\fR
+Command-Line Switch: \fB-modality\fR
+.fi
+.IP
+Allows the shell to grab control of the screen in one of three different ways:
+\fBapplication\fR, \fBsystem\fR, or \fBnone\fR.
+Application modal prevents any other toplevel windows within the application
+which are direct children of '.' from gaining focus. System modal locks
+the screen and prevents all windows from gaining focus regardless of
+application. A modality of none performs no grabs at all. The default
+is none.
+.LP
+.nf
+Name: \fBpadX\fR
+Class: \fBPad\fR
+Command-Line Switch: \fB-padx\fR
+.fi
+.IP
+Specifies a padding distance for the childsite in the X-direction in
+any of the forms acceptable to \fBTk_GetPixels\fR. The default is 10.
+.LP
+.nf
+Name: \fBpadY\fR
+Class: \fBPad\fR
+Command-Line Switch: \fB-pady\fR
+.fi
+.IP
+Specifies a padding distance for the childsite in the Y-direction in
+any of the forms acceptable to \fBTk_GetPixels\fR. The default is 10.
+.LP
+.nf
+Name: \fBwidth\fR
+Class: \fBWidth\fR
+Command-Line Switch: \fB-width\fR
+.fi
+.IP
+Specifies the width of the shell. The value may be specified in
+any of the forms acceptable to \fBTk_GetPixels\fR. A value of zero
+causes the width to be adjusted to the required value based on
+the size requests of the components placed in the childsite.
+Otherwise, the width is fixed. The default is zero. NOTE: This
+may cause some amount of flickering on slower machines. To prevent it
+simply set the width and height to a appropriate value.
+.BE
+
+.SH DESCRIPTION
+.PP
+The \fBiwidgets::shell\fR command creates a shell which is a top
+level widget which supports modal operation.
+
+.SH "METHODS"
+.PP
+The \fBiwidgets::shell\fR command create a new Tcl command whose
+name is \fIpathName\fR. This command may be used to invoke various
+operations on the widget. It has the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIOption\fR and the \fIarg\fRs
+determine the exact behavior of the command. The following
+commands are possible for shell widgets:
+.SH "WIDGET-SPECIFIC METHODS"
+.TP
+\fIpathName \fBactivate\fR
+Display the shell and wait based on the modality. For application
+and system modal activations, perform a grab operation, and wait
+for the result. The result may be returned via an argument to the
+\fBdeactivate\fR method.
+.TP
+\fIpathName \fBcenter\fR \fI?widget?\fR
+Centers the shell with respect to another widget. The widget argument
+is optional. If provided, it should be the path of another widget with
+to center upon. If absent, then the shell will be centered on the screen
+as a whole.
+.TP
+\fIpathName \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given
+by \fIoption\fR.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::shell\fR
+command.
+.TP
+\fIpathName \fBchildsite\fR
+Returns the pathname of the child site widget.
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR?
+Query or modify the configuration options of the widget.
+If no \fIoption\fR is specified, returns a list describing all of
+the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for
+information on the format of this list). If \fIoption\fR is specified
+with no \fIvalue\fR, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no \fIoption\fR is specified). If
+one or more \fIoption\-value\fR pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::shell\fR
+command.
+.TP
+\fIpathName \fBdeactivate\fR ?\fIarg\fR?
+Deactivate the display of the shell. The method takes an optional
+argument to be passed to the \fBactivate\fR method which returns the value.
+The optional argument is only effective for application and system
+modal dialogs.
+
+.SH "COMPONENTS"
+.LP
+.nf
+Name: \fBshellchildsite\fR
+Class: \fBframe\fR
+.fi
+.IP
+The shellchildsite component is the user child site for the shell. See
+the "frame" widget manual entry for details on the shellchildsite
+component item.
+.fi
+
+.SH EXAMPLE
+.DS
+ package require Iwidgets 4.0
+ iwidgets::shell .sh -modality application -padx 20 -pady 20 -title Shell
+
+ pack [label [.sh childsite].l -text SHELL]
+
+ .sh center
+ .sh activate
+.DE
+.SH AUTHOR
+Mark L. Ulferts
+.DE
+Kris Raney
+.LP
+.SH KEYWORDS
+shell, widget
diff --git a/iwidgets/doc/spindate.n b/iwidgets/doc/spindate.n
new file mode 100644
index 00000000000..2e3a89dfcb9
--- /dev/null
+++ b/iwidgets/doc/spindate.n
@@ -0,0 +1,275 @@
+'\"
+'\" Copyright (c) 1995 DSC Technologies Corporation
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) spindate.n
+'\"
+.so man.macros
+.HS iwidgets::spindate iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+iwidgets::spindate \- Create and manipulate time spinner widgets
+.SH SYNOPSIS
+\fBiwidgets::spindate\fI \fIpathName \fR?\fIoptions\fR?
+.SH "INHERITANCE"
+itk::Widget <- iwidgets::Spindate
+
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBbackground\fR \fBcursor\fR \fBforeground\fR \fBrelief\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "ASSOCIATED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBtextBackground\fR \fBtextFont\fR
+.fi
+.LP
+See the "entryfield" manual entry for details on the above associated options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBlabelFont\fR \fBlabelMargin\fR
+.fi
+.LP
+See the "labeledwidget" manual entry for details on the above associated
+options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBarrowOrient\fR \fBrepeatDelay\fR \fBrepeatInterval\fR
+.fi
+.LP
+See the "spinner" manual entry for details on the above associated options.
+
+.SH "WIDGET-SPECIFIC OPTIONS"
+.LP
+.nf
+Name: \fBdateMargin\fR
+Class: \fBMargin\fR
+Command-Line Switch: \fB-datemargin\fR
+.fi
+.IP
+Specifies the margin space between the month, day, and year spinners is
+any of the forms accpetable to \fBTcl_GetPixels\fR. The default is 1 pixel.
+.LP
+.nf
+Name: \fBdayLabel\fR
+Class: \fBText\fR
+Command-Line Switch: \fB-daylabel\fR
+.fi
+.IP
+Specifies the text of the label for the day spinner. The default is
+"Day".
+.LP
+.nf
+Name: \fBdayOn\fR
+Class: \fBdayOn\fR
+Command-Line Switch: \fB-dayon\fR
+.fi
+.IP
+Specifies whether or not to display the day spinner in any of the forms
+acceptable to \fBTcl_GetBoolean\fR. The default is true.
+.LP
+.nf
+Name: \fBdayWidth\fR
+Class: \fBWidth\fR
+Command-Line Switch: \fB-daywidth\fR
+.fi
+.IP
+Specifies the width of the day spinner in any of the forms acceptable to
+\fBTcl_GetPixels\fR. The default is 3 pixels.
+.LP
+.nf
+Name: \fBlabelPos\fR
+Class: \fBPosition\fR
+Command-Line Switch: \fB-labelpos\fR
+.fi
+.IP
+Specifies the position of the label along the sides of the various
+spinners: \fBn\fR, \fBe\fR, \fBs\fR, or \fBw\fR. The default is w.
+.LP
+.nf
+Name: \fBmonthFormat\fR
+Class: \fBMonthFormat\fR
+Command-Line Switch: \fB-monthformat\fR
+.fi
+.IP
+Specifies the format of month display, \fBinteger\fR (1-12) or \fBbrief\fR
+strings (Jan - Dec), or \fBfull\fR strings (January - December).
+.LP
+.nf
+Name: \fBmonthLabel\fR
+Class: \fBText\fR
+Command-Line Switch: \fB-monthlabel\fR
+.fi
+.IP
+Specifies the text of the label for the month spinner. The default is "Month".
+.LP
+.nf
+Name: \fBmonthOn\fR
+Class: \fBmonthOn\fR
+Command-Line Switch: \fB-monthon\fR
+.fi
+.IP
+Specifies whether or not to display the month spinner in any of the forms
+acceptable to \fBTcl_GetBoolean\fR. The default is true.
+.LP
+.nf
+Name: \fBmonthWidth\fR
+Class: \fBWidth\fR
+Command-Line Switch: \fB-monthwidth\fR
+.fi
+.IP
+Specifies the width of the month spinner in any of the forms acceptable to
+\fBTcl_GetPixels\fR. The default is 3 pixels.
+.LP
+.nf
+Name: \fBorient\fR
+Class: \fBOrient\fR
+Command-Line Switch: \fB-orient\fR
+.fi
+.IP
+Specifies the orientation of the month, day, and year spinners: \fBvertical\fR or \fBhorizontal\fR. The default is horizontal.
+.LP
+.nf
+Name: \fByearDigits\fR
+Class: \fBYearDigits\fR
+Command-Line Switch: \fB-yeardigits\fR
+.fi
+.IP
+Specifies the number of digits to be displayed as the value for the year
+spinner. The valid values are 2 and 4. The default is 2.
+.LP
+.nf
+Name: \fByearLabel\fR
+Class: \fBText\fR
+Command-Line Switch: \fB-yearlabel\fR
+.fi
+.IP
+Specifies the text of the label for the year spinner. The default is
+"Year"
+.LP
+.nf
+Name: \fByearOn\fR
+Class: \fByearOn\fR
+Command-Line Switch: \fB-yearon\fR
+.fi
+.IP
+Specifies whether or not to display the year spinner in any of the forms
+acceptable to \fBTcl_GetBoolean\fR. The default is true.
+.LP
+.nf
+Name: \fByearWidth\fR
+Class: \fBWidth\fR
+Command-Line Switch: \fB-yearwidth\fR
+.fi
+.IP
+Specifies the width of the year spinner in any of the forms acceptable to
+\fBTcl_GetPixels\fR. The default is 3 pixels.
+.LP
+.nf
+.BE
+
+.SH DESCRIPTION
+.PP
+
+The \fBiwidgets::spindate\fR command creates a set of spinners for use in date value
+entry. The set includes an month, day, and year spinner widget.
+
+.SH "METHODS"
+.PP
+The \fBiwidgets::spindate\fR command creates a new Tcl command whose
+name is \fIpathName\fR. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIOption\fR and the \fIarg\fRs
+determine the exact behavior of the command. The following
+commands are possible for spindate widgets:
+
+.SH "WIDGET-SPECIFIC METHODS"
+.TP
+\fIpathName \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given
+by \fIoption\fR.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::spindate\fR
+command.
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR?
+Query or modify the configuration options of the widget.
+If no \fIoption\fR is specified, returns a list describing all of
+the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for
+information on the format of this list). If \fIoption\fR is specified
+with no \fIvalue\fR, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no \fIoption\fR is specified). If
+one or more \fIoption\-value\fR pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::spindate\fR
+command.
+.TP
+\fIpathName \fBget\fR ?\fBformat\fR?
+Returns the current contents of the spindate widget in a format of
+string or as an integer clock value using the \fB-string\fR and \fB-clicks\fR
+format options respectively. The default is by string. Reference the
+clock command for more information on obtaining dates and their
+formats.
+.TP
+\fIpathName \fBshow\fR \fIdate\fR
+Changes the currently displayed date to be that of the date
+argument. The date may be specified either as a string, an
+integer clock value or the keyword "now". Reference the clock
+command for more information on obtaining dates and their formats.
+
+.ta 4c
+.SH "COMPONENTS"
+.LP
+.nf
+Name: \fBmonth\fR
+Class: \fBSpinner\fR
+.fi
+.IP
+The month spinner component is the month spinner of the date spinner.
+See the Spinner widget manual entry for details on the month component item.
+.LP
+.nf
+Name: \fBday\fR
+Class: \fBSpinint\fR
+.fi
+.IP
+The day spinner component is the day spinner of the date spinner.
+See the SpinInt widget manual entry for details on the day component item.
+.LP
+.nf
+Name: \fByear\fR
+Class: \fBSpinint\fR
+.fi
+.IP
+The year spinner component is the year spinner of the date spinner.
+See the SpinInt widget manual entry for details on the year component item.
+.fi
+
+.SH EXAMPLE
+.DS
+package require Iwidgets 4.0
+iwidgets::spindate .sd
+pack .sd -padx 10 -pady 10
+.DE
+.SH AUTHOR
+Sue Yockey
+.DE
+Mark L. Ulferts
+.SH KEYWORDS
+spindate, spinint, spinner, entryfield, entry, widget
+
diff --git a/iwidgets/doc/spinint.n b/iwidgets/doc/spinint.n
new file mode 100644
index 00000000000..c978f5bba76
--- /dev/null
+++ b/iwidgets/doc/spinint.n
@@ -0,0 +1,185 @@
+'\"
+'\" Copyright (c) 1995 DSC Technologies Corporation
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) spinint.n 1.21 94/12/17 16:04:44
+'\"
+.so man.macros
+.HS iwidgets::spinint iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+iwidgets::spinint \- Create and manipulate a integer spinner widget
+.SH SYNOPSIS
+\fBiwidgets::spinint\fI \fIpathName \fR?\fIoptions\fR?
+.SH "INHERITANCE"
+itk::Widget <- iwidgets::Labeledwidget <- iwidgets::Spinner <- iwidgets::Spinint
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fB
+background borderWidth cursor exportSelection
+foreground highlightColor highlightThickness insertBackground
+insertBorderWidth insertOffTime insertOnTime insertWidth
+justify relief selectBackground selectBorderWidth
+selectForeground textVariable\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "ASSOCIATED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBshow\fR \fBstate\fR
+.fi
+.LP
+See the "entry" manual entry for details on the associated options.
+.SH "INHERITED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBcommand\fR \fBchildSitePos\fR \fBfixed\fR \fBfocusCommand\fR
+\fBinvalid\fR \fBtextBackground\fR \fBtextFont\fR \fBvalidate\fR
+\fBwidth\fR
+.fi
+.LP
+See the "entryfield" widget manual entry for details on the above
+inherited options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBdisabledForeground\fR \fBlabelBitmap\fR \fBlabelFont\fR \fBlabelImage\fR
+\fBlabelMargin\fR \fBlabelPos\fR \fBlabelText\fR \fBlabelVariable\fR
+\fBstate\fR \fBsticky\fR
+.fi
+.LP
+See the "labeledwidget" widget manual entry for details on the above
+inherited options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBarroworient\fR \fBdecrement\fR \fBincrement\fR \fBrepeatDelay\fR
+\fBrepeatInterval\fR
+.fi
+.LP
+See the "spinner" widget manual entry for details on the above
+inherited options.
+
+.SH "WIDGET-SPECIFIC OPTIONS"
+.LP
+.nf
+Name: \fBrange\fR
+Class: \fBRange\fR
+Command-Line Switch: \fB-range\fR
+.fi
+.IP
+Specifies a two element list of minimum and maximum integer values. The
+default is no range, {{} {}}.
+.LP
+.nf
+Name: \fBstep\fR
+Class: \fBStep\fR
+Command-Line Switch: \fB-step\fR
+.fi
+.IP
+Specifies the increment/decrement value. The default is 1.
+.LP
+.nf
+Name: \fBwrap\fR
+Class: \fBWrap\fR
+Command-Line Switch: \fB-wrap\fR
+.fi
+.IP
+Specifies whether to wrap the spinner value upon reaching the minimum
+or maximum value in any of the forms acceptable to \fBTcl_GetBoolean\fR.
+The default is true.
+.LP
+.BE
+
+.SH DESCRIPTION
+.PP
+The \fBiwidgets::spinint\fR command creates a spinint widget. The spinint allows
+"spinning" of integer values within a specified range with wrap support.
+The spinner arrows may be drawn horizontally or vertically.
+.DE
+
+.SH "METHODS"
+.PP
+The \fBiwidgets::spinint\fR command creates a new Tcl command whose
+name is \fIpathName\fR. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIOption\fR and the \fIarg\fRs
+determine the exact behavior of the command. The following
+commands are possible for spinint widgets:
+.SH "ASSOCIATED METHODS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBdelete\fR \fBget\fR \fBicursor\fR \fBindex\fR
+\fBinsert\fR \fBpeek\fR \fBscan\fR \fBselection\fR
+\fBxview\fR
+.fi
+.LP
+See the "entry" manual entry for details on the associated methods.
+.SH "INHERITED METHODS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBchildsite\fR \fBclear\fR
+.fi
+.LP
+See the "entryfield" manual entry for details on the associated methods.
+.SH "WIDGET-SPECIFIC METHODS"
+.TP
+\fIpathName \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given
+by \fIoption\fR.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::spinint\fR
+command.
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR?
+Query or modify the configuration options of the widget.
+If no \fIoption\fR is specified, returns a list describing all of
+the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for
+information on the format of this list). If \fIoption\fR is specified
+with no \fIvalue\fR, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no \fIoption\fR is specified). If
+one or more \fIoption\-value\fR pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::spinint\fR
+command.
+.TP
+\fIpathName \fBdown\fR
+Decrement the spinner value by the value given in the step option.
+.TP
+\fIpathName \fBup\fR
+Increment the spinner value by the value given in the step option.
+
+.SH "COMPONENTS"
+.IP
+See the "Spinner" widget manual entry for details on the integer spinner
+component items.
+
+.SH EXAMPLE
+.DS
+ package require Iwidgets 4.0
+ option add *textBackground white
+
+ iwidgets::spinint .si -labeltext "Temperature" -labelpos w \\
+ -fixed yes -width 5 -range {32 212}
+
+ pack .si -pady 10
+.DE
+.SH AUTHOR
+Sue Yockey
+.SH KEYWORDS
+spinint, widget
diff --git a/iwidgets/doc/spinner.n b/iwidgets/doc/spinner.n
new file mode 100644
index 00000000000..d6a924acfd7
--- /dev/null
+++ b/iwidgets/doc/spinner.n
@@ -0,0 +1,229 @@
+'\"
+'\" Copyright (c) 1995 DSC Technologies Corporation
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) spinner.n 1.21 94/12/17 16:04:44
+'\"
+.so man.macros
+.HS iwidgets::spinner iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+iwidgets::spinner \- Create and manipulate a spinner widget
+.SH SYNOPSIS
+\fBiwidgets::spinner\fI \fIpathName \fR?\fIoptions\fR?
+.SH "INHERITANCE"
+itk::Widget <- iwidgets::Labeledwidget <- iwidgets::Spinner
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fB
+background borderWidth cursor exportSelection
+foreground highlightColor highlightThickness insertBackground
+insertBorderWidth insertOffTime insertOnTime insertWidth
+justify relief selectBackground selectBorderWidth
+selectForeground textVariable\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "ASSOCIATED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBshow\fR \fBstate\fR
+.fi
+.LP
+See the "entry" manual entry for details on the associated options.
+.SH "INHERITED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBchildSitePos\fR \fBcommand\fR \fBfixed\fR \fBfocusCommand\fR
+\fBinvalid\fR \fBtextBackground\fR \fBtextFont\fR \fBvalidate\fR
+\fBwidth\fR
+.fi
+.LP
+See the "entryfield" widget manual entry for details on the above
+inherited options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBdisabledForeground\fR \fBlabelBitmap\fR \fBlabelFont\fR \fBlabelImage\fR
+\fBlabelMargin\fR \fBlabelPos\fR \fBlabelText\fR \fBlabelVariable\fR
+\fBstate\fR \fBsticky\fR
+.fi
+.LP
+See the "labeledwidget" widget manual entry for details on the above
+inherited options.
+.SH "WIDGET-SPECIFIC OPTIONS"
+.LP
+.nf
+Name: \fBarrowOrient\fR
+Class: \fBOrient\fR
+Command-Line Switch: \fB-arroworient\fR
+.fi
+.IP
+Specifies placement of arrow buttons: \fBhorizontal\fR or \fBvertical\fR.
+The default is vertical.
+.LP
+.nf
+Name: \fBdecrement\fR
+Class: \fBCommand\fR
+Command-Line Switch: \fB-decrement\fR
+.fi
+.IP
+Tcl command to be executed when down arrow is pressed.
+.LP
+.nf
+Name: \fBincrement\fR
+Class: \fBCommand\fR
+Command-Line Switch: \fB-increment\fR
+.fi
+.IP
+Tcl command to be executed when up arrow is pressed.
+.LP
+.nf
+Name: \fBrepeatDelay\fR
+Class: \fBRepeatDelay\fR
+Command-Line Switch: \fB-repeatdelay\fR
+.fi
+.IP
+Specifies the initial delay in milliseconds before the spinner repeat action
+on the arrow buttons engages. The default is 300 milliseconds.
+.LP
+.nf
+Name: \fBrepeatInterval\fR
+Class: \fBRepeatInterval\fR
+Command-Line Switch: \fB-repeatinterval\fR
+.fi
+.IP
+Specifies the repeat delay in milliseconds between selections of the arrow
+buttons. A repeatinterval of 0 disables button repeat. The default is
+100 milliseconds.
+.LP
+.BE
+
+.SH DESCRIPTION
+.PP
+The \fBiwidgets::spinner\fR command creates a spinner widget. The spinner is
+comprised of an entryfield plus up and down arrow buttons.
+Arrows may be drawn horizontally or vertically.
+.DE
+
+.SH "METHODS"
+.PP
+The \fBiwidgets::spinner\fR command creates a new Tcl command whose
+name is \fIpathName\fR. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIOption\fR and the \fIarg\fRs
+determine the exact behavior of the command. The following
+commands are possible for spinner widgets:
+.SH "ASSOCIATED METHODS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBdelete\fR \fBget\fR \fBicursor\fR \fBindex\fR
+\fBinsert\fR \fBscan\fR \fBselection\fR \fBxview\fR
+.fi
+.LP
+See the "entry" manual entry for details on the associated methods.
+.SH "INHERITED METHODS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBchildsite\fR \fBclear\fR \fBpeek\fR
+.fi
+.LP
+See the "entryfield" manual entry for details on the associated methods.
+.SH "WIDGET-SPECIFIC METHODS"
+.TP
+\fIpathName \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given
+by \fIoption\fR.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::spinner\fR
+command.
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR?
+Query or modify the configuration options of the widget.
+If no \fIoption\fR is specified, returns a list describing all of
+the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for
+information on the format of this list). If \fIoption\fR is specified
+with no \fIvalue\fR, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no \fIoption\fR is specified). If
+one or more \fIoption\-value\fR pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::spinner\fR
+command.
+.TP
+\fIpathName \fBdown\fR
+Derived classes may overload this method to specialize functionality.
+.TP
+\fIpathName \fBup\fR
+Derived classes may overload this method to specialize functionality.
+
+.SH "COMPONENTS"
+.LP
+.nf
+Name: \fBdownarrow\fR
+Class: \fBCanvas\fR
+.fi
+.IP
+The downarrow component is the downward pointing button of the spinner. See
+the "canvas" widget manual entry for details on the downarrow component item.
+.LP
+.nf
+Name: \fBuparrow\fR
+Class: \fBCanvas\fR
+.fi
+.IP
+The uparrow component is the upward pointing button of the spinner. See
+the "canvas" widget manual entry for details on the uparrow component item.
+.fi
+
+.SH EXAMPLE
+.DS
+ package require Iwidgets 4.0
+ set months {January February March April May June July \\
+ August September October November December}
+
+ proc blockInput {char} {
+ return 0
+ }
+
+ proc spinMonth {step} {
+ global months
+
+ set index [expr [lsearch $months [.sm get]] + $step]
+
+ if {$index < 0} {set index 11}
+ if {$index > 11} {set index 0}
+
+ .sm delete 0 end
+ .sm insert 0 [lindex $months $index]
+ }
+
+ iwidgets::spinner .sm -labeltext "Month : " -width 10 -fixed 10 \\
+ -validate blockInput -decrement {spinMonth -1} -increment {spinMonth 1}
+ .sm insert 0 January
+
+ pack .sm -padx 10 -pady 10
+.DE
+.SH ACKNOWLEDGEMENTS:
+.LP
+Ken Copeland <ken@hilco.com>
+.IP
+10/18/95 - Added auto-repeat action to spinner arrow buttons.
+.LP
+.SH AUTHOR
+Sue Yockey
+.SH KEYWORDS
+spinner, widget
diff --git a/iwidgets/doc/spintime.n b/iwidgets/doc/spintime.n
new file mode 100644
index 00000000000..50698eda97d
--- /dev/null
+++ b/iwidgets/doc/spintime.n
@@ -0,0 +1,266 @@
+'\"
+'\" Copyright (c) 1995 DSC Technologies Corporation
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) spintime.n
+'\"
+.so man.macros
+.HS iwidgets::spintime iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+iwidgets::spintime \- Create and manipulate time spinner widgets
+.SH SYNOPSIS
+\fBiwidgets::spintime\fI \fIpathName \fR?\fIoptions\fR?
+.SH "INHERITANCE"
+itk::Widget <- iwidgets::Spintime
+
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBbackground\fR \fBcursor\fR \fBforeground\fR \fBrelief\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "ASSOCIATED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBtextBackground\fR \fBtextFont\fR
+.fi
+.LP
+See the "entryfield" manual entry for details on the above associated options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBlabelFont\fR \fBlabelMargin\fR
+.fi
+.LP
+See the "labeledwidget" manual entry for details on the above associated
+options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBarrowOrient\fR \fBrepeatDelay\fR \fBrepeatInterval\fR
+.fi
+.LP
+See the "spinner" manual entry for details on the above associated options.
+
+.SH "WIDGET-SPECIFIC OPTIONS"
+.LP
+.nf
+Name: \fBlabelPos\fR
+Class: \fBPosition\fR
+Command-Line Switch: \fB-labelpos\fR
+.fi
+.IP
+Specifies the position of the label along the sides of the various
+spinners: \fBn\fR, \fBe\fR, \fBs\fR, or \fBw\fR. The default is w.
+.LP
+.nf
+Name: \fBhourLabel\fR
+Class: \fBText\fR
+Command-Line Switch: \fB-hourlabel\fR
+.fi
+.IP
+Specifies the text of the label for the hour spinner. The default is "Hour".
+.LP
+.nf
+Name: \fBhourOn\fR
+Class: \fBhourOn\fR
+Command-Line Switch: \fB-houron\fR
+.fi
+.IP
+Specifies whether or not to display the hour spinner in any of the forms
+acceptable to \fBTcl_GetBoolean\fR. The default is true.
+.LP
+.nf
+Name: \fBhourWidth\fR
+Class: \fBWidth\fR
+Command-Line Switch: \fB-hourwidth\fR
+.fi
+.IP
+Specifies the width of the hour spinner in any of the forms acceptable to
+\fBTcl_GetPixels\fR. The default is 3 pixels.
+.LP
+.nf
+Name: \fBmilitaryOn\fR
+Class: \fBmilitaryOn\fR
+Command-Line Switch: \fB-militaryon\fR
+.fi
+.IP
+Specifies use of a 24 hour clock for hour display in any of the forms
+acceptable to \fBTcl_GetBoolean\fR. The default is true.
+.LP
+.nf
+Name: \fBminuteLabel\fR
+Class: \fBText\fR
+Command-Line Switch: \fB-minutelabel\fR
+.fi
+.IP
+Specifies the text of the label for the minute spinner. The default is
+"Minute".
+.LP
+.nf
+Name: \fBminuteOn\fR
+Class: \fBminuteOn\fR
+Command-Line Switch: \fB-minuteon\fR
+.fi
+.IP
+Specifies whether or not to display the minute spinner in any of the forms
+acceptable to \fBTcl_GetBoolean\fR. The default is true.
+.LP
+.nf
+Name: \fBminuteWidth\fR
+Class: \fBWidth\fR
+Command-Line Switch: \fB-minutewidth\fR
+.fi
+.IP
+Specifies the width of the minute spinner in any of the forms acceptable to
+\fBTcl_GetPixels\fR. The default is 3 pixels.
+.LP
+.nf
+Name: \fBorient\fR
+Class: \fBOrient\fR
+Command-Line Switch: \fB-orient\fR
+.fi
+.IP
+Specifies the orientation of the hour, minute, and second spinners: \fBvertical\fR or \fBhorizontal\fR. The default is horizontal.
+.LP
+.nf
+Name: \fBsecondLabel\fR
+Class: \fBText\fR
+Command-Line Switch: \fB-secondlabel\fR
+.fi
+.IP
+Specifies the text of the label for the second spinner. The default is
+"Second"
+.LP
+.nf
+Name: \fBsecondOn\fR
+Class: \fBsecondOn\fR
+Command-Line Switch: \fB-secondon\fR
+.fi
+.IP
+Specifies whether or not to display the second spinner in any of the forms
+acceptable to \fBTcl_GetBoolean\fR. The default is true.
+.LP
+.nf
+Name: \fBsecondWidth\fR
+Class: \fBWidth\fR
+Command-Line Switch: \fB-secondwidth\fR
+.fi
+.IP
+Specifies the width of the second spinner in any of the forms acceptable to
+\fBTcl_GetPixels\fR. The default is 3 pixels.
+.LP
+.nf
+Name: \fBtimeMargin\fR
+Class: \fBMargin\fR
+Command-Line Switch: \fB-timemargin\fR
+.fi
+.IP
+Specifies the margin space between the hour, minute, and second spinners is
+any of the forms accpetable to \fBTcl_GetPixels\fR. The default is 1 pixel.
+.LP
+.nf
+.BE
+
+.SH DESCRIPTION
+.PP
+
+The \fBiwidgets::spintime\fR command creates a set of spinners for use in time value
+entry. The set includes an hour, minute, and second spinner widget.
+
+.SH "METHODS"
+.PP
+The \fBiwidgets::spintime\fR command creates a new Tcl command whose
+name is \fIpathName\fR. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIOption\fR and the \fIarg\fRs
+determine the exact behavior of the command. The following
+commands are possible for spintime widgets:
+
+.SH "WIDGET-SPECIFIC METHODS"
+.TP
+\fIpathName \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given
+by \fIoption\fR.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::spintime\fR
+command.
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR?
+Query or modify the configuration options of the widget.
+If no \fIoption\fR is specified, returns a list describing all of
+the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for
+information on the format of this list). If \fIoption\fR is specified
+with no \fIvalue\fR, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no \fIoption\fR is specified). If
+one or more \fIoption\-value\fR pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::spintime\fR
+command.
+.TP
+\fIpathName \fBget\fR ?\fBformat\fR?
+Returns the current contents of the spintime widget in a format of
+string or as an integer clock value using the \fB-string\fR and \fB-clicks\fR
+format options respectively. The default is by string. Reference the
+clock command for more information on obtaining time and its
+formats.
+.TP
+\fIpathName \fBshow\fR \fItime\fR
+Changes the currently displayed time to be that of the time
+argument. The time may be specified either as a string, an
+integer clock value or the keyword "now". Reference the clock
+command for more information on obtaining times and its format.
+
+.ta 4c
+.SH "COMPONENTS"
+.LP
+.nf
+Name: \fBhour\fR
+Class: \fBSpinint\fR
+.fi
+.IP
+The hour component is the hour spinner of the time spinner. See the
+SpinInt widget manual entry for details on the hour component item.
+.LP
+.nf
+Name: \fBminute\fR
+Class: \fBSpinint\fR
+.fi
+.IP
+The minute component is the minute spinner of the time spinner. See
+the SpinInt widget manual entry for details on the minute component item.
+.LP
+.nf
+Name: \fBsecond\fR
+Class: \fBSpinint\fR
+.fi
+.IP
+The second component is the second spinner of the time spinner. See the
+SpinInt widget manual entry for details on the second component item.
+.fi
+
+.SH EXAMPLE
+.DS
+package require Iwidgets 4.0
+iwidgets::spintime .st
+pack .st -padx 10 -pady 10
+.DE
+.SH AUTHOR
+Sue Yockey
+.DE
+Mark L. Ulferts
+.SH KEYWORDS
+spintime, spinint, spinner, entryfield, entry, widget
+
diff --git a/iwidgets/doc/tabnotebook.n b/iwidgets/doc/tabnotebook.n
new file mode 100644
index 00000000000..09da51060f4
--- /dev/null
+++ b/iwidgets/doc/tabnotebook.n
@@ -0,0 +1,659 @@
+'\"
+'\" Copyright (c) 1995 DSC Technologies Corporation
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) tabnotebook.n
+'\"
+.so man.macros
+.HS iwidgets::tabnotebook iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+iwidgets::tabnotebook \- create and manipulate tabnotebook widgets
+.SH SYNOPSIS
+\fBiwidgets::tabnotebook\fR \fIpathName\fR? \fIoptions\fR?
+.SH "INHERITANCE"
+itk::Widget <- iwidgets::Tabnotebook
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fB
+background disabledForeground foreground scrollCommand
+cursor font height width\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "WIDGET-SPECIFIC OPTIONS"
+.LP
+.nf
+Name: \fBangle\fR
+Class: \fBAngle\fR
+Command-Line Switch: \fB-angle\fR
+.fi
+.IP
+Specifes the angle of slope from the inner edge to the outer edge of the tab.
+An angle of 0 specifies square tabs. Valid ranges are 0 to 45 degrees
+inclusive. Default is 15 degrees. If \fBtabPos\fR is e or w, this option
+is ignored.
+.LP
+.nf
+Name: \fBauto\fR
+Class: \fBAuto\fR
+Command-Line Switch: \fB-auto\fR
+.fi
+.IP
+Specifies whether to use the automatic packing/unpacking algorithm of the
+notebook. A value of true indicates that page frames will be unpacked and
+packed acoording to the algorithm described in the select command. A value
+of \fBfalse\fR leaves the current page packed and
+subsequent \fBselects\fR, \fBnext\fR, or \fBprevious\fR commands do not
+switch pages automatically. In either case the page's associated
+command (see the \fBadd\fR command's description of the command option) is
+invoked. The value may have any of the forms accepted by
+the \fBTcl_GetBoolean\fR, such as \fBtrue\fR, \fBfalse\fR, \fB0\fR,
+\fB1\fR, \fByes\fR, or \fBno\fR.
+.LP
+.nf
+Name: \fBbackdrop\fR
+Class: \fBBackdrop\fR
+Command-Line Switch: \fB-backdrop\fR
+.fi
+.IP
+Specifies a background color to use when filling in the backdrop area
+behind the tabs.
+.LP
+.nf
+Name: \fBbackground\fR
+Class: \fBBackground\fR
+Command-Line Switch: \fB-background\fR
+.fi
+.IP
+Specifies a background color to use for displaying a page and its associated
+tab. This can be thought of as the selected tab background color, since the
+tab associated with the selected page is the selected tab.
+.LP
+.nf
+Name: \fBbevelAmount\fR
+Class: \fBBevelAmount\fR
+Command-Line Switch: \fB-bevelamount\fR
+.fi
+.IP
+Specifes the size of tab corners. A value of 0 with \fBangle\fR set to
+0 results in square tabs. A \fBbevelAmount\fR of 4, means that the tab will
+be drawn with angled corners that cut in 4 pixels from the edge of
+the tab. The default is 0.
+.LP
+.nf
+Name: \fBborderWidth\fR
+Class: \fBBorderWidth\fR
+Command-Line Switch: \fB-borderwidth\fR
+.fi
+.IP
+Specifies the width of shadowed border to place around the notebook area of
+the tabnotebook. The default value is 2.
+.LP
+.nf
+Name: \fBdisabledForeground\fR
+Class: \fBDisabledForeground\fR
+Command-Line Switch: \fB-disabledforeground\fR
+.fi
+.IP
+Specifies a foreground color to use for displaying a tab's label when
+its \fBstate\fR is disabled.
+.LP
+.nf
+Name: \fBequalTabs\fR
+Class: \fBEqualTabs\fR
+Command-Line Switch: \fB-equaltabs\fR
+.fi
+.IP
+Specifies whether to force tabs to be equal sized or not. A value
+of \fBtrue\fR means constrain tabs to be equal sized. A value
+of \fBfalse\fR allows each tab to size based on the text label size. The
+value may have any of the forms accepted by the \fBTcl_GetBoolean\fR, such
+as \fBtrue\fR, \fBfalse\fR, \fB0\fR, \fB1\fR, \fByes\fR, or \fBno\fR.
+.IP
+For horizontally positioned tabs (\fBtabpos\fR is either \fBs\fR or \fBn\fR),
+\fBtrue\fR forces all tabs to be equal width (the width being equal to
+the longest label plus any \fBpadX\fR specified). Horizontal tabs are
+always equal in height.
+.IP
+For vertically positioned tabs (\fBtabpos\fR is either \fBw\fR or \fBe\fR),
+\fBtrue\fR forces all tabs to be equal height (the height being equal to the
+height of the label with the largest font). Vertically oriented tabs
+are always equal in width.
+.LP
+.nf
+Name: \fBforeground\fR
+Class: \fBForeground\fR
+Command-Line Switch: \fB-foreground\fR
+.fi
+.IP
+Specifies a foreground color to use for displaying a page and its associated
+tab label. This can be thought of as the selected tab background color,
+since the tab associated with the selected page is the selected tab.
+.LP
+.nf
+Name: \fBgap\fR
+Class: \fBGap\fR
+Command-Line Switch: \fB-gap\fR
+.fi
+.IP
+Specifies the amount of pixel space to place between each tab. Value may
+be any pixel offset value. In addition, a special keyword \fBoverlap\fR
+can be used as the value to achieve a standard overlap of tabs. This value
+may have any of the forms acceptable to \fBTk_GetPixels\fR.
+.LP
+.nf
+Name: \fBmargin\fR
+Class: \fBMargin\fR
+Command-Line Switch: \fB-Bmargin\fR
+.fi
+.IP
+Specifies the amount of space to place between the outside edge of the
+tabnotebook and the outside edge of its tabs. If \fBtabPos\fR is \fBs\fR,
+this is the amount of space between the bottom edge of the tabnotebook and
+the bottom edge of the set of tabs. If \fBtabPos\fR is \fBn\fR, this is
+the amount of space between the top edge of the tabnotebook and the top
+edge of the set of tabs. If \fBtabPos\fR is \fBe\fR, this is the amount of
+space between the right edge of the tabnotebook and the right edge of the
+set of tabs. If \fBtabPos\fR is \fBw\fR, this is the amount of space
+between the left edge of the tabnotebook and the left edge of the set
+of tabs. This value may have any of the forms acceptable to \fBTk_GetPixels\fR.
+.LP
+.nf
+Name: \fBpadX\fR
+Class: \fBPadX\fR
+Command-Line Switch: \fB-padx\fR
+.fi
+.IP
+Specifies a non-negative value indicating how much extra space to request
+for a tab around its label in the X-direction. When computing how large
+a window it needs, the tab will add this amount to the width it would
+normally need The tab will end up with extra internal space to the left
+and right of its text label. This value may have any of the forms acceptable
+to \fBTk_GetPixels\fR.
+.LP
+.nf
+Name: \fBpadY\fR
+Class: \fBPadY\fR
+Command-Line Switch: \fB-pady\fR
+.fi
+.IP
+Specifies a non-negative value indicating how much extra space to request for
+a tab around its label in the Y-direction. When computing how large a
+window it needs, the tab will add this amount to the height it would normally
+need The tab will end up with extra internal space to the top and bottom of
+its text label. This value may have any of the forms acceptable
+to \fBTk_GetPixels\fR.
+.LP
+.nf
+Name: \fBraiseSelect\fR
+Class: \fBRaiseSelect\fR
+Command-Line Switch: \fB-raiseselect\fR
+.fi
+.IP
+Specifes whether to slightly raise the selected tab from the rest of the
+tabs. The selected tab is drawn 2 pixels closer to the outside of the
+tabnotebook than the unselected tabs. A value of \fBtrue\fR says to
+raise selected tabs, a value of \fBfalse\fR turns this feature off. The
+default is \fBfalse\fR. The value may have any of the forms accepted
+by the \fBTcl_GetBoolean\fR, such as \fBtrue\fR, \fBfalse\fR, \fB0\fR,
+\fB1\fR, \fByes\fR, or \fBno\fR.
+.LP
+.nf
+Name: \fBstart\fR
+Class: \fBStart\fR
+Command-Line Switch: \fB-start\fR
+.fi
+.IP
+Specifies the amount of space to place between the left or top edge of the
+tabnotebook and the starting edge of its tabs. For horizontally positioned
+tabs, this is the amount of space between the left edge of the notebook and
+the left edge of the first tab. For vertically positioned tabs, this is the
+amount of space between the top of the notebook and the top of the first
+tab. This value may change if the user performs a MButton-2 scroll on the
+tabs. This value may have any of the forms acceptable to \fBTk_GetPixels\fR.
+.LP
+.nf
+Name: \fBstate\fR
+Class: \fBState\fR
+Command-Line Switch: \fB-state\fR
+.fi
+.IP
+Sets the active state of the tabnotebook. Specifying \fBnormal\fR allows
+all pages to be selectable. Specifying \fBdisabled\fR disables the notebook
+causing all page tabs to be drawn in the \fBdisabledForeground\fR color.
+.LP
+.nf
+Name: \fBtabBackground\fR
+Class: \fBTabBackground\fR
+Command-Line Switch: \fB-tabbackground\fR
+.fi
+.IP
+Specifies a background color to use for displaying tab backgrounds when
+they are in their unselected state. This is the background associated with
+tabs on all pages other than the selected page.
+.LP
+.nf
+Name: \fBtabBorders\fR
+Class: \fBTabBorders\fR
+Command-Line Switch: \fB-tabborders\fR
+.fi
+.IP
+Specifies whether to draw the borders of tabs that are not selected.
+Specifying \fBtrue\fR (the default) draws these borders,
+specifying \fBfalse\fR draws only the border around the selected tab. The
+value may have any of the forms accepted by the \fBTcl_GetBoolean\fR,
+such as \fBtrue\fR, \fBfalse\fR, \fB0\fR, \fB1\fR,\fB yes\fR, or \fBno\fR.
+.LP
+.nf
+Name: \fBtabForeground\fR
+Class: \fBTabForeground\fR
+Command-Line Switch: \fB-tabforeground\fR
+.fi
+.IP
+Specifies a foreground color to use for displaying tab labels when they
+are in their unselected state. This is the foreground associated with tabs
+on all pages other than the selected page.
+.LP
+.nf
+Name: \fBtabPos\fR
+Class: \fBTabPos\fR
+Command-Line Switch: \fB-tabpos\fR
+.fi
+.IP
+Specifies the location of the set of tabs in relation to the notebook
+area. Must be n, s, e, or w. Defaults to s.
+.BE
+.SH DESCRIPTION
+.PP
+The \fBiwidgets::tabnotebook\fR command creates a new window (given by the pathName
+argument) and makes it into a \fBtabnotebook\fR widget. Additional options,
+described above may be specified on the command line or in the option
+database to configure aspects of the tabnotebook such as its colors, font,
+and text. The iwidgets::tabnotebook command returns its pathName argument. At the
+time this command is invoked, there must not exist a window named
+pathName, but pathName's parent must exist.
+.PP
+A \fBtabnotebook\fR is a widget that contains a set of tabbed pages. It
+displays one page from the set as the selected page. A Tab displays the
+label for the page to which it is attached and serves as a page
+selector. When a page's tab is selected, the page's contents are displayed
+in the page area. The selected tab has a three-dimensional effect to make
+it appear to float above the other tabs. The tabs are displayed as a group
+along either the left, top, right, or bottom edge. When first created a
+tabnotebook has no pages. Pages may be added or deleted using widget
+commands described below.
+.PP
+A special option may be provided to the tabnotebook. The \fB-auto\fR
+option specifies whether the tabnotebook will automatically handle the
+unpacking and packing of pages when pages are selected. A value of
+true signifies that the notebook will automatically manage it. This is the
+default value. A value of false signifies the notebook will not perform
+automatic switching of pages.
+.SH NOTEBOOK PAGES
+A tabnotebook's pages area contains a single child site frame. When a
+new page is created it is a child of this frame. The page's child site
+frame serves as a geometry container for applications to pack widgets
+into. It is this frame that is automatically unpacked or packed when
+the auto option is true. This creates the effect of one page being visible
+at a time. When a new page is selected, the previously selected page's
+child site frame is automatically unpacked from the tabnotebook's child
+site frame and the newly selected page's child site is packed into the
+tabnotebook's child site frame.
+.PP
+However, sometimes it is desirable to handle page changes in a different
+manner. By specifying the \fBauto\fR option as \fBfalse\fR, child site
+packing can be disabled and done differently. For example, all widgets
+might be packed into the first page's child site \fBframe\fR. Then when
+a new page is selected, the application can reconfigure the widgets
+and give the appearance that the page was flipped.
+.PP
+In both cases the command option for a page specifies a Tcl Command
+to execute when the page is selected. In the case of \fBauto\fR
+being \fBtrue\fR, it is between the unpacking of the previously selected
+page and the packing of the newly selected page.
+.PP
+Notebook pages can also be controlled with scroll bars or other widgets
+that obey the \fBscrollcommand\fR protocol. By giving a scrollbar
+a \fB-command\fR to call the tabnotebook's \fBselect\fR method, the
+tabnotebook can be controlled with a scrollbar.
+.PP
+The notebook area is implemented with the notebook mega widget.
+.SH TABS
+Tabs appear along the edge of the notebook area. Tabs are drawn to appear
+attached to their associated page. When a tab is clicked on, the associated
+page is selected and the tab is drawn as raised above all other tabs and as
+a seamless part of its notebook page. Tabs can be controlled in their
+location along the edges, the angle tab sides are drawn with, gap between
+tabs, starting margin of tabs, internal padding around text labels in
+a tab, the font, and its label.
+.PP
+The Tab area is implemented with the \fBtabset\fR mega widget.
+See \fBtabset(1)\fR. Tabs may be oriented along either the north, south,
+east, or west sides with the \fBtabPos\fR option. North and south tabs
+may appear as angled, square, or bevelled. West and east tabs may appear
+as square or bevelled. By changing tab gaps, tab angles, bevelling,
+orientations, colors, fonts, start locations, and margins; tabs may appear
+in a wide variety of styles. For example, it is possible to implement
+Microsoft-style tabs, Borland property tab styles, or Borland Delphi
+style tabs all with the same tabnotebook.
+.SH "WIDGET-SPECIFIC METHODS"
+.PP
+The \fBiwidgets::tabnotebook\fR command creates a new Tcl command whose name
+is \fIpathName\fR. This command may be used to invoke various operations
+on the widget. It has the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIoption\fR and the \fIarg\fRs
+determine the exact behavior of the command.
+.PP
+Many of the widget commands for a notebook take as one argument an
+indicator of which page of the notebook to operate on. These indicators are
+called indexes and may be specified in any of the following forms:
+.TP
+\fInumber\fR
+Specifies the page numerically, where 0 corresponds to the first page
+in the notebook, 1 to the second, and so on.
+.TP
+\fBselect\fR
+Specifies the currently selected page's index. If no page is currently
+selected, the value -1 is returned.
+.TP
+\fBend\fR
+Specifes the last page in the tabnotebook's index. If the notebook is empty
+this will return -1.
+.TP
+\fIpattern\fR
+If the index doesn't satisfy any of the above forms, then this form is
+used. Pattern is pattern-matched against the label of each page in the
+notebook, in order from the first to the last page, until a matching entry
+is found. The rules of Tcl_StringMatch are used.
+'.............................................................................
+The following commands are possible for tabnotebook widgets:
+.TP
+\fIpathName\fR \fBadd\fR ?\fIoption\fR \fIvalue\fR \fIoption\fR \fIvalue\fR ...?
+Add a new page at the end of the tabnotebook. A new child site frame is
+created. Returns the child site pathName. If additional arguments are
+present, they specify any of the following options:
+.RS
+.TP
+\fB-angle\fR \fIvalue\fR
+Specifes the angle of slope from the inner edge to the outer edge of the
+tab. An angle of 0 specifies square tabs. Valid ranges are 0 to 45 degrees
+inclusive. Default is 15 degrees. If this option is specified as an empty
+string (the default), then the angle option for the overall tabnotebook
+is used. This is generally only set at the tabnotebook level. Tabs normally
+will want to share the same angle value.
+.TP
+\fB-background\fR \fIvalue\fR
+Specifies a background color to use for displaying tabs when they are
+selected and for displaying the current page. If this option is specified
+as an empty string (the default), then the background option for the
+overall tabnotebook is used.
+.TP
+\fB-bevelamount\fR \fIvalue\fR
+Specifes the size of tab corners. A value of 0 with angle set to 0
+results in square tabs. A bevelAmount of 4, means that the tab will be
+drawn with angled corners that cut in 4 pixels from the edge of the tab.
+The default is 0. This is generally only set at the tabnotebook level.
+Tabs normally will want to share the same bevelAmount.
+.TP
+\fB-bitmap\fR \fIvalue\fR
+If label is a non-empty string, specifies a bitmap to display in this
+page's tab. Bitmap may be of any of the forms accepted by Tk_GetPixmap.
+.TP
+\fB-command\fR \fIvalue\fR
+Specifies a Tcl command to be executed when this page is selected. This
+allows the programmer a hook to reconfigure this page's widgets or any
+other page's widgets.
+.IP
+If the tabnotebook has the auto option set to true, when a page is
+selected this command will be called immediately after the previously
+selected page is unpacked and immediately before this page is selected. The
+index value select is valid during this Tcl command. `index select' will
+return this page's page number.
+.IP
+If the auto option is set to false, when a page is selected the unpack
+and pack calls are bypassed. This Tcl command is still called.
+.TP
+\fB-disabledforeground\fR \fIvalue\fR
+Specifies a foreground color to use for displaying tab labels when tabs
+are in their disable state. If this option is specified as an empty
+string (the default), then the disabledforeground option for the overall
+tabnotebook is used.
+.TP
+\fB-font\fR \fIvalue\fR
+Specifies the font to use when drawing a text label on a page tab. If
+this option is specified as an empty string then the font option for the
+overall tabnotebook is used..
+.TP
+\fB-foreground\fR \fIvalue\fR
+Specifies a foreground color to use for displaying tab labels when they are
+selected. If this option is specified as an empty string (the default),
+then the foreground option for the overall tabnotebook is used.
+.TP
+\fB-label\fR \fIvalue\fR
+Specifies a string to display as an identifying label for a notebook
+page. This label serves as an additional identifier used to reference the
+page. This label may be used for the index value in widget commands.
+.TP
+\fB-tabbackground\fR \fIvalue\fR
+Specifies a background color to use for displaying a tab when it is not
+elected. If this option is specified as an empty string (the default), then
+the tabBackground option for the overall tabnotebook is used.
+.TP
+\fB-tabforeground\fR \fIvalue\fR
+Specifies a foreground color to use for displaying the tab's text label
+when it is not selected. If this option is specified as an empty
+string (the default), then the tabForeground option for the overall
+tabnotebook is used.
+.TP
+\fB-padx\fR \fIvalue\fR
+Specifies a non-negative value indicating how much extra space to request
+for a tab around its label in the X-direction. When computing how large a
+window it needs, the tab will add this amount to the width it would
+normally need The tab will end up with extra internal space to the
+left and right of its text label. This value may have any of the forms
+acceptable to Tk_GetPixels. If this option is specified as an empty
+string (the default), then the padX option for the overall tabnotebook is used
+.TP
+\fB-pady\fR \fIvalue\fR
+Specifies a non-negative value indicating how much extra space to request
+for a tab around its label in the Y-direction. When computing how large
+a window it needs, the tab will add this amount to the height it would
+normally need The tab will end up with extra internal space to the top and
+bottom of its text label. This value may have any of the forms acceptable
+to Tk_GetPixels. If this option is specified as an empty string (the
+default), then the padY option for the overall tabnotebook is used
+.TP
+\fB-state\fR \fIvalue\fR
+Specifies one of two states for the page: normal or disabled. In normal state
+unselected tabs are displayed using the tabforeground and tabbackground
+option from the tabnotebook or the page. Selected tabs and pages are
+displayed using the foreground and background option from the tabnotebook or
+the page. The disabled state means that the page and its tab is
+insensitive: it doesn't respond to mouse button presses or releases. In this
+state the entry is displayed according to its disabledForeground option for
+the tabnotebook and the background/tabbackground option from the page or
+the tabnotebook.
+.RE
+.TP
+'>>>>>>>>>>
+\fIpathName\fR \fBchildSite\fR ?\fIindex\fR?
+If passed no arguments, returns a list of pathNames for all the pages
+in the tabnotebook. If the tab notebook is empty, an empty list is returned
+.IP
+If \fIindex\fR is passed, it returns the \fIpathName\fR for the page's
+child site \fBframe\fR specified by \fIindex\fR. Widgets that are created
+with this \fIpathName\fR will be displayed when the associated page is
+selected. If \fIindex\fR is not a valid index, an empty string is returned.
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue\fR \fIoption\fR \fIvalue\fR ...?
+Query or modify the configuration options of the widget. If no \fIoption\fR
+is specified, returns a list describing all of the available options
+for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for information on the
+format of this list). If option is specified with no value, then the
+command returns a list describing the one named option (this list will be
+identical to the corresponding sublist of the value returned if no option
+is specified). If one or more option-value pairs are specified, then the
+command modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string. \fIOption\fR may have any
+of the values accepted by the iwidgets::tabnotebook command.
+.TP
+\fIpathName\fR \fBdelete\fR \fIindex1\fR ?\fIindex2\fR?
+Delete all of the pages between \fIindex1\fR and \fIindex2\fR inclusive.
+If \fIindex2\fR is omitted then it defaults to \fIindex1\fR. Returns an
+empty string.
+.TP
+\fIpathName\fR \fBindex\fR \fIindex\fR
+Returns the numerical index corresponding to \fIindex\fR.
+.TP
+\fIpathName\fR \fBinsert\fR \fIindex\fR ?\fIoption\fR \fIvalue\fR \fIoption\fR \fIvalue\fR ...?
+Insert a new page in the tabnotebook before the page specified
+by \fIindex\fR. A new child site \fBframe\fR is created. The additional
+arguments are the same as for the \fBadd\fR command. Returns the
+child site \fIpathName\fR.
+.TP
+\fIpathName\fR \fBnext\fR
+Advances the selected page to the next page (order is determined by
+insertion order). If the currently selected page is the last page in
+the notebook, the selection wraps around to the first page in the
+notebook. It behaves as if the user selected the new page.
+.IP
+For notebooks with \fBauto\fR set to \fBtrue\fR the current page's
+child site is unpacked from the notebook's child site frame. Then the next
+page's child site is packed into the notebook's child site frame. The
+Tcl command given with the command option will be invoked between these
+two operations.
+.IP
+For notebooks with \fBauto\fR set to \fBfalse\fR the Tcl command given
+with the command option will be invoked.
+.TP
+\fIpathName\fR \fBpageconfigure\fR \fIindex\fR ?\fIoption\fR? ?\fIvalue\fR \fIoption\fR \fIvalue\fR ...?
+This command is similar to the \fBconfigure\fR command, except that it
+applies to the options for an individual page, whereas configure applies
+to the options for the tabnotebook as a whole. \fIOptions\fR may have
+any of the values accepted by the add widget command. If options are
+specified, options are modified as indicated in the command and the
+command returns an empty string. If no options are specified, returns a
+list describing the current options for page index (see \fBTk_ConfigureInfo\fR
+for information on the format of this list).
+.TP
+\fIpathName\fR \fBprev\fR
+Moves the selected page to the previous page (order is determined by
+insertion order). If the currently selected page is the first page in
+the notebook, the selection wraps around to the last page in the notebook. It
+behaves as if the user selected the new page.
+.IP
+For notebooks with \fBauto\fR set to \fBtrue\fR the current page's
+child site is unpacked from the notebook's child site \fBframe\fR. Then the
+previous page's child site is packed into the notebook's child site frame.
+The Tcl command given with the command option will be invoked between these
+two operations.
+.IP
+For notebooks with \fBauto\fR set to \fBfalse\fR the Tcl command given
+with the command option will be invoked.
+.TP
+\fIpathName\fR \fBselect\fR \fIindex\fR
+Selects the page specified by \fIindex\fR as the currently selected page.
+It behaves as if the user selected the new page.
+.IP
+For notebooks with \fBauto\fR set to \fBtrue\fR the current page's child
+site is unpacked from the notebook's child site frame. Then the \fIindex\fR
+page's child site is packed into the notebook's child site frame. The
+Tcl command given with the command option will be invoked between these two
+operations.
+.IP
+For notebooks with \fBauto\fR set to \fBfalse\fR the Tcl command given
+with the command option will be invoked.
+.TP
+\fIpathName\fR \fBview\fR
+Returns the currently selected page. This command is for compatibility with
+the \fBscrollbar\fR widget.
+.TP
+\fIpathName\fR \fBview\fR \fIindex\fR
+Selects the page specified by \fIindex\fR as the currently selected page.
+This command is for compatibility with the \fBscrollbar\fR widget.
+.TP
+\fIpathName\fR \fBview\fR \fBmoveto\fR \fIfraction\fR
+Uses the \fIfraction\fR value to determine the corresponding page to move to.
+This command is for compatibility with the \fBscrollbar\fR widget.
+.TP
+\fIpathName\fR \fBview\fR \fBscroll\fR \fInum\fR \fIwhat\fR
+Uses the \fInum\fR value to determine how many pages to move forward or
+backward (\fInum\fR can be negative or positive). The \fIwhat\fR argument
+is ignored. This command is for compatibility with the \fBscrollbar\fR widget.
+.SH "COMPONENTS"
+.LP
+Generally all behavior of the internal components, \fBtabset\fR
+and \fBnotebook\fR are controlled via the \fBpageconfigure\fR method.
+The following section documents these two components.
+.LP
+.nf
+Name: \fBtabset\fR
+Class: \fBTabset\fR
+.fi
+.IP
+This is the tabset component. It implements the tabs that are associated
+with the notebook component.
+.IP
+See the "\fBTabset\fR" widget manual entry for details on
+the \fBtabset\fR component item.
+.LP
+.nf
+Name: \fBnotebook\fR
+Class: \fBNotebook\fR
+.fi
+.IP
+This is the notebook component. It implements the notebook that contains the
+pages of the tabnotebook.
+.IP
+See the "\fBNotebook\fR" widget manual entry for details on
+the \fBnotebook\fR component item.
+.fi
+.SH EXAMPLE
+.PP
+Following is an example that creates a tabnotebook with two pages.
+.PP
+.nf
+.IP
+.ta 2c 8c 12c
+package require Iwidgets 4.0
+# Create the tabnotebook widget and pack it.
+ iwidgets::tabnotebook .tn -width 100 -height 100
+ pack .tn \\
+ -anchor nw \\
+ -fill both \\
+ -expand yes \\
+ -side left \\
+ -padx 10 \\
+ -pady 10
+.IP
+# Add two pages to the tabnotebook,
+# labelled "Page One" and "Page Two"
+ .tn add -label "Page One"
+ .tn add -label "Page Two"
+.IP
+# Get the child site frames of these two pages.
+ set page1CS [.tn childsite 0]
+ set page2CS [.tn childsite "Page Two"]
+.IP
+# Create buttons on each page of the tabnotebook.
+ button $page1CS.b -text "Button One"
+ pack $page1CS.b
+ button $page2CS.b -text "Button Two"
+ pack $page2CS.b
+.IP
+# Select the first page of the tabnotebook.
+ .tn select 0
+.fi
+.SH AUTHOR
+Bill W. Scott
+.SH KEYWORDS
+tab tabset notebook tabnotebook page
diff --git a/iwidgets/doc/tabset.n b/iwidgets/doc/tabset.n
new file mode 100644
index 00000000000..a9fe6a92658
--- /dev/null
+++ b/iwidgets/doc/tabset.n
@@ -0,0 +1,466 @@
+'\"
+'\" Copyright (c) 1995 DSC Technologies Corporation
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) tabset.n
+'\"
+.so man.macros
+.HS iwidgets::tabset iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+'\"
+'\"
+.SH NAME
+iwidgets::tabset \- create and manipulate tabs as as set
+.SH SYNOPSIS
+\fBiwidgets::tabset\fR \fIpathName\fR ?\fIoptions\fR?
+.SH "INHERITANCE"
+itk::Widget <- iwidgets::Tabset
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fB
+background font selectBackground cursor
+foreground selectForeground disabledForeground height
+width\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "WIDGET-SPECIFIC OPTIONS"
+.LP
+.nf
+Name: \fBangle\fR
+Class: \fBAngle\fR
+Command-Line Switch: \fB-angle\fR
+.fi
+.IP
+Specifes the angle of slope from the inner edge to the outer edge of the
+tab. An angle of 0 specifies square tabs. Valid ranges are 0 to 45 degrees
+inclusive. Default is 15 degrees. If tabPos is e or w, this option is ignored.
+.LP
+.nf
+Name: \fBbackdrop\fR
+Class: \fBBackdrop\fR
+Command-Line Switch: \fB-backdrop\fR
+.fi
+.IP
+Specifies a background color to use when filling in the area behind the tabs.
+.LP
+.nf
+Name: \fBbevelAmount\fR
+Class: \fBBevelAmount\fR
+Command-Line Switch: \fB-bevelamount\fR
+.fi
+.IP
+Specifes the size of tab corners. A value of 0 with angle set to 0 results
+in square tabs. A \fBbevelAmount\fR of 4, means that the tab will be
+drawn with angled corners that cut in 4 pixels from the edge of the
+tab. The default is 0.
+.LP
+.nf
+Name: \fBcommand\fR
+Class: \fBCommand\fR
+Command-Line Switch: \fB-command\fR
+Specifes the prefix of a Tcl command to invoke to change the view in the
+widget associated with the tabset. When a user selects a tab, a Tcl command
+is invoked. The actual command consists of this option followed by a space
+and a number. The number is the numerical index of the tab that has been
+selected.
+.LP
+.nf
+Name: \fBequalTabs\fR
+Class: \fBEqualTabs\fR
+Command-Line Switch: \fB-equaltabs\fR
+.fi
+.IP
+Specifies whether to force tabs to be equal sized or not. A value
+of \fBtrue\fR means constrain tabs to be equal sized. A value
+of \fBfalse\fR allows each tab to size based on the text label size. The
+value may have any of the forms accepted by the \fBTcl_GetBoolean\fR, such
+as \fBtrue\fR, \fBfalse\fR, \fB0\fR, \fB1\fR, \fByes\fR, or \fBno\fR.
+.IP
+For horizontally positioned tabs (\fBtabPos\fR is either \fBs\fR
+or \fBn\fR), \fBtrue\fR forces all tabs to be equal width (the width being
+equal to the longest label plus any padX specified). Horizontal tabs are
+always equal in height.
+.IP
+For vertically positioned tabs (\fBtabPos\fR is either \fBw\fR or \fBe\fR),
+\fBtrue\fR forces all tabs to be equal height (the height being equal to
+the height of the label with the largest font). Vertically oriented tabs are
+always equal in width.
+.LP
+.nf
+Name: \fBgap\fR
+Class: \fBGap\fR
+Command-Line Switch: \fB-gap\fR
+.fi
+.IP
+Specifies the amount of pixel space to place between each tab. Value may
+be any pixel offset value. In addition, a special keyword \fBoverlap\fR
+can be used as the value to achieve a standard overlap of tabs. This value
+may have any of the forms acceptable to \fBTk_GetPixels\fR.
+.LP
+.nf
+Name: \fBmargin\fR
+Class: \fBMargin\fR
+Command-Line Switch: \fB-margin\fR
+.fi
+.IP
+Specifies the amount of space to place between the outside edge of the
+tabset and the outside edge of its tabs. If \fBtabPos\fR is \fBs\fR, this
+is the amount of space between the bottom edge of the tabset and the
+bottom edge of the set of tabs. If \fBtabPos\fR is \fBn\fR, this is the
+amount of space between the top edge of the tabset and the top edge of the
+set of tabs. If \fBtabPos\fR is \fBe\fR, this is the amount of space between
+the right edge of the tabset and the right edge of the set of tabs.
+If \fBtabPos\fR is \fBw\fR, this is the amount of space between the left
+edge of the tabset and the left edge of the set of tabs. This value may
+have any of the forms acceptable to \fBTk_GetPixels\fR.
+.LP
+.nf
+Name: \fBpadX\fR
+Class: \fBPadX\fR
+Command-Line Switch: \fB-padx\fR
+.fi
+.IP
+Specifies a non-negative value indicating how much extra space to request for
+a tab around its label in the X-direction. When computing how large a
+window it needs, the tab will add this amount to the width it would normally
+need The tab will end up with extra internal space to the left and right of
+its text label. This value may have any of the forms acceptable
+to \fBTk_GetPixels\fR.
+.LP
+.nf
+Name: \fBpadY\fR
+Class: \fBPadY\fR
+Command-Line Switch: \fB-pady\fR
+.fi
+.IP
+Specifies a non-negative value indicating how much extra space to request
+for a tab around its label in the Y-direction. When computing how large a
+window it needs, the tab will add this amount to the height it would
+normally need The tab will end up with extra internal space to the top and
+bottom of its text label. This value may have any of the forms acceptable
+to \fBTk_GetPixels\fR.
+.LP
+.nf
+Name: \fBraiseSelect\fR
+Class: \fBRaiseSelect\fR
+Command-Line Switch: \fB-raiseselect\fR
+.fi
+.IP
+Specifes whether to slightly raise the selected tab from the rest of the
+tabs. The selected tab is drawn 2 pixels closer to the outside edge of the
+tabset than the unselected tabs. A value of true says to raise selected
+tabs, a value of false turns this off. The default is false. The value may
+have any of the forms accepted by the \fBTcl_GetBoolean\fR, such
+as \fBtrue\fR, \fBfalse\fR, \fB0\fR, \fB1\fR, \fByes\fR, or \fBno\fR.
+.LP
+.nf
+Name: \fBstart\fR
+Class: \fBStart\fR
+Command-Line Switch: \fB-start\fR
+.fi
+.IP
+Specifies the amount of space to place between the left or top edge of the
+tabset and the starting edge of its tabs. For horizontally positioned tabs,
+this is the amount of space between the left edge of the tabset and the left
+edge of the first tab. For vertically positioned tabs, this is the amount
+of space between the top of the tabset and the top of the first tab. This
+value may change if the user performs a MButton-2 scroll on the tabs. This
+value may have any of the forms acceptable to \fBTk_GetPixels\fR.
+.LP
+.nf
+Name: \fBstate\fR
+Class: \fBState\fR
+Command-Line Switch: \fB-state\fR
+.fi
+.IP
+Sets the active state of the tabset. Specifying \fBnormal\fR allows all
+tabs to be selectable. Specifying \fBdisabled\fR disables the tabset
+causing all tabs to be drawn in the disabledForeground color.
+.LP
+.nf
+Name: \fBtabBorders\fR
+Class: \fBTabBorders\fR
+Command-Line Switch: \fB-tabborders\fR
+.fi
+.IP
+Specifies whether to draw the borders of tabs that are not selected.
+Specifying true (the default) draws these borders, specifying false
+draws only the border around the selected tab. The value may have any
+of the forms accepted by the \fBTcl_GetBoolean\fR, such
+as \fBtrue\fR, \fBfalse,\fR \fB0\fR, \fB1\fR, \fByes\fR, or \fBno\fR.
+.LP
+.nf
+Name: \fBtabPos\fR
+Class: \fBTabPos\fR
+Command-Line Switch: \fB-tabpos\fR
+.fi
+.IP
+Specifies the location of the set of tabs in relation to another widget. Must
+be \fBn\fR, \fBs\fR, \fBe\fR, or \fBw\fR. Defaults to \fBs\fR. North tabs
+open downward, South tabs open upward. West tabs open to the right, east
+tabs open to the left.
+.BE
+.SH DESCRIPTION
+.PP
+The \fBiwidgets::tabset\fR command creates a new window (given by the pathName
+argument) and makes it into a \fBtabset\fR widget. Additional \fIoptions\fR,
+described above may be specified on the command line or in the option
+database to configure aspects of the tabset such as its colors, font, and
+text. The \fBiwidgets::tabset\fR command returns its \fIpathName\fR argument. At the
+time this command is invoked, there must not exist a window
+named \fIpathName\fR, but pathName's parent must exist.
+.PP
+A \fBtabset\fR is a widget that contains a set of Tab buttons. It displays
+these tabs in a row or column depending on it tabpos. When a tab is
+clicked on, it becomes the only tab in the tab set that is selected. All
+other tabs are deselected. The Tcl command prefix associated with this
+tab (through the command tab configure option) is invoked with the tab
+index number appended to its argument list. This allows the tabset to
+control another widget such as a Notebook.
+.SH TABS
+Tabs are drawn to appear attached to another widget. The tabset draws an
+edge boundary along one of its edges. This edge is known as the attachment
+edge. This edge location is dependent on the value of \fBtabPos\fR. For
+example, if \fBtabPos\fR is \fBs\fR, the attachment edge wil be on the
+top side of the tabset (in order to attach to the bottom or south side of
+its attached widget). The selected tab is draw with a 3d relief to appear
+above the other tabs. This selected tab "opens" toward attachment edge.
+.PP
+Tabs can be controlled in their location along the edges, the angle that
+tab sides are drawn with, gap between tabs, starting margin of tabs,
+internal padding around labels in a tab, the font, and its text or bitmap.
+.SH "WIDGET-SPECIFIC METHODS"
+.PP
+The \fBiwidgets::tabset\fR command creates a new Tcl command whose name
+is \fIpathName\fR. This command may be used to invoke various operations on
+the widget. It has the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIoption\fR and the \fIarg\fRs
+determine the exact behavior of the command.
+.PP
+Many of the widget commands for a tabset take as one argument an indicator
+of which tab of the tabset to operate on. These indicators are called indexes
+and may be specified in any of the following forms:
+.TP
+\fInumber\fR
+Specifies the tab numerically, where 0 corresponds to the first tab in
+the tab set, 1 to the second, and so on.
+.TP
+\fBselect\fR
+Specifies the currently selected tab's index. If no tab is currently
+selected, the value -1 is returned.
+.TP
+\fBend\fR
+Specifes the last tab in the tabset's index. If the tabset is empty this
+will return -1.
+.TP
+\fIpattern\fR
+If the index doesn't satisfy any of the above forms, then this form is
+used. Pattern is pattern-matched against the label of each tab in the
+tabset, in order from the first to the last tab, until a matching entry is
+found. The rules of Tcl_StringMatch are used.
+.PP
+'.............................................................................
+The following commands are possible for tabset widgets:
+.RS
+.TP
+\fIpathName\fR \fBadd\fR ?\fIoption\fR \fIvalue\fR \fIoption\fR \fIvalue\fR ...?
+Add a new tab at the end of the tabset. Returns the child
+site \fIpathName\fR. If additional arguments are present, they specify
+any of the following options:
+.RS
+.TP
+\fB-angle\fR \fIvalue\fR
+Specifes the angle of slope from the inner edge to the outer edge of
+the tab. An angle of 0 specifies square tabs. Valid ranges are 0 to
+45 degrees inclusive. Default is 15 degrees. If this option is specified as
+an empty string (the default), then the angle option for the overall tabset
+is used.
+.TP
+\fB-background\fR \fIvalue\fR
+Specifies a background color to use for displaying tabs when they are in
+their normal state (unselected). If this option is specified as an empty
+string (the default), then the background option for the overall tabset is
+used.
+.TP
+\fB-bevelamount\fR \fIvalue\fR
+Specifes the size of tab corners. A value of 0 with angle set to 0 results
+in square tabs. A bevelAmount of 4, means that the tab will be drawn with
+angled corners that cut in 4 pixels from the edge of the tab. The default is
+0. This is generally only set at the tabset configuration level. Tabs
+normally will want to share the same bevelAmount.
+.TP
+\fB-bitmap\fR \fIvalue\fR
+If label is a non-empty string, specifies a bitmap to display in the
+tab. Bitmap may be of any of the forms accepted by Tk_GetBitmap.
+.TP
+\fB-disabledforeground\fR \fIvalue\fR
+Specifies a foreground color to use for displaying tab labels when tabs are
+in their disable state. If this option is specified as an empty
+string (the default), then the disabledforeground option for the overall
+tabset is used.
+.TP
+\fB-font\fR \fIvalue\fR
+Specifies the font to use when drawing the label on a tab. If this option
+is specified as an empty string then the font option for the overall
+tabset is used.
+.TP
+\fB-foreground\fR \fIvalue\fR
+Specifies a foreground color to use for displaying tab labels when tabs
+are in their normal unselected state. If this option is specified as an
+empty string (the default), then the foreground option for the overall
+tabset is used.
+.TP
+\fB-image\fR \fIvalue\fR
+If label is a non-empty string, specifies an image to display in the
+tab. Image must have been created with the image create command. Typically,
+if the image option is specified then it overrides other options that
+specify a bitmap or textual value to display in the widget; the image
+option may be reset to an empty string to re-enable a bitmap or text display.
+.TP
+\fB-label\fR \fIvalue\fR
+Specifies a text string to be placed in the tabs label. If this value is
+set, the bitmap option is overridden and this option is used instead. This
+label serves as an additional identifier used to reference the tab. This
+label may be used for the index value in widget commands.
+.TP
+\fB-selectbackground\fR \fIvalue\fR
+Specifies a background color to use for displaying the selected tab. If
+this option is specified as an empty string (the default), then the
+selectBackground option for the overall tabset is used.
+.TP
+\fB-selectforeground\fR \fIvalue\fR
+Specifies a foreground color to use for displaying the selected tab. If
+this option is specified as an empty string (the default), then the
+selectForeground option for the overall tabset is used.
+.TP
+\fB-padx\fR \fIvalue\fR
+Specifies a non-negative value indicating how much extra space to request
+for a tab around its label in the X-direction. When computing how large
+a window it needs, the tab will add this amount to the width it would
+normally need The tab will end up with extra internal space to the left
+and right of its text label. This value may have any of the forms acceptable
+to Tk_GetPixels. If this option is specified as an empty string (the
+default), then the padX option for the overall tabset is used
+.TP
+\fB-pady\fR \fIvalue\fR
+Specifies a non-negative value indicating how much extra space to request
+for a tab around its label in the Y-direction. When computing how large
+a window it needs, the tab will add this amount to the height it would
+normally need The tab will end up with extra internal space to the top
+and bottom of its text label. This value may have any of the forms
+acceptable to Tk_GetPixels. If this option is specified as an empty
+string (the default), then the padY option for the overall tabset is used
+.TP
+\fB-state\fR \fIvalue\fR
+Sets the state of the tab. Specifying normal allows this tab to be
+selectable. Specifying disabled disables the this tab causing its tab label
+to be drawn in the disabledForeground color. The tab will not respond to
+events until the state is set back to normal.
+.RE
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue\fR \fIoption\fR \fIvalue\fR ...?
+Query or modify the configuration options of the widget. If no \fIoption\fR
+is specified, returns a list describing all of the available options
+for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for information on the
+format of this list). If option is specified with no value, then the
+command returns a list describing the one named option (this list will be
+identical to the corresponding sublist of the value returned if no option
+is specified). If one or more option-value pairs are specified, then the
+command modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string. \fIOption\fR may have any
+of the values accepted by the iwidgets::tabset command.
+.TP
+\fIpathName\fR \fBdelete\fR \fIindex1\fR ?\fIindex2\fR?
+Delete all of the tabs between \fIindex1\fR and \fIindex2\fR inclusive.
+If \fIindex2\fR is omitted then it defaults to \fIindex1\fR. Returns an
+empty string.
+.TP
+\fIpathName\fR \fBindex\fR \fIindex\fR
+Returns the numerical index corresponding to \fIindex\fR.
+.TP
+\fIpathName\fR \fBinsert\fR \fIindex\fR ?\fIoption\fR \fIvalue\fR \fIoption\fR \fIvalue\fR ...?
+Insert a new tab in the tabset before the tab specified by \fIindex\fR. The
+additional arguments are the same as for the \fBadd\fR command. Returns
+the tab's \fIpathName\fR.
+.TP
+\fIpathName\fR \fBnext\fR
+Advances the selected tab to the next tab (order is determined by insertion
+order). If the currently selected tab is the last tab in the tabset, the
+selection wraps around to the first tab. It behaves as if the user
+selected the next tab.
+.TP
+\fIpathName\fR \fBtabconfigure\fR \fIindex\fR ?\fIoption\fR? ?\fIvalue\fR?
+This command is similar to the \fBconfigure\fR command, except that it
+applies to the options for an individual tab, whereas configure applies to
+the options for the tabset as a whole. Options may have any of the values
+accepted by the \fBadd\fR widget command. If options are specified, options
+are modified as indicated in the command and the command returns an empty
+string. If no options are specified, returns a list describing the current
+options for tab index (see \fBTk_ConfigureInfo\fR for information on
+the format of this list).
+.TP
+\fIpathName\fR \fBprev\fR
+Moves the selected tab to the previous tab (order is determined by insertion
+order). If the currently selected tab is the first tab in the tabset, the
+selection wraps around to the last tab in the tabset. It behaves as if
+the user selected the previous tab.
+.TP
+\fIpathName\fR \fBselect\fR \fIindex\fR
+Selects the tab specified by \fIindex\fR as the currently selected tab. It
+behaves as if the user selected the new tab.
+
+.SH EXAMPLE
+.PP
+Following is an example that creates a tabset with two tabs and a list box
+that the tabset controls. In addition selecting an item from the list
+also selects the corresponding tab.
+.PP
+.nf
+.IP
+.ta 2c 8c 12c
+package require Iwidgets 4.0
+# Define a proc that knows how to select an item
+# from a list given an index from the tabset -command callback.
+ proc selectItem { item } {
+ .l selection clear [.l curselection]
+ .l selection set $item
+ .l see $item
+}
+.IP
+# Define a proc that knows how to select a tab
+# given a y pixel coordinate from the list..
+ proc selectTab { y } {
+ set whichItem [.l nearest $y]
+ .ts select $whichItem
+}
+.IP
+# Create a listbox with two items (one and two)
+# and bind button 1 press to the selectTab procedure.
+ listbox .l -selectmode single -exportselection false
+ .l insert end one
+ .l insert end two
+ .l selection set 0
+ pack .l
+ bind .l <ButtonPress-1> { selectTab %y }
+.IP
+# Create a tabset, set its -command to call selectItem
+# Add two labels to the tabset (one and two).
+ iwidgets::tabset .ts -command selectItem
+ .ts add -label 1
+ .ts add -label 2
+ .ts select 0
+ pack .ts -fill x -expand no
+.fi
+.SH AUTHOR
+Bill W. Scott
+.SH KEYWORDS
+tab tabset notebook tabnotebook
diff --git a/iwidgets/doc/timeentry.n b/iwidgets/doc/timeentry.n
new file mode 100644
index 00000000000..5545eecf49d
--- /dev/null
+++ b/iwidgets/doc/timeentry.n
@@ -0,0 +1,196 @@
+'\"
+'\" Copyright (c) 1997 DSC Technologies Corporation
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) timeentry.n 1.0 97/04/30 16:04:44
+'\"
+.so man.macros
+.HS iwidgets::timeentry iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+iwidgets::timeentry \- Create and manipulate a timeentry widget
+.SH SYNOPSIS
+\fBiwidgets::timeentry\fI \fIpathName \fR?\fIoptions\fR?
+.SH "INHERITANCE"
+itk::Widget <- iwidgets::LabeledWidget <- iwidgets::Timefield <- iwidgets::Timeentry
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fB
+background borderWidth cursor exportSelection
+foreground highlightColor highlightThickness insertBackground
+justify relief\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "INHERITED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBdisabledForeground\fR \fBlabelBitmap\fR \fBlabelFont\fR \fBlabelImage\fR
+\fBlabelMargin\fR \fBlabelPos\fR \fBlabelText\fR \fBlabelVariable\fR
+\fBstate\fR \fBsticky\fR
+.fi
+.LP
+See the "labeledwidget" class manual entry for details on these
+inherited options.
+.LP
+.nf
+.ta 4c 8c 12c
+\fBcommand\fR \fBformat\fR \fBseconds\fR \fBtextBackground\fR
+\fBtextFont\fR
+.fi
+.LP
+See the "timefield" class manual entry for details on these
+inherited options.
+.SH "ASSOCIATED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBhourRadius\fR \fBhourColor\fR \fBminuteRadius\fR \fBminuteColor\fR
+\fBpivotRadius\fR \fBpivotColor\fR \fBsecondRadius\fR \fBsecondColor\fR
+\fBclockColor\fR \fBclockStipple\fR \fBtickColor\fR \fBwatchHeight\fR
+\fBwatchWidth\fR
+.fi
+.LP
+See the "watch" manual entry for details on the associated options.
+.SH "WIDGET-SPECIFIC OPTIONS"
+.LP
+.nf
+Name: \fBcloseText\fR
+Class: \fBText\fR
+Command-Line Switch: \fB-closetext\fR
+.fi
+.IP
+Specifies the text to be displayed on the close button of the watch
+popup. The default is Close.
+.LP
+.nf
+Name: \fBgrab\fR
+Class: \fBGrab\fR
+Command-Line Switch: \fB-grab\fR
+.fi
+.IP
+Specifies the grab level, \fBlocal\fR or \fBglobal\fR, to be obtained before
+bringing up the popup watch. The default is global. For more information
+concerning grab levels, consult the documentation for Tk's \fBgrab\fR command.
+.LP
+.nf
+Name: \fBicon\fR
+Class: \fBIcon\fR
+Command-Line Switch: \fB-icon\fR
+.fi
+.IP
+Specifies the watch icon image to be used in the timeentry.
+This image must have been created previously with
+the \fBimage create\fR command. Should one not be provided,
+then one will be generated, pixmap if possible, bitmap otherwise.
+.LP
+.nf
+Name: \fBstate\fR
+Class: \fBState\fR
+Command-Line Switch: \fB-state\fR
+.fi
+.IP
+Specifies the state of the widget which may be \fBdisabled\fR or
+\fBnormal\fR. A disabled state prevents selection of the timefield
+or time icon button.
+.LP
+.BE
+
+.SH DESCRIPTION
+.PP
+The \fBiwidgets::timeentry\fR command creates a time entry field
+with a popup watch by combining the timefield and watch
+widgets together. This allows a user to enter the time via the
+keyboard or by using the mouse and selecting the watch icon
+which brings up a popup watch.
+.DE
+
+.SH "METHODS"
+.PP
+The \fBiwidgets::timeentry\fR command creates a new Tcl command whose
+name is \fIpathName\fR. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIOption\fR and the \fIarg\fRs
+determine the exact behavior of the command. The following
+commands are possible for timeentry widgets:
+.SH "INHERITED METHODS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBget\fR \fBisvalid\fR \fBshow\fR
+.fi
+.LP
+See the "timefield" manual entry for details on the associated methods.
+.SH "WIDGET-SPECIFIC METHODS"
+.TP
+\fIpathName \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given
+by \fIoption\fR.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::timeentry\fR
+command.
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR?
+Query or modify the configuration options of the widget.
+If no \fIoption\fR is specified, returns a list describing all of
+the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for
+information on the format of this list). If \fIoption\fR is specified
+with no \fIvalue\fR, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no \fIoption\fR is specified). If
+one or more \fIoption\-value\fR pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::timeentry\fR
+command.
+
+.SH "COMPONENTS"
+.LP
+.nf
+Name: \fBlabel\fR
+Class: \fBLabel\fR
+.fi
+.IP
+The label component provides a label component to used to identify the time.
+See the "label" widget manual entry for details on the label component item.
+.LP
+.nf
+Name: \fBiconbutton\fR
+Class: \fBLabel\fR
+.fi
+.IP
+The iconbutton component provides a labelbutton component to act as a
+lightweight button
+displaying the watch icon. Upon pressing the labelbutton, the watch
+appears. See the "label" widget manual entry for details on the
+labelbutton component item.
+.LP
+.nf
+Name: \fBtime\fR
+Class: \fBEntry\fR
+.fi
+.IP
+The time component provides the entry field for time input and display.
+See the "entry" widget manual entry for details on the time component item.
+.fi
+
+.SH EXAMPLE
+.DS
+ package require Iwidgets 4.0
+ iwidgets::timeentry .te
+ pack .te
+.DE
+.SH AUTHOR
+Mark L. Ulferts
+.LP
+.SH KEYWORDS
+timeentry, widget
diff --git a/iwidgets/doc/timefield.n b/iwidgets/doc/timefield.n
new file mode 100644
index 00000000000..f3050db448e
--- /dev/null
+++ b/iwidgets/doc/timefield.n
@@ -0,0 +1,186 @@
+'\"
+'\" Copyright (c) 1997 DSC Technologies Corporation
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) timefield.n 1.0 97/04/30 16:04:44
+'\"
+.so man.macros
+.HS iwidgets::timefield iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+iwidgets::timefield \- Create and manipulate a time field widget
+.SH SYNOPSIS
+\fBiwidgets::timefield\fI \fIpathName \fR?\fIoptions\fR?
+.SH "INHERITANCE"
+itk::Widget <- iwidgets::LabeledWidget <- iwidgets::Timefield
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fB
+background borderWidth cursor exportSelection
+foreground highlightColor highlightThickness insertBackground
+justify relief\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "INHERITED OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBdisabledForeground\fR \fBlabelBitmap\fR \fBlabelFont\fR \fBlabelImage\fR
+\fBlabelMargin\fR \fBlabelPos\fR \fBlabelText\fR \fBlabelVariable\fR
+\fBstate\fR \fBsticky\fR
+.fi
+.LP
+See the "labeledwidget" class manual entry for details on the
+inherited options.
+.SH "WIDGET-SPECIFIC OPTIONS"
+.LP
+.nf
+Name: \fBchildSitePos\fR
+Class: \fBPosition\fR
+Command-Line Switch: \fB-childsitepos\fR
+.fi
+.IP
+Specifies the position of the child site in the time field: \fBn\fR,
+\fBs\fR, \fBe\fR, or \fBw\fR. The default is e.
+.LP
+.nf
+Name: \fBcommand\fR
+Class: \fBCommand\fR
+Command-Line Switch: \fB-command\fR
+.fi
+.IP
+Specifies a Tcl command to be executed upon detection of a Return key
+press event.
+.LP
+.nf
+Name: \fBgmt\fR
+Class: \fBGmt\fR
+Command-Line Switch: \fB-gmt\fR
+.fi
+.IP
+Determines whether the time is calculated relative to Greenwich
+Mean Time. Accepts a boolean value. The default is no.
+.fi
+.IP
+Name: \fBstate\fR
+Class: \fBState\fR
+Command-Line Switch: \fB-state\fR
+.fi
+.IP
+Specifies one of two states for the timefield: \fBnormal\fR or \fBdisabled\fR.
+If the timefield is disabled then input is not accepted. The default is
+normal.
+.LP
+.nf
+Name: \fBtextBackground\fR
+Class: \fBBackground\fR
+Command-Line Switch: \fB-textbackground\fR
+.fi
+.IP
+Background color for inside textual portion of the entry field. The value
+may be given in any of the forms acceptable to \fBTk_GetColor\fR.
+.LP
+.nf
+Name: \fBtextFont\fR
+Class: \fBFont\fR
+Command-Line Switch: \fB-textfont\fR
+.fi
+.IP
+Name of font to use for display of text in timefield. The value
+may be given in any of the forms acceptable to \fBTk_GetFont\fR.
+.LP
+.BE
+
+.SH DESCRIPTION
+.PP
+The \fBiwidgets::timefield\fR command creates an enhanced text entry widget for
+the purpose of time entry with various degrees of built-in intelligence.
+.DE
+
+.SH "METHODS"
+.PP
+The \fBiwidgets::timefield\fR command creates a new Tcl command whose
+name is \fIpathName\fR. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIOption\fR and the \fIarg\fRs
+determine the exact behavior of the command. The following
+commands are possible for timefield widgets:
+.SH "WIDGET-SPECIFIC METHODS"
+.TP
+\fIpathName \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given
+by \fIoption\fR.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::timefield\fR
+command.
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR?
+Query or modify the configuration options of the widget.
+If no \fIoption\fR is specified, returns a list describing all of
+the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for
+information on the format of this list). If \fIoption\fR is specified
+with no \fIvalue\fR, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no \fIoption\fR is specified). If
+one or more \fIoption\-value\fR pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::timefield\fR
+command.
+.TP
+\fIpathName \fBget\fR ?\fBformat\fR?
+Returns the current contents of the timefield in a format of
+string or as an integer clock value using the \fB-string\fR and \fB-clicks\fR
+format options respectively. The default is by string. Reference the
+clock command for more information on obtaining times and their
+formats.
+.TP
+\fIpathName \fBisvalid\fR
+Returns a boolean indication of the validity of the currently
+displayed time value. For example, 12:59:59 is valid whereas
+25:59:59 is invalid.
+.TP
+\fIpathName \fBshow\fR \fItime\fR
+Changes the currently displayed time to be that of the time
+argument. The time may be specified either as a string, an
+integer clock value or the keyword "now" (the default).
+Reference the clock command for more information on obtaining
+times and their formats.
+
+.SH "COMPONENTS"
+.LP
+.nf
+Name: \fBtime\fR
+Class: \fBEntry\fR
+.fi
+.IP
+The time component provides the entry field for time input and display.
+See the "entry" widget manual entry for details on the time component item.
+.fi
+
+.SH EXAMPLE
+.DS
+ package require Iwidgets 4.0
+ proc returnCmd {} {
+ puts [.tf get]
+ }
+
+ iwidgets::timefield .tf -command returnCmd
+ pack .tf -fill x -expand yes -padx 10 -pady 10
+.DE
+.SH AUTHOR
+John A. Tucker
+.DE
+Mark L. Ulferts
+.LP
+.SH KEYWORDS
+timefield, widget
diff --git a/iwidgets/doc/tk2html b/iwidgets/doc/tk2html
new file mode 100644
index 00000000000..089a419c24c
--- /dev/null
+++ b/iwidgets/doc/tk2html
@@ -0,0 +1,46 @@
+#!/bin/sh
+# filter to convert Tk and Tcl man pages to html equivalents
+# does not do any linking !!!!
+
+TOP=`pwd`
+if [ $# -eq 0 ] ; then
+ echo "Usage $0 filename"
+ exit
+fi
+
+cat $1 |
+ sed -e 's/\\-/-/g' \
+ -e 's/\\[0&]/ /g' \
+ -e 's/&/\&amp;/g' \
+ -e 's/</\&lt;/g' \
+ -e 's/>/\&gt;/g' \
+ -e 's/\\|//g' \
+ -e 's/\\e/\\/g' |
+ /usr/bin/nawk -f ${TOP}/tk2html.awk |
+ sed -e 's^\\fB\([^\\]*\)\\fR^<B>\1</B>^g' \
+ -e 's^\\fI\(.[^\\]*\)\\fR^<I>\1</I>^g' \
+ -e 's^\\fB^<B>^g' \
+ -e 's^\\fI^<I>^g' \
+ -e 's^\\f[RP]^</B></I>^g' \
+ -e 's/^.[LP]P/<P>/' \
+ -e 's/^.br/<BR>/' \
+ -e 's/^\.DS.*/<pre>/' \
+ -e 's$^\.DE.*$</pre>$' \
+ -e 's/^\.nf */<table>/' \
+ -e 's$^\.fi *$</table>$' \
+ -e 's$^\.BE *$</pre><HR>$' \
+ -e 's/^\.RS.*/<UL>/' \
+ -e 's$^\.RE.*$</UL>$' \
+ -e 's^\.SH *"*\([^"]*\)"*^</pre><H2>\1</H2>^' \
+ -e 's/^\.[a-zA-Z]*.*//' \
+ -e 's/^`\\\".*//' |
+ /usr/bin/nawk -f ${TOP}/tk2html2.awk
+
+# The above handling for font mapping to html works correctly in about 95% of
+# the cases, the others turn out stacking the font setting so you get the
+# font bleeding since it isn't being turned # off in the correct places.
+# To correct we would have to record the current ( non-default) font and
+# explicitly turn it off when another font change is detected.
+# Which would make multiple styles impossible concurrently which seems to
+# be the case anyway....
+
diff --git a/iwidgets/doc/tk2html.awk b/iwidgets/doc/tk2html.awk
new file mode 100644
index 00000000000..dd88000831a
--- /dev/null
+++ b/iwidgets/doc/tk2html.awk
@@ -0,0 +1,320 @@
+#!/bin/nawk
+
+
+$0 ~ /'[\/\\]" */ || $1 == "'" { next } # eat [nt]roff comments
+
+# defining macros - eat them
+/^\.de.*/ {
+ getline
+ while ( $0 !~ "^\.\.$" )
+ {
+ getline
+ }
+ getline
+ }
+
+$1 == ".VS" || $1 == ".VE" || $1 == ".AS" { next }
+
+
+# handle first .SH as special case - .SH NAME
+/^.SH *NAME */ {
+ getline
+ while ( $0 ~ /\.[a-zA-Z].*/ ) # eat dot-cmd following title
+ {
+ getline
+ }
+ print "<TITLE>" $0 "</TITLE>"
+ print "<H1>" $0 "</H1>\n"
+ next
+
+#-e 's/^.SH *NAME */{N;s#.*\n\(.*\)#<H1>\1</H1>#;}' \
+ }
+
+
+# Convert .IP Paragraphs upto next .cmd to hanging indents
+# using <UL></UL> pairs without intervening <LI>
+
+/^\.IP */ {
+ if ( inIP > 0 )
+ {
+ print "</UL>"
+ }
+ inIP = 1
+ print "<UL>"
+ match($0, /".*"/ )
+ if ( RSTART > 0 )
+ {
+ arg = substr( $0, RSTART+1, RLENGTH-2)
+
+ print arg " <BR>"
+ }
+ else if ( length( $2 ) > 0 )
+ {
+ print $2 " <BR>"
+ }
+ next
+ }
+
+$0 ~ /^\.[a-zA-Z]*/ && inIP > 0 {
+ inIP = 0
+ print "</UL>"
+ }
+
+# Convert
+# .TP
+# Line1
+# line 2 - n
+# .Any
+#
+# to
+# <DL>
+# <DT> Line1
+# <DD> lines 2 - n
+# <DT>
+
+/^\.TP */ {
+ if ( inTP > 0 )
+ {
+ print "</DL>"
+ }
+ inTP = 1
+ print "<DL>"
+ next
+ }
+
+inTP == 1 && $1 !~ /\.[a-zA-Z]*/ {
+ print "<DT> " $0
+ inTP = 2
+ next
+ }
+
+inTP == 2 && $1 !~ /\.[a-zA-Z]*/{
+ print "</I></B>" # Belt and suspenders
+ print "<DD> " $0
+ inTP = 3
+ next
+ }
+
+$0 ~ /^\.[a-zA-Z]*/ && inTP > 0 {
+ inTP = 0
+ print "</DL>"
+ }
+
+
+
+$1 == ".AP" {
+ $1=""
+ print "<DL >"
+ print "<DT> " $2 "\t\t" $3 "\t\t("$4")"
+ inTP = 2
+ next
+ }
+
+# make a blank line
+$1 == ".sp" {
+ print "<BR>"
+ next # print "<BR>"
+ }
+
+
+$1 == ".ta" { next }
+
+
+# try and make links ( tk )
+# "See the .* manual entry"
+
+/"options"/ {
+ if ( $0 ~ /^See the .*/ )
+ sub("\"options\"", "<A HREF=\"http://www.sco.com/Technology/tcl/man/tk_man/options.n.html\"> \"options\" </A>")
+ }
+
+/"entry"/ {
+ if ( $0 ~ /^See the .*/ )
+ sub("\"entry\"", "<A HREF=\"http://www.sco.com/Technology/tcl/man/tk_man/entry.n.html\"> \"entry\" </A>")
+ }
+
+/"button"/ {
+ if ( $0 ~ /^See the .*/ )
+ sub("\"button\"", "<A HREF=\"http://www.sco.com/Technology/tcl/man/tk_man/button.n.html\"> \"button\" </A>")
+ }
+
+/"scrollbar"/ {
+ if ( $0 ~ /^See the .*/ )
+ sub("\"scrollbar\"", "<A HREF=\"http://www.sco.com/Technology/tcl/man/tk_man/scrollbar.n.html\"> \"scrollbar\" </A>")
+ }
+
+/"listbox"/ {
+ if ( $0 ~ /^See the .*/ )
+ sub("\"listbox\"", "<A HREF=\"http://www.sco.com/Technology/tcl/man/tk_man/listbox.n.html\"> \"listbox\" </A>")
+ }
+
+/"canvas"/ {
+ if ( $0 ~ /^See the .*/ )
+ sub("\"canvas\"", "<A HREF=\"http://www.sco.com/Technology/tcl/man/tk_man/canvas.n.html\"> \"canvas\" </A>")
+ }
+
+/"text"/ {
+ if ( $0 ~ /^See the .*/ )
+ sub("\"text\"", "<A HREF=\"http://www.sco.com/Technology/tcl/man/tk_man/text.n.html\"> \"text\" </A>")
+ }
+
+/"license.terms"/ {
+ if ( $0 ~ /^See the .*/ )
+ sub("\"license\".terms", "<A HREF=\"legal.html\"> license.\"terms\" </A>")
+ }
+
+/"buttonbox"/ {
+ if ( $0 ~ /^See the .*/ )
+ sub("\"buttonbox\"", "<A HREF=\"buttonbox.n.html\"> \"buttonbox\" </A>")
+ }
+
+/"combobox"/ {
+ if ( $0 ~ /^See the .*/ )
+ sub("\"combobox\"", "<A HREF=\"combobox.n.html\"> \"combobox\" </A>")
+ }
+
+/"dialog"/ {
+ if ( $0 ~ /^See the .*/ )
+ sub("\"dialog\"", "<A HREF=\"dialog.n.html\"> \"dialog\" </A>")
+ }
+
+/"dialogshell"/ {
+ if ( $0 ~ /^See the .*/ )
+ sub("\"dialogshell\"", "<A HREF=\"dialogshell.n.html\"> \"dialogshell\" </A>")
+ }
+
+/"entryfield"/ {
+ if ( $0 ~ /^See the .*/ )
+ sub("\"entryfield\"", "<A HREF=\"entryfield.n.html\"> \"entryfield\" </A>")
+ }
+
+/"fileselectionbox"/ {
+ if ( $0 ~ /^See the .*/ )
+ sub("\"fileselectionbox\"", "<A HREF=\"fileselectionbox.n.html\"> \"fileselectionbox\" </A>")
+ }
+
+/"fileselectiondialog"/ {
+ if ( $0 ~ /^See the .*/ )
+ sub("\"fileselectiondialog\"", "<A HREF=\"fileselectiondialog.n.html\"> \"fileselectiondialog\" </A>")
+ }
+
+/"labeledwidget"/ {
+ if ( $0 ~ /^See the .*/ )
+ sub("\"labeledwidget\"", "<A HREF=\"labeledwidget.n.html\"> \"labeledwidget\" </A>")
+ }
+
+/"messagedialog"/ {
+ if ( $0 ~ /^See the .*/ )
+ sub("\"messagedialog\"", "<A HREF=\"messagedialog.n.html\"> \"messagedialog\" </A>")
+ }
+
+/"optionmenu"/ {
+ if ( $0 ~ /^See the .*/ )
+ sub("\"optionmenu\"", "<A HREF=\"optionmenu.n.html\"> \"optionmenu\" </A>")
+ }
+
+/"panedwindow"/ {
+ if ( $0 ~ /^See the .*/ )
+ sub("\"panedwindow\"", "<A HREF=\"panedwindow.n.html\"> \"panedwindow\" </A>")
+ }
+
+/"promptdialog"/ {
+ if ( $0 ~ /^See the .*/ )
+ sub("\"promptdialog\"", "<A HREF=\"promptdialog.n.html\"> \"promptdialog\" </A>")
+ }
+
+/"pushbutton"/ {
+ if ( $0 ~ /^See the .*/ )
+ sub("\"pushbutton\"", "<A HREF=\"pushbutton.n.html\"> \"pushbutton\" </A>")
+ }
+
+/"scrolledcanvas"/ {
+ if ( $0 ~ /^See the .*/ )
+ sub("\"scrolledcanvas\"", "<A HREF=\"scrolledcanvas.n.html\"> \"scrolledcanvas\" </A>")
+ }
+
+/"scrolledframe"/ {
+ if ( $0 ~ /^See the .*/ )
+ sub("\"scrolledframe\"", "<A HREF=\"scrolledframe.n.html\"> \"scrolledframe\" </A>")
+ }
+
+/"scrolledlistbox"/ {
+ if ( $0 ~ /^See the .*/ )
+ sub("\"scrolledlistbox\"", "<A HREF=\"scrolledlistbox.n.html\"> \"scrolledlistbox\" </A>")
+ }
+
+/"scrolledtext"/ {
+ if ( $0 ~ /^See the .*/ )
+ sub("\"scrolledtext\"", "<A HREF=\"scrolledtext.n.html\"> \"scrolledtext\" </A>")
+ }
+
+/"selectionbox"/ {
+ if ( $0 ~ /^See the .*/ )
+ sub("\"selectionbox\"", "<A HREF=\"selectionbox.n.html\"> \"selectionbox\" </A>")
+ }
+
+/"selectiondialog"/ {
+ if ( $0 ~ /^See the .*/ )
+ sub("\"selectiondialog\"", "<A HREF=\"selectiondialog.n.html\"> \"selectiondialog\" </A>")
+ }
+
+/"spindate"/ {
+ if ( $0 ~ /^See the .*/ )
+ sub("\"spindate\"", "<A HREF=\"spindate.n.html\"> \"spindate\" </A>")
+ }
+
+/"spinint"/ {
+ if ( $0 ~ /^See the .*/ )
+ sub("\"spinint\"", "<A HREF=\"spinint.n.html\"> \"spinint\" </A>")
+ }
+
+/"spinner"/ {
+ if ( $0 ~ /^See the .*/ )
+ sub("\"spinner\"", "<A HREF=\"spinner.n.html\"> \"spinner\" </A>")
+ }
+
+/"spintime"/ {
+ if ( $0 ~ /^See the .*/ )
+ sub("\"spintime\"", "<A HREF=\"spintime.n.html\"> \"spintime\" </A>")
+ }
+
+/^Name: */ {
+ print $1 " " $2
+ next
+ }
+
+/^Class: */ {
+ print $1 " " $2
+ next
+ }
+
+/^Bret A. Schuhmacher*/ {
+ print "<A HREF=\"mailto:bas@wn.com\">" $0 "</A>"
+ next
+ }
+
+/^John S. Sigler*/ {
+ print "<A HREF=\"mailto:jsigler@spd.dsccc.com\">" $0 "</A>"
+ next
+ }
+
+/^Mark L. Ulferts*/ {
+ print "<A HREF=\"mailto:mulferts@spd.dsccc.com\">" $0 "</A>"
+ next
+ }
+
+/^Alfredo Jahn*/ {
+ print "<A HREF=\"mailto:ajahn@spd.dsccc.com\">" $0 "</A>"
+ next
+ }
+
+/^Sue Yockey*/ {
+ print "<A HREF=\"mailto:syockey@spd.dsccc.com\">" $0 "</A>"
+ next
+ }
+
+# just pass everything else on
+
+ { print $0 }
+
+
diff --git a/iwidgets/doc/tk2html.perl b/iwidgets/doc/tk2html.perl
new file mode 100644
index 00000000000..c5474df5701
--- /dev/null
+++ b/iwidgets/doc/tk2html.perl
@@ -0,0 +1,337 @@
+#!/usr/local/bin/perl
+# Lightly modified man2html to make html equivs of tk/tcl man pages
+# probably a dead end soln since works on output after troff processing
+
+
+# Set the man path array to the paths to search...
+@manpath = ('/usr/share/man','/usr/gnu/man','/usr/local/man');
+#@manpath = ('/s/usr/hops/src/ftp/tcl/tk3.4/docs');
+
+# There has to be a blank line after this...
+#print "Content-type:text/html\n\n";
+
+if (!$ARGV[0]) {
+ print "<isindex>\n";
+ chop($os = `uname`);
+ chop($ver = `uname -r`);
+ print "
+<title> $os $ver Manual Pages </title>
+<h1> $os $ver Manual Pages </h1>
+
+Enter the name of the man page, optionally surrounded
+by parenthesis with the number. For example:
+<p>
+<ul>
+<li> stat to find one or more man pages for ls
+<li> stat(2) for the system call stat
+</ul>
+
+This converter is still in development. I intend to
+improve the handling of multiple matches, and add
+a interface to apropos (or man -k (or whatis...))
+<p>
+<a href=\"/users/bcutter/intro.html\">Brooks Cutter</a>
+";
+ exit(0);
+}
+
+$_ = $ARGV[0];
+$manpages[0] = $_;
+if ((/^-$/)) {
+ $manpages[0] = $_;
+} elsif ((m!^/!)) {
+ $manpages[0] = $_;
+#} elsif (($name, $sect) = /(\S+)\((\d.*)\)/) {
+# @manpages = &findman($name, $sect, @manpath);
+#} elsif (($name, $sect) = /(\S+)<(\d.*)>/) {
+# @manpages = &findman($name, $sect, @manpath);
+#} elsif (($name, $sect) = /(\S+)\[(\d.*)\]/) {
+# @manpages = &findman($name, $sect, @manpath);
+#} else {
+# @manpages = &findman($_, '', @manpath);
+}
+
+if (!scalar @manpages) {
+ print "Sorry, I was unable to find a match for <b>$_</b>\n";
+ exit(0);
+} elsif (scalar @manpages > 1) {
+ &which_manpage(@manpages);
+} else {
+ if (!-e $manpages[0]) {
+ die "man2html: Error, Can't locate file '$manpages[0]'\n";
+ }
+ chop($type=`file -L $manpages[0]`);
+ if ($type =~ /roff/i) {
+ $manpages[0] = "nroff -man $manpages[0]|col -b|";
+ } elsif ($type =~ /text/i) {
+# #$manpages[0] = $manpages[0];
+# ; # NOP (No Operation)
+ $manpages[0] = "nroff -man $manpages[0]| col -b|";
+ } else {
+ print "
+<title>Man2HTML: An Error has occurred</title>
+<h1>Man2HTML: An Error has occurred</h1>
+
+man2html found the following match for your query:</hr>
+$manpages[0]
+<p>
+When 'file -L $manpages[0]' was run
+(which should follow symbolic links)
+it returned the following value '$type'
+<p>
+
+";
+ if ($type =~ /link/i) {
+ print "
+This problem appears to be that there is a symbolic link
+for a man page that is pointing to a file that doesn't exist.
+<p>
+";
+ }
+ print "
+Please report this problem to someone who can do something about it.
+<i>(Assuming you aren't that person...)</i>
+If you don't know who that is, try emailing 'root' or 'postmaster'.
+<p>
+There was only one match for your query - and it can't currently
+be accessed.
+";
+ exit(0);
+ #die "Unknown type '$type' for manpage '$manpages[0]'";
+ }
+ &print_manpage($manpages[0]);
+}
+
+exit(0);
+
+sub findman {
+# Take a argument like 'ls' or 'vi(1)' or 'tip(1c)' and return
+# a list of one or more manpages.
+# Arguments 2- are the directories to search in
+ local($lookfor) = shift(@_);
+ local($section) = shift(@_);
+ local($file, @files, @return, $return);
+ local(%men,%man);
+ die "lookfor($lookfor) is null\n" unless($lookfor);
+ for (@_) {
+ # I'm... too lazy... for... opendir()... too lazy for readdir()...
+ # too lazy for closedir() ... I'm too lazy!
+ if (!$section) {
+ @files = `/bin/ls $_/*/$lookfor.* 2> /dev/null`;
+ } else {
+ # if the section is like '1b' then just search *1b
+ # otherwise if '1' search *1* (to catch all sub-sections)
+ # Reason for wildcards: ($_/*$section*/$lookfor.*)
+ # (given $section = '2')
+ # 1st: So it catches cat2 and man2
+ # 2nd: So it catches man2 and man2v
+ # (This should make it compatiable with HP/UX's man2.Z - not tested)
+ # 3rd: So it catches stat.2 and stat.2v
+ #
+ if (length($section) == 1) {
+ @files = `/bin/ls $_/*$section*/$lookfor.* 2> /dev/null`;
+ } else {
+ local($section_num) = substr($section, 0, 1); # Just the number...
+ @files = `/bin/ls $_/*$section_num*/$lookfor.* $_/*$section/$lookfor.* 2> /dev/null`;
+ }
+ }
+ next if (!scalar @files);
+ # This part checks the files that were found...
+ for $file (@files) {
+ chop($file);
+ local(@dirs) = split(/\//,$file);
+ local($fn) = pop(@dirs);
+ local($catman) = pop(@dirs);
+ local($dir) = join('/',@dirs);
+ local($key) = "$dir/$fn";
+ next if ($man{$key}); # forces unique
+ if (!$men{$key}) {
+ $men{$key} = $catman;
+ $man{$key} = $file;
+ } else {
+ # pre-formatted man pages always take precedence unless zero bytes...
+ next if (($men{$key} =~ /^cat/i) && (!(-z $man{$key})));
+ $men{$key} = $catman;
+ $man{$key} = $file;
+ }
+ }
+ }
+ return(values %man);
+}
+
+
+sub which_manpage {
+# Print a list of manpages...
+ print "
+There were multiple matches for the argument '$ARGV[0]'.
+Below are the fully qualified pathnames of the matches, please
+click on the appropriate one.
+
+<ul>
+";
+ for (@_) {
+ print "<li><a href=\"/htbin/man2html?$_\">$_</a>\n";
+ }
+ print "</ul>\n";
+ return;
+}
+
+sub print_manpage {
+ local($page) = @_;
+ local($label, $before, $after, $begtag, $endtag, $blanks, $begtag2, $endtag2);
+ local($pre);
+ local($standard_indent) = 0;
+
+ if ($page eq '-') {
+ open(MAN, '-');
+ } elsif (index($page,'|') == length($page)) {
+ # A Pipe
+ local($eval) =
+'open(MAN, "'.$page.'") || die "Can'."'t open pipe to '$page' for reading: ".'$!";';
+ eval($eval);
+ die "Eval error line $. : '$eval' returned '$@' : $!\n";
+ } else {
+ open(MAN, $page) || die "Can't open '$page' for reading: $!";
+ }
+ while (<MAN>) {
+ s/\|\|*[ ]*$//; # Delete trailing change bars
+
+ if (/^\s*$/) {
+ $blanks++;
+ #if ($pre) { print "</pre>\n"; $pre = 0; }
+ if (($. != 1) && ($blanks == 1)) {
+ if (($pre) || ($section_pre)) {
+ print "\n";
+ } else {
+ print "<p>\n";
+ }
+ }
+ next;
+ }
+ #next if (!/^[A-Z]{2,}\(.*\).*/);
+ if (//) { s/.//g; }
+ # Escape & < and >
+ s/&/\&amp;/g;
+ s/</\&lt;/g;
+ s/>/\&gt;/g;
+ #
+ if (/^(\w+.*)\s*$/) {
+ $label = $1;
+ $next_action = '';
+ if (/^[A-Z ]{2,}\s*$/) {
+ if (($pre) || ($section_pre)) { print "</pre>\n"; }
+ $pre = $section_pre = $section_fmt = 0;
+ if (!$standard_indent) { $next_action = 'check_indent'; }
+ }
+ if ($label eq 'NAME') {
+ $begtag = '<title>';
+ $endtag = '</title>';
+ $begtag2 = '<h1>';
+ $endtag2 = '</h1>';
+ $next_action = 'check_indent';
+ next;
+ }
+ if ($label eq 'SYNOPSIS') {
+ $section_fmt = 1;
+ }
+ if ($label eq 'SEE ALSO') {
+ $next_action = 'create_links';
+ }
+ if (($label =~ /OPTIONS$/) || ($label eq 'FILES')) {
+ $section_pre = 1;
+ print "</pre>\n";
+# print "</pre OPTION>\n";
+ } elsif (/^[A-Z ]+\s*$/) {
+ print "</pre>\n" if (($pre) || ($section_pre));
+ $section_pre = 0;
+ }
+print "..$label..\n";
+ if (/^[-A-Z ]+\s*$/) {
+ print "<h2>$label</h2>\n";
+ $blanks = 0;
+ print "<pre>\n" if ($section_pre);
+ next;
+ }
+ next;
+ }
+ if ($section_fmt) { print; $blanks = 0; next; }
+ if ($next_action eq 'create_links') {
+ # Parse see also looking for man page links. Make it
+ # call this program. use '+' notation for spaces
+ local($page);
+ local($first) = 1;
+ for $page (split(/,/)) {
+ $page =~ tr/\x00-\x20//d; # Delete all control chars, spaces
+ if ($page =~ /.+\(\d.*\).*$/) {
+ $url_page = $page;
+ $url_page =~ tr/()/[]/;
+ print "," if (!$first);
+ $first = 0;
+ print "<a href=\"/tk2html?$url_page\">$page</a>\n";
+ } else {
+ print "," if (!$first);
+ $first = 0;
+ print "$page";
+ }
+ }
+ next;
+ }
+ # This is to detect preformatted blocks. I look at the first
+ # line after header 'DESCRIPTION' and count the leading white
+ # space as the "standard indent". If I encounter a line with
+ # a indent greater than the value of standard_indent then
+ # surround it with <pre> and </pre>
+ if ($next_action eq 'check_indent') {
+ if (/^(\s+)\S+.*/) {
+ $standard_indent = length($1);
+ $next_action = '';
+ }
+ }
+ #
+ $before = length($_);
+ $saved = $_;
+ s/^[ ][ ]*//; # Delete leading whitespace
+ $after = length($_);
+ s/[ ][ ]*$//; # Delete trailing whitespace
+
+ if ($begtag) {
+ chop;
+ print "$begtag$_$endtag\n";
+ print "$begtag2$_$endtag2\n" if ($begtag2);
+ $blanks = 0;
+ $begtag2 = $endtag2 = $begtag = $endtag = '';
+ next;
+ }
+ if ((!$section_fmt) && (!$section_pre) && ($standard_indent)) {
+ if (($blanks == 1) && (!$pre) && ($after + $standard_indent) < $before) {
+ $pre = 1;
+ print "<pre>\n";
+ } elsif (($pre) && ($after + $standard_indent) >= $before) {
+ $pre = 0;
+ print "</pre>\n";
+ }
+ }
+ if (($section_pre) || ($pre)) {
+ print "$saved";
+ $blanks = 0;
+ next;
+ }
+ # Handle word cont-
+ # inuations
+ if ($prefix) {
+ print $prefix;
+ $prefix = '';
+ }
+ if (/^(.+)\s+(\w+)\-\s*$/) {
+ $prefix = $2;
+ print "$1\n";
+ $blanks = 0;
+ next;
+ }
+ print;
+ $blanks = 0;
+ }
+ close(MAN);
+}
+
+# EOF
diff --git a/iwidgets/doc/tk2html2.awk b/iwidgets/doc/tk2html2.awk
new file mode 100644
index 00000000000..0134df1ad3c
--- /dev/null
+++ b/iwidgets/doc/tk2html2.awk
@@ -0,0 +1,53 @@
+#!/bin/nawk
+# cleans up any leading crap before <TITLE> line in stream from tk2html
+
+/^<TITLE>/ { go = 1 }
+
+/^<table>*/ {
+ getline ln
+ numf = split (ln, spln)
+
+ if ( ln !~ "Name: *" )
+ {
+ ind = 0
+ inc = 4
+ print "<table cellpadding=5>"
+
+ while ( ln !~ "^</table>" )
+ {
+ for (i = 1; i <= numf; i++)
+ {
+ tablns[ind] = spln[i]
+ ind++
+ }
+ getline ln
+ numf = split (ln, spln)
+ }
+
+ for (i = 0; i < inc; i++)
+ {
+ print "<td valign=top>"
+ for (j = i; j < ind; j += inc)
+ print tablns[j] "<br>"
+ print "</td>"
+ }
+
+ print "</table>"
+ }
+
+ else
+ {
+ print "<pre>"
+ while ( ln !~ "^</table>" )
+ {
+ print ln
+ getline ln
+ }
+ print "</pre>"
+ }
+
+ next
+ }
+
+go == 1 { print $0 }
+
diff --git a/iwidgets/doc/toolbar.n b/iwidgets/doc/toolbar.n
new file mode 100644
index 00000000000..8f1d0bb6232
--- /dev/null
+++ b/iwidgets/doc/toolbar.n
@@ -0,0 +1,305 @@
+'\"
+'\" Copyright (c) 1995 DSC Technologies Corporation
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" toolbar.n
+'\"
+.so man.macros
+.HS iwidgets::toolbar iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+\fBiwidgets::toolbar\fR \- Create and manipulate a tool bar
+.SH SYNOPSIS
+\fBiwidgets::toolbar\fR \fIpathName\fR ?\fIoptions\fR?
+.SH "INHERITANCE"
+itk::Widget <- iwidgets::Toolbar
+.SH STANDARD OPTIONS
+.LP
+.nf
+.ta 4c 8c 12c
+\fB
+activeBackground activeForeground background borderWidth
+cursor disabledForeground font foreground
+highlightBackground highlightColor highlightThickness
+insertBackground insertForeground orient selectBackground
+selectBorderWidth selectForeground state troughColor\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options. For widgets
+added to the toolbar, these options will be propogated if the widget supports
+the option. For example, all widgets that support a font option will be changed
+if the the toolbar's font option is configured.
+.SH "WIDGET-SPECIFIC OPTIONS"
+.LP
+.nf
+Name: \fBballoonBackground\fR
+Class: \fBBalloonBackground\fR
+Command-Line Switch: \fB-ballooonbackground\fR
+.fi
+.IP
+Specifies the background color of the balloon help displayed at the bottom
+center of a widget on the toolbar that has a non empty string for its
+balloonStr option. The default color is yellow.
+.LP
+.nf
+Name: \fBballoonDelay1\fR
+Class: \fBBalloonDelay1\fR
+Command-Line Switch: \fB-balloondelay1\fR
+.fi
+.IP
+Specifies the length of time (in milliseconds) to wait before initially
+posting a balloon help hint window. This delay is in effect whenever 1)
+the mouse leaves the toolbar, or 2) a toolbar item is selected with the
+mouse button.
+.LP
+.nf
+Name: \fBballoonDelay2\fR
+Class: \fBBalloonDelay2\fR
+Command-Line Switch: \fB-balloondelay2\fR
+.fi
+.IP
+Specifies the length of time (in milliseconds) to wait before continuing to
+post balloon help hint windows. This delay is in effect after the first
+time a balloon hint window is activated. It remains in effect until 1) the
+mouse leaves the toolbar, or 2) a toolbar item is selected with the mouse
+button.
+.LP
+.nf
+Name: \fBballoonFont\fR
+Class: \fBBalloonFont\fR
+Command-Line Switch: \fB-balloonfont\fR
+.fi
+.IP
+Specifies the font of the balloon help text displayed at the bottom center
+of a widget on the toolbar that has a non empty string for its
+balloonStr option. The default font is 6x10.
+.LP
+.nf
+Name: \fBballoonForeground\fR
+Class: \fBBalloonForeground\fR
+Command-Line Switch: \fB-ballooonforeground\fR
+.fi
+.IP
+Specifies the foreground color of the balloon help displayed at the
+bottom center of a widget on the toolbar that has a non empty string for
+its balloonStr option. The default color is black.
+.LP
+.nf
+Name: \fBhelpVariable\fR
+Class: \fBHelpVariable\fR
+Command-Line Switch: \fB-helpvariable\fR
+.fi
+.IP
+Specifies the global variable to update whenever the mouse is in motion
+over a toolbar widget. This global variable is updated with the current
+value of the active widget's helpStr. Other widgets can "watch" this
+variable with the trace command, or as is the case with entry or label
+widgets, they can set their textVariable to the same global variable. This
+allows for a simple implementation of a help status bar. Whenever the
+mouse leaves a menu entry, the helpVariable is set to the empty string {}.
+.LP
+.nf
+Name: \fBorient\fR
+Class: \fBOrient\fR
+Command-Line Switch: \fB-orient\fR
+.fi
+.IP
+Specifies the orientation of the toolbar. Must be either horizontal or
+vertical.
+.BE
+.SH DESCRIPTION
+The \fBiwidgets::toolbar\fR command creates a new window (given by the pathName
+argument) and makes it into a \fBtoolbar\fR widget. Additional options,
+described above may be specified on the command line or in the option
+database to configure aspects of the toolbar such as its colors, font,
+and orientation. The \fBiwidgets::toolbar\fR command returns its pathName argument. At
+the time this command is invoked, there must not exist a window named
+pathName, but pathName's parent must exist.
+.PP
+A \fBtoolbar\fR is a widget that displays a collection of widgets arranged
+either in a row or a column (depending on the value of the -orient option).
+This collection of widgets is usually for user convenience to give access
+to a set of commands or settings. Any widget may be placed on a toolbar.
+However, command or value-oriented widgets (such as button, radiobutton,
+etc.) are usually the most useful kind of widgets to appear on a toolbar.
+.PP
+In addition, the toolbar adds two new options to all widgets that are added to
+it. These are the \fBhelpStr\fR and \fBballoonStr\fR options. See the
+discussion for the widget command add below.
+
+.SH "WIDGET-SPECIFIC METHODS"
+.PP
+The iwidgets::toolbar command creates a new Tcl command whose name is pathName. This
+command may be used to invoke various operations on the widget. It has the
+following general form:
+.DS C
+\fIpathName\fR \fIoption\fR \fI?arg arg ...?\fR
+.DE
+Option and args determine the exact behavior of the command.
+.PP
+Many of the widget commands for a toolbar take as one argument an indicator of
+which widget item of the toolbar to operate on. The indicator is called
+an \fBindex\fR and may be specified in any of the following forms:
+.TP
+\fInumber\fR
+Specifies the widget numerically, where 0 corresponds to the first
+widget in the notebook, 1 to the second, and so on. (For horizontal, 0 is the
+leftmost; for vertical, 0 is the topmost).
+.TP
+\fBend\fR
+Specifes the last widget in the toolbar's index. If the toolbar is
+empty this will return -1.
+.TP
+\fBlast\fR
+Same as end.
+.TP
+\fIpattern\fR
+If the index doesn't satisfy any of the above forms, then this form is
+used. Pattern is pattern-matched against the widgetName of each widget in the
+toolbar, in order from the first to the last widget, until a matching entry is
+found. An exact match must occur.
+.PP
+The following commands are possible for toolbar widgets:
+.TP
+\fIpathName\fR \fBadd\fR \fIwidgetCommand\fR \fIwidgetName\fR \fI?option value?\fR
+Adds a widget with the command widgetCommand whose name is widgetName to the
+toolbar. If widgetCommand is radiobutton or checkbutton, its packing is
+slightly padded to match the geometry of button widgets. In addition, the
+indicatorOn option is false by default and the selectColor is that of the
+toolbar background by default. This allows Radiobutton and Checkbutton widgets
+to be added as icons by simply setting their bitmap or image options. If
+additional arguments are present, they are the set of available options
+that the widget type of \fIwidgetCommand\fR supports. In addition they may
+also be one of the following options:
+.RS
+.TP
+\fB-helpstr\fR \fIvalue\fR
+Specifes the help string to associate with the widget. When the mouse moves
+over the widget, the variable denoted by \fBhelpVariable\fR is set
+to \fBhelpStr\fR. Another widget can bind to the helpVariable and thus
+track status help.
+.TP
+\fB-balloonstr\fR \fIvalue\fR
+Specifes the string to display in a balloon window for this widget. A
+balloon window is a small popup window centered at the bottom of the
+widget. Usually the \fBballoonStr\fR value is the name of the item on the
+toolbar. It is sometimes known as a hint window.
+.IP
+When the mouse moves into an item on the toolbar, a timer is set based on
+the value of \fBballoonDelay1\fR. If the mouse stays inside the item
+for \fBballoonDelay1\fR, the balloon window will pop up displaying
+the \fBballoonStr\fR value. Once the balloon window is posted, a new
+timer based on \fBballoonDelay2\fR is set. This is typically a shorter
+timer. If the mouse is moved to another item, the window is unposted and
+a new window will be posted over the item if the shorter delay time is
+satisfied.
+.IP
+While the balloon window is posted, it can also be unposted if the item
+is selected. In this case the timer is reset to \fBballoonDelay1\fR.
+Whenever the mouse leaves the toolbar, the timer is also reset
+to \fBballoonDelay1\fR.
+.IP
+This window posting/unposting model is the same model used in the
+Windows95 environment.
+.RE
+.TP
+\fIpathName\fR \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given by \fIoption\fR.
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoption\fR \fIvalue\fR?
+Query or modify the configuration options of the widget. If no \fIoption\fR is
+specified, returns a list describing all of the available options for pathName
+(see Tk_ConfigureInfo for information on the format of this list). If
+\fIoption\fR is specified with no value, then the command returns a
+list describing the one
+named option (this list will be identical to the corresponding sublist of the
+value returned if no option is specified). If one or more option-value pairs
+are specified, then the command modifies the given widget option(s) to have the
+given value(s); in this case the command returns an empty string.
+.TP
+\fIpathName\fR \fBdelete\fR \fIindex\fR ?\fIindex2\fR?
+This command deletes all items between \fIindex\fR and \fIindex2\fR
+inclusive. If \fIindex2\fR is omitted then it defaults to \fIindex\fR.
+Returns an empty string.
+.TP
+\fIpathName\fR \fBindex\fR \fIindex\fR
+Returns the widget's numerical index for the entry corresponding
+to \fIindex\fR. If \fIindex\fR is not found, -1 is returned.
+.TP
+\fIpathName\fR \fBinsert\fR \fIbeforeIndex\fR \fIwidgetCommand\fR \fIwidgetName\fR \fI?option value?\fR
+.TP
+Insert a new item named \fIwidgetName\fR with the
+command \fIwidgetCommand\fR before the item specified by \fIbeforeIndex\fR.
+If \fIwidgetCommand\fR is \fBradiobutton\fR or \fBcheckbutton\fR, its
+packing is slightly padded to match the geometry of button widgets. In
+addition, the \fBindicatorOn\fR option is \fBfalse\fR by default and the
+\fBselectColor\fR is that of the toolbar background by default. This allows
+\fBRadiobutton\fR and \fBCheckbutton\fR widgets to be added as icons by
+simply setting their \fBbitmap\fR or \fBimage\fR options. The set of
+available options is the same as specified in the \fBad\fR command.
+.TP
+\fIpathName\fR \fBitemcget\fR \fIindex\fR \fIoption\fR
+Returns the current value of the configuration option given by \fIoption\fR for
+index. The item type of \fIindex\fR determines the valid available options.
+.TP
+\fIpathName\fR \fBitemconfigure\fR \fIindex\fR \fI?option value?\fR
+Query or modify the configuration options of the widget of the toolbar
+specified by \fIindex\fR. If no option is specified,
+returns a list describing all of
+the available options for \fIindex\fR
+(see \fBTk_ConfigureInfo\fR for information on the
+format of this list). If \fIoption\fR is specified with no value,
+then the command
+returns a list describing the one named option (this list will be identical to
+the corresponding sublist of the value returned if no option is specified). If
+one or more option-value pairs are specified, then the command modifies the
+given widget option(s) to have the given value(s); in this case the command
+returns an empty string. The item type of \fIindex\fR determines the valid
+available options. The set of available options is the same as specified
+in the \fBad\fR command.
+.SH EXAMPLE
+.DS
+ package require Iwidgets 4.0
+ iwidgets::toolbar .tb -helpvariable statusVar
+
+ .tb add button item1 \\
+ -helpstr "Save It" -bitmap @./icons/Tool_32_box.xbm \\
+ -balloonstr "Save" -command {puts 1}
+ .tb add button item2 \\
+ -helpstr "Save It" -bitmap @./icons/Tool_32_brush.xbm \\
+ -balloonstr "Save" -command {puts 1}
+ .tb add button item3 \\
+ -helpstr "Save It" -bitmap @./icons/Tool_32_cut.xbm \\
+ -balloonstr "Save" -command {puts 1}
+ .tb add button item4 \\
+ -helpstr "Save It" -bitmap @./icons/Tool_32_draw.xbm \\
+ -balloonstr "Save" -command {puts 1}
+ .tb add button item5 \\
+ -bitmap @./icons/Tool_32_erase.xbm -helpstr "Play It" \\
+ -command {puts 2}
+ .tb add frame filler \\
+ -borderwidth 1 -width 10 -height 10
+ .tb add radiobutton item6 \\
+ -bitmap @./icons/Tool_32_oval.xbm -command {puts 4} \\
+ -variable result -value OPEN -helpstr "Radio Button # 1" \\
+ -balloonstr "Radio"
+ .tb add radiobutton item7 \\
+ -bitmap @./icons/Tool_32_line.xbm -command {puts 5} \\
+ -variable result -value CLOSED
+ .tb add checkbutton item8 \\
+ -bitmap @./icons/Tool_32_text.xbm -command {puts 6} \\
+ -variable checkit -onvalue yes -offvalue no
+ .tb add checkbutton check2 \\
+ -bitmap @./icons/Tool_32_points.xbm -command {puts 7} \\
+ -variable checkit2 -onvalue yes -offvalue no
+
+ pack .tb -side top -anchor nw
+.DE
+.SH AUTHOR
+Bill Scott
+.SH KEYWORDS
+toolbar, button, radiobutton, checkbutton, iwidgets, widget
+
diff --git a/iwidgets/doc/watch.n b/iwidgets/doc/watch.n
new file mode 100644
index 00000000000..660d6bcaee6
--- /dev/null
+++ b/iwidgets/doc/watch.n
@@ -0,0 +1,286 @@
+'\"
+'\" Copyright (c) 1995 DSC Technologies Corporation
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) watch.n
+'\"
+.so man.macros
+.HS iwidgets::watch iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+iwidgets::watch \- Create and manipulate time with a watch widgets
+.SH SYNOPSIS
+\fBiwidgets::watch\fI \fIpathName \fR?\fIoptions\fR?
+.SH "INHERITANCE"
+itk::Widget <- iwidgets::Watch
+
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBbackground\fR \fBcursor\fR \fBforeground\fR \fBrelief\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "ASSOCIATED OPTIONS"
+.LP
+See the "Canvas" manual entry for details on the above associated options.
+
+.SH "WIDGET-SPECIFIC OPTIONS"
+.LP
+.nf
+Name: \fBclockColor\fR
+Class: \fBColorfR
+Command-Line Switch: \fB-clockcolor\fR
+.fi
+.IP
+Fill color for the main oval encapsulating the watch, in any of the forms
+acceptable to \fBTk_GetColor\fR. The default is "White".
+.nf
+.LP
+Name: \fBclockStipple\fR
+Class: \fBBitmapfR
+Command-Line Switch: \fB-clockstipple\fR
+.fi
+.IP
+Bitmap for the main oval encapsulating the watch, in any of the forms
+acceptable to \fBTk_GetBitmap\fR. The default is "".
+.LP
+.nf
+Name: \fBheight\fR
+Class: \fBHeight\fR
+Command-Line Switch: \fB-height\fR
+.fi
+.IP
+Specifies the height of the watch widget in any of the forms
+acceptable to \fBTk_GetPixels\fR. The default height is 175 pixels.
+.LP
+.nf
+Name: \fBhourColor\fR
+Class: \fBColorfR
+Command-Line Switch: \fB-hourcolor\fR
+.fi
+.IP
+Fill color for the hour hand, in any of the forms acceptable to \fBTk_GetColor\fR.
+The default is "Red".
+.LP
+.nf
+Name: \fBhourRadius\fR
+Class: \fBRadius\fR
+Command-Line Switch: \fB-hourradius\fR
+.fi
+.IP
+Specifies the radius of the hour hand as a percentage of the radius
+from the center to the out perimeter of the clock.
+The value must be a fraction <= 1. The default is ".5".
+.LP
+.nf
+Name: \fBminuteColor\fR
+Class: \fBColorfR
+Command-Line Switch: \fB-minutecolor\fR
+.fi
+.IP
+Fill color for the minute hand, in any of the forms acceptable to \fBTk_GetColor\fR.
+The default is "Yellow".
+.LP
+.nf
+Name: \fBminuteRadius\fR
+Class: \fBRadius\fR
+Command-Line Switch: \fB-minuteradius\fR
+.fi
+.IP
+Specifies the radius of the minute hand as a percentage of the radius
+from the center to the out perimeter of the clock.
+The value must be a fraction <= 1. The default is ".8".
+.LP
+.nf
+Name: \fBpivotColor\fR
+Class: \fBColorfR
+Command-Line Switch: \fB-pivotcolor\fR
+.fi
+.IP
+Fill color for the circle in which the watch hands rotate
+in any of the forms acceptable to \fBTk_GetColor\fR.
+The default is "White".
+.LP
+.nf
+Name: \fBpivotRadius\fR
+Class: \fBRadius\fR
+Command-Line Switch: \fB-pivotradius\fR
+.fi
+.IP
+Specifies the radius of the circle in which the watch hands rotate
+as a percentage of the radius. The value must be a fraction <= 1.
+The default is ".1".
+.LP
+.nf
+Name: \fBsecondColor\fR
+Class: \fBColorfR
+Command-Line Switch: \fB-secondcolor\fR
+.fi
+.IP
+Fill color for the second hand, in any of the forms acceptable to \fBTk_GetColor\fR.
+The default is "Black".
+.LP
+.nf
+Name: \fBsecondRadius\fR
+Class: \fBRadius\fR
+Command-Line Switch: \fB-secondradius\fR
+.fi
+.IP
+Specifies the radius of the second hand as a percentage of the radius
+from the center to the out perimeter of the clock.
+The value must be a fraction <= 1. The default is ".9".
+.LP
+.nf
+Name: \fBshowAmPm\fR
+Class: \fBShosAmPm\fR
+Command-Line Switch: \fB-showampm\fR
+.fi
+.IP
+Specifies whether the AM/PM radiobuttons should be displayed, in any
+of the forms acceptable to \fBTcl_GetBoolean\fR. The default is yes.
+.LP
+.nf
+Name: \fBstate\fR
+Class: \fBState\fR
+Command-Line Switch: \fB-state\fR
+.fi
+.IP
+Specifies the editable state for the hands on the watch. In a normal
+state, the user can select and move the hands via mouse button 1. The
+valid values are \fBnormal\fR, and \fBdisabled\fR. The defult is normal.
+.LP
+.nf
+Name: \fBtickColor\fR
+Class: \fBColorfR
+Command-Line Switch: \fB-tickcolor\fR
+.fi
+.IP
+Fill color for the 60 ticks around the perimeter of the watch,
+in any of the forms acceptable to \fBTk_GetColor\fR. The default is "Black".
+.LP
+.nf
+Name: \fBwidth\fR
+Class: \fBWidth\fR
+Command-Line Switch: \fB-width\fR
+.fi
+.IP
+Specifies the width of the watch widget in any of the forms
+acceptable to \fBTk_GetPixels\fR. The default height is 155 pixels.
+.BE
+
+.SH DESCRIPTION
+.PP
+
+The \fBiwidgets::watch\fR command creates a watch with hour, minute, and
+second hands modifying the time value.
+
+.SH "METHODS"
+.PP
+The \fBiwidgets::watch\fR command creates a new Tcl command whose
+name is \fIpathName\fR. This command may be used to invoke various
+operations on the widget. It has the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIOption\fR and the \fIarg\fRs
+determine the exact behavior of the command. The following
+commands are possible for watch widgets:
+
+.SH "WIDGET-SPECIFIC METHODS"
+.TP
+\fIpathName \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given
+by \fIoption\fR.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::watch\fR
+command.
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR?
+Query or modify the configuration options of the widget.
+If no \fIoption\fR is specified, returns a list describing all of
+the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for
+information on the format of this list). If \fIoption\fR is specified
+with no \fIvalue\fR, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no \fIoption\fR is specified). If
+one or more \fIoption\-value\fR pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+\fIOption\fR may have any of the values accepted by the \fBiwidgets::watch\fR
+command.
+.TP
+\fIpathName \fBget\fR ?\fBformat\fR?
+Returns the current time of the watch in a format of
+string or as an integer clock value using the \fB-string\fR and \fB-clicks\fR
+format options respectively. The default is by string. Reference the
+clock command for more information on obtaining time and its
+formats.
+.TP
+\fIpathName \fBshow\fR \fItime\fR
+Changes the currently displayed time to be that of the time
+argument. The time may be specified either as a string, an
+integer clock value or the keyword "now". Reference the clock
+command for more information on obtaining time and its format.
+.TP
+\fIpathName \fBwatch\fR ?\fBargs\fR?
+Evaluates the specifieds \fBargs\fR against the canvas component.
+
+.ta 4c
+.SH "COMPONENTS"
+.LP
+.nf
+Name: \fBcanvas\fR
+Class: \fBCanvas\fR
+.fi
+.IP
+The canvas component is the where the clock is drawn. See the
+Canvas widget manual entry for details.
+.LP
+.nf
+Name: \fBframe\fR
+Class: \fBFrame\fR
+.fi
+.IP
+The frame component is the where the "AM" and "PM" radiobuttons are displayed.
+See the Frame widget manual entry for details.
+.LP
+.nf
+Name: \fBam\fR
+Class: \fBRadiobutton\fR
+.fi
+.IP
+The am component indicates whether on not the time is relative to "AM".
+See the Radiobutton widget manual entry for details.
+.LP
+.nf
+Name: \fBpm\fR
+Class: \fBRadiobutton\fR
+.fi
+.IP
+The pm component indicates whether on not the time is relative to "PM".
+See the Radiobutton widget manual entry for details.
+.fi
+
+.SH EXAMPLE
+.DS
+package require Iwidgets 4.0
+iwidgets::watch .w -state disabled -showampm no -width 155 -height 155
+pack .w -padx 10 -pady 10 -fill both -expand yes
+
+while {1} {
+ after 1000
+ .w show
+ update
+}
+.DE
+.SH AUTHOR
+John Tucker
+.DE
+Mark L. Ulferts
+.SH KEYWORDS
+watch, hand, ticks, pivot, widget
+
diff --git a/iwidgets/generic/buttonbox.itk b/iwidgets/generic/buttonbox.itk
new file mode 100644
index 00000000000..dabada368cc
--- /dev/null
+++ b/iwidgets/generic/buttonbox.itk
@@ -0,0 +1,571 @@
+#
+# Buttonbox
+# ----------------------------------------------------------------------
+# Manages a framed area with Motif style buttons. The button box can
+# be configured either horizontally or vertically.
+#
+# ----------------------------------------------------------------------
+# AUTHOR: Mark L. Ulferts EMAIL: mulferts@austin.dsccc.com
+# Bret A. Schuhmacher EMAIL: bas@wn.com
+#
+# @(#) $Id$
+# ----------------------------------------------------------------------
+# Copyright (c) 1995 DSC Technologies Corporation
+# ======================================================================
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+
+#
+# Usual options.
+#
+itk::usual Buttonbox {
+ keep -background -cursor -foreground
+}
+
+# ------------------------------------------------------------------
+# BUTTONBOX
+# ------------------------------------------------------------------
+itcl::class iwidgets::Buttonbox {
+ inherit itk::Widget
+
+ constructor {args} {}
+ destructor {}
+
+ itk_option define -pady padY Pad 5
+ itk_option define -padx padX Pad 5
+ itk_option define -orient orient Orient "horizontal"
+ itk_option define -foreground foreground Foreground black
+
+ public method index {args}
+ public method add {args}
+ public method insert {args}
+ public method delete {args}
+ public method default {args}
+ public method hide {args}
+ public method show {args}
+ public method invoke {args}
+ public method buttonconfigure {args}
+ public method buttoncget {index option}
+
+ private method _positionButtons {}
+ private method _setBoxSize {{when later}}
+ private method _getMaxWidth {}
+ private method _getMaxHeight {}
+
+ private variable _resizeFlag {} ;# Flag for resize needed.
+ private variable _buttonList {} ;# List of all buttons in box.
+ private variable _displayList {} ;# List of displayed buttons.
+ private variable _unique 0 ;# Counter for button widget ids.
+}
+
+namespace eval iwidgets::Buttonbox {
+ #
+ # Set up some class level bindings for map and configure events.
+ #
+ bind bbox-map <Map> [itcl::code %W _setBoxSize]
+ bind bbox-config <Configure> [itcl::code %W _positionButtons]
+}
+
+#
+# Provide a lowercased access method for the Buttonbox class.
+#
+proc ::iwidgets::buttonbox {pathName args} {
+ uplevel ::iwidgets::Buttonbox $pathName $args
+}
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Buttonbox::constructor {args} {
+ #
+ # Add Configure bindings for geometry management.
+ #
+ bindtags $itk_component(hull) \
+ [linsert [bindtags $itk_component(hull)] 0 bbox-map]
+ bindtags $itk_component(hull) \
+ [linsert [bindtags $itk_component(hull)] 1 bbox-config]
+
+ pack propagate $itk_component(hull) no
+
+ #
+ # Initialize the widget based on the command line options.
+ #
+ eval itk_initialize $args
+}
+
+# ------------------------------------------------------------------
+# DESTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Buttonbox::destructor {} {
+ if {$_resizeFlag != ""} {after cancel $_resizeFlag}
+}
+
+# ------------------------------------------------------------------
+# OPTIONS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# OPTION: -pady
+#
+# Pad the y space between the button box frame and the hull.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Buttonbox::pady {
+ _setBoxSize
+}
+
+# ------------------------------------------------------------------
+# OPTION: -padx
+#
+# Pad the x space between the button box frame and the hull.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Buttonbox::padx {
+ _setBoxSize
+}
+
+# ------------------------------------------------------------------
+# OPTION: -orient
+#
+# Position buttons either horizontally or vertically.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Buttonbox::orient {
+ switch $itk_option(-orient) {
+ "horizontal" -
+ "vertical" {
+ _setBoxSize
+ }
+
+ default {
+ error "bad orientation option \"$itk_option(-orient)\",\
+ should be either horizontal or vertical"
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# METHODS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# METHOD: index index
+#
+# Searches the buttons in the box for the one with the requested tag,
+# numerical index, keyword "end" or "default". Returns the button's
+# tag if found, otherwise error.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Buttonbox::index {index} {
+ if {[llength $_buttonList] > 0} {
+ if {[regexp {(^[0-9]+$)} $index]} {
+ if {$index < [llength $_buttonList]} {
+ return $index
+ } else {
+ error "Buttonbox index \"$index\" is out of range"
+ }
+
+ } elseif {$index == "end"} {
+ return [expr {[llength $_buttonList] - 1}]
+
+ } elseif {$index == "default"} {
+ foreach knownButton $_buttonList {
+ if {[$itk_component($knownButton) cget -defaultring]} {
+ return [lsearch -exact $_buttonList $knownButton]
+ }
+ }
+
+ error "Buttonbox \"$itk_component(hull)\" has no default"
+
+ } else {
+ if {[set idx [lsearch $_buttonList $index]] != -1} {
+ return $idx
+ }
+
+ error "bad Buttonbox index \"$index\": must be number, end,\
+ default, or pattern"
+ }
+
+ } else {
+ error "Buttonbox \"$itk_component(hull)\" has no buttons"
+ }
+}
+
+# ------------------------------------------------------------------
+# METHOD: add tag ?option value option value ...?
+#
+# Add the specified button to the button box. All PushButton options
+# are allowed. New buttons are added to the list of buttons and the
+# list of displayed buttons. The PushButton path name is returned.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Buttonbox::add {tag args} {
+ itk_component add $tag {
+ iwidgets::Pushbutton $itk_component(hull).[incr _unique]
+ } {
+ usual
+ rename -highlightbackground -background background Background
+ }
+
+ if {$args != ""} {
+ uplevel $itk_component($tag) configure $args
+ }
+
+ lappend _buttonList $tag
+ lappend _displayList $tag
+
+ _setBoxSize
+}
+
+# ------------------------------------------------------------------
+# METHOD: insert index tag ?option value option value ...?
+#
+# Insert the specified button in the button box just before the one
+# given by index. All PushButton options are allowed. New buttons
+# are added to the list of buttons and the list of displayed buttons.
+# The PushButton path name is returned.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Buttonbox::insert {index tag args} {
+ itk_component add $tag {
+ iwidgets::Pushbutton $itk_component(hull).[incr _unique]
+ } {
+ usual
+ rename -highlightbackground -background background Background
+ }
+
+ if {$args != ""} {
+ uplevel $itk_component($tag) configure $args
+ }
+
+ set index [index $index]
+ set _buttonList [linsert $_buttonList $index $tag]
+ set _displayList [linsert $_displayList $index $tag]
+
+ _setBoxSize
+}
+
+# ------------------------------------------------------------------
+# METHOD: delete index
+#
+# Delete the specified button from the button box.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Buttonbox::delete {index} {
+ set index [index $index]
+ set tag [lindex $_buttonList $index]
+
+ destroy $itk_component($tag)
+
+ set _buttonList [lreplace $_buttonList $index $index]
+
+ if {[set dind [lsearch $_displayList $tag]] != -1} {
+ set _displayList [lreplace $_displayList $dind $dind]
+ }
+
+ _setBoxSize
+ update idletasks
+}
+
+# ------------------------------------------------------------------
+# METHOD: default index
+#
+# Sets the default to the push button given by index.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Buttonbox::default {index} {
+ set index [index $index]
+
+ set defbtn [lindex $_buttonList $index]
+
+ foreach knownButton $_displayList {
+ if {$knownButton == $defbtn} {
+ $itk_component($knownButton) configure -defaultring yes
+ } else {
+ $itk_component($knownButton) configure -defaultring no
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# METHOD: hide index
+#
+# Hide the push button given by index. This doesn't remove the button
+# permanently from the display list, just inhibits its display.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Buttonbox::hide {index} {
+ set index [index $index]
+ set tag [lindex $_buttonList $index]
+
+ if {[set dind [lsearch $_displayList $tag]] != -1} {
+ place forget $itk_component($tag)
+ set _displayList [lreplace $_displayList $dind $dind]
+
+ _setBoxSize
+ }
+}
+
+# ------------------------------------------------------------------
+# METHOD: show index
+#
+# Displays a previously hidden push button given by index. Check if
+# the button is already in the display list. If not then add it back
+# at it's original location and redisplay.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Buttonbox::show {index} {
+ set index [index $index]
+ set tag [lindex $_buttonList $index]
+
+ if {[lsearch $_displayList $tag] == -1} {
+ set _displayList [linsert $_displayList $index $tag]
+
+ _setBoxSize
+ }
+}
+
+# ------------------------------------------------------------------
+# METHOD: invoke ?index?
+#
+# Invoke the command associated with a push button. If no arguments
+# are given then the default button is invoked, otherwise the argument
+# is expected to be a button index.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Buttonbox::invoke {args} {
+ if {[llength $args] == 0} {
+ $itk_component([lindex $_buttonList [index default]]) invoke
+
+ } else {
+ $itk_component([lindex $_buttonList [index [lindex $args 0]]]) \
+ invoke
+ }
+}
+
+# ------------------------------------------------------------------
+# METHOD: buttonconfigure index ?option? ?value option value ...?
+#
+# Configure a push button given by index. This method allows
+# configuration of pushbuttons from the Buttonbox level. The options
+# may have any of the values accepted by the add method.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Buttonbox::buttonconfigure {index args} {
+ set tag [lindex $_buttonList [index $index]]
+
+ set retstr [uplevel $itk_component($tag) configure $args]
+
+ _setBoxSize
+
+ return $retstr
+}
+
+# ------------------------------------------------------------------
+# METHOD: buttonccget index option
+#
+# Return value of option for push button given by index. Option may
+# have any of the values accepted by the add method.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Buttonbox::buttoncget {index option} {
+ set tag [lindex $_buttonList [index $index]]
+
+ set retstr [uplevel $itk_component($tag) cget [list $option]]
+
+ return $retstr
+}
+
+# -----------------------------------------------------------------
+# PRIVATE METHOD: _getMaxWidth
+#
+# Returns the required width of the largest button.
+# -----------------------------------------------------------------
+itcl::body iwidgets::Buttonbox::_getMaxWidth {} {
+ set max 0
+
+ foreach tag $_displayList {
+ set w [winfo reqwidth $itk_component($tag)]
+
+ if {$w > $max} {
+ set max $w
+ }
+ }
+
+ return $max
+}
+
+# -----------------------------------------------------------------
+# PRIVATE METHOD: _getMaxHeight
+#
+# Returns the required height of the largest button.
+# -----------------------------------------------------------------
+itcl::body iwidgets::Buttonbox::_getMaxHeight {} {
+ set max 0
+
+ foreach tag $_displayList {
+ set h [winfo reqheight $itk_component($tag)]
+
+ if {$h > $max} {
+ set max $h
+ }
+ }
+
+ return $max
+}
+
+# ------------------------------------------------------------------
+# METHOD: _setBoxSize ?when?
+#
+# Sets the proper size of the frame surrounding all the buttons.
+# If "when" is "now", the change is applied immediately. If it is
+# "later" or it is not specified, then the change is applied later,
+# when the application is idle.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Buttonbox::_setBoxSize {{when later}} {
+ if {[winfo ismapped $itk_component(hull)]} {
+ if {$when == "later"} {
+ if {$_resizeFlag == ""} {
+ set _resizeFlag [after idle [itcl::code $this _setBoxSize now]]
+ }
+ return
+ } elseif {$when != "now"} {
+ error "bad option \"$when\": should be now or later"
+ }
+
+ set _resizeFlag ""
+
+ set numBtns [llength $_displayList]
+
+ if {$itk_option(-orient) == "horizontal"} {
+ set minw [expr {$numBtns * [_getMaxWidth] \
+ + ($numBtns+1) * $itk_option(-padx)}]
+ set minh [expr {[_getMaxHeight] + 2 * $itk_option(-pady)}]
+
+ } else {
+ set minw [expr {[_getMaxWidth] + 2 * $itk_option(-padx)}]
+ set minh [expr {$numBtns * [_getMaxHeight] \
+ + ($numBtns+1) * $itk_option(-pady)}]
+ }
+
+ #
+ # Remove the configure event bindings on the hull while we adjust the
+ # width/height and re-position the buttons. Once we're through, we'll
+ # update and reinstall them. This prevents double calls to position
+ # the buttons.
+ #
+ set tags [bindtags $itk_component(hull)]
+ if {[set i [lsearch $tags bbox-config]] != -1} {
+ set tags [lreplace $tags $i $i]
+ bindtags $itk_component(hull) $tags
+ }
+
+ component hull configure -width $minw -height $minh
+
+ update idletasks
+
+ _positionButtons
+
+ bindtags $itk_component(hull) [linsert $tags 0 bbox-config]
+ }
+}
+
+# ------------------------------------------------------------------
+# METHOD: _positionButtons
+#
+# This method is responsible setting the width/height of all the
+# displayed buttons to the same value and for placing all the buttons
+# in equidistant locations.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Buttonbox::_positionButtons {} {
+ set bf $itk_component(hull)
+ set numBtns [llength $_displayList]
+
+ #
+ # First, determine the common width and height for all the
+ # displayed buttons.
+ #
+ if {$numBtns > 0} {
+ set bfWidth [winfo width $itk_component(hull)]
+ set bfHeight [winfo height $itk_component(hull)]
+
+ if {$bfWidth >= [winfo reqwidth $itk_component(hull)]} {
+ set _btnWidth [_getMaxWidth]
+
+ } else {
+ if {$itk_option(-orient) == "horizontal"} {
+ set _btnWidth [expr {$bfWidth / $numBtns}]
+ } else {
+ set _btnWidth $bfWidth
+ }
+ }
+
+ if {$bfHeight >= [winfo reqheight $itk_component(hull)]} {
+ set _btnHeight [_getMaxHeight]
+
+ } else {
+ if {$itk_option(-orient) == "vertical"} {
+ set _btnHeight [expr {$bfHeight / $numBtns}]
+ } else {
+ set _btnHeight $bfHeight
+ }
+ }
+ }
+
+ #
+ # Place the buttons at the proper locations.
+ #
+ if {$numBtns > 0} {
+ if {$itk_option(-orient) == "horizontal"} {
+ set leftover [expr {[winfo width $bf] \
+ - 2 * $itk_option(-padx) - $_btnWidth * $numBtns}]
+
+ if {$numBtns > 0} {
+ set offset [expr {$leftover / ($numBtns + 1)}]
+ } else {
+ set offset 0
+ }
+ if {$offset < 0} {set offset 0}
+
+ set xDist [expr {$itk_option(-padx) + $offset}]
+ set incrAmount [expr {$_btnWidth + $offset}]
+
+ foreach button $_displayList {
+ place $itk_component($button) -anchor w \
+ -x $xDist -rely .5 -y 0 -relx 0 \
+ -width $_btnWidth -height $_btnHeight
+
+ set xDist [expr {$xDist + $incrAmount}]
+ }
+
+ } else {
+ set leftover [expr {[winfo height $bf] \
+ - 2 * $itk_option(-pady) - $_btnHeight * $numBtns}]
+
+ if {$numBtns > 0} {
+ set offset [expr {$leftover / ($numBtns + 1)}]
+ } else {
+ set offset 0
+ }
+ if {$offset < 0} {set offset 0}
+
+ set yDist [expr {$itk_option(-pady) + $offset}]
+ set incrAmount [expr {$_btnHeight + $offset}]
+
+ foreach button $_displayList {
+ place $itk_component($button) -anchor n \
+ -y $yDist -relx .5 -x 0 -rely 0 \
+ -width $_btnWidth -height $_btnHeight
+
+ set yDist [expr {$yDist + $incrAmount}]
+ }
+ }
+ }
+}
+
+
diff --git a/iwidgets/generic/calendar.itk b/iwidgets/generic/calendar.itk
new file mode 100644
index 00000000000..d263f54acf9
--- /dev/null
+++ b/iwidgets/generic/calendar.itk
@@ -0,0 +1,983 @@
+#
+# Calendar
+# ----------------------------------------------------------------------
+# Implements a calendar widget for the selection of a date. It displays
+# a single month at a time. Buttons exist on the top to change the
+# month in effect turning th pages of a calendar. As a page is turned,
+# the dates for the month are modified. Selection of a date visually
+# marks that date. The selected value can be monitored via the
+# -command option or just retrieved using the get method. Methods also
+# exist to select a date and show a particular month. The option set
+# allows the calendars appearance to take on many forms.
+# ----------------------------------------------------------------------
+# AUTHOR: Mark L. Ulferts E-mail: mulferts@austin.dsccc.com
+#
+# ACKNOWLEDGEMENTS: Michael McLennan E-mail: mmclennan@lucent.com
+#
+# This code is an [incr Tk] port of the calendar code shown in Michael
+# J. McLennan's book "Effective Tcl" from Addison Wesley. Small
+# modificiations were made to the logic here and there to make it a
+# mega-widget and the command and option interface was expanded to make
+# it even more configurable, but the underlying logic is the same.
+#
+# @(#) $Id$
+# ----------------------------------------------------------------------
+# Copyright (c) 1997 DSC Technologies Corporation
+# ======================================================================
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+
+#
+# Usual options.
+#
+itk::usual Calendar {
+ keep -background -cursor
+}
+
+# ------------------------------------------------------------------
+# CALENDAR
+# ------------------------------------------------------------------
+itcl::class iwidgets::Calendar {
+ inherit itk::Widget
+
+ constructor {args} {}
+
+ itk_option define -days days Days {Su Mo Tu We Th Fr Sa}
+ itk_option define -command command Command {}
+ itk_option define -forwardimage forwardImage Image {}
+ itk_option define -backwardimage backwardImage Image {}
+ itk_option define -weekdaybackground weekdayBackground Background \#d9d9d9
+ itk_option define -weekendbackground weekendBackground Background \#d9d9d9
+ itk_option define -outline outline Outline \#d9d9d9
+ itk_option define -buttonforeground buttonForeground Foreground blue
+ itk_option define -foreground foreground Foreground black
+ itk_option define -selectcolor selectColor Foreground red
+ itk_option define -selectthickness selectThickness SelectThickness 3
+ itk_option define -titlefont titleFont Font \
+ -*-helvetica-bold-r-normal--*-140-*
+ itk_option define -dayfont dayFont Font \
+ -*-helvetica-medium-r-normal--*-120-*
+ itk_option define -datefont dateFont Font \
+ -*-helvetica-medium-r-normal--*-120-*
+ itk_option define -currentdatefont currentDateFont Font \
+ -*-helvetica-bold-r-normal--*-120-*
+ itk_option define -startday startDay Day sunday
+ itk_option define -int int DateFormat no
+
+ public method get {{format "-string"}} ;# Returns the selected date
+ public method select {{date_ "now"}} ;# Selects date, moving select ring
+ public method show {{date_ "now"}} ;# Displays a specific date
+
+ protected method _drawtext {canvas_ day_ date_ now_ x0_ y0_ x1_ y1_}
+
+ private method _change {delta_}
+ private method _configureHandler {}
+ private method _redraw {}
+ private method _days {{wmax {}}}
+ private method _layout {time_}
+ private method _select {date_}
+ private method _selectEvent {date_}
+ private method _adjustday {day_}
+ private method _percentSubst {pattern_ string_ subst_}
+
+ private variable _time {}
+ private variable _selected {}
+ private variable _initialized 0
+ private variable _offset 0
+ private variable _format {}
+}
+
+#
+# Provide a lowercased access method for the Calendar class.
+#
+proc ::iwidgets::calendar {pathName args} {
+ uplevel ::iwidgets::Calendar $pathName $args
+}
+
+#
+# Use option database to override default resources of base classes.
+#
+option add *Calendar.width 200 widgetDefault
+option add *Calendar.height 165 widgetDefault
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Calendar::constructor {args} {
+ #
+ # Create the canvas which displays each page of the calendar.
+ #
+ itk_component add page {
+ canvas $itk_interior.page
+ } {
+ keep -background -cursor -width -height
+ }
+ pack $itk_component(page) -expand yes -fill both
+
+ #
+ # Create the forward and backward buttons. Rather than pack
+ # them directly in the hull, we'll waittill later and make
+ # them canvas window items.
+ #
+ itk_component add backward {
+ button $itk_component(page).backward \
+ -command [itcl::code $this _change -1]
+ } {
+ keep -background -cursor
+ }
+
+ itk_component add forward {
+ button $itk_component(page).forward \
+ -command [itcl::code $this _change +1]
+ } {
+ keep -background -cursor
+ }
+
+ #
+ # Set the initial time to now.
+ #
+ set _time [clock seconds]
+
+ #
+ # Bind to the configure event which will be used to redraw
+ # the calendar and display the month.
+ #
+ bind $itk_component(page) <Configure> [itcl::code $this _configureHandler]
+
+ #
+ # Evaluate the option arguments.
+ #
+ eval itk_initialize $args
+}
+
+# ------------------------------------------------------------------
+# OPTIONS
+# ------------------------------------------------------------------
+# ------------------------------------------------------------------
+# OPTION: -int
+#
+# Added by Mark Alston 2001/10/21
+#
+# Allows for the use of dates in "international" format: YYYY-MM-DD.
+# It must be a boolean value.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Calendar::int {
+ switch $itk_option(-int) {
+ 1 - yes - true - on {
+ set itk_option(-int) yes
+ }
+ 0 - no - false - off {
+ set itk_option(-int) no
+ }
+ default {
+ error "bad int option \"$itk_option(-int)\": should be boolean"
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -command
+#
+# Sets the selection command for the calendar. When the user
+# selects a date on the calendar, the date is substituted in
+# place of "%d" in this command, and the command is executed.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Calendar::command {}
+
+# ------------------------------------------------------------------
+# OPTION: -days
+#
+# The days option takes a list of values to set the text used to display the
+# days of the week header above the dates. The default value is
+# {Su Mo Tu We Th Fr Sa}.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Calendar::days {
+ if {$_initialized} {
+ if {[$itk_component(page) find withtag days] != {}} {
+ $itk_component(page) delete days
+ _days
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -backwardimage
+#
+# Specifies a image to be displayed on the backwards calendar
+# button. If none is specified, a default is provided.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Calendar::backwardimage {
+
+ #
+ # If no image is given, then we'll use the default image.
+ #
+ if {$itk_option(-backwardimage) == {}} {
+
+ #
+ # If the default image hasn't yet been created, then we
+ # need to create it.
+ #
+ if {[lsearch [image names] $this-backward] == -1} {
+ image create bitmap $this-backward \
+ -foreground $itk_option(-buttonforeground) -data {
+ #define back_width 16
+ #define back_height 16
+ static unsigned char back_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x30,
+ 0xe0, 0x38, 0xf0, 0x3c, 0xf8, 0x3e, 0xfc, 0x3f,
+ 0xfc, 0x3f, 0xf8, 0x3e, 0xf0, 0x3c, 0xe0, 0x38,
+ 0xc0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+ }
+ }
+
+ #
+ # Configure the button to use the default image.
+ #
+ $itk_component(backward) configure -image $this-backward
+
+ #
+ # Else, an image has been specified. First, we'll need to make sure
+ # the image really exists before configuring the button to use it.
+ # If it doesn't generate an error.
+ #
+ } else {
+ if {[lsearch [image names] $itk_option(-backwardimage)] != -1} {
+ $itk_component(backward) configure \
+ -image $itk_option(-backwardimage)
+ } else {
+ error "bad image name \"$itk_option(-backwardimage)\":\
+ image does not exist"
+ }
+
+ #
+ # If we previously created a default image, we'll just remove it.
+ #
+ if {[lsearch [image names] $this-backward] != -1} {
+ image delete $this-backward
+ }
+ }
+}
+
+
+# ------------------------------------------------------------------
+# OPTION: -forwardimage
+#
+# Specifies a image to be displayed on the forwards calendar
+# button. If none is specified, a default is provided.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Calendar::forwardimage {
+
+ #
+ # If no image is given, then we'll use the default image.
+ #
+ if {$itk_option(-forwardimage) == {}} {
+
+ #
+ # If the default image hasn't yet been created, then we
+ # need to create it.
+ #
+ if {[lsearch [image names] $this-forward] == -1} {
+ image create bitmap $this-forward \
+ -foreground $itk_option(-buttonforeground) -data {
+ #define fwd_width 16
+ #define fwd_height 16
+ static unsigned char fwd_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x03,
+ 0x1c, 0x07, 0x3c, 0x0f, 0x7c, 0x1f, 0xfc, 0x3f,
+ 0xfc, 0x3f, 0x7c, 0x1f, 0x3c, 0x0f, 0x1c, 0x07,
+ 0x0c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+ }
+ }
+
+ #
+ # Configure the button to use the default image.
+ #
+ $itk_component(forward) configure -image $this-forward
+
+ #
+ # Else, an image has been specified. First, we'll need to make sure
+ # the image really exists before configuring the button to use it.
+ # If it doesn't generate an error.
+ #
+ } else {
+ if {[lsearch [image names] $itk_option(-forwardimage)] != -1} {
+ $itk_component(forward) configure \
+ -image $itk_option(-forwardimage)
+ } else {
+ error "bad image name \"$itk_option(-forwardimage)\":\
+ image does not exist"
+ }
+
+ #
+ # If we previously created a default image, we'll just remove it.
+ #
+ if {[lsearch [image names] $this-forward] != -1} {
+ image delete $this-forward
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -weekdaybackground
+#
+# Specifies the background for the weekdays which allows it to
+# be visually distinguished from the weekend.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Calendar::weekdaybackground {
+ if {$_initialized} {
+ $itk_component(page) itemconfigure weekday \
+ -fill $itk_option(-weekdaybackground)
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -weekendbackground
+#
+# Specifies the background for the weekdays which allows it to
+# be visually distinguished from the weekdays.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Calendar::weekendbackground {
+ if {$_initialized} {
+ $itk_component(page) itemconfigure weekend \
+ -fill $itk_option(-weekendbackground)
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -foreground
+#
+# Specifies the foreground color for the textual items, buttons,
+# and divider on the calendar.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Calendar::foreground {
+ if {$_initialized} {
+ $itk_component(page) itemconfigure text \
+ -fill $itk_option(-foreground)
+ $itk_component(page) itemconfigure line \
+ -fill $itk_option(-foreground)
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -outline
+#
+# Specifies the outline color used to surround the date text.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Calendar::outline {
+ if {$_initialized} {
+ $itk_component(page) itemconfigure square \
+ -outline $itk_option(-outline)
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -buttonforeground
+#
+# Specifies the foreground color of the forward and backward buttons.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Calendar::buttonforeground {
+ if {$_initialized} {
+ if {$itk_option(-forwardimage) == {}} {
+ if {[lsearch [image names] $this-forward] != -1} {
+ $this-forward configure \
+ -foreground $itk_option(-buttonforeground)
+ }
+ } else {
+ $itk_component(forward) configure \
+ -foreground $itk_option(-buttonforeground)
+ }
+
+ if {$itk_option(-backwardimage) == {}} {
+ if {[lsearch [image names] $this-backward] != -1} {
+ $this-backward configure \
+ -foreground $itk_option(-buttonforeground)
+ }
+ } else {
+ $itk_component(-backward) configure \
+ -foreground $itk_option(-buttonforeground)
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -selectcolor
+#
+# Specifies the color of the ring displayed that distinguishes the
+# currently selected date.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Calendar::selectcolor {
+ if {$_initialized} {
+ $itk_component(page) itemconfigure $_selected-sensor \
+ -outline $itk_option(-selectcolor)
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -selectthickness
+#
+# Specifies the thickness of the ring displayed that distinguishes
+# the currently selected date.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Calendar::selectthickness {
+ if {$_initialized} {
+ $itk_component(page) itemconfigure $_selected-sensor \
+ -width $itk_option(-selectthickness)
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -titlefont
+#
+# Specifies the font used for the title text that consists of the
+# month and year.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Calendar::titlefont {
+ if {$_initialized} {
+ $itk_component(page) itemconfigure title \
+ -font $itk_option(-titlefont)
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -datefont
+#
+# Specifies the font used for the date text that consists of the
+# day of the month.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Calendar::datefont {
+ if {$_initialized} {
+ $itk_component(page) itemconfigure date \
+ -font $itk_option(-datefont)
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -currentdatefont
+#
+# Specifies the font used for the current date text.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Calendar::currentdatefont {
+ if {$_initialized} {
+ $itk_component(page) itemconfigure now \
+ -font $itk_option(-currentdatefont)
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -dayfont
+#
+# Specifies the font used for the day of the week text.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Calendar::dayfont {
+ if {$_initialized} {
+ $itk_component(page) itemconfigure days \
+ -font $itk_option(-dayfont)
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -startday
+#
+# Specifies the starting day for the week. The value must be a day of the
+# week: sunday, monday, tuesday, wednesday, thursday, friday, or
+# saturday. The default is sunday.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Calendar::startday {
+ set day [string tolower $itk_option(-startday)]
+
+ switch $day {
+ sunday {set _offset 0}
+ monday {set _offset 1}
+ tuesday {set _offset 2}
+ wednesday {set _offset 3}
+ thursday {set _offset 4}
+ friday {set _offset 5}
+ saturday {set _offset 6}
+ default {
+ error "bad startday option \"$itk_option(-startday)\":\
+ should be sunday, monday, tuesday, wednesday,\
+ thursday, friday, or saturday"
+ }
+ }
+
+ if {$_initialized} {
+ $itk_component(page) delete all-page
+ _redraw
+ }
+}
+
+# ------------------------------------------------------------------
+# METHODS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# PUBLIC METHOD: get ?format?
+#
+# Returns the currently selected date in one of two formats, string
+# or as an integer clock value using the -string and -clicks
+# options respectively. The default is by string. Reference the
+# clock command for more information on obtaining dates and their
+# formats.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Calendar::get {{format "-string"}} {
+ switch -- $format {
+ "-string" {
+ return $_selected
+ }
+ "-clicks" {
+ return [clock scan $_selected]
+ }
+ default {
+ error "bad format option \"$format\":\
+ should be -string or -clicks"
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# PUBLIC METHOD: select date_
+#
+# Changes the currently selected date to the value specified.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Calendar::select {{date_ "now"}} {
+ if {$date_ == "now"} {
+ set time [clock seconds]
+ } else {
+ if {[catch {clock format $date_}] == 0} {
+ set time $date_
+ } elseif {[catch {set time [clock scan $date_]}] != 0} {
+ error "bad date: \"$date_\", must be a valid date string, clock clicks value or the keyword now"
+ }
+ }
+ switch $itk_option(-int) {
+ yes { set _format "%Y-%m-%d" }
+ no { set _format "%m/%d/%Y" }
+ }
+ _select [clock format $time -format "$_format"]
+}
+
+# ------------------------------------------------------------------
+# PUBLIC METHOD: show date_
+#
+# Changes the currently display month to be that of the specified
+# date.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Calendar::show {{date_ "now"}} {
+ if {$date_ == "now"} {
+ set _time [clock seconds]
+ } else {
+ if {[catch {clock format $date_}] == 0} {
+ set _time $date_
+ } elseif {[catch {set _time [clock scan $date_]}] != 0} {
+ error "bad date: \"$date_\", must be a valid date string, clock clicks value or the keyword now"
+ }
+ }
+
+ $itk_component(page) delete all-page
+ _redraw
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _drawtext canvas_ day_ date_ now_
+# x0_ y0_ x1_ y1_
+#
+# Draws the text in the date square. The method is protected such that
+# it can be overridden in derived classes that may wish to add their
+# own unique text. The method receives the day to draw along with
+# the coordinates of the square.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Calendar::_drawtext {canvas_ day_ date_ now_ x0_ y0_ x1_ y1_} {
+ set item [$canvas_ create text \
+ [expr {(($x1_ - $x0_) / 2) + $x0_}] \
+ [expr {(($y1_ -$y0_) / 2) + $y0_ + 1}] \
+ -anchor center -text "$day_" \
+ -fill $itk_option(-foreground)]
+
+ if {$date_ == $now_} {
+ $canvas_ itemconfigure $item \
+ -font $itk_option(-currentdatefont) \
+ -tags [list all-page date text now]
+ } else {
+ $canvas_ itemconfigure $item \
+ -font $itk_option(-datefont) \
+ -tags [list all-page date text]
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _configureHandler
+#
+# Processes a configure event received on the canvas. The method
+# deletes all the current canvas items and forces a redraw.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Calendar::_configureHandler {} {
+ set _initialized 1
+
+ $itk_component(page) delete all
+ _redraw
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _change delta_
+#
+# Changes the current month displayed in the calendar, moving
+# forward or backward by <delta_> months where <delta_> is +/-
+# some number.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Calendar::_change {delta_} {
+ set dir [expr {($delta_ > 0) ? 1 : -1}]
+ set month [clock format $_time -format "%m"]
+ set month [string trimleft $month 0]
+ set year [clock format $_time -format "%Y"]
+
+ for {set i 0} {$i < abs($delta_)} {incr i} {
+ incr month $dir
+ if {$month < 1} {
+ set month 12
+ incr year -1
+ } elseif {$month > 12} {
+ set month 1
+ incr year 1
+ }
+ }
+ if {[catch {set _time [clock scan "$month/1/$year"]}]} {
+ bell
+ } else {
+ _redraw
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _redraw
+#
+# Redraws the calendar. This method is invoked whenever the
+# calendar changes size or we need to effect a change such as draw
+# it with a new month.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Calendar::_redraw {} {
+ #
+ # Set the format based on the option -int
+ #
+ switch $itk_option(-int) {
+ yes { set _format "%Y-%m-%d" }
+ no { set _format "%m/%d/%Y" }
+ }
+ #
+ # Remove all the items that typically change per redraw request
+ # such as the title and dates. Also, get the maximum width and
+ # height of the page.
+ #
+ $itk_component(page) delete all-page
+
+ set wmax [winfo width $itk_component(page)]
+ set hmax [winfo height $itk_component(page)]
+
+ #
+ # If we haven't yet created the forward and backwards buttons,
+ # then dot it; otherwise, skip it.
+ #
+ if {[$itk_component(page) find withtag button] == {}} {
+ $itk_component(page) create window 3 3 -anchor nw \
+ -window $itk_component(backward) -tags button
+ $itk_component(page) create window [expr {$wmax-3}] 3 -anchor ne \
+ -window $itk_component(forward) -tags button
+ }
+
+ #
+ # Create the title centered between the buttons.
+ #
+ foreach {x0 y0 x1 y1} [$itk_component(page) bbox button] {
+ set x [expr {(($x1-$x0)/2)+$x0}]
+ set y [expr {(($y1-$y0)/2)+$y0}]
+ }
+
+ set title [clock format $_time -format "%B %Y"]
+ $itk_component(page) create text $x $y -anchor center \
+ -text $title -font $itk_option(-titlefont) \
+ -fill $itk_option(-foreground) \
+ -tags [list title text all-page]
+
+ #
+ # Add the days of the week labels if they haven't yet been created.
+ #
+ if {[$itk_component(page) find withtag days] == {}} {
+ _days $wmax
+ }
+
+ #
+ # Add a line between the calendar header and the dates if needed.
+ #
+ set bottom [expr {[lindex [$itk_component(page) bbox all] 3] + 3}]
+
+ if {[$itk_component(page) find withtag line] == {}} {
+ $itk_component(page) create line 0 $bottom $wmax $bottom \
+ -width 2 -tags line
+ }
+
+ incr bottom 3
+
+ #
+ # Get the layout for the time value and create the date squares.
+ # This includes the surrounding date rectangle, the date text,
+ # and the sensor. Bind selection to the sensor.
+ #
+ set current ""
+ set now [clock format [clock seconds] -format "$_format"]
+
+ set layout [_layout $_time]
+ set weeks [expr {[lindex $layout end] + 1}]
+
+ foreach {day date kind dcol wrow} $layout {
+ set x0 [expr {$dcol*($wmax-7)/7+3}]
+ set y0 [expr {$wrow*($hmax-$bottom-4)/$weeks+$bottom}]
+ set x1 [expr {($dcol+1)*($wmax-7)/7+3}]
+ set y1 [expr {($wrow+1)*($hmax-$bottom-4)/$weeks+$bottom}]
+
+ if {$date == $_selected} {
+ set current $date
+ }
+
+ #
+ # Create the rectangle that surrounds the date and configure
+ # its background based on the wheather it is a weekday or
+ # a weekend.
+ #
+ set item [$itk_component(page) create rectangle $x0 $y0 $x1 $y1 \
+ -outline $itk_option(-outline)]
+
+ if {$kind == "weekend"} {
+ $itk_component(page) itemconfigure $item \
+ -fill $itk_option(-weekendbackground) \
+ -tags [list all-page square weekend]
+ } else {
+ $itk_component(page) itemconfigure $item \
+ -fill $itk_option(-weekdaybackground) \
+ -tags [list all-page square weekday]
+ }
+
+ #
+ # Create the date text and configure its font based on the
+ # wheather or not it is the current date.
+ #
+ _drawtext $itk_component(page) $day $date $now $x0 $y0 $x1 $y1
+
+ #
+ # Create a sensor area to detect selections. Bind the
+ # sensor and pass the date to the bind script.
+ #
+ $itk_component(page) create rectangle $x0 $y0 $x1 $y1 \
+ -outline "" -fill "" \
+ -tags [list $date-sensor all-sensor all-page]
+
+ $itk_component(page) bind $date-sensor <ButtonPress-1> \
+ [itcl::code $this _selectEvent $date]
+ }
+
+ #
+ # Highlight the selected date if it is on this page.
+ #
+ if {$current != ""} {
+ $itk_component(page) itemconfigure $current-sensor \
+ -outline $itk_option(-selectcolor) \
+ -width $itk_option(-selectthickness)
+
+ $itk_component(page) raise $current-sensor
+
+ } elseif {$_selected == ""} {
+ set date [clock format $_time -format "$_format"]
+ _select $date
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _days
+#
+# Used to rewite the days of the week label just below the month
+# title string. The days are given in the -days option.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Calendar::_days {{wmax {}}} {
+ if {$wmax == {}} {
+ set wmax [winfo width $itk_component(page)]
+ }
+
+ set col 0
+ set bottom [expr {[lindex [$itk_component(page) bbox title buttons] 3] + 7}]
+
+ foreach dayoweek $itk_option(-days) {
+ set x0 [expr {$col*($wmax/7)}]
+ set x1 [expr {($col+1)*($wmax/7)}]
+
+ $itk_component(page) create text \
+ [expr {(($x1 - $x0) / 2) + $x0}] $bottom \
+ -anchor n -text "$dayoweek" \
+ -fill $itk_option(-foreground) \
+ -font $itk_option(-dayfont) \
+ -tags [list days text]
+
+ incr col
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _layout time_
+#
+# Used whenever the calendar is redrawn. Finds the month containing
+# a <time_> in seconds, and returns a list for all of the days in
+# that month. The list looks like this:
+#
+# {day1 date1 kind1 c1 r1 day2 date2 kind2 c2 r2 ...}
+#
+# where dayN is a day number like 1,2,3,..., dateN is the date for
+# dayN, kindN is the day type of weekday or weekend, and cN,rN
+# are the column/row indices for the square containing that date.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Calendar::_layout {time_} {
+
+ switch $itk_option(-int) {
+ yes { set _format "%Y-%m-%d" }
+ no { set _format "%m/%d/%Y" }
+ }
+
+ set month [clock format $time_ -format "%m"]
+ set year [clock format $time_ -format "%Y"]
+
+ foreach lastday {31 30 29 28} {
+ if {[catch {clock scan "$month/$lastday/$year"}] == 0} {
+ break
+ }
+ }
+ set seconds [clock scan "$month/1/$year"]
+ set firstday [_adjustday [clock format $seconds -format %w]]
+
+ set weeks [expr {ceil(double($lastday+$firstday)/7)}]
+
+ set rlist ""
+ for {set day 1} {$day <= $lastday} {incr day} {
+ set seconds [clock scan "$month/$day/$year"]
+ set date [clock format $seconds -format "$_format"]
+ set dayoweek [clock format $seconds -format %w]
+
+ if {$dayoweek == 0 || $dayoweek == 6} {
+ set kind "weekend"
+ } else {
+ set kind "weekday"
+ }
+
+ set daycol [_adjustday $dayoweek]
+
+ set weekrow [expr {($firstday+$day-1)/7}]
+ lappend rlist $day $date $kind $daycol $weekrow
+ }
+ return $rlist
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _adjustday day_
+#
+# Modifies the day to be in accordance with the startday option.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Calendar::_adjustday {day_} {
+ set retday [expr {$day_ - $_offset}]
+
+ if {$retday < 0} {
+ set retday [expr {$retday + 7}]
+ }
+
+ return $retday
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _select date_
+#
+# Selects the current <date_> on the calendar. Highlights the date
+# on the calendar, and executes the command associated with the
+# calendar, with the selected date substituted in place of "%d".
+# ------------------------------------------------------------------
+itcl::body iwidgets::Calendar::_select {date_} {
+
+ switch $itk_option(-int) {
+ yes { set _format "%Y-%m-%d" }
+ no { set _format "%m/%d/%Y" }
+ }
+
+
+ set time [clock scan $date_]
+ set date [clock format $time -format "$_format"]
+
+ set _selected $date
+ set current [clock format $_time -format "%m %Y"]
+ set selected [clock format $time -format "%m %Y"]
+
+ if {$current == $selected} {
+ $itk_component(page) itemconfigure all-sensor \
+ -outline "" -width 1
+
+ $itk_component(page) itemconfigure $date-sensor \
+ -outline $itk_option(-selectcolor) \
+ -width $itk_option(-selectthickness)
+ $itk_component(page) raise $date-sensor
+ } else {
+ set _time $time
+ _redraw
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _selectEvent date_
+#
+# Selects the current <date_> on the calendar. Highlights the date
+# on the calendar, and executes the command associated with the
+# calendar, with the selected date substituted in place of "%d".
+# ------------------------------------------------------------------
+itcl::body iwidgets::Calendar::_selectEvent {date_} {
+ _select $date_
+
+ if {[string trim $itk_option(-command)] != ""} {
+ set cmd $itk_option(-command)
+ set cmd [_percentSubst %d $cmd [get]]
+ uplevel #0 $cmd
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _percentSubst pattern_ string_ subst_
+#
+# This command is a "safe" version of regsub, for substituting
+# each occurance of <%pattern_> in <string_> with <subst_>. The
+# usual Tcl "regsub" command does the same thing, but also
+# converts characters like "&" and "\0", "\1", etc. that may
+# be present in the <subst_> string.
+#
+# Returns <string_> with <subst_> substituted in place of each
+# <%pattern_>.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Calendar::_percentSubst {pattern_ string_ subst_} {
+ if {![string match %* $pattern_]} {
+ error "bad pattern \"$pattern_\": should be %something"
+ }
+
+ set rval ""
+ while {[regexp "(.*)${pattern_}(.*)" $string_ all head tail]} {
+ set rval "$subst_$tail$rval"
+ set string_ $head
+ }
+ set rval "$string_$rval"
+}
diff --git a/iwidgets/generic/canvasprintbox.itk b/iwidgets/generic/canvasprintbox.itk
new file mode 100644
index 00000000000..9d41daae25d
--- /dev/null
+++ b/iwidgets/generic/canvasprintbox.itk
@@ -0,0 +1,1111 @@
+#
+# CanvasPrintBox v1.5
+# ----------------------------------------------------------------------
+# Implements a print box for printing the contents of a canvas widget
+# to a printer or a file. It is possible to specify page orientation, the
+# number of pages to print the image on and if the output should be
+# stretched to fit the page.
+#
+# CanvasPrintBox is a "super-widget" that can be used as an
+# element in ones own GUIs. It is used to print the contents
+# of a canvas (called the source hereafter) to a printer or a
+# file. Possible settings include: portrait and landscape orientation
+# of the output, stretching the output to fit the page while maintaining
+# a proper aspect-ratio and posterizing to enlarge the output to fit on
+# multiple pages. A stamp-sized copy of the source will be shown (called
+# the stamp hereafter) at all times to reflect the effect of changing
+# the settings will have on the output.
+#
+# ----------------------------------------------------------------------
+# AUTHOR: Tako Schotanus EMAIL: Tako.Schotanus@bouw.tno.nl
+# ----------------------------------------------------------------------
+# Copyright (c) 1995 Tako Schotanus
+# ======================================================================
+# Permission is hereby granted, without written agreement and without
+# license or royalty fees, to use, copy, modify, and distribute this
+# software and its documentation for any purpose, provided that the
+# above copyright notice and the following two paragraphs appear in
+# all copies of this software.
+#
+# IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+# DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+# ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+# IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+# DAMAGE.
+#
+# THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+# BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+# FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+# ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+# PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+# ======================================================================
+
+#
+# Default resources.
+#
+option add *Canvasprintbox.filename "canvas.ps" widgetDefault
+option add *Canvasprintbox.hPageCnt 1 widgetDefault
+option add *Canvasprintbox.orient landscape widgetDefault
+option add *Canvasprintbox.output printer widgetDefault
+option add *Canvasprintbox.pageSize A4 widgetDefault
+option add *Canvasprintbox.posterize 0 widgetDefault
+option add *Canvasprintbox.printCmd lpr widgetDefault
+option add *Canvasprintbox.printRegion "" widgetDefault
+option add *Canvasprintbox.vPageCnt 1 widgetDefault
+
+#
+# Usual options.
+#
+itk::usual Canvasprintbox {
+ keep -background -cursor -textbackground -foreground
+}
+
+#<
+#
+# CanvasPrintBox is a "super-widget" that can be used as an
+# element in ones own GUIs. It is used to print the contents
+# of a canvas (called the source hereafter) to a printer or a
+# file. Possible settings include: portrait and landscape orientation
+# of the output, stretching the output to fit the page while maintaining
+# a proper aspect-ratio and posterizing to enlarge the output to fit on
+# multiple pages. A stamp-sized copy of the source will be shown (called
+# the stamp hereafter) at all times to reflect the effect of changing
+# the settings will have on the output.
+#
+#>
+itcl::class iwidgets::Canvasprintbox {
+ inherit itk::Widget
+
+ #
+ # Holds the current state for all check- and radiobuttons.
+ #
+ itk_option define -filename filename FileName "canvas.ps"
+ itk_option define -hpagecnt hPageCnt PageCnt 1
+ itk_option define -orient orient Orient "landscape"
+ itk_option define -output output Output "printer"
+ itk_option define -pagesize pageSize PageSize "A4"
+ itk_option define -posterize posterize Posterize 0
+ itk_option define -printcmd printCmd PrintCmd ""
+ itk_option define -printregion printRegion PrintRegion ""
+ itk_option define -stretch stretch Stretch 0
+ itk_option define -vpagecnt vPageCnt PageCnt 1
+
+ constructor {args} {}
+ destructor {}
+
+ # ---------------------------------------------------------------
+ # PUBLIC
+ #----------------------------------------------------------------
+ public {
+ method getoutput {}
+ method print {}
+ method refresh {}
+ method setcanvas {canv}
+ method stop {}
+ }
+
+ # ---------------------------------------------------------------
+ # PROTECTED
+ #----------------------------------------------------------------
+ protected {
+ #
+ # Just holds the names of some widgets/objects. "win" is used to
+ # determine if the object is fully constructed and initialized.
+ #
+ variable win ""
+ variable canvw ""
+
+ #
+ # The canvas we want to print.
+ #
+ variable canvas ""
+
+ #
+ # Boolean indicating if the attribute "orient" is set
+ # to landscape or not.
+ #
+ variable rotate 1
+
+ #
+ # Holds the configure options that were used to create this object.
+ #
+ variable init_opts ""
+
+ #
+ # The following attributes hold a list of lines that are
+ # currently drawn on the "stamp" to show how the page(s) is/are
+ # oriented. The first holds the vertical dividing lines and the
+ # second the horizontal ones.
+ #
+ variable hlines ""
+ variable vlines ""
+
+ #
+ # Updating is set when the thumbnail is being drawn. Settings
+ # this to 0 while drawing is still busy will terminate the
+ # proces.
+ # Restart_update can be set to 1 when the thumbnail is being
+ # drawn to force a redraw.
+ #
+ variable _reposition ""
+ variable _update_attr_id ""
+
+ method _calc_poster_size {}
+ method _calc_print_region {}
+ method _calc_print_scale {}
+ method _mapEventHandler {}
+ method _update_attr {{when later}}
+ method _update_canvas {{when later}}
+
+ common _globVar
+
+ proc ezPaperInfo {size {attr ""} \
+ {orient "portrait"} {window ""}} {}
+ }
+}
+
+#
+# Provide a lowercased access method for the Canvasprintbox class.
+#
+proc ::iwidgets::canvasprintbox {args} {
+ uplevel ::iwidgets::Canvasprintbox $args
+}
+
+# ------------------------------------------------------------------
+# OPTIONS
+# ------------------------------------------------------------------
+
+#<
+# A list of four coordinates specifying which part of the canvas to print.
+# An empty list means that the canvas' entire scrollregion should be
+# printed. Any change to this attribute will automatically update the "stamp".
+# Defaults to an empty list.
+#>
+itcl::configbody iwidgets::Canvasprintbox::printregion {
+ if {$itk_option(-printregion) != ""
+ && [llength $itk_option(-printregion)] != 4} {
+ error {bad option "printregion": should contain 4 coordinates}
+ }
+ _update_canvas
+}
+
+#<
+# Specifies where the postscript output should go: to the printer
+# or to a file. Can take on the values "printer" or "file".
+# The corresponding entry-widget will reflect the contents of
+# either the printcmd attribute or the filename attribute.
+#>
+itcl::configbody iwidgets::Canvasprintbox::output {
+ switch $itk_option(-output) {
+ file - printer {
+ set _globVar($this,output) $itk_option(-output)
+ }
+ default {
+ error {bad output option \"$itk_option(-output)\":\
+ should be file or printer}
+ }
+ }
+ _update_attr
+}
+
+#<
+# The command to execute when printing the postscript output.
+# The command will get the postscript directed to its standard
+# input. (Only when output is set to "printer")
+#>
+itcl::configbody iwidgets::Canvasprintbox::printcmd {
+ set _globVar($this,printeref) $itk_option(-printcmd)
+ _update_attr
+}
+
+#<
+# The file to write the postscript output to (Only when output
+# is set to "file"). If posterizing is turned on and hpagecnt
+# and/or vpagecnt is more than 1, x.y is appended to the filename
+# where x is the horizontal page number and y the vertical page number.
+#>
+itcl::configbody iwidgets::Canvasprintbox::filename {
+ set _globVar($this,fileef) $itk_option(-filename)
+ _update_attr
+}
+
+#<
+# The pagesize the printer supports. Changes to this attribute
+# will be reflected immediately in the "stamp".
+#>
+itcl::configbody iwidgets::Canvasprintbox::pagesize {
+ set opt [string tolower $itk_option(-pagesize)]
+ set lst [string tolower [ezPaperInfo types]]
+ if {[lsearch $lst $opt] == -1} {
+ error "bad option \"pagesize\": should be one of: [ezPaperInfo types]"
+ }
+ $itk_component(paperom) select "*[string range $opt 1 end]"
+ _update_canvas
+}
+
+#<
+# Determines the orientation of the output to the printer (or file).
+# It can take the value "portrait" or "landscape" (default). Changes
+# to this attribute will be reflected immediately in the "stamp".
+#>
+itcl::configbody iwidgets::Canvasprintbox::orient {
+ switch $itk_option(-orient) {
+ "portrait" - "landscape" {
+ $itk_component(orientom) select $itk_option(-orient)
+ _update_canvas
+
+ }
+ default {
+ error "bad orient option \"$itk_option(-orient)\":\
+ should be portrait or landscape"
+ }
+ }
+}
+
+#<
+# Determines if the output should be stretched to fill the
+# page (as defined by the attribute pagesize) as large as
+# possible. The aspect-ratio of the output will be retained
+# and the output will never fall outside of the boundaries
+# of the page.
+#>
+itcl::configbody iwidgets::Canvasprintbox::stretch {
+ if {$itk_option(-stretch) != 0 && $itk_option(-stretch) != 1} {
+ error {bad option "stretch": should be a boolean}
+ }
+ set _globVar($this,stretchcb) $itk_option(-stretch)
+ _update_attr
+}
+
+#<
+# Indicates if posterizing is turned on or not. Posterizing
+# the output means that it is possible to distribute the
+# output over more than one page. This way it is possible to
+# print a canvas/region which is larger than the specified
+# pagesize without stretching. If used in combination with
+# stretching it can be used to "blow up" the contents of a
+# canvas to as large as size as you want (See attributes:
+# hpagecnt end vpagecnt). Any change to this attribute will
+# automatically update the "stamp".
+#>
+itcl::configbody iwidgets::Canvasprintbox::posterize {
+ if {$itk_option(-posterize) != "0" && $itk_option(-posterize) != "1"} {
+ error "expected boolean but got \"$itk_option(-posterize)\""
+ }
+ set _globVar($this,postercb) $itk_option(-posterize)
+ _update_canvas
+}
+
+#<
+# Is used in combination with "posterize" to determine over
+# how many pages the output should be distributed. This
+# attribute specifies how many pages should be used horizontaly.
+# Any change to this attribute will automatically update the "stamp".
+#>
+itcl::configbody iwidgets::Canvasprintbox::hpagecnt {
+ set _globVar($this,hpc) $itk_option(-hpagecnt)
+ _update_canvas
+}
+
+#<
+# Is used in combination with "posterize" to determine over
+# how many pages the output should be distributed. This
+# attribute specifies how many pages should be used verticaly.
+# Any change to this attribute will automatically update the "stamp".
+#>
+itcl::configbody iwidgets::Canvasprintbox::vpagecnt {
+ set _globVar($this,vpc) $itk_option(-vpagecnt)
+ _update_canvas
+}
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Canvasprintbox::constructor {args} {
+ set _globVar($this,output) printer
+ set _globVar($this,printeref) ""
+ set _globVar($this,fileef) "canvas.ps"
+ set _globVar($this,hpc) 1
+ set _globVar($this,vpc) 1
+ set _globVar($this,postercb) 0
+ set _globVar($this,stretchcb) 0
+
+ itk_component add canvasframe {
+ frame $itk_interior.f18 -bd 2
+ }
+
+ itk_component add canvas {
+ canvas $itk_component(canvasframe).c1 \
+ -bd 2 -relief sunken \
+ -scrollregion {0c 0c 10c 10c} \
+ -width 250
+ }
+ pack $itk_component(canvas) -expand 1 -fill both
+
+ itk_component add outputom {
+ iwidgets::Labeledframe $itk_interior.outputom \
+ -labelpos nw \
+ -labeltext "Output to"
+ }
+ set cs [$itk_component(outputom) childsite]
+
+ itk_component add printerrb {
+ radiobutton $cs.printerrb \
+ -text Printer \
+ -variable [itcl::scope _globVar($this,output)] \
+ -anchor w \
+ -justify left \
+ -value printer \
+ -command [itcl::code $this _update_attr]
+ } {
+ usual
+ rename -font -labelfont labelFont Font
+ }
+ itk_component add printeref {
+ iwidgets::entryfield $cs.printeref \
+ -labeltext "command:" \
+ -state normal \
+ -labelpos w \
+ -textvariable [itcl::scope _globVar($this,printeref)]
+ }
+
+ itk_component add filerb {
+ radiobutton $cs.filerb \
+ -text File \
+ -justify left \
+ -anchor w \
+ -variable [itcl::scope _globVar($this,output)] \
+ -value file \
+ -command [itcl::code $this _update_attr]
+ } {
+ usual
+ rename -font -labelfont labelFont Font
+ }
+ itk_component add fileef {
+ iwidgets::entryfield $cs.fileef \
+ -labeltext "filename:" \
+ -state disabled \
+ -labelpos w \
+ -textvariable [itcl::scope _globVar($this,fileef)]
+ }
+
+ itk_component add propsframe {
+ iwidgets::Labeledframe $itk_interior.propsframe \
+ -labelpos nw \
+ -labeltext "Properties"
+ }
+ set cs [$itk_component(propsframe) childsite]
+
+ itk_component add paperom {
+ iwidgets::optionmenu $cs.paperom \
+ -labelpos w -cyclicon 1 \
+ -labeltext "Paper size:" \
+ -command [itcl::code $this refresh]
+ } {
+ usual
+ rename -font -labelfont labelFont Font
+ }
+ eval $itk_component(paperom) insert end [ezPaperInfo types]
+ $itk_component(paperom) select A4
+
+ itk_component add orientom {
+ iwidgets::radiobox $itk_interior.orientom \
+ -labeltext "Orientation" -command [itcl::code $this refresh]
+ }
+ $itk_component(orientom) add landscape -text Landscape
+ $itk_component(orientom) add portrait -text Portrait
+ $itk_component(orientom) select 0
+
+ itk_component add stretchcb {
+ checkbutton $cs.stretchcb \
+ -relief flat \
+ -text {Stretch to fit} \
+ -justify left \
+ -anchor w \
+ -variable [itcl::scope _globVar($this,stretchcb)] \
+ -command [itcl::code $this refresh]
+ } {
+ usual
+ rename -font -labelfont labelFont Font
+ }
+
+ itk_component add postercb {
+ checkbutton $cs.postercb \
+ -relief flat \
+ -text Posterize \
+ -justify left \
+ -anchor w \
+ -variable [itcl::scope _globVar($this,postercb)] \
+ -command [itcl::code $this refresh]
+ } {
+ usual
+ rename -font -labelfont labelFont Font
+ }
+
+ itk_component add hpcnt {
+ iwidgets::entryfield $cs.hpcnt \
+ -labeltext on \
+ -textvariable [itcl::scope _globVar($this,hpc)] \
+ -validate integer -width 3 \
+ -command [itcl::code $this refresh]
+ }
+
+ itk_component add vpcnt {
+ iwidgets::entryfield $cs.vpcnt \
+ -labeltext by \
+ -textvariable [itcl::scope _globVar($this,vpc)] \
+ -validate integer -width 3 \
+ -command [itcl::code $this refresh]
+ }
+
+ itk_component add pages {
+ label $cs.pages -text pages.
+ } {
+ usual
+ rename -font -labelfont labelFont Font
+ }
+
+ set init_opts $args
+
+ grid $itk_component(canvasframe) -row 0 -column 0 -rowspan 4 -sticky nsew
+ grid $itk_component(propsframe) -row 0 -column 1 -sticky nsew
+ grid $itk_component(outputom) -row 1 -column 1 -sticky nsew
+ grid $itk_component(orientom) -row 2 -column 1 -sticky nsew
+ grid columnconfigure $itk_interior 0 -weight 1
+ grid rowconfigure $itk_interior 3 -weight 1
+
+ grid $itk_component(printerrb) -row 0 -column 0 -sticky nsw
+ grid $itk_component(printeref) -row 0 -column 1 -sticky nsw
+ grid $itk_component(filerb) -row 1 -column 0 -sticky nsw
+ grid $itk_component(fileef) -row 1 -column 1 -sticky nsw
+ iwidgets::Labeledwidget::alignlabels $itk_component(printeref) $itk_component(fileef)
+ grid columnconfigure $itk_component(outputom) 1 -weight 1
+
+ grid $itk_component(paperom) -row 0 -column 0 -columnspan 2 -sticky nsw
+ grid $itk_component(stretchcb) -row 1 -column 0 -sticky nsw
+ grid $itk_component(postercb) -row 2 -column 0 -sticky nsw
+ grid $itk_component(hpcnt) -row 2 -column 1 -sticky nsw
+ grid $itk_component(vpcnt) -row 2 -column 2 -sticky nsw
+ grid $itk_component(pages) -row 2 -column 3 -sticky nsw
+ grid columnconfigure $itk_component(propsframe) 3 -weight 1
+
+ eval itk_initialize $args
+
+ bind $itk_component(pages) <Map> +[itcl::code $this _mapEventHandler]
+ bind $itk_component(canvas) <Configure> +[itcl::code $this refresh]
+}
+
+
+# ---------------------------------------------------------------
+# PUBLIC METHODS
+#----------------------------------------------------------------
+
+#<
+# This is used to set the canvas that has to be printed.
+# A stamp-sized copy will automatically be drawn to show how the
+# output would look with the current settings.
+#
+# In: canv - The canvas to be printed
+# Out: canvas (attrib) - Holds the canvas to be printed
+#>
+itcl::body iwidgets::Canvasprintbox::setcanvas {canv} {
+ set canvas $canv
+ _update_canvas
+}
+
+#<
+# Returns the value of the -printercmd or -filename option
+# depending on the current setting of -output.
+#
+# In: itk_option (attrib)
+# Out: The value of -printercmd or -filename
+#>
+itcl::body iwidgets::Canvasprintbox::getoutput {} {
+ switch $_globVar($this,output) {
+ "file" {
+ return $_globVar($this,fileef)
+ }
+ "printer" {
+ return $_globVar($this,printeref)
+ }
+ }
+ return ""
+}
+
+#<
+# Perfrom the actual printing of the canvas using the current settings of
+# all the attributes.
+#
+# In: itk_option, rotate (attrib)
+# Out: A boolean indicating wether printing was successful
+#>
+itcl::body iwidgets::Canvasprintbox::print {} {
+
+ global env tcl_platform
+
+ stop
+
+ if {$itk_option(-output) == "file"} {
+ set nm $_globVar($this,fileef)
+ if {[string range $nm 0 1] == "~/"} {
+ set nm "$env(HOME)/[string range $nm 2 end]"
+ }
+ } else {
+ set nm "/tmp/xge[winfo id $canvas]"
+ }
+
+ set pr [_calc_print_region]
+ set x1 [lindex $pr 0]
+ set y1 [lindex $pr 1]
+ set x2 [lindex $pr 2]
+ set y2 [lindex $pr 3]
+ set cx [expr {int(($x2 + $x1) / 2)}]
+ set cy [expr {int(($y2 + $y1) / 2)}]
+ if {!$itk_option(-stretch)} {
+ set ps [_calc_poster_size]
+ set pshw [expr {int([lindex $ps 0] / 2)}]
+ set pshh [expr {int([lindex $ps 1] / 2)}]
+ set x [expr {$cx - $pshw}]
+ set y [expr {$cy - $pshh}]
+ set w [ezPaperInfo $itk_option(-pagesize) pwidth $itk_option(-orient) $win]
+ set h [ezPaperInfo $itk_option(-pagesize) pheight $itk_option(-orient) $win]
+ } else {
+ set x $x1
+ set y $y1
+ set w [expr {($x2-$x1) / $_globVar($this,hpc)}]
+ set h [expr {($y2-$y1) / $_globVar($this,vpc)}]
+ }
+
+ set i 0
+ set px $x
+ while {$i < $_globVar($this,hpc)} {
+ set j 0
+ set py $y
+ while {$j < $_globVar($this,vpc)} {
+ set nm2 [expr {$_globVar($this,hpc) > 1 || $_globVar($this,vpc) > 1 ? "$nm$i.$j" : $nm}]
+
+ if {$itk_option(-stretch)} {
+ $canvas postscript \
+ -file $nm2 \
+ -rotate $rotate \
+ -x $px -y $py \
+ -width $w \
+ -height $h \
+ -pagex [ezPaperInfo $itk_option(-pagesize) centerx] \
+ -pagey [ezPaperInfo $itk_option(-pagesize) centery] \
+ -pagewidth [ezPaperInfo $itk_option(-pagesize) pwidth $itk_option(-orient)] \
+ -pageheight [ezPaperInfo $itk_option(-pagesize) pheight $itk_option(-orient)]
+ } else {
+ $canvas postscript \
+ -file $nm2 \
+ -rotate $rotate \
+ -x $px -y $py \
+ -width $w \
+ -height $h \
+ -pagex [ezPaperInfo $itk_option(-pagesize) centerx] \
+ -pagey [ezPaperInfo $itk_option(-pagesize) centery]
+ }
+
+ if {$itk_option(-output) == "printer"} {
+ set cmd "$itk_option(-printcmd) < $nm2"
+ if {[catch {eval exec $cmd &}]} {
+ return 0
+ }
+ }
+
+ set py [expr {$py + $h}]
+ incr j
+ }
+ set px [expr {$px + $w}]
+ incr i
+ }
+
+ return 1
+}
+
+#<
+# Retrieves the current value for all edit fields and updates
+# the stamp accordingly. Is useful for Apply-buttons.
+#>
+itcl::body iwidgets::Canvasprintbox::refresh {} {
+ stop
+ _update_canvas
+ return
+}
+
+#<
+# Stops the drawing of the "stamp". I'm currently unable to detect
+# when a Canvasprintbox gets withdrawn. It's therefore advised
+# that you perform a stop before you do something like that.
+#>
+itcl::body iwidgets::Canvasprintbox::stop {} {
+
+ if {$_reposition != ""} {
+ after cancel $_reposition
+ set _reposition ""
+ }
+
+ if {$_update_attr_id != ""} {
+ after cancel $_update_attr_id
+ set _update_attr_id ""
+ }
+
+ return
+}
+
+# ---------------------------------------------------------------
+# PROTECTED METHODS
+#----------------------------------------------------------------
+
+#
+# Calculate the total size the output would be with the current
+# settings for "pagesize" and "posterize" (and "hpagecnt" and
+# "vpagecnt"). This size will be the size of the printable area,
+# some space has been substracted to take into account that a
+# page should have borders because most printers can't print on
+# the very edge of the paper.
+#
+# In: posterize, hpagecnt, vpagecnt, pagesize, orient (attrib)
+# Out: A list of two numbers indicating the width and the height
+# of the total paper area which will be used for printing
+# in pixels.
+#
+itcl::body iwidgets::Canvasprintbox::_calc_poster_size {} {
+ set tpw [expr {[ezPaperInfo $itk_option(-pagesize) \
+ pwidth $itk_option(-orient) $win]*$_globVar($this,hpc)}]
+ set tph [expr {[ezPaperInfo $itk_option(-pagesize) \
+ pheight $itk_option(-orient) $win]*$_globVar($this,vpc)}]
+
+ return "$tpw $tph"
+}
+
+#
+# Determine which area of the "source" canvas will be printed.
+# If "printregion" was set by the "user" this will be used and
+# converted to pixel-coordinates. If the user didn't set it
+# the bounding box that contains all canvas-items will be used
+# instead.
+#
+# In: printregion, canvas (attrib)
+# Out: Four floats specifying the region to be printed in
+# pixel-coordinates (topleft & bottomright).
+#
+itcl::body iwidgets::Canvasprintbox::_calc_print_region {} {
+ set printreg [expr {$itk_option(-printregion) != ""
+ ? $itk_option(-printregion) : [$canvas bbox all]}]
+
+ if {$printreg != ""} {
+ set prx1 [winfo fpixels $canvas [lindex $printreg 0]]
+ set pry1 [winfo fpixels $canvas [lindex $printreg 1]]
+ set prx2 [winfo fpixels $canvas [lindex $printreg 2]]
+ set pry2 [winfo fpixels $canvas [lindex $printreg 3]]
+
+ set res "$prx1 $pry1 $prx2 $pry2"
+ } else {
+ set res "0 0 0 0"
+ }
+
+ return $res
+}
+
+#
+# Calculate the scaling factor needed if the output was
+# to be stretched to fit exactly on the page (or pages).
+# If stretching is turned off this will always return 1.0.
+#
+# In: stretch (attrib)
+# Out: A float specifying the scaling factor.
+#
+itcl::body iwidgets::Canvasprintbox::_calc_print_scale {} {
+ if {$itk_option(-stretch)} {
+ set pr [_calc_print_region]
+ set prw [expr {[lindex $pr 2] - [lindex $pr 0]}]
+ set prh [expr {[lindex $pr 3] - [lindex $pr 1]}]
+ set ps [_calc_poster_size]
+ set psw [lindex $ps 0]
+ set psh [lindex $ps 1]
+ set sfx [expr {$psw / $prw}]
+ set sfy [expr {$psh / $prh}]
+ set sf [expr {$sfx < $sfy ? $sfx : $sfy}]
+ return $sf
+ } else {
+ return 1.0
+ }
+}
+
+#
+# Schedule the thread that makes a copy of the "source"
+# canvas to the "stamp".
+#
+# In: win, canvas (attrib)
+# Out: -
+#
+itcl::body iwidgets::Canvasprintbox::_update_canvas {{when later}} {
+ if {$win == "" || $canvas == "" || [$canvas find all] == ""} {
+ return
+ }
+ if {$when == "later"} {
+ if {$_reposition == ""} {
+ set _reposition [after idle [itcl::code $this _update_canvas now]]
+ }
+ return
+ }
+
+ _update_attr now
+
+ #
+ # Make a copy of the "source" canvas to the "stamp".
+ #
+ if {$_globVar($this,hpc) == [llength $vlines] &&
+ $_globVar($this,vpc) == [llength $hlines]} {
+ stop
+ return
+ }
+
+ $canvw delete all
+
+ set width [winfo width $canvw]
+ set height [winfo height $canvw]
+ set ps [_calc_poster_size]
+
+ #
+ # Calculate the scaling factor that would be needed to fit the
+ # whole "source" into the "stamp". This takes into account the
+ # total amount of "paper" that would be needed to print the
+ # contents of the "source".
+ #
+ set xsf [expr {$width/[lindex $ps 0]}]
+ set ysf [expr {$height/[lindex $ps 1]}]
+ set sf [expr {$xsf < $ysf ? $xsf : $ysf}]
+ set w [expr {[lindex $ps 0]*$sf}]
+ set h [expr {[lindex $ps 1]*$sf}]
+ set x1 [expr {($width-$w)/2}]
+ set y1 [expr {($height-$h)/2}]
+ set x2 [expr {$x1+$w}]
+ set y2 [expr {$y1+$h}]
+ set cx [expr {($x2+$x1)/ 2}]
+ set cy [expr {($y2+$y1)/ 2}]
+
+ set printreg [_calc_print_region]
+ set prx1 [lindex $printreg 0]
+ set pry1 [lindex $printreg 1]
+ set prx2 [lindex $printreg 2]
+ set pry2 [lindex $printreg 3]
+ set prcx [expr {($prx2+$prx1)/2}]
+ set prcy [expr {($pry2+$pry1)/2}]
+
+ set psf [_calc_print_scale]
+
+ #
+ # Copy all items from the "real" canvas to the canvas
+ # showing what we'll send to the printer. Bitmaps and
+ # texts are not copied because they can't be scaled,
+ # a rectangle will be created instead.
+ #
+ set tsf [expr {$sf * $psf}]
+ set dx [expr {$cx-($prcx*$tsf)}]
+ set dy [expr {$cy-($prcy*$tsf)}]
+ $canvw create rectangle \
+ [expr {$x1+0}] \
+ [expr {$y1+0}] \
+ [expr {$x2-0}] \
+ [expr {$y2-0}] -fill white
+ set items [eval "$canvas find overlapping $printreg"]
+
+ set itemCount [llength $items]
+ for {set cnt 0} {$cnt < $itemCount} {incr cnt} {
+ #
+ # Determine the item's type and coordinates
+ #
+ set i [lindex $items $cnt]
+ set t [$canvas type $i]
+ set crds [$canvas coords $i]
+
+ #
+ # Ask for the item's configuration settings and strip
+ # it to leave only a list of option names and values.
+ #
+ set cfg [$canvas itemconfigure $i]
+ set cfg2 ""
+ foreach c $cfg {
+ if {[llength $c] == 5} {
+ lappend cfg2 [lindex $c 0] [lindex $c 4]
+ }
+ }
+
+ #
+ # Handle texts and bitmaps differently: they will
+ # be represented as rectangles.
+ #
+ if {$t == "text" || $t == "bitmap" || $t == "window"} {
+ set t "rectangle"
+ set crds [$canvas bbox $i]
+ set cfg2 "-outline {} -fill gray"
+ }
+
+ #
+ # Remove the arrows from a line item when the scale
+ # factor drops below 1/3rd of the original size.
+ # This to prevent the arrowheads from dominating the
+ # display.
+ #
+ if {$t == "line" && $tsf < 0.33} {
+ lappend cfg2 -arrow none
+ }
+
+ #
+ # Create a copy of the item on the "printing" canvas.
+ #
+ set i2 [eval "$canvw create $t $crds $cfg2"]
+ $canvw scale $i2 0 0 $tsf $tsf
+ $canvw move $i2 $dx $dy
+
+ if {($cnt%25) == 0} {
+ update
+ }
+ if {$_reposition == ""} {
+ return
+ }
+ }
+
+ set p $x1
+ set i 1
+ set vlines {}
+ while {$i < $_globVar($this,hpc)} {
+ set p [expr {$p + ($w/$_globVar($this,hpc))}]
+ set l [$canvw create line $p $y1 $p $y2]
+ lappend vlines $l
+ incr i
+ }
+
+ set p $y1
+ set i 1
+ set vlines {}
+ while {$i < $_globVar($this,vpc)} {
+ set p [expr {$p + ($h/$_globVar($this,vpc))}]
+ set l [$canvw create line $x1 $p $x2 $p]
+ lappend vlines $l
+ incr i
+ }
+
+ set _reposition ""
+}
+
+#
+# Update the attributes to reflect changes made in the user-
+# interface.
+#
+# In: itk_option (attrib) - the attributes to update
+# itk_component (attrib) - the widgets
+# _globVar (common) - the global var holding the state
+# of all radiobuttons and checkboxes.
+# Out: -
+#
+itcl::body iwidgets::Canvasprintbox::_update_attr {{when "later"}} {
+ if {$when != "now"} {
+ if {$_update_attr_id == ""} {
+ set _update_attr_id [after idle [itcl::code $this _update_attr now]]
+ }
+ return
+ }
+
+ set itk_option(-printcmd) $_globVar($this,printeref)
+ set itk_option(-filename) $_globVar($this,fileef)
+ set itk_option(-output) $_globVar($this,output)
+ set itk_option(-pagesize) [string tolower [$itk_component(paperom) get]]
+ set itk_option(-stretch) $_globVar($this,stretchcb)
+ set itk_option(-posterize) $_globVar($this,postercb)
+ set itk_option(-vpagecnt) $_globVar($this,vpc)
+ set itk_option(-hpagecnt) $_globVar($this,hpc)
+ set itk_option(-orient) [$itk_component(orientom) get]
+ set rotate [expr {$itk_option(-orient) == "landscape"}]
+
+ if {$_globVar($this,output) == "file"} {
+ $itk_component(fileef) configure \
+ -state normal -foreground $itk_option(-foreground)
+ $itk_component(printeref) configure \
+ -state disabled -foreground $itk_option(-disabledforeground)
+ } else {
+ $itk_component(fileef) configure \
+ -state disabled -foreground $itk_option(-disabledforeground)
+ $itk_component(printeref) configure \
+ -state normal -foreground $itk_option(-foreground)
+ }
+
+ set fg [expr {$_globVar($this,postercb) \
+ ? $itk_option(-foreground) : $itk_option(-disabledforeground)}]
+
+ $itk_component(vpcnt) configure -foreground $fg
+ $itk_component(hpcnt) configure -foreground $fg
+ $itk_component(pages) configure -foreground $fg
+
+ #
+ # Update dependencies among widgets. (For example: disabling
+ # an entry-widget when its associated checkbox-button is used
+ # to turn of the option (the entry's value is not needed
+ # anymore and this should be reflected in the fact that it
+ # isn't possible to change it anymore).
+ #
+ # former method:_update_widgets/_update_UI
+ #
+ set state [expr {$itk_option(-posterize) ? "normal" : "disabled"}]
+ $itk_component(vpcnt) configure -state $state
+ $itk_component(hpcnt) configure -state $state
+ $itk_component(paperom) select "*[string range $itk_option(-pagesize) 1 end]"
+
+ set _update_attr_id ""
+}
+
+#
+# Gets called when the CanvasPrintBox-widget gets mapped.
+#
+itcl::body iwidgets::Canvasprintbox::_mapEventHandler {} {
+ set win $itk_interior
+ set canvw $itk_component(canvas)
+ if {$canvas != ""} {
+ setcanvas $canvas
+ }
+ _update_attr
+}
+
+#
+# Destroy this object and its associated widgets.
+#
+itcl::body iwidgets::Canvasprintbox::destructor {} {
+ stop
+}
+
+#
+# Hold the information about common paper sizes. A bit of a hack, but it
+# should be possible to add your own if you take a look at it.
+#
+itcl::body iwidgets::Canvasprintbox::ezPaperInfo {size {attr ""} \
+ {orient "portrait"} {window ""}} {
+
+ set size [string tolower $size]
+ set attr [string tolower $attr]
+ set orient [string tolower $orient]
+
+ case $size in {
+ types {
+ return "A5 A4 A3 A2 A1 Legal Letter"
+ }
+ a5 {
+ set paper(x1) "1.0c"
+ set paper(y1) "1.0c"
+ set paper(x2) "13.85c"
+ set paper(y2) "20.0c"
+ set paper(pheight) "19.0c"
+ set paper(pwidth) "12.85c"
+ set paper(height) "21.0c"
+ set paper(width) "14.85c"
+ set paper(centerx) "7.425c"
+ set paper(centery) "10.5c"
+ }
+ a4 {
+ set paper(x1) "1.0c"
+ set paper(y1) "1.0c"
+ set paper(x2) "20.0c"
+ set paper(y2) "28.7c"
+ set paper(pheight) "27.7c"
+ set paper(pwidth) "19.0c"
+ set paper(height) "29.7c"
+ set paper(width) "21.0c"
+ set paper(centerx) "10.5c"
+ set paper(centery) "14.85c"
+ }
+ a3 {
+ set paper(x1) "1.0c"
+ set paper(y1) "1.0c"
+ set paper(x2) "28.7c"
+ set paper(y2) "41.0c"
+ set paper(pheight) "40.0c"
+ set paper(pwidth) "27.7c"
+ set paper(height) "42.0c"
+ set paper(width) "29.7c"
+ set paper(centerx) "14.85c"
+ set paper(centery) "21.0c"
+ }
+ a2 {
+ set paper(x1) "1.0c"
+ set paper(y1) "1.0c"
+ set paper(x2) "41.0c"
+ set paper(y2) "58.4c"
+ set paper(pheight) "57.4c"
+ set paper(pwidth) "40.0c"
+ set paper(height) "59.4c"
+ set paper(width) "42.0c"
+ set paper(centerx) "21.0c"
+ set paper(centery) "29.7c"
+ }
+ a1 {
+ set paper(x1) "1.0c"
+ set paper(y1) "1.0c"
+ set paper(x2) "58.4c"
+ set paper(y2) "83.0c"
+ set paper(pheight) "82.0c"
+ set paper(pwidth) "57.4c"
+ set paper(height) "84.0c"
+ set paper(width) "59.4c"
+ set paper(centerx) "29.7c"
+ set paper(centery) "42.0c"
+ }
+ legal {
+ set paper(x1) "0.2i"
+ set paper(y1) "0.2i"
+ set paper(x2) "8.3i"
+ set paper(y2) "13.8i"
+ set paper(pheight) "13.6i"
+ set paper(pwidth) "8.1i"
+ set paper(height) "14.0i"
+ set paper(width) "8.5i"
+ set paper(centerx) "4.25i"
+ set paper(centery) "7.0i"
+ }
+ letter {
+ set paper(x1) "0.2i"
+ set paper(y1) "0.2i"
+ set paper(x2) "8.3i"
+ set paper(y2) "10.8i"
+ set paper(pheight) "10.6i"
+ set paper(pwidth) "8.1i"
+ set paper(height) "11.0i"
+ set paper(width) "8.5i"
+ set paper(centerx) "4.25i"
+ set paper(centery) "5.5i"
+ }
+ default {
+ error "ezPaperInfo: Unknown paper type ($type)"
+ }
+ }
+
+ set inv(x1) "y1"
+ set inv(x2) "y2"
+ set inv(y1) "x1"
+ set inv(y2) "x2"
+ set inv(pwidth) "pheight"
+ set inv(pheight) "pwidth"
+ set inv(width) "height"
+ set inv(height) "width"
+ set inv(centerx) "centery"
+ set inv(centery) "centerx"
+
+ case $orient in {
+ landscape {
+ set res $paper($inv($attr))
+ }
+ portrait {
+ set res $paper($attr)
+ }
+ default {
+ error "ezPaperInfo: orientation should be\
+ portrait or landscape (not $orient)"
+ }
+ }
+
+ if {$window != ""} {
+ set res [winfo fpixels $window $res]
+ }
+
+ return $res
+}
diff --git a/iwidgets/generic/canvasprintdialog.itk b/iwidgets/generic/canvasprintdialog.itk
new file mode 100644
index 00000000000..ddd14cfc1a6
--- /dev/null
+++ b/iwidgets/generic/canvasprintdialog.itk
@@ -0,0 +1,155 @@
+#
+# CanvasPrintDialog v1.5
+# ----------------------------------------------------------------------
+# Implements a print dialog for printing the contents of a canvas widget
+# to a printer or a file. It is possible to specify page orientation, the
+# number of pages to print the image on and if the output should be
+# stretched to fit the page. The CanvasPrintDialog is derived from the
+# Dialog class and is composed of a CanvasPrintBox with attributes set to
+# manipulate the dialog buttons.
+#
+# ----------------------------------------------------------------------
+# AUTHOR: Tako Schotanus EMAIL: Tako.Schotanus@bouw.tno.nl
+# ----------------------------------------------------------------------
+# Copyright (c) 1995 Tako Schotanus
+# ======================================================================
+# Permission is hereby granted, without written agreement and without
+# license or royalty fees, to use, copy, modify, and distribute this
+# software and its documentation for any purpose, provided that the
+# above copyright notice and the following two paragraphs appear in
+# all copies of this software.
+#
+# IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+# DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+# ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+# IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+# DAMAGE.
+#
+# THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+# BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+# FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+# ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+# PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+# ======================================================================
+
+#
+# Option database default resources:
+#
+option add *Canvasprintdialog.filename "canvas.ps" widgetDefault
+option add *Canvasprintdialog.hPageCnt 1 widgetDefault
+option add *Canvasprintdialog.orient landscape widgetDefault
+option add *Canvasprintdialog.output printer widgetDefault
+option add *Canvasprintdialog.pageSize A4 widgetDefault
+option add *Canvasprintdialog.posterize 0 widgetDefault
+option add *Canvasprintdialog.printCmd lpr widgetDefault
+option add *Canvasprintdialog.printRegion "" widgetDefault
+option add *Canvasprintdialog.vPageCnt 1 widgetDefault
+option add *Canvasprintdialog.title "Canvas Print Dialog" widgetDefault
+option add *Canvasprintdialog.master "." widgetDefault
+
+#
+# Usual options.
+#
+itk::usual Canvasprintdialog {
+ keep -background -cursor -foreground -modality
+}
+
+# ------------------------------------------------------------------
+# CANVASPRINTDIALOG
+# ------------------------------------------------------------------
+itcl::class iwidgets::Canvasprintdialog {
+ inherit iwidgets::Dialog
+
+ constructor {args} {}
+ destructor {}
+
+ method deactivate {args} {}
+ method getoutput {} {}
+ method setcanvas {canv} {}
+ method refresh {} {}
+ method print {} {}
+}
+
+#
+# Provide a lowercased access method for the Canvasprintdialog class.
+#
+proc ::iwidgets::canvasprintdialog {args} {
+ uplevel ::iwidgets::Canvasprintdialog $args
+}
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+#
+# Create new file selection dialog.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Canvasprintdialog::constructor {args} {
+ component hull configure -borderwidth 0
+
+ #
+ # Instantiate a file selection box widget.
+ #
+ itk_component add cpb {
+ iwidgets::Canvasprintbox $itk_interior.cpb
+ } {
+ usual
+ keep -printregion -output -printcmd -filename -pagesize \
+ -orient -stretch -posterize -hpagecnt -vpagecnt
+ }
+ pack $itk_component(cpb) -fill both -expand yes
+
+ #
+ # Hide the apply and help buttons.
+ #
+ buttonconfigure OK -text Print
+ buttonconfigure Apply -command [itcl::code $this refresh] -text Refresh
+ hide Help
+
+ eval itk_initialize $args
+}
+
+# ------------------------------------------------------------------
+# METHOD: deactivate
+#
+# Redefines method of dialog shell class. Stops the drawing of the
+# thumbnail (when busy) upon deactivation of the dialog.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Canvasprintdialog::deactivate {args} {
+ $itk_component(cpb) stop
+ return [eval Shell::deactivate $args]
+}
+
+# ------------------------------------------------------------------
+# METHOD: getoutput
+#
+# Thinwrapped method of canvas print box class.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Canvasprintdialog::getoutput {} {
+ return [$itk_component(cpb) getoutput]
+}
+
+# ------------------------------------------------------------------
+# METHOD: setcanvas
+#
+# Thinwrapped method of canvas print box class.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Canvasprintdialog::setcanvas {canv} {
+ return [$itk_component(cpb) setcanvas $canv]
+}
+
+# ------------------------------------------------------------------
+# METHOD: refresh
+#
+# Thinwrapped method of canvas print box class.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Canvasprintdialog::refresh {} {
+ return [$itk_component(cpb) refresh]
+}
+
+# ------------------------------------------------------------------
+# METHOD: print
+#
+# Thinwrapped method of canvas print box class.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Canvasprintdialog::print {} {
+ return [$itk_component(cpb) print]
+}
diff --git a/iwidgets/generic/checkbox.itk b/iwidgets/generic/checkbox.itk
new file mode 100644
index 00000000000..49e88887f76
--- /dev/null
+++ b/iwidgets/generic/checkbox.itk
@@ -0,0 +1,341 @@
+#
+# Checkbox
+# ----------------------------------------------------------------------
+# Implements a checkbuttonbox. Supports adding, inserting, deleting,
+# selecting, and deselecting of checkbuttons by tag and index.
+#
+# ----------------------------------------------------------------------
+# AUTHOR: John A. Tucker EMAIL: jatucker@spd.dsccc.com
+#
+# ----------------------------------------------------------------------
+# Copyright (c) 1997 DSC Technologies Corporation
+# ======================================================================
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+
+
+#
+# Use option database to override default resources of base classes.
+#
+option add *Checkbox.labelMargin 10 widgetDefault
+option add *Checkbox.labelFont \
+ "-Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-*" widgetDefault
+option add *Checkbox.labelPos nw widgetDefault
+option add *Checkbox.borderWidth 2 widgetDefault
+option add *Checkbox.relief groove widgetDefault
+
+#
+# Usual options.
+#
+itk::usual Checkbox {
+ keep -background -borderwidth -cursor -foreground -labelfont
+}
+
+# ------------------------------------------------------------------
+# CHECKBOX
+# ------------------------------------------------------------------
+itcl::class iwidgets::Checkbox {
+ inherit iwidgets::Labeledframe
+
+ constructor {args} {}
+
+ itk_option define -orient orient Orient vertical
+
+ public {
+ method add {tag args}
+ method insert {index tag args}
+ method delete {index}
+ method get {{index ""}}
+ method index {index}
+ method select {index}
+ method deselect {index}
+ method flash {index}
+ method toggle {index}
+ method buttonconfigure {index args}
+ }
+
+ private {
+
+ method gettag {index} ;# Get the tag of the checkbutton associated
+ ;# with a numeric index
+
+ variable _unique 0 ;# Unique id for choice creation.
+ variable _buttons {} ;# List of checkbutton tags.
+ common buttonVar ;# Array of checkbutton "-variables"
+ }
+}
+
+#
+# Provide a lowercased access method for the Checkbox class.
+#
+proc ::iwidgets::checkbox {pathName args} {
+ uplevel ::iwidgets::Checkbox $pathName $args
+}
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Checkbox::constructor {args} {
+
+ eval itk_initialize $args
+}
+
+# ------------------------------------------------------------------
+# OPTIONS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# OPTION: -orient
+#
+# Allows the user to orient the checkbuttons either horizontally
+# or vertically. Added by Chad Smith (csmith@adc.com) 3/10/00.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Checkbox::orient {
+ if {$itk_option(-orient) == "horizontal"} {
+ foreach tag $_buttons {
+ pack $itk_component($tag) -side left -anchor nw -padx 4 -expand 1
+ }
+ } elseif {$itk_option(-orient) == "vertical"} {
+ foreach tag $_buttons {
+ pack $itk_component($tag) -side top -anchor w -padx 4 -expand 0
+ }
+ } else {
+ error "Bad orientation: $itk_option(-orient). Should be\
+ \"horizontal\" or \"vertical\"."
+ }
+}
+
+
+# ------------------------------------------------------------------
+# METHODS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# METHOD: index index
+#
+# Searches the checkbutton tags in the checkbox for the one with the
+# requested tag, numerical index, or keyword "end". Returns the
+# choices's numerical index if found, otherwise error.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Checkbox::index {index} {
+ if {[llength $_buttons] > 0} {
+ if {[regexp {(^[0-9]+$)} $index]} {
+ if {$index < [llength $_buttons]} {
+ return $index
+ } else {
+ error "Checkbox index \"$index\" is out of range"
+ }
+
+ } elseif {$index == "end"} {
+ return [expr {[llength $_buttons] - 1}]
+
+ } else {
+ if {[set idx [lsearch $_buttons $index]] != -1} {
+ return $idx
+ }
+
+ error "bad Checkbox index \"$index\": must be number, end,\
+ or pattern"
+ }
+
+ } else {
+ error "Checkbox \"$itk_component(hull)\" has no checkbuttons"
+ }
+}
+
+# ------------------------------------------------------------------
+# METHOD: add tag ?option value option value ...?
+#
+# Add a new tagged checkbutton to the checkbox at the end. The method
+# takes additional options which are passed on to the checkbutton
+# constructor. These include most of the typical checkbutton
+# options. The tag is returned.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Checkbox::add {tag args} {
+ itk_component add $tag {
+ eval checkbutton $itk_component(childsite).cb[incr _unique] \
+ -variable [list [itcl::scope buttonVar($this,$tag)]] \
+ -anchor w \
+ -justify left \
+ -highlightthickness 0 \
+ $args
+ } {
+ usual
+ keep -command -disabledforeground -selectcolor -state
+ ignore -highlightthickness -highlightcolor
+ rename -font -labelfont labelFont Font
+ }
+
+ # Redraw the buttons with the proper orientation.
+ if {$itk_option(-orient) == "vertical"} {
+ pack $itk_component($tag) -side top -anchor w -padx 4 -expand 0
+ } else {
+ pack $itk_component($tag) -side left -anchor nw -expand 1
+ }
+
+ lappend _buttons $tag
+
+ return $tag
+}
+
+# ------------------------------------------------------------------
+# METHOD: insert index tag ?option value option value ...?
+#
+# Insert the tagged checkbutton in the checkbox just before the
+# one given by index. Any additional options are passed on to the
+# checkbutton constructor. These include the typical checkbutton
+# options. The tag is returned.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Checkbox::insert {index tag args} {
+ itk_component add $tag {
+ eval checkbutton $itk_component(childsite).cb[incr _unique] \
+ -variable [list [itcl::scope buttonVar($this,$tag)]] \
+ -anchor w \
+ -justify left \
+ -highlightthickness 0 \
+ $args
+ } {
+ usual
+ ignore -highlightthickness -highlightcolor
+ rename -font -labelfont labelFont Font
+ }
+
+ set index [index $index]
+ set before [lindex $_buttons $index]
+ set _buttons [linsert $_buttons $index $tag]
+
+ pack $itk_component($tag) -anchor w -padx 4 -before $itk_component($before)
+
+ return $tag
+}
+
+# ------------------------------------------------------------------
+# METHOD: delete index
+#
+# Delete the specified checkbutton.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Checkbox::delete {index} {
+
+ set tag [gettag $index]
+ set index [index $index]
+ destroy $itk_component($tag)
+ set _buttons [lreplace $_buttons $index $index]
+
+ if { [info exists buttonVar($this,$tag)] == 1 } {
+ unset buttonVar($this,$tag)
+ }
+}
+
+# ------------------------------------------------------------------
+# METHOD: select index
+#
+# Select the specified checkbutton.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Checkbox::select {index} {
+ set tag [gettag $index]
+ #-----------------------------------------------------------
+ # BUG FIX: csmith (Chad Smith: csmith@adc.com), 3/30/99
+ #-----------------------------------------------------------
+ # This method should only invoke the checkbutton if it's not
+ # already selected. Check its associated variable, and if
+ # it's set, then just ignore and return.
+ #-----------------------------------------------------------
+ if {[set [itcl::scope buttonVar($this,$tag)]] ==
+ [[component $tag] cget -onvalue]} {
+ return
+ }
+ $itk_component($tag) invoke
+}
+
+# ------------------------------------------------------------------
+# METHOD: toggle index
+#
+# Toggle a specified checkbutton between selected and unselected
+# ------------------------------------------------------------------
+itcl::body iwidgets::Checkbox::toggle {index} {
+ set tag [gettag $index]
+ $itk_component($tag) toggle
+}
+
+# ------------------------------------------------------------------
+# METHOD: get
+#
+# Return the value of the checkbutton with the given index, or a
+# list of all checkbutton values in increasing order by index.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Checkbox::get {{index ""}} {
+ set result {}
+
+ if {$index == ""} {
+ foreach tag $_buttons {
+ if {$buttonVar($this,$tag)} {
+ lappend result $tag
+ }
+ }
+ } else {
+ set tag [gettag $index]
+ set result $buttonVar($this,$tag)
+ }
+
+ return $result
+}
+
+# ------------------------------------------------------------------
+# METHOD: deselect index
+#
+# Deselect the specified checkbutton.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Checkbox::deselect {index} {
+ set tag [gettag $index]
+ $itk_component($tag) deselect
+}
+
+# ------------------------------------------------------------------
+# METHOD: flash index
+#
+# Flash the specified checkbutton.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Checkbox::flash {index} {
+ set tag [gettag $index]
+ $itk_component($tag) flash
+}
+
+# ------------------------------------------------------------------
+# METHOD: buttonconfigure index ?option? ?value option value ...?
+#
+# Configure a specified checkbutton. This method allows configuration
+# of checkbuttons from the Checkbox level. The options may have any
+# of the values accepted by the add method.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Checkbox::buttonconfigure {index args} {
+ set tag [gettag $index]
+ eval $itk_component($tag) configure $args
+}
+
+# ------------------------------------------------------------------
+# METHOD: gettag index
+#
+# Return the tag of the checkbutton associated with a specified
+# numeric index
+# ------------------------------------------------------------------
+itcl::body iwidgets::Checkbox::gettag {index} {
+ return [lindex $_buttons [index $index]]
+}
diff --git a/iwidgets/generic/colors.itcl b/iwidgets/generic/colors.itcl
new file mode 100644
index 00000000000..948819d7a81
--- /dev/null
+++ b/iwidgets/generic/colors.itcl
@@ -0,0 +1,209 @@
+#
+# colors
+# ----------------------------------------------------------------------
+# The colors class encapsulates several color related utility functions.
+# Class level scope resolution must be used inorder to access the static
+# member functions.
+#
+# USAGE:
+# set hsb [colors::rgbToHsb [winfo rgb . bisque]]
+#
+# ----------------------------------------------------------------------
+# AUTHOR: Mark L. Ulferts EMAIL: mulferts@spd.dsccc.com
+#
+# @(#) $Id$
+# ----------------------------------------------------------------------
+# Copyright (c) 1995 Mark L. Ulferts
+# ======================================================================
+# Permission is hereby granted, without written agreement and without
+# license or royalty fees, to use, copy, modify, and distribute this
+# software and its documentation for any purpose, provided that the
+# above copyright notice and the following two paragraphs appear in
+# all copies of this software.
+#
+# IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+# DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+# ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+# IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+# DAMAGE.
+#
+# THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+# BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+# FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+# ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+# PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+# ======================================================================
+
+namespace eval iwidgets::colors {
+
+ # ------------------------------------------------------------------
+ # PROCEDURE: rgbToNumeric
+ #
+ # Returns the numeric value for a list of red, green, and blue.
+ # ------------------------------------------------------------------
+ proc rgbToNumeric {rgb} {
+ if {[llength $rgb] != 3} {
+ error "bad arg: \"$rgb\", should be list of red, green, and blue"
+ }
+
+ return [format "#%04x%04x%04x" \
+ [lindex $rgb 0] [lindex $rgb 1] [lindex $rgb 2]]
+ }
+
+ # ------------------------------------------------------------------
+ # PROCEDURE: rgbToHsb
+ #
+ # The procedure below converts an RGB value to HSB. It takes red,
+ # green, and blue components (0-65535) as arguments, and returns a
+ # list containing HSB components (floating-point, 0-1) as result.
+ # The code here is a copy of the code on page 615 of "Fundamentals
+ # of Interactive Computer Graphics" by Foley and Van Dam.
+ # ------------------------------------------------------------------
+ proc rgbToHsb {rgb} {
+ if {[llength $rgb] != 3} {
+ error "bad arg: \"$rgb\", should be list of red, green, and blue"
+ }
+
+ set r [expr {[lindex $rgb 0]/65535.0}]
+ set g [expr {[lindex $rgb 1]/65535.0}]
+ set b [expr {[lindex $rgb 2]/65535.0}]
+
+ set max 0
+ if {$r > $max} {set max $r}
+ if {$g > $max} {set max $g}
+ if {$b > $max} {set max $b}
+
+ set min 65535
+ if {$r < $min} {set min $r}
+ if {$g < $min} {set min $g}
+ if {$b < $min} {set min $b}
+
+ if {$max != 0} {
+ set sat [expr {($max-$min)/$max}]
+ } else {
+ set sat 0
+ }
+ if {$sat == 0} {
+ set hue 0
+ } else {
+ set rc [expr {($max-$r)/($max-$min)}]
+ set gc [expr {($max-$g)/($max-$min)}]
+ set bc [expr {($max-$b)/($max-$min)}]
+
+ if {$r == $max} {
+ set hue [expr {$bc-$gc}]
+ } elseif {$g == $max} {
+ set hue [expr {2+$rc-$bc}]
+ } elseif {$b == $max} {
+ set hue [expr {4+$gc-$rc}]
+ }
+ set hue [expr {$hue*0.1666667}]
+ if {$hue < 0} {set hue [expr {$hue+1.0}]}
+ }
+ return [list $hue $sat $max]
+ }
+
+ # ------------------------------------------------------------------
+ # PROCEDURE: hsbToRgb
+ #
+ # The procedure below converts an HSB value to RGB. It takes hue,
+ # saturation, and value components (floating-point, 0-1.0) as
+ # arguments, and returns a list containing RGB components (integers,
+ # 0-65535) as result. The code here is a copy of the code on page
+ # 616 of "Fundamentals of Interactive Computer Graphics" by Foley
+ # and Van Dam.
+ # ------------------------------------------------------------------
+ proc hsbToRgb {hsb} {
+
+ if {[llength $hsb] != 3} {
+ error "bad arg: \"$hsb\", should be list of hue, saturation, and brightness"
+ }
+
+ set hue [lindex $hsb 0]
+ set sat [lindex $hsb 1]
+ set value [lindex $hsb 2]
+
+ set v [format %.0f [expr {65535.0*$value}]]
+ if {$sat == 0} {
+ return "$v $v $v"
+ } else {
+ set hue [expr {$hue*6.0}]
+ if {$hue >= 6.0} {
+ set hue 0.0
+ }
+ scan $hue. %d i
+ set f [expr {$hue-$i}]
+ set p [format %.0f [expr {65535.0*$value*(1 - $sat)}]]
+ set q [format %.0f [expr {65535.0*$value*(1 - ($sat*$f))}]]
+ set t [format %.0f [expr {65535.0*$value*(1 - ($sat*(1 - $f)))}]]
+ case $i \
+ 0 {return "$v $t $p"} \
+ 1 {return "$q $v $p"} \
+ 2 {return "$p $v $t"} \
+ 3 {return "$p $q $v"} \
+ 4 {return "$t $p $v"} \
+ 5 {return "$v $p $q"}
+ error "i value $i is out of range"
+ }
+ }
+
+ # ------------------------------------------------------------------
+ #
+ # PROCEDURE: topShadow bgColor
+ #
+ # This method computes a lighter shadow variant of bgColor.
+ # It wants to decrease the saturation to 25%. But if there is
+ # no saturation (as in gray colors) it tries to turn the
+ # brightness up by 10%. It maxes the brightness at 1.0 to
+ # avoid bogus colors...
+ #
+ # bgColor is converted to HSB where the calculations are
+ # made. Then converted back to an rgb color number (hex fmt)
+ #
+ # ------------------------------------------------------------------
+ proc topShadow { bgColor } {
+
+ set hsb [rgbToHsb [winfo rgb . $bgColor]]
+
+ set saturation [lindex $hsb 1]
+ set brightness [lindex $hsb 2]
+
+ if { $brightness < 0.9 } {
+ # try turning the brightness up first.
+ set brightness [expr {$brightness * 1.1}]
+ } else {
+ # otherwise fiddle with saturation
+ set saturation [expr {$saturation * 0.25}]
+ }
+
+ set hsb [lreplace $hsb 1 1 [set saturation]]
+ set hsb [lreplace $hsb 2 2 [set brightness]]
+
+ set rgb [hsbToRgb $hsb]
+ set color [rgbToNumeric $rgb]
+ return $color
+ }
+
+
+ # ------------------------------------------------------------------
+ #
+ # PROC: bottomShadow bgColor
+ #
+ #
+ # This method computes a darker shadow variant of bg color.
+ # It takes the brightness and decreases it to 80% of its
+ # original value.
+ #
+ # bgColor is converted to HSB where the calculations are
+ # made. Then converted back to an rgb color number (hex fmt)
+ #
+ # ------------------------------------------------------------------
+ proc bottomShadow { bgColor } {
+
+ set hsb [rgbToHsb [winfo rgb . $bgColor]]
+ set hsb [lreplace $hsb 2 2 [expr {[lindex $hsb 2] * 0.8}]]
+ set rgb [hsbToRgb $hsb]
+ set color [rgbToNumeric $rgb]
+ return $color
+ }
+}
diff --git a/iwidgets/generic/combobox.itk b/iwidgets/generic/combobox.itk
new file mode 100644
index 00000000000..5b38157c1c7
--- /dev/null
+++ b/iwidgets/generic/combobox.itk
@@ -0,0 +1,1443 @@
+# Combobox
+# ----------------------------------------------------------------------
+# Implements a Combobox widget. A Combobox has 2 basic styles: simple and
+# dropdown. Dropdowns display an entry field with an arrow button to the
+# right of it. When the arrow button is pressed a selectable list of
+# items is popped up. A simple Combobox displays an entry field and a listbox
+# just beneath it which is always displayed. In both types, if the user
+# selects an item in the listbox, the contents of the entry field are
+# replaced with the text from the selected item. If the Combobox is
+# editable, the user can type in the entry field and when <Return> is
+# pressed the item will be inserted into the list.
+#
+# WISH LIST:
+# This section lists possible future enhancements.
+#
+# Combobox 1.x:
+# - convert bindings to bindtags.
+#
+# ----------------------------------------------------------------------
+# ORIGINAL AUTHOR: John S. Sigler
+# ----------------------------------------------------------------------
+# CURRENT MAINTAINER: Chad Smith EMAIL: csmith@adc.com, itclguy@yahoo.com
+#
+# Copyright (c) 1995 John S. Sigler
+# Copyright (c) 1997 Mitch Gorman
+# ======================================================================
+# Permission is hereby granted, without written agreement and without
+# license or royalty fees, to use, copy, modify, and distribute this
+# software and its documentation for any purpose, provided that the
+# above copyright notice and the following two paragraphs appear in
+# all copies of this software.
+#
+# IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+# DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+# ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+# IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+# DAMAGE.
+#
+# THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+# BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+# FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+# ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+# PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+# ======================================================================
+
+#
+# Default resources.
+#
+option add *Combobox.borderWidth 2 widgetDefault
+option add *Combobox.labelPos wn widgetDefault
+option add *Combobox.listHeight 150 widgetDefault
+option add *Combobox.hscrollMode dynamic widgetDefault
+option add *Combobox.vscrollMode dynamic widgetDefault
+
+#
+# Usual options.
+#
+itk::usual Combobox {
+ keep -background -borderwidth -cursor -foreground -highlightcolor \
+ -highlightthickness -insertbackground -insertborderwidth \
+ -insertofftime -insertontime -insertwidth -labelfont -popupcursor \
+ -selectbackground -selectborderwidth -selectforeground \
+ -textbackground -textfont
+}
+
+# ------------------------------------------------------------------
+# COMBOBOX
+# ------------------------------------------------------------------
+itcl::class iwidgets::Combobox {
+ inherit iwidgets::Entryfield
+
+ constructor {args} {}
+ destructor {}
+
+ itk_option define -arrowrelief arrowRelief Relief raised
+ itk_option define -completion completion Completion true
+ itk_option define -dropdown dropdown Dropdown true
+ itk_option define -editable editable Editable true
+ itk_option define -grab grab Grab local
+ itk_option define -listheight listHeight Height 150
+ itk_option define -margin margin Margin 1
+ itk_option define -popupcursor popupCursor Cursor arrow
+ itk_option define -selectioncommand selectionCommand SelectionCommand {}
+ itk_option define -state state State normal
+ itk_option define -unique unique Unique true
+
+ public method clear {{component all}}
+ public method curselection {}
+ public method delete {component first {last {}}}
+ public method get {{index {}}}
+ public method getcurselection {}
+ public method insert {component index args}
+ public method invoke {}
+ public method justify {direction}
+ public method see {index}
+ public method selection {option first {last {}}}
+ public method size {}
+ public method sort {{mode ascending}}
+ public method xview {args}
+ public method yview {args}
+
+ protected method _addToList {}
+ protected method _createComponents {}
+ protected method _deleteList {first {last {}}}
+ protected method _deleteText {first {last {}}}
+ protected method _doLayout {{when later}}
+ protected method _drawArrow {}
+ protected method _dropdownBtnRelease {{window {}} {x 1} {y 1}}
+ protected method _ignoreNextBtnRelease {ignore}
+ protected method _next {}
+ protected method _packComponents {{when later}}
+ protected method _positionList {}
+ protected method _postList {}
+ protected method _previous {}
+ protected method _resizeArrow {}
+ protected method _selectCmd {}
+ protected method _toggleList {}
+ protected method _unpostList {}
+ protected method _commonBindings {}
+ protected method _dropdownBindings {}
+ protected method _simpleBindings {}
+ protected method _listShowing {{val ""}}
+
+ private method _bs {}
+ private method _lookup {key}
+ private method _slbListbox {}
+ private method _stateSelect {}
+
+ private variable _doit 0;
+ private variable _inbs 0;
+ private variable _inlookup 0;
+ private variable _currItem {}; ;# current selected item.
+ private variable _ignoreRelease false ;# next button release ignored.
+ private variable _isPosted false; ;# is the dropdown popped up.
+ private variable _repacking {} ;# non-null => _packComponents pending.
+ private variable _grab ;# used to restore grabs
+ private variable _next_prevFLAG 0 ;# Used in _lookup to fix SF Bug 501300
+ private common _listShowing
+ private common count 0
+}
+
+#
+# Provide a lowercase access method for the Combobox class.
+#
+proc ::iwidgets::combobox {pathName args} {
+ uplevel ::iwidgets::Combobox $pathName $args
+}
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Combobox::constructor {args} {
+ set _listShowing($this) 0
+ set _grab(window) ""
+ set _grab(status) ""
+
+ # combobox is different as all components are created
+ # after determining what the dropdown style is...
+
+ # configure args
+ eval itk_initialize $args
+
+ # create components that are dependent on options
+ # (Scrolledlistbox, arrow button) and pack them.
+ if {$count == 0} {
+ image create bitmap downarrow -data {
+ #define down_width 16
+ #define down_height 16
+ static unsigned char down_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xfc, 0x7f, 0xf8, 0x3f,
+ 0xf0, 0x1f, 0xe0, 0x0f, 0xc0, 0x07, 0x80, 0x03,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ };
+ }
+ image create bitmap uparrow -data {
+ #define up_width 16
+ #define up_height 16
+ static unsigned char up_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00,
+ 0xc0, 0x01, 0xe0, 0x03, 0xf0, 0x07, 0xf8, 0x0f,
+ 0xfc, 0x1f, 0xfe, 0x3f, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ };
+ }
+ }
+ incr count
+ _doLayout
+}
+
+# ------------------------------------------------------------------
+# DESTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Combobox::destructor {} {
+ # catch any repacking that may be waiting for idle time
+ if {$_repacking != ""} {
+ after cancel $_repacking
+ }
+ incr count -1
+ if {$count == 0} {
+ image delete uparrow
+ image delete downarrow
+ }
+}
+
+# ================================================================
+# OPTIONS
+# ================================================================
+
+# --------------------------------------------------------------------
+# OPTION: -arrowrelief
+#
+# Relief style used on the arrow button.
+# --------------------------------------------------------------------
+itcl::configbody iwidgets::Combobox::arrowrelief {}
+
+# --------------------------------------------------------------------
+# OPTION: -completion
+#
+# Relief style used on the arrow button.
+# --------------------------------------------------------------------
+itcl::configbody iwidgets::Combobox::completion {
+ switch -- $itk_option(-completion) {
+ 0 - no - false - off { }
+ 1 - yes - true - on { }
+ default {
+ error "bad completion option \"$itk_option(-completion)\":\
+ should be boolean"
+ }
+ }
+}
+
+# --------------------------------------------------------------------
+# OPTION: -dropdown
+#
+# Boolean which determines the Combobox style: dropdown or simple.
+# Because the two style's lists reside in different toplevel widgets
+# this is more complicated than it should be.
+# --------------------------------------------------------------------
+itcl::configbody iwidgets::Combobox::dropdown {
+ switch -- $itk_option(-dropdown) {
+ 1 - yes - true - on {
+ if {[winfo exists $itk_interior.list]} {
+ set vals [$itk_component(list) get 0 end]
+ destroy $itk_component(list)
+ _doLayout
+ if [llength $vals] {
+ eval insert list end $vals
+ }
+ }
+ }
+ 0 - no - false - off {
+ if {[winfo exists $itk_interior.popup.list]} {
+ set vals [$itk_component(list) get 0 end]
+ catch {destroy $itk_component(arrowBtn)}
+ destroy $itk_component(popup) ;# this deletes the list too
+ _doLayout
+ if [llength $vals] {
+ eval insert list end $vals
+ }
+ }
+ }
+ default {
+ error "bad dropdown option \"$itk_option(-dropdown)\":\
+ should be boolean"
+ }
+ }
+}
+
+# --------------------------------------------------------------------
+# OPTION: -editable
+#
+# Boolean which allows/disallows user input to the entry field area.
+# --------------------------------------------------------------------
+itcl::configbody iwidgets::Combobox::editable {
+ switch -- $itk_option(-editable) {
+ 1 - true - yes - on {
+ switch -- $itk_option(-state) {
+ normal {
+ $itk_component(entry) configure -state normal
+ }
+ }
+ }
+ 0 - false - no - off {
+ $itk_component(entry) configure -state disabled
+ }
+ default {
+ error "bad editable option \"$itk_option(-editable)\":\
+ should be boolean"
+ }
+ }
+}
+
+# --------------------------------------------------------------------
+# OPTION: -grab
+#
+# grab-state of megawidget
+# --------------------------------------------------------------------
+itcl::configbody iwidgets::Combobox::grab {
+ switch -- $itk_option(-grab) {
+ local { }
+ global { }
+ default {
+ error "bad grab value \"$itk_option(-grab)\":\
+ must be global or local"
+ }
+ }
+}
+
+# --------------------------------------------------------------------
+# OPTION: -listheight
+#
+# Listbox height in pixels. (Need to integrate the scrolledlistbox
+# -visibleitems option here - at least for simple listbox.)
+# --------------------------------------------------------------------
+itcl::configbody iwidgets::Combobox::listheight {}
+
+# --------------------------------------------------------------------
+# OPTION: -margin
+#
+# Spacer between the entry field and arrow button of dropdown style
+# Comboboxes.
+# --------------------------------------------------------------------
+itcl::configbody iwidgets::Combobox::margin {
+ grid columnconfigure $itk_interior 0 -minsize $itk_option(-margin)
+}
+
+# --------------------------------------------------------------------
+# OPTION: -popupcursor
+#
+# Set the cursor for the popup list.
+# --------------------------------------------------------------------
+itcl::configbody iwidgets::Combobox::popupcursor {}
+
+# --------------------------------------------------------------------
+# OPTION: -selectioncommand
+#
+# Defines the proc to be called when an item is selected in the list.
+# --------------------------------------------------------------------
+itcl::configbody iwidgets::Combobox::selectioncommand {}
+
+# --------------------------------------------------------------------
+# OPTION: -state
+#
+# overall state of megawidget
+# --------------------------------------------------------------------
+itcl::configbody iwidgets::Combobox::state {
+ switch -- $itk_option(-state) {
+ disabled {
+ $itk_component(entry) configure -state disabled
+ }
+ normal {
+ switch -- $itk_option(-editable) {
+ 1 - true - yes - on {
+ $itk_component(entry) configure -state normal
+ }
+ 0 - false - no - off {
+ $itk_component(entry) configure -state disabled
+ }
+ }
+ }
+ readonly {
+ $itk_component(entry) configure -state readonly
+ }
+ default {
+ error "bad state value \"$itk_option(-state)\":\
+ must be normal or disabled"
+ }
+ }
+ if {[info exists itk_component(arrowBtn)]} {
+ $itk_component(arrowBtn) configure -state $itk_option(-state)
+ }
+}
+
+# --------------------------------------------------------------------
+# OPTION: -unique
+#
+# Boolean which disallows/allows adding duplicate items to the listbox.
+# --------------------------------------------------------------------
+itcl::configbody iwidgets::Combobox::unique {
+ # boolean error check
+ switch -- $itk_option(-unique) {
+ 1 - true - yes - on { }
+ 0 - false - no - off { }
+ default {
+ error "bad unique value \"$itk_option(-unique)\":\
+ should be boolean"
+ }
+ }
+}
+
+# =================================================================
+# METHODS
+# =================================================================
+
+# ------------------------------------------------------
+# PUBLIC METHOD: clear ?component?
+#
+# Remove all elements from the listbox, all contents
+# from the entry component, or both (if all).
+#
+# ------------------------------------------------------
+itcl::body iwidgets::Combobox::clear {{component all}} {
+ switch -- $component {
+ entry {
+ iwidgets::Entryfield::clear
+ }
+ list {
+ delete list 0 end
+ }
+ all {
+ delete list 0 end
+ iwidgets::Entryfield::clear
+ }
+ default {
+ error "bad Combobox component \"$component\":\
+ must be entry, list, or all."
+ }
+ }
+ return
+}
+
+# ------------------------------------------------------
+# PUBLIC METHOD: curselection
+#
+# Return the current selection index.
+#
+# ------------------------------------------------------
+itcl::body iwidgets::Combobox::curselection {} {
+ return [$itk_component(list) curselection]
+}
+
+# ------------------------------------------------------
+# PUBLIC METHOD: delete component first ?last?
+#
+# Delete an item or items from the listbox OR delete
+# text from the entry field. First argument determines
+# which component deletion occurs in - valid values are
+# entry or list.
+#
+# ------------------------------------------------------
+itcl::body iwidgets::Combobox::delete {component first {last {}}} {
+ switch -- $component {
+ entry {
+ if {$last == {}} {
+ set last [expr {$first + 1}]
+ }
+ iwidgets::Entryfield::delete $first $last
+ }
+ list {
+ _deleteList $first $last
+ }
+ default {
+ error "bad Combobox component \"$component\":\
+ must be entry or list."
+ }
+ }
+}
+
+# ------------------------------------------------------
+# PUBLIC METHOD: get ?index?
+#
+#
+# Retrieve entry contents if no args OR use args as list
+# index and retrieve list item at index .
+#
+# ------------------------------------------------------
+itcl::body iwidgets::Combobox::get {{index {}}} {
+ # no args means to get the current text in the entry field area
+ if {$index == {}} {
+ iwidgets::Entryfield::get
+ } else {
+ eval $itk_component(list) get $index
+ }
+}
+
+# ------------------------------------------------------
+# PUBLIC METHOD: getcurselection
+#
+# Return currently selected item in the listbox. Shortcut
+# version of get curselection command combination.
+#
+# ------------------------------------------------------
+itcl::body iwidgets::Combobox::getcurselection {} {
+ return [$itk_component(list) getcurselection]
+}
+
+# ------------------------------------------------------------------
+# PUBLIC METHOD: invoke
+#
+# Pops up or down a dropdown combobox.
+#
+# ------------------------------------------------------------------
+itcl::body iwidgets::Combobox::invoke {} {
+ if {$itk_option(-dropdown)} {
+ return [_toggleList]
+ }
+ return
+}
+
+# ------------------------------------------------------------
+# PUBLIC METHOD: insert comonent index string ?string ...?
+#
+# Insert an item into the listbox OR text into the entry area.
+# Valid component names are entry or list.
+#
+# ------------------------------------------------------------
+itcl::body iwidgets::Combobox::insert {component index args} {
+ set nargs [llength $args]
+
+ if {$nargs == 0} {
+ error "no value given for parameter \"string\" in function\
+ \"Combobox::insert\""
+ }
+
+ switch -- $component {
+ entry {
+ if { $nargs > 1} {
+ error "called function \"Combobox::insert entry\"\
+ with too many arguments"
+ } else {
+ if {$itk_option(-state) == "normal"} {
+ eval iwidgets::Entryfield::insert $index $args
+ [itcl::code $this _lookup ""]
+ }
+ }
+ }
+ list {
+ if {$itk_option(-state) == "normal"} {
+ eval $itk_component(list) insert $index $args
+ }
+ }
+ default {
+ error "bad Combobox component \"$component\": must\
+ be entry or list."
+ }
+ }
+}
+
+# ------------------------------------------------------
+# PUBLIC METHOD: justify direction
+#
+# Wrapper for justifying the listbox items in one of
+# 4 directions: top, bottom, left, or right.
+#
+# ------------------------------------------------------
+itcl::body iwidgets::Combobox::justify {direction} {
+ return [$itk_component(list) justify $direction]
+}
+
+# ------------------------------------------------------------------
+# PUBLIC METHOD: see index
+#
+# Adjusts the view such that the element given by index is visible.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Combobox::see {index} {
+ return [$itk_component(list) see $index]
+}
+
+# ------------------------------------------------------------------
+# PUBLIC METHOD: selection option first ?last?
+#
+# Adjusts the selection within the listbox and changes the contents
+# of the entry component to be the value of the selected list item.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Combobox::selection {option first {last {}}} {
+ # thin wrap
+ if {$option == "set"} {
+ $itk_component(list) selection clear 0 end
+ $itk_component(list) selection set $first
+ set rtn ""
+ } else {
+ set rtn [eval $itk_component(list) selection $option $first $last]
+ }
+ set _currItem $first
+
+ # combobox additions
+ set theText [getcurselection]
+ if {$theText != [$itk_component(entry) get]} {
+ clear entry
+ if {$theText != ""} {
+ insert entry 0 $theText
+ }
+ }
+ return $rtn
+}
+
+# ------------------------------------------------------------------
+# PUBLIC METHOD: size
+#
+# Returns a decimal string indicating the total number of elements
+# in the listbox.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Combobox::size {} {
+ return [$itk_component(list) size]
+}
+
+# ------------------------------------------------------
+# PUBLIC METHOD: sort ?mode?
+#
+# Sort the current list in either "ascending" or "descending" order.
+#
+# jss: how should i handle selected items?
+#
+# ------------------------------------------------------
+itcl::body iwidgets::Combobox::sort {{mode ascending}} {
+ $itk_component(list) sort $mode
+ # return [$itk_component(list) sort $mode]
+}
+
+
+# ------------------------------------------------------------------
+# PUBLIC METHOD: xview ?arg arg ...?
+#
+# Change or query the vertical position of the text in the list box.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Combobox::xview {args} {
+ return [eval $itk_component(list) xview $args]
+}
+
+# ------------------------------------------------------------------
+# PUBLIC METHOD: yview ?arg arg ...?
+#
+# Change or query the horizontal position of the text in the list box.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Combobox::yview {args} {
+ return [eval $itk_component(list) yview $args]
+}
+
+# ------------------------------------------------------
+# PROTECTED METHOD: _addToList
+#
+# Add the current item in the entry to the listbox.
+#
+# ------------------------------------------------------
+itcl::body iwidgets::Combobox::_addToList {} {
+ set input [get]
+ if {$input != ""} {
+ if {$itk_option(-unique)} {
+ # if item is already in list, select it and exit
+ set item [lsearch -exact [$itk_component(list) get 0 end] $input]
+ if {$item != -1} {
+ selection clear 0 end
+ if {$item != {}} {
+ selection set $item $item
+ set _currItem $item
+ }
+ return
+ }
+ }
+ # add the item to end of list
+ selection clear 0 end
+ insert list end $input
+ selection set end end
+ }
+}
+
+# ------------------------------------------------------
+# PROTECTED METHOD: _createComponents
+#
+# Create deferred combobox components and add bindings.
+#
+# ------------------------------------------------------
+itcl::body iwidgets::Combobox::_createComponents {} {
+ if {$itk_option(-dropdown)} {
+ # --- build a dropdown combobox ---
+
+ # make the arrow childsite be on the right hand side
+
+ #-------------------------------------------------------------
+ # BUG FIX: csmith (Chad Smith: csmith@adc.com), 3/4/99
+ #-------------------------------------------------------------
+ # The following commented line of code overwrites the -command
+ # option when passed into the constructor. The order of calls
+ # in the constructor is:
+ # 1) eval itk_initalize $args (initializes -command)
+ # 2) _doLayout
+ # 3) _createComponents (overwrites -command)
+ # The solution is to only set the -command option if it hasn't
+ # already been set. The following 4 lines of code do this.
+ #-------------------------------------------------------------
+ # ** configure -childsitepos e -command [code $this _addToList]
+ #-------------------------------------------------------------
+ configure -childsitepos e
+ if ![llength [cget -command]] {
+ configure -command [itcl::code $this _addToList]
+ }
+
+ # arrow button to popup the list
+ itk_component add arrowBtn {
+ button $itk_interior.arrowBtn -borderwidth 2 \
+ -width 15 -height 15 -image downarrow \
+ -command [itcl::code $this _toggleList] -state $itk_option(-state)
+ } {
+ keep -background -borderwidth -cursor -state \
+ -highlightcolor -highlightthickness
+ rename -relief -arrowrelief arrowRelief Relief
+ rename -highlightbackground -background background Background
+ }
+
+ # popup list container
+ itk_component add popup {
+ toplevel $itk_interior.popup
+ } {
+ keep -background -cursor
+ }
+ wm withdraw $itk_interior.popup
+
+ # the listbox
+ itk_component add list {
+ iwidgets::Scrolledlistbox $itk_interior.popup.list -exportselection no \
+ -vscrollmode dynamic -hscrollmode dynamic -selectmode browse
+ } {
+ keep -background -borderwidth -cursor -foreground \
+ -highlightcolor -highlightthickness \
+ -hscrollmode -selectbackground \
+ -selectborderwidth -selectforeground -textbackground \
+ -textfont -vscrollmode
+ rename -height -listheight listHeight Height
+ rename -cursor -popupcursor popupCursor Cursor
+ }
+ # mode specific bindings
+ _dropdownBindings
+
+ # Ugly hack to avoid tk buglet revealed in _dropdownBtnRelease where
+ # relief is used but not set in scrollbar.tcl.
+ global tkPriv
+ set tkPriv(relief) raise
+
+ } else {
+ # --- build a simple combobox ---
+ configure -childsitepos s
+ itk_component add list {
+ iwidgets::Scrolledlistbox $itk_interior.list -exportselection no \
+ -vscrollmode dynamic -hscrollmode dynamic
+ } {
+ keep -background -borderwidth -cursor -foreground \
+ -highlightcolor -highlightthickness \
+ -hscrollmode -selectbackground \
+ -selectborderwidth -selectforeground -textbackground \
+ -textfont -visibleitems -vscrollmode
+ rename -height -listheight listHeight Height
+ }
+ # add mode specific bindings
+ _simpleBindings
+ }
+
+ # popup cursor applies only to the list within the combobox
+ configure -popupcursor $itk_option(-popupcursor)
+
+ # add mode independent bindings
+ _commonBindings
+}
+
+# ------------------------------------------------------
+# PROTECTED METHOD: _deleteList first ?last?
+#
+# Delete an item or items from the listbox. Called via
+# "delete list args".
+#
+# ------------------------------------------------------
+itcl::body iwidgets::Combobox::_deleteList {first {last {}}} {
+
+ if {$last == {}} {
+ set last $first
+ }
+ $itk_component(list) delete $first $last
+
+ # remove the item if it is no longer in the list
+ set text [$this get]
+ if {$text != ""} {
+ set index [lsearch -exact [$itk_component(list) get 0 end] $text ]
+ if {$index == -1} {
+ clear entry
+ }
+ }
+ return
+}
+
+# ------------------------------------------------------
+# PROTECTED METHOD: _deleteText first ?last?
+#
+# Renamed Entryfield delete method. Called via "delete entry args".
+#
+# ------------------------------------------------------
+itcl::body iwidgets::Combobox::_deleteText {first {last {}}} {
+ $itk_component(entry) configure -state normal
+ set rtrn [delete $first $last]
+ switch -- $itk_option(-editable) {
+ 0 - false - no - off {
+ $itk_component(entry) configure -state disabled
+ }
+ }
+ return $rtrn
+}
+
+# ------------------------------------------------------
+# PROTECTED METHOD: _doLayout ?when?
+#
+# Call methods to create and pack the Combobox components.
+#
+# ------------------------------------------------------
+itcl::body iwidgets::Combobox::_doLayout {{when later}} {
+ _createComponents
+ _packComponents $when
+}
+
+
+# ------------------------------------------------------
+# PROTECTED METHOD: _drawArrow
+#
+# Draw the arrow button. Determines packing according to
+# -labelpos.
+#
+# ------------------------------------------------------
+itcl::body iwidgets::Combobox::_drawArrow {} {
+ set flip false
+ set relief ""
+ set fg [cget -foreground]
+ if {$_isPosted} {
+ set flip true
+ set relief "-relief sunken"
+ } else {
+ set relief "-relief $itk_option(-arrowrelief)"
+ }
+
+ if {$flip} {
+ #
+ # draw up arrow
+ #
+ eval $itk_component(arrowBtn) configure -image uparrow $relief
+ } else {
+ #
+ # draw down arrow
+ #
+ eval $itk_component(arrowBtn) configure -image downarrow $relief
+ }
+}
+
+# ------------------------------------------------------
+# PROTECTED METHOD: _dropdownBtnRelease window x y
+#
+# Event handler for button releases while a dropdown list
+# is posted.
+#
+# ------------------------------------------------------
+itcl::body iwidgets::Combobox::_dropdownBtnRelease {{window {}} {x 1} {y 1}} {
+
+ # if it's a scrollbar then ignore the release
+ if {($window == [$itk_component(list) component vertsb]) ||
+ ($window == [$itk_component(list) component horizsb])} {
+ return
+ }
+
+ # 1st release allows list to stay up unless we are in listbox
+ if {$_ignoreRelease} {
+ _ignoreNextBtnRelease false
+ return
+ }
+
+ # should I use just the listbox or also include the scrollbars
+ if { ($x >= 0) && ($x < [winfo width [_slbListbox]])
+ && ($y >= 0) && ($y < [winfo height [_slbListbox]])} {
+ _stateSelect
+ }
+
+ _unpostList
+
+ # execute user command
+ if {$itk_option(-selectioncommand) != ""} {
+ uplevel #0 $itk_option(-selectioncommand)
+ }
+}
+
+# ------------------------------------------------------
+# PROTECTED METHOD: _ignoreNextBtnRelease ignore
+#
+# Set private variable _ignoreRelease. If this variable
+# is true then the next button release will not remove
+# a dropdown list.
+#
+# ------------------------------------------------------
+itcl::body iwidgets::Combobox::_ignoreNextBtnRelease {ignore} {
+ set _ignoreRelease $ignore
+}
+
+# ------------------------------------------------------
+# PROTECTED METHOD: _next
+#
+# Select the next item in the list.
+#
+# ------------------------------------------------------
+itcl::body iwidgets::Combobox::_next {} {
+
+ set _next_prevFLAG 1
+
+ if {[size] <= 1} {
+ return
+ }
+ set i [curselection]
+ if {($i == {}) || ($i == ([size]-1)) } {
+ set i 0
+ } else {
+ incr i
+ }
+ selection clear 0 end
+ selection set $i $i
+ see $i
+ set _currItem $i
+}
+
+# ------------------------------------------------------
+# PROTECTED METHOD: _packComponents ?when?
+#
+# Pack the components of the combobox and add bindings.
+#
+# ------------------------------------------------------
+itcl::body iwidgets::Combobox::_packComponents {{when later}} {
+ if {$when == "later"} {
+ if {$_repacking == ""} {
+ set _repacking [after idle [itcl::code $this _packComponents now]]
+ return
+ }
+ } elseif {$when != "now"} {
+ error "bad option \"$when\": should be now or later"
+ }
+
+ if {$itk_option(-dropdown)} {
+ grid configure $itk_component(list) -row 1 -column 0 -sticky news
+ _resizeArrow
+ grid config $itk_component(arrowBtn) -row 0 -column 1 -sticky nsew
+ } else {
+ # size and pack list hack
+ grid configure $itk_component(entry) -row 0 -column 0 -sticky ew
+ grid configure $itk_component(efchildsite) -row 1 -column 0 -sticky nsew
+ grid configure $itk_component(list) -row 0 -column 0 -sticky nsew
+
+ grid rowconfigure $itk_component(efchildsite) 1 -weight 1
+ grid columnconfigure $itk_component(efchildsite) 0 -weight 1
+ }
+ set _repacking ""
+}
+
+# ------------------------------------------------------
+# PROTECTED METHOD: _positionList
+#
+# Determine the position (geometry) for the popped up list
+# and map it to the screen.
+#
+# ------------------------------------------------------
+itcl::body iwidgets::Combobox::_positionList {} {
+
+ set x [winfo rootx $itk_component(entry) ]
+ set y [expr {[winfo rooty $itk_component(entry) ] + \
+ [winfo height $itk_component(entry) ]}]
+ set w [winfo width $itk_component(entry) ]
+ set h [winfo height [_slbListbox] ]
+ set sh [winfo screenheight .]
+
+ if {(($y+$h) > $sh) && ($y > ($sh/2))} {
+ set y [expr {[winfo rooty $itk_component(entry) ] - $h}]
+ }
+
+ $itk_component(list) configure -width $w
+ wm overrideredirect $itk_component(popup) 0
+ wm geometry $itk_component(popup) +$x+$y
+ wm overrideredirect $itk_component(popup) 1
+}
+
+# ------------------------------------------------------
+# PROTECTED METHOD: _postList
+#
+# Pop up the list in a dropdown style Combobox.
+#
+# ------------------------------------------------------
+itcl::body iwidgets::Combobox::_postList {} {
+ if {[$itk_component(list) size] == ""} {
+ return
+ }
+
+ set _isPosted true
+ _positionList
+
+ # map window and do a grab
+ wm deiconify $itk_component(popup)
+ _listShowing -wait
+
+ # Added by csmith, 12/19/00. Thanks to Erik Leunissen for
+ # finding this problem. We need to restore any previous
+ # grabs after the dropdown listbox is withdrawn. To do this,
+ # save the currently grabbed window. It is then restored in
+ # the _unpostList method.
+ set _grab(window) [::grab current]
+ if {$_grab(window) != ""} {
+ set _grab(status) [::grab status $_grab(window)]
+ }
+
+ # Now grab the dropdown listbox.
+ if {$itk_option(-grab) == "global"} {
+ ::grab -global $itk_component(popup)
+ } else {
+ ::grab $itk_component(popup)
+ }
+ raise $itk_component(popup)
+ focus $itk_component(popup)
+ _drawArrow
+
+ # Added by csmith, 10/26/00. This binding keeps the listbox
+ # from staying mapped if the window in which the combobox
+ # is packed is iconified.
+ bind $itk_component(entry) <Unmap> [itcl::code $this _unpostList]
+}
+
+# ------------------------------------------------------
+# PROTECTED METHOD: _previous
+#
+# Select the previous item in the list. Wraps at front
+# and end of list.
+#
+# ------------------------------------------------------
+itcl::body iwidgets::Combobox::_previous {} {
+
+ set _next_prevFLAG 1
+
+ if {[size] <= 1} {
+ return
+ }
+ set i [curselection]
+ if {$i == "" || $i == 0} {
+ set i [expr {[size] - 1}]
+ } else {
+ incr i -1
+ }
+ selection clear 0 end
+ selection set $i $i
+ see $i
+ set _currItem $i
+}
+
+# ------------------------------------------------------
+# PROTECTED METHOD: _resizeArrow
+#
+# Recalculate the arrow button size and then redraw it.
+#
+# ------------------------------------------------------
+itcl::body iwidgets::Combobox::_resizeArrow {} {
+ set bw [expr {[$itk_component(arrowBtn) cget -borderwidth]+ \
+ [$itk_component(arrowBtn) cget -highlightthickness]}]
+ set newHeight [expr {[winfo reqheight $itk_component(entry)]-(2*$bw) - 2}]
+ $itk_component(arrowBtn) configure -width $newHeight -height $newHeight
+ _drawArrow
+}
+
+# ------------------------------------------------------
+# PROTECTED METHOD: _selectCmd
+#
+# Called when list item is selected to insert new text
+# in entry, and call user -command callback if defined.
+#
+# ------------------------------------------------------
+itcl::body iwidgets::Combobox::_selectCmd {} {
+ $itk_component(entry) configure -state normal
+
+ set _currItem [$itk_component(list) curselection]
+ set item [$itk_component(list) getcurselection]
+ clear entry
+ $itk_component(entry) insert 0 $item
+ switch -- $itk_option(-editable) {
+ 0 - false - no - off {
+ $itk_component(entry) configure -state disabled
+ }
+ }
+}
+
+# ------------------------------------------------------
+# PROTECTED METHOD: _toggleList
+#
+# Post or unpost the dropdown listbox (toggle).
+#
+# ------------------------------------------------------
+itcl::body iwidgets::Combobox::_toggleList {} {
+ if {[winfo ismapped $itk_component(popup)] } {
+ _unpostList
+ } else {
+ _postList
+ }
+}
+
+# ------------------------------------------------------
+# PROTECTED METHOD: _unpostList
+#
+# Unmap the listbox (pop it down).
+#
+# ------------------------------------------------------
+itcl::body iwidgets::Combobox::_unpostList {} {
+ # Determine if event occured in the scrolledlistbox and, if it did,
+ # don't unpost it. (A selection in the list unposts it correctly and
+ # in the scrollbar we don't want to unpost it.)
+ set x [winfo x $itk_component(list)]
+ set y [winfo y $itk_component(list)]
+ set w [winfo width $itk_component(list)]
+ set h [winfo height $itk_component(list)]
+
+ wm withdraw $itk_component(popup)
+ ::grab release $itk_component(popup)
+
+ # Added by csmith, 12/19/00. Thanks to Erik Leunissen for finding
+ # this problem. We need to restore any previous grabs when the
+ # dropdown listbox is unmapped.
+ if {$_grab(window) != ""} {
+ if {$_grab(status) == "global"} {
+ ::grab -global $_grab(window)
+ } else {
+ ::grab $_grab(window)
+ }
+ set _grab(window) ""
+ set _grab(status) ""
+ }
+
+ # Added by csmith, 10/26/00. This binding resets the binding
+ # created in _postList - see that method for further details.
+ bind $itk_component(entry) <Unmap> {}
+
+ set _isPosted false
+
+ $itk_component(list) selection clear 0 end
+ if {$_currItem != {}} {
+ $itk_component(list) selection set $_currItem $_currItem
+ $itk_component(list) activate $_currItem
+ }
+
+ switch -- $itk_option(-editable) {
+ 1 - true - yes - on {
+ $itk_component(entry) configure -state normal
+ }
+ 0 - false - no - off {
+ $itk_component(entry) configure -state disabled
+ }
+ }
+
+ _drawArrow
+ update
+}
+
+# ------------------------------------------------------
+# PROTECTED METHOD: _commonBindings
+#
+# Bindings that are used by both simple and dropdown
+# style Comboboxes.
+#
+# ------------------------------------------------------
+itcl::body iwidgets::Combobox::_commonBindings {} {
+ bind $itk_component(entry) <KeyPress-BackSpace> [itcl::code $this _bs]
+ bind $itk_component(entry) <KeyRelease> [itcl::code $this _lookup %K]
+ bind $itk_component(entry) <Down> [itcl::code $this _next]
+ bind $itk_component(entry) <Up> [itcl::code $this _previous]
+ bind $itk_component(entry) <Control-n> [itcl::code $this _next]
+ bind $itk_component(entry) <Control-p> [itcl::code $this _previous]
+ bind [_slbListbox] <Control-n> [itcl::code $this _next]
+ bind [_slbListbox] <Control-p> [itcl::code $this _previous]
+}
+
+
+# ------------------------------------------------------
+# PROTECTED METHOD: _dropdownBindings
+#
+# Bindings used only by the dropdown type Combobox.
+#
+# ------------------------------------------------------
+itcl::body iwidgets::Combobox::_dropdownBindings {} {
+ bind $itk_component(popup) <Escape> [itcl::code $this _unpostList]
+ bind $itk_component(popup) <space> \
+ "[itcl::code $this _stateSelect]; [itcl::code $this _unpostList]"
+ bind $itk_component(popup) <Return> \
+ "[itcl::code $this _stateSelect]; [itcl::code $this _unpostList]"
+ bind $itk_component(popup) <ButtonRelease-1> \
+ [itcl::code $this _dropdownBtnRelease %W %x %y]
+
+ bind $itk_component(list) <Map> \
+ [itcl::code $this _listShowing 1]
+ bind $itk_component(list) <Unmap> \
+ [itcl::code $this _listShowing 0]
+
+ # once in the listbox, we drop on the next release (unless in scrollbar)
+ bind [_slbListbox] <Enter> \
+ [itcl::code $this _ignoreNextBtnRelease false]
+
+ bind $itk_component(arrowBtn) <3> [itcl::code $this _next]
+ bind $itk_component(arrowBtn) <Shift-3> [itcl::code $this _previous]
+ bind $itk_component(arrowBtn) <Down> [itcl::code $this _next]
+ bind $itk_component(arrowBtn) <Up> [itcl::code $this _previous]
+ bind $itk_component(arrowBtn) <Control-n> [itcl::code $this _next]
+ bind $itk_component(arrowBtn) <Control-p> [itcl::code $this _previous]
+ bind $itk_component(arrowBtn) <Shift-Down> [itcl::code $this _toggleList]
+ bind $itk_component(arrowBtn) <Shift-Up> [itcl::code $this _toggleList]
+ bind $itk_component(arrowBtn) <Return> [itcl::code $this _toggleList]
+ bind $itk_component(arrowBtn) <space> [itcl::code $this _toggleList]
+
+ bind $itk_component(entry) <Configure> [itcl::code $this _resizeArrow]
+ bind $itk_component(entry) <Shift-Down> [itcl::code $this _toggleList]
+ bind $itk_component(entry) <Shift-Up> [itcl::code $this _toggleList]
+}
+
+# ------------------------------------------------------
+# PROTECTED METHOD: _simpleBindings
+#
+# Bindings used only by the simple type Comboboxes.
+#
+# ------------------------------------------------------
+itcl::body iwidgets::Combobox::_simpleBindings {} {
+ bind [_slbListbox] <ButtonRelease-1> [itcl::code $this _stateSelect]
+ bind [_slbListbox] <space> [itcl::code $this _stateSelect]
+ bind [_slbListbox] <Return> [itcl::code $this _stateSelect]
+ bind $itk_component(entry) <Escape> ""
+ bind $itk_component(entry) <Shift-Down> ""
+ bind $itk_component(entry) <Shift-Up> ""
+ bind $itk_component(entry) <Configure> ""
+}
+
+# ------------------------------------------------------
+# PROTECTED METHOD: _listShowing ?val?
+#
+# Used instead of "tkwait visibility" to make sure that
+# the dropdown list is visible. Whenever the list gets
+# mapped or unmapped, this method is called to keep
+# track of it. When it is called with the value "-wait",
+# it waits for the list to be mapped.
+# ------------------------------------------------------
+itcl::body iwidgets::Combobox::_listShowing {{val ""}} {
+ if {$val == ""} {
+ return $_listShowing($this)
+ } elseif {$val == "-wait"} {
+ while {!$_listShowing($this)} {
+ tkwait variable [itcl::scope _listShowing($this)]
+ }
+ return
+ }
+ set _listShowing($this) $val
+}
+
+# ------------------------------------------------------
+# PRIVATE METHOD: _slbListbox
+#
+# Access the tk listbox window out of the scrolledlistbox.
+#
+# ------------------------------------------------------
+itcl::body iwidgets::Combobox::_slbListbox {} {
+ return [$itk_component(list) component listbox]
+}
+
+# ------------------------------------------------------
+# PRIVATE METHOD: _stateSelect
+#
+# only allows a B1 release in the listbox to have an effect if -state is
+# normal.
+#
+# ------------------------------------------------------
+itcl::body iwidgets::Combobox::_stateSelect {} {
+ switch -- $itk_option(-state) {
+ normal {
+ [itcl::code $this _selectCmd]
+ }
+ }
+}
+
+# ------------------------------------------------------
+# PRIVATE METHOD: _bs
+#
+# A part of the auto-completion code, this function sets a flag when the
+# Backspace key is hit and there is a selection in the entry field.
+# Note that it's probably buggy to assume that a selection being present
+# means that that selection came from auto-completion.
+#
+# ------------------------------------------------------
+itcl::body iwidgets::Combobox::_bs {} {
+ #
+ # exit if completion is turned off
+ #
+ switch -- $itk_option(-completion) {
+ 0 - no - false - off {
+ return
+ }
+ }
+ #
+ # critical section flag. it ain't perfect, but for most usage it'll
+ # keep us from being in this code "twice" at the same time
+ # (auto-repeated keystrokes are a pain!)
+ #
+ if {$_inbs} {
+ return
+ } else {
+ set _inbs 1
+ }
+
+ #
+ # set the _doit flag if there is a selection set in the entry field
+ #
+ set _doit 0
+ if [$itk_component(entry) selection present] {
+ set _doit 1
+ }
+
+ #
+ # clear the semaphore and return
+ #
+ set _inbs 0
+}
+
+# ------------------------------------------------------
+# PRIVATE METHOD: _lookup
+#
+# handles auto-completion of text typed (or insert'd) into the entry field.
+#
+# ------------------------------------------------------
+itcl::body iwidgets::Combobox::_lookup {key} {
+
+ #
+ # Don't process auto-completion stuff if navigation key was released
+ # Fixes SF bug 501300
+ #
+ if {$_next_prevFLAG} {
+ set _next_prevFLAG 0
+ return
+ }
+
+ #
+ # exit if completion is turned off
+ #
+ switch -- $itk_option(-completion) {
+ 0 - no - false - off {
+ return
+ }
+ }
+
+ #
+ # critical section flag. it ain't perfect, but for most usage it'll
+ # keep us from being in this code "twice" at the same time
+ # (auto-repeated keystrokes are a pain!)
+ #
+ if {$_inlookup} {
+ return
+ } else {
+ set _inlookup 1
+ }
+
+ #
+ # if state of megawidget is disabled, or the entry is not editable,
+ # clear the semaphore and exit
+ #
+ if {$itk_option(-state) == "disabled" \
+ || [lsearch {on 1 true yes} $itk_option(-editable)] == -1} {
+ set _inlookup 0
+ return
+ }
+
+ #
+ # okay, *now* we can get to work
+ # the _bs function is called on keyPRESS of BackSpace, and will set
+ # the _doit flag if there's a selection set in the entryfield. If
+ # there is, we're assuming that it's generated by completion itself
+ # (this is probably a Bad Assumption), so we'll want to whack the
+ # selected text, as well as the character immediately preceding the
+ # insertion cursor.
+ #
+ if {$key == "BackSpace"} {
+ if {$_doit} {
+ set first [expr {[$itk_component(entry) index insert] -1}]
+ $itk_component(entry) delete $first end
+ $itk_component(entry) icursor $first
+ }
+ }
+
+ #
+ # get the text left in the entry field, and its length. if
+ # zero-length, clear the selection in the listbox, clear the
+ # semaphore, and boogie.
+ #
+ set text [get]
+ set len [string length $text]
+ if {$len == 0} {
+ $itk_component(list) selection clear 0 end
+ set _inlookup 0
+ return
+ }
+
+ # No need to do lookups for Shift keys or Arrows. The up/down
+ # arrow keys should walk up/down the listbox entries.
+ switch $key {
+ Shift_L - Shift_R - Up - Down - Left - Right {
+ set _inlookup 0
+ return
+ }
+ default { }
+ }
+
+ # Added by csmith 12/11/01 to resolve SF ticket #474817. It's an unusual
+ # circumstance, but we need to make sure the character passed into this
+ # method matches the last character in the entry's text string. It's
+ # possible to type fast enough that the _lookup method gets invoked
+ # *after* multiple characters have been typed and *before* the first
+ # character has been processed. For example, you can type "bl" very
+ # quickly, and by the time the interpreter processes "b", the "l" has
+ # already been placed in the entry field. This causes problems as noted
+ # in the SF ticket.
+ #
+ # Thus, if the character currently being processed does not match the
+ # last character in the entry field, reset the _inlookup flag and return.
+ # Also, note that we're only concerned with single characters here, not
+ # keys such as backspace, delete, etc.
+ if {$key != [string range $text end end] && [string match ? $key]} {
+ set _inlookup 0
+ return
+ }
+
+ #
+ # okay, so we have to do a lookup. find the first match in the
+ # listbox to the text we've got in the entry field (glob).
+ # if one exists, clear the current listbox selection, and set it to
+ # the one we just found, making that one visible in the listbox.
+ # then, pick off the text from the listbox entry that hadn't yet been
+ # entered into the entry field. we need to tack that text onto the
+ # end of the entry field, select it, and then set the insertion cursor
+ # back to just before the point where we just added that text.
+ # if one didn't exist, then just clear the listbox selection
+ #
+ set item [lsearch [$itk_component(list) get 0 end] "$text*" ]
+ if {$item != -1} {
+ $itk_component(list) selection clear 0 end
+ $itk_component(list) selection set $item $item
+ see $item
+ set remainder [string range [$itk_component(list) get $item] $len end]
+ $itk_component(entry) insert end $remainder
+ $itk_component(entry) selection range $len end
+ $itk_component(entry) icursor $len
+ } else {
+ $itk_component(list) selection clear 0 end
+ }
+ #
+ # clear the semaphore and return
+ #
+ set _inlookup 0
+ return
+}
diff --git a/iwidgets/generic/dateentry.itk b/iwidgets/generic/dateentry.itk
new file mode 100644
index 00000000000..0e8c146e7bf
--- /dev/null
+++ b/iwidgets/generic/dateentry.itk
@@ -0,0 +1,424 @@
+#
+# Dateentry
+# ----------------------------------------------------------------------
+# Implements a quicken style date entry field with a popup calendar
+# by combining the datefield and calendar widgets together. This
+# allows a user to enter the date via the keyboard or by using the
+# mouse by selecting the calendar icon which brings up a popup calendar.
+# ----------------------------------------------------------------------
+# AUTHOR: Mark L. Ulferts E-mail: mulferts@austin.dsccc.com
+#
+# @(#) $Id$
+# ----------------------------------------------------------------------
+# Copyright (c) 1997 DSC Technologies Corporation
+# ======================================================================
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+#
+# ----------------------------------------------------------------------
+#
+# Modified 2001-10-23 by Mark Alston to pass options to the datefield
+# constructor. Needed to allow use of new option -int which lets the
+# user use dates in YYYY-MM-DD format as well as MM/DD/YYYY format.
+#
+# option -int yes sets dates to YYYY-MM-DD format
+# -int no sets dates to MM/DD/YYYY format.
+#
+# ----------------------------------------------------------------------
+#
+# Usual options.
+#
+itk::usual Dateentry {
+ keep -background -borderwidth -currentdatefont -cursor \
+ -datefont -dayfont -foreground -highlightcolor \
+ -highlightthickness -labelfont -textbackground -textfont \
+ -titlefont -int
+}
+
+# ------------------------------------------------------------------
+# DATEENTRY
+# ------------------------------------------------------------------
+itcl::class iwidgets::Dateentry {
+ inherit iwidgets::Datefield
+
+ constructor {args} {
+ eval Datefield::constructor $args
+ } {}
+
+ itk_option define -grab grab Grab "global"
+ itk_option define -icon icon Icon {}
+
+ #
+ # The calendar widget isn't created until needed, yet we need
+ # its options to be available upon creation of a dateentry widget.
+ # So, we'll define them in these class now so they can just be
+ # propagated onto the calendar later.
+ #
+ itk_option define -days days Days {Su Mo Tu We Th Fr Sa}
+ itk_option define -forwardimage forwardImage Image {}
+ itk_option define -backwardimage backwardImage Image {}
+ itk_option define -weekdaybackground weekdayBackground Background \#d9d9d9
+ itk_option define -weekendbackground weekendBackground Background \#d9d9d9
+ itk_option define -outline outline Outline \#d9d9d9
+ itk_option define -buttonforeground buttonForeground Foreground blue
+ itk_option define -foreground foreground Foreground black
+ itk_option define -selectcolor selectColor Foreground red
+ itk_option define -selectthickness selectThickness SelectThickness 3
+ itk_option define -titlefont titleFont Font \
+ -*-helvetica-bold-r-normal--*-140-*
+ itk_option define -dayfont dayFont Font \
+ -*-helvetica-medium-r-normal--*-120-*
+ itk_option define -datefont dateFont Font \
+ -*-helvetica-medium-r-normal--*-120-*
+ itk_option define -currentdatefont currentDateFont Font \
+ -*-helvetica-bold-r-normal--*-120-*
+ itk_option define -startday startDay Day sunday
+ itk_option define -height height Height 165
+ itk_option define -width width Width 200
+ itk_option define -state state State normal
+
+ protected {
+ method _getPopupDate {date}
+ method _releaseGrab {}
+ method _releaseGrabCheck {rootx rooty}
+ method _popup {}
+ method _getDefaultIcon {}
+
+ common _defaultIcon ""
+ }
+}
+
+#
+# Provide a lowercased access method for the dateentry class.
+#
+proc ::iwidgets::dateentry {pathName args} {
+ uplevel ::iwidgets::Dateentry $pathName $args
+}
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Dateentry::constructor {args} {
+ #
+ # Create an icon label to act as a button to bring up the
+ # calendar popup.
+ #
+ itk_component add iconbutton {
+ label $itk_interior.iconbutton -relief raised
+ } {
+ keep -borderwidth -cursor -foreground
+ }
+ grid $itk_component(iconbutton) -row 0 -column 0 -sticky ns
+
+ #
+ # Initialize the widget based on the command line options.
+ #
+ eval itk_initialize $args
+}
+
+# ------------------------------------------------------------------
+# OPTIONS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# OPTION: -icon
+#
+# Specifies the calendar icon image to be used in the date.
+# Should one not be provided, then a default pixmap will be used
+# if possible, bitmap otherwise.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Dateentry::icon {
+ if {$itk_option(-icon) == {}} {
+ $itk_component(iconbutton) configure -image [_getDefaultIcon]
+ } else {
+ if {[lsearch [image names] $itk_option(-icon)] == -1} {
+ error "bad icon option \"$itk_option(-icon)\":\
+ should be an existing image"
+ } else {
+ $itk_component(iconbutton) configure -image $itk_option(-icon)
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -grab
+#
+# Specifies the grab level, local or global, to be obtained when
+# bringing up the popup calendar. The default is global.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Dateentry::grab {
+ switch -- $itk_option(-grab) {
+ "local" - "global" {}
+ default {
+ error "bad grab option \"$itk_option(-grab)\":\
+ should be local or global"
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -state
+#
+# Specifies the state of the widget which may be disabled or
+# normal. A disabled state prevents selection of the date field
+# or date icon button.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Dateentry::state {
+ switch -- $itk_option(-state) {
+ normal {
+ bind $itk_component(iconbutton) <Button-1> [itcl::code $this _popup]
+ }
+ disabled {
+ bind $itk_component(iconbutton) <Button-1> {}
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# METHODS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _getDefaultIcon
+#
+# This method is invoked uto retrieve the name of the default icon
+# image displayed in the icon button.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Dateentry::_getDefaultIcon {} {
+ if {[lsearch [image types] pixmap] != -1} {
+ set _defaultIcon [image create pixmap -data {
+ /* XPM */
+ static char *calendar[] = {
+ /* width height num_colors chars_per_pixel */
+ " 25 20 6 1",
+ /* colors */
+ ". c #808080",
+ "# c #040404",
+ "a c #848484",
+ "b c #fc0404",
+ "c c #fcfcfc",
+ "d c #c0c0c0",
+ /* pixels */
+ "d##########d###########dd",
+ "d#ccccccccc##ccccccccca#d",
+ "##ccccccccc.#ccccccccc..#",
+ "##cccbbcccca#cccbbbccca.#",
+ "##cccbbcccc.#ccbbbbbcc..#",
+ "##cccbbccc####ccccbbcc..#",
+ "##cccbbcccca#ccccbbbcca.#",
+ "##cccbbcccc.#cccbbbccc..#",
+ "##cccbbcccca#ccbbbcccca.#",
+ "##cccbbbccc.#ccbbbbbcc..#",
+ "##ccccccccc.#ccccccccc..#",
+ "##ccccccccca#ccccccccca.#",
+ "##cc#####c#cd#c#####cc..#",
+ "##cccccccc####cccccccca.#",
+ "##cc#####cc.#cc#####cc..#",
+ "##ccccccccc.#ccccccccc..#",
+ "##ccccccccc.#ccccccccc..#",
+ "##..........#...........#",
+ "###..........#..........#",
+ "#########################"
+ };
+ }]
+ } else {
+ set _defaultIcon [image create bitmap -data {
+ #define calendr2_width 25
+ #define calendr2_height 20
+ static char calendr2_bits[] = {
+ 0xfe,0xf7,0x7f,0xfe,0x02,0x18,0xc0,0xfe,0x03,
+ 0x18,0x80,0xff,0x63,0x10,0x47,0xff,0x43,0x98,
+ 0x8a,0xff,0x63,0x3c,0x4c,0xff,0x43,0x10,0x8a,
+ 0xff,0x63,0x18,0x47,0xff,0x23,0x90,0x81,0xff,
+ 0xe3,0x98,0x4e,0xff,0x03,0x10,0x80,0xff,0x03,
+ 0x10,0x40,0xff,0xf3,0xa5,0x8f,0xff,0x03,0x3c,
+ 0x40,0xff,0xf3,0x99,0x8f,0xff,0x03,0x10,0x40,
+ 0xff,0x03,0x18,0x80,0xff,0x57,0x55,0x55,0xff,
+ 0x57,0xb5,0xaa,0xff,0xff,0xff,0xff,0xff};
+ }]
+ }
+
+ #
+ # Since this image will only need to be created once, we redefine
+ # this method to just return the image name for subsequent calls.
+ #
+ itcl::body ::iwidgets::Dateentry::_getDefaultIcon {} {
+ return $_defaultIcon
+ }
+
+ return $_defaultIcon
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _popup
+#
+# This method is invoked upon selection of the icon button. It
+# creates a calendar widget within a toplevel popup, calculates
+# the position at which to display the calendar, performs a grab
+# and displays the calendar.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Dateentry::_popup {} {
+ #
+ # First, let's nullify the icon binding so that any another
+ # selections are ignored until were done with this one. Next,
+ # change the relief of the icon.
+ #
+ bind $itk_component(iconbutton) <Button-1> {}
+ $itk_component(iconbutton) configure -relief sunken
+
+ #
+ # Create a withdrawn toplevel widget and remove the window
+ # decoration via override redirect.
+ #
+ itk_component add -private popup {
+ toplevel $itk_interior.popup
+ }
+ $itk_component(popup) configure -borderwidth 2 -background black
+ wm withdraw $itk_component(popup)
+ wm overrideredirect $itk_component(popup) 1
+
+ #
+ # Add a binding to button 1 events in order to detect mouse
+ # clicks off the calendar in which case we'll release the grab.
+ # Also add a binding for Escape to always release.
+ #
+ bind $itk_component(popup) <1> [itcl::code $this _releaseGrabCheck %X %Y]
+ bind $itk_component(popup) <KeyPress-Escape> [itcl::code $this _releaseGrab]
+
+ #
+ # Create the calendar widget and set its cursor properly.
+ #
+ itk_component add calendar {
+ iwidgets::Calendar $itk_component(popup).calendar \
+ -command [itcl::code $this _getPopupDate %d] \
+ -int $itk_option(-int)
+ } {
+ usual
+ keep -days -forwardimage -backwardimage -weekdaybackground \
+ -weekendbackground -outline -buttonforeground -selectcolor \
+ -selectthickness -titlefont -dayfont -datefont \
+ -currentdatefont -startday -width -height
+ }
+ grid $itk_component(calendar) -row 0 -column 0
+ $itk_component(calendar) configure -cursor top_left_arrow
+
+ #
+ # The icon button will be used as the basis for the position of the
+ # popup on the screen. We'll always attempt to locate the popup
+ # off the lower right corner of the button. If that would put
+ # the popup off the screen, then we'll put above the upper left.
+ #
+ set rootx [winfo rootx $itk_component(iconbutton)]
+ set rooty [winfo rooty $itk_component(iconbutton)]
+ set popupwidth [winfo reqwidth $itk_component(popup)]
+ set popupheight [winfo reqheight $itk_component(popup)]
+
+ set popupx [expr {$rootx + 3 + \
+ [winfo width $itk_component(iconbutton)]}]
+ set popupy [expr {$rooty + 3 + \
+ [winfo height $itk_component(iconbutton)]}]
+
+ if {(($popupx + $popupwidth) > [winfo screenwidth .]) || \
+ (($popupy + $popupheight) > [winfo screenheight .])} {
+ set popupx [expr {$rootx - 3 - $popupwidth}]
+ set popupy [expr {$rooty - 3 - $popupheight}]
+ }
+
+ #
+ # Get the current date from the datefield widget and both
+ # show and select it on the calendar.
+ #
+ # Added catch for bad dates. Calendar then shows current date.
+ if [catch "$itk_component(calendar) show [get]" err] {
+ $itk_component(calendar) show now
+ $itk_component(calendar) select now
+ } else {
+ $itk_component(calendar) select [get]
+ }
+ #
+ # Display the popup at the calculated position.
+ #
+ wm geometry $itk_component(popup) +$popupx+$popupy
+ wm deiconify $itk_component(popup)
+ tkwait visibility $itk_component(popup)
+
+ #
+ # Perform either a local or global grab based on the -grab option.
+ #
+ if {$itk_option(-grab) == "local"} {
+ grab $itk_component(popup)
+ } else {
+ grab -global $itk_component(popup)
+ }
+
+ #
+ # Make sure the widget is above all others and give it focus.
+ #
+ raise $itk_component(popup)
+ focus $itk_component(calendar)
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _popupGetDate
+#
+# This method is the callback for selection of a date on the
+# calendar. It releases the grab and sets the date in the
+# datefield widget.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Dateentry::_getPopupDate {date} {
+ _releaseGrab
+ show $date
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _releaseGrabCheck rootx rooty
+#
+# This method handles mouse button 1 events. If the selection
+# occured within the bounds of the calendar, then return normally
+# and let the calendar handle the event. Otherwise, we'll drop
+# the calendar and release the grab.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Dateentry::_releaseGrabCheck {rootx rooty} {
+ set calx [winfo rootx $itk_component(calendar)]
+ set caly [winfo rooty $itk_component(calendar)]
+ set calwidth [winfo reqwidth $itk_component(calendar)]
+ set calheight [winfo reqheight $itk_component(calendar)]
+
+ if {($rootx < $calx) || ($rootx > ($calx + $calwidth)) || \
+ ($rooty < $caly) || ($rooty > ($caly + $calheight))} {
+ _releaseGrab
+ return -code break
+ }
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _releaseGrab
+#
+# This method releases the grab, destroys the popup, changes the
+# relief of the button back to raised and reapplies the binding
+# to the icon button that engages the popup action.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Dateentry::_releaseGrab {} {
+ grab release $itk_component(popup)
+ $itk_component(iconbutton) configure -relief raised
+ destroy $itk_component(popup)
+ bind $itk_component(iconbutton) <Button-1> [itcl::code $this _popup]
+}
diff --git a/iwidgets/generic/datefield.itk b/iwidgets/generic/datefield.itk
new file mode 100644
index 00000000000..22c885d00fc
--- /dev/null
+++ b/iwidgets/generic/datefield.itk
@@ -0,0 +1,1021 @@
+#
+# Datefield
+# ----------------------------------------------------------------------
+# Implements a date entry field with adjustable built-in intelligence
+# levels.
+# ----------------------------------------------------------------------
+# AUTHOR: Mark L. Ulferts E-mail: mulferts@austin.dsccc.com
+#
+# @(#) $Id$
+# ----------------------------------------------------------------------
+# Copyright (c) 1997 DSC Technologies Corporation
+# ======================================================================
+#
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+
+#
+# Usual options.
+#
+itk::usual Datefield {
+ keep -background -borderwidth -cursor -foreground -highlightcolor \
+ -highlightthickness -labelfont -textbackground -textfont
+}
+
+# ------------------------------------------------------------------
+# DATEFIELD
+# ------------------------------------------------------------------
+itcl::class iwidgets::Datefield {
+ inherit iwidgets::Labeledwidget
+
+ constructor {args} {}
+
+ itk_option define -childsitepos childSitePos Position e
+ itk_option define -command command Command {}
+ itk_option define -iq iq Iq high
+ itk_option define -gmt gmt GMT no
+ itk_option define -int int DateFormat no
+
+ public method get {{format "-string"}}
+ public method isvalid {}
+ public method show {{date now}}
+
+ protected method _backward {}
+ protected method _focusIn {}
+ protected method _forward {}
+ protected method _keyPress {char sym state}
+ protected method _lastDay {month year}
+ protected method _moveField {direction}
+ protected method _setField {field}
+ protected method _whichField {}
+
+ protected variable _cfield "month"
+ protected variable _fields {month day year}
+}
+
+
+#
+# Provide a lowercased access method for the datefield class.
+#
+proc ::iwidgets::datefield {pathName args} {
+ uplevel ::iwidgets::Datefield $pathName $args
+}
+
+#
+# Use option database to override default resources of base classes.
+#
+option add *Datefield.justify center widgetDefault
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Datefield::constructor {args} {
+ component hull configure -borderwidth 0
+
+ #
+ # Create an entry field for entering the date.
+ #
+ itk_component add date {
+ entry $itk_interior.date -width 10
+ } {
+ keep -borderwidth -cursor -exportselection \
+ -foreground -highlightcolor -highlightthickness \
+ -insertbackground -justify -relief -state
+
+ rename -font -textfont textFont Font
+ rename -highlightbackground -background background Background
+ rename -background -textbackground textBackground Background
+ }
+
+ #
+ # Create the child site widget.
+ #
+ itk_component add -protected dfchildsite {
+ frame $itk_interior.dfchildsite
+ }
+ set itk_interior $itk_component(dfchildsite)
+
+ #
+ # Add datefield event bindings for focus in and keypress events.
+ #
+ bind $itk_component(date) <FocusIn> [itcl::code $this _focusIn]
+ bind $itk_component(date) <KeyPress> [itcl::code $this _keyPress %A %K %s]
+
+ #
+ # Disable some mouse button event bindings:
+ # Button Motion
+ # Double-Clicks
+ # Triple-Clicks
+ # Button2
+ #
+ bind $itk_component(date) <Button1-Motion> break
+ bind $itk_component(date) <Button2-Motion> break
+ bind $itk_component(date) <Double-Button> break
+ bind $itk_component(date) <Triple-Button> break
+ bind $itk_component(date) <2> break
+
+ #
+ # Initialize the widget based on the command line options.
+ #
+ eval itk_initialize $args
+
+ #
+ # Initialize the date to the current date.
+ #
+ $itk_component(date) delete 0 end
+
+ show now
+}
+
+# ------------------------------------------------------------------
+# OPTIONS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# OPTION: -childsitepos
+#
+# Specifies the position of the child site in the widget. Valid
+# locations are n, s, e, and w.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Datefield::childsitepos {
+ set parent [winfo parent $itk_component(date)]
+
+ switch $itk_option(-childsitepos) {
+ n {
+ grid $itk_component(dfchildsite) -row 0 -column 0 -sticky ew
+ grid $itk_component(date) -row 1 -column 0 -sticky nsew
+
+ grid rowconfigure $parent 0 -weight 0
+ grid rowconfigure $parent 1 -weight 1
+ grid columnconfigure $parent 0 -weight 1
+ grid columnconfigure $parent 1 -weight 0
+ }
+
+ e {
+ grid $itk_component(dfchildsite) -row 0 -column 1 -sticky ns
+ grid $itk_component(date) -row 0 -column 0 -sticky nsew
+
+ grid rowconfigure $parent 0 -weight 1
+ grid rowconfigure $parent 1 -weight 0
+ grid columnconfigure $parent 0 -weight 1
+ grid columnconfigure $parent 1 -weight 0
+ }
+
+ s {
+ grid $itk_component(dfchildsite) -row 1 -column 0 -sticky ew
+ grid $itk_component(date) -row 0 -column 0 -sticky nsew
+
+ grid rowconfigure $parent 0 -weight 1
+ grid rowconfigure $parent 1 -weight 0
+ grid columnconfigure $parent 0 -weight 1
+ grid columnconfigure $parent 1 -weight 0
+ }
+
+ w {
+ grid $itk_component(dfchildsite) -row 0 -column 0 -sticky ns
+ grid $itk_component(date) -row 0 -column 1 -sticky nsew
+
+ grid rowconfigure $parent 0 -weight 1
+ grid rowconfigure $parent 1 -weight 0
+ grid columnconfigure $parent 0 -weight 0
+ grid columnconfigure $parent 1 -weight 1
+ }
+
+ default {
+ error "bad childsite option\
+ \"$itk_option(-childsitepos)\":\
+ should be n, e, s, or w"
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -command
+#
+# Command invoked upon detection of return key press event.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Datefield::command {}
+
+# ------------------------------------------------------------------
+# OPTION: -iq
+#
+# Specifies the level of intelligence to be shown in the actions
+# taken by the date field during the processing of keypress events.
+# Valid settings include high, average, and low. With a high iq,
+# the date prevents the user from typing in an invalid date. For
+# example, if the current date is 05/31/1997 and the user changes
+# the month to 04, then the day will be instantly modified for them
+# to be 30. In addition, leap years are fully taken into account.
+# With average iq, the month is limited to the values of 01-12, but
+# it is possible to type in an invalid day. A setting of low iq
+# instructs the widget to do no validity checking at all during
+# date entry. With both average and low iq levels, it is assumed
+# that the validity will be determined at a later time using the
+# date's isvalid command.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Datefield::iq {
+ switch $itk_option(-iq) {
+ high - average - low {
+ }
+ default {
+ error "bad iq option \"$itk_option(-iq)\":\
+ should be high, average or low"
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -int
+#
+# Added by Mark Alston 2001/10/21
+#
+# Allows for the use of dates in "international" format: YYYY-MM-DD.
+# It must be a boolean value.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Datefield::int {
+ switch $itk_option(-int) {
+ 1 - yes - true - on {
+ set _cfield "year"
+ set _fields {year month day}
+ }
+ 0 - no - false - off { }
+ default {
+ error "bad int option \"$itk_option(-int)\": should be boolean"
+ }
+ }
+ show [get]
+}
+
+# ------------------------------------------------------------------
+# OPTION: -gmt
+#
+# This option is used for GMT time. Must be a boolean value.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Datefield::gmt {
+ switch $itk_option(-gmt) {
+ 0 - no - false - off { }
+ 1 - yes - true - on { }
+ default {
+ error "bad gmt option \"$itk_option(-gmt)\": should be boolean"
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# METHODS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# PUBLIC METHOD: get ?format?
+#
+# Return the current contents of the datefield in one of two formats
+# string or as an integer clock value using the -string and -clicks
+# options respectively. The default is by string. Reference the
+# clock command for more information on obtaining dates and their
+# formats.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Datefield::get {{format "-string"}} {
+ set datestr [$itk_component(date) get]
+
+ switch -- $format {
+ "-string" {
+ return $datestr
+ }
+ "-clicks" {
+ return [clock scan $datestr]
+ }
+ default {
+ error "bad format option \"$format\":\
+ should be -string or -clicks"
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# PUBLIC METHOD: show date
+#
+# Changes the currently displayed date to be that of the date
+# argument. The date may be specified either as a string or an
+# integer clock value. Reference the clock command for more
+# information on obtaining dates and their formats.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Datefield::show {{date "now"}} {
+ $itk_component(date) delete 0 end
+ if {$itk_option(-int)} {
+ set format {%Y-%m-%d}
+ } else {
+ set format {%m/%d/%Y}
+ }
+
+ if {$date == "now"} {
+ set seconds [::clock seconds]
+ $itk_component(date) insert end \
+ [clock format $seconds -format "$format" -gmt $itk_option(-gmt)]
+
+ } elseif { $itk_option(-iq) != "low" } {
+ if {[catch {::clock format $date}] == 0} {
+ set seconds $date
+ } elseif {[catch {set seconds [::clock scan $date -gmt \
+ $itk_option(-gmt)]}] != 0} {
+ error "bad date: \"$date\", must be a valid date\
+ string, clock clicks value or the keyword now"
+ }
+ $itk_component(date) insert end \
+ [clock format $seconds -format "$format" -gmt $itk_option(-gmt)]
+ } else {
+ # Note that it doesn't matter what -int is set to.
+ $itk_component(date) insert end $date
+ }
+
+ if {$itk_option(-int)} {
+ _setField year
+ } else {
+ _setField month
+ }
+
+ return
+}
+
+# ------------------------------------------------------------------
+# PUBLIC METHOD: isvalid
+#
+# Returns a boolean indication of the validity of the currently
+# displayed date value. For example, 3/3/1960 is valid whereas
+# 02/29/1997 is invalid.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Datefield::isvalid {} {
+ if {[catch {clock scan [$itk_component(date) get]}] != 0} {
+ return 0
+ } else {
+ return 1
+ }
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _focusIn
+#
+# This method is bound to the <FocusIn> event. It resets the
+# insert cursor and field settings to be back to their last known
+# positions.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Datefield::_focusIn {} {
+ _setField $_cfield
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _keyPress
+#
+# This method is the workhorse of the class. It is bound to the
+# <KeyPress> event and controls the processing of all key strokes.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Datefield::_keyPress {char sym state} {
+ #
+ # Determine which field we are in currently. This is needed
+ # since the user may have moved to this position via a mouse
+ # selection and so it would not be in the position we last
+ # knew it to be.
+ #
+ _whichField
+
+ #
+ # If we are using an international date the split char is "-"
+ # otherwise it is "/".
+ #
+ if {$itk_option(-int)} {
+ set split_char "-"
+ } else {
+ set split_char "/"
+ }
+
+
+ #
+ # Set up a few basic variables we'll be needing throughout the
+ # rest of the method such as the position of the insert cursor
+ # and the currently displayed day, month, and year.
+ #
+ set icursor [$itk_component(date) index insert]
+ set splist [split [$itk_component(date) get] "$split_char"]
+
+
+ # A bunch of added variables to allow for the use of int dates
+ if {$itk_option(-int)} {
+ set order {year month day}
+ set year [lindex $splist 0]
+ set month [lindex $splist 1]
+ set day [lindex $splist 2]
+ set year_start_pos 0
+ set year_second_pos 1
+ set year_third_pos 2
+ set year_fourth_pos 3
+ set year_end_pos 4
+ set month_start_pos 5
+ set month_second_pos 6
+ set month_end_pos 7
+ set day_start_pos 8
+ set day_second_pos 9
+ set day_end_pos 10
+ } else {
+ set order {month day year}
+ set month [lindex $splist 0]
+ set day [lindex $splist 1]
+ set year [lindex $splist 2]
+ set month_start_pos 0
+ set month_second_pos 1
+ set month_end_pos 2
+ set day_start_pos 3
+ set day_second_pos 4
+ set day_end_pos 5
+ set year_start_pos 6
+ set year_second_pos 7
+ set year_third_pos 8
+ set year_fourth_pos 9
+ set year_end_pos 10
+ }
+
+
+ #
+ # Process numeric keystrokes. This involes a fair amount of
+ # processing with step one being to check and make sure we
+ # aren't attempting to insert more that 10 characters. If
+ # so ring the bell and break.
+ #
+ if {[regexp {[0-9]} $char]} {
+ if {[$itk_component(date) index insert] == 10} {
+ bell
+ return -code break
+ }
+
+ #
+ # If we are currently in the month field then we process the
+ # number entered based on the cursor position. If we are at
+ # at the first position and our iq is low, then accept any
+ # input.
+ #
+ if {$_cfield == "month"} {
+
+ if {[$itk_component(date) index insert] == $month_start_pos} {
+ if {$itk_option(-iq) == "low"} {
+ $itk_component(date) delete $month_start_pos
+ $itk_component(date) insert $month_start_pos $char
+ } else {
+ #
+ # Otherwise, we're slightly smarter. If the number
+ # is less than two insert it at position zero. If
+ # this makes the month greater than twelve, set the
+ # number at position one to zero which makes in
+ # effect puts the month back in range.
+ #
+ regsub {([0-9])([0-9])} $month "$char\\2" month2b
+
+ if {$char < 2} {
+ $itk_component(date) delete $month_start_pos
+ $itk_component(date) insert $month_start_pos $char
+
+ if {$month2b > 12} {
+ $itk_component(date) delete $month_second_pos
+ $itk_component(date) insert $month_second_pos 0
+ $itk_component(date) icursor $month_second_pos
+ } elseif {$month2b == "00"} {
+ $itk_component(date) delete $month_second_pos
+ $itk_component(date) insert $month_second_pos 1
+ $itk_component(date) icursor $month_second_pos
+ }
+
+ #
+ # Finally, if the number is greater than one we'll
+ # assume that they really mean to be entering a zero
+ # followed by their number, do so for them, and
+ # proceed to skip to the next field which is the
+ # day field.
+ #
+ } else {
+ $itk_component(date) delete $month_start_pos $month_end_pos
+ $itk_component(date) insert $month_start_pos 0$char
+ _setField day
+ }
+ }
+
+ #
+ # Else, we're at the second month position. Again, if we aren't
+ # too smart, let them enter anything. Otherwise, if the
+ # number makes the month exceed twelve, set the month to
+ # zero followed by their number to get it back into range.
+ #
+ } else {
+ regsub {([0-9])([0-9])} $month "\\1$char" month2b
+
+ if {$itk_option(-iq) == "low"} {
+ $itk_component(date) delete $month_second_pos
+ $itk_component(date) insert $month_second_pos $char
+ } else {
+ if {$month2b > 12} {
+ $itk_component(date) delete $month_start_pos $month_end_pos
+ $itk_component(date) insert $month_start_pos 0$char
+ } elseif {$month2b == "00"} {
+ bell
+ return -code break
+ } else {
+ $itk_component(date) delete $month_second_pos
+ $itk_component(date) insert $month_second_pos $char
+ }
+ }
+ _setField day
+ }
+
+ #
+ # Now, the month processing is complete and if we're of a
+ # high level of intelligence, then we'll make sure that the
+ # current value for the day is valid for this month. If
+ # it is beyond the last day for this month, change it to
+ # be the last day of the new month.
+ #
+ if {$itk_option(-iq) == "high"} {
+ set splist [split [$itk_component(date) get] "$split_char"]
+ set month [lindex $splist [lsearch $order month]]
+ if {$day > [set endday [_lastDay $month $year]]} {
+ set icursor [$itk_component(date) index insert]
+ $itk_component(date) delete $day_start_pos $day_end_pos
+ $itk_component(date) insert $day_start_pos $endday
+ $itk_component(date) icursor $icursor
+ }
+ }
+
+ #
+ # Finally, return with a code of break to stop any normal
+ # processing in that we've done all that is necessary.
+ #
+ return -code break
+ }
+
+ #
+ # This next block of code is for processing of the day field
+ # which is quite similar is strategy to that of the month.
+ #
+ if {$_cfield == "day"} {
+ if {$itk_option(-iq) == "high"} {
+ set endofMonth [_lastDay $month $year]
+ } else {
+ set endofMonth 31
+ }
+
+ #
+ # If we are at the first cursor position for the day
+ # we are processing
+ # the first character of the day field. If we have an iq
+ # of low accept any input.
+ #
+ if {[$itk_component(date) index insert] == $day_start_pos} {
+ if {$itk_option(-iq) == "low"} {
+ $itk_component(date) delete $day_start_pos
+ $itk_component(date) insert $day_start_pos $char
+
+ } else {
+
+ #
+ # If the day to be is double zero, then make the
+ # day be the first.
+ #
+ regsub {([0-9])([0-9])} $day "$char\\2" day2b
+
+ if {$day2b == "00"} {
+ $itk_component(date) delete $day_start_pos $day_end_pos
+ $itk_component(date) insert $day_start_pos 01
+ $itk_component(date) icursor $day_second_pos
+ #
+ # Otherwise, if the character is less than four
+ # and the month is not Feburary, insert the number
+ # and if this makes the day be beyond the valid
+ # range for this month, than set to be back in
+ # range.
+ #
+ } elseif {($char < 4) && ($month != "02")} {
+ $itk_component(date) delete $day_start_pos
+ $itk_component(date) insert $day_start_pos $char
+
+ if {$day2b > $endofMonth} {
+ $itk_component(date) delete $day_second_pos
+ $itk_component(date) insert $day_second_pos 0
+ $itk_component(date) icursor $day_second_pos
+ }
+
+ #
+ # For Feburary with a number to be entered of
+ # less than three, make sure the number doesn't
+ # make the day be greater than the correct range
+ # and if so adjust the input.
+ #
+ } elseif {$char < 3} {
+ $itk_component(date) delete $day_start_pos
+ $itk_component(date) insert $day_start_pos $char
+ if {$day2b > $endofMonth} {
+ $itk_component(date) delete $day_start_pos $day_end_pos
+ $itk_component(date) insert $day_start_pos $endofMonth
+ $itk_component(date) icursor $day_second_pos
+ }
+
+ #
+ # Finally, if the number is greater than three,
+ # set the day to be zero followed by the number
+ # entered and proceed to the year field or end.
+ #
+ } else {
+ $itk_component(date) delete $day_start_pos $day_end_pos
+ $itk_component(date) insert $day_start_pos 0$char
+ $itk_component(date) icursor $day_end_pos
+ if {!$itk_option(-int)} {
+ _setField year
+ }
+ }
+ }
+ #
+ # Else, we're dealing with the second number in the day
+ # field. If we're not too bright accept anything, otherwise
+ # if the day is beyond the range for this month or equal to
+ # zero then ring the bell.
+ #
+ } else {
+ regsub {([0-9])([0-9])} $day "\\1$char" day2b
+
+ if {($itk_option(-iq) != "low") && \
+ (($day2b > $endofMonth) || ($day2b == "00"))} {
+ bell
+ } else {
+ $itk_component(date) delete $day_second_pos
+ $itk_component(date) insert $day_second_pos $char
+ $itk_component(date) icursor $day_end_pos
+ if {!$itk_option(-int)} {
+ _setField year
+ }
+ }
+ }
+
+ #
+ # Return with a code of break to prevent normal processing.
+ #
+ return -code break
+ }
+
+ #
+ # This month and day we're tough, the code for the year is
+ # comparitively simple. Accept any input and if we are really
+ # sharp, then make sure the day is correct for the month
+ # given the year. In short, handle leap years.
+ #
+ if {$_cfield == "year"} {
+ if {$itk_option(-iq) == "low"} {
+ $itk_component(date) delete $icursor
+ $itk_component(date) insert $icursor $char
+ } else {
+ set prevdate [get]
+ if {[$itk_component(date) index insert] == $year_start_pos} {
+ set yrdgt [lindex [split [lindex \
+ [split $prevdate "$split_char"] [lsearch $order year]] ""] 0]
+ if {$char != $yrdgt} {
+ if {$char == 1} {
+ $itk_component(date) delete $icursor $year_end_pos
+ $itk_component(date) insert $icursor 1999
+ } elseif {$char == 2} {
+ $itk_component(date) delete $icursor $year_end_pos
+ $itk_component(date) insert $icursor 2000
+ } else {
+ bell
+ return -code break
+ }
+ }
+
+ $itk_component(date) icursor $year_second_pos
+ return -code break
+ }
+
+ $itk_component(date) delete $icursor
+ $itk_component(date) insert $icursor $char
+
+
+ if {[catch {clock scan [get]}] != 0} {
+ $itk_component(date) delete $year_start_pos $year_end_pos
+ $itk_component(date) insert $year_start_pos \
+ [lindex [split $prevdate "$split_char"] [lsearch $order year]]
+ $itk_component(date) icursor $icursor
+
+ bell
+ return -code break
+ }
+
+ if {$itk_option(-iq) == "high"} {
+ set splist [split [$itk_component(date) get] "$split_char"]
+ set year [lindex $splist [lsearch $order year]]
+
+ if {$day > [set endday [_lastDay $month $year]]} {
+ set icursor [$itk_component(date) index insert]
+ $itk_component(date) delete $day_start_pos $day_end_pos
+ $itk_component(date) insert $day_start_pos $endday
+ $itk_component(date) icursor $icursor
+ }
+ }
+ }
+ if {$itk_option(-int)} {
+ if {$icursor == $year_fourth_pos } {
+ _setField month
+ }
+ }
+ return -code break
+ }
+
+ #
+ # Process the plus and the up arrow keys. They both yeild the same
+ # effect, they increment the day by one.
+ #
+ } elseif {($sym == "plus") || ($sym == "Up")} {
+ if {[catch {show [clock scan "1 day" -base [get -clicks]]}] != 0} {
+ bell
+ }
+ return -code break
+
+ #
+ # Process the minus and the down arrow keys which decrement the day.
+ #
+ } elseif {($sym == "minus") || ($sym == "Down")} {
+ if {[catch {show [clock scan "-1 day" -base [get -clicks]]}] != 0} {
+ bell
+ }
+ return -code break
+
+ #
+ # A tab key moves the day/month/year (or year/month/day) field
+ # forward by one unless
+ # the current field is the last field. In that case we'll let tab
+ # do what is supposed to and pass the focus onto the next widget.
+ #
+ } elseif {($sym == "Tab") && ($state == 0)} {
+ if {$_cfield != "[lindex $order 2]"} {
+ _moveField forward
+ return -code break
+ } else {
+ _setField "[lindex $order 0]"
+ return -code continue
+ }
+
+ #
+ # A ctrl-tab key moves the day/month/year field backwards by one
+ # unless the current field is the the first field. In that case we'll
+ # let tab take the focus to a previous widget.
+ #
+ } elseif {($sym == "Tab") && ($state == 4)} {
+ if {$_cfield != "[lindex $order 0]"} {
+ _moveField backward
+ return -code break
+ } else {
+ set _cfield "[lindex $order 0]"
+ return -code continue
+ }
+
+ #
+ # A right arrow key moves the insert cursor to the right one.
+ #
+ } elseif {$sym == "Right"} {
+ _forward
+ return -code break
+
+ #
+ # A left arrow, backspace, or delete key moves the insert cursor
+ # to the left one. This is what you expect for the left arrow
+ # and since the whole widget always operates in overstrike mode,
+ # it makes the most sense for backspace and delete to do the same.
+ #
+ } elseif {$sym == "Left" || $sym == "BackSpace" || $sym == "Delete"} {
+ _backward
+ return -code break
+
+ } elseif {($sym == "Control_L") || ($sym == "Shift_L") || \
+ ($sym == "Control_R") || ($sym == "Shift_R")} {
+ return -code break
+
+ #
+ # A Return key invokes the optionally specified command option.
+ #
+ } elseif {$sym == "Return"} {
+ uplevel #0 $itk_option(-command)
+ return -code break
+ } else {
+ bell
+ return -code break
+ }
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _setField field
+#
+# Internal method which adjusts the field to be that of the
+# argument, setting the insert cursor appropriately.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Datefield::_setField {field} {
+ set _cfield $field
+
+ if {$itk_option(-int)} {
+ set year_pos 2
+ set month_pos 5
+ set day_pos 8
+ } else {
+ set month_pos 0
+ set day_pos 3
+ set year_pos 8
+ }
+
+
+ switch $field {
+ "month" {
+ $itk_component(date) icursor $month_pos
+ }
+ "day" {
+ $itk_component(date) icursor $day_pos
+ }
+ "year" {
+ $itk_component(date) icursor $year_pos
+ }
+ default {
+ error "bad field: \"$field\", must be month, day or year"
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _moveField
+#
+# Internal method for moving the field forward or backward by one.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Datefield::_moveField {direction} {
+
+ set index [lsearch $_fields $_cfield]
+
+ if {$direction == "forward"} {
+ set newIndex [expr {$index + 1}]
+ } else {
+ set newIndex [expr {$index - 1}]
+ }
+
+ if {$newIndex == [llength $_fields]} {
+ set newIndex 0
+ }
+ if {$newIndex < 0} {
+ set newIndex [expr {[llength $_fields] - 1}]
+ }
+
+ _setField [lindex $_fields $newIndex]
+
+ return
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _whichField
+#
+# Internal method which returns the current field that the cursor
+# is currently within.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Datefield::_whichField {} {
+ set icursor [$itk_component(date) index insert]
+
+ if {$itk_option(-int)} {
+ switch $icursor {
+ 0 - 1 - 2 - 3 {
+ set _cfield "year"
+ }
+ 5 - 6 {
+ set _cfield "month"
+ }
+ 8 - 9 {
+ set _cfield "day"
+ }
+ }
+ } else {
+ switch $icursor {
+ 0 - 1 {
+ set _cfield "month"
+ }
+ 3 - 4 {
+ set _cfield "day"
+ }
+ 6 - 7 - 8 - 9 {
+ set _cfield "year"
+ }
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _forward
+#
+# Internal method which moves the cursor forward by one character
+# jumping over the slashes and wrapping.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Datefield::_forward {} {
+ set icursor [$itk_component(date) index insert]
+
+ if {$itk_option(-int)} {
+ switch $icursor {
+ 3 {
+ _setField month
+ }
+ 6 {
+ _setField day
+ }
+ 9 - 10 {
+ _setField year
+ }
+ default {
+ $itk_component(date) icursor [expr {$icursor + 1}]
+ }
+ }
+ } else {
+ switch $icursor {
+ 1 {
+ _setField day
+ }
+ 4 {
+ _setField year
+ }
+ 9 - 10 {
+ _setField month
+ }
+ default {
+ $itk_component(date) icursor [expr {$icursor + 1}]
+ }
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _backward
+#
+# Internal method which moves the cursor backward by one character
+# jumping over the slashes and wrapping.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Datefield::_backward {} {
+ set icursor [$itk_component(date) index insert]
+ if {$itk_option(-int)} {
+ switch $icursor {
+ 8 {
+ _setField month
+ }
+ 5 {
+ _setField year
+ }
+ 0 {
+ _setField day
+ }
+ default {
+ $itk_component(date) icursor [expr {$icursor -1}]
+ }
+ }
+ } else {
+ switch $icursor {
+ 6 {
+ _setField day
+ }
+ 3 {
+ _setField month
+ }
+ 0 {
+ _setField year
+ }
+ default {
+ $itk_component(date) icursor [expr {$icursor -1}]
+ }
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _lastDay month year
+#
+# Internal method which determines the last day of the month for
+# the given month and year. We start at 28 and go forward till
+# we fail. Crude but effective.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Datefield::_lastDay {month year} {
+ set lastone 28
+
+ for {set lastone 28} {$lastone < 32} {incr lastone} {
+ set nextone [expr $lastone + 1]
+ if {[catch {clock scan $month/$nextone/$year}] != 0} {
+ return $lastone
+ }
+ }
+}
diff --git a/iwidgets/generic/dialog.itk b/iwidgets/generic/dialog.itk
new file mode 100644
index 00000000000..667d46d1924
--- /dev/null
+++ b/iwidgets/generic/dialog.itk
@@ -0,0 +1,92 @@
+#
+# Dialog
+# ----------------------------------------------------------------------
+# Implements a standard dialog box providing standard buttons and a
+# child site for use in derived classes. The buttons include ok, apply,
+# cancel, and help. Options exist to configure the buttons.
+#
+# ----------------------------------------------------------------------
+# AUTHOR: Mark L. Ulferts EMAIL: mulferts@austin.dsccc.com
+#
+# @(#) $Id$
+# ----------------------------------------------------------------------
+# Copyright (c) 1995 DSC Technologies Corporation
+# ======================================================================
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+
+#
+# Usual options.
+#
+itk::usual Dialog {
+ keep -background -cursor -foreground -modality
+}
+
+# ------------------------------------------------------------------
+# DIALOG
+# ------------------------------------------------------------------
+itcl::class iwidgets::Dialog {
+ inherit iwidgets::Dialogshell
+
+ constructor {args} {}
+}
+
+#
+# Provide a lowercased access method for the Dialog class.
+#
+proc ::iwidgets::dialog {pathName args} {
+ uplevel ::iwidgets::Dialog $pathName $args
+}
+
+#
+# Use option database to override default resources of base classes.
+#
+option add *Dialog.master "." widgetDefault
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Dialog::constructor {args} {
+ #
+ # Add the standard buttons: OK, Apply, Cancel, and Help, making
+ # OK be the default button.
+ #
+ add OK -text OK -command [itcl::code $this deactivate 1]
+ add Apply -text Apply
+ add Cancel -text Cancel -command [itcl::code $this deactivate 0]
+ add Help -text Help
+
+ default OK
+
+ #
+ # Bind the window manager delete protocol to invocation of the
+ # cancel button. This can be overridden by the user via the
+ # execution of a similar command outside the class.
+ #
+ wm protocol $itk_component(hull) WM_DELETE_WINDOW \
+ [itcl::code $this invoke Cancel]
+
+ #
+ # Initialize the widget based on the command line options.
+ #
+ eval itk_initialize $args
+}
+
diff --git a/iwidgets/generic/dialogshell.itk b/iwidgets/generic/dialogshell.itk
new file mode 100644
index 00000000000..7284b354db3
--- /dev/null
+++ b/iwidgets/generic/dialogshell.itk
@@ -0,0 +1,350 @@
+# Dialogshell
+# ----------------------------------------------------------------------
+# This class is implements a dialog shell which is a top level widget
+# composed of a button box, separator, and child site area. The class
+# also has methods to control button construction.
+#
+# ----------------------------------------------------------------------
+# AUTHOR: Mark L. Ulferts EMAIL: mulferts@austin.dsccc.com
+#
+# @(#) $Id$
+# ----------------------------------------------------------------------
+# Copyright (c) 1995 DSC Technologies Corporation
+# ======================================================================
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+
+#
+# Usual options.
+#
+itk::usual Dialogshell {
+ keep -background -cursor -foreground -modality
+}
+
+# ------------------------------------------------------------------
+# DIALOGSHELL
+# ------------------------------------------------------------------
+itcl::class iwidgets::Dialogshell {
+ inherit iwidgets::Shell
+
+ constructor {args} {}
+
+ itk_option define -thickness thickness Thickness 3
+ itk_option define -buttonboxpos buttonBoxPos Position s
+ itk_option define -separator separator Separator on
+ itk_option define -padx padX Pad 10
+ itk_option define -pady padY Pad 10
+
+ public method childsite {}
+ public method index {args}
+ public method add {args}
+ public method insert {args}
+ public method delete {args}
+ public method hide {args}
+ public method show {args}
+ public method default {args}
+ public method invoke {args}
+ public method buttonconfigure {args}
+ public method buttoncget {index option}
+}
+
+#
+# Provide a lowercased access method for the Dialogshell class.
+#
+proc ::iwidgets::dialogshell {pathName args} {
+ uplevel ::iwidgets::Dialogshell $pathName $args
+}
+
+#
+# Use option database to override default resources of base classes.
+#
+option add *Dialogshell.master "." widgetDefault
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Dialogshell::constructor {args} {
+ itk_option remove iwidgets::Shell::padx iwidgets::Shell::pady
+
+ #
+ # Create the user child site, separator, and button box,
+ #
+ itk_component add -protected dschildsite {
+ frame $itk_interior.dschildsite
+ }
+
+ itk_component add separator {
+ frame $itk_interior.separator -relief sunken
+ }
+
+ itk_component add bbox {
+ iwidgets::Buttonbox $itk_interior.bbox
+ } {
+ usual
+
+ rename -padx -buttonboxpadx buttonBoxPadX Pad
+ rename -pady -buttonboxpady buttonBoxPadY Pad
+ }
+
+ #
+ # Set the itk_interior variable to be the childsite for derived
+ # classes.
+ #
+ set itk_interior $itk_component(dschildsite)
+
+ #
+ # Set up the default button so that if <Return> is pressed in
+ # any widget, it will invoke the default button.
+ #
+ bind $itk_component(hull) <Return> [itcl::code $this invoke]
+
+ #
+ # Initialize the widget based on the command line options.
+ #
+ eval itk_initialize $args
+}
+
+# ------------------------------------------------------------------
+# OPTIONS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# OPTION: -thickness
+#
+# Specifies the thickness of the separator. It sets the width and
+# height of the separator to the thickness value and the borderwidth
+# to half the thickness.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Dialogshell::thickness {
+ $itk_component(separator) config -height $itk_option(-thickness)
+ $itk_component(separator) config -width $itk_option(-thickness)
+ $itk_component(separator) config \
+ -borderwidth [expr {$itk_option(-thickness) / 2}]
+}
+
+# ------------------------------------------------------------------
+# OPTION: -buttonboxpos
+#
+# Specifies the position of the button box relative to the child site.
+# The separator appears between the child site and button box.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Dialogshell::buttonboxpos {
+ set parent [winfo parent $itk_component(bbox)]
+
+ switch $itk_option(-buttonboxpos) {
+ n {
+ $itk_component(bbox) configure -orient horizontal
+
+ grid $itk_component(bbox) -row 0 -column 0 -sticky ew
+ grid $itk_component(separator) -row 1 -column 0 -sticky ew
+ grid $itk_component(dschildsite) -row 2 -column 0 -sticky nsew
+
+ grid rowconfigure $parent 0 -weight 0
+ grid rowconfigure $parent 1 -weight 0
+ grid rowconfigure $parent 2 -weight 1
+ grid columnconfigure $parent 0 -weight 1
+ grid columnconfigure $parent 1 -weight 0
+ grid columnconfigure $parent 2 -weight 0
+ }
+ s {
+ $itk_component(bbox) configure -orient horizontal
+
+ grid $itk_component(dschildsite) -row 0 -column 0 -sticky nsew
+ grid $itk_component(separator) -row 1 -column 0 -sticky ew
+ grid $itk_component(bbox) -row 2 -column 0 -sticky ew
+
+ grid rowconfigure $parent 0 -weight 1
+ grid rowconfigure $parent 1 -weight 0
+ grid rowconfigure $parent 2 -weight 0
+ grid columnconfigure $parent 0 -weight 1
+ grid columnconfigure $parent 1 -weight 0
+ grid columnconfigure $parent 2 -weight 0
+ }
+ w {
+ $itk_component(bbox) configure -orient vertical
+
+ grid $itk_component(bbox) -row 0 -column 0 -sticky ns
+ grid $itk_component(separator) -row 0 -column 1 -sticky ns
+ grid $itk_component(dschildsite) -row 0 -column 2 -sticky nsew
+
+ grid rowconfigure $parent 0 -weight 1
+ grid rowconfigure $parent 1 -weight 0
+ grid rowconfigure $parent 2 -weight 0
+ grid columnconfigure $parent 0 -weight 0
+ grid columnconfigure $parent 1 -weight 0
+ grid columnconfigure $parent 2 -weight 1
+ }
+ e {
+ $itk_component(bbox) configure -orient vertical
+
+ grid $itk_component(dschildsite) -row 0 -column 0 -sticky nsew
+ grid $itk_component(separator) -row 0 -column 1 -sticky ns
+ grid $itk_component(bbox) -row 0 -column 2 -sticky ns
+
+ grid rowconfigure $parent 0 -weight 1
+ grid rowconfigure $parent 1 -weight 0
+ grid rowconfigure $parent 2 -weight 0
+ grid columnconfigure $parent 0 -weight 1
+ grid columnconfigure $parent 1 -weight 0
+ grid columnconfigure $parent 2 -weight 0
+ }
+ default {
+ error "bad buttonboxpos option\
+ \"$itk_option(-buttonboxpos)\": should be n,\
+ s, e, or w"
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -separator
+#
+# Boolean option indicating wheather to display the separator.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Dialogshell::separator {
+ if {$itk_option(-separator)} {
+ $itk_component(separator) configure -relief sunken
+ } else {
+ $itk_component(separator) configure -relief flat
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -padx
+#
+# Specifies a padding distance for the childsite in the X-direction.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Dialogshell::padx {
+ grid configure $itk_component(dschildsite) -padx $itk_option(-padx)
+}
+
+# ------------------------------------------------------------------
+# OPTION: -pady
+#
+# Specifies a padding distance for the childsite in the Y-direction.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Dialogshell::pady {
+ grid configure $itk_component(dschildsite) -pady $itk_option(-pady)
+}
+
+# ------------------------------------------------------------------
+# METHODS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# METHOD: childsite
+#
+# Return the pathname of the user accessible area.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Dialogshell::childsite {} {
+ return $itk_component(dschildsite)
+}
+
+# ------------------------------------------------------------------
+# METHOD: index index
+#
+# Thin wrapper of Buttonbox's index method.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Dialogshell::index {args} {
+ uplevel $itk_component(bbox) index $args
+}
+
+# ------------------------------------------------------------------
+# METHOD: add tag ?option value ...?
+#
+# Thin wrapper of Buttonbox's add method.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Dialogshell::add {args} {
+ uplevel $itk_component(bbox) add $args
+}
+
+# ------------------------------------------------------------------
+# METHOD: insert index tag ?option value ...?
+#
+# Thin wrapper of Buttonbox's insert method.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Dialogshell::insert {args} {
+ uplevel $itk_component(bbox) insert $args
+}
+
+# ------------------------------------------------------------------
+# METHOD: delete tag
+#
+# Thin wrapper of Buttonbox's delete method.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Dialogshell::delete {args} {
+ uplevel $itk_component(bbox) delete $args
+}
+
+# ------------------------------------------------------------------
+# METHOD: hide index
+#
+# Thin wrapper of Buttonbox's hide method.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Dialogshell::hide {args} {
+ uplevel $itk_component(bbox) hide $args
+}
+
+# ------------------------------------------------------------------
+# METHOD: show index
+#
+# Thin wrapper of Buttonbox's show method.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Dialogshell::show {args} {
+ uplevel $itk_component(bbox) show $args
+}
+
+# ------------------------------------------------------------------
+# METHOD: default index
+#
+# Thin wrapper of Buttonbox's default method.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Dialogshell::default {args} {
+ uplevel $itk_component(bbox) default $args
+}
+
+# ------------------------------------------------------------------
+# METHOD: invoke ?index?
+#
+# Thin wrapper of Buttonbox's invoke method.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Dialogshell::invoke {args} {
+ uplevel $itk_component(bbox) invoke $args
+}
+
+# ------------------------------------------------------------------
+# METHOD: buttonconfigure index ?option? ?value option value ...?
+#
+# Thin wrapper of Buttonbox's buttonconfigure method.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Dialogshell::buttonconfigure {args} {
+ uplevel $itk_component(bbox) buttonconfigure $args
+}
+
+# ------------------------------------------------------------------
+# METHOD: buttoncget index option
+#
+# Thin wrapper of Buttonbox's buttoncget method.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Dialogshell::buttoncget {index option} {
+ uplevel $itk_component(bbox) buttoncget [list $index] \
+ [list $option]
+}
diff --git a/iwidgets/generic/disjointlistbox.itk b/iwidgets/generic/disjointlistbox.itk
new file mode 100644
index 00000000000..c32331a3f83
--- /dev/null
+++ b/iwidgets/generic/disjointlistbox.itk
@@ -0,0 +1,529 @@
+#
+# ::iwidgets::Disjointlistbox
+# ----------------------------------------------------------------------
+# Implements a widget which maintains a disjoint relationship between
+# the items displayed by two listboxes. The disjointlistbox is composed
+# of 2 Scrolledlistboxes, 2 Pushbuttons, and 2 labels.
+#
+# The disjoint behavior of this widget exists between the two Listboxes,
+# That is, a given instance of a ::iwidgets::Disjointlistbox will never
+# exist which has Listbox widgets with items in common.
+#
+# Users may transfer items between the two Listbox widgets using the
+# the two Pushbuttons.
+#
+# The options include the ability to configure the "items" displayed by
+# either of the two Listboxes and to control the placement of the insertion
+# and removal buttons.
+#
+# The following depicts the allowable "-buttonplacement" option values
+# and their associated layout:
+#
+# "-buttonplacement" => center
+#
+# --------------------------
+# |listbox| |listbox|
+# | |________| |
+# | (LHS) | button | (RHS) |
+# | |========| |
+# | | button | |
+# |_______|--------|_______|
+# | count | | count |
+# --------------------------
+#
+# "-buttonplacement" => bottom
+#
+# ---------------------
+# | listbox | listbox |
+# | (LHS) | (RHS) |
+# |_________|_________|
+# | button | button |
+# |---------|---------|
+# | count | count |
+# ---------------------
+#
+# ----------------------------------------------------------------------
+# AUTHOR: John A. Tucker EMAIL: jatucker@spd.dsccc.com
+#
+# ======================================================================
+
+#
+# Default resources.
+#
+option add *Disjointlistbox.lhsLabelText Available widgetDefault
+option add *Disjointlistbox.rhsLabelText Current widgetDefault
+option add *Disjointlistbox.lhsButtonLabel {Insert >>} widgetDefault
+option add *Disjointlistbox.rhsButtonLabel {<< Remove} widgetDefault
+option add *Disjointlistbox.vscrollMode static widgetDefault
+option add *Disjointlistbox.hscrollMode static widgetDefault
+option add *Disjointlistbox.selectMode multiple widgetDefault
+option add *Disjointlistbox.labelPos nw widgetDefault
+option add *Disjointlistbox.buttonPlacement bottom widgetDefault
+option add *Disjointlistbox.lhsSortOption increasing widgetDefault
+option add *Disjointlistbox.rhsSortOption increasing widgetDefault
+
+
+#
+# Usual options.
+#
+itk::usual Disjointlistbox {
+ keep -background -textbackground -cursor \
+ -foreground -textfont -labelfont
+}
+
+
+# ----------------------------------------------------------------------
+# ::iwidgets::Disjointlistbox
+# ----------------------------------------------------------------------
+itcl::class ::iwidgets::Disjointlistbox {
+
+ inherit itk::Widget
+
+ #
+ # options
+ #
+ itk_option define -buttonplacement buttonPlacement ButtonPlacement bottom
+ itk_option define -lhsbuttonlabel lhsButtonLabel LabelText {Insert >>}
+ itk_option define -rhsbuttonlabel rhsButtonLabel LabelText {<< Remove}
+ itk_option define -lhssortoption lhsSortOption LhsSortOption increasing
+ itk_option define -rhssortoption rhsSortOption RhsSortOption increasing
+
+ constructor {args} {}
+
+ #
+ # PUBLIC
+ #
+ public {
+ method clear {}
+ method getlhs {{first 0} {last end}}
+ method getrhs {{first 0} {last end}}
+ method lhs {args}
+ method insertlhs {items}
+ method insertrhs {items}
+ method setlhs {items}
+ method setrhs {items}
+ method rhs {args}
+ }
+
+ #
+ # PROTECTED
+ #
+ protected {
+ method insert {theListbox items}
+ method listboxClick {clickSide otherSide}
+ method listboxDblClick {clickSide otherSide}
+ method remove {theListbox items}
+ method showCount {}
+ method transfer {}
+
+ variable sourceListbox {}
+ variable destinationListbox {}
+ }
+}
+
+#
+# Provide a lowercased access method for the ::iwidgets::Disjointlistbox class.
+#
+proc ::iwidgets::disjointlistbox {pathName args} {
+ uplevel ::iwidgets::Disjointlistbox $pathName $args
+}
+
+# ------------------------------------------------------------------
+#
+# Method: Constructor
+#
+# Purpose:
+#
+itcl::body ::iwidgets::Disjointlistbox::constructor {args} {
+ #
+ # Create the left-most Listbox
+ #
+ itk_component add lhs {
+ iwidgets::Scrolledlistbox $itk_interior.lhs \
+ -selectioncommand [itcl::code $this listboxClick lhs rhs] \
+ -dblclickcommand [itcl::code $this listboxDblClick lhs rhs]
+ } {
+ usual
+ keep -selectmode -vscrollmode -hscrollmode
+ rename -labeltext -lhslabeltext lhsLabelText LabelText
+ }
+
+ #
+ # Create the right-most Listbox
+ #
+ itk_component add rhs {
+ iwidgets::Scrolledlistbox $itk_interior.rhs \
+ -selectioncommand [itcl::code $this listboxClick rhs lhs] \
+ -dblclickcommand [itcl::code $this listboxDblClick rhs lhs]
+ } {
+ usual
+ keep -selectmode -vscrollmode -hscrollmode
+ rename -labeltext -rhslabeltext rhsLabelText LabelText
+ }
+
+ #
+ # Create the left-most item count Label
+ #
+ itk_component add lhsCount {
+ label $itk_interior.lhscount
+ } {
+ usual
+ rename -font -labelfont labelFont Font
+ }
+
+ #
+ # Create the right-most item count Label
+ #
+ itk_component add rhsCount {
+ label $itk_interior.rhscount
+ } {
+ usual
+ rename -font -labelfont labelFont Font
+ }
+
+ set sourceListbox $itk_component(lhs)
+ set destinationListbox $itk_component(rhs)
+
+ #
+ # Bind the "showCount" method to the Map event of one of the labels
+ # to keep the diplayed item count current.
+ #
+ bind $itk_component(lhsCount) <Map> [itcl::code $this showCount]
+
+ grid $itk_component(lhs) -row 0 -column 0 -sticky nsew
+ grid $itk_component(rhs) -row 0 -column 2 -sticky nsew
+
+ grid rowconfigure $itk_interior 0 -weight 1
+ grid columnconfigure $itk_interior 0 -weight 1
+ grid columnconfigure $itk_interior 2 -weight 1
+
+ eval itk_initialize $args
+}
+
+# ------------------------------------------------------------------
+# Method: listboxClick
+#
+# Purpose: Evaluate a single click make in the specified Listbox.
+#
+itcl::body ::iwidgets::Disjointlistbox::listboxClick {clickSide otherSide} {
+ set button "button"
+ $itk_component($clickSide$button) configure -state active
+ $itk_component($otherSide$button) configure -state disabled
+ set sourceListbox $clickSide
+ set destinationListbox $otherSide
+}
+
+# ------------------------------------------------------------------
+# Method: listboxDblClick
+#
+# Purpose: Evaluate a double click in the specified Listbox.
+#
+itcl::body ::iwidgets::Disjointlistbox::listboxDblClick {clickSide otherSide} {
+ listboxClick $clickSide $otherSide
+ transfer
+}
+
+# ------------------------------------------------------------------
+# Method: transfer
+#
+# Purpose: Transfer source Listbox items to destination Listbox
+#
+itcl::body ::iwidgets::Disjointlistbox::transfer {} {
+
+ if {[$sourceListbox selecteditemcount] == 0} {
+ return
+ }
+ set selectedindices [lsort -integer -decreasing [$sourceListbox curselection]]
+ set selecteditems [$sourceListbox getcurselection]
+
+ foreach index $selectedindices {
+ $sourceListbox delete $index
+ }
+
+ foreach item $selecteditems {
+ $destinationListbox insert end $item
+ }
+
+ if {![string equal $itk_option(-${destinationListbox}sortoption) "none"]} {
+ $destinationListbox sort $itk_option(-${destinationListbox}sortoption)
+ }
+
+ showCount
+}
+
+# ------------------------------------------------------------------
+# Method: getlhs
+#
+# Purpose: Retrieve the items of the left Listbox widget
+#
+itcl::body ::iwidgets::Disjointlistbox::getlhs {{first 0} {last end}} {
+ return [lhs get $first $last]
+}
+
+# ------------------------------------------------------------------
+# Method: getrhs
+#
+# Purpose: Retrieve the items of the right Listbox widget
+#
+itcl::body ::iwidgets::Disjointlistbox::getrhs {{first 0} {last end}} {
+ return [rhs get $first $last]
+}
+
+# ------------------------------------------------------------------
+# Method: insertrhs
+#
+# Purpose: Insert items into the right Listbox widget
+#
+itcl::body ::iwidgets::Disjointlistbox::insertrhs {items} {
+ remove $itk_component(lhs) $items
+ insert rhs $items
+}
+
+# ------------------------------------------------------------------
+# Method: insertlhs
+#
+# Purpose: Insert items into the left Listbox widget
+#
+itcl::body ::iwidgets::Disjointlistbox::insertlhs {items} {
+ remove $itk_component(rhs) $items
+ insert lhs $items
+}
+
+# ------------------------------------------------------------------
+# Method: clear
+#
+# Purpose: Remove the items from the Listbox widgets and set the item count
+# Labels text to 0
+#
+itcl::body ::iwidgets::Disjointlistbox::clear {} {
+ lhs clear
+ rhs clear
+ showCount
+}
+
+# ------------------------------------------------------------------
+# Method: insert
+#
+# Purpose: Insert the input items into the input Listbox widget while
+# maintaining the disjoint property between them.
+#
+itcl::body ::iwidgets::Disjointlistbox::insert {theListbox items} {
+
+ set curritems [$theListbox get 0 end]
+
+ foreach item $items {
+ #
+ # if the item is not already present in the Listbox then insert it
+ #
+ if {[lsearch -exact $curritems $item] == -1} {
+ $theListbox insert end $item
+ }
+ }
+
+ if {![string equal $itk_option(-${theListbox}sortoption) "none"]} {
+ $theListbox sort $itk_option(-${theListbox}sortoption)
+ }
+
+ showCount
+}
+
+# ------------------------------------------------------------------
+# Method: remove
+#
+# Purpose: Remove the input items from the input Listbox widget while
+# maintaining the disjoint property between them.
+#
+itcl::body ::iwidgets::Disjointlistbox::remove {theListbox items} {
+
+ set indexes {}
+ set curritems [$theListbox get 0 end]
+
+ foreach item $items {
+ #
+ # if the item is in the listbox then add its index to the index list
+ #
+ if {[set index [lsearch -exact $curritems $item]] != -1} {
+ lappend indexes $index
+ }
+ }
+
+ foreach index [lsort -integer -decreasing $indexes] {
+ $theListbox delete $index
+ }
+ showCount
+}
+
+# ------------------------------------------------------------------
+# Method: showCount
+#
+# Purpose: Set the text of the item count Labels.
+#
+itcl::body ::iwidgets::Disjointlistbox::showCount {} {
+ $itk_component(lhsCount) config -text "item count: [lhs size]"
+ $itk_component(rhsCount) config -text "item count: [rhs size]"
+}
+
+# ------------------------------------------------------------------
+# METHOD: setlhs
+#
+# Set the items of the left-most Listbox with the input list
+# option. Remove all (if any) items from the right-most Listbox
+# which exist in the input list option to maintain the disjoint
+# property between the two
+#
+itcl::body ::iwidgets::Disjointlistbox::setlhs {items} {
+ lhs clear
+ insertlhs $items
+}
+
+# ------------------------------------------------------------------
+# METHOD: setrhs
+#
+# Set the items of the right-most Listbox with the input list
+# option. Remove all (if any) items from the left-most Listbox
+# which exist in the input list option to maintain the disjoint
+# property between the two
+#
+itcl::body ::iwidgets::Disjointlistbox::setrhs {items} {
+ rhs clear
+ insertrhs $items
+}
+
+# ------------------------------------------------------------------
+# Method: lhs
+#
+# Purpose: Evaluates the specified arguments against the lhs Listbox
+#
+itcl::body ::iwidgets::Disjointlistbox::lhs {args} {
+ return [eval $itk_component(lhs) $args]
+}
+
+# ------------------------------------------------------------------
+# Method: rhs
+#
+# Purpose: Evaluates the specified arguments against the rhs Listbox
+#
+itcl::body ::iwidgets::Disjointlistbox::rhs {args} {
+ return [eval $itk_component(rhs) $args]
+}
+
+# ------------------------------------------------------------------
+# OPTION: buttonplacement
+#
+# Configure the placement of the buttons to be either between or below
+# the two list boxes.
+#
+itcl::configbody ::iwidgets::Disjointlistbox::buttonplacement {
+ if {$itk_option(-buttonplacement) != ""} {
+
+ if { [lsearch [component] lhsbutton] != -1 } {
+ eval destroy $itk_component(rhsbutton) $itk_component(lhsbutton)
+ }
+
+ if { [lsearch [component] bbox] != -1 } {
+ destroy $itk_component(bbox)
+ }
+
+ set where $itk_option(-buttonplacement)
+
+ switch $where {
+
+ center {
+ #
+ # Create the button box frame
+ #
+ itk_component add bbox {
+ frame $itk_interior.bbox
+ }
+
+ itk_component add lhsbutton {
+ button $itk_component(bbox).lhsbutton -command [itcl::code \
+ $this transfer]
+ } {
+ usual
+ rename -text -lhsbuttonlabel lhsButtonLabel LabelText
+ rename -font -labelfont labelFont Font
+ }
+
+ itk_component add rhsbutton {
+ button $itk_component(bbox).rhsbutton -command [itcl::code \
+ $this transfer]
+ } {
+ usual
+ rename -text -rhsbuttonlabel rhsButtonLabel LabelText
+ rename -font -labelfont labelFont Font
+ }
+
+ grid configure $itk_component(lhsCount) -row 1 -column 0 \
+ -sticky ew
+ grid configure $itk_component(rhsCount) -row 1 -column 2 \
+ -sticky ew
+
+ grid configure $itk_component(bbox) \
+ -in $itk_interior -row 0 -column 1 -columnspan 1 \
+ -sticky nsew
+
+ grid configure $itk_component(rhsbutton) \
+ -in $itk_component(bbox) -row 0 -column 0 -sticky ew
+ grid configure $itk_component(lhsbutton) \
+ -in $itk_component(bbox) -row 1 -column 0 -sticky ew
+ }
+
+ bottom {
+
+ itk_component add lhsbutton {
+ button $itk_interior.lhsbutton -command [itcl::code $this \
+ transfer]
+ } {
+ usual
+ rename -text -lhsbuttonlabel lhsButtonLabel LabelText
+ rename -font -labelfont labelFont Font
+ }
+
+ itk_component add rhsbutton {
+ button $itk_interior.rhsbutton -command [itcl::code $this \
+ transfer]
+ } {
+ usual
+ rename -text -rhsbuttonlabel rhsButtonLabel LabelText
+ rename -font -labelfont labelFont Font
+ }
+
+ grid $itk_component(lhsCount) -row 2 -column 0 -sticky ew
+ grid $itk_component(rhsCount) -row 2 -column 2 -sticky ew
+ grid $itk_component(lhsbutton) -row 1 -column 0 -sticky ew
+ grid $itk_component(rhsbutton) -row 1 -column 2 -sticky ew
+ }
+
+ default {
+ error "bad buttonplacement option\"$where\": should be center\
+ or bottom"
+ }
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: lhssortoption
+#
+# Configure the sort option to use for the left side
+#
+itcl::configbody ::iwidgets::Disjointlistbox::lhssortoption {
+
+ if {![string equal $itk_option(-lhssortoption) "none"]} {
+ $itk_component(lhs) sort $itk_option(-lhssortoption)
+ }
+}
+
+
+# ------------------------------------------------------------------
+# OPTION: rhssortoption
+#
+# Configure the sort option to use for the right side
+#
+itcl::configbody ::iwidgets::Disjointlistbox::rhssortoption {
+
+ if {![string equal $itk_option(-rhssortoption) "none"]} {
+ $itk_component(rhs) sort $itk_option(-rhssortoption)
+ }
+}
diff --git a/iwidgets/generic/entryfield.itk b/iwidgets/generic/entryfield.itk
new file mode 100644
index 00000000000..ce95d7bf790
--- /dev/null
+++ b/iwidgets/generic/entryfield.itk
@@ -0,0 +1,603 @@
+#
+# Entryfield
+# ----------------------------------------------------------------------
+# Implements an enhanced text entry widget.
+#
+# ----------------------------------------------------------------------
+# AUTHOR: Sue Yockey E-mail: yockey@acm.org
+# Mark L. Ulferts E-mail: mulferts@austin.dsccc.com
+#
+# @(#) $Id$
+# ----------------------------------------------------------------------
+# Copyright (c) 1995 DSC Technologies Corporation
+# ======================================================================
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+
+#
+# Usual options.
+#
+itk::usual Entryfield {
+ keep -background -borderwidth -cursor -foreground -highlightcolor \
+ -highlightthickness -insertbackground -insertborderwidth \
+ -insertofftime -insertontime -insertwidth -labelfont \
+ -selectbackground -selectborderwidth -selectforeground \
+ -textbackground -textfont
+}
+
+# ------------------------------------------------------------------
+# ENTRYFIELD
+# ------------------------------------------------------------------
+itcl::class iwidgets::Entryfield {
+ inherit iwidgets::Labeledwidget
+
+ constructor {args} {}
+
+ itk_option define -childsitepos childSitePos Position e
+ itk_option define -command command Command {}
+ itk_option define -fixed fixed Fixed 0
+ itk_option define -focuscommand focusCommand Command {}
+ itk_option define -invalid invalid Command {bell}
+ itk_option define -pasting pasting Behavior 1
+ itk_option define -validate validate Command {}
+
+ public {
+ method childsite {}
+ method get {}
+ method delete {args}
+ method icursor {args}
+ method index {args}
+ method insert {args}
+ method scan {args}
+ method selection {args}
+ method xview {args}
+ method clear {}
+ }
+
+ proc numeric {char} {}
+ proc integer {string} {}
+ proc alphabetic {char} {}
+ proc alphanumeric {char} {}
+ proc hexidecimal {string} {}
+ proc real {string} {}
+
+ protected {
+ method _focusCommand {}
+ method _keyPress {char sym state}
+ }
+
+ private method _peek {char}
+ private method _checkLength {}
+}
+
+#
+# Provide a lowercased access method for the Entryfield class.
+#
+proc ::iwidgets::entryfield {pathName args} {
+ uplevel ::iwidgets::Entryfield $pathName $args
+}
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Entryfield::constructor {args} {
+ component hull configure -borderwidth 0
+
+ itk_component add entry {
+ entry $itk_interior.entry
+ } {
+ keep -borderwidth -cursor -exportselection \
+ -foreground -highlightcolor \
+ -highlightthickness -insertbackground -insertborderwidth \
+ -insertofftime -insertontime -insertwidth -justify \
+ -relief -selectbackground -selectborderwidth \
+ -selectforeground -show -state -textvariable -width
+
+ rename -font -textfont textFont Font
+ rename -highlightbackground -background background Background
+ rename -background -textbackground textBackground Background
+ }
+
+ #
+ # Create the child site widget.
+ #
+ itk_component add -protected efchildsite {
+ frame $itk_interior.efchildsite
+ }
+ set itk_interior $itk_component(efchildsite)
+
+ #
+ # Entryfield instance bindings.
+ #
+ bind $itk_component(entry) <KeyPress> [itcl::code $this _keyPress %A %K %s]
+ bind $itk_component(entry) <FocusIn> [itcl::code $this _focusCommand]
+
+ #
+ # Initialize the widget based on the command line options.
+ #
+ eval itk_initialize $args
+}
+
+# ------------------------------------------------------------------
+# OPTIONS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# OPTION: -command
+#
+# Command associated upon detection of Return key press event
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Entryfield::command {}
+
+# ------------------------------------------------------------------
+# OPTION: -focuscommand
+#
+# Command associated upon detection of focus.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Entryfield::focuscommand {}
+
+# ------------------------------------------------------------------
+# OPTION: -validate
+#
+# Specify a command to executed for the validation of Entryfields.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Entryfield::validate {
+ switch $itk_option(-validate) {
+ {} {
+ set itk_option(-validate) {}
+ }
+ numeric {
+ set itk_option(-validate) "::iwidgets::Entryfield::numeric %c"
+ }
+ integer {
+ set itk_option(-validate) "::iwidgets::Entryfield::integer %P"
+ }
+ hexidecimal {
+ set itk_option(-validate) "::iwidgets::Entryfield::hexidecimal %P"
+ }
+ real {
+ set itk_option(-validate) "::iwidgets::Entryfield::real %P"
+ }
+ alphabetic {
+ set itk_option(-validate) "::iwidgets::Entryfield::alphabetic %c"
+ }
+ alphanumeric {
+ set itk_option(-validate) "::iwidgets::Entryfield::alphanumeric %c"
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -invalid
+#
+# Specify a command to executed should the current Entryfield contents
+# be proven invalid.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Entryfield::invalid {}
+
+# ------------------------------------------------------------------
+# OPTION: -pasting
+#
+# Allows the developer to enable and disable pasting into the entry
+# component of the entryfield. This is done to avoid potential stack
+# dumps when using the -validate configuration option. Plus, it's just
+# a good idea to have complete control over what you allow the user
+# to enter into the entryfield.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Entryfield::pasting {
+ set oldtags [bindtags $itk_component(entry)]
+ if {[lindex $oldtags 0] != "pastetag"} {
+ bindtags $itk_component(entry) [linsert $oldtags 0 pastetag]
+ }
+
+ if ($itk_option(-pasting)) {
+ bind pastetag <ButtonRelease-2> [itcl::code $this _checkLength]
+ bind pastetag <Control-v> [itcl::code $this _checkLength]
+ bind pastetag <Insert> [itcl::code $this _checkLength]
+ bind pastetag <KeyPress> {}
+ } else {
+ bind pastetag <ButtonRelease-2> {break}
+ bind pastetag <Control-v> {break}
+ bind pastetag <Insert> {break}
+ bind pastetag <KeyPress> {
+ # Disable function keys > F9.
+ if {[regexp {^F[1,2][0-9]+$} "%K"]} {
+ break
+ }
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -fixed
+#
+# Restrict entry to 0 (unlimited) chars. The value is the maximum
+# number of chars the user may type into the field, regardles of
+# field width, i.e. the field width may be 20, but the user will
+# only be able to type -fixed number of characters into it (or
+# unlimited if -fixed = 0).
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Entryfield::fixed {
+ if {[regexp {[^0-9]} $itk_option(-fixed)] || \
+ ($itk_option(-fixed) < 0)} {
+ error "bad fixed option \"$itk_option(-fixed)\",\
+ should be positive integer"
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -childsitepos
+#
+# Specifies the position of the child site in the widget.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Entryfield::childsitepos {
+ set parent [winfo parent $itk_component(entry)]
+
+ switch $itk_option(-childsitepos) {
+ n {
+ grid $itk_component(efchildsite) -row 0 -column 0 -sticky ew
+ grid $itk_component(entry) -row 1 -column 0 -sticky nsew
+
+ grid rowconfigure $parent 0 -weight 0
+ grid rowconfigure $parent 1 -weight 1
+ grid columnconfigure $parent 0 -weight 1
+ grid columnconfigure $parent 1 -weight 0
+ }
+
+ e {
+ grid $itk_component(efchildsite) -row 0 -column 1 -sticky ns
+ grid $itk_component(entry) -row 0 -column 0 -sticky nsew
+
+ grid rowconfigure $parent 0 -weight 1
+ grid rowconfigure $parent 1 -weight 0
+ grid columnconfigure $parent 0 -weight 1
+ grid columnconfigure $parent 1 -weight 0
+ }
+
+ s {
+ grid $itk_component(efchildsite) -row 1 -column 0 -sticky ew
+ grid $itk_component(entry) -row 0 -column 0 -sticky nsew
+
+ grid rowconfigure $parent 0 -weight 1
+ grid rowconfigure $parent 1 -weight 0
+ grid columnconfigure $parent 0 -weight 1
+ grid columnconfigure $parent 1 -weight 0
+ }
+
+ w {
+ grid $itk_component(efchildsite) -row 0 -column 0 -sticky ns
+ grid $itk_component(entry) -row 0 -column 1 -sticky nsew
+
+ grid rowconfigure $parent 0 -weight 1
+ grid rowconfigure $parent 1 -weight 0
+ grid columnconfigure $parent 0 -weight 0
+ grid columnconfigure $parent 1 -weight 1
+ }
+
+ default {
+ error "bad childsite option\
+ \"$itk_option(-childsitepos)\":\
+ should be n, e, s, or w"
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# METHODS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# METHOD: childsite
+#
+# Returns the path name of the child site widget.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Entryfield::childsite {} {
+ return $itk_component(efchildsite)
+}
+
+# ------------------------------------------------------------------
+# METHOD: get
+#
+# Thin wrap of the standard entry widget get method.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Entryfield::get {} {
+ return [$itk_component(entry) get]
+}
+
+# ------------------------------------------------------------------
+# METHOD: delete
+#
+# Thin wrap of the standard entry widget delete method.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Entryfield::delete {args} {
+ return [eval $itk_component(entry) delete $args]
+}
+
+# ------------------------------------------------------------------
+# METHOD: icursor
+#
+# Thin wrap of the standard entry widget icursor method.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Entryfield::icursor {args} {
+ return [eval $itk_component(entry) icursor $args]
+}
+
+# ------------------------------------------------------------------
+# METHOD: index
+#
+# Thin wrap of the standard entry widget index method.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Entryfield::index {args} {
+ return [eval $itk_component(entry) index $args]
+}
+
+# ------------------------------------------------------------------
+# METHOD: insert
+#
+# Thin wrap of the standard entry widget index method.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Entryfield::insert {args} {
+ return [eval $itk_component(entry) insert $args]
+}
+
+# ------------------------------------------------------------------
+# METHOD: scan
+#
+# Thin wrap of the standard entry widget scan method.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Entryfield::scan {args} {
+ return [eval $itk_component(entry) scan $args]
+}
+
+# ------------------------------------------------------------------
+# METHOD: selection
+#
+# Thin wrap of the standard entry widget selection method.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Entryfield::selection {args} {
+ return [eval $itk_component(entry) selection $args]
+}
+
+# ------------------------------------------------------------------
+# METHOD: xview
+#
+# Thin wrap of the standard entry widget xview method.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Entryfield::xview {args} {
+ return [eval $itk_component(entry) xview $args]
+}
+
+# ------------------------------------------------------------------
+# METHOD: clear
+#
+# Delete the current entry contents.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Entryfield::clear {} {
+ $itk_component(entry) delete 0 end
+ icursor 0
+}
+
+# ------------------------------------------------------------------
+# PROCEDURE: numeric char
+#
+# The numeric procedure validates character input for a given
+# Entryfield to be numeric and returns the result.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Entryfield::numeric {char} {
+ return [regexp {[0-9]} $char]
+}
+
+# ------------------------------------------------------------------
+# PROCEDURE: integer string
+#
+# The integer procedure validates character input for a given
+# Entryfield to be integer and returns the result.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Entryfield::integer {string} {
+ return [regexp {^[-+]?[0-9]*$} $string]
+}
+
+# ------------------------------------------------------------------
+# PROCEDURE: alphabetic char
+#
+# The alphabetic procedure validates character input for a given
+# Entryfield to be alphabetic and returns the result.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Entryfield::alphabetic {char} {
+ return [regexp -nocase {[a-z]} $char]
+}
+
+# ------------------------------------------------------------------
+# PROCEDURE: alphanumeric char
+#
+# The alphanumeric procedure validates character input for a given
+# Entryfield to be alphanumeric and returns the result.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Entryfield::alphanumeric {char} {
+ return [regexp -nocase {[0-9a-z]} $char]
+}
+
+# ------------------------------------------------------------------
+# PROCEDURE: hexadecimal string
+#
+# The hexidecimal procedure validates character input for a given
+# Entryfield to be hexidecimal and returns the result.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Entryfield::hexidecimal {string} {
+ return [regexp {^(0x)?[0-9a-fA-F]*$} $string]
+}
+
+# ------------------------------------------------------------------
+# PROCEDURE: real string
+#
+# The real procedure validates character input for a given Entryfield
+# to be real and returns the result.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Entryfield::real {string} {
+ return [regexp {^[-+]?[0-9]*\.?[0-9]*([0-9]\.?[eE][-+]?[0-9]*)?$} $string]
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _peek char
+#
+# The peek procedure returns the value of the Entryfield with the
+# char inserted at the insert position.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Entryfield::_peek {char} {
+ set str [get]
+
+ set insertPos [index insert]
+ set firstPart [string range $str 0 [expr {$insertPos - 1}]]
+ set lastPart [string range $str $insertPos end]
+
+ regsub -all {\\} "$char" {\\\\} char
+ append rtnVal $firstPart $char $lastPart
+ return $rtnVal
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _focusCommand
+#
+# Method bound to focus event which evaluates the current command
+# specified in the focuscommand option
+# ------------------------------------------------------------------
+itcl::body iwidgets::Entryfield::_focusCommand {} {
+ uplevel #0 $itk_option(-focuscommand)
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _keyPress
+#
+# Monitor the key press event checking for return keys, fixed width
+# specification, and optional validation procedures.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Entryfield::_keyPress {char sym state} {
+ #
+ # A Return key invokes the optionally specified command option.
+ #
+ if {$sym == "Return"} {
+ uplevel #0 $itk_option(-command)
+ return -code break 1
+ }
+
+ #
+ # Tabs, BackSpace, and Delete are passed on for other bindings.
+ #
+ if {($sym == "Tab") || ($sym == "BackSpace") || ($sym == "Delete")} {
+ return -code continue 1
+ }
+
+ #
+ # Character is not printable or the state is greater than one which
+ # means a modifier was used such as a control, meta key, or control
+ # or meta key with numlock down.
+ #
+ #-----------------------------------------------------------
+ # BUG FIX: csmith (Chad Smith: csmith@adc.com), 3/15/99
+ #-----------------------------------------------------------
+ # The following conditional used to hardcode specific state values, such
+ # as "4" and "8". These values are used to detect <Ctrl>, <Shift>, etc.
+ # key combinations. On the windows platform, the <Alt> key is state
+ # 16, and on the unix platform, the <Alt> key is state 8. All <Ctrl>
+ # and <Alt> combinations should be masked out, regardless of the
+ # <NumLock> or <CapsLock> status, and regardless of platform.
+ #-----------------------------------------------------------
+ set CTRL 4
+ global tcl_platform
+ if {$tcl_platform(platform) == "unix"} {
+ set ALT 8
+ } elseif {$tcl_platform(platform) == "windows"} {
+ set ALT 16
+ } else {
+ # This is something other than UNIX or WINDOWS. Default to the
+ # old behavior (UNIX).
+ set ALT 8
+ }
+ # Thanks to Rolf Schroedter for the following elegant conditional. This
+ # masks out all <Ctrl> and <Alt> key combinations.
+ if {($char == "") || ($state & ($CTRL | $ALT))} {
+ return -code continue 1
+ }
+
+ #
+ # If the fixed length option is not zero, then verify that the
+ # current length plus one will not exceed the limit. If so then
+ # invoke the invalid command procedure.
+ #
+ if {$itk_option(-fixed) != 0} {
+ if {[string length [get]] >= $itk_option(-fixed)} {
+ uplevel #0 $itk_option(-invalid)
+ return -code break 0
+ }
+ }
+
+ #
+ # The validate option may contain a keyword (numeric, alphabetic),
+ # the name of a procedure, or nothing. The numeric and alphabetic
+ # keywords engage typical base level checks. If a command procedure
+ # is specified, then invoke it with the object and character passed
+ # as arguments. If the validate procedure returns false, then the
+ # invalid procedure is called.
+ #
+ if {$itk_option(-validate) != {}} {
+ set cmd $itk_option(-validate)
+
+ regsub -all "%W" "$cmd" $itk_component(hull) cmd
+ regsub -all "%P" "$cmd" [list [_peek $char]] cmd
+ regsub -all "%S" "$cmd" [list [get]] cmd
+ regsub -all "%c" "$cmd" [list $char] cmd
+ regsub -all {\\} "$cmd" {\\\\} cmd
+
+ set valid [uplevel #0 $cmd]
+
+ if {($valid == "") || ([regexp 0|false|off|no $valid])} {
+ uplevel #0 $itk_option(-invalid)
+ return -code break 0
+ }
+ }
+
+ return -code continue 1
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _checkLength
+#
+# This method was added by csmith for SF ticket 227912. We need to
+# to check the clipboard content before allowing any pasting into
+# the entryfield to disallow text that is longer than the value
+# specified by the -fixed option.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Entryfield::_checkLength {} {
+ if {$itk_option(-fixed) != 0} {
+ if [catch {::selection get -selection CLIPBOARD} pending] {
+ # Nothing in the clipboard. Check the primary selection.
+ if [catch {::selection get -selection PRIMARY} pending] {
+ # Nothing here either. Goodbye.
+ return
+ }
+ }
+ set len [expr {[string length $pending] + [string length [get]]}]
+ if {$len > $itk_option(-fixed)} {
+ uplevel #0 $itk_option(-invalid)
+ return -code break 0
+ }
+ }
+}
diff --git a/iwidgets/generic/extbutton.itk b/iwidgets/generic/extbutton.itk
new file mode 100644
index 00000000000..a898130a0d6
--- /dev/null
+++ b/iwidgets/generic/extbutton.itk
@@ -0,0 +1,439 @@
+#-------------------------------------------------------------------------------
+# Extbutton
+#-------------------------------------------------------------------------------
+# This [incr Widget] is pretty simple - it just extends the behavior of
+# the Tk button by allowing the user to add a bitmap or an image, which
+# can be placed at various locations relative to the text via the -imagepos
+# configuration option.
+#
+#-------------------------------------------------------------------------------
+# IMPORTANT NOTE: This [incr Widget] will only work with Tk 8.4 or later.
+#
+#-------------------------------------------------------------------------------
+# AUTHOR: Chad Smith E-mail: csmith@adc.com, itclguy@yahoo.com
+#-------------------------------------------------------------------------------
+# Permission to use, copy, modify, distribute, and license this software
+# and its documentation for any purpose is hereby granted as long as this
+# comment block remains intact.
+#-------------------------------------------------------------------------------
+
+#
+# Default resources
+#
+option add *Extbutton.borderwidth 2 widgetDefault
+option add *Extbutton.relief raised widgetDefault
+
+#
+# Usual options
+#
+itk::usual Extbutton {
+ keep -cursor -font
+}
+
+itcl::class iwidgets::Extbutton {
+ inherit itk::Widget
+
+ constructor {args} {}
+
+ itk_option define -activebackground activeBackground Foreground #ececec
+ itk_option define -bd borderwidth BorderWidth 2
+ itk_option define -bitmap bitmap Bitmap {}
+ itk_option define -command command Command {}
+ itk_option define -defaultring defaultring DefaultRing 0
+ itk_option define -defaultringpad defaultringpad Pad 4
+ itk_option define -image image Image {}
+ itk_option define -imagepos imagePos Position w
+ itk_option define -relief relief Relief raised
+ itk_option define -state state State normal
+ itk_option define -text text Text {}
+
+ public method invoke {} {eval $itk_option(-command)}
+ public method flash {}
+
+ private method changeColor {event_}
+ private method sink {}
+ private method raise {} {configure -relief $_oldValues(-relief)}
+
+ private variable _oldValues
+}
+
+
+#
+# Provide the usual lowercase access command.
+#
+proc iwidgets::extbutton {path_ args} {
+ uplevel iwidgets::Extbutton $path_ $args
+}
+
+
+#-------------------------------------------------------------------------------
+# OPTION: -bd
+#
+# DESCRIPTION: This isn't a new option. Similar to -image, we just need to
+# repack the frame when the borderwidth changes. This option is kept by
+# the private reliefframe component.
+#-------------------------------------------------------------------------------
+itcl::configbody iwidgets::Extbutton::bd {
+ pack $itk_component(frame) -padx 4 -pady 4
+}
+
+
+#-------------------------------------------------------------------------------
+# OPTION: -bitmap
+#
+# DESCRIPTION: This isn't a new option - we just need to reset the -image option
+# so that the user can toggle back and forth between images and bitmaps.
+# Otherwise, the image will take precedence and the user will be unable to
+# change to a bitmap without manually setting the label component's -image to
+# an empty string. This option is kept by the image component.
+#-------------------------------------------------------------------------------
+itcl::configbody iwidgets::Extbutton::bitmap {
+ if {$itk_option(-bitmap) == ""} {
+ return
+ }
+ if {$itk_option(-image) != ""} {
+ configure -image {}
+ }
+ pack $itk_component(frame) -padx 4 -pady 4
+}
+
+
+#-------------------------------------------------------------------------------
+# OPTION: -command
+#
+# DESCRIPTION: Invoke the given command to simulate the Tk button's -command
+# option. The command is invoked on <ButtonRelease-1> events only or by
+# direct calls to the public invoke() method.
+#-------------------------------------------------------------------------------
+itcl::configbody iwidgets::Extbutton::command {
+ if {$itk_option(-command) == ""} {
+ return
+ }
+
+ # Only create the tag binding if the button is operable.
+ if {$itk_option(-state) == "normal"} {
+ bind $this-commandtag <ButtonRelease-1> [itcl::code $this invoke]
+ }
+
+ # Associate the tag with each component if it's not already done.
+ if {[lsearch [bindtags $itk_interior] $this-commandtag] == -1} {
+ foreach component [component] {
+ bindtags [component $component] \
+ [linsert [bindtags [component $component]] end $this-commandtag]
+ }
+ }
+}
+
+
+#-------------------------------------------------------------------------------
+# OPTION: -defaultring
+#
+# DESCRIPTION: Controls display of the sunken frame surrounding the button.
+# This option simulates the pushbutton iwidget -defaultring option.
+#-------------------------------------------------------------------------------
+itcl::configbody iwidgets::Extbutton::defaultring {
+ switch -- $itk_option(-defaultring) {
+ 1 {set ring 1}
+ 0 {set ring 0}
+ default {
+ error "Invalid option for -defaultring: \"$itk_option(-defaultring)\". \
+ Should be 1 or 0."
+ }
+ }
+
+ if ($ring) {
+ $itk_component(ring) configure -borderwidth 2
+ pack $itk_component(reliefframe) -padx $itk_option(-defaultringpad) \
+ -pady $itk_option(-defaultringpad)
+ } else {
+ $itk_component(ring) configure -borderwidth 0
+ pack $itk_component(reliefframe) -padx 0 -pady 0
+ }
+}
+
+
+#-------------------------------------------------------------------------------
+# OPTION: -defaultringpad
+#
+# DESCRIPTION: The pad distance between the ring and the button.
+#-------------------------------------------------------------------------------
+itcl::configbody iwidgets::Extbutton::defaultringpad {
+ # Must be an integer.
+ if ![string is integer $itk_option(-defaultringpad)] {
+ error "Invalid value specified for -defaultringpad:\
+ \"$itk_option(-defaultringpad)\". Must be an integer."
+ }
+
+ # Let's go ahead and make the maximum padding 20 pixels. Surely no one
+ # will want more than that.
+ if {$itk_option(-defaultringpad) < 0 || $itk_option(-defaultringpad) > 20} {
+ error "Value for -defaultringpad must be between 0 and 20."
+ }
+
+ # If the ring is displayed, repack it according to the new padding amount.
+ if {$itk_option(-defaultring)} {
+ pack $itk_component(reliefframe) -padx $itk_option(-defaultringpad) \
+ -pady $itk_option(-defaultringpad)
+ }
+}
+
+
+#-------------------------------------------------------------------------------
+# OPTION: -image
+#
+# DESCRIPTION: This isn't a new option - we just need to repack the frame after
+# the image is changed in case the size is different than the previous one.
+# This option is kept by the image component.
+#-------------------------------------------------------------------------------
+itcl::configbody iwidgets::Extbutton::image {
+ pack $itk_component(frame) -padx 4 -pady 4
+}
+
+
+#-------------------------------------------------------------------------------
+# OPTION: -imagepos
+#
+# DESCRIPTION: Allows the user to move the image to different locations areound
+# the text. Valid options are n, nw, ne, s, sw, se e, en, es, w, wn or ws.
+#-------------------------------------------------------------------------------
+itcl::configbody iwidgets::Extbutton::imagepos {
+ switch -- $itk_option(-imagepos) {
+ n {set side top; set anchor center}
+ ne {set side top; set anchor e}
+ nw {set side top; set anchor w}
+
+ s {set side bottom; set anchor center}
+ se {set side bottom; set anchor e}
+ sw {set side bottom; set anchor w}
+
+ w {set side left; set anchor center}
+ wn {set side left; set anchor n}
+ ws {set side left; set anchor s}
+
+ e {set side right; set anchor center}
+ en {set side right; set anchor n}
+ es {set side right; set anchor s}
+
+ default {
+ error "Invalid option: \"$itk_option(-imagepos)\". \
+ Must be n, nw, ne, s, sw, se e, en, es, w, wn or ws."
+ }
+ }
+
+ pack $itk_component(image) -side $side -anchor $anchor
+ pack $itk_component(frame) -padx 4 -pady 4
+}
+
+
+#-------------------------------------------------------------------------------
+# OPTION: -relief
+#
+# DESCRIPTION: Move the frame component according to the relief to simulate
+# the text in a Tk button when its relief is changed.
+#-------------------------------------------------------------------------------
+itcl::configbody iwidgets::Extbutton::relief {
+ update idletasks
+ switch -- $itk_option(-relief) {
+ flat - ridge - groove {
+ place $itk_component(frame) -x 5 -y 5
+ }
+
+ raised {
+ place $itk_component(frame) -x 4 -y 4
+ }
+
+ sunken {
+ place $itk_component(frame) -x 6 -y 6
+ }
+
+ default {
+ error "Invalid option: \"$itk_option(-relief)\". \
+ Must be flat, ridge, groove, raised, or sunken."
+ }
+ }
+}
+
+
+#-------------------------------------------------------------------------------
+# OPTION: -state
+#
+# DESCRIPTION: Simulate the button's -state option.
+#-------------------------------------------------------------------------------
+itcl::configbody iwidgets::Extbutton::state {
+ switch -- $itk_option(-state) {
+ disabled {
+ bind $itk_interior <Enter> { }
+ bind $itk_interior <Leave> { }
+ bind $this-sunkentag <1> { }
+ bind $this-raisedtag <ButtonRelease-1> { }
+ bind $this-commandtag <ButtonRelease-1> { }
+ set _oldValues(-fg) [cget -foreground]
+ set _oldValues(-cursor) [cget -cursor]
+ configure -foreground $itk_option(-disabledforeground)
+ configure -cursor "X_cursor red black"
+ }
+
+ normal {
+ bind $itk_interior <Enter> [itcl::code $this changeColor enter]
+ bind $itk_interior <Leave> [itcl::code $this changeColor leave]
+ bind $this-sunkentag <1> [itcl::code $this sink]
+ bind $this-raisedtag <ButtonRelease-1> [itcl::code $this raise]
+ bind $this-commandtag <ButtonRelease-1> [itcl::code $this invoke]
+ configure -foreground $_oldValues(-fg)
+ configure -cursor $_oldValues(-cursor)
+ }
+
+ default {
+ error "Bad option for -state: \"$itk_option(-state)\". Should be\
+ normal or disabled."
+ }
+ }
+}
+
+
+#-------------------------------------------------------------------------------
+# OPTION: -text
+#
+# DESCRIPTION: This isn't a new option. Similar to -image, we just need to
+# repack the frame when the text changes.
+#-------------------------------------------------------------------------------
+itcl::configbody iwidgets::Extbutton::text {
+ pack $itk_component(frame) -padx 4 -pady 4
+}
+
+
+
+#-------------------------------------------------------------------------------
+# CONSTRUCTOR
+#-------------------------------------------------------------------------------
+itcl::body iwidgets::Extbutton::constructor {args} {
+ # Extbutton will not work with versions of Tk less than 8.4 (the
+ # -activeforeground option was added to the Tk label widget in 8.4, for
+ # example). So disallow its use unless the right wish is being used.
+ if {$::tk_version < 8.4} {
+ error "The extbutton \[incr Widget\] can only be used with versions of\
+ Tk greater than 8.3.\nYou're currently using version $::tk_version."
+ }
+
+ # This frame is optionally displayed as a "default ring" around the button.
+ itk_component add ring {
+ frame $itk_interior.ring -relief sunken
+ } {
+ rename -background -ringbackground ringBackground Background
+ }
+
+ # Add an outer frame for the widget's relief. Ideally we could just keep
+ # the hull's -relief, but it's too tricky to handle relief changes.
+ itk_component add -private reliefframe {
+ frame $itk_component(ring).f
+ } {
+ rename -borderwidth -bd borderwidth BorderWidth
+ keep -relief
+ usual
+ }
+
+ # This frame contains the image and text. It will be moved slightly to
+ # simulate the text in a Tk button when the button is depressed/raised.
+ itk_component add frame {
+ frame $itk_component(reliefframe).f -borderwidth 0
+ }
+
+ itk_component add image {
+ label $itk_component(frame).img -borderwidth 0
+ } {
+ keep -bitmap -background -image
+ rename -foreground -bitmapforeground foreground Foreground
+ }
+
+ itk_component add label {
+ label $itk_component(frame).txt -borderwidth 0
+ } {
+ keep -activeforeground -background -disabledforeground
+ keep -font -foreground -justify -text
+ }
+
+ pack $itk_component(image) $itk_component(label) -side left -padx 6 -pady 4
+ pack $itk_component(frame) -padx 4 -pady 4
+ pack $itk_component(reliefframe) -fill both
+ pack $itk_component(ring) -fill both
+
+ # Create a couple of binding tags for handling relief changes. Then
+ # add these tags to each component.
+ foreach component [component] {
+ bindtags [component $component] \
+ [linsert [bindtags [component $component]] end $this-sunkentag]
+ bindtags [component $component] \
+ [linsert [bindtags [component $component]] end $this-raisedtag]
+ }
+
+ set _oldValues(-fg) [cget -foreground]
+ set _oldValues(-cursor) [cget -cursor]
+
+ eval itk_initialize $args
+}
+
+
+#-------------------------------------------------------------------------------
+# METHOD: flash
+#
+# ACCESS: public
+#
+# DESCRIPTION: Simulate the Tk button flash command.
+#
+# ARGUMENTS: none
+#-------------------------------------------------------------------------------
+itcl::body iwidgets::Extbutton::flash {} {
+ set oldbg [cget -background]
+ config -background $itk_option(-activebackground)
+ update idletasks
+
+ after 50; config -background $oldbg; update idletasks
+ after 50; config -background $itk_option(-activebackground); update idletasks
+ after 50; config -background $oldbg
+}
+
+
+#-------------------------------------------------------------------------------
+# METHOD: changeColor
+#
+# ACCESS: private
+#
+# DESCRIPTION: This method is invoked by <Enter> and <Leave> events to change
+# the background and foreground colors of the widget.
+#
+# ARGUMENTS: event_ --> either "enter" or "leave"
+#-------------------------------------------------------------------------------
+itcl::body iwidgets::Extbutton::changeColor {event_} {
+ switch -- $event_ {
+ enter {
+ set _oldValues(-bg) [cget -background]
+ set _oldValues(-fg) [cget -foreground]
+ configure -background $itk_option(-activebackground)
+ configure -foreground $itk_option(-activeforeground)
+ }
+ leave {
+ configure -background $_oldValues(-bg)
+ configure -foreground $_oldValues(-fg)
+ }
+ }
+}
+
+
+#-------------------------------------------------------------------------------
+# METHOD: sink
+#
+# ACCESS: private
+#
+# DESCRIPTION: This method is invoked on <1> mouse events. It saves the
+# current relief for later restoral and configures the relief to sunken if
+# it isn't already sunken.
+#
+# ARGUMENTS: none
+#-------------------------------------------------------------------------------
+itcl::body iwidgets::Extbutton::sink {} {
+ set _oldValues(-relief) [cget -relief]
+ if {$_oldValues(-relief) == "sunken"} {
+ return
+ }
+ configure -relief sunken
+}
diff --git a/iwidgets/generic/extfileselectionbox.itk b/iwidgets/generic/extfileselectionbox.itk
new file mode 100644
index 00000000000..b3de7a7f4b3
--- /dev/null
+++ b/iwidgets/generic/extfileselectionbox.itk
@@ -0,0 +1,1187 @@
+#
+# Extfileselectionbox
+# ----------------------------------------------------------------------
+# Implements a file selection box that is a slightly extended version
+# of the OSF/Motif standard XmExtfileselectionbox composite widget.
+# The Extfileselectionbox differs from the Motif standard in that the
+# filter and selection fields are comboboxes and the files and directory
+# lists are in a paned window.
+#
+# ----------------------------------------------------------------------
+# AUTHOR: Mark L. Ulferts EMAIL: mulferts@spd.dsccc.com
+# Anthony L. Parent tony.parent@symbios.com
+#
+# @(#) $Id$
+# ----------------------------------------------------------------------
+# Copyright (c) 1997 DSC Technologies Corporation
+# ======================================================================
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+
+#
+# Usual options.
+#
+itk::usual Extfileselectionbox {
+ keep -activebackground -activerelief -background -borderwidth -cursor \
+ -elementborderwidth -foreground -highlightcolor -highlightthickness \
+ -insertbackground -insertborderwidth -insertofftime -insertontime \
+ -insertwidth -jump -labelfont -selectbackground -selectborderwidth \
+ -textbackground -textfont -troughcolor
+}
+
+# ------------------------------------------------------------------
+# EXTFILESELECTIONBOX
+# ------------------------------------------------------------------
+itcl::class iwidgets::Extfileselectionbox {
+ inherit itk::Widget
+
+ constructor {args} {}
+ destructor {}
+
+ itk_option define -childsitepos childSitePos Position s
+ itk_option define -fileson filesOn FilesOn true
+ itk_option define -dirson dirsOn DirsOn true
+ itk_option define -selectionon selectionOn SelectionOn true
+ itk_option define -filteron filterOn FilterOn true
+ itk_option define -mask mask Mask {*}
+ itk_option define -directory directory Directory {}
+ itk_option define -automount automount Automount {}
+ itk_option define -nomatchstring noMatchString NoMatchString {}
+ itk_option define -dirsearchcommand dirSearchCommand Command {}
+ itk_option define -filesearchcommand fileSearchCommand Command {}
+ itk_option define -selectioncommand selectionCommand Command {}
+ itk_option define -filtercommand filterCommand Command {}
+ itk_option define -selectdircommand selectDirCommand Command {}
+ itk_option define -selectfilecommand selectFileCommand Command {}
+ itk_option define -invalid invalid Command {bell}
+ itk_option define -filetype fileType FileType {regular}
+ itk_option define -width width Width 350
+ itk_option define -height height Height 300
+
+ public {
+ method childsite {}
+ method get {}
+ method filter {}
+ }
+
+ protected {
+ method _packComponents {{when later}}
+ method _updateLists {{when later}}
+ }
+
+ private {
+ method _selectDir {}
+ method _dblSelectDir {}
+ method _selectFile {}
+ method _selectSelection {}
+ method _selectFilter {}
+ method _setFilter {}
+ method _setSelection {}
+ method _setDirList {}
+ method _setFileList {}
+
+ method _nPos {}
+ method _sPos {}
+ method _ePos {}
+ method _wPos {}
+ method _topPos {}
+ method _bottomPos {}
+
+ variable _packToken "" ;# non-null => _packComponents pending
+ variable _updateToken "" ;# non-null => _updateLists pending
+ variable _pwd "." ;# present working dir
+ variable _interior ;# original interior setting
+ }
+}
+
+#
+# Provide a lowercased access method for the Extfileselectionbox class.
+#
+proc ::iwidgets::extfileselectionbox {pathName args} {
+ uplevel ::iwidgets::Extfileselectionbox $pathName $args
+}
+
+#
+# Use option database to override default resources of base classes.
+#
+option add *Extfileselectionbox.borderWidth 2 widgetDefault
+
+option add *Extfileselectionbox.filterLabel Filter widgetDefault
+option add *Extfileselectionbox.dirsLabel Directories widgetDefault
+option add *Extfileselectionbox.filesLabel Files widgetDefault
+option add *Extfileselectionbox.selectionLabel Selection widgetDefault
+
+option add *Extfileselectionbox.width 350 widgetDefault
+option add *Extfileselectionbox.height 300 widgetDefault
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Extfileselectionbox::constructor {args} {
+ #
+ # Add back to the hull width and height options and make the
+ # borderwidth zero since we don't need it.
+ #
+ itk_option add hull.width hull.height
+ component hull configure -borderwidth 0
+
+ set _interior $itk_interior
+
+ #
+ # Create the filter entry.
+ #
+ itk_component add filter {
+ iwidgets::Combobox $itk_interior.filter -unique true \
+ -command [itcl::code $this _selectFilter] -exportselection 0 \
+ -labelpos nw -completion 0
+
+ } {
+ usual
+
+ rename -labeltext -filterlabel filterLabel Text
+ }
+
+ set cmd [$itk_component(filter) cget -command]
+ set cmd "$cmd;[itcl::code $this _selectFilter]"
+ $itk_component(filter) configure -command "$cmd" -selectioncommand "$cmd";
+
+ #
+ # Create a paned window for the directory and file lists.
+ #
+ itk_component add listpane {
+ iwidgets::Panedwindow $itk_interior.listpane -orient vertical
+ }
+
+ $itk_component(listpane) add dirs -margin 5
+ $itk_component(listpane) add files -margin 5
+
+ #
+ # Create the directory list.
+ #
+ itk_component add dirs {
+ iwidgets::Scrolledlistbox [$itk_component(listpane) childsite dirs].dirs \
+ -selectioncommand [itcl::code $this _selectDir] \
+ -selectmode single -exportselection 0 \
+ -visibleitems 1x1 -labelpos nw \
+ -hscrollmode static -vscrollmode static \
+ -dblclickcommand [itcl::code $this _dblSelectDir]
+ } {
+ usual
+
+ rename -labeltext -dirslabel dirsLabel Text
+ }
+ grid $itk_component(dirs) -sticky nsew
+ grid rowconfigure [$itk_component(listpane) childsite dirs] 0 -weight 1
+ grid columnconfigure [$itk_component(listpane) childsite dirs] 0 -weight 1
+
+ #
+ # Create the files list.
+ #
+ itk_component add files {
+ iwidgets::Scrolledlistbox [$itk_component(listpane) childsite files].files \
+ -selectioncommand [itcl::code $this _selectFile] \
+ -selectmode single -exportselection 0 \
+ -visibleitems 1x1 -labelpos nw \
+ -hscrollmode static -vscrollmode static
+ } {
+ usual
+
+ rename -labeltext -fileslabel filesLabel Text
+ }
+ grid $itk_component(files) -sticky nsew
+ grid rowconfigure [$itk_component(listpane) childsite files] 0 -weight 1
+ grid columnconfigure [$itk_component(listpane) childsite files] 0 -weight 1
+
+ #
+ # Create the selection entry.
+ #
+ itk_component add selection {
+ iwidgets::Combobox $itk_interior.selection -unique true \
+ -command [itcl::code $this _selectSelection] -exportselection 0 \
+ -labelpos nw -completion 0
+ } {
+ usual
+
+ rename -labeltext -selectionlabel selectionLabel Text
+ }
+
+ #
+ # Create the child site widget.
+ #
+ itk_component add -protected childsite {
+ frame $itk_interior.fsbchildsite
+ }
+
+ #
+ # Set the interior variable to the childsite for derived classes.
+ #
+ set itk_interior $itk_component(childsite)
+
+ #
+ # Explicitly handle configs that may have been ignored earlier.
+ #
+ eval itk_initialize $args
+
+ #
+ # When idle, pack the childsite and update the lists.
+ #
+ _packComponents
+ _updateLists
+}
+
+# ------------------------------------------------------------------
+# DESTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Extfileselectionbox::destructor {} {
+ if {$_packToken != ""} {after cancel $_packToken}
+ if {$_updateToken != ""} {after cancel $_updateToken}
+}
+
+# ------------------------------------------------------------------
+# OPTIONS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# OPTION: -childsitepos
+#
+# Specifies the position of the child site in the selection box.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Extfileselectionbox::childsitepos {
+ _packComponents
+}
+
+# ------------------------------------------------------------------
+# OPTION: -fileson
+#
+# Specifies whether or not to display the files list.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Extfileselectionbox::fileson {
+ if {$itk_option(-fileson)} {
+ $itk_component(listpane) show files
+
+ _updateLists
+
+ } else {
+ $itk_component(listpane) hide files
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -dirson
+#
+# Specifies whether or not to display the dirs list.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Extfileselectionbox::dirson {
+ if {$itk_option(-dirson)} {
+ $itk_component(listpane) show dirs
+
+ _updateLists
+
+ } else {
+ $itk_component(listpane) hide dirs
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -selectionon
+#
+# Specifies whether or not to display the selection entry widget.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Extfileselectionbox::selectionon {
+ _packComponents
+}
+
+# ------------------------------------------------------------------
+# OPTION: -filteron
+#
+# Specifies whether or not to display the filter entry widget.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Extfileselectionbox::filteron {
+ _packComponents
+}
+
+# ------------------------------------------------------------------
+# OPTION: -mask
+#
+# Specifies the initial file mask string.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Extfileselectionbox::mask {
+ global tcl_platform
+ set prefix $_pwd
+
+ #
+ # Remove automounter paths.
+ #
+ if {$tcl_platform(platform) == "unix"} {
+ if {$itk_option(-automount) != {}} {
+ foreach autoDir $itk_option(-automount) {
+ # Use catch because we can't be sure exactly what strings
+ # were passed into the -automount option
+ catch {
+ if {[regsub ^/$autoDir $prefix {} prefix] != 0} {
+ break
+ }
+ }
+ }
+ }
+ }
+
+ set curFilter $itk_option(-mask);
+ $itk_component(filter) delete entry 0 end
+ $itk_component(filter) insert entry 0 [file join "$_pwd" $itk_option(-mask)]
+
+ #
+ # Make sure the right most text is visable.
+ #
+ [$itk_component(filter) component entry] xview moveto 1
+}
+
+# ------------------------------------------------------------------
+# OPTION: -directory
+#
+# Specifies the initial default directory.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Extfileselectionbox::directory {
+ if {$itk_option(-directory) != {}} {
+ if {! [file exists $itk_option(-directory)]} {
+ error "bad directory option \"$itk_option(-directory)\":\
+ directory does not exist"
+ }
+
+ set olddir [pwd]
+ cd $itk_option(-directory)
+ set _pwd [pwd]
+ cd $olddir
+
+ configure -mask $itk_option(-mask)
+ _selectFilter
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -automount
+#
+# Specifies list of directory prefixes to ignore. Typically, this
+# option would be used with values such as:
+# -automount {export tmp_mnt}
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Extfileselectionbox::automount {
+}
+
+# ------------------------------------------------------------------
+# OPTION: -nomatchstring
+#
+# Specifies the string to be displayed in the files list should
+# not regular files exist in the directory.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Extfileselectionbox::nomatchstring {
+}
+
+# ------------------------------------------------------------------
+# OPTION: -dirsearchcommand
+#
+# Specifies a command to be executed to perform a directory search.
+# The command will receive the current working directory and filter
+# mask as arguments. The command should return a list of files which
+# will be placed into the directory list.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Extfileselectionbox::dirsearchcommand {
+}
+
+# ------------------------------------------------------------------
+# OPTION: -filesearchcommand
+#
+# Specifies a command to be executed to perform a file search.
+# The command will receive the current working directory and filter
+# mask as arguments. The command should return a list of files which
+# will be placed into the file list.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Extfileselectionbox::filesearchcommand {
+}
+
+# ------------------------------------------------------------------
+# OPTION: -selectioncommand
+#
+# Specifies a command to be executed upon pressing return in the
+# selection entry widget.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Extfileselectionbox::selectioncommand {
+}
+
+# ------------------------------------------------------------------
+# OPTION: -filtercommand
+#
+# Specifies a command to be executed upon pressing return in the
+# filter entry widget.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Extfileselectionbox::filtercommand {
+}
+
+# ------------------------------------------------------------------
+# OPTION: -selectdircommand
+#
+# Specifies a command to be executed following selection of a
+# directory in the directory list.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Extfileselectionbox::selectdircommand {
+}
+
+# ------------------------------------------------------------------
+# OPTION: -selectfilecommand
+#
+# Specifies a command to be executed following selection of a
+# file in the files list.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Extfileselectionbox::selectfilecommand {
+}
+
+# ------------------------------------------------------------------
+# OPTION: -invalid
+#
+# Specify a command to executed should the filter contents be
+# proven invalid.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Extfileselectionbox::invalid {
+}
+
+# ------------------------------------------------------------------
+# OPTION: -filetype
+#
+# Specify the type of files which may appear in the file list.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Extfileselectionbox::filetype {
+ switch $itk_option(-filetype) {
+ regular -
+ directory -
+ any {
+ }
+ default {
+ error "bad filetype option \"$itk_option(-filetype)\":\
+ should be regular, directory, or any"
+ }
+ }
+
+ _updateLists
+}
+
+# ------------------------------------------------------------------
+# OPTION: -width
+#
+# Specifies the width of the file selection box. The value may be
+# specified in any of the forms acceptable to Tk_GetPixels.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Extfileselectionbox::width {
+ #
+ # The width option was added to the hull in the constructor.
+ # So, any width value given is passed automatically to the
+ # hull. All we have to do is play with the propagation.
+ #
+ if {$itk_option(-width) != 0} {
+ set propagate 0
+ } else {
+ set propagate 1
+ }
+
+ #
+ # Due to a bug in the tk4.2 grid, we have to check the
+ # propagation before setting it. Setting it to the same
+ # value it already is will cause it to toggle.
+ #
+ if {[grid propagate $itk_component(hull)] != $propagate} {
+ grid propagate $itk_component(hull) $propagate
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -height
+#
+# Specifies the height of the file selection box. The value may be
+# specified in any of the forms acceptable to Tk_GetPixels.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Extfileselectionbox::height {
+ #
+ # The height option was added to the hull in the constructor.
+ # So, any height value given is passed automatically to the
+ # hull. All we have to do is play with the propagation.
+ #
+ if {$itk_option(-height) != 0} {
+ set propagate 0
+ } else {
+ set propagate 1
+ }
+
+ #
+ # Due to a bug in the tk4.2 grid, we have to check the
+ # propagation before setting it. Setting it to the same
+ # value it already is will cause it to toggle.
+ #
+ if {[grid propagate $itk_component(hull)] != $propagate} {
+ grid propagate $itk_component(hull) $propagate
+ }
+}
+
+# ------------------------------------------------------------------
+# METHODS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# METHOD: childsite
+#
+# Returns the path name of the child site widget.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Extfileselectionbox::childsite {} {
+ return $itk_component(childsite)
+}
+
+# ------------------------------------------------------------------
+# METHOD: get
+#
+# Returns the current selection.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Extfileselectionbox::get {} {
+ return [$itk_component(selection) get]
+}
+
+# ------------------------------------------------------------------
+# METHOD: filter
+#
+# The user has pressed Return in the filter. Make sure the contents
+# contain a valid directory before setting default to directory.
+# Use the invalid option to warn the user of any problems.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Extfileselectionbox::filter {} {
+ set newdir [file dirname [$itk_component(filter) get]]
+
+ if {! [file exists $newdir]} {
+ uplevel #0 "$itk_option(-invalid)"
+ return
+ }
+
+ set _pwd $newdir;
+ if {$_pwd == "."} {set _pwd [pwd]};
+
+ _updateLists
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _updateLists ?now?
+#
+# Updates the contents of both the file and directory lists, as well
+# resets the positions of the filter, and lists.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Extfileselectionbox::_updateLists {{when "later"}} {
+ switch -- $when {
+ later {
+ if {$_updateToken == ""} {
+ set _updateToken [after idle [itcl::code $this _updateLists now]]
+ }
+ }
+ now {
+ if {$itk_option(-dirson)} {_setDirList}
+ if {$itk_option(-fileson)} {_setFileList}
+
+ if {$itk_option(-filteron)} {
+ _setFilter
+ }
+ if {$itk_option(-selectionon)} {
+ $itk_component(selection) icursor end
+ }
+ if {$itk_option(-dirson)} {
+ $itk_component(dirs) justify left
+ }
+ if {$itk_option(-fileson)} {
+ $itk_component(files) justify left
+ }
+ set _updateToken ""
+ }
+ default {
+ error "bad option \"$when\": should be later or now"
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _setFilter
+#
+# Set the filter to the current selection in the directory list plus
+# any existing mask in the filter. Translate the two special cases
+# of '.', and '..' directory names to full path names..
+# ------------------------------------------------------------------
+itcl::body iwidgets::Extfileselectionbox::_setFilter {} {
+ global tcl_platform
+ set prefix [$itk_component(dirs) getcurselection]
+ set curFilter [file tail [$itk_component(filter) get]]
+
+ while {[regexp {\.$} $prefix]} {
+ if {[file tail $prefix] == "."} {
+ if {$prefix == "."} {
+ if {$_pwd == "."} {
+ set _pwd [pwd]
+ } elseif {$_pwd == ".."} {
+ set _pwd [file dirname [pwd]]
+ }
+ set prefix $_pwd
+ } else {
+ set prefix [file dirname $prefix]
+ }
+ } elseif {[file tail $prefix] == ".."} {
+ if {$prefix != ".."} {
+ set prefix [file dirname [file dirname $prefix]]
+ } else {
+ if {$_pwd == "."} {
+ set _pwd [pwd]
+ } elseif {$_pwd == ".."} {
+ set _pwd [file dirname [pwd]]
+ }
+ set prefix [file dirname "$_pwd"]
+ }
+ } else {
+ break
+ }
+ }
+
+ if { [file pathtype $prefix] != "absolute" } {
+ set prefix [file join "$_pwd" $prefix]
+ }
+
+ #
+ # Remove automounter paths.
+ #
+ if {$tcl_platform(platform) == "unix"} {
+ if {$itk_option(-automount) != {}} {
+ foreach autoDir $itk_option(-automount) {
+ # Use catch because we can't be sure exactly what strings
+ # were passed into the -automount option
+ catch {
+ if {[regsub ^/$autoDir $prefix {} prefix] != 0} {
+ break
+ }
+ }
+ }
+ }
+ }
+
+ $itk_component(filter) delete entry 0 end
+ $itk_component(filter) insert entry 0 [file join $prefix $curFilter]
+
+ if {[info level -1] != "_selectDir"} {
+ $itk_component(filter) insert list 0 [file join $prefix $curFilter]
+ }
+
+ #
+ # Make sure insertion cursor is at the end.
+ #
+ $itk_component(filter) icursor end
+
+ #
+ # Make sure the right most text is visable.
+ #
+ [$itk_component(filter) component entry] xview moveto 1
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _setSelection
+#
+# Set the contents of the selection entry to either the current
+# selection of the file or directory list dependent on which lists
+# are currently mapped. For the file list, avoid seleciton of the
+# no match string. As for the directory list, translate file names.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Extfileselectionbox::_setSelection {} {
+ global tcl_platform
+ $itk_component(selection) delete entry 0 end
+
+ if {$itk_option(-fileson)} {
+ set selection [$itk_component(files) getcurselection]
+
+ if {$selection != $itk_option(-nomatchstring)} {
+ if {[file pathtype $selection] != "absolute"} {
+ set selection [file join "$_pwd" $selection]
+ }
+
+ #
+ # Remove automounter paths.
+ #
+ if {$tcl_platform(platform) == "unix"} {
+ if {$itk_option(-automount) != {}} {
+ foreach autoDir $itk_option(-automount) {
+ # Use catch because we can't be sure exactly what strings
+ # were passed into the -automount option
+ catch {
+ if {[regsub ^/$autoDir $selection {} selection] != 0} {
+ break
+ }
+ }
+ }
+ }
+ }
+
+ $itk_component(selection) insert entry 0 $selection
+ } else {
+ $itk_component(files) selection clear 0 end
+ }
+
+ } else {
+ set selection [$itk_component(dirs) getcurselection]
+
+ if {[file tail $selection] == "."} {
+ if {$selection != "."} {
+ set selection [file dirname $selection]
+ } else {
+ set selection "$_pwd"
+ }
+ } elseif {[file tail $selection] == ".."} {
+ if {$selection != ".."} {
+ set selection [file dirname [file dirname $selection]]
+ } else {
+ set selection [file join "$_pwd" ..]
+ }
+ } else {
+ set selection [file join "$_pwd" $selection]
+ }
+
+ #
+ # Remove automounter paths.
+ #
+ if {$tcl_platform(platform) == "unix"} {
+ if {$itk_option(-automount) != {}} {
+ foreach autoDir $itk_option(-automount) {
+ # Use catch because we can't be sure exactly what strings
+ # were passed into the -automount option
+ catch {
+ if {[regsub ^/$autoDir $selection {} selection] != 0} {
+ break
+ }
+ }
+ }
+ }
+ }
+
+ $itk_component(selection) insert entry 0 $selection
+ }
+
+ $itk_component(selection) insert list 0 $selection
+ $itk_component(selection) icursor end
+
+ #
+ # Make sure the right most text is visable.
+ #
+ [$itk_component(selection) component entry] xview moveto 1
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _setDirList
+#
+# Clear the directory list and dependent on whether the user has
+# defined their own search procedure or not fill the list with their
+# results or those of a glob. Select the first element if it exists.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Extfileselectionbox::_setDirList {} {
+ $itk_component(dirs) clear
+
+ if {$itk_option(-dirsearchcommand) == {}} {
+ set cwd "$_pwd"
+
+ set counter 0
+ set currentIndex ""
+ foreach i [lsort [glob -nocomplain \
+ [file join $cwd .*] [file join $cwd *]]] {
+ if {[file isdirectory $i]} {
+ set insert "[file tail $i]"
+ if {$insert == "."} {
+ set currentIndex $counter
+ }
+ $itk_component(dirs) insert end "$insert"
+ incr counter
+ }
+ }
+
+ } else {
+ set mask [file tail [$itk_component(filter) get]]
+
+ foreach file [uplevel #0 $itk_option(-dirsearchcommand) "$_pwd" $mask] {
+ $itk_component(dirs) insert end $file
+ }
+ }
+
+ if {[$itk_component(dirs) size]} {
+ $itk_component(dirs) selection clear 0 end
+ if {$currentIndex != ""} {
+ $itk_component(dirs) selection set $currentIndex
+ } else {
+ $itk_component(dirs) selection set 0
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _setFileList
+#
+# Clear the file list and dependent on whether the user has defined
+# their own search procedure or not fill the list with their results
+# or those of a 'glob'. If the files list has no contents, then set
+# the files list to the 'nomatchstring'. Clear all selections.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Extfileselectionbox::_setFileList {} {
+ $itk_component(files) clear
+ set mask [file tail [$itk_component(filter) get]]
+
+ if {$itk_option(-filesearchcommand) == {}} {
+ if {$mask == "*"} {
+ set files [lsort [glob -nocomplain \
+ [file join "$_pwd" .*] [file join "$_pwd" *]]]
+ } else {
+ set files [lsort [glob -nocomplain [file join "$_pwd" $mask]]]
+ }
+
+ foreach i $files {
+ if {($itk_option(-filetype) == "regular" && \
+ ! [file isdirectory $i]) || \
+ ($itk_option(-filetype) == "directory" && \
+ [file isdirectory $i]) || \
+ ($itk_option(-filetype) == "any")} {
+ set insert "[file tail $i]"
+ $itk_component(files) insert end "$insert"
+ }
+ }
+
+ } else {
+ foreach file [uplevel #0 $itk_option(-filesearchcommand) "$_pwd" $mask] {
+ $itk_component(files) insert end $file
+ }
+ }
+
+ if {[$itk_component(files) size] == 0} {
+ if {$itk_option(-nomatchstring) != {}} {
+ $itk_component(files) insert end $itk_option(-nomatchstring)
+ }
+ }
+
+ $itk_component(files) selection clear 0 end
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _selectDir
+#
+# For a selection in the directory list, set the filter and possibly
+# the selection entry based on the fileson option.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Extfileselectionbox::_selectDir {} {
+ _setFilter
+
+ if {$itk_option(-fileson)} {} {
+ _setSelection
+ }
+
+ if {$itk_option(-selectdircommand) != {}} {
+ uplevel #0 $itk_option(-selectdircommand)
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _dblSelectDir
+#
+# For a double click event in the directory list, select the
+# directory, set the default to the selection, and update both the
+# file and directory lists.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Extfileselectionbox::_dblSelectDir {} {
+ filter
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _selectFile
+#
+# The user has selected a file. Put the current selection in the
+# file list in the selection entry widget.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Extfileselectionbox::_selectFile {} {
+ _setSelection
+
+ if {$itk_option(-selectfilecommand) != {}} {
+ uplevel #0 $itk_option(-selectfilecommand)
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _selectSelection
+#
+# The user has pressed Return in the selection entry widget. Call
+# the defined selection command if it exists.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Extfileselectionbox::_selectSelection {} {
+ if {$itk_option(-selectioncommand) != {}} {
+ uplevel #0 $itk_option(-selectioncommand)
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _selectFilter
+#
+# The user has pressed Return in the filter entry widget. Call the
+# defined selection command if it exists, otherwise just filter.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Extfileselectionbox::_selectFilter {} {
+ if {$itk_option(-filtercommand) != {}} {
+ uplevel #0 $itk_option(-filtercommand)
+ } else {
+ filter
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _packComponents
+#
+# Pack the selection, items, and child site widgets based on options.
+# Using the -in option of pack, put the childsite around the frame
+# in the hull for n, s, e, and w positions. Make sure and raise
+# the child site since using the 'in' option may obscure the site.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Extfileselectionbox::_packComponents {{when "later"}} {
+ if {$when == "later"} {
+ if {$_packToken == ""} {
+ set _packToken [after idle [itcl::code $this _packComponents now]]
+ }
+ return
+ } elseif {$when != "now"} {
+ error "bad option \"$when\": should be now or later"
+ }
+
+ set _packToken ""
+
+ #
+ # Forget about any previous placements via the grid and
+ # reset all the possible minsizes and weights for all
+ # the rows and columns.
+ #
+ foreach component {childsite listpane filter selection} {
+ grid forget $itk_component($component)
+ }
+
+ for {set row 0} {$row < 6} {incr row} {
+ grid rowconfigure $_interior $row -minsize 0 -weight 0
+ }
+
+ for {set col 0} {$col < 3} {incr col} {
+ grid columnconfigure $_interior $col -minsize 0 -weight 0
+ }
+
+ #
+ # Place all the components based on the childsite poisition
+ # option.
+ #
+ switch $itk_option(-childsitepos) {
+ n { _nPos }
+
+ w { _wPos }
+
+ s { _sPos }
+
+ e { _ePos }
+
+ top { _topPos }
+
+ bottom { _bottomPos }
+
+ default {
+ error "bad childsitepos option \"$itk_option(-childsitepos)\":\
+ should be n, e, s, w, top, or bottom"
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _nPos
+#
+# Position the childsite to the north and all the other components
+# appropriately based on the individual "on" options.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Extfileselectionbox::_nPos {} {
+ grid $itk_component(childsite) -row 0 -column 0 \
+ -columnspan 1 -rowspan 1 -sticky nsew -padx 5
+
+ if {$itk_option(-filteron)} {
+ grid $itk_component(filter) -row 1 -column 0 \
+ -columnspan 1 -sticky ew -padx 5
+ grid rowconfigure $_interior 2 -minsize 7
+ }
+
+ grid $itk_component(listpane) -row 3 -column 0 \
+ -columnspan 1 -sticky nsew
+
+ grid rowconfigure $_interior 3 -weight 1
+
+ if {$itk_option(-selectionon)} {
+ grid rowconfigure $_interior 4 -minsize 7
+ grid $itk_component(selection) -row 5 -column 0 \
+ -columnspan 1 -sticky ew -padx 5
+ }
+
+ grid columnconfigure $_interior 0 -weight 1
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _sPos
+#
+# Position the childsite to the south and all the other components
+# appropriately based on the individual "on" options.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Extfileselectionbox::_sPos {} {
+ if {$itk_option(-filteron)} {
+ grid $itk_component(filter) -row 0 -column 0 \
+ -columnspan 1 -sticky ew -padx 5
+ grid rowconfigure $_interior 1 -minsize 7
+ }
+
+ grid $itk_component(listpane) -row 2 -column 0 \
+ -columnspan 1 -sticky nsew
+
+ grid rowconfigure $_interior 2 -weight 1
+
+ if {$itk_option(-selectionon)} {
+ grid rowconfigure $_interior 3 -minsize 7
+ grid $itk_component(selection) -row 4 -column 0 \
+ -columnspan 1 -sticky ew -padx 5
+ }
+
+ grid $itk_component(childsite) -row 5 -column 0 \
+ -columnspan 1 -rowspan 1 -sticky nsew -padx 5
+
+ grid columnconfigure $_interior 0 -weight 1
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _ePos
+#
+# Position the childsite to the east and all the other components
+# appropriately based on the individual "on" options.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Extfileselectionbox::_ePos {} {
+ if {$itk_option(-filteron)} {
+ grid $itk_component(filter) -row 0 -column 0 \
+ -columnspan 1 -sticky ew -padx 5
+ grid rowconfigure $_interior 1 -minsize 7
+ }
+
+ grid $itk_component(listpane) -row 2 -column 0 \
+ -columnspan 1 -sticky nsew
+
+ grid rowconfigure $_interior 2 -weight 1
+
+ if {$itk_option(-selectionon)} {
+ grid rowconfigure $_interior 3 -minsize 7
+ grid $itk_component(selection) -row 4 -column 0 \
+ -columnspan 1 -sticky ew -padx 5
+ }
+
+ grid $itk_component(childsite) -row 0 -column 1 \
+ -rowspan 5 -columnspan 1 -sticky nsew
+
+ grid columnconfigure $_interior 0 -weight 1
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _wPos
+#
+# Position the childsite to the west and all the other components
+# appropriately based on the individual "on" options.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Extfileselectionbox::_wPos {} {
+ grid $itk_component(childsite) -row 0 -column 0 \
+ -rowspan 5 -columnspan 1 -sticky nsew
+
+ if {$itk_option(-filteron)} {
+ grid $itk_component(filter) -row 0 -column 1 \
+ -columnspan 1 -sticky ew -padx 5
+ grid rowconfigure $_interior 1 -minsize 7
+ }
+
+ grid $itk_component(listpane) -row 2 -column 1 \
+ -columnspan 1 -sticky nsew
+
+ grid rowconfigure $_interior 2 -weight 1
+
+ if {$itk_option(-selectionon)} {
+ grid rowconfigure $_interior 3 -minsize 7
+ grid $itk_component(selection) -row 4 -column 1 \
+ -columnspan 1 -sticky ew -padx 5
+ }
+
+ grid columnconfigure $_interior 1 -weight 1
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _topPos
+#
+# Position the childsite below the filter but above the lists and
+# all the other components appropriately based on the individual
+# "on" options.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Extfileselectionbox::_topPos {} {
+ if {$itk_option(-filteron)} {
+ grid $itk_component(filter) -row 0 -column 0 \
+ -columnspan 1 -sticky ew -padx 5
+ }
+
+ grid $itk_component(childsite) -row 1 -column 0 \
+ -columnspan 1 -rowspan 1 -sticky nsew -padx 5
+
+ grid $itk_component(listpane) -row 2 -column 0 -sticky nsew
+
+ grid rowconfigure $_interior 2 -weight 1
+
+ if {$itk_option(-selectionon)} {
+ grid rowconfigure $_interior 3 -minsize 7
+ grid $itk_component(selection) -row 4 -column 0 \
+ -columnspan 1 -sticky ew -padx 5
+ }
+
+ grid columnconfigure $_interior 0 -weight 1
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _bottomPos
+#
+# Position the childsite below the lists and above the selection
+# and all the other components appropriately based on the individual
+# "on" options.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Extfileselectionbox::_bottomPos {} {
+ if {$itk_option(-filteron)} {
+ grid $itk_component(filter) -row 0 -column 0 \
+ -columnspan 1 -sticky ew -padx 5
+ grid rowconfigure $_interior 1 -minsize 7
+ }
+
+ grid $itk_component(listpane) -row 2 -column 0 -sticky nsew
+
+ grid rowconfigure $_interior 2 -weight 1
+
+ grid $itk_component(childsite) -row 3 -column 0 \
+ -columnspan 1 -rowspan 1 -sticky nsew -padx 5
+
+ if {$itk_option(-selectionon)} {
+ grid $itk_component(selection) -row 4 -column 0 \
+ -columnspan 1 -sticky ew -padx 5
+ }
+
+ grid columnconfigure $_interior 0 -weight 1
+}
diff --git a/iwidgets/generic/extfileselectiondialog.itk b/iwidgets/generic/extfileselectiondialog.itk
new file mode 100644
index 00000000000..220a8fcb33a
--- /dev/null
+++ b/iwidgets/generic/extfileselectiondialog.itk
@@ -0,0 +1,182 @@
+#
+# Extfileselectiondialog
+# ----------------------------------------------------------------------
+# Implements a file selection dialog that is a slightly extended version
+# of the OSF/Motif standard composite widget. The Extfileselectionbox
+# differs from the Motif standard in that the filter and selection
+# fields are comboboxes and the files and directory lists are in a
+# paned window.
+#
+# ----------------------------------------------------------------------
+# AUTHOR: Mark L. Ulferts EMAIL: mulferts@spd.dsccc.com
+#
+# @(#) $Id$
+# ----------------------------------------------------------------------
+# Copyright (c) 1997 DSC Technologies Corporation
+# ======================================================================
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+
+#
+# Usual options.
+#
+itk::usual Extfileselectiondialog {
+ keep -activebackground -activerelief -background -borderwidth -cursor \
+ -elementborderwidth -foreground -highlightcolor -highlightthickness \
+ -insertbackground -insertborderwidth -insertofftime -insertontime \
+ -insertwidth -jump -labelfont -modality -selectbackground \
+ -selectborderwidth -textbackground -textfont
+}
+
+# ------------------------------------------------------------------
+# EXTFILESELECTIONDIALOG
+# ------------------------------------------------------------------
+itcl::class iwidgets::Extfileselectiondialog {
+ inherit iwidgets::Dialog
+
+ constructor {args} {}
+
+ public {
+ method childsite {}
+ method get {}
+ method filter {}
+ }
+
+ protected method _dbldir {}
+}
+
+#
+# Provide a lowercased access method for the Extfileselectiondialog class.
+#
+proc ::iwidgets::extfileselectiondialog {pathName args} {
+ uplevel ::iwidgets::Extfileselectiondialog $pathName $args
+}
+
+#
+# Use option database to override default resources of base classes.
+#
+option add *Extfileselectiondialog.borderWidth 2 widgetDefault
+
+option add *Extfileselectiondialog.title "File Selection Dialog" widgetDefault
+
+option add *Extfileselectiondialog.width 350 widgetDefault
+option add *Extfileselectiondialog.height 400 widgetDefault
+
+option add *Extfileselectiondialog.master "." widgetDefault
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Extfileselectiondialog::constructor {args} {
+ component hull configure -borderwidth 0
+ itk_option add hull.width hull.height
+
+ #
+ # Turn off pack propagation for the hull widget so the width
+ # and height options become active.
+ #
+ pack propagate $itk_component(hull) no
+
+ #
+ # Instantiate a file selection box widget.
+ #
+ itk_component add fsb {
+ iwidgets::Extfileselectionbox $itk_interior.fsb -width 150 -height 150 \
+ -selectioncommand [itcl::code $this invoke] \
+ -selectdircommand [itcl::code $this default Apply] \
+ -selectfilecommand [itcl::code $this default OK]
+ } {
+ usual
+
+ keep -labelfont -childsitepos -directory -dirslabel \
+ -dirsearchcommand -dirson -fileslabel -fileson \
+ -filesearchcommand -filterlabel -filteron \
+ -filetype -invalid -mask -nomatchstring \
+ -selectionlabel -selectionon -sashcursor
+ }
+ grid $itk_component(fsb) -sticky nsew
+ grid rowconfigure $itk_interior 0 -weight 1
+ grid columnconfigure $itk_interior 0 -weight 1
+
+ $itk_component(fsb) component filter configure \
+ -focuscommand [itcl::code $this default Apply]
+ $itk_component(fsb) component selection configure \
+ -focuscommand [itcl::code $this default OK]
+ $itk_component(fsb) component dirs configure \
+ -dblclickcommand [itcl::code $this _dbldir]
+ $itk_component(fsb) component files configure \
+ -dblclickcommand [itcl::code $this invoke]
+
+ buttonconfigure Apply -text "Filter" \
+ -command [itcl::code $itk_component(fsb) filter]
+
+ set itk_interior [$itk_component(fsb) childsite]
+
+ hide Help
+
+ eval itk_initialize $args
+}
+
+# ------------------------------------------------------------------
+# METHODS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# METHOD: childsite
+#
+# Thinwrapped method of file selection box class.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Extfileselectiondialog::childsite {} {
+ return [$itk_component(fsb) childsite]
+}
+
+# ------------------------------------------------------------------
+# METHOD: get
+#
+# Thinwrapped method of file selection box class.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Extfileselectiondialog::get {} {
+ return [$itk_component(fsb) get]
+}
+
+# ------------------------------------------------------------------
+# METHOD: filter
+#
+# Thinwrapped method of file selection box class.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Extfileselectiondialog::filter {} {
+ return [$itk_component(fsb) filter]
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _dbldir
+#
+# Double select in directory list. If the files list is on then
+# make the default button the filter and invoke. If not, just invoke.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Extfileselectiondialog::_dbldir {} {
+ if {$itk_option(-fileson)} {
+ default Apply
+ }
+
+ invoke
+}
+
diff --git a/iwidgets/generic/feedback.itk b/iwidgets/generic/feedback.itk
new file mode 100644
index 00000000000..5fe5a84d224
--- /dev/null
+++ b/iwidgets/generic/feedback.itk
@@ -0,0 +1,212 @@
+#
+# Feedback
+# ----------------------------------------------------------------------
+# Implements a Feedback widget, to display feedback on the status of an
+# process to the user. Display is given as a percentage and as a
+# thermometer type bar. Options exist for adding a label and controlling its
+# position.
+#
+# ----------------------------------------------------------------------
+# AUTHOR: Kris Raney EMAIL: kraney@spd.dsccc.com
+#
+# @(#) $Id$
+# ----------------------------------------------------------------------
+# Copyright (c) 1996 DSC Technologies Corporation
+# ======================================================================
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+
+# Acknowledgements:
+#
+# Special thanks go to Sam Shen(SLShen@lbl.gov), as this code is based on his
+# feedback.tcl code from tk inspect. The original code is copyright 1995
+# Lawrence Berkeley Laboratory.
+#
+# This software is copyright (C) 1994 by the Lawrence Berkeley Laboratory.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that: (1) source code distributions
+# retain the above copyright notice and this paragraph in its entirety, (2)
+# distributions including binary code include the above copyright notice and
+# this paragraph in its entirety in the documentation or other materials
+# provided with the distribution, and (3) all advertising materials mentioning
+# features or use of this software display the following acknowledgement:
+# ``This product includes software developed by the University of California,
+# Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
+# the University nor the names of its contributors may be used to endorse
+# or promote products derived from this software without specific prior
+# written permission.
+#
+# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+
+#
+# Default resources.
+#
+option add *Feedback.borderWidth 2 widgetDefault
+option add *Feedback.labelPos n widgetDefault
+option add *Feedback.barHeight 20 widgetDefault
+option add *Feedback.troughColor White widgetDefault
+option add *Feedback.barColor Blue widgetDefault
+
+#
+# Usual options.
+#
+itk::usual Feedback {
+ keep -background -cursor -foreground
+}
+
+# ------------------------------------------------------------------
+# FEEDBACK
+# ------------------------------------------------------------------
+itcl::class iwidgets::Feedback {
+ inherit iwidgets::Labeledwidget
+
+ constructor {args} {}
+ destructor {}
+
+ itk_option define -steps steps Steps 10
+
+ public {
+ method reset {}
+ method step {{inc 1}}
+ }
+
+ private {
+ method _display
+
+ variable _barwidth 0
+ variable _stepval 0
+ }
+}
+
+#
+# Provide a lowercased access method for the Dialogshell class.
+#
+proc ::iwidgets::feedback {pathName args} {
+ uplevel ::iwidgets::Feedback $pathName $args
+}
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Feedback::constructor {args} {
+ itk_component add trough {
+ frame $itk_interior.trough -relief sunken
+ } {
+ usual
+ keep -borderwidth
+ rename -background -troughcolor troughColor TroughColor
+ rename -height -barheight barHeight Height
+ }
+
+ itk_component add bar {
+ frame $itk_component(trough).bar -relief raised
+ } {
+ usual
+ keep -borderwidth
+ rename -background -barcolor barColor BarColor
+ rename -height -barheight barHeight Height
+ }
+ pack $itk_component(bar) -side left -fill y -anchor w
+
+ itk_component add percentage {
+ label $itk_interior.percentage -text "0%"
+ }
+ grid $itk_component(trough) -row 1 -column 0 -sticky sew -padx 2 -pady 2
+ grid $itk_component(percentage) -row 2 -column 0 -sticky nsew -padx 2 -pady 2
+ grid rowconfigure $itk_interior 0 -weight 1
+ grid rowconfigure $itk_interior 1 -weight 1
+ grid columnconfigure $itk_interior 0 -weight 1
+
+ bind $itk_component(hull) <Configure> [itcl::code $this _display]
+
+ eval itk_initialize $args
+}
+
+# ------------------------------------------------------------------
+# DESTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Feedback::destructor {} {
+}
+
+# ------------------------------------------------------------------
+# OPTIONS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# OPTION: -steps
+#
+# Set the total number of steps.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Feedback::steps {
+ step 0
+}
+
+# ------------------------------------------------------------------
+# METHODS
+# ------------------------------------------------------------------
+
+# -----------------------------------------------------------------------------
+# PROTECTED METHOD: _display
+#
+# Displays the bar in the trough with the width set using the current number
+# of steps.
+# -----------------------------------------------------------------------------
+itcl::body iwidgets::Feedback::_display {} {
+ update idletasks
+ set troughwidth [winfo width $itk_component(trough)]
+ set _barwidth [expr {
+ (1.0*$troughwidth-(2.0*[$itk_component(trough) cget -borderwidth])) /
+ $itk_option(-steps)}]
+ set fraction [expr {int((1.0*$_stepval)/$itk_option(-steps)*100.0)}]
+
+ $itk_component(percentage) config -text "$fraction%"
+ $itk_component(bar) config -width [expr {$_barwidth*$_stepval}]
+
+ update
+}
+
+# ------------------------------------------------------------------
+# METHOD: reset
+#
+# Resets the status bar to 0
+# ------------------------------------------------------------------
+itcl::body iwidgets::Feedback::reset {} {
+ set _stepval 0
+ _display
+}
+
+# ------------------------------------------------------------------
+# METHOD: step ?inc?
+#
+# Increase the value of the status bar by inc. Default to 1
+# ------------------------------------------------------------------
+itcl::body iwidgets::Feedback::step {{inc 1}} {
+
+ if {$_stepval >= $itk_option(-steps)} {
+ return
+ }
+
+ incr _stepval $inc
+ _display
+}
diff --git a/iwidgets/generic/fileselectionbox.itk b/iwidgets/generic/fileselectionbox.itk
new file mode 100644
index 00000000000..b083c5020b7
--- /dev/null
+++ b/iwidgets/generic/fileselectionbox.itk
@@ -0,0 +1,1296 @@
+#
+# Fileselectionbox
+# ----------------------------------------------------------------------
+# Implements a file selection box in a style similar to the OSF/Motif
+# standard XmFileselectionbox composite widget. The Fileselectionbox
+# is composed of directory and file scrolled lists as well as filter
+# and selection entry fields.
+#
+# ----------------------------------------------------------------------
+# AUTHOR: Mark L. Ulferts EMAIL: mulferts@spd.dsccc.com
+#
+# @(#) $Id$
+# ----------------------------------------------------------------------
+# Copyright (c) 1997 DSC Technologies Corporation
+# ======================================================================
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+
+#
+# Usual options.
+#
+itk::usual Fileselectionbox {
+ keep -activebackground -activerelief -background -borderwidth -cursor \
+ -elementborderwidth -foreground -highlightcolor -highlightthickness \
+ -insertbackground -insertborderwidth -insertofftime -insertontime \
+ -insertwidth -jump -labelfont -selectbackground -selectborderwidth \
+ -textbackground -textfont -troughcolor
+}
+
+# ------------------------------------------------------------------
+# FILESELECTIONBOX
+# ------------------------------------------------------------------
+itcl::class iwidgets::Fileselectionbox {
+ inherit itk::Widget
+
+ constructor {args} {}
+ destructor {}
+
+ itk_option define -childsitepos childSitePos Position s
+ itk_option define -fileson filesOn FilesOn true
+ itk_option define -dirson dirsOn DirsOn true
+ itk_option define -selectionon selectionOn SelectionOn true
+ itk_option define -filteron filterOn FilterOn true
+ itk_option define -mask mask Mask {*}
+ itk_option define -directory directory Directory {}
+ itk_option define -automount automount Automount {}
+ itk_option define -nomatchstring noMatchString NoMatchString {}
+ itk_option define -dirsearchcommand dirSearchCommand Command {}
+ itk_option define -filesearchcommand fileSearchCommand Command {}
+ itk_option define -selectioncommand selectionCommand Command {}
+ itk_option define -filtercommand filterCommand Command {}
+ itk_option define -selectdircommand selectDirCommand Command {}
+ itk_option define -selectfilecommand selectFileCommand Command {}
+ itk_option define -invalid invalid Command {bell}
+ itk_option define -filetype fileType FileType {regular}
+ itk_option define -width width Width 350
+ itk_option define -height height Height 300
+
+ public {
+ method childsite {}
+ method get {}
+ method filter {}
+ }
+
+ public {
+ method _selectDir {}
+ method _dblSelectDir {}
+ method _selectFile {}
+ method _selectSelection {}
+ method _selectFilter {}
+ }
+
+ protected {
+ method _packComponents {{when later}}
+ method _updateLists {{when later}}
+ }
+
+ private {
+ method _setFilter {}
+ method _setSelection {}
+ method _setDirList {}
+ method _setFileList {}
+
+ method _nPos {}
+ method _sPos {}
+ method _ePos {}
+ method _wPos {}
+ method _topPos {}
+ method _centerPos {}
+ method _bottomPos {}
+
+ variable _packToken "" ;# non-null => _packComponents pending
+ variable _updateToken "" ;# non-null => _updateLists pending
+ variable _pwd "." ;# present working dir
+ variable _interior ;# original interior setting
+ }
+}
+
+#
+# Provide a lowercased access method for the Fileselectionbox class.
+#
+proc ::iwidgets::fileselectionbox {pathName args} {
+ uplevel ::iwidgets::Fileselectionbox $pathName $args
+}
+
+#
+# Use option database to override default resources of base classes.
+#
+option add *Fileselectionbox.borderWidth 2 widgetDefault
+
+option add *Fileselectionbox.filterLabel Filter widgetDefault
+option add *Fileselectionbox.dirsLabel Directories widgetDefault
+option add *Fileselectionbox.filesLabel Files widgetDefault
+option add *Fileselectionbox.selectionLabel Selection widgetDefault
+
+option add *Fileselectionbox.width 350 widgetDefault
+option add *Fileselectionbox.height 300 widgetDefault
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Fileselectionbox::constructor {args} {
+ #
+ # Add back to the hull width and height options and make the
+ # borderwidth zero since we don't need it.
+ #
+ itk_option add hull.width hull.height
+ component hull configure -borderwidth 0
+
+ set _interior $itk_interior
+
+ #
+ # Create the filter entry.
+ #
+ itk_component add filter {
+ iwidgets::Entryfield $itk_interior.filter -labelpos nw \
+ -command [itcl::code $this _selectFilter] -exportselection 0
+ } {
+ usual
+
+ rename -labeltext -filterlabel filterLabel Text
+ }
+
+ #
+ # Create the directory list.
+ #
+ itk_component add dirs {
+ iwidgets::Scrolledlistbox $itk_interior.dirs \
+ -selectioncommand [itcl::code $this _selectDir] \
+ -selectmode single -exportselection 0 \
+ -visibleitems 1x1 -labelpos nw \
+ -hscrollmode static -vscrollmode static \
+ -dblclickcommand [itcl::code $this _dblSelectDir]
+ } {
+ usual
+
+ rename -labeltext -dirslabel dirsLabel Text
+ }
+
+ #
+ # Create the files list.
+ #
+ itk_component add files {
+ iwidgets::Scrolledlistbox $itk_interior.files \
+ -selectioncommand [itcl::code $this _selectFile] \
+ -selectmode single -exportselection 0 \
+ -visibleitems 1x1 -labelpos nw \
+ -hscrollmode static -vscrollmode static
+ } {
+ usual
+
+ rename -labeltext -fileslabel filesLabel Text
+ }
+
+ #
+ # Create the selection entry.
+ #
+ itk_component add selection {
+ iwidgets::Entryfield $itk_interior.selection -labelpos nw \
+ -command [itcl::code $this _selectSelection] -exportselection 0
+ } {
+ usual
+
+ rename -labeltext -selectionlabel selectionLabel Text
+ }
+
+ #
+ # Create the child site widget.
+ #
+ itk_component add -protected childsite {
+ frame $itk_interior.fsbchildsite
+ }
+
+ #
+ # Set the interior variable to the childsite for derived classes.
+ #
+ set itk_interior $itk_component(childsite)
+
+ #
+ # Explicitly handle configs that may have been ignored earlier.
+ #
+ eval itk_initialize $args
+
+ #
+ # When idle, pack the childsite and update the lists.
+ #
+ _packComponents
+ _updateLists
+}
+
+# ------------------------------------------------------------------
+# DESTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Fileselectionbox::destructor {} {
+ if {$_packToken != ""} {after cancel $_packToken}
+ if {$_updateToken != ""} {after cancel $_updateToken}
+}
+
+# ------------------------------------------------------------------
+# OPTIONS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# OPTION: -childsitepos
+#
+# Specifies the position of the child site in the selection box.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Fileselectionbox::childsitepos {
+ _packComponents
+}
+
+# ------------------------------------------------------------------
+# OPTION: -fileson
+#
+# Specifies whether or not to display the files list.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Fileselectionbox::fileson {
+ _packComponents
+}
+
+# ------------------------------------------------------------------
+# OPTION: -dirson
+#
+# Specifies whether or not to display the dirs list.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Fileselectionbox::dirson {
+ _packComponents
+}
+
+# ------------------------------------------------------------------
+# OPTION: -selectionon
+#
+# Specifies whether or not to display the selection entry widget.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Fileselectionbox::selectionon {
+ _packComponents
+}
+
+# ------------------------------------------------------------------
+# OPTION: -filteron
+#
+# Specifies whether or not to display the filter entry widget.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Fileselectionbox::filteron {
+ _packComponents
+}
+
+# ------------------------------------------------------------------
+# OPTION: -mask
+#
+# Specifies the initial file mask string.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Fileselectionbox::mask {
+ global tcl_platform
+ set prefix $_pwd
+
+ #
+ # Remove automounter paths.
+ #
+ if {$tcl_platform(platform) == "unix"} {
+ if {$itk_option(-automount) != {}} {
+ foreach autoDir $itk_option(-automount) {
+ # Use catch because we can't be sure exactly what strings
+ # were passed into the -automount option
+ catch {
+ if {[regsub ^/$autoDir $prefix {} prefix] != 0} {
+ break
+ }
+ }
+ }
+ }
+ }
+
+ set curFilter $itk_option(-mask);
+ $itk_component(filter) delete 0 end
+ $itk_component(filter) insert 0 [file join $_pwd $itk_option(-mask)]
+
+ #
+ # Make sure the right most text is visable.
+ #
+ $itk_component(filter) xview moveto 1
+}
+
+# ------------------------------------------------------------------
+# OPTION: -directory
+#
+# Specifies the initial default directory.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Fileselectionbox::directory {
+ if {$itk_option(-directory) != {}} {
+ if {! [file exists $itk_option(-directory)]} {
+ error "bad directory option \"$itk_option(-directory)\":\
+ directory does not exist"
+ }
+
+ set olddir [pwd]
+ cd $itk_option(-directory)
+ set _pwd [pwd]
+ cd $olddir
+
+ configure -mask $itk_option(-mask)
+ _selectFilter
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -automount
+#
+# Specifies list of directory prefixes to ignore. Typically, this
+# option would be used with values such as:
+# -automount {export tmp_mnt}
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Fileselectionbox::automount {
+}
+
+# ------------------------------------------------------------------
+# OPTION: -nomatchstring
+#
+# Specifies the string to be displayed in the files list should
+# not regular files exist in the directory.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Fileselectionbox::nomatchstring {
+}
+
+# ------------------------------------------------------------------
+# OPTION: -dirsearchcommand
+#
+# Specifies a command to be executed to perform a directory search.
+# The command will receive the current working directory and filter
+# mask as arguments. The command should return a list of files which
+# will be placed into the directory list.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Fileselectionbox::dirsearchcommand {
+}
+
+# ------------------------------------------------------------------
+# OPTION: -filesearchcommand
+#
+# Specifies a command to be executed to perform a file search.
+# The command will receive the current working directory and filter
+# mask as arguments. The command should return a list of files which
+# will be placed into the file list.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Fileselectionbox::filesearchcommand {
+}
+
+# ------------------------------------------------------------------
+# OPTION: -selectioncommand
+#
+# Specifies a command to be executed upon pressing return in the
+# selection entry widget.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Fileselectionbox::selectioncommand {
+}
+
+# ------------------------------------------------------------------
+# OPTION: -filtercommand
+#
+# Specifies a command to be executed upon pressing return in the
+# filter entry widget.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Fileselectionbox::filtercommand {
+}
+
+# ------------------------------------------------------------------
+# OPTION: -selectdircommand
+#
+# Specifies a command to be executed following selection of a
+# directory in the directory list.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Fileselectionbox::selectdircommand {
+}
+
+# ------------------------------------------------------------------
+# OPTION: -selectfilecommand
+#
+# Specifies a command to be executed following selection of a
+# file in the files list.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Fileselectionbox::selectfilecommand {
+}
+
+# ------------------------------------------------------------------
+# OPTION: -invalid
+#
+# Specify a command to executed should the filter contents be
+# proven invalid.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Fileselectionbox::invalid {
+}
+
+# ------------------------------------------------------------------
+# OPTION: -filetype
+#
+# Specify the type of files which may appear in the file list.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Fileselectionbox::filetype {
+ switch $itk_option(-filetype) {
+ regular -
+ directory -
+ any {
+ }
+ default {
+ error "bad filetype option \"$itk_option(-filetype)\":\
+ should be regular, directory, or any"
+ }
+ }
+
+ _updateLists
+}
+
+# ------------------------------------------------------------------
+# OPTION: -width
+#
+# Specifies the width of the file selection box. The value may be
+# specified in any of the forms acceptable to Tk_GetPixels.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Fileselectionbox::width {
+ #
+ # The width option was added to the hull in the constructor.
+ # So, any width value given is passed automatically to the
+ # hull. All we have to do is play with the propagation.
+ #
+ if {$itk_option(-width) != 0} {
+ set propagate 0
+ } else {
+ set propagate 1
+ }
+
+ #
+ # Due to a bug in the tk4.2 grid, we have to check the
+ # propagation before setting it. Setting it to the same
+ # value it already is will cause it to toggle.
+ #
+ if {[grid propagate $itk_component(hull)] != $propagate} {
+ grid propagate $itk_component(hull) $propagate
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -height
+#
+# Specifies the height of the file selection box. The value may be
+# specified in any of the forms acceptable to Tk_GetPixels.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Fileselectionbox::height {
+ #
+ # The height option was added to the hull in the constructor.
+ # So, any height value given is passed automatically to the
+ # hull. All we have to do is play with the propagation.
+ #
+ if {$itk_option(-height) != 0} {
+ set propagate 0
+ } else {
+ set propagate 1
+ }
+
+ #
+ # Due to a bug in the tk4.2 grid, we have to check the
+ # propagation before setting it. Setting it to the same
+ # value it already is will cause it to toggle.
+ #
+ if {[grid propagate $itk_component(hull)] != $propagate} {
+ grid propagate $itk_component(hull) $propagate
+ }
+}
+
+# ------------------------------------------------------------------
+# METHODS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# METHOD: childsite
+#
+# Returns the path name of the child site widget.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Fileselectionbox::childsite {} {
+ return $itk_component(childsite)
+}
+
+# ------------------------------------------------------------------
+# METHOD: get
+#
+# Returns the current selection.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Fileselectionbox::get {} {
+ return [$itk_component(selection) get]
+}
+
+# ------------------------------------------------------------------
+# METHOD: filter
+#
+# The user has pressed Return in the filter. Make sure the contents
+# contain a valid directory before setting default to directory.
+# Use the invalid option to warn the user of any problems.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Fileselectionbox::filter {} {
+ set newdir [file dirname [$itk_component(filter) get]]
+
+ if {! [file exists $newdir]} {
+ uplevel #0 "$itk_option(-invalid)"
+ return
+ }
+
+ set _pwd $newdir;
+ if {$_pwd == "."} {set _pwd [pwd]};
+
+ _updateLists
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _updateLists ?now?
+#
+# Updates the contents of both the file and directory lists, as well
+# resets the positions of the filter, and lists.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Fileselectionbox::_updateLists {{when "later"}} {
+ switch -- $when {
+ later {
+ if {$_updateToken == ""} {
+ set _updateToken [after idle [itcl::code $this _updateLists now]]
+ }
+ }
+ now {
+ if {$itk_option(-dirson)} {_setDirList}
+ if {$itk_option(-fileson)} {_setFileList}
+
+ if {$itk_option(-filteron)} {
+ _setFilter
+ }
+ if {$itk_option(-selectionon)} {
+ $itk_component(selection) icursor end
+ }
+ if {$itk_option(-dirson)} {
+ $itk_component(dirs) justify left
+ }
+ if {$itk_option(-fileson)} {
+ $itk_component(files) justify left
+ }
+ set _updateToken ""
+ }
+ default {
+ error "bad option \"$when\": should be later or now"
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _setFilter
+#
+# Set the filter to the current selection in the directory list plus
+# any existing mask in the filter. Translate the two special cases
+# of '.', and '..' directory names to full path names..
+# ------------------------------------------------------------------
+itcl::body iwidgets::Fileselectionbox::_setFilter {} {
+ global tcl_platform
+ set prefix [$itk_component(dirs) getcurselection]
+ set curFilter [file tail [$itk_component(filter) get]]
+
+ while {[regexp {\.$} $prefix]} {
+ if {[file tail $prefix] == "."} {
+ if {$prefix == "."} {
+ if {$_pwd == "."} {
+ set _pwd [pwd]
+ } elseif {$_pwd == ".."} {
+ set _pwd [file dirname [pwd]]
+ }
+ set prefix $_pwd
+ } else {
+ set prefix [file dirname $prefix]
+ }
+ } elseif {[file tail $prefix] == ".."} {
+ if {$prefix != ".."} {
+ set prefix [file dirname [file dirname $prefix]]
+ } else {
+ if {$_pwd == "."} {
+ set _pwd [pwd]
+ } elseif {$_pwd == ".."} {
+ set _pwd [file dirname [pwd]]
+ }
+ set prefix [file dirname $_pwd]
+ }
+ } else {
+ break
+ }
+ }
+
+ if { [file pathtype $prefix] != "absolute" } {
+ set prefix [file join $_pwd $prefix]
+ }
+
+ #
+ # Remove automounter paths.
+ #
+ if {$tcl_platform(platform) == "unix"} {
+ if {$itk_option(-automount) != {}} {
+ foreach autoDir $itk_option(-automount) {
+ # Use catch because we can't be sure exactly what strings
+ # were passed into the -automount option
+ catch {
+ if {[regsub ^/$autoDir $prefix {} prefix] != 0} {
+ break
+ }
+ }
+ }
+ }
+ }
+
+ $itk_component(filter) delete 0 end
+ $itk_component(filter) insert 0 [file join $prefix $curFilter]
+
+ #
+ # Make sure insertion cursor is at the end.
+ #
+ $itk_component(filter) icursor end
+
+ #
+ # Make sure the right most text is visable.
+ #
+ $itk_component(filter) xview moveto 1
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _setSelection
+#
+# Set the contents of the selection entry to either the current
+# selection of the file or directory list dependent on which lists
+# are currently mapped. For the file list, avoid seleciton of the
+# no match string. As for the directory list, translate file names.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Fileselectionbox::_setSelection {} {
+ global tcl_platform
+ $itk_component(selection) delete 0 end
+
+ if {$itk_option(-fileson)} {
+ set selection [$itk_component(files) getcurselection]
+
+ if {$selection != $itk_option(-nomatchstring)} {
+ if {[file pathtype $selection] != "absolute"} {
+ set selection [file join $_pwd $selection]
+ }
+
+ #
+ # Remove automounter paths.
+ #
+ if {$tcl_platform(platform) == "unix"} {
+ if {$itk_option(-automount) != {}} {
+ foreach autoDir $itk_option(-automount) {
+ # Use catch because we can't be sure exactly what strings
+ # were passed into the -automount option
+ catch {
+ if {[regsub ^/$autoDir $selection {} selection] != 0} {
+ break
+ }
+ }
+ }
+ }
+ }
+
+ $itk_component(selection) insert 0 $selection
+ } else {
+ $itk_component(files) selection clear 0 end
+ }
+
+ } else {
+ set selection [$itk_component(dirs) getcurselection]
+
+ if {[file tail $selection] == "."} {
+ if {$selection != "."} {
+ set selection [file dirname $selection]
+ } else {
+ set selection $_pwd
+ }
+ } elseif {[file tail $selection] == ".."} {
+ if {$selection != ".."} {
+ set selection [file dirname [file dirname $selection]]
+ } else {
+ set selection [file join $_pwd ..]
+ }
+ } else {
+ set selection [file join $_pwd $selection]
+ }
+
+ #
+ # Remove automounter paths.
+ #
+ if {$tcl_platform(platform) == "unix"} {
+ if {$itk_option(-automount) != {}} {
+ foreach autoDir $itk_option(-automount) {
+ # Use catch because we can't be sure exactly what strings
+ # were passed into the -automount option
+ catch {
+ if {[regsub ^/$autoDir $selection {} selection] != 0} {
+ break
+ }
+ }
+ }
+ }
+ }
+
+ $itk_component(selection) delete 0 end
+ $itk_component(selection) insert 0 $selection
+ }
+
+ $itk_component(selection) icursor end
+
+ #
+ # Make sure the right most text is visable.
+ #
+ $itk_component(selection) xview moveto 1
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _setDirList
+#
+# Clear the directory list and dependent on whether the user has
+# defined their own search procedure or not fill the list with their
+# results or those of a glob. Select the first element if it exists.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Fileselectionbox::_setDirList {} {
+ $itk_component(dirs) clear
+
+ if {$itk_option(-dirsearchcommand) == {}} {
+ foreach i [lsort [glob -nocomplain \
+ [file join $_pwd .*] [file join $_pwd *]]] {
+ if {[file isdirectory $i]} {
+ $itk_component(dirs) insert end [file tail "$i"]
+ }
+ }
+
+ } else {
+ set mask [file tail [$itk_component(filter) get]]
+
+ foreach file [uplevel #0 $itk_option(-dirsearchcommand) $_pwd $mask] {
+ $itk_component(dirs) insert end $file
+ }
+ }
+
+ if {[$itk_component(dirs) size]} {
+ $itk_component(dirs) selection clear 0 end
+ $itk_component(dirs) selection set 0
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _setFileList
+#
+# Clear the file list and dependent on whether the user has defined
+# their own search procedure or not fill the list with their results
+# or those of a 'glob'. If the files list has no contents, then set
+# the files list to the 'nomatchstring'. Clear all selections.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Fileselectionbox::_setFileList {} {
+ $itk_component(files) clear
+ set mask [file tail [$itk_component(filter) get]]
+
+ if {$itk_option(-filesearchcommand) == {}} {
+ if {$mask == "*"} {
+ set files [lsort [glob -nocomplain \
+ [file join $_pwd .*] [file join $_pwd *]]]
+ } else {
+ set files [lsort [glob -nocomplain [file join $_pwd $mask]]]
+ }
+
+ foreach i $files {
+ if {($itk_option(-filetype) == "regular" && \
+ ! [file isdirectory $i]) || \
+ ($itk_option(-filetype) == "directory" && \
+ [file isdirectory $i]) || \
+ ($itk_option(-filetype) == "any")} {
+ $itk_component(files) insert end [file tail "$i"]
+ }
+ }
+
+ } else {
+ foreach file [uplevel #0 $itk_option(-filesearchcommand) $_pwd $mask] {
+ $itk_component(files) insert end $file
+ }
+ }
+
+ if {[$itk_component(files) size] == 0} {
+ if {$itk_option(-nomatchstring) != {}} {
+ $itk_component(files) insert end $itk_option(-nomatchstring)
+ }
+ }
+
+ $itk_component(files) selection clear 0 end
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _selectDir
+#
+# For a selection in the directory list, set the filter and possibly
+# the selection entry based on the fileson option.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Fileselectionbox::_selectDir {} {
+ _setFilter
+
+ if {$itk_option(-fileson)} {} {
+ _setSelection
+ }
+
+ if {$itk_option(-selectdircommand) != {}} {
+ uplevel #0 $itk_option(-selectdircommand)
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _dblSelectDir
+#
+# For a double click event in the directory list, select the
+# directory, set the default to the selection, and update both the
+# file and directory lists.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Fileselectionbox::_dblSelectDir {} {
+ filter
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _selectFile
+#
+# The user has selected a file. Put the current selection in the
+# file list in the selection entry widget.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Fileselectionbox::_selectFile {} {
+ _setSelection
+
+ if {$itk_option(-selectfilecommand) != {}} {
+ uplevel #0 $itk_option(-selectfilecommand)
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _selectSelection
+#
+# The user has pressed Return in the selection entry widget. Call
+# the defined selection command if it exists.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Fileselectionbox::_selectSelection {} {
+ if {$itk_option(-selectioncommand) != {}} {
+ uplevel #0 $itk_option(-selectioncommand)
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _selectFilter
+#
+# The user has pressed Return in the filter entry widget. Call the
+# defined selection command if it exists, otherwise just filter.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Fileselectionbox::_selectFilter {} {
+ if {$itk_option(-filtercommand) != {}} {
+ uplevel #0 $itk_option(-filtercommand)
+ } else {
+ filter
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _packComponents
+#
+# Pack the selection, items, and child site widgets based on options.
+# Using the -in option of pack, put the childsite around the frame
+# in the hull for n, s, e, and w positions. Make sure and raise
+# the child site since using the 'in' option may obscure the site.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Fileselectionbox::_packComponents {{when "later"}} {
+ if {$when == "later"} {
+ if {$_packToken == ""} {
+ set _packToken [after idle [itcl::code $this _packComponents now]]
+ }
+ return
+ } elseif {$when != "now"} {
+ error "bad option \"$when\": should be now or later"
+ }
+
+ set _packToken ""
+
+ #
+ # Forget about any previous placements via the grid and
+ # reset all the possible minsizes and weights for all
+ # the rows and columns.
+ #
+ foreach component {childsite filter dirs files selection} {
+ grid forget $itk_component($component)
+ }
+
+ for {set row 0} {$row < 6} {incr row} {
+ grid rowconfigure $_interior $row -minsize 0 -weight 0
+ }
+
+ for {set col 0} {$col < 4} {incr col} {
+ grid columnconfigure $_interior $col -minsize 0 -weight 0
+ }
+
+ #
+ # Place all the components based on the childsite poisition
+ # option.
+ #
+ switch $itk_option(-childsitepos) {
+ n { _nPos }
+
+ w { _wPos }
+
+ s { _sPos }
+
+ e { _ePos }
+
+ center { _centerPos }
+
+ top { _topPos }
+
+ bottom { _bottomPos }
+
+ default {
+ error "bad childsitepos option \"$itk_option(-childsitepos)\":\
+ should be n, e, s, w, center, top, or bottom"
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _nPos
+#
+# Position the childsite to the north and all the other components
+# appropriately based on the individual "on" options.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Fileselectionbox::_nPos {} {
+ grid $itk_component(childsite) -row 0 -column 0 \
+ -columnspan 3 -rowspan 1 -sticky nsew
+
+ if {$itk_option(-filteron)} {
+ grid $itk_component(filter) -row 1 -column 0 \
+ -columnspan 3 -sticky ew
+ grid rowconfigure $_interior 2 -minsize 7
+ }
+
+ if {$itk_option(-dirson)} {
+ grid $itk_component(dirs) -row 3 -column 0 \
+ -columnspan 1 -sticky nsew
+ }
+ if {$itk_option(-fileson)} {
+ grid $itk_component(files) -row 3 -column 2 \
+ -columnspan 1 -sticky nsew
+ }
+ if {$itk_option(-dirson)} {
+ if {$itk_option(-fileson)} {
+ grid columnconfigure $_interior 1 -minsize 7
+ } else {
+ grid configure $itk_component(dirs) -columnspan 3 -column 0
+ }
+ } else {
+ if {$itk_option(-fileson)} {
+ grid configure $itk_component(files) -columnspan 3 -column 0
+ }
+ }
+
+ grid rowconfigure $_interior 3 -weight 1
+
+ if {$itk_option(-selectionon)} {
+ grid rowconfigure $_interior 4 -minsize 7
+ grid $itk_component(selection) -row 5 -column 0 \
+ -columnspan 3 -sticky ew
+ }
+
+ grid columnconfigure $_interior 0 -weight 1
+ grid columnconfigure $_interior 2 -weight 1
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _sPos
+#
+# Position the childsite to the south and all the other components
+# appropriately based on the individual "on" options.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Fileselectionbox::_sPos {} {
+ if {$itk_option(-filteron)} {
+ grid $itk_component(filter) -row 0 -column 0 \
+ -columnspan 3 -sticky ew
+ grid rowconfigure $_interior 1 -minsize 7
+ }
+
+ if {$itk_option(-dirson)} {
+ grid $itk_component(dirs) -row 2 -column 0 \
+ -columnspan 1 -sticky nsew
+ }
+ if {$itk_option(-fileson)} {
+ grid $itk_component(files) -row 2 -column 2 \
+ -columnspan 1 -sticky nsew
+ }
+ if {$itk_option(-dirson)} {
+ if {$itk_option(-fileson)} {
+ grid columnconfigure $_interior 1 -minsize 7
+ } else {
+ grid configure $itk_component(dirs) -columnspan 3 -column 0
+ }
+ } else {
+ if {$itk_option(-fileson)} {
+ grid configure $itk_component(files) -columnspan 3 -column 0
+ }
+ }
+
+ grid rowconfigure $_interior 2 -weight 1
+
+ if {$itk_option(-selectionon)} {
+ grid rowconfigure $_interior 3 -minsize 7
+ grid $itk_component(selection) -row 4 -column 0 \
+ -columnspan 3 -sticky ew
+ }
+
+ grid $itk_component(childsite) -row 5 -column 0 \
+ -columnspan 3 -rowspan 1 -sticky nsew
+ grid columnconfigure $_interior 0 -weight 1
+ grid columnconfigure $_interior 2 -weight 1
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _ePos
+#
+# Position the childsite to the east and all the other components
+# appropriately based on the individual "on" options.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Fileselectionbox::_ePos {} {
+ if {$itk_option(-filteron)} {
+ grid $itk_component(filter) -row 0 -column 0 \
+ -columnspan 3 -sticky ew
+ grid rowconfigure $_interior 1 -minsize 7
+ }
+
+ if {$itk_option(-dirson)} {
+ grid $itk_component(dirs) -row 2 -column 0 \
+ -columnspan 1 -sticky nsew
+ }
+ if {$itk_option(-fileson)} {
+ grid $itk_component(files) -row 2 -column 2 \
+ -columnspan 1 -sticky nsew
+ }
+ if {$itk_option(-dirson)} {
+ if {$itk_option(-fileson)} {
+ grid columnconfigure $_interior 1 -minsize 7
+ } else {
+ grid configure $itk_component(dirs) -columnspan 3 -column 0
+ }
+ } else {
+ if {$itk_option(-fileson)} {
+ grid configure $itk_component(files) -columnspan 3 -column 0
+ }
+ }
+
+ grid rowconfigure $_interior 2 -weight 1
+
+ if {$itk_option(-selectionon)} {
+ grid rowconfigure $_interior 3 -minsize 7
+ grid $itk_component(selection) -row 4 -column 0 \
+ -columnspan 3 -sticky ew
+ }
+
+ grid $itk_component(childsite) -row 0 -column 3 \
+ -rowspan 5 -columnspan 1 -sticky nsew
+ grid columnconfigure $_interior 0 -weight 1
+ grid columnconfigure $_interior 2 -weight 1
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _wPos
+#
+# Position the childsite to the west and all the other components
+# appropriately based on the individual "on" options.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Fileselectionbox::_wPos {} {
+ grid $itk_component(childsite) -row 0 -column 0 \
+ -rowspan 5 -columnspan 1 -sticky nsew
+
+ if {$itk_option(-filteron)} {
+ grid $itk_component(filter) -row 0 -column 1 \
+ -columnspan 3 -sticky ew
+ grid rowconfigure $_interior 1 -minsize 7
+ }
+
+ if {$itk_option(-dirson)} {
+ grid $itk_component(dirs) -row 2 -column 1 \
+ -columnspan 1 -sticky nsew
+ }
+ if {$itk_option(-fileson)} {
+ grid $itk_component(files) -row 2 -column 3 \
+ -columnspan 1 -sticky nsew
+ }
+ if {$itk_option(-dirson)} {
+ if {$itk_option(-fileson)} {
+ grid columnconfigure $_interior 2 -minsize 7
+ } else {
+ grid configure $itk_component(dirs) -columnspan 3 -column 1
+ }
+ } else {
+ if {$itk_option(-fileson)} {
+ grid configure $itk_component(files) -columnspan 3 -column 1
+ }
+ }
+
+ grid rowconfigure $_interior 2 -weight 1
+
+ if {$itk_option(-selectionon)} {
+ grid rowconfigure $_interior 3 -minsize 7
+ grid $itk_component(selection) -row 4 -column 1 \
+ -columnspan 3 -sticky ew
+ }
+
+ grid columnconfigure $_interior 1 -weight 1
+ grid columnconfigure $_interior 3 -weight 1
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _topPos
+#
+# Position the childsite below the filter but above the lists and
+# all the other components appropriately based on the individual
+# "on" options.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Fileselectionbox::_topPos {} {
+ if {$itk_option(-filteron)} {
+ grid $itk_component(filter) -row 0 -column 0 \
+ -columnspan 3 -sticky ew
+ }
+
+ grid $itk_component(childsite) -row 1 -column 0 \
+ -columnspan 3 -rowspan 1 -sticky nsew
+
+ if {$itk_option(-dirson)} {
+ grid $itk_component(dirs) -row 2 -column 0 -sticky nsew
+ }
+ if {$itk_option(-fileson)} {
+ grid $itk_component(files) -row 2 -column 2 -sticky nsew
+ }
+ if {$itk_option(-dirson)} {
+ if {$itk_option(-fileson)} {
+ grid columnconfigure $_interior 1 -minsize 7
+ } else {
+ grid configure $itk_component(dirs) -columnspan 3 -column 0
+ }
+ } else {
+ if {$itk_option(-fileson)} {
+ grid configure $itk_component(files) -columnspan 3 -column 0
+ }
+ }
+
+ grid rowconfigure $_interior 2 -weight 1
+
+ if {$itk_option(-selectionon)} {
+ grid rowconfigure $_interior 3 -minsize 7
+ grid $itk_component(selection) -row 4 -column 0 \
+ -columnspan 3 -sticky ew
+ }
+
+ grid columnconfigure $_interior 0 -weight 1
+ grid columnconfigure $_interior 2 -weight 1
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _centerPos
+#
+# Position the childsite between the lists and all the other
+# components appropriately based on the individual "on" options.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Fileselectionbox::_centerPos {} {
+ if {$itk_option(-filteron)} {
+ grid $itk_component(filter) -row 0 -column 0 \
+ -columnspan 3 -sticky ew
+ grid rowconfigure $_interior 1 -minsize 7
+ }
+
+ if {$itk_option(-dirson)} {
+ grid $itk_component(dirs) -row 2 -column 0 \
+ -columnspan 1 -sticky nsew
+ }
+ if {$itk_option(-fileson)} {
+ grid $itk_component(files) -row 2 -column 2 \
+ -columnspan 1 -sticky nsew
+ }
+ grid $itk_component(childsite) -row 2 \
+ -columnspan 1 -rowspan 1 -sticky nsew
+
+ if {$itk_option(-dirson)} {
+ if {$itk_option(-fileson)} {
+ grid configure $itk_component(childsite) -column 1
+ grid columnconfigure $_interior 0 -weight 1
+ grid columnconfigure $_interior 2 -weight 1
+
+ } else {
+ grid configure $itk_component(dirs) -columnspan 2 -column 0
+ grid configure $itk_component(childsite) -column 2
+ grid columnconfigure $_interior 0 -weight 1
+ grid columnconfigure $_interior 1 -weight 1
+ }
+ } else {
+ grid configure $itk_component(childsite) -column 0
+ if {$itk_option(-fileson)} {
+ grid configure $itk_component(files) -columnspan 2 \
+ -column 1
+ grid columnconfigure $_interior 1 -weight 1
+ grid columnconfigure $_interior 2 -weight 1
+ } else {
+ grid columnconfigure $_interior 0 -weight 1
+ }
+ }
+
+ grid rowconfigure $_interior 2 -weight 1
+
+ if {$itk_option(-selectionon)} {
+ grid rowconfigure $_interior 3 -minsize 7
+ grid $itk_component(selection) -row 4 -column 0 \
+ -columnspan 3 -sticky ew
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _bottomPos
+#
+# Position the childsite below the lists and above the selection
+# and all the other components appropriately based on the individual
+# "on" options.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Fileselectionbox::_bottomPos {} {
+ if {$itk_option(-filteron)} {
+ grid $itk_component(filter) -row 0 -column 0 \
+ -columnspan 3 -sticky ew
+ grid rowconfigure $_interior 1 -minsize 7
+ }
+
+ if {$itk_option(-dirson)} {
+ grid $itk_component(dirs) -row 2 -column 0 -sticky nsew
+ }
+ if {$itk_option(-fileson)} {
+ grid $itk_component(files) -row 2 -column 2 -sticky nsew
+ }
+ if {$itk_option(-dirson)} {
+ if {$itk_option(-fileson)} {
+ grid columnconfigure $_interior 1 -minsize 7
+ } else {
+ grid configure $itk_component(dirs) -columnspan 3 -column 0
+ }
+ } else {
+ if {$itk_option(-fileson)} {
+ grid configure $itk_component(files) -columnspan 3 -column 0
+ }
+ }
+ grid rowconfigure $_interior 2 -weight 1
+
+ grid $itk_component(childsite) -row 3 -column 0 \
+ -columnspan 3 -rowspan 1 -sticky nsew
+
+ if {$itk_option(-selectionon)} {
+ grid $itk_component(selection) -row 4 -column 0 \
+ -columnspan 3 -sticky ew
+ }
+
+ grid columnconfigure $_interior 0 -weight 1
+ grid columnconfigure $_interior 2 -weight 1
+}
diff --git a/iwidgets/generic/fileselectiondialog.itk b/iwidgets/generic/fileselectiondialog.itk
new file mode 100644
index 00000000000..d24ce2dfe9a
--- /dev/null
+++ b/iwidgets/generic/fileselectiondialog.itk
@@ -0,0 +1,181 @@
+#
+# Fileselectiondialog
+# ----------------------------------------------------------------------
+# Implements a file selection box similar to the OSF/Motif standard
+# file selection dialog composite widget. The Fileselectiondialog is
+# derived from the Dialog class and is composed of a FileSelectionBox
+# with attributes set to manipulate the dialog buttons.
+#
+# ----------------------------------------------------------------------
+# AUTHOR: Mark L. Ulferts EMAIL: mulferts@spd.dsccc.com
+#
+# @(#) $Id$
+# ----------------------------------------------------------------------
+# Copyright (c) 1995 DSC Technologies Corporation
+# ======================================================================
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+
+#
+# Usual options.
+#
+itk::usual Fileselectiondialog {
+ keep -activebackground -activerelief -background -borderwidth -cursor \
+ -elementborderwidth -foreground -highlightcolor -highlightthickness \
+ -insertbackground -insertborderwidth -insertofftime -insertontime \
+ -insertwidth -jump -labelfont -modality -selectbackground \
+ -selectborderwidth -textbackground -textfont
+}
+
+# ------------------------------------------------------------------
+# FILESELECTIONDIALOG
+# ------------------------------------------------------------------
+itcl::class iwidgets::Fileselectiondialog {
+ inherit iwidgets::Dialog
+
+ constructor {args} {}
+
+ public {
+ method childsite {}
+ method get {}
+ method filter {}
+ }
+
+ protected method _dbldir {}
+}
+
+#
+# Provide a lowercased access method for the Fileselectiondialog class.
+#
+proc ::iwidgets::fileselectiondialog {pathName args} {
+ uplevel ::iwidgets::Fileselectiondialog $pathName $args
+}
+
+#
+# Use option database to override default resources of base classes.
+#
+option add *Fileselectiondialog.borderWidth 2 widgetDefault
+
+option add *Fileselectiondialog.title "File Selection Dialog" widgetDefault
+
+option add *Fileselectiondialog.width 350 widgetDefault
+option add *Fileselectiondialog.height 400 widgetDefault
+
+option add *Fileselectiondialog.master "." widgetDefault
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Fileselectiondialog::constructor {args} {
+ component hull configure -borderwidth 0
+ itk_option add hull.width hull.height
+
+ #
+ # Turn off pack propagation for the hull widget so the width
+ # and height options become active.
+ #
+ pack propagate $itk_component(hull) no
+
+ #
+ # Instantiate a file selection box widget.
+ #
+ itk_component add fsb {
+ iwidgets::Fileselectionbox $itk_interior.fsb -width 150 -height 150 \
+ -selectioncommand [itcl::code $this invoke] \
+ -selectdircommand [itcl::code $this default Apply] \
+ -selectfilecommand [itcl::code $this default OK]
+ } {
+ usual
+
+ keep -labelfont -childsitepos -directory -dirslabel \
+ -dirsearchcommand -dirson -fileslabel -fileson \
+ -filesearchcommand -filterlabel -filteron \
+ -filetype -invalid -mask -nomatchstring \
+ -selectionlabel -selectionon
+ }
+ grid $itk_component(fsb) -sticky nsew
+ grid rowconfigure $itk_interior 0 -weight 1
+ grid columnconfigure $itk_interior 0 -weight 1
+
+ $itk_component(fsb) component filter configure \
+ -focuscommand [itcl::code $this default Apply]
+ $itk_component(fsb) component selection configure \
+ -focuscommand [itcl::code $this default OK]
+ $itk_component(fsb) component dirs configure \
+ -dblclickcommand [itcl::code $this _dbldir]
+ $itk_component(fsb) component files configure \
+ -dblclickcommand [itcl::code $this invoke]
+
+ buttonconfigure Apply -text "Filter" \
+ -command [itcl::code $itk_component(fsb) filter]
+
+ set itk_interior [$itk_component(fsb) childsite]
+
+ hide Help
+
+ eval itk_initialize $args
+}
+
+# ------------------------------------------------------------------
+# METHODS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# METHOD: childsite
+#
+# Thinwrapped method of file selection box class.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Fileselectiondialog::childsite {} {
+ return [$itk_component(fsb) childsite]
+}
+
+# ------------------------------------------------------------------
+# METHOD: get
+#
+# Thinwrapped method of file selection box class.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Fileselectiondialog::get {} {
+ return [$itk_component(fsb) get]
+}
+
+# ------------------------------------------------------------------
+# METHOD: filter
+#
+# Thinwrapped method of file selection box class.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Fileselectiondialog::filter {} {
+ return [$itk_component(fsb) filter]
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _dbldir
+#
+# Double select in directory list. If the files list is on then
+# make the default button the filter and invoke. If not, just invoke.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Fileselectiondialog::_dbldir {} {
+ if {$itk_option(-fileson)} {
+ default Apply
+ }
+
+ invoke
+}
+
diff --git a/iwidgets/generic/finddialog.itk b/iwidgets/generic/finddialog.itk
new file mode 100644
index 00000000000..7bf38f10ee8
--- /dev/null
+++ b/iwidgets/generic/finddialog.itk
@@ -0,0 +1,488 @@
+#
+# Finddialog
+# ----------------------------------------------------------------------
+# This class implements a dialog for searching text. It prompts the
+# user for a search string and the method of searching which includes
+# case sensitive, regular expressions, backwards, and all.
+#
+# ----------------------------------------------------------------------
+# AUTHOR: Mark L. Ulferts EMAIL: mulferts@austin.dsccc.com
+#
+# @(#) RCS: $Id$
+# ----------------------------------------------------------------------
+# Copyright (c) 1996 DSC Technologies Corporation
+# ======================================================================
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+
+#
+# Usual options.
+#
+itk::usual Finddialog {
+ keep -background -cursor -foreground -selectcolor
+}
+
+# ------------------------------------------------------------------
+# IPRFINDDIALOG
+# ------------------------------------------------------------------
+itcl::class ::iwidgets::Finddialog {
+ inherit iwidgets::Dialogshell
+
+ constructor {args} {}
+
+ itk_option define -selectcolor selectColor Background {}
+ itk_option define -clearcommand clearCommand Command {}
+ itk_option define -matchcommand matchCommand Command {}
+ itk_option define -patternbackground patternBackground Background \#707070
+ itk_option define -patternforeground patternForeground Foreground White
+ itk_option define -searchbackground searchBackground Background \#c4c4c4
+ itk_option define -searchforeground searchForeground Foreground Black
+ itk_option define -textwidget textWidget TextWidget {}
+
+ public {
+ method clear {}
+ method find {}
+ }
+
+ protected {
+ method _get {setting}
+ method _textExists {}
+
+ common _optionValues ;# Current settings of check buttons.
+ common _searchPoint ;# Starting location for searches
+ common _matchLen ;# Matching pattern string length
+ }
+}
+
+#
+# Provide a lowercased access method for the ::finddialog class.
+#
+proc ::iwidgets::finddialog {pathName args} {
+ uplevel ::iwidgets::Finddialog $pathName $args
+}
+
+#
+# Use option database to override default resources of base classes.
+#
+option add *Finddialog.title "Find" widgetDefault
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body ::iwidgets::Finddialog::constructor {args} {
+ #
+ # Add the find pattern entryfield.
+ #
+ itk_component add pattern {
+ iwidgets::Entryfield $itk_interior.pattern -labeltext "Find:"
+ }
+ bind [$itk_component(pattern) component entry] \
+ <Return> "[itcl::code $this invoke]; break"
+
+ #
+ # Add the find all checkbutton.
+ #
+ itk_component add all {
+ checkbutton $itk_interior.all \
+ -variable [itcl::scope _optionValues($this-all)] \
+ -text "All"
+ }
+
+ #
+ # Add the case consideration checkbutton.
+ #
+ itk_component add case {
+ checkbutton $itk_interior.case \
+ -variable [itcl::scope _optionValues($this-case)] \
+ -text "Consider Case"
+ }
+
+ #
+ # Add the regular expression checkbutton.
+ #
+ itk_component add regexp {
+ checkbutton $itk_interior.regexp \
+ -variable [itcl::scope _optionValues($this-regexp)] \
+ -text "Use Regular Expression"
+ }
+
+ #
+ # Add the find backwards checkbutton.
+ #
+ itk_component add backwards {
+ checkbutton $itk_interior.backwards \
+ -variable [itcl::scope _optionValues($this-backwards)] \
+ -text "Find Backwards"
+ }
+
+ #
+ # Add the find, clear, and close buttons, making find be the default.
+ #
+ add Find -text Find -command [itcl::code $this find]
+ add Clear -text Clear -command [itcl::code $this clear]
+ add Close -text Close -command [itcl::code $this deactivate 0]
+
+ default Find
+
+ #
+ # Use the grid to layout the components.
+ #
+ grid $itk_component(pattern) -row 0 -column 0 \
+ -padx 10 -pady 10 -columnspan 4 -sticky ew
+ grid $itk_component(all) -row 1 -column 0
+ grid $itk_component(case) -row 1 -column 1
+ grid $itk_component(regexp) -row 1 -column 2
+ grid $itk_component(backwards) -row 1 -column 3
+
+ grid columnconfigure $itk_interior 0 -weight 1
+ grid columnconfigure $itk_interior 1 -weight 1
+ grid columnconfigure $itk_interior 2 -weight 1
+ grid columnconfigure $itk_interior 3 -weight 1
+
+ #
+ # Initialize all the configuration options.
+ #
+ eval itk_initialize $args
+}
+
+# ------------------------------------------------------------------
+# OPTIONS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# OPTION: -clearcommand
+#
+# Specifies a command to be invoked following a clear operation.
+# The command is meant to be a means of notification that the
+# clear has taken place and allow other actions to take place such
+# as disabling a find again menu.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Finddialog::clearcommand {}
+
+# ------------------------------------------------------------------
+# OPTION: -matchcommand
+#
+# Specifies a command to be invoked following a find operation.
+# The command is called with a match point as an argument. Should
+# a match not be found the match point is {}.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Finddialog::matchcommand {}
+
+# ------------------------------------------------------------------
+# OPTION: -patternbackground
+#
+# Specifies the background color of the text matching the search
+# pattern. It may have any of the forms accepted by Tk_GetColor.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Finddialog::patternbackground {}
+
+# ------------------------------------------------------------------
+# OPTION: -patternforeground
+#
+# Specifies the foreground color of the pattern matching a search
+# operation. It may have any of the forms accepted by Tk_GetColor.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Finddialog::patternforeground {}
+
+# ------------------------------------------------------------------
+# OPTION: -searchforeground
+#
+# Specifies the foreground color of the line containing the matching
+# pattern from a search operation. It may have any of the forms
+# accepted by Tk_GetColor.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Finddialog::searchforeground {}
+
+# ------------------------------------------------------------------
+# OPTION: -searchbackground
+#
+# Specifies the background color of the line containing the matching
+# pattern from a search operation. It may have any of the forms
+# accepted by Tk_GetColor.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Finddialog::searchbackground {}
+
+# ------------------------------------------------------------------
+# OPTION: -textwidget
+#
+# Specifies the scrolledtext or text widget to be searched.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Finddialog::textwidget {
+ if {$itk_option(-textwidget) != {}} {
+ set _searchPoint($itk_option(-textwidget)) 1.0
+ }
+}
+
+# ------------------------------------------------------------------
+# METHODS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# PUBLIC METHOD: clear
+#
+# Clear the pattern entryfield and the indicators.
+# ------------------------------------------------------------------
+itcl::body ::iwidgets::Finddialog::clear {} {
+ $itk_component(pattern) clear
+
+ if {[_textExists]} {
+ set _searchPoint($itk_option(-textwidget)) 1.0
+
+ $itk_option(-textwidget) tag remove search-line 1.0 end
+ $itk_option(-textwidget) tag remove search-pattern 1.0 end
+ }
+
+ if {$itk_option(-clearcommand) != {}} {
+ eval $itk_option(-clearcommand)
+ }
+}
+
+# ------------------------------------------------------------------
+# PUBLIC METHOD: find
+#
+# Search for a specific text string in the text widget given by
+# the -textwidget option. Should this option not be set to an
+# existing widget, then a quick exit is made.
+# ------------------------------------------------------------------
+itcl::body ::iwidgets::Finddialog::find {} {
+ if {! [_textExists]} {
+ return
+ }
+
+ #
+ # Clear any existing indicators in the text widget.
+ #
+ $itk_option(-textwidget) tag remove search-line 1.0 end
+ $itk_option(-textwidget) tag remove search-pattern 1.0 end
+
+ #
+ # Make sure the search pattern isn't just blank. If so, skip this.
+ #
+ set pattern [_get pattern]
+
+ if {[string trim $pattern] == ""} {
+ return
+ }
+
+ #
+ # After clearing out any old highlight indicators from a previous
+ # search, we'll be building our search command piece-meal based on
+ # the current settings of the checkbuttons in the find dialog. The
+ # first we'll add is a variable to catch the count of the length
+ # of the string matching the pattern.
+ #
+ set precmd "$itk_option(-textwidget) search \
+ -count [list [itcl::scope _matchLen($this)]]"
+
+ if {! [_get case]} {
+ append precmd " -nocase"
+ }
+
+ if {[_get regexp]} {
+ append precmd " -regexp"
+ } else {
+ append precmd " -exact"
+ }
+
+ #
+ # If we are going to find all matches, then the start point for
+ # the search will be the beginning of the text; otherwise, we'll
+ # use the last known starting point +/- a character depending on
+ # the direction.
+ #
+ if {[_get all]} {
+ set _searchPoint($itk_option(-textwidget)) 1.0
+ } else {
+ if {[_get backwards]} {
+ append precmd " -backwards"
+ } else {
+ append precmd " -forwards"
+ }
+ }
+
+ #
+ # Get the pattern to be matched and add it to the search command.
+ # Since it may contain embedded spaces, we'll wrap it in a list.
+ #
+ append precmd " [list $pattern]"
+
+ #
+ # If the search is for all matches, then we'll be performing the
+ # search until no more matches are found; otherwise, we'll break
+ # out of the loop after one search.
+ #
+ while {1} {
+ if {[_get all]} {
+ set postcmd " $_searchPoint($itk_option(-textwidget)) end"
+
+ } else {
+ set postcmd " $_searchPoint($itk_option(-textwidget))"
+ }
+
+ #
+ # Create the final search command out of the pre and post parts
+ # and evaluate it which returns the location of the matching string.
+ #
+ set cmd {}
+ append cmd $precmd $postcmd
+
+ if {[catch {eval $cmd} matchPoint] != 0} {
+ set _searchPoint($itk_option(-textwidget)) 1.0
+ return {}
+ }
+
+ #
+ # If a match exists, then we'll make this spot be the new starting
+ # position. Then we'll tag the line and the pattern in the line.
+ # The foreground and background settings will lite these positions
+ # in the text widget up.
+ #
+ if {$matchPoint != {}} {
+ set _searchPoint($itk_option(-textwidget)) $matchPoint
+
+ $itk_option(-textwidget) tag add search-line \
+ "$_searchPoint($itk_option(-textwidget)) linestart" \
+ "$_searchPoint($itk_option(-textwidget))"
+ $itk_option(-textwidget) tag add search-line \
+ "$_searchPoint($itk_option(-textwidget)) + \
+ $_matchLen($this) chars" \
+ "$_searchPoint($itk_option(-textwidget)) lineend"
+ $itk_option(-textwidget) tag add search-pattern \
+ $_searchPoint($itk_option(-textwidget)) \
+ "$_searchPoint($itk_option(-textwidget)) + \
+ $_matchLen($this) chars"
+ }
+
+ #
+ # Set the search point for the next time through to be one
+ # character more or less from the current search point based
+ # on the direction.
+ #
+ if {[_get all] || ! [_get backwards]} {
+ set _searchPoint($itk_option(-textwidget)) \
+ [$itk_option(-textwidget) index \
+ "$_searchPoint($itk_option(-textwidget)) + 1c"]
+ } else {
+ set _searchPoint($itk_option(-textwidget)) \
+ [$itk_option(-textwidget) index \
+ "$_searchPoint($itk_option(-textwidget)) - 1c"]
+ }
+
+ #
+ # If this isn't a find all operation or we didn't get a match, exit.
+ #
+ if {(! [_get all]) || ($matchPoint == {})} {
+ break
+ }
+ }
+
+ #
+ # Configure the colors for the search-line and search-pattern.
+ #
+ $itk_option(-textwidget) tag configure search-line \
+ -foreground $itk_option(-searchforeground)
+ $itk_option(-textwidget) tag configure search-line \
+ -background $itk_option(-searchbackground)
+ $itk_option(-textwidget) tag configure search-pattern \
+ -background $itk_option(-patternbackground)
+ $itk_option(-textwidget) tag configure search-pattern \
+ -foreground $itk_option(-patternforeground)
+
+ #
+ # Adjust the view to be the last matched position.
+ #
+ if {$matchPoint != {}} {
+ $itk_option(-textwidget) see $matchPoint
+ }
+
+ #
+ # There may be multiple matches of the pattern on a single line,
+ # so we'll set the tag priorities such that the pattern tag is higher.
+ #
+ $itk_option(-textwidget) tag raise search-pattern search-line
+
+ #
+ # If a match command is defined, then call it with the match point.
+ #
+ if {$itk_option(-matchcommand) != {}} {
+ [subst $itk_option(-matchcommand)] $matchPoint
+ }
+
+ #
+ # Return the match point to the caller so they know if we found
+ # anything and if so where
+ #
+ return $matchPoint
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _get setting
+#
+# Get the current value for the pattern, case, regexp, or backwards.
+# ------------------------------------------------------------------
+itcl::body ::iwidgets::Finddialog::_get {setting} {
+ switch $setting {
+ pattern {
+ return [$itk_component(pattern) get]
+ }
+ case {
+ return $_optionValues($this-case)
+ }
+ regexp {
+ return $_optionValues($this-regexp)
+ }
+ backwards {
+ return $_optionValues($this-backwards)
+ }
+ all {
+ return $_optionValues($this-all)
+ }
+ default {
+ error "bad get setting: \"$setting\", should be pattern,\
+ case, regexp, backwards, or all"
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _textExists
+#
+# Check the validity of the text widget option. Does it exist and
+# is it of the class Text or Scrolledtext.
+# ------------------------------------------------------------------
+itcl::body ::iwidgets::Finddialog::_textExists {} {
+ if {$itk_option(-textwidget) == {}} {
+ return 0
+ }
+
+ if {! [winfo exists $itk_option(-textwidget)]} {
+ error "bad finddialog text widget value: \"$itk_option(-textwidget)\",\
+ the widget doesn't exist"
+ }
+
+ if {([winfo class $itk_option(-textwidget)] != "Text") &&
+ ([itcl::find objects -isa iwidgets::Scrolledtext *::$itk_option(-textwidget)] == "")} {
+ error "bad finddialog text widget value: \"$itk_option(-textwidget)\",\
+ must be of the class Text or based on Scrolledtext"
+ }
+
+ return 1
+}
diff --git a/iwidgets/generic/hierarchy.itk b/iwidgets/generic/hierarchy.itk
new file mode 100644
index 00000000000..3bb8f3c0509
--- /dev/null
+++ b/iwidgets/generic/hierarchy.itk
@@ -0,0 +1,1983 @@
+# Hierarchy
+# ----------------------------------------------------------------------
+# Hierarchical data viewer. Manages a list of nodes that can be
+# expanded or collapsed. Individual nodes can be highlighted.
+# Clicking with the right mouse button on any item brings up a
+# special item menu. Clicking on the background area brings up
+# a different popup menu.
+# ----------------------------------------------------------------------
+# AUTHOR: Michael J. McLennan
+# Bell Labs Innovations for Lucent Technologies
+# mmclennan@lucent.com
+#
+# Mark L. Ulferts
+# DSC Communications
+# mulferts@austin.dsccc.com
+#
+# RCS: $Id$
+# ----------------------------------------------------------------------
+# Copyright (c) 1996 Lucent Technologies
+# ======================================================================
+# Permission to use, copy, modify, and distribute this software and its
+# documentation for any purpose and without fee is hereby granted,
+# provided that the above copyright notice appear in all copies and that
+# both that the copyright notice and warranty disclaimer appear in
+# supporting documentation, and that the names of Lucent Technologies
+# any of their entities not be used in advertising or publicity
+# pertaining to distribution of the software without specific, written
+# prior permission.
+#
+# Lucent Technologies disclaims all warranties with regard to this
+# software, including all implied warranties of merchantability and
+# fitness. In no event shall Lucent Technologies be liable for any
+# special, indirect or consequential damages or any damages whatsoever
+# resulting from loss of use, data or profits, whether in an action of
+# contract, negligence or other tortuous action, arising out of or in
+# connection with the use or performance of this software.
+#
+# ----------------------------------------------------------------------
+# Copyright (c) 1996 DSC Technologies Corporation
+# ======================================================================
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+
+#
+# Usual options.
+#
+itk::usual Hierarchy {
+ keep -cursor -textfont -font
+ keep -background -foreground -textbackground
+ keep -selectbackground -selectforeground
+}
+
+# ------------------------------------------------------------------
+# HIERARCHY
+# ------------------------------------------------------------------
+itcl::class iwidgets::Hierarchy {
+ inherit iwidgets::Scrolledwidget
+
+ constructor {args} {}
+
+ destructor {}
+
+ itk_option define -alwaysquery alwaysQuery AlwaysQuery 0
+ itk_option define -closedicon closedIcon Icon {}
+ itk_option define -dblclickcommand dblClickCommand Command {}
+ itk_option define -expanded expanded Expanded 0
+ itk_option define -filter filter Filter 0
+ itk_option define -font font Font \
+ -*-Courier-Medium-R-Normal--*-120-*-*-*-*-*-*
+ itk_option define -height height Height 0
+ itk_option define -iconcommand iconCommand Command {}
+ itk_option define -icondblcommand iconDblCommand Command {}
+ itk_option define -imagecommand imageCommand Command {}
+ itk_option define -imagedblcommand imageDblCommand Command {}
+ itk_option define -imagemenuloadcommand imageMenuLoadCommand Command {}
+ itk_option define -markbackground markBackground Foreground #a0a0a0
+ itk_option define -markforeground markForeground Background Black
+ itk_option define -nodeicon nodeIcon Icon {}
+ itk_option define -openicon openIcon Icon {}
+ itk_option define -querycommand queryCommand Command {}
+ itk_option define -selectcommand selectCommand Command {}
+ itk_option define -selectbackground selectBackground Foreground #c3c3c3
+ itk_option define -selectforeground selectForeground Background Black
+ itk_option define -textmenuloadcommand textMenuLoadCommand Command {}
+ itk_option define -visibleitems visibleItems VisibleItems 80x24
+ itk_option define -width width Width 0
+
+ public {
+ method clear {}
+ method collapse {node}
+ method current {}
+ method draw {{when -now}}
+ method expand {node}
+ method expanded {node}
+ method expState { }
+ method mark {op args}
+ method prune {node}
+ method refresh {node}
+ method selection {op args}
+ method toggle {node}
+
+ method bbox {index}
+ method compare {index1 op index2}
+ method debug {args} {eval $args}
+ method delete {first {last {}}}
+ method dlineinfo {index}
+ method dump {args}
+ method get {index1 {index2 {}}}
+ method index {index}
+ method insert {args}
+ method scan {option args}
+ method search {args}
+ method see {index}
+ method tag {op args}
+ method window {option args}
+ method xview {args}
+ method yview {args}
+ }
+
+ protected {
+ method _contents {uid}
+ method _post {x y}
+ method _drawLevel {node indent}
+ method _select {x y}
+ method _deselectSubNodes {uid}
+ method _deleteNodeInfo {uid}
+ method _getParent {uid}
+ method _getHeritage {uid}
+ method _isInternalTag {tag}
+ method _iconSelect {node icon}
+ method _iconDblSelect {node icon}
+ method _imageSelect {node}
+ method _imageDblClick {node}
+ method _imagePost {node image type x y}
+ method _double {x y}
+ }
+
+ private {
+ method _configureTags {}
+
+ variable _filterCode "" ;# Compact view flag.
+ variable _hcounter 0 ;# Counter for hierarchy icons
+ variable _icons ;# Array of user icons by uid
+ variable _images ;# Array of our icons by uid
+ variable _indents ;# Array of indentation by uid
+ variable _marked ;# Array of marked nodes by uid
+ variable _markers "" ;# List of markers for level being drawn
+ variable _nodes ;# Array of subnodes by uid
+ variable _pending "" ;# Pending draw flag
+ variable _posted "" ;# List of tags at posted menu position
+ variable _selected ;# Array of selected nodes by uid
+ variable _tags ;# Array of user tags by uid
+ variable _text ;# Array of displayed text by uid
+ variable _states ;# Array of selection state by uid
+ variable _ucounter 0 ;# Counter for user icons
+ }
+}
+
+#
+# Provide a lowercased access method for the Hierarchy class.
+#
+proc ::iwidgets::hierarchy {pathName args} {
+ uplevel ::iwidgets::Hierarchy $pathName $args
+}
+
+#
+# Use option database to override default resources of base classes.
+#
+option add *Hierarchy.menuCursor arrow widgetDefault
+option add *Hierarchy.labelPos n widgetDefault
+option add *Hierarchy.tabs 30 widgetDefault
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Hierarchy::constructor {args} {
+ itk_option remove iwidgets::Labeledwidget::state
+
+ #
+ # Our -width and -height options are slightly different than
+ # those implemented by our base class, so we're going to
+ # remove them and redefine our own.
+ #
+ itk_option remove iwidgets::Scrolledwidget::width
+ itk_option remove iwidgets::Scrolledwidget::height
+
+ #
+ # Create a clipping frame which will provide the border for
+ # relief display.
+ #
+ itk_component add clipper {
+ frame $itk_interior.clipper
+ } {
+ usual
+
+ keep -borderwidth -relief -highlightthickness -highlightcolor
+ rename -highlightbackground -background background Background
+ }
+ grid $itk_component(clipper) -row 0 -column 0 -sticky nsew
+ grid rowconfigure $_interior 0 -weight 1
+ grid columnconfigure $_interior 0 -weight 1
+
+ #
+ # Create a text widget for displaying our hierarchy.
+ #
+ itk_component add list {
+ text $itk_component(clipper).list -wrap none -cursor center_ptr \
+ -state disabled -width 1 -height 1 \
+ -xscrollcommand \
+ [itcl::code $this _scrollWidget $itk_interior.horizsb] \
+ -yscrollcommand \
+ [itcl::code $this _scrollWidget $itk_interior.vertsb] \
+ -borderwidth 0 -highlightthickness 0
+ } {
+ usual
+
+ keep -spacing1 -spacing2 -spacing3 -tabs
+ rename -font -textfont textFont Font
+ rename -background -textbackground textBackground Background
+ ignore -highlightthickness -highlightcolor
+ ignore -insertbackground -insertborderwidth
+ ignore -insertontime -insertofftime -insertwidth
+ ignore -selectborderwidth
+ ignore -borderwidth
+ }
+ grid $itk_component(list) -row 0 -column 0 -sticky nsew
+ grid rowconfigure $itk_component(clipper) 0 -weight 1
+ grid columnconfigure $itk_component(clipper) 0 -weight 1
+
+ #
+ # Configure the command on the vertical scroll bar in the base class.
+ #
+ $itk_component(vertsb) configure \
+ -command [itcl::code $itk_component(list) yview]
+
+ #
+ # Configure the command on the horizontal scroll bar in the base class.
+ #
+ $itk_component(horizsb) configure \
+ -command [itcl::code $itk_component(list) xview]
+
+ #
+ # Configure our text component's tab settings for twenty levels.
+ #
+ set tabs ""
+ for {set i 1} {$i < 20} {incr i} {
+ lappend tabs [expr {$i*12+4}]
+ }
+ $itk_component(list) configure -tabs $tabs
+
+ #
+ # Add popup menus that can be configured by the user to add
+ # new functionality.
+ #
+ itk_component add itemMenu {
+ menu $itk_component(list).itemmenu -tearoff 0
+ } {
+ usual
+ ignore -tearoff
+ rename -cursor -menucursor menuCursor Cursor
+ }
+
+ itk_component add bgMenu {
+ menu $itk_component(list).bgmenu -tearoff 0
+ } {
+ usual
+ ignore -tearoff
+ rename -cursor -menucursor menuCursor Cursor
+ }
+
+ #
+ # Adjust the bind tags to remove the class bindings. Also, add
+ # bindings for mouse button 1 to do selection and button 3 to
+ # display a popup.
+ #
+ bindtags $itk_component(list) [list $itk_component(list) . all]
+
+ bind $itk_component(list) <ButtonPress-1> \
+ [itcl::code $this _select %x %y]
+
+ bind $itk_component(list) <Double-1> \
+ [itcl::code $this _double %x %y]
+
+ bind $itk_component(list) <ButtonPress-3> \
+ [itcl::code $this _post %x %y]
+
+ #
+ # Initialize the widget based on the command line options.
+ #
+ eval itk_initialize $args
+}
+
+# ------------------------------------------------------------------
+# DESTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Hierarchy::destructor {} {
+ if {$_pending != ""} {
+ after cancel $_pending
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTIONS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# OPTION: -font
+#
+# Font used for text in the list.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Hierarchy::font {
+ $itk_component(list) tag configure info \
+ -font $itk_option(-font) -spacing1 6
+}
+
+# ------------------------------------------------------------------
+# OPTION: -selectbackground
+#
+# Background color scheme for selected nodes.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Hierarchy::selectbackground {
+ $itk_component(list) tag configure hilite \
+ -background $itk_option(-selectbackground)
+}
+
+# ------------------------------------------------------------------
+# OPTION: -selectforeground
+#
+# Foreground color scheme for selected nodes.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Hierarchy::selectforeground {
+ $itk_component(list) tag configure hilite \
+ -foreground $itk_option(-selectforeground)
+}
+
+# ------------------------------------------------------------------
+# OPTION: -markbackground
+#
+# Background color scheme for marked nodes.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Hierarchy::markbackground {
+ $itk_component(list) tag configure lowlite \
+ -background $itk_option(-markbackground)
+}
+
+# ------------------------------------------------------------------
+# OPTION: -markforeground
+#
+# Foreground color scheme for marked nodes.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Hierarchy::markforeground {
+ $itk_component(list) tag configure lowlite \
+ -foreground $itk_option(-markforeground)
+}
+
+# ------------------------------------------------------------------
+# OPTION: -querycommand
+#
+# Command executed to query the contents of each node. If this
+# command contains "%n", it is replaced with the name of the desired
+# node. In its simpilest form it should return the children of the
+# given node as a list which will be depicted in the display.
+#
+# Since the names of the children are used as tags in the underlying
+# text widget, each child must be unique in the hierarchy. Due to
+# the unique requirement, the nodes shall be reffered to as uids
+# or uid in the singular sense.
+#
+# {uid [uid ...]}
+#
+# where uid is a unique id and primary key for the hierarchy entry
+#
+# Should the unique requirement pose a problem, the list returned
+# can take on another more extended form which enables the
+# association of text to be displayed with the uids. The uid must
+# still be unique, but the text does not have to obey the unique
+# rule. In addition, the format also allows the specification of
+# additional tags to be used on the same entry in the hierarchy
+# as the uid and additional icons to be displayed just before
+# the node. The tags and icons are considered to be the property of
+# the user in that the hierarchy widget will not depend on any of
+# their values.
+#
+# {{uid [text [tags [icons]]]} {uid [text [tags [icons]]]} ...}
+#
+# where uid is a unique id and primary key for the hierarchy entry
+# text is the text to be displayed for this uid
+# tags is a list of user tags to be applied to the entry
+# icons is a list of icons to be displayed in front of the text
+#
+# The hierarchy widget does a look ahead from each node to determine
+# if the node has a children. This can be cost some performace with
+# large hierarchies. User's can avoid this by providing a hint in
+# the user tags. A tag of "leaf" or "branch" tells the hierarchy
+# widget the information it needs to know thereby avoiding the look
+# ahead operation.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Hierarchy::querycommand {
+ clear
+ draw -eventually
+
+ # Added for SF ticket #596111
+ _configureTags
+}
+
+# ------------------------------------------------------------------
+# OPTION: -selectcommand
+#
+# Command executed to select an item in the list. If this command
+# contains "%n", it is replaced with the name of the selected node.
+# If it contains a "%s", it is replaced with a boolean indicator of
+# the node's current selection status, where a value of 1 denotes
+# that the node is currently selected and 0 that it is not.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Hierarchy::selectcommand {
+}
+
+# ------------------------------------------------------------------
+# OPTION: -dblclickcommand
+#
+# Command executed to double click an item in the list. If this command
+# contains "%n", it is replaced with the name of the selected node.
+# If it contains a "%s", it is replaced with a boolean indicator of
+# the node's current selection status, where a value of 1 denotes
+# that the node is currently selected and 0 that it is not.
+#
+# Douglas R. Howard, Jr.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Hierarchy::dblclickcommand {
+}
+
+# ------------------------------------------------------------------
+# OPTION: -iconcommand
+#
+# Command executed upon selection of user icons. If this command
+# contains "%n", it is replaced with the name of the node the icon
+# belongs to. Should it contain "%i" then the icon name is
+# substituted.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Hierarchy::iconcommand {
+}
+
+# ------------------------------------------------------------------
+# OPTION: -icondblcommand
+#
+# Command executed upon double selection of user icons. If this command
+# contains "%n", it is replaced with the name of the node the icon
+# belongs to. Should it contain "%i" then the icon name is
+# substituted.
+#
+# Douglas R. Howard, Jr.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Hierarchy::icondblcommand {
+}
+
+# ------------------------------------------------------------------
+# OPTION: -imagecommand
+#
+# Command executed upon selection of image icons. If this command
+# contains "%n", it is replaced with the name of the node the icon
+# belongs to. Should it contain "%i" then the icon name is
+# substituted.
+#
+# Douglas R. Howard, Jr.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Hierarchy::imagecommand {
+}
+
+# ------------------------------------------------------------------
+# OPTION: -imagedblcommand
+#
+# Command executed upon double selection of user icons. If this command
+# contains "%n", it is replaced with the name of the node the icon
+# belongs to.
+#
+# Douglas R. Howard, Jr.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Hierarchy::imagedblcommand {
+}
+
+# ------------------------------------------------------------------
+# OPTION: -alwaysquery
+#
+# Boolean flag which tells the hierarchy widget weather or not
+# each refresh of the display should be via a new query using
+# the -querycommand option or use the values previous found the
+# last time the query was made.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Hierarchy::alwaysquery {
+ switch -- $itk_option(-alwaysquery) {
+ 1 - true - yes - on {
+ ;# okay
+ }
+ 0 - false - no - off {
+ ;# okay
+ }
+ default {
+ error "bad alwaysquery option \"$itk_option(-alwaysquery)\":\
+ should be boolean"
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -filter
+#
+# When true only the branch nodes and selected items are displayed.
+# This gives a compact view of important items.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Hierarchy::filter {
+ switch -- $itk_option(-filter) {
+ 1 - true - yes - on {
+ set newCode {set display [info exists _selected($child)]}
+ }
+ 0 - false - no - off {
+ set newCode {set display 1}
+ }
+ default {
+ error "bad filter option \"$itk_option(-filter)\":\
+ should be boolean"
+ }
+ }
+ if {$newCode != $_filterCode} {
+ set _filterCode $newCode
+ draw -eventually
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -expanded
+#
+# When true, the hierarchy will be completely expanded when it
+# is first displayed. A fresh display can be triggered by
+# resetting the -querycommand option.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Hierarchy::expanded {
+ switch -- $itk_option(-expanded) {
+ 1 - true - yes - on {
+ ;# okay
+ }
+ 0 - false - no - off {
+ ;# okay
+ }
+ default {
+ error "bad expanded option \"$itk_option(-expanded)\":\
+ should be boolean"
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -openicon
+#
+# Specifies the open icon image to be used in the hierarchy. Should
+# one not be provided, then one will be generated, pixmap if
+# possible, bitmap otherwise.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Hierarchy::openicon {
+ if {$itk_option(-openicon) == {}} {
+ if {[lsearch [image names] openFolder] == -1} {
+ if {[lsearch [image types] pixmap] != -1} {
+ image create pixmap openFolder -data {
+ /* XPM */
+ static char * dir_opened [] = {
+ "16 16 4 1",
+ /* colors */
+ ". c grey85 m white g4 grey90",
+ "b c black m black g4 black",
+ "y c yellow m white g4 grey80",
+ "g c grey70 m white g4 grey70",
+ /* pixels */
+ "................",
+ "................",
+ "................",
+ "..bbbb..........",
+ ".bggggb.........",
+ "bggggggbbbbbbb..",
+ "bggggggggggggb..",
+ "bgbbbbbbbbbbbbbb",
+ "bgbyyyyyyyyyyybb",
+ "bbyyyyyyyyyyyyb.",
+ "bbyyyyyyyyyyybb.",
+ "byyyyyyyyyyyyb..",
+ "bbbbbbbbbbbbbb..",
+ "................",
+ "................",
+ "................"};
+ }
+ } else {
+ image create bitmap openFolder -data {
+ #define open_width 16
+ #define open_height 16
+ static char open_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x42, 0x00,
+ 0x81, 0x3f, 0x01, 0x20, 0xf9, 0xff, 0x0d, 0xc0,
+ 0x07, 0x40, 0x03, 0x60, 0x01, 0x20, 0x01, 0x30,
+ 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+ }
+ }
+ }
+ set itk_option(-openicon) openFolder
+ } else {
+ if {[lsearch [image names] $itk_option(-openicon)] == -1} {
+ error "bad openicon option \"$itk_option(-openicon)\":\
+ should be an existing image"
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -closedicon
+#
+# Specifies the closed icon image to be used in the hierarchy.
+# Should one not be provided, then one will be generated, pixmap if
+# possible, bitmap otherwise.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Hierarchy::closedicon {
+ if {$itk_option(-closedicon) == {}} {
+ if {[lsearch [image names] closedFolder] == -1} {
+ if {[lsearch [image types] pixmap] != -1} {
+ image create pixmap closedFolder -data {
+ /* XPM */
+ static char *dir_closed[] = {
+ "16 16 3 1",
+ ". c grey85 m white g4 grey90",
+ "b c black m black g4 black",
+ "y c yellow m white g4 grey80",
+ "................",
+ "................",
+ "................",
+ "..bbbb..........",
+ ".byyyyb.........",
+ "bbbbbbbbbbbbbb..",
+ "byyyyyyyyyyyyb..",
+ "byyyyyyyyyyyyb..",
+ "byyyyyyyyyyyyb..",
+ "byyyyyyyyyyyyb..",
+ "byyyyyyyyyyyyb..",
+ "byyyyyyyyyyyyb..",
+ "bbbbbbbbbbbbbb..",
+ "................",
+ "................",
+ "................"};
+ }
+ } else {
+ image create bitmap closedFolder -data {
+ #define closed_width 16
+ #define closed_height 16
+ static char closed_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x84, 0x00,
+ 0xfe, 0x7f, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40,
+ 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40,
+ 0xfe, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+ }
+ }
+ }
+ set itk_option(-closedicon) closedFolder
+ } else {
+ if {[lsearch [image names] $itk_option(-closedicon)] == -1} {
+ error "bad closedicon option \"$itk_option(-closedicon)\":\
+ should be an existing image"
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -nodeicon
+#
+# Specifies the node icon image to be used in the hierarchy. Should
+# one not be provided, then one will be generated, pixmap if
+# possible, bitmap otherwise.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Hierarchy::nodeicon {
+ if {$itk_option(-nodeicon) == {}} {
+ if {[lsearch [image names] nodeFolder] == -1} {
+ if {[lsearch [image types] pixmap] != -1} {
+ image create pixmap nodeFolder -data {
+ /* XPM */
+ static char *dir_node[] = {
+ "16 16 3 1",
+ ". c grey85 m white g4 grey90",
+ "b c black m black g4 black",
+ "y c yellow m white g4 grey80",
+ "................",
+ "................",
+ "................",
+ "...bbbbbbbbbbb..",
+ "..bybyyyyyyyyb..",
+ ".byybyyyyyyyyb..",
+ "byyybyyyyyyyyb..",
+ "bbbbbyyyyyyyyb..",
+ "byyyyyyyyyyyyb..",
+ "byyyyyyyyyyyyb..",
+ "byyyyyyyyyyyyb..",
+ "byyyyyyyyyyyyb..",
+ "bbbbbbbbbbbbbb..",
+ "................",
+ "................",
+ "................"};
+ }
+ } else {
+ image create bitmap nodeFolder -data {
+ #define node_width 16
+ #define node_height 16
+ static char node_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0x7f, 0x50, 0x40,
+ 0x48, 0x40, 0x44, 0x40, 0x42, 0x40, 0x7e, 0x40,
+ 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40,
+ 0xfe, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+ }
+ }
+ }
+ set itk_option(-nodeicon) nodeFolder
+ } else {
+ if {[lsearch [image names] $itk_option(-nodeicon)] == -1} {
+ error "bad nodeicon option \"$itk_option(-nodeicon)\":\
+ should be an existing image"
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -width
+#
+# Specifies the width of the hierarchy widget as an entire unit.
+# The value may be specified in any of the forms acceptable to
+# Tk_GetPixels. Any additional space needed to display the other
+# components such as labels, margins, and scrollbars force the text
+# to be compressed. A value of zero along with the same value for
+# the height causes the value given for the visibleitems option
+# to be applied which administers geometry constraints in a different
+# manner.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Hierarchy::width {
+ if {$itk_option(-width) != 0} {
+ set shell [lindex [grid info $itk_component(clipper)] 1]
+
+ #
+ # Due to a bug in the tk4.2 grid, we have to check the
+ # propagation before setting it. Setting it to the same
+ # value it already is will cause it to toggle.
+ #
+ if {[grid propagate $shell]} {
+ grid propagate $shell no
+ }
+
+ $itk_component(list) configure -width 1
+ $shell configure \
+ -width [winfo pixels $shell $itk_option(-width)]
+ } else {
+ configure -visibleitems $itk_option(-visibleitems)
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -height
+#
+# Specifies the height of the hierarchy widget as an entire unit.
+# The value may be specified in any of the forms acceptable to
+# Tk_GetPixels. Any additional space needed to display the other
+# components such as labels, margins, and scrollbars force the text
+# to be compressed. A value of zero along with the same value for
+# the width causes the value given for the visibleitems option
+# to be applied which administers geometry constraints in a different
+# manner.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Hierarchy::height {
+ if {$itk_option(-height) != 0} {
+ set shell [lindex [grid info $itk_component(clipper)] 1]
+
+ #
+ # Due to a bug in the tk4.2 grid, we have to check the
+ # propagation before setting it. Setting it to the same
+ # value it already is will cause it to toggle.
+ #
+ if {[grid propagate $shell]} {
+ grid propagate $shell no
+ }
+
+ $itk_component(list) configure -height 1
+ $shell configure \
+ -height [winfo pixels $shell $itk_option(-height)]
+ } else {
+ configure -visibleitems $itk_option(-visibleitems)
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -visibleitems
+#
+# Specified the widthxheight in characters and lines for the text.
+# This option is only administered if the width and height options
+# are both set to zero, otherwise they take precedence. With the
+# visibleitems option engaged, geometry constraints are maintained
+# only on the text. The size of the other components such as
+# labels, margins, and scroll bars, are additive and independent,
+# effecting the overall size of the scrolled text. In contrast,
+# should the width and height options have non zero values, they
+# are applied to the scrolled text as a whole. The text is
+# compressed or expanded to maintain the geometry constraints.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Hierarchy::visibleitems {
+ if {[regexp {^[0-9]+x[0-9]+$} $itk_option(-visibleitems)]} {
+ if {($itk_option(-width) == 0) && \
+ ($itk_option(-height) == 0)} {
+ set chars [lindex [split $itk_option(-visibleitems) x] 0]
+ set lines [lindex [split $itk_option(-visibleitems) x] 1]
+
+ set shell [lindex [grid info $itk_component(clipper)] 1]
+
+ #
+ # Due to a bug in the tk4.2 grid, we have to check the
+ # propagation before setting it. Setting it to the same
+ # value it already is will cause it to toggle.
+ #
+ if {! [grid propagate $shell]} {
+ grid propagate $shell yes
+ }
+
+ $itk_component(list) configure -width $chars -height $lines
+ }
+
+ } else {
+ error "bad visibleitems option\
+ \"$itk_option(-visibleitems)\": should be\
+ widthxheight"
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -textmenuloadcommand
+#
+# Dynamically loads the popup menu based on what was selected.
+#
+# Douglas R. Howard, Jr.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Hierarchy::textmenuloadcommand {}
+
+# ------------------------------------------------------------------
+# OPTION: -imagemenuloadcommand
+#
+# Dynamically loads the popup menu based on what was selected.
+#
+# Douglas R. Howard, Jr.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Hierarchy::imagemenuloadcommand {}
+
+
+# ------------------------------------------------------------------
+# PUBLIC METHODS
+# ------------------------------------------------------------------
+
+# ----------------------------------------------------------------------
+# PUBLIC METHOD: clear
+#
+# Removes all items from the display including all tags and icons.
+# The display will remain empty until the -filter or -querycommand
+# options are set.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Hierarchy::clear {} {
+ $itk_component(list) configure -state normal -cursor watch
+ $itk_component(list) delete 1.0 end
+ $itk_component(list) configure -state disabled -cursor $itk_option(-cursor)
+
+ # Clear the tags
+ eval $itk_component(list) tag delete [$itk_component(list) tag names]
+
+ catch {unset _nodes}
+ catch {unset _text}
+ catch {unset _tags}
+ catch {unset _icons}
+ catch {unset _states}
+ catch {unset _images}
+ catch {unset _indents}
+ catch {unset _marked}
+ catch {unset _selected}
+ set _markers ""
+ set _posted ""
+ set _ucounter 0
+ set _hcounter 0
+
+ foreach mark [$itk_component(list) mark names] {
+ $itk_component(list) mark unset $mark
+ }
+
+ return
+}
+
+# ----------------------------------------------------------------------
+# PUBLIC METHOD: selection option ?uid uid...?
+#
+# Handles all operations controlling selections in the hierarchy.
+# Selections may be cleared, added, removed, or queried. The add and
+# remove options accept a series of unique ids.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Hierarchy::selection {op args} {
+ switch -- $op {
+ clear {
+ $itk_component(list) tag remove hilite 1.0 end
+ catch {unset _selected}
+ return
+ }
+ add {
+ foreach node $args {
+ set _selected($node) 1
+ catch {
+ $itk_component(list) tag add hilite \
+ "$node.first" "$node.last"
+ }
+ }
+ }
+ remove {
+ foreach node $args {
+ catch {
+ unset _selected($node)
+ $itk_component(list) tag remove hilite \
+ "$node.first" "$node.last"
+ }
+ }
+ }
+ get {
+ return [array names _selected]
+ }
+ default {
+ error "bad selection operation \"$op\":\
+ should be add, remove, clear or get"
+ }
+ }
+}
+
+# ----------------------------------------------------------------------
+# PUBLIC METHOD: mark option ?arg arg...?
+#
+# Handles all operations controlling marks in the hierarchy. Marks may
+# be cleared, added, removed, or queried. The add and remove options
+# accept a series of unique ids.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Hierarchy::mark {op args} {
+ switch -- $op {
+ clear {
+ $itk_component(list) tag remove lowlite 1.0 end
+ catch {unset _marked}
+ return
+ }
+ add {
+ foreach node $args {
+ set _marked($node) 1
+ catch {
+ $itk_component(list) tag add lowlite \
+ "$node.first" "$node.last"
+ }
+ }
+ }
+ remove {
+ foreach node $args {
+ catch {
+ unset _marked($node)
+ $itk_component(list) tag remove lowlite \
+ "$node.first" "$node.last"
+ }
+ }
+ }
+ get {
+ return [array names _marked]
+ }
+ default {
+ error "bad mark operation \"$op\":\
+ should be add, remove, clear or get"
+ }
+ }
+}
+
+# ----------------------------------------------------------------------
+# PUBLIC METHOD: current
+#
+# Returns the node that was most recently selected by the right mouse
+# button when the item menu was posted. Usually used by the code
+# in the item menu to figure out what item is being manipulated.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Hierarchy::current {} {
+ return $_posted
+}
+
+# ----------------------------------------------------------------------
+# PUBLIC METHOD: expand node
+#
+# Expands the hierarchy beneath the specified node. Since this can take
+# a moment for large hierarchies, the cursor will be changed to a watch
+# during the expansion.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Hierarchy::expand {node} {
+ if {! [info exists _states($node)]} {
+ error "bad expand node argument: \"$node\", the node doesn't exist"
+ }
+
+ if {!$_states($node) && \
+ (([lsearch $_tags($node) branch] != -1) || \
+ ([llength [_contents $node]] > 0))} {
+ $itk_component(list) configure -state normal -cursor watch
+ update
+
+ #
+ # Get the indentation level for the node.
+ #
+ set indent $_indents($node)
+
+ set _markers ""
+ $itk_component(list) mark set insert "$node:start"
+ _drawLevel $node $indent
+
+ #
+ # Following the draw, all our markers need adjusting.
+ #
+ foreach {name index} $_markers {
+ $itk_component(list) mark set $name $index
+ }
+
+ #
+ # Set the image to be the open icon, denote the new state,
+ # and set the cursor back to normal along with the state.
+ #
+ $_images($node) configure -image $itk_option(-openicon)
+
+ set _states($node) 1
+
+ $itk_component(list) configure -state disabled \
+ -cursor $itk_option(-cursor)
+ }
+}
+
+# ----------------------------------------------------------------------
+# PUBLIC METHOD: collapse node
+#
+# Collapses the hierarchy beneath the specified node. Since this can
+# take a moment for large hierarchies, the cursor will be changed to a
+# watch during the expansion.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Hierarchy::collapse {node} {
+ if {! [info exists _states($node)]} {
+ error "bad collapse node argument: \"$node\", the node doesn't exist"
+ }
+
+ if {[info exists _states($node)] && $_states($node) && \
+ (([lsearch $_tags($node) branch] != -1) || \
+ ([llength [_contents $node]] > 0))} {
+ $itk_component(list) configure -state normal -cursor watch
+ update
+
+ _deselectSubNodes $node
+
+ $itk_component(list) delete "$node:start" "$node:end"
+
+ catch {$_images($node) configure -image $itk_option(-closedicon)}
+
+ set _states($node) 0
+
+ $itk_component(list) configure -state disabled \
+ -cursor $itk_option(-cursor)
+ }
+}
+
+# ----------------------------------------------------------------------
+# PUBLIC METHOD: toggle node
+#
+# Toggles the hierarchy beneath the specified node. If the hierarchy
+# is currently expanded, then it is collapsed, and vice-versa.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Hierarchy::toggle {node} {
+ if {! [info exists _states($node)]} {
+ error "bad toggle node argument: \"$node\", the node doesn't exist"
+ }
+
+ if {$_states($node)} {
+ collapse $node
+ } else {
+ expand $node
+ }
+}
+
+# ----------------------------------------------------------------------
+# PUBLIC METHOD: prune node
+#
+# Removes a particular node from the hierarchy.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Hierarchy::prune {node} {
+ #
+ # While we're working, change the state and cursor so we can
+ # edit the text and give a busy visual clue.
+ #
+ $itk_component(list) configure -state normal -cursor watch
+
+ #
+ # Recursively delete all the subnode information from our internal
+ # arrays and remove all the tags.
+ #
+ _deleteNodeInfo $node
+
+ #
+ # If the mark $node:end exists then the node has decendents so
+ # so we'll remove from the mark $node:start to $node:end in order
+ # to delete all the subnodes below it in the text.
+ #
+ if {[lsearch [$itk_component(list) mark names] $node:end] != -1} {
+ $itk_component(list) delete $node:start $node:end
+ $itk_component(list) mark unset $node:end
+ }
+
+ #
+ # Next we need to remove the node itself. Using the ranges for
+ # its tag we'll remove it from line start to the end plus one
+ # character which takes us to the start of the next node.
+ #
+ foreach {start end} [$itk_component(list) tag ranges $node] {
+ $itk_component(list) delete "$start linestart" "$end + 1 char"
+ }
+
+ #
+ # Delete the tag for this node.
+ #
+ $itk_component(list) tag delete $node
+
+ #
+ # The node must be removed from the list of subnodes for its parent.
+ # We don't really have a clean way to do upwards referencing, so
+ # the dirty way will have to do. We'll cycle through each node
+ # and if this node is in its list of subnodes, we'll remove it.
+ #
+ foreach uid [array names _nodes] {
+ if {[set index [lsearch $_nodes($uid) $node]] != -1} {
+ set _nodes($uid) [lreplace $_nodes($uid) $index $index]
+ }
+ }
+
+ #
+ # We're done, so change the state and cursor back to their
+ # original values.
+ #
+ $itk_component(list) configure -state disabled -cursor $itk_option(-cursor)
+}
+
+# ----------------------------------------------------------------------
+# PUBLIC METHOD: draw ?when?
+#
+# Performs a complete draw of the entire hierarchy.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Hierarchy::draw {{when -now}} {
+ if {$when == "-eventually"} {
+ if {$_pending == ""} {
+ set _pending [after idle [itcl::code $this draw -now]]
+ }
+ return
+ } elseif {$when != "-now"} {
+ error "bad when option \"$when\": should be -eventually or -now"
+ }
+ $itk_component(list) configure -state normal -cursor watch
+ update
+
+ $itk_component(list) delete 1.0 end
+ catch {unset _images}
+ set _markers ""
+
+ _drawLevel "" ""
+
+ foreach {name index} $_markers {
+ $itk_component(list) mark set $name $index
+ }
+
+ $itk_component(list) configure -state disabled -cursor $itk_option(-cursor)
+ set _pending ""
+}
+
+# ----------------------------------------------------------------------
+# PUBLIC METHOD: refresh node
+#
+# Performs a redraw of a specific node. If that node is currently
+# not visible, then no action is taken.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Hierarchy::refresh {node} {
+ if {! [info exists _nodes($node)]} {
+ error "bad refresh node argument: \"$node\", the node doesn't exist"
+ }
+
+
+ if {! $_states($node)} {return}
+
+ foreach parent [_getHeritage $node] {
+ if {! $_states($parent)} {return}
+ }
+
+ $itk_component(list) configure -state normal -cursor watch
+ $itk_component(list) delete $node:start $node:end
+
+ set _markers ""
+ $itk_component(list) mark set insert "$node:start"
+ set indent $_indents($node)
+
+ _drawLevel $node $indent
+
+ foreach {name index} $_markers {
+ $itk_component(list) mark set $name $index
+ }
+
+ $itk_component(list) configure -state disabled -cursor $itk_option(-cursor)
+}
+
+# ------------------------------------------------------------------
+# THIN WRAPPED TEXT METHODS:
+#
+# The following methods are thin wraps of standard text methods.
+# Consult the Tk text man pages for functionallity and argument
+# documentation.
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# PUBLIC METHOD: bbox index
+#
+# Returns four element list describing the bounding box for the list
+# item at index
+# ------------------------------------------------------------------
+itcl::body iwidgets::Hierarchy::bbox {index} {
+ return [$itk_component(list) bbox $index]
+}
+
+# ------------------------------------------------------------------
+# PUBLIC METHOD compare index1 op index2
+#
+# Compare indices according to relational operator.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Hierarchy::compare {index1 op index2} {
+ return [$itk_component(list) compare $index1 $op $index2]
+}
+
+# ------------------------------------------------------------------
+# PUBLIC METHOD delete first ?last?
+#
+# Delete a range of characters from the text.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Hierarchy::delete {first {last {}}} {
+ $itk_component(list) configure -state normal -cursor watch
+ $itk_component(list) delete $first $last
+ $itk_component(list) configure -state disabled -cursor $itk_option(-cursor)
+}
+
+# ------------------------------------------------------------------
+# PUBLIC METHOD dump ?switches? index1 ?index2?
+#
+# Returns information about the contents of the text widget from
+# index1 to index2.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Hierarchy::dump {args} {
+ return [eval $itk_component(list) dump $args]
+}
+
+# ------------------------------------------------------------------
+# PUBLIC METHOD dlineinfo index
+#
+# Returns a five element list describing the area occupied by the
+# display line containing index.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Hierarchy::dlineinfo {index} {
+ return [$itk_component(list) dlineinfo $index]
+}
+
+# ------------------------------------------------------------------
+# PUBLIC METHOD get index1 ?index2?
+#
+# Return text from start index to end index.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Hierarchy::get {index1 {index2 {}}} {
+ return [$itk_component(list) get $index1 $index2]
+}
+
+# ------------------------------------------------------------------
+# PUBLIC METHOD index index
+#
+# Return position corresponding to index.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Hierarchy::index {index} {
+ return [$itk_component(list) index $index]
+}
+
+# ------------------------------------------------------------------
+# PUBLIC METHOD insert index chars ?tagList?
+#
+# Insert text at index.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Hierarchy::insert {args} {
+ $itk_component(list) configure -state normal -cursor watch
+ eval $itk_component(list) insert $args
+ $itk_component(list) configure -state disabled -cursor $itk_option(-cursor)
+}
+
+# ------------------------------------------------------------------
+# PUBLIC METHOD scan option args
+#
+# Implements scanning on texts.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Hierarchy::scan {option args} {
+ eval $itk_component(list) scan $option $args
+}
+
+# ------------------------------------------------------------------
+# PUBLIC METHOD search ?switches? pattern index ?varName?
+#
+# Searches the text for characters matching a pattern.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Hierarchy::search {args} {
+ return [eval $itk_component(list) search $args]
+}
+
+# ------------------------------------------------------------------
+# PUBLIC METHOD see index
+#
+# Adjusts the view in the window so the character at index is
+# visible.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Hierarchy::see {index} {
+ $itk_component(list) see $index
+}
+
+# ------------------------------------------------------------------
+# PUBLIC METHOD tag option ?arg arg ...?
+#
+# Manipulate tags dependent on options.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Hierarchy::tag {op args} {
+ return [eval $itk_component(list) tag $op $args]
+}
+
+# ------------------------------------------------------------------
+# PUBLIC METHOD window option ?arg arg ...?
+#
+# Manipulate embedded windows.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Hierarchy::window {option args} {
+ return [eval $itk_component(list) window $option $args]
+}
+
+# ----------------------------------------------------------------------
+# PUBLIC METHOD: xview args
+#
+# Thin wrap of the text widget's xview command.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Hierarchy::xview {args} {
+ return [eval itk_component(list) xview $args]
+}
+
+# ----------------------------------------------------------------------
+# PUBLIC METHOD: yview args
+#
+# Thin wrap of the text widget's yview command.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Hierarchy::yview {args} {
+ return [eval $itk_component(list) yview $args]
+}
+
+# ----------------------------------------------------------------------
+# PUBLIC METHOD: expanded node
+#
+# Tells if a node is expanded or collapsed
+#
+# Douglas R. Howard, Jr.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Hierarchy::expanded {node} {
+ if {! [info exists _states($node)]} {
+ error "bad collapse node argument: \"$node\", the node doesn't exist"
+ }
+
+ return $_states($node)
+}
+
+# ----------------------------------------------------------------------
+# PUBLIC METHOD: expState
+#
+# Returns a list of all expanded nodes
+#
+# Douglas R. Howard, Jr.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Hierarchy::expState {} {
+ set nodes [_contents ""]
+ set open ""
+ set i 0
+ while {1} {
+ if {[info exists _states([lindex $nodes $i])] &&
+ $_states([lindex $nodes $i])} {
+ lappend open [lindex $nodes $i]
+ foreach child [_contents [lindex $nodes $i]] {
+ lappend nodes $child
+ }
+ }
+ incr i
+ if {$i >= [llength $nodes]} {break}
+ }
+
+ return $open
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHODS
+# ------------------------------------------------------------------
+
+# ----------------------------------------------------------------------
+# PROTECTED METHOD: _drawLevel node indent
+#
+# Used internally by draw to draw one level of the hierarchy.
+# Draws all of the nodes under node, using the indent string to
+# indent nodes.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Hierarchy::_drawLevel {node indent} {
+ lappend _markers "$node:start" [$itk_component(list) index insert]
+ set bg [$itk_component(list) cget -background]
+
+ #
+ # Obtain the list of subnodes for this node and cycle through
+ # each one displaying it in the hierarchy.
+ #
+ foreach child [_contents $node] {
+ set _images($child) "$itk_component(list).hicon[incr _hcounter]"
+
+ if {![info exists _states($child)]} {
+ set _states($child) $itk_option(-expanded)
+ }
+
+ #
+ # Check the user tags to see if they have been kind enough
+ # to tell us ahead of time what type of node we are dealing
+ # with branch or leaf. If they neglected to do so, then
+ # get the contents of the child node to see if it has children
+ # itself.
+ #
+ set display 0
+
+ if {[lsearch $_tags($child) leaf] != -1} {
+ set type leaf
+ } elseif {[lsearch $_tags($child) branch] != -1} {
+ set type branch
+ } else {
+ if {[llength [_contents $child]] == 0} {
+ set type leaf
+ } else {
+ set type branch
+ }
+ }
+
+ #
+ # Now that we know the type of node, branch or leaf, we know
+ # the type of icon to use.
+ #
+ if {$type == "leaf"} {
+ set icon $itk_option(-nodeicon)
+ eval $_filterCode
+ } else {
+ if {$_states($child)} {
+ set icon $itk_option(-openicon)
+ } else {
+ set icon $itk_option(-closedicon)
+ }
+ set display 1
+ }
+
+ #
+ # If display is set then we're going to be drawing this node.
+ # Save off the indentation level for this node and do the indent.
+ #
+ if {$display} {
+ set _indents($child) "$indent\t"
+ $itk_component(list) insert insert $indent
+
+ #
+ # Add the branch or leaf icon and setup a binding to toggle
+ # its expanded/collapsed state.
+ #
+ label $_images($child) -image $icon -background $bg
+ # DRH - enhanced and added features that handle image clicking,
+ # double clicking, and right clicking behavior
+ bind $_images($child) <ButtonPress-1> \
+ "[itcl::code $this toggle $child]; [itcl::code $this _imageSelect $child]"
+ bind $_images($child) <Double-1> [itcl::code $this _imageDblClick $child]
+ bind $_images($child) <ButtonPress-3> \
+ [itcl::code $this _imagePost $child $_images($child) $type %x %y]
+ $itk_component(list) window create insert -window $_images($child)
+
+ #
+ # If any user icons exist then draw them as well. The little
+ # regexp is just to check and see if they've passed in a
+ # command which needs to be evaluated as opposed to just
+ # a variable. Also, attach a binding to call them if their
+ # icon is selected.
+ #
+ if {[info exists _icons($child)]} {
+ foreach image $_icons($child) {
+ set wid "$itk_component(list).uicon[incr _ucounter]"
+
+ if {[regexp {\[.*\]} $image]} {
+ eval label $wid -image $image -background $bg
+ } else {
+ label $wid -image $image -background $bg
+ }
+
+ # DRH - this will bind events to the icons to allow
+ # clicking, double clicking, and right clicking actions.
+ bind $wid <ButtonPress-1> \
+ [itcl::code $this _iconSelect $child $image]
+ bind $wid <Double-1> \
+ [itcl::code $this _iconDblSelect $child $image]
+ bind $wid <ButtonPress-3> \
+ [itcl::code $this _imagePost $child $wid $type %x %y]
+ $itk_component(list) window create insert -window $wid
+ }
+ }
+
+ #
+ # Create the list of tags to be applied to the text. Start
+ # out with a tag of "info" and append "hilite" if the node
+ # is currently selected, finally add the tags given by the
+ # user.
+ #
+ set texttags [list "info" $child]
+
+ if {[info exists _selected($child)]} {
+ lappend texttags hilite
+ }
+
+ # The following conditional added for SF ticket #600941.
+ if {[info exists _marked($child)]} {
+ lappend texttags lowlite
+ }
+
+ foreach tag $_tags($child) {
+ lappend texttags $tag
+ }
+
+ #
+ # Insert the text for the node along with the tags and
+ # append to the markers the start of this node. The text
+ # has been broken at newlines into a list. We'll make sure
+ # that each line is at the same indentation position.
+ #
+ set firstline 1
+ foreach line $_text($child) {
+ if {$firstline} {
+ $itk_component(list) insert insert " "
+ } else {
+ $itk_component(list) insert insert "$indent\t"
+ }
+
+ $itk_component(list) insert insert $line $texttags "\n"
+ set firstline 0
+ }
+
+ $itk_component(list) tag raise $child
+ lappend _markers "$child:start" [$itk_component(list) index insert]
+
+ #
+ # If the state of the node is open, proceed to draw the next
+ # node below it in the hierarchy.
+ #
+ if {$_states($child)} {
+ _drawLevel $child "$indent\t"
+ }
+ }
+ }
+
+ lappend _markers "$node:end" [$itk_component(list) index insert]
+}
+
+# ----------------------------------------------------------------------
+# PROTECTED METHOD: _contents uid
+#
+# Used internally to get the contents of a particular node. If this
+# is the first time the node has been seen or the -alwaysquery
+# option is set, the -querycommand code is executed to query the node
+# list, and the list is stored until the next time it is needed.
+#
+# The querycommand may return not only the list of subnodes for the
+# node but additional information on the tags and icons to be used.
+# The return value must be parsed based on the number of elements in
+# the list where the format is a list of lists:
+#
+# {{uid [text [tags [icons]]]} {uid [text [tags [icons]]]} ...}
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Hierarchy::_contents {uid} {
+ if {$itk_option(-alwaysquery)} {
+ } else {
+ if {[info exists _nodes($uid)]} {
+ return $_nodes($uid)
+ }
+ }
+
+ #
+ # Substitute any %n's for the node name whose children we're
+ # interested in obtaining.
+ #
+ set cmd $itk_option(-querycommand)
+ regsub -all {%n} $cmd [list $uid] cmd
+
+ set nodeinfolist [uplevel \#0 $cmd]
+
+ #
+ # Cycle through the node information returned by the query
+ # command determining if additional information such as text,
+ # user tags, or user icons have been provided. For text,
+ # break it into a list at any newline characters.
+ #
+ set _nodes($uid) {}
+
+ foreach nodeinfo $nodeinfolist {
+ set subnodeuid [lindex $nodeinfo 0]
+ lappend _nodes($uid) $subnodeuid
+
+ set llen [llength $nodeinfo]
+
+ if {$llen == 0 || $llen > 4} {
+ error "invalid number of elements returned by query\
+ command for node: \"$uid\",\
+ should be uid \[text \[tags \[icons\]\]\]"
+ }
+
+ if {$llen == 1} {
+ set _text($subnodeuid) [split $subnodeuid \n]
+ }
+ if {$llen > 1} {
+ set _text($subnodeuid) [split [lindex $nodeinfo 1] \n]
+ }
+ if {$llen > 2} {
+ set _tags($subnodeuid) [lindex $nodeinfo 2]
+ } else {
+ set _tags($subnodeuid) unknown
+ }
+ if {$llen > 3} {
+ set _icons($subnodeuid) [lindex $nodeinfo 3]
+ }
+ }
+
+ #
+ # Return the list of nodes.
+ #
+ return $_nodes($uid)
+}
+
+# ----------------------------------------------------------------------
+# PROTECTED METHOD: _post x y
+#
+# Used internally to post the popup menu at the coordinate (x,y)
+# relative to the widget. If (x,y) is on an item, then the itemMenu
+# component is posted. Otherwise, the bgMenu is posted.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Hierarchy::_post {x y} {
+ set rx [expr {[winfo rootx $itk_component(list)]+$x}]
+ set ry [expr {[winfo rooty $itk_component(list)]+$y}]
+
+ set index [$itk_component(list) index @$x,$y]
+
+ #
+ # The posted variable will hold the list of tags which exist at
+ # this x,y position that will be passed back to the user. They
+ # don't need to know about our internal tags, info, hilite, and
+ # lowlite, so remove them from the list.
+ #
+ set _posted {}
+
+ foreach tag [$itk_component(list) tag names $index] {
+ if {![_isInternalTag $tag]} {
+ lappend _posted $tag
+ }
+ }
+
+ #
+ # If we have tags then do the popup at this position.
+ #
+ if {$_posted != {}} {
+ # DRH - here is where the user's function for dynamic popup
+ # menu loading is done, if the user has specified to do so with the
+ # "-textmenuloadcommand"
+ if {$itk_option(-textmenuloadcommand) != {}} {
+ eval $itk_option(-textmenuloadcommand)
+ }
+ tk_popup $itk_component(itemMenu) $rx $ry
+ } else {
+ tk_popup $itk_component(bgMenu) $rx $ry
+ }
+}
+
+# ----------------------------------------------------------------------
+# PROTECTED METHOD: _imagePost node image type x y
+#
+# Used internally to post the popup menu at the coordinate (x,y)
+# relative to the widget. If (x,y) is on an image, then the itemMenu
+# component is posted.
+#
+# Douglas R. Howard, Jr.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Hierarchy::_imagePost {node image type x y} {
+ set rx [expr {[winfo rootx $image]+$x}]
+ set ry [expr {[winfo rooty $image]+$y}]
+
+ #
+ # The posted variable will hold the list of tags which exist at
+ # this x,y position that will be passed back to the user. They
+ # don't need to know about our internal tags, info, hilite, and
+ # lowlite, so remove them from the list.
+ #
+ set _posted {}
+
+ lappend _posted $node $type
+
+ #
+ # If we have tags then do the popup at this position.
+ #
+ if {$itk_option(-imagemenuloadcommand) != {}} {
+ eval $itk_option(-imagemenuloadcommand)
+ }
+ tk_popup $itk_component(itemMenu) $rx $ry
+}
+
+# ----------------------------------------------------------------------
+# PROTECTED METHOD: _select x y
+#
+# Used internally to select an item at the coordinate (x,y) relative
+# to the widget. The command associated with the -selectcommand
+# option is execute following % character substitutions. If %n
+# appears in the command, the selected node is substituted. If %s
+# appears, a boolean value representing the current selection state
+# will be substituted.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Hierarchy::_select {x y} {
+ if {$itk_option(-selectcommand) != {}} {
+ if {[set seltags [$itk_component(list) tag names @$x,$y]] != {}} {
+ foreach tag $seltags {
+ if {![_isInternalTag $tag]} {
+ lappend node $tag
+ }
+ }
+
+ if {[lsearch $seltags "hilite"] == -1} {
+ set selectstatus 0
+ } else {
+ set selectstatus 1
+ }
+
+ set cmd $itk_option(-selectcommand)
+ regsub -all {%n} $cmd [lindex $node end] cmd
+ regsub -all {%s} $cmd [list $selectstatus] cmd
+
+ uplevel #0 $cmd
+ }
+ }
+
+ return
+}
+
+# ----------------------------------------------------------------------
+# PROTECTED METHOD: _double x y
+#
+# Used internally to double click an item at the coordinate (x,y) relative
+# to the widget. The command associated with the -dblclickcommand
+# option is execute following % character substitutions. If %n
+# appears in the command, the selected node is substituted. If %s
+# appears, a boolean value representing the current selection state
+# will be substituted.
+#
+# Douglas R. Howard, Jr.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Hierarchy::_double {x y} {
+ if {$itk_option(-dblclickcommand) != {}} {
+ if {[set seltags [$itk_component(list) tag names @$x,$y]] != {}} {
+ foreach tag $seltags {
+ if {![_isInternalTag $tag]} {
+ lappend node $tag
+ }
+ }
+
+ if {[lsearch $seltags "hilite"] == -1} {
+ set selectstatus 0
+ } else {
+ set selectstatus 1
+ }
+
+ set cmd $itk_option(-dblclickcommand)
+ regsub -all {%n} $cmd [list $node] cmd
+ regsub -all {%s} $cmd [list $selectstatus] cmd
+
+ uplevel #0 $cmd
+ }
+ }
+
+ return
+}
+
+# ----------------------------------------------------------------------
+# PROTECTED METHOD: _iconSelect node icon
+#
+# Used internally to upon selection of user icons. The -iconcommand
+# is executed after substitution of the node for %n and icon for %i.
+#
+# Douglas R. Howard, Jr.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Hierarchy::_iconSelect {node icon} {
+ set cmd $itk_option(-iconcommand)
+ regsub -all {%n} $cmd [list $node] cmd
+ regsub -all {%i} $cmd [list $icon] cmd
+
+ uplevel \#0 $cmd
+
+ return {}
+}
+
+# ----------------------------------------------------------------------
+# PROTECTED METHOD: _iconDblSelect node icon
+#
+# Used internally to upon double selection of user icons. The
+# -icondblcommand is executed after substitution of the node for %n and
+# icon for %i.
+#
+# Douglas R. Howard, Jr.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Hierarchy::_iconDblSelect {node icon} {
+ if {$itk_option(-icondblcommand) != {}} {
+ set cmd $itk_option(-icondblcommand)
+ regsub -all {%n} $cmd [list $node] cmd
+ regsub -all {%i} $cmd [list $icon] cmd
+
+ uplevel \#0 $cmd
+ }
+ return {}
+}
+
+# ----------------------------------------------------------------------
+# PROTECTED METHOD: _imageSelect node icon
+#
+# Used internally to upon selection of user icons. The -imagecommand
+# is executed after substitution of the node for %n.
+#
+# Douglas R. Howard, Jr.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Hierarchy::_imageSelect {node} {
+ if {$itk_option(-imagecommand) != {}} {
+ set cmd $itk_option(-imagecommand)
+ regsub -all {%n} $cmd [list $node] cmd
+
+ uplevel \#0 $cmd
+ }
+ return {}
+}
+
+# ----------------------------------------------------------------------
+# PROTECTED METHOD: _imageDblClick node
+#
+# Used internally to upon double selection of images. The
+# -imagedblcommand is executed.
+#
+# Douglas R. Howard, Jr.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Hierarchy::_imageDblClick {node} {
+ if {$itk_option(-imagedblcommand) != {}} {
+ set cmd $itk_option(-imagedblcommand)
+ regsub -all {%n} $cmd [list $node] cmd
+
+ uplevel \#0 $cmd
+ }
+ return {}
+}
+
+# ----------------------------------------------------------------------
+# PROTECTED METHOD: _deselectSubNodes uid
+#
+# Used internally to recursively deselect all the nodes beneath a
+# particular node.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Hierarchy::_deselectSubNodes {uid} {
+ foreach node $_nodes($uid) {
+ if {[array names _selected $node] != {}} {
+ unset _selected($node)
+ }
+
+ if {[array names _nodes $node] != {}} {
+ _deselectSubNodes $node
+ }
+ }
+}
+
+# ----------------------------------------------------------------------
+# PROTECTED METHOD: _deleteNodeInfo uid
+#
+# Used internally to recursively delete all the information about a
+# node and its decendents.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Hierarchy::_deleteNodeInfo {uid} {
+ #
+ # Recursively call ourseleves as we go down the hierarchy beneath
+ # this node.
+ #
+ if {[info exists _nodes($uid)]} {
+ foreach node $_nodes($uid) {
+ if {[array names _nodes $node] != {}} {
+ _deleteNodeInfo $node
+ }
+ }
+ }
+
+ #
+ # Unset any entries in our arrays for the node.
+ #
+ catch {unset _nodes($uid)}
+ catch {unset _text($uid)}
+ catch {unset _tags($uid)}
+ catch {unset _icons($uid)}
+ catch {unset _states($uid)}
+ catch {unset _images($uid)}
+ catch {unset _indents($uid)}
+}
+
+# ----------------------------------------------------------------------
+# PROTECTED METHOD: _getParent uid
+#
+# Used internally to determine the parent for a node.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Hierarchy::_getParent {uid} {
+ foreach node [array names _nodes] {
+ if {[set index [lsearch $_nodes($node) $uid]] != -1} {
+ return $node
+ }
+ }
+}
+
+# ----------------------------------------------------------------------
+# PROTECTED METHOD: _getHeritage uid
+#
+# Used internally to determine the list of parents for a node.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Hierarchy::_getHeritage {uid} {
+ set parents {}
+
+ if {[set parent [_getParent $uid]] != {}} {
+ lappend parents $parent
+ }
+
+ return $parents
+}
+
+# ----------------------------------------------------------------------
+# PROTECTED METHOD (could be proc?): _isInternalTag tag
+#
+# Used internally to tags not to used for user callback commands
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Hierarchy::_isInternalTag {tag} {
+ set ii [expr {[lsearch -exact {info hilite lowlite unknown} $tag] != -1}];
+ return $ii;
+}
+
+# ----------------------------------------------------------------------
+# PRIVATE METHOD: _configureTags
+#
+# This method added to fix SF ticket #596111. When the -querycommand
+# is reset after initial construction, the text component loses its
+# tag configuration. This method resets the hilite, lowlite, and info
+# tags. csmith: 9/5/02
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Hierarchy::_configureTags {} {
+ tag configure hilite -background $itk_option(-selectbackground) \
+ -foreground $itk_option(-selectforeground)
+ tag configure lowlite -background $itk_option(-markbackground) \
+ -foreground $itk_option(-markforeground)
+ tag configure info -font $itk_option(-font) -spacing1 6
+}
diff --git a/iwidgets/generic/hyperhelp.itk b/iwidgets/generic/hyperhelp.itk
new file mode 100644
index 00000000000..df2ea5e8847
--- /dev/null
+++ b/iwidgets/generic/hyperhelp.itk
@@ -0,0 +1,508 @@
+#
+# Hyperhelp
+# ----------------------------------------------------------------------
+# Implements a help facility using html formatted hypertext files.
+#
+# ----------------------------------------------------------------------
+# AUTHOR: Kris Raney EMAIL: kraney@spd.dsccc.com
+#
+# @(#) $Id$
+# ----------------------------------------------------------------------
+# Copyright (c) 1996 DSC Technologies Corporation
+# ======================================================================
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+
+#
+# Acknowledgements:
+#
+# Special thanks go to Sam Shen(SLShen@lbl.gov), as this code is based on his
+# help.tcl code from tk inspect.
+
+#
+# Default resources.
+#
+option add *Hyperhelp.width 575 widgetDefault
+option add *Hyperhelp.height 450 widgetDefault
+option add *Hyperhelp.modality none widgetDefault
+option add *Hyperhelp.vscrollMode static widgetDefault
+option add *Hyperhelp.hscrollMode static widgetDefault
+option add *Hyperhelp.maxHistory 20 widgetDefault
+
+#
+# Usual options.
+#
+itk::usual Hyperhelp {
+ keep -activebackground -activerelief -background -borderwidth -cursor \
+ -foreground -highlightcolor -highlightthickness \
+ -selectbackground -selectborderwidth -selectforeground \
+ -textbackground
+}
+
+# ------------------------------------------------------------------
+# HYPERHELP
+# ------------------------------------------------------------------
+itcl::class iwidgets::Hyperhelp {
+ inherit iwidgets::Shell
+
+ constructor {args} {}
+
+ itk_option define -topics topics Topics {}
+ itk_option define -helpdir helpdir Directory .
+ itk_option define -title title Title "Help"
+ itk_option define -closecmd closeCmd CloseCmd {}
+ itk_option define -maxhistory maxHistory MaxHistory 20
+
+ public variable beforelink {}
+ public variable afterlink {}
+
+ public method showtopic {topic}
+ public method followlink {link}
+ public method forward {}
+ public method back {}
+ public method updatefeedback {n}
+
+ protected method _readtopic {file {anchorpoint {}}}
+ protected method _pageforward {}
+ protected method _pageback {}
+ protected method _lineforward {}
+ protected method _lineback {}
+ protected method _fill_go_menu {}
+
+ protected variable _history {} ;# History list of viewed pages
+ protected variable _history_ndx -1 ;# current position in history list
+ protected variable _history_len 0 ;# length of history list
+ protected variable _histdir -1 ;# direction in history we just came
+ ;# from
+ protected variable _len 0 ;# length of text to be rendered
+ protected variable _file {} ;# current topic
+
+ private variable _remaining 0 ;# remaining text to be rendered
+ private variable _rendering 0 ;# flag - in process of rendering
+}
+
+#
+# Provide a lowercased access method for the Scrolledlistbox class.
+#
+proc ::iwidgets::hyperhelp {pathName args} {
+ uplevel ::iwidgets::Hyperhelp $pathName $args
+}
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Hyperhelp::constructor {args} {
+ itk_option remove iwidgets::Shell::padx iwidgets::Shell::pady
+
+ #
+ # Create a pulldown menu
+ #
+ itk_component add -private menubar {
+ frame $itk_interior.menu -relief raised -bd 2
+ } {
+ keep -background -cursor
+ }
+ pack $itk_component(menubar) -side top -fill x
+
+ itk_component add -private topicmb {
+ menubutton $itk_component(menubar).topicmb -text "Topics" \
+ -menu $itk_component(menubar).topicmb.topicmenu \
+ -underline 0 -padx 8 -pady 2
+ } {
+ keep -background -cursor -font -foreground \
+ -activebackground -activeforeground
+ }
+ pack $itk_component(topicmb) -side left
+
+ itk_component add -private topicmenu {
+ menu $itk_component(topicmb).topicmenu -tearoff no
+ } {
+ keep -background -cursor -font -foreground \
+ -activebackground -activeforeground
+ }
+
+ itk_component add -private navmb {
+ menubutton $itk_component(menubar).navmb -text "Navigate" \
+ -menu $itk_component(menubar).navmb.navmenu \
+ -underline 0 -padx 8 -pady 2
+ } {
+ keep -background -cursor -font -foreground \
+ -activebackground -activeforeground
+ }
+ pack $itk_component(navmb) -side left
+
+ itk_component add -private navmenu {
+ menu $itk_component(navmb).navmenu -tearoff no
+ } {
+ keep -background -cursor -font -foreground \
+ -activebackground -activeforeground
+ }
+ set m $itk_component(navmenu)
+ $m add command -label "Forward" -underline 0 -state disabled \
+ -command [itcl::code $this forward] -accelerator f
+ $m add command -label "Back" -underline 0 -state disabled \
+ -command [itcl::code $this back] -accelerator b
+ $m add cascade -label "Go" -underline 0 -menu $m.go
+
+ itk_component add -private navgo {
+ menu $itk_component(navmenu).go -postcommand [itcl::code $this _fill_go_menu]
+ } {
+ keep -background -cursor -font -foreground \
+ -activebackground -activeforeground
+ }
+
+ #
+ # Create a scrolledhtml object to display help pages
+ #
+ itk_component add scrtxt {
+ iwidgets::scrolledhtml $itk_interior.scrtxt \
+ -linkcommand "$this followlink" -feedback "$this updatefeedback"
+ } {
+ keep -hscrollmode -vscrollmode -background -textbackground \
+ -fontname -fontsize -fixedfont -link \
+ -linkhighlight -borderwidth -cursor -sbwidth -scrollmargin \
+ -width -height -foreground -highlightcolor -visibleitems \
+ -highlightthickness -padx -pady -activerelief \
+ -relief -selectbackground -selectborderwidth \
+ -selectforeground -setgrid -wrap -unknownimage
+ }
+ pack $itk_component(scrtxt) -fill both -expand yes
+
+ #
+ # Bind shortcut keys
+ #
+ bind $itk_component(hull) <Key-f> [itcl::code $this forward]
+ bind $itk_component(hull) <Key-b> [itcl::code $this back]
+ bind $itk_component(hull) <Alt-Right> [itcl::code $this forward]
+ bind $itk_component(hull) <Alt-Left> [itcl::code $this back]
+ bind $itk_component(hull) <Key-space> [itcl::code $this _pageforward]
+ bind $itk_component(hull) <Key-Next> [itcl::code $this _pageforward]
+ bind $itk_component(hull) <Key-BackSpace> [itcl::code $this _pageback]
+ bind $itk_component(hull) <Key-Prior> [itcl::code $this _pageback]
+ bind $itk_component(hull) <Key-Delete> [itcl::code $this _pageback]
+ bind $itk_component(hull) <Key-Down> [itcl::code $this _lineforward]
+ bind $itk_component(hull) <Key-Up> [itcl::code $this _lineback]
+
+ wm title $itk_component(hull) "Help"
+
+ eval itk_initialize $args
+ if {[lsearch -exact $args -closecmd] == -1} {
+ configure -closecmd [itcl::code $this deactivate]
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTIONS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# OPTION: -topics
+#
+# Specifies the topics to display on the menu. For each topic, there should
+# be a file named <helpdir>/<topic>.html
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Hyperhelp::topics {
+ set m $itk_component(topicmenu)
+ $m delete 0 last
+ foreach topic $itk_option(-topics) {
+ if {[lindex $topic 1] == {} } {
+ $m add radiobutton -variable topic \
+ -value $topic \
+ -label $topic \
+ -command [list $this showtopic $topic]
+ } else {
+ if {[string index [file dirname [lindex $topic 1]] 0] != "/" && \
+ [string index [file dirname [lindex $topic 1]] 0] != "~"} {
+ set link $itk_option(-helpdir)/[lindex $topic 1]
+ } else {
+ set link [lindex $topic 1]
+ }
+ $m add radiobutton -variable topic \
+ -value [lindex $topic 0] \
+ -label [lindex $topic 0] \
+ -command [list $this followlink $link]
+ }
+ }
+ $m add separator
+ $m add command -label "Close Help" -underline 0 \
+ -command $itk_option(-closecmd)
+}
+
+# ------------------------------------------------------------------
+# OPTION: -title
+#
+# Specify the window title.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Hyperhelp::title {
+ wm title $itk_component(hull) $itk_option(-title)
+}
+
+# ------------------------------------------------------------------
+# OPTION: -helpdir
+#
+# Set location of help files
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Hyperhelp::helpdir {
+ if {[file pathtype $itk_option(-helpdir)] == "relative"} {
+ configure -helpdir [file join [pwd] $itk_option(-helpdir)]
+ } else {
+ set _history {}
+ set _history_len 0
+ set _history_ndx -1
+ $itk_component(navmenu) entryconfig 0 -state disabled
+ $itk_component(navmenu) entryconfig 1 -state disabled
+ configure -topics $itk_option(-topics)
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -closecmd
+#
+# Specify the command to execute when close is selected from the menu
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Hyperhelp::closecmd {
+ $itk_component(topicmenu) entryconfigure last -command $itk_option(-closecmd)
+}
+
+# ------------------------------------------------------------------
+# METHODS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# METHOD: showtopic topic
+#
+# render text of help topic <topic>. The text is expected to be found in
+# <helpdir>/<topic>.html
+# ------------------------------------------------------------------
+itcl::body iwidgets::Hyperhelp::showtopic {topic} {
+ if ![regexp {(.*)#(.*)} $topic dummy topicname anchorpart] {
+ set topicname $topic
+ set anchorpart {}
+ }
+ if {$topicname == ""} {
+ set topicname $_file
+ set filepath $_file
+ } else {
+ set filepath $itk_option(-helpdir)/$topicname.html
+ }
+ if {[incr _history_ndx] < $itk_option(-maxhistory)} {
+ set _history [lrange $_history 0 [expr {$_history_ndx - 1}]]
+ set _history_len [expr {$_history_ndx + 1}]
+ } else {
+ incr _history_ndx -1
+ set _history [lrange $_history 1 $_history_ndx]
+ set _history_len [expr {$_history_ndx + 1}]
+ }
+ lappend _history [list $topicname $filepath $anchorpart]
+ _readtopic $filepath $anchorpart
+}
+
+# ------------------------------------------------------------------
+# METHOD: followlink link
+#
+# Callback for click on a link. Shows new topic.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Hyperhelp::followlink {link} {
+ if {[string compare $beforelink ""] != 0} {
+ eval $beforelink $link
+ }
+ if ![regexp {(.*)#(.*)} $link dummy filepart anchorpart] {
+ set filepart $link
+ set anchorpart {}
+ }
+ if {$filepart != "" && [string index [file dirname $filepart] 0] != "/" && \
+ [string index [file dirname $filepart] 0] != "~"} {
+ set filepart [$itk_component(scrtxt) pwd]/$filepart
+ set hfile $filepart
+ } else {
+ set hfile $_file
+ }
+ incr _history_ndx
+ set _history [lrange $_history 0 [expr {$_history_ndx - 1}]]
+ set _history_len [expr {$_history_ndx + 1}]
+ lappend _history [list [file rootname [file tail $hfile]] $hfile $anchorpart]
+ set ret [_readtopic $filepart $anchorpart]
+ if {[string compare $afterlink ""] != 0} {
+ eval $afterlink $link
+ }
+ return $ret
+}
+
+# ------------------------------------------------------------------
+# METHOD: forward
+#
+# Show topic one forward in history list
+# ------------------------------------------------------------------
+itcl::body iwidgets::Hyperhelp::forward {} {
+ if {$_rendering || ($_history_ndx+1) >= $_history_len} return
+ incr _history_ndx
+ eval _readtopic [lrange [lindex $_history $_history_ndx] 1 end]
+}
+
+# ------------------------------------------------------------------
+# METHOD: back
+#
+# Show topic one back in history list
+# ------------------------------------------------------------------
+itcl::body iwidgets::Hyperhelp::back {} {
+ if {$_rendering || $_history_ndx <= 0} return
+ incr _history_ndx -1
+ set _histdir 1
+ eval _readtopic [lrange [lindex $_history $_history_ndx] 1 end]
+}
+
+# ------------------------------------------------------------------
+# METHOD: updatefeedback remaining
+#
+# Callback from text to update feedback widget
+# ------------------------------------------------------------------
+itcl::body iwidgets::Hyperhelp::updatefeedback {n} {
+ if {($_remaining - $n) > .1*$_len} {
+ [$itk_interior.feedbackshell childsite].helpfeedback step [expr {$_remaining - $n}]
+ update idletasks
+ set _remaining $n
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _readtopic
+#
+# Read in file, render it in text area, and jump to anchorpoint
+# ------------------------------------------------------------------
+itcl::body iwidgets::Hyperhelp::_readtopic {file {anchorpoint {}}} {
+ if {$file != ""} {
+ if {[string compare $file $_file] != 0} {
+ if {[catch {set f [open $file r]} err]} {
+ incr _history_ndx $_histdir
+ set _history_len [expr {$_history_ndx + 1}]
+ set _histdir -1
+ set m $itk_component(navmenu)
+ if {($_history_ndx+1) < $_history_len} {
+ $m entryconfig 0 -state normal
+ } else {
+ $m entryconfig 0 -state disabled
+ }
+ if {$_history_ndx > 0} {
+ $m entryconfig 1 -state normal
+ } else {
+ $m entryconfig 1 -state disabled
+ }
+ return
+ }
+ set _file $file
+ set txt [read $f]
+ iwidgets::shell $itk_interior.feedbackshell -title \
+ "Rendering HTML" -padx 1 -pady 1
+ iwidgets::Feedback [$itk_interior.feedbackshell \
+ childsite].helpfeedback \
+ -steps [set _len [string length $txt]] \
+ -labeltext "Rendering HTML" -labelpos n
+ pack [$itk_interior.feedbackshell childsite].helpfeedback
+ $itk_interior.feedbackshell center $itk_interior
+ $itk_interior.feedbackshell activate
+ set _remaining $_len
+ set _rendering 1
+ if {[catch {$itk_component(scrtxt) render $txt [file dirname \
+ $file]} err]} {
+ if [regexp "</pre>" $err] {
+ $itk_component(scrtxt) render "<tt>$err</tt>"
+ } else {
+ $itk_component(scrtxt) render "<pre>$err</pre>"
+ }
+ }
+ wm title $itk_component(hull) "Help: $file"
+ itcl::delete object [$itk_interior.feedbackshell \
+ childsite].helpfeedback
+ itcl::delete object $itk_interior.feedbackshell
+ set _rendering 0
+ }
+ }
+ set m $itk_component(navmenu)
+ if {($_history_ndx+1) < $_history_len} {
+ $m entryconfig 0 -state normal
+ } else {
+ $m entryconfig 0 -state disabled
+ }
+ if {$_history_ndx > 0} {
+ $m entryconfig 1 -state normal
+ } else {
+ $m entryconfig 1 -state disabled
+ }
+ if {$anchorpoint != {}} {
+ $itk_component(scrtxt) import -link #$anchorpoint
+ } else {
+ $itk_component(scrtxt) import -link #
+ }
+ set _histdir -1
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _fill_go_menu
+#
+# update go submenu with current history
+# ------------------------------------------------------------------
+itcl::body iwidgets::Hyperhelp::_fill_go_menu {} {
+ set m $itk_component(navgo)
+ catch {$m delete 0 last}
+ for {set i [expr {$_history_len - 1}]} {$i >= 0} {incr i -1} {
+ set topic [lindex [lindex $_history $i] 0]
+ set filepath [lindex [lindex $_history $i] 1]
+ set anchor [lindex [lindex $_history $i] 2]
+ $m add command -label $topic \
+ -command [list $this followlink $filepath#$anchor]
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _pageforward
+#
+# Callback for page forward shortcut key
+# ------------------------------------------------------------------
+itcl::body iwidgets::Hyperhelp::_pageforward {} {
+ $itk_component(scrtxt) yview scroll 1 pages
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _pageback
+#
+# Callback for page back shortcut key
+# ------------------------------------------------------------------
+itcl::body iwidgets::Hyperhelp::_pageback {} {
+ $itk_component(scrtxt) yview scroll -1 pages
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _lineforward
+#
+# Callback for line forward shortcut key
+# ------------------------------------------------------------------
+itcl::body iwidgets::Hyperhelp::_lineforward {} {
+ $itk_component(scrtxt) yview scroll 1 units
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _lineback
+#
+# Callback for line back shortcut key
+# ------------------------------------------------------------------
+itcl::body iwidgets::Hyperhelp::_lineback {} {
+ $itk_component(scrtxt) yview scroll -1 units
+}
diff --git a/iwidgets/generic/labeledframe.itk b/iwidgets/generic/labeledframe.itk
new file mode 100644
index 00000000000..59aa501707c
--- /dev/null
+++ b/iwidgets/generic/labeledframe.itk
@@ -0,0 +1,496 @@
+#
+# Labeledframe
+# ----------------------------------------------------------------------
+# Implements a hull frame with a grooved relief, a label, and a
+# frame childsite.
+#
+# The frame childsite can be filled with any widget via a derived class
+# or though the use of the childsite method. This class was designed
+# to be a general purpose base class for supporting the combination of
+# a labeled frame and a childsite. The options include the ability to
+# position the label at configurable locations within the grooved relief
+# of the hull frame, and control the display of the label.
+#
+# To following demonstrates the different values which the "-labelpos"
+# option may be set to and the resulting layout of the label when
+# one executes the following command with "-labeltext" set to "LABEL":
+#
+# example:
+# labeledframe .w -labeltext LABEL -labelpos <ne,n,nw,se,s,sw,en,e,es,wn,s,ws>
+#
+# ne n nw se s sw
+#
+# *LABEL**** **LABEL** ****LABEL* ********** ********* **********
+# * * * * * * * * * * * *
+# * * * * * * * * * * * *
+# * * * * * * * * * * * *
+# ********** ********* ********** *LABEL**** **LABEL** ****LABEL*
+#
+# en e es wn s ws
+#
+# ********** ********* ********* ********* ********* **********
+# * * * * * * * * * * * *
+# L * * * * * * L * * * *
+# A * L * * * * A * L * L
+# B * A * L * * B * A * A
+# E * B * A * * E * B * B
+# L * E * B * * L * E * E
+# * * L * E * * * * L * L
+# * * * * L * * * * * * *
+# ********** ********** ********* ********** ********* **********
+#
+# ----------------------------------------------------------------------
+# AUTHOR: John A. Tucker EMAIL: jatucker@spd.dsccc.com
+#
+# ======================================================================
+# Copyright (c) 1997 DSC Technologies Corporation
+# ======================================================================
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+
+#
+# Default resources.
+#
+option add *Labeledframe.labelMargin 10 widgetDefault
+option add *Labeledframe.labelFont \
+ "-Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-*" widgetDefault
+option add *Labeledframe.labelPos n widgetDefault
+option add *Labeledframe.borderWidth 2 widgetDefault
+option add *Labeledframe.relief groove widgetDefault
+
+
+#
+# Usual options.
+#
+itk::usual Labeledframe {
+ keep -background -cursor -labelfont -foreground
+}
+
+itcl::class iwidgets::Labeledframe {
+
+ inherit itk::Archetype
+
+ itk_option define -ipadx iPadX IPad 0
+ itk_option define -ipady iPadY IPad 0
+
+ itk_option define -labelmargin labelMargin LabelMargin 10
+ itk_option define -labelpos labelPos LabelPos n
+
+ constructor {args} {}
+ destructor {}
+
+ #
+ # Public methods
+ #
+ public method childsite {}
+
+ #
+ # Protected methods
+ #
+ protected {
+ method _positionLabel {{when later}}
+ method _collapseMargin {}
+ method _setMarginThickness {value}
+ method smt {value} { _setMarginThickness $value }
+ }
+
+ #
+ # Private methods/data
+ #
+ private {
+ proc _initTable {}
+
+ variable _reposition "" ;# non-null => _positionLabel pending
+ variable itk_hull ""
+
+ common _LAYOUT_TABLE
+ }
+}
+
+#
+# Provide a lowercased access method for the Labeledframe class.
+#
+proc ::iwidgets::labeledframe {pathName args} {
+ uplevel ::iwidgets::Labeledframe $pathName $args
+}
+
+# -----------------------------------------------------------------------------
+# CONSTRUCTOR
+# -----------------------------------------------------------------------------
+itcl::body iwidgets::Labeledframe::constructor { args } {
+ #
+ # Create a window with the same name as this object
+ #
+ set itk_hull [namespace tail $this]
+ set itk_interior $itk_hull
+
+ itk_component add hull {
+ frame $itk_hull \
+ -relief groove \
+ -class [namespace tail [info class]]
+ } {
+ keep -background -cursor -relief -borderwidth
+ rename -highlightbackground -background background Background
+ rename -highlightcolor -background background Background
+ }
+ bind itk-delete-$itk_hull <Destroy> "itcl::delete object $this"
+
+ set tags [bindtags $itk_hull]
+ bindtags $itk_hull [linsert $tags 0 itk-delete-$itk_hull]
+
+ #
+ # Create the childsite frame window
+ # _______
+ # |_____|
+ # |_|X|_|
+ # |_____|
+ #
+ itk_component add childsite {
+ frame $itk_interior.childsite -highlightthickness 0 -bd 0
+ }
+
+ #
+ # Create the label to be positioned within the grooved relief
+ # of the hull frame.
+ #
+ itk_component add label {
+ label $itk_interior.label -highlightthickness 0 -bd 0
+ } {
+ usual
+ rename -bitmap -labelbitmap labelBitmap Bitmap
+ rename -font -labelfont labelFont Font
+ rename -image -labelimage labelImage Image
+ rename -text -labeltext labelText Text
+ rename -textvariable -labelvariable labelVariable Variable
+ ignore -highlightthickness -highlightcolor
+ }
+
+ grid $itk_component(childsite) -row 1 -column 1 -sticky nsew
+ grid columnconfigure $itk_interior 1 -weight 1
+ grid rowconfigure $itk_interior 1 -weight 1
+
+ bind $itk_component(label) <Configure> +[itcl::code $this _positionLabel]
+
+ #
+ # Initialize the class array of layout configuration options. Since
+ # this is a one time only thing.
+ #
+ _initTable
+
+ eval itk_initialize $args
+
+ #
+ # When idle, position the label.
+ #
+ _positionLabel
+}
+
+# -----------------------------------------------------------------------------
+# DESTRUCTOR
+# -----------------------------------------------------------------------------
+itcl::body iwidgets::Labeledframe::destructor {} {
+
+ if {$_reposition != ""} {
+ after cancel $_reposition
+ }
+
+ if {[winfo exists $itk_hull]} {
+ set tags [bindtags $itk_hull]
+ set i [lsearch $tags itk-delete-$itk_hull]
+ if {$i >= 0} {
+ bindtags $itk_hull [lreplace $tags $i $i]
+ }
+ destroy $itk_hull
+ }
+}
+
+# -----------------------------------------------------------------------------
+# OPTIONS
+# -----------------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# OPTION: -ipadx
+#
+# Specifies the width of the horizontal gap from the border to the
+# the child site.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Labeledframe::ipadx {
+ grid configure $itk_component(childsite) -padx $itk_option(-ipadx)
+ _positionLabel
+}
+
+# ------------------------------------------------------------------
+# OPTION: -ipady
+#
+# Specifies the width of the vertical gap from the border to the
+# the child site.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Labeledframe::ipady {
+ grid configure $itk_component(childsite) -pady $itk_option(-ipady)
+ _positionLabel
+}
+
+# -----------------------------------------------------------------------------
+# OPTION: -labelmargin
+#
+# Set the margin of the most adjacent side of the label to the hull
+# relief.
+# ----------------------------------------------------------------------------
+itcl::configbody iwidgets::Labeledframe::labelmargin {
+ _positionLabel
+}
+
+# -----------------------------------------------------------------------------
+# OPTION: -labelpos
+#
+# Set the position of the label within the relief of the hull frame
+# widget.
+# ----------------------------------------------------------------------------
+itcl::configbody iwidgets::Labeledframe::labelpos {
+ _positionLabel
+}
+
+# -----------------------------------------------------------------------------
+# PROCS
+# -----------------------------------------------------------------------------
+
+# -----------------------------------------------------------------------------
+# PRIVATE PROC: _initTable
+#
+# Initializes the _LAYOUT_TABLE common variable of the Labeledframe
+# class. The initialization is performed in its own proc ( as opposed
+# to in the class definition ) so that the initialization occurs only
+# once.
+#
+# _LAYOUT_TABLE common array description:
+# Provides a table of the configuration option values
+# used to place the label widget within the grooved relief of the hull
+# frame for each of the 12 possible "-labelpos" values.
+#
+# Each of the 12 rows is layed out as follows:
+# {"-relx" "-rely" <rowconfigure|columnconfigure> <row/column number>}
+# -----------------------------------------------------------------------------
+itcl::body iwidgets::Labeledframe::_initTable {} {
+ array set _LAYOUT_TABLE {
+ nw-relx 0.0 nw-rely 0.0 nw-wrap 0 nw-conf rowconfigure nw-num 0
+ n-relx 0.5 n-rely 0.0 n-wrap 0 n-conf rowconfigure n-num 0
+ ne-relx 1.0 ne-rely 0.0 ne-wrap 0 ne-conf rowconfigure ne-num 0
+
+ sw-relx 0.0 sw-rely 1.0 sw-wrap 0 sw-conf rowconfigure sw-num 2
+ s-relx 0.5 s-rely 1.0 s-wrap 0 s-conf rowconfigure s-num 2
+ se-relx 1.0 se-rely 1.0 se-wrap 0 se-conf rowconfigure se-num 2
+
+ en-relx 1.0 en-rely 0.0 en-wrap 1 en-conf columnconfigure en-num 2
+ e-relx 1.0 e-rely 0.5 e-wrap 1 e-conf columnconfigure e-num 2
+ es-relx 1.0 es-rely 1.0 es-wrap 1 es-conf columnconfigure es-num 2
+
+ wn-relx 0.0 wn-rely 0.0 wn-wrap 1 wn-conf columnconfigure wn-num 0
+ w-relx 0.0 w-rely 0.5 w-wrap 1 w-conf columnconfigure w-num 0
+ ws-relx 0.0 ws-rely 1.0 ws-wrap 1 ws-conf columnconfigure ws-num 0
+ }
+
+ #
+ # Since this is a one time only thing, we'll redefine the proc to be empty
+ # afterwards so it only happens once.
+ #
+ # NOTE: Be careful to use the "body" command, or the proc will get lost!
+ #
+ itcl::body ::iwidgets::Labeledframe::_initTable {} {}
+}
+
+# -----------------------------------------------------------------------------
+# METHODS
+# -----------------------------------------------------------------------------
+
+# -----------------------------------------------------------------------------
+# PUBLIC METHOD:: childsite
+#
+# -----------------------------------------------------------------------------
+itcl::body iwidgets::Labeledframe::childsite {} {
+ return $itk_component(childsite)
+}
+
+# -----------------------------------------------------------------------------
+# PROTECTED METHOD: _positionLabel ?when?
+#
+# Places the label in the relief of the hull. If "when" is "now", the
+# change is applied immediately. If it is "later" or it is not
+# specified, then the change is applied later, when the application
+# is idle.
+# -----------------------------------------------------------------------------
+itcl::body iwidgets::Labeledframe::_positionLabel {{when later}} {
+
+ if {$when == "later"} {
+ if {$_reposition == ""} {
+ set _reposition [after idle [itcl::code $this _positionLabel now]]
+ }
+ return
+ }
+
+ set pos $itk_option(-labelpos)
+
+ #
+ # If there is not an entry for the "relx" value associated with
+ # the given "-labelpos" option value, then it invalid.
+ #
+ if { [catch {set relx $_LAYOUT_TABLE($pos-relx)}] } {
+ error "bad labelpos option\"$itk_option(-labelpos)\": should be\
+ nw, n, ne, sw, s, se, en, e, es, wn, w, or ws"
+ }
+
+ update idletasks
+ $itk_component(label) configure -wraplength $_LAYOUT_TABLE($pos-wrap)
+ set labelWidth [winfo reqwidth $itk_component(label)]
+ set labelHeight [winfo reqheight $itk_component(label)]
+ set borderwidth $itk_option(-borderwidth)
+ set margin $itk_option(-labelmargin)
+
+ switch $pos {
+ nw {
+ set labelThickness $labelHeight
+ set minsize [expr {$labelThickness/2.0}]
+ set xPos [expr {$minsize+$borderwidth+$margin}]
+ set yPos -$minsize
+ }
+ n {
+ set labelThickness $labelHeight
+ set minsize [expr {$labelThickness/2.0}]
+ set xPos [expr {-$labelWidth/2.0}]
+ set yPos -$minsize
+ }
+ ne {
+ set labelThickness $labelHeight
+ set minsize [expr {$labelThickness/2.0}]
+ set xPos [expr {-($minsize+$borderwidth+$margin+$labelWidth)}]
+ set yPos -$minsize
+ }
+
+ sw {
+ set labelThickness $labelHeight
+ set minsize [expr {$labelThickness/2.0}]
+ set xPos [expr {$minsize+$borderwidth+$margin}]
+ set yPos -$minsize
+ }
+ s {
+ set labelThickness $labelHeight
+ set minsize [expr {$labelThickness/2.0}]
+ set xPos [expr {-$labelWidth/2.0}]
+ set yPos [expr {-$labelHeight/2.0}]
+ }
+ se {
+ set labelThickness $labelHeight
+ set minsize [expr {$labelThickness/2.0}]
+ set xPos [expr {-($minsize+$borderwidth+$margin+$labelWidth)}]
+ set yPos [expr {-$labelHeight/2.0}]
+ }
+
+ wn {
+ set labelThickness $labelWidth
+ set minsize [expr {$labelThickness/2.0}]
+ set xPos -$minsize
+ set yPos [expr {$minsize+$margin+$borderwidth}]
+ }
+ w {
+ set labelThickness $labelWidth
+ set minsize [expr {$labelThickness/2.0}]
+ set xPos -$minsize
+ set yPos [expr {-($labelHeight/2.0)}]
+ }
+ ws {
+ set labelThickness $labelWidth
+ set minsize [expr {$labelThickness/2.0}]
+ set xPos -$minsize
+ set yPos [expr {-($minsize+$borderwidth+$margin+$labelHeight)}]
+ }
+
+ en {
+ set labelThickness $labelWidth
+ set minsize [expr {$labelThickness/2.0}]
+ set xPos -$minsize
+ set yPos [expr {$minsize+$borderwidth+$margin}]
+ }
+ e {
+ set labelThickness $labelWidth
+ set minsize [expr {$labelThickness/2.0}]
+ set xPos -$minsize
+ set yPos [expr {-($labelHeight/2.0)}]
+ }
+ es {
+ set labelThickness $labelWidth
+ set minsize [expr {$labelThickness/2.0}]
+ set xPos -$minsize
+ set yPos [expr {-($minsize+$borderwidth+$margin+$labelHeight)}]
+ }
+ }
+ _setMarginThickness $minsize
+
+ place $itk_component(label) \
+ -relx $_LAYOUT_TABLE($pos-relx) -x $xPos \
+ -rely $_LAYOUT_TABLE($pos-rely) -y $yPos \
+ -anchor nw
+
+ set what $_LAYOUT_TABLE($pos-conf)
+ set number $_LAYOUT_TABLE($pos-num)
+
+ grid $what $itk_interior $number -minsize $minsize
+
+ set _reposition ""
+}
+
+# -----------------------------------------------------------------------------
+# PROTECTED METHOD: _collapseMargin
+#
+# Resets the "-minsize" of all rows and columns of the hull's grid
+# used to set the label margin to 0
+# -----------------------------------------------------------------------------
+itcl::body iwidgets::Labeledframe::_collapseMargin {} {
+ grid columnconfigure $itk_interior 0 -minsize 0
+ grid columnconfigure $itk_interior 2 -minsize 0
+ grid rowconfigure $itk_interior 0 -minsize 0
+ grid rowconfigure $itk_interior 2 -minsize 0
+}
+
+# -----------------------------------------------------------------------------
+# PROTECTED METHOD: _setMarginThickness
+#
+# Set the margin thickness ( i.e. the hidden "-highlightthickness"
+# of the hull ) to the input value.
+#
+# The "-highlightthickness" option of the hull frame is not intended to be
+# configured by users of this class, but does need to be configured to properly
+# place the label whenever the label is configured.
+#
+# Therefore, since I can't find a better way at this time, I achieve this
+# configuration by: adding the "-highlightthickness" option back into
+# the hull frame; configuring the "-highlightthickness" option to properly
+# place the label; and then remove the "-highlightthickness" option from the
+# hull.
+#
+# This way the option is not visible or configurable without some hacking.
+#
+# -----------------------------------------------------------------------------
+itcl::body iwidgets::Labeledframe::_setMarginThickness {value} {
+ itk_option add hull.highlightthickness
+ $itk_component(hull) configure -highlightthickness $value
+ itk_option remove hull.highlightthickness
+}
+
+
diff --git a/iwidgets/generic/labeledwidget.itk b/iwidgets/generic/labeledwidget.itk
new file mode 100644
index 00000000000..2e0faa5d21d
--- /dev/null
+++ b/iwidgets/generic/labeledwidget.itk
@@ -0,0 +1,445 @@
+#
+# Labeledwidget
+# ----------------------------------------------------------------------
+# Implements a labeled widget which contains a label and child site.
+# The child site is a frame which can filled with any widget via a
+# derived class or though the use of the childsite method. This class
+# was designed to be a general purpose base class for supporting the
+# combination of label widget and a childsite, where a label may be
+# text, bitmap or image. The options include the ability to position
+# the label around the childsite widget, modify the font and margin,
+# and control the display of the label.
+#
+# ----------------------------------------------------------------------
+# AUTHOR: Mark L. Ulferts EMAIL: mulferts@austin.dsccc.com
+#
+# @(#) $Id$
+# ----------------------------------------------------------------------
+# Copyright (c) 1995 DSC Technologies Corporation
+# ======================================================================
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+
+#
+# Usual options.
+#
+itk::usual Labeledwidget {
+ keep -background -cursor -foreground -labelfont
+}
+
+# ------------------------------------------------------------------
+# LABELEDWIDGET
+# ------------------------------------------------------------------
+itcl::class iwidgets::Labeledwidget {
+ inherit itk::Widget
+
+ constructor {args} {}
+ destructor {}
+
+ itk_option define -disabledforeground disabledForeground \
+ DisabledForeground \#a3a3a3
+ itk_option define -labelpos labelPos Position w
+ itk_option define -labelmargin labelMargin Margin 2
+ itk_option define -labeltext labelText Text {}
+ itk_option define -labelvariable labelVariable Variable {}
+ itk_option define -labelbitmap labelBitmap Bitmap {}
+ itk_option define -labelimage labelImage Image {}
+ itk_option define -state state State normal
+ itk_option define -sticky sticky Sticky nsew
+
+ public method childsite
+
+ private method _positionLabel {{when later}}
+
+ proc alignlabels {args} {}
+
+ protected variable _reposition "" ;# non-null => _positionLabel pending
+}
+
+#
+# Provide a lowercased access method for the Labeledwidget class.
+#
+proc ::iwidgets::labeledwidget {pathName args} {
+ uplevel ::iwidgets::Labeledwidget $pathName $args
+}
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Labeledwidget::constructor {args} {
+ #
+ # Create a frame for the childsite widget.
+ #
+ itk_component add -protected lwchildsite {
+ frame $itk_interior.lwchildsite
+ }
+
+ #
+ # Create label.
+ #
+ itk_component add label {
+ label $itk_interior.label
+ } {
+ usual
+
+ rename -font -labelfont labelFont Font
+ ignore -highlightcolor -highlightthickness
+ }
+
+ #
+ # Set the interior to be the childsite for derived classes.
+ #
+ set itk_interior $itk_component(lwchildsite)
+
+ #
+ # Initialize the widget based on the command line options.
+ #
+ eval itk_initialize $args
+
+ #
+ # When idle, position the label.
+ #
+ _positionLabel
+}
+
+# ------------------------------------------------------------------
+# DESTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Labeledwidget::destructor {} {
+ if {$_reposition != ""} {after cancel $_reposition}
+}
+
+# ------------------------------------------------------------------
+# OPTIONS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# OPTION: -disabledforeground
+#
+# Specified the foreground to be used on the label when disabled.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Labeledwidget::disabledforeground {}
+
+# ------------------------------------------------------------------
+# OPTION: -labelpos
+#
+# Set the position of the label on the labeled widget. The margin
+# between the label and childsite comes along for the ride.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Labeledwidget::labelpos {
+ _positionLabel
+}
+
+# ------------------------------------------------------------------
+# OPTION: -labelmargin
+#
+# Specifies the distance between the widget and label.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Labeledwidget::labelmargin {
+ _positionLabel
+}
+
+# ------------------------------------------------------------------
+# OPTION: -labeltext
+#
+# Specifies the label text.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Labeledwidget::labeltext {
+ $itk_component(label) configure -text $itk_option(-labeltext)
+
+ _positionLabel
+}
+
+# ------------------------------------------------------------------
+# OPTION: -labelvariable
+#
+# Specifies the label text variable.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Labeledwidget::labelvariable {
+ $itk_component(label) configure -textvariable $itk_option(-labelvariable)
+
+ _positionLabel
+}
+
+# ------------------------------------------------------------------
+# OPTION: -labelbitmap
+#
+# Specifies the label bitmap.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Labeledwidget::labelbitmap {
+ $itk_component(label) configure -bitmap $itk_option(-labelbitmap)
+
+ _positionLabel
+}
+
+# ------------------------------------------------------------------
+# OPTION: -labelimage
+#
+# Specifies the label image.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Labeledwidget::labelimage {
+ $itk_component(label) configure -image $itk_option(-labelimage)
+
+ _positionLabel
+}
+
+# ------------------------------------------------------------------
+# OPTION: -sticky
+#
+# Specifies the stickyness of the child site. This option was added
+# by James Bonfield (committed by Chad Smith 8/20/01).
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Labeledwidget::sticky {
+ grid $itk_component(lwchildsite) -sticky $itk_option(-sticky)
+}
+
+# ------------------------------------------------------------------
+# OPTION: -state
+#
+# Specifies the state of the label.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Labeledwidget::state {
+ _positionLabel
+}
+
+# ------------------------------------------------------------------
+# METHODS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# METHOD: childsite
+#
+# Returns the path name of the child site widget.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Labeledwidget::childsite {} {
+ return $itk_component(lwchildsite)
+}
+
+# ------------------------------------------------------------------
+# PROCEDURE: alignlabels widget ?widget ...?
+#
+# The alignlabels procedure takes a list of widgets derived from
+# the Labeledwidget class and adjusts the label margin to align
+# the labels.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Labeledwidget::alignlabels {args} {
+ update
+ set maxLabelWidth 0
+
+ #
+ # Verify that all the widgets are of type Labeledwidget and
+ # determine the size of the maximum length label string.
+ #
+ foreach iwid $args {
+ set objcmd [itcl::find objects -isa Labeledwidget *::$iwid]
+
+ if {$objcmd == ""} {
+ error "$iwid is not a \"Labeledwidget\""
+ }
+
+ set csWidth [winfo reqwidth $iwid.lwchildsite]
+ set shellWidth [winfo reqwidth $iwid]
+
+ if {($shellWidth - $csWidth) > $maxLabelWidth} {
+ set maxLabelWidth [expr {$shellWidth - $csWidth}]
+ }
+ }
+
+ #
+ # Adjust the margins for the labels such that the child sites and
+ # labels line up.
+ #
+ foreach iwid $args {
+ set csWidth [winfo reqwidth $iwid.lwchildsite]
+ set shellWidth [winfo reqwidth $iwid]
+
+ set labelSize [expr {$shellWidth - $csWidth}]
+
+ if {$maxLabelWidth > $labelSize} {
+ set objcmd [itcl::find objects -isa Labeledwidget *::$iwid]
+ set dist [expr {$maxLabelWidth - \
+ ($labelSize - [$objcmd cget -labelmargin])}]
+
+ $objcmd configure -labelmargin $dist
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _positionLabel ?when?
+#
+# Packs the label and label margin. If "when" is "now", the
+# change is applied immediately. If it is "later" or it is not
+# specified, then the change is applied later, when the application
+# is idle.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Labeledwidget::_positionLabel {{when later}} {
+ if {$when == "later"} {
+ if {$_reposition == ""} {
+ set _reposition [after idle [itcl::code $this _positionLabel now]]
+ }
+ return
+
+ } elseif {$when != "now"} {
+ error "bad option \"$when\": should be now or later"
+ }
+
+ #
+ # If we have a label, be it text, bitmap, or image continue.
+ #
+ if {($itk_option(-labeltext) != {}) || \
+ ($itk_option(-labelbitmap) != {}) || \
+ ($itk_option(-labelimage) != {}) || \
+ ($itk_option(-labelvariable) != {})} {
+
+ #
+ # Set the foreground color based on the state.
+ #
+ if {[info exists itk_option(-state)]} {
+ switch -- $itk_option(-state) {
+ disabled {
+ $itk_component(label) configure \
+ -foreground $itk_option(-disabledforeground)
+ }
+ normal {
+ $itk_component(label) configure \
+ -foreground $itk_option(-foreground)
+ }
+ }
+ }
+
+ set parent [winfo parent $itk_component(lwchildsite)]
+
+ #
+ # Switch on the label position option. Using the grid,
+ # adjust the row/column setting of the label, margin, and
+ # and childsite. The margin height/width is adjust based
+ # on the orientation as well. Finally, set the weights such
+ # that the childsite takes the heat on expansion and shrinkage.
+ #
+ switch $itk_option(-labelpos) {
+ nw -
+ n -
+ ne {
+ grid $itk_component(label) -row 0 -column 0 \
+ -sticky $itk_option(-labelpos)
+ grid $itk_component(lwchildsite) -row 2 -column 0 \
+ -sticky $itk_option(-sticky)
+
+ grid rowconfigure $parent 0 -weight 0 -minsize 0
+ grid rowconfigure $parent 1 -weight 0 -minsize \
+ [winfo pixels $itk_component(label) \
+ $itk_option(-labelmargin)]
+ grid rowconfigure $parent 2 -weight 1 -minsize 0
+
+ grid columnconfigure $parent 0 -weight 1 -minsize 0
+ grid columnconfigure $parent 1 -weight 0 -minsize 0
+ grid columnconfigure $parent 2 -weight 0 -minsize 0
+ }
+
+ en -
+ e -
+ es {
+ grid $itk_component(lwchildsite) -row 0 -column 0 \
+ -sticky $itk_option(-sticky)
+ grid $itk_component(label) -row 0 -column 2 \
+ -sticky $itk_option(-labelpos)
+
+ grid rowconfigure $parent 0 -weight 1 -minsize 0
+ grid rowconfigure $parent 1 -weight 0 -minsize 0
+ grid rowconfigure $parent 2 -weight 0 -minsize 0
+
+ grid columnconfigure $parent 0 -weight 1 -minsize 0
+ grid columnconfigure $parent 1 -weight 0 -minsize \
+ [winfo pixels $itk_component(label) \
+ $itk_option(-labelmargin)]
+ grid columnconfigure $parent 2 -weight 0 -minsize 0
+ }
+
+ se -
+ s -
+ sw {
+ grid $itk_component(lwchildsite) -row 0 -column 0 \
+ -sticky $itk_option(-sticky)
+ grid $itk_component(label) -row 2 -column 0 \
+ -sticky $itk_option(-labelpos)
+
+ grid rowconfigure $parent 0 -weight 1 -minsize 0
+ grid rowconfigure $parent 1 -weight 0 -minsize \
+ [winfo pixels $itk_component(label) \
+ $itk_option(-labelmargin)]
+ grid rowconfigure $parent 2 -weight 0 -minsize 0
+
+ grid columnconfigure $parent 0 -weight 1 -minsize 0
+ grid columnconfigure $parent 1 -weight 0 -minsize 0
+ grid columnconfigure $parent 2 -weight 0 -minsize 0
+ }
+
+ wn -
+ w -
+ ws {
+ grid $itk_component(lwchildsite) -row 0 -column 2 \
+ -sticky $itk_option(-sticky)
+ grid $itk_component(label) -row 0 -column 0 \
+ -sticky $itk_option(-labelpos)
+
+ grid rowconfigure $parent 0 -weight 1 -minsize 0
+ grid rowconfigure $parent 1 -weight 0 -minsize 0
+ grid rowconfigure $parent 2 -weight 0 -minsize 0
+
+ grid columnconfigure $parent 0 -weight 0 -minsize 0
+ grid columnconfigure $parent 1 -weight 0 -minsize \
+ [winfo pixels $itk_component(label) \
+ $itk_option(-labelmargin)]
+ grid columnconfigure $parent 2 -weight 1 -minsize 0
+ }
+
+ default {
+ error "bad labelpos option\
+ \"$itk_option(-labelpos)\": should be\
+ nw, n, ne, sw, s, se, en, e, es, wn, w, or ws"
+ }
+ }
+
+ #
+ # Else, neither the label text, bitmap, or image have a value, so
+ # forget them so they don't appear and manage only the childsite.
+ #
+ } else {
+ grid forget $itk_component(label)
+
+ grid $itk_component(lwchildsite) -row 0 -column 0 -sticky $itk_option(-sticky)
+
+ set parent [winfo parent $itk_component(lwchildsite)]
+
+ grid rowconfigure $parent 0 -weight 1 -minsize 0
+ grid rowconfigure $parent 1 -weight 0 -minsize 0
+ grid rowconfigure $parent 2 -weight 0 -minsize 0
+ grid columnconfigure $parent 0 -weight 1 -minsize 0
+ grid columnconfigure $parent 1 -weight 0 -minsize 0
+ grid columnconfigure $parent 2 -weight 0 -minsize 0
+ }
+
+ #
+ # Reset the resposition flag.
+ #
+ set _reposition ""
+}
diff --git a/iwidgets/generic/mainwindow.itk b/iwidgets/generic/mainwindow.itk
new file mode 100644
index 00000000000..032021e76bb
--- /dev/null
+++ b/iwidgets/generic/mainwindow.itk
@@ -0,0 +1,313 @@
+#
+# Mainwindow
+# ----------------------------------------------------------------------
+# This class implements a mainwindow containing a menubar, toolbar,
+# mousebar, childsite, status line, and help line. Each item may
+# be filled and configured to suit individual needs.
+#
+# ----------------------------------------------------------------------
+# AUTHOR: Mark L. Ulferts EMAIL: mulferts@austin.dsccc.com
+#
+# @(#) RCS: $Id$
+# ----------------------------------------------------------------------
+# Copyright (c) 1997 DSC Technologies Corporation
+# ======================================================================
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+
+# ------------------------------------------------------------------
+# MAINWINDOW
+# ------------------------------------------------------------------
+itcl::class iwidgets::Mainwindow {
+ inherit iwidgets::Shell
+
+ constructor {args} {}
+
+ itk_option define -helpline helpLine HelpLine 1
+ itk_option define -statusline statusLine StatusLine 1
+
+ public {
+ method childsite {}
+ method menubar {args}
+ method mousebar {args}
+ method msgd {args}
+ method toolbar {args}
+ }
+
+ protected {
+ method _exitCB {}
+
+ common _helpVar
+ common _statusVar
+ }
+}
+
+#
+# Provide a lowercased access method for the ::iwidgets::Mainwindow class.
+#
+proc iwidgets::mainwindow {pathName args} {
+ uplevel ::iwidgets::Mainwindow $pathName $args
+}
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Mainwindow::constructor {args} {
+ itk_option add hull.width hull.height
+
+ pack propagate $itk_component(hull) no
+
+ wm protocol $itk_component(hull) WM_DELETE_WINDOW [itcl::code $this _exitCB]
+
+ #
+ # Create a menubar, renaming the font, foreground, and background
+ # so they may be separately set. The help variable will be setup
+ # as well.
+ #
+ itk_component add menubar {
+ iwidgets::Menubar $itk_interior.menubar \
+ -helpvariable [itcl::scope _helpVar($this)]
+ } {
+ keep -disabledforeground -cursor \
+ -highlightbackground -highlightthickness
+ rename -font \
+ -menubarfont menuBarFont Font
+ rename -foreground \
+ -menubarforeground menuBarForeground Foreground
+ rename -background \
+ -menubarbackground menuBarBackground Background
+ }
+
+ #
+ # Add a toolbar beneath the menubar.
+ #
+ itk_component add toolbar {
+ iwidgets::Toolbar $itk_interior.toolbar -orient horizontal \
+ -helpvariable [itcl::scope _helpVar($this)]
+ } {
+ keep -balloonbackground -balloondelay1 -balloondelay2 \
+ -balloonfont -balloonforeground -disabledforeground -cursor \
+ -highlightbackground -highlightthickness
+ rename -font -toolbarfont toolbarFont Font
+ rename -foreground -toolbarforeground toolbarForeground Foreground
+ rename -background -toolbarbackground toolbarBackground Background
+ }
+
+ #
+ # Add a mouse bar on the left.
+ #
+ itk_component add mousebar {
+ iwidgets::Toolbar $itk_interior.mousebar -orient vertical \
+ -helpvariable [itcl::scope _helpVar($this)]
+ } {
+ keep -balloonbackground -balloondelay1 -balloondelay2 \
+ -balloonfont -balloonforeground -disabledforeground -cursor \
+ -highlightbackground -highlightthickness
+ rename -font -toolbarfont toolbarFont Font
+ rename -foreground -toolbarforeground toolbarForeground Foreground
+ rename -background -toolbarbackground toolbarBackground Background
+ }
+
+ #
+ # Create the childsite window window.
+ #
+ itk_component add -protected mwchildsite {
+ frame $itk_interior.mwchildsite
+ }
+
+ #
+ # Add the help and system status lines
+ #
+ itk_component add -protected lineframe {
+ frame $itk_interior.lineframe
+ }
+
+ itk_component add help {
+ label $itk_component(lineframe).help \
+ -textvariable [itcl::scope _helpVar($this)] \
+ -relief sunken -borderwidth 2 -width 10
+ }
+
+ itk_component add status {
+ label $itk_component(lineframe).status \
+ -textvariable [itcl::scope _statusVar($this)] \
+ -relief sunken -borderwidth 2 -width 10
+ }
+
+ #
+ # Create the message dialog for use throughout the mainwindow.
+ #
+ itk_component add msgd {
+ iwidgets::Messagedialog $itk_interior.msgd -modality application
+ } {
+ usual
+ ignore -modality
+ }
+
+ #
+ # Use the grid to pack together the menubar, toolbar, mousebar,
+ # childsite, and status area.
+ #
+ grid $itk_component(menubar) -row 0 -column 0 -columnspan 2 -sticky ew
+ grid $itk_component(toolbar) -row 1 -column 0 -columnspan 2 -sticky ew
+ grid $itk_component(mousebar) -row 2 -column 0 -sticky ns
+ grid $itk_component(mwchildsite) -row 2 -column 1 -sticky nsew \
+ -padx 5 -pady 5
+ grid $itk_component(lineframe) -row 3 -column 0 -columnspan 2 -sticky ew
+
+ grid columnconfigure $itk_interior 1 -weight 1
+ grid rowconfigure $itk_interior 2 -weight 1
+
+ #
+ # Set the interior to be the childsite for derived classes.
+ #
+ set itk_interior $itk_component(mwchildsite)
+
+ #
+ # Initialize all the configuration options.
+ #
+ eval itk_initialize $args
+}
+
+# ------------------------------------------------------------------
+# OPTIONS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# OPTION: -helpline
+#
+# Specifies whether or not to display the help line. The value
+# may be given in any of the forms acceptable to Tk_GetBoolean.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Mainwindow::helpline {
+ if {$itk_option(-helpline)} {
+ pack $itk_component(help) -side left -fill x -expand yes -padx 2
+ } else {
+ pack forget $itk_component(help)
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -statusline
+#
+# Specifies whether or not to display the status line. The value
+# may be given in any of the forms acceptable to Tk_GetBoolean.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Mainwindow::statusline {
+ if {$itk_option(-statusline)} {
+ pack $itk_component(status) -side right -fill x -expand yes -padx 2
+ } else {
+ pack forget $itk_component(status)
+ }
+}
+
+# ------------------------------------------------------------------
+# METHODS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# METHOD: childsite
+#
+# Return the childsite widget.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Mainwindow::childsite {} {
+ return $itk_component(mwchildsite)
+}
+
+# ------------------------------------------------------------------
+# METHOD: menubar ?args?
+#
+# Evaluate the args against the Menubar component.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Mainwindow::menubar {args} {
+ if {[llength $args] == 0} {
+ return $itk_component(menubar)
+ } else {
+ return [eval $itk_component(menubar) $args]
+ }
+}
+
+# ------------------------------------------------------------------
+# METHOD: toolbar ?args?
+#
+# Evaluate the args against the Toolbar component.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Mainwindow::toolbar {args} {
+ if {[llength $args] == 0} {
+ return $itk_component(toolbar)
+ } else {
+ return [eval $itk_component(toolbar) $args]
+ }
+}
+
+# ------------------------------------------------------------------
+# METHOD: mousebar ?args?
+#
+# Evaluate the args against the Mousebar component.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Mainwindow::mousebar {args} {
+ if {[llength $args] == 0} {
+ return $itk_component(mousebar)
+ } else {
+ return [eval $itk_component(mousebar) $args]
+ }
+}
+
+# ------------------------------------------------------------------
+# METHOD: msgd ?args?
+#
+# Evaluate the args against the Messagedialog component.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Mainwindow::msgd {args} {
+ if {[llength $args] == 0} {
+ return $itk_component(msgd)
+ } else {
+ return [eval $itk_component(msgd) $args]
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _exitCB
+#
+# Menu callback for the exit option from the file menu. The method
+# confirms the user's request to exit the application prior to
+# taking the action.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Mainwindow::_exitCB {} {
+ #
+ # Configure the message dialog for confirmation of the exit request.
+ #
+ msgd configure -title Confirmation -bitmap questhead \
+ -text "Exit confirmation\n\
+ Are you sure ?"
+ msgd buttonconfigure OK -text Yes
+ msgd buttonconfigure Cancel -text No
+ msgd default Cancel
+ msgd center $itk_component(hull)
+
+ #
+ # Activate the message dialog and given a positive response
+ # proceed to exit the application
+ #
+ if {[msgd activate]} {
+ ::exit
+ }
+}
diff --git a/iwidgets/generic/menubar.itk b/iwidgets/generic/menubar.itk
new file mode 100644
index 00000000000..ca2d2001075
--- /dev/null
+++ b/iwidgets/generic/menubar.itk
@@ -0,0 +1,2267 @@
+#
+# Menubar widget
+# ----------------------------------------------------------------------
+# The Menubar command creates a new window (given by the pathName
+# argument) and makes it into a Pull down menu widget. Additional
+# options, described above may be specified on the command line or
+# in the option database to configure aspects of the Menubar such
+# as its colors and font. The Menubar command returns its pathName
+# argument. At the time this command is invoked, there must not exist
+# a window named pathName, but pathName's parent must exist.
+#
+# A Menubar is a widget that simplifies the task of creating
+# menu hierarchies. It encapsulates a frame widget, as well
+# as menubuttons, menus, and menu entries. The Menubar allows
+# menus to be specified and refer enced in a more consistent
+# manner than using Tk to build menus directly. First, Menubar
+# allows a menu tree to be expressed in a hierachical "language".
+# The Menubar accepts a menuButtons option that allows a list of
+# menubuttons to be added to the Menubar. In turn, each menubutton
+# accepts a menu option that spec ifies a list of menu entries
+# to be added to the menubutton's menu (as well as an option
+# set for the menu). Cascade entries in turn, accept a menu
+# option that specifies a list of menu entries to be added to
+# the cascade's menu (as well as an option set for the menu). In
+# this manner, a complete menu grammar can be expressed to the
+# Menubar. Additionally, the Menubar allows each component of
+# the Menubar system to be referenced by a simple componentPathName
+# syntax. Finally, the Menubar extends the option set of menu
+# entries to include the helpStr option used to implement status
+# bar help.
+#
+# WISH LIST:
+# This section lists possible future enhancements.
+#
+# ----------------------------------------------------------------------
+# AUTHOR: Bill W. Scott
+#
+# CURRENT MAINTAINER: Chad Smith --> csmith@adc.com or itclguy@yahoo.com
+#
+# @(#) $Id$
+# ----------------------------------------------------------------------
+# Copyright (c) 1995 DSC Technologies Corporation
+# ======================================================================
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+
+
+#
+# Usual options.
+#
+itk::usual Menubar {
+ keep -activebackground -activeborderwidth -activeforeground \
+ -anchor -background -borderwidth -cursor -disabledforeground \
+ -font -foreground -highlightbackground -highlightthickness \
+ -highlightcolor -justify -padx -pady -wraplength
+}
+
+itcl::class iwidgets::Menubar {
+ inherit itk::Widget
+
+ constructor { args } {}
+
+ itk_option define -foreground foreground Foreground Black
+ itk_option define -activebackground activeBackground Foreground "#ececec"
+ itk_option define -activeborderwidth activeBorderWidth BorderWidth 2
+ itk_option define -activeforeground activeForeground Background black
+ itk_option define -anchor anchor Anchor center
+ itk_option define -borderwidth borderWidth BorderWidth 2
+ itk_option define \
+ -disabledforeground disabledForeground DisabledForeground #a3a3a3
+ itk_option define \
+ -font font Font "-Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-*"
+ itk_option define \
+ -highlightbackground highlightBackground HighlightBackground #d9d9d9
+ itk_option define -highlightcolor highlightColor HighlightColor Black
+ itk_option define \
+ -highlightthickness highlightThickness HighlightThickness 0
+ itk_option define -justify justify Justify center
+ itk_option define -padx padX Pad 4p
+ itk_option define -pady padY Pad 3p
+ itk_option define -wraplength wrapLength WrapLength 0
+ itk_option define -menubuttons menuButtons MenuButtons {}
+ itk_option define -helpvariable helpVariable HelpVariable {}
+
+ public {
+ method add { type path args } { }
+ method delete { args } { }
+ method index { path } { }
+ method insert { beforeComponent type name args }
+ method invoke { entryPath } { }
+ method menucget { args } { }
+ method menuconfigure { path args } { }
+ method path { args } { }
+ method type { path } { }
+ method yposition { entryPath } { }
+ }
+
+ private {
+ method menubutton { menuName args } { }
+ method options { args } { }
+ method command { cmdName args } { }
+ method checkbutton { chkName args } { }
+ method radiobutton { radName args } { }
+ method separator { sepName args } { }
+ method cascade { casName args } { }
+ method _helpHandler { menuPath } { }
+ method _addMenuButton { buttonName args} { }
+ method _insertMenuButton { beforeMenuPath buttonName args} { }
+ method _makeMenuButton {buttonName args} { }
+ method _makeMenu \
+ { componentName widgetName menuPath menuEvalStr } { }
+ method _substEvalStr { evalStr } { }
+ method _deleteMenu { menuPath {menuPath2 {}} } { }
+ method _deleteAMenu { path } { }
+ method _addEntry { type path args } { }
+ method _addCascade { tkMenuPath path args } { }
+ method _insertEntry { beforeEntryPath type name args } { }
+ method _insertCascade { bfIndex tkMenuPath path args } { }
+ method _deleteEntry { entryPath {entryPath2 {}} } { }
+ method _configureMenu { path tkPath {option {}} args } { }
+ method _configureMenuOption { type path args } { }
+ method _configureMenuEntry { path index {option {}} args } { }
+ method _unsetPaths { parent } { }
+ method _entryPathToTkMenuPath {entryPath} { }
+ method _getTkIndex { tkMenuPath tkIndex} { }
+ method _getPdIndex { tkMenuPath tkIndex } { }
+ method _getMenuList { } { }
+ method _getEntryList { menu } { }
+ method _parsePath { path } { }
+ method _getSymbolicPath { parent segment } { }
+ method _getCallerLevel { }
+
+ variable _parseLevel 0 ;# The parse level depth
+ variable _callerLevel #0 ;# abs level of caller
+ variable _pathMap ;# Array indexed by Menubar's path
+ ;# naming, yields tk menu path
+ variable _entryIndex -1 ;# current entry help is displayed
+ ;# for during help <motion> events
+
+ variable _tkMenuPath ;# last tk menu being added to
+ variable _ourMenuPath ;# our last valid path constructed.
+
+ variable _menuOption ;# The -menu option
+ variable _helpString ;# The -helpstr optio
+ }
+}
+
+#
+# Use option database to override default resources.
+#
+option add *Menubar*Menu*tearOff false widgetDefault
+option add *Menubar*Menubutton*relief flat widgetDefault
+option add *Menubar*Menu*relief raised widgetDefault
+
+#
+# Provide a lowercase access method for the menubar class
+#
+proc ::iwidgets::menubar { args } {
+ uplevel ::iwidgets::Menubar $args
+}
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Menubar::constructor { args } {
+ component hull configure -borderwidth 0
+
+ #
+ # Create the Menubar Frame that will hold the menus.
+ #
+ # might want to make -relief and -bd options with defaults
+ itk_component add menubar {
+ frame $itk_interior.menubar -relief raised -bd 2
+ } {
+ keep -cursor -background -width -height
+ }
+ pack $itk_component(menubar) -fill both -expand yes
+
+ # Map our pathname to class to the actual menubar frame
+ set _pathMap(.) $itk_component(menubar)
+
+ eval itk_initialize $args
+
+ #
+ # HACK HACK HACK
+ # Tk expects some variables to be defined and due to some
+ # unknown reason we confuse its normal ordering. So, if
+ # the user creates a menubutton with no menu it will fail
+ # when clicked on with a "Error: can't read $tkPriv(oldGrab):
+ # no such element in array". So by setting it to null we
+ # avoid this error.
+ uplevel #0 "set tkPriv(oldGrab) {}"
+
+}
+
+# ------------------------------------------------------------------
+# OPTIONS
+# ------------------------------------------------------------------
+# This first set of options are for configuring menus and/or menubuttons
+# at the menu level.
+#
+# ------------------------------------------------------------------
+# OPTION -foreground
+#
+# menu
+# menubutton
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Menubar::foreground {
+}
+
+# ------------------------------------------------------------------
+# OPTION -activebackground
+#
+# menu
+# menubutton
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Menubar::activebackground {
+}
+
+# ------------------------------------------------------------------
+# OPTION -activeborderwidth
+#
+# menu
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Menubar::activeborderwidth {
+}
+
+# ------------------------------------------------------------------
+# OPTION -activeforeground
+#
+# menu
+# menubutton
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Menubar::activeforeground {
+}
+
+# ------------------------------------------------------------------
+# OPTION -anchor
+#
+# menubutton
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Menubar::anchor {
+}
+
+# ------------------------------------------------------------------
+# OPTION -borderwidth
+#
+# menu
+# menubutton
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Menubar::borderwidth {
+}
+
+# ------------------------------------------------------------------
+# OPTION -disabledforeground
+#
+# menu
+# menubutton
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Menubar::disabledforeground {
+}
+
+# ------------------------------------------------------------------
+# OPTION -font
+#
+# menu
+# menubutton
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Menubar::font {
+}
+
+# ------------------------------------------------------------------
+# OPTION -highlightbackground
+#
+# menubutton
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Menubar::highlightbackground {
+}
+
+# ------------------------------------------------------------------
+# OPTION -highlightcolor
+#
+# menubutton
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Menubar::highlightcolor {
+}
+
+# ------------------------------------------------------------------
+# OPTION -highlightthickness
+#
+# menubutton
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Menubar::highlightthickness {
+}
+
+# ------------------------------------------------------------------
+# OPTION -justify
+#
+# menubutton
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Menubar::justify {
+}
+
+# ------------------------------------------------------------------
+# OPTION -padx
+#
+# menubutton
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Menubar::padx {
+}
+
+# ------------------------------------------------------------------
+# OPTION -pady
+#
+# menubutton
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Menubar::pady {
+}
+
+# ------------------------------------------------------------------
+# OPTION -wraplength
+#
+# menubutton
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Menubar::wraplength {
+}
+
+# ------------------------------------------------------------------
+# OPTION -menubuttons
+#
+# The menuButton option is a string which specifies the arrangement
+# of menubuttons on the Menubar frame. Each menubutton entry is
+# delimited by the newline character. Each entry is treated as
+# an add command to the Menubar.
+#
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Menubar::menubuttons {
+ if { $itk_option(-menubuttons) != {} } {
+
+ # IF one exists already, delete the old one and create
+ # a new one
+ if { ! [catch {_parsePath .0}] } {
+ delete .0 .last
+ }
+
+ #
+ # Determine the context level to evaluate the option string at
+ #
+ set _callerLevel [_getCallerLevel]
+
+ #
+ # Parse the option string in their scope, then execute it in
+ # our scope.
+ #
+ incr _parseLevel
+ _substEvalStr itk_option(-menubuttons)
+ eval $itk_option(-menubuttons)
+
+ # reset so that we know we aren't parsing in a scope currently.
+ incr _parseLevel -1
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION -helpvariable
+#
+# Specifies the global variable to update whenever the mouse is in
+# motion over a menu entry. This global variable is updated with the
+# current value of the active menu entry's helpStr. Other widgets
+# can "watch" this variable with the trace command, or as is the
+# case with entry or label widgets, they can set their textVariable
+# to the same global variable. This allows for a simple implementation
+# of a help status bar. Whenever the mouse leaves a menu entry,
+# the helpVariable is set to the empty string {}.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Menubar::helpvariable {
+ if {"" != $itk_option(-helpvariable) &&
+ ![string match ::* $itk_option(-helpvariable)] &&
+ ![string match @itcl* $itk_option(-helpvariable)]} {
+ set itk_option(-helpvariable) "::$itk_option(-helpvariable)"
+ }
+}
+
+
+# -------------------------------------------------------------
+#
+# METHOD: add type path args
+#
+# Adds either a menu to the menu bar or a menu entry to a
+# menu pane.
+#
+# If the type is one of cascade, checkbutton, command,
+# radiobutton, or separator it adds a new entry to the bottom
+# of the menu denoted by the menuPath prefix of componentPath-
+# Name. The new entry's type is given by type. If additional
+# arguments are present, they specify options available to
+# component type Entry. See the man pages for menu(n) in the
+# section on Entries. In addition all entries accept an added
+# option, helpStr:
+#
+# -helpstr value
+#
+# Specifes the string to associate with the entry.
+# When the mouse moves over the associated entry, the variable
+# denoted by helpVariable is set. Another widget can bind to
+# the helpVariable and thus display status help.
+#
+# If the type is menubutton, it adds a new menubut-
+# ton to the menu bar. If additional arguments are present,
+# they specify options available to component type MenuButton.
+#
+# If the type is menubutton or cascade, the menu
+# option is available in addition to normal Tk options for
+# these to types.
+#
+# -menu menuSpec
+#
+# This is only valid for componentPathNames of type
+# menubutton or cascade. Specifes an option set and/or a set
+# of entries to place on a menu and associate with the menu-
+# button or cascade. The option keyword allows the menu widget
+# to be configured. Each item in the menuSpec is treated as
+# add commands (each with the possibility of having other
+# -menu options). In this way a menu can be recursively built.
+#
+# The last segment of componentPathName cannot be
+# one of the keywords last, menu, end. Additionally, it may
+# not be a number. However the componentPathName may be refer-
+# enced in this manner (see discussion of Component Path
+# Names).
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Menubar::add { type path args } {
+ if ![regexp \
+ {^(menubutton|command|cascade|separator|radiobutton|checkbutton)$} \
+ $type] {
+ error "bad type \"$type\": must be one of the following:\
+ \"command\", \"checkbutton\", \"radiobutton\",\
+ \"separator\", \"cascade\", or \"menubutton\""
+ }
+ regexp {[^.]+$} $path segName
+ if [regexp {^(menu|last|end|[0-9]+)$} $segName] {
+ error "bad name \"$segName\": user created component \
+ path names may not end with \
+ \"end\", \"last\", \"menu\", \
+ or be an integer"
+ }
+
+ # ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+ # OK, either add a menu
+ # '''''''''''''''''''''''''''''''''''''''''''''''''''''
+ if { $type == "menubutton" } {
+ # grab the last component name (the menu name)
+ eval _addMenuButton $segName $args
+ # ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+ # Or add an entry
+ # '''''''''''''''''''''''''''''''''''''''''''''''''''''
+ } else {
+ eval _addEntry $type $path $args
+ }
+}
+
+
+# -------------------------------------------------------------
+#
+# METHOD: delete entryPath ?entryPath2?
+#
+# If componentPathName is of component type MenuButton or
+# Menu, delete operates on menus. If componentPathName is of
+# component type Entry, delete operates on menu entries.
+#
+# This command deletes all components between com-
+# ponentPathName and componentPathName2 inclusive. If com-
+# ponentPathName2 is omitted then it defaults to com-
+# ponentPathName. Returns an empty string.
+#
+# If componentPathName is of type Menubar, then all menus
+# and the menu bar frame will be destroyed. In this case com-
+# ponentPathName2 is ignored.
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Menubar::delete { args } {
+
+ # ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+ # Handle out of bounds in arg lengths
+ # '''''''''''''''''''''''''''''''''''''''''''''''''''''
+ if { [llength $args] > 0 && [llength $args] <=2 } {
+
+ # Path Conversions
+ # '''''''''''''''''''''''''''''''''''''''''''''''''''''
+ set path [_parsePath [lindex $args 0]]
+
+ set pathOrIndex $_pathMap($path)
+
+ # Menu Entry
+ # '''''''''''''''''''''''''''''''''''''''''''''''''''''
+ if { [regexp {^[0-9]+$} $pathOrIndex] } {
+ eval "_deleteEntry $args"
+
+ # Menu
+ # '''''''''''''''''''''''''''''''''''''''''''''''''''''
+ } else {
+ eval "_deleteMenu $args"
+ }
+ } else {
+ error "wrong # args: should be \
+ \"$itk_component(hull) delete pathName ?pathName2?\""
+ }
+ return ""
+}
+
+# -------------------------------------------------------------
+#
+# METHOD: index path
+#
+# If componentPathName is of type menubutton or menu, it
+# returns the position of the menu/menubutton on the Menubar
+# frame.
+#
+# If componentPathName is of type command, separator,
+# radiobutton, checkbutton, or cascade, it returns the menu
+# widget's numerical index for the entry corresponding to com-
+# ponentPathName. If path is not found or the Menubar frame is
+# passed in, -1 is returned.
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Menubar::index { path } {
+
+ # ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+ # Path conversions
+ # '''''''''''''''''''''''''''''''''''''''''''''''''''''
+ if { [catch {set fullPath [_parsePath $path]} ] } {
+ return -1
+ }
+ if { [catch {set tkPathOrIndex $_pathMap($fullPath)} ] } {
+ return -1
+ }
+
+ # ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+ # If integer, return the value, otherwise look up the menu position
+ # '''''''''''''''''''''''''''''''''''''''''''''''''''''
+ if { [regexp {^[0-9]+$} $tkPathOrIndex] } {
+ set index $tkPathOrIndex
+ } else {
+ set index [lsearch [_getMenuList] $fullPath]
+ }
+
+ return $index
+}
+
+# -------------------------------------------------------------
+#
+# METHOD: insert beforeComponent type name ?option value?
+#
+# Insert a new component named name before the component
+# specified by componentPathName.
+#
+# If componentPathName is of type MenuButton or Menu, the
+# new component inserted is of type Menu and given the name
+# name. In this case valid option value pairs are those
+# accepted by menubuttons.
+#
+# If componentPathName is of type Entry, the new com-
+# ponent inserted is of type Entry and given the name name. In
+# this case valid option value pairs are those accepted by
+# menu entries.
+#
+# name cannot be one of the keywords last, menu, end.
+# dditionally, it may not be a number. However the com-
+# ponentPathName may be referenced in this manner (see discus-
+# sion of Component Path Names).
+#
+# Returns -1 if the menubar frame is passed in.
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Menubar::insert { beforeComponent type name args } {
+ if ![regexp \
+ {^(menubutton|command|cascade|separator|radiobutton|checkbutton)$} \
+ $type] {
+ error "bad type \"$type\": must be one of the following:\
+ \"command\", \"checkbutton\", \"radiobutton\",\
+ \"separator\", \"cascade\", or \"menubutton\""
+ }
+ regexp {[^.]+$} $name segName
+ if [regexp {^(menu|last|end|[0-9]+)$} $segName] {
+ error "bad name \"$name\": user created component \
+ path names may not end with \
+ \"end\", \"last\", \"menu\", \
+ or be an integer"
+ }
+
+ set beforeComponent [_parsePath $beforeComponent]
+
+ # ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+ # Choose menu insertion or entry insertion
+ # '''''''''''''''''''''''''''''''''''''''''''''''''''''
+ if { $type == "menubutton" } {
+ eval _insertMenuButton $beforeComponent $name $args
+ } else {
+ eval _insertEntry $beforeComponent $type $name $args
+ }
+}
+
+
+# -------------------------------------------------------------
+#
+# METHOD: invoke entryPath
+#
+# Invoke the action of the menu entry denoted by
+# entryComponentPathName. See the sections on the individual
+# entries in the menu(n) man pages. If the menu entry is dis-
+# abled then nothing happens. If the entry has a command
+# associated with it then the result of that command is
+# returned as the result of the invoke widget command. Other-
+# wise the result is an empty string.
+#
+# If componentPathName is not a menu entry, an error is
+# issued.
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Menubar::invoke { entryPath } {
+
+ # ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+ # Path Conversions
+ # '''''''''''''''''''''''''''''''''''''''''''''''''''''
+ set entryPath [_parsePath $entryPath]
+ set index $_pathMap($entryPath)
+
+ # ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+ # Error Processing
+ # '''''''''''''''''''''''''''''''''''''''''''''''''''''
+ # first verify that beforeEntryPath is actually a path to
+ # an entry and not to menu, menubutton, etc.
+ if { ! [regexp {^[0-9]+$} $index] } {
+ error "bad entry path: beforeEntryPath is not an entry"
+ }
+
+ # ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+ # Call invoke command
+ # '''''''''''''''''''''''''''''''''''''''''''''''''''''
+ # get the tk menu path to call
+ set tkMenuPath [_entryPathToTkMenuPath $entryPath]
+
+ # call the menu's invoke command, adjusting index based on tearoff
+ $tkMenuPath invoke [_getTkIndex $tkMenuPath $index]
+}
+
+# -------------------------------------------------------------
+#
+# METHOD: menucget componentPath option
+#
+# Returns the current value of the configuration option
+# given by option. The component type of componentPathName
+# determines the valid available options.
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Menubar::menucget { path opt } {
+ return [lindex [menuconfigure $path $opt] 4]
+}
+
+# -------------------------------------------------------------
+#
+# METHOD: menuconfigure componentPath ?option? ?value option value...?
+#
+# Query or modify the configuration options of the sub-
+# component of the Menubar specified by componentPathName. If
+# no option is specified, returns a list describing all of the
+# available options for componentPathName (see
+# Tk_ConfigureInfo for information on the format of this
+# list). If option is specified with no value, then the com-
+# mand returns a list describing the one named option (this
+# list will be identical to the corresponding sublist of the
+# value returned if no option is specified). If one or more
+# option-value pairs are specified, then the command modifies
+# the given widget option(s) to have the given value(s); in
+# this case the command returns an empty string. The component
+# type of componentPathName determines the valid available
+# options.
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Menubar::menuconfigure { path args } {
+
+ # ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+ # Path Conversions
+ # '''''''''''''''''''''''''''''''''''''''''''''''''''''
+ set path [_parsePath $path]
+ set tkPathOrIndex $_pathMap($path)
+
+ # Case: Menu entry being configured
+ # '''''''''''''''''''''''''''''''''''''''''''''''''''''
+ if { [regexp {^[0-9]+$} $tkPathOrIndex] } {
+ eval "_configureMenuEntry $path $tkPathOrIndex $args"
+
+ # Case: Menu (button and pane) being configured.
+ # '''''''''''''''''''''''''''''''''''''''''''''''''''''
+ } else {
+ eval _configureMenu $path $tkPathOrIndex $args
+ }
+}
+
+# -------------------------------------------------------------
+#
+# METHOD: path
+#
+# SYNOPIS: path ?<mode>? <pattern>
+#
+# Returns a fully formed component path that matches pat-
+# tern. If no match is found it returns -1. The mode argument
+# indicates how the search is to be matched against pattern
+# and it must have one of the following values:
+#
+# -glob Pattern is a glob-style pattern which is
+# matched against each component path using the same rules as
+# the string match command.
+#
+# -regexp Pattern is treated as a regular expression
+# and matched against each component path using the same
+# rules as the regexp command.
+#
+# The default mode is -glob.
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Menubar::path { args } {
+
+ set len [llength $args]
+ if { $len < 1 || $len > 2 } {
+ error "wrong # args: should be \
+ \"$itk_component(hull) path ?mode?> <pattern>\""
+ }
+
+ set pathList [array names _pathMap]
+
+ set len [llength $args]
+ switch -- $len {
+ 1 {
+ # ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+ # Case: no search modes given
+ # '''''''''''''''''''''''''''''''''''''''''''''''''''''
+ set pattern [lindex $args 0]
+ set found [lindex $pathList [lsearch -glob $pathList $pattern]]
+ }
+ 2 {
+ # ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+ # Case: search modes present (-glob, -regexp)
+ # '''''''''''''''''''''''''''''''''''''''''''''''''''''
+ set options [lindex $args 0]
+ set pattern [lindex $args 1]
+ set found \
+ [lindex $pathList [lsearch $options $pathList $pattern]]
+ }
+ default {
+ # ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+ # Case: wrong # arguments
+ # '''''''''''''''''''''''''''''''''''''''''''''''''''''
+ error "wrong # args: \
+ should be \"$itk_component(hull) path ?-glob? ?-regexp? pattern\""
+ }
+ }
+
+ return $found
+}
+
+# -------------------------------------------------------------
+#
+# METHOD: type path
+#
+# Returns the type of the component given by entryCom-
+# ponentPathName. For menu entries, this is the type argument
+# passed to the add/insert widget command when the entry was
+# created, such as command or separator. Othewise it is either
+# a menubutton or a menu.
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Menubar::type { path } {
+
+ # ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+ # Path Conversions
+ # '''''''''''''''''''''''''''''''''''''''''''''''''''''
+ set path [_parsePath $path]
+
+ # ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+ # Error Handling: does the path exist?
+ # '''''''''''''''''''''''''''''''''''''''''''''''''''''
+ if { [catch {set index $_pathMap($path)} ] } {
+ error "bad path \"$path\""
+ }
+
+ # ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+ # ENTRY, Ask TK for type
+ # '''''''''''''''''''''''''''''''''''''''''''''''''''''
+ if { [regexp {^[0-9]+$} $index] } {
+ # get the menu path from the entry path name
+ set tkMenuPath [_entryPathToTkMenuPath $path]
+
+ # call the menu's type command, adjusting index based on tearoff
+ set type [$tkMenuPath type [_getTkIndex $tkMenuPath $index]]
+ # ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+ # MENUBUTTON, MENU, or FRAME
+ # '''''''''''''''''''''''''''''''''''''''''''''''''''''
+ } else {
+ # should not happen, but have a path that is not a valid window.
+ if { [catch {set className [winfo class $_pathMap($path)]}] } {
+ error "serious error: \"$path\" is not a valid window"
+ }
+ # get the classname, look it up, get index, us it to look up type
+ set type [ lindex \
+ {frame menubutton menu} \
+ [lsearch { Frame Menubutton Menu } $className] \
+ ]
+ }
+ return $type
+}
+
+# -------------------------------------------------------------
+#
+# METHOD: yposition entryPath
+#
+# Returns a decimal string giving the y-coordinate within
+# the menu window of the topmost pixel in the entry specified
+# by componentPathName. If the componentPathName is not an
+# entry, an error is issued.
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Menubar::yposition { entryPath } {
+
+ # ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+ # Path Conversions
+ # '''''''''''''''''''''''''''''''''''''''''''''''''''''
+ set entryPath [_parsePath $entryPath]
+ set index $_pathMap($entryPath)
+
+ # ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+ # Error Handling
+ # '''''''''''''''''''''''''''''''''''''''''''''''''''''
+ # first verify that entryPath is actually a path to
+ # an entry and not to menu, menubutton, etc.
+ if { ! [regexp {^[0-9]+$} $index] } {
+ error "bad value: entryPath is not an entry"
+ }
+
+ # ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+ # Call yposition command
+ # '''''''''''''''''''''''''''''''''''''''''''''''''''''
+ # get the menu path from the entry path name
+ set tkMenuPath [_entryPathToTkMenuPath $entryPath]
+
+ # call the menu's yposition command, adjusting index based on tearoff
+ return [$tkMenuPath yposition [_getTkIndex $tkMenuPath $index]]
+
+}
+
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+# PARSING METHODS
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+# -------------------------------------------------------------
+#
+# PARSING METHOD: menubutton
+#
+# This method is invoked via an evaluation of the -menubuttons
+# option for the Menubar.
+#
+# It adds a new menubutton and processes any -menu options
+# for creating entries on the menu pane associated with the
+# menubutton
+# -------------------------------------------------------------
+itcl::body iwidgets::Menubar::menubutton { menuName args } {
+ eval "add menubutton .$menuName $args"
+}
+
+# -------------------------------------------------------------
+#
+# PARSING METHOD: options
+#
+# This method is invoked via an evaluation of the -menu
+# option for menubutton commands.
+#
+# It configures the current menu ($_ourMenuPath) with the options
+# that follow (args)
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Menubar::options { args } {
+ eval "$_tkMenuPath configure $args"
+}
+
+
+# -------------------------------------------------------------
+#
+# PARSING METHOD: command
+#
+# This method is invoked via an evaluation of the -menu
+# option for menubutton commands.
+#
+# It adds a new command entry to the current menu, $_ourMenuPath
+# naming it $cmdName. Since this is the most common case when
+# creating menus, streamline it by duplicating some code from
+# the add{} method.
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Menubar::command { cmdName args } {
+ set path $_ourMenuPath.$cmdName
+
+ # error checking
+ regsub {.*[.]} $path "" segName
+ if [regexp {^(menu|last|end|[0-9]+)$} $segName] {
+ error "bad name \"$segName\": user created component \
+ path names may not end with \
+ \"end\", \"last\", \"menu\", \
+ or be an integer"
+ }
+
+ eval _addEntry command $path $args
+}
+
+# -------------------------------------------------------------
+#
+# PARSING METHOD: checkbutton
+#
+# This method is invoked via an evaluation of the -menu
+# option for menubutton/cascade commands.
+#
+# It adds a new checkbutton entry to the current menu, $_ourMenuPath
+# naming it $chkName.
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Menubar::checkbutton { chkName args } {
+ eval "add checkbutton $_ourMenuPath.$chkName $args"
+}
+
+# -------------------------------------------------------------
+#
+# PARSING METHOD: radiobutton
+#
+# This method is invoked via an evaluation of the -menu
+# option for menubutton/cascade commands.
+#
+# It adds a new radiobutton entry to the current menu, $_ourMenuPath
+# naming it $radName.
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Menubar::radiobutton { radName args } {
+ eval "add radiobutton $_ourMenuPath.$radName $args"
+}
+
+# -------------------------------------------------------------
+#
+# PARSING METHOD: separator
+#
+# This method is invoked via an evaluation of the -menu
+# option for menubutton/cascade commands.
+#
+# It adds a new separator entry to the current menu, $_ourMenuPath
+# naming it $sepName.
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Menubar::separator { sepName args } {
+ eval $_tkMenuPath add separator
+ set _pathMap($_ourMenuPath.$sepName) [_getPdIndex $_tkMenuPath end]
+}
+
+# -------------------------------------------------------------
+#
+# PARSING METHOD: cascade
+#
+# This method is invoked via an evaluation of the -menu
+# option for menubutton/cascade commands.
+#
+# It adds a new cascade entry to the current menu, $_ourMenuPath
+# naming it $casName. It processes the -menu option if present,
+# adding a new menu pane and its associated entries found.
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Menubar::cascade { casName args } {
+
+ # Save the current menu we are adding to, cascade can change
+ # the current menu through -menu options.
+ set saveOMP $_ourMenuPath
+ set saveTKP $_tkMenuPath
+
+ eval "add cascade $_ourMenuPath.$casName $args"
+
+ # Restore the saved menu states so that the next entries of
+ # the -menu/-menubuttons we are processing will be at correct level.
+ set _ourMenuPath $saveOMP
+ set _tkMenuPath $saveTKP
+}
+
+# ... A P I S U P P O R T M E T H O D S...
+
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+# MENU ADD, INSERT, DELETE
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+# -------------------------------------------------------------
+#
+# PRIVATE METHOD: _addMenuButton
+#
+# Makes a new menubutton & associated -menu, pack appended
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Menubar::_addMenuButton { buttonName args} {
+
+ eval "_makeMenuButton $buttonName $args"
+
+ #,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+ # Pack at end, adjust for help buttonName
+ # ''''''''''''''''''''''''''''''''''
+ if { $buttonName == "help" } {
+ pack $itk_component($buttonName) -side right
+ } else {
+ pack $itk_component($buttonName) -side left
+ }
+
+ return $itk_component($buttonName)
+}
+
+# -------------------------------------------------------------
+#
+# PRIVATE METHOD: _insertMenuButton
+#
+# inserts a menubutton named $buttonName on a menu bar before
+# another menubutton specified by $beforeMenuPath
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Menubar::_insertMenuButton { beforeMenuPath buttonName args} {
+
+ eval "_makeMenuButton $buttonName $args"
+
+ #,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+ # Pack before the $beforeMenuPath
+ # ''''''''''''''''''''''''''''''''
+ set beforeTkMenu $_pathMap($beforeMenuPath)
+ regsub {[.]menu$} $beforeTkMenu "" beforeTkMenu
+ pack $itk_component(menubar).$buttonName \
+ -side left \
+ -before $beforeTkMenu
+
+ return $itk_component($buttonName)
+}
+
+# -------------------------------------------------------------
+#
+# PRIVATE METHOD: _makeMenuButton
+#
+# creates a menubutton named buttonName on the menubar with args.
+# The -menu option if present will trigger attaching a menu pane.
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Menubar::_makeMenuButton {buttonName args} {
+
+ #,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+ # Capture the -menu option if present
+ # '''''''''''''''''''''''''''''''''''
+ array set temp $args
+ if { [::info exists temp(-menu)] } {
+ # We only keep this in case of menuconfigure or menucget
+ set _menuOption(.$buttonName) $temp(-menu)
+ set menuEvalStr $temp(-menu)
+ } else {
+ set menuEvalStr {}
+ }
+
+ # attach the actual menu widget to the menubutton's arg list
+ set temp(-menu) $itk_component(menubar).$buttonName.menu
+ set args [array get temp]
+
+ #,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+ # Create menubutton component
+ # ''''''''''''''''''''''''''''''''
+ itk_component add $buttonName {
+ eval ::menubutton \
+ $itk_component(menubar).$buttonName \
+ $args
+ } {
+ keep \
+ -activebackground \
+ -activeforeground \
+ -anchor \
+ -background \
+ -borderwidth \
+ -cursor \
+ -disabledforeground \
+ -font \
+ -foreground \
+ -highlightbackground \
+ -highlightcolor \
+ -highlightthickness \
+ -justify \
+ -padx \
+ -pady \
+ -wraplength
+ }
+
+ set _pathMap(.$buttonName) $itk_component($buttonName)
+
+ _makeMenu \
+ $buttonName-menu \
+ $itk_component($buttonName).menu \
+ .$buttonName \
+ $menuEvalStr
+
+ return $itk_component($buttonName)
+
+}
+
+# -------------------------------------------------------------
+#
+# PRIVATE METHOD: _makeMenu
+#
+# Creates a menu.
+# It then evaluates the $menuEvalStr to create entries on the menu.
+#
+# Assumes the existence of $itk_component($buttonName)
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Menubar::_makeMenu \
+ { componentName widgetName menuPath menuEvalStr } {
+
+ #,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+ # Create menu component
+ # ''''''''''''''''''''''''''''''''
+ itk_component add $componentName {
+ ::menu $widgetName
+ } {
+ keep \
+ -activebackground \
+ -activeborderwidth \
+ -activeforeground \
+ -background \
+ -borderwidth \
+ -cursor \
+ -disabledforeground \
+ -font \
+ -foreground
+ }
+
+ set _pathMap($menuPath.menu) $itk_component($componentName)
+
+ #,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+ # Attach help handler to this menu
+ # ''''''''''''''''''''''''''''''''
+ bind $itk_component($componentName) <<MenuSelect>> \
+ [itcl::code $this _helpHandler $menuPath.menu]
+
+ #,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+ # Handle -menu
+ #'''''''''''''''''''''''''''''''''
+ set _ourMenuPath $menuPath
+ set _tkMenuPath $itk_component($componentName)
+
+ #
+ # A zero parseLevel says we are at the top of the parse tree,
+ # so get the context scope level and do a subst for the menuEvalStr.
+ #
+ if { $_parseLevel == 0 } {
+ set _callerLevel [_getCallerLevel]
+ }
+
+ #
+ # bump up the parse level, so if we get called via the 'eval $menuEvalStr'
+ # we know to skip the above steps...
+ #
+ incr _parseLevel
+ eval $menuEvalStr
+
+ #
+ # leaving, so done with this parse level, so bump it back down
+ #
+ incr _parseLevel -1
+}
+
+# -------------------------------------------------------------
+#
+# PRIVATE METHOD: _substEvalStr
+#
+# This performs the substitution and evaluation of $ [], \ found
+# in the -menubutton/-menus options
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Menubar::_substEvalStr { evalStr } {
+ upvar $evalStr evalStrRef
+ set evalStrRef [uplevel $_callerLevel [list subst $evalStrRef]]
+}
+
+
+# -------------------------------------------------------------
+#
+# PRIVATE METHOD: _deleteMenu
+#
+# _deleteMenu menuPath ?menuPath2?
+#
+# deletes menuPath or from menuPath to menuPath2
+#
+# Menu paths may be formed in one of two ways
+# .MENUBAR.menuName where menuName is the name of the menu
+# .MENUBAR.menuName.menu where menuName is the name of the menu
+#
+# The basic rule is '.menu' is not needed.
+# -------------------------------------------------------------
+itcl::body iwidgets::Menubar::_deleteMenu { menuPath {menuPath2 {}} } {
+
+ if { $menuPath2 == "" } {
+ # get a corrected path (subst for number, last, end)
+ set path [_parsePath $menuPath]
+
+ _deleteAMenu $path
+
+ } else {
+ # gets the list of menus in interface order
+ set menuList [_getMenuList]
+
+ # ... get the start menu and the last menu ...
+
+ # get a corrected path (subst for number, last, end)
+ set menuStartPath [_parsePath $menuPath]
+
+ regsub {[.]menu$} $menuStartPath "" menuStartPath
+
+ set menuEndPath [_parsePath $menuPath2]
+
+ regsub {[.]menu$} $menuEndPath "" menuEndPath
+
+ # get the menu position (0 based) of the start and end menus.
+ set start [lsearch -exact $menuList $menuStartPath]
+ if { $start == -1 } {
+ error "bad menu path \"$menuStartPath\": \
+ should be one of $menuList"
+ }
+ set end [lsearch -exact $menuList $menuEndPath]
+ if { $end == -1 } {
+ error "bad menu path \"$menuEndPath\": \
+ should be one of $menuList"
+ }
+
+ # now create the list from this range of menus
+ set delList [lrange $menuList $start $end]
+
+ # walk thru them deleting each menu.
+ # this list has no .menu on the end.
+ foreach m $delList {
+ _deleteAMenu $m.menu
+ }
+ }
+}
+
+# -------------------------------------------------------------
+#
+# PRIVATE METHOD: _deleteAMenu
+#
+# _deleteMenu menuPath
+#
+# deletes a single Menu (menubutton and menu pane with entries)
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Menubar::_deleteAMenu { path } {
+
+ # We will normalize the path to not include the '.menu' if
+ # it is on the path already.
+
+ regsub {[.]menu$} $path "" menuButtonPath
+ regsub {.*[.]} $menuButtonPath "" buttonName
+
+ # Loop through and destroy any cascades, etc on menu.
+ set entryList [_getEntryList $menuButtonPath]
+ foreach entry $entryList {
+ _deleteEntry $entry
+ }
+
+ # Delete the menubutton and menu components...
+ destroy $itk_component($buttonName-menu)
+ destroy $itk_component($buttonName)
+
+ # This is because of some itcl bug that doesn't delete
+ # the component on the destroy in some cases...
+ catch {itk_component delete $buttonName-menu}
+ catch {itk_component delete $buttonName}
+
+ # unset our paths
+ _unsetPaths $menuButtonPath
+
+}
+
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+# ENTRY ADD, INSERT, DELETE
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+# -------------------------------------------------------------
+#
+# PRIVATE METHOD: _addEntry
+#
+# Adds an entry to menu.
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Menubar::_addEntry { type path args } {
+
+ # Error Checking
+ # ''''''''''''''
+ # the path should not end with '.menu'
+ # Not needed -- already checked by add{}
+ # if { [regexp {[.]menu$} $path] } {
+ # error "bad entry path: \"$path\". \
+ # The name \"menu\" is reserved for menu panes"
+ # }
+
+ # get the tkMenuPath
+ set tkMenuPath [_entryPathToTkMenuPath $path]
+ if { $tkMenuPath == "" } {
+ error "bad entry path: \"$path\". The menu path prefix is not valid"
+ }
+
+ # get the -helpstr option if present
+ array set temp $args
+ if { [::info exists temp(-helpstr)] } {
+ set helpStr $temp(-helpstr)
+ unset temp(-helpstr)
+ } else {
+ set helpStr {}
+ }
+ set args [array get temp]
+
+ # Handle CASCADE
+ # ''''''''''''''
+ # if this is a cascade go ahead and add in the menu...
+ if { $type == "cascade" } {
+ eval [list _addCascade $tkMenuPath $path] $args
+ # Handle Non-CASCADE
+ # ''''''''''''''''''
+ } else {
+ # add the entry if one doesn't already exist with the same
+ # command name
+ if [::info exists _pathMap($path)] {
+ set cmdname [lindex [split $path .] end]
+ error "Cannot add $type \"$cmdname\". A menu item already\
+ exists with this name."
+ }
+ eval [list $tkMenuPath add $type] $args
+ set _pathMap($path) [_getPdIndex $tkMenuPath end]
+ }
+
+ # Remember the help string
+ set _helpString($path) $helpStr
+
+ return $_pathMap($path)
+}
+
+# -------------------------------------------------------------
+#
+# PRIVATE METHOD: _addCascade
+#
+# Creates a cascade button. Handles the -menu option
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Menubar::_addCascade { tkMenuPath path args } {
+
+ # get the cascade name from our path
+ regsub {.*[.]} $path "" cascadeName
+
+ #,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+ # Capture the -menu option if present
+ # '''''''''''''''''''''''''''''''''''
+ array set temp $args
+ if { [::info exists temp(-menu)] } {
+ set menuEvalStr $temp(-menu)
+ } else {
+ set menuEvalStr {}
+ }
+
+ # attach the menu pane
+ set temp(-menu) $tkMenuPath.$cascadeName
+ set args [array get temp]
+
+ # Create the cascade entry
+ eval $tkMenuPath add cascade $args
+
+ # Keep the -menu string in case of menuconfigure or menucget
+ if { $menuEvalStr != "" } {
+ set _menuOption($path) $menuEvalStr
+ }
+
+ # update our pathmap
+ set _pathMap($path) [_getPdIndex $tkMenuPath end]
+
+ _makeMenu \
+ $cascadeName-menu \
+ $tkMenuPath.$cascadeName \
+ $path \
+ $menuEvalStr
+
+ #return $itk_component($cascadeName)
+
+}
+
+# -------------------------------------------------------------
+#
+# PRIVATE METHOD: _insertEntry
+#
+# inserts an entry on a menu before entry given by beforeEntryPath.
+# The added entry is of type TYPE and its name is NAME. ARGS are
+# passed for customization of the entry.
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Menubar::_insertEntry { beforeEntryPath type name args } {
+
+ # convert entryPath to an index value
+ set bfIndex $_pathMap($beforeEntryPath)
+
+ # first verify that beforeEntryPath is actually a path to
+ # an entry and not to menu, menubutton, etc.
+ if { ! [regexp {^[0-9]+$} $bfIndex] } {
+ error "bad entry path: $beforeEntryPath is not an entry"
+ }
+
+ # get the menu path from the entry path name
+ regsub {[.][^.]*$} $beforeEntryPath "" menuPathPrefix
+ set tkMenuPath $_pathMap($menuPathPrefix.menu)
+
+ # If this entry already exists in the path map, throw an error.
+ if [::info exists _pathMap($menuPathPrefix.$name)] {
+ error "Cannot insert $type \"$name\". A menu item already\
+ exists with this name."
+ }
+
+ # INDEX is zero based at this point.
+
+ # ENTRIES is a zero based list...
+ set entries [_getEntryList $menuPathPrefix]
+
+ #
+ # Adjust the entries after the inserted item, to have
+ # the correct index numbers. Note, we stay zero based
+ # even though tk flips back and forth depending on tearoffs.
+ #
+ for {set i $bfIndex} {$i < [llength $entries]} {incr i} {
+ # path==entry path in numerical order
+ set path [lindex $entries $i]
+
+ # add one to each entry after the inserted one.
+ set _pathMap($path) [expr {$i + 1}]
+ }
+
+ # get the -helpstr option if present
+ array set temp $args
+ if { [::info exists temp(-helpstr)] } {
+ set helpStr $temp(-helpstr)
+ unset temp(-helpstr)
+ } else {
+ set helpStr {}
+ }
+ set args [array get temp]
+
+ set path $menuPathPrefix.$name
+
+ # Handle CASCADE
+ # ''''''''''''''
+ # if this is a cascade go ahead and add in the menu...
+ if { [string match cascade $type] } {
+
+ if { [ catch {eval "_insertCascade \
+ $bfIndex $tkMenuPath $path $args"} errMsg ]} {
+ for {set i $bfIndex} {$i < [llength $entries]} {incr i} {
+ # path==entry path in numerical order
+ set path [lindex $entries $i]
+
+ # sub the one we added earlier.
+ set _pathMap($path) [expr {$_pathMap($path) - 1}]
+ # @@ delete $hs
+ }
+ error $errMsg
+ }
+
+ # Handle Entry
+ # ''''''''''''''
+ } else {
+
+ # give us a zero or 1-based index based on tear-off menu status
+ # invoke the menu's insert command
+ if { [catch {eval "$tkMenuPath insert \
+ [_getTkIndex $tkMenuPath $bfIndex] $type $args"} errMsg]} {
+ for {set i $bfIndex} {$i < [llength $entries]} {incr i} {
+ # path==entry path in numerical order
+ set path [lindex $entries $i]
+
+ # sub the one we added earlier.
+ set _pathMap($path) [expr {$_pathMap($path) - 1}]
+ # @@ delete $hs
+ }
+ error $errMsg
+ }
+
+
+ # add the helpstr option to our options list (attach to entry)
+ set _helpString($path) $helpStr
+
+ # Insert the new entry path into pathmap giving it an index value
+ set _pathMap($menuPathPrefix.$name) $bfIndex
+
+ }
+
+ return [_getTkIndex $tkMenuPath $bfIndex]
+}
+
+# -------------------------------------------------------------
+#
+# PRIVATE METHOD: _insertCascade
+#
+# Creates a cascade button. Handles the -menu option
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Menubar::_insertCascade { bfIndex tkMenuPath path args } {
+
+ # get the cascade name from our path
+ regsub {.*[.]} $path "" cascadeName
+
+ #,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+ # Capture the -menu option if present
+ # '''''''''''''''''''''''''''''''''''
+ array set temp $args
+ if { [::info exists temp(-menu)] } {
+ # Keep the -menu string in case of menuconfigure or menucget
+ set _menuOption($path) $temp(-menu)
+ set menuEvalStr $temp(-menu)
+ } else {
+ set menuEvalStr {}
+ }
+
+ # attach the menu pane
+ set temp(-menu) $tkMenuPath.$cascadeName
+ set args [array get temp]
+
+ # give us a zero or 1-based index based on tear-off menu status
+ # invoke the menu's insert command
+ eval "$tkMenuPath insert \
+ [_getTkIndex $tkMenuPath $bfIndex] cascade $args"
+
+ # Insert the new entry path into pathmap giving it an index value
+ set _pathMap($path) $bfIndex
+ _makeMenu \
+ $cascadeName-menu \
+ $tkMenuPath.$cascadeName \
+ $path \
+ $menuEvalStr
+
+ #return $itk_component($cascadeName)
+}
+
+# -------------------------------------------------------------
+#
+# PRIVATE METHOD: _deleteEntry
+#
+# _deleteEntry entryPath ?entryPath2?
+#
+# either
+# deletes the entry entryPath
+# or
+# deletes the entries from entryPath to entryPath2
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Menubar::_deleteEntry { entryPath {entryPath2 {}} } {
+
+ if { $entryPath2 == "" } {
+ # get a corrected path (subst for number, last, end)
+ set path [_parsePath $entryPath]
+
+ set entryIndex $_pathMap($path)
+ if { $entryIndex == -1 } {
+ error "bad value for pathName: \
+ $entryPath in call to delet"
+ }
+
+ # get the type, if cascade, we will want to delete menu
+ set type [type $path]
+
+ # ... munge up the menu name ...
+
+ # the tkMenuPath is looked up with the .menu added to lookup
+ # strip off the entry component
+ regsub {[.][^.]*$} $path "" menuPath
+ set tkMenuPath $_pathMap($menuPath.menu)
+
+ # get the ordered entry list
+ set entries [_getEntryList $menuPath]
+
+ # ... Fix up path entry indices ...
+
+ # delete the path from the map
+ unset _pathMap([lindex $entries $entryIndex])
+
+ # Subtract off 1 for each entry below the deleted one.
+ for {set i [expr {$entryIndex + 1}]} \
+ {$i < [llength $entries]} \
+ {incr i} {
+ set epath [lindex $entries $i]
+ incr _pathMap($epath) -1
+ }
+
+ # ... Delete the menu entry widget ...
+
+ # delete the menu entry, ajusting index for TK
+ $tkMenuPath delete [_getTkIndex $tkMenuPath $entryIndex]
+
+ if { $type == "cascade" } {
+ regsub {.*[.]} $path "" cascadeName
+ destroy $itk_component($cascadeName-menu)
+
+ # This is because of some itcl bug that doesn't delete
+ # the component on the destroy in some cases...
+ catch {itk_component delete $cascadeName-menu}
+
+ _unsetPaths $path
+ }
+
+ } else {
+ # get a corrected path (subst for number, last, end)
+ set path1 [_parsePath $entryPath]
+ set path2 [_parsePath $entryPath2]
+
+ set fromEntryIndex $_pathMap($path1)
+ if { $fromEntryIndex == -1 } {
+ error "bad value for entryPath1: \
+ $entryPath in call to delet"
+ }
+ set toEntryIndex $_pathMap($path2)
+ if { $toEntryIndex == -1 } {
+ error "bad value for entryPath2: \
+ $entryPath2 in call to delet"
+ }
+ # ... munge up the menu name ...
+
+ # the tkMenuPath is looked up with the .menu added to lookup
+ # strip off the entry component
+ regsub {[.][^.]*$} $path1 "" menuPath
+ set tkMenuPath $_pathMap($menuPath.menu)
+
+ # get the ordered entry list
+ set entries [_getEntryList $menuPath]
+
+ # ... Fix up path entry indices ...
+
+ # delete the range from the pathMap list
+ for {set i $fromEntryIndex} {$i <= $toEntryIndex} {incr i} {
+ unset _pathMap([lindex $entries $i])
+ }
+
+ # Subtract off 1 for each entry below the deleted range.
+ # Loop from one below the bottom delete entry to end list
+ for {set i [expr {$toEntryIndex + 1}]} \
+ {$i < [llength $entries]} \
+ {incr i} {
+ # take this path and sets its index back by size of
+ # deleted range.
+ set path [lindex $entries $i]
+ set _pathMap($path) \
+ [expr {$_pathMap($path) - \
+ (($toEntryIndex - $fromEntryIndex) + 1)}]
+ }
+
+ # ... Delete the menu entry widget ...
+
+ # delete the menu entry, ajusting index for TK
+ $tkMenuPath delete \
+ [_getTkIndex $tkMenuPath $fromEntryIndex] \
+ [_getTkIndex $tkMenuPath $toEntryIndex]
+
+ }
+}
+
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+# CONFIGURATION SUPPORT
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+# -------------------------------------------------------------
+#
+# PRIVATE METHOD: _configureMenu
+#
+# This configures a menu. A menu is a true tk widget, thus we
+# pass the tkPath variable. This path may point to either a
+# menu button (does not end with the name 'menu', or a menu
+# which ends with the name 'menu'
+#
+# path : our Menubar path name to this menu button or menu pane.
+# if we end with the name '.menu' then it is a menu pane.
+# tkPath : the path to the corresponding Tk menubutton or menu.
+# args : the args for configuration
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Menubar::_configureMenu { path tkPath {option {}} args } {
+
+ set class [winfo class $tkPath]
+
+ if { $option == "" } {
+ # No arguments: return all options
+ set configList [$tkPath configure]
+
+ if { [info exists _menuOption($path)] } {
+ lappend configList [list -menu menu Menu {} $_menuOption($path)]
+ } else {
+ lappend configList [list -menu menu Menu {} {}]
+ }
+ if { [info exists _helpString($path)] } {
+ lappend configList [list -helpstr helpStr HelpStr {} \
+ $_helpString($path)]
+ } else {
+ lappend configList [list -helpstr helpStr HelpStr {} {}]
+ }
+ return $configList
+
+ } elseif {$args == "" } {
+ if { $option == "-menu" } {
+ if { [info exists _menuOption($path)] } {
+ return [list -menu menu Menu {} $_menuOption($path)]
+ } else {
+ return [list -menu menu Menu {} {}]
+ }
+ } elseif { $option == "-helpstr" } {
+ if { [info exists _helpString($path)] } {
+ return [list -helpstr helpStr HelpStr {} $_helpString($path)]
+ } else {
+ return [list -helpstr helpStr HelpStr {} {}]
+ }
+ } else {
+ # ... OTHERWISE, let Tk get it.
+ return [$tkPath configure $option]
+ }
+ } else {
+ set args [concat $option $args]
+
+ # If this is a menubutton, and has -menu option, process it
+ if { $class == "Menubutton" && [regexp -- {-menu} $args] } {
+ eval _configureMenuOption menubutton $path $args
+ } else {
+ eval $tkPath configure $args
+ }
+ return ""
+ }
+}
+
+# -------------------------------------------------------------
+#
+# PRIVATE METHOD: _configureMenuOption
+#
+# Allows for configuration of the -menu option on
+# menubuttons and cascades
+#
+# find out if we are the last menu, or are before one.
+# delete the old menu.
+# if we are the last, then add us back at the end
+# if we are before another menu, get the beforePath
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Menubar::_configureMenuOption { type path args } {
+
+ regsub {[.][^.]*$} $path "" pathPrefix
+
+ if { $type == "menubutton" } {
+ set menuList [_getMenuList]
+ set pos [lsearch $menuList $path]
+ if { $pos == ([llength $menuList] - 1) } {
+ set insert false
+ } else {
+ set insert true
+ }
+ } elseif { $type == "cascade" } {
+ set lastEntryPath [_parsePath $pathPrefix.last]
+ if { $lastEntryPath == $path } {
+ set insert false
+ } else {
+ set insert true
+ }
+ set pos [index $path]
+
+ }
+
+
+ eval "delete $pathPrefix.$pos"
+ if { $insert } {
+ # get name from path...
+ regsub {.*[.]} $path "" name
+
+ eval insert $pathPrefix.$pos $type \
+ $name $args
+ } else {
+ eval add $type $path $args
+ }
+}
+
+# -------------------------------------------------------------
+#
+# PRIVATE METHOD: _configureMenuEntry
+#
+# This configures a menu entry. A menu entry is either a command,
+# radiobutton, separator, checkbutton, or a cascade. These have
+# a corresponding Tk index value for the corresponding tk menu
+# path.
+#
+# path : our Menubar path name to this menu entry.
+# index : the t
+# args : the args for configuration
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Menubar::_configureMenuEntry { path index {option {}} args } {
+
+ set type [type $path]
+
+ # set len [llength $args]
+
+ # get the menu path from the entry path name
+ set tkMenuPath [_entryPathToTkMenuPath $path]
+
+ if { $option == "" } {
+ set configList [$tkMenuPath entryconfigure \
+ [_getTkIndex $tkMenuPath $index]]
+
+ if { $type == "cascade" } {
+ if { [info exists _menuOption($path)] } {
+ lappend configList [list -menu menu Menu {} \
+ $_menuOption($path)]
+ } else {
+ lappend configList [list -menu menu Menu {} {}]
+ }
+ }
+ if { [info exists _helpString($path)] } {
+ lappend configList [list -helpstr helpStr HelpStr {} \
+ $_helpString($path)]
+ } else {
+ lappend configList [list -helpstr helpStr HelpStr {} {}]
+ }
+ return $configList
+
+ } elseif { $args == "" } {
+ if { $option == "-menu" } {
+ if { [info exists _menuOption($path)] } {
+ return [list -menu menu Menu {} $_menuOption($path)]
+ } else {
+ return [list -menu menu Menu {} {}]
+ }
+ } elseif { $option == "-helpstr" } {
+ if { [info exists _helpString($path)] } {
+ return [list -helpstr helpStr HelpStr {} \
+ $_helpString($path)]
+ } else {
+ return [list -helpstr helpStr HelpStr {} {}]
+ }
+ } else {
+ # ... OTHERWISE, let Tk get it.
+ return [$tkMenuPath entryconfigure \
+ [_getTkIndex $tkMenuPath $index] $option]
+ }
+ } else {
+ array set temp [concat $option $args]
+
+ # ... Store -helpstr val,strip out -helpstr val from args
+ if { [::info exists temp(-helpstr)] } {
+ set _helpString($path) $temp(-helpstr)
+ unset temp(-helpstr)
+ }
+
+ set args [array get temp]
+ if { $type == "cascade" && [::info exists temp(-menu)] } {
+ eval "_configureMenuOption cascade $path $args"
+ } else {
+ # invoke the menu's entryconfigure command
+ # being careful to ajust the INDEX to be 0 or 1 based
+ # depending on the tearoff status
+ # if the stripping process brought us down to no options
+ # to set, then forget the configure of widget.
+ if { [llength $args] != 0 } {
+ eval $tkMenuPath entryconfigure \
+ [_getTkIndex $tkMenuPath $index] $args
+ }
+ }
+ return ""
+ }
+}
+
+# -------------------------------------------------------------
+#
+# PRIVATE METHOD: _unsetPaths
+#
+# comment
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Menubar::_unsetPaths { parent } {
+
+ # first get the complete list of all menu paths
+ set pathList [array names _pathMap]
+
+ # for each path that matches parent prefix, unset it.
+ foreach path $pathList {
+ if { [regexp [subst -nocommands {^$parent}] $path] } {
+ unset _pathMap($path)
+ }
+ }
+}
+
+# -------------------------------------------------------------
+#
+# PRIVATE METHOD: _entryPathToTkMenuPath
+#
+# Takes an entry path like .mbar.file.new and changes it to
+# .mbar.file.menu and performs a lookup in the pathMap to
+# get the corresponding menu widget name for tk
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Menubar::_entryPathToTkMenuPath {entryPath} {
+
+ # get the menu path from the entry path name
+ # by stripping off the entry component of the path
+ regsub {[.][^.]*$} $entryPath "" menuPath
+
+ # the tkMenuPath is looked up with the .menu added to lookup
+ if { [catch {set tkMenuPath $_pathMap($menuPath.menu)}] } {
+ return ""
+ } else {
+ return $_pathMap($menuPath.menu)
+ }
+}
+
+
+# -------------------------------------------------------------
+#
+# These two methods address the issue of menu entry indices being
+# zero-based when the menu is not a tearoff menu and 1-based when
+# it is a tearoff menu. Our strategy is to hide this difference.
+#
+# _getTkIndex returns the index as tk likes it: 0 based for non-tearoff
+# and 1 based for tearoff menus.
+#
+# _getPdIndex (get pulldown index) always returns it as 0 based.
+#
+# -------------------------------------------------------------
+
+# -------------------------------------------------------------
+#
+# PRIVATE METHOD: _getTkIndex
+#
+# give us a zero or 1-based answer depending on the tearoff
+# status of the menu. If the menu denoted by tkMenuPath is a
+# tearoff menu it returns a 1-based result, otherwise a
+# zero-based result.
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Menubar::_getTkIndex { tkMenuPath tkIndex} {
+
+ # if there is a tear off make it 1-based index
+ if { [$tkMenuPath cget -tearoff] } {
+ incr tkIndex
+ }
+
+ return $tkIndex
+}
+
+# -------------------------------------------------------------
+#
+# PRIVATE METHOD: _getPdIndex
+#
+# Take a tk index and give me a zero based numerical index
+#
+# Ask the menu widget for the index of the entry denoted by
+# 'tkIndex'. Then if the menu is a tearoff adjust the value
+# to be zero based.
+#
+# This method returns the index as if tearoffs did not exist.
+# Always returns a zero-based index.
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Menubar::_getPdIndex { tkMenuPath tkIndex } {
+
+ # get the index from the tk menu
+ # this 0 based for non-tearoff and 1-based for tearoffs
+ set pdIndex [$tkMenuPath index $tkIndex]
+
+ # if there is a tear off make it 0-based index
+ if { [$tkMenuPath cget -tearoff] } {
+ incr pdIndex -1
+ }
+
+ return $pdIndex
+}
+
+# -------------------------------------------------------------
+#
+# PRIVATE METHOD: _getMenuList
+#
+# Returns the list of menus in the order they are on the interface
+# returned list is a list of our menu paths
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Menubar::_getMenuList { } {
+ # get the menus that are packed
+ set tkPathList [pack slaves $itk_component(menubar)]
+
+ regsub -- {[.]} $itk_component(hull) "" mbName
+ regsub -all -- "\[.\]$mbName\[.\]menubar\[.\]" $tkPathList "." menuPathList
+
+ return $menuPathList
+}
+
+# -------------------------------------------------------------
+#
+# PRIVATE METHOD: _getEntryList
+#
+#
+# This method looks at a menupath and gets all the entries and
+# returns a list of all the entry path names in numerical order
+# based on their index values.
+#
+# MENU is the path to a menu, like .mbar.file.menu or .mbar.file
+# we will calculate a menuPath from this: .mbar.file
+# then we will build a list of entries in this menu excluding the
+# path .mbar.file.menu
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Menubar::_getEntryList { menu } {
+
+ # if it ends with menu, clip it off
+ regsub {[.]menu$} $menu "" menuPath
+
+ # first get the complete list of all menu paths
+ set pathList [array names _pathMap]
+
+ set numEntries 0
+ # iterate over the pathList and put on menuPathList those
+ # that match the menuPattern
+ foreach path $pathList {
+ # if this path is on the menuPath's branch
+ if { [regexp [subst -nocommands {$menuPath[.][^.]*$}] $path] } {
+ # if not a menu itself
+ if { ! [regexp {[.]menu$} $path] } {
+ set orderedList($_pathMap($path)) $path
+ incr numEntries
+ }
+ }
+ }
+ set entryList {}
+
+ for {set i 0} {$i < $numEntries} {incr i} {
+ lappend entryList $orderedList($i)
+ }
+
+ return $entryList
+
+}
+
+# -------------------------------------------------------------
+#
+# PRIVATE METHOD: _parsePath
+#
+# given path, PATH, _parsePath splits the path name into its
+# component segments. It then puts the name back together one
+# segment at a time and calls _getSymbolicPath to replace the
+# keywords 'last' and 'end' as well as numeric digits.
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Menubar::_parsePath { path } {
+ set segments [split [string trimleft $path .] .]
+
+ set concatPath ""
+ foreach seg $segments {
+
+ set concatPath [_getSymbolicPath $concatPath $seg]
+
+ if { [catch {set _pathMap($concatPath)} ] } {
+ error "bad path: \"$path\" does not exist. \"$seg\" not valid"
+ }
+ }
+ return $concatPath
+}
+
+# -------------------------------------------------------------
+#
+# PRIVATE METHOD: _getSymbolicPath
+#
+# Given a PATH, _getSymbolicPath looks for the last segment of
+# PATH to contain: a number, the keywords last or end. If one
+# of these it figures out how to get us the actual pathname
+# to the searched widget
+#
+# Implementor's notes:
+# Surely there is a shorter way to do this. The only diff
+# for non-numeric is getting the llength of the correct list
+# It is hard to know this upfront so it seems harder to generalize.
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Menubar::_getSymbolicPath { parent segment } {
+
+ # if the segment is a number, then look it up positionally
+ # MATCH numeric index
+ if { [regexp {^[0-9]+$} $segment] } {
+
+ # if we have no parent, then we area menubutton
+ if { $parent == {} } {
+ set returnPath [lindex [_getMenuList] $segment]
+ } else {
+ set returnPath [lindex [_getEntryList $parent.menu] $segment]
+ }
+
+ # MATCH 'end' or 'last' keywords.
+ } elseif { $segment == "end" || $segment == "last" } {
+
+ # if we have no parent, then we are a menubutton
+ if { $parent == {} } {
+ set returnPath [lindex [_getMenuList] end]
+ } else {
+ set returnPath [lindex [_getEntryList $parent.menu] end]
+ }
+ } else {
+ set returnPath $parent.$segment
+ }
+
+ return $returnPath
+}
+
+# -------------------------------------------------------------
+#
+# PRIVATE METHOD: _helpHandler
+#
+# Bound to the <Motion> event on a menu pane. This puts the
+# help string associated with the menu entry into the
+# status widget help area. If no help exists for the current
+# entry, the status widget is cleared.
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Menubar::_helpHandler { menuPath } {
+
+ if { $itk_option(-helpvariable) == {} } {
+ return
+ }
+
+ set tkMenuWidget $_pathMap($menuPath)
+
+ set entryIndex [$tkMenuWidget index active]
+
+ # already on this item?
+ if { $entryIndex == $_entryIndex } {
+ return
+ }
+
+ set _entryIndex $entryIndex
+
+ if {"none" != $entryIndex} {
+ set entries [_getEntryList $menuPath]
+
+ set menuEntryHit \
+ [lindex $entries [_getPdIndex $tkMenuWidget $entryIndex]]
+
+ # blank out the old one
+ set $itk_option(-helpvariable) {}
+
+ # if there is a help string for this entry
+ if { [::info exists _helpString($menuEntryHit)] } {
+ set $itk_option(-helpvariable) $_helpString($menuEntryHit)
+ }
+ } else {
+ set $itk_option(-helpvariable) {}
+ set _entryIndex -1
+ }
+}
+
+# -------------------------------------------------------------
+#
+# PRIVATE METHOD: _getCallerLevel
+#
+# Starts at stack frame #0 and works down till we either hit
+# a ::Menubar stack frame or an ::itk::Archetype stack frame
+# (the latter happens when a configure is called via the 'component'
+# method
+#
+# Returns the level of the actual caller of the menubar command
+# in the form of #num where num is the level number caller stack frame.
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Menubar::_getCallerLevel { } {
+
+ set levelName {}
+ set levelsAreValid true
+ set level 0
+ set callerLevel #$level
+
+ while { $levelsAreValid } {
+ # Hit the end of the stack frame
+ if [catch {uplevel #$level {namespace current}}] {
+ set levelsAreValid false
+ set callerLevel #[expr {$level - 1}]
+ # still going
+ } else {
+ set newLevelName [uplevel #$level {namespace current}]
+ # See if we have run into the first ::Menubar level
+ if { $newLevelName == "::itk::Archetype" || \
+ $newLevelName == "::iwidgets::Menubar" } {
+ # If so, we are done-- set the callerLevel
+ set levelsAreValid false
+ set callerLevel #[expr {$level - 1}]
+ } else {
+ set levelName $newLevelName
+ }
+ }
+ incr level
+ }
+ return $callerLevel
+}
+
+
+#
+# The default tkMenuFind proc in menu.tcl only looks for menubuttons
+# in frames. Since our menubuttons are within the Menubar class, the
+# default proc won't find them during menu traversal. This proc
+# redefines the default proc to remedy the problem.
+#-----------------------------------------------------------
+# BUG FIX: csmith (Chad Smith: csmith@adc.com), 3/30/99
+#-----------------------------------------------------------
+# The line, "set qchild ..." below had a typo. It should be
+# "info command $child" instead of "winfo command $child".
+#-----------------------------------------------------------
+proc tkMenuFind {w char} {
+ global tkPriv
+ set char [string tolower $char]
+
+ # Added by csmith, 5/10/01, to fix a bug reported on the itcl mailing list.
+ if {$w == "."} {
+ foreach child [winfo child $w] {
+ set match [tkMenuFind $child $char]
+ if {$match != ""} {
+ return $match
+ }
+ }
+ return {}
+ }
+
+ foreach child [winfo child $w] {
+ switch [winfo class $child] {
+ Menubutton {
+ set qchild [info command $child]
+ set char2 [string index [$qchild cget -text] \
+ [$qchild cget -underline]]
+ if {([string compare $char [string tolower $char2]] == 0)
+ || ($char == "")} {
+ if {[$qchild cget -state] != "disabled"} {
+ return $child
+ }
+ }
+ }
+ Frame -
+ Menubar {
+ set match [tkMenuFind $child $char]
+ if {$match != ""} {
+ return $match
+ }
+ }
+ }
+ }
+ return {}
+}
diff --git a/iwidgets/generic/messagebox.itk b/iwidgets/generic/messagebox.itk
new file mode 100644
index 00000000000..40cad1caad9
--- /dev/null
+++ b/iwidgets/generic/messagebox.itk
@@ -0,0 +1,399 @@
+#
+# Messagebox
+# ----------------------------------------------------------------------
+# Implements an information messages area widget with scrollbars.
+# Message types can be user defined and configured. Their options
+# include foreground, background, font, bell, and their display
+# mode of on or off. This allows message types to defined as needed,
+# removed when no longer so, and modified when necessary. An export
+# method is provided for file I/O.
+#
+# The number of lines that can be displayed may be limited with
+# the default being 1000. When this limit is reached, the oldest line
+# is removed. There is also support for saving the contents to a
+# file, using a file selection dialog.
+# ----------------------------------------------------------------------
+#
+# History:
+# 01/16/97 - Alfredo Jahn Renamed from InfoMsgBox to MessageBox
+# Initial release...
+# 01/20/97 - Alfredo Jahn Add a popup window so that 3rd mouse
+# button can be used to configure/access the message area.
+# New methods added: _post and _toggleDebug.
+# 01/30/97 - Alfredo Jahn Add -filename option
+# 05/11/97 - Mark Ulferts Added the ability to define and configure
+# new types. Changed print method to be issue.
+# 09/05/97 - John Tucker Added export method.
+#
+# ----------------------------------------------------------------------
+# AUTHOR: Alfredo Jahn V EMAIL: ajahn@spd.dsccc.com
+# Mark L. Ulferts mulferts@austin.dsccc.com
+#
+# @(#) $Id$
+# ----------------------------------------------------------------------
+# Copyright (c) 1997 DSC Technologies Corporation
+# ======================================================================
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+
+#
+# Usual options.
+#
+itk::usual Messagebox {
+ keep -activebackground -activeforeground -background -borderwidth \
+ -cursor -highlightcolor -highlightthickness \
+ -jump -labelfont -textbackground -troughcolor
+}
+
+# ------------------------------------------------------------------
+# MSGTYPE
+# ------------------------------------------------------------------
+
+itcl::class iwidgets::MsgType {
+ constructor {args} {eval configure $args}
+
+ public variable background \#d9d9d9
+ public variable bell 0
+ public variable font -*-Courier-Medium-R-Normal--*-120-*-*-*-*-*-*
+ public variable foreground Black
+ public variable show 1
+}
+
+# ------------------------------------------------------------------
+# MESSAGEBOX
+# ------------------------------------------------------------------
+itcl::class iwidgets::Messagebox {
+ inherit itk::Widget
+
+ constructor {args} {}
+ destructor {}
+
+ itk_option define -filename fileName FileName ""
+ itk_option define -maxlines maxLines MaxLines 1000
+ itk_option define -savedir saveDir SaveDir "[pwd]"
+
+ public {
+ method clear {}
+ method export {filename}
+ method find {}
+ method issue {string {type DEFAULT} args}
+ method save {}
+ method type {op tag args}
+ }
+
+ protected {
+ variable _unique 0
+ variable _types {}
+ variable _interior {}
+
+ method _post {x y}
+ }
+}
+
+#
+# Provide a lowercased access method for the Messagebox class.
+#
+proc ::iwidgets::messagebox {pathName args} {
+ uplevel ::iwidgets::Messagebox $pathName $args
+}
+
+#
+# Use option database to override default resources of base classes.
+#
+option add *Messagebox.labelPos n widgetDefault
+option add *Messagebox.cursor top_left_arrow widgetDefault
+option add *Messagebox.height 0 widgetDefault
+option add *Messagebox.width 0 widgetDefault
+option add *Messagebox.visibleItems 80x24 widgetDefault
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Messagebox::constructor {args} {
+ set _interior $itk_interior
+
+ #
+ # Create the text area.
+ #
+ itk_component add text {
+ iwidgets::Scrolledtext $itk_interior.text -width 1 -height 1 \
+ -state disabled -wrap none
+ } {
+ keep -borderwidth -cursor -exportselection -highlightcolor \
+ -highlightthickness -padx -pady -relief -setgrid -spacing1 \
+ -spacing2 -spacing3
+
+ keep -activerelief -elementborderwidth -jump -troughcolor
+
+ keep -hscrollmode -height -sbwidth -scrollmargin -textbackground \
+ -visibleitems -vscrollmode -width
+
+ keep -labelbitmap -labelfont -labelimage -labelmargin \
+ -labelpos -labeltext -labelvariable
+ }
+ grid $itk_component(text) -row 0 -column 0 -sticky nsew
+ grid rowconfigure $_interior 0 -weight 1
+ grid columnconfigure $_interior 0 -weight 1
+
+ #
+ # Setup right mouse button binding to post a user configurable
+ # popup menu and diable the binding for left mouse clicks.
+ #
+ bind [$itk_component(text) component text] <ButtonPress-1> "break"
+ bind [$itk_component(text) component text] \
+ <ButtonPress-3> [itcl::code $this _post %x %y]
+
+ #
+ # Create the small popup menu that can be configurable by users.
+ #
+ itk_component add itemMenu {
+ menu $itk_component(hull).itemmenu -tearoff 0
+ } {
+ keep -background -font -foreground \
+ -activebackground -activeforeground
+ ignore -tearoff
+ }
+
+ #
+ # Add clear and svae options to the popup menu.
+ #
+ $itk_component(itemMenu) add command -label "Find" \
+ -command [itcl::code $this find]
+ $itk_component(itemMenu) add command -label "Save" \
+ -command [itcl::code $this save]
+ $itk_component(itemMenu) add command -label "Clear" \
+ -command [itcl::code $this clear]
+
+ #
+ # Create a standard type to be used if no others are specified.
+ #
+ type add DEFAULT
+
+ eval itk_initialize $args
+}
+
+# ------------------------------------------------------------------
+# DESTURCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Messagebox::destructor {} {
+ foreach type $_types {
+ type remove $type
+ }
+}
+
+# ------------------------------------------------------------------
+# METHODS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# METHOD clear
+#
+# Clear the text area.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Messagebox::clear {} {
+ $itk_component(text) configure -state normal
+
+ $itk_component(text) delete 1.0 end
+
+ $itk_component(text) configure -state disabled
+}
+
+# ------------------------------------------------------------------
+# PUBLIC METHOD: type <op> <tag> <args>
+#
+# The type method supports several subcommands. Types can be added
+# removed and configured. All the subcommands use the MsgType class
+# to implement the functionaility.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Messagebox::type {op tag args} {
+ switch $op {
+ add {
+ eval iwidgets::MsgType $this$tag $args
+
+ lappend _types $tag
+
+ $itk_component(text) tag configure $tag \
+ -font [$this$tag cget -font] \
+ -background [$this$tag cget -background] \
+ -foreground [$this$tag cget -foreground]
+
+ return $tag
+ }
+
+ remove {
+ if {[set index [lsearch $_types $tag]] != -1} {
+ itcl::delete object $this$tag
+ set _types [lreplace $_types $index $index]
+
+ return
+ } else {
+ error "bad message type: \"$tag\", does not exist"
+ }
+ }
+
+ configure {
+ if {[set index [lsearch $_types $tag]] != -1} {
+ set retVal [eval $this$tag configure $args]
+
+ $itk_component(text) tag configure $tag \
+ -font [$this$tag cget -font] \
+ -background [$this$tag cget -background] \
+ -foreground [$this$tag cget -foreground]
+
+ return $retVal
+
+ } else {
+ error "bad message type: \"$tag\", does not exist"
+ }
+ }
+
+ cget {
+ if {[set index [lsearch $_types $tag]] != -1} {
+ return [eval $this$tag cget $args]
+ } else {
+ error "bad message type: \"$tag\", does not exist"
+ }
+ }
+
+ default {
+ error "bad type operation: \"$op\", should be add,\
+ remove, configure or cget"
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# PUBLIC METHOD: issue string ?type? args
+#
+# Print the string out to the Messagebox. Check the options of the
+# message type to see if it should be displayed or if the bell
+# should be wrong.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Messagebox::issue {string {type DEFAULT} args} {
+ if {[lsearch $_types $type] == -1} {
+ error "bad message type: \"$type\", use the type\
+ command to create a new types"
+ }
+
+ #
+ # If the type is currently configured to be displayed, then insert
+ # it in the text widget, add the tag to the line and move the
+ # vertical scroll bar to the bottom.
+ #
+ set tag $this$type
+
+ if {[$tag cget -show]} {
+ $itk_component(text) configure -state normal
+
+ #
+ # Find end of last message.
+ #
+ set prevend [$itk_component(text) index "end - 1 chars"]
+
+ $itk_component(text) insert end "$string\n" $args
+
+ $itk_component(text) tag add $type $prevend "end - 1 chars"
+ $itk_component(text) yview end
+
+ #
+ # Sound a beep if the message type is configured such.
+ #
+ if {[$tag cget -bell]} {
+ bell
+ }
+
+ #
+ # If we reached our max lines limit, then remove enough lines to
+ # get it back under.
+ #
+ set lineCount [lindex [split [$itk_component(text) index end] "."] 0]
+
+ if { $lineCount > $itk_option(-maxlines) } {
+ set numLines [expr {$lineCount - $itk_option(-maxlines) -1}]
+
+ $itk_component(text) delete 1.0 $numLines.0
+ }
+
+ $itk_component(text) configure -state disabled
+ }
+}
+
+# ------------------------------------------------------------------
+# PUBLIC METHOD: save
+#
+# Save contents of messages area to a file using a fileselectionbox.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Messagebox::save {} {
+ set saveFile ""
+ set filter ""
+
+ set saveFile [tk_getSaveFile -title "Save Messages" \
+ -initialdir $itk_option(-savedir) \
+ -parent $itk_interior \
+ -initialfile $itk_option(-filename)]
+
+ if { $saveFile != "" } {
+ $itk_component(text) export $saveFile
+ }
+}
+
+# ------------------------------------------------------------------
+# PUBLIC METHOD: find
+#
+# Search the contents of messages area for a specific string.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Messagebox::find {} {
+ if {! [info exists itk_component(findd)]} {
+ itk_component add findd {
+ iwidgets::Finddialog $itk_interior.findd \
+ -textwidget $itk_component(text)
+ }
+ }
+
+ $itk_component(findd) center $itk_component(text)
+ $itk_component(findd) activate
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _post
+#
+# Used internally to post the popup menu at the coordinate (x,y)
+# relative to the widget.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Messagebox::_post {x y} {
+ set rx [expr {[winfo rootx $itk_component(text)]+$x}]
+ set ry [expr {[winfo rooty $itk_component(text)]+$y}]
+
+ tk_popup $itk_component(itemMenu) $rx $ry
+}
+
+
+# ------------------------------------------------------------------
+# METHOD export filename
+#
+# write text to a file (export filename)
+# ------------------------------------------------------------------
+itcl::body iwidgets::Messagebox::export {filename} {
+
+ $itk_component(text) export $filename
+
+}
+
diff --git a/iwidgets/generic/messagedialog.itk b/iwidgets/generic/messagedialog.itk
new file mode 100644
index 00000000000..2b9c58fb733
--- /dev/null
+++ b/iwidgets/generic/messagedialog.itk
@@ -0,0 +1,144 @@
+#
+# Messagedialog
+# ----------------------------------------------------------------------
+# Implements a message dialog composite widget. The Messagedialog is
+# derived from the Dialog class and is composed of an image and text
+# component. The image will accept both images as well as bitmaps.
+# The text can extend mutliple lines by embedding newlines.
+#
+# ----------------------------------------------------------------------
+# AUTHOR: Mark L. Ulferts EMAIL: mulferts@austin.dsccc.com
+#
+# @(#) $Id$
+# ----------------------------------------------------------------------
+# Copyright (c) 1995 DSC Technologies Corporation
+# ======================================================================
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+
+#
+# Usual options.
+#
+itk::usual Messagedialog {
+ keep -background -cursor -font -foreground -modality
+ keep -wraplength -justify
+}
+
+# ------------------------------------------------------------------
+# MESSAGEDIALOG
+# ------------------------------------------------------------------
+itcl::class iwidgets::Messagedialog {
+ inherit iwidgets::Dialog
+
+ constructor {args} {}
+
+ itk_option define -imagepos imagePos Position w
+}
+
+#
+# Provide a lowercased access method for the Messagedialog class.
+#
+proc ::iwidgets::messagedialog {pathName args} {
+ uplevel ::iwidgets::Messagedialog $pathName $args
+}
+
+#
+# Use option database to override default resources of base classes.
+#
+option add *Messagedialog.title "Message Dialog" widgetDefault
+option add *Messagedialog.master "." widgetDefault
+option add *Messagedialog.textPadX 20 widgetDefault
+option add *Messagedialog.textPadY 20 widgetDefault
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Messagedialog::constructor {args} {
+ #
+ # Create the image component which may be either a bitmap or image.
+ #
+ itk_component add image {
+ label $itk_interior.image
+ } {
+ keep -background -bitmap -cursor -foreground -image
+ }
+
+ #
+ # Create the text message component. The message may extend over
+ # several lines by embedding '\n' characters.
+ #
+ itk_component add message {
+ label $itk_interior.message
+ } {
+ keep -background -cursor -font -foreground -text
+ keep -wraplength -justify
+
+ rename -padx -textpadx textPadX Pad
+ rename -pady -textpady textPadY Pad
+ }
+
+ #
+ # Hide the apply and help buttons.
+ #
+ hide Apply
+ hide Help
+
+ #
+ # Initialize the widget based on the command line options.
+ #
+ eval itk_initialize $args
+}
+
+# ------------------------------------------------------------------
+# OPTIONS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# OPTION: -imagepos
+#
+# Specifies the image position relative to the message: n, s,
+# e, or w. The default is w.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Messagedialog::imagepos {
+ switch $itk_option(-imagepos) {
+ n {
+ grid $itk_component(image) -row 0 -column 0
+ grid $itk_component(message) -row 1 -column 0
+ }
+ s {
+ grid $itk_component(message) -row 0 -column 0
+ grid $itk_component(image) -row 1 -column 0
+ }
+ e {
+ grid $itk_component(message) -row 0 -column 0
+ grid $itk_component(image) -row 0 -column 1
+ }
+ w {
+ grid $itk_component(image) -row 0 -column 0
+ grid $itk_component(message) -row 0 -column 1
+ }
+
+ default {
+ error "bad imagepos option \"$itk_option(-imagepos)\":\
+ should be n, e, s, or w"
+ }
+ }
+}
diff --git a/iwidgets/generic/notebook.itk b/iwidgets/generic/notebook.itk
new file mode 100644
index 00000000000..18c5cd95efe
--- /dev/null
+++ b/iwidgets/generic/notebook.itk
@@ -0,0 +1,946 @@
+#
+# Notebook Widget
+# ----------------------------------------------------------------------
+# The Notebook command creates a new window (given by the pathName
+# argument) and makes it into a Notebook widget. Additional options,
+# described above may be specified on the command line or in the
+# option database to configure aspects of the Notebook such as its
+# colors, font, and text. The Notebook command returns its pathName
+# argument. At the time this command is invoked, there must not exist
+# a window named pathName, but path Name's parent must exist.
+#
+# A Notebook is a widget that contains a set of pages. It displays one
+# page from the set as the selected page. When a page is selected, the
+# page's contents are displayed in the page area. When first created a
+# Notebook has no pages. Pages may be added or deleted using widget commands
+# described below.
+#
+# A special option may be provided to the Notebook. The -auto option
+# specifies whether the Nptebook will automatically handle the unpacking
+# and packing of pages when pages are selected. A value of true signifies
+# that the notebook will automatically manage it. This is the default
+# value. A value of false signifies the notebook will not perform automatic
+# switching of pages.
+#
+# WISH LIST:
+# This section lists possible future enhancements.
+#
+# ----------------------------------------------------------------------
+# AUTHOR: Bill W. Scott EMAIL: bscott@spd.dsccc.com
+#
+# @(#) $Id$
+# ----------------------------------------------------------------------
+# Copyright (c) 1995 DSC Technologies Corporation
+# ======================================================================
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+
+#
+# Default resources.
+#
+option add *Notebook.background #d9d9d9 widgetDefault
+option add *Notebook.auto true widgetDefault
+
+#
+# Usual options.
+#
+itk::usual Notebook {
+ keep -background -cursor
+}
+
+# ------------------------------------------------------------------
+# NOTEBOOK
+# ------------------------------------------------------------------
+itcl::class iwidgets::Notebook {
+ inherit itk::Widget
+
+ constructor {args} {}
+
+ itk_option define -background background Background #d9d9d9
+ itk_option define -auto auto Auto true
+ itk_option define -scrollcommand scrollCommand ScrollCommand {}
+
+ public method add { args }
+ public method childsite { args }
+ public method delete { args }
+ public method index { args }
+ public method insert { args }
+ public method prev { }
+ public method next { }
+ public method pageconfigure { args }
+ public method pagecget { index option }
+ public method select { index }
+ public method view { args }
+
+ private method _childSites { }
+ private method _scrollCommand { }
+ private method _index { pathList index select}
+ private method _createPage { args }
+ private method _deletePages { fromPage toPage }
+ private method _configurePages { args }
+ private method _tabCommand { }
+
+ private variable _currPage -1 ;# numerical index of current page selected
+ private variable _pages {} ;# list of Page components
+ private variable _uniqueID 0 ;# one-up number for unique page numbering
+
+}
+
+#
+# Provide a lowercase access method for the Notebook class
+#
+proc ::iwidgets::notebook {pathName args} {
+ uplevel ::iwidgets::Notebook $pathName $args
+}
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Notebook::constructor {args} {
+ #
+ # Create the outermost frame to maintain geometry.
+ #
+ itk_component add cs {
+ frame $itk_interior.cs
+ } {
+ keep -cursor -background -width -height
+ }
+ pack $itk_component(cs) -fill both -expand yes
+ pack propagate $itk_component(cs) no
+
+ eval itk_initialize $args
+
+ # force bg of all pages to reflect Notebook's background.
+ _configurePages -background $itk_option(-background)
+}
+
+# ------------------------------------------------------------------
+# OPTIONS
+# ------------------------------------------------------------------
+# ------------------------------------------------------------------
+# OPTION -background
+#
+# Sets the bg color of all the pages in the Notebook.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Notebook::background {
+ if {$itk_option(-background) != {}} {
+ _configurePages -background $itk_option(-background)
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION -auto
+#
+# Determines whether pages are automatically unpacked and
+# packed when pages get selected.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Notebook::auto {
+ if {$itk_option(-auto) != {}} {
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION -scrollcommand
+#
+# Command string to be invoked when the notebook
+# has any changes to its current page, or number of pages.
+#
+# typically for scrollbars.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Notebook::scrollcommand {
+ if {$itk_option(-scrollcommand) != {}} {
+ _scrollCommand
+ }
+}
+
+# ------------------------------------------------------------------
+# METHOD: add add ?<option> <value>...?
+#
+# Creates a page and appends it to the list of pages.
+# processes pageconfigure for the page added.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Notebook::add { args } {
+ # The args list should be an even # of params, if not then
+ # prob missing value for last item in args list. Signal error.
+ set len [llength $args]
+ if {$len % 2} {
+ error "value for \"[lindex $args [expr {$len - 1}]]\" missing"
+ }
+
+ # add a Page component
+ set pathName [eval _createPage $args]
+ lappend _pages $pathName
+
+ # update scroller
+ _scrollCommand
+
+ # return childsite for the Page component
+ return [eval $pathName childsite]
+}
+
+# ------------------------------------------------------------------
+# METHOD: childsite ?<index>?
+#
+# If index is supplied, returns the child site widget corresponding
+# to the page index. If called with no arguments, returns a list
+# of all child sites
+# ------------------------------------------------------------------
+itcl::body iwidgets::Notebook::childsite { args } {
+ set len [llength $args]
+
+ switch $len {
+ 0 {
+ # ... called with no arguments, return a list
+ if { [llength $args] == 0 } {
+ return [_childSites]
+ }
+ }
+ 1 {
+ set index [lindex $args 0]
+ # ... otherwise, return child site for the index given
+ # empty notebook
+ if { $_pages == {} } {
+ error "can't get childsite,\
+ no pages in the notebook \"$itk_component(hull)\""
+ }
+
+ set index [_index $_pages $index $_currPage]
+
+ # index out of range
+ if { $index < 0 || $index >= [llength $_pages] } {
+ error "bad Notebook page index in childsite method:\
+ should be between 0 and [expr {[llength $_pages] - 1}]"
+ }
+
+ set pathName [lindex $_pages $index]
+
+ set cs [eval $pathName childsite]
+ return $cs
+ }
+ default {
+ # ... too many parameters passed
+ error "wrong # args: should be\
+ \"$itk_component(hull) childsite ?index?\""
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# METHOD: delete <index1> ?<index2>?
+#
+# Deletes a page or range of pages from the notebook
+# ------------------------------------------------------------------
+itcl::body iwidgets::Notebook::delete { args } {
+ # empty notebook
+ if { $_pages == {} } {
+ error "can't delete page, no pages in the notebook\
+ \"$itk_component(hull)\""
+ }
+
+ set len [llength $args]
+ switch -- $len {
+ 1 {
+ set fromPage [_index $_pages [lindex $args 0] $_currPage]
+
+ if { $fromPage < 0 || $fromPage >= [llength $_pages] } {
+ error "bad Notebook page index in delete method:\
+ should be between 0 and [expr {[llength $_pages] - 1}]"
+ }
+
+ set toPage $fromPage
+ _deletePages $fromPage $toPage
+ }
+
+ 2 {
+ set fromPage [_index $_pages [lindex $args 0] $_currPage]
+
+ if { $fromPage < 0 || $fromPage >= [llength $_pages] } {
+ error "bad Notebook page index1 in delete method:\
+ should be between 0 and [expr {[llength $_pages] - 1}]"
+ }
+
+ set toPage [_index $_pages [lindex $args 1] $_currPage]
+
+ if { $toPage < 0 || $toPage >= [llength $_pages] } {
+ error "bad Notebook page index2 in delete method:\
+ should be between 0 and [expr {[llength $_pages] - 1}]"
+ error "bad Notebook page index2"
+ }
+
+ if { $fromPage > $toPage } {
+ error "bad Notebook page index1 in delete method:\
+ index1 is greater than index2"
+ }
+
+ _deletePages $fromPage $toPage
+
+ }
+
+ default {
+ # ... too few/many parameters passed
+ error "wrong # args: should be\
+ \"$itk_component(hull) delete index1 ?index2?\""
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# METHOD: index <index>
+#
+# Given an index identifier returns the numeric index of the page
+# ------------------------------------------------------------------
+itcl::body iwidgets::Notebook::index { args } {
+ if { [llength $args] != 1 } {
+ error "wrong # args: should be\
+ \"$itk_component(hull) index index\""
+ }
+
+ set index $args
+
+ set number [_index $_pages $index $_currPage]
+
+ return $number
+}
+
+# ------------------------------------------------------------------
+# METHOD: insert <index> ?<option> <value>...?
+#
+# Inserts a page before a index. The before page may
+# be specified as a label or a page position.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Notebook::insert { args } {
+ # ... Error: no args passed
+ set len [llength $args]
+ if { $len == 0 } {
+ error "wrong # args: should be\
+ \"$itk_component(hull) insert index ?option value?\""
+ }
+
+ # ... set up index and args
+ set index [lindex $args 0]
+ set args [lrange $args 1 $len]
+
+ # ... Error: unmatched option value pair (len is odd)
+ # The args list should be an even # of params, if not then
+ # prob missing value for last item in args list. Signal error.
+ set len [llength $args]
+ if { $len % 2 } {
+ error "value for \"[lindex $args [expr {$len - 1}]]\" missing"
+ }
+
+ # ... Error: catch notebook empty
+ if { $_pages == {} } {
+ error "can't insert page, no pages in the notebook\
+ \"$itk_component(hull)\""
+ }
+
+ # ok, get the page
+ set page [_index $_pages $index $_currPage]
+
+ # ... Error: catch bad value for before page.
+ if { $page < 0 || $page >= [llength $_pages] } {
+ error "bad Notebook page index in insert method:\
+ should be between 0 and [expr {[llength $_pages] - 1}]"
+ }
+
+ # ... Start the business of inserting
+ # create the new page and get its path name...
+ set pathName [eval _createPage $args]
+
+ # grab the name of the page currently selected. (to keep in sync)
+ set currPathName [lindex $_pages $_currPage]
+
+ # insert pathName before $page
+ set _pages [linsert $_pages $page $pathName]
+
+ # keep the _currPage in sync with the insert.
+ set _currPage [lsearch -exact $_pages $currPathName]
+
+ # give scrollcommand chance to update
+ _scrollCommand
+
+ # give them child site back...
+ return [eval $pathName childsite]
+}
+
+# ------------------------------------------------------------------
+# METHOD: prev
+#
+# Selects the previous page. Wraps at first back to last page.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Notebook::prev { } {
+ # catch empty notebook
+ if { $_pages == {} } {
+ error "can't move to previous page,\
+ no pages in the notebook \"$itk_component(hull)\""
+ }
+
+ # bump to the previous page and wrap if necessary
+ set prev [expr {$_currPage - 1}]
+ if { $prev < 0 } {
+ set prev [expr {[llength $_pages] - 1}]
+ }
+
+ select $prev
+
+ return $prev
+}
+
+# ------------------------------------------------------------------
+# METHOD: next
+#
+# Selects the next page. Wraps at last back to first page.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Notebook::next { } {
+ # catch empty notebook
+ if { $_pages == {} } {
+ error "can't move to next page,\
+ no pages in the notebook \"$itk_component(hull)\""
+ }
+
+ # bump to the next page and wrap if necessary
+ set next [expr {$_currPage + 1}]
+ if { $next >= [llength $_pages] } {
+ set next 0
+ }
+
+ select $next
+
+ return $next
+}
+
+# ------------------------------------------------------------------
+# METHOD: pageconfigure <index> ?<option> <value>...?
+#
+# Performs configure on a given page denoted by index. Index may
+# be a page number or a pattern matching the label associated with
+# a page.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Notebook::pageconfigure { args } {
+ # ... Error: no args passed
+ set len [llength $args]
+ if { $len == 0 } {
+ error "wrong # args: should be\
+ \"$itk_component(hull) pageconfigure index ?option value?\""
+ }
+
+ # ... set up index and args
+ set index [lindex $args 0]
+ set args [lrange $args 1 $len]
+
+ set page [_index $_pages $index $_currPage]
+
+ # ... Error: page out of range
+ if { $page < 0 || $page >= [llength $_pages] } {
+ error "bad Notebook page index in pageconfigure method:\
+ should be between 0 and [expr {[llength $_pages] - 1}]"
+ }
+
+ # Configure the page component
+ set pathName [lindex $_pages $page]
+ return [eval $pathName configure $args]
+}
+
+# ------------------------------------------------------------------
+# METHOD: pagecget <index> <option>
+#
+# Performs cget on a given page denoted by index. Index may
+# be a page number or a pattern matching the label associated with
+# a page.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Notebook::pagecget { index option } {
+ set page [_index $_pages $index $_currPage]
+
+ # ... Error: page out of range
+ if { $page < 0 || $page >= [llength $_pages] } {
+ error "bad Notebook page index in pagecget method:\
+ should be between 0 and [expr {[llength $_pages] - 1}]"
+ }
+
+ # Get the page info.
+ set pathName [lindex $_pages $page]
+ return [$pathName cget $option]
+}
+
+# ------------------------------------------------------------------
+# METHOD: select <index>
+#
+# Select a page by index. Hide the last _currPage if it existed.
+# Then show the new one if it exists. Returns the currently
+# selected page or -1 if tried to do a select select when there is
+# no selection.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Notebook::select { index } {
+ global page$itk_component(hull)
+
+ # ... Error: empty notebook
+ if { $_pages == {} } {
+ error "can't select page $index,\
+ no pages in the notebook \"$itk_component(hull)\""
+ }
+
+ # if there is not current selection just ignore trying this selection
+ if { $index == "select" && $_currPage == -1 } {
+ return -1
+ }
+
+ set reqPage [_index $_pages $index $_currPage]
+
+ if { $reqPage < 0 || $reqPage >= [llength $_pages] } {
+ error "bad Notebook page index in select method:\
+ should be between 0 and [expr {[llength $_pages] - 1}]"
+ }
+
+ # if we already have this page selected, then ignore selection.
+ if { $reqPage == $_currPage } {
+ return $_currPage
+ }
+
+ # if we are handling packing and unpacking the unpack if we can
+ if { $itk_option(-auto) } {
+ # if there is a current page packed, then unpack it
+ if { $_currPage != -1 } {
+ set currPathName [lindex $_pages $_currPage]
+ pack forget $currPathName
+ }
+ }
+
+ # set this now so that the -command cmd can do an 'index select'
+ # to operate on this page.
+ set _currPage $reqPage
+
+ # invoke the command for this page
+ set cmd [lindex [pageconfigure $index -command] 4]
+ eval $cmd
+
+ # give scrollcommand chance to update
+ _scrollCommand
+
+ # if we are handling packing and unpacking the pack if we can
+ if { $itk_option(-auto) } {
+ set reqPathName [lindex $_pages $reqPage]
+ pack $reqPathName -anchor nw -fill both -expand yes
+ }
+
+ return $_currPage
+}
+
+
+# ------------------------------------------------------------------
+# METHOD: view
+#
+# Return the current page
+#
+# view <index>
+#
+# Selects the page denoted by index to be current page
+#
+# view 'moveto' <fraction>
+#
+# Selects the page by using fraction amount
+#
+# view 'scroll' <num> <what>
+#
+# Selects the page by using num as indicator of next or previous
+# ------------------------------------------------------------------
+itcl::body iwidgets::Notebook::view { args } {
+ set len [llength $args]
+ switch -- $len {
+ 0 {
+ # Return current page
+ return $_currPage
+ }
+ 1 {
+ # Select by index
+ select [lindex $args 0]
+ }
+ 2 {
+ # Select using moveto
+ set arg [lindex $args 0]
+ if { $arg == "moveto" } {
+ set fraction [lindex $args 1]
+ if { [catch { set page \
+ [expr {round($fraction/(1.0/[llength $_pages]))}]}]} {
+ error "expected floating-point number \
+ but got \"$fraction\""
+ }
+ if { $page == [llength $_pages] } {
+ incr page -1
+ }
+
+ if { $page >= 0 && $page < [llength $_pages] } {
+ select $page
+ }
+ } else {
+ error "expected \"moveto\" but got $arg"
+ }
+ }
+ 3 {
+ # Select using scroll keyword
+ set arg [lindex $args 0]
+ if { $arg == "scroll" } {
+ set amount [lindex $args 1]
+ # check for integer value
+ if { ! [regexp {^[-]*[0-9]*$} $amount] } {
+ error "expected integer but got \"$amount\""
+ }
+ set page [expr {$_currPage + $amount}]
+ if { $page >= 0 && $page < [llength $_pages] } {
+ select $page
+ }
+
+ } else {
+ error "expected \"scroll\" but got $arg"
+ }
+ }
+ default {
+ set arg [lindex $args 0]
+ if { $arg == "moveto" } {
+ error "wrong # args: should be\
+ \"$itk_component(hull) view moveto fraction\""
+ } elseif { $arg == "scroll" } {
+ error "wrong # args: should be\
+ \"$itk_component(hull) view scroll units|pages\""
+ } else {
+ error "wrong # args: should be\
+ \"$itk_component(hull) view index\""
+ }
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _childSites
+#
+# Returns a list of child sites for all pages in the notebook.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Notebook::_childSites { } {
+ # empty notebook
+ if { $_pages == {} } {
+ error "can't get childsite list,\
+ no pages in the notebook \"$itk_component(hull)\""
+ }
+
+ set csList {}
+
+ foreach pathName $_pages {
+ lappend csList [eval $pathName childsite]
+ }
+
+ return $csList
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _scrollCommand
+#
+# If there is a -scrollcommand set up, then call the tcl command
+# and suffix onto it the standard 4 numbers scrollbars get.
+#
+# Invoke the scrollcommand, this is like the y/xscrollcommand
+# it is designed to talk to scrollbars and the the
+# tabset also knows how to obey scrollbar protocol.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Notebook::_scrollCommand { } {
+ if { $itk_option(-scrollcommand) != {} } {
+ if { $_currPage != -1 } {
+ set relTop [expr {($_currPage*1.0) / [llength $_pages]}]
+ set relBottom [expr {(($_currPage+1)*1.0) / [llength $_pages]}]
+ set scrollCommand "$itk_option(-scrollcommand) $relTop $relBottom"
+ } else {
+ set scrollCommand "$itk_option(-scrollcommand) 0 1"
+ }
+ uplevel #0 $scrollCommand
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _index
+#
+# pathList : list of path names to search thru if index is a label
+# index : either number, 'select', 'end', or pattern
+# select : current selection
+#
+# _index takes takes the value $index converts it to
+# a numeric identifier. If the value is not already
+# an integer it looks it up in the $pathList array.
+# If it fails it returns -1
+# ------------------------------------------------------------------
+itcl::body iwidgets::Notebook::_index { pathList index select} {
+ switch -- $index {
+ select {
+ set number $select
+ }
+ end {
+ set number [expr {[llength $pathList] -1}]
+ }
+ default {
+ # is it a number already?
+ if { [regexp {^[0-9]+$} $index] } {
+ set number $index
+ if { $number < 0 || $number >= [llength $pathList] } {
+ set number -1
+ }
+
+ # otherwise it is a label
+ } else {
+ # look thru the pathList of pathNames and
+ # get each label and compare with index.
+ # if we get a match then set number to postion in $pathList
+ # and break out.
+ # otherwise number is still -1
+ set i 0
+ set number -1
+ foreach pathName $pathList {
+ set label [lindex [$pathName configure -label] 4]
+ if { [string match $label $index] } {
+ set number $i
+ break
+ }
+ incr i
+ }
+ }
+ }
+ }
+
+ return $number
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _createPage
+#
+# Creates a page, using unique page naming, propagates background
+# and keeps unique id up to date.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Notebook::_createPage { args } {
+ #
+ # create an internal name for the page: .n.cs.page0, .n.cs.page1, etc.
+ #
+ set pathName $itk_component(cs).page$_uniqueID
+
+ eval iwidgets::Page $pathName -background $itk_option(-background) $args
+
+ incr _uniqueID
+ return $pathName
+
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _deletePages
+#
+# Deletes pages from $fromPage to $toPage.
+#
+# Operates in two passes, destroys all the widgets
+# Then removes the pathName from the page list
+#
+# Also keeps the current selection in bounds.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Notebook::_deletePages { fromPage toPage } {
+ for { set page $fromPage } { $page <= $toPage } { incr page } {
+ # kill the widget
+ set pathName [lindex $_pages $page]
+ destroy $pathName
+ }
+
+ # physically remove the page
+ set _pages [lreplace $_pages $fromPage $toPage]
+
+ # If we deleted a selected page set our selection to none
+ if { $_currPage >= $fromPage && $_currPage <= $toPage } {
+ set _currPage -1
+ }
+
+ # make sure _currPage stays in sync with new numbering...
+ if { $_pages == {} } {
+ # if deleted only remaining page,
+ # reset current page to undefined
+ set _currPage -1
+
+ # or if the current page was the last page, it needs come back
+ } elseif { $_currPage >= [llength $_pages] } {
+ incr _currPage -1
+ if { $_currPage < 0 } {
+ # but only to zero
+ set _currPage 0
+ }
+ }
+
+ # give scrollcommand chance to update
+ _scrollCommand
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _configurePages
+#
+# Does the pageconfigure method on each page in the notebook
+# ------------------------------------------------------------------
+itcl::body iwidgets::Notebook::_configurePages { args } {
+ # make sure we have pages
+ if { [catch {set _pages}] } {
+ return
+ }
+
+ # go thru all pages and pageconfigure them.
+ foreach pathName $_pages {
+ eval "$pathName configure $args"
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _tabCommand
+#
+# Calls the command that was passed in through the
+# $itk_option(-tabcommand) argument.
+#
+# This method is up for debate... do we need the -tabcommand option?
+# ------------------------------------------------------------------
+itcl::body iwidgets::Notebook::_tabCommand { } {
+ global page$itk_component(hull)
+
+ if { $itk_option(-tabcommand) != {} } {
+ set newTabCmdStr $itk_option(-tabcommand)
+ lappend newTabCmdStr [set page$itk_component(hull)]
+
+ #eval $newTabCmdStr
+ uplevel #0 $newTabCmdStr
+ }
+}
+
+#
+# Page widget
+# ------------------------------------------------------------------
+#
+# The Page command creates a new window (given by the pathName argument)
+# and makes it into a Page widget. Additional options, described above
+# may be specified on the com mand line or in the option database to
+# configure aspects of the Page such as its back ground, cursor, and
+# geometry. The Page command returns its pathName argument. At the time
+# this command is invoked, there must not exist a window named pathName,
+# but path Name's parent must exist.
+#
+# A Page is a frame that holds a child site. It is nothing more than a
+# frame widget with some intelligence built in. Its primary purpose is
+# to support the Notebook's concept of a page. It allows another widget
+# like the Notebook to treat a page as a single object. The Page has an
+# associated label and knows how to return its child site.
+#
+# ------------------------------------------------------------------
+# AUTHOR: Bill W. Scott EMAIL: bscott@spd.dsccc.com
+#
+# ------------------------------------------------------------------
+# Copyright (c) 1995 DSC Communications Corp.
+# ======================================================================
+# Permission is hereby granted, without written agreement and without
+# license or royalty fees, to use, copy, modify, and distribute this
+# software and its documentation for any purpose, provided that the
+# above copyright notice and the following two paragraphs appear in
+# all copies of this software.
+#
+# IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+# DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+# ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+# IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+# DAMAGE.
+#
+# THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+# BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+# FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+# ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+# PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+# ======================================================================
+#
+# Option database default resources:
+#
+option add *Page.disabledForeground #a3a3a3 widgetDefault
+option add *Page.label {} widgetDefault
+option add *Page.command {} widgetDefault
+
+itcl::class iwidgets::Page {
+ inherit itk::Widget
+
+ constructor {args} {}
+
+ itk_option define \
+ -disabledforeground disabledForeground DisabledForeground #a3a3a3
+ itk_option define -label label Label {}
+ itk_option define -command command Command {}
+
+ public method childsite { }
+}
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Page::constructor {args} {
+ #
+ # Create the outermost frame to maintain geometry.
+ #
+ itk_component add cs {
+ frame $itk_interior.cs
+ } {
+ keep -cursor -background -width -height
+ }
+ pack $itk_component(cs) -fill both -expand yes
+ pack propagate $itk_component(cs) no
+
+ eval itk_initialize $args
+}
+
+# ------------------------------------------------------------------
+# OPTIONS
+# ------------------------------------------------------------------
+# ------------------------------------------------------------------
+# OPTION -disabledforeground
+#
+# Sets the disabledForeground color of this page
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Page::disabledforeground {
+}
+
+# ------------------------------------------------------------------
+# OPTION -label
+#
+# Sets the label of this page. The label is a string identifier
+# for this page.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Page::label {
+}
+
+# ------------------------------------------------------------------
+# OPTION -command
+#
+# The Tcl Command to associate with this page.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Page::command {
+}
+
+# ------------------------------------------------------------------
+# METHODS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# METHOD: childsite
+#
+# Returns the child site widget of this page
+# ------------------------------------------------------------------
+itcl::body iwidgets::Page::childsite { } {
+ return $itk_component(cs)
+}
+
diff --git a/iwidgets/generic/optionmenu.itk b/iwidgets/generic/optionmenu.itk
new file mode 100644
index 00000000000..ddb3995fd41
--- /dev/null
+++ b/iwidgets/generic/optionmenu.itk
@@ -0,0 +1,664 @@
+#
+# Optionmenu
+# ----------------------------------------------------------------------
+# Implements an option menu widget with options to manage it.
+# An option menu displays a frame containing a label and a button.
+# A pop-up menu will allow for the value of the button to change.
+#
+# ----------------------------------------------------------------------
+# AUTHOR: Alfredo Jahn Phone: (214) 519-3545
+# Email: ajahn@spd.dsccc.com
+# alfredo@wn.com
+#
+# @(#) $Id$
+# ----------------------------------------------------------------------
+# Copyright (c) 1995 DSC Technologies Corporation
+# ======================================================================
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+
+#
+# Default resources.
+#
+
+option add *Optionmenu.highlightThickness 1 widgetDefault
+option add *Optionmenu.borderWidth 2 widgetDefault
+option add *Optionmenu.labelPos w widgetDefault
+option add *Optionmenu.labelMargin 2 widgetDefault
+option add *Optionmenu.popupCursor arrow widgetDefault
+
+#
+# Usual options.
+#
+itk::usual Optionmenu {
+ keep -activebackground -activeborderwidth -activeforeground \
+ -background -borderwidth -cursor -disabledforeground -font \
+ -foreground -highlightcolor -highlightthickness -labelfont \
+ -popupcursor
+}
+
+# ------------------------------------------------------------------
+# OPTONMENU
+# ------------------------------------------------------------------
+itcl::class iwidgets::Optionmenu {
+ inherit iwidgets::Labeledwidget
+
+ constructor {args} {}
+ destructor {}
+
+ itk_option define -clicktime clickTime ClickTime 150
+ itk_option define -command command Command {}
+ itk_option define -cyclicon cyclicOn CyclicOn true
+ itk_option define -width width Width 0
+ itk_option define -font font Font -Adobe-Helvetica-Bold-R-Normal--*-120-*
+ itk_option define -borderwidth borderWidth BorderWidth 2
+ itk_option define -highlightthickness highlightThickness HighlightThickness 1
+ itk_option define -state state State normal
+
+ public {
+ method index {index}
+ method delete {first {last {}}}
+ method disable {index}
+ method enable {args}
+ method get {{first "current"} {last ""}}
+ method insert {index string args}
+ method popupMenu {args}
+ method select {index}
+ method sort {{mode "increasing"}}
+ }
+
+ protected {
+ variable _calcSize "" ;# non-null => _calcSize pending
+ }
+
+ private {
+ method _buttonRelease {time}
+ method _getNextItem {index}
+ method _next {}
+ method _postMenu {time}
+ method _previous {}
+ method _setItem {item}
+ method _setSize {{when later}}
+ method _setitems {items} ;# Set the list of menu entries
+
+ variable _postTime 0
+ variable _items {} ;# List of popup menu entries
+ variable _numitems 0 ;# List of popup menu entries
+
+ variable _currentItem "" ;# Active menu selection
+ }
+}
+
+#
+# Provide a lowercased access method for the Optionmenu class.
+#
+proc ::iwidgets::optionmenu {pathName args} {
+ uplevel ::iwidgets::Optionmenu $pathName $args
+}
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Optionmenu::constructor {args} {
+ global tcl_platform
+
+ component hull configure -highlightthickness 0
+
+ itk_component add menuBtn {
+ menubutton $itk_interior.menuBtn -relief raised -indicatoron on \
+ -textvariable [itcl::scope _currentItem] -takefocus 1 \
+ -menu $itk_interior.menuBtn.menu
+ } {
+ usual
+ keep -borderwidth
+ if {$tcl_platform(platform) != "unix"} {
+ ignore -activebackground -activeforeground
+ }
+ }
+ pack $itk_interior.menuBtn -fill x
+ pack propagate $itk_interior no
+
+ itk_component add popupMenu {
+ menu $itk_interior.menuBtn.menu -tearoff no
+ } {
+ usual
+ ignore -tearoff
+ keep -activeborderwidth -borderwidth
+ rename -cursor -popupcursor popupCursor Cursor
+ }
+
+ #
+ # Bind to button release for all components.
+ #
+ bind $itk_component(menuBtn) <ButtonPress-1> \
+ "[itcl::code $this _postMenu %t]; break"
+ bind $itk_component(menuBtn) <KeyPress-space> \
+ "[itcl::code $this _postMenu %t]; break"
+ bind $itk_component(popupMenu) <ButtonRelease-1> \
+ [itcl::code $this _buttonRelease %t]
+
+ #
+ # Initialize the widget based on the command line options.
+ #
+ eval itk_initialize $args
+}
+
+# ------------------------------------------------------------------
+# DESTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Optionmenu::destructor {} {
+ if {$_calcSize != ""} {after cancel $_calcSize}
+}
+
+# ------------------------------------------------------------------
+# OPTIONS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# OPTION -clicktime
+#
+# Interval time (in msec) used to determine that a single mouse
+# click has occurred. Used to post menu on a quick mouse click.
+# **WARNING** changing this value may cause the sigle-click
+# functionality to not work properly!
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Optionmenu::clicktime {}
+
+# ------------------------------------------------------------------
+# OPTION -command
+#
+# Specifies a command to be evaluated upon change in option menu.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Optionmenu::command {}
+
+# ------------------------------------------------------------------
+# OPTION -cyclicon
+#
+# Turns on/off the 3rd mouse button capability. This feature
+# allows the right mouse button to cycle through the popup
+# menu list without poping it up. <shift>M3 cycles through
+# the menu in reverse order.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Optionmenu::cyclicon {
+ if {$itk_option(-cyclicon)} {
+ bind $itk_component(menuBtn) <3> [itcl::code $this _next]
+ bind $itk_component(menuBtn) <Shift-3> [itcl::code $this _previous]
+ bind $itk_component(menuBtn) <KeyPress-Down> [itcl::code $this _next]
+ bind $itk_component(menuBtn) <KeyPress-Up> [itcl::code $this _previous]
+ } else {
+ bind $itk_component(menuBtn) <3> break
+ bind $itk_component(menuBtn) <Shift-3> break
+ bind $itk_component(menuBtn) <KeyPress-Down> break
+ bind $itk_component(menuBtn) <KeyPress-Up> break
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION -width
+#
+# Allows the menu label width to be set to a fixed size
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Optionmenu::width {
+ _setSize
+}
+
+# ------------------------------------------------------------------
+# OPTION -font
+#
+# Change all fonts for this widget. Also re-calculate height based
+# on font size (used to line up menu items over menu button label).
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Optionmenu::font {
+ _setSize
+}
+
+# ------------------------------------------------------------------
+# OPTION -borderwidth
+#
+# Change borderwidth for this widget. Also re-calculate height based
+# on font size (used to line up menu items over menu button label).
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Optionmenu::borderwidth {
+ _setSize
+}
+
+# ------------------------------------------------------------------
+# OPTION -highlightthickness
+#
+# Change highlightthickness for this widget. Also re-calculate
+# height based on font size (used to line up menu items over
+# menu button label).
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Optionmenu::highlightthickness {
+ _setSize
+}
+
+# ------------------------------------------------------------------
+# OPTION -state
+#
+# Specified one of two states for the Optionmenu: normal, or
+# disabled. If the Optionmenu is disabled, then option menu
+# selection is ignored.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Optionmenu::state {
+ switch $itk_option(-state) {
+ normal {
+ $itk_component(menuBtn) config -state normal
+ $itk_component(label) config -fg $itk_option(-foreground)
+ }
+ disabled {
+ $itk_component(menuBtn) config -state disabled
+ $itk_component(label) config -fg $itk_option(-disabledforeground)
+ }
+ default {
+ error "bad state option \"$itk_option(-state)\":\
+ should be disabled or normal"
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# METHODS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# METHOD: index index
+#
+# Return the numerical index corresponding to index.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Optionmenu::index {index} {
+
+ if {[regexp {(^[0-9]+$)} $index]} {
+ set idx [$itk_component(popupMenu) index $index]
+
+ if {$idx == "none"} {
+ return 0
+ }
+ return [expr {$index > $idx ? $_numitems : $idx}]
+
+ } elseif {$index == "end"} {
+ return [expr {$_numitems - 1}]
+
+ } elseif {$index == "select"} {
+ return [lsearch $_items $_currentItem]
+
+ }
+
+ set numValue [lsearch -glob $_items $index]
+
+ if {$numValue == -1} {
+ error "bad Optionmenu index \"$index\""
+ }
+ return $numValue
+}
+
+# ------------------------------------------------------------------
+# METHOD: delete first ?last?
+#
+# Remove an item (or range of items) from the popup menu.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Optionmenu::delete {first {last {}}} {
+
+ set first [index $first]
+ set last [expr {$last != {} ? [index $last] : $first}]
+ set nextAvail $_currentItem
+
+ #
+ # If current item is in delete range point to next available.
+ #
+ if {$_numitems > 1 &&
+ ([lsearch -exact [lrange $_items $first $last] [get]] != -1)} {
+ set nextAvail [_getNextItem $last]
+ }
+
+ _setitems [lreplace $_items $first $last]
+
+ #
+ # Make sure "nextAvail" is still in the list.
+ #
+ set index [lsearch -exact $_items $nextAvail]
+ _setItem [expr {$index != -1 ? $nextAvail : ""}]
+}
+
+# ------------------------------------------------------------------
+# METHOD: disable index
+#
+# Disable a menu item in the option menu. This will prevent the user
+# from being able to select this item from the menu. This only effects
+# the state of the item in the menu, in other words, should the item
+# be the currently selected item, the user is responsible for
+# determining this condition and taking appropriate action.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Optionmenu::disable {index} {
+ set index [index $index]
+ $itk_component(popupMenu) entryconfigure $index -state disabled
+}
+
+# ------------------------------------------------------------------
+# METHOD: enable index
+#
+# Enable a menu item in the option menu. This will allow the user
+# to select this item from the menu.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Optionmenu::enable {index} {
+ set index [index $index]
+ $itk_component(popupMenu) entryconfigure $index -state normal
+}
+
+# ------------------------------------------------------------------
+# METHOD: get
+#
+# Returns the current menu item.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Optionmenu::get {{first "current"} {last ""}} {
+ if {"current" == $first} {
+ return $_currentItem
+ }
+
+ set first [index $first]
+ if {"" == $last} {
+ return [$itk_component(popupMenu) entrycget $first -label]
+ }
+
+ if {"end" == $last} {
+ set last [$itk_component(popupMenu) index end]
+ } else {
+ set last [index $last]
+ }
+ set rval ""
+ while {$first <= $last} {
+ lappend rval [$itk_component(popupMenu) entrycget $first -label]
+ incr first
+ }
+ return $rval
+}
+
+# ------------------------------------------------------------------
+# METHOD: insert index string ?string?
+#
+# Insert an item in the popup menu.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Optionmenu::insert {index string args} {
+ if {$index == "end"} {
+ set index $_numitems
+ } else {
+ set index [index $index]
+ }
+ set args [linsert $args 0 $string]
+ _setitems [eval linsert {$_items} $index $args]
+ return ""
+}
+
+# ------------------------------------------------------------------
+# METHOD: select index
+#
+# Select an item from the popup menu to display on the menu label
+# button.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Optionmenu::select {index} {
+ set index [index $index]
+ if {$index > ($_numitems - 1)} {
+ incr index -1
+ }
+ _setItem [lindex $_items $index]
+}
+
+# ------------------------------------------------------------------
+# METHOD: popupMenu
+#
+# Evaluates the specified args against the popup menu component
+# and returns the result.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Optionmenu::popupMenu {args} {
+ return [eval $itk_component(popupMenu) $args]
+}
+
+# ------------------------------------------------------------------
+# METHOD: sort mode
+#
+# Sort the current menu in either "ascending" or "descending" order.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Optionmenu::sort {{mode "increasing"}} {
+ switch $mode {
+ ascending -
+ increasing {
+ _setitems [lsort -increasing $_items]
+ }
+ descending -
+ decreasing {
+ _setitems [lsort -decreasing $_items]
+ }
+ default {
+ error "bad sort argument \"$mode\": should be ascending,\
+ descending, increasing, or decreasing"
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _buttonRelease
+#
+# Display the popup menu. Menu position is calculated.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Optionmenu::_buttonRelease {time} {
+ if {(abs([expr $_postTime - $time])) <= $itk_option(-clicktime)} {
+ return -code break
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _getNextItem index
+#
+# Allows either a string or index number to be passed in, and returns
+# the next item in the list in string format. Wrap around is automatic.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Optionmenu::_getNextItem {index} {
+
+ if {[incr index] >= $_numitems} {
+ set index 0 ;# wrap around
+ }
+ return [lindex $_items $index]
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _next
+#
+# Sets the current option label to next item in list if that item is
+# not disbaled.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Optionmenu::_next {} {
+ if {$itk_option(-state) != "normal"} {
+ return
+ }
+ set i [lsearch -exact $_items $_currentItem]
+
+ for {set cnt 0} {$cnt < $_numitems} {incr cnt} {
+
+ if {[incr i] >= $_numitems} {
+ set i 0
+ }
+
+ if {[$itk_component(popupMenu) entrycget $i -state] != "disabled"} {
+ _setItem [lindex $_items $i]
+ break
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _previous
+#
+# Sets the current option label to previous item in list if that
+# item is not disbaled.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Optionmenu::_previous {} {
+ if {$itk_option(-state) != "normal"} {
+ return
+ }
+
+ set i [lsearch -exact $_items $_currentItem]
+
+ for {set cnt 0} {$cnt < $_numitems} {incr cnt} {
+ set i [expr {$i - 1}]
+
+ if {$i < 0} {
+ set i [expr {$_numitems - 1}]
+ }
+
+ if {[$itk_component(popupMenu) entrycget $i -state] != "disabled"} {
+ _setItem [lindex $_items $i]
+ break
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _postMenu time
+#
+# Display the popup menu. Menu position is calculated.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Optionmenu::_postMenu {time} {
+ #
+ # Don't bother to post if menu is empty.
+ #
+ if {[llength $_items] > 0 && $itk_option(-state) == "normal"} {
+ set _postTime $time
+ set itemIndex [lsearch -exact $_items $_currentItem]
+
+ set margin [expr {$itk_option(-borderwidth) \
+ + $itk_option(-highlightthickness)}]
+
+ set x [expr {[winfo rootx $itk_component(menuBtn)] + $margin}]
+ set y [expr {[winfo rooty $itk_component(menuBtn)] \
+ - [$itk_component(popupMenu) yposition $itemIndex] + $margin}]
+
+ tk_popup $itk_component(popupMenu) $x $y
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _setItem
+#
+# Set the menu button label to item, then dismiss the popup menu.
+# Also check if item has been changed. If so, also call user-supplied
+# command.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Optionmenu::_setItem {item} {
+ if {$_currentItem != $item} {
+ set _currentItem $item
+ if {[winfo ismapped $itk_component(hull)]} {
+ uplevel #0 $itk_option(-command)
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _setitems items
+#
+# Create a list of items available on the menu. Used to create the
+# popup menu.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Optionmenu::_setitems {items_} {
+
+ #
+ # Delete the old menu entries, and set the new list of
+ # menu entries to those specified in "items_".
+ #
+ $itk_component(popupMenu) delete 0 last
+ set _items ""
+ set _numitems [llength $items_]
+
+ #
+ # Clear the menu button label.
+ #
+ if {$_numitems == 0} {
+ _setItem ""
+ return
+ }
+
+ set savedCurrentItem $_currentItem
+
+ foreach opt $items_ {
+ lappend _items $opt
+ $itk_component(popupMenu) add command -label $opt \
+ -command [itcl::code $this _setItem $opt]
+ }
+ set first [lindex $_items 0]
+
+ #
+ # Make sure "savedCurrentItem" is still in the list.
+ #
+ if {$first != ""} {
+ set i [lsearch -exact $_items $savedCurrentItem]
+ #-------------------------------------------------------------
+ # BEGIN BUG FIX: csmith (Chad Smith: csmith@adc.com), 11/18/99
+ #-------------------------------------------------------------
+ # The previous code fragment:
+ # <select [expr {$i != -1 ? $savedCurrentItem : $first}]>
+ # is faulty because of exponential numbers. For example,
+ # 2e-4 is numerically equal to 2e-04, but the string representation
+ # is of course different. As a result, the select invocation
+ # fails, and an error message is printed.
+ #-------------------------------------------------------------
+ if {$i != -1} {
+ select $savedCurrentItem
+ } else {
+ select $first
+ }
+ #-------------------------------------------------------------
+ # END BUG FIX
+ #-------------------------------------------------------------
+ } else {
+ _setItem ""
+ }
+
+ _setSize
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _setSize ?when?
+#
+# Set the size of the option menu. If "when" is "now", the change
+# is applied immediately. If it is "later" or it is not specified,
+# then the change is applied later, when the application is idle.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Optionmenu::_setSize {{when later}} {
+
+ if {$when == "later"} {
+ if {$_calcSize == ""} {
+ set _calcSize [after idle [itcl::code $this _setSize now]]
+ }
+ return
+ }
+
+ set margin [expr {2*($itk_option(-borderwidth) \
+ + $itk_option(-highlightthickness))}]
+
+ if {"0" != $itk_option(-width)} {
+ set width $itk_option(-width)
+ } else {
+ set width [expr {[winfo reqwidth $itk_component(popupMenu)]+$margin+20}]
+ }
+ set height [winfo reqheight $itk_component(menuBtn)]
+ $itk_component(lwchildsite) configure -width $width -height $height
+
+ set _calcSize ""
+}
diff --git a/iwidgets/generic/pane.itk b/iwidgets/generic/pane.itk
new file mode 100644
index 00000000000..fe93a1c08c1
--- /dev/null
+++ b/iwidgets/generic/pane.itk
@@ -0,0 +1,128 @@
+#
+# Paned
+# ----------------------------------------------------------------------
+# Implements a pane for a paned window widget. The pane is itself a
+# frame with a child site for other widgets. The pane class performs
+# basic option management.
+#
+# ----------------------------------------------------------------------
+# AUTHOR: Mark L. Ulferts EMAIL: mulferts@austin.dsccc.com
+#
+# @(#) $Id$
+# ----------------------------------------------------------------------
+# Copyright (c) 1995 DSC Technologies Corporation
+# ======================================================================
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+
+#
+# Usual options.
+#
+itk::usual Pane {
+ keep -background -cursor
+}
+
+# ------------------------------------------------------------------
+# PANE
+# ------------------------------------------------------------------
+itcl::class iwidgets::Pane {
+ inherit itk::Widget
+
+ constructor {args} {}
+
+ itk_option define -minimum minimum Minimum 10
+ itk_option define -margin margin Margin 8
+
+ public method childSite {} {}
+}
+
+#
+# Provide a lowercased access method for the Pane class.
+#
+proc ::iwidgets::pane {pathName args} {
+ uplevel ::iwidgets::Pane $pathName $args
+}
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Pane::constructor {args} {
+ #
+ # Create the pane childsite.
+ #
+ itk_component add childsite {
+ frame $itk_interior.childsite
+ } {
+ keep -background -cursor
+ }
+ pack $itk_component(childsite) -fill both -expand yes
+
+ #
+ # Set the itk_interior variable to be the childsite for derived
+ # classes.
+ #
+ set itk_interior $itk_component(childsite)
+
+ eval itk_initialize $args
+}
+
+# ------------------------------------------------------------------
+# OPTIONS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# OPTION: -minimum
+#
+# Specifies the minimum size that the pane may reach.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Pane::minimum {
+ set pixels \
+ [winfo pixels $itk_component(hull) $itk_option(-minimum)]
+
+ set itk_option(-minimum) $pixels
+}
+
+# ------------------------------------------------------------------
+# OPTION: -margin
+#
+# Specifies the border distance between the pane and pane contents.
+# This is done by setting the borderwidth of the pane to the margin.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Pane::margin {
+ set pixels [winfo pixels $itk_component(hull) $itk_option(-margin)]
+ set itk_option(-margin) $pixels
+
+ $itk_component(childsite) configure \
+ -borderwidth $itk_option(-margin)
+}
+
+# ------------------------------------------------------------------
+# METHODS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# METHOD: childSite
+#
+# Return the pane child site path name.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Pane::childSite {} {
+ return $itk_component(childsite)
+}
diff --git a/iwidgets/generic/panedwindow.itk b/iwidgets/generic/panedwindow.itk
new file mode 100644
index 00000000000..180ead43a24
--- /dev/null
+++ b/iwidgets/generic/panedwindow.itk
@@ -0,0 +1,942 @@
+#
+# Panedwindow
+# ----------------------------------------------------------------------
+# Implements a multiple paned window widget capable of orienting the panes
+# either vertically or horizontally. Each pane is itself a frame acting
+# as a child site for other widgets. The border separating each pane
+# contains a sash which allows user positioning of the panes relative to
+# one another.
+#
+# ----------------------------------------------------------------------
+# AUTHOR: Mark L. Ulferts EMAIL: mulferts@austin.dsccc.com
+#
+# @(#) $Id$
+# ----------------------------------------------------------------------
+# Copyright (c) 1995 DSC Technologies Corporation
+# ======================================================================
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+
+#
+# Usual options.
+#
+itk::usual Panedwindow {
+ keep -background -cursor -sashcursor
+}
+
+# ------------------------------------------------------------------
+# PANEDWINDOW
+# ------------------------------------------------------------------
+itcl::class iwidgets::Panedwindow {
+ inherit itk::Widget
+
+ constructor {args} {}
+
+ itk_option define -orient orient Orient horizontal
+ itk_option define -sashborderwidth sashBorderWidth SashBorderWidth 2
+ itk_option define -sashcursor sashCursor SashCursor crosshair
+ itk_option define -sashwidth sashWidth SashWidth 10
+ itk_option define -sashheight sashHeight SashHeight 10
+ itk_option define -thickness thickness Thickness 3
+ itk_option define -sashindent sashIndent SashIndent -10
+ itk_option define -showhandle showHandle ShowHandle 1
+
+ public method index {index}
+ public method childsite {args}
+ public method fraction {args}
+ public method add {tag args}
+ public method insert {index tag args}
+ public method delete {index}
+ public method hide {index}
+ public method show {index}
+ public method paneconfigure {index args}
+ public method reset {}
+
+ protected method _pwConfigureEventHandler {width height}
+ protected method _startGrip {where num}
+ protected method _endGrip {where num}
+ protected method _configGrip {where num}
+ protected method _handleGrip {where num}
+ protected method _moveSash {where num}
+
+ private method _setFracArray {}
+ private method _setActivePanes {}
+ private method _calcFraction {where num}
+ private method _makeSashes {}
+ private method _placeSash {i}
+ private method _placePanes {{start 0} {end end}}
+
+ private variable _initialized 0 ;# Denotes initialized state.
+ private variable _panes {} ;# List of panes.
+ private variable _activePanes {} ;# List of active panes.
+ private variable _sashes {} ;# List of sashes.
+ private variable _separators {} ;# List of separators.
+ private variable _frac ;# Array of fraction percentages.
+ private variable _lowerlimit ;# Margin distance above/left of sash.
+ private variable _upperlimit ;# Margin distance below/right of sash.
+ private variable _dimension ;# Width/Height at start of drag.
+ private variable _sashloc ;# Array of dist of sash from above/left.
+ private variable _pixels ;# Array of dist of sash from above/left.
+ private variable _minheight ;# Array of min heights for panes.
+ private variable _minsashmoved ;# Lowest sash moved during dragging.
+ private variable _maxsashmoved ;# Highest sash moved during dragging.
+ private variable _dragging 0 ;# Boolean for dragging enabled.
+ private variable _movecount 0 ;# Kludge counter to get sashes to
+ ;# display without calling update
+ ;# idletasks too often.
+ private variable _width 0 ;# hull's width.
+ private variable _height 0 ;# hull's height.
+ private variable _unique -1 ;# Unique number for pane names.
+
+ private variable _relief ;# relief for -showhandle
+}
+
+#
+# Provide a lowercased access method for the Panedwindow class.
+#
+proc ::iwidgets::panedwindow {pathName args} {
+ uplevel ::iwidgets::Panedwindow $pathName $args
+}
+
+#
+# Use option database to override default resources of base classes.
+#
+option add *Panedwindow.width 10 widgetDefault
+option add *Panedwindow.height 10 widgetDefault
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Panedwindow::constructor {args} {
+ itk_option add hull.width hull.height
+
+ pack propagate $itk_component(hull) no
+
+ #
+ # Add binding for the configure event.
+ #
+ bind pw-config-$this <Configure> [itcl::code $this _pwConfigureEventHandler %w %h]
+ bindtags $itk_component(hull) \
+ [linsert [bindtags $itk_component(hull)] 0 pw-config-$this]
+
+ array set _relief {0 sunken 1 raised}
+
+ eval itk_initialize $args
+}
+
+# ------------------------------------------------------------------
+# OPTIONS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# OPTION: -orient
+#
+# Specifies the orientation of the sashes. Once the paned window
+# has been mapped, set the sash bindings and place the panes.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Panedwindow::orient {
+ if {$_initialized} {
+ switch $itk_option(-orient) {
+ vertical {
+ for {set i 1} {$i < [llength $_activePanes]} {incr i} {
+ bind $itk_component(sash$i) <Button-1> \
+ [itcl::code $this _startGrip %x $i]
+ bind $itk_component(sash$i) <B1-Motion> \
+ [itcl::code $this _handleGrip %x $i]
+ bind $itk_component(sash$i) <B1-ButtonRelease-1> \
+ [itcl::code $this _endGrip %x $i]
+ bind $itk_component(sash$i) <Configure> \
+ [itcl::code $this _configGrip %x $i]
+ }
+
+ _setFracArray
+ _makeSashes
+ _placePanes
+ }
+
+ horizontal {
+ for {set i 1} {$i < [llength $_activePanes]} {incr i} {
+ bind $itk_component(sash$i) <Button-1> \
+ [itcl::code $this _startGrip %y $i]
+ bind $itk_component(sash$i) <B1-Motion> \
+ [itcl::code $this _handleGrip %y $i]
+ bind $itk_component(sash$i) <B1-ButtonRelease-1> \
+ [itcl::code $this _endGrip %y $i]
+ bind $itk_component(sash$i) <Configure> \
+ [itcl::code $this _configGrip %y $i]
+ }
+
+ _setFracArray
+ _makeSashes
+ _placePanes
+ }
+
+ default {
+ error "bad orientation option \"$itk_option(-orient)\":\
+ should be horizontal or vertical"
+ }
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -sashborderwidth
+#
+# Specifies a non-negative value indicating the width of the 3-D
+# border to draw around the outside of the sash.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Panedwindow::sashborderwidth {
+ set pixels [winfo pixels $itk_component(hull) \
+ $itk_option(-sashborderwidth)]
+ set itk_option(-sashborderwidth) $pixels
+
+ if {$_initialized} {
+ for {set i 1} {$i < [llength $_activePanes]} {incr i} {
+ $itk_component(sash$i) configure \
+ -borderwidth $itk_option(-sashborderwidth)
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -sashcursor
+#
+# Specifies the type of cursor to be used when over the sash.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Panedwindow::sashcursor {
+ if {$_initialized} {
+ for {set i 1} {$i < [llength $_activePanes]} {incr i} {
+ $itk_component(sash$i) configure -cursor $itk_option(-sashcursor)
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -sashwidth
+#
+# Specifies the width of the sash.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Panedwindow::sashwidth {
+ set pixels [winfo pixels $itk_component(hull) \
+ $itk_option(-sashwidth)]
+ set itk_option(-sashwidth) $pixels
+
+ if {$_initialized} {
+ for {set i 1} {$i < [llength $_activePanes]} {incr i} {
+ $itk_component(sash$i) configure \
+ -width $itk_option(-sashwidth)
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -sashheight
+#
+# Specifies the height of the sash,
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Panedwindow::sashheight {
+ set pixels [winfo pixels $itk_component(hull) \
+ $itk_option(-sashheight)]
+ set itk_option(-sashheight) $pixels
+
+ if {$_initialized} {
+ for {set i 1} {$i < [llength $_activePanes]} {incr i} {
+ $itk_component(sash$i) configure \
+ -height $itk_option(-sashheight)
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -showhandle
+#
+# Specifies whether or not to show the sash handle. If not, then the
+# whole separator becomes the handle. Valid values are 0 or 1.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Panedwindow::showhandle {
+ switch $itk_option(-showhandle) {
+ 0 - 1 {
+ # Update the sashes.
+ _makeSashes
+ _placePanes
+ }
+ default {
+ error "Invalid option for -showhandle: $itk_option(-showhandle).\
+ Must be 1 or 0."
+ }
+ }
+}
+
+
+# ------------------------------------------------------------------
+# OPTION: -thickness
+#
+# Specifies the thickness of the separators. It sets the width and
+# height of the separator to the thickness value and the borderwidth
+# to half the thickness.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Panedwindow::thickness {
+ set pixels [winfo pixels $itk_component(hull) \
+ $itk_option(-thickness)]
+ set itk_option(-thickness) $pixels
+
+ if {$_initialized} {
+ for {set i 1} {$i < [llength $_activePanes]} {incr i} {
+ $itk_component(separator$i) configure \
+ -height $itk_option(-thickness)
+ $itk_component(separator$i) configure \
+ -width $itk_option(-thickness)
+ $itk_component(separator$i) configure \
+ -borderwidth [expr {$itk_option(-thickness) / 2}]
+ }
+
+ for {set i 1} {$i < [llength $_activePanes]} {incr i} {
+ _placeSash $i
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -sashindent
+#
+# Specifies the placement of the sash along the panes. A positive
+# value causes the sash to be offset from the near (left/top) side
+# of the pane, and a negative value causes the sash to be offset from
+# the far (right/bottom) side. If the offset is greater than the
+# width, then the sash is placed flush against the side.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Panedwindow::sashindent {
+ set pixels [winfo pixels $itk_component(hull) \
+ $itk_option(-sashindent)]
+ set itk_option(-sashindent) $pixels
+
+ if {$_initialized} {
+ for {set i 1} {$i < [llength $_activePanes]} {incr i} {
+ _placeSash $i
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# METHODS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# METHOD: index index
+#
+# Searches the panes in the paned window for the one with the
+# requested tag, numerical index, or keyword "end". Returns the pane's
+# numerical index if found, otherwise error.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Panedwindow::index {index} {
+ if {[llength $_panes] > 0} {
+ if {[regexp {(^[0-9]+$)} $index]} {
+ if {$index < [llength $_panes]} {
+ return $index
+ } else {
+ error "Panedwindow index \"$index\" is out of range"
+ }
+
+ } elseif {$index == "end"} {
+ return [expr {[llength $_panes] - 1}]
+
+ } else {
+ if {[set idx [lsearch $_panes $index]] != -1} {
+ return $idx
+ }
+
+ error "bad Panedwindow index \"$index\": must be number, end,\
+ or pattern"
+ }
+
+ } else {
+ error "Panedwindow \"$itk_component(hull)\" has no panes"
+ }
+}
+
+# ------------------------------------------------------------------
+# METHOD: childsite ?index?
+#
+# Given an index return the specifc childsite path name. Invoked
+# without an index return a list of all the child site panes. The
+# list is ordered from the near side (left/top).
+# ------------------------------------------------------------------
+itcl::body iwidgets::Panedwindow::childsite {args} {
+ if {! $_initialized} {
+ set _initialized 1
+ reset
+ }
+
+ if {[llength $args] == 0} {
+ set children {}
+
+ foreach pane $_panes {
+ lappend children [$itk_component($pane) childSite]
+ }
+
+ return $children
+
+ } else {
+ set index [index [lindex $args 0]]
+ return [$itk_component([lindex $_panes $index]) childSite]
+ }
+}
+
+# ------------------------------------------------------------------
+# METHOD: fraction percentage percentage ?percentage ...?
+#
+# Sets the visible percentage of the panes. Specifies a list of
+# percentages which are applied to the currently visible panes from
+# the near side (left/top). The number of percentages must be equal
+# to the current number of visible (mapped) panes and add up to 100.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Panedwindow::fraction {args} {
+ #set args [linsert $args 0 $percentage1 $percentage2]
+
+
+ if {[llength $args] == [llength $_activePanes]} {
+ set sum 0
+
+ for {set i 0} {$i < [llength $args]} {incr i} {
+ set sum [expr {$sum + [lindex $args $i]}]
+ }
+
+ if {$sum == 100} {
+ set perc 0.0
+
+ for {set i 0} {$i < [llength $_activePanes]} {incr i} {
+ set _frac($i) $perc
+ set perc [expr {$perc + [expr {[lindex $args $i] / 100.0}]}]
+ }
+
+ set _frac($i) 1.0
+
+ if {[winfo ismapped $itk_component(hull)]} {
+ _placePanes
+ }
+
+ } else {
+ error "bad fraction arguments \"$args\": they should add\
+ up to 100"
+ }
+
+ } elseif {[llength $args] == 0} {
+
+ for {set i 0; set j 1} {$j < [llength $_activePanes]} {incr i; incr j} {
+ lappend _ret [expr {round(($_frac($j) - $_frac($i))*100)}]
+ }
+ lappend _ret [eval expr {100 - ([join $_ret +])}]
+
+ return $_ret
+ } else {
+ error "wrong # args: should be \"$itk_component(hull)\
+ fraction percentage percentage ?percentage ...?\",\
+ where the number of percentages is\
+ [llength $_activePanes] and equal 100
+ or \"$itk_component(hull) fraction\"
+ which will return a list of the current percentages"
+ }
+}
+
+# ------------------------------------------------------------------
+# METHOD: add tag ?option value option value ...?
+#
+# Add a new pane to the paned window to the far (right/bottom) side.
+# The method takes additional options which are passed on to the
+# pane constructor. These include -margin, and -minimum. The path
+# of the pane is returned.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Panedwindow::add {tag args} {
+ #
+ # Create panes.
+ #
+ itk_component add $tag {
+ eval iwidgets::Pane $itk_interior.pane[incr _unique] $args
+ } {
+ keep -background -cursor
+ }
+
+ lappend _panes $tag
+ lappend _activePanes $tag
+
+ reset
+
+ return $itk_component($tag)
+}
+
+# ------------------------------------------------------------------
+# METHOD: insert index tag ?option value option value ...?
+#
+# Insert the specified pane in the paned window just before the one
+# given by index. Any additional options which are passed on to the
+# pane constructor. These include -margin, -minimum. The path of
+# the pane is returned.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Panedwindow::insert {index tag args} {
+ #
+ # Create panes.
+ #
+ itk_component add $tag {
+ eval iwidgets::Pane $itk_interior.pane[incr _unique] $args
+ } {
+ keep -background -cursor
+ }
+
+ set index [index $index]
+ set _panes [linsert $_panes $index $tag]
+ lappend _activePanes $tag
+
+ reset
+
+ return $itk_component($tag)
+}
+
+# ------------------------------------------------------------------
+# METHOD: delete index
+#
+# Delete the specified pane.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Panedwindow::delete {index} {
+ set index [index $index]
+ set tag [lindex $_panes $index]
+
+ destroy $itk_component($tag)
+
+ set _panes [lreplace $_panes $index $index]
+
+ reset
+}
+
+# ------------------------------------------------------------------
+# METHOD: hide index
+#
+# Remove the specified pane from the paned window.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Panedwindow::hide {index} {
+ set index [index $index]
+ set tag [lindex $_panes $index]
+
+ if {[set idx [lsearch -exact $_activePanes $tag]] != -1} {
+ set _activePanes [lreplace $_activePanes $idx $idx]
+ }
+
+ reset
+}
+
+# ------------------------------------------------------------------
+# METHOD: show index
+#
+# Display the specified pane in the paned window.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Panedwindow::show {index} {
+ set index [index $index]
+ set tag [lindex $_panes $index]
+
+ if {[lsearch -exact $_activePanes $tag] == -1} {
+ lappend _activePanes $tag
+ }
+
+ reset
+}
+
+# ------------------------------------------------------------------
+# METHOD: paneconfigure index ?option? ?value option value ...?
+#
+# Configure a specified pane. This method allows configuration of
+# panes from the Panedwindow level. The options may have any of the
+# values accepted by the add method.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Panedwindow::paneconfigure {index args} {
+ set index [index $index]
+ set tag [lindex $_panes $index]
+
+ return [uplevel $itk_component($tag) configure $args]
+}
+
+# ------------------------------------------------------------------
+# METHOD: reset
+#
+# Redisplay the panes based on the default percentages of the panes.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Panedwindow::reset {} {
+ if {$_initialized && [llength $_panes]} {
+ _setActivePanes
+ _setFracArray
+
+ _makeSashes
+ _placePanes
+ }
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _pwConfigureEventHandler
+#
+# Performs operations necessary following a configure event. This
+# includes placing the panes.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Panedwindow::_pwConfigureEventHandler {width height} {
+ set _width $width
+ set _height $height
+ if {$_initialized} {
+ _placePanes
+ } else {
+ set _initialized 1
+ reset
+ }
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _startGrip where num
+#
+# Starts the sash drag and drop operation. At the start of the drag
+# operation all the information is known as for the upper and lower
+# limits for sash movement. The calculation is made at this time and
+# stored in protected variables for later access during the drag
+# handling routines.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Panedwindow::_startGrip {where num} {
+ if {$itk_option(-orient) == "horizontal"} {
+ set _dimension $_height
+ } else {
+ set _dimension $_width
+ }
+
+ set _minsashmoved $num
+ set _maxsashmoved $num
+ set totMinHeight 0
+ set cnt [llength $_activePanes]
+ set _sashloc(0) 0
+ set _pixels($cnt) [expr {int($_dimension)}]
+ for {set i 0} {$i < $cnt} {incr i} {
+ set _pixels($i) [expr {int($_frac($i) * $_dimension)}]
+ set margaft [$itk_component([lindex $_activePanes $i]) cget -margin]
+ set minaft [$itk_component([lindex $_activePanes $i]) cget -minimum]
+ set _minheight($i) [expr {$minaft + (2 * $margaft)}]
+ incr totMinHeight $_minheight($i)
+ }
+ set _dragging [expr {$_dimension > $totMinHeight}]
+
+ grab $itk_component(sash$num)
+ raise $itk_component(separator$num)
+ raise $itk_component(sash$num)
+
+ $itk_component(sash$num) configure -relief sunken
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _endGrip where num
+#
+# Ends the sash drag and drop operation.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Panedwindow::_endGrip {where num} {
+ $itk_component(sash$num) configure -relief $_relief($itk_option(-showhandle))
+ grab release $itk_component(sash$num)
+ if {$_dragging} {
+ _calcFraction [expr {$_sashloc($num) + $where}] $num
+ _placePanes [expr {$_minsashmoved - 1}] $_maxsashmoved
+ set _dragging 0
+ }
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _configGrip where num
+#
+# Configure action for sash.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Panedwindow::_configGrip {where num} {
+ set _sashloc($num) $where
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _handleGrip where num
+#
+# Motion action for sash.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Panedwindow::_handleGrip {where num} {
+ if {$_dragging} {
+ _moveSash [expr {$where + $_sashloc($num)}] $num
+ incr _movecount
+ if {$_movecount>4} {
+ set _movecount 0
+ update idletasks
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _moveSash where num
+#
+# Move the sash to the absolute pixel location
+# ------------------------------------------------------------------
+itcl::body iwidgets::Panedwindow::_moveSash {where num} {
+ set _minsashmoved [expr {($_minsashmoved<$num)?$_minsashmoved:$num}]
+ set _maxsashmoved [expr {($_maxsashmoved>$num)?$_maxsashmoved:$num}]
+ set oldfrac $_frac($num)
+ _calcFraction $where $num
+ if {$_frac($num)!=$oldfrac} { _placeSash $num }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _setFracArray
+#
+# Calculates the percentages for the fraction array which lists the
+# percentages for each pane.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Panedwindow::_setFracArray {} {
+ set perc 0.0
+ if {[llength $_activePanes] != 0} {
+ set percIncr [expr {1.0 / [llength $_activePanes]}]
+ }
+
+ for {set i 0} {$i < [llength $_activePanes]} {incr i} {
+ set _frac($i) $perc
+ set perc [expr {$perc + $percIncr}]
+ }
+
+ set _frac($i) 1.0
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _setActivePanes
+#
+# Resets the active pane list.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Panedwindow::_setActivePanes {} {
+ set _prevActivePanes $_activePanes
+
+ set _activePanes {}
+
+ foreach pane $_panes {
+ if {[lsearch -exact $_prevActivePanes $pane] != -1} {
+ lappend _activePanes $pane
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _calcFraction where num
+#
+# Determines the fraction for the sash. Make sure the fraction does
+# not go past the minimum for the pane on each side of the separator.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Panedwindow::_calcFraction {where num} {
+
+ set numi [expr {$num + 1}]
+ set numd [expr {$num - 1}]
+
+ set _lowerlimit [expr {$_pixels($numd) + $_minheight($numd)}]
+ set _upperlimit [expr {$_pixels($numi) - $_minheight($num)}]
+
+ set dir [expr {$where - $_pixels($num)}]
+
+ if {$where < $_lowerlimit && $dir <= 0} {
+ if {$num == 1} {
+ set _pixels($num) $_lowerlimit
+ } {
+ _moveSash [expr {$where - $_minheight($numd)}] $numd
+ set _pixels($num) [expr {$_pixels($numd) + $_minheight($numd)}]
+ }
+ } elseif {$where > $_upperlimit && $dir >= 0} {
+ if {$numi == [llength $_activePanes]} {
+ set _pixels($num) $_upperlimit
+ } {
+ _moveSash [expr {$where + $_minheight($num)}] $numi
+ set _pixels($num) \
+ [expr {$_pixels($numi) - $_minheight($num)}]
+ }
+ } else {
+ set _pixels($num) $where
+ }
+ set _frac($num) [expr $_pixels($num).0 / $_dimension]
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _makeSashes
+#
+# Removes any previous sashes and separators and creates new one.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Panedwindow::_makeSashes {} {
+ #
+ # Remove any existing sashes and separators.
+ #
+ foreach sash $_sashes {
+ destroy $itk_component($sash)
+ }
+
+ foreach separator $_separators {
+ destroy $itk_component($separator)
+ }
+
+ set _sashes {}
+ set _separators {}
+
+ #
+ # Create one less separator and sash than the number of panes.
+ #
+ for {set id 1} {$id < [llength $_activePanes]} {incr id} {
+ itk_component add sash$id {
+ frame $itk_interior.sash$id -relief $_relief($itk_option(-showhandle)) \
+ -borderwidth $itk_option(-sashborderwidth) \
+ -cursor $itk_option(-sashcursor) \
+ -width $itk_option(-sashwidth) \
+ -height $itk_option(-sashheight)
+ } {
+ keep -background
+ }
+
+ lappend _sashes sash$id
+
+ switch $itk_option(-orient) {
+ vertical {
+ bind $itk_component(sash$id) <Button-1> \
+ [itcl::code $this _startGrip %x $id]
+ bind $itk_component(sash$id) <B1-Motion> \
+ [itcl::code $this _handleGrip %x $id]
+ bind $itk_component(sash$id) <B1-ButtonRelease-1> \
+ [itcl::code $this _endGrip %x $id]
+ bind $itk_component(sash$id) <Configure> \
+ [itcl::code $this _configGrip %x $id]
+ }
+
+ horizontal {
+ bind $itk_component(sash$id) <Button-1> \
+ [itcl::code $this _startGrip %y $id]
+ bind $itk_component(sash$id) <B1-Motion> \
+ [itcl::code $this _handleGrip %y $id]
+ bind $itk_component(sash$id) <B1-ButtonRelease-1> \
+ [itcl::code $this _endGrip %y $id]
+ bind $itk_component(sash$id) <Configure> \
+ [itcl::code $this _configGrip %y $id]
+ }
+ }
+
+ itk_component add separator$id {
+ frame $itk_interior.separator$id -relief sunken \
+ -height $itk_option(-thickness) \
+ -width $itk_option(-thickness) \
+ -borderwidth [expr {$itk_option(-thickness) / 2}]
+ } {
+ keep -background -cursor
+ }
+
+ lappend _separators separator$id
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _placeSash i
+#
+# Places the position of the sash and separator.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Panedwindow::_placeSash {i} {
+ if {$itk_option(-orient) == "horizontal"} {
+ place $itk_component(separator$i) -in $itk_component(hull) \
+ -x 0 -relwidth 1 -rely $_frac($i) -anchor w \
+ -height $itk_option(-thickness)
+
+ if {$itk_option(-sashindent) < 0} {
+ set sashPos [expr {$_width + $itk_option(-sashindent)}]
+ set sashAnchor e
+ } else {
+ set sashPos $itk_option(-sashindent)
+ set sashAnchor w
+ }
+
+ if {$itk_option(-showhandle)} {
+ place $itk_component(sash$i) -in $itk_component(hull) \
+ -x $sashPos -rely $_frac($i) -anchor $sashAnchor
+ } else {
+ place $itk_component(sash$i) -in $itk_component(hull) \
+ -x 0 -relwidth 1 -rely $_frac($i) -anchor w \
+ -height $itk_option(-thickness)
+ }
+
+ } else {
+ place $itk_component(separator$i) -in $itk_component(hull) \
+ -y 0 -relheight 1 -relx $_frac($i) -anchor n \
+ -width $itk_option(-thickness)
+
+ if {$itk_option(-sashindent) < 0} {
+ set sashPos [expr {$_height + $itk_option(-sashindent)}]
+ set sashAnchor s
+ } else {
+ set sashPos $itk_option(-sashindent)
+ set sashAnchor n
+ }
+
+ if {$itk_option(-showhandle)} {
+
+ place $itk_component(sash$i) -in $itk_component(hull) \
+ -y $sashPos -relx $_frac($i) -anchor $sashAnchor
+ } else {
+ place $itk_component(sash$i) -in $itk_component(hull) \
+ -y 0 -relheight 1 -relx $_frac($i) -anchor n \
+ -width $itk_option(-thickness)
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _placePanes
+#
+# Resets the panes of the window following movement of the sash.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Panedwindow::_placePanes {{start 0} {end end}} {
+ if {$end=="end"} { set end [expr {[llength $_activePanes] - 1}] }
+ set _updatePanes [lrange $_activePanes $start $end]
+ if {$_updatePanes == $_activePanes} {
+ set _forgetPanes $_panes
+ } {
+ set _forgetPanes $_updatePanes
+ }
+ foreach pane $_forgetPanes {
+ place forget $itk_component($pane)
+ }
+
+
+ if {$itk_option(-orient) == "horizontal"} {
+ set i $start
+ foreach pane $_updatePanes {
+ place $itk_component($pane) -in $itk_component(hull) \
+ -x 0 -rely $_frac($i) -relwidth 1 \
+ -relheight [expr {$_frac([expr {$i + 1}]) - $_frac($i)}]
+ incr i
+ }
+
+ } else {
+ set i $start
+ foreach pane $_updatePanes {
+ place $itk_component($pane) -in $itk_component(hull) \
+ -y 0 -relx $_frac($i) -relheight 1 \
+ -relwidth [expr {$_frac([expr {$i + 1}]) - $_frac($i)}]
+ incr i
+ }
+
+ }
+
+ for {set i [expr {$start+1}]} {$i <= $end} {incr i} {
+ if {[array names itk_component separator$i] != ""} {
+ _placeSash $i
+ raise $itk_component(separator$i)
+ raise $itk_component(sash$i)
+ }
+ }
+}
diff --git a/iwidgets/generic/promptdialog.itk b/iwidgets/generic/promptdialog.itk
new file mode 100644
index 00000000000..9588eca8bd9
--- /dev/null
+++ b/iwidgets/generic/promptdialog.itk
@@ -0,0 +1,199 @@
+#
+# Promptdialog
+# ----------------------------------------------------------------------
+# Implements a prompt dialog similar to the OSF/Motif standard prompt
+# dialog composite widget. The Promptdialog is derived from the
+# Dialog class and is composed of a EntryField with methods to
+# manipulate the dialog buttons.
+#
+# ----------------------------------------------------------------------
+# AUTHOR: Mark L. Ulferts EMAIL: mulferts@austin.dsccc.com
+#
+# @(#) $Id$
+# ----------------------------------------------------------------------
+# Copyright (c) 1995 DSC Technologies Corporation
+# ======================================================================
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+
+#
+# Usual options.
+#
+itk::usual Promptdialog {
+ keep -background -borderwidth -cursor -foreground -highlightcolor \
+ -highlightthickness -insertbackground -insertborderwidth \
+ -insertofftime -insertontime -insertwidth -labelfont -modality \
+ -selectbackground -selectborderwidth -selectforeground \
+ -textbackground -textfont
+}
+
+# ------------------------------------------------------------------
+# PROMPTDIALOG
+# ------------------------------------------------------------------
+itcl::class iwidgets::Promptdialog {
+ inherit iwidgets::Dialog
+
+ constructor {args} {}
+
+ public method get {}
+ public method clear {}
+ public method insert {args}
+ public method delete {args}
+ public method icursor {args}
+ public method index {args}
+ public method scan {args}
+ public method selection {args}
+ method xview {args}
+}
+
+#
+# Provide a lowercased access method for the Dialogshell class.
+#
+proc ::iwidgets::promptdialog {pathName args} {
+ uplevel ::iwidgets::Promptdialog $pathName $args
+}
+
+#
+# Use option database to override default resources of base classes.
+#
+option add *Promptdialog.labelText Selection widgetDefault
+option add *Promptdialog.labelPos nw widgetDefault
+option add *Promptdialog.title "Prompt Dialog" widgetDefault
+option add *Promptdialog.master "." widgetDefault
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Promptdialog::constructor {args} {
+ #
+ # Set the borderwidth to zero.
+ #
+ component hull configure -borderwidth 0
+
+ #
+ # Create an entry field widget.
+ #
+ itk_component add prompt {
+ iwidgets::Entryfield $itk_interior.prompt -command [itcl::code $this invoke]
+ } {
+ usual
+
+ keep -exportselection -invalid -labelpos -labeltext -relief \
+ -show -textbackground -textfont -validate
+ }
+
+ pack $itk_component(prompt) -fill x -expand yes
+ set itk_interior [childsite]
+
+ hide Help
+
+ #
+ # Initialize the widget based on the command line options.
+ #
+ eval itk_initialize $args
+}
+
+# ------------------------------------------------------------------
+# METHODS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# METHOD: get
+#
+# Thinwrapped method of entry field class.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Promptdialog::get {} {
+ return [$itk_component(prompt) get]
+}
+
+# ------------------------------------------------------------------
+# METHOD: clear
+#
+# Thinwrapped method of entry field class.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Promptdialog::clear {} {
+ eval $itk_component(prompt) clear
+}
+
+# ------------------------------------------------------------------
+# METHOD: insert args
+#
+# Thinwrapped method of entry field class.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Promptdialog::insert {args} {
+ eval $itk_component(prompt) insert $args
+}
+
+# ------------------------------------------------------------------
+# METHOD: delete first ?last?
+#
+# Thinwrapped method of entry field class.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Promptdialog::delete {args} {
+ eval $itk_component(prompt) delete $args
+}
+
+# ------------------------------------------------------------------
+# METHOD: icursor
+#
+# Thinwrapped method of entry field class.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Promptdialog::icursor {args} {
+ eval $itk_component(prompt) icursor $args
+}
+
+# ------------------------------------------------------------------
+# METHOD: index
+#
+# Thinwrapped method of entry field class.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Promptdialog::index {args} {
+ return [eval $itk_component(prompt) index $args]
+}
+
+# ------------------------------------------------------------------
+# METHOD: scan option args
+#
+# Thinwrapped method of entry field class.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Promptdialog::scan {args} {
+ eval $itk_component(prompt) scan $args
+}
+
+# ------------------------------------------------------------------
+# METHOD: selection args
+#
+# Thinwrapped method of entry field class.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Promptdialog::selection {args} {
+ eval $itk_component(prompt) selection $args
+}
+
+# ------------------------------------------------------------------
+# METHOD: xview args
+#
+# Thinwrapped method of entry field class.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Promptdialog::xview {args} {
+ eval $itk_component(prompt) xview $args
+}
+
+
diff --git a/iwidgets/generic/pushbutton.itk b/iwidgets/generic/pushbutton.itk
new file mode 100644
index 00000000000..31a5102fa09
--- /dev/null
+++ b/iwidgets/generic/pushbutton.itk
@@ -0,0 +1,356 @@
+#
+# Pushbutton
+# ----------------------------------------------------------------------
+# Implements a Motif-like Pushbutton with an optional default ring.
+#
+# WISH LIST:
+# 1) Allow bitmaps and text on the same button face (Tk limitation).
+# 2) provide arm and disarm bitmaps.
+#
+# ----------------------------------------------------------------------
+# AUTHOR: Mark L. Ulferts EMAIL: mulferts@austin.dsccc.com
+# Bret A. Schuhmacher EMAIL: bas@wn.com
+#
+# @(#) $Id$
+# ----------------------------------------------------------------------
+# Copyright (c) 1995 DSC Technologies Corporation
+# ======================================================================
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+
+#
+# Usual options.
+#
+itk::usual Pushbutton {
+ keep -activebackground -activeforeground -background -borderwidth \
+ -cursor -disabledforeground -font -foreground -highlightbackground \
+ -highlightcolor -highlightthickness
+}
+
+# ------------------------------------------------------------------
+# PUSHBUTTON
+# ------------------------------------------------------------------
+itcl::class iwidgets::Pushbutton {
+ inherit itk::Widget
+
+ constructor {args} {}
+ destructor {}
+
+ itk_option define -padx padX Pad 11
+ itk_option define -pady padY Pad 4
+ itk_option define -font font Font \
+ -Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-*
+ itk_option define -text text Text {}
+ itk_option define -bitmap bitmap Bitmap {}
+ itk_option define -image image Image {}
+ itk_option define -highlightthickness highlightThickness \
+ HighlightThickness 2
+ itk_option define -borderwidth borderWidth BorderWidth 2
+ itk_option define -defaultring defaultRing DefaultRing 0
+ itk_option define -defaultringpad defaultRingPad Pad 4
+ itk_option define -height height Height 0
+ itk_option define -width width Width 0
+ itk_option define -takefocus takeFocus TakeFocus 0
+
+ public method flash {}
+ public method invoke {}
+
+ protected method _relayout {{when later}}
+ protected variable _reposition "" ;# non-null => _relayout pending
+}
+
+#
+# Provide a lowercased access method for the Pushbutton class.
+#
+proc ::iwidgets::pushbutton {pathName args} {
+ uplevel ::iwidgets::Pushbutton $pathName $args
+}
+
+#
+# Use option database to override default resources of base classes.
+#
+option add *Pushbutton.borderWidth 2 widgetDefault
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Pushbutton::constructor {args} {
+ #
+ # Reconfigure the hull to act as the outer sunken ring of
+ # the pushbutton, complete with focus ring.
+ #
+ itk_option add hull.borderwidth hull.relief
+ itk_option add hull.highlightcolor
+ itk_option add hull.highlightbackground
+
+ component hull configure \
+ -borderwidth [$this cget -borderwidth]
+
+ pack propagate $itk_component(hull) no
+
+ itk_component add pushbutton {
+ button $itk_component(hull).pushbutton \
+ } {
+ usual
+ keep -underline -wraplength -state -command
+ }
+ pack $itk_component(pushbutton) -expand 1 -fill both
+
+ #
+ # Initialize the widget based on the command line options.
+ #
+ eval itk_initialize $args
+
+ #
+ # Layout the pushbutton.
+ #
+ _relayout
+}
+
+# ------------------------------------------------------------------
+# DESTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Pushbutton::destructor {} {
+ if {$_reposition != ""} {after cancel $_reposition}
+}
+
+# ------------------------------------------------------------------
+# OPTIONS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# OPTION: -padx
+#
+# Specifies the extra space surrounding the label in the x direction.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Pushbutton::padx {
+ $itk_component(pushbutton) configure -padx $itk_option(-padx)
+
+ _relayout
+}
+
+# ------------------------------------------------------------------
+# OPTION: -pady
+#
+# Specifies the extra space surrounding the label in the y direction.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Pushbutton::pady {
+ $itk_component(pushbutton) configure -pady $itk_option(-pady)
+
+ _relayout
+}
+
+# ------------------------------------------------------------------
+# OPTION: -font
+#
+# Specifies the label font.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Pushbutton::font {
+ $itk_component(pushbutton) configure -font $itk_option(-font)
+
+ _relayout
+}
+
+# ------------------------------------------------------------------
+# OPTION: -text
+#
+# Specifies the label text.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Pushbutton::text {
+ $itk_component(pushbutton) configure -text $itk_option(-text)
+
+ _relayout
+}
+
+# ------------------------------------------------------------------
+# OPTION: -bitmap
+#
+# Specifies the label bitmap.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Pushbutton::bitmap {
+ $itk_component(pushbutton) configure -bitmap $itk_option(-bitmap)
+
+ _relayout
+}
+
+# ------------------------------------------------------------------
+# OPTION: -image
+#
+# Specifies the label image.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Pushbutton::image {
+ $itk_component(pushbutton) configure -image $itk_option(-image)
+
+ _relayout
+}
+
+# ------------------------------------------------------------------
+# OPTION: -highlightthickness
+#
+# Specifies the thickness of the highlight ring.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Pushbutton::highlightthickness {
+ $itk_component(pushbutton) configure \
+ -highlightthickness $itk_option(-highlightthickness)
+
+ _relayout
+}
+
+# ------------------------------------------------------------------
+# OPTION: -borderwidth
+#
+# Specifies the width of the relief border.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Pushbutton::borderwidth {
+ $itk_component(pushbutton) configure -borderwidth $itk_option(-borderwidth)
+
+ _relayout
+}
+
+# ------------------------------------------------------------------
+# OPTION: -defaultring
+#
+# Boolean describing whether the button displays its default ring.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Pushbutton::defaultring {
+ _relayout
+}
+
+# ------------------------------------------------------------------
+# OPTION: -defaultringpad
+#
+# The size of the padded default ring around the button.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Pushbutton::defaultringpad {
+ pack $itk_component(pushbutton) \
+ -padx $itk_option(-defaultringpad) \
+ -pady $itk_option(-defaultringpad)
+}
+
+# ------------------------------------------------------------------
+# OPTION: -height
+#
+# Specifies the height of the button inclusive of any default ring.
+# A value of zero lets the push button determine the height based
+# on the requested height plus highlightring and defaultringpad.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Pushbutton::height {
+ _relayout
+}
+
+# ------------------------------------------------------------------
+# OPTION: -width
+#
+# Specifies the width of the button inclusive of any default ring.
+# A value of zero lets the push button determine the width based
+# on the requested width plus highlightring and defaultringpad.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Pushbutton::width {
+ _relayout
+}
+
+# ------------------------------------------------------------------
+# METHODS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# METHOD: flash
+#
+# Thin wrap of standard button widget flash method.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Pushbutton::flash {} {
+ $itk_component(pushbutton) flash
+}
+
+# ------------------------------------------------------------------
+# METHOD: invoke
+#
+# Thin wrap of standard button widget invoke method.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Pushbutton::invoke {} {
+ $itk_component(pushbutton) invoke
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _relayout ?when?
+#
+# Adjust the width and height of the Pushbutton to accomadate all the
+# current options settings. Add back in the highlightthickness to
+# the button such that the correct reqwidth and reqheight are computed.
+# Set the width and height based on the reqwidth/reqheight,
+# highlightthickness, and ringpad. Finally, configure the defaultring
+# properly. If "when" is "now", the change is applied immediately. If
+# it is "later" or it is not specified, then the change is applied later,
+# when the application is idle.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Pushbutton::_relayout {{when later}} {
+ if {$when == "later"} {
+ if {$_reposition == ""} {
+ set _reposition [after idle [itcl::code $this _relayout now]]
+ }
+ return
+ } elseif {$when != "now"} {
+ error "bad option \"$when\": should be now or later"
+ }
+
+ set _reposition ""
+
+ if {$itk_option(-width) == 0} {
+ set w [expr {[winfo reqwidth $itk_component(pushbutton)] \
+ + 2 * $itk_option(-highlightthickness) \
+ + 2 * $itk_option(-borderwidth) \
+ + 2 * $itk_option(-defaultringpad)}]
+ } else {
+ set w $itk_option(-width)
+ }
+
+ if {$itk_option(-height) == 0} {
+ set h [expr {[winfo reqheight $itk_component(pushbutton)] \
+ + 2 * $itk_option(-highlightthickness) \
+ + 2 * $itk_option(-borderwidth) \
+ + 2 * $itk_option(-defaultringpad)}]
+ } else {
+ set h $itk_option(-height)
+ }
+
+ component hull configure -width $w -height $h
+
+ if {$itk_option(-defaultring)} {
+ component hull configure -relief sunken \
+ -highlightthickness [$this cget -highlightthickness] \
+ -takefocus 1
+
+ configure -takefocus 1
+
+ component pushbutton configure \
+ -highlightthickness 0 -takefocus 0
+
+ } else {
+ component hull configure -relief flat \
+ -highlightthickness 0 -takefocus 0
+
+ component pushbutton configure \
+ -highlightthickness [$this cget -highlightthickness] \
+ -takefocus 1
+
+ configure -takefocus 0
+ }
+}
diff --git a/iwidgets/generic/radiobox.itk b/iwidgets/generic/radiobox.itk
new file mode 100644
index 00000000000..282eaa71ae0
--- /dev/null
+++ b/iwidgets/generic/radiobox.itk
@@ -0,0 +1,427 @@
+#
+# Radiobox
+# ----------------------------------------------------------------------
+# Implements a radiobuttonbox. Supports adding, inserting, deleting,
+# selecting, and deselecting of radiobuttons by tag and index.
+#
+# ----------------------------------------------------------------------
+# AUTHOR: Michael J. McLennan EMAIL: mmclennan@lucent.com
+# Mark L. Ulferts EMAIL: mulferts@austin.dsccc.com
+#
+# @(#) $Id$
+# ----------------------------------------------------------------------
+# Copyright (c) 1995 DSC Technologies Corporation
+# ======================================================================
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+
+#
+# Usual options.
+#
+itk::usual Radiobox {
+ keep -background -borderwidth -cursor -disabledforeground \
+ -foreground -labelfont -selectcolor
+}
+
+# ------------------------------------------------------------------
+# RADIOBOX
+# ------------------------------------------------------------------
+itcl::class iwidgets::Radiobox {
+ inherit iwidgets::Labeledframe
+
+ constructor {args} {}
+ destructor {}
+
+ itk_option define -disabledforeground \
+ disabledForeground DisabledForeground {}
+ itk_option define -selectcolor selectColor Background {}
+ itk_option define -command command Command {}
+ itk_option define -orient orient Orient vertical
+
+ public {
+ method add {tag args}
+ method buttonconfigure {index args}
+ method component {{name ""} args}
+ method delete {index}
+ method deselect {index}
+ method flash {index}
+ method get {}
+ method index {index}
+ method insert {index tag args}
+ method select {index}
+ }
+
+ protected method _command { name1 name2 opt }
+
+ private {
+ method gettag {index} ;# Get the tag of the checkbutton associated
+ ;# with a numeric index
+
+ method _rearrange {} ;# List of radiobutton tags.
+ variable _buttons {} ;# List of radiobutton tags.
+ common _modes ;# Current selection.
+ variable _unique 0 ;# Unique id for choice creation.
+ }
+}
+
+#
+# Provide a lowercased access method for the Radiobox class.
+#
+proc ::iwidgets::radiobox {pathName args} {
+ uplevel ::iwidgets::Radiobox $pathName $args
+}
+
+#
+# Use option database to override default resources of base classes.
+#
+option add *Radiobox.labelMargin 10 widgetDefault
+option add *Radiobox.labelFont \
+ "-Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-*" widgetDefault
+option add *Radiobox.labelPos nw widgetDefault
+option add *Radiobox.borderWidth 2 widgetDefault
+option add *Radiobox.relief groove widgetDefault
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Radiobox::constructor {args} {
+
+ #
+ # Initialize the _modes array element prior to setting the trace. This
+ # prevents the -command command (if defined) from being triggered when
+ # the first radiobutton is added via the add method.
+ #
+ set _modes($this) {}
+
+ trace variable [itcl::scope _modes($this)] w [itcl::code $this _command]
+
+ grid columnconfigure $itk_component(childsite) 0 -weight 1
+
+ eval itk_initialize $args
+}
+
+# ------------------------------------------------------------------
+# DESTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Radiobox::destructor { } {
+
+ trace vdelete [itcl::scope _modes($this)] w [itcl::code $this _command]
+ catch {unset _modes($this)}
+
+}
+
+# ------------------------------------------------------------------
+# OPTIONS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# OPTION: -command
+#
+# Specifies a command to be evaluated upon change in the radiobox
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Radiobox::command {}
+
+# ------------------------------------------------------------------
+# OPTION: -orient
+#
+# Allows the user to orient the radiobuttons either horizontally
+# or vertically.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Radiobox::orient {
+ if {$itk_option(-orient) == "horizontal" ||
+ $itk_option(-orient) == "vertical"} {
+ _rearrange
+ } else {
+ error "Bad orientation: $itk_option(-orient). Should be\
+ \"horizontal\" or \"vertical\"."
+ }
+}
+
+# ------------------------------------------------------------------
+# METHODS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# METHOD: index index
+#
+# Searches the radiobutton tags in the radiobox for the one with the
+# requested tag, numerical index, or keyword "end". Returns the
+# choices's numerical index if found, otherwise error.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Radiobox::index {index} {
+ if {[llength $_buttons] > 0} {
+ if {[regexp {(^[0-9]+$)} $index]} {
+ if {$index < [llength $_buttons]} {
+ return $index
+ } else {
+ error "Radiobox index \"$index\" is out of range"
+ }
+
+ } elseif {$index == "end"} {
+ return [expr {[llength $_buttons] - 1}]
+
+ } else {
+ if {[set idx [lsearch $_buttons $index]] != -1} {
+ return $idx
+ }
+
+ error "bad Radiobox index \"$index\": must be number, end,\
+ or pattern"
+ }
+
+ } else {
+ error "Radiobox \"$itk_component(hull)\" has no radiobuttons"
+ }
+}
+
+# ------------------------------------------------------------------
+# METHOD: add tag ?option value option value ...?
+#
+# Add a new tagged radiobutton to the radiobox at the end. The method
+# takes additional options which are passed on to the radiobutton
+# constructor. These include most of the typical radiobutton
+# options. The tag is returned.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Radiobox::add {tag args} {
+ set options {-value -variable}
+ foreach option $options {
+ if {[lsearch $args $option] != -1} {
+ error "Error: specifying values for radiobutton component options\
+ \"-value\" and\n \"-variable\" is disallowed. The Radiobox must\
+ use these options when\n adding radiobuttons."
+ }
+ }
+
+ itk_component add $tag {
+ eval radiobutton $itk_component(childsite).rb[incr _unique] \
+ -variable [list [itcl::scope _modes($this)]] \
+ -anchor w \
+ -justify left \
+ -highlightthickness 0 \
+ -value $tag $args
+ } {
+ usual
+ keep -state
+ ignore -highlightthickness -highlightcolor
+ rename -font -labelfont labelFont Font
+ }
+ lappend _buttons $tag
+ grid $itk_component($tag)
+ after idle [itcl::code $this _rearrange]
+
+ return $tag
+}
+
+# ------------------------------------------------------------------
+# METHOD: insert index tag ?option value option value ...?
+#
+# Insert the tagged radiobutton in the radiobox just before the
+# one given by index. Any additional options are passed on to the
+# radiobutton constructor. These include the typical radiobutton
+# options. The tag is returned.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Radiobox::insert {index tag args} {
+ set options {-value -variable}
+ foreach option $options {
+ if {[lsearch $args $option] != -1} {
+ error "Error: specifying values for radiobutton component options\
+ \"-value\" and\n \"-variable\" is disallowed. The Radiobox must\
+ use these options when\n adding radiobuttons."
+ }
+ }
+
+ itk_component add $tag {
+ eval radiobutton $itk_component(childsite).rb[incr _unique] \
+ -variable [list [itcl::scope _modes($this)]] \
+ -highlightthickness 0 \
+ -anchor w \
+ -justify left \
+ -value $tag $args
+ } {
+ usual
+ ignore -highlightthickness -highlightcolor
+ rename -font -labelfont labelFont Font
+ }
+ set index [index $index]
+ set before [lindex $_buttons $index]
+ set _buttons [linsert $_buttons $index $tag]
+ grid $itk_component($tag)
+ after idle [itcl::code $this _rearrange]
+
+ return $tag
+}
+
+# ------------------------------------------------------------------
+# METHOD: _rearrange
+#
+# Rearrange the buttons in the childsite frame using the grid
+# geometry manager. This method was modified by Chad Smith on 3/9/00
+# to take into consideration the newly added -orient config option.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Radiobox::_rearrange {} {
+ if {[set count [llength $_buttons]] > 0} {
+ if {$itk_option(-orient) == "vertical"} {
+ set row 0
+ foreach tag $_buttons {
+ grid configure $itk_component($tag) -column 0 -row $row -sticky nw
+ grid rowconfigure $itk_component(childsite) $row -weight 0
+ incr row
+ }
+ grid rowconfigure $itk_component(childsite) [expr {$count-1}] \
+ -weight 1
+ } else {
+ set col 0
+ foreach tag $_buttons {
+ grid configure $itk_component($tag) -column $col -row 0 -sticky nw
+ grid columnconfigure $itk_component(childsite) $col -weight 1
+ incr col
+ }
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# METHOD: component ?name? ?arg arg arg...?
+#
+# This method overrides the base class definition to provide some
+# error checking. The user is disallowed from modifying the values
+# of the -value and -variable options for individual radiobuttons.
+# Addition of this method prompted by SF ticket 227923.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Radiobox::component {{name ""} args} {
+ if {[lsearch $_buttons $name] != -1} {
+ # See if the user's trying to use the configure method. Note that
+ # because of globbing, as few characters as "co" are expanded to
+ # "config". Similarly, "configu" will expand to "configure".
+ if [regexp {^co+} [lindex $args 0]] {
+ # The user's trying to modify a radiobutton. This is all fine and
+ # dandy unless -value or -variable is being modified.
+ set options {-value -variable}
+ foreach option $options {
+ set index [lsearch $args $option]
+ if {$index != -1} {
+ # If a value is actually specified, throw an error.
+ if {[lindex $args [expr {$index + 1}]] != ""} {
+ error "Error: specifying values for radiobutton component options\
+ \"-value\" and\n \"-variable\" is disallowed. The Radiobox\
+ uses these options internally."
+ }
+ }
+ }
+ }
+ }
+
+ eval chain $name $args
+}
+
+# ------------------------------------------------------------------
+# METHOD: delete index
+#
+# Delete the specified radiobutton.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Radiobox::delete {index} {
+
+ set tag [gettag $index]
+ set index [index $index]
+
+ destroy $itk_component($tag)
+
+ set _buttons [lreplace $_buttons $index $index]
+
+ if {$_modes($this) == $tag} {
+ set _modes($this) {}
+ }
+ after idle [itcl::code $this _rearrange]
+ return
+}
+
+# ------------------------------------------------------------------
+# METHOD: select index
+#
+# Select the specified radiobutton.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Radiobox::select {index} {
+ set tag [gettag $index]
+ $itk_component($tag) invoke
+}
+
+# ------------------------------------------------------------------
+# METHOD: get
+#
+# Return the tag of the currently selected radiobutton.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Radiobox::get {} {
+ return $_modes($this)
+}
+
+# ------------------------------------------------------------------
+# METHOD: deselect index
+#
+# Deselect the specified radiobutton.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Radiobox::deselect {index} {
+ set tag [gettag $index]
+ $itk_component($tag) deselect
+}
+
+# ------------------------------------------------------------------
+# METHOD: flash index
+#
+# Flash the specified radiobutton.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Radiobox::flash {index} {
+ set tag [gettag $index]
+ $itk_component($tag) flash
+}
+
+# ------------------------------------------------------------------
+# METHOD: buttonconfigure index ?option? ?value option value ...?
+#
+# Configure a specified radiobutton. This method allows configuration
+# of radiobuttons from the Radiobox level. The options may have any
+# of the values accepted by the add method.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Radiobox::buttonconfigure {index args} {
+ set tag [gettag $index]
+ eval $itk_component($tag) configure $args
+}
+
+# ------------------------------------------------------------------
+# CALLBACK METHOD: _command name1 name2 opt
+#
+# Tied to the trace on _modes($this). Whenever our -variable for our
+# radiobuttons change, this method is invoked. It in turn calls
+# the user specified tcl script given by -command.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Radiobox::_command { name1 name2 opt } {
+ uplevel #0 $itk_option(-command)
+}
+
+# ------------------------------------------------------------------
+# METHOD: gettag index
+#
+# Return the tag of the checkbutton associated with a specified
+# numeric index
+# ------------------------------------------------------------------
+itcl::body iwidgets::Radiobox::gettag {index} {
+ return [lindex $_buttons [index $index]]
+}
+
diff --git a/iwidgets/generic/regexpfield.itk b/iwidgets/generic/regexpfield.itk
new file mode 100644
index 00000000000..3e899082743
--- /dev/null
+++ b/iwidgets/generic/regexpfield.itk
@@ -0,0 +1,455 @@
+#
+# Regexpfield
+# ----------------------------------------------------------------------
+# Implements a text entry widget which accepts input that matches its
+# regular expression, and invalidates input which doesn't.
+#
+#
+# ----------------------------------------------------------------------
+# AUTHOR: John A. Tucker E-mail: jatucker@austin.dsccc.com
+#
+# ----------------------------------------------------------------------
+# Copyright (c) 1995 DSC Technologies Corporation
+# ======================================================================
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+
+#
+# Usual options.
+#
+itk::usual Regexpfield {
+ keep -background -borderwidth -cursor -foreground -highlightcolor \
+ -highlightthickness -insertbackground -insertborderwidth \
+ -insertofftime -insertontime -insertwidth -labelfont \
+ -selectbackground -selectborderwidth -selectforeground \
+ -textbackground -textfont
+}
+
+# ------------------------------------------------------------------
+# ENTRYFIELD
+# ------------------------------------------------------------------
+itcl::class iwidgets::Regexpfield {
+ inherit iwidgets::Labeledwidget
+
+ constructor {args} {}
+
+ itk_option define -childsitepos childSitePos Position e
+ itk_option define -command command Command {}
+ itk_option define -fixed fixed Fixed 0
+ itk_option define -focuscommand focusCommand Command {}
+ itk_option define -invalid invalid Command bell
+ itk_option define -regexp regexp Regexp {.*}
+ itk_option define -nocase nocase Nocase 0
+
+ public {
+ method childsite {}
+ method get {}
+ method delete {args}
+ method icursor {args}
+ method index {args}
+ method insert {args}
+ method scan {args}
+ method selection {args}
+ method xview {args}
+ method clear {}
+ }
+
+ protected {
+ method _focusCommand {}
+ method _keyPress {char sym state}
+ }
+
+ private {
+ method _peek {char}
+ }
+}
+
+#
+# Provide a lowercased access method for the Regexpfield class.
+#
+proc ::iwidgets::regexpfield {pathName args} {
+ uplevel ::iwidgets::Regexpfield $pathName $args
+}
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Regexpfield::constructor {args} {
+ component hull configure -borderwidth 0
+
+ itk_component add entry {
+ entry $itk_interior.entry
+ } {
+ keep -borderwidth -cursor -exportselection \
+ -foreground -highlightcolor \
+ -highlightthickness -insertbackground -insertborderwidth \
+ -insertofftime -insertontime -insertwidth -justify \
+ -relief -selectbackground -selectborderwidth \
+ -selectforeground -show -state -textvariable -width
+
+ rename -font -textfont textFont Font
+ rename -highlightbackground -background background Background
+ rename -background -textbackground textBackground Background
+ }
+
+ #
+ # Create the child site widget.
+ #
+ itk_component add -protected efchildsite {
+ frame $itk_interior.efchildsite
+ }
+ set itk_interior $itk_component(efchildsite)
+
+ #
+ # Regexpfield instance bindings.
+ #
+ bind $itk_component(entry) <KeyPress> [itcl::code $this _keyPress %A %K %s]
+ bind $itk_component(entry) <FocusIn> [itcl::code $this _focusCommand]
+
+ #
+ # Initialize the widget based on the command line options.
+ #
+ eval itk_initialize $args
+}
+
+# ------------------------------------------------------------------
+# OPTIONS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# OPTION: -command
+#
+# Command associated upon detection of Return key press event
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Regexpfield::command {}
+
+# ------------------------------------------------------------------
+# OPTION: -focuscommand
+#
+# Command associated upon detection of focus.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Regexpfield::focuscommand {}
+
+# ------------------------------------------------------------------
+# OPTION: -regexp
+#
+# Specify a regular expression to use in performing validation
+# of the content of the entry widget.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Regexpfield::regexp {
+}
+
+# ------------------------------------------------------------------
+# OPTION: -invalid
+#
+# Specify a command to executed should the current Regexpfield contents
+# be proven invalid.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Regexpfield::invalid {}
+
+# ------------------------------------------------------------------
+# OPTION: -fixed
+#
+# Restrict entry to 0 (unlimited) chars. The value is the maximum
+# number of chars the user may type into the field, regardles of
+# field width, i.e. the field width may be 20, but the user will
+# only be able to type -fixed number of characters into it (or
+# unlimited if -fixed = 0).
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Regexpfield::fixed {
+ if {[regexp {[^0-9]} $itk_option(-fixed)] || \
+ ($itk_option(-fixed) < 0)} {
+ error "bad fixed option \"$itk_option(-fixed)\",\
+ should be positive integer"
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -childsitepos
+#
+# Specifies the position of the child site in the widget.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Regexpfield::childsitepos {
+ set parent [winfo parent $itk_component(entry)]
+
+ switch $itk_option(-childsitepos) {
+ n {
+ grid $itk_component(efchildsite) -row 0 -column 0 -sticky ew
+ grid $itk_component(entry) -row 1 -column 0 -sticky nsew
+
+ grid rowconfigure $parent 0 -weight 0
+ grid rowconfigure $parent 1 -weight 1
+ grid columnconfigure $parent 0 -weight 1
+ grid columnconfigure $parent 1 -weight 0
+ }
+
+ e {
+ grid $itk_component(efchildsite) -row 0 -column 1 -sticky ns
+ grid $itk_component(entry) -row 0 -column 0 -sticky nsew
+
+ grid rowconfigure $parent 0 -weight 1
+ grid rowconfigure $parent 1 -weight 0
+ grid columnconfigure $parent 0 -weight 1
+ grid columnconfigure $parent 1 -weight 0
+ }
+
+ s {
+ grid $itk_component(efchildsite) -row 1 -column 0 -sticky ew
+ grid $itk_component(entry) -row 0 -column 0 -sticky nsew
+
+ grid rowconfigure $parent 0 -weight 1
+ grid rowconfigure $parent 1 -weight 0
+ grid columnconfigure $parent 0 -weight 1
+ grid columnconfigure $parent 1 -weight 0
+ }
+
+ w {
+ grid $itk_component(efchildsite) -row 0 -column 0 -sticky ns
+ grid $itk_component(entry) -row 0 -column 1 -sticky nsew
+
+ grid rowconfigure $parent 0 -weight 1
+ grid rowconfigure $parent 1 -weight 0
+ grid columnconfigure $parent 0 -weight 0
+ grid columnconfigure $parent 1 -weight 1
+ }
+
+ default {
+ error "bad childsite option\
+ \"$itk_option(-childsitepos)\":\
+ should be n, e, s, or w"
+ }
+ }
+}
+# ------------------------------------------------------------------
+# OPTION: -nocase
+#
+# Specifies whether or not lowercase characters can match either
+# lowercase or uppercase letters in string.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Regexpfield::nocase {
+
+ switch $itk_option(-nocase) {
+ 0 - 1 {
+
+ }
+
+ default {
+ error "bad nocase option \"$itk_option(-nocase)\":\
+ should be 0 or 1"
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# METHODS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# METHOD: childsite
+#
+# Returns the path name of the child site widget.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Regexpfield::childsite {} {
+ return $itk_component(efchildsite)
+}
+
+# ------------------------------------------------------------------
+# METHOD: get
+#
+# Thin wrap of the standard entry widget get method.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Regexpfield::get {} {
+ return [$itk_component(entry) get]
+}
+
+# ------------------------------------------------------------------
+# METHOD: delete
+#
+# Thin wrap of the standard entry widget delete method.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Regexpfield::delete {args} {
+ return [eval $itk_component(entry) delete $args]
+}
+
+# ------------------------------------------------------------------
+# METHOD: icursor
+#
+# Thin wrap of the standard entry widget icursor method.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Regexpfield::icursor {args} {
+ return [eval $itk_component(entry) icursor $args]
+}
+
+# ------------------------------------------------------------------
+# METHOD: index
+#
+# Thin wrap of the standard entry widget index method.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Regexpfield::index {args} {
+ return [eval $itk_component(entry) index $args]
+}
+
+# ------------------------------------------------------------------
+# METHOD: insert
+#
+# Thin wrap of the standard entry widget index method.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Regexpfield::insert {args} {
+ return [eval $itk_component(entry) insert $args]
+}
+
+# ------------------------------------------------------------------
+# METHOD: scan
+#
+# Thin wrap of the standard entry widget scan method.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Regexpfield::scan {args} {
+ return [eval $itk_component(entry) scan $args]
+}
+
+# ------------------------------------------------------------------
+# METHOD: selection
+#
+# Thin wrap of the standard entry widget selection method.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Regexpfield::selection {args} {
+ return [eval $itk_component(entry) selection $args]
+}
+
+# ------------------------------------------------------------------
+# METHOD: xview
+#
+# Thin wrap of the standard entry widget xview method.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Regexpfield::xview {args} {
+ return [eval $itk_component(entry) xview $args]
+}
+
+# ------------------------------------------------------------------
+# METHOD: clear
+#
+# Delete the current entry contents.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Regexpfield::clear {} {
+ $itk_component(entry) delete 0 end
+ icursor 0
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _peek char
+#
+# The peek procedure returns the value of the Regexpfield with the
+# char inserted at the insert position.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Regexpfield::_peek {char} {
+ set str [get]
+
+ set insertPos [index insert]
+ set firstPart [string range $str 0 [expr {$insertPos - 1}]]
+ set lastPart [string range $str $insertPos end]
+
+ append rtnVal $firstPart $char $lastPart
+ return $rtnVal
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _focusCommand
+#
+# Method bound to focus event which evaluates the current command
+# specified in the focuscommand option
+# ------------------------------------------------------------------
+itcl::body iwidgets::Regexpfield::_focusCommand {} {
+ uplevel #0 $itk_option(-focuscommand)
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _keyPress
+#
+# Monitor the key press event checking for return keys, fixed width
+# specification, and optional validation procedures.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Regexpfield::_keyPress {char sym state} {
+ #
+ # A Return key invokes the optionally specified command option.
+ #
+ if {$sym == "Return"} {
+ uplevel #0 $itk_option(-command)
+ return -code break 1
+ }
+
+ #
+ # Tabs, BackSpace, and Delete are passed on for other bindings.
+ #
+ if {($sym == "Tab") || ($sym == "BackSpace") || ($sym == "Delete")} {
+ return -code continue 1
+ }
+
+ #
+ # Character is not printable or the state is greater than one which
+ # means a modifier was used such as a control, meta key, or control
+ # or meta key with numlock down.
+ #
+ if {($char == "") || \
+ ($state == 4) || ($state == 8) || \
+ ($state == 36) || ($state == 40)} {
+ return -code continue 1
+ }
+
+ #
+ # If the fixed length option is not zero, then verify that the
+ # current length plus one will not exceed the limit. If so then
+ # invoke the invalid command procedure.
+ #
+ if {$itk_option(-fixed) != 0} {
+ if {[string length [get]] >= $itk_option(-fixed)} {
+ uplevel #0 $itk_option(-invalid)
+ return -code break 0
+ }
+ }
+
+ set flags ""
+
+ #
+ # Get the new value of the Regexpfield with the char inserted at the
+ # insert position.
+ #
+ # If the new value doesn't match up with the pattern stored in the
+ # -regexp option, then the invalid procedure is called.
+ #
+ # If the value of the "-nocase" option is true, then add the
+ # "-nocase" flag to the list of flags.
+ #
+ set newVal [_peek $char]
+
+ if {$itk_option(-nocase)} {
+ set valid [::regexp -nocase -- $itk_option(-regexp) $newVal]
+ } else {
+ set valid [::regexp $itk_option(-regexp) $newVal]
+ }
+
+ if {!$valid} {
+ uplevel #0 $itk_option(-invalid)
+ return -code break 0
+ }
+
+ return -code continue 1
+}
+
diff --git a/iwidgets/generic/roman.itcl b/iwidgets/generic/roman.itcl
new file mode 100644
index 00000000000..263f574eb26
--- /dev/null
+++ b/iwidgets/generic/roman.itcl
@@ -0,0 +1,29 @@
+namespace eval ::iwidgets {
+ variable romand
+ set romand(val) {1000 900 500 400 100 90 50 40 10 9 5 4 1}
+ set romand(upper) { M CM D CD C XC L XL X IX V IV I}
+ set romand(lower) { m cm d cd c xc l xl x ix v iv i}
+
+ proc roman2 {n {case upper}} {
+ variable romand
+ set r ""
+ foreach val $romand(val) sym $romand($case) {
+ while {$n >= $val} {
+ set r "$r$sym"
+ incr n -$val
+ }
+ }
+ return $r
+ }
+
+ proc roman {n {case upper}} {
+ variable romand
+ set r ""
+ foreach val $romand(val) sym $romand($case) {
+ for {} {$n >= $val} {incr n -$val} {
+ set r "$r$sym"
+ }
+ }
+ return $r
+ }
+}
diff --git a/iwidgets/generic/scopedobject.itcl b/iwidgets/generic/scopedobject.itcl
new file mode 100644
index 00000000000..e18a0bbb4a1
--- /dev/null
+++ b/iwidgets/generic/scopedobject.itcl
@@ -0,0 +1,181 @@
+#
+# Scopedobject
+# -----------------------------------------------------------------------------
+# Implements a base class for defining Itcl classes which posses
+# scoped behavior like Tcl variables. The objects are only accessible
+# within the procedure in which they are instantiated and are deleted
+# when the procedure returns.
+#
+# Option(s):
+#
+# -enterscopecommand: Tcl command to invoke when a object enters scope
+# (i.e. when it is created ...).
+#
+# -exitscopecommand: Tcl command to invoke when a object exits scope
+# (i.e. when it is deleted ...).
+#
+# Note(s):
+#
+# Although a Scopedobject instance will automatically destroy itself
+# when it goes out of scope, one may explicity delete an instance
+# before it destroys itself.
+#
+# Example(s):
+#
+# Creating an instance at local scope in a procedure provides
+# an opportunity for tracing the entry and exiting of that
+# procedure. Users can register their proc/method tracing handlers
+# with the Scopedobject class via either of the following two ways:
+#
+# 1.) configure the "-exitscopecommand" on a Scopedobject instance;
+# e.g.
+# #!/usr/local/bin/wish
+#
+# proc tracedProc {} {
+# scopedobject #auto \
+# -exitscopecommand {puts "enter tracedProc"} \
+# -exitscopecommand {puts "exit tracedProc"}
+# }
+#
+# 2.) deriving from the Scopedobject and implementing the exit handling
+# in their derived classes destructor.
+# e.g.
+#
+# #!/usr/local/bin/wish
+#
+# class Proctrace {
+# inherit Scopedobject
+#
+# proc procname {} {
+# return [info level -1]
+# }
+#
+# constructor {args} {
+# puts "enter [procname]"
+# eval configure $args
+# }
+#
+# destructor {
+# puts "exit [procname]"
+# }
+# }
+#
+# proc tracedProc {} {
+# Proctrace #auto
+# }
+#
+# -----------------------------------------------------------------------------
+# AUTHOR: John Tucker
+# DSC Communications Corp
+# -----------------------------------------------------------------------------
+
+itcl::class iwidgets::Scopedobject {
+
+ #
+ # OPTIONS:
+ #
+ public {
+ variable enterscopecommand {}
+ variable exitscopecommand {}
+ }
+
+ #
+ # PUBLIC:
+ #
+ constructor {args} {}
+ destructor {}
+
+ #
+ # PRIVATE:
+ #
+ private {
+
+ # Implements the Tcl trace command callback which is responsible
+ # for destroying a Scopedobject instance when its corresponding
+ # Tcl variable goes out of scope.
+ #
+ method _traceCommand {varName varValue op}
+
+ # Stores the stack level of the invoking procedure in which
+ # a Scopedobject instance in created.
+ #
+ variable _level 0
+ }
+}
+
+#
+# Provide a lowercased access method for the Scopedobject class.
+#
+proc ::iwidgets::scopedobject {pathName args} {
+ uplevel ::iwidgets::Scopedobject $pathName $args
+}
+
+#--------------------------------------------------------------------------------
+# CONSTRUCTOR
+#--------------------------------------------------------------------------------
+itcl::body iwidgets::Scopedobject::constructor {args} {
+
+ # Create a local variable in the procedure which this instance was created,
+ # and then register out instance deletion command (i.e. _traceCommand)
+ # to be called whenever the local variable is unset.
+ #
+ # If this is a derived class, then we will need to perform the variable creation
+ # and tracing N levels up the stack frame, where:
+ # N = depth of inheritance hierarchy.
+ #
+ set depth [llength [$this info heritage]]
+ set _level "#[uplevel $depth info level]"
+ uplevel $_level set _localVar($this) $this
+ uplevel $_level trace variable _localVar($this) u \"[itcl::code $this _traceCommand]\"
+
+ eval configure $args
+
+ if {$enterscopecommand != {}} {
+ eval $enterscopecommand
+ }
+}
+
+#--------------------------------------------------------------------------------
+# DESTRUCTOR
+#--------------------------------------------------------------------------------
+itcl::body iwidgets::Scopedobject::destructor {} {
+
+ uplevel $_level trace vdelete _localVar($this) u \"[itcl::code $this _traceCommand]\"
+
+ if {$exitscopecommand != {}} {
+ eval $exitscopecommand
+ }
+}
+
+#--------------------------------------------------------------------------------#
+#
+# METHOD: _traceCommand
+#
+# PURPOSE:
+# Callback used to destroy instances when their locally created variable
+# goes out of scope.
+#
+itcl::body iwidgets::Scopedobject::_traceCommand {varName varValue op} {
+ delete object $this
+}
+
+#------------------------------------------------------------------------------
+#
+# OPTION: -enterscopecommand
+#
+# PURPOSE:
+# Specifies a Tcl command to invoke when a object enters scope.
+#
+itcl::configbody iwidgets::Scopedobject::enterscopecommand {
+}
+
+#------------------------------------------------------------------------------
+#
+# OPTION: -exitscopecommand
+#
+# PURPOSE:
+# Specifies a Tcl command to invoke when an object exits scope.
+#
+itcl::configbody iwidgets::Scopedobject::exitscopecommand {
+}
+
diff --git a/iwidgets/generic/scrolledcanvas.itk b/iwidgets/generic/scrolledcanvas.itk
new file mode 100644
index 00000000000..aa113548940
--- /dev/null
+++ b/iwidgets/generic/scrolledcanvas.itk
@@ -0,0 +1,477 @@
+#
+# Scrolledcanvas
+# ----------------------------------------------------------------------
+# Implements horizontal and vertical scrollbars around a canvas childsite
+# Includes options to control display of scrollbars. The standard
+# canvas options and methods are supported.
+#
+# ----------------------------------------------------------------------
+# AUTHOR: Mark Ulferts mulferts@austin.dsccc.com
+#
+# @(#) $Id$
+# ----------------------------------------------------------------------
+# Copyright (c) 1995 DSC Technologies Corporation
+# ======================================================================
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+
+#
+# Usual options.
+#
+itk::usual Scrolledcanvas {
+ keep -activebackground -activerelief -background -borderwidth -cursor \
+ -elementborderwidth -foreground -highlightcolor -highlightthickness \
+ -insertbackground -insertborderwidth -insertofftime -insertontime \
+ -insertwidth -jump -labelfont -selectbackground -selectborderwidth \
+ -selectforeground -textbackground -troughcolor
+}
+
+# ------------------------------------------------------------------
+# SCROLLEDCANVAS
+# ------------------------------------------------------------------
+itcl::class iwidgets::Scrolledcanvas {
+ inherit iwidgets::Scrolledwidget
+
+ constructor {args} {}
+ destructor {}
+
+ itk_option define -autoresize autoResize AutoResize 1
+ itk_option define -automargin autoMargin AutoMargin 0
+
+ public method childsite {}
+ public method justify {direction}
+
+ public method addtag {args}
+ public method bbox {args}
+ public method bind {args}
+ public method canvasx {args}
+ public method canvasy {args}
+ public method coords {args}
+ public method create {args}
+ public method dchars {args}
+ public method delete {args}
+ public method dtag {args}
+ public method find {args}
+ public method focus {args}
+ public method gettags {args}
+ public method icursor {args}
+ public method index {args}
+ public method insert {args}
+ public method itemconfigure {args}
+ public method itemcget {args}
+ public method lower {args}
+ public method move {args}
+ public method postscript {args}
+ public method raise {args}
+ public method scale {args}
+ public method scan {args}
+ public method select {args}
+ public method type {args}
+ public method xview {args}
+ public method yview {args}
+}
+
+#
+# Provide a lowercased access method for the Scrolledcanvas class.
+#
+proc ::iwidgets::scrolledcanvas {pathName args} {
+ uplevel ::iwidgets::Scrolledcanvas $pathName $args
+}
+
+#
+# Use option database to override default resources of base classes.
+#
+option add *Scrolledcanvas.width 200 widgetDefault
+option add *Scrolledcanvas.height 230 widgetDefault
+option add *Scrolledcanvas.labelPos n widgetDefault
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledcanvas::constructor {args} {
+ #
+ # Create a clipping frame which will provide the border for
+ # relief display.
+ #
+ itk_component add clipper {
+ frame $itk_interior.clipper
+ } {
+ usual
+
+ keep -borderwidth -relief -highlightthickness -highlightcolor
+ rename -highlightbackground -background background Background
+ }
+ grid $itk_component(clipper) -row 0 -column 0 -sticky nsew
+ grid rowconfigure $_interior 0 -weight 1
+ grid columnconfigure $_interior 0 -weight 1
+
+ #
+ # Create a canvas to scroll
+ #
+ itk_component add canvas {
+ canvas $itk_component(clipper).canvas \
+ -height 1.0 -width 1.0 \
+ -scrollregion "0 0 1 1" \
+ -xscrollcommand \
+ [itcl::code $this _scrollWidget $itk_interior.horizsb] \
+ -yscrollcommand \
+ [itcl::code $this _scrollWidget $itk_interior.vertsb]
+ } {
+ usual
+
+ ignore -highlightthickness -highlightcolor
+
+ keep -closeenough -confine -scrollregion
+ keep -xscrollincrement -yscrollincrement
+
+ rename -background -textbackground textBackground Background
+ }
+ grid $itk_component(canvas) -row 0 -column 0 -sticky nsew
+ grid rowconfigure $itk_component(clipper) 0 -weight 1
+ grid columnconfigure $itk_component(clipper) 0 -weight 1
+
+ #
+ # Configure the command on the vertical scroll bar in the base class.
+ #
+ $itk_component(vertsb) configure \
+ -command [itcl::code $itk_component(canvas) yview]
+
+ #
+ # Configure the command on the horizontal scroll bar in the base class.
+ #
+ $itk_component(horizsb) configure \
+ -command [itcl::code $itk_component(canvas) xview]
+
+ #
+ # Initialize the widget based on the command line options.
+ #
+ eval itk_initialize $args
+}
+
+# ------------------------------------------------------------------
+# DESTURCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledcanvas::destructor {} {
+}
+
+# ------------------------------------------------------------------
+# OPTIONS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# OPTION: -autoresize
+#
+# Automatically adjusts the scrolled region to be the bounding
+# box covering all the items in the canvas following the execution
+# of any method which creates or destroys items. Thus, as new
+# items are added, the scrollbars adjust accordingly.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Scrolledcanvas::autoresize {
+ if {$itk_option(-autoresize)} {
+ set bbox [$itk_component(canvas) bbox all]
+
+ if {$bbox != {}} {
+ set marg $itk_option(-automargin)
+ set bbox [lreplace $bbox 0 0 [expr {[lindex $bbox 0] - $marg}]]
+ set bbox [lreplace $bbox 1 1 [expr {[lindex $bbox 1] - $marg}]]
+ set bbox [lreplace $bbox 2 2 [expr {[lindex $bbox 2] + $marg}]]
+ set bbox [lreplace $bbox 3 3 [expr {[lindex $bbox 3] + $marg}]]
+ }
+
+ $itk_component(canvas) configure -scrollregion $bbox
+ }
+}
+
+# ------------------------------------------------------------------
+# METHODS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# METHOD: childsite
+#
+# Returns the path name of the child site widget.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledcanvas::childsite {} {
+ return $itk_component(canvas)
+}
+
+# ------------------------------------------------------------------
+# METHOD: justify
+#
+# Justifies the canvas scrolled region in one of four directions: top,
+# bottom, left, or right.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledcanvas::justify {direction} {
+ if {[winfo ismapped $itk_component(canvas)]} {
+ update idletasks
+
+ switch $direction {
+ left {
+ $itk_component(canvas) xview moveto 0
+ }
+ right {
+ $itk_component(canvas) xview moveto 1
+ }
+ top {
+ $itk_component(canvas) yview moveto 0
+ }
+ bottom {
+ $itk_component(canvas) yview moveto 1
+ }
+ default {
+ error "bad justify argument \"$direction\": should be\
+ left, right, top, or bottom"
+ }
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# CANVAS METHODS:
+#
+# The following methods are thin wraps of standard canvas methods.
+# Consult the Tk canvas man pages for functionallity and argument
+# documentation
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# METHOD: addtag tag searchSpec ?arg arg ...?
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledcanvas::addtag {args} {
+ return [eval $itk_component(canvas) addtag $args]
+}
+
+# ------------------------------------------------------------------
+# METHOD: bbox tagOrId ?tagOrId tagOrId ...?
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledcanvas::bbox {args} {
+ return [eval $itk_component(canvas) bbox $args]
+}
+
+# ------------------------------------------------------------------
+# METHOD: bind tagOrId ?sequence? ?command?
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledcanvas::bind {args} {
+ return [eval $itk_component(canvas) bind $args]
+}
+
+# ------------------------------------------------------------------
+# METHOD: canvasx screenx ?gridspacing?
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledcanvas::canvasx {args} {
+ return [eval $itk_component(canvas) canvasx $args]
+}
+
+# ------------------------------------------------------------------
+# METHOD: canvasy screeny ?gridspacing?
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledcanvas::canvasy {args} {
+ return [eval $itk_component(canvas) canvasy $args]
+}
+
+# ------------------------------------------------------------------
+# METHOD: coords tagOrId ?x0 y0 ...?
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledcanvas::coords {args} {
+ return [eval $itk_component(canvas) coords $args]
+}
+
+# ------------------------------------------------------------------
+# METHOD: create type x y ?x y ...? ?option value ...?
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledcanvas::create {args} {
+ set retval [eval $itk_component(canvas) create $args]
+
+ configure -autoresize $itk_option(-autoresize)
+
+ return $retval
+}
+
+# ------------------------------------------------------------------
+# METHOD: dchars tagOrId first ?last?
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledcanvas::dchars {args} {
+ return [eval $itk_component(canvas) dchars $args]
+}
+
+# ------------------------------------------------------------------
+# METHOD: delete tagOrId ?tagOrId tagOrId ...?
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledcanvas::delete {args} {
+ set retval [eval $itk_component(canvas) delete $args]
+
+ configure -autoresize $itk_option(-autoresize)
+
+ return $retval
+}
+
+# ------------------------------------------------------------------
+# METHOD: dtag tagOrId ?tagToDelete?
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledcanvas::dtag {args} {
+ eval $itk_component(canvas) dtag $args
+
+ configure -autoresize $itk_option(-autoresize)
+}
+
+# ------------------------------------------------------------------
+# METHOD: find searchCommand ?arg arg ...?
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledcanvas::find {args} {
+ return [eval $itk_component(canvas) find $args]
+}
+
+# ------------------------------------------------------------------
+# METHOD: focus ?tagOrId?
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledcanvas::focus {args} {
+ return [eval $itk_component(canvas) focus $args]
+}
+
+# ------------------------------------------------------------------
+# METHOD: gettags tagOrId
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledcanvas::gettags {args} {
+ return [eval $itk_component(canvas) gettags $args]
+}
+
+# ------------------------------------------------------------------
+# METHOD: icursor tagOrId index
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledcanvas::icursor {args} {
+ eval $itk_component(canvas) icursor $args
+}
+
+# ------------------------------------------------------------------
+# METHOD: index tagOrId index
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledcanvas::index {args} {
+ return [eval $itk_component(canvas) index $args]
+}
+
+# ------------------------------------------------------------------
+# METHOD: insert tagOrId beforeThis string
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledcanvas::insert {args} {
+ eval $itk_component(canvas) insert $args
+}
+
+# ------------------------------------------------------------------
+# METHOD: itemconfigure tagOrId ?option? ?value? ?option value ...?
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledcanvas::itemconfigure {args} {
+ set retval [eval $itk_component(canvas) itemconfigure $args]
+
+ configure -autoresize $itk_option(-autoresize)
+
+ return $retval
+}
+
+# ------------------------------------------------------------------
+# METHOD: itemcget tagOrId ?option?
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledcanvas::itemcget {args} {
+ set retval [eval $itk_component(canvas) itemcget $args]
+
+ return $retval
+}
+
+# ------------------------------------------------------------------
+# METHOD: lower tagOrId ?belowThis?
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledcanvas::lower {args} {
+ eval $itk_component(canvas) lower $args
+}
+
+# ------------------------------------------------------------------
+# METHOD: move tagOrId xAmount yAmount
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledcanvas::move {args} {
+ eval $itk_component(canvas) move $args
+
+ configure -autoresize $itk_option(-autoresize)
+}
+
+# ------------------------------------------------------------------
+# METHOD: postscript ?option value ...?
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledcanvas::postscript {args} {
+ #
+ # Make sure the fontmap is in scope.
+ #
+ set fontmap ""
+ regexp -- {-fontmap +([^ ]+)} $args all fontmap
+
+ if {$fontmap != ""} {
+ global $fontmap
+ }
+
+ return [eval $itk_component(canvas) postscript $args]
+}
+
+# ------------------------------------------------------------------
+# METHOD: raise tagOrId ?aboveThis?
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledcanvas::raise {args} {
+ eval $itk_component(canvas) raise $args
+}
+
+# ------------------------------------------------------------------
+# METHOD: scale tagOrId xOrigin yOrigin xScale yScale
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledcanvas::scale {args} {
+ eval $itk_component(canvas) scale $args
+}
+
+# ------------------------------------------------------------------
+# METHOD: scan option args
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledcanvas::scan {args} {
+ eval $itk_component(canvas) scan $args
+}
+
+# ------------------------------------------------------------------
+# METHOD: select option ?tagOrId arg?
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledcanvas::select {args} {
+ eval $itk_component(canvas) select $args
+}
+
+# ------------------------------------------------------------------
+# METHOD: type tagOrId
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledcanvas::type {args} {
+ return [eval $itk_component(canvas) type $args]
+}
+
+# ------------------------------------------------------------------
+# METHOD: xview index
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledcanvas::xview {args} {
+ eval $itk_component(canvas) xview $args
+}
+
+# ------------------------------------------------------------------
+# METHOD: yview index
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledcanvas::yview {args} {
+ eval $itk_component(canvas) yview $args
+}
diff --git a/iwidgets/generic/scrolledframe.itk b/iwidgets/generic/scrolledframe.itk
new file mode 100644
index 00000000000..c1ab75755eb
--- /dev/null
+++ b/iwidgets/generic/scrolledframe.itk
@@ -0,0 +1,250 @@
+#
+# Scrolledframe
+# ----------------------------------------------------------------------
+# Implements horizontal and vertical scrollbars around a childsite
+# frame. Includes options to control display of scrollbars.
+#
+# ----------------------------------------------------------------------
+# AUTHOR: Mark Ulferts mulferts@austin.dsccc.com
+#
+# @(#) $Id$
+# ----------------------------------------------------------------------
+# Copyright (c) 1995 DSC Technologies Corporation
+# ======================================================================
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+
+#
+# Usual options.
+#
+itk::usual Scrolledframe {
+ keep -activebackground -activerelief -background -borderwidth -cursor \
+ -elementborderwidth -foreground -highlightcolor -highlightthickness \
+ -jump -labelfont -troughcolor
+}
+
+# ------------------------------------------------------------------
+# SCROLLEDFRAME
+# ------------------------------------------------------------------
+itcl::class iwidgets::Scrolledframe {
+ inherit iwidgets::Scrolledwidget
+
+ constructor {args} {}
+ destructor {}
+
+ public method childsite {}
+ public method justify {direction}
+ public method xview {args}
+ public method yview {args}
+
+ protected method _configureCanvas {}
+ protected method _configureFrame {}
+}
+
+#
+# Provide a lowercased access method for the Scrolledframe class.
+#
+proc ::iwidgets::scrolledframe {pathName args} {
+ uplevel ::iwidgets::Scrolledframe $pathName $args
+}
+
+#
+# Use option database to override default resources of base classes.
+#
+option add *Scrolledframe.width 100 widgetDefault
+option add *Scrolledframe.height 100 widgetDefault
+option add *Scrolledframe.labelPos n widgetDefault
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledframe::constructor {args} {
+ itk_option remove iwidgets::Labeledwidget::state
+
+ #
+ # Create a clipping frame which will provide the border for
+ # relief display.
+ #
+ itk_component add clipper {
+ frame $itk_interior.clipper
+ } {
+ usual
+
+ keep -borderwidth -relief
+ }
+ grid $itk_component(clipper) -row 0 -column 0 -sticky nsew
+ grid rowconfigure $_interior 0 -weight 1
+ grid columnconfigure $_interior 0 -weight 1
+
+ #
+ # Create a canvas to scroll
+ #
+ itk_component add canvas {
+ canvas $itk_component(clipper).canvas \
+ -height 1.0 -width 1.0 \
+ -scrollregion "0 0 1 1" \
+ -xscrollcommand \
+ [itcl::code $this _scrollWidget $itk_interior.horizsb] \
+ -yscrollcommand \
+ [itcl::code $this _scrollWidget $itk_interior.vertsb] \
+ -highlightthickness 0 -takefocus 0
+ } {
+ ignore -highlightcolor -highlightthickness
+ keep -background -cursor
+ }
+ grid $itk_component(canvas) -row 0 -column 0 -sticky nsew
+ grid rowconfigure $itk_component(clipper) 0 -weight 1
+ grid columnconfigure $itk_component(clipper) 0 -weight 1
+
+ #
+ # Configure the command on the vertical scroll bar in the base class.
+ #
+ $itk_component(vertsb) configure \
+ -command [itcl::code $itk_component(canvas) yview]
+
+ #
+ # Configure the command on the horizontal scroll bar in the base class.
+ #
+ $itk_component(horizsb) configure \
+ -command [itcl::code $itk_component(canvas) xview]
+
+ #
+ # Handle configure events on the canvas to adjust the frame size
+ # according to the scrollregion.
+ #
+ bind $itk_component(canvas) <Configure> [itcl::code $this _configureCanvas]
+
+ #
+ # Create a Frame inside canvas to hold widgets to be scrolled
+ #
+ itk_component add -protected sfchildsite {
+ frame $itk_component(canvas).sfchildsite
+ } {
+ keep -background -cursor
+ }
+ pack $itk_component(sfchildsite) -fill both -expand yes
+ $itk_component(canvas) create window 0 0 -tags frameTag \
+ -window $itk_component(sfchildsite) -anchor nw
+ set itk_interior $itk_component(sfchildsite)
+ bind $itk_component(sfchildsite) <Configure> [itcl::code $this _configureFrame]
+
+ #
+ # Initialize the widget based on the command line options.
+ #
+ eval itk_initialize $args
+}
+
+# ------------------------------------------------------------------
+# DESTURCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledframe::destructor {} {
+}
+
+
+# ------------------------------------------------------------------
+# METHODS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# METHOD: childsite
+#
+# Returns the path name of the child site widget.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledframe::childsite {} {
+ return $itk_component(sfchildsite)
+}
+
+# ------------------------------------------------------------------
+# METHOD: justify
+#
+# Justifies the scrolled region in one of four directions: top,
+# bottom, left, or right.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledframe::justify {direction} {
+ if {[winfo ismapped $itk_component(canvas)]} {
+ update idletasks
+
+ switch $direction {
+ left {
+ $itk_component(canvas) xview moveto 0
+ }
+ right {
+ $itk_component(canvas) xview moveto 1
+ }
+ top {
+ $itk_component(canvas) yview moveto 0
+ }
+ bottom {
+ $itk_component(canvas) yview moveto 1
+ }
+ default {
+ error "bad justify argument \"$direction\": should be\
+ left, right, top, or bottom"
+ }
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# METHOD: xview index
+#
+# Adjust the view in the frame so that character position index
+# is displayed at the left edge of the widget.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledframe::xview {args} {
+ return [eval $itk_component(canvas) xview $args]
+}
+
+# ------------------------------------------------------------------
+# METHOD: yview index
+#
+# Adjust the view in the frame so that character position index
+# is displayed at the top edge of the widget.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledframe::yview {args} {
+ return [eval $itk_component(canvas) yview $args]
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _configureCanvas
+#
+# Responds to configure events on the canvas widget. When canvas
+# changes size, adjust frame size.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledframe::_configureCanvas {} {
+ set sr [$itk_component(canvas) cget -scrollregion]
+ set srw [lindex $sr 2]
+ set srh [lindex $sr 3]
+
+ $itk_component(sfchildsite) configure -height $srh -width $srw
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _configureFrame
+#
+# Responds to configure events on the frame widget. When the frame
+# changes size, adjust scrolling region size.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledframe::_configureFrame {} {
+ $itk_component(canvas) configure \
+ -scrollregion [$itk_component(canvas) bbox frameTag]
+}
+
diff --git a/iwidgets/generic/scrolledhtml.itk b/iwidgets/generic/scrolledhtml.itk
new file mode 100644
index 00000000000..988485f40b8
--- /dev/null
+++ b/iwidgets/generic/scrolledhtml.itk
@@ -0,0 +1,2521 @@
+# Scrolledhtml
+# ----------------------------------------------------------------------
+# Implements a scrolled html text widget by inheritance from scrolledtext
+# Import reads from an html file, while export still writes plain text
+# Also provides a render command, to display html text passed in as an
+# argument.
+#
+# This widget is HTML3.2 compliant, with the following exceptions:
+# a) nothing requiring a connection to an HTTP server is supported
+# b) some of the image alignments aren't supported, because they're not
+# supported by the text widget
+# c) the br attributes that go with the image alignments aren't implemented
+# d) background images are not supported, because they're not supported
+# by the text widget
+# e) automatic table/table cell sizing doesn't work very well.
+#
+# WISH LIST:
+# This section lists possible future enhancements.
+#
+# 1) size tables better using dlineinfo.
+# 2) make images scroll smoothly off top like they do off bottom. (limitation
+# of text widget?)
+# 3) add ability to get non-local URLs
+# a) support forms
+# b) support imagemaps
+# 4) keep track of visited links
+# 5) add tclets support
+#
+# BUGS:
+# Cells in a table can be caused to overlap. ex:
+# <table border width="100%">
+# <tr><td>cell1</td><td align=right rowspan=2>cell2</td></tr>
+# <tr><td colspan=2>cell3 w/ overlap</td>
+# </table>
+# It hasn't been fixed because 1) it's a pain to fix, 2) the fix would slow
+# tables down by a significant amount, and 3) netscape has the same
+# bug, as of V3.01, and no one seems to care.
+#
+# In order to size tables properly, they must be visible, which causes an
+# annoying jump from table to table through the document at render time.
+#
+# ----------------------------------------------------------------------
+# AUTHOR: Kris Raney EMAIL: kraney@spd.dsccc.com
+#
+# @(#) $Id$
+# ----------------------------------------------------------------------
+# Copyright (c) 1996 DSC Technologies Corporation
+# ======================================================================
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+
+# Acknowledgements:
+#
+# Special thanks go to Sam Shen(SLShen@lbl.gov), as this code is based on his
+# tkhtml.tcl code from tk inspect. The original code is copyright 1995
+# Lawrence Berkeley Laboratory.
+#
+# This software is copyright (C) 1995 by the Lawrence Berkeley Laboratory.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that: (1) source code distributions
+# retain the above copyright notice and this paragraph in its entirety, (2)
+# distributions including binary code include the above copyright notice and
+# this paragraph in its entirety in the documentation or other materials
+# provided with the distribution, and (3) all advertising materials mentioning
+# features or use of this software display the following acknowledgement:
+# ``This product includes software developed by the University of California,
+# Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
+# the University nor the names of its contributors may be used to endorse
+# or promote products derived from this software without specific prior
+# written permission.
+#
+# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+#
+# This code is based on Angel Li's (angel@flipper.rsmas.miami.edu) HTML
+
+
+#
+# Default resources.
+#
+option add *Scrolledhtml.borderWidth 2 widgetDefault
+option add *Scrolledhtml.relief sunken widgetDefault
+option add *Scrolledhtml.scrollMargin 3 widgetDefault
+option add *Scrolledhtml.width 500 widgetDefault
+option add *Scrolledhtml.height 600 widgetDefault
+option add *Scrolledhtml.visibleItems 80x24 widgetDefault
+option add *Scrolledhtml.vscrollMode static widgetDefault
+option add *Scrolledhtml.hscrollMode static widgetDefault
+option add *Scrolledhtml.labelPos n widgetDefault
+option add *Scrolledhtml.wrap word widgetDefault
+
+#
+# Usual options.
+#
+itk::usual Scrolledhtml {
+ keep -fontname -fontsize -fixedfont -link -alink -linkhighlight \
+ -activebackground -activerelief -background -borderwidth -cursor \
+ -elementborderwidth -foreground -highlightcolor -highlightthickness \
+ -insertbackground -insertborderwidth -insertofftime -insertontime \
+ -insertwidth -jump -labelfont -selectbackground -selectborderwidth \
+ -selectforeground -textbackground -textfont -troughcolor -unknownimage
+}
+
+# ------------------------------------------------------------------
+# SCROLLEDHTML
+# ------------------------------------------------------------------
+itcl::class iwidgets::Scrolledhtml {
+ inherit iwidgets::Scrolledtext
+
+ constructor {args} {}
+ destructor {}
+
+ itk_option define -feedback feedBack FeedBack {}
+ itk_option define -linkcommand linkCommand LinkCommand {}
+ itk_option define -fontname fontname FontName times
+ itk_option define -fixedfont fixedFont FixedFont courier
+ itk_option define -fontsize fontSize FontSize medium
+ itk_option define -link link Link blue
+ itk_option define -alink alink ALink red
+ itk_option define -linkhighlight alink ALink red
+ itk_option define -unknownimage unknownimage File {}
+ itk_option define -textbackground textBackground Background {}
+ itk_option define -update update Update 1
+ itk_option define -debug debug Debug 0
+
+ public method import {args}
+ public method clear {}
+ public method render {html {wd .}}
+ public method title {} {return $_title}
+ public method pwd {} {return $_cwd}
+
+ protected method _setup {}
+ protected method _set_tag {}
+ protected method _reconfig_tags {}
+ protected method _append_text {text}
+ protected method _do {text}
+ protected method _definefont {name foundry family weight slant registry}
+ protected method _peek {instack}
+ protected method _push {instack value}
+ protected method _pop {instack}
+ protected method _parse_fields {array_var string}
+ protected method _href_click {cmd href}
+ protected method _set_align {align}
+ protected method _fixtablewidth {hottext table multiplier}
+
+ protected method _header {level args}
+ protected method _/header {level}
+
+ protected method _entity_a {args}
+ protected method _entity_/a {}
+ protected method _entity_address {}
+ protected method _entity_/address {}
+ protected method _entity_b {}
+ protected method _entity_/b {}
+ protected method _entity_base {{args {}}}
+ protected method _entity_basefont {{args {}}}
+ protected method _entity_big {}
+ protected method _entity_/big {}
+ protected method _entity_blockquote {}
+ protected method _entity_/blockquote {}
+ protected method _entity_body {{args {}}}
+ protected method _entity_/body {}
+ protected method _entity_br {{args {}}}
+ protected method _entity_center {}
+ protected method _entity_/center {}
+ protected method _entity_cite {}
+ protected method _entity_/cite {}
+ protected method _entity_code {}
+ protected method _entity_/code {}
+ protected method _entity_dir {{args {}}}
+ protected method _entity_/dir {}
+ protected method _entity_div {{args {}}}
+ protected method _entity_dl {{args {}}}
+ protected method _entity_/dl {}
+ protected method _entity_dt {}
+ protected method _entity_dd {}
+ protected method _entity_dfn {}
+ protected method _entity_/dfn {}
+ protected method _entity_em {}
+ protected method _entity_/em {}
+ protected method _entity_font {{args {}}}
+ protected method _entity_/font {}
+ protected method _entity_h1 {{args {}}}
+ protected method _entity_/h1 {}
+ protected method _entity_h2 {{args {}}}
+ protected method _entity_/h2 {}
+ protected method _entity_h3 {{args {}}}
+ protected method _entity_/h3 {}
+ protected method _entity_h4 {{args {}}}
+ protected method _entity_/h4 {}
+ protected method _entity_h5 {{args {}}}
+ protected method _entity_/h5 {}
+ protected method _entity_h6 {{args {}}}
+ protected method _entity_/h6 {}
+ protected method _entity_hr {{args {}}}
+ protected method _entity_i {}
+ protected method _entity_/i {}
+ protected method _entity_img {{args {}}}
+ protected method _entity_kbd {}
+ protected method _entity_/kbd {}
+ protected method _entity_li {{args {}}}
+ protected method _entity_listing {}
+ protected method _entity_/listing {}
+ protected method _entity_menu {{args {}}}
+ protected method _entity_/menu {}
+ protected method _entity_ol {{args {}}}
+ protected method _entity_/ol {}
+ protected method _entity_p {{args {}}}
+ protected method _entity_pre {{args {}}}
+ protected method _entity_/pre {}
+ protected method _entity_samp {}
+ protected method _entity_/samp {}
+ protected method _entity_small {}
+ protected method _entity_/small {}
+ protected method _entity_sub {}
+ protected method _entity_/sub {}
+ protected method _entity_sup {}
+ protected method _entity_/sup {}
+ protected method _entity_strong {}
+ protected method _entity_/strong {}
+ protected method _entity_table {{args {}}}
+ protected method _entity_/table {}
+ protected method _entity_td {{args {}}}
+ protected method _entity_/td {}
+ protected method _entity_th {{args {}}}
+ protected method _entity_/th {}
+ protected method _entity_title {}
+ protected method _entity_/title {}
+ protected method _entity_tr {{args {}}}
+ protected method _entity_/tr {}
+ protected method _entity_tt {}
+ protected method _entity_/tt {}
+ protected method _entity_u {}
+ protected method _entity_/u {}
+ protected method _entity_ul {{args {}}}
+ protected method _entity_/ul {}
+ protected method _entity_var {}
+ protected method _entity_/var {}
+
+ protected variable _title {} ;# The title of the html document
+ protected variable _licount 1 ;# list element count
+ protected variable _listyle bullet ;# list element style
+ protected variable _lipic {} ;# picture to use as bullet
+ protected variable _color black ;# current text color
+ protected variable _bgcolor #d9d9d9 ;# current background color
+ protected variable _link blue ;# current link color
+ protected variable _alink red ;# current highlight link color
+ protected variable _smallpoints "60 80 100 120 140 180 240" ;# font point
+ protected variable _mediumpoints "80 100 120 140 180 240 360" ;# sizes for
+ protected variable _largepoints "100 120 140 180 240 360 480" ;# various
+ protected variable _hugepoints "120 140 180 240 360 480 640" ;# fontsizes
+ protected variable _font times ;# name of current font
+ protected variable _rulerheight 6 ;#
+ protected variable _indentincr 4 ;# increment to indent by
+ protected variable _counter -1 ;# counter to give unique numbers
+ protected variable _left 0 ;# initial left margin
+ protected variable _left2 0 ;# subsequent left margin
+ protected variable _right 0 ;# right margin
+ protected variable _justify L ;# text justification
+ protected variable _offset 0 ;# text offset (super/subscript)
+ protected variable _textweight 0 ;# boldness of text
+ protected variable _textslant 0 ;# whether to use italics
+ protected variable _underline 0 ;# whether to use underline
+ protected variable _verbatim 0 ;# whether to skip formatting
+ protected variable _pre 0 ;# preformatted text
+ protected variable _intitle 0 ;# in <title>...</title>
+ protected variable _anchorcount 0 ;# number of anchors
+ protected variable _stack ;# array of stacks
+ protected variable _pointsndx 2 ;#
+ protected variable _fontnames ;# list of accepted font names
+ protected variable _fontinfo ;# array of font info given font name
+ protected variable _tag ;#
+ protected variable _tagl ;#
+ protected variable _tagfont ;#
+ protected variable _cwd . ;# base directory of current page
+ protected variable _anchor ;# array of indexes by anchorname
+ protected variable _defaulttextbackground;# default text background
+ protected variable _intable 0 ;# whether we are in a table now
+ protected variable _hottext ;# widget where text currently goes
+ protected variable _basefontsize 2 ;# as named
+ protected variable _unknownimg {} ;# name of unknown image
+ protected variable _images {} ;# list of images we created
+ protected variable _prevpos {} ;# temporary used for table updates
+ protected variable _prevtext {} ;# temporary used for table updates
+
+ private variable _initialized 0
+
+ private variable _defUnknownImg [::image create photo -data {
+R0lGODdhHwAgAPQAAP///wAAAMzMzC9PT76+vvnTogCR/1WRVaoAVf//qvT09OKdcWlcx19f
+X9/f339/f8vN/J2d/aq2qoKCggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ACwAAAAAHwAgAAAF/iAgjqRDnmiKmqOkqsTaToDjvudTttLjOITJbTQhGI+iQE0xMvZqQIDw
+NAEiAcqRVdKAGh0NyVCkuyqZBEmwofgRrFIxSaI0JmuA9KTrthIicWMTAQ8xWHgSe15AVgcJ
+eVMjDwECOkome22Mb0cHCzEPOiQPgwGXCjomakedA0VgY1IPDZcuP3l5YkcRDwMHqDQoEzq2
+Pz8IQkK7Bw8HDg+xO26PCAgRDcpGswEK2Dh9ItUMDdirPYUKwTKMjwDV1gHlR2oCkSmcI9UE
+BabYrGnQoolgBCGckX7yWJWDYaUMAYSRFECAwMXeiU1BHpKTB4CBR4+oBOb5By1UNgUfXj0C
+8HaP079sBCCkZIAKWst/OGPOhNBNHQmXOeftJBASRVCcEiIojQDBwIOeRo+SpGXKFFGbP6Xi
+nLWxEMsmWpEOC9XDYtigYtKSwsH2xdq2cEfRmFS1rt27eE09CAEAOw==
+}]
+}
+
+#
+# Provide a lowercased access method for the Scrolledhtml class.
+#
+proc ::iwidgets::scrolledhtml {pathName args} {
+ uplevel ::iwidgets::Scrolledhtml $pathName $args
+}
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::constructor {args} {
+ # define the fonts we're going to use
+ set _fontnames ""
+ _definefont helvetica adobe helvetica "medium bold" "r o" iso8859
+ _definefont courier adobe courier "medium bold" "r o" iso8859
+ _definefont times adobe times "medium bold" "r i" iso8859
+ _definefont symbol adobe symbol "medium medium" "r r" adobe
+
+ $itk_component(text) configure -state disabled
+
+ eval itk_initialize $args
+ if {[lsearch -exact $args -linkcommand] == -1} {
+ configure -linkcommand [itcl::code $this import -link]
+ }
+ set _initialized 1
+}
+
+# ------------------------------------------------------------------
+# DESTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::destructor {} {
+ foreach x $_images {
+ ::image delete $x
+ }
+ if {$_unknownimg != $_defUnknownImg} {
+ ::image delete $_unknownimg
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTIONS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# OPTION: -fontsize
+#
+# Set the general size of the font.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Scrolledhtml::fontsize {
+ switch $itk_option(-fontsize) {
+ small { }
+ medium { }
+ large { }
+ huge { }
+ default {
+ error "bad fontsize option\
+ \"$itk_option(-fontsize)\": should\
+ be small, medium, large, or huge"
+ }
+ }
+ _reconfig_tags
+}
+
+# ------------------------------------------------------------------
+# OPTION: -fixedfont
+#
+# Set the fixed font name
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Scrolledhtml::fixedfont {
+ if {[lsearch -exact $_fontnames $itk_option(-fixedfont)] == -1} {
+ error "Invalid font name \"$itk_option(-fixedfont)\". Must be one of \
+ $_fontnames"
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -fontname
+#
+# Set the default font name
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Scrolledhtml::fontname {
+ if {[lsearch -exact $_fontnames $itk_option(-fontname)] == -1} {
+ error "Invalid font name \"$itk_option(-fontname)\". Must be one of \
+ $_fontnames"
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -textbackground
+#
+# Set the default text background
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Scrolledhtml::textbackground {
+ set _defaulttextbackground $itk_option(-textbackground)
+}
+
+# ------------------------------------------------------------------
+# OPTION: -linkhighlight
+#
+# same as alink
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Scrolledhtml::linkhighlight {
+ configure -alink $itk_option(-linkhighlight)
+}
+
+# ------------------------------------------------------------------
+# OPTION: -unknownimage
+#
+# set image to use as substitute for images that aren't found
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Scrolledhtml::unknownimage {
+ set oldimage $_unknownimg
+ if {$itk_option(-unknownimage) != {}} {
+ set uki $itk_option(-unknownimage)
+ if [catch { set _unknownimg [::image create photo -file $uki] } err] {
+ error "Couldn't create image $uki:\n$err\nUnknown image not found"
+ }
+ } else {
+ set _unknownimg $_defUnknownImg
+ }
+ if {$oldimage != {} && $oldimage != $_defUnknownImg} {
+ ::image delete $oldimage
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -update
+#
+# boolean indicating whether to update during rendering
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Scrolledhtml::update {
+ switch -- $itk_option(-update) {
+ 0 {}
+ 1 {}
+ true {
+ configure -update 1
+ }
+ yes {
+ configure -update 1
+ }
+ false {
+ configure -update 0
+ }
+ yes {
+ configure -update 0
+ }
+ default {
+ error "invalid -update; must be boolean"
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# METHODS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# METHOD: clear
+#
+# Clears the text out
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::clear {} {
+ $itk_component(text) config -state normal
+ $itk_component(text) delete 1.0 end
+ foreach x $_images {
+ ::image delete $x
+ }
+ set _images {}
+ _setup
+ $itk_component(text) config -state disabled
+}
+
+# ------------------------------------------------------------------
+# METHOD import ?-link? filename?#anchorname?
+#
+# read html text from a file (import filename) if the keyword link is present,
+# pathname is relative to last page, otherwise it is relative to current
+# directory. This allows the user to use a linkcommand of
+# "<widgetname> import -link"
+#
+# if '#anchorname' is appended to the filename, the page is displayed starting
+# at the anchor named 'anchorname' If an anchor is specified without a filename,
+# the current page is assumed.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::import {args} {
+
+ update idletasks
+
+ set len [llength $args]
+ if {$len != 1 && $len != 2} {
+ error "wrong # args: should be \
+ \"$itk_component(hull) import ?-link? filename\""
+ }
+ set linkname [lindex $args [expr {$len - 1}]]
+
+ #
+ # Seperate filename#anchorname
+ #
+ if ![regexp {(.*)#(.*)} $linkname dummy filename anchorname] {
+ set filename $linkname
+ }
+ if {$filename!=""} {
+ #
+ # Check for -link option
+ #
+ switch -- $len {
+ 1 {
+ #
+ # open file & set cwd to that file's directory
+ #
+ set f [open $filename r]
+ set _cwd [file dirname $filename]
+ }
+ 2 {
+ switch -- [lindex $args 0] {
+ -link {
+ #
+ # got -link, so set path relative to current locale, if path
+ # is a relative pathname
+ #
+ if {[string compare "." [file dirname $filename]] == 0} {
+ set f [open $_cwd/$filename r]
+ } else {
+ if {[string index [file dirname $filename] 0] != "/" &&\
+ [string index [file dirname $filename] 0] != "~"} {
+ set f [open $_cwd/$filename r]
+ append _cwd /
+ append _cwd [file dirname $filename]
+ } else {
+ set f [open $filename r]
+ set _cwd [file dirname $filename]
+ }
+ }
+ }
+ default {
+ # got something other than -link
+ error "invalid format: should be \
+ \"$itk_component(hull) import ?-link? filename\""
+ }
+ }
+ }
+ }
+ set txt [read $f]
+ close $f
+ render $txt $_cwd
+ }
+
+ #
+ # if an anchor was requested, move that anchor into view
+ #
+ if [ info exists anchorname] {
+ if {$anchorname!=""} {
+ if [info exists _anchor($anchorname)] {
+ $itk_component(text) see end
+ $itk_component(text) see $_anchor($anchorname)
+ }
+ } else {
+ $itk_component(text) see 0.0
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# METHOD: render text ?wd?
+#
+# Clear the text, then render html formatted text. Optional wd argument
+# sets the base directory for any links or images.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::render {html {wd .}} {
+
+ update idletasks
+
+ #
+ # blank text and reset all state variables
+ #
+ clear
+ set _cwd $wd
+
+ #
+ # make text writable
+ #
+ $itk_component(text) config -state normal
+ set continuerendering 1
+ _set_tag
+ while {$continuerendering} {
+ # normal state
+ while {[set len [string length $html]]} {
+ # look for text up to the next <> element
+ if [regexp -indices "^\[^<\]+" $html match] {
+ set text [string range $html 0 [lindex $match 1]]
+ _append_text "$text"
+ set html \
+ [string range $html [expr {[lindex $match 1]+1}] end]
+ }
+ # we're either at a <>, or at the eot
+ if [regexp -indices "^<((\[^>\"\]+|(\"\[^\"\]*\"))*)>" $html match entity] {
+ regsub -all "\n" [string range $html [lindex $entity 0] \
+ [lindex $entity 1]] "" entity
+ set cmd [string tolower [lindex $entity 0]]
+ if {[info command _entity_$cmd]!=""} {
+ if {[catch {eval _entity_$cmd [lrange $entity 1 end]} bad]} {
+ if {$itk_option(-debug)} {
+ global errorInfo
+ puts stderr "render: _entity_$cmd [lrange $entity 1 end] = Error:$bad\n$errorInfo"
+ }
+ }
+ }
+ set html \
+ [string range $html [expr {[lindex $match 1]+1}] end]
+ }
+ if {$itk_option(-feedback) != {} } {
+ eval $itk_option(-feedback) $len
+ }
+ if $_verbatim break
+ }
+ # we reach here if html is empty, or _verbatim is 1
+ if !$len break
+ # _verbatim must be 1
+ # append text until next tag is reached
+ if [regexp -indices "<.*>" $html match] {
+ set text [string range $html 0 [expr {[lindex $match 0]-1}]]
+ set html [string range $html [expr {[lindex $match 0]}] end]
+ } else {
+ set text $html
+ set html ""
+ }
+ _append_text "$text"
+ }
+ $itk_component(text) config -state disabled
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _setup
+#
+# Reset all state variables to prepare for a new page.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_setup {} {
+ set _font $itk_option(-fontname)
+ set _left 0
+ set _left2 0
+ set _right 0
+ set _justify L
+ set _textweight 0
+ set _textslant 0
+ set _underline 0
+ set _verbatim 0
+ set _pre 0
+ set _title {}
+ set _intitle 0
+ set _anchorcount 0
+ set _intable 0
+ set _hottext $itk_component(text)
+ set _stack(font) {}
+ set _stack(color) {}
+ set _stack(bgcolor) {}
+ set _stack(link) {}
+ set _stack(alink) {}
+ set _stack(justify) {}
+ set _stack(listyle) {}
+ set _stack(lipic) {}
+ set _stack(href) {}
+ set _stack(pointsndx) {}
+ set _stack(left) {}
+ set _stack(left2) {}
+ set _stack(offset) {}
+ set _stack(table) {}
+ set _stack(tablewidth) {}
+ set _stack(row) {}
+ set _stack(column) {}
+ set _stack(hottext) {}
+ set _stack(tableborder) {}
+ set _stack(cellpadding) {}
+ set _stack(cellspacing) {}
+ set _stack(licount) {}
+ set _basefontsize 2
+ set _pointsndx 2
+ set _counter -1
+ set _bgcolor $_defaulttextbackground
+ set _color $itk_option(-foreground)
+ set _link $itk_option(-link)
+ set _alink $itk_option(-alink)
+ config -textbackground $_bgcolor
+ foreach x [array names _anchor] { unset _anchor($x) }
+ $itk_component(text) tag config hr -relief sunken -borderwidth 2 \
+ -font -*-*-*-*-*-*-$_rulerheight-*-*-*-*-*-*-*
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _definefont name foundry family weight slant registry
+#
+# define font information used to generate font value from font name
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_definefont \
+ {name foundry family weight slant registry} {
+ if {[lsearch -exact $_fontnames $name] == -1 } {
+ lappend _fontnames $name
+ }
+ set _fontinfo($name) \
+ [list $foundry $family $weight $slant $registry]
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _append_text text
+#
+# append text in the format described by the state variables
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_append_text {text} {
+ if {!$_intable && $itk_option(-update)} {update}
+ if {[string first "&" $text] != -1} {
+ regsub -nocase -all "&amp;" $text {\&} text
+ regsub -nocase -all "&lt;" $text "<" text
+ regsub -nocase -all "&gt;" $text ">" text
+ regsub -nocase -all "&quot;" $text "\"" text
+ }
+ if !$_verbatim {
+ if !$_pre {
+ set text [string trim $text "\n\r"]
+ regsub -all "\[ \n\r\t\]+" $text " " text
+ }
+ if ![string length $text] return
+ }
+ if {!$_pre && !$_intitle} {
+ if {[catch {$_hottext get "end - 2c"} p]} {
+ set p ""
+ }
+ set n [string index $text 0]
+ if {$n == " " && $p == " "} {
+ set text [string range $text 1 end]
+ }
+ if {[catch {$_hottext insert end $text $_tag}]} {
+ set pht [winfo parent $_hottext]
+ catch {$pht insert end $text $_tag}
+ }
+ return
+ }
+ if {$_pre && !$_intitle} {
+ if {[catch {$_hottext insert end $text $_tag}]} {
+ set pht [winfo parent $_hottext]
+ catch {$pht insert end $text $_tag}
+ }
+ return
+ }
+ append _title $text
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _set_tag
+#
+# generate a tag
+# ------------------------------------------------------------------
+# a tag is constructed as: font?B?I?U?Points-LeftLeft2RightColorJustify
+itcl::body iwidgets::Scrolledhtml::_set_tag {} {
+ set i -1
+ foreach var {foundry family weight slant registry} {
+ set $var [lindex $_fontinfo($_font) \
+ [incr i]]
+ }
+ set x_font "-$foundry-$family-"
+ set _tag $_font
+ set args {}
+ if {$_textweight > 0} {
+ append _tag "B"
+ append x_font [lindex $weight 1]-
+ } else {
+ append x_font [lindex $weight 0]-
+ }
+ if {$_textslant > 0} {
+ append _tag "I"
+ append x_font [lindex $slant 1]-
+ } else {
+ append x_font [lindex $slant 0]-
+ }
+ if {$_underline > 0} {
+ append _tag "U"
+ append args " -underline 1"
+ }
+ switch $_justify {
+ L { append args " -justify left" }
+ R { append args " -justify right" }
+ C { append args " -justify center" }
+ }
+ append args " -offset $_offset"
+
+ set pts [lindex [set [format "_%spoints" $itk_option(-fontsize)]] \
+ $_pointsndx]
+ append _tag $_pointsndx - $_left \
+ $_left2 $_right \
+ $_color $_justify
+ append x_font "normal-*-*-$pts-*-*-*-*-$registry-*"
+ if $_anchorcount {
+ set href [_peek href]
+ set href_tag href[incr _counter]
+ set tags [list $_tag $href_tag]
+ if { $itk_option(-linkcommand)!= {} } {
+ $_hottext tag bind $href_tag <1> \
+ [list uplevel #0 $itk_option(-linkcommand) $href]
+ }
+ $_hottext tag bind $href_tag <Enter> \
+ [list $_hottext tag configure $href_tag \
+ -foreground $_alink]
+ $_hottext tag bind $href_tag <Leave> \
+ [list $_hottext tag configure $href_tag \
+ -foreground $_color]
+ } else {
+ set tags $_tag
+ }
+ if {![info exists _tagl($_tag)]} {
+ set _tagfont($_tag) 1
+ eval $_hottext tag configure $_tag \
+ -foreground ${_color} \
+ -lmargin1 ${_left}m \
+ -lmargin2 ${_left2}m $args
+ if [catch {eval $_hottext tag configure $_tag \
+ -font $x_font} err] {
+ _definefont $_font * $family $weight $slant *
+ regsub \$foundry $x_font * x_font
+ regsub \$registry $x_font * x_font
+ catch {eval $_hottext tag configure $_tag -font $x_font}
+ }
+ }
+ if [info exists href_tag] {
+ $_hottext tag raise $href_tag $_tag
+ }
+ set _tag $tags
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _reconfig_tags
+#
+# reconfigure tags following a configuration change
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_reconfig_tags {} {
+ if $_initialized {
+ foreach tag [$itk_component(text) tag names] {
+ foreach efont $_fontnames {
+ if [regexp "${efont}(B?)(I?)(U?)(\[1-9\]\[0-9\]*)-" $tag t b i u points] {
+ set j -1
+ set _font $efont
+ foreach var {foundry family weight slant registry} {
+ set $var [lindex $_fontinfo($_font) [incr j]]
+ }
+ set x_font "-$foundry-$family-"
+ if {$b == "B"} {
+ append x_font [lindex $weight 1]-
+ } else {
+ append x_font [lindex $weight 0]-
+ }
+ if {$i == "I"} {
+ append x_font [lindex $slant 1]-
+ } else {
+ append x_font [lindex $slant 0]-
+ }
+ set pts [lindex [set [format \
+ "_%spoints" $itk_option(-fontsize)]] $points]
+ append x_font "normal-*-*-$pts-*-*-*-*-$registry-*"
+ $itk_component(text) tag config $tag -font $x_font
+ break
+ }
+ }
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _push instack value
+#
+# push value onto stack(instack)
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_push {instack value} {
+ set _stack($instack) [linsert $_stack($instack) 0 $value]
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _pop instack
+#
+# pop value from stack(instack)
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_pop {instack} {
+ if {$_stack($instack) == ""} {
+ error "popping empty _stack $instack"
+ }
+ set val [lindex $_stack($instack) 0]
+ set _stack($instack) [lrange $_stack($instack) 1 end]
+ return $val
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _peek instack
+#
+# peek at top value on stack(instack)
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_peek {instack} {
+ return [lindex $_stack($instack) 0]
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _parse_fields array_var string
+#
+# parse fields from a href or image tag. At the moment, doesn't support
+# spaces in field values. (e.g. alt="not avaliable")
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_parse_fields {array_var string} {
+ upvar $array_var array
+ if {$string != "{}" } {
+ regsub -all "( *)=( *)" $string = string
+ regsub -all {\\\"} $string \" string
+ while {$string != ""} {
+ if ![regexp "^ *(\[^ \n\r=\]+)=\"(\[^\"\n\r\t\]*)(.*)" $string \
+ dummy field value newstring] {
+ if ![regexp "^ *(\[^ \n\r=\]+)=(\[^\n\r\t \]*)(.*)" $string \
+ dummy field value newstring] {
+ if ![regexp "^ *(\[^ \n\r\]+)(.*)" $string dummy field newstring] {
+ error "malformed command field; field = \"$string\""
+ continue
+ }
+ set value ""
+ }
+ }
+ set array([string tolower $field]) $value
+ set string "$newstring"
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _href_click
+#
+# process a click on an href
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_href_click {cmd href} {
+ uplevel #0 $cmd $href
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _set_align
+#
+# set text alignment
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_set_align {align} {
+ switch [string tolower $align] {
+ center {
+ set _justify C
+ }
+ left {
+ set _justify L
+ }
+ right {
+ set _justify R
+ }
+ default {}
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _fixtablewidth
+#
+# fix table width & height
+# essentially, with nested tables the outer table must be configured before
+# the inner table, but the idle tasks get queued up in the opposite order,
+# so process later idle tasks before sizing yourself.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_fixtablewidth {hottext table multiplier} {
+ update idletasks
+ $hottext see $_anchor($table)
+ update idletasks
+ $table configure \
+ -width [expr {$multiplier * [winfo width $hottext] - \
+ 2* [$hottext cget -padx] - \
+ 2* [$hottext cget -borderwidth]} ] \
+ -height [winfo height $table]
+ grid propagate $table 0
+}
+
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _header level
+#
+# generic entity to set state for <hn> tag
+# Accepts argument of the form ?align=[left,right,center]? ?src=<image pname>?
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_header {level args} {
+ eval _parse_fields ar $args
+ _push justify $_justify
+ if [info exists ar(align)] {
+ _entity_p align=$ar(align)
+ } else {
+ _entity_p
+ }
+ if [info exists ar(src)] {
+ _entity_img src=$ar(src)
+ }
+ _push pointsndx $_pointsndx
+ set _pointsndx [expr {7-$level}]
+ incr _textweight
+ _set_tag
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _/header level
+#
+# generic entity to set state for </hn> tag
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_/header {level} {
+ set _justify [_pop justify]
+ set _pointsndx [_pop pointsndx]
+ incr _textweight -1
+ _set_tag
+ _entity_p
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_a
+#
+# add an anchor. Accepts arguments of the form ?href=filename#anchorpoint?
+# ?name=anchorname?
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_a {args} {
+ _parse_fields ar $args
+ _push color $_color
+ if [info exists ar(href)] {
+ _push href $ar(href)
+ incr _anchorcount
+ set _color $_link
+ _entity_u
+ } else {
+ _push href {}
+ }
+ if [info exists ar(name)] {
+ set _anchor($ar(name)) [$itk_component(text) index end]
+ }
+ if [info exists ar(id)] {
+ set _anchor($ar(id)) [$itk_component(text) index end]
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_/a
+#
+# End anchor
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_/a {} {
+ set href [_pop href]
+ if {$href != {}} {
+ incr _anchorcount -1
+ set _color [_pop color]
+ _entity_/u
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_address
+#
+# display an address
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_address {} {
+ _entity_br
+ _entity_i
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_/address
+#
+# change state back from address display
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_/address {} {
+ _entity_/i
+ _entity_br
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_b
+#
+# Change current font to bold
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_b {} {
+ incr _textweight
+ _set_tag
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_/b
+#
+# change current font back from bold
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_/b {} {
+ incr _textweight -1
+ _set_tag
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_base
+#
+# set the cwd of the document
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_base {{args {}}} {
+ _parse_fields ar $args
+ if [info exists ar(href)] {
+ set _cwd [file dirname $ar(href)]
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_basefont
+#
+# set base font size
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_basefont {{args {}}} {
+ _parse_fields ar $args
+ if {[info exists ar(size)]} {
+ set _basefontsize $ar(size)
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_big
+#
+# Change current font to a bigger size
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_big {} {
+ _push pointsndx $_pointsndx
+ if {[incr _pointsndx 2] > 6} {
+ set _pointsndx 6
+ }
+ _set_tag
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_/big
+#
+# change current font back from bigger size
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_/big {} {
+ set _pointsndx [_pop pointsndx]
+ _set_tag
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_blockquote
+#
+# display a block quote
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_blockquote {} {
+ _entity_p
+ _push left $_left
+ incr _left $_indentincr
+ _push left2 $_left2
+ set _left2 $_left
+ _set_tag
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_/blockquote
+#
+# change back from blockquote
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_/blockquote {} {
+ _entity_p
+ set _left [_pop left]
+ set _left2 [_pop left2]
+ _set_tag
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_body
+#
+# begin body text. Takes argument of the form ?bgcolor=<color>? ?text=<color>?
+# ?link=<color>?
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_body {{args {}}} {
+ _parse_fields ar $args
+ if [info exists ar(bgcolor)] {
+ set _bgcolor $ar(bgcolor)
+ set temp $itk_option(-textbackground)
+ config -textbackground $_bgcolor
+ set _defaulttextbackground $temp
+ }
+ if [info exists ar(text)] {
+ set _color $ar(text)
+ }
+ if [info exists ar(link)] {
+ set _link $ar(link)
+ }
+ if [info exists ar(alink)] {
+ set _alink $ar(alink)
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_/body
+#
+# end body text
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_/body {} {
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_br
+#
+# line break
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_br {{args {}}} {
+ $_hottext insert end "\n"
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_center
+#
+# change justification to center
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_center {} {
+ _push justify $_justify
+ set _justify C
+ _set_tag
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_/center
+#
+# change state back from center
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_/center {} {
+ set _justify [_pop justify]
+ _set_tag
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_cite
+#
+# display citation
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_cite {} {
+ _entity_i
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_/cite
+#
+# change state back from citation
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_/cite {} {
+ _entity_/i
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_code
+#
+# display code listing
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_code {} {
+ _entity_pre
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_/code
+#
+# end code listing
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_/code {} {
+ _entity_/pre
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_dir
+#
+# display dir list
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_dir {{args {}}} {
+ _entity_ul plain $args
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_/dir
+#
+# end dir list
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_/dir {} {
+ _entity_/ul
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_div
+#
+# divide text. same as <p>
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_div {{args {}}} {
+ _entity_p $args
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_dl
+#
+# begin definition list
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_dl {{args {}}} {
+ if {$_left == 0} {
+ _entity_p
+ }
+ _push left $_left
+ _push left2 $_left2
+ if {$_left2 == $_left } {
+ incr _left2 [expr {$_indentincr+3}]
+ } else {
+ incr _left2 $_indentincr
+ }
+ incr _left $_indentincr
+ _push listyle $_listyle
+ _push licount $_licount
+ set _listyle none
+ _set_tag
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_/dl
+#
+# end definition list
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_/dl {} {
+ set _left [_pop left]
+ set _left2 [_pop left2]
+ set _listyle [_pop listyle]
+ set _licount [_pop licount]
+ _set_tag
+ if {$_left == 0} {
+ _entity_p
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_dt
+#
+# definition term
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_dt {} {
+ set _left [expr {$_left2 - 3}]
+ _set_tag
+ _entity_p
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_dd
+#
+# definition definition
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_dd {} {
+ set _left $_left2
+ _set_tag
+ _entity_br
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_dfn
+#
+# display defining instance of a term
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_dfn {} {
+ _entity_i
+ _entity_b
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_/dfn
+#
+# change state back from defining instance of term
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_/dfn {} {
+ _entity_/b
+ _entity_/i
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_em
+#
+# display emphasized text
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_em {} {
+ _entity_i
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_/em
+#
+# change state back from emphasized text
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_/em {} {
+ _entity_/i
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_font
+#
+# set font size and color
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_font {{args {}}} {
+ _parse_fields ar $args
+ _push pointsndx $_pointsndx
+ _push color $_color
+ if [info exists ar(size)] {
+ if {![regexp {^[+-].*} $ar(size)]} {
+ set _pointsndx $ar(size)
+ } else {
+ set _pointsndx [expr {$_basefontsize $ar(size)}]
+ }
+ if { $_pointsndx > 6 } {
+ set _pointsndx 6
+ } else {
+ if { $_pointsndx < 0 } {
+ set _pointsndx 0
+ }
+ }
+ }
+ if {[info exists ar(color)]} {
+ set _color $ar(color)
+ }
+ _set_tag
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_/font
+#
+# close current font size
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_/font {} {
+ set _pointsndx [_pop pointsndx]
+ set _color [_pop color]
+ _set_tag
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_h1
+#
+# display header level 1.
+# Accepts argument of the form ?align=[left,right,center]? ?src=<image pname>?
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_h1 {{args {}}} {
+ _header 1 $args
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_/h1
+#
+# change state back from header 1
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_/h1 {} {
+ _/header 1
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_h2
+#
+# display header level 2
+# Accepts argument of the form ?align=[left,right,center]? ?src=<image pname>?
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_h2 {{args {}}} {
+ _header 2 $args
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_/h2
+#
+# change state back from header 2
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_/h2 {} {
+ _/header 2
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_h3
+#
+# display header level 3
+# Accepts argument of the form ?align=[left,right,center]? ?src=<image pname>?
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_h3 {{args {}}} {
+ _header 3 $args
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_/h3
+#
+# change state back from header 3
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_/h3 {} {
+ _/header 3
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_h4
+#
+# display header level 4
+# Accepts argument of the form ?align=[left,right,center]? ?src=<image pname>?
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_h4 {{args {}}} {
+ _header 4 $args
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_/h4
+#
+# change state back from header 4
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_/h4 {} {
+ _/header 4
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_h5
+#
+# display header level 5
+# Accepts argument of the form ?align=[left,right,center]? ?src=<image pname>?
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_h5 {{args {}}} {
+ _header 5 $args
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_/h5
+#
+# change state back from header 5
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_/h5 {} {
+ _/header 5
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_h6
+#
+# display header level 6
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_h6 {{args {}}} {
+ _header 6 $args
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_/h6
+#
+# change state back from header 6
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_/h6 {} {
+ _/header 6
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_hr
+#
+# Add a horizontal rule
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_hr {{args {}}} {
+ _parse_fields ar $args
+ if [info exists ar(size)] {
+ set font "-font -*-*-*-*-*-*-$ar(size)-*-*-*-*-*-*-*"
+ } else {
+ set font "-font -*-*-*-*-*-*-2-*-*-*-*-*-*-*"
+ }
+ if [info exists ar(width)] {
+ }
+ if [info exists ar(noshade)] {
+ set relief "-relief flat"
+ set background "-background black"
+ } else {
+ set relief "-relief sunken"
+ set background ""
+ }
+# if [info exists ar(align)] {
+# $_hottext tag config hr$_counter -justify $ar(align)
+# set justify -justify $ar(align)
+# } else {
+# set justify ""
+# }
+ eval $_hottext tag config hr[incr _counter] $relief $background $font \
+ -borderwidth 2
+ _entity_p
+ $_hottext insert end " \n" hr$_counter
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_i
+#
+# display italicized text
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_i {} {
+ incr _textslant
+ _set_tag
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_/i
+#
+# change state back from italicized text
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_/i {} {
+ incr _textslant -1
+ _set_tag
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_img
+#
+# display an image. takes argument of the form img=<filename>
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_img {{args {}}} {
+ _parse_fields ar $args
+ set alttext "<image>"
+
+ #
+ # If proper argument exists
+ #
+ if [info exists ar(src)] {
+ set imgframe $_hottext.img[incr _counter]
+ #
+ # if this is an anchor
+ #
+ if $_anchorcount {
+ # create link colored border
+ frame $imgframe -borderwidth 2 -background $_link
+ bind $imgframe <Enter> \
+ [list $imgframe configure -background $_alink]
+ bind $imgframe <Leave> \
+ [list $imgframe configure -background $_link]
+ } else {
+ # create plain frame
+ frame $imgframe -borderwidth 0 -background $_color
+ }
+
+ #
+ # try to load image
+ #
+ if {[string index $ar(src) 0] == "/" || [string index $ar(src) 0] == "~"} {
+ set file $ar(src)
+ } else {
+ set file $_cwd/$ar(src)
+ }
+ if [catch {set img [::image create photo -file $file]} err] {
+ if {[info exists ar(width)] && [info exists ar(height)] } {
+ # suggestions exist, so make frame appropriate size and add a border
+ $imgframe configure -width $ar(width) -height $ar(height) -borderwidth 2
+ pack propagate $imgframe false
+ }
+
+ #
+ # If alt text is specified, display that
+ #
+ if [info exists ar(alt)] {
+ # add a border
+ $imgframe configure -borderwidth 2
+ set win $imgframe.text
+ label $win -text "$ar(alt)" -background $_bgcolor \
+ -foreground $_color
+ } else {
+ #
+ # use 'unknown image'
+ set win $imgframe.image#auto
+ #
+ # make label containing image
+ #
+ label $win -image $_unknownimg -borderwidth 0 -background $_bgcolor
+ }
+ pack $win -fill both -expand true
+
+ } else { ;# no error loading image
+ lappend _images $img
+ set win $imgframe.$img
+
+ #
+ # make label containing image
+ #
+ label $win -image $img -borderwidth 0
+ }
+ pack $win
+
+ #
+ # set alignment
+ #
+ set align bottom
+ if [info exists ar(align)] {
+ switch $ar(align) {
+ middle {
+ set align center
+ }
+ right {
+ set align center
+ }
+ default {
+ set align [string tolower $ar(align)]
+ }
+ }
+ }
+
+ #
+ # create window in text to display image
+ #
+ $_hottext window create end -window \
+ $imgframe -align $align
+
+ #
+ # set tag for window
+ #
+ $_hottext tag add $_tag $imgframe
+ if $_anchorcount {
+ set href [_peek href]
+ set href_tag href[incr _counter]
+ set tags [list $_tag $href_tag]
+ if { $itk_option(-linkcommand)!= {} } {
+ bind $win <1> [list uplevel #0 $itk_option(-linkcommand) $href]
+ }
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_kbd
+#
+# Display keyboard input
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_kbd {} {
+ incr _textweight
+ _entity_tt
+ _set_tag
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_/kbd
+#
+# change state back from displaying keyboard input
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_/kbd {} {
+ _entity_/tt
+ incr _textweight -1
+ _set_tag
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_li
+#
+# begin new list entry
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_li {{args {}}} {
+ _parse_fields ar $args
+ if [info exists ar(value)] {
+ set _licount $ar(value)
+ }
+ _entity_br
+ switch -exact $_listyle {
+ bullet {
+ set old_font $_font
+ set _font symbol
+ _set_tag
+ $_hottext insert end "\xb7" $_tag
+ set _font $old_font
+ _set_tag
+ }
+ none {
+ }
+ picture {
+ _entity_img src="$_lipic" width=4 height=4 align=middle
+ }
+ A {
+ _entity_b
+ $_hottext insert end [format "%c) " [expr {$_licount + 0x40}]] $_tag
+ _entity_/b
+ incr _licount
+ }
+ a {
+ _entity_b
+ $_hottext insert end [format "%c) " [expr {$_licount + 0x60}]] $_tag
+ _entity_/b
+ incr _licount
+ }
+ I {
+ _entity_b
+ $_hottext insert end "[::iwidgets::roman $_licount]) " $_tag
+ _entity_/b
+ incr _licount
+ }
+ i {
+ _entity_b
+ $_hottext insert end "[::iwidgets::roman $_licount lower])] " $_tag
+ _entity_/b
+ incr _licount
+ }
+ default {
+ _entity_b
+ $_hottext insert end "$_licount) " $_tag
+ _entity_/b
+ incr _licount
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_listing
+#
+# diplay code listing
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_listing {} {
+ _entity_pre
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_/listing
+#
+# end code listing
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_/listing {} {
+ _entity_/pre
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_menu
+#
+# diplay menu list
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_menu {{args {}}} {
+ _entity_ul plain $args
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_/menu
+#
+# end menu list
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_/menu {} {
+ _entity_/ul
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_ol
+#
+# begin ordered list
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_ol {{args {}}} {
+ _parse_fields ar $args
+ if $_left {
+ _entity_br
+ } else {
+ _entity_p
+ }
+ if {![info exists ar(type)]} {
+ set ar(type) 1
+ }
+ _push licount $_licount
+ if [info exists ar(start)] {
+ set _licount $ar(start)
+ } else {
+ set _licount 1
+ }
+ _push left $_left
+ _push left2 $_left2
+ if {$_left2 == $_left } {
+ incr _left2 [expr {$_indentincr+3}]
+ } else {
+ incr _left2 $_indentincr
+ }
+ incr _left $_indentincr
+ _push listyle $_listyle
+ set _listyle $ar(type)
+ _set_tag
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_/ol
+#
+# end ordered list
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_/ol {} {
+ set _left [_pop left]
+ set _left2 [_pop left2]
+ set _listyle [_pop listyle]
+ set _licount [_pop licount]
+ _set_tag
+ _entity_p
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_p
+#
+# paragraph break
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_p {{args {}}} {
+ _parse_fields ar $args
+ if [info exists ar(align)] {
+ _set_align $ar(align)
+ } else {
+ set _justify L
+ }
+ _set_tag
+ if [info exists ar(id)] {
+ set _anchor($ar(id)) [$itk_component(text) index end]
+ }
+ set x [$_hottext get end-3c]
+ set y [$_hottext get end-2c]
+ if {$x == "" && $y == ""} return
+ if {$y == ""} {
+ $_hottext insert end "\n\n"
+ return
+ }
+ if {$x == "\n" && $y == "\n"} return
+ if {$y == "\n"} {
+ $_hottext insert end "\n"
+ return
+ }
+ $_hottext insert end "\n\n"
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_pre
+#
+# display preformatted text
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_pre {{args {}}} {
+ _entity_tt
+ _entity_br
+ incr _pre
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_/pre
+#
+# change state back from preformatted text
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_/pre {} {
+ _entity_/tt
+ set _pre 0
+ _entity_p
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_samp
+#
+# display sample text.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_samp {} {
+ _entity_kbd
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_/samp
+#
+# switch back to non-sample text
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_/samp {} {
+ _entity_/kbd
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_small
+#
+# Change current font to a smaller size
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_small {} {
+ _push pointsndx $_pointsndx
+ if {[incr _pointsndx -2] < 0} {
+ set _pointsndx 0
+ }
+ _set_tag
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_/small
+#
+# change current font back from smaller size
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_/small {} {
+ set _pointsndx [_pop pointsndx]
+ _set_tag
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_sub
+#
+# display subscript
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_sub {} {
+ _push offset $_offset
+ incr _offset -2
+ _entity_small
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_/sub
+#
+# switch back to non-subscript
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_/sub {} {
+ set _offset [_pop offset]
+ _entity_/small
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_sup
+#
+# display superscript
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_sup {} {
+ _push offset $_offset
+ incr _offset 4
+ _entity_small
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_/sup
+#
+# switch back to non-superscript
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_/sup {} {
+ set _offset [_pop offset]
+ _entity_/small
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_strong
+#
+# display strong text. (i.e. make font bold)
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_strong {} {
+ incr _textweight
+ _set_tag
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_/strong
+#
+# switch back to non-strong text
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_/strong {} {
+ incr _textweight -1
+ _set_tag
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_table
+#
+# display a table.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_table {{args {}}} {
+ _parse_fields ar $args
+ _entity_p
+ set _intable 1
+
+ _push row -1
+ _push column 0
+ _push hottext $_hottext
+ _push justify $_justify
+ _push justify L
+ # push color information for master of table, then push info for table
+ _push color $_color
+ _push bgcolor $_bgcolor
+ _push link $_link
+ _push alink $_alink
+ if [info exists ar(bgcolor)] {
+ set _bgcolor $ar(bgcolor)
+ }
+ if [info exists ar(text)] {
+ set _color $ar(text)
+ }
+ if [info exists ar(link)] {
+ set _link $ar(link)
+ }
+ if [info exists ar(alink)] {
+ set _alink $ar(alink)
+ }
+ _push color $_color
+ _push bgcolor $_bgcolor
+ _push link $_link
+ _push alink $_alink
+ # push fake first row to avoid using optional /tr tag
+ # (This needs to set a real color - not the empty string
+ # becaule later code will try to use those values.)
+ _push color $_color
+ _push bgcolor $_bgcolor
+ _push link {}
+ _push alink {}
+
+ if {[info exists ar(align)]} {
+ _set_align $ar(align)
+ _set_tag
+ _append_text " "
+ }
+ set _justify L
+
+ if [info exists ar(id)] {
+ set _anchor($ar(id)) [$itk_component(text) index end]
+ }
+ if [info exists ar(cellpadding)] {
+ _push cellpadding $ar(cellpadding)
+ } else {
+ _push cellpadding 0
+ }
+ if [info exists ar(cellspacing)] {
+ _push cellspacing $ar(cellspacing)
+ } else {
+ _push cellspacing 0
+ }
+ if {[info exists ar(border)]} {
+ _push tableborder 1
+ set relief raised
+ if {$ar(border)==""} {
+ set ar(border) 2
+ }
+ } else {
+ _push tableborder 0
+ set relief flat
+ set ar(border) 2
+ }
+ _push table [set table $_hottext.table[incr _counter]]
+ iwidgets::labeledwidget $table -foreground $_color -background $_bgcolor -labelpos n
+ if {[info exists ar(title)]} {
+ $table configure -labeltext $ar(title)
+ }
+ #
+ # create window in text to display table
+ #
+ $_hottext window create end -window $table
+
+ set table [$table childsite]
+ set _anchor($table) [$_hottext index "end - 1 line"]
+ $table configure -borderwidth $ar(border) -relief $relief
+
+ if {[info exists ar(width)]} {
+ _push tablewidth $ar(width)
+ } else {
+ _push tablewidth 0
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_/table
+#
+# end table
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_/table {} {
+ if {$_intable} {
+ _pop tableborder
+ set table [[_pop table] childsite]
+ _pop row
+ _pop column
+ _pop cellspacing
+ _pop cellpadding
+ # pop last row's defaults
+ _pop color
+ _pop bgcolor
+ _pop link
+ _pop alink
+ # pop table defaults
+ _pop color
+ _pop bgcolor
+ _pop link
+ _pop alink
+ # restore table master defaults
+ set _color [_pop color]
+ set _bgcolor [_pop bgcolor]
+ set _link [_pop link]
+ set _alink [_pop alink]
+ foreach x [grid slaves $table] {
+ set text [$x get 1.0 end]
+ set tl [split $text \n]
+ set max 0
+ foreach l $tl {
+ set len [string length $l]
+ if {$len > $max} {
+ set max $len
+ }
+ }
+ if {$max > [$x cget -width]} {
+ $x configure -width $max
+ }
+ if {[$x cget -height] == 1} {
+ $x configure -height [lindex [split [$x index "end - 1 chars"] "."] 0]
+ }
+ }
+ $_hottext configure -state disabled
+ set _hottext [_pop hottext]
+ $_hottext configure -state normal
+ if {[set tablewidth [_pop tablewidth]]!="0"} {
+ if {[string index $tablewidth \
+ [expr {[string length $tablewidth] -1}]] == "%"} {
+ set multiplier [expr {[string trimright $tablewidth "%"] / 100.0}]
+ set idletask [after idle [itcl::code "$this _fixtablewidth $_hottext $table $multiplier"]]
+ } else {
+ $table configure -width $tablewidth
+ grid propagate $table 0
+ }
+ }
+ _pop justify
+ set _justify [_pop justify]
+ _entity_br
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_td
+#
+# start table data cell
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_td {{args {}}} {
+ if $_intable {
+ _parse_fields ar $args
+ set table [[_peek table] childsite]
+ if {![info exists ar(colspan)]} {
+ set ar(colspan) 1
+ }
+ if {![info exists ar(rowspan)]} {
+ set ar(rowspan) 1
+ }
+ if {![info exists ar(width)]} {
+ set ar(width) 10
+ }
+ if {![info exists ar(height)]} {
+ set ar(height) 0
+ }
+ if [info exists ar(bgcolor)] {
+ set _bgcolor $ar(bgcolor)
+ } else {
+ set _bgcolor [_peek bgcolor]
+ }
+ if [info exists ar(text)] {
+ set _color $ar(text)
+ } else {
+ set _color [_peek color]
+ }
+ if [info exists ar(link)] {
+ set _link $ar(link)
+ } else {
+ set _link [_peek link]
+ }
+ if [info exists ar(alink)] {
+ set _alink $ar(alink)
+ } else {
+ set _alink [_peek alink]
+ }
+ $_hottext configure -state disabled
+ set cellpadding [_peek cellpadding]
+ set cellspacing [_peek cellspacing]
+ set _hottext $table.cell[incr _counter]
+ text $_hottext -relief flat -width $ar(width) -height $ar(height) \
+ -highlightthickness 0 -wrap word -cursor $itk_option(-cursor) \
+ -wrap word -cursor $itk_option(-cursor) \
+ -padx $cellpadding -pady $cellpadding
+ if {$_color != ""} {
+ $_hottext config -foreground $_color
+ }
+ if {$_bgcolor != ""} {
+ $_hottext config -background $_bgcolor
+ }
+ if [info exists ar(nowrap)] {
+ $_hottext configure -wrap none
+ }
+ if [_peek tableborder] {
+ $_hottext configure -relief sunken
+ }
+ set row [_peek row]
+ if {$row < 0} {
+ set row 0
+ }
+ set column [_pop column]
+ if {$column < 0} {
+ set column 0
+ }
+ while {[grid slaves $table -row $row -column $column] != ""} {
+ incr column
+ }
+ grid $_hottext -sticky nsew -row $row -column $column \
+ -columnspan $ar(colspan) -rowspan $ar(rowspan) \
+ -padx $cellspacing -pady $cellspacing
+ grid columnconfigure $table $column -weight 1
+ _push column [expr {$column + $ar(colspan)}]
+ if [info exists ar(align)] {
+ _set_align $ar(align)
+ } else {
+ set _justify [_peek justify]
+ }
+ _set_tag
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_/td
+#
+# end table data cell
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_/td {} {
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_th
+#
+# start table header
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_th {{args {}}} {
+ if $_intable {
+ _parse_fields ar $args
+ if [info exists ar(align)] {
+ _entity_td $args
+ } else {
+ _entity_td align=center $args
+ }
+ _entity_b
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_/th
+#
+# end table data cell
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_/th {} {
+ _entity_/td
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_title
+#
+# begin title of document
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_title {} {
+ set _intitle 1
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_/title
+#
+# end title
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_/title {} {
+ set _intitle 0
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_tr
+#
+# start table row
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_tr {{args {}}} {
+ if $_intable {
+ _parse_fields ar $args
+ _pop justify
+ if [info exists ar(align)] {
+ _set_align $ar(align)
+ _push justify $_justify
+ } else {
+ _push justify L
+ }
+ # pop last row's colors
+ _pop color
+ _pop bgcolor
+ _pop link
+ _pop alink
+ if [info exists ar(bgcolor)] {
+ set _bgcolor $ar(bgcolor)
+ } else {
+ set _bgcolor [_peek bgcolor]
+ }
+ if [info exists ar(text)] {
+ set _color $ar(text)
+ } else {
+ set _color [_peek color]
+ }
+ if [info exists ar(link)] {
+ set _link $ar(link)
+ } else {
+ set _link [_peek link]
+ }
+ if [info exists ar(alink)] {
+ set _alink $ar(alink)
+ } else {
+ set _alink [_peek alink]
+ }
+ # push this row's defaults
+ _push color $_color
+ _push bgcolor $_bgcolor
+ _push link $_link
+ _push alink $_alink
+ $_hottext configure -state disabled
+ _push row [expr {[_pop row] + 1}]
+ _pop column
+ _push column 0
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_/tr
+#
+# end table row
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_/tr {} {
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_tt
+#
+# Show typewriter text, using the font given by -fixedfont
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_tt {} {
+ _push font $_font
+ set _font $itk_option(-fixedfont)
+ set _verbatim 1
+ _set_tag
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_/tt
+#
+# Change back to non-typewriter mode to display text
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_/tt {} {
+ set _font [_pop font]
+ set _verbatim 0
+ _set_tag
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_u
+#
+# display underlined text
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_u {} {
+ incr _underline
+ _set_tag
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_/u
+#
+# change back from underlined text
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_/u {} {
+ incr _underline -1
+ _set_tag
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_ul
+#
+# begin unordered list
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_ul {{args {}}} {
+ _parse_fields ar $args
+ if $_left {
+ _entity_br
+ } else {
+ _entity_p
+ }
+ if [info exists ar(id)] {
+ set _anchor($ar(id)) [$itk_component(text) index end]
+ }
+ _push left $_left
+ _push left2 $_left2
+ if {$_left2 == $_left } {
+ incr _left2 [expr {$_indentincr+3}]
+ } else {
+ incr _left2 $_indentincr
+ }
+ incr _left $_indentincr
+ _push listyle $_listyle
+ _push licount $_licount
+ if [info exists ar(plain)] {
+ set _listyle none
+ } {
+ set _listyle bullet
+ }
+ if [info exists ar(dingbat)] {
+ set ar(src) $ar(dingbat)
+ }
+ _push lipic $_lipic
+ if [info exists ar(src)] {
+ set _listyle picture
+ set _lipic $ar(src)
+ }
+ _set_tag
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_/ul
+#
+# end unordered list
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_/ul {} {
+ set _left [_pop left]
+ set _left2 [_pop left2]
+ set _listyle [_pop listyle]
+ set _licount [_pop licount]
+ set _lipic [_pop lipic]
+ _set_tag
+ _entity_p
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_var
+#
+# Display variable
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_var {} {
+ _entity_i
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _entity_/var
+#
+# change state back from variable display
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledhtml::_entity_/var {} {
+ _entity_/i
+}
diff --git a/iwidgets/generic/scrolledlistbox.itk b/iwidgets/generic/scrolledlistbox.itk
new file mode 100644
index 00000000000..18d6a61a08f
--- /dev/null
+++ b/iwidgets/generic/scrolledlistbox.itk
@@ -0,0 +1,732 @@
+#
+# Scrolledlistbox
+# ----------------------------------------------------------------------
+# Implements a scrolled listbox with additional options to manage
+# horizontal and vertical scrollbars. This includes options to control
+# which scrollbars are displayed and the method, i.e. statically,
+# dynamically, or none at all.
+#
+# ----------------------------------------------------------------------
+# AUTHOR: Mark L. Ulferts EMAIL: mulferts@austin.dsccc.com
+#
+# @(#) $Id$
+# ----------------------------------------------------------------------
+# Copyright (c) 1995 DSC Technologies Corporation
+# ======================================================================
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+
+#
+# Usual options.
+#
+itk::usual Scrolledlistbox {
+ keep -activebackground -activerelief -background -borderwidth -cursor \
+ -elementborderwidth -foreground -highlightcolor -highlightthickness \
+ -jump -labelfont -selectbackground -selectborderwidth \
+ -selectforeground -textbackground -textfont -troughcolor
+}
+
+# ------------------------------------------------------------------
+# SCROLLEDLISTBOX
+# ------------------------------------------------------------------
+itcl::class iwidgets::Scrolledlistbox {
+ inherit iwidgets::Scrolledwidget
+
+ constructor {args} {}
+ destructor {}
+
+ itk_option define -dblclickcommand dblClickCommand Command {}
+ itk_option define -selectioncommand selectionCommand Command {}
+ itk_option define -width width Width 0
+ itk_option define -height height Height 0
+ itk_option define -visibleitems visibleItems VisibleItems 20x10
+ itk_option define -state state State normal
+
+ public method curselection {}
+ public method activate {index}
+ public method bbox {index}
+ public method clear {}
+ public method see {index}
+ public method index {index}
+ public method delete {first {last {}}}
+ public method get {first {last {}}}
+ public method getcurselection {}
+ public method insert {index args}
+ public method nearest {y}
+ public method scan {option args}
+ public method selection {option first {last {}}}
+ public method size {}
+ public method selecteditemcount {}
+ public method justify {direction}
+ public method sort {{mode ascending}}
+ public method xview {args}
+ public method yview {args}
+ public method itemconfigure {args}
+
+ protected method _makeSelection {}
+ protected method _dblclick {}
+ protected method _fixIndex {index}
+
+ #
+ # List the event sequences that invoke single and double selection.
+ # Should these change in the underlying Tk listbox, then they must
+ # change here too.
+ #
+ common doubleSelectSeq { \
+ <Double-1>
+ }
+
+ common singleSelectSeq { \
+ <Control-Key-backslash> \
+ <Control-Key-slash> \
+ <Key-Escape> \
+ <Shift-Key-Select> \
+ <Control-Shift-Key-space> \
+ <Key-Select> \
+ <Key-space> \
+ <Control-Shift-Key-End> \
+ <Control-Key-End> \
+ <Control-Shift-Key-Home> \
+ <Control-Key-Home> \
+ <Key-Down> \
+ <Key-Up> \
+ <Shift-Key-Down> \
+ <Shift-Key-Up> \
+ <Control-Button-1> \
+ <Shift-Button-1> \
+ <ButtonRelease-1> \
+ }
+}
+
+#
+# Provide a lowercased access method for the Scrolledlistbox class.
+#
+proc ::iwidgets::scrolledlistbox {pathName args} {
+ uplevel ::iwidgets::Scrolledlistbox $pathName $args
+}
+
+#
+# Use option database to override default resources of base classes.
+#
+option add *Scrolledlistbox.labelPos n widgetDefault
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledlistbox::constructor {args} {
+ #
+ # Our -width and -height options are slightly different than
+ # those implemented by our base class, so we're going to
+ # remove them and redefine our own.
+ #
+ itk_option remove iwidgets::Scrolledwidget::width
+ itk_option remove iwidgets::Scrolledwidget::height
+
+ #
+ # Create the listbox.
+ #
+ itk_component add listbox {
+ listbox $itk_interior.listbox \
+ -width 1 -height 1 \
+ -xscrollcommand \
+ [itcl::code $this _scrollWidget $itk_interior.horizsb] \
+ -yscrollcommand \
+ [itcl::code $this _scrollWidget $itk_interior.vertsb]
+ } {
+ usual
+
+ keep -borderwidth -exportselection -relief -selectmode
+ keep -listvariable
+
+ rename -font -textfont textFont Font
+ rename -background -textbackground textBackground Background
+ rename -highlightbackground -background background Background
+ }
+ grid $itk_component(listbox) -row 0 -column 0 -sticky nsew
+ grid rowconfigure $_interior 0 -weight 1
+ grid columnconfigure $_interior 0 -weight 1
+
+ #
+ # Configure the command on the vertical scroll bar in the base class.
+ #
+ $itk_component(vertsb) configure \
+ -command [itcl::code $itk_component(listbox) yview]
+
+ #
+ # Configure the command on the horizontal scroll bar in the base class.
+ #
+ $itk_component(horizsb) configure \
+ -command [itcl::code $itk_component(listbox) xview]
+
+ #
+ # Create a set of bindings for monitoring the selection and install
+ # them on the listbox component.
+ #
+ foreach seq $singleSelectSeq {
+ bind SLBSelect$this $seq [itcl::code $this _makeSelection]
+ }
+
+ foreach seq $doubleSelectSeq {
+ bind SLBSelect$this $seq [itcl::code $this _dblclick]
+ }
+
+ bindtags $itk_component(listbox) \
+ [linsert [bindtags $itk_component(listbox)] end SLBSelect$this]
+
+ #
+ # Also create a set of bindings for disabling the scrolledlistbox.
+ # Since the command for it is "break", we can drop the $this since
+ # they don't need to be unique to the object level.
+ #
+ if {[bind SLBDisabled] == {}} {
+ foreach seq $singleSelectSeq {
+ bind SLBDisabled $seq break
+ }
+
+ bind SLBDisabled <Button-1> break
+
+ foreach seq $doubleSelectSeq {
+ bind SLBDisabled $seq break
+ }
+ }
+
+ #
+ # Initialize the widget based on the command line options.
+ #
+ eval itk_initialize $args
+}
+
+# ------------------------------------------------------------------
+# DESTURCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledlistbox::destructor {} {
+}
+
+# ------------------------------------------------------------------
+# OPTIONS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# OPTION: -dblclickcommand
+#
+# Specify a command to be executed upon double click of a listbox
+# item. Also, create a couple of bindings used for specific
+# selection modes
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Scrolledlistbox::dblclickcommand {}
+
+# ------------------------------------------------------------------
+# OPTION: -selectioncommand
+#
+# Specifies a command to be executed upon selection of a listbox
+# item. The command will be called upon each selection regardless
+# of selection mode..
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Scrolledlistbox::selectioncommand {}
+
+# ------------------------------------------------------------------
+# OPTION: -width
+#
+# Specifies the width of the scrolled list box as an entire unit.
+# The value may be specified in any of the forms acceptable to
+# Tk_GetPixels. Any additional space needed to display the other
+# components such as margins and scrollbars force the listbox
+# to be compressed. A value of zero along with the same value for
+# the height causes the value given for the visibleitems option
+# to be applied which administers geometry constraints in a different
+# manner.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Scrolledlistbox::width {
+ if {$itk_option(-width) != 0} {
+ set shell [lindex [grid info $itk_component(listbox)] 1]
+
+ #
+ # Due to a bug in the tk4.2 grid, we have to check the
+ # propagation before setting it. Setting it to the same
+ # value it already is will cause it to toggle.
+ #
+ if {[grid propagate $shell]} {
+ grid propagate $shell no
+ }
+
+ $itk_component(listbox) configure -width 1
+ $shell configure \
+ -width [winfo pixels $shell $itk_option(-width)]
+ } else {
+ configure -visibleitems $itk_option(-visibleitems)
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -height
+#
+# Specifies the height of the scrolled list box as an entire unit.
+# The value may be specified in any of the forms acceptable to
+# Tk_GetPixels. Any additional space needed to display the other
+# components such as margins and scrollbars force the listbox
+# to be compressed. A value of zero along with the same value for
+# the width causes the value given for the visibleitems option
+# to be applied which administers geometry constraints in a different
+# manner.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Scrolledlistbox::height {
+ if {$itk_option(-height) != 0} {
+ set shell [lindex [grid info $itk_component(listbox)] 1]
+
+ #
+ # Due to a bug in the tk4.2 grid, we have to check the
+ # propagation before setting it. Setting it to the same
+ # value it already is will cause it to toggle.
+ #
+ if {[grid propagate $shell]} {
+ grid propagate $shell no
+ }
+
+ $itk_component(listbox) configure -height 1
+ $shell configure \
+ -height [winfo pixels $shell $itk_option(-height)]
+ } else {
+ configure -visibleitems $itk_option(-visibleitems)
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -visibleitems
+#
+# Specified the widthxheight in characters and lines for the listbox.
+# This option is only administered if the width and height options
+# are both set to zero, otherwise they take precedence. With the
+# visibleitems option engaged, geometry constraints are maintained
+# only on the listbox. The size of the other components such as
+# labels, margins, and scrollbars, are additive and independent,
+# effecting the overall size of the scrolled list box. In contrast,
+# should the width and height options have non zero values, they
+# are applied to the scrolled list box as a whole. The listbox
+# is compressed or expanded to maintain the geometry constraints.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Scrolledlistbox::visibleitems {
+ if {[regexp {^[0-9]+x[0-9]+$} $itk_option(-visibleitems)]} {
+ if {($itk_option(-width) == 0) && \
+ ($itk_option(-height) == 0)} {
+ set chars [lindex [split $itk_option(-visibleitems) x] 0]
+ set lines [lindex [split $itk_option(-visibleitems) x] 1]
+
+ set shell [lindex [grid info $itk_component(listbox)] 1]
+
+ #
+ # Due to a bug in the tk4.2 grid, we have to check the
+ # propagation before setting it. Setting it to the same
+ # value it already is will cause it to toggle.
+ #
+ if {! [grid propagate $shell]} {
+ grid propagate $shell yes
+ }
+
+ $itk_component(listbox) configure -width $chars -height $lines
+ }
+
+ } else {
+ error "bad visibleitems option\
+ \"$itk_option(-visibleitems)\": should be\
+ widthxheight"
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -state
+#
+# Specifies the state of the scrolledlistbox which may be either
+# disabled or normal. In a disabled state, the scrolledlistbox
+# does not accept user selection. The default is normal.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Scrolledlistbox::state {
+ set tags [bindtags $itk_component(listbox)]
+
+ #
+ # If the state is normal, then we need to remove the disabled
+ # bindings if they exist. If the state is disabled, then we need
+ # to install the disabled bindings if they haven't been already.
+ #
+ switch -- $itk_option(-state) {
+ normal {
+ $itk_component(listbox) configure \
+ -foreground $itk_option(-foreground)
+ $itk_component(listbox) configure \
+ -selectforeground $itk_option(-selectforeground)
+ if {[set index [lsearch $tags SLBDisabled]] != -1} {
+ bindtags $itk_component(listbox) \
+ [lreplace $tags $index $index]
+ }
+ }
+
+ disabled {
+ $itk_component(listbox) configure \
+ -foreground $itk_option(-disabledforeground)
+ $itk_component(listbox) configure \
+ -selectforeground $itk_option(-disabledforeground)
+ if {[set index [lsearch $tags SLBDisabled]] == -1} {
+ bindtags $itk_component(listbox) \
+ [linsert $tags 1 SLBDisabled]
+ }
+ }
+ default {
+ error "bad state value \"$itk_option(-state)\":\
+ must be normal or disabled"
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# METHODS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# METHOD: curselection
+#
+# Returns a list containing the indices of all the elements in the
+# listbox that are currently selected.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledlistbox::curselection {} {
+ return [$itk_component(listbox) curselection]
+}
+
+# ------------------------------------------------------------------
+# METHOD: activate index
+#
+# Sets the active element to the one indicated by index.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledlistbox::activate {index} {
+ return [$itk_component(listbox) activate [_fixIndex $index]]
+}
+
+# ------------------------------------------------------------------
+# METHOD: bbox index
+#
+# Returns four element list describing the bounding box for the list
+# item at index
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledlistbox::bbox {index} {
+ return [$itk_component(listbox) bbox [_fixIndex $index]]
+}
+
+# ------------------------------------------------------------------
+# METHOD clear
+#
+# Clear the listbox area of all items.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledlistbox::clear {} {
+ delete 0 end
+}
+
+# ------------------------------------------------------------------
+# METHOD: see index
+#
+# Adjusts the view such that the element given by index is visible.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledlistbox::see {index} {
+ $itk_component(listbox) see [_fixIndex $index]
+}
+
+# ------------------------------------------------------------------
+# METHOD: index index
+#
+# Returns the decimal string giving the integer index corresponding
+# to index. The index value may be a integer number, active,
+# anchor, end, @x,y, or a pattern.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledlistbox::index {index} {
+ if {[regexp {(^[0-9]+$)|(^active$)|(^anchor$)|(^end$)|(^@-?[0-9]+,-?[0-9]+$)} $index]} {
+ return [$itk_component(listbox) index $index]
+
+ } else {
+ set indexValue [lsearch -glob [get 0 end] $index]
+ if {$indexValue == -1} {
+ error "bad Scrolledlistbox index \"$index\": must be active,\
+ anchor, end, @x,y, number, or a pattern"
+ }
+ return $indexValue
+ }
+}
+
+# ------------------------------------------------------------------
+# METHOD: _fixIndex index
+#
+# Similar to the regular "index" method, but it only converts
+# the index to a numerical value if it is a string pattern. If
+# the index is in the proper form to be used with the listbox,
+# it is left alone. This fixes problems associated with converting
+# an index such as "end" to a numerical value.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledlistbox::_fixIndex {index} {
+ if {[regexp {(^[0-9]+$)|(^active$)|(^anchor$)|(^end$)|(^@[0-9]+,[0-9]+$)} \
+ $index]} {
+ return $index
+
+ } else {
+ set indexValue [lsearch -glob [get 0 end] $index]
+
+ if {$indexValue == -1} {
+ error "bad Scrolledlistbox index \"$index\": must be active,\
+ anchor, end, @x,y, number, or a pattern"
+ }
+ return $indexValue
+ }
+}
+
+# ------------------------------------------------------------------
+# METHOD: delete first ?last?
+#
+# Delete one or more elements from list box based on the first and
+# last index values. Indexes may be a number, active, anchor, end,
+# @x,y, or a pattern.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledlistbox::delete {first {last {}}} {
+ set first [_fixIndex $first]
+
+ if {$last != {}} {
+ set last [_fixIndex $last]
+ } else {
+ set last $first
+ }
+
+ eval $itk_component(listbox) delete $first $last
+}
+
+# ------------------------------------------------------------------
+# METHOD: get first ?last?
+#
+# Returns the elements of the listbox indicated by the indexes.
+# Indexes may be a number, active, anchor, end, @x,y, ora pattern.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledlistbox::get {first {last {}}} {
+ set first [_fixIndex $first]
+
+ if {$last != {}} {
+ set last [_fixIndex $last]
+ }
+
+ if {$last == {}} {
+ return [$itk_component(listbox) get $first]
+ } else {
+ return [$itk_component(listbox) get $first $last]
+ }
+}
+
+# ------------------------------------------------------------------
+# METHOD: getcurselection
+#
+# Returns the contents of the listbox element indicated by the current
+# selection indexes. Short cut version of get and curselection
+# command combination.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledlistbox::getcurselection {} {
+ set rlist {}
+
+ if {[selecteditemcount] > 0} {
+ set cursels [$itk_component(listbox) curselection]
+
+ switch $itk_option(-selectmode) {
+ single -
+ browse {
+ set rlist [$itk_component(listbox) get $cursels]
+ }
+
+ multiple -
+ extended {
+ foreach sel $cursels {
+ lappend rlist [$itk_component(listbox) get $sel]
+ }
+ }
+ }
+ }
+
+ return $rlist
+}
+
+# ------------------------------------------------------------------
+# METHOD: insert index string ?string ...?
+#
+# Insert zero or more elements in the list just before the element
+# given by index.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledlistbox::insert {index args} {
+ set index [_fixIndex $index]
+
+ eval $itk_component(listbox) insert $index $args
+}
+
+# ------------------------------------------------------------------
+# METHOD: nearest y
+#
+# Given a y-coordinate within the listbox, this command returns the
+# index of the visible listbox element nearest to that y-coordinate.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledlistbox::nearest {y} {
+ $itk_component(listbox) nearest $y
+}
+
+# ------------------------------------------------------------------
+# METHOD: scan option args
+#
+# Implements scanning on listboxes.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledlistbox::scan {option args} {
+ eval $itk_component(listbox) scan $option $args
+}
+
+# ------------------------------------------------------------------
+# METHOD: selection option first ?last?
+#
+# Adjusts the selection within the listbox. The index value may be
+# a integer number, active, anchor, end, @x,y, or a pattern.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledlistbox::selection {option first {last {}}} {
+ set first [_fixIndex $first]
+
+ if {$last != {}} {
+ set last [_fixIndex $last]
+ $itk_component(listbox) selection $option $first $last
+ } else {
+ $itk_component(listbox) selection $option $first
+ }
+}
+
+# ------------------------------------------------------------------
+# METHOD: size
+#
+# Returns a decimal string indicating the total number of elements
+# in the listbox.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledlistbox::size {} {
+ return [$itk_component(listbox) size]
+}
+
+# ------------------------------------------------------------------
+# METHOD: selecteditemcount
+#
+# Returns a decimal string indicating the total number of selected
+# elements in the listbox.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledlistbox::selecteditemcount {} {
+ return [llength [$itk_component(listbox) curselection]]
+}
+
+# ------------------------------------------------------------------
+# METHOD: justify direction
+#
+# Justifies the list scrolled region in one of four directions: top,
+# bottom, left, or right.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledlistbox::justify {direction} {
+ switch $direction {
+ left {
+ $itk_component(listbox) xview moveto 0
+ }
+ right {
+ $itk_component(listbox) xview moveto 1
+ }
+ top {
+ $itk_component(listbox) yview moveto 0
+ }
+ bottom {
+ $itk_component(listbox) yview moveto 1
+ }
+ default {
+ error "bad justify argument \"$direction\": should\
+ be left, right, top, or bottom"
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# METHOD: sort mode
+#
+# Sort the current list. This can take any sort switch from
+# the lsort command: ascii, integer, real, command,
+# increasing/ascending, decreasing/descending, etc.
+#
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledlistbox::sort {{mode ascending}} {
+
+ set vals [$itk_component(listbox) get 0 end]
+ if {[llength $vals] == 0} {return}
+
+ switch $mode {
+ ascending {set mode increasing}
+ descending {set mode decreasing}
+ }
+
+ $itk_component(listbox) delete 0 end
+ if {[catch {eval $itk_component(listbox) insert end \
+ [lsort -${mode} $vals]} errorstring]} {
+ error "bad sort argument \"$mode\": must be a valid argument to the\
+ Tcl lsort command"
+ }
+
+ return
+}
+
+# ------------------------------------------------------------------
+# METHOD: xview args
+#
+# Change or query the vertical position of the text in the list box.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledlistbox::xview {args} {
+ return [eval $itk_component(listbox) xview $args]
+}
+
+# ------------------------------------------------------------------
+# METHOD: yview args
+#
+# Change or query the horizontal position of the text in the list box.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledlistbox::yview {args} {
+ return [eval $itk_component(listbox) yview $args]
+}
+
+# ------------------------------------------------------------------
+# METHOD: itemconfigure args
+#
+# This is a wrapper method around the new tk8.3 itemconfigure command
+# for the listbox.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledlistbox::itemconfigure {args} {
+ return [eval $itk_component(listbox) itemconfigure $args]
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _makeSelection
+#
+# Evaluate the selection command.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledlistbox::_makeSelection {} {
+ uplevel #0 $itk_option(-selectioncommand)
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _dblclick
+#
+# Evaluate the double click command option if not empty.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledlistbox::_dblclick {} {
+ uplevel #0 $itk_option(-dblclickcommand)
+}
+
diff --git a/iwidgets/generic/scrolledtext.itk b/iwidgets/generic/scrolledtext.itk
new file mode 100644
index 00000000000..67f40ea339f
--- /dev/null
+++ b/iwidgets/generic/scrolledtext.itk
@@ -0,0 +1,501 @@
+#
+# Scrolledtext
+# ----------------------------------------------------------------------
+# Implements a scrolled text widget with additional options to manage
+# the vertical scrollbar. This includes options to control the method
+# in which the scrollbar is displayed, i.e. statically or dynamically.
+# Options also exist for adding a label to the scrolled text area and
+# controlling its position. Import/export of methods are provided for
+# file I/O.
+#
+# ----------------------------------------------------------------------
+# AUTHOR: Mark L. Ulferts EMAIL: mulferts@austin.dsccc.com
+#
+# @(#) $Id$
+# ----------------------------------------------------------------------
+# Copyright (c) 1995 DSC Technologies Corporation
+# ======================================================================
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+
+#
+# Usual options.
+#
+itk::usual Scrolledtext {
+ keep -activebackground -activerelief -background -borderwidth -cursor \
+ -elementborderwidth -foreground -highlightcolor -highlightthickness \
+ -insertbackground -insertborderwidth -insertofftime -insertontime \
+ -insertwidth -jump -labelfont -selectbackground -selectborderwidth \
+ -selectforeground -textbackground -textfont -troughcolor
+}
+
+# ------------------------------------------------------------------
+# SCROLLEDTEXT
+# ------------------------------------------------------------------
+itcl::class iwidgets::Scrolledtext {
+ inherit iwidgets::Scrolledwidget
+
+ constructor {args} {}
+ destructor {}
+
+ itk_option define -width width Width 0
+ itk_option define -height height Height 0
+ itk_option define -visibleitems visibleItems VisibleItems 80x24
+
+ public method bbox {index}
+ public method childsite {}
+ public method clear {}
+ public method import {filename {index end}}
+ public method export {filename}
+ public method compare {index1 op index2}
+ public method debug {args}
+ public method delete {first {last {}}}
+ public method dlineinfo {index}
+ public method get {index1 {index2 {}}}
+ public method image {option args}
+ public method index {index}
+ public method insert {args}
+ public method mark {option args}
+ public method scan {option args}
+ public method search {args}
+ public method see {index}
+ public method tag {option args}
+ public method window {option args}
+ public method xview {args}
+ public method yview {args}
+}
+
+#
+# Provide a lowercased access method for the Scrolledtext class.
+#
+proc ::iwidgets::scrolledtext {pathName args} {
+ uplevel ::iwidgets::Scrolledtext $pathName $args
+}
+
+#
+# Use option database to override default resources of base classes.
+#
+option add *Scrolledtext.labelPos n widgetDefault
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledtext::constructor {args} {
+ #
+ # Our -width and -height options are slightly different than
+ # those implemented by our base class, so we're going to
+ # remove them and redefine our own.
+ #
+ itk_option remove iwidgets::Scrolledwidget::width
+ itk_option remove iwidgets::Scrolledwidget::height
+
+ #
+ # Create a clipping frame which will provide the border for
+ # relief display.
+ #
+ itk_component add clipper {
+ frame $itk_interior.clipper
+ } {
+ usual
+
+ keep -borderwidth -relief -highlightthickness -highlightcolor
+ rename -highlightbackground -background background Background
+ }
+ grid $itk_component(clipper) -row 0 -column 0 -sticky nsew
+ grid rowconfigure $_interior 0 -weight 1
+ grid columnconfigure $_interior 0 -weight 1
+
+ #
+ # Create the text area.
+ #
+ itk_component add text {
+ text $itk_component(clipper).text \
+ -width 1 -height 1 \
+ -xscrollcommand \
+ [itcl::code $this _scrollWidget $itk_interior.horizsb] \
+ -yscrollcommand \
+ [itcl::code $this _scrollWidget $itk_interior.vertsb] \
+ -borderwidth 0 -highlightthickness 0
+ } {
+ usual
+
+ ignore -highlightthickness -highlightcolor -borderwidth
+
+ keep -exportselection -padx -pady -setgrid \
+ -spacing1 -spacing2 -spacing3 -state -tabs -wrap
+
+ rename -font -textfont textFont Font
+ rename -background -textbackground textBackground Background
+ }
+ grid $itk_component(text) -row 0 -column 0 -sticky nsew
+ grid rowconfigure $itk_component(clipper) 0 -weight 1
+ grid columnconfigure $itk_component(clipper) 0 -weight 1
+
+ #
+ # Configure the command on the vertical scroll bar in the base class.
+ #
+ $itk_component(vertsb) configure \
+ -command [itcl::code $itk_component(text) yview]
+
+ #
+ # Configure the command on the horizontal scroll bar in the base class.
+ #
+ $itk_component(horizsb) configure \
+ -command [itcl::code $itk_component(text) xview]
+
+ #
+ # Initialize the widget based on the command line options.
+ #
+ eval itk_initialize $args
+}
+
+# ------------------------------------------------------------------
+# DESTURCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledtext::destructor {} {
+}
+
+# ------------------------------------------------------------------
+# OPTIONS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# OPTION: -width
+#
+# Specifies the width of the scrolled text as an entire unit.
+# The value may be specified in any of the forms acceptable to
+# Tk_GetPixels. Any additional space needed to display the other
+# components such as labels, margins, and scrollbars force the text
+# to be compressed. A value of zero along with the same value for
+# the height causes the value given for the visibleitems option
+# to be applied which administers geometry constraints in a different
+# manner.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Scrolledtext::width {
+ if {$itk_option(-width) != 0} {
+ set shell [lindex [grid info $itk_component(clipper)] 1]
+
+ #
+ # Due to a bug in the tk4.2 grid, we have to check the
+ # propagation before setting it. Setting it to the same
+ # value it already is will cause it to toggle.
+ #
+ if {[grid propagate $shell]} {
+ grid propagate $shell no
+ }
+
+ $itk_component(text) configure -width 1
+ $shell configure \
+ -width [winfo pixels $shell $itk_option(-width)]
+ } else {
+ configure -visibleitems $itk_option(-visibleitems)
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -height
+#
+# Specifies the height of the scrolled text as an entire unit.
+# The value may be specified in any of the forms acceptable to
+# Tk_GetPixels. Any additional space needed to display the other
+# components such as labels, margins, and scrollbars force the text
+# to be compressed. A value of zero along with the same value for
+# the width causes the value given for the visibleitems option
+# to be applied which administers geometry constraints in a different
+# manner.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Scrolledtext::height {
+ if {$itk_option(-height) != 0} {
+ set shell [lindex [grid info $itk_component(clipper)] 1]
+
+ #
+ # Due to a bug in the tk4.2 grid, we have to check the
+ # propagation before setting it. Setting it to the same
+ # value it already is will cause it to toggle.
+ #
+ if {[grid propagate $shell]} {
+ grid propagate $shell no
+ }
+
+ $itk_component(text) configure -height 1
+ $shell configure \
+ -height [winfo pixels $shell $itk_option(-height)]
+ } else {
+ configure -visibleitems $itk_option(-visibleitems)
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -visibleitems
+#
+# Specified the widthxheight in characters and lines for the text.
+# This option is only administered if the width and height options
+# are both set to zero, otherwise they take precedence. With the
+# visibleitems option engaged, geometry constraints are maintained
+# only on the text. The size of the other components such as
+# labels, margins, and scroll bars, are additive and independent,
+# effecting the overall size of the scrolled text. In contrast,
+# should the width and height options have non zero values, they
+# are applied to the scrolled text as a whole. The text is
+# compressed or expanded to maintain the geometry constraints.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Scrolledtext::visibleitems {
+ if {[regexp {^[0-9]+x[0-9]+$} $itk_option(-visibleitems)]} {
+ if {($itk_option(-width) == 0) && \
+ ($itk_option(-height) == 0)} {
+ set chars [lindex [split $itk_option(-visibleitems) x] 0]
+ set lines [lindex [split $itk_option(-visibleitems) x] 1]
+
+ set shell [lindex [grid info $itk_component(clipper)] 1]
+
+ #
+ # Due to a bug in the tk4.2 grid, we have to check the
+ # propagation before setting it. Setting it to the same
+ # value it already is will cause it to toggle.
+ #
+ if {! [grid propagate $shell]} {
+ grid propagate $shell yes
+ }
+
+ $itk_component(text) configure -width $chars -height $lines
+ }
+
+ } else {
+ error "bad visibleitems option\
+ \"$itk_option(-visibleitems)\": should be\
+ widthxheight"
+ }
+}
+
+# ------------------------------------------------------------------
+# METHODS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# METHOD: childsite
+#
+# Returns the path name of the child site widget.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledtext::childsite {} {
+ return $itk_component(text)
+}
+
+# ------------------------------------------------------------------
+# METHOD: bbox index
+#
+# Returns four element list describing the bounding box for the list
+# item at index
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledtext::bbox {index} {
+ return [$itk_component(text) bbox $index]
+}
+
+# ------------------------------------------------------------------
+# METHOD clear
+#
+# Clear the text area.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledtext::clear {} {
+ $itk_component(text) delete 1.0 end
+}
+
+# ------------------------------------------------------------------
+# METHOD import filename
+#
+# Load text from an existing file (import filename)
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledtext::import {filename {index end}} {
+ set f [open $filename r]
+ insert $index [read $f]
+ close $f
+}
+
+# ------------------------------------------------------------------
+# METHOD export filename
+#
+# write text to a file (export filename)
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledtext::export {filename} {
+ set f [open $filename w]
+
+ set txt [$itk_component(text) get 1.0 end]
+ puts $f $txt
+
+ flush $f
+ close $f
+}
+
+# ------------------------------------------------------------------
+# METHOD compare index1 op index2
+#
+# Compare indices according to relational operator.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledtext::compare {index1 op index2} {
+ return [$itk_component(text) compare $index1 $op $index2]
+}
+
+# ------------------------------------------------------------------
+# METHOD debug ?boolean?
+#
+# Activates consistency checks in B-tree code associated with text
+# widgets.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledtext::debug {args} {
+ eval $itk_component(text) debug $args
+}
+
+# ------------------------------------------------------------------
+# METHOD delete first ?last?
+#
+# Delete a range of characters from the text.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledtext::delete {first {last {}}} {
+ $itk_component(text) delete $first $last
+}
+
+# ------------------------------------------------------------------
+# METHOD dlineinfo index
+#
+# Returns a five element list describing the area occupied by the
+# display line containing index.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledtext::dlineinfo {index} {
+ return [$itk_component(text) dlineinfo $index]
+}
+
+# ------------------------------------------------------------------
+# METHOD get index1 ?index2?
+#
+# Return text from start index to end index.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledtext::get {index1 {index2 {}}} {
+ return [$itk_component(text) get $index1 $index2]
+}
+
+# ------------------------------------------------------------------
+# METHOD image option ?arg arg ...?
+#
+# Manipulate images dependent on options.
+#
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledtext::image {option args} {
+ return [eval $itk_component(text) image $option $args]
+}
+
+
+# ------------------------------------------------------------------
+# METHOD index index
+#
+# Return position corresponding to index.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledtext::index {index} {
+ return [$itk_component(text) index $index]
+}
+
+# ------------------------------------------------------------------
+# METHOD insert index chars ?tagList?
+#
+# Insert text at index.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledtext::insert {args} {
+ eval $itk_component(text) insert $args
+}
+
+# ------------------------------------------------------------------
+# METHOD mark option ?arg arg ...?
+#
+# Manipulate marks dependent on options.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledtext::mark {option args} {
+ return [eval $itk_component(text) mark $option $args]
+}
+
+# ------------------------------------------------------------------
+# METHOD scan option args
+#
+# Implements scanning on texts.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledtext::scan {option args} {
+ eval $itk_component(text) scan $option $args
+}
+
+# ------------------------------------------------------------------
+# METHOD search ?switches? pattern index ?varName?
+#
+# Searches the text for characters matching a pattern.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledtext::search {args} {
+ #-----------------------------------------------------------
+ # BUG FIX: csmith (Chad Smith: csmith@adc.com), 11/18/99
+ #-----------------------------------------------------------
+ # Need to run this command up one level on the stack since
+ # the text widget may modify one of the arguments, which is
+ # the case when -count is specified.
+ #-----------------------------------------------------------
+ return [uplevel eval $itk_component(text) search $args]
+}
+
+# ------------------------------------------------------------------
+# METHOD see index
+#
+# Adjusts the view in the window so the character at index is
+# visible.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledtext::see {index} {
+ $itk_component(text) see $index
+}
+
+# ------------------------------------------------------------------
+# METHOD tag option ?arg arg ...?
+#
+# Manipulate tags dependent on options.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledtext::tag {option args} {
+ return [eval $itk_component(text) tag $option $args]
+}
+
+# ------------------------------------------------------------------
+# METHOD window option ?arg arg ...?
+#
+# Manipulate embedded windows.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledtext::window {option args} {
+ return [eval $itk_component(text) window $option $args]
+}
+
+# ------------------------------------------------------------------
+# METHOD xview
+#
+# Changes x view in widget's window.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledtext::xview {args} {
+ return [eval $itk_component(text) xview $args]
+}
+
+# ------------------------------------------------------------------
+# METHOD yview
+#
+# Changes y view in widget's window.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledtext::yview {args} {
+ return [eval $itk_component(text) yview $args]
+}
+
diff --git a/iwidgets/generic/scrolledwidget.itk b/iwidgets/generic/scrolledwidget.itk
new file mode 100644
index 00000000000..58094dd79fa
--- /dev/null
+++ b/iwidgets/generic/scrolledwidget.itk
@@ -0,0 +1,376 @@
+#
+# Scrolledwidget
+# ----------------------------------------------------------------------
+# Implements a general purpose base class for scrolled widgets, by
+# creating the necessary horizontal and vertical scrollbars and
+# providing protected methods for controlling their display. The
+# derived class needs to take advantage of the fact that the grid
+# is used and the vertical scrollbar is in row 0, column 2 and the
+# horizontal scrollbar in row 2, column 0.
+#
+# ----------------------------------------------------------------------
+# AUTHOR: Mark Ulferts mulferts@austin.dsccc.com
+#
+# @(#) $Id$
+# ----------------------------------------------------------------------
+# Copyright (c) 1997 DSC Technologies Corporation
+# ======================================================================
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+
+#
+# Usual options.
+#
+itk::usual Scrolledwidget {
+ keep -background -borderwidth -cursor -highlightcolor -highlightthickness
+ keep -activebackground -activerelief -jump -troughcolor
+ keep -labelfont -foreground
+}
+
+# ------------------------------------------------------------------
+# SCROLLEDWIDGET
+# ------------------------------------------------------------------
+itcl::class iwidgets::Scrolledwidget {
+ inherit iwidgets::Labeledwidget
+
+ constructor {args} {}
+ destructor {}
+
+ itk_option define -sbwidth sbWidth Width 15
+ itk_option define -scrollmargin scrollMargin ScrollMargin 3
+ itk_option define -vscrollmode vscrollMode VScrollMode static
+ itk_option define -hscrollmode hscrollMode HScrollMode static
+ itk_option define -width width Width 30
+ itk_option define -height height Height 30
+
+ protected method _scrollWidget {wid first last}
+ protected method _vertScrollbarDisplay {mode}
+ protected method _horizScrollbarDisplay {mode}
+ protected method _configureEvent {}
+
+ protected variable _vmode off ;# Vertical scroll mode
+ protected variable _hmode off ;# Vertical scroll mode
+ protected variable _recheckHoriz 1 ;# Flag to check need for
+ ;# horizontal scrollbar
+ protected variable _recheckVert 1 ;# Flag to check need for
+ ;# vertical scrollbar
+
+ protected variable _interior {}
+}
+
+#
+# Provide a lowercased access method for the Scrolledwidget class.
+#
+proc ::iwidgets::scrolledwidget {pathName args} {
+ uplevel ::iwidgets::Scrolledwidget $pathName $args
+}
+
+#
+# Use option database to override default resources of base classes.
+#
+option add *Scrolledwidget.labelPos n widgetDefault
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledwidget::constructor {args} {
+
+ #
+ # Turn off the borderwidth on the hull and save off the
+ # interior for later use.
+ #
+ component hull configure -borderwidth 0
+ set _interior $itk_interior
+
+ #
+ # Check if the scrollbars need mapping upon a configure event.
+ #
+ bind $_interior <Configure> [itcl::code $this _configureEvent]
+
+ #
+ # Turn off propagation in the containing shell.
+ #
+ # Due to a bug in the tk4.2 grid, we have to check the
+ # propagation before setting it. Setting it to the same
+ # value it already is will cause it to toggle.
+ #
+ if {[grid propagate $_interior]} {
+ grid propagate $_interior no
+ }
+
+ #
+ # Create the vertical scroll bar
+ #
+ itk_component add vertsb {
+ scrollbar $itk_interior.vertsb -orient vertical
+ } {
+ usual
+ keep -borderwidth -elementborderwidth -jump -relief
+ rename -highlightbackground -background background Background
+ }
+
+ #
+ # Create the horizontal scrollbar
+ #
+ itk_component add horizsb {
+ scrollbar $itk_interior.horizsb -orient horizontal
+ } {
+ usual
+ keep -borderwidth -elementborderwidth -jump -relief
+ rename -highlightbackground -background background Background
+ }
+
+ #
+ # Initialize the widget based on the command line options.
+ #
+ eval itk_initialize $args
+}
+
+# ------------------------------------------------------------------
+# DESTURCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledwidget::destructor {} {
+}
+
+# ------------------------------------------------------------------
+# OPTIONS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# OPTION: -sbwidth
+#
+# Set the width of the scrollbars.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Scrolledwidget::sbwidth {
+ $itk_component(vertsb) configure -width $itk_option(-sbwidth)
+ $itk_component(horizsb) configure -width $itk_option(-sbwidth)
+}
+
+# ------------------------------------------------------------------
+# OPTION: -scrollmargin
+#
+# Set the distance between the scrollbars and the list box.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Scrolledwidget::scrollmargin {
+ set pixels [winfo pixels $_interior $itk_option(-scrollmargin)]
+
+ if {$_hmode == "on"} {
+ grid rowconfigure $_interior 1 -minsize $pixels
+ }
+
+ if {$_vmode == "on"} {
+ grid columnconfigure $_interior 1 -minsize $pixels
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -vscrollmode
+#
+# Enable/disable display and mode of veritcal scrollbars.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Scrolledwidget::vscrollmode {
+ switch $itk_option(-vscrollmode) {
+ static {
+ _vertScrollbarDisplay on
+ }
+
+ dynamic -
+ none {
+ _vertScrollbarDisplay off
+ }
+
+ default {
+ error "bad vscrollmode option\
+ \"$itk_option(-vscrollmode)\": should be\
+ static, dynamic, or none"
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -hscrollmode
+#
+# Enable/disable display and mode of horizontal scrollbars.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Scrolledwidget::hscrollmode {
+ switch $itk_option(-hscrollmode) {
+ static {
+ _horizScrollbarDisplay on
+ }
+
+ dynamic -
+ none {
+ _horizScrollbarDisplay off
+ }
+
+ default {
+ error "bad hscrollmode option\
+ \"$itk_option(-hscrollmode)\": should be\
+ static, dynamic, or none"
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -width
+#
+# Specifies the width of the scrolled widget. The value may be
+# specified in any of the forms acceptable to Tk_GetPixels.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Scrolledwidget::width {
+ $_interior configure -width \
+ [winfo pixels $_interior $itk_option(-width)]
+}
+
+# ------------------------------------------------------------------
+# OPTION: -height
+#
+# Specifies the height of the scrolled widget. The value may be
+# specified in any of the forms acceptable to Tk_GetPixels.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Scrolledwidget::height {
+ $_interior configure -height \
+ [winfo pixels $_interior $itk_option(-height)]
+}
+
+# ------------------------------------------------------------------
+# METHODS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _vertScrollbarDisplay mode
+#
+# Displays the vertical scrollbar based on the input mode.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledwidget::_vertScrollbarDisplay {mode} {
+ switch $mode {
+ on {
+ set _vmode on
+
+ grid columnconfigure $_interior 1 -minsize \
+ [winfo pixels $_interior $itk_option(-scrollmargin)]
+ grid $itk_component(vertsb) -row 0 -column 2 -sticky ns
+ }
+
+ off {
+ set _vmode off
+
+ grid columnconfigure $_interior 1 -minsize 0
+ grid forget $itk_component(vertsb)
+ }
+
+ default {
+ error "invalid argument \"$mode\": should be on or off"
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _horizScrollbarDisplay mode
+#
+# Displays the horizontal scrollbar based on the input mode.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledwidget::_horizScrollbarDisplay {mode} {
+ switch $mode {
+ on {
+ set _hmode on
+
+ grid rowconfigure $_interior 1 -minsize \
+ [winfo pixels $_interior $itk_option(-scrollmargin)]
+ grid $itk_component(horizsb) -row 2 -column 0 -sticky ew
+ }
+
+ off {
+ set _hmode off
+
+ grid rowconfigure $_interior 1 -minsize 0
+ grid forget $itk_component(horizsb)
+ }
+
+ default {
+ error "invalid argument \"$mode\": should be on or off"
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _scrollWidget wid first last
+#
+# Performs scrolling and display of scrollbars based on the total
+# and maximum frame size as well as the current -vscrollmode and
+# -hscrollmode settings. Parameters are automatic scroll parameters.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledwidget::_scrollWidget {wid first last} {
+ $wid set $first $last
+
+ if {$wid == $itk_component(vertsb)} {
+ if {$itk_option(-vscrollmode) == "dynamic"} {
+ if {($_recheckVert != 1) && ($_vmode == "on")} {
+ return
+ } else {
+ set _recheckVert 0
+ }
+
+ if {($first == 0) && ($last == 1)} {
+ if {$_vmode != "off"} {
+ _vertScrollbarDisplay off
+ }
+
+ } else {
+ if {$_vmode != "on"} {
+ _vertScrollbarDisplay on
+ }
+ }
+ }
+
+ } elseif {$wid == $itk_component(horizsb)} {
+ if {$itk_option(-hscrollmode) == "dynamic"} {
+ if {($_recheckHoriz != 1) && ($_hmode == "on")} {
+ return
+ } else {
+ set _recheckHoriz 0
+ }
+
+ if {($first == 0) && ($last == 1)} {
+ if {$_hmode != "off"} {
+ _horizScrollbarDisplay off
+ }
+
+ } else {
+ if {$_hmode != "on"} {
+ _horizScrollbarDisplay on
+ }
+ }
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _configureEvent
+#
+# Resets the recheck flags which determine if we'll try and map
+# the scrollbars in dynamic mode.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledwidget::_configureEvent {} {
+ update idletasks
+ set _recheckVert 1
+ set _recheckHoriz 1
+}
diff --git a/iwidgets/generic/selectionbox.itk b/iwidgets/generic/selectionbox.itk
new file mode 100644
index 00000000000..9957f261bc1
--- /dev/null
+++ b/iwidgets/generic/selectionbox.itk
@@ -0,0 +1,560 @@
+#
+# Selectionbox
+# ----------------------------------------------------------------------
+# Implements a selection box composed of a scrolled list of items and
+# a selection entry field. The user may choose any of the items displayed
+# in the scrolled list of alternatives and the selection field will be
+# filled with the choice. The user is also free to enter a new value in
+# the selection entry field. Both the list and entry areas have labels.
+# A child site is also provided in which the user may create other widgets
+# to be used in conjunction with the selection box.
+#
+# ----------------------------------------------------------------------
+# AUTHOR: Mark L. Ulferts EMAIL: mulferts@austin.dsccc.com
+#
+# @(#) $Id$
+# ----------------------------------------------------------------------
+# Copyright (c) 1995 DSC Technologies Corporation
+# ======================================================================
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+
+#
+# Usual options.
+#
+itk::usual Selectionbox {
+ keep -activebackground -activerelief -background -borderwidth -cursor \
+ -elementborderwidth -foreground -highlightcolor -highlightthickness \
+ -insertbackground -insertborderwidth -insertofftime -insertontime \
+ -insertwidth -jump -labelfont -selectbackground -selectborderwidth \
+ -selectforeground -textbackground -textfont -troughcolor
+}
+
+# ------------------------------------------------------------------
+# SELECTIONBOX
+# ------------------------------------------------------------------
+itcl::class iwidgets::Selectionbox {
+ inherit itk::Widget
+
+ constructor {args} {}
+ destructor {}
+
+ itk_option define -childsitepos childSitePos Position center
+ itk_option define -margin margin Margin 7
+ itk_option define -itemson itemsOn ItemsOn true
+ itk_option define -selectionon selectionOn SelectionOn true
+ itk_option define -width width Width 260
+ itk_option define -height height Height 320
+
+ public method childsite {}
+ public method get {}
+ public method curselection {}
+ public method clear {component}
+ public method insert {component index args}
+ public method delete {first {last {}}}
+ public method size {}
+ public method scan {option args}
+ public method nearest {y}
+ public method index {index}
+ public method selection {option args}
+ public method selectitem {}
+
+ private method _packComponents {{when later}}
+
+ private variable _repacking {} ;# non-null => _packComponents pending
+}
+
+#
+# Provide a lowercased access method for the Selectionbox class.
+#
+proc ::iwidgets::selectionbox {pathName args} {
+ uplevel ::iwidgets::Selectionbox $pathName $args
+}
+
+#
+# Use option database to override default resources of base classes.
+#
+option add *Selectionbox.itemsLabel Items widgetDefault
+option add *Selectionbox.selectionLabel Selection widgetDefault
+option add *Selectionbox.width 260 widgetDefault
+option add *Selectionbox.height 320 widgetDefault
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Selectionbox::constructor {args} {
+ #
+ # Set the borderwidth to zero and add width and height options
+ # back to the hull.
+ #
+ component hull configure -borderwidth 0
+ itk_option add hull.width hull.height
+
+ #
+ # Create the child site widget.
+ #
+ itk_component add -protected sbchildsite {
+ frame $itk_interior.sbchildsite
+ }
+
+ #
+ # Create the items list.
+ #
+ itk_component add items {
+ iwidgets::Scrolledlistbox $itk_interior.items -selectmode single \
+ -visibleitems 20x10 -labelpos nw -vscrollmode static \
+ -hscrollmode none
+ } {
+ usual
+ keep -dblclickcommand -exportselection
+
+ rename -labeltext -itemslabel itemsLabel Text
+ rename -selectioncommand -itemscommand itemsCommand Command
+ }
+ configure -itemscommand [itcl::code $this selectitem]
+
+ #
+ # Create the selection entry.
+ #
+ itk_component add selection {
+ iwidgets::Entryfield $itk_interior.selection -labelpos nw
+ } {
+ usual
+
+ keep -exportselection
+
+ rename -labeltext -selectionlabel selectionLabel Text
+ rename -command -selectioncommand selectionCommand Command
+ }
+
+ #
+ # Set the interior to the childsite for derived classes.
+ #
+ set itk_interior $itk_component(sbchildsite)
+
+ #
+ # Initialize the widget based on the command line options.
+ #
+ eval itk_initialize $args
+
+ #
+ # When idle, pack the components.
+ #
+ _packComponents
+}
+
+# ------------------------------------------------------------------
+# DESTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Selectionbox::destructor {} {
+ if {$_repacking != ""} {after cancel $_repacking}
+}
+
+# ------------------------------------------------------------------
+# OPTIONS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# OPTION: -childsitepos
+#
+# Specifies the position of the child site in the selection box.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Selectionbox::childsitepos {
+ _packComponents
+}
+
+# ------------------------------------------------------------------
+# OPTION: -margin
+#
+# Specifies distance between the items list and selection entry.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Selectionbox::margin {
+ _packComponents
+}
+
+# ------------------------------------------------------------------
+# OPTION: -itemson
+#
+# Specifies whether or not to display the items list.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Selectionbox::itemson {
+ _packComponents
+}
+
+# ------------------------------------------------------------------
+# OPTION: -selectionon
+#
+# Specifies whether or not to display the selection entry widget.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Selectionbox::selectionon {
+ _packComponents
+}
+
+# ------------------------------------------------------------------
+# OPTION: -width
+#
+# Specifies the width of the hull. The value may be specified in
+# any of the forms acceptable to Tk_GetPixels. A value of zero
+# causes the width to be adjusted to the required value based on
+# the size requests of the components. Otherwise, the width is
+# fixed.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Selectionbox::width {
+ #
+ # The width option was added to the hull in the constructor.
+ # So, any width value given is passed automatically to the
+ # hull. All we have to do is play with the propagation.
+ #
+ if {$itk_option(-width) != 0} {
+ set propagate 0
+ } else {
+ set propagate 1
+ }
+
+ #
+ # Due to a bug in the tk4.2 grid, we have to check the
+ # propagation before setting it. Setting it to the same
+ # value it already is will cause it to toggle.
+ #
+ if {[grid propagate $itk_component(hull)] != $propagate} {
+ grid propagate $itk_component(hull) $propagate
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -height
+#
+# Specifies the height of the hull. The value may be specified in
+# any of the forms acceptable to Tk_GetPixels. A value of zero
+# causes the height to be adjusted to the required value based on
+# the size requests of the components. Otherwise, the height is
+# fixed.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Selectionbox::height {
+ #
+ # The height option was added to the hull in the constructor.
+ # So, any height value given is passed automatically to the
+ # hull. All we have to do is play with the propagation.
+ #
+ if {$itk_option(-height) != 0} {
+ set propagate 0
+ } else {
+ set propagate 1
+ }
+
+ #
+ # Due to a bug in the tk4.2 grid, we have to check the
+ # propagation before setting it. Setting it to the same
+ # value it already is will cause it to toggle.
+ #
+ if {[grid propagate $itk_component(hull)] != $propagate} {
+ grid propagate $itk_component(hull) $propagate
+ }
+}
+
+# ------------------------------------------------------------------
+# METHODS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# METHOD: childsite
+#
+# Returns the path name of the child site widget.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Selectionbox::childsite {} {
+ return $itk_component(sbchildsite)
+}
+
+# ------------------------------------------------------------------
+# METHOD: get
+#
+# Returns the current selection.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Selectionbox::get {} {
+ return [$itk_component(selection) get]
+}
+
+# ------------------------------------------------------------------
+# METHOD: curselection
+#
+# Returns the current selection index.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Selectionbox::curselection {} {
+ return [$itk_component(items) curselection]
+}
+
+# ------------------------------------------------------------------
+# METHOD: clear component
+#
+# Delete the contents of either the selection entry widget or items
+# list.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Selectionbox::clear {component} {
+ switch $component {
+ selection {
+ $itk_component(selection) clear
+ }
+
+ items {
+ delete 0 end
+ }
+
+ default {
+ error "bad clear argument \"$component\": should be\
+ selection or items"
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# METHOD: insert component index args
+#
+# Insert element(s) into either the selection or items list widget.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Selectionbox::insert {component index args} {
+ switch $component {
+ selection {
+ eval $itk_component(selection) insert $index $args
+ }
+
+ items {
+ eval $itk_component(items) insert $index $args
+ }
+
+ default {
+ error "bad insert argument \"$component\": should be\
+ selection or items"
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# METHOD: delete first ?last?
+#
+# Delete one or more elements from the items list box. The default
+# is to delete by indexed range. If an item is to be removed by name,
+# it must be preceeded by the keyword "item". Only index numbers can
+# be used to delete a range of items.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Selectionbox::delete {first {last {}}} {
+ set first [index $first]
+
+ if {$last != {}} {
+ set last [index $last]
+ } else {
+ set last $first
+ }
+
+ if {$first <= $last} {
+ eval $itk_component(items) delete $first $last
+ } else {
+ error "first index must not be greater than second"
+ }
+}
+
+# ------------------------------------------------------------------
+# METHOD: size
+#
+# Returns a decimal string indicating the total number of elements
+# in the items list.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Selectionbox::size {} {
+ return [$itk_component(items) size]
+}
+
+# ------------------------------------------------------------------
+# METHOD: scan option args
+#
+# Implements scanning on items list.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Selectionbox::scan {option args} {
+ eval $itk_component(items) scan $option $args
+}
+
+# ------------------------------------------------------------------
+# METHOD: nearest y
+#
+# Returns the index to the nearest listbox item given a y coordinate.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Selectionbox::nearest {y} {
+ return [$itk_component(items) nearest $y]
+}
+
+# ------------------------------------------------------------------
+# METHOD: index index
+#
+# Returns the decimal string giving the integer index corresponding
+# to index.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Selectionbox::index {index} {
+ return [$itk_component(items) index $index]
+}
+
+# ------------------------------------------------------------------
+# METHOD: selection option args
+#
+# Adjusts the selection within the items list.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Selectionbox::selection {option args} {
+ eval $itk_component(items) selection $option $args
+
+ selectitem
+}
+
+# ------------------------------------------------------------------
+# METHOD: selectitem
+#
+# Replace the selection entry field contents with the currently
+# selected items value.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Selectionbox::selectitem {} {
+ $itk_component(selection) clear
+ set numSelected [$itk_component(items) selecteditemcount]
+
+ if {$numSelected == 1} {
+ $itk_component(selection) insert end \
+ [$itk_component(items) getcurselection]
+ } elseif {$numSelected > 1} {
+ $itk_component(selection) insert end \
+ [lindex [$itk_component(items) getcurselection] 0]
+ }
+
+ $itk_component(selection) icursor end
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _packComponents ?when?
+#
+# Pack the selection, items, and child site widgets based on options.
+# If "when" is "now", the change is applied immediately. If it is
+# "later" or it is not specified, then the change is applied later,
+# when the application is idle.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Selectionbox::_packComponents {{when later}} {
+ if {$when == "later"} {
+ if {$_repacking == ""} {
+ set _repacking [after idle [itcl::code $this _packComponents now]]
+ }
+ return
+ } elseif {$when != "now"} {
+ error "bad option \"$when\": should be now or later"
+ }
+
+ set _repacking ""
+
+ set parent [winfo parent $itk_component(sbchildsite)]
+ set margin [winfo pixels $itk_component(hull) $itk_option(-margin)]
+
+ switch $itk_option(-childsitepos) {
+ n {
+ grid $itk_component(sbchildsite) -row 0 -column 0 \
+ -sticky nsew -rowspan 1
+ grid $itk_component(items) -row 1 -column 0 -sticky nsew
+ grid $itk_component(selection) -row 3 -column 0 -sticky ew
+
+ grid rowconfigure $parent 0 -weight 0 -minsize 0
+ grid rowconfigure $parent 1 -weight 1 -minsize 0
+ grid rowconfigure $parent 2 -weight 0 -minsize $margin
+ grid rowconfigure $parent 3 -weight 0 -minsize 0
+
+ grid columnconfigure $parent 0 -weight 1 -minsize 0
+ grid columnconfigure $parent 1 -weight 0 -minsize 0
+ }
+
+ w {
+ grid $itk_component(sbchildsite) -row 0 -column 0 \
+ -sticky nsew -rowspan 3
+ grid $itk_component(items) -row 0 -column 1 -sticky nsew
+ grid $itk_component(selection) -row 2 -column 1 -sticky ew
+
+ grid rowconfigure $parent 0 -weight 1 -minsize 0
+ grid rowconfigure $parent 1 -weight 0 -minsize $margin
+ grid rowconfigure $parent 2 -weight 0 -minsize 0
+ grid rowconfigure $parent 3 -weight 0 -minsize 0
+
+ grid columnconfigure $parent 0 -weight 0 -minsize 0
+ grid columnconfigure $parent 1 -weight 1 -minsize 0
+ }
+
+ s {
+ grid $itk_component(items) -row 0 -column 0 -sticky nsew
+ grid $itk_component(selection) -row 2 -column 0 -sticky ew
+ grid $itk_component(sbchildsite) -row 3 -column 0 \
+ -sticky nsew -rowspan 1
+
+ grid rowconfigure $parent 0 -weight 1 -minsize 0
+ grid rowconfigure $parent 1 -weight 0 -minsize $margin
+ grid rowconfigure $parent 2 -weight 0 -minsize 0
+ grid rowconfigure $parent 3 -weight 0 -minsize 0
+
+ grid columnconfigure $parent 0 -weight 1 -minsize 0
+ grid columnconfigure $parent 1 -weight 0 -minsize 0
+ }
+
+ e {
+ grid $itk_component(items) -row 0 -column 0 -sticky nsew
+ grid $itk_component(selection) -row 2 -column 0 -sticky ew
+ grid $itk_component(sbchildsite) -row 0 -column 1 \
+ -sticky nsew -rowspan 3
+
+ grid rowconfigure $parent 0 -weight 1 -minsize 0
+ grid rowconfigure $parent 1 -weight 0 -minsize $margin
+ grid rowconfigure $parent 2 -weight 0 -minsize 0
+ grid rowconfigure $parent 3 -weight 0 -minsize 0
+
+ grid columnconfigure $parent 0 -weight 1 -minsize 0
+ grid columnconfigure $parent 1 -weight 0 -minsize 0
+ }
+
+ center {
+ grid $itk_component(items) -row 0 -column 0 -sticky nsew
+ grid $itk_component(sbchildsite) -row 1 -column 0 \
+ -sticky nsew -rowspan 1
+ grid $itk_component(selection) -row 3 -column 0 -sticky ew
+
+ grid rowconfigure $parent 0 -weight 1 -minsize 0
+ grid rowconfigure $parent 1 -weight 0 -minsize 0
+ grid rowconfigure $parent 2 -weight 0 -minsize $margin
+ grid rowconfigure $parent 3 -weight 0 -minsize 0
+
+ grid columnconfigure $parent 0 -weight 1 -minsize 0
+ grid columnconfigure $parent 1 -weight 0 -minsize 0
+ }
+
+ default {
+ error "bad childsitepos option \"$itk_option(-childsitepos)\":\
+ should be n, e, s, w, or center"
+ }
+ }
+
+ if {$itk_option(-itemson)} {
+ } else {
+ grid forget $itk_component(items)
+ }
+
+ if {$itk_option(-selectionon)} {
+ } else {
+ grid forget $itk_component(selection)
+ }
+
+ raise $itk_component(sbchildsite)
+}
+
diff --git a/iwidgets/generic/selectiondialog.itk b/iwidgets/generic/selectiondialog.itk
new file mode 100644
index 00000000000..076d8880195
--- /dev/null
+++ b/iwidgets/generic/selectiondialog.itk
@@ -0,0 +1,233 @@
+#
+# Selectiondialog
+# ----------------------------------------------------------------------
+# Implements a selection box similar to the OSF/Motif standard selection
+# dialog composite widget. The Selectiondialog is derived from the
+# Dialog class and is composed of a SelectionBox with attributes to
+# manipulate the dialog buttons.
+#
+# ----------------------------------------------------------------------
+# AUTHOR: Mark L. Ulferts EMAIL: mulferts@austin.dsccc.com
+#
+# @(#) $Id$
+# ----------------------------------------------------------------------
+# Copyright (c) 1995 DSC Technologies Corporation
+# ======================================================================
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+
+#
+# Usual options.
+#
+itk::usual Selectiondialog {
+ keep -activebackground -activerelief -background -borderwidth -cursor \
+ -elementborderwidth -foreground -highlightcolor -highlightthickness \
+ -insertbackground -insertborderwidth -insertofftime -insertontime \
+ -insertwidth -jump -labelfont -modality -selectbackground \
+ -selectborderwidth -selectforeground -textbackground -textfont \
+ -troughcolor
+}
+
+# ------------------------------------------------------------------
+# SELECTIONDIALOG
+# ------------------------------------------------------------------
+itcl::class iwidgets::Selectiondialog {
+ inherit iwidgets::Dialog
+
+ constructor {args} {}
+
+ public method childsite {}
+ public method get {}
+ public method curselection {}
+ public method clear {component}
+ public method insert {component index args}
+ public method delete {first {last {}}}
+ public method size {}
+ public method scan {option args}
+ public method nearest {y}
+ public method index {index}
+ public method selection {option args}
+ public method selectitem {}
+}
+
+#
+# Provide a lowercased access method for the Selectiondialog class.
+#
+proc ::iwidgets::selectiondialog {pathName args} {
+ uplevel ::iwidgets::Selectiondialog $pathName $args
+}
+
+#
+# Use option database to override default resources of base classes.
+#
+option add *Selectiondialog.title "Selection Dialog" widgetDefault
+option add *Selectiondialog.master "." widgetDefault
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Selectiondialog::constructor {args} {
+ #
+ # Set the borderwidth to zero.
+ #
+ component hull configure -borderwidth 0
+
+ #
+ # Instantiate a selection box widget.
+ #
+ itk_component add selectionbox {
+ iwidgets::Selectionbox $itk_interior.selectionbox \
+ -dblclickcommand [itcl::code $this invoke]
+ } {
+ usual
+
+ keep -childsitepos -exportselection -itemscommand -itemslabel \
+ -itemson -selectionlabel -selectionon -selectioncommand
+ }
+ configure -itemscommand [itcl::code $this selectitem]
+
+ pack $itk_component(selectionbox) -fill both -expand yes
+ set itk_interior [$itk_component(selectionbox) childsite]
+
+ hide Help
+
+ eval itk_initialize $args
+}
+
+# ------------------------------------------------------------------
+# METHODS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# METHOD: childsite
+#
+# Thinwrapped method of selection box class.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Selectiondialog::childsite {} {
+ return [$itk_component(selectionbox) childsite]
+}
+
+# ------------------------------------------------------------------
+# METHOD: get
+#
+# Thinwrapped method of selection box class.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Selectiondialog::get {} {
+ return [$itk_component(selectionbox) get]
+}
+
+# ------------------------------------------------------------------
+# METHOD: curselection
+#
+# Thinwrapped method of selection box class.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Selectiondialog::curselection {} {
+ return [$itk_component(selectionbox) curselection]
+}
+
+# ------------------------------------------------------------------
+# METHOD: clear component
+#
+# Thinwrapped method of selection box class.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Selectiondialog::clear {component} {
+ $itk_component(selectionbox) clear $component
+
+ return
+}
+
+# ------------------------------------------------------------------
+# METHOD: insert component index args
+#
+# Thinwrapped method of selection box class.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Selectiondialog::insert {component index args} {
+ eval $itk_component(selectionbox) insert $component $index $args
+
+ return
+}
+
+# ------------------------------------------------------------------
+# METHOD: delete first ?last?
+#
+# Thinwrapped method of selection box class.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Selectiondialog::delete {first {last {}}} {
+ $itk_component(selectionbox) delete $first $last
+
+ return
+}
+
+# ------------------------------------------------------------------
+# METHOD: size
+#
+# Thinwrapped method of selection box class.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Selectiondialog::size {} {
+ return [$itk_component(selectionbox) size]
+}
+
+# ------------------------------------------------------------------
+# METHOD: scan option args
+#
+# Thinwrapped method of selection box class.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Selectiondialog::scan {option args} {
+ return [eval $itk_component(selectionbox) scan $option $args]
+}
+
+# ------------------------------------------------------------------
+# METHOD: nearest y
+#
+# Thinwrapped method of selection box class.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Selectiondialog::nearest {y} {
+ return [$itk_component(selectionbox) nearest $y]
+}
+
+# ------------------------------------------------------------------
+# METHOD: index index
+#
+# Thinwrapped method of selection box class.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Selectiondialog::index {index} {
+ return [$itk_component(selectionbox) index $index]
+}
+
+# ------------------------------------------------------------------
+# METHOD: selection option args
+#
+# Thinwrapped method of selection box class.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Selectiondialog::selection {option args} {
+ eval $itk_component(selectionbox) selection $option $args
+}
+
+# ------------------------------------------------------------------
+# METHOD: selectitem
+#
+# Set the default button to ok and select the item.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Selectiondialog::selectitem {} {
+ default OK
+ $itk_component(selectionbox) selectitem
+}
+
diff --git a/iwidgets/generic/shell.itk b/iwidgets/generic/shell.itk
new file mode 100644
index 00000000000..85ebfbc7cb9
--- /dev/null
+++ b/iwidgets/generic/shell.itk
@@ -0,0 +1,375 @@
+# Shell
+# ----------------------------------------------------------------------
+# This class is implements a shell which is a top level widget
+# giving a childsite and providing activate, deactivate, and center
+# methods.
+#
+# ----------------------------------------------------------------------
+# AUTHOR: Mark L. Ulferts EMAIL: mulferts@austin.dsccc.com
+# Kris Raney EMAIL: kraney@spd.dsccc.com
+#
+# @(#) $Id$
+# ----------------------------------------------------------------------
+# Copyright (c) 1996 DSC Technologies Corporation
+# ======================================================================
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+
+#
+# Usual options.
+#
+itk::usual Shell {
+ keep -background -cursor -modality
+}
+
+# ------------------------------------------------------------------
+# SHELL
+# ------------------------------------------------------------------
+itcl::class iwidgets::Shell {
+ inherit itk::Toplevel
+
+ constructor {args} {}
+
+ itk_option define -master master Window ""
+ itk_option define -modality modality Modality none
+ itk_option define -padx padX Pad 0
+ itk_option define -pady padY Pad 0
+ itk_option define -width width Width 0
+ itk_option define -height height Height 0
+
+ public method childsite {}
+ public method activate {}
+ public method deactivate {args}
+ public method center {{widget {}}}
+
+ private variable _result {} ;# Resultant value for modal activation.
+ private variable _busied {} ;# List of busied top level widgets.
+
+ common grabstack {}
+ common _wait
+}
+
+#
+# Provide a lowercased access method for the Shell class.
+#
+proc ::iwidgets::shell {pathName args} {
+ uplevel ::iwidgets::Shell $pathName $args
+}
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Shell::constructor {args} {
+ itk_option add hull.width hull.height
+
+ #
+ # Maintain a withdrawn state until activated.
+ #
+ wm withdraw $itk_component(hull)
+
+ #
+ # Create the user child site
+ #
+ itk_component add -protected shellchildsite {
+ frame $itk_interior.shellchildsite
+ }
+ pack $itk_component(shellchildsite) -fill both -expand yes
+
+ #
+ # Set the itk_interior variable to be the childsite for derived
+ # classes.
+ #
+ set itk_interior $itk_component(shellchildsite)
+
+ #
+ # Bind the window manager delete protocol to deactivation of the
+ # widget. This can be overridden by the user via the execution
+ # of a similar command outside the class.
+ #
+ wm protocol $itk_component(hull) WM_DELETE_WINDOW [itcl::code $this deactivate]
+
+ #
+ # Initialize the widget based on the command line options.
+ #
+ eval itk_initialize $args
+}
+
+# ------------------------------------------------------------------
+# OPTIONS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# OPTION: -master
+#
+# Specifies the master window for the shell. The window manager is
+# informed that the shell is a transient window whose master is
+# -masterwindow.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Shell::master {}
+
+# ------------------------------------------------------------------
+# OPTION: -modality
+#
+# Specify the modality of the dialog.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Shell::modality {
+ switch $itk_option(-modality) {
+ none -
+ application -
+ global {
+ }
+
+ default {
+ error "bad modality option \"$itk_option(-modality)\":\
+ should be none, application, or global"
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -padx
+#
+# Specifies a padding distance for the childsite in the X-direction.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Shell::padx {
+ pack config $itk_component(shellchildsite) -padx $itk_option(-padx)
+}
+
+# ------------------------------------------------------------------
+# OPTION: -pady
+#
+# Specifies a padding distance for the childsite in the Y-direction.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Shell::pady {
+ pack config $itk_component(shellchildsite) -pady $itk_option(-pady)
+}
+
+# ------------------------------------------------------------------
+# OPTION: -width
+#
+# Specifies the width of the shell. The value may be specified in
+# any of the forms acceptable to Tk_GetPixels. A value of zero
+# causes the width to be adjusted to the required value based on
+# the size requests of the components placed in the childsite.
+# Otherwise, the width is fixed.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Shell::width {
+ #
+ # The width option was added to the hull in the constructor.
+ # So, any width value given is passed automatically to the
+ # hull. All we have to do is play with the propagation.
+ #
+ if {$itk_option(-width) != 0} {
+ pack propagate $itk_component(hull) no
+ } else {
+ pack propagate $itk_component(hull) yes
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -height
+#
+# Specifies the height of the shell. The value may be specified in
+# any of the forms acceptable to Tk_GetPixels. A value of zero
+# causes the height to be adjusted to the required value based on
+# the size requests of the components placed in the childsite.
+# Otherwise, the height is fixed.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Shell::height {
+ #
+ # The height option was added to the hull in the constructor.
+ # So, any height value given is passed automatically to the
+ # hull. All we have to do is play with the propagation.
+ #
+ if {$itk_option(-height) != 0} {
+ pack propagate $itk_component(hull) no
+ } else {
+ pack propagate $itk_component(hull) yes
+ }
+}
+
+# ------------------------------------------------------------------
+# METHODS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# METHOD: childsite
+#
+# Return the pathname of the user accessible area.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Shell::childsite {} {
+ return $itk_component(shellchildsite)
+}
+
+# ------------------------------------------------------------------
+# METHOD: activate
+#
+# Display the dialog and wait based on the modality. For application
+# and global modal activations, perform a grab operation, and wait
+# for the result. The result may be returned via an argument to the
+# "deactivate" method.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Shell::activate {} {
+
+ if {[winfo ismapped $itk_component(hull)]} {
+ raise $itk_component(hull)
+ return
+ }
+
+ if {($itk_option(-master) != {}) && \
+ [winfo exists $itk_option(-master)]} {
+ wm transient $itk_component(hull) $itk_option(-master)
+ }
+
+ set _wait($this) 0
+ raise $itk_component(hull)
+ wm deiconify $itk_component(hull)
+ tkwait visibility $itk_component(hull)
+
+ # Need to flush the event loop. This line added as a result of
+ # SF ticket #227885.
+ update idletasks
+
+ if {$itk_option(-modality) == "application"} {
+ if {$grabstack != {}} {
+ grab release [lindex $grabstack end]
+ }
+
+ set err 1
+ while {$err == 1} {
+ set err [catch [list grab $itk_component(hull)]]
+ if {$err == 1} {
+ after 1000
+ }
+ }
+
+ lappend grabstack [list grab $itk_component(hull)]
+
+ tkwait variable [itcl::scope _wait($this)]
+ return $_result
+
+ } elseif {$itk_option(-modality) == "global" } {
+ if {$grabstack != {}} {
+ grab release [lindex $grabstack end]
+ }
+
+ set err 1
+ while {$err == 1} {
+ set err [catch [list grab -global $itk_component(hull)]]
+ if {$err == 1} {
+ after 1000
+ }
+ }
+
+ lappend grabstack [list grab -global $itk_component(hull)]
+
+ tkwait variable [itcl::scope _wait($this)]
+ return $_result
+ }
+}
+
+# ------------------------------------------------------------------
+# METHOD: deactivate
+#
+# Deactivate the display of the dialog. The method takes an optional
+# argument to passed to the "activate" method which returns the value.
+# This is only effective for application and global modal dialogs.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Shell::deactivate {args} {
+
+ if {! [winfo ismapped $itk_component(hull)]} {
+ return
+ }
+
+ if {$itk_option(-modality) == "none"} {
+ wm withdraw $itk_component(hull)
+ } elseif {$itk_option(-modality) == "application"} {
+ grab release $itk_component(hull)
+ if {$grabstack != {}} {
+ if {[set grabstack [lreplace $grabstack end end]] != {}} {
+ eval [lindex $grabstack end]
+ }
+ }
+
+ wm withdraw $itk_component(hull)
+
+ } elseif {$itk_option(-modality) == "global"} {
+ grab release $itk_component(hull)
+ if {$grabstack != {}} {
+ if {[set grabstack [lreplace $grabstack end end]] != {}} {
+ eval [lindex $grabstack end]
+ }
+ }
+
+ wm withdraw $itk_component(hull)
+ }
+
+ if {[llength $args]} {
+ set _result $args
+ } else {
+ set _result {}
+ }
+
+ set _wait($this) 1
+ return
+}
+
+# ------------------------------------------------------------------
+# METHOD: center
+#
+# Centers the dialog with respect to another widget or the screen
+# as a whole.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Shell::center {{widget {}}} {
+ update idletasks
+
+ set hull $itk_component(hull)
+ set w [winfo width $hull]
+ set h [winfo height $hull]
+ set sh [winfo screenheight $hull] ;# display screen's height/width
+ set sw [winfo screenwidth $hull]
+
+ #
+ # User can request it centered with respect to root by passing in '{}'
+ #
+ if { $widget == "" } {
+ set reqX [expr {($sw-$w)/2}]
+ set reqY [expr {($sh-$h)/2}]
+ } else {
+ set wfudge 5 ;# wm width fudge factor
+ set hfudge 20 ;# wm height fudge factor
+ set widgetW [winfo width $widget]
+ set widgetH [winfo height $widget]
+ set reqX [expr {[winfo rootx $widget]+($widgetW-($widgetW/2))-($w/2)}]
+ set reqY [expr {[winfo rooty $widget]+($widgetH-($widgetH/2))-($h/2)}]
+
+ #
+ # Adjust for errors - if too long or too tall
+ #
+ if { ($reqX+$w+$wfudge) > $sw } { set reqX [expr {$sw-$w-$wfudge}] }
+ if { $reqX < $wfudge } { set reqX $wfudge }
+ if { ($reqY+$h+$hfudge) > $sh } { set reqY [expr {$sh-$h-$hfudge}] }
+ if { $reqY < $hfudge } { set reqY $hfudge }
+ }
+
+ wm geometry $hull +$reqX+$reqY
+}
+
diff --git a/iwidgets/generic/spindate.itk b/iwidgets/generic/spindate.itk
new file mode 100644
index 00000000000..5d431f9452d
--- /dev/null
+++ b/iwidgets/generic/spindate.itk
@@ -0,0 +1,693 @@
+# Spindate
+# ----------------------------------------------------------------------
+# Implements a Date spinner widget. A date spinner contains three
+# Spinner widgets: one Spinner for months, one SpinInt for days,
+# and one SpinInt for years. Months can be specified as abbreviated
+# strings, integers or a user-defined list. Options exist to manage to
+# behavior, appearance, and format of each component spinner.
+#
+# ----------------------------------------------------------------------
+# AUTHOR: Sue Yockey EMAIL: yockey@actc.com
+# Mark L. Ulferts mulferts@austin.dsccc.com
+#
+# @(#) $Id$
+# ----------------------------------------------------------------------
+# Copyright (c) 1997 DSC Technologies Corporation
+# ======================================================================
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+
+#
+# Default resources.
+#
+option add *Spindate.monthLabel "Month" widgetDefault
+option add *Spindate.dayLabel "Day" widgetDefault
+option add *Spindate.yearLabel "Year" widgetDefault
+option add *Spindate.monthWidth 4 widgetDefault
+option add *Spindate.dayWidth 4 widgetDefault
+option add *Spindate.yearWidth 4 widgetDefault
+
+#
+# Usual options.
+#
+itk::usual Spindate {
+ keep -background -cursor -foreground -labelfont -textbackground -textfont
+}
+
+# ------------------------------------------------------------------
+# SPINDATE
+# ------------------------------------------------------------------
+itcl::class iwidgets::Spindate {
+ inherit itk::Widget
+
+ constructor {args} {}
+ destructor {}
+
+ itk_option define -labelpos labelPos Position w
+ itk_option define -orient orient Orient vertical
+ itk_option define -monthon monthOn MonthOn true
+ itk_option define -dayon dayOn DayOn true
+ itk_option define -yearon yearOn YearOn true
+ itk_option define -datemargin dateMargin Margin 1
+ itk_option define -yeardigits yearDigits YearDigits 4
+ itk_option define -monthformat monthFormat MonthFormat integer
+
+ public {
+ method get {{format "-string"}}
+ method show {{date now}}
+ }
+
+ protected {
+ method _packDate {{when later}}
+ variable _repack {} ;# Reconfiguration flag.
+ }
+
+ private {
+ method _lastDay {month year}
+ method _spinMonth {direction}
+ method _spinDay {direction}
+
+ variable _monthFormatStr "%m"
+ variable _yearFormatStr "%Y"
+ variable _interior
+ }
+}
+
+#
+# Provide a lowercased access method for the Spindate class.
+#
+proc ::iwidgets::spindate {pathName args} {
+ uplevel ::iwidgets::Spindate $pathName $args
+}
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Spindate::constructor {args} {
+ set _interior $itk_interior
+
+ set clicks [clock seconds]
+
+ #
+ # Create Month Spinner
+ #
+ itk_component add month {
+ iwidgets::Spinner $itk_interior.month -fixed 2 -justify right \
+ -decrement [itcl::code $this _spinMonth -1] \
+ -increment [itcl::code $this _spinMonth 1]
+ } {
+ keep -background -cursor -arroworient -foreground \
+ -labelfont -labelmargin -relief -textbackground \
+ -textfont -repeatdelay -repeatinterval
+
+ rename -labeltext -monthlabel monthLabel Text
+ rename -width -monthwidth monthWidth Width
+ }
+
+ #
+ # Take off the default bindings for selction and motion.
+ #
+ bind [$itk_component(month) component entry] <1> {break}
+ bind [$itk_component(month) component entry] <Button1-Motion> {break}
+
+ #
+ # Create Day Spinner
+ #
+ itk_component add day {
+ iwidgets::Spinint $itk_interior.day -fixed 2 -justify right \
+ -decrement [itcl::code $this _spinDay -1] \
+ -increment [itcl::code $this _spinDay 1]
+ } {
+ keep -background -cursor -arroworient -foreground \
+ -labelfont -labelmargin -relief -textbackground \
+ -textfont -repeatdelay -repeatinterval
+
+ rename -labeltext -daylabel dayLabel Text
+ rename -width -daywidth dayWidth Width
+ }
+
+ #
+ # Take off the default bindings for selction and motion.
+ #
+ bind [$itk_component(day) component entry] <1> {break}
+ bind [$itk_component(day) component entry] <Button1-Motion> {break}
+
+ #
+ # Create Year Spinner
+ #
+ itk_component add year {
+ iwidgets::Spinint $itk_interior.year -fixed 2 -justify right \
+ -range {1900 3000}
+ } {
+ keep -background -cursor -arroworient -foreground \
+ -labelfont -labelmargin -relief -textbackground \
+ -textfont -repeatdelay -repeatinterval
+
+ rename -labeltext -yearlabel yearLabel Text
+ rename -width -yearwidth yearWidth Width
+ }
+
+ #
+ # Take off the default bindings for selction and motion.
+ #
+ bind [$itk_component(year) component entry] <1> {break}
+ bind [$itk_component(year) component entry] <Button1-Motion> {break}
+
+ #
+ # Initialize the widget based on the command line options.
+ #
+ eval itk_initialize $args
+
+ #
+ # Show the current date.
+ #
+ show now
+}
+
+# ------------------------------------------------------------------
+# DESTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Spindate::destructor {} {
+ if {$_repack != ""} {after cancel $_repack}
+}
+
+# ------------------------------------------------------------------
+# OPTIONS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# OPTION: -labelpos
+#
+# Specifies the location of all 3 spinners' labels.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Spindate::labelpos {
+ switch $itk_option(-labelpos) {
+ n {
+ $itk_component(month) configure -labelpos n
+ $itk_component(day) configure -labelpos n
+ $itk_component(year) configure -labelpos n
+
+ #
+ # Un-align labels
+ #
+ $itk_component(month) configure -labelmargin 1
+ $itk_component(day) configure -labelmargin 1
+ $itk_component(year) configure -labelmargin 1
+ }
+
+ s {
+ $itk_component(month) configure -labelpos s
+ $itk_component(day) configure -labelpos s
+ $itk_component(year) configure -labelpos s
+
+ #
+ # Un-align labels
+ #
+ $itk_component(month) configure -labelmargin 1
+ $itk_component(day) configure -labelmargin 1
+ $itk_component(year) configure -labelmargin 1
+ }
+
+ w {
+ $itk_component(month) configure -labelpos w
+ $itk_component(day) configure -labelpos w
+ $itk_component(year) configure -labelpos w
+ }
+
+ e {
+ $itk_component(month) configure -labelpos e
+ $itk_component(day) configure -labelpos e
+ $itk_component(year) configure -labelpos e
+
+ #
+ # Un-align labels
+ #
+ $itk_component(month) configure -labelmargin 1
+ $itk_component(day) configure -labelmargin 1
+ $itk_component(year) configure -labelmargin 1
+ }
+
+ default {
+ error "bad labelpos option \"$itk_option(-labelpos)\",\
+ should be n, s, w or e"
+ }
+ }
+
+ _packDate
+}
+
+# ------------------------------------------------------------------
+# OPTION: -orient
+#
+# Specifies the orientation of the 3 spinners for Month, Day
+# and year.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Spindate::orient {
+ _packDate
+}
+
+# ------------------------------------------------------------------
+# OPTION: -monthon
+#
+# Specifies whether or not to display the month spinner.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Spindate::monthon {
+ _packDate
+}
+
+# ------------------------------------------------------------------
+# OPTION: -dayon
+#
+# Specifies whether or not to display the day spinner.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Spindate::dayon {
+ _packDate
+}
+
+# ------------------------------------------------------------------
+# OPTION: -yearon
+#
+# Specifies whether or not to display the year spinner.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Spindate::yearon {
+ _packDate
+}
+
+# ------------------------------------------------------------------
+# OPTION: -datemargin
+#
+# Specifies the margin space between the month and day spinners
+# and the day and year spinners.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Spindate::datemargin {
+ _packDate
+}
+
+# ------------------------------------------------------------------
+# OPTION: -yeardigits
+#
+# Number of digits for year display, 2 or 4
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Spindate::yeardigits {
+ set clicks [clock seconds]
+
+ switch $itk_option(-yeardigits) {
+ "2" {
+ $itk_component(year) configure -width 2 -fixed 2
+ $itk_component(year) clear
+ $itk_component(year) insert 0 [clock format $clicks -format "%y"]
+ set _yearFormatStr "%y"
+ }
+
+ "4" {
+ $itk_component(year) configure -width 4 -fixed 4
+ $itk_component(year) clear
+ $itk_component(year) insert 0 [clock format $clicks -format "%Y"]
+ set _yearFormatStr "%Y"
+ }
+
+ default {
+ error "bad yeardigits option \"$itk_option(-yeardigits)\",\
+ should be 2 or 4"
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -monthformat
+#
+# Format of month display, integers (1-12) or brief strings (Jan -
+# Dec), or full strings (January - December).
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Spindate::monthformat {
+ set clicks [clock seconds]
+
+ if {$itk_option(-monthformat) == "brief"} {
+ $itk_component(month) configure -width 3 -fixed 3
+ $itk_component(month) delete 0 end
+ $itk_component(month) insert 0 [clock format $clicks -format "%b"]
+ set _monthFormatStr "%b"
+
+ } elseif {$itk_option(-monthformat) == "full"} {
+ $itk_component(month) configure -width 9 -fixed 9
+ $itk_component(month) delete 0 end
+ $itk_component(month) insert 0 [clock format $clicks -format "%B"]
+ set _monthFormatStr "%B"
+
+ } elseif {$itk_option(-monthformat) == "integer"} {
+ $itk_component(month) configure -width 2 -fixed 2
+ $itk_component(month) delete 0 end
+ $itk_component(month) insert 0 [clock format $clicks -format "%m"]
+ set _monthFormatStr "%m"
+
+ } else {
+ error "bad monthformat option\
+ \"$itk_option(-monthformat)\", should be\
+ \"integer\", \"brief\" or \"full\""
+ }
+}
+
+# ------------------------------------------------------------------
+# METHODS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# METHOD: get ?format?
+#
+# Return the current contents of the spindate widget in one of
+# two formats string or as an integer clock value using the -string
+# and -clicks options respectively. The default is by string.
+# Reference the clock command for more information on obtaining dates
+# and their formats.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Spindate::get {{format "-string"}} {
+ set month [$itk_component(month) get]
+ set day [$itk_component(day) get]
+ set year [$itk_component(year) get]
+
+ if {[regexp {[0-9]+} $month]} {
+ set datestr "$month/$day/$year"
+ } else {
+ set datestr "$day $month $year"
+ }
+
+ switch -- $format {
+ "-string" {
+ return $datestr
+ }
+ "-clicks" {
+ return [clock scan $datestr]
+ }
+ default {
+ error "bad format option \"$format\":\
+ should be -string or -clicks"
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# PUBLIC METHOD: show date
+#
+# Changes the currently displayed date to be that of the date
+# argument. The date may be specified either as a string or an
+# integer clock value. Reference the clock command for more
+# information on obtaining dates and their formats.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Spindate::show {{date "now"}} {
+ #
+ # Convert the date to a clock clicks value.
+ #
+ if {$date == "now"} {
+ set seconds [clock seconds]
+ } else {
+ if {[catch {clock format $date}] == 0} {
+ set seconds $date
+ } elseif {[catch {set seconds [clock scan $date]}] != 0} {
+ error "bad date: \"$date\", must be a valid date\
+ string, clock clicks value or the keyword now"
+ }
+ }
+
+ #
+ # Display the month based on the -monthformat option.
+ #
+ switch $itk_option(-monthformat) {
+ "brief" {
+ $itk_component(month) delete 0 end
+ $itk_component(month) insert 0 [clock format $seconds -format "%b"]
+ }
+ "full" {
+ $itk_component(month) delete 0 end
+ $itk_component(month) insert 0 [clock format $seconds -format "%B"]
+ }
+ "integer" {
+ $itk_component(month) delete 0 end
+ $itk_component(month) insert 0 [clock format $seconds -format "%m"]
+ }
+ }
+
+ #
+ # Display the day.
+ #
+ $itk_component(day) delete 0 end
+ $itk_component(day) insert end [clock format $seconds -format "%d"]
+
+ #
+ # Display the year based on the -yeardigits option.
+ #
+ switch $itk_option(-yeardigits) {
+ "2" {
+ $itk_component(year) delete 0 end
+ $itk_component(year) insert 0 [clock format $seconds -format "%y"]
+ }
+
+ "4" {
+ $itk_component(year) delete 0 end
+ $itk_component(year) insert 0 [clock format $seconds -format "%Y"]
+ }
+ }
+
+ return
+}
+
+# ----------------------------------------------------------------
+# PRIVATE METHOD: _spinMonth direction
+#
+# Increment or decrement month value. We need to get the values
+# for all three fields so we can make sure the day agrees with
+# the month. Should the current day be greater than the day for
+# the spun month, then the day is set to the last day for the
+# new month.
+# ----------------------------------------------------------------
+itcl::body iwidgets::Spindate::_spinMonth {direction} {
+ set month [$itk_component(month) get]
+ set day [$itk_component(day) get]
+ set year [$itk_component(year) get]
+
+ #
+ # There appears to be a bug in the Tcl clock command in that it
+ # can't scan a date like "12/31/1999 1 month" or any other date with
+ # a year above 2000, but it has no problem scanning "07/01/1998 1 month".
+ # So, we're going to play a game and increment by days until this
+ # is fixed in Tcl.
+ #
+ if {$direction == 1} {
+ set incrdays 32
+ set day 01
+ } else {
+ set incrdays -28
+ set day 28
+ }
+
+ if {[regexp {[0-9]+} $month]} {
+ set clicks [clock scan "$month/$day/$year $incrdays day"]
+ } else {
+ set clicks [clock scan "$day $month $year $incrdays day"]
+ }
+
+ $itk_component(month) clear
+ $itk_component(month) insert 0 \
+ [clock format $clicks -format $_monthFormatStr]
+
+ set currday [$itk_component(day) get]
+ set lastday [_lastDay [$itk_component(month) get] $year]
+
+ if {$currday > $lastday} {
+ $itk_component(day) clear
+ $itk_component(day) insert end $lastday
+ }
+}
+
+# ----------------------------------------------------------------
+# PRIVATE METHOD: _spinDay direction
+#
+# Increment or decrement day value. If the previous day was the
+# first, then set the new day to the last day for the current
+# month. If it was the last day of the month, change it to the
+# first. Otherwise, spin it to the next day.
+# ----------------------------------------------------------------
+itcl::body iwidgets::Spindate::_spinDay {direction} {
+ set month [$itk_component(month) get]
+ set day [$itk_component(day) get]
+ set year [$itk_component(year) get]
+ set lastday [_lastDay $month $year]
+ set currclicks [get -clicks]
+
+ $itk_component(day) delete 0 end
+
+ if {(($day == "01") || ($day == "1")) && ($direction == -1)} {
+ $itk_component(day) insert 0 $lastday
+ return
+ }
+
+ if {($day == $lastday) && ($direction == 1)} {
+ $itk_component(day) insert 0 "01"
+ return
+ }
+
+ set clicks [clock scan "$direction day" -base $currclicks]
+ $itk_component(day) insert 0 [clock format $clicks -format "%d"]
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _packDate when
+#
+# Pack the components of the date spinner. If "when" is "now", the
+# change is applied immediately. If it is "later" or it is not
+# specified, then the change is applied later, when the application
+# is idle.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Spindate::_packDate {{when later}} {
+ if {$when == "later"} {
+ if {$_repack == ""} {
+ set _repack [after idle [itcl::code $this _packDate now]]
+ }
+ return
+ } elseif {$when != "now"} {
+ error "bad option \"$when\": should be now or later"
+ }
+
+ #
+ # Turn off the minsizes for all the rows and columns.
+ #
+ for {set i 0} {$i < 5} {incr i} {
+ grid rowconfigure $_interior $i -minsize 0
+ grid columnconfigure $_interior $i -minsize 0
+ }
+
+ set _repack ""
+
+ #
+ # Based on the orientation, use the grid to place the components into
+ # the proper rows and columns.
+ #
+ switch $itk_option(-orient) {
+ vertical {
+ set row -1
+
+ if {$itk_option(-monthon)} {
+ grid $itk_component(month) -row [incr row] -column 0 \
+ -sticky nsew
+ } else {
+ grid forget $itk_component(month)
+ }
+
+ if {$itk_option(-dayon)} {
+ if {$itk_option(-dayon)} {
+ grid rowconfigure $_interior [incr row] \
+ -minsize $itk_option(-datemargin)
+ }
+
+ grid $itk_component(day) -row [incr row] -column 0 \
+ -sticky nsew
+ } else {
+ grid forget $itk_component(day)
+ }
+
+ if {$itk_option(-yearon)} {
+ if {$itk_option(-monthon) || $itk_option(-dayon)} {
+ grid rowconfigure $_interior [incr row] \
+ -minsize $itk_option(-datemargin)
+ }
+
+ grid $itk_component(year) -row [incr row] -column 0 \
+ -sticky nsew
+ } else {
+ grid forget $itk_component(year)
+ }
+
+ if {$itk_option(-labelpos) == "w"} {
+ iwidgets::Labeledwidget::alignlabels $itk_component(month) \
+ $itk_component(day) $itk_component(year)
+ }
+ }
+
+ horizontal {
+ set column -1
+
+ if {$itk_option(-monthon)} {
+ grid $itk_component(month) -row 0 -column [incr column] \
+ -sticky nsew
+ } else {
+ grid forget $itk_component(month)
+ }
+
+ if {$itk_option(-dayon)} {
+ if {$itk_option(-monthon)} {
+ grid columnconfigure $_interior [incr column] \
+ -minsize $itk_option(-datemargin)
+ }
+
+ grid $itk_component(day) -row 0 -column [incr column] \
+ -sticky nsew
+ } else {
+ grid forget $itk_component(day)
+ }
+
+ if {$itk_option(-yearon)} {
+ if {$itk_option(-monthon) || $itk_option(-dayon)} {
+ grid columnconfigure $_interior [incr column] \
+ -minsize $itk_option(-datemargin)
+ }
+
+ grid $itk_component(year) -row 0 -column [incr column] \
+ -sticky nsew
+ } else {
+ grid forget $itk_component(year)
+ }
+
+ #
+ # Un-align labels.
+ #
+ $itk_component(month) configure -labelmargin 1
+ $itk_component(day) configure -labelmargin 1
+ $itk_component(year) configure -labelmargin 1
+ }
+
+ default {
+ error "bad orient option \"$itk_option(-orient)\", should\
+ be \"vertical\" or \"horizontal\""
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _lastDay month year
+#
+# Internal method which determines the last day of the month for
+# the given month and year. We start at 28 and go forward till
+# we fail. Crude but effective.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Spindate::_lastDay {month year} {
+ set lastone 28
+
+ for {set lastone 28} {$lastone < 32} {incr lastone} {
+ if {[regexp {[0-9]+} $month]} {
+ if {[catch {clock scan "$month/[expr {$lastone + 1}]/$year"}] != 0} {
+ return $lastone
+ }
+ } else {
+ if {[catch {clock scan "[expr {$lastone + 1}] $month $year"}] != 0} {
+ return $lastone
+ }
+ }
+ }
+}
diff --git a/iwidgets/generic/spinint.itk b/iwidgets/generic/spinint.itk
new file mode 100644
index 00000000000..9930b92343a
--- /dev/null
+++ b/iwidgets/generic/spinint.itk
@@ -0,0 +1,237 @@
+# Spinint
+# ----------------------------------------------------------------------
+# Implements an integer spinner widget. It inherits basic spinner
+# functionality from Spinner and adds specific features to create
+# an integer-only spinner.
+# Arrows may be placed horizontally or vertically.
+# User may specify an integer range and step value.
+# Spinner may be configured to wrap when min or max value is reached.
+#
+# NOTE:
+# Spinint integer values should not exceed the size of a long integer.
+# For a 32 bit long the integer range is -2147483648 to 2147483647.
+#
+# ----------------------------------------------------------------------
+# AUTHOR: Sue Yockey Phone: (214) 519-2517
+# E-mail: syockey@spd.dsccc.com
+# yockey@acm.org
+#
+# @(#) $Id$
+# ----------------------------------------------------------------------
+# Copyright (c) 1995 DSC Technologies Corporation
+# ======================================================================
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+
+#
+# Usual options.
+#
+itk::usual Spinint {
+ keep -background -borderwidth -cursor -foreground -highlightcolor \
+ -highlightthickness -insertbackground -insertborderwidth \
+ -insertofftime -insertontime -insertwidth -labelfont \
+ -selectbackground -selectborderwidth -selectforeground \
+ -textbackground -textfont
+}
+
+# ------------------------------------------------------------------
+# SPININT
+# ------------------------------------------------------------------
+itcl::class iwidgets::Spinint {
+ inherit iwidgets::Spinner
+
+ constructor {args} {
+ Spinner::constructor -validate numeric
+ } {}
+
+ itk_option define -range range Range ""
+ itk_option define -step step Step 1
+ itk_option define -wrap wrap Wrap true
+
+ public method up {}
+ public method down {}
+}
+
+#
+# Provide a lowercased access method for the Spinint class.
+#
+proc ::iwidgets::spinint {pathName args} {
+ uplevel ::iwidgets::Spinint $pathName $args
+}
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Spinint::constructor {args} {
+ eval itk_initialize $args
+
+ $itk_component(entry) delete 0 end
+
+ if {[lindex $itk_option(-range) 0] == ""} {
+ $itk_component(entry) insert 0 "0"
+ } else {
+ $itk_component(entry) insert 0 [lindex $itk_option(-range) 0]
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTIONS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# OPTION: -range
+#
+# Set min and max values for spinner.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Spinint::range {
+ if {$itk_option(-range) != ""} {
+ if {[llength $itk_option(-range)] != 2} {
+ error "wrong # args: should be\
+ \"$itk_component(hull) configure -range {begin end}\""
+ }
+
+ set min [lindex $itk_option(-range) 0]
+ set max [lindex $itk_option(-range) 1]
+
+ if {![regexp {^-?[0-9]+$} $min]} {
+ error "bad range option \"$min\": begin value must be\
+ an integer"
+ }
+ if {![regexp {^-?[0-9]+$} $max]} {
+ error "bad range option \"$max\": end value must be\
+ an integer"
+ }
+ if {$min > $max} {
+ error "bad option starting range \"$min\": must be less\
+ than ending: \"$max\""
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -step
+#
+# Increment spinner by step value.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Spinint::step {
+}
+
+# ------------------------------------------------------------------
+# OPTION: -wrap
+#
+# Specify whether spinner should wrap value if at min or max.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Spinint::wrap {
+}
+
+# ------------------------------------------------------------------
+# METHODS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# METHOD: up
+#
+# Up arrow button press event. Increment value in entry.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Spinint::up {} {
+ set min_range [lindex $itk_option(-range) 0]
+ set max_range [lindex $itk_option(-range) 1]
+
+ set val [$itk_component(entry) get]
+ if {[lindex $itk_option(-range) 0] != ""} {
+
+ #
+ # Check boundaries.
+ #
+ if {$val >= $min_range && $val < $max_range} {
+ incr val $itk_option(-step)
+ $itk_component(entry) delete 0 end
+ $itk_component(entry) insert 0 $val
+ } else {
+ if {$itk_option(-wrap)} {
+ if {$val >= $max_range} {
+ $itk_component(entry) delete 0 end
+ $itk_component(entry) insert 0 $min_range
+ } elseif {$val < $min_range} {
+ $itk_component(entry) delete 0 end
+ $itk_component(entry) insert 0 $min_range
+ } else {
+ uplevel #0 $itk_option(-invalid)
+ }
+ } else {
+ uplevel #0 $itk_option(-invalid)
+ }
+ }
+ } else {
+
+ #
+ # No boundaries.
+ #
+ incr val $itk_option(-step)
+ $itk_component(entry) delete 0 end
+ $itk_component(entry) insert 0 $val
+ }
+}
+
+# ------------------------------------------------------------------
+# METHOD: down
+#
+# Down arrow button press event. Decrement value in entry.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Spinint::down {} {
+ set min_range [lindex $itk_option(-range) 0]
+ set max_range [lindex $itk_option(-range) 1]
+
+ set val [$itk_component(entry) get]
+ if {[lindex $itk_option(-range) 0] != ""} {
+
+ #
+ # Check boundaries.
+ #
+ if {$val > $min_range && $val <= $max_range} {
+ incr val -$itk_option(-step)
+ $itk_component(entry) delete 0 end
+ $itk_component(entry) insert 0 $val
+ } else {
+ if {$itk_option(-wrap)} {
+ if {$val <= $min_range} {
+ $itk_component(entry) delete 0 end
+ $itk_component(entry) insert 0 $max_range
+ } elseif {$val > $max_range} {
+ $itk_component(entry) delete 0 end
+ $itk_component(entry) insert 0 $max_range
+ } else {
+ uplevel #0 $itk_option(-invalid)
+ }
+ } else {
+ uplevel #0 $itk_option(-invalid)
+ }
+ }
+ } else {
+
+ #
+ # No boundaries.
+ #
+ incr val -$itk_option(-step)
+ $itk_component(entry) delete 0 end
+ $itk_component(entry) insert 0 $val
+ }
+}
diff --git a/iwidgets/generic/spinner.itk b/iwidgets/generic/spinner.itk
new file mode 100644
index 00000000000..422b065efac
--- /dev/null
+++ b/iwidgets/generic/spinner.itk
@@ -0,0 +1,448 @@
+# Spinner
+# ----------------------------------------------------------------------
+# Implements a spinner widget. The Spinner is comprised of an
+# EntryField plus up and down arrow buttons.
+# Spinner is meant to be used as a base class for creating more
+# specific spinners such as SpinInt.itk
+# Arrows may be drawn horizontally or vertically.
+# User may define arrow behavior or accept the default arrow behavior.
+#
+# ----------------------------------------------------------------------
+# AUTHOR: Sue Yockey Phone: (214) 519-2517
+# E-mail: syockey@spd.dsccc.com
+# yockey@acm.org
+#
+# @(#) $Id$
+# ----------------------------------------------------------------------
+# Copyright (c) 1995 DSC Technologies Corporation
+# ======================================================================
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+
+#
+# Usual options.
+#
+itk::usual Spinner {
+ keep -background -borderwidth -cursor -foreground -highlightcolor \
+ -highlightthickness -insertbackground -insertborderwidth \
+ -insertofftime -insertontime -insertwidth -labelfont \
+ -selectbackground -selectborderwidth -selectforeground \
+ -textbackground -textfont
+}
+
+# ------------------------------------------------------------------
+# SPINNER
+# ------------------------------------------------------------------
+itcl::class iwidgets::Spinner {
+ inherit iwidgets::Entryfield
+
+ constructor {args} {}
+ destructor {}
+
+ itk_option define -arroworient arrowOrient Orient vertical
+ itk_option define -textfont textFont \
+ Font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-*
+ itk_option define -borderwidth borderWidth BorderWidth 2
+ itk_option define -highlightthickness highlightThickness \
+ HighlightThickness 2
+ itk_option define -increment increment Command {}
+ itk_option define -decrement decrement Command {}
+ itk_option define -repeatdelay repeatDelay RepeatDelay 300
+ itk_option define -repeatinterval repeatInterval RepeatInterval 100
+ itk_option define -foreground foreground Foreground black
+
+ public method down {}
+ public method up {}
+
+ protected method _pushup {}
+ protected method _pushdown {}
+ protected method _relup {}
+ protected method _reldown {}
+ protected method _doup {rate}
+ protected method _dodown {rate}
+ protected method _up {}
+ protected method _down {}
+
+ protected method _positionArrows {{when later}}
+
+ protected variable _interior {}
+ protected variable _reposition "" ;# non-null => _positionArrows pending
+ protected variable _uptimer "" ;# non-null => _uptimer pending
+ protected variable _downtimer "" ;# non-null => _downtimer pending
+}
+
+#
+# Provide a lowercased access method for the Spinner class.
+#
+proc ::iwidgets::spinner {pathName args} {
+ uplevel ::iwidgets::Spinner $pathName $args
+}
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Spinner::constructor {args} {
+ #
+ # Save off the interior for later use.
+ #
+ set _interior $itk_interior
+
+ #
+ # Create up arrow button.
+ #
+ itk_component add uparrow {
+ canvas $itk_interior.uparrow -height 10 -width 10 \
+ -relief raised -highlightthickness 0
+ } {
+ keep -background -borderwidth
+ }
+
+ #
+ # Create down arrow button.
+ #
+ itk_component add downarrow {
+ canvas $itk_interior.downarrow -height 10 -width 10 \
+ -relief raised -highlightthickness 0
+ } {
+ keep -background -borderwidth
+ }
+
+ #
+ # Add bindings for button press events on the up and down buttons.
+ #
+ bind $itk_component(uparrow) <ButtonPress-1> [itcl::code $this _pushup]
+ bind $itk_component(uparrow) <ButtonRelease-1> [itcl::code $this _relup]
+
+ bind $itk_component(downarrow) <ButtonPress-1> [itcl::code $this _pushdown]
+ bind $itk_component(downarrow) <ButtonRelease-1> [itcl::code $this _reldown]
+
+ eval itk_initialize $args
+
+ #
+ # When idle, position the arrows.
+ #
+ _positionArrows
+}
+
+# ------------------------------------------------------------------
+# DESTRUCTOR
+# ------------------------------------------------------------------
+
+itcl::body iwidgets::Spinner::destructor {} {
+ if {$_reposition != ""} {after cancel $_reposition}
+ if {$_uptimer != ""} {after cancel $_uptimer}
+ if {$_downtimer != ""} {after cancel $_downtimer}
+}
+
+# ------------------------------------------------------------------
+# OPTIONS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# OPTION: -arroworient
+#
+# Place arrows vertically or horizontally .
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Spinner::arroworient {
+ _positionArrows
+}
+
+# ------------------------------------------------------------------
+# OPTION: -textfont
+#
+# Change font, resize arrow buttons.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Spinner::textfont {
+ _positionArrows
+}
+
+# ------------------------------------------------------------------
+# OPTION: -highlightthickness
+#
+# Change highlightthickness, resize arrow buttons.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Spinner::highlightthickness {
+ _positionArrows
+}
+
+# ------------------------------------------------------------------
+# OPTION: -borderwidth
+#
+# Change borderwidth, resize arrow buttons.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Spinner::borderwidth {
+ _positionArrows
+}
+
+# ------------------------------------------------------------------
+# OPTION: -increment
+#
+# Up arrow callback.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Spinner::increment {
+ if {$itk_option(-increment) == {}} {
+ set itk_option(-increment) [itcl::code $this up]
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -decrement
+#
+# Down arrow callback.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Spinner::decrement {
+ if {$itk_option(-decrement) == {}} {
+ set itk_option(-decrement) [itcl::code $this down]
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -repeatinterval
+#
+# Arrow repeat rate in milliseconds. A repeatinterval of 0 disables
+# button repeat.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Spinner::repeatinterval {
+ if {$itk_option(-repeatinterval) < 0} {
+ set itk_option(-repeatinterval) 0
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -repeatdelay
+#
+# Arrow repeat delay in milliseconds.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Spinner::repeatdelay {
+ if {$itk_option(-repeatdelay) < 0} {
+ set itk_option(-repeatdelay) 0
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -foreground
+#
+# Set the foreground color of the up and down arrows. Remember
+# to make sure the "tag" exists before setting them...
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Spinner::foreground {
+
+ if { [$itk_component(uparrow) gettags up] != "" } {
+ $itk_component(uparrow) itemconfigure up \
+ -fill $itk_option(-foreground)
+ }
+
+ if { [$itk_component(downarrow) gettags down] != "" } {
+ $itk_component(downarrow) itemconfigure down \
+ -fill $itk_option(-foreground)
+ }
+}
+
+# ------------------------------------------------------------------
+# METHODS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# METHOD: up
+#
+# Up arrow command. Meant to be overloaded by derived class.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Spinner::up {} {
+}
+
+# ------------------------------------------------------------------
+# METHOD: down
+#
+# Down arrow command. Meant to be overloaded by derived class.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Spinner::down {} {
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _positionArrows ?when?
+#
+# Draw Arrows for spinner. If "when" is "now", the change is applied
+# immediately. If it is "later" or it is not specified, then the
+# change is applied later, when the application is idle.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Spinner::_positionArrows {{when later}} {
+ if {$when == "later"} {
+ if {$_reposition == ""} {
+ set _reposition [after idle [itcl::code $this _positionArrows now]]
+ }
+ return
+ } elseif {$when != "now"} {
+ error "bad option \"$when\": should be now or later"
+ }
+
+ set _reposition ""
+
+ set bdw [cget -borderwidth]
+
+ #
+ # Based on the orientation of the arrows, pack them accordingly and
+ # determine the width and height of the spinners. For vertical
+ # orientation, it is really tight in the y direction, so we'll take
+ # advantage of the highlightthickness. Horizontal alignment has
+ # plenty of space vertically, thus we'll ignore the thickness.
+ #
+ switch $itk_option(-arroworient) {
+ vertical {
+ grid $itk_component(uparrow) -row 0 -column 0
+ grid $itk_component(downarrow) -row 1 -column 0
+
+ set totalHgt [winfo reqheight $itk_component(entry)]
+ set spinHgt [expr {$totalHgt / 2}]
+ set spinWid [expr {round ($spinHgt * 1.6)}]
+ }
+ horizontal {
+ grid $itk_component(uparrow) -row 0 -column 0
+ grid $itk_component(downarrow) -row 0 -column 1
+
+ set spinHgt [expr {[winfo reqheight $itk_component(entry)] - \
+ (2 * [$itk_component(entry) cget -highlightthickness])}]
+ set spinWid $spinHgt
+ }
+ default {
+ error "bad orientation option \"$itk_option(-arroworient)\",\
+ should be horizontal or vertical"
+ }
+ }
+
+ #
+ # Configure the width and height of the spinners minus the borderwidth.
+ # Next delete the previous spinner polygons and create new ones.
+ #
+ $itk_component(uparrow) config \
+ -height [expr {$spinHgt - (2 * $bdw)}] \
+ -width [expr {$spinWid - (2 * $bdw)}]
+ $itk_component(uparrow) delete up
+ $itk_component(uparrow) create polygon \
+ [expr {$spinWid / 2}] $bdw \
+ [expr {$spinWid - $bdw - 1}] [expr {$spinHgt - $bdw -1}] \
+ [expr {$bdw + 1}] [expr {$spinHgt - $bdw - 1}] \
+ -fill $itk_option(-foreground) -tags up
+
+ $itk_component(downarrow) config \
+ -height [expr {$spinHgt - (2 * $bdw)}] \
+ -width [expr {$spinWid - (2 * $bdw)}]
+ $itk_component(downarrow) delete down
+ $itk_component(downarrow) create polygon \
+ [expr {$spinWid / 2}] [expr {($spinHgt - $bdw) - 1}] \
+ [expr {$bdw + 2}] [expr {$bdw + 1}] \
+ [expr {$spinWid - $bdw - 2}] [expr {$bdw + 1}] \
+ -fill $itk_option(-foreground) -tags down
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _pushup
+#
+# Up arrow button press event. Call _doup with repeatdelay.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Spinner::_pushup {} {
+ $itk_component(uparrow) config -relief sunken
+ _doup $itk_option(-repeatdelay)
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _pushdown
+#
+# Down arrow button press event. Call _dodown with repeatdelay.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Spinner::_pushdown {} {
+ $itk_component(downarrow) config -relief sunken
+ _dodown $itk_option(-repeatdelay)
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _doup
+#
+# Call _up and post to do another one after "rate" milliseconds if
+# repeatinterval > 0.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Spinner::_doup {rate} {
+ _up
+
+ if {$itk_option(-repeatinterval) > 0} {
+ set _uptimer [after $rate [itcl::code $this _doup $itk_option(-repeatinterval)]]
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _dodown
+#
+# Call _down and post to do another one after "rate" milliseconds if
+# repeatinterval > 0.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Spinner::_dodown {rate} {
+ _down
+
+ if {$itk_option(-repeatinterval) > 0} {
+ set _downtimer \
+ [after $rate [itcl::code $this _dodown $itk_option(-repeatinterval)]]
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _relup
+#
+# Up arrow button release event. Cancel pending up timer.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Spinner::_relup {} {
+ $itk_component(uparrow) config -relief raised
+
+ if {$_uptimer != ""} {
+ after cancel $_uptimer
+ set _uptimer ""
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _reldown
+#
+# Up arrow button release event. Cancel pending down timer.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Spinner::_reldown {} {
+ $itk_component(downarrow) config -relief raised
+
+ if {$_downtimer != ""} {
+ after cancel $_downtimer
+ set _downtimer ""
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _up
+#
+# Up arrow button press event. Call defined increment command.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Spinner::_up {} {
+ uplevel #0 $itk_option(-increment)
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _down
+#
+# Down arrow button press event. Call defined decrement command.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Spinner::_down {} {
+ uplevel #0 $itk_option(-decrement)
+}
diff --git a/iwidgets/generic/spintime.itk b/iwidgets/generic/spintime.itk
new file mode 100644
index 00000000000..b39ede0ed51
--- /dev/null
+++ b/iwidgets/generic/spintime.itk
@@ -0,0 +1,527 @@
+# Spintime
+# ----------------------------------------------------------------------
+# Implements a Time spinner widget. A time spinner contains three
+# integer spinners: one for hours, one for minutes and one for
+# seconds. Options exist to manage to behavior, appearance, and
+# format of each component spinner.
+#
+# ----------------------------------------------------------------------
+# AUTHOR: Sue Yockey EMAIL: yockey@actc.com
+# Mark L. Ulferts mulferts@austin.dsccc.com
+#
+# @(#) $Id$
+# ----------------------------------------------------------------------
+# Copyright (c) 1997 DSC Technologies Corporation
+# ======================================================================
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+
+#
+# Default resources.
+#
+option add *Spintime.hourLabel "Hour" widgetDefault
+option add *Spintime.minuteLabel "Minute" widgetDefault
+option add *Spintime.secondLabel "Second" widgetDefault
+option add *Spintime.hourWidth 3 widgetDefault
+option add *Spintime.minuteWidth 3 widgetDefault
+option add *Spintime.secondWidth 3 widgetDefault
+
+#
+# Usual options.
+#
+itk::usual Spintime {
+ keep -background -cursor -foreground -labelfont -textbackground -textfont
+}
+
+# ------------------------------------------------------------------
+# SPINTIME
+# ------------------------------------------------------------------
+itcl::class iwidgets::Spintime {
+ inherit itk::Widget
+
+ constructor {args} {}
+ destructor {}
+
+ itk_option define -orient orient Orient vertical
+ itk_option define -labelpos labelPos Position w
+ itk_option define -houron hourOn HourOn true
+ itk_option define -minuteon minuteOn MinuteOn true
+ itk_option define -secondon secondOn SecondOn true
+ itk_option define -timemargin timeMargin Margin 1
+ itk_option define -militaryon militaryOn MilitaryOn true
+
+ public {
+ method get {{format "-string"}}
+ method show {{date now}}
+ }
+
+ protected {
+ method _packTime {{when later}}
+ method _down60 {comp}
+
+ variable _repack {} ;# Reconfiguration flag.
+ variable _interior
+ }
+}
+
+#
+# Provide a lowercased access method for the Spintime class.
+#
+proc ::iwidgets::spintime {pathName args} {
+ uplevel ::iwidgets::Spintime $pathName $args
+}
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Spintime::constructor {args} {
+ set _interior $itk_interior
+ set clicks [clock seconds]
+
+ #
+ # Create Hour Spinner
+ #
+ itk_component add hour {
+ iwidgets::Spinint $itk_interior.hour -fixed 2 -range {0 23} -justify right
+ } {
+ keep -background -cursor -arroworient -foreground \
+ -labelfont -labelmargin -relief -textbackground \
+ -textfont -repeatdelay -repeatinterval
+
+ rename -labeltext -hourlabel hourLabel Text
+ rename -width -hourwidth hourWidth Width
+ }
+
+ #
+ # Take off the default bindings for selction and motion.
+ #
+ bind [$itk_component(hour) component entry] <1> {break}
+ bind [$itk_component(hour) component entry] <Button1-Motion> {break}
+
+ #
+ # Create Minute Spinner
+ #
+ itk_component add minute {
+ iwidgets::Spinint $itk_interior.minute \
+ -decrement [itcl::code $this _down60 minute] \
+ -fixed 2 -range {0 59} -justify right
+ } {
+ keep -background -cursor -arroworient -foreground \
+ -labelfont -labelmargin -relief -textbackground \
+ -textfont -repeatdelay -repeatinterval
+
+ rename -labeltext -minutelabel minuteLabel Text
+ rename -width -minutewidth minuteWidth Width
+ }
+
+ #
+ # Take off the default bindings for selction and motion.
+ #
+ bind [$itk_component(minute) component entry] <1> {break}
+ bind [$itk_component(minute) component entry] <Button1-Motion> {break}
+
+ #
+ # Create Second Spinner
+ #
+ itk_component add second {
+ iwidgets::Spinint $itk_interior.second \
+ -decrement [itcl::code $this _down60 second] \
+ -fixed 2 -range {0 59} -justify right
+ } {
+ keep -background -cursor -arroworient -foreground \
+ -labelfont -labelmargin -relief -textbackground \
+ -textfont -repeatdelay -repeatinterval
+
+ rename -labeltext -secondlabel secondLabel Text
+ rename -width -secondwidth secondWidth Width
+ }
+
+ #
+ # Take off the default bindings for selction and motion.
+ #
+ bind [$itk_component(second) component entry] <1> {break}
+ bind [$itk_component(second) component entry] <Button1-Motion> {break}
+
+ #
+ # Initialize the widget based on the command line options.
+ #
+ eval itk_initialize $args
+
+ #
+ # Show the current time.
+ #
+ show now
+}
+
+# ------------------------------------------------------------------
+# DESTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Spintime::destructor {} {
+ if {$_repack != ""} {after cancel $_repack}
+}
+
+# ------------------------------------------------------------------
+# OPTIONS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# OPTION: -orient
+#
+# Specifies the orientation of the 3 spinners for Hour, Minute
+# and second.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Spintime::orient {
+ _packTime
+}
+
+# ------------------------------------------------------------------
+# OPTION: -labelpos
+#
+# Specifies the location of all 3 spinners' labels.
+# Overloaded
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Spintime::labelpos {
+ switch $itk_option(-labelpos) {
+ n {
+ $itk_component(hour) configure -labelpos n
+ $itk_component(minute) configure -labelpos n
+ $itk_component(second) configure -labelpos n
+
+ #
+ # Un-align labels
+ #
+ $itk_component(hour) configure -labelmargin 1
+ $itk_component(minute) configure -labelmargin 1
+ $itk_component(second) configure -labelmargin 1
+ }
+
+ s {
+ $itk_component(hour) configure -labelpos s
+ $itk_component(minute) configure -labelpos s
+ $itk_component(second) configure -labelpos s
+
+ #
+ # Un-align labels
+ #
+ $itk_component(hour) configure -labelmargin 1
+ $itk_component(minute) configure -labelmargin 1
+ $itk_component(second) configure -labelmargin 1
+ }
+
+ w {
+ $itk_component(hour) configure -labelpos w
+ $itk_component(minute) configure -labelpos w
+ $itk_component(second) configure -labelpos w
+ }
+
+ e {
+ $itk_component(hour) configure -labelpos e
+ $itk_component(minute) configure -labelpos e
+ $itk_component(second) configure -labelpos e
+
+ #
+ # Un-align labels
+ #
+ $itk_component(hour) configure -labelmargin 1
+ $itk_component(minute) configure -labelmargin 1
+ $itk_component(second) configure -labelmargin 1
+ }
+
+ default {
+ error "bad labelpos option \"$itk_option(-labelpos)\",\
+ should be n, s, w or e"
+ }
+ }
+
+ _packTime
+}
+
+# ------------------------------------------------------------------
+# OPTION: -houron
+#
+# Specifies whether or not to display the hour spinner.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Spintime::houron {
+ _packTime
+}
+
+# ------------------------------------------------------------------
+# OPTION: -minuteon
+#
+# Specifies whether or not to display the minute spinner.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Spintime::minuteon {
+ _packTime
+}
+
+# ------------------------------------------------------------------
+# OPTION: -secondon
+#
+# Specifies whether or not to display the second spinner.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Spintime::secondon {
+ _packTime
+}
+
+
+# ------------------------------------------------------------------
+# OPTION: -timemargin
+#
+# Specifies the margin space between the hour and minute spinners
+# and the minute and second spinners.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Spintime::timemargin {
+ _packTime
+}
+
+# ------------------------------------------------------------------
+# OPTION: -militaryon
+#
+# Specifies 24-hour clock or 12-hour.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Spintime::militaryon {
+ set clicks [clock seconds]
+
+ if {$itk_option(-militaryon)} {
+ $itk_component(hour) configure -range {0 23}
+ $itk_component(hour) delete 0 end
+ $itk_component(hour) insert end [clock format $clicks -format "%H"]
+ } else {
+ $itk_component(hour) configure -range {1 12}
+ $itk_component(hour) delete 0 end
+ $itk_component(hour) insert end [clock format $clicks -format "%I"]
+ }
+}
+
+# ------------------------------------------------------------------
+# METHODS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# METHOD: get ?format?
+#
+# Get the value of the time spinner in one of two formats string or
+# as an integer clock value using the -string and -clicks options
+# respectively. The default is by string. Reference the clock
+# command for more information on obtaining time and its formats.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Spintime::get {{format "-string"}} {
+ set hour [$itk_component(hour) get]
+ set minute [$itk_component(minute) get]
+ set second [$itk_component(second) get]
+
+ switch -- $format {
+ "-string" {
+ return "$hour:$minute:$second"
+ }
+ "-clicks" {
+ return [clock scan "$hour:$minute:$second"]
+ }
+ default {
+ error "bad format option \"$format\":\
+ should be -string or -clicks"
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# PUBLIC METHOD: show time
+#
+# Changes the currently displayed time to be that of the time
+# argument. The time may be specified either as a string or an
+# integer clock value. Reference the clock command for more
+# information on obtaining time and its format.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Spintime::show {{time "now"}} {
+ if {$time == "now"} {
+ set seconds [clock seconds]
+ } else {
+ if {[catch {clock format $time}] == 0} {
+ set seconds $time
+ } elseif {[catch {set seconds [clock scan $time]}] != 0} {
+ error "bad time: \"$time\", must be a valid time\
+ string, clock clicks value or the keyword now"
+ }
+ }
+
+ $itk_component(hour) delete 0 end
+
+ if {$itk_option(-militaryon)} {
+ scan [clock format $seconds -format "%H"] "%d" hour
+ } else {
+ scan hour [clock format $seconds -format "%I"] "%d" hour
+ }
+
+ $itk_component(hour) insert end $hour
+
+ $itk_component(minute) delete 0 end
+ scan [clock format $seconds -format "%M"] "%d" minute
+ $itk_component(minute) insert end $minute
+
+ $itk_component(second) delete 0 end
+ scan [clock format $seconds -format "%S"] "%d" seconds
+ $itk_component(second) insert end $seconds
+
+ return
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _packTime ?when?
+#
+# Pack components of time spinner. If "when" is "now", the change
+# is applied immediately. If it is "later" or it is not specified,
+# then the change is applied later, when the application is idle.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Spintime::_packTime {{when later}} {
+ if {$when == "later"} {
+ if {$_repack == ""} {
+ set _repack [after idle [itcl::code $this _packTime now]]
+ }
+ return
+ } elseif {$when != "now"} {
+ error "bad option \"$when\": should be now or later"
+ }
+
+ for {set i 0} {$i < 5} {incr i} {
+ grid rowconfigure $_interior $i -minsize 0
+ grid columnconfigure $_interior $i -minsize 0
+ }
+
+ if {$itk_option(-minuteon)} {
+ set minuteon 1
+ } else {
+ set minuteon 0
+ }
+ if {$itk_option(-secondon)} {
+ set secondon 1
+ } else {
+ set secondon 0
+ }
+
+ set _repack ""
+
+ switch $itk_option(-orient) {
+ vertical {
+ set row -1
+
+ if {$itk_option(-houron)} {
+ grid $itk_component(hour) -row [incr row] -column 0 \
+ -sticky nsew
+ } else {
+ grid forget $itk_component(hour)
+ }
+
+ if {$itk_option(-minuteon)} {
+ if {$itk_option(-houron)} {
+ grid rowconfigure $_interior [incr row] \
+ -minsize $itk_option(-timemargin)
+ }
+
+ grid $itk_component(minute) -row [incr row] -column 0 \
+ -sticky nsew
+ } else {
+ grid forget $itk_component(minute)
+ }
+
+ if {$itk_option(-secondon)} {
+ if {$minuteon || $secondon} {
+ grid rowconfigure $_interior [incr row] \
+ -minsize $itk_option(-timemargin)
+ }
+
+ grid $itk_component(second) -row [incr row] -column 0 \
+ -sticky nsew
+ } else {
+ grid forget $itk_component(second)
+ }
+
+ if {$itk_option(-labelpos) == "w"} {
+ iwidgets::Labeledwidget::alignlabels $itk_component(hour) \
+ $itk_component(minute) $itk_component(second)
+ }
+ }
+
+ horizontal {
+ set column -1
+
+ if {$itk_option(-houron)} {
+ grid $itk_component(hour) -row 0 -column [incr column] \
+ -sticky nsew
+ } else {
+ grid forget $itk_component(hour)
+ }
+
+ if {$itk_option(-minuteon)} {
+ if {$itk_option(-houron)} {
+ grid columnconfigure $_interior [incr column] \
+ -minsize $itk_option(-timemargin)
+ }
+
+ grid $itk_component(minute) -row 0 -column [incr column] \
+ -sticky nsew
+ } else {
+ grid forget $itk_component(minute)
+ }
+
+ if {$itk_option(-secondon)} {
+ if {$minuteon || $secondon} {
+ grid columnconfigure $_interior [incr column] \
+ -minsize $itk_option(-timemargin)
+ }
+
+ grid $itk_component(second) -row 0 -column [incr column] \
+ -sticky nsew
+ } else {
+ grid forget $itk_component(second)
+ }
+
+ #
+ # Un-align labels
+ #
+ $itk_component(hour) configure -labelmargin 1
+ $itk_component(minute) configure -labelmargin 1
+ $itk_component(second) configure -labelmargin 1
+ }
+
+ default {
+ error "bad orient option \"$itk_option(-orient)\", should\
+ be \"vertical\" or \"horizontal\""
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# METHOD: down60
+#
+# Down arrow button press event. Decrement value in the minute
+# or second entry.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Spintime::_down60 {comp} {
+ set step [$itk_component($comp) cget -step]
+ set val [$itk_component($comp) get]
+
+ incr val -$step
+ if {$val < 0} {
+ set val [expr {60-$step}]
+ }
+ $itk_component($comp) delete 0 end
+ $itk_component($comp) insert 0 $val
+}
diff --git a/iwidgets/generic/tabnotebook.itk b/iwidgets/generic/tabnotebook.itk
new file mode 100644
index 00000000000..7e8be370cf0
--- /dev/null
+++ b/iwidgets/generic/tabnotebook.itk
@@ -0,0 +1,1105 @@
+#
+# Tabnotebook Widget
+# ----------------------------------------------------------------------
+# The Tabnotebook command creates a new window (given by the pathName
+# argument) and makes it into a Tabnotebook widget. Additional options,
+# described above may be specified on the command line or in the option
+# database to configure aspects of the Tabnotebook such as its colors,
+# font, and text. The Tabnotebook command returns its pathName argument.
+# At the time this command is invoked, there must not exist a window
+# named pathName, but pathName's parent must exist.
+#
+# A Tabnotebook is a widget that contains a set of tabbed pages. It
+# displays one page from the set as the selected page. A Tab displays
+# the label for the page to which it is attached and serves as a page
+# selector. When a page's tab is selected, the page's contents are
+# displayed in the page area. The selected tab has a three-dimensional
+# effect to make it appear to float above the other tabs. The tabs are
+# displayed as a group along either the left, top, right, or bottom
+# edge. When first created a Tabnotebook has no pages. Pages may be
+# added or deleted using widget commands described below.
+#
+# A special option may be provided to the Tabnotebook. The -auto
+# option specifies whether the Tabnotebook will automatically handle
+# the unpacking and packing of pages when pages are selected. A value
+# of true sig nifies that the notebook will automatically manage it. This
+# is the default value. A value of false signifies the notebook will not
+# perform automatic switching of pages.
+#
+# ----------------------------------------------------------------------
+# AUTHOR: Bill W. Scott
+#
+# CURRENT MAINTAINER: Chad Smith --> csmith@adc.com or itclguy@yahoo.com
+#
+# @(#) $Id$
+# ----------------------------------------------------------------------
+# Copyright (c) 1995 DSC Technologies Corporation
+# ======================================================================
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+
+#
+# Default resources.
+#
+option add *Tabnotebook.borderWidth 2 widgetDefault
+option add *Tabnotebook.state normal widgetDefault
+option add *Tabnotebook.disabledForeground #a3a3a3 widgetDefault
+option add *Tabnotebook.scrollCommand {} widgetDefault
+option add *Tabnotebook.equalTabs true widgetDefault
+option add *Tabnotebook.font \
+ -Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-* widgetDefault
+option add *Tabnotebook.width 300 widgetDefault
+option add *Tabnotebook.height 150 widgetDefault
+option add *Tabnotebook.foreground Black widgetDefault
+option add *Tabnotebook.background #d9d9d9 widgetDefault
+option add *Tabnotebook.tabForeground Black widgetDefault
+option add *Tabnotebook.tabBackground #d9d9d9 widgetDefault
+option add *Tabnotebook.backdrop #d9d9d9 widgetDefault
+option add *Tabnotebook.margin 4 widgetDefault
+option add *Tabnotebook.tabBorders true widgetDefault
+option add *Tabnotebook.bevelAmount 0 widgetDefault
+option add *Tabnotebook.raiseSelect false widgetDefault
+option add *Tabnotebook.auto true widgetDefault
+option add *Tabnotebook.start 4 widgetDefault
+option add *Tabnotebook.padX 4 widgetDefault
+option add *Tabnotebook.padY 4 widgetDefault
+option add *Tabnotebook.gap overlap widgetDefault
+option add *Tabnotebook.angle 15 widgetDefault
+option add *Tabnotebook.tabPos s widgetDefault
+
+#
+# Usual options.
+#
+itk::usual Tabnotebook {
+ keep -backdrop -background -borderwidth -cursor -disabledforeground \
+ -font -foreground -tabbackground -tabforeground
+}
+
+# ------------------------------------------------------------------
+# TABNOTEBOOK
+# ------------------------------------------------------------------
+itcl::class iwidgets::Tabnotebook {
+ inherit itk::Widget
+
+ constructor {args} {}
+ destructor {}
+
+ itk_option define -borderwidth borderWidth BorderWidth 2
+ itk_option define -state state State normal
+ itk_option define \
+ -disabledforeground disabledForeground DisabledForeground #a3a3a3
+ itk_option define -scrollcommand scrollCommand ScrollCommand {}
+ itk_option define -equaltabs equalTabs EqualTabs true
+ itk_option define -font font Font \
+ -Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-*
+ itk_option define -width width Width 300
+ itk_option define -height height Height 150
+ itk_option define -foreground foreground Foreground Black
+ itk_option define -background background Background #d9d9d9
+ itk_option define -tabforeground tabForeground TabForeground Black
+ itk_option define -tabbackground tabBackground TabBackground #d9d9d9
+ itk_option define -backdrop backdrop Backdrop #d9d9d9
+ itk_option define -margin margin Margin 4
+ itk_option define -tabborders tabBorders TabBorders true
+ itk_option define -bevelamount bevelAmount BevelAmount 0
+ itk_option define -raiseselect raiseSelect RaiseSelect false
+ itk_option define -auto auto Auto true
+ itk_option define -start start Start 4
+ itk_option define -padx padX PadX 4
+ itk_option define -pady padY PadY 4
+ itk_option define -gap gap Gap overlap
+ itk_option define -angle angle Angle 15
+ itk_option define -tabpos tabPos TabPos s
+
+ public method add { args }
+ public method configure { args }
+ public method childsite { args }
+ public method delete { args }
+ public method index { args }
+ public method insert { index args }
+ public method prev { }
+ public method next { }
+ public method pageconfigure { index args }
+ public method select { index }
+ public method view { args }
+
+ protected method _reconfigureTabset { }
+ protected method _canvasReconfigure { wid hgt }
+ protected method _pageReconfigure { pageName page wid hgt }
+
+ private method _getArgs { optList args }
+ private method _redrawBorder { wid hgt }
+ private method _recomputeBorder { }
+ private method _pack { tabPos }
+ private method _resize {newWidth_ newHeight_}
+
+ private variable _canvasWidth 0 ;# currently tabnote canvas width
+ private variable _canvasHeight 0 ;# currently tabnote canvas height
+ private variable _nbOptList {} ;# list of notebook options available
+ private variable _tsOptList {} ;# list of tabset options available
+
+ private variable _tabPos s ;# holds -tabPos, because of ordering
+
+ private variable _borderRecompute false ;# did we dirty border after cfg?
+ private variable _tabsetReconfigure false ;# did we dirty tabsets after cfg?
+
+}
+
+
+# ----------------------------------------------------------------------
+# CONSTRUCTOR
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Tabnotebook::constructor {args} {
+ # The following conditional added for SF ticket #514222. csmith 9/5/02
+ if {$::tk_version > 8.3} {
+ component hull configure -borderwidth 0 -padx 0 -pady 0
+ } else {
+ component hull configure -borderwidth 0
+ }
+
+ #
+ # Create the outermost canvas to maintain geometry.
+ #
+ itk_component add canvas {
+ canvas $itk_interior.canvas -highlightthickness 0
+ } {
+ keep -cursor -background -width -height
+ }
+ bind $itk_component(canvas) <Configure> [itcl::code $this _resize %w %h]
+
+
+
+ # .......................
+ # Create the NOTEBOOK
+ #
+ itk_component add notebook {
+ iwidgets::Notebook $itk_interior.canvas.notebook
+ } {
+ keep -cursor -background
+ }
+
+ #
+ # Ouch, create a dummy page, go pageconfigure to get its options
+ # and munge them into a list for later doling by pageconfigure
+ #
+ $itk_component(notebook) add
+ set nbConfigList [$itk_component(notebook) pageconfigure 0]
+ foreach config $nbConfigList {
+ lappend _nbOptList [lindex $config 0]
+ }
+ $itk_component(notebook) delete 0
+
+ #
+ # Create the tabset.
+ #
+ itk_component add tabset {
+ iwidgets::Tabset $itk_interior.canvas.tabset \
+ -command [itcl::code $this component notebook select]
+ } {
+ keep -cursor
+ }
+
+ eval itk_initialize $args
+
+ #
+ # Ouch, create a dummy tab, go tabconfigure to get its options
+ # and munge them into a list for later doling by pageconfigure
+ #
+ $itk_component(tabset) add
+ set tsConfigList [$itk_component(tabset) tabconfigure 0]
+ foreach config $tsConfigList {
+ lappend _tsOptList [lindex $config 0]
+ }
+ $itk_component(tabset) delete 0
+
+ bind $itk_component(tabset) <Configure> \
+ [itcl::code $this _reconfigureTabset]
+
+ _pack $_tabPos
+ $itk_component(hull) configure -width [cget -width] -height [cget -height]
+}
+
+proc ::iwidgets::tabnotebook {pathName args} {
+ uplevel ::iwidgets::Tabnotebook $pathName $args
+}
+
+
+# -------------------------------------------------------------
+# DESTRUCTOR: destroy the Tabnotebook
+# -------------------------------------------------------------
+itcl::body iwidgets::Tabnotebook::destructor {} {
+}
+
+# ----------------------------------------------------------------------
+# OPTION -borderwidth
+#
+# Thickness of Notebook Border
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tabnotebook::borderwidth {
+ if {$itk_option(-borderwidth) != {}} {
+ #_recomputeBorder
+ set _borderRecompute true
+ }
+}
+
+# ----------------------------------------------------------------------
+# OPTION -state
+#
+# State of the tabs in the tab notebook: normal or disabled
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tabnotebook::state {
+ if {$itk_option(-state) != {}} {
+ $itk_component(tabset) configure -state $itk_option(-state)
+ #_reconfigureTabset
+ set _tabsetReconfigure true
+
+ }
+}
+
+# ----------------------------------------------------------------------
+# OPTION -disabledforeground
+#
+# Specifies a foreground color to use for displaying a
+# tab's label when its state is disabled.
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tabnotebook::disabledforeground {
+
+ if {$itk_option(-disabledforeground) != {}} {
+ $itk_component(tabset) configure \
+ -disabledforeground $itk_option(-disabledforeground)
+ #_reconfigureTabset
+ set _tabsetReconfigure true
+ }
+}
+
+# ----------------------------------------------------------------------
+# OPTION -scrollcommand
+#
+# Standard option. See options man pages.
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tabnotebook::scrollcommand {
+
+ if {$itk_option(-scrollcommand) != {}} {
+ $itk_component(notebook) \
+ configure -scrollcommand $itk_option(-scrollcommand)
+ }
+}
+
+# ----------------------------------------------------------------------
+# OPTION -equaltabs
+#
+# Specifies whether to force tabs to be equal sized or not.
+# A value of true means constrain tabs to be equal sized.
+# A value of false allows each tab to size based on the text
+# label size. The value may have any of the forms accepted by
+# the Tcl_GetBoolean, such as true, false, 0, 1, yes, or no.
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tabnotebook::equaltabs {
+
+ if {$itk_option(-equaltabs) != {}} {
+ $itk_component(tabset) \
+ configure -equaltabs $itk_option(-equaltabs)
+ #_reconfigureTabset
+ set _tabsetReconfigure true
+ }
+}
+
+# ----------------------------------------------------------------------
+# OPTION -font
+#
+# Font for tab labels when they are set to text (-label set)
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tabnotebook::font {
+
+ if {$itk_option(-font) != {}} {
+ $itk_component(tabset) configure -font $itk_option(-font)
+ #_reconfigureTabset
+ set _tabsetReconfigure true
+ }
+}
+
+# ----------------------------------------------------------------------
+# OPTION -width
+#
+# Width of the Tabnotebook
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tabnotebook::width {
+ if {$itk_option(-width) != {}} {
+ $itk_component(canvas) configure -width $itk_option(-width)
+ #_recomputeBorder
+ set _borderRecompute true
+ }
+}
+
+# ----------------------------------------------------------------------
+# OPTION -height
+#
+# Height of the Tabnotebook
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tabnotebook::height {
+ if {$itk_option(-height) != {}} {
+ $itk_component(canvas) configure -height $itk_option(-height)
+ #_recomputeBorder
+ set _borderRecompute true
+ }
+}
+
+# ----------------------------------------------------------------------
+# OPTION -foreground
+#
+# Specifies a foreground color to use for displaying a page
+# and its associated tab label (this is the selected state).
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tabnotebook::foreground {
+
+ if {$itk_option(-foreground) != {}} {
+ $itk_component(tabset) configure \
+ -selectforeground $itk_option(-foreground)
+ }
+}
+
+# ----------------------------------------------------------------------
+# OPTION -background
+#
+# Specifies a background color to use for displaying a page
+# and its associated tab bg (this is the selected state).
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tabnotebook::background {
+
+ if {$itk_option(-background) != {}} {
+ $itk_component(tabset) configure \
+ -selectbackground $itk_option(-background)
+ #_recomputeBorder
+ set _borderRecompute true
+ }
+}
+
+# ----------------------------------------------------------------------
+# OPTION -tabforeground
+#
+# Specifies a foreground color to use for displaying tab labels
+# when they are in their unselected state.
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tabnotebook::tabforeground {
+
+ if {$itk_option(-tabforeground) != {}} {
+ $itk_component(tabset) configure \
+ -foreground $itk_option(-tabforeground)
+ }
+}
+
+# ----------------------------------------------------------------------
+# OPTION -tabbackground
+#
+# Specifies a background color to use for displaying tab backgrounds
+# when they are in their unselected state.
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tabnotebook::tabbackground {
+
+ if {$itk_option(-tabbackground) != {}} {
+ $itk_component(tabset) configure \
+ -background $itk_option(-tabbackground)
+ }
+}
+
+# ----------------------------------------------------------------------
+# OPTION -backdrop
+#
+# Specifies a background color to use when filling in the
+# area behind the tabs.
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tabnotebook::backdrop {
+
+ if {$itk_option(-backdrop) != {}} {
+ $itk_component(tabset) configure \
+ -backdrop $itk_option(-backdrop)
+ }
+}
+
+# ----------------------------------------------------------------------
+# OPTION -margin
+#
+# Sets the backdrop margin between tab edge and backdrop edge
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tabnotebook::margin {
+ if {$itk_option(-margin) != {}} {
+ $itk_component(tabset) configure -margin $itk_option(-margin)
+ }
+}
+
+# ----------------------------------------------------------------------
+# OPTION -tabborders
+#
+# Boolean that specifies whether to draw the borders of
+# the unselected tabs (tabs in background)
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tabnotebook::tabborders {
+ if {$itk_option(-tabborders) != {}} {
+ $itk_component(tabset) \
+ configure -tabborders $itk_option(-tabborders)
+ #_reconfigureTabset
+ set _tabsetReconfigure true
+ }
+}
+
+# ----------------------------------------------------------------------
+# OPTION -bevelamount
+#
+# Specifies pixel size of tab corners. 0 means no corners.
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tabnotebook::bevelamount {
+ if {$itk_option(-bevelamount) != {}} {
+ $itk_component(tabset) \
+ configure -bevelamount $itk_option(-bevelamount)
+ #_reconfigureTabset
+ set _tabsetReconfigure true
+ }
+}
+
+# ----------------------------------------------------------------------
+# OPTION -raiseselect
+#
+# Sets whether to raise selected tabs
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tabnotebook::raiseselect {
+ if {$itk_option(-raiseselect) != {}} {
+ $itk_component(tabset) \
+ configure -raiseselect $itk_option(-raiseselect)
+ #_reconfigureTabset
+ set _tabsetReconfigure true
+ }
+}
+
+# ----------------------------------------------------------------------
+# OPTION -auto
+#
+# Determines whether pages are automatically unpacked and
+# packed when pages get selected.
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tabnotebook::auto {
+ if {$itk_option(-auto) != {}} {
+ $itk_component(notebook) configure -auto $itk_option(-auto)
+ }
+}
+
+# ----------------------------------------------------------------------
+# OPTION -start
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tabnotebook::start {
+
+ if {$itk_option(-start) != {}} {
+ $itk_component(tabset) configure \
+ -start $itk_option(-start)
+ #_reconfigureTabset
+ set _tabsetReconfigure true
+ }
+}
+
+# ----------------------------------------------------------------------
+# OPTION -padx
+#
+# Specifies a non-negative value indicating how much extra space
+# to request for a tab around its label in the X-direction.
+# When computing how large a window it needs, the tab will add
+# this amount to the width it would normally need The tab will
+# end up with extra internal space to the left and right of its
+# text label. This value may have any of the forms acceptable
+# to Tk_GetPixels.
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tabnotebook::padx {
+
+ if {$itk_option(-padx) != {}} {
+ $itk_component(tabset) configure -padx $itk_option(-padx)
+ #_reconfigureTabset
+ set _tabsetReconfigure true
+ }
+}
+
+# ----------------------------------------------------------------------
+# OPTION -pady
+#
+# Specifies a non-negative value indicating how much extra space to
+# request for a tab around its label in the Y-direction. When computing
+# how large a window it needs, the tab will add this amount to the
+# height it would normally need The tab will end up with extra internal
+# space to the top and bot tom of its text label. This value may have
+# any of the forms acceptable to Tk_GetPixels.
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tabnotebook::pady {
+
+ if {$itk_option(-pady) != {}} {
+ $itk_component(tabset) configure -pady $itk_option(-pady)
+ #_reconfigureTabset
+ set _tabsetReconfigure true
+ }
+}
+
+# ----------------------------------------------------------------------
+# OPTION -gap
+#
+# Specifies the amount of pixel space to place between each tab.
+# Value may be any pixel offset value. In addition, a special keyword
+# 'overlap' can be used as the value to achieve a standard overlap of
+# tabs. This value may have any of the forms acceptable to Tk_GetPixels.
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tabnotebook::gap {
+
+ if {$itk_option(-gap) != {}} {
+ $itk_component(tabset) configure -gap $itk_option(-gap)
+ #_reconfigureTabset
+ set _tabsetReconfigure true
+ }
+}
+
+# ----------------------------------------------------------------------
+# OPTION -angle
+#
+# Specifes the angle of slope from the inner edge to the outer edge
+# of the tab. An angle of 0 specifies square tabs. Valid ranges are
+# 0 to 45 degrees inclusive. Default is 15 degrees. If tabPos is
+# e or w, this option is ignored.
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tabnotebook::angle {
+
+ if {$itk_option(-angle) != {}} {
+ $itk_component(tabset) configure -angle $itk_option(-angle)
+ #_reconfigureTabset
+ set _tabsetReconfigure true
+ }
+}
+
+# ----------------------------------------------------------------------
+# OPTION -tabpos
+#
+# Specifies the location of the set of tabs in relation to the
+# Notebook area. Must be n, s, e, or w. Defaults to s.
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tabnotebook::tabpos {
+
+ if {$itk_option(-tabpos) != {}} {
+ set _tabPos $itk_option(-tabpos)
+ $itk_component(tabset) configure \
+ -tabpos $itk_option(-tabpos)
+ pack forget $itk_component(canvas)
+ pack forget $itk_component(tabset)
+ pack forget $itk_component(notebook)
+ _pack $_tabPos
+ }
+}
+
+# -------------------------------------------------------------
+# METHOD: configure ?<option>? ?<value> <option> <value>...?
+#
+# Acts as an addendum to the itk::Widget::configure method.
+#
+# Checks the _recomputeBorder flag and the _tabsetReconfigure to
+# determine what work has been batched to after the configure
+# -------------------------------------------------------------
+itcl::body iwidgets::Tabnotebook::configure { args } {
+ set result [eval itk::Archetype::configure $args]
+
+ # check for flags then do update...
+ if { $_borderRecompute == "true" } {
+ _recomputeBorder
+ set _borderRecompute false
+ }
+
+ if { $_tabsetReconfigure == "true" } {
+ _reconfigureTabset
+ set _tabsetReconfigure false
+ }
+
+ return $result
+
+}
+
+# -------------------------------------------------------------
+# METHOD: add ?<option> <value>...?
+#
+# Creates a page and appends it to the list of pages.
+# processes pageconfigure for the page added.
+#
+# Returns the page's childsite frame
+# -------------------------------------------------------------
+itcl::body iwidgets::Tabnotebook::add { args } {
+
+ # The args list should be an even # of params, if not then
+ # prob missing value for last item in args list. Signal error.
+ set len [llength $args]
+ if { [expr {$len % 2}] } {
+ error "value for \"[lindex $args [expr {$len - 1}]]\" missing"
+ }
+
+ # pick out the notebook args
+ set nbArgs [eval _getArgs [list $_nbOptList] $args]
+ set pageName [eval $itk_component(notebook) add $nbArgs]
+
+ # pick out the tabset args
+ set tsArgs [eval _getArgs [list $_tsOptList] $args]
+ eval $itk_component(tabset) add $tsArgs
+
+ set page [index end]
+ bind $pageName <Configure> \
+ [itcl::code $this _pageReconfigure $pageName $page %w %h]
+ return $pageName
+}
+
+# -------------------------------------------------------------
+# METHOD: childsite ?<index>?
+#
+# If index is supplied, returns the child site widget
+# corresponding to the page index. If called with no arguments,
+# returns a list of all child sites
+# -------------------------------------------------------------
+itcl::body iwidgets::Tabnotebook::childsite { args } {
+ return [eval $itk_component(notebook) childsite $args]
+}
+
+# -------------------------------------------------------------
+# METHOD: delete <index1> ?<index2>?
+#
+# Deletes a page or range of pages from the notebook
+# -------------------------------------------------------------
+itcl::body iwidgets::Tabnotebook::delete { args } {
+ eval $itk_component(notebook) delete $args
+ eval $itk_component(tabset) delete $args
+}
+
+
+# -------------------------------------------------------------
+# METHOD: index <index>
+#
+# Given an index identifier returns the numeric index of the page
+# -------------------------------------------------------------
+itcl::body iwidgets::Tabnotebook::index { args } {
+ return [eval $itk_component(notebook) index $args]
+}
+
+# -------------------------------------------------------------
+# METHOD: insert <index> ?<option> <value>...?
+#
+# Inserts a page before a index. The before page may
+# be specified as a label or a page position.
+#
+# Note that since we use eval to preserve the $args list,
+# we must use list around $index to keep it together as a unit
+#
+# Returns the name of the page's child site
+# -------------------------------------------------------------
+itcl::body iwidgets::Tabnotebook::insert { index args } {
+
+ # pick out the notebook args
+ set nbArgs [eval _getArgs [list $_nbOptList] $args]
+ set pageName [eval $itk_component(notebook) insert [list $index] $nbArgs]
+
+ # pick out the tabset args
+ set tsArgs [eval _getArgs [list $_tsOptList] $args]
+ eval $itk_component(tabset) insert [list $index] $tsArgs
+
+ return $pageName
+
+}
+
+# -------------------------------------------------------------
+# METHOD: prev
+#
+# Selects the previous page. Wraps at first back to last page.
+# -------------------------------------------------------------
+itcl::body iwidgets::Tabnotebook::prev { } {
+ eval $itk_component(notebook) prev
+ eval $itk_component(tabset) prev
+}
+
+# -------------------------------------------------------------
+# METHOD: next
+#
+# Selects the next page. Wraps at last back to first page.
+# -------------------------------------------------------------
+itcl::body iwidgets::Tabnotebook::next { } {
+ eval $itk_component(notebook) next
+ eval $itk_component(tabset) next
+}
+
+# -------------------------------------------------------------
+# METHOD: pageconfigure <index> ?<option> <value>...?
+#
+# Performs configure on a given page denoted by index.
+# Index may be a page number or a pattern matching the label
+# associated with a page.
+# -------------------------------------------------------------
+itcl::body iwidgets::Tabnotebook::pageconfigure { index args } {
+
+ set nbArgs [eval _getArgs [list $_nbOptList] $args]
+ set tsArgs [eval _getArgs [list $_tsOptList] $args]
+
+ set len [llength $args]
+ switch $len {
+ 0 {
+ # Here is the case where they just want to query options
+ set nbConfig \
+ [eval $itk_component(notebook) pageconfigure $index $nbArgs]
+ set tsConfig \
+ [eval $itk_component(tabset) tabconfigure $index $tsArgs]
+ #
+ # BUG: this currently just concatenates a page and a tab's
+ # config lists together... We should bias to the Page
+ # since this is what we are using as primary when both??
+ #
+ # a pageconfigure index -background will return something like:
+ # -background background Background #9D008FF583C1 gray70 \
+ # -background background background white gray 70
+ #
+ return [concat $nbConfig $tsConfig]
+ }
+ 1 {
+ # Here is the case where they are asking for only one
+ # one options value... need to figure out which one
+ # (page or tab) can service this. Then only return
+ # that one's result.
+
+ if { [llength $nbArgs] != 0 } {
+ return [eval $itk_component(notebook) \
+ pageconfigure $index $nbArgs]
+ } elseif { [llength $tsArgs] != 0 } {
+ return [eval $itk_component(tabset) \
+ tabconfigure $index $tsArgs]
+ } else {
+ error "unknown option \"$args\""
+ }
+
+ }
+ default {
+
+ # pick out the notebook args
+ set nbConfig \
+ [eval $itk_component(notebook) \
+ pageconfigure [list $index] $nbArgs]
+
+ # pick out the tabset args
+ set tsConfig \
+ [eval $itk_component(tabset) \
+ tabconfigure [list $index] $tsArgs]
+
+ return ""
+ #return [concat $nbConfig $tsConfig]
+
+ }
+ }
+}
+
+# -------------------------------------------------------------
+# METHOD: select index
+#
+# Select a page by index
+# -------------------------------------------------------------
+itcl::body iwidgets::Tabnotebook::select { index } {
+ $itk_component(notebook) select $index
+ $itk_component(tabset) select $index
+}
+
+# -------------------------------------------------------------
+# METHOD: view
+#
+# Return the current page
+#
+# view index
+#
+# Selects the page denoted by index to be current page
+#
+# view 'moveto' fraction
+#
+# Selects the page by using fraction amount
+#
+# view 'scroll' num what
+#
+# Selects the page by using num as indicator of next or
+# previous
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Tabnotebook::view { args } {
+ eval $itk_component(notebook) view $args
+ $itk_component(tabset) select [index select]
+}
+
+# -------------------------------------------------------------
+# PRIVATE METHOD: _getArgs
+#
+# Given an optList returned from a configure on an object and
+# given a candidate argument list, peruse throught the optList
+# and build a new argument list with only those options found
+# in optList.
+#
+# This is used by the add, insert, and pageconfigure methods.
+# It is useful for a container kind of class like Tabnotebook
+# to be smart about args it gets for its concept of a "page"
+# which is actually a Notebook Page and a Tabset Tab.
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Tabnotebook::_getArgs { optList args } {
+
+ set len [llength $args]
+
+ set retArgs {}
+
+ for {set i 0} {$i < $len} {incr i} {
+ # get the option for this pair
+ set opt [lindex $args $i]
+
+ # move ahead to the value
+ incr i
+
+ # option exists!
+ if { [lsearch -exact $optList $opt] != -1} {
+ lappend retArgs $opt
+ if {$i < [llength $args]} {
+ lappend retArgs [lindex $args $i]
+ }
+ # option does not exist
+ }
+ }
+
+ return $retArgs
+}
+
+# -------------------------------------------------------------
+# PROTECTED METHOD: _reconfigureTabset
+#
+# bound to the tabset reconfigure... We call our canvas
+# reconfigure as if the canvas resized, it then configures
+# the tabset correctly.
+# -------------------------------------------------------------
+itcl::body iwidgets::Tabnotebook::_reconfigureTabset { } {
+ _canvasReconfigure $_canvasWidth $_canvasHeight
+
+}
+
+# -------------------------------------------------------------
+# PROTECTED METHOD: _canvasReconfigure
+#
+# bound to window Reconfigure event of the canvas
+# keeps the tabset area stretched in its major dimension.
+# -------------------------------------------------------------
+itcl::body iwidgets::Tabnotebook::_canvasReconfigure { wid hgt } {
+
+ if { $_tabPos == "n" || $_tabPos == "s" } {
+ $itk_component(tabset) configure -width $wid
+ } else {
+ $itk_component(tabset) configure -height $hgt
+ }
+
+ set _canvasWidth $wid
+ set _canvasHeight $hgt
+
+ _redrawBorder $wid $hgt
+
+}
+
+# -------------------------------------------------------------
+# PRIVATE METHOD: _redrawBorder
+#
+# called by methods when the packing changes, borderwidths, etc.
+# and height
+# -------------------------------------------------------------
+itcl::body iwidgets::Tabnotebook::_redrawBorder { wid hgt } {
+
+ # Get the top of the Notebook area...
+
+ set nbTop [winfo y $itk_component(notebook)]
+ set canTop [expr {$nbTop - $itk_option(-borderwidth)}]
+
+ $itk_component(canvas) delete BORDER
+ if { $itk_option(-borderwidth) > 0 } {
+
+ # For south, east, and west -- draw the top/north edge
+ if { $_tabPos != "n" } {
+ $itk_component(canvas) create line \
+ [expr {floor(0 + ($itk_option(-borderwidth)/2.0))}] \
+ [expr {floor(0 + ($itk_option(-borderwidth)/2.0))}] \
+ $wid \
+ [expr {floor(0 + ($itk_option(-borderwidth)/2.0))}] \
+ -width $itk_option(-borderwidth) \
+ -fill [iwidgets::colors::topShadow $itk_option(-background)] \
+ -tags BORDER
+ }
+
+ # For north, east, and west -- draw the bottom/south edge
+ if { $_tabPos != "s" } {
+ $itk_component(canvas) create line \
+ [expr {floor(0 + ($itk_option(-borderwidth)/2.0))}] \
+ [expr {floor($hgt - ($itk_option(-borderwidth)/2.0))}] \
+ [expr {floor($wid - ($itk_option(-borderwidth)/2.0))}] \
+ [expr {floor($hgt - ($itk_option(-borderwidth)/2.0))}] \
+ -width $itk_option(-borderwidth) \
+ -fill [iwidgets::colors::bottomShadow $itk_option(-background)] \
+ -tags BORDER
+ }
+
+ # For north, south, and east -- draw the left/west edge
+ if { $_tabPos != "w" } {
+ $itk_component(canvas) create line \
+ [expr {floor(0 + ($itk_option(-borderwidth)/2.0))}] \
+ 0 \
+ [expr {floor(0 + ($itk_option(-borderwidth)/2.0))}] \
+ $hgt \
+ -width $itk_option(-borderwidth) \
+ -fill [iwidgets::colors::topShadow $itk_option(-background)] \
+ -tags BORDER
+ }
+
+ # For north, south, and west -- draw the right/east edge
+ if { $_tabPos != "e" } {
+ $itk_component(canvas) create line \
+ [expr {floor($wid - ($itk_option(-borderwidth)/2.0))}] \
+ [expr {floor(0 + ($itk_option(-borderwidth)/2.0))}] \
+ [expr {floor($wid - ($itk_option(-borderwidth)/2.0))}] \
+ $hgt \
+ -width $itk_option(-borderwidth) \
+ -fill [iwidgets::colors::bottomShadow $itk_option(-background)] \
+ -tags BORDER
+ }
+ }
+
+}
+
+# -------------------------------------------------------------
+# PRIVATE METHOD: _recomputeBorder
+#
+# Based on current width and height of our canvas, repacks
+# the notebook with padding for borderwidth, and calls
+# redraw border method
+# -------------------------------------------------------------
+itcl::body iwidgets::Tabnotebook::_recomputeBorder { } {
+
+ set wid [winfo width $itk_component(canvas)]
+ set hgt [winfo height $itk_component(canvas)]
+
+ _pack $_tabPos
+ _redrawBorder $wid $hgt
+}
+
+# -------------------------------------------------------------
+# PROTECTED METHOD: _pageReconfigure
+#
+# This method will eventually reconfigure the tab notebook's
+# notebook area to contain the resized child site
+# -------------------------------------------------------------
+itcl::body iwidgets::Tabnotebook::_pageReconfigure { pageName page wid hgt } {
+}
+
+# -------------------------------------------------------------
+# PRIVATE METHOD: _pack
+#
+# This method packs the notebook and tabset correctly according
+# to the current $tabPos
+# -------------------------------------------------------------
+itcl::body iwidgets::Tabnotebook::_pack { tabPos } {
+
+ pack $itk_component(canvas) -fill both -expand yes
+ pack propagate $itk_component(canvas) no
+
+ switch $tabPos {
+ n {
+ # north
+ pack $itk_component(tabset) \
+ -anchor nw \
+ -fill x \
+ -expand no
+ pack $itk_component(notebook) \
+ -fill both \
+ -expand yes \
+ -padx $itk_option(-borderwidth) \
+ -pady $itk_option(-borderwidth) \
+ -side bottom
+ }
+ s {
+ # south
+ pack $itk_component(notebook) \
+ -anchor nw \
+ -fill both \
+ -expand yes \
+ -padx $itk_option(-borderwidth) \
+ -pady $itk_option(-borderwidth)
+
+ pack $itk_component(tabset) \
+ -side left \
+ -fill x \
+ -expand yes
+ }
+ w {
+ # west
+ pack $itk_component(tabset) \
+ -anchor nw \
+ -side left \
+ -fill y \
+ -expand no
+ pack $itk_component(notebook) \
+ -anchor nw \
+ -side left \
+ -fill both \
+ -expand yes \
+ -padx $itk_option(-borderwidth) \
+ -pady $itk_option(-borderwidth)
+
+ }
+ e {
+ # east
+ pack $itk_component(notebook) \
+ -side left \
+ -anchor nw \
+ -fill both \
+ -expand yes \
+ -padx $itk_option(-borderwidth) \
+ -pady $itk_option(-borderwidth)
+
+ pack $itk_component(tabset) \
+ -fill y \
+ -expand yes
+ }
+ }
+
+ set wid [winfo width $itk_component(canvas)]
+ set hgt [winfo height $itk_component(canvas)]
+
+ _redrawBorder $wid $hgt
+}
+
+
+
+# -------------------------------------------------------------
+# PRIVATE METHOD: _resize
+#
+# This method added by csmith, 5/1/01, to fix a bug with the
+# geometry of the tabnotebook. The hull component's geometry
+# was not being updated properly on <Configure> events.
+# -------------------------------------------------------------
+itcl::body iwidgets::Tabnotebook::_resize {newWidth_ newHeight_} {
+ _canvasReconfigure $newWidth_ $newHeight_
+
+ # csmith: 9/14/01 - Commenting out the following code due to
+ # SF ticket 461471, which is a dup of the original 452803. Since I
+ # can't remember the exact problem surrounding the need to add
+ # the _resize method, I'm going to do an undo here, leaving the
+ # code for future reference if needed. Should the original problem
+ # arise again I will reinvestigate the need for _resize.
+ #
+ # after idle \
+ # "$this component hull configure -width $newWidth_ -height $newHeight_"
+}
diff --git a/iwidgets/generic/tabset.itk b/iwidgets/generic/tabset.itk
new file mode 100644
index 00000000000..99c22fb0e28
--- /dev/null
+++ b/iwidgets/generic/tabset.itk
@@ -0,0 +1,2753 @@
+#
+# Tabset Widget and the Tab Class
+# ----------------------------------------------------------------------
+# A Tabset is a widget that contains a set of Tab buttons.
+# It displays these tabs in a row or column depending on it tabpos.
+# When a tab is clicked on, it becomes the only tab in the tab set that
+# is selected. All other tabs are deselected. The Tcl command prefix
+# associated with this tab (through the command tab configure option)
+# is invoked with the tab index number appended to its argument list.
+# This allows the Tabset to control another widget such as a Notebook.
+#
+# A Tab class is an [incr Tcl] class that displays either an image,
+# bitmap, or label in a graphic object on a canvas. This graphic object
+# can have a wide variety of appearances depending on the options set.
+#
+# WISH LIST:
+# This section lists possible future enhancements.
+#
+# 1) When too many tabs appear, a small scrollbar should appear to
+# move the tabs over.
+#
+# ----------------------------------------------------------------------
+# AUTHOR: Bill W. Scott EMAIL: bscott@spd.dsccc.com
+#
+# @(#) $Id$
+# ----------------------------------------------------------------------
+# Copyright (c) 1995 DSC Technologies Corporation
+# ======================================================================
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+
+#
+# Default resources.
+#
+option add *Tabset.width 0 widgetDefault
+option add *Tabset.height 0 widgetDefault
+option add *Tabset.equalTabs true widgetDefault
+option add *Tabset.tabPos s widgetDefault
+option add *Tabset.raiseSelect false widgetDefault
+option add *Tabset.start 4 widgetDefault
+option add *Tabset.margin 5 widgetDefault
+option add *Tabset.tabBorders true widgetDefault
+option add *Tabset.bevelAmount 0 widgetDefault
+option add *Tabset.padX 4 widgetDefault
+option add *Tabset.padY 4 widgetDefault
+option add *Tabset.gap overlap widgetDefault
+option add *Tabset.angle 20 widgetDefault
+option add *Tabset.font fixed widgetDefault
+option add *Tabset.state normal widgetDefault
+option add *Tabset.disabledForeground #a3a3a3 widgetDefault
+option add *Tabset.foreground black widgetDefault
+option add *Tabset.background #d9d9d9 widgetDefault
+option add *Tabset.selectForeground black widgetDefault
+option add *Tabset.selectBackground #ececec widgetDefault
+
+#
+# Usual options.
+#
+itk::usual Tabset {
+ keep -backdrop -background -cursor -disabledforeground -font -foreground \
+ -selectbackground -selectforeground
+}
+
+# ------------------------------------------------------------------
+# TABSET
+# ------------------------------------------------------------------
+itcl::class iwidgets::Tabset {
+ inherit itk::Widget
+
+ constructor {args} {}
+ destructor {}
+
+ itk_option define -width width Width 0
+ itk_option define -equaltabs equalTabs EqualTabs true
+ itk_option define -height height Height 0
+ itk_option define -tabpos tabPos TabPos s
+ itk_option define -raiseselect raiseSelect RaiseSelect false
+ itk_option define -start start Start 4
+ itk_option define -margin margin Margin 5
+ itk_option define -tabborders tabBorders TabBorders true
+ itk_option define -bevelamount bevelAmount BevelAmount 0
+ itk_option define -padx padX PadX 4
+ itk_option define -pady padY PadY 4
+ itk_option define -gap gap Gap overlap
+ itk_option define -angle angle Angle 20
+ itk_option define -font font Font fixed
+ itk_option define -state state State normal
+ itk_option define \
+ -disabledforeground disabledForeground DisabledForeground #a3a3a3
+ itk_option define -foreground foreground Foreground black
+ itk_option define -background background Background #d9d9d9
+ itk_option define -selectforeground selectForeground Background black
+ itk_option define -backdrop backdrop Backdrop white
+ itk_option define -selectbackground selectBackground Foreground #ececec
+ itk_option define -command command Command {}
+
+ public method configure {args}
+ public method add {args}
+ public method delete {args}
+ public method index {index}
+ public method insert {index args}
+ public method prev {}
+ public method next {}
+ public method select {index}
+ public method tabcget {index args}
+ public method tabconfigure {index args}
+ public method bbox {}
+
+ protected method _selectName {tabName}
+
+ private method _createTab {args}
+ private method _deleteTabs {fromTab toTab}
+ private method _index {pathList index select}
+ private method _tabConfigure {args}
+ private method _relayoutTabs {}
+ private method _drawBevelBorder {}
+ private method _calcNextTabOffset {tabName}
+ private method _tabBounds {}
+ private method _recalcCanvasGeom {}
+ private method _canvasReconfigure {width height}
+ private method _startMove {x y}
+ private method _moveTabs {x y}
+ private method _endMove {x y}
+ private method _configRelayout {}
+
+ private variable _width 0 ;# Width of the canvas in screen units
+ private variable _height 0 ;# Height of the canvas in screen units
+ private variable _selectedTop 0 ;# top edge of tab + a margin
+ private variable _deselectedTop 0 ;# top edge of tab + a margin&raiseamt
+ private variable _selectedLeft 0 ;# left edge of tab + a margin
+ private variable _deselectedLeft 0 ;# left edge of tab + a margin&raiseamt
+ private variable _tabs {} ;# our internal list of tabs
+ private variable _currTab -1 ;# numerical index # of selected tab
+ private variable _uniqueID 0 ;# used to create unique names
+ private variable _cmdStr {} ;# holds value of itk_option(-command)
+ ;# do not know why I need this!
+ private variable _canvasWidth 0 ;# set by canvasReconfigure, is can wid
+ private variable _canvasHeight 0 ;# set by canvasReconfigure, is can hgt
+
+ private variable _anchorX 0 ;# used by mouse scrolling methods
+ private variable _anchorY 0 ;# used by mouse scrolling methods
+
+ private variable _margin 0 ;# -margin in screen units
+ private variable _start 0 ;# -start in screen units
+ private variable _gap overlap ;# -gap in screen units
+
+ private variable _relayout false ;# flag tripped to tell whether to
+ ;# relayout tabs after the configure
+ private variable _skipRelayout false ;# flag that tells whether to skip
+ ;# relayouting out the tabs. used by
+ ;# _endMove.
+}
+
+#
+# Provide a lowercase access method for the Tabset class
+#
+proc ::iwidgets::tabset {pathName args} {
+ uplevel ::iwidgets::Tabset $pathName $args
+}
+
+# ----------------------------------------------------------------------
+# CONSTRUCTOR
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Tabset::constructor {args} {
+ global tcl_platform
+
+ #
+ # Create the canvas that holds the tabs
+ #
+ itk_component add canvas {
+ canvas $itk_interior.canvas -highlightthickness 0
+ } {
+ keep -cursor -width -height
+ }
+ pack $itk_component(canvas) -fill both -expand yes -anchor nw
+
+ # ... This gives us a chance to redraw our bevel borders, etc when
+ # the size of our canvas changes...
+ bind $itk_component(canvas) <Configure> \
+ [itcl::code $this _canvasReconfigure %w %h]
+ bind $itk_component(canvas) <Map> \
+ [itcl::code $this _relayoutTabs]
+
+
+ # ... Allow button 2 scrolling as in label widget.
+ if {$tcl_platform(os) != "HP-UX"} {
+ bind $itk_component(canvas) <2> \
+ [itcl::code $this _startMove %x %y]
+ bind $itk_component(canvas) <B2-Motion> \
+ [itcl::code $this _moveTabs %x %y]
+ bind $itk_component(canvas) <ButtonRelease-2> \
+ [itcl::code $this _endMove %x %y]
+ }
+
+ # @@@
+ # @@@ Is there a better way?
+ # @@@
+
+ bind $itk_component(hull) <Tab> [itcl::code $this next]
+ bind $itk_component(hull) <Shift-Tab> [itcl::code $this prev]
+
+ eval itk_initialize $args
+
+ _configRelayout
+
+ _recalcCanvasGeom
+
+}
+
+itcl::body iwidgets::Tabset::destructor {} {
+ foreach tab $_tabs {
+ itcl::delete object $tab
+ }
+}
+
+# ----------------------------------------------------------------------
+# OPTIONS
+# ----------------------------------------------------------------------
+
+# ----------------------------------------------------------------------
+# OPTION -width
+#
+# Sets the width explicitly for the canvas of the tabset
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tabset::width {
+ if {$itk_option(-width) != {}} {
+ }
+ set _width [winfo pixels $itk_interior $itk_option(-width)]
+}
+
+# ----------------------------------------------------------------------
+# OPTION -equaltabs
+#
+# If set to true, causes horizontal tabs to be equal in
+# in width and vertical tabs to equal in height.
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tabset::equaltabs {
+ if {$itk_option(-equaltabs) != {}} {
+ set _relayout true
+ }
+}
+
+# ----------------------------------------------------------------------
+# OPTION -height
+#
+# Sets the height explicitly for the canvas of the tabset
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tabset::height {
+ set _height [winfo pixels $itk_interior $itk_option(-height)]
+}
+
+# ----------------------------------------------------------------------
+# OPTION -tabpos
+#
+# Sets the tab position of tabs, n, s, e, w
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tabset::tabpos {
+ if {$itk_option(-tabpos) != {}} {
+ switch $itk_option(-tabpos) {
+ n {
+ _tabConfigure -invert true -orient horizontal
+ }
+ s {
+ _tabConfigure -invert false -orient horizontal
+ }
+ w {
+ _tabConfigure -invert false -orient vertical
+ }
+ e {
+ _tabConfigure -invert true -orient vertical
+ }
+ default {
+ error "bad anchor position\
+ \"$itk_option(-tabpos)\" must be n, s, e, or w"
+ }
+ }
+ }
+}
+
+# ----------------------------------------------------------------------
+# OPTION -raiseselect
+#
+# Sets whether to raise selected tabs slightly
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tabset::raiseselect {
+ if {$itk_option(-raiseselect) != {}} {
+ set _relayout true
+ }
+}
+
+# ----------------------------------------------------------------------
+# OPTION -start
+#
+# Sets the offset to start of tab set
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tabset::start {
+ if {$itk_option(-start) != {}} {
+ set _start [winfo pixels $itk_interior $itk_option(-start)]
+ set _relayout true
+ } else {
+ set _start 4
+ }
+}
+
+# ----------------------------------------------------------------------
+# OPTION -margin
+#
+# Sets the margin used above n tabs, below s tabs, left of e
+# tabs, right of w tabs
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tabset::margin {
+ if {$itk_option(-margin) != {}} {
+ set _margin [winfo pixels $itk_interior $itk_option(-margin)]
+ set _relayout true
+ } else {
+ set _margin 5
+ }
+}
+
+# ----------------------------------------------------------------------
+# OPTION -tabborders
+#
+# Boolean that specifies whether to draw the borders of
+# the unselected tabs (tabs in background)
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tabset::tabborders {
+ if {$itk_option(-tabborders) != {}} {
+ _tabConfigure -tabborders $itk_option(-tabborders)
+ }
+}
+
+# ----------------------------------------------------------------------
+# OPTION -bevelamount
+#
+# Specifies pixel size of tab corners. 0 means no corners.
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tabset::bevelamount {
+ if {$itk_option(-bevelamount) != {}} {
+ _tabConfigure -bevelamount $itk_option(-bevelamount)
+ }
+}
+
+# ----------------------------------------------------------------------
+# OPTION -padx
+#
+# Sets the padding in each tab to the left and right of label
+# I don't convert for fpixels, since Tab does it for me.
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tabset::padx {
+ if {$itk_option(-padx) != {}} {
+ _tabConfigure -padx $itk_option(-padx)
+ }
+}
+
+# ----------------------------------------------------------------------
+# OPTION -pady
+#
+# Sets the padding in each tab to the left and right of label
+# I don't convert for fpixels, since Tab does it for me.
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tabset::pady {
+ if {$itk_option(-pady) != {}} {
+ _tabConfigure -pady $itk_option(-pady)
+ }
+}
+
+# ----------------------------------------------------------------------
+# OPTION -gap
+#
+# Sets the amount of spacing between tabs in pixels
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tabset::gap {
+ if {$itk_option(-gap) != {}} {
+ if {$itk_option(-gap) != "overlap"} {
+ set _gap [winfo pixels $itk_interior $itk_option(-gap)]
+ } else {
+ set _gap overlap
+ }
+ set _relayout true
+ } else {
+ set _gap overlap
+ }
+}
+
+# ----------------------------------------------------------------------
+# OPTION -angle
+#
+# Sets the angle of the tab's sides
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tabset::angle {
+ if {$itk_option(-angle) != {}} {
+ _tabConfigure -angle $itk_option(-angle)
+ }
+}
+
+# ----------------------------------------------------------------------
+# OPTION -font
+#
+# Sets the font of the tab (SELECTED and UNSELECTED)
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tabset::font {
+ if {$itk_option(-font) != {}} {
+ _tabConfigure -font $itk_option(-font)
+ }
+}
+
+# ----------------------------------------------------------------------
+# OPTION -state
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tabset::state {
+ if {$itk_option(-state) != {}} {
+ _tabConfigure -state $itk_option(-state)
+ }
+}
+
+# ----------------------------------------------------------------------
+# OPTION -disabledforeground
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tabset::disabledforeground {
+ if {$itk_option(-disabledforeground) != {}} {
+ _tabConfigure \
+ -disabledforeground $itk_option(-disabledforeground)
+ }
+}
+
+# ----------------------------------------------------------------------
+# OPTION -foreground
+#
+# Sets the foreground label color of UNSELECTED tabs
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tabset::foreground {
+ _tabConfigure -foreground $itk_option(-foreground)
+}
+
+# ----------------------------------------------------------------------
+# OPTION -background
+#
+# Sets the background color of UNSELECTED tabs
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tabset::background {
+ if {$itk_option(-background) != {}} {
+ _tabConfigure -background $itk_option(-background)
+ } else {
+ _tabConfigure -background \
+ [$itk_component(canvas) cget -background]
+ }
+}
+
+# ----------------------------------------------------------------------
+# OPTION -selectforeground
+#
+# Sets the foreground label color of SELECTED tabs
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tabset::selectforeground {
+ _tabConfigure -selectforeground $itk_option(-selectforeground)
+}
+
+# ----------------------------------------------------------------------
+# OPTION -backdrop
+#
+# Sets the background color of the Tabset backdrop (behind the tabs)
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tabset::backdrop {
+ if {$itk_option(-backdrop) != {}} {
+ $itk_component(canvas) configure \
+ -background $itk_option(-backdrop)
+ }
+}
+
+# ----------------------------------------------------------------------
+# OPTION -selectbackground
+#
+# Sets the background color of SELECTED tabs
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tabset::selectbackground {
+ if {$itk_option(-selectbackground) != {}} {
+ } else {
+ #set _selectBackground \
+ [$itk_component(canvas) cget -background]
+ }
+ _tabConfigure -selectbackground $itk_option(-selectbackground)
+}
+
+# ----------------------------------------------------------------------
+# OPTION -command
+#
+# The command to invoke when a tab is hit.
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tabset::command {
+ if {$itk_option(-command) != {}} {
+ set _cmdStr $itk_option(-command)
+ }
+}
+
+# ----------------------------------------------------------------------
+# METHOD: add ?option value...?
+#
+# Creates a tab and appends it to the list of tabs.
+# processes tabconfigure for the tab added.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Tabset::add {args} {
+ set tabName [eval _createTab $args]
+ lappend _tabs $tabName
+
+ _relayoutTabs
+
+ return $tabName
+}
+
+# ----------------------------------------------------------------------
+# METHOD: configure ?option? ?value option value...?
+#
+# Acts as an addendum to the itk::Widget::configure method.
+#
+# Checks the _relayout flag to see if after configures are done
+# we need to relayout the tabs.
+#
+# _skipRelayout is set in the MB2 scroll methods, to avoid constant
+# relayout of tabs while dragging the mouse.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Tabset::configure {args} {
+ set result [eval itk::Archetype::configure $args]
+
+ _configRelayout
+
+ return $result
+}
+
+itcl::body iwidgets::Tabset::_configRelayout {} {
+ # then relayout tabs if necessary
+ if { $_relayout } {
+ if { $_skipRelayout } {
+ } else {
+ _relayoutTabs
+ }
+ set _relayout false
+ }
+}
+
+# ----------------------------------------------------------------------
+# METHOD: delete index1 ?index2?
+#
+# Deletes a tab or range of tabs from the tabset
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Tabset::delete {args} {
+ if { $_tabs == {} } {
+ error "can't delete tabs,\
+ no tabs in the tabset named $itk_component(hull)"
+ }
+
+ set len [llength $args]
+ switch $len {
+ 0 {
+ error "wrong # args: should be\
+ \"$itk_component(hull) delete index1 ?index2?\""
+ }
+
+ 1 {
+ set fromTab [index [lindex $args 0]]
+ if { $fromTab == -1 } {
+ error "bad value for index1:\
+ [lindex $args 0] in call to delete"
+ }
+ set toTab $fromTab
+ _deleteTabs $fromTab $toTab
+ }
+
+ 2 {
+ set fromTab [index [lindex $args 0]]
+ if { $fromTab == -1 } {
+ error "bad value for index1:\
+ [lindex $args 0] in call to delete"
+ }
+ set toTab [index [lindex $args 1]]
+
+ if { $toTab == -1 } {
+ error "bad value for index2:\
+ [lindex $args 1] in call to delete"
+ }
+ _deleteTabs $fromTab $toTab
+ }
+
+ default {
+ error "wrong # args: should be\
+ \"$itk_component(hull) delete index1 ?index2?\""
+ }
+ }
+}
+
+# ----------------------------------------------------------------------
+# METHOD: index index
+#
+# Given an index identifier returns the numeric index of the tab
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Tabset::index {index} {
+ return [_index $_tabs $index $_currTab]
+}
+
+# ----------------------------------------------------------------------
+# METHOD: insert index ?option value...?
+#
+# Inserts a tab before a index. The before tab may
+# be specified as a label or a tab position.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Tabset::insert {index args} {
+ if { $_tabs == {} } {
+ error "no tab to insert before,\
+ tabset '$itk_component(hull)' is empty"
+ }
+
+ # get the tab
+ set tab [index $index]
+
+ # catch bad value for before tab.
+ if { $tab < 0 || $tab >= [llength $_tabs] } {
+ error "bad value $tab for index:\
+ should be between 0 and [expr {[llength $_tabs] - 1}]"
+ }
+
+ # create the new tab and get its name...
+ set tabName [eval _createTab $args]
+
+ # grab the name of the tab currently selected. (to keep in sync)
+ set currTabName [lindex $_tabs $_currTab]
+
+ # insert tabName before $tab
+ set _tabs [linsert $_tabs $tab $tabName]
+
+ # keep the _currTab in sync with the insert.
+ set _currTab [lsearch -exact $_tabs $currTabName]
+
+ _relayoutTabs
+
+ return $tabName
+}
+
+# ----------------------------------------------------------------------
+# METHOD: prev
+#
+# Selects the prev tab. Wraps at first back to last tab.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Tabset::prev {} {
+ if { $_tabs == {} } {
+ error "can't goto previous tab,\
+ no tabs in the tabset: $itk_component(hull)"
+ }
+
+ # bump to the previous tab and wrap if necessary
+ set prev [expr {$_currTab - 1}]
+ if { $prev < 0 } {
+ set prev [expr {[llength $_tabs] - 1}]
+ }
+
+ select $prev
+
+}
+
+# ----------------------------------------------------------------------
+# METHOD: next
+#
+# Selects the next tab. Wraps at last back to first tab.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Tabset::next {} {
+ if { $_tabs == {} } {
+ error "can't goto next tab,\
+ no tabs in the tabset: $itk_component(hull)"
+ }
+
+ # bump to the next tab and wrap if necessary
+ set next [expr {$_currTab + 1}]
+ if { $next >= [llength $_tabs] } {
+ set next 0
+ }
+
+ select $next
+}
+
+# ----------------------------------------------------------------------
+# METHOD: select index
+#
+# Select a tab by index
+#
+# Lowers the last _currTab if it existed.
+# Then raises the new one if it exists.
+#
+# Returns numeric index of selection, -1 if failed.
+# -------------------------------------------------------------
+itcl::body iwidgets::Tabset::select {index} {
+ if { $_tabs == {} } {
+ error "can't activate a tab,\
+ no tabs in the tabset: $itk_component(hull)"
+ }
+
+ # if there is not current selection just ignore trying this selection
+ if { $index == "select" && $_currTab == -1 } {
+ return -1
+ }
+
+ # is selection request in range ?
+ set reqTab [index $index]
+ if { $reqTab == -1 } {
+ error "bad value $index for index:\
+ should be from 0 to [expr {[llength $_tabs] - 1}]"
+ }
+
+ # If already selected then ignore and return...
+ if { $reqTab == $_currTab } {
+ return $reqTab
+ }
+
+ # ---- Deselect
+ if { $_currTab != -1 } {
+ set currTabName [lindex $_tabs $_currTab]
+ $currTabName deselect
+
+ # handle different orientations...
+ if { $itk_option(-tabpos) == "n" || $itk_option(-tabpos) == "s"} {
+ $currTabName configure -top $_deselectedTop
+ } else {
+ $currTabName configure -left $_deselectedLeft
+ }
+ }
+
+ # get the stacking order correct...
+ foreach tab $_tabs {
+ $tab lower
+ }
+
+ # set this now so that the -command cmd can do an 'index select'
+ # to operate on this tab.
+ set _currTab $reqTab
+
+ # ---- Select
+ set reqTabName [lindex $_tabs $reqTab]
+ $reqTabName select
+ if { $itk_option(-tabpos) == "n" || $itk_option(-tabpos) == "s"} {
+ $reqTabName configure -top $_selectedTop
+ } else {
+ $reqTabName configure -left $_selectedLeft
+ }
+
+ set _currTab $reqTab
+
+ # invoke any user command string, appended with tab index number
+ if { $_cmdStr != {} } {
+ set newCmd $_cmdStr
+ eval [lappend newCmd $reqTab]
+ }
+
+ return $reqTab
+}
+
+# ----------------------------------------------------------------------
+# METHOD: tabcget index ?option?
+#
+# Returns the value for the option setting of the tab at index $index.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Tabset::tabcget {index args} {
+ return [lindex [eval tabconfigure $index $args] 2]
+}
+
+# ----------------------------------------------------------------------
+# METHOD: tabconfigure index ?option? ?value option value?
+#
+# tabconfigure index : returns configuration list
+# tabconfigure index -option : returns option values
+# tabconfigure index ?option value option value ...? sets options
+# and returns empty string.
+#
+# Performs configure on a given tab denoted by index.
+#
+# Index may be a tab number or a pattern matching the label
+# associated with a tab.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Tabset::tabconfigure {index args} {
+ # convert index to numeric
+ set tab [index $index]
+
+ if { $tab == -1 } {
+ error "bad index value:\
+ $index for $itk_component(hull) tabconfigure"
+ }
+
+ set tabName [lindex $_tabs $tab]
+
+ set len [llength $args]
+ switch $len {
+ 0 {
+ return [eval $tabName configure]
+ }
+ 1 {
+ return [eval $tabName configure $args]
+ }
+ default {
+ eval $tabName configure $args
+ _relayoutTabs
+ select select
+ }
+ }
+ return ""
+}
+
+# ----------------------------------------------------------------------
+# METHOD: bbox
+#
+# calculates the bounding box that will completely enclose
+# all the tabs.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Tabset::bbox {} {
+ return [_tabBounds]
+}
+
+# ----------------------------------------------------------------------
+# PROTECTED METHOD: _selectName
+#
+# internal method to allow selection by internal tab name
+# rather than index. This is used by the bind methods
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Tabset::_selectName {tabName} {
+ # if the tab is disabled, then ignore this selection...
+ if { [$tabName cget -state] == "disabled" } {
+ return
+ }
+
+ set tab [lsearch -exact $_tabs $tabName]
+ select $tab
+}
+
+# ----------------------------------------------------------------------
+# PRIVATE METHOD: _createTab
+#
+# Creates a tab, using unique tab naming, propagates background
+# and keeps unique id up to date.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Tabset::_createTab {args} {
+ #
+ # create an internal name for the tab: tab0, tab1, etc.
+ # these are one-up numbers they do not
+ # correspond to the position the tab is located in.
+ #
+ set tabName $this-tab$_uniqueID
+
+ switch $itk_option(-tabpos) {
+ n {
+ set invert true
+ set orient horizontal
+ set x 0
+ set y [expr {$_margin + 1}]
+ }
+ s {
+ set invert false
+ set orient horizontal
+ set x 0
+ set y 0
+ }
+ w {
+ set invert false
+ set orient vertical
+ set x 0
+ set y 0
+ }
+ e {
+ set invert true
+ set orient vertical
+ set x [expr {$_margin + 1}]
+ set y 0
+ }
+ default {
+ error "bad anchor position\
+ \"$itk_option(-tabpos)\" must be n, s, e, or w"
+ }
+ }
+
+ eval iwidgets::Tab $tabName $itk_component(canvas) \
+ -left $x \
+ -top $y \
+ -font [list $itk_option(-font)] \
+ -background $itk_option(-background) \
+ -foreground $itk_option(-foreground) \
+ -selectforeground $itk_option(-selectforeground) \
+ -disabledforeground $itk_option(-disabledforeground) \
+ -selectbackground $itk_option(-selectbackground) \
+ -angle $itk_option(-angle) \
+ -padx $itk_option(-padx) \
+ -pady $itk_option(-pady) \
+ -bevelamount $itk_option(-bevelamount) \
+ -state $itk_option(-state) \
+ -tabborders $itk_option(-tabborders) \
+ -invert $invert \
+ -orient $orient \
+ $args
+
+ $tabName lower
+
+ $itk_component(canvas) \
+ bind $tabName <Button-1> [itcl::code $this _selectName $tabName]
+
+ incr _uniqueID
+
+ return $tabName
+}
+
+# ----------------------------------------------------------------------
+# PRIVATE METHOD: _deleteTabs
+#
+# Deletes tabs from $fromTab to $toTab.
+#
+# Operates in two passes, destroys all the widgets
+# Then removes the pathName from the tab list
+#
+# Also keeps the current selection in bounds.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Tabset::_deleteTabs {fromTab toTab} {
+ for { set tab $fromTab } { $tab <= $toTab } { incr tab } {
+ set tabName [lindex $_tabs $tab]
+
+ # unbind Button-1 from this window name
+ $itk_component(canvas) bind $tabName <Button-1> {}
+
+ # Destroy the Tab class...
+ itcl::delete object $tabName
+ }
+
+ # physically remove the tab
+ set _tabs [lreplace $_tabs $fromTab $toTab]
+
+ # If we deleted a selected tab set our selection to none
+ if { $_currTab >= $fromTab && $_currTab <= $toTab } {
+ set _currTab -1
+ _drawBevelBorder
+ }
+
+ # make sure _currTab stays in sync with new numbering...
+ if { $_tabs == {} } {
+ # if deleted only remaining tab,
+ # reset current tab to undefined
+ set _currTab -1
+
+ # or if the current tab was the last tab, it needs come back
+ } elseif { $_currTab >= [llength $_tabs] } {
+ incr _currTab -1
+ if { $_currTab < 0 } {
+ # but only to zero
+ set _currTab 0
+ }
+ }
+
+ _relayoutTabs
+}
+
+# ----------------------------------------------------------------------
+# PRIVATE METHOD: _index
+#
+# pathList : list of path names to search thru if index is a label
+# index : either number, 'select', 'end', or pattern
+# select : current selection
+#
+# _index takes takes the value $index converts it to
+# a numeric identifier. If the value is not already
+# an integer it looks it up in the $pathList array.
+# If it fails it returns -1
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Tabset::_index {pathList index select} {
+ switch $index {
+ select {
+ set number $select
+ }
+ end {
+ set number [expr {[llength $pathList] -1}]
+ }
+ default {
+ # is it an number already?
+ if { [regexp {^[0-9]+$} $index] } {
+ set number $index
+ if { $number < 0 || $number >= [llength $pathList] } {
+ set number -1
+ }
+
+ # otherwise it is a label
+ } else {
+ # look thru the pathList of pathNames and
+ # get each label and compare with index.
+ # if we get a match then set number to postion in $pathList
+ # and break out.
+ # otherwise number is still -1
+ set i 0
+ set number -1
+ foreach pathName $pathList {
+ set label [$pathName cget -label]
+ if { $label == $index } {
+ set number $i
+ break
+ }
+ incr i
+ }
+ }
+ }
+ }
+
+ return $number
+}
+
+# ----------------------------------------------------------------------
+# PRIVATE METHOD: _tabConfigure
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Tabset::_tabConfigure {args} {
+ foreach tab $_tabs {
+ eval $tab configure $args
+ }
+
+ set _relayout true
+
+ if { $_tabs != {} } {
+ select select
+ }
+}
+
+# ----------------------------------------------------------------------
+# PRIVATE METHOD: _relayoutTabs
+#
+# relays out the tabs with correct spacing...
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Tabset::_relayoutTabs {} {
+ if { [llength $_tabs] == 0 || ![winfo viewable $itk_component(hull)]} {
+ return
+ }
+
+ # get the max width for fixed width tabs...
+ set maxWidth 0
+ foreach tab $_tabs {
+ set width [$tab labelwidth]
+ if { $width > $maxWidth } {
+ set maxWidth $width
+ }
+ }
+
+ # get the max height for fixed height tabs...
+ set maxHeight 0
+ foreach tab $_tabs {
+ set height [$tab labelheight]
+ if { $height > $maxHeight } {
+ set maxHeight $height
+ }
+ }
+
+ # get curr tab's name
+ set currTabName [lindex $_tabs $_currTab]
+
+ # Start with our margin offset in pixels...
+ set tabStart $_start
+
+ if { $itk_option(-raiseselect) } {
+ set raiseAmt 2
+ } else {
+ set raiseAmt 0
+ }
+
+ #
+ # Depending on the tab layout: n, s, e, or w place the tabs
+ # according to orientation, raise, margins, etc.
+ #
+ switch $itk_option(-tabpos) {
+ n {
+ set _selectedTop [expr {$_margin + 1}]
+ set _deselectedTop [expr {$_selectedTop + $raiseAmt}]
+
+ if { $itk_option(-equaltabs) } {
+ set tabWidth $maxWidth
+ } else {
+ set tabWidth 0
+ }
+
+ foreach tab $_tabs {
+ if { $tab == $currTabName } {
+ $tab configure -left $tabStart -top $_selectedTop \
+ -height $maxHeight -width $tabWidth -anchor c
+ } else {
+ $tab configure -left $tabStart -top $_deselectedTop \
+ -height $maxHeight -width $tabWidth -anchor c
+ }
+ set tabStart [expr {$tabStart + [_calcNextTabOffset $tab]}]
+ }
+
+ }
+ s {
+ set _selectedTop 0
+ set _deselectedTop [expr {$_selectedTop - $raiseAmt}]
+
+ if { $itk_option(-equaltabs) } {
+ set tabWidth $maxWidth
+ } else {
+ set tabWidth 0
+ }
+
+ foreach tab $_tabs {
+ if { $tab == $currTabName } {
+ $tab configure -left $tabStart -top $_selectedTop \
+ -height $maxHeight -width $tabWidth -anchor c
+ } else {
+ $tab configure -left $tabStart -top $_deselectedTop \
+ -height $maxHeight -width $tabWidth -anchor c
+ }
+ set tabStart [expr {$tabStart + [_calcNextTabOffset $tab]}]
+ }
+
+ }
+ w {
+ set _selectedLeft [expr {$_margin + 1}]
+ set _deselectedLeft [expr {$_selectedLeft + $raiseAmt}]
+
+ if { $itk_option(-equaltabs) } {
+ set tabHeight $maxHeight
+ } else {
+ set tabHeight 0
+ }
+
+ foreach tab $_tabs {
+ # selected
+ if { $tab == $currTabName } {
+ $tab configure -top $tabStart -left $_selectedLeft \
+ -height $tabHeight -width $maxWidth -anchor e
+ # deselected
+ } else {
+ $tab configure -top $tabStart -left $_deselectedLeft \
+ -height $tabHeight -width $maxWidth -anchor e
+ }
+ set tabStart [expr {$tabStart + [_calcNextTabOffset $tab]}]
+ }
+
+ }
+ e {
+ set _selectedLeft 0
+ set _deselectedLeft [expr {$_selectedLeft - $raiseAmt}]
+
+ if { $itk_option(-equaltabs) } {
+ set tabHeight $maxHeight
+ } else {
+ set tabHeight 0
+ }
+
+ foreach tab $_tabs {
+ # selected
+ if { $tab == $currTabName } {
+ $tab configure -top $tabStart -left $_selectedLeft \
+ -height $tabHeight -width $maxWidth -anchor w
+ # deselected
+ } else {
+ $tab configure -top $tabStart -left $_deselectedLeft \
+ -height $tabHeight -width $maxWidth -anchor w
+ }
+ set tabStart [expr {$tabStart + [_calcNextTabOffset $tab]}]
+ }
+
+ }
+ default {
+ error "bad anchor position\
+ \"$itk_option(-tabpos)\" must be n, s, e, or w"
+ }
+ }
+
+ # put border on & calc our new canvas size...
+ _drawBevelBorder
+ _recalcCanvasGeom
+
+}
+
+# ----------------------------------------------------------------------
+# PRIVATE METHOD: _drawBevelBorder
+#
+# draws the bevel border along tab edge (below selected tab)
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Tabset::_drawBevelBorder {} {
+ $itk_component(canvas) delete bevelBorder
+
+ switch $itk_option(-tabpos) {
+ n {
+ $itk_component(canvas) create line \
+ 0 [expr {$_canvasHeight - 1}] \
+ $_canvasWidth [expr {$_canvasHeight - 1}] \
+ -fill [iwidgets::colors::topShadow $itk_option(-selectbackground)] \
+ -tags bevelBorder
+ $itk_component(canvas) create line \
+ 0 $_canvasHeight \
+ $_canvasWidth $_canvasHeight \
+ -fill [iwidgets::colors::topShadow $itk_option(-selectbackground)] \
+ -tags bevelBorder
+ }
+ s {
+ $itk_component(canvas) create line \
+ 0 0 \
+ $_canvasWidth 0 \
+ -fill [iwidgets::colors::bottomShadow $itk_option(-selectbackground)] \
+ -tags bevelBorder
+ $itk_component(canvas) create line \
+ 0 1 \
+ $_canvasWidth 1 \
+ -fill black \
+ -tags bevelBorder
+ }
+ w {
+ $itk_component(canvas) create line \
+ $_canvasWidth 0 \
+ $_canvasWidth [expr {$_canvasHeight - 1}] \
+ -fill [iwidgets::colors::topShadow $itk_option(-selectbackground)] \
+ -tags bevelBorder
+ $itk_component(canvas) create line \
+ [expr {$_canvasWidth - 1}] 0 \
+ [expr {$_canvasWidth - 1}] [expr {$_canvasHeight - 1}] \
+ -fill [iwidgets::colors::topShadow $itk_option(-selectbackground)] \
+ -tags bevelBorder
+
+ }
+ e {
+ $itk_component(canvas) create line \
+ 0 0 \
+ 0 [expr {$_canvasHeight - 1}] \
+ -fill black \
+ -tags bevelBorder
+ $itk_component(canvas) create line \
+ 1 0 \
+ 1 [expr {$_canvasHeight - 1}] \
+ -fill [iwidgets::colors::bottomShadow $itk_option(-selectbackground)] \
+ -tags bevelBorder
+
+ }
+ }
+
+ $itk_component(canvas) raise bevelBorder
+ if { $_currTab != -1 } {
+ set currTabName [lindex $_tabs $_currTab]
+ $currTabName raise
+ }
+}
+
+# ----------------------------------------------------------------------
+# PRIVATE METHOD: _calcNextTabOffset
+#
+# given $tabName, determines the offset in pixels to place
+# the next tab's start edge at.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Tabset::_calcNextTabOffset {tabName} {
+ if { $_gap == "overlap" } {
+ return [$tabName offset]
+ } else {
+ return [expr {[$tabName majordim] + $_gap}]
+ }
+}
+
+# ----------------------------------------------------------------------
+# PRIVATE METHOD: _tabBounds
+#
+# calculates the bounding box that will completely enclose
+# all the tabs.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Tabset::_tabBounds {} {
+ set bbox { 100000 100000 -10000 -10000 }
+ foreach tab $_tabs {
+ set tabBBox [$tab bbox]
+ # if this left is less use it
+ if { [lindex $tabBBox 0] < [lindex $bbox 0] } {
+ set bbox [lreplace $bbox 0 0 [lindex $tabBBox 0]]
+ }
+ # if this top is greater use it
+ if { [lindex $tabBBox 1] < [lindex $bbox 1] } {
+ set bbox [lreplace $bbox 1 1 [lindex $tabBBox 1]]
+ }
+ # if this right is less use it
+ if { [lindex $tabBBox 2] > [lindex $bbox 2] } {
+ set bbox [lreplace $bbox 2 2 [lindex $tabBBox 2]]
+ }
+ # if this bottom is greater use it
+ if { [lindex $tabBBox 3] > [lindex $bbox 3] } {
+ set bbox [lreplace $bbox 3 3 [lindex $tabBBox 3]]
+ }
+
+ }
+ return $bbox
+}
+
+# ----------------------------------------------------------------------
+# PRIVATE METHOD: _recalcCanvasGeom
+#
+# Based on size of tabs, recalculates the canvas geometry that
+# will hold the tabs.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Tabset::_recalcCanvasGeom {} {
+ if { [llength $_tabs] == 0 } {
+ return
+ }
+
+ set bbox [_tabBounds]
+
+ set width [lindex [_tabBounds] 2]
+ set height [lindex [_tabBounds] 3]
+
+ # now we have the dimensions of all the tabs in the canvas.
+
+
+ switch $itk_option(-tabpos) {
+ n {
+ # height already includes margin
+ $itk_component(canvas) configure \
+ -width $width \
+ -height $height
+ }
+ s {
+ $itk_component(canvas) configure \
+ -width $width \
+ -height [expr {$height + $_margin}]
+ }
+ w {
+ # width already includes margin
+ $itk_component(canvas) configure \
+ -width $width \
+ -height [expr {$height + 1}]
+ }
+ e {
+ $itk_component(canvas) configure \
+ -width [expr {$width + $_margin}] \
+ -height [expr {$height + 1}]
+ }
+ default {
+ }
+ }
+}
+
+# ----------------------------------------------------------------------
+# PRIVATE METHOD: _canvasReconfigure
+#
+# Bound to the reconfigure notify event of a canvas, this
+# method resets canvas's correct width (since we are fill x)
+# and redraws the beveled edge border.
+# will hold the tabs.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Tabset::_canvasReconfigure {width height} {
+ set _canvasWidth $width
+ set _canvasHeight $height
+
+ if { [llength $_tabs] > 0 } {
+ _drawBevelBorder
+ }
+}
+
+# ----------------------------------------------------------------------
+# PRIVATE METHOD: _startMove
+#
+# This method is bound to the MB2 down in the canvas area of the
+# tab set. This starts animated scrolling of the tabs along their
+# major axis.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Tabset::_startMove {x y} {
+ if { $itk_option(-tabpos) == "n" || $itk_option(-tabpos) == "s" } {
+ set _anchorX $x
+ } else {
+ set _anchorY $y
+ }
+}
+
+# ----------------------------------------------------------------------
+# PRIVATE METHOD: _moveTabs
+#
+# This method is bound to the MB2 motion in the canvas area of the
+# tab set. This causes the tabset to move with the mouse.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Tabset::_moveTabs {x y} {
+ if { $itk_option(-tabpos) == "n" || $itk_option(-tabpos) == "s" } {
+ set startX [expr {$_start + $x - $_anchorX}]
+ foreach tab $_tabs {
+ $tab configure -left $startX
+ set startX [expr {$startX + [_calcNextTabOffset $tab]}]
+ }
+ } else {
+ set startY [expr {$_start + $y - $_anchorY}]
+ foreach tab $_tabs {
+ $tab configure -top $startY
+ set startY [expr {$startY + [_calcNextTabOffset $tab]}]
+ }
+ }
+}
+
+# ----------------------------------------------------------------------
+# PRIVATE METHOD: _endMove
+#
+# This method is bound to the MB2 release in the canvas area of the
+# tab set. This causes the tabset to end moving tabs.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Tabset::_endMove {x y} {
+ if { $itk_option(-tabpos) == "n" || $itk_option(-tabpos) == "s" } {
+ set startX [expr {$_start + $x - $_anchorX}]
+ set _skipRelayout true
+ configure -start $startX
+ set _skipRelayout false
+ } else {
+ set startY [expr {$_start + $y - $_anchorY}]
+ set _skipRelayout true
+ configure -start $startY
+ set _skipRelayout false
+ }
+}
+
+
+#==============================================================
+# CLASS: Tab
+#==============================================================
+
+itcl::class iwidgets::Tab {
+ constructor {args} {}
+
+ destructor {}
+
+ public variable bevelamount 0 {}
+ public variable state normal {}
+ public variable height 0 {}
+ public variable width 0 {}
+ public variable anchor c {}
+ public variable left 0 {}
+ public variable top 0 {}
+ public variable image {} {}
+ public variable bitmap {} {}
+ public variable label {} {}
+ public variable padx 4 {}
+ public variable pady 4 {}
+ public variable selectbackground "gray70" {}
+ public variable selectforeground "black" {}
+ public variable disabledforeground "gray" {}
+ public variable background "white" {}
+ public variable foreground "black" {}
+ public variable orient vertical {}
+ public variable invert false {}
+ public variable angle 20 {}
+ public variable font \
+ "-adobe-helvetica-bold-r-normal--34-240-100-100-p-182-iso8859-1" {}
+ public variable tabborders true {}
+
+ public method configure {args}
+ public method bbox {}
+ public method deselect {}
+ public method lower {}
+ public method majordim {}
+ public method minordim {}
+ public method offset {}
+ public method raise {}
+ public method select {}
+ public method labelheight {}
+ public method labelwidth {}
+
+ private method _makeTab {}
+ private method _createLabel {canvas tagList}
+ private method _makeEastTab {canvas}
+ private method _makeWestTab {canvas}
+ private method _makeNorthTab {canvas}
+ private method _makeSouthTab {canvas}
+ private method _calcLabelDim {labelItem}
+ private method _itk_config {args} @itcl-builtin-configure
+ private method _selectNoRaise {}
+ private method _deselectNoLower {}
+
+ private variable _selected false
+ private variable _padX 0
+ private variable _padY 0
+
+ private variable _canvas
+
+ # these are in pixels
+ private variable _left 0
+ private variable _width 0
+ private variable _height 0
+ private variable _oldLeft 0
+ private variable _top 0
+ private variable _oldTop 0
+
+ private variable _right
+ private variable _bottom
+
+ private variable _offset
+ private variable _majorDim
+ private variable _minorDim
+
+ private variable _darkShadow
+ private variable _lightShadow
+
+ #
+ # graphic components that make up a tab
+ #
+ private variable _gRegion
+ private variable _gLabel
+ private variable _gLightOutline {}
+ private variable _gBlackOutline {}
+ private variable _gTopLine
+ private variable _gTopLineShadow
+ private variable _gLightShadow
+ private variable _gDarkShadow
+
+ private variable _labelWidth 0
+ private variable _labelHeight 0
+
+ private variable _labelXOrigin 0
+ private variable _labelYOrigin 0
+
+ private variable _just left
+
+ private variable _configTripped true
+
+ common _tan
+
+ set _tan(0) 0.0
+ set _tan(1) 0.0175
+ set _tan(2) 0.0349
+ set _tan(3) 0.0524
+ set _tan(4) 0.0699
+ set _tan(5) 0.0875
+ set _tan(6) 0.1051
+ set _tan(7) 0.1228
+ set _tan(8) 0.1405
+ set _tan(9) 0.1584
+ set _tan(10) 0.1763
+ set _tan(11) 0.1944
+ set _tan(12) 0.2126
+ set _tan(13) 0.2309
+ set _tan(14) 0.2493
+ set _tan(15) 0.2679
+ set _tan(16) 0.2867
+ set _tan(17) 0.3057
+ set _tan(18) 0.3249
+ set _tan(19) 0.3443
+ set _tan(20) 0.3640
+ set _tan(21) 0.3839
+ set _tan(22) 0.4040
+ set _tan(23) 0.4245
+ set _tan(24) 0.4452
+ set _tan(25) 0.4663
+ set _tan(26) 0.4877
+ set _tan(27) 0.5095
+ set _tan(28) 0.5317
+ set _tan(29) 0.5543
+ set _tan(30) 0.5774
+ set _tan(31) 0.6009
+ set _tan(32) 0.6294
+ set _tan(33) 0.6494
+ set _tan(34) 0.6745
+ set _tan(35) 0.7002
+ set _tan(36) 0.7265
+ set _tan(37) 0.7536
+ set _tan(38) 0.7813
+ set _tan(39) 0.8098
+ set _tan(40) 0.8391
+ set _tan(41) 0.8693
+ set _tan(42) 0.9004
+ set _tan(43) 0.9325
+ set _tan(44) 0.9657
+ set _tan(45) 1.0
+}
+
+# ----------------------------------------------------------------------
+# CONSTRUCTOR
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Tab::constructor {args} {
+
+ set _canvas [lindex $args 0]
+ set args [lrange $args 1 [llength $args]]
+
+ set _darkShadow [iwidgets::colors::bottomShadow $selectbackground]
+ set _lightShadow [iwidgets::colors::topShadow $selectbackground]
+
+ if { $args != "" } {
+ eval configure $args
+ }
+}
+
+# ----------------------------------------------------------------------
+# DESTRUCTOR
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Tab::destructor {} {
+ if { [winfo exists $_canvas] } {
+ $_canvas delete $this
+ }
+}
+
+# ----------------------------------------------------------------------
+# OPTIONS
+# ----------------------------------------------------------------------
+#
+# Note, we trip _configTripped for every option that requires the tab
+# to be remade.
+#
+# ----------------------------------------------------------------------
+# OPTION -bevelamount
+#
+# Specifies the size of tab corners. A value of 0 with angle set
+# to 0 results in square tabs. A bevelAmount of 4, means that the
+# tab will be drawn with angled corners that cut in 4 pixels from
+# the edge of the tab. The default is 0.
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tab::bevelamount {
+}
+
+# ----------------------------------------------------------------------
+# OPTION -state
+#
+# sets the active state of the tab. specifying normal allows
+# the tab to be selectable. Specifying disabled disables the tab,
+# causing its image, bitmap, or label to be drawn with the
+# disabledForeground color.
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tab::state {
+}
+
+# ----------------------------------------------------------------------
+# OPTION -height
+#
+# the height of the tab. if 0, uses the font label height.
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tab::height {
+ set _height [winfo pixels $_canvas $height]
+ set _configTripped true
+}
+
+# ----------------------------------------------------------------------
+# OPTION -width
+#
+# The width of the tab. If 0, uses the font label width.
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tab::width {
+ set _width [winfo pixels $_canvas $width]
+ set _configTripped true
+}
+
+# ----------------------------------------------------------------------
+# OPTION -anchor
+#
+# Where the text in the tab will be anchored: n,nw,ne,s,sw,se,e,w,center
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tab::anchor {
+}
+
+# ----------------------------------------------------------------------
+# OPTION -left
+#
+# Specifies the left edge of the tab's bounding box. This value
+# may have any of the forms acceptable to Tk_GetPixels.
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tab::left {
+
+ # get into pixels
+ set _left [winfo pixels $_canvas $left]
+
+ # move by offset from last setting
+ $_canvas move $this [expr {$_left - $_oldLeft}] 0
+
+ # update old for next time
+ set _oldLeft $_left
+}
+
+# ----------------------------------------------------------------------
+# OPTION -top
+#
+# Specifies the topedge of the tab's bounding box. This value may
+# have any of the forms acceptable to Tk_GetPixels.
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tab::top {
+
+ # get into pixels
+ set _top [winfo pixels $_canvas $top]
+
+ # move by offset from last setting
+ $_canvas move $this 0 [expr {$_top - $_oldTop}]
+
+ # update old for next time
+ set _oldTop $_top
+}
+
+# ----------------------------------------------------------------------
+# OPTION -image
+#
+# Specifies the imageto display in the tab.
+# Images are created with the image create command.
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tab::image {
+ set _configTripped true
+}
+
+# ----------------------------------------------------------------------
+# OPTION -bitmap
+#
+# If bitmap is an empty string, specifies the bitmap to display in
+# the tab. Bitmap may be of any of the forms accepted by Tk_GetBitmap.
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tab::bitmap {
+ set _configTripped true
+}
+
+# ----------------------------------------------------------------------
+# OPTION -label
+#
+# If image is an empty string and bitmap is an empty string,
+# it specifies a text string to be placed in the tab's label.
+# This label serves as an additional identifier used to reference
+# the tab. Label may be used for the index value in widget commands.
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tab::label {
+ set _configTripped true
+}
+
+# ----------------------------------------------------------------------
+# OPTION -padx
+#
+# Horizontal padding around the label (text, image, or bitmap).
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tab::padx {
+ set _configTripped true
+ set _padX [winfo pixels $_canvas $padx]
+}
+
+# ----------------------------------------------------------------------
+# OPTION -pady
+#
+# Vertical padding around the label (text, image, or bitmap).
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tab::pady {
+ set _configTripped true
+ set _padY [winfo pixels $_canvas $pady]
+}
+
+# ----------------------------------------------------------------------
+# OPTION -selectbackground
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tab::selectbackground {
+ set _darkShadow [iwidgets::colors::bottomShadow $selectbackground]
+ set _lightShadow [iwidgets::colors::topShadow $selectbackground]
+
+ if { $_selected } {
+ _selectNoRaise
+ } else {
+ _deselectNoLower
+ }
+}
+
+# ----------------------------------------------------------------------
+# OPTION -selectforeground
+#
+# Foreground of tab when selected
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tab::selectforeground {
+ if { $_selected } {
+ _selectNoRaise
+ } else {
+ _deselectNoLower
+ }
+}
+
+# ----------------------------------------------------------------------
+# OPTION -disabledforeground
+#
+# Background of tab when -state is disabled
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tab::disabledforeground {
+ if { $_selected } {
+ _selectNoRaise
+ } else {
+ _deselectNoLower
+ }
+}
+
+# ----------------------------------------------------------------------
+# OPTION -background
+#
+# Normal background of tab.
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tab::background {
+
+ if { $_selected } {
+ _selectNoRaise
+ } else {
+ _deselectNoLower
+ }
+
+}
+
+# ----------------------------------------------------------------------
+# OPTION -foreground
+#
+# Foreground of tabs when in normal unselected state
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tab::foreground {
+ if { $_selected } {
+ _selectNoRaise
+ } else {
+ _deselectNoLower
+ }
+}
+
+# ----------------------------------------------------------------------
+# OPTION -orient
+#
+# Specifies the orientation of the tab. Orient can be either
+# horizontal or vertical.
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tab::orient {
+ set _configTripped true
+}
+
+# ----------------------------------------------------------------------
+# OPTION -invert
+#
+# Specifies the direction to draw the tab. If invert is true,
+# it draws horizontal tabs upside down and vertical tabs opening
+# to the left (pointing right). The value may have any of the
+# forms accepted by the Tcl_GetBoolean, such as true,
+# false, 0, 1, yes, or no.
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tab::invert {
+ set _configTripped true
+}
+
+# ----------------------------------------------------------------------
+# OPTION -angle
+#
+# Specifes the angle of slope from the inner edge to the outer edge
+# of the tab. An angle of 0 specifies square tabs. Valid ranges are
+# 0 to 45 degrees inclusive. Default is 15 degrees. If this option
+# is specified as an empty string (the default), then the angle
+# option for the overall Tabset is used.
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tab::angle {
+ if {$angle < 0 || $angle > 45 } {
+ error "bad angle: must be between 0 and 45"
+ }
+ set _configTripped true
+}
+
+# ----------------------------------------------------------------------
+# OPTION -font
+#
+# Font for tab text.
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tab::font {
+}
+
+
+# ----------------------------------------------------------------------
+# OPTION -tabborders
+#
+# Specifies whether to draw the borders of a deselected tab.
+# Specifying true (the default) draws these borders,
+# specifying false disables this drawing. If the tab is in
+# its selected state this option has no effect.
+# The value may have any of the forms accepted by the
+# Tcl_GetBoolean, such as true, false, 0, 1, yes, or no.
+# ----------------------------------------------------------------------
+itcl::configbody iwidgets::Tab::tabborders {
+ set _configTripped true
+}
+
+# ----------------------------------------------------------------------
+# METHOD: configure ?option value?
+#
+# Configures the Tab, checks a configTripped flag to see if the tab
+# needs to be remade. We take the easy way since it is so inexpensive
+# to delete canvas items and remake them.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Tab::configure {args} {
+ set len [llength $args]
+
+ switch $len {
+ 0 {
+ set result [_itk_config]
+ return $result
+ }
+ 1 {
+ set result [eval _itk_config $args]
+ return $result
+ }
+ default {
+ eval _itk_config $args
+ if { $_configTripped } {
+ _makeTab
+ set _configTripped false
+ }
+ return ""
+ }
+ }
+}
+
+# ----------------------------------------------------------------------
+# METHOD: bbox
+#
+# Returns the bounding box of the tab
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Tab::bbox {} {
+ return [lappend bbox $_left $_top $_right $_bottom]
+}
+# ----------------------------------------------------------------------
+# METHOD: deselect
+#
+# Causes the given tab to be drawn as deselected and lowered
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Tab::deselect {} {
+ global tcl_platform
+ $_canvas lower $this
+
+ if {$tcl_platform(os) == "HP-UX"} {
+ update idletasks
+ }
+
+ _deselectNoLower
+}
+
+# ----------------------------------------------------------------------
+# METHOD: lower
+#
+# Lowers the tab below all others in the canvas.
+#
+# This is used as our tag name on the canvas.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Tab::lower {} {
+ $_canvas lower $this
+}
+
+# ----------------------------------------------------------------------
+# METHOD: majordim
+#
+# Returns the width for horizontal tabs and the height for
+# vertical tabs.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Tab::majordim {} {
+ return $_majorDim
+}
+
+# ----------------------------------------------------------------------
+# METHOD: minordim
+#
+# Returns the height for horizontal tabs and the width for
+# vertical tabs.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Tab::minordim {} {
+ return $_minorDim
+}
+
+# ----------------------------------------------------------------------
+# METHOD: offset
+#
+# Returns the width less the angle offset. This allows a
+# geometry manager to ask where to place a sibling tab.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Tab::offset {} {
+ return $_offset
+}
+
+# ----------------------------------------------------------------------
+# METHOD: raise
+#
+# Raises the tab above all others in the canvas.
+#
+# This is used as our tag name on the canvas.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Tab::raise {} {
+ $_canvas raise $this
+}
+
+# ----------------------------------------------------------------------
+# METHOD: select
+#
+# Causes the given tab to be drawn as selected. 3d shadows are
+# turned on and top line and top line shadow are drawn in sel
+# bg color to hide them.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Tab::select {} {
+ global tcl_platform
+ $_canvas raise $this
+
+ if {$tcl_platform(os) == "HP-UX"} {
+ update idletasks
+ }
+
+ _selectNoRaise
+}
+
+# ----------------------------------------------------------------------
+# METHOD: labelheight
+#
+# Returns the height of the tab's label in its current font.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Tab::labelheight {} {
+ if {$_gLabel != 0} {
+ set labelBBox [$_canvas bbox $_gLabel]
+ set labelHeight [expr {[lindex $labelBBox 3] - [lindex $labelBBox 1]}]
+ } else {
+ set labelHeight 0
+ }
+ return $labelHeight
+}
+
+# ----------------------------------------------------------------------
+# METHOD: labelwidth
+#
+# Returns the width of the tab's label in its current font.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Tab::labelwidth {} {
+ if {$_gLabel != 0} {
+ set labelBBox [$_canvas bbox $_gLabel]
+ set labelWidth [expr {[lindex $labelBBox 2] - [lindex $labelBBox 0]}]
+ } else {
+ set labelWidth 0
+ }
+ return $labelWidth
+}
+
+# ----------------------------------------------------------------------
+# PRIVATE METHOD: _selectNoRaise
+#
+# Draws tab as selected without raising it.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Tab::_selectNoRaise {} {
+ if { ! [info exists _gRegion] } {
+ return
+ }
+
+ $_canvas itemconfigure $_gRegion -fill $selectbackground
+ $_canvas itemconfigure $_gTopLine -fill $selectbackground
+ $_canvas itemconfigure $_gTopLineShadow -fill $selectbackground
+ $_canvas itemconfigure $_gLightShadow -fill $_lightShadow
+ $_canvas itemconfigure $_gDarkShadow -fill $_darkShadow
+
+ if { $_gLightOutline != {} } {
+ $_canvas itemconfigure $_gLightOutline -fill $_lightShadow
+ }
+ if { $_gBlackOutline != {} } {
+ $_canvas itemconfigure $_gBlackOutline -fill black
+ }
+
+ if { $state == "normal" } {
+ if { $image != {}} {
+ # do nothing for now
+ } elseif { $bitmap != {}} {
+ $_canvas itemconfigure $_gLabel \
+ -foreground $selectforeground \
+ -background $selectbackground
+ } else {
+ $_canvas itemconfigure $_gLabel -fill $selectforeground
+ }
+ } else {
+ if { $image != {}} {
+ # do nothing for now
+ } elseif { $bitmap != {}} {
+ $_canvas itemconfigure $_gLabel \
+ -foreground $disabledforeground \
+ -background $selectbackground
+ } else {
+ $_canvas itemconfigure $_gLabel -fill $disabledforeground
+ }
+ }
+
+ set _selected true
+}
+
+# ----------------------------------------------------------------------
+# PRIVATE METHOD: _deselectNoLower
+#
+# Causes the given tab to be drawn as deselected. 3d shadows are
+# removed and top line and top line shadow are drawn in visible
+# colors to reveal them.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Tab::_deselectNoLower {} {
+ if { ! [info exists _gRegion] } {
+ return
+ }
+
+ $_canvas itemconfigure $_gRegion -fill $background
+ $_canvas itemconfigure $_gTopLine -fill black
+ $_canvas itemconfigure $_gTopLineShadow -fill $_darkShadow
+ $_canvas itemconfigure $_gLightShadow -fill $background
+ $_canvas itemconfigure $_gDarkShadow -fill $background
+
+ if { $tabborders } {
+ if { $_gLightOutline != {} } {
+ $_canvas itemconfigure $_gLightOutline -fill $_lightShadow
+ }
+ if { $_gBlackOutline != {} } {
+ $_canvas itemconfigure $_gBlackOutline -fill black
+ }
+ } else {
+ if { $_gLightOutline != {} } {
+ $_canvas itemconfigure $_gLightOutline -fill $background
+ }
+ if { $_gBlackOutline != {} } {
+ $_canvas itemconfigure $_gBlackOutline -fill $background
+ }
+ }
+
+
+ if { $state == "normal" } {
+ if { $image != {}} {
+ # do nothing for now
+ } elseif { $bitmap != {}} {
+ $_canvas itemconfigure $_gLabel \
+ -foreground $foreground \
+ -background $background
+ } else {
+ $_canvas itemconfigure $_gLabel -fill $foreground
+ }
+ } else {
+ if { $image != {}} {
+ # do nothing for now
+ } elseif { $bitmap != {}} {
+ $_canvas itemconfigure $_gLabel \
+ -foreground $disabledforeground \
+ -background $background
+ } else {
+ $_canvas itemconfigure $_gLabel -fill $disabledforeground
+ }
+ }
+
+ set _selected false
+}
+
+# ----------------------------------------------------------------------
+# PRIVATE METHOD: _makeTab
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Tab::_makeTab {} {
+ if { $orient == "horizontal" } {
+ if { $invert } {
+ _makeNorthTab $_canvas
+ } else {
+ _makeSouthTab $_canvas
+ }
+ } elseif { $orient == "vertical" } {
+ if { $invert } {
+ _makeEastTab $_canvas
+ } else {
+ _makeWestTab $_canvas
+ }
+ } else {
+ error "bad value for option -orient"
+ }
+}
+
+# ----------------------------------------------------------------------
+# PRIVATE METHOD: _createLabel
+#
+# Creates the label for the tab. Can be either a text label
+# or a bitmap label.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Tab::_createLabel {canvas tagList} {
+ if { $image != {}} {
+ set _gLabel [$canvas create image \
+ 0 0 \
+ -image $image \
+ -anchor nw \
+ -tags $tagList \
+ ]
+ } elseif { $bitmap != {}} {
+ set _gLabel [$canvas create bitmap \
+ 0 0 \
+ -bitmap $bitmap \
+ -anchor nw \
+ -tags $tagList \
+ ]
+ } else {
+ set _gLabel [$canvas create text \
+ 0 0 \
+ -text $label \
+ -font $font \
+ -anchor nw \
+ -tags $tagList \
+ ]
+ }
+}
+
+# ----------------------------------------------------------------------
+# PRIVATE METHOD: _makeEastTab
+#
+# Makes a tab that hangs to the east and opens to the west.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Tab::_makeEastTab {canvas} {
+ $canvas delete $this
+ set _gLightOutline {}
+ set _gBlackOutline {}
+
+ lappend tagList $this TAB
+
+ _createLabel $canvas $tagList
+
+ _calcLabelDim $_gLabel
+
+
+ set right [expr {$_left + $_labelWidth}]
+ # now have _left, _top, right...
+
+ # Turn off calculating angle tabs on Vertical orientations
+ set angleOffset 0
+
+ set outerTop $_top
+ set outerBottom \
+ [expr {$outerTop + $angleOffset + $_labelHeight + $angleOffset}]
+ set innerTop [expr {$outerTop + $angleOffset}]
+ set innerBottom [expr {$outerTop + $angleOffset + $_labelHeight}]
+
+ # now have _left, _top, right, outerTop, innerTop,
+ # innerBottom, outerBottom, width, height
+
+ set bottom $innerBottom
+ # tab area... gets filled either white or selected
+ # done
+ set _gRegion [$canvas create polygon \
+ $_left $outerTop \
+ [expr {$right - $bevelamount}] $innerTop \
+ $right [expr {$innerTop + $bevelamount}] \
+ $right [expr {$innerBottom - $bevelamount}] \
+ [expr {$right - $bevelamount}] $innerBottom \
+ $_left $outerBottom \
+ $_left $outerTop \
+ -tags $tagList \
+ ]
+
+ # lighter shadow (left edge)
+ set _gLightShadow [$canvas create line \
+ [expr {$_left - 3}] [expr {$outerTop + 1}] \
+ [expr {$right - $bevelamount}] [expr {$innerTop + 1}] \
+ -tags $tagList \
+ ]
+
+ # darker shadow (bottom and right edges)
+ set _gDarkShadow [$canvas create line \
+ [expr {$right - $bevelamount}] [expr {$innerTop + 1}] \
+ [expr {$right - 1}] [expr {$innerTop + $bevelamount}] \
+ [expr {$right - 1}] [expr {$innerBottom - $bevelamount}] \
+ [expr {$right - $bevelamount}] [expr {$innerBottom - 1}] \
+ [expr {$_left - 3}] [expr {$outerBottom - 1}] \
+ -tags $tagList \
+ ]
+
+ # outline of tab
+ set _gLightOutline [$canvas create line \
+ $_left $outerTop \
+ [expr {$right - $bevelamount}] $innerTop \
+ -tags $tagList \
+ ]
+ # outline of tab
+ set _gBlackOutline [$canvas create line \
+ [expr {$right - $bevelamount}] $innerTop \
+ $right [expr {$innerTop + $bevelamount}] \
+ $right [expr {$innerBottom - $bevelamount}] \
+ [expr {$right - $bevelamount}] $innerBottom \
+ $_left $outerBottom \
+ $_left $outerTop \
+ -tags $tagList \
+ ]
+
+ # line closest to the edge
+ set _gTopLineShadow [$canvas create line \
+ $_left $outerTop \
+ $_left $outerBottom \
+ -tags $tagList \
+ ]
+
+ # next line down
+ set _gTopLine [$canvas create line \
+ [expr {$_left + 1}] [expr {$outerTop + 2}] \
+ [expr {$_left + 1}] [expr {$outerBottom - 1}] \
+ -tags $tagList \
+ ]
+
+ $canvas coords $_gLabel [expr {$_left + $_labelXOrigin}] \
+ [expr {$innerTop + $_labelYOrigin}]
+
+ if { $image != {} || $bitmap != {} } {
+ $canvas itemconfigure $_gLabel -anchor $anchor
+ } else {
+ $canvas itemconfigure $_gLabel -anchor $anchor -justify $_just
+ }
+
+ $canvas raise $_gLabel $_gRegion
+
+
+ set _offset [expr {$innerBottom - $outerTop}]
+ # height
+ set _majorDim [expr {$outerBottom - $outerTop}]
+ # width
+ set _minorDim [expr {$right - $_left}]
+
+ set _right $right
+ set _bottom $outerBottom
+
+ # draw in correct state...
+ if { $_selected } {
+ select
+ } else {
+ deselect
+ }
+}
+
+# ----------------------------------------------------------------------
+# PRIVATE METHOD: _makeWestTab
+#
+# Makes a tab that hangs to the west and opens to the east.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Tab::_makeWestTab {canvas} {
+ $canvas delete $this
+ set _gLightOutline {}
+ set _gBlackOutline {}
+
+ lappend tagList $this TAB
+
+ _createLabel $canvas $tagList
+ _calcLabelDim $_gLabel
+
+ set right [expr {$_left + $_labelWidth}]
+ # now have _left, _top, right...
+
+ # Turn off calculating angle tabs on Vertical orientations
+ set angleOffset 0
+
+ set outerTop $_top
+ set outerBottom \
+ [expr {$outerTop + $angleOffset + $_labelHeight + $angleOffset}]
+ set innerTop [expr {$outerTop + $angleOffset}]
+ set innerBottom [expr {$outerTop + $angleOffset + $_labelHeight}]
+
+ # now have _left, _top, right, outerTop, innerTop,
+ # innerBottom, outerBottom, width, height
+
+ # tab area... gets filled either white or selected
+ # done
+ set _gRegion [$canvas create polygon \
+ $right $outerTop \
+ [expr {$_left + $bevelamount}] $innerTop \
+ $_left [expr {$innerTop + $bevelamount}] \
+ $_left [expr {$innerBottom - $bevelamount}]\
+ [expr {$_left + $bevelamount}] $innerBottom \
+ $right $outerBottom \
+ $right $outerTop \
+ -tags $tagList \
+ ]
+ # lighter shadow (left edge)
+ set _gLightShadow [$canvas create line \
+ $right [expr {$outerTop+1}] \
+ [expr {$_left + $bevelamount}] [expr {$innerTop + 1}] \
+ [expr {$_left + 1}] [expr {$innerTop + $bevelamount}] \
+ [expr {$_left + 1}] [expr {$innerBottom - $bevelamount}] \
+ -tags $tagList \
+ ]
+
+ # darker shadow (bottom and right edges)
+ set _gDarkShadow [$canvas create line \
+ [expr {$_left + 1}] [expr {$innerBottom - $bevelamount}] \
+ [expr {$_left + $bevelamount}] [expr {$innerBottom - 1}] \
+ $right [expr {$outerBottom - 1}] \
+ -tags $tagList \
+ ]
+
+ # outline of tab -- lighter top left sides
+ set _gLightOutline [$canvas create line \
+ $right $outerTop \
+ [expr {$_left + $bevelamount}] $innerTop \
+ $_left [expr {$innerTop + $bevelamount}] \
+ $_left [expr {$innerBottom - $bevelamount}]\
+ -tags $tagList \
+ ]
+ # outline of tab -- darker bottom side
+ set _gBlackOutline [$canvas create line \
+ $_left [expr {$innerBottom - $bevelamount}]\
+ [expr {$_left + $bevelamount}] $innerBottom \
+ $right $outerBottom \
+ $right $outerTop \
+ -tags $tagList \
+ ]
+
+ # top of tab
+ set _gTopLine [$canvas create line \
+ [expr {$right + 1}] $outerTop \
+ [expr {$right + 1}] $outerBottom \
+ -tags $tagList \
+ ]
+
+ # line below top of tab
+ set _gTopLineShadow [$canvas create line \
+ $right $outerTop \
+ $right $outerBottom \
+ -tags $tagList \
+ ]
+
+ $canvas coords $_gLabel [expr {$_left + $_labelXOrigin}] \
+ [expr {$innerTop + $_labelYOrigin}]
+ if { $image != {} || $bitmap != {} } {
+ $canvas itemconfigure $_gLabel -anchor $anchor
+ } else {
+ $canvas itemconfigure $_gLabel -anchor $anchor -justify $_just
+ }
+
+ $canvas raise $_gLabel $_gRegion
+
+
+ set _offset [expr {$innerBottom - $outerTop}]
+ # height
+ set _majorDim [expr {$outerBottom - $outerTop}]
+ # width
+ set _minorDim [expr {$right - $_left}]
+
+ set _right $right
+ set _bottom $outerBottom
+
+ # draw in correct state...
+ if { $_selected } {
+ select
+ } else {
+ deselect
+ }
+
+}
+
+# ----------------------------------------------------------------------
+# PRIVATE METHOD: _makeNorthTab
+#
+# Makes a tab that hangs to the north and opens to the south.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Tab::_makeNorthTab {canvas} {
+ $canvas delete $this
+ set _gLightOutline {}
+ set _gBlackOutline {}
+
+ lappend tagList $this TAB
+
+ _createLabel $canvas $tagList
+
+ # first get the label width and height
+ _calcLabelDim $_gLabel
+
+ set bottom [expr {$_top + $_labelHeight}]
+
+ set angleOffset [expr {$_labelHeight * $_tan($angle)}]
+
+ set outerLeft $_left
+ set outerRight \
+ [expr {$outerLeft + $angleOffset + $_labelWidth + $angleOffset}]
+ set innerLeft [expr {$outerLeft + $angleOffset}]
+ set innerRight [expr {$outerLeft + $angleOffset + $_labelWidth}]
+
+ # tab area... gets filled either white or selected
+ set _gRegion [$canvas create polygon \
+ $outerLeft [expr {$bottom + 3}] \
+ $innerLeft [expr {$_top + $bevelamount}] \
+ [expr {$innerLeft + $bevelamount}] $_top \
+ [expr {$innerRight - $bevelamount}] $_top \
+ $innerRight [expr {$_top + $bevelamount}]\
+ $outerRight [expr {$bottom + 3}] \
+ $outerLeft [expr {$bottom + 3}] \
+ -tags $tagList \
+ ]
+
+ # lighter shadow (left edge)
+ set _gLightShadow [$canvas create line \
+ [expr {$outerLeft + 1}] [expr {$bottom + 3}] \
+ [expr {$innerLeft + 1}] [expr {$_top + $bevelamount}] \
+ [expr {$innerLeft + $bevelamount}] [expr {$_top + 1}]\
+ [expr {$innerRight - $bevelamount}] [expr {$_top + 1}]\
+ -tags $tagList \
+ ]
+
+ # darker shadow (bottom and right edges)
+ set _gDarkShadow [$canvas create line \
+ [expr {$innerRight - $bevelamount}] [expr {$_top + 1}]\
+ [expr {$innerRight - 1}] [expr {$_top + $bevelamount}]\
+ [expr {$outerRight - 1}] [expr {$bottom + 3}]\
+ -tags $tagList \
+ ]
+
+ set _gLightOutline [$canvas create line \
+ $outerLeft [expr {$bottom + 3}] \
+ $innerLeft [expr {$_top + $bevelamount}] \
+ [expr {$innerLeft + $bevelamount}] $_top \
+ [expr {$innerRight - $bevelamount}] $_top \
+ -tags $tagList \
+ ]
+
+ set _gBlackOutline [$canvas create line \
+ [expr {$innerRight - $bevelamount}] $_top \
+ $innerRight [expr {$_top + $bevelamount}]\
+ $outerRight [expr {$bottom + 3}] \
+ $outerLeft [expr {$bottom + 3}] \
+ -tags $tagList \
+ ]
+
+ # top of tab... to make it closed off
+ set _gTopLine [$canvas create line \
+ 0 0 0 0\
+ -tags $tagList \
+ ]
+
+ # top of tab... to make it closed off
+ set _gTopLineShadow [$canvas create line \
+ 0 0 0 0 \
+ -tags $tagList \
+ ]
+
+ $canvas coords $_gLabel [expr {$innerLeft + $_labelXOrigin}] \
+ [expr {$_top + $_labelYOrigin}]
+
+ if { $image != {} || $bitmap != {} } {
+ $canvas itemconfigure $_gLabel -anchor $anchor
+ } else {
+ $canvas itemconfigure $_gLabel -anchor $anchor -justify $_just
+ }
+
+ $canvas raise $_gLabel $_gRegion
+
+
+ set _offset [expr {$innerRight - $outerLeft}]
+ # width
+ set _majorDim [expr {$outerRight - $outerLeft}]
+ # height
+ set _minorDim [expr {$bottom - $_top}]
+
+ set _right $outerRight
+ set _bottom $bottom
+
+ # draw in correct state...
+ if { $_selected } {
+ select
+ } else {
+ deselect
+ }
+}
+
+# ----------------------------------------------------------------------
+# PRIVATE METHOD: _makeSouthTab
+#
+# Makes a tab that hangs to the south and opens to the north.
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Tab::_makeSouthTab {canvas} {
+ $canvas delete $this
+ set _gLightOutline {}
+ set _gBlackOutline {}
+
+ lappend tagList $this TAB
+
+ _createLabel $canvas $tagList
+
+ # first get the label width and height
+ _calcLabelDim $_gLabel
+
+ set bottom [expr {$_top + $_labelHeight}]
+
+ set angleOffset [expr {$_labelHeight * $_tan($angle)}]
+
+ set outerLeft $_left
+ set outerRight \
+ [expr {$outerLeft + $angleOffset + $_labelWidth + $angleOffset}]
+ set innerLeft [expr {$outerLeft + $angleOffset}]
+ set innerRight [expr {$outerLeft + $angleOffset + $_labelWidth}]
+
+ # tab area... gets filled either white or selected
+ set _gRegion [$canvas create polygon \
+ $outerLeft [expr {$_top + 1}] \
+ $innerLeft [expr {$bottom - $bevelamount}]\
+ [expr {$innerLeft + $bevelamount}] $bottom \
+ [expr {$innerRight - $bevelamount}] $bottom \
+ $innerRight [expr {$bottom - $bevelamount}]\
+ $outerRight [expr {$_top + 1}] \
+ $outerLeft [expr {$_top + 1}] \
+ -tags $tagList \
+ ]
+
+
+ # lighter shadow (left edge)
+ set _gLightShadow [$canvas create line \
+ [expr {$outerLeft+1}] $_top \
+ [expr {$innerLeft+1}] [expr {$bottom-$bevelamount}] \
+ -tags $tagList \
+ ]
+
+ # darker shadow (bottom and right edges)
+ set _gDarkShadow [$canvas create line \
+ [expr {$innerLeft+1}] [expr {$bottom-$bevelamount}] \
+ [expr {$innerLeft+$bevelamount}] [expr {$bottom-1}] \
+ [expr {$innerRight-$bevelamount}] [expr {$bottom-1}] \
+ [expr {$innerRight-1}] [expr {$bottom-$bevelamount}] \
+ [expr {$outerRight-1}] [expr {$_top + 1}] \
+ -tags $tagList \
+ ]
+ # outline of tab
+ set _gBlackOutline [$canvas create line \
+ $outerLeft [expr {$_top + 1}] \
+ $innerLeft [expr {$bottom -$bevelamount}]\
+ [expr {$innerLeft + $bevelamount}] $bottom \
+ [expr {$innerRight - $bevelamount}] $bottom \
+ $innerRight [expr {$bottom - $bevelamount}]\
+ $outerRight [expr {$_top + 1}] \
+ -tags $tagList \
+ ]
+
+ # top of tab... to make it closed off
+ set _gTopLine [$canvas create line \
+ $outerLeft [expr {$_top + 1}] \
+ $outerRight [expr {$_top + 1}] \
+ -tags $tagList \
+ ]
+
+ # top of tab... to make it closed off
+ set _gTopLineShadow [$canvas create line \
+ $outerLeft $_top \
+ $outerRight $_top \
+ -tags $tagList \
+ ]
+
+ $canvas coords $_gLabel [expr {$innerLeft + $_labelXOrigin}] \
+ [expr {$_top + $_labelYOrigin}]
+
+ if { $image != {} || $bitmap != {} } {
+ $canvas itemconfigure $_gLabel -anchor $anchor
+ } else {
+ $canvas itemconfigure $_gLabel -anchor $anchor -justify $_just
+ }
+ $canvas raise $_gLabel $_gRegion
+
+
+ set _offset [expr {$innerRight - $outerLeft}]
+
+ # width
+ set _majorDim [expr {$outerRight - $outerLeft}]
+
+ # height
+ set _minorDim [expr {$bottom - $_top}]
+
+ set _right $outerRight
+ set _bottom $bottom
+
+ # draw in correct state...
+ if { $_selected } {
+ select
+ } else {
+ deselect
+ }
+}
+
+# ----------------------------------------------------------------------
+# PRIVATE METHOD: _calcLabelDim
+#
+# Calculate the width and height of the label bbox of labelItem
+# can be either text or bitmap (in future also an image)
+#
+# There are two ways to calculate the label bbox.
+#
+# First, if the $_width and/or $_height is specified, we will use
+# it to determine that dimension(s) width and/or height. For
+# a width/height of 0 we use the labels bbox to
+# give us a base width/height.
+# Then we add in the padx/pady to determine final bounds.
+#
+# Uses the following option or option derived variables:
+# -padx ($_padX - converted to pixels)
+# -pady ($_padY - converted to pixels)
+# -anchor ($anchor)
+# -width ($_width) This is the width for inside tab (label area)
+# -height ($_height) This is the width for inside tab (label area)
+#
+# Side Effects:
+# _labelWidth will be set
+# _labelHeight will be set
+# _labelXOrigin will be set
+# _labelYOrigin will be set
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Tab::_calcLabelDim {labelItem} {
+ # ... calculate the label width and height
+ set labelBBox [$_canvas bbox $labelItem]
+
+ if { $_width > 0 } {
+ set _labelWidth [expr {$_width + ($_padX * 2)}]
+ } else {
+ set _labelWidth [expr {
+ ([lindex $labelBBox 2] - [lindex $labelBBox 0]) + ($_padX * 2)}]
+ }
+
+ if { $_height > 0 } {
+ set _labelHeight [expr {$_height + ($_padY * 2)}]
+ } else {
+ set _labelHeight [expr {
+ ([lindex $labelBBox 3] - [lindex $labelBBox 1]) + ($_padY * 2)}]
+ }
+
+ # ... calculate the label anchor point
+ set centerX [expr {$_labelWidth/2.0}]
+ set centerY [expr {$_labelHeight/2.0 - 1}]
+
+ switch $anchor {
+ n {
+ set _labelXOrigin $centerX
+ set _labelYOrigin $_padY
+ set _just center
+ }
+ s {
+ set _labelXOrigin $centerX
+ set _labelYOrigin [expr {$_labelHeight - $_padY}]
+ set _just center
+ }
+ e {
+ set _labelXOrigin [expr {$_labelWidth - $_padX - 1}]
+ set _labelYOrigin $centerY
+ set _just right
+ }
+ w {
+ set _labelXOrigin [expr {$_padX + 2}]
+ set _labelYOrigin $centerY
+ set _just left
+ }
+ c {
+ set _labelXOrigin $centerX
+ set _labelYOrigin $centerY
+ set _just center
+ }
+ ne {
+ set _labelXOrigin [expr {$_labelWidth - $_padX - 1}]
+ set _labelYOrigin $_padY
+ set _just right
+ }
+ nw {
+ set _labelXOrigin [expr {$_padX + 2}]
+ set _labelYOrigin $_padY
+ set _just left
+ }
+ se {
+ set _labelXOrigin [expr {$_labelWidth - $_padX - 1}]
+ set _labelYOrigin [expr {$_labelHeight - $_padY}]
+ set _just right
+ }
+ sw {
+ set _labelXOrigin [expr {$_padX + 2}]
+ set _labelYOrigin [expr {$_labelHeight - $_padY}]
+ set _just left
+ }
+ default {
+ error "bad anchor position: \
+ \"$tabpos\" must be n, ne, nw, s, sw, se, e, w, or center"
+ }
+ }
+}
diff --git a/iwidgets/generic/tclIndex b/iwidgets/generic/tclIndex
new file mode 100644
index 00000000000..f1403ac6b33
--- /dev/null
+++ b/iwidgets/generic/tclIndex
@@ -0,0 +1,1372 @@
+# Tcl autoload index file, version 2.0
+# This file is generated by the "auto_mkindex" command
+# and sourced to set up indexing information for one or
+# more commands. Typically each line is a command that
+# sets an element in the auto_index array, where the
+# element name is the name of a command and the value is
+# a script that loads the command.
+
+set auto_index(::iwidgets::Extbutton) [list source [file join $dir extbutton.itk]]
+set auto_index(::iwidgets::extbutton) [list source [file join $dir extbutton.itk]]
+set auto_index(::iwidgets::Extbutton::bd) [list source [file join $dir extbutton.itk]]
+set auto_index(::iwidgets::Extbutton::bitmap) [list source [file join $dir extbutton.itk]]
+set auto_index(::iwidgets::Extbutton::command) [list source [file join $dir extbutton.itk]]
+set auto_index(::iwidgets::Extbutton::defaultring) [list source [file join $dir extbutton.itk]]
+set auto_index(::iwidgets::Extbutton::defaultringpad) [list source [file join $dir extbutton.itk]]
+set auto_index(::iwidgets::Extbutton::image) [list source [file join $dir extbutton.itk]]
+set auto_index(::iwidgets::Extbutton::imagepos) [list source [file join $dir extbutton.itk]]
+set auto_index(::iwidgets::Extbutton::relief) [list source [file join $dir extbutton.itk]]
+set auto_index(::iwidgets::Extbutton::state) [list source [file join $dir extbutton.itk]]
+set auto_index(::iwidgets::Extbutton::text) [list source [file join $dir extbutton.itk]]
+set auto_index(::iwidgets::Extbutton::constructor) [list source [file join $dir extbutton.itk]]
+set auto_index(::iwidgets::Extbutton::flash) [list source [file join $dir extbutton.itk]]
+set auto_index(::iwidgets::Extbutton::changeColor) [list source [file join $dir extbutton.itk]]
+set auto_index(::iwidgets::Extbutton::sink) [list source [file join $dir extbutton.itk]]
+set auto_index(::iwidgets::Buttonbox) [list source [file join $dir buttonbox.itk]]
+set auto_index(::iwidgets::buttonbox) [list source [file join $dir buttonbox.itk]]
+set auto_index(::iwidgets::Buttonbox::constructor) [list source [file join $dir buttonbox.itk]]
+set auto_index(::iwidgets::Buttonbox::destructor) [list source [file join $dir buttonbox.itk]]
+set auto_index(::iwidgets::Buttonbox::pady) [list source [file join $dir buttonbox.itk]]
+set auto_index(::iwidgets::Buttonbox::padx) [list source [file join $dir buttonbox.itk]]
+set auto_index(::iwidgets::Buttonbox::orient) [list source [file join $dir buttonbox.itk]]
+set auto_index(::iwidgets::Buttonbox::index) [list source [file join $dir buttonbox.itk]]
+set auto_index(::iwidgets::Buttonbox::add) [list source [file join $dir buttonbox.itk]]
+set auto_index(::iwidgets::Buttonbox::insert) [list source [file join $dir buttonbox.itk]]
+set auto_index(::iwidgets::Buttonbox::delete) [list source [file join $dir buttonbox.itk]]
+set auto_index(::iwidgets::Buttonbox::default) [list source [file join $dir buttonbox.itk]]
+set auto_index(::iwidgets::Buttonbox::hide) [list source [file join $dir buttonbox.itk]]
+set auto_index(::iwidgets::Buttonbox::show) [list source [file join $dir buttonbox.itk]]
+set auto_index(::iwidgets::Buttonbox::invoke) [list source [file join $dir buttonbox.itk]]
+set auto_index(::iwidgets::Buttonbox::buttonconfigure) [list source [file join $dir buttonbox.itk]]
+set auto_index(::iwidgets::Buttonbox::buttoncget) [list source [file join $dir buttonbox.itk]]
+set auto_index(::iwidgets::Buttonbox::_getMaxWidth) [list source [file join $dir buttonbox.itk]]
+set auto_index(::iwidgets::Buttonbox::_getMaxHeight) [list source [file join $dir buttonbox.itk]]
+set auto_index(::iwidgets::Buttonbox::_setBoxSize) [list source [file join $dir buttonbox.itk]]
+set auto_index(::iwidgets::Buttonbox::_positionButtons) [list source [file join $dir buttonbox.itk]]
+set auto_index(::iwidgets::Calendar) [list source [file join $dir calendar.itk]]
+set auto_index(::iwidgets::calendar) [list source [file join $dir calendar.itk]]
+set auto_index(::iwidgets::Calendar::constructor) [list source [file join $dir calendar.itk]]
+set auto_index(::iwidgets::Calendar::command) [list source [file join $dir calendar.itk]]
+set auto_index(::iwidgets::Calendar::days) [list source [file join $dir calendar.itk]]
+set auto_index(::iwidgets::Calendar::backwardimage) [list source [file join $dir calendar.itk]]
+set auto_index(::iwidgets::Calendar::forwardimage) [list source [file join $dir calendar.itk]]
+set auto_index(::iwidgets::Calendar::weekdaybackground) [list source [file join $dir calendar.itk]]
+set auto_index(::iwidgets::Calendar::weekendbackground) [list source [file join $dir calendar.itk]]
+set auto_index(::iwidgets::Calendar::foreground) [list source [file join $dir calendar.itk]]
+set auto_index(::iwidgets::Calendar::outline) [list source [file join $dir calendar.itk]]
+set auto_index(::iwidgets::Calendar::buttonforeground) [list source [file join $dir calendar.itk]]
+set auto_index(::iwidgets::Calendar::selectcolor) [list source [file join $dir calendar.itk]]
+set auto_index(::iwidgets::Calendar::selectthickness) [list source [file join $dir calendar.itk]]
+set auto_index(::iwidgets::Calendar::titlefont) [list source [file join $dir calendar.itk]]
+set auto_index(::iwidgets::Calendar::datefont) [list source [file join $dir calendar.itk]]
+set auto_index(::iwidgets::Calendar::currentdatefont) [list source [file join $dir calendar.itk]]
+set auto_index(::iwidgets::Calendar::dayfont) [list source [file join $dir calendar.itk]]
+set auto_index(::iwidgets::Calendar::startday) [list source [file join $dir calendar.itk]]
+set auto_index(::iwidgets::Calendar::get) [list source [file join $dir calendar.itk]]
+set auto_index(::iwidgets::Calendar::select) [list source [file join $dir calendar.itk]]
+set auto_index(::iwidgets::Calendar::show) [list source [file join $dir calendar.itk]]
+set auto_index(::iwidgets::Calendar::_drawtext) [list source [file join $dir calendar.itk]]
+set auto_index(::iwidgets::Calendar::_configureHandler) [list source [file join $dir calendar.itk]]
+set auto_index(::iwidgets::Calendar::_change) [list source [file join $dir calendar.itk]]
+set auto_index(::iwidgets::Calendar::_redraw) [list source [file join $dir calendar.itk]]
+set auto_index(::iwidgets::Calendar::_days) [list source [file join $dir calendar.itk]]
+set auto_index(::iwidgets::Calendar::_layout) [list source [file join $dir calendar.itk]]
+set auto_index(::iwidgets::Calendar::_adjustday) [list source [file join $dir calendar.itk]]
+set auto_index(::iwidgets::Calendar::_select) [list source [file join $dir calendar.itk]]
+set auto_index(::iwidgets::Calendar::_selectEvent) [list source [file join $dir calendar.itk]]
+set auto_index(::iwidgets::Calendar::_percentSubst) [list source [file join $dir calendar.itk]]
+set auto_index(::iwidgets::Canvasprintbox) [list source [file join $dir canvasprintbox.itk]]
+set auto_index(::iwidgets::canvasprintbox) [list source [file join $dir canvasprintbox.itk]]
+set auto_index(::iwidgets::Canvasprintbox::printregion) [list source [file join $dir canvasprintbox.itk]]
+set auto_index(::iwidgets::Canvasprintbox::output) [list source [file join $dir canvasprintbox.itk]]
+set auto_index(::iwidgets::Canvasprintbox::printcmd) [list source [file join $dir canvasprintbox.itk]]
+set auto_index(::iwidgets::Canvasprintbox::filename) [list source [file join $dir canvasprintbox.itk]]
+set auto_index(::iwidgets::Canvasprintbox::pagesize) [list source [file join $dir canvasprintbox.itk]]
+set auto_index(::iwidgets::Canvasprintbox::orient) [list source [file join $dir canvasprintbox.itk]]
+set auto_index(::iwidgets::Canvasprintbox::stretch) [list source [file join $dir canvasprintbox.itk]]
+set auto_index(::iwidgets::Canvasprintbox::posterize) [list source [file join $dir canvasprintbox.itk]]
+set auto_index(::iwidgets::Canvasprintbox::hpagecnt) [list source [file join $dir canvasprintbox.itk]]
+set auto_index(::iwidgets::Canvasprintbox::vpagecnt) [list source [file join $dir canvasprintbox.itk]]
+set auto_index(::iwidgets::Canvasprintbox::constructor) [list source [file join $dir canvasprintbox.itk]]
+set auto_index(::iwidgets::Canvasprintbox::setcanvas) [list source [file join $dir canvasprintbox.itk]]
+set auto_index(::iwidgets::Canvasprintbox::getoutput) [list source [file join $dir canvasprintbox.itk]]
+set auto_index(::iwidgets::Canvasprintbox::print) [list source [file join $dir canvasprintbox.itk]]
+set auto_index(::iwidgets::Canvasprintbox::refresh) [list source [file join $dir canvasprintbox.itk]]
+set auto_index(::iwidgets::Canvasprintbox::stop) [list source [file join $dir canvasprintbox.itk]]
+set auto_index(::iwidgets::Canvasprintbox::_calc_poster_size) [list source [file join $dir canvasprintbox.itk]]
+set auto_index(::iwidgets::Canvasprintbox::_calc_print_region) [list source [file join $dir canvasprintbox.itk]]
+set auto_index(::iwidgets::Canvasprintbox::_calc_print_scale) [list source [file join $dir canvasprintbox.itk]]
+set auto_index(::iwidgets::Canvasprintbox::_update_canvas) [list source [file join $dir canvasprintbox.itk]]
+set auto_index(::iwidgets::Canvasprintbox::_update_attr) [list source [file join $dir canvasprintbox.itk]]
+set auto_index(::iwidgets::Canvasprintbox::_mapEventHandler) [list source [file join $dir canvasprintbox.itk]]
+set auto_index(::iwidgets::Canvasprintbox::destructor) [list source [file join $dir canvasprintbox.itk]]
+set auto_index(::iwidgets::Canvasprintbox::ezPaperInfo) [list source [file join $dir canvasprintbox.itk]]
+set auto_index(::iwidgets::Canvasprintdialog) [list source [file join $dir canvasprintdialog.itk]]
+set auto_index(::iwidgets::canvasprintdialog) [list source [file join $dir canvasprintdialog.itk]]
+set auto_index(::iwidgets::Canvasprintdialog::constructor) [list source [file join $dir canvasprintdialog.itk]]
+set auto_index(::iwidgets::Canvasprintdialog::deactivate) [list source [file join $dir canvasprintdialog.itk]]
+set auto_index(::iwidgets::Canvasprintdialog::getoutput) [list source [file join $dir canvasprintdialog.itk]]
+set auto_index(::iwidgets::Canvasprintdialog::setcanvas) [list source [file join $dir canvasprintdialog.itk]]
+set auto_index(::iwidgets::Canvasprintdialog::refresh) [list source [file join $dir canvasprintdialog.itk]]
+set auto_index(::iwidgets::Canvasprintdialog::print) [list source [file join $dir canvasprintdialog.itk]]
+set auto_index(::iwidgets::Checkbox) [list source [file join $dir checkbox.itk]]
+set auto_index(::iwidgets::checkbox) [list source [file join $dir checkbox.itk]]
+set auto_index(::iwidgets::Checkbox::constructor) [list source [file join $dir checkbox.itk]]
+set auto_index(::iwidgets::Checkbox::orient) [list source [file join $dir checkbox.itk]]
+set auto_index(::iwidgets::Checkbox::index) [list source [file join $dir checkbox.itk]]
+set auto_index(::iwidgets::Checkbox::add) [list source [file join $dir checkbox.itk]]
+set auto_index(::iwidgets::Checkbox::insert) [list source [file join $dir checkbox.itk]]
+set auto_index(::iwidgets::Checkbox::delete) [list source [file join $dir checkbox.itk]]
+set auto_index(::iwidgets::Checkbox::select) [list source [file join $dir checkbox.itk]]
+set auto_index(::iwidgets::Checkbox::toggle) [list source [file join $dir checkbox.itk]]
+set auto_index(::iwidgets::Checkbox::get) [list source [file join $dir checkbox.itk]]
+set auto_index(::iwidgets::Checkbox::deselect) [list source [file join $dir checkbox.itk]]
+set auto_index(::iwidgets::Checkbox::flash) [list source [file join $dir checkbox.itk]]
+set auto_index(::iwidgets::Checkbox::buttonconfigure) [list source [file join $dir checkbox.itk]]
+set auto_index(::iwidgets::Checkbox::gettag) [list source [file join $dir checkbox.itk]]
+set auto_index(::iwidgets::Combobox) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::combobox) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::constructor) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::destructor) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::arrowrelief) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::completion) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::dropdown) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::editable) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::grab) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::listheight) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::margin) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::popupcursor) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::selectioncommand) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::state) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::unique) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::clear) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::curselection) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::delete) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::get) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::getcurselection) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::invoke) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::insert) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::justify) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::see) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::selection) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::size) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::sort) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::xview) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::yview) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::_addToList) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::_createComponents) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::_deleteList) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::_deleteText) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::_doLayout) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::_drawArrow) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::_dropdownBtnRelease) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::_ignoreNextBtnRelease) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::_next) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::_packComponents) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::_positionList) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::_postList) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::_previous) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::_resizeArrow) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::_selectCmd) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::_toggleList) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::_unpostList) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::_commonBindings) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::_dropdownBindings) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::_simpleBindings) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::_listShowing) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::_slbListbox) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::_stateSelect) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::_bs) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Combobox::_lookup) [list source [file join $dir combobox.itk]]
+set auto_index(::iwidgets::Dateentry) [list source [file join $dir dateentry.itk]]
+set auto_index(::iwidgets::dateentry) [list source [file join $dir dateentry.itk]]
+set auto_index(::iwidgets::Dateentry::constructor) [list source [file join $dir dateentry.itk]]
+set auto_index(::iwidgets::Dateentry::icon) [list source [file join $dir dateentry.itk]]
+set auto_index(::iwidgets::Dateentry::grab) [list source [file join $dir dateentry.itk]]
+set auto_index(::iwidgets::Dateentry::state) [list source [file join $dir dateentry.itk]]
+set auto_index(::iwidgets::Dateentry::_getDefaultIcon) [list source [file join $dir dateentry.itk]]
+set auto_index(::iwidgets::Dateentry::_popup) [list source [file join $dir dateentry.itk]]
+set auto_index(::iwidgets::Dateentry::_getPopupDate) [list source [file join $dir dateentry.itk]]
+set auto_index(::iwidgets::Dateentry::_releaseGrabCheck) [list source [file join $dir dateentry.itk]]
+set auto_index(::iwidgets::Dateentry::_releaseGrab) [list source [file join $dir dateentry.itk]]
+set auto_index(::iwidgets::Datefield) [list source [file join $dir datefield.itk]]
+set auto_index(::iwidgets::datefield) [list source [file join $dir datefield.itk]]
+set auto_index(::iwidgets::Datefield::constructor) [list source [file join $dir datefield.itk]]
+set auto_index(::iwidgets::Datefield::childsitepos) [list source [file join $dir datefield.itk]]
+set auto_index(::iwidgets::Datefield::command) [list source [file join $dir datefield.itk]]
+set auto_index(::iwidgets::Datefield::iq) [list source [file join $dir datefield.itk]]
+set auto_index(::iwidgets::Datefield::get) [list source [file join $dir datefield.itk]]
+set auto_index(::iwidgets::Datefield::show) [list source [file join $dir datefield.itk]]
+set auto_index(::iwidgets::Datefield::isvalid) [list source [file join $dir datefield.itk]]
+set auto_index(::iwidgets::Datefield::_focusIn) [list source [file join $dir datefield.itk]]
+set auto_index(::iwidgets::Datefield::_keyPress) [list source [file join $dir datefield.itk]]
+set auto_index(::iwidgets::Datefield::_setField) [list source [file join $dir datefield.itk]]
+set auto_index(::iwidgets::Datefield::_moveField) [list source [file join $dir datefield.itk]]
+set auto_index(::iwidgets::Datefield::_whichField) [list source [file join $dir datefield.itk]]
+set auto_index(::iwidgets::Datefield::_forward) [list source [file join $dir datefield.itk]]
+set auto_index(::iwidgets::Datefield::_backward) [list source [file join $dir datefield.itk]]
+set auto_index(::iwidgets::Datefield::_lastDay) [list source [file join $dir datefield.itk]]
+set auto_index(::iwidgets::Dialog) [list source [file join $dir dialog.itk]]
+set auto_index(::iwidgets::dialog) [list source [file join $dir dialog.itk]]
+set auto_index(::iwidgets::Dialog::constructor) [list source [file join $dir dialog.itk]]
+set auto_index(::iwidgets::Dialogshell) [list source [file join $dir dialogshell.itk]]
+set auto_index(::iwidgets::dialogshell) [list source [file join $dir dialogshell.itk]]
+set auto_index(::iwidgets::Dialogshell::constructor) [list source [file join $dir dialogshell.itk]]
+set auto_index(::iwidgets::Dialogshell::thickness) [list source [file join $dir dialogshell.itk]]
+set auto_index(::iwidgets::Dialogshell::buttonboxpos) [list source [file join $dir dialogshell.itk]]
+set auto_index(::iwidgets::Dialogshell::separator) [list source [file join $dir dialogshell.itk]]
+set auto_index(::iwidgets::Dialogshell::padx) [list source [file join $dir dialogshell.itk]]
+set auto_index(::iwidgets::Dialogshell::pady) [list source [file join $dir dialogshell.itk]]
+set auto_index(::iwidgets::Dialogshell::childsite) [list source [file join $dir dialogshell.itk]]
+set auto_index(::iwidgets::Dialogshell::index) [list source [file join $dir dialogshell.itk]]
+set auto_index(::iwidgets::Dialogshell::add) [list source [file join $dir dialogshell.itk]]
+set auto_index(::iwidgets::Dialogshell::insert) [list source [file join $dir dialogshell.itk]]
+set auto_index(::iwidgets::Dialogshell::delete) [list source [file join $dir dialogshell.itk]]
+set auto_index(::iwidgets::Dialogshell::hide) [list source [file join $dir dialogshell.itk]]
+set auto_index(::iwidgets::Dialogshell::show) [list source [file join $dir dialogshell.itk]]
+set auto_index(::iwidgets::Dialogshell::default) [list source [file join $dir dialogshell.itk]]
+set auto_index(::iwidgets::Dialogshell::invoke) [list source [file join $dir dialogshell.itk]]
+set auto_index(::iwidgets::Dialogshell::buttonconfigure) [list source [file join $dir dialogshell.itk]]
+set auto_index(::iwidgets::Dialogshell::buttoncget) [list source [file join $dir dialogshell.itk]]
+set auto_index(::iwidgets::Disjointlistbox) [list source [file join $dir disjointlistbox.itk]]
+set auto_index(::iwidgets::disjointlistbox) [list source [file join $dir disjointlistbox.itk]]
+set auto_index(::iwidgets::Disjointlistbox::constructor) [list source [file join $dir disjointlistbox.itk]]
+set auto_index(::iwidgets::Disjointlistbox::listboxClick) [list source [file join $dir disjointlistbox.itk]]
+set auto_index(::iwidgets::Disjointlistbox::listboxDblClick) [list source [file join $dir disjointlistbox.itk]]
+set auto_index(::iwidgets::Disjointlistbox::transfer) [list source [file join $dir disjointlistbox.itk]]
+set auto_index(::iwidgets::Disjointlistbox::getlhs) [list source [file join $dir disjointlistbox.itk]]
+set auto_index(::iwidgets::Disjointlistbox::getrhs) [list source [file join $dir disjointlistbox.itk]]
+set auto_index(::iwidgets::Disjointlistbox::insertrhs) [list source [file join $dir disjointlistbox.itk]]
+set auto_index(::iwidgets::Disjointlistbox::insertlhs) [list source [file join $dir disjointlistbox.itk]]
+set auto_index(::iwidgets::Disjointlistbox::clear) [list source [file join $dir disjointlistbox.itk]]
+set auto_index(::iwidgets::Disjointlistbox::insert) [list source [file join $dir disjointlistbox.itk]]
+set auto_index(::iwidgets::Disjointlistbox::remove) [list source [file join $dir disjointlistbox.itk]]
+set auto_index(::iwidgets::Disjointlistbox::showCount) [list source [file join $dir disjointlistbox.itk]]
+set auto_index(::iwidgets::Disjointlistbox::setlhs) [list source [file join $dir disjointlistbox.itk]]
+set auto_index(::iwidgets::Disjointlistbox::setrhs) [list source [file join $dir disjointlistbox.itk]]
+set auto_index(::iwidgets::Disjointlistbox::lhs) [list source [file join $dir disjointlistbox.itk]]
+set auto_index(::iwidgets::Disjointlistbox::rhs) [list source [file join $dir disjointlistbox.itk]]
+set auto_index(::iwidgets::Disjointlistbox::buttonplacement) [list source [file join $dir disjointlistbox.itk]]
+set auto_index(::iwidgets::Entryfield) [list source [file join $dir entryfield.itk]]
+set auto_index(::iwidgets::Entryfield::numeric) [list source [file join $dir entryfield.itk]]
+set auto_index(::iwidgets::Entryfield::integer) [list source [file join $dir entryfield.itk]]
+set auto_index(::iwidgets::Entryfield::alphabetic) [list source [file join $dir entryfield.itk]]
+set auto_index(::iwidgets::Entryfield::alphanumeric) [list source [file join $dir entryfield.itk]]
+set auto_index(::iwidgets::Entryfield::hexidecimal) [list source [file join $dir entryfield.itk]]
+set auto_index(::iwidgets::Entryfield::real) [list source [file join $dir entryfield.itk]]
+set auto_index(::iwidgets::entryfield) [list source [file join $dir entryfield.itk]]
+set auto_index(::iwidgets::Entryfield::constructor) [list source [file join $dir entryfield.itk]]
+set auto_index(::iwidgets::Entryfield::command) [list source [file join $dir entryfield.itk]]
+set auto_index(::iwidgets::Entryfield::focuscommand) [list source [file join $dir entryfield.itk]]
+set auto_index(::iwidgets::Entryfield::validate) [list source [file join $dir entryfield.itk]]
+set auto_index(::iwidgets::Entryfield::invalid) [list source [file join $dir entryfield.itk]]
+set auto_index(::iwidgets::Entryfield::pasting) [list source [file join $dir entryfield.itk]]
+set auto_index(::iwidgets::Entryfield::fixed) [list source [file join $dir entryfield.itk]]
+set auto_index(::iwidgets::Entryfield::childsitepos) [list source [file join $dir entryfield.itk]]
+set auto_index(::iwidgets::Entryfield::childsite) [list source [file join $dir entryfield.itk]]
+set auto_index(::iwidgets::Entryfield::get) [list source [file join $dir entryfield.itk]]
+set auto_index(::iwidgets::Entryfield::delete) [list source [file join $dir entryfield.itk]]
+set auto_index(::iwidgets::Entryfield::icursor) [list source [file join $dir entryfield.itk]]
+set auto_index(::iwidgets::Entryfield::index) [list source [file join $dir entryfield.itk]]
+set auto_index(::iwidgets::Entryfield::insert) [list source [file join $dir entryfield.itk]]
+set auto_index(::iwidgets::Entryfield::scan) [list source [file join $dir entryfield.itk]]
+set auto_index(::iwidgets::Entryfield::selection) [list source [file join $dir entryfield.itk]]
+set auto_index(::iwidgets::Entryfield::xview) [list source [file join $dir entryfield.itk]]
+set auto_index(::iwidgets::Entryfield::clear) [list source [file join $dir entryfield.itk]]
+set auto_index(::iwidgets::Entryfield::numeric) [list source [file join $dir entryfield.itk]]
+set auto_index(::iwidgets::Entryfield::integer) [list source [file join $dir entryfield.itk]]
+set auto_index(::iwidgets::Entryfield::alphabetic) [list source [file join $dir entryfield.itk]]
+set auto_index(::iwidgets::Entryfield::alphanumeric) [list source [file join $dir entryfield.itk]]
+set auto_index(::iwidgets::Entryfield::hexidecimal) [list source [file join $dir entryfield.itk]]
+set auto_index(::iwidgets::Entryfield::real) [list source [file join $dir entryfield.itk]]
+set auto_index(::iwidgets::Entryfield::_peek) [list source [file join $dir entryfield.itk]]
+set auto_index(::iwidgets::Entryfield::_focusCommand) [list source [file join $dir entryfield.itk]]
+set auto_index(::iwidgets::Entryfield::_keyPress) [list source [file join $dir entryfield.itk]]
+set auto_index(::iwidgets::Extfileselectionbox) [list source [file join $dir extfileselectionbox.itk]]
+set auto_index(::iwidgets::extfileselectionbox) [list source [file join $dir extfileselectionbox.itk]]
+set auto_index(::iwidgets::Extfileselectionbox::constructor) [list source [file join $dir extfileselectionbox.itk]]
+set auto_index(::iwidgets::Extfileselectionbox::destructor) [list source [file join $dir extfileselectionbox.itk]]
+set auto_index(::iwidgets::Extfileselectionbox::childsitepos) [list source [file join $dir extfileselectionbox.itk]]
+set auto_index(::iwidgets::Extfileselectionbox::fileson) [list source [file join $dir extfileselectionbox.itk]]
+set auto_index(::iwidgets::Extfileselectionbox::dirson) [list source [file join $dir extfileselectionbox.itk]]
+set auto_index(::iwidgets::Extfileselectionbox::selectionon) [list source [file join $dir extfileselectionbox.itk]]
+set auto_index(::iwidgets::Extfileselectionbox::filteron) [list source [file join $dir extfileselectionbox.itk]]
+set auto_index(::iwidgets::Extfileselectionbox::mask) [list source [file join $dir extfileselectionbox.itk]]
+set auto_index(::iwidgets::Extfileselectionbox::directory) [list source [file join $dir extfileselectionbox.itk]]
+set auto_index(::iwidgets::Extfileselectionbox::nomatchstring) [list source [file join $dir extfileselectionbox.itk]]
+set auto_index(::iwidgets::Extfileselectionbox::dirsearchcommand) [list source [file join $dir extfileselectionbox.itk]]
+set auto_index(::iwidgets::Extfileselectionbox::filesearchcommand) [list source [file join $dir extfileselectionbox.itk]]
+set auto_index(::iwidgets::Extfileselectionbox::selectioncommand) [list source [file join $dir extfileselectionbox.itk]]
+set auto_index(::iwidgets::Extfileselectionbox::filtercommand) [list source [file join $dir extfileselectionbox.itk]]
+set auto_index(::iwidgets::Extfileselectionbox::selectdircommand) [list source [file join $dir extfileselectionbox.itk]]
+set auto_index(::iwidgets::Extfileselectionbox::selectfilecommand) [list source [file join $dir extfileselectionbox.itk]]
+set auto_index(::iwidgets::Extfileselectionbox::invalid) [list source [file join $dir extfileselectionbox.itk]]
+set auto_index(::iwidgets::Extfileselectionbox::filetype) [list source [file join $dir extfileselectionbox.itk]]
+set auto_index(::iwidgets::Extfileselectionbox::width) [list source [file join $dir extfileselectionbox.itk]]
+set auto_index(::iwidgets::Extfileselectionbox::height) [list source [file join $dir extfileselectionbox.itk]]
+set auto_index(::iwidgets::Extfileselectionbox::childsite) [list source [file join $dir extfileselectionbox.itk]]
+set auto_index(::iwidgets::Extfileselectionbox::get) [list source [file join $dir extfileselectionbox.itk]]
+set auto_index(::iwidgets::Extfileselectionbox::filter) [list source [file join $dir extfileselectionbox.itk]]
+set auto_index(::iwidgets::Extfileselectionbox::_updateLists) [list source [file join $dir extfileselectionbox.itk]]
+set auto_index(::iwidgets::Extfileselectionbox::_setFilter) [list source [file join $dir extfileselectionbox.itk]]
+set auto_index(::iwidgets::Extfileselectionbox::_setSelection) [list source [file join $dir extfileselectionbox.itk]]
+set auto_index(::iwidgets::Extfileselectionbox::_setDirList) [list source [file join $dir extfileselectionbox.itk]]
+set auto_index(::iwidgets::Extfileselectionbox::_setFileList) [list source [file join $dir extfileselectionbox.itk]]
+set auto_index(::iwidgets::Extfileselectionbox::_selectDir) [list source [file join $dir extfileselectionbox.itk]]
+set auto_index(::iwidgets::Extfileselectionbox::_dblSelectDir) [list source [file join $dir extfileselectionbox.itk]]
+set auto_index(::iwidgets::Extfileselectionbox::_selectFile) [list source [file join $dir extfileselectionbox.itk]]
+set auto_index(::iwidgets::Extfileselectionbox::_selectSelection) [list source [file join $dir extfileselectionbox.itk]]
+set auto_index(::iwidgets::Extfileselectionbox::_selectFilter) [list source [file join $dir extfileselectionbox.itk]]
+set auto_index(::iwidgets::Extfileselectionbox::_packComponents) [list source [file join $dir extfileselectionbox.itk]]
+set auto_index(::iwidgets::Extfileselectionbox::_nPos) [list source [file join $dir extfileselectionbox.itk]]
+set auto_index(::iwidgets::Extfileselectionbox::_sPos) [list source [file join $dir extfileselectionbox.itk]]
+set auto_index(::iwidgets::Extfileselectionbox::_ePos) [list source [file join $dir extfileselectionbox.itk]]
+set auto_index(::iwidgets::Extfileselectionbox::_wPos) [list source [file join $dir extfileselectionbox.itk]]
+set auto_index(::iwidgets::Extfileselectionbox::_topPos) [list source [file join $dir extfileselectionbox.itk]]
+set auto_index(::iwidgets::Extfileselectionbox::_bottomPos) [list source [file join $dir extfileselectionbox.itk]]
+set auto_index(::iwidgets::Extfileselectiondialog) [list source [file join $dir extfileselectiondialog.itk]]
+set auto_index(::iwidgets::extfileselectiondialog) [list source [file join $dir extfileselectiondialog.itk]]
+set auto_index(::iwidgets::Extfileselectiondialog::constructor) [list source [file join $dir extfileselectiondialog.itk]]
+set auto_index(::iwidgets::Extfileselectiondialog::childsite) [list source [file join $dir extfileselectiondialog.itk]]
+set auto_index(::iwidgets::Extfileselectiondialog::get) [list source [file join $dir extfileselectiondialog.itk]]
+set auto_index(::iwidgets::Extfileselectiondialog::filter) [list source [file join $dir extfileselectiondialog.itk]]
+set auto_index(::iwidgets::Extfileselectiondialog::_dbldir) [list source [file join $dir extfileselectiondialog.itk]]
+set auto_index(::iwidgets::Feedback) [list source [file join $dir feedback.itk]]
+set auto_index(::iwidgets::feedback) [list source [file join $dir feedback.itk]]
+set auto_index(::iwidgets::Feedback::constructor) [list source [file join $dir feedback.itk]]
+set auto_index(::iwidgets::Feedback::destructor) [list source [file join $dir feedback.itk]]
+set auto_index(::iwidgets::Feedback::steps) [list source [file join $dir feedback.itk]]
+set auto_index(::iwidgets::Feedback::_display) [list source [file join $dir feedback.itk]]
+set auto_index(::iwidgets::Feedback::reset) [list source [file join $dir feedback.itk]]
+set auto_index(::iwidgets::Feedback::step) [list source [file join $dir feedback.itk]]
+set auto_index(::iwidgets::Fileselectionbox) [list source [file join $dir fileselectionbox.itk]]
+set auto_index(::iwidgets::fileselectionbox) [list source [file join $dir fileselectionbox.itk]]
+set auto_index(::iwidgets::Fileselectionbox::constructor) [list source [file join $dir fileselectionbox.itk]]
+set auto_index(::iwidgets::Fileselectionbox::destructor) [list source [file join $dir fileselectionbox.itk]]
+set auto_index(::iwidgets::Fileselectionbox::childsitepos) [list source [file join $dir fileselectionbox.itk]]
+set auto_index(::iwidgets::Fileselectionbox::fileson) [list source [file join $dir fileselectionbox.itk]]
+set auto_index(::iwidgets::Fileselectionbox::dirson) [list source [file join $dir fileselectionbox.itk]]
+set auto_index(::iwidgets::Fileselectionbox::selectionon) [list source [file join $dir fileselectionbox.itk]]
+set auto_index(::iwidgets::Fileselectionbox::filteron) [list source [file join $dir fileselectionbox.itk]]
+set auto_index(::iwidgets::Fileselectionbox::mask) [list source [file join $dir fileselectionbox.itk]]
+set auto_index(::iwidgets::Fileselectionbox::directory) [list source [file join $dir fileselectionbox.itk]]
+set auto_index(::iwidgets::Fileselectionbox::nomatchstring) [list source [file join $dir fileselectionbox.itk]]
+set auto_index(::iwidgets::Fileselectionbox::dirsearchcommand) [list source [file join $dir fileselectionbox.itk]]
+set auto_index(::iwidgets::Fileselectionbox::filesearchcommand) [list source [file join $dir fileselectionbox.itk]]
+set auto_index(::iwidgets::Fileselectionbox::selectioncommand) [list source [file join $dir fileselectionbox.itk]]
+set auto_index(::iwidgets::Fileselectionbox::filtercommand) [list source [file join $dir fileselectionbox.itk]]
+set auto_index(::iwidgets::Fileselectionbox::selectdircommand) [list source [file join $dir fileselectionbox.itk]]
+set auto_index(::iwidgets::Fileselectionbox::selectfilecommand) [list source [file join $dir fileselectionbox.itk]]
+set auto_index(::iwidgets::Fileselectionbox::invalid) [list source [file join $dir fileselectionbox.itk]]
+set auto_index(::iwidgets::Fileselectionbox::filetype) [list source [file join $dir fileselectionbox.itk]]
+set auto_index(::iwidgets::Fileselectionbox::width) [list source [file join $dir fileselectionbox.itk]]
+set auto_index(::iwidgets::Fileselectionbox::height) [list source [file join $dir fileselectionbox.itk]]
+set auto_index(::iwidgets::Fileselectionbox::childsite) [list source [file join $dir fileselectionbox.itk]]
+set auto_index(::iwidgets::Fileselectionbox::get) [list source [file join $dir fileselectionbox.itk]]
+set auto_index(::iwidgets::Fileselectionbox::filter) [list source [file join $dir fileselectionbox.itk]]
+set auto_index(::iwidgets::Fileselectionbox::_updateLists) [list source [file join $dir fileselectionbox.itk]]
+set auto_index(::iwidgets::Fileselectionbox::_setFilter) [list source [file join $dir fileselectionbox.itk]]
+set auto_index(::iwidgets::Fileselectionbox::_setSelection) [list source [file join $dir fileselectionbox.itk]]
+set auto_index(::iwidgets::Fileselectionbox::_setDirList) [list source [file join $dir fileselectionbox.itk]]
+set auto_index(::iwidgets::Fileselectionbox::_setFileList) [list source [file join $dir fileselectionbox.itk]]
+set auto_index(::iwidgets::Fileselectionbox::_selectDir) [list source [file join $dir fileselectionbox.itk]]
+set auto_index(::iwidgets::Fileselectionbox::_dblSelectDir) [list source [file join $dir fileselectionbox.itk]]
+set auto_index(::iwidgets::Fileselectionbox::_selectFile) [list source [file join $dir fileselectionbox.itk]]
+set auto_index(::iwidgets::Fileselectionbox::_selectSelection) [list source [file join $dir fileselectionbox.itk]]
+set auto_index(::iwidgets::Fileselectionbox::_selectFilter) [list source [file join $dir fileselectionbox.itk]]
+set auto_index(::iwidgets::Fileselectionbox::_packComponents) [list source [file join $dir fileselectionbox.itk]]
+set auto_index(::iwidgets::Fileselectionbox::_nPos) [list source [file join $dir fileselectionbox.itk]]
+set auto_index(::iwidgets::Fileselectionbox::_sPos) [list source [file join $dir fileselectionbox.itk]]
+set auto_index(::iwidgets::Fileselectionbox::_ePos) [list source [file join $dir fileselectionbox.itk]]
+set auto_index(::iwidgets::Fileselectionbox::_wPos) [list source [file join $dir fileselectionbox.itk]]
+set auto_index(::iwidgets::Fileselectionbox::_topPos) [list source [file join $dir fileselectionbox.itk]]
+set auto_index(::iwidgets::Fileselectionbox::_centerPos) [list source [file join $dir fileselectionbox.itk]]
+set auto_index(::iwidgets::Fileselectionbox::_bottomPos) [list source [file join $dir fileselectionbox.itk]]
+set auto_index(::iwidgets::Fileselectiondialog) [list source [file join $dir fileselectiondialog.itk]]
+set auto_index(::iwidgets::fileselectiondialog) [list source [file join $dir fileselectiondialog.itk]]
+set auto_index(::iwidgets::Fileselectiondialog::constructor) [list source [file join $dir fileselectiondialog.itk]]
+set auto_index(::iwidgets::Fileselectiondialog::childsite) [list source [file join $dir fileselectiondialog.itk]]
+set auto_index(::iwidgets::Fileselectiondialog::get) [list source [file join $dir fileselectiondialog.itk]]
+set auto_index(::iwidgets::Fileselectiondialog::filter) [list source [file join $dir fileselectiondialog.itk]]
+set auto_index(::iwidgets::Fileselectiondialog::_dbldir) [list source [file join $dir fileselectiondialog.itk]]
+set auto_index(::iwidgets::Finddialog) [list source [file join $dir finddialog.itk]]
+set auto_index(::iwidgets::finddialog) [list source [file join $dir finddialog.itk]]
+set auto_index(::iwidgets::Finddialog::constructor) [list source [file join $dir finddialog.itk]]
+set auto_index(::iwidgets::Finddialog::clearcommand) [list source [file join $dir finddialog.itk]]
+set auto_index(::iwidgets::Finddialog::matchcommand) [list source [file join $dir finddialog.itk]]
+set auto_index(::iwidgets::Finddialog::patternbackground) [list source [file join $dir finddialog.itk]]
+set auto_index(::iwidgets::Finddialog::patternforeground) [list source [file join $dir finddialog.itk]]
+set auto_index(::iwidgets::Finddialog::searchforeground) [list source [file join $dir finddialog.itk]]
+set auto_index(::iwidgets::Finddialog::searchbackground) [list source [file join $dir finddialog.itk]]
+set auto_index(::iwidgets::Finddialog::textwidget) [list source [file join $dir finddialog.itk]]
+set auto_index(::iwidgets::Finddialog::clear) [list source [file join $dir finddialog.itk]]
+set auto_index(::iwidgets::Finddialog::find) [list source [file join $dir finddialog.itk]]
+set auto_index(::iwidgets::Finddialog::_get) [list source [file join $dir finddialog.itk]]
+set auto_index(::iwidgets::Finddialog::_textExists) [list source [file join $dir finddialog.itk]]
+set auto_index(::iwidgets::Hierarchy) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::hierarchy) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::constructor) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::destructor) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::font) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::selectbackground) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::selectforeground) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::markbackground) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::markforeground) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::querycommand) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::selectcommand) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::dblclickcommand) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::iconcommand) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::icondblcommand) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::imagecommand) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::imagedblcommand) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::alwaysquery) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::filter) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::expanded) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::openicon) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::closedicon) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::nodeicon) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::width) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::height) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::visibleitems) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::textmenuloadcommand) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::imagemenuloadcommand) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::clear) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::selection) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::mark) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::current) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::expand) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::collapse) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::toggle) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::prune) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::draw) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::refresh) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::bbox) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::compare) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::delete) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::dump) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::dlineinfo) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::get) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::index) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::insert) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::scan) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::search) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::see) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::tag) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::window) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::xview) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::yview) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::expanded) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::expState) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::_drawLevel) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::_contents) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::_post) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::_imagePost) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::_select) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::_double) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::_iconSelect) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::_iconDblSelect) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::_imageSelect) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::_imageDblClick) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::_deselectSubNodes) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::_deleteNodeInfo) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::_getParent) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::_getHeritage) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hierarchy::_isInternalTag) [list source [file join $dir hierarchy.itk]]
+set auto_index(::iwidgets::Hyperhelp) [list source [file join $dir hyperhelp.itk]]
+set auto_index(::iwidgets::hyperhelp) [list source [file join $dir hyperhelp.itk]]
+set auto_index(::iwidgets::Hyperhelp::constructor) [list source [file join $dir hyperhelp.itk]]
+set auto_index(::iwidgets::Hyperhelp::topics) [list source [file join $dir hyperhelp.itk]]
+set auto_index(::iwidgets::Hyperhelp::title) [list source [file join $dir hyperhelp.itk]]
+set auto_index(::iwidgets::Hyperhelp::helpdir) [list source [file join $dir hyperhelp.itk]]
+set auto_index(::iwidgets::Hyperhelp::closecmd) [list source [file join $dir hyperhelp.itk]]
+set auto_index(::iwidgets::Hyperhelp::showtopic) [list source [file join $dir hyperhelp.itk]]
+set auto_index(::iwidgets::Hyperhelp::followlink) [list source [file join $dir hyperhelp.itk]]
+set auto_index(::iwidgets::Hyperhelp::forward) [list source [file join $dir hyperhelp.itk]]
+set auto_index(::iwidgets::Hyperhelp::back) [list source [file join $dir hyperhelp.itk]]
+set auto_index(::iwidgets::Hyperhelp::updatefeedback) [list source [file join $dir hyperhelp.itk]]
+set auto_index(::iwidgets::Hyperhelp::_readtopic) [list source [file join $dir hyperhelp.itk]]
+set auto_index(::iwidgets::Hyperhelp::_fill_go_menu) [list source [file join $dir hyperhelp.itk]]
+set auto_index(::iwidgets::Hyperhelp::_pageforward) [list source [file join $dir hyperhelp.itk]]
+set auto_index(::iwidgets::Hyperhelp::_pageback) [list source [file join $dir hyperhelp.itk]]
+set auto_index(::iwidgets::Hyperhelp::_lineforward) [list source [file join $dir hyperhelp.itk]]
+set auto_index(::iwidgets::Hyperhelp::_lineback) [list source [file join $dir hyperhelp.itk]]
+set auto_index(::iwidgets::Labeledframe) [list source [file join $dir labeledframe.itk]]
+set auto_index(::iwidgets::labeledframe) [list source [file join $dir labeledframe.itk]]
+set auto_index(::iwidgets::Labeledframe::constructor) [list source [file join $dir labeledframe.itk]]
+set auto_index(::iwidgets::Labeledframe::destructor) [list source [file join $dir labeledframe.itk]]
+set auto_index(::iwidgets::Labeledframe::ipadx) [list source [file join $dir labeledframe.itk]]
+set auto_index(::iwidgets::Labeledframe::ipady) [list source [file join $dir labeledframe.itk]]
+set auto_index(::iwidgets::Labeledframe::labelmargin) [list source [file join $dir labeledframe.itk]]
+set auto_index(::iwidgets::Labeledframe::labelpos) [list source [file join $dir labeledframe.itk]]
+set auto_index(::iwidgets::Labeledframe::_initTable) [list source [file join $dir labeledframe.itk]]
+set auto_index(::iwidgets::Labeledframe::childsite) [list source [file join $dir labeledframe.itk]]
+set auto_index(::iwidgets::Labeledframe::_positionLabel) [list source [file join $dir labeledframe.itk]]
+set auto_index(::iwidgets::Labeledframe::_collapseMargin) [list source [file join $dir labeledframe.itk]]
+set auto_index(::iwidgets::Labeledframe::_setMarginThickness) [list source [file join $dir labeledframe.itk]]
+set auto_index(::iwidgets::Labeledwidget) [list source [file join $dir labeledwidget.itk]]
+set auto_index(::iwidgets::Labeledwidget::alignlabels) [list source [file join $dir labeledwidget.itk]]
+set auto_index(::iwidgets::labeledwidget) [list source [file join $dir labeledwidget.itk]]
+set auto_index(::iwidgets::Labeledwidget::constructor) [list source [file join $dir labeledwidget.itk]]
+set auto_index(::iwidgets::Labeledwidget::destructor) [list source [file join $dir labeledwidget.itk]]
+set auto_index(::iwidgets::Labeledwidget::disabledforeground) [list source [file join $dir labeledwidget.itk]]
+set auto_index(::iwidgets::Labeledwidget::labelpos) [list source [file join $dir labeledwidget.itk]]
+set auto_index(::iwidgets::Labeledwidget::labelmargin) [list source [file join $dir labeledwidget.itk]]
+set auto_index(::iwidgets::Labeledwidget::labeltext) [list source [file join $dir labeledwidget.itk]]
+set auto_index(::iwidgets::Labeledwidget::labelvariable) [list source [file join $dir labeledwidget.itk]]
+set auto_index(::iwidgets::Labeledwidget::labelbitmap) [list source [file join $dir labeledwidget.itk]]
+set auto_index(::iwidgets::Labeledwidget::labelimage) [list source [file join $dir labeledwidget.itk]]
+set auto_index(::iwidgets::Labeledwidget::state) [list source [file join $dir labeledwidget.itk]]
+set auto_index(::iwidgets::Labeledwidget::childsite) [list source [file join $dir labeledwidget.itk]]
+set auto_index(::iwidgets::Labeledwidget::alignlabels) [list source [file join $dir labeledwidget.itk]]
+set auto_index(::iwidgets::Labeledwidget::_positionLabel) [list source [file join $dir labeledwidget.itk]]
+set auto_index(::iwidgets::Mainwindow) [list source [file join $dir mainwindow.itk]]
+set auto_index(::iwidgets::mainwindow) [list source [file join $dir mainwindow.itk]]
+set auto_index(::iwidgets::Mainwindow::constructor) [list source [file join $dir mainwindow.itk]]
+set auto_index(::iwidgets::Mainwindow::helpline) [list source [file join $dir mainwindow.itk]]
+set auto_index(::iwidgets::Mainwindow::statusline) [list source [file join $dir mainwindow.itk]]
+set auto_index(::iwidgets::Mainwindow::childsite) [list source [file join $dir mainwindow.itk]]
+set auto_index(::iwidgets::Mainwindow::menubar) [list source [file join $dir mainwindow.itk]]
+set auto_index(::iwidgets::Mainwindow::toolbar) [list source [file join $dir mainwindow.itk]]
+set auto_index(::iwidgets::Mainwindow::mousebar) [list source [file join $dir mainwindow.itk]]
+set auto_index(::iwidgets::Mainwindow::msgd) [list source [file join $dir mainwindow.itk]]
+set auto_index(::iwidgets::Mainwindow::_exitCB) [list source [file join $dir mainwindow.itk]]
+set auto_index(::iwidgets::Menubar) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::menubar) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::constructor) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::foreground) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::activebackground) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::activeborderwidth) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::activeforeground) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::anchor) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::borderwidth) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::disabledforeground) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::font) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::highlightbackground) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::highlightcolor) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::highlightthickness) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::justify) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::padx) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::pady) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::wraplength) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::menubuttons) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::helpvariable) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::add) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::delete) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::index) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::insert) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::invoke) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::menucget) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::menuconfigure) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::path) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::type) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::yposition) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::menubutton) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::options) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::command) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::checkbutton) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::radiobutton) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::separator) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::cascade) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::_addMenuButton) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::_insertMenuButton) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::_makeMenuButton) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::_makeMenu) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::_substEvalStr) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::_deleteMenu) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::_deleteAMenu) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::_addEntry) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::_addCascade) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::_insertEntry) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::_insertCascade) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::_deleteEntry) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::_configureMenu) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::_configureMenuOption) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::_configureMenuEntry) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::_unsetPaths) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::_entryPathToTkMenuPath) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::_getTkIndex) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::_getPdIndex) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::_getMenuList) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::_getEntryList) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::_parsePath) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::_getSymbolicPath) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::_helpHandler) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::Menubar::_getCallerLevel) [list source [file join $dir menubar.itk]]
+set auto_index(tkMenuFind) [list source [file join $dir menubar.itk]]
+set auto_index(::iwidgets::MsgType) [list source [file join $dir messagebox.itk]]
+set auto_index(::iwidgets::Messagebox) [list source [file join $dir messagebox.itk]]
+set auto_index(::iwidgets::messagebox) [list source [file join $dir messagebox.itk]]
+set auto_index(::iwidgets::Messagebox::constructor) [list source [file join $dir messagebox.itk]]
+set auto_index(::iwidgets::Messagebox::destructor) [list source [file join $dir messagebox.itk]]
+set auto_index(::iwidgets::Messagebox::clear) [list source [file join $dir messagebox.itk]]
+set auto_index(::iwidgets::Messagebox::type) [list source [file join $dir messagebox.itk]]
+set auto_index(::iwidgets::Messagebox::issue) [list source [file join $dir messagebox.itk]]
+set auto_index(::iwidgets::Messagebox::save) [list source [file join $dir messagebox.itk]]
+set auto_index(::iwidgets::Messagebox::find) [list source [file join $dir messagebox.itk]]
+set auto_index(::iwidgets::Messagebox::_post) [list source [file join $dir messagebox.itk]]
+set auto_index(::iwidgets::Messagebox::export) [list source [file join $dir messagebox.itk]]
+set auto_index(::iwidgets::Messagedialog) [list source [file join $dir messagedialog.itk]]
+set auto_index(::iwidgets::messagedialog) [list source [file join $dir messagedialog.itk]]
+set auto_index(::iwidgets::Messagedialog::constructor) [list source [file join $dir messagedialog.itk]]
+set auto_index(::iwidgets::Messagedialog::imagepos) [list source [file join $dir messagedialog.itk]]
+set auto_index(::iwidgets::Notebook) [list source [file join $dir notebook.itk]]
+set auto_index(::iwidgets::notebook) [list source [file join $dir notebook.itk]]
+set auto_index(::iwidgets::Notebook::constructor) [list source [file join $dir notebook.itk]]
+set auto_index(::iwidgets::Notebook::background) [list source [file join $dir notebook.itk]]
+set auto_index(::iwidgets::Notebook::auto) [list source [file join $dir notebook.itk]]
+set auto_index(::iwidgets::Notebook::scrollcommand) [list source [file join $dir notebook.itk]]
+set auto_index(::iwidgets::Notebook::add) [list source [file join $dir notebook.itk]]
+set auto_index(::iwidgets::Notebook::childsite) [list source [file join $dir notebook.itk]]
+set auto_index(::iwidgets::Notebook::delete) [list source [file join $dir notebook.itk]]
+set auto_index(::iwidgets::Notebook::index) [list source [file join $dir notebook.itk]]
+set auto_index(::iwidgets::Notebook::insert) [list source [file join $dir notebook.itk]]
+set auto_index(::iwidgets::Notebook::prev) [list source [file join $dir notebook.itk]]
+set auto_index(::iwidgets::Notebook::next) [list source [file join $dir notebook.itk]]
+set auto_index(::iwidgets::Notebook::pageconfigure) [list source [file join $dir notebook.itk]]
+set auto_index(::iwidgets::Notebook::pagecget) [list source [file join $dir notebook.itk]]
+set auto_index(::iwidgets::Notebook::select) [list source [file join $dir notebook.itk]]
+set auto_index(::iwidgets::Notebook::view) [list source [file join $dir notebook.itk]]
+set auto_index(::iwidgets::Notebook::_childSites) [list source [file join $dir notebook.itk]]
+set auto_index(::iwidgets::Notebook::_scrollCommand) [list source [file join $dir notebook.itk]]
+set auto_index(::iwidgets::Notebook::_index) [list source [file join $dir notebook.itk]]
+set auto_index(::iwidgets::Notebook::_createPage) [list source [file join $dir notebook.itk]]
+set auto_index(::iwidgets::Notebook::_deletePages) [list source [file join $dir notebook.itk]]
+set auto_index(::iwidgets::Notebook::_configurePages) [list source [file join $dir notebook.itk]]
+set auto_index(::iwidgets::Notebook::_tabCommand) [list source [file join $dir notebook.itk]]
+set auto_index(::iwidgets::Page) [list source [file join $dir notebook.itk]]
+set auto_index(::iwidgets::Page::constructor) [list source [file join $dir notebook.itk]]
+set auto_index(::iwidgets::Page::disabledforeground) [list source [file join $dir notebook.itk]]
+set auto_index(::iwidgets::Page::label) [list source [file join $dir notebook.itk]]
+set auto_index(::iwidgets::Page::command) [list source [file join $dir notebook.itk]]
+set auto_index(::iwidgets::Page::childsite) [list source [file join $dir notebook.itk]]
+set auto_index(::iwidgets::Optionmenu) [list source [file join $dir optionmenu.itk]]
+set auto_index(::iwidgets::optionmenu) [list source [file join $dir optionmenu.itk]]
+set auto_index(::iwidgets::Optionmenu::constructor) [list source [file join $dir optionmenu.itk]]
+set auto_index(::iwidgets::Optionmenu::destructor) [list source [file join $dir optionmenu.itk]]
+set auto_index(::iwidgets::Optionmenu::clicktime) [list source [file join $dir optionmenu.itk]]
+set auto_index(::iwidgets::Optionmenu::command) [list source [file join $dir optionmenu.itk]]
+set auto_index(::iwidgets::Optionmenu::cyclicon) [list source [file join $dir optionmenu.itk]]
+set auto_index(::iwidgets::Optionmenu::width) [list source [file join $dir optionmenu.itk]]
+set auto_index(::iwidgets::Optionmenu::font) [list source [file join $dir optionmenu.itk]]
+set auto_index(::iwidgets::Optionmenu::borderwidth) [list source [file join $dir optionmenu.itk]]
+set auto_index(::iwidgets::Optionmenu::highlightthickness) [list source [file join $dir optionmenu.itk]]
+set auto_index(::iwidgets::Optionmenu::state) [list source [file join $dir optionmenu.itk]]
+set auto_index(::iwidgets::Optionmenu::index) [list source [file join $dir optionmenu.itk]]
+set auto_index(::iwidgets::Optionmenu::delete) [list source [file join $dir optionmenu.itk]]
+set auto_index(::iwidgets::Optionmenu::disable) [list source [file join $dir optionmenu.itk]]
+set auto_index(::iwidgets::Optionmenu::enable) [list source [file join $dir optionmenu.itk]]
+set auto_index(::iwidgets::Optionmenu::get) [list source [file join $dir optionmenu.itk]]
+set auto_index(::iwidgets::Optionmenu::insert) [list source [file join $dir optionmenu.itk]]
+set auto_index(::iwidgets::Optionmenu::select) [list source [file join $dir optionmenu.itk]]
+set auto_index(::iwidgets::Optionmenu::popupMenu) [list source [file join $dir optionmenu.itk]]
+set auto_index(::iwidgets::Optionmenu::sort) [list source [file join $dir optionmenu.itk]]
+set auto_index(::iwidgets::Optionmenu::_buttonRelease) [list source [file join $dir optionmenu.itk]]
+set auto_index(::iwidgets::Optionmenu::_getNextItem) [list source [file join $dir optionmenu.itk]]
+set auto_index(::iwidgets::Optionmenu::_next) [list source [file join $dir optionmenu.itk]]
+set auto_index(::iwidgets::Optionmenu::_previous) [list source [file join $dir optionmenu.itk]]
+set auto_index(::iwidgets::Optionmenu::_postMenu) [list source [file join $dir optionmenu.itk]]
+set auto_index(::iwidgets::Optionmenu::_setItem) [list source [file join $dir optionmenu.itk]]
+set auto_index(::iwidgets::Optionmenu::_setitems) [list source [file join $dir optionmenu.itk]]
+set auto_index(::iwidgets::Optionmenu::_setSize) [list source [file join $dir optionmenu.itk]]
+set auto_index(::iwidgets::Pane) [list source [file join $dir pane.itk]]
+set auto_index(::iwidgets::pane) [list source [file join $dir pane.itk]]
+set auto_index(::iwidgets::Pane::constructor) [list source [file join $dir pane.itk]]
+set auto_index(::iwidgets::Pane::minimum) [list source [file join $dir pane.itk]]
+set auto_index(::iwidgets::Pane::margin) [list source [file join $dir pane.itk]]
+set auto_index(::iwidgets::Pane::childSite) [list source [file join $dir pane.itk]]
+set auto_index(::iwidgets::Panedwindow) [list source [file join $dir panedwindow.itk]]
+set auto_index(::iwidgets::panedwindow) [list source [file join $dir panedwindow.itk]]
+set auto_index(::iwidgets::Panedwindow::constructor) [list source [file join $dir panedwindow.itk]]
+set auto_index(::iwidgets::Panedwindow::orient) [list source [file join $dir panedwindow.itk]]
+set auto_index(::iwidgets::Panedwindow::sashborderwidth) [list source [file join $dir panedwindow.itk]]
+set auto_index(::iwidgets::Panedwindow::sashcursor) [list source [file join $dir panedwindow.itk]]
+set auto_index(::iwidgets::Panedwindow::sashwidth) [list source [file join $dir panedwindow.itk]]
+set auto_index(::iwidgets::Panedwindow::sashheight) [list source [file join $dir panedwindow.itk]]
+set auto_index(::iwidgets::Panedwindow::thickness) [list source [file join $dir panedwindow.itk]]
+set auto_index(::iwidgets::Panedwindow::sashindent) [list source [file join $dir panedwindow.itk]]
+set auto_index(::iwidgets::Panedwindow::index) [list source [file join $dir panedwindow.itk]]
+set auto_index(::iwidgets::Panedwindow::childsite) [list source [file join $dir panedwindow.itk]]
+set auto_index(::iwidgets::Panedwindow::fraction) [list source [file join $dir panedwindow.itk]]
+set auto_index(::iwidgets::Panedwindow::add) [list source [file join $dir panedwindow.itk]]
+set auto_index(::iwidgets::Panedwindow::insert) [list source [file join $dir panedwindow.itk]]
+set auto_index(::iwidgets::Panedwindow::delete) [list source [file join $dir panedwindow.itk]]
+set auto_index(::iwidgets::Panedwindow::hide) [list source [file join $dir panedwindow.itk]]
+set auto_index(::iwidgets::Panedwindow::show) [list source [file join $dir panedwindow.itk]]
+set auto_index(::iwidgets::Panedwindow::paneconfigure) [list source [file join $dir panedwindow.itk]]
+set auto_index(::iwidgets::Panedwindow::reset) [list source [file join $dir panedwindow.itk]]
+set auto_index(::iwidgets::Panedwindow::_pwConfigureEventHandler) [list source [file join $dir panedwindow.itk]]
+set auto_index(::iwidgets::Panedwindow::_startGrip) [list source [file join $dir panedwindow.itk]]
+set auto_index(::iwidgets::Panedwindow::_endGrip) [list source [file join $dir panedwindow.itk]]
+set auto_index(::iwidgets::Panedwindow::_configGrip) [list source [file join $dir panedwindow.itk]]
+set auto_index(::iwidgets::Panedwindow::_handleGrip) [list source [file join $dir panedwindow.itk]]
+set auto_index(::iwidgets::Panedwindow::_moveSash) [list source [file join $dir panedwindow.itk]]
+set auto_index(::iwidgets::Panedwindow::_setFracArray) [list source [file join $dir panedwindow.itk]]
+set auto_index(::iwidgets::Panedwindow::_setActivePanes) [list source [file join $dir panedwindow.itk]]
+set auto_index(::iwidgets::Panedwindow::_calcFraction) [list source [file join $dir panedwindow.itk]]
+set auto_index(::iwidgets::Panedwindow::_makeSashes) [list source [file join $dir panedwindow.itk]]
+set auto_index(::iwidgets::Panedwindow::_placeSash) [list source [file join $dir panedwindow.itk]]
+set auto_index(::iwidgets::Panedwindow::_placePanes) [list source [file join $dir panedwindow.itk]]
+set auto_index(::iwidgets::Promptdialog) [list source [file join $dir promptdialog.itk]]
+set auto_index(::iwidgets::promptdialog) [list source [file join $dir promptdialog.itk]]
+set auto_index(::iwidgets::Promptdialog::constructor) [list source [file join $dir promptdialog.itk]]
+set auto_index(::iwidgets::Promptdialog::get) [list source [file join $dir promptdialog.itk]]
+set auto_index(::iwidgets::Promptdialog::clear) [list source [file join $dir promptdialog.itk]]
+set auto_index(::iwidgets::Promptdialog::insert) [list source [file join $dir promptdialog.itk]]
+set auto_index(::iwidgets::Promptdialog::delete) [list source [file join $dir promptdialog.itk]]
+set auto_index(::iwidgets::Promptdialog::icursor) [list source [file join $dir promptdialog.itk]]
+set auto_index(::iwidgets::Promptdialog::index) [list source [file join $dir promptdialog.itk]]
+set auto_index(::iwidgets::Promptdialog::scan) [list source [file join $dir promptdialog.itk]]
+set auto_index(::iwidgets::Promptdialog::selection) [list source [file join $dir promptdialog.itk]]
+set auto_index(::iwidgets::Promptdialog::xview) [list source [file join $dir promptdialog.itk]]
+set auto_index(::iwidgets::Pushbutton) [list source [file join $dir pushbutton.itk]]
+set auto_index(::iwidgets::pushbutton) [list source [file join $dir pushbutton.itk]]
+set auto_index(::iwidgets::Pushbutton::constructor) [list source [file join $dir pushbutton.itk]]
+set auto_index(::iwidgets::Pushbutton::destructor) [list source [file join $dir pushbutton.itk]]
+set auto_index(::iwidgets::Pushbutton::padx) [list source [file join $dir pushbutton.itk]]
+set auto_index(::iwidgets::Pushbutton::pady) [list source [file join $dir pushbutton.itk]]
+set auto_index(::iwidgets::Pushbutton::font) [list source [file join $dir pushbutton.itk]]
+set auto_index(::iwidgets::Pushbutton::text) [list source [file join $dir pushbutton.itk]]
+set auto_index(::iwidgets::Pushbutton::bitmap) [list source [file join $dir pushbutton.itk]]
+set auto_index(::iwidgets::Pushbutton::image) [list source [file join $dir pushbutton.itk]]
+set auto_index(::iwidgets::Pushbutton::highlightthickness) [list source [file join $dir pushbutton.itk]]
+set auto_index(::iwidgets::Pushbutton::borderwidth) [list source [file join $dir pushbutton.itk]]
+set auto_index(::iwidgets::Pushbutton::defaultring) [list source [file join $dir pushbutton.itk]]
+set auto_index(::iwidgets::Pushbutton::defaultringpad) [list source [file join $dir pushbutton.itk]]
+set auto_index(::iwidgets::Pushbutton::height) [list source [file join $dir pushbutton.itk]]
+set auto_index(::iwidgets::Pushbutton::width) [list source [file join $dir pushbutton.itk]]
+set auto_index(::iwidgets::Pushbutton::flash) [list source [file join $dir pushbutton.itk]]
+set auto_index(::iwidgets::Pushbutton::invoke) [list source [file join $dir pushbutton.itk]]
+set auto_index(::iwidgets::Pushbutton::_relayout) [list source [file join $dir pushbutton.itk]]
+set auto_index(::iwidgets::Radiobox) [list source [file join $dir radiobox.itk]]
+set auto_index(::iwidgets::radiobox) [list source [file join $dir radiobox.itk]]
+set auto_index(::iwidgets::Radiobox::constructor) [list source [file join $dir radiobox.itk]]
+set auto_index(::iwidgets::Radiobox::command) [list source [file join $dir radiobox.itk]]
+set auto_index(::iwidgets::Radiobox::orient) [list source [file join $dir radiobox.itk]]
+set auto_index(::iwidgets::Radiobox::index) [list source [file join $dir radiobox.itk]]
+set auto_index(::iwidgets::Radiobox::add) [list source [file join $dir radiobox.itk]]
+set auto_index(::iwidgets::Radiobox::insert) [list source [file join $dir radiobox.itk]]
+set auto_index(::iwidgets::Radiobox::_rearrange) [list source [file join $dir radiobox.itk]]
+set auto_index(::iwidgets::Radiobox::delete) [list source [file join $dir radiobox.itk]]
+set auto_index(::iwidgets::Radiobox::select) [list source [file join $dir radiobox.itk]]
+set auto_index(::iwidgets::Radiobox::get) [list source [file join $dir radiobox.itk]]
+set auto_index(::iwidgets::Radiobox::deselect) [list source [file join $dir radiobox.itk]]
+set auto_index(::iwidgets::Radiobox::flash) [list source [file join $dir radiobox.itk]]
+set auto_index(::iwidgets::Radiobox::buttonconfigure) [list source [file join $dir radiobox.itk]]
+set auto_index(::iwidgets::Radiobox::_command) [list source [file join $dir radiobox.itk]]
+set auto_index(::iwidgets::Radiobox::gettag) [list source [file join $dir radiobox.itk]]
+set auto_index(::iwidgets::Regexpfield) [list source [file join $dir regexpfield.itk]]
+set auto_index(::iwidgets::regexpfield) [list source [file join $dir regexpfield.itk]]
+set auto_index(::iwidgets::Regexpfield::constructor) [list source [file join $dir regexpfield.itk]]
+set auto_index(::iwidgets::Regexpfield::command) [list source [file join $dir regexpfield.itk]]
+set auto_index(::iwidgets::Regexpfield::focuscommand) [list source [file join $dir regexpfield.itk]]
+set auto_index(::iwidgets::Regexpfield::regexp) [list source [file join $dir regexpfield.itk]]
+set auto_index(::iwidgets::Regexpfield::invalid) [list source [file join $dir regexpfield.itk]]
+set auto_index(::iwidgets::Regexpfield::fixed) [list source [file join $dir regexpfield.itk]]
+set auto_index(::iwidgets::Regexpfield::childsitepos) [list source [file join $dir regexpfield.itk]]
+set auto_index(::iwidgets::Regexpfield::nocase) [list source [file join $dir regexpfield.itk]]
+set auto_index(::iwidgets::Regexpfield::childsite) [list source [file join $dir regexpfield.itk]]
+set auto_index(::iwidgets::Regexpfield::get) [list source [file join $dir regexpfield.itk]]
+set auto_index(::iwidgets::Regexpfield::delete) [list source [file join $dir regexpfield.itk]]
+set auto_index(::iwidgets::Regexpfield::icursor) [list source [file join $dir regexpfield.itk]]
+set auto_index(::iwidgets::Regexpfield::index) [list source [file join $dir regexpfield.itk]]
+set auto_index(::iwidgets::Regexpfield::insert) [list source [file join $dir regexpfield.itk]]
+set auto_index(::iwidgets::Regexpfield::scan) [list source [file join $dir regexpfield.itk]]
+set auto_index(::iwidgets::Regexpfield::selection) [list source [file join $dir regexpfield.itk]]
+set auto_index(::iwidgets::Regexpfield::xview) [list source [file join $dir regexpfield.itk]]
+set auto_index(::iwidgets::Regexpfield::clear) [list source [file join $dir regexpfield.itk]]
+set auto_index(::iwidgets::Regexpfield::_peek) [list source [file join $dir regexpfield.itk]]
+set auto_index(::iwidgets::Regexpfield::_focusCommand) [list source [file join $dir regexpfield.itk]]
+set auto_index(::iwidgets::Regexpfield::_keyPress) [list source [file join $dir regexpfield.itk]]
+set auto_index(::iwidgets::Scrolledcanvas) [list source [file join $dir scrolledcanvas.itk]]
+set auto_index(::iwidgets::scrolledcanvas) [list source [file join $dir scrolledcanvas.itk]]
+set auto_index(::iwidgets::Scrolledcanvas::constructor) [list source [file join $dir scrolledcanvas.itk]]
+set auto_index(::iwidgets::Scrolledcanvas::destructor) [list source [file join $dir scrolledcanvas.itk]]
+set auto_index(::iwidgets::Scrolledcanvas::autoresize) [list source [file join $dir scrolledcanvas.itk]]
+set auto_index(::iwidgets::Scrolledcanvas::childsite) [list source [file join $dir scrolledcanvas.itk]]
+set auto_index(::iwidgets::Scrolledcanvas::justify) [list source [file join $dir scrolledcanvas.itk]]
+set auto_index(::iwidgets::Scrolledcanvas::addtag) [list source [file join $dir scrolledcanvas.itk]]
+set auto_index(::iwidgets::Scrolledcanvas::bbox) [list source [file join $dir scrolledcanvas.itk]]
+set auto_index(::iwidgets::Scrolledcanvas::bind) [list source [file join $dir scrolledcanvas.itk]]
+set auto_index(::iwidgets::Scrolledcanvas::canvasx) [list source [file join $dir scrolledcanvas.itk]]
+set auto_index(::iwidgets::Scrolledcanvas::canvasy) [list source [file join $dir scrolledcanvas.itk]]
+set auto_index(::iwidgets::Scrolledcanvas::coords) [list source [file join $dir scrolledcanvas.itk]]
+set auto_index(::iwidgets::Scrolledcanvas::create) [list source [file join $dir scrolledcanvas.itk]]
+set auto_index(::iwidgets::Scrolledcanvas::dchars) [list source [file join $dir scrolledcanvas.itk]]
+set auto_index(::iwidgets::Scrolledcanvas::delete) [list source [file join $dir scrolledcanvas.itk]]
+set auto_index(::iwidgets::Scrolledcanvas::dtag) [list source [file join $dir scrolledcanvas.itk]]
+set auto_index(::iwidgets::Scrolledcanvas::find) [list source [file join $dir scrolledcanvas.itk]]
+set auto_index(::iwidgets::Scrolledcanvas::focus) [list source [file join $dir scrolledcanvas.itk]]
+set auto_index(::iwidgets::Scrolledcanvas::gettags) [list source [file join $dir scrolledcanvas.itk]]
+set auto_index(::iwidgets::Scrolledcanvas::icursor) [list source [file join $dir scrolledcanvas.itk]]
+set auto_index(::iwidgets::Scrolledcanvas::index) [list source [file join $dir scrolledcanvas.itk]]
+set auto_index(::iwidgets::Scrolledcanvas::insert) [list source [file join $dir scrolledcanvas.itk]]
+set auto_index(::iwidgets::Scrolledcanvas::itemconfigure) [list source [file join $dir scrolledcanvas.itk]]
+set auto_index(::iwidgets::Scrolledcanvas::itemcget) [list source [file join $dir scrolledcanvas.itk]]
+set auto_index(::iwidgets::Scrolledcanvas::lower) [list source [file join $dir scrolledcanvas.itk]]
+set auto_index(::iwidgets::Scrolledcanvas::move) [list source [file join $dir scrolledcanvas.itk]]
+set auto_index(::iwidgets::Scrolledcanvas::postscript) [list source [file join $dir scrolledcanvas.itk]]
+set auto_index(::iwidgets::Scrolledcanvas::raise) [list source [file join $dir scrolledcanvas.itk]]
+set auto_index(::iwidgets::Scrolledcanvas::scale) [list source [file join $dir scrolledcanvas.itk]]
+set auto_index(::iwidgets::Scrolledcanvas::scan) [list source [file join $dir scrolledcanvas.itk]]
+set auto_index(::iwidgets::Scrolledcanvas::select) [list source [file join $dir scrolledcanvas.itk]]
+set auto_index(::iwidgets::Scrolledcanvas::type) [list source [file join $dir scrolledcanvas.itk]]
+set auto_index(::iwidgets::Scrolledcanvas::xview) [list source [file join $dir scrolledcanvas.itk]]
+set auto_index(::iwidgets::Scrolledcanvas::yview) [list source [file join $dir scrolledcanvas.itk]]
+set auto_index(::iwidgets::Scrolledframe) [list source [file join $dir scrolledframe.itk]]
+set auto_index(::iwidgets::scrolledframe) [list source [file join $dir scrolledframe.itk]]
+set auto_index(::iwidgets::Scrolledframe::constructor) [list source [file join $dir scrolledframe.itk]]
+set auto_index(::iwidgets::Scrolledframe::destructor) [list source [file join $dir scrolledframe.itk]]
+set auto_index(::iwidgets::Scrolledframe::childsite) [list source [file join $dir scrolledframe.itk]]
+set auto_index(::iwidgets::Scrolledframe::justify) [list source [file join $dir scrolledframe.itk]]
+set auto_index(::iwidgets::Scrolledframe::xview) [list source [file join $dir scrolledframe.itk]]
+set auto_index(::iwidgets::Scrolledframe::yview) [list source [file join $dir scrolledframe.itk]]
+set auto_index(::iwidgets::Scrolledframe::_configureCanvas) [list source [file join $dir scrolledframe.itk]]
+set auto_index(::iwidgets::Scrolledframe::_configureFrame) [list source [file join $dir scrolledframe.itk]]
+set auto_index(::iwidgets::Scrolledhtml) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::scrolledhtml) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::constructor) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::destructor) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::fontsize) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::fixedfont) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::fontname) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::textbackground) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::linkhighlight) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::unknownimage) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::update) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::clear) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::import) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::render) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_setup) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_definefont) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_append_text) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_set_tag) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_reconfig_tags) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_push) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_pop) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_peek) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_parse_fields) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_href_click) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_set_align) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_fixtablewidth) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_header) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_/header) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_a) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_/a) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_address) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_/address) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_b) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_/b) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_base) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_basefont) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_big) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_/big) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_blockquote) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_/blockquote) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_body) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_/body) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_br) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_center) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_/center) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_cite) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_/cite) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_code) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_/code) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_dir) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_/dir) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_div) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_dl) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_/dl) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_dt) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_dd) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_dfn) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_/dfn) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_em) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_/em) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_font) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_/font) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_h1) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_/h1) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_h2) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_/h2) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_h3) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_/h3) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_h4) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_/h4) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_h5) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_/h5) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_h6) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_/h6) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_hr) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_i) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_/i) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_img) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_kbd) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_/kbd) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_li) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_listing) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_/listing) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_menu) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_/menu) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_ol) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_/ol) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_p) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_pre) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_/pre) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_samp) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_/samp) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_small) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_/small) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_sub) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_/sub) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_sup) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_/sup) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_strong) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_/strong) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_table) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_/table) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_td) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_/td) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_th) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_/th) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_title) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_/title) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_tr) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_/tr) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_tt) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_/tt) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_u) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_/u) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_ul) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_/ul) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_var) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledhtml::_entity_/var) [list source [file join $dir scrolledhtml.itk]]
+set auto_index(::iwidgets::Scrolledlistbox) [list source [file join $dir scrolledlistbox.itk]]
+set auto_index(::iwidgets::scrolledlistbox) [list source [file join $dir scrolledlistbox.itk]]
+set auto_index(::iwidgets::Scrolledlistbox::constructor) [list source [file join $dir scrolledlistbox.itk]]
+set auto_index(::iwidgets::Scrolledlistbox::destructor) [list source [file join $dir scrolledlistbox.itk]]
+set auto_index(::iwidgets::Scrolledlistbox::dblclickcommand) [list source [file join $dir scrolledlistbox.itk]]
+set auto_index(::iwidgets::Scrolledlistbox::selectioncommand) [list source [file join $dir scrolledlistbox.itk]]
+set auto_index(::iwidgets::Scrolledlistbox::width) [list source [file join $dir scrolledlistbox.itk]]
+set auto_index(::iwidgets::Scrolledlistbox::height) [list source [file join $dir scrolledlistbox.itk]]
+set auto_index(::iwidgets::Scrolledlistbox::visibleitems) [list source [file join $dir scrolledlistbox.itk]]
+set auto_index(::iwidgets::Scrolledlistbox::state) [list source [file join $dir scrolledlistbox.itk]]
+set auto_index(::iwidgets::Scrolledlistbox::curselection) [list source [file join $dir scrolledlistbox.itk]]
+set auto_index(::iwidgets::Scrolledlistbox::activate) [list source [file join $dir scrolledlistbox.itk]]
+set auto_index(::iwidgets::Scrolledlistbox::bbox) [list source [file join $dir scrolledlistbox.itk]]
+set auto_index(::iwidgets::Scrolledlistbox::clear) [list source [file join $dir scrolledlistbox.itk]]
+set auto_index(::iwidgets::Scrolledlistbox::see) [list source [file join $dir scrolledlistbox.itk]]
+set auto_index(::iwidgets::Scrolledlistbox::index) [list source [file join $dir scrolledlistbox.itk]]
+set auto_index(::iwidgets::Scrolledlistbox::_fixIndex) [list source [file join $dir scrolledlistbox.itk]]
+set auto_index(::iwidgets::Scrolledlistbox::delete) [list source [file join $dir scrolledlistbox.itk]]
+set auto_index(::iwidgets::Scrolledlistbox::get) [list source [file join $dir scrolledlistbox.itk]]
+set auto_index(::iwidgets::Scrolledlistbox::getcurselection) [list source [file join $dir scrolledlistbox.itk]]
+set auto_index(::iwidgets::Scrolledlistbox::insert) [list source [file join $dir scrolledlistbox.itk]]
+set auto_index(::iwidgets::Scrolledlistbox::nearest) [list source [file join $dir scrolledlistbox.itk]]
+set auto_index(::iwidgets::Scrolledlistbox::scan) [list source [file join $dir scrolledlistbox.itk]]
+set auto_index(::iwidgets::Scrolledlistbox::selection) [list source [file join $dir scrolledlistbox.itk]]
+set auto_index(::iwidgets::Scrolledlistbox::size) [list source [file join $dir scrolledlistbox.itk]]
+set auto_index(::iwidgets::Scrolledlistbox::selecteditemcount) [list source [file join $dir scrolledlistbox.itk]]
+set auto_index(::iwidgets::Scrolledlistbox::justify) [list source [file join $dir scrolledlistbox.itk]]
+set auto_index(::iwidgets::Scrolledlistbox::sort) [list source [file join $dir scrolledlistbox.itk]]
+set auto_index(::iwidgets::Scrolledlistbox::xview) [list source [file join $dir scrolledlistbox.itk]]
+set auto_index(::iwidgets::Scrolledlistbox::yview) [list source [file join $dir scrolledlistbox.itk]]
+set auto_index(::iwidgets::Scrolledlistbox::itemconfigure) [list source [file join $dir scrolledlistbox.itk]]
+set auto_index(::iwidgets::Scrolledlistbox::_makeSelection) [list source [file join $dir scrolledlistbox.itk]]
+set auto_index(::iwidgets::Scrolledlistbox::_dblclick) [list source [file join $dir scrolledlistbox.itk]]
+set auto_index(::iwidgets::Scrolledtext) [list source [file join $dir scrolledtext.itk]]
+set auto_index(::iwidgets::scrolledtext) [list source [file join $dir scrolledtext.itk]]
+set auto_index(::iwidgets::Scrolledtext::constructor) [list source [file join $dir scrolledtext.itk]]
+set auto_index(::iwidgets::Scrolledtext::destructor) [list source [file join $dir scrolledtext.itk]]
+set auto_index(::iwidgets::Scrolledtext::width) [list source [file join $dir scrolledtext.itk]]
+set auto_index(::iwidgets::Scrolledtext::height) [list source [file join $dir scrolledtext.itk]]
+set auto_index(::iwidgets::Scrolledtext::visibleitems) [list source [file join $dir scrolledtext.itk]]
+set auto_index(::iwidgets::Scrolledtext::childsite) [list source [file join $dir scrolledtext.itk]]
+set auto_index(::iwidgets::Scrolledtext::bbox) [list source [file join $dir scrolledtext.itk]]
+set auto_index(::iwidgets::Scrolledtext::clear) [list source [file join $dir scrolledtext.itk]]
+set auto_index(::iwidgets::Scrolledtext::import) [list source [file join $dir scrolledtext.itk]]
+set auto_index(::iwidgets::Scrolledtext::export) [list source [file join $dir scrolledtext.itk]]
+set auto_index(::iwidgets::Scrolledtext::compare) [list source [file join $dir scrolledtext.itk]]
+set auto_index(::iwidgets::Scrolledtext::debug) [list source [file join $dir scrolledtext.itk]]
+set auto_index(::iwidgets::Scrolledtext::delete) [list source [file join $dir scrolledtext.itk]]
+set auto_index(::iwidgets::Scrolledtext::dlineinfo) [list source [file join $dir scrolledtext.itk]]
+set auto_index(::iwidgets::Scrolledtext::get) [list source [file join $dir scrolledtext.itk]]
+set auto_index(::iwidgets::Scrolledtext::image) [list source [file join $dir scrolledtext.itk]]
+set auto_index(::iwidgets::Scrolledtext::index) [list source [file join $dir scrolledtext.itk]]
+set auto_index(::iwidgets::Scrolledtext::insert) [list source [file join $dir scrolledtext.itk]]
+set auto_index(::iwidgets::Scrolledtext::mark) [list source [file join $dir scrolledtext.itk]]
+set auto_index(::iwidgets::Scrolledtext::scan) [list source [file join $dir scrolledtext.itk]]
+set auto_index(::iwidgets::Scrolledtext::search) [list source [file join $dir scrolledtext.itk]]
+set auto_index(::iwidgets::Scrolledtext::see) [list source [file join $dir scrolledtext.itk]]
+set auto_index(::iwidgets::Scrolledtext::tag) [list source [file join $dir scrolledtext.itk]]
+set auto_index(::iwidgets::Scrolledtext::window) [list source [file join $dir scrolledtext.itk]]
+set auto_index(::iwidgets::Scrolledtext::xview) [list source [file join $dir scrolledtext.itk]]
+set auto_index(::iwidgets::Scrolledtext::yview) [list source [file join $dir scrolledtext.itk]]
+set auto_index(::iwidgets::Scrolledwidget) [list source [file join $dir scrolledwidget.itk]]
+set auto_index(::iwidgets::scrolledwidget) [list source [file join $dir scrolledwidget.itk]]
+set auto_index(::iwidgets::Scrolledwidget::constructor) [list source [file join $dir scrolledwidget.itk]]
+set auto_index(::iwidgets::Scrolledwidget::destructor) [list source [file join $dir scrolledwidget.itk]]
+set auto_index(::iwidgets::Scrolledwidget::sbwidth) [list source [file join $dir scrolledwidget.itk]]
+set auto_index(::iwidgets::Scrolledwidget::scrollmargin) [list source [file join $dir scrolledwidget.itk]]
+set auto_index(::iwidgets::Scrolledwidget::vscrollmode) [list source [file join $dir scrolledwidget.itk]]
+set auto_index(::iwidgets::Scrolledwidget::hscrollmode) [list source [file join $dir scrolledwidget.itk]]
+set auto_index(::iwidgets::Scrolledwidget::width) [list source [file join $dir scrolledwidget.itk]]
+set auto_index(::iwidgets::Scrolledwidget::height) [list source [file join $dir scrolledwidget.itk]]
+set auto_index(::iwidgets::Scrolledwidget::_vertScrollbarDisplay) [list source [file join $dir scrolledwidget.itk]]
+set auto_index(::iwidgets::Scrolledwidget::_horizScrollbarDisplay) [list source [file join $dir scrolledwidget.itk]]
+set auto_index(::iwidgets::Scrolledwidget::_scrollWidget) [list source [file join $dir scrolledwidget.itk]]
+set auto_index(::iwidgets::Scrolledwidget::_configureEvent) [list source [file join $dir scrolledwidget.itk]]
+set auto_index(::iwidgets::Selectionbox) [list source [file join $dir selectionbox.itk]]
+set auto_index(::iwidgets::selectionbox) [list source [file join $dir selectionbox.itk]]
+set auto_index(::iwidgets::Selectionbox::constructor) [list source [file join $dir selectionbox.itk]]
+set auto_index(::iwidgets::Selectionbox::destructor) [list source [file join $dir selectionbox.itk]]
+set auto_index(::iwidgets::Selectionbox::childsitepos) [list source [file join $dir selectionbox.itk]]
+set auto_index(::iwidgets::Selectionbox::margin) [list source [file join $dir selectionbox.itk]]
+set auto_index(::iwidgets::Selectionbox::itemson) [list source [file join $dir selectionbox.itk]]
+set auto_index(::iwidgets::Selectionbox::selectionon) [list source [file join $dir selectionbox.itk]]
+set auto_index(::iwidgets::Selectionbox::width) [list source [file join $dir selectionbox.itk]]
+set auto_index(::iwidgets::Selectionbox::height) [list source [file join $dir selectionbox.itk]]
+set auto_index(::iwidgets::Selectionbox::childsite) [list source [file join $dir selectionbox.itk]]
+set auto_index(::iwidgets::Selectionbox::get) [list source [file join $dir selectionbox.itk]]
+set auto_index(::iwidgets::Selectionbox::curselection) [list source [file join $dir selectionbox.itk]]
+set auto_index(::iwidgets::Selectionbox::clear) [list source [file join $dir selectionbox.itk]]
+set auto_index(::iwidgets::Selectionbox::insert) [list source [file join $dir selectionbox.itk]]
+set auto_index(::iwidgets::Selectionbox::delete) [list source [file join $dir selectionbox.itk]]
+set auto_index(::iwidgets::Selectionbox::size) [list source [file join $dir selectionbox.itk]]
+set auto_index(::iwidgets::Selectionbox::scan) [list source [file join $dir selectionbox.itk]]
+set auto_index(::iwidgets::Selectionbox::nearest) [list source [file join $dir selectionbox.itk]]
+set auto_index(::iwidgets::Selectionbox::index) [list source [file join $dir selectionbox.itk]]
+set auto_index(::iwidgets::Selectionbox::selection) [list source [file join $dir selectionbox.itk]]
+set auto_index(::iwidgets::Selectionbox::selectitem) [list source [file join $dir selectionbox.itk]]
+set auto_index(::iwidgets::Selectionbox::_packComponents) [list source [file join $dir selectionbox.itk]]
+set auto_index(::iwidgets::Selectiondialog) [list source [file join $dir selectiondialog.itk]]
+set auto_index(::iwidgets::selectiondialog) [list source [file join $dir selectiondialog.itk]]
+set auto_index(::iwidgets::Selectiondialog::constructor) [list source [file join $dir selectiondialog.itk]]
+set auto_index(::iwidgets::Selectiondialog::childsite) [list source [file join $dir selectiondialog.itk]]
+set auto_index(::iwidgets::Selectiondialog::get) [list source [file join $dir selectiondialog.itk]]
+set auto_index(::iwidgets::Selectiondialog::curselection) [list source [file join $dir selectiondialog.itk]]
+set auto_index(::iwidgets::Selectiondialog::clear) [list source [file join $dir selectiondialog.itk]]
+set auto_index(::iwidgets::Selectiondialog::insert) [list source [file join $dir selectiondialog.itk]]
+set auto_index(::iwidgets::Selectiondialog::delete) [list source [file join $dir selectiondialog.itk]]
+set auto_index(::iwidgets::Selectiondialog::size) [list source [file join $dir selectiondialog.itk]]
+set auto_index(::iwidgets::Selectiondialog::scan) [list source [file join $dir selectiondialog.itk]]
+set auto_index(::iwidgets::Selectiondialog::nearest) [list source [file join $dir selectiondialog.itk]]
+set auto_index(::iwidgets::Selectiondialog::index) [list source [file join $dir selectiondialog.itk]]
+set auto_index(::iwidgets::Selectiondialog::selection) [list source [file join $dir selectiondialog.itk]]
+set auto_index(::iwidgets::Selectiondialog::selectitem) [list source [file join $dir selectiondialog.itk]]
+set auto_index(::iwidgets::Shell) [list source [file join $dir shell.itk]]
+set auto_index(::iwidgets::shell) [list source [file join $dir shell.itk]]
+set auto_index(::iwidgets::Shell::constructor) [list source [file join $dir shell.itk]]
+set auto_index(::iwidgets::Shell::master) [list source [file join $dir shell.itk]]
+set auto_index(::iwidgets::Shell::modality) [list source [file join $dir shell.itk]]
+set auto_index(::iwidgets::Shell::padx) [list source [file join $dir shell.itk]]
+set auto_index(::iwidgets::Shell::pady) [list source [file join $dir shell.itk]]
+set auto_index(::iwidgets::Shell::width) [list source [file join $dir shell.itk]]
+set auto_index(::iwidgets::Shell::height) [list source [file join $dir shell.itk]]
+set auto_index(::iwidgets::Shell::childsite) [list source [file join $dir shell.itk]]
+set auto_index(::iwidgets::Shell::activate) [list source [file join $dir shell.itk]]
+set auto_index(::iwidgets::Shell::deactivate) [list source [file join $dir shell.itk]]
+set auto_index(::iwidgets::Shell::center) [list source [file join $dir shell.itk]]
+set auto_index(::iwidgets::Spindate) [list source [file join $dir spindate.itk]]
+set auto_index(::iwidgets::spindate) [list source [file join $dir spindate.itk]]
+set auto_index(::iwidgets::Spindate::constructor) [list source [file join $dir spindate.itk]]
+set auto_index(::iwidgets::Spindate::destructor) [list source [file join $dir spindate.itk]]
+set auto_index(::iwidgets::Spindate::labelpos) [list source [file join $dir spindate.itk]]
+set auto_index(::iwidgets::Spindate::orient) [list source [file join $dir spindate.itk]]
+set auto_index(::iwidgets::Spindate::monthon) [list source [file join $dir spindate.itk]]
+set auto_index(::iwidgets::Spindate::dayon) [list source [file join $dir spindate.itk]]
+set auto_index(::iwidgets::Spindate::yearon) [list source [file join $dir spindate.itk]]
+set auto_index(::iwidgets::Spindate::datemargin) [list source [file join $dir spindate.itk]]
+set auto_index(::iwidgets::Spindate::yeardigits) [list source [file join $dir spindate.itk]]
+set auto_index(::iwidgets::Spindate::monthformat) [list source [file join $dir spindate.itk]]
+set auto_index(::iwidgets::Spindate::get) [list source [file join $dir spindate.itk]]
+set auto_index(::iwidgets::Spindate::show) [list source [file join $dir spindate.itk]]
+set auto_index(::iwidgets::Spindate::_spinMonth) [list source [file join $dir spindate.itk]]
+set auto_index(::iwidgets::Spindate::_spinDay) [list source [file join $dir spindate.itk]]
+set auto_index(::iwidgets::Spindate::_packDate) [list source [file join $dir spindate.itk]]
+set auto_index(::iwidgets::Spindate::_lastDay) [list source [file join $dir spindate.itk]]
+set auto_index(::iwidgets::Spinint) [list source [file join $dir spinint.itk]]
+set auto_index(::iwidgets::spinint) [list source [file join $dir spinint.itk]]
+set auto_index(::iwidgets::Spinint::constructor) [list source [file join $dir spinint.itk]]
+set auto_index(::iwidgets::Spinint::range) [list source [file join $dir spinint.itk]]
+set auto_index(::iwidgets::Spinint::step) [list source [file join $dir spinint.itk]]
+set auto_index(::iwidgets::Spinint::wrap) [list source [file join $dir spinint.itk]]
+set auto_index(::iwidgets::Spinint::up) [list source [file join $dir spinint.itk]]
+set auto_index(::iwidgets::Spinint::down) [list source [file join $dir spinint.itk]]
+set auto_index(::iwidgets::Spinner) [list source [file join $dir spinner.itk]]
+set auto_index(::iwidgets::spinner) [list source [file join $dir spinner.itk]]
+set auto_index(::iwidgets::Spinner::constructor) [list source [file join $dir spinner.itk]]
+set auto_index(::iwidgets::Spinner::destructor) [list source [file join $dir spinner.itk]]
+set auto_index(::iwidgets::Spinner::arroworient) [list source [file join $dir spinner.itk]]
+set auto_index(::iwidgets::Spinner::textfont) [list source [file join $dir spinner.itk]]
+set auto_index(::iwidgets::Spinner::highlightthickness) [list source [file join $dir spinner.itk]]
+set auto_index(::iwidgets::Spinner::borderwidth) [list source [file join $dir spinner.itk]]
+set auto_index(::iwidgets::Spinner::increment) [list source [file join $dir spinner.itk]]
+set auto_index(::iwidgets::Spinner::decrement) [list source [file join $dir spinner.itk]]
+set auto_index(::iwidgets::Spinner::repeatinterval) [list source [file join $dir spinner.itk]]
+set auto_index(::iwidgets::Spinner::repeatdelay) [list source [file join $dir spinner.itk]]
+set auto_index(::iwidgets::Spinner::foreground) [list source [file join $dir spinner.itk]]
+set auto_index(::iwidgets::Spinner::up) [list source [file join $dir spinner.itk]]
+set auto_index(::iwidgets::Spinner::down) [list source [file join $dir spinner.itk]]
+set auto_index(::iwidgets::Spinner::_positionArrows) [list source [file join $dir spinner.itk]]
+set auto_index(::iwidgets::Spinner::_pushup) [list source [file join $dir spinner.itk]]
+set auto_index(::iwidgets::Spinner::_pushdown) [list source [file join $dir spinner.itk]]
+set auto_index(::iwidgets::Spinner::_doup) [list source [file join $dir spinner.itk]]
+set auto_index(::iwidgets::Spinner::_dodown) [list source [file join $dir spinner.itk]]
+set auto_index(::iwidgets::Spinner::_relup) [list source [file join $dir spinner.itk]]
+set auto_index(::iwidgets::Spinner::_reldown) [list source [file join $dir spinner.itk]]
+set auto_index(::iwidgets::Spinner::_up) [list source [file join $dir spinner.itk]]
+set auto_index(::iwidgets::Spinner::_down) [list source [file join $dir spinner.itk]]
+set auto_index(::iwidgets::Spintime) [list source [file join $dir spintime.itk]]
+set auto_index(::iwidgets::spintime) [list source [file join $dir spintime.itk]]
+set auto_index(::iwidgets::Spintime::constructor) [list source [file join $dir spintime.itk]]
+set auto_index(::iwidgets::Spintime::destructor) [list source [file join $dir spintime.itk]]
+set auto_index(::iwidgets::Spintime::orient) [list source [file join $dir spintime.itk]]
+set auto_index(::iwidgets::Spintime::labelpos) [list source [file join $dir spintime.itk]]
+set auto_index(::iwidgets::Spintime::houron) [list source [file join $dir spintime.itk]]
+set auto_index(::iwidgets::Spintime::minuteon) [list source [file join $dir spintime.itk]]
+set auto_index(::iwidgets::Spintime::secondon) [list source [file join $dir spintime.itk]]
+set auto_index(::iwidgets::Spintime::timemargin) [list source [file join $dir spintime.itk]]
+set auto_index(::iwidgets::Spintime::militaryon) [list source [file join $dir spintime.itk]]
+set auto_index(::iwidgets::Spintime::get) [list source [file join $dir spintime.itk]]
+set auto_index(::iwidgets::Spintime::show) [list source [file join $dir spintime.itk]]
+set auto_index(::iwidgets::Spintime::_packTime) [list source [file join $dir spintime.itk]]
+set auto_index(::iwidgets::Spintime::_down60) [list source [file join $dir spintime.itk]]
+set auto_index(::iwidgets::Tabnotebook) [list source [file join $dir tabnotebook.itk]]
+set auto_index(::iwidgets::Tabnotebook::constructor) [list source [file join $dir tabnotebook.itk]]
+set auto_index(::iwidgets::tabnotebook) [list source [file join $dir tabnotebook.itk]]
+set auto_index(::iwidgets::Tabnotebook::destructor) [list source [file join $dir tabnotebook.itk]]
+set auto_index(::iwidgets::Tabnotebook::borderwidth) [list source [file join $dir tabnotebook.itk]]
+set auto_index(::iwidgets::Tabnotebook::state) [list source [file join $dir tabnotebook.itk]]
+set auto_index(::iwidgets::Tabnotebook::disabledforeground) [list source [file join $dir tabnotebook.itk]]
+set auto_index(::iwidgets::Tabnotebook::scrollcommand) [list source [file join $dir tabnotebook.itk]]
+set auto_index(::iwidgets::Tabnotebook::equaltabs) [list source [file join $dir tabnotebook.itk]]
+set auto_index(::iwidgets::Tabnotebook::font) [list source [file join $dir tabnotebook.itk]]
+set auto_index(::iwidgets::Tabnotebook::width) [list source [file join $dir tabnotebook.itk]]
+set auto_index(::iwidgets::Tabnotebook::height) [list source [file join $dir tabnotebook.itk]]
+set auto_index(::iwidgets::Tabnotebook::foreground) [list source [file join $dir tabnotebook.itk]]
+set auto_index(::iwidgets::Tabnotebook::background) [list source [file join $dir tabnotebook.itk]]
+set auto_index(::iwidgets::Tabnotebook::tabforeground) [list source [file join $dir tabnotebook.itk]]
+set auto_index(::iwidgets::Tabnotebook::tabbackground) [list source [file join $dir tabnotebook.itk]]
+set auto_index(::iwidgets::Tabnotebook::backdrop) [list source [file join $dir tabnotebook.itk]]
+set auto_index(::iwidgets::Tabnotebook::margin) [list source [file join $dir tabnotebook.itk]]
+set auto_index(::iwidgets::Tabnotebook::tabborders) [list source [file join $dir tabnotebook.itk]]
+set auto_index(::iwidgets::Tabnotebook::bevelamount) [list source [file join $dir tabnotebook.itk]]
+set auto_index(::iwidgets::Tabnotebook::raiseselect) [list source [file join $dir tabnotebook.itk]]
+set auto_index(::iwidgets::Tabnotebook::auto) [list source [file join $dir tabnotebook.itk]]
+set auto_index(::iwidgets::Tabnotebook::start) [list source [file join $dir tabnotebook.itk]]
+set auto_index(::iwidgets::Tabnotebook::padx) [list source [file join $dir tabnotebook.itk]]
+set auto_index(::iwidgets::Tabnotebook::pady) [list source [file join $dir tabnotebook.itk]]
+set auto_index(::iwidgets::Tabnotebook::gap) [list source [file join $dir tabnotebook.itk]]
+set auto_index(::iwidgets::Tabnotebook::angle) [list source [file join $dir tabnotebook.itk]]
+set auto_index(::iwidgets::Tabnotebook::tabpos) [list source [file join $dir tabnotebook.itk]]
+set auto_index(::iwidgets::Tabnotebook::configure) [list source [file join $dir tabnotebook.itk]]
+set auto_index(::iwidgets::Tabnotebook::add) [list source [file join $dir tabnotebook.itk]]
+set auto_index(::iwidgets::Tabnotebook::childsite) [list source [file join $dir tabnotebook.itk]]
+set auto_index(::iwidgets::Tabnotebook::delete) [list source [file join $dir tabnotebook.itk]]
+set auto_index(::iwidgets::Tabnotebook::index) [list source [file join $dir tabnotebook.itk]]
+set auto_index(::iwidgets::Tabnotebook::insert) [list source [file join $dir tabnotebook.itk]]
+set auto_index(::iwidgets::Tabnotebook::prev) [list source [file join $dir tabnotebook.itk]]
+set auto_index(::iwidgets::Tabnotebook::next) [list source [file join $dir tabnotebook.itk]]
+set auto_index(::iwidgets::Tabnotebook::pageconfigure) [list source [file join $dir tabnotebook.itk]]
+set auto_index(::iwidgets::Tabnotebook::select) [list source [file join $dir tabnotebook.itk]]
+set auto_index(::iwidgets::Tabnotebook::view) [list source [file join $dir tabnotebook.itk]]
+set auto_index(::iwidgets::Tabnotebook::_getArgs) [list source [file join $dir tabnotebook.itk]]
+set auto_index(::iwidgets::Tabnotebook::_reconfigureTabset) [list source [file join $dir tabnotebook.itk]]
+set auto_index(::iwidgets::Tabnotebook::_canvasReconfigure) [list source [file join $dir tabnotebook.itk]]
+set auto_index(::iwidgets::Tabnotebook::_redrawBorder) [list source [file join $dir tabnotebook.itk]]
+set auto_index(::iwidgets::Tabnotebook::_recomputeBorder) [list source [file join $dir tabnotebook.itk]]
+set auto_index(::iwidgets::Tabnotebook::_pageReconfigure) [list source [file join $dir tabnotebook.itk]]
+set auto_index(::iwidgets::Tabnotebook::_pack) [list source [file join $dir tabnotebook.itk]]
+set auto_index(::iwidgets::Tabnotebook::_resize) [list source [file join $dir tabnotebook.itk]]
+set auto_index(::iwidgets::Tabset) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::tabset) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tabset::constructor) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tabset::destructor) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tabset::width) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tabset::equaltabs) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tabset::height) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tabset::tabpos) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tabset::raiseselect) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tabset::start) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tabset::margin) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tabset::tabborders) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tabset::bevelamount) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tabset::padx) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tabset::pady) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tabset::gap) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tabset::angle) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tabset::font) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tabset::state) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tabset::disabledforeground) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tabset::foreground) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tabset::background) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tabset::selectforeground) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tabset::backdrop) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tabset::selectbackground) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tabset::command) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tabset::add) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tabset::configure) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tabset::_configRelayout) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tabset::delete) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tabset::index) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tabset::insert) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tabset::prev) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tabset::next) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tabset::select) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tabset::tabcget) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tabset::tabconfigure) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tabset::_selectName) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tabset::_createTab) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tabset::_deleteTabs) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tabset::_index) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tabset::_tabConfigure) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tabset::_relayoutTabs) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tabset::_drawBevelBorder) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tabset::_calcNextTabOffset) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tabset::_tabBounds) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tabset::_recalcCanvasGeom) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tabset::_canvasReconfigure) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tabset::_startMove) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tabset::_moveTabs) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tabset::_endMove) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tab) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tab::constructor) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tab::destructor) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tab::bevelamount) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tab::state) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tab::height) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tab::width) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tab::anchor) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tab::left) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tab::top) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tab::image) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tab::bitmap) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tab::label) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tab::padx) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tab::pady) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tab::selectbackground) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tab::selectforeground) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tab::disabledforeground) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tab::background) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tab::foreground) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tab::orient) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tab::invert) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tab::angle) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tab::font) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tab::tabborders) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tab::configure) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tab::bbox) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tab::deselect) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tab::lower) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tab::majordim) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tab::minordim) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tab::offset) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tab::raise) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tab::select) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tab::labelheight) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tab::labelwidth) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tab::_selectNoRaise) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tab::_deselectNoLower) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tab::_makeTab) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tab::_createLabel) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tab::_makeEastTab) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tab::_makeWestTab) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tab::_makeNorthTab) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tab::_makeSouthTab) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Tab::_calcLabelDim) [list source [file join $dir tabset.itk]]
+set auto_index(::iwidgets::Timeentry) [list source [file join $dir timeentry.itk]]
+set auto_index(::iwidgets::timeentry) [list source [file join $dir timeentry.itk]]
+set auto_index(::iwidgets::Timeentry::constructor) [list source [file join $dir timeentry.itk]]
+set auto_index(::iwidgets::Timeentry::icon) [list source [file join $dir timeentry.itk]]
+set auto_index(::iwidgets::Timeentry::grab) [list source [file join $dir timeentry.itk]]
+set auto_index(::iwidgets::Timeentry::state) [list source [file join $dir timeentry.itk]]
+set auto_index(::iwidgets::Timeentry::_getDefaultIcon) [list source [file join $dir timeentry.itk]]
+set auto_index(::iwidgets::Timeentry::_popup) [list source [file join $dir timeentry.itk]]
+set auto_index(::iwidgets::Timeentry::_getPopupTime) [list source [file join $dir timeentry.itk]]
+set auto_index(::iwidgets::Timeentry::_releaseGrab) [list source [file join $dir timeentry.itk]]
+set auto_index(::iwidgets::Timefield) [list source [file join $dir timefield.itk]]
+set auto_index(::iwidgets::timefield) [list source [file join $dir timefield.itk]]
+set auto_index(::iwidgets::Timefield::constructor) [list source [file join $dir timefield.itk]]
+set auto_index(::iwidgets::Timefield::childsitepos) [list source [file join $dir timefield.itk]]
+set auto_index(::iwidgets::Timefield::command) [list source [file join $dir timefield.itk]]
+set auto_index(::iwidgets::Timefield::iq) [list source [file join $dir timefield.itk]]
+set auto_index(::iwidgets::Timefield::format) [list source [file join $dir timefield.itk]]
+set auto_index(::iwidgets::Timefield::gmt) [list source [file join $dir timefield.itk]]
+set auto_index(::iwidgets::Timefield::state) [list source [file join $dir timefield.itk]]
+set auto_index(::iwidgets::Timefield::get) [list source [file join $dir timefield.itk]]
+set auto_index(::iwidgets::Timefield::show) [list source [file join $dir timefield.itk]]
+set auto_index(::iwidgets::Timefield::isvalid) [list source [file join $dir timefield.itk]]
+set auto_index(::iwidgets::Timefield::_focusIn) [list source [file join $dir timefield.itk]]
+set auto_index(::iwidgets::Timefield::_keyPress) [list source [file join $dir timefield.itk]]
+set auto_index(::iwidgets::Timefield::_toggleAmPm) [list source [file join $dir timefield.itk]]
+set auto_index(::iwidgets::Timefield::_setField) [list source [file join $dir timefield.itk]]
+set auto_index(::iwidgets::Timefield::_moveField) [list source [file join $dir timefield.itk]]
+set auto_index(::iwidgets::Timefield::_whichField) [list source [file join $dir timefield.itk]]
+set auto_index(::iwidgets::Timefield::_forwardCivilian) [list source [file join $dir timefield.itk]]
+set auto_index(::iwidgets::Timefield::_forwardMilitary) [list source [file join $dir timefield.itk]]
+set auto_index(::iwidgets::Timefield::_backwardCivilian) [list source [file join $dir timefield.itk]]
+set auto_index(::iwidgets::Timefield::_backwardMilitary) [list source [file join $dir timefield.itk]]
+set auto_index(::iwidgets::Toolbar) [list source [file join $dir toolbar.itk]]
+set auto_index(::iwidgets::Toolbar::constructor) [list source [file join $dir toolbar.itk]]
+set auto_index(::iwidgets::toolbar) [list source [file join $dir toolbar.itk]]
+set auto_index(::iwidgets::Toolbar::destructor) [list source [file join $dir toolbar.itk]]
+set auto_index(::iwidgets::Toolbar::balloonbackground) [list source [file join $dir toolbar.itk]]
+set auto_index(::iwidgets::Toolbar::balloonforeground) [list source [file join $dir toolbar.itk]]
+set auto_index(::iwidgets::Toolbar::balloonfont) [list source [file join $dir toolbar.itk]]
+set auto_index(::iwidgets::Toolbar::orient) [list source [file join $dir toolbar.itk]]
+set auto_index(::iwidgets::Toolbar::add) [list source [file join $dir toolbar.itk]]
+set auto_index(::iwidgets::Toolbar::delete) [list source [file join $dir toolbar.itk]]
+set auto_index(::iwidgets::Toolbar::index) [list source [file join $dir toolbar.itk]]
+set auto_index(::iwidgets::Toolbar::insert) [list source [file join $dir toolbar.itk]]
+set auto_index(::iwidgets::Toolbar::itemcget) [list source [file join $dir toolbar.itk]]
+set auto_index(::iwidgets::Toolbar::itemconfigure) [list source [file join $dir toolbar.itk]]
+set auto_index(::iwidgets::Toolbar::_resetBalloonTimer) [list source [file join $dir toolbar.itk]]
+set auto_index(::iwidgets::Toolbar::_startBalloonDelay) [list source [file join $dir toolbar.itk]]
+set auto_index(::iwidgets::Toolbar::_stopBalloonDelay) [list source [file join $dir toolbar.itk]]
+set auto_index(::iwidgets::Toolbar::_addWidget) [list source [file join $dir toolbar.itk]]
+set auto_index(::iwidgets::Toolbar::_deleteWidgets) [list source [file join $dir toolbar.itk]]
+set auto_index(::iwidgets::Toolbar::_index) [list source [file join $dir toolbar.itk]]
+set auto_index(::iwidgets::Toolbar::hideHelp) [list source [file join $dir toolbar.itk]]
+set auto_index(::iwidgets::Toolbar::showHelp) [list source [file join $dir toolbar.itk]]
+set auto_index(::iwidgets::Toolbar::showBalloon) [list source [file join $dir toolbar.itk]]
+set auto_index(::iwidgets::Toolbar::hideBalloon) [list source [file join $dir toolbar.itk]]
+set auto_index(::iwidgets::Toolbar::_getAttachedOption) [list source [file join $dir toolbar.itk]]
+set auto_index(::iwidgets::Toolbar::_setAttachedOption) [list source [file join $dir toolbar.itk]]
+set auto_index(::iwidgets::Toolbar::_packToolbar) [list source [file join $dir toolbar.itk]]
+set auto_index(::iwidgets::Watch) [list source [file join $dir watch.itk]]
+set auto_index(::iwidgets::watch) [list source [file join $dir watch.itk]]
+set auto_index(::iwidgets::Watch::constructor) [list source [file join $dir watch.itk]]
+set auto_index(::iwidgets::Watch::destructor) [list source [file join $dir watch.itk]]
+set auto_index(::iwidgets::Watch::_handReleaseCB) [list source [file join $dir watch.itk]]
+set auto_index(::iwidgets::Watch::_handMotionCB) [list source [file join $dir watch.itk]]
+set auto_index(::iwidgets::Watch::get) [list source [file join $dir watch.itk]]
+set auto_index(::iwidgets::Watch::watch) [list source [file join $dir watch.itk]]
+set auto_index(::iwidgets::Watch::_drawHand) [list source [file join $dir watch.itk]]
+set auto_index(::iwidgets::Watch::show) [list source [file join $dir watch.itk]]
+set auto_index(::iwidgets::Watch::_displayClock) [list source [file join $dir watch.itk]]
+set auto_index(::iwidgets::Watch::state) [list source [file join $dir watch.itk]]
+set auto_index(::iwidgets::Watch::showampm) [list source [file join $dir watch.itk]]
+set auto_index(::iwidgets::Watch::pivotcolor) [list source [file join $dir watch.itk]]
+set auto_index(::iwidgets::Watch::clockstipple) [list source [file join $dir watch.itk]]
+set auto_index(::iwidgets::Watch::clockcolor) [list source [file join $dir watch.itk]]
+set auto_index(::iwidgets::Watch::hourcolor) [list source [file join $dir watch.itk]]
+set auto_index(::iwidgets::Watch::minutecolor) [list source [file join $dir watch.itk]]
+set auto_index(::iwidgets::Watch::secondcolor) [list source [file join $dir watch.itk]]
+set auto_index(::iwidgets::Watch::tickcolor) [list source [file join $dir watch.itk]]
+set auto_index(::iwidgets::Watch::hourradius) [list source [file join $dir watch.itk]]
+set auto_index(::iwidgets::Watch::minuteradius) [list source [file join $dir watch.itk]]
+set auto_index(::iwidgets::Watch::secondradius) [list source [file join $dir watch.itk]]
+set auto_index(::iwidgets::colors::rgbToNumeric) [list source [file join $dir colors.itcl]]
+set auto_index(::iwidgets::colors::rgbToHsb) [list source [file join $dir colors.itcl]]
+set auto_index(::iwidgets::colors::hsbToRgb) [list source [file join $dir colors.itcl]]
+set auto_index(::iwidgets::colors::topShadow) [list source [file join $dir colors.itcl]]
+set auto_index(::iwidgets::colors::bottomShadow) [list source [file join $dir colors.itcl]]
+set auto_index(::iwidgets::roman2) [list source [file join $dir roman.itcl]]
+set auto_index(::iwidgets::roman) [list source [file join $dir roman.itcl]]
+set auto_index(::iwidgets::Scopedobject) [list source [file join $dir scopedobject.itcl]]
+set auto_index(::iwidgets::scopedobject) [list source [file join $dir scopedobject.itcl]]
+set auto_index(::iwidgets::Scopedobject::constructor) [list source [file join $dir scopedobject.itcl]]
+set auto_index(::iwidgets::Scopedobject::destructor) [list source [file join $dir scopedobject.itcl]]
+set auto_index(::iwidgets::Scopedobject::_traceCommand) [list source [file join $dir scopedobject.itcl]]
+set auto_index(::iwidgets::Scopedobject::enterscopecommand) [list source [file join $dir scopedobject.itcl]]
+set auto_index(::iwidgets::Scopedobject::exitscopecommand) [list source [file join $dir scopedobject.itcl]]
diff --git a/iwidgets/generic/timeentry.itk b/iwidgets/generic/timeentry.itk
new file mode 100644
index 00000000000..58a19ae090a
--- /dev/null
+++ b/iwidgets/generic/timeentry.itk
@@ -0,0 +1,398 @@
+#
+# Timeentry
+# ----------------------------------------------------------------------
+# Implements a quicken style time entry field with a popup clock
+# by combining the timefield and watch widgets together. This
+# allows a user to enter the time via the keyboard or by using the
+# mouse by selecting the watch icon which brings up a popup clock.
+# ----------------------------------------------------------------------
+# AUTHOR: Mark L. Ulferts E-mail: mulferts@austin.dsccc.com
+#
+# @(#) $Id$
+# ----------------------------------------------------------------------
+# Copyright (c) 1997 DSC Technologies Corporation
+# ======================================================================
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPTIMES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+
+#
+# Usual options.
+#
+itk::usual Timeentry {
+ keep -background -borderwidth -cursor -foreground -highlightcolor \
+ -highlightthickness -labelfont -textbackground -textfont
+}
+
+# ------------------------------------------------------------------
+# TIMEENTRY
+# ------------------------------------------------------------------
+itcl::class iwidgets::Timeentry {
+ inherit iwidgets::Timefield
+
+ constructor {args} {}
+
+ itk_option define -grab grab Grab "global"
+ itk_option define -icon icon Icon {}
+ itk_option define -state state State normal
+ itk_option define -closetext closeText Text Close
+
+ #
+ # The watch widget isn't created until needed, yet we need
+ # its options to be available upon creation of a timeentry widget.
+ # So, we'll define them in these class now so they can just be
+ # propagated onto the watch later.
+ #
+ itk_option define -hourradius hourRadius Radius .50
+ itk_option define -hourcolor hourColor Color red
+
+ itk_option define -minuteradius minuteRadius Radius .80
+ itk_option define -minutecolor minuteColor Color yellow
+
+ itk_option define -pivotradius pivotRadius Radius .10
+ itk_option define -pivotcolor pivotColor Color white
+
+ itk_option define -secondradius secondRadius Radius .90
+ itk_option define -secondcolor secondColor Color black
+
+ itk_option define -clockcolor clockColor Color white
+ itk_option define -clockstipple clockStipple ClockStipple {}
+
+ itk_option define -tickcolor tickColor Color black
+
+ itk_option define -watchheight watchHeight Height 175
+ itk_option define -watchwidth watchWidth Width 155
+
+ protected {
+ method _getPopupTime {}
+ method _releaseGrab {}
+ method _popup {}
+ method _getDefaultIcon {}
+
+ common _defaultIcon ""
+ }
+}
+
+#
+# Provide a lowercased access method for the timeentry class.
+#
+proc ::iwidgets::timeentry {pathName args} {
+ uplevel ::iwidgets::Timeentry $pathName $args
+}
+
+#
+# Use option database to override default resources of base classes.
+#
+option add *Timeentry.watchWidth 155 widgetDefault
+option add *Timeentry.watchHeight 175 widgetDefault
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Timeentry::constructor {args} {
+ #
+ # Create an icon label to act as a button to bring up the
+ # watch popup.
+ #
+ itk_component add iconbutton {
+ label $itk_interior.iconbutton -relief raised
+ } {
+ keep -borderwidth -cursor -foreground
+ }
+ grid $itk_component(iconbutton) -row 0 -column 0 -sticky ns
+
+ #
+ # Initialize the widget based on the command line options.
+ #
+ eval itk_initialize $args
+}
+
+# ------------------------------------------------------------------
+# OPTIONS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# OPTION: -icon
+#
+# Specifies the clock icon image to be used in the time entry.
+# Should one not be provided, then a default pixmap will be used
+# if possible, bitmap otherwise.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Timeentry::icon {
+ if {$itk_option(-icon) == {}} {
+ $itk_component(iconbutton) configure -image [_getDefaultIcon]
+ } else {
+ if {[lsearch [image names] $itk_option(-icon)] == -1} {
+ error "bad icon option \"$itk_option(-icon)\":\
+ should be an existing image"
+ } else {
+ $itk_component(iconbutton) configure -image $itk_option(-icon)
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -grab
+#
+# Specifies the grab level, local or global, to be obtained when
+# bringing up the popup watch. The default is global.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Timeentry::grab {
+ switch -- $itk_option(-grab) {
+ "local" - "global" {}
+ default {
+ error "bad grab option \"$itk_option(-grab)\":\
+ should be local or global"
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -state
+#
+# Specifies the state of the widget which may be disabled or
+# normal. A disabled state prevents selection of the time field
+# or time icon button.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Timeentry::state {
+ switch -- $itk_option(-state) {
+ normal {
+ bind $itk_component(iconbutton) <Button-1> [itcl::code $this _popup]
+ }
+ disabled {
+ bind $itk_component(iconbutton) <Button-1> {}
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# METHODS
+# ------------------------------------------------------------------
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _getDefaultIcon
+#
+# This method is invoked uto retrieve the name of the default icon
+# image displayed in the icon button.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Timeentry::_getDefaultIcon {} {
+
+ if {[lsearch [image types] pixmap] != -1} {
+ set _defaultIcon [image create pixmap -data {
+ /* XPM */
+ static char *watch1a[] = {
+ /* width height num_colors chars_per_pixel */
+ " 20 20 8 1",
+ /* colors */
+ ". c #000000",
+ "# c #000099",
+ "a c #009999",
+ "b c #999999",
+ "c c #cccccc",
+ "d c #ffff00",
+ "e c #d9d9d9",
+ "f c #ffffff",
+ /* pixels */
+ "eeeeebbbcccccbbbeeee",
+ "eeeee...#####..beeee",
+ "eeeee#aacccccaabeeee",
+ "eeee#accccccccc##eee",
+ "eee#ccc#cc#ccdcff#ee",
+ "ee#accccccccccfcca#e",
+ "eeaccccccc.cccfcccae",
+ "eeac#cccfc.cccc##cae",
+ "e#cccccffc.cccccccc#",
+ "e#ccccfffc.cccccccc#",
+ "e#cc#ffcc......c#cc#",
+ "e#ccfffccc.cccccccc#",
+ "e#cffccfcc.cccccccc#",
+ "eeafdccfcccccccd#cae",
+ "eeafcffcccccccccccae",
+ "eee#fcc#cccccdccc#ee",
+ "eee#fcc#cc#cc#ccc#ee",
+ "eeee#accccccccc##eee",
+ "eeeee#aacccccaabeeee",
+ "eeeee...#####..beeee"
+ };
+ }]
+ } else {
+ set _defaultIcon [image create bitmap -data {
+ #define watch1a_width 20
+ #define watch1a_height 20
+ static char watch1a_bits[] = {
+ 0x40,0x40,0xf0,0xe0,0x7f,0xf0,0xe0,0xe0,0xf0,0x30,
+ 0x80,0xf1,0x88,0x04,0xf2,0x0c,0x00,0xf6,0x04,0x04,
+ 0xf4,0x94,0x84,0xf5,0x02,0x06,0xf8,0x02,0x0c,0xf8,
+ 0x12,0x7e,0xf9,0x02,0x04,0xf8,0x02,0x24,0xf8,0x04,
+ 0x00,0xf5,0x04,0x00,0xf4,0x88,0x02,0xf2,0x88,0x64,
+ 0xf2,0x30,0x80,0xf1,0xe0,0x60,0xf0,0xe0,0xff,0xf0};
+ }]
+ }
+
+ #
+ # Since this image will only need to be created once, we redefine
+ # this method to just return the image name for subsequent calls.
+ #
+ itcl::body ::iwidgets::Timeentry::_getDefaultIcon {} {
+ return $_defaultIcon
+ }
+
+ return $_defaultIcon
+}
+
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _popup
+#
+# This method is invoked upon selection of the icon button. It
+# creates a watch widget within a toplevel popup, calculates
+# the position at which to display the watch, performs a grab
+# and displays the watch.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Timeentry::_popup {} {
+ #
+ # First, let's nullify the icon binding so that any another
+ # selections are ignored until were done with this one. Next,
+ # change the relief of the icon.
+ #
+ bind $itk_component(iconbutton) <Button-1> {}
+ $itk_component(iconbutton) configure -relief sunken
+
+ #
+ # Create a withdrawn toplevel widget and remove the window
+ # decoration via override redirect.
+ #
+ itk_component add -private popup {
+ toplevel $itk_interior.popup
+ }
+ $itk_component(popup) configure -borderwidth 2 -background black
+ wm withdraw $itk_component(popup)
+ wm overrideredirect $itk_component(popup) 1
+
+ #
+ # Add a binding to for Escape to always release the grab.
+ #
+ bind $itk_component(popup) <KeyPress-Escape> [itcl::code $this _releaseGrab]
+
+ #
+ # Create the watch widget.
+ #
+ itk_component add watch {
+ iwidgets::Watch $itk_component(popup).watch
+ } {
+ usual
+
+ rename -width -watchwidth watchWidth Width
+ rename -height -watchheight watchHeight Height
+
+ keep -hourradius -minuteradius -minutecolor -pivotradius -pivotcolor \
+ -secondradius -secondcolor -clockcolor -clockstipple -tickcolor
+ }
+ grid $itk_component(watch) -row 0 -column 0
+ $itk_component(watch) configure -cursor top_left_arrow
+
+ #
+ # Create a button widget so the user can say they are done.
+ #
+ itk_component add close {
+ button $itk_component(popup).close -command [itcl::code $this _getPopupTime]
+ } {
+ usual
+ rename -text -closetext closeText Text
+ }
+ grid $itk_component(close) -row 1 -column 0 -sticky ew
+ $itk_component(close) configure -cursor top_left_arrow
+
+ #
+ # The icon button will be used as the basis for the position of the
+ # popup on the screen. We'll always attempt to locate the popup
+ # off the lower right corner of the button. If that would put
+ # the popup off the screen, then we'll put above the upper left.
+ #
+ set rootx [winfo rootx $itk_component(iconbutton)]
+ set rooty [winfo rooty $itk_component(iconbutton)]
+ set popupwidth [cget -watchwidth]
+ set popupheight [expr {[cget -watchheight] + \
+ [winfo reqheight $itk_component(close)]}]
+
+ set popupx [expr {$rootx + 3 + \
+ [winfo width $itk_component(iconbutton)]}]
+ set popupy [expr {$rooty + 3 + \
+ [winfo height $itk_component(iconbutton)]}]
+
+ if {(($popupx + $popupwidth) > [winfo screenwidth .]) || \
+ (($popupy + $popupheight) > [winfo screenheight .])} {
+ set popupx [expr {$rootx - 3 - $popupwidth}]
+ set popupy [expr {$rooty - 3 - $popupheight}]
+ }
+
+ #
+ # Get the current time from the timefield widget and both
+ # show and select it on the watch.
+ #
+ $itk_component(watch) show [get]
+
+ #
+ # Display the popup at the calculated position.
+ #
+ wm geometry $itk_component(popup) +$popupx+$popupy
+ wm deiconify $itk_component(popup)
+ tkwait visibility $itk_component(popup)
+
+ #
+ # Perform either a local or global grab based on the -grab option.
+ #
+ if {$itk_option(-grab) == "local"} {
+ grab $itk_component(popup)
+ } else {
+ grab -global $itk_component(popup)
+ }
+
+ #
+ # Make sure the widget is above all others and give it focus.
+ #
+ raise $itk_component(popup)
+ focus $itk_component(watch)
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _popupGetTime
+#
+# This method is the callback for selection of a time on the
+# watch. It releases the grab and sets the time in the
+# timefield widget.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Timeentry::_getPopupTime {} {
+ show [$itk_component(watch) get -clicks]
+ _releaseGrab
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _releaseGrab
+#
+# This method releases the grab, destroys the popup, changes the
+# relief of the button back to raised and reapplies the binding
+# to the icon button that engages the popup action.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Timeentry::_releaseGrab {} {
+ grab release $itk_component(popup)
+ $itk_component(iconbutton) configure -relief raised
+ destroy $itk_component(popup)
+ bind $itk_component(iconbutton) <Button-1> [itcl::code $this _popup]
+}
diff --git a/iwidgets/generic/timefield.itk b/iwidgets/generic/timefield.itk
new file mode 100644
index 00000000000..ee99e383059
--- /dev/null
+++ b/iwidgets/generic/timefield.itk
@@ -0,0 +1,1018 @@
+#
+# Timefield
+# ----------------------------------------------------------------------
+# Implements a time entry field with adjustable built-in intelligence
+# levels.
+# ----------------------------------------------------------------------
+# AUTHOR: John A. Tucker E-mail: jatucker@austin.dsccc.com
+#
+# @(#) $Id$
+# ----------------------------------------------------------------------
+# Copyright (c) 1997 DSC Technologies Corporation
+# ======================================================================
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+
+#
+# Use option database to override default resources of base classes.
+#
+option add *Timefield.justify center widgetDefault
+
+
+#
+# Usual options.
+#
+itk::usual Timefield {
+ keep -background -borderwidth -cursor -foreground -highlightcolor \
+ -highlightthickness -labelfont -textbackground -textfont
+}
+
+# ------------------------------------------------------------------
+# TIMEFIELD
+# ------------------------------------------------------------------
+itcl::class iwidgets::Timefield {
+
+ inherit iwidgets::Labeledwidget
+
+ constructor {args} {}
+
+ itk_option define -childsitepos childSitePos Position e
+ itk_option define -command command Command {}
+ itk_option define -seconds seconds Seconds on
+ itk_option define -format format Format civilian
+ itk_option define -iq iq Iq high
+ itk_option define -gmt gmt GMT no
+ itk_option define -state state State normal
+
+ public {
+ method get {{format "-string"}}
+ method isvalid {}
+ method show {{time "now"}}
+ }
+
+ protected {
+ method _backwardCivilian {}
+ method _backwardMilitary {}
+ method _focusIn {}
+ method _forwardCivilian {}
+ method _forwardMilitary {}
+ method _keyPress {char sym state}
+ method _moveField {direction}
+ method _setField {field}
+ method _whichField {}
+ method _toggleAmPm {}
+
+ variable _cfield hour
+ variable _formatString "%r"
+ variable _fields {}
+ variable _numFields 4
+ variable _forward {}
+ variable _backward {}
+ variable _timeVar ""
+
+ common _militaryFields {hour minute second}
+ common _civilianFields {hour minute second ampm}
+ }
+}
+
+#
+# Provide a lowercased access method for the timefield class.
+#
+proc iwidgets::timefield {pathName args} {
+ uplevel iwidgets::Timefield $pathName $args
+}
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Timefield::constructor {args} {
+ component hull configure -borderwidth 0
+
+ #
+ # Create an entry field for entering the time.
+ #
+ itk_component add time {
+ entry $itk_interior.time
+ } {
+ keep -borderwidth -cursor -exportselection \
+ -foreground -highlightcolor -highlightthickness \
+ -insertbackground -justify -relief -textvariable
+
+ rename -font -textfont textFont Font
+ rename -highlightbackground -background background Background
+ rename -background -textbackground textBackground Background
+ }
+
+ #
+ # Create the child site widget.
+ #
+ itk_component add -protected dfchildsite {
+ frame $itk_interior.dfchildsite
+ }
+ set itk_interior $itk_component(dfchildsite)
+
+ #
+ # Add timefield event bindings for focus in and keypress events.
+ #
+ bind $itk_component(time) <FocusIn> [itcl::code $this _focusIn]
+ bind $itk_component(time) <KeyPress> [itcl::code $this _keyPress %A %K %s]
+ bind $itk_component(time) <1> "focus $itk_component(time); break"
+
+ #
+ # Disable some mouse button event bindings:
+ # Button Motion
+ # Double-Clicks
+ # Triple-Clicks
+ # Button2
+ #
+ bind $itk_component(time) <Button1-Motion> break
+ bind $itk_component(time) <Button2-Motion> break
+ bind $itk_component(time) <Double-Button> break
+ bind $itk_component(time) <Triple-Button> break
+ bind $itk_component(time) <2> break
+
+ #
+ # Initialize the widget based on the command line options.
+ #
+ eval itk_initialize $args
+
+ #
+ # Initialize the time to the current time.
+ #
+ show
+}
+
+# ------------------------------------------------------------------
+# OPTIONS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# OPTION: -childsitepos
+#
+# Specifies the position of the child site in the widget. Valid
+# locations are n, s, e, and w.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Timefield::childsitepos {
+ set parent [winfo parent $itk_component(time)]
+
+ switch $itk_option(-childsitepos) {
+ n {
+ grid $itk_component(dfchildsite) -row 0 -column 0 -sticky ew
+ grid $itk_component(time) -row 1 -column 0 -sticky nsew
+
+ grid rowconfigure $parent 0 -weight 0
+ grid rowconfigure $parent 1 -weight 1
+ grid columnconfigure $parent 0 -weight 1
+ grid columnconfigure $parent 1 -weight 0
+ }
+
+ e {
+ grid $itk_component(dfchildsite) -row 0 -column 1 -sticky ns
+ grid $itk_component(time) -row 0 -column 0 -sticky nsew
+
+ grid rowconfigure $parent 0 -weight 1
+ grid rowconfigure $parent 1 -weight 0
+ grid columnconfigure $parent 0 -weight 1
+ grid columnconfigure $parent 1 -weight 0
+ }
+
+ s {
+ grid $itk_component(dfchildsite) -row 1 -column 0 -sticky ew
+ grid $itk_component(time) -row 0 -column 0 -sticky nsew
+
+ grid rowconfigure $parent 0 -weight 1
+ grid rowconfigure $parent 1 -weight 0
+ grid columnconfigure $parent 0 -weight 1
+ grid columnconfigure $parent 1 -weight 0
+ }
+
+ w {
+ grid $itk_component(dfchildsite) -row 0 -column 0 -sticky ns
+ grid $itk_component(time) -row 0 -column 1 -sticky nsew
+
+ grid rowconfigure $parent 0 -weight 1
+ grid rowconfigure $parent 1 -weight 0
+ grid columnconfigure $parent 0 -weight 0
+ grid columnconfigure $parent 1 -weight 1
+ }
+
+ default {
+ error "bad childsite option\
+ \"$itk_option(-childsitepos)\":\
+ should be n, e, s, or w"
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -command
+#
+# Command invoked upon detection of return key press event.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Timefield::command {}
+
+# ------------------------------------------------------------------
+# OPTION: -iq
+#
+# Specifies the level of intelligence to be shown in the actions
+# taken by the time field during the processing of keypress events.
+# Valid settings include high or low. With a high iq,
+# the time prevents the user from typing in an invalid time. For
+# example, if the current time is 05/31/1997 and the user changes
+# the hour to 04, then the minute will be instantly modified for them
+# to be 30. In addition, leap seconds are fully taken into account.
+# A setting of low iq instructs the widget to do no validity checking
+# at all during time entry. With a low iq level, it is assumed that
+# the validity will be determined at a later time using the time's
+# isvalid command.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Timefield::iq {
+
+ switch $itk_option(-iq) {
+ high - low {
+
+ }
+ default {
+ error "bad iq option \"$itk_option(-iq)\": should be high or low"
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -format
+#
+# Specifies the time format displayed in the entry widget.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Timefield::format {
+
+ switch $itk_option(-format) {
+ civilian {
+ set _backward _backwardCivilian
+ set _forward _forwardCivilian
+ set _fields $_civilianFields
+ set _numFields 4
+ set _formatString "%r"
+ $itk_component(time) config -width 11
+ }
+ military {
+ set _backward _backwardMilitary
+ set _forward _forwardMilitary
+ set _fields $_militaryFields
+ set _numFields 3
+ set _formatString "%T"
+ $itk_component(time) config -width 8
+ }
+ default {
+ error "bad iq option \"$itk_option(-iq)\":\
+ should be civilian or military"
+ }
+ }
+
+ #
+ # Update the current contents of the entry field to reflect
+ # the configured format.
+ #
+ show $_timeVar
+}
+
+# ------------------------------------------------------------------
+# OPTION: -gmt
+#
+# This option is used for GMT time. Must be a boolean value.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Timefield::gmt {
+ switch $itk_option(-gmt) {
+ 0 - no - false - off { }
+ 1 - yes - true - on { }
+ default {
+ error "bad gmt option \"$itk_option(-gmt)\": should be boolean"
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -state
+#
+# Disable the
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Timefield::state {
+ switch -- $itk_option(-state) {
+ normal {
+ $itk_component(time) configure -state normal
+ }
+ disabled {
+ focus $itk_component(hull)
+ $itk_component(time) configure -state disabled
+ }
+ default {
+ error "Invalid value for -state: $itk_option(-state). Should be\
+ \"normal\" or \"disabled\"."
+ }
+ }
+}
+
+
+# ------------------------------------------------------------------
+# METHODS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# PUBLIC METHOD: get ?format?
+#
+# Return the current contents of the timefield in one of two formats
+# string or as an integer clock value using the -string and -clicks
+# options respectively. The default is by string. Reference the
+# clock command for more information on obtaining times and their
+# formats.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Timefield::get {{format "-string"}} {
+ set _timeVar [$itk_component(time) get]
+
+ switch -- $format {
+ "-string" {
+ return $_timeVar
+ }
+ "-clicks" {
+ return [::clock scan $_timeVar -gmt $itk_option(-gmt)]
+ }
+ default {
+ error "bad format option \"$format\":\
+ should be -string or -clicks"
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# PUBLIC METHOD: show time
+#
+# Changes the currently displayed time to be that of the time
+# argument. The time may be specified either as a string or an
+# integer clock value. Reference the clock command for more
+# information on obtaining times and their formats.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Timefield::show {{time "now"}} {
+ set icursor [$itk_component(time) index insert]
+
+ if {$time == {}} {
+ set time "now"
+ }
+
+ switch -regexp -- $time {
+
+ {^now$} {
+ set seconds [::clock seconds]
+ }
+
+ {^[0-9]+$} {
+ if { [catch {::clock format $time -gmt $itk_option(-gmt)}] } {
+ error "bad time: \"$time\", must be a valid time \
+ string, clock clicks value or the keyword now"
+ }
+ set seconds $time
+ }
+
+ default {
+ if {[catch {set seconds [::clock scan $time -gmt $itk_option(-gmt)]}]} {
+ error "bad time: \"$time\", must be a valid time \
+ string, clock clicks value or the keyword now"
+ }
+ }
+ }
+
+ set _timeVar [::clock format $seconds -format $_formatString \
+ -gmt $itk_option(-gmt)]
+
+ $itk_component(time) delete 0 end
+ $itk_component(time) insert end $_timeVar
+ $itk_component(time) icursor $icursor
+
+ return $_timeVar
+}
+
+# ------------------------------------------------------------------
+# PUBLIC METHOD: isvalid
+#
+# Returns a boolean indication of the validity of the currently
+# displayed time value. For example, 09:59::59 is valid whereas
+# 26:59:59 is invalid.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Timefield::isvalid {} {
+ set _timeVar [$itk_component(time) get]
+ return [expr {([catch {::clock scan $_timeVar -gmt $itk_option(-gmt)}] == 0)}]
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _focusIn
+#
+# This method is bound to the <FocusIn> event. It resets the
+# insert cursor and field settings to be back to their last known
+# positions.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Timefield::_focusIn {} {
+ _setField $_cfield
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _keyPress
+#
+# This method is the workhorse of the class. It is bound to the
+# <KeyPress> event and controls the processing of all key strokes.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Timefield::_keyPress {char sym state} {
+
+ #
+ # Determine which field we are in currently. This is needed
+ # since the user may have moved to this position via a mouse
+ # selection and so it would not be in the position we last
+ # knew it to be.
+ #
+ set _cfield [_whichField ]
+
+ #
+ # Set up a few basic variables we'll be needing throughout the
+ # rest of the method such as the position of the insert cursor
+ # and the currently displayed minute, hour, and second.
+ #
+ set inValid 0
+ set icursor [$itk_component(time) index insert]
+ set lastField [lindex $_fields end]
+
+ set prevtime $_timeVar
+ regexp {^([0-9])([0-9]):([0-9])([0-9]):([0-9])([0-9]).*$} \
+ $_timeVar dummy \
+ hour1 hour2 minute1 minute2 second1 second2
+ set hour "$hour1$hour2"
+ set minute "$minute1$minute2"
+ set second "$second1$second2"
+
+ #
+ # Process numeric keystrokes. This involes a fair amount of
+ # processing with step one being to check and make sure we
+ # aren't attempting to insert more that 6 characters. If
+ # so ring the bell and break.
+ #
+ if {![catch {expr {int($char)}}]} {
+
+ # If we are currently in the hour field then we process the
+ # number entered based on the cursor position. If we are at
+ # at the first position and our iq is low, then accept any
+ # input.
+ #
+ # if the current format is military, then
+ # validate the hour field which can be [00 - 23]
+ #
+ switch $_cfield {
+ hour {
+ if {$itk_option(-iq) == "low"} {
+ $itk_component(time) delete $icursor
+ $itk_component(time) insert $icursor $char
+
+ } elseif {$itk_option(-format) == "military"} {
+ if {$icursor == 0} {
+ #
+ # if the digit is less than 2, then
+ # the second hour digit is valid for 0-9
+ #
+ if {$char < 2} {
+ $itk_component(time) delete 0 1
+ $itk_component(time) insert 0 $char
+
+ #
+ # if the digit is equal to 2, then
+ # the second hour digit is valid for 0-3
+ #
+ } elseif {$char == 2} {
+ $itk_component(time) delete 0 1
+ $itk_component(time) insert 0 $char
+
+ if {$hour2 > 3} {
+ $itk_component(time) delete 1 2
+ $itk_component(time) insert 1 "0"
+ $itk_component(time) icursor 1
+ }
+
+ #
+ # if the digit is greater than 2, then
+ # set the first hour digit to 0 and the
+ # second hour digit to the value.
+ #
+ } elseif {$char > 2} {
+ $itk_component(time) delete 0 2
+ $itk_component(time) insert 0 "0$char"
+ set icursor 1
+ } else {
+ set inValid 1
+ }
+
+ #
+ # if the insertion cursor is for the second hour digit, then
+ # format is military, then it can only be valid if the first
+ # hour digit is less than 2 or the new digit is less than 4
+ #
+ } else {
+ if {$hour1 < 2 || $char < 4} {
+ $itk_component(time) delete 1 2
+ $itk_component(time) insert 1 $char
+ } else {
+ set inValid 1
+ }
+ }
+
+ #
+ # The format is civilian, so we need to
+ # validate the hour field which can be [01 - 12]
+ #
+ } else {
+ if {$icursor == 0} {
+ #
+ # if the digit is 0, then
+ # the second hour digit is valid for 1-9
+ # so just insert it.
+ #
+ if {$char == 0 && $hour2 != 0} {
+ $itk_component(time) delete 0 1
+ $itk_component(time) insert 0 $char
+
+ #
+ # if the digit is equal to 1, then
+ # the second hour digit is valid for 0-2
+ #
+ } elseif {$char == 1} {
+ $itk_component(time) delete 0 1
+ $itk_component(time) insert 0 $char
+
+ if {$hour2 > 2} {
+ $itk_component(time) delete 1 2
+ $itk_component(time) insert 1 0
+ set icursor 1
+ }
+
+ #
+ # if the digit is greater than 1, then
+ # set the first hour digit to 0 and the
+ # second hour digit to the value.
+ #
+ } elseif {$char > 1} {
+ $itk_component(time) delete 0 2
+ $itk_component(time) insert 0 "0$char"
+ set icursor 1
+
+ } else {
+ set inValid 1
+ }
+
+ #
+ # The insertion cursor is at the second hour digit, so
+ # it can only be valid if the firs thour digit is 0
+ # or the new digit is less than or equal to 2
+ #
+ } else {
+ if {$hour1 == 0 || $char <= 2} {
+ $itk_component(time) delete 1 2
+ $itk_component(time) insert 1 $char
+ } else {
+ set inValid 1
+ }
+ }
+ }
+
+ if {$inValid} {
+ bell
+ } elseif {$icursor == 1} {
+ _setField minute
+ }
+ }
+
+ minute {
+ if {$itk_option(-iq) == "low" || $char < 6 || $icursor == 4} {
+ $itk_component(time) delete $icursor
+ $itk_component(time) insert $icursor $char
+ } elseif {$itk_option(-iq) == "high"} {
+ if {$char > 5} {
+ $itk_component(time) delete 3 5
+ $itk_component(time) insert 3 "0$char"
+ set icursor 4
+ }
+ }
+
+ if {$icursor == 4} {
+ _setField second
+ }
+ }
+
+ second {
+ if {$itk_option(-iq) == "low" || $char < 6 || $icursor == 7} {
+ $itk_component(time) delete $icursor
+ $itk_component(time) insert $icursor $char
+
+ } elseif {$itk_option(-iq) == "high"} {
+ if {$char > 5} {
+ $itk_component(time) delete 6 8
+ $itk_component(time) insert 6 "0$char"
+ set icursor 7
+ }
+ }
+
+ if {$icursor == 7} {
+ _moveField forward
+ }
+ }
+ }
+
+ set _timeVar [$itk_component(time) get]
+ return -code break
+ }
+
+ #
+ # Process the plus and the up arrow keys. They both yield the same
+ # effect, they increment the minute by one.
+ #
+ switch $sym {
+ p - P {
+ if {$itk_option(-format) == "civilian"} {
+ $itk_component(time) delete 9 10
+ $itk_component(time) insert 9 P
+ _setField hour
+ }
+ }
+
+ a - A {
+ if {$itk_option(-format) == "civilian"} {
+ $itk_component(time) delete 9 10
+ $itk_component(time) insert 9 A
+ _setField hour
+ }
+ }
+
+ plus - Up {
+ if {$_cfield == "ampm"} {
+ _toggleAmPm
+ } else {
+ set newclicks [::clock scan "$prevtime 1 $_cfield"]
+ show [::clock format $newclicks -format $_formatString]
+ }
+ }
+
+ minus - Down {
+ #
+ # Process the minus and the down arrow keys which decrement the value
+ # of the field in which the cursor is currently positioned.
+ #
+ if {$_cfield == "ampm"} {
+ _toggleAmPm
+ } else {
+ set newclicks [::clock scan "$prevtime 1 $_cfield ago"]
+ show [::clock format $newclicks -format $_formatString]
+ }
+ }
+
+ Tab {
+ #
+ # A tab key moves the "hour:minute:second" field forward by one unless
+ # the current field is the second. In that case we'll let tab
+ # do what is supposed to and pass the focus onto the next widget.
+ #
+ if {$state == 0} {
+
+ if {($itk_option(-format) == "civilian" && $_cfield == $lastField)} {
+ _setField hour
+ return -code continue
+ }
+ _moveField forward
+
+ #
+ # A ctrl-tab key moves the hour:minute:second field backwards by one
+ # unless the current field is the hour. In that case we'll let
+ # tab take the focus to a previous widget.
+ #
+ } elseif {$state == 4} {
+ if {$_cfield == "hour"} {
+ _setField hour
+ return -code continue
+ }
+ _moveField backward
+ }
+ }
+
+ Right {
+ #
+ # A right arrow key moves the insert cursor to the right one.
+ #
+ $_forward
+ }
+
+ Left - BackSpace - Delete {
+ #
+ # A left arrow, backspace, or delete key moves the insert cursor
+ # to the left one. This is what you expect for the left arrow
+ # and since the whole widget always operates in overstrike mode,
+ # it makes the most sense for backspace and delete to do the same.
+ #
+ $_backward
+ }
+
+ Return {
+ #
+ # A Return key invokes the optionally specified command option.
+ #
+ uplevel #0 $itk_option(-command)
+ }
+
+ default {
+
+ }
+ }
+
+ return -code break
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _toggleAmPm
+#
+# Internal method which toggles the displayed time
+# between "AM" and "PM" when format is "civilian".
+# ------------------------------------------------------------------
+itcl::body iwidgets::Timefield::_toggleAmPm {} {
+ set firstChar [string index $_timeVar 9]
+ $itk_component(time) delete 9 10
+ $itk_component(time) insert 9 [expr {($firstChar == "A") ? "P" : "A"}]
+ $itk_component(time) icursor 9
+ set _timeVar [$itk_component(time) get]
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _setField field
+#
+# Adjusts the current field to be that of the argument, setting the
+# insert cursor appropriately.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Timefield::_setField {field} {
+
+ # Move the position of the cursor to the first character of the
+ # field given by the argument:
+ #
+ # Field First Character Index
+ # ----- ---------------------
+ # hour 0
+ # minute 3
+ # second 6
+ # ampm 9
+ #
+ switch $field {
+ hour {
+ $itk_component(time) icursor 0
+ }
+ minute {
+ $itk_component(time) icursor 3
+ }
+ second {
+ $itk_component(time) icursor 6
+ }
+ ampm {
+ if {$itk_option(-format) == "military"} {
+ error "bad field: \"$field\", must be hour, minute or second"
+ }
+ $itk_component(time) icursor 9
+ }
+ default {
+ if {$itk_option(-format) == "military"} {
+ error "bad field: \"$field\", must be hour, minute or second"
+ } else {
+ error "bad field: \"$field\", must be hour, minute, second or ampm"
+ }
+ }
+ }
+
+ set _cfield $field
+
+ return $_cfield
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _moveField
+#
+# Moves the cursor one field forward or backward.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Timefield::_moveField {direction} {
+
+ # Since the value "_fields" list variable is always either value:
+ # military => {hour minute second}
+ # civilian => {hour minute second ampm}
+ #
+ # the index of the previous or next field index can be determined
+ # by subtracting or adding 1 to current the index, respectively.
+ #
+ set index [lsearch $_fields $_cfield]
+ expr {($direction == "forward") ? [incr index] : [incr index -1]}
+
+ if {$index == $_numFields} {
+ set index 0
+ } elseif {$index < 0} {
+ set index [expr {$_numFields-1}]
+ }
+
+ _setField [lindex $_fields $index]
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _whichField
+#
+# Returns the current field that the cursor is positioned within.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Timefield::_whichField {} {
+
+ # Return the current field based on the position of the cursor.
+ #
+ # Field Index
+ # ----- -----
+ # hour 0,1
+ # minute 3,4
+ # second 6,7
+ # ampm 9,10
+ #
+ set icursor [$itk_component(time) index insert]
+ switch $icursor {
+ 0 - 1 {
+ set _cfield hour
+ }
+ 3 - 4 {
+ set _cfield minute
+ }
+ 6 - 7 {
+ set _cfield second
+ }
+ 9 - 10 {
+ set _cfield ampm
+ }
+ }
+
+ return $_cfield
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _forwardCivilian
+#
+# Internal method which moves the cursor forward by one character
+# jumping over the slashes and wrapping.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Timefield::_forwardCivilian {} {
+
+ #
+ # If the insertion cursor is at the second digit
+ # of either the hour, minute or second field, then
+ # move the cursor to the first digit of the right-most field.
+ #
+ # else move the insertion cursor right one character
+ #
+ set icursor [$itk_component(time) index insert]
+ switch $icursor {
+ 1 {
+ _setField minute
+ }
+ 4 {
+ _setField second
+ }
+ 7 {
+ _setField ampm
+ }
+ 9 - 10 {
+ _setField hour
+ }
+ default {
+ $itk_component(time) icursor [expr {$icursor+1}]
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _forwardMilitary
+#
+# Internal method which moves the cursor forward by one character
+# jumping over the slashes and wrapping.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Timefield::_forwardMilitary {} {
+
+ #
+ # If the insertion cursor is at the second digit of either
+ # the hour, minute or second field, then move the cursor to
+ # the first digit of the right-most field.
+ #
+ # else move the insertion cursor right one character
+ #
+ set icursor [$itk_component(time) index insert]
+ switch $icursor {
+ 1 {
+ _setField minute
+ }
+ 4 {
+ _setField second
+ }
+ 7 {
+ _setField hour
+ }
+ default {
+ $itk_component(time) icursor [expr {$icursor+1}]
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _backwardCivilian
+#
+# Internal method which moves the cursor backward by one character
+# jumping over the ":" and wrapping.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Timefield::_backwardCivilian {} {
+
+ #
+ # If the insertion cursor is at the first character
+ # of either the minute or second field or at the ampm
+ # field, then move the cursor to the second character
+ # of the left-most field.
+ #
+ # else if the insertion cursor is at the first digit of the
+ # hour field, then move the cursor to the first character
+ # of the ampm field.
+ #
+ # else move the insertion cursor left one character
+ #
+ set icursor [$itk_component(time) index insert]
+ switch $icursor {
+ 9 {
+ _setField second
+ $itk_component(time) icursor 7
+ }
+ 6 {
+ _setField minute
+ $itk_component(time) icursor 4
+ }
+ 3 {
+ _setField hour
+ $itk_component(time) icursor 1
+ }
+ 0 {
+ _setField ampm
+ $itk_component(time) icursor 9
+ }
+ default {
+ $itk_component(time) icursor [expr {$icursor-1}]
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _backwardMilitary
+#
+# Internal method which moves the cursor backward by one character
+# jumping over the slashes and wrapping.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Timefield::_backwardMilitary {} {
+
+ #
+ # If the insertion cursor is at the first digit of either
+ # the minute or second field, then move the cursor to the
+ # second character of the left-most field.
+ #
+ # else if the insertion cursor is at the first digit of the
+ # hour field, then move the cursor to the second digit
+ # of the second field.
+ #
+ # else move the insertion cursor left one character
+ #
+ set icursor [$itk_component(time) index insert]
+ switch $icursor {
+ 6 {
+ _setField minute
+ $itk_component(time) icursor 4
+ }
+ 3 {
+ _setField hour
+ $itk_component(time) icursor 1
+ }
+ 0 {
+ _setField second
+ $itk_component(time) icursor 7
+ }
+ default {
+ $itk_component(time) icursor [expr {$icursor-1}]
+ }
+ }
+}
diff --git a/iwidgets/generic/toolbar.itk b/iwidgets/generic/toolbar.itk
new file mode 100644
index 00000000000..f49d7aa8348
--- /dev/null
+++ b/iwidgets/generic/toolbar.itk
@@ -0,0 +1,983 @@
+#
+# Toolbar
+# ----------------------------------------------------------------------
+#
+# The Toolbar command creates a new window (given by the pathName
+# argument) and makes it into a Tool Bar widget. Additional options,
+# described above may be specified on the command line or in the
+# option database to configure aspects of the Toolbar such as its
+# colors, font, and orientation. The Toolbar command returns its
+# pathName argument. At the time this command is invoked, there
+# must not exist a window named pathName, but pathName's parent
+# must exist.
+#
+# A Toolbar is a widget that displays a collection of widgets arranged
+# either in a row or a column (depending on the value of the -orient
+# option). This collection of widgets is usually for user convenience
+# to give access to a set of commands or settings. Any widget may be
+# placed on a Toolbar. However, command or value-oriented widgets (such
+# as button, radiobutton, etc.) are usually the most useful kind of
+# widgets to appear on a Toolbar.
+#
+# WISH LIST:
+# This section lists possible future enhancements.
+#
+# Toggle between text and image/bitmap so that the toolbar could
+# display either all text or all image/bitmaps.
+# Implementation of the -toolbarfile option that allows toolbar
+# add commands to be read in from a file.
+# ----------------------------------------------------------------------
+# AUTHOR: Bill W. Scott EMAIL: bscott@spd.dsccc.com
+#
+# @(#) $Id$
+# ----------------------------------------------------------------------
+# Copyright (c) 1995 DSC Technologies Corporation
+# ======================================================================
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+
+#
+# Default resources.
+#
+option add *Toolbar*padX 5 widgetDefault
+option add *Toolbar*padY 5 widgetDefault
+option add *Toolbar*orient horizontal widgetDefault
+option add *Toolbar*highlightThickness 0 widgetDefault
+option add *Toolbar*indicatorOn false widgetDefault
+option add *Toolbar*selectColor [. cget -bg] widgetDefault
+
+#
+# Usual options.
+#
+itk::usual Toolbar {
+ keep -activebackground -activeforeground -background -balloonbackground \
+ -balloondelay1 -balloondelay2 -balloonfont -balloonforeground \
+ -borderwidth -cursor -disabledforeground -font -foreground \
+ -highlightbackground -highlightcolor -highlightthickness \
+ -insertbackground -insertforeground -selectbackground \
+ -selectborderwidth -selectcolor -selectforeground -troughcolor
+}
+
+# ------------------------------------------------------------------
+# TOOLBAR
+# ------------------------------------------------------------------
+itcl::class iwidgets::Toolbar {
+ inherit itk::Widget
+
+ constructor {args} {}
+ destructor {}
+
+ itk_option define -balloonbackground \
+ balloonBackground BalloonBackground yellow
+ itk_option define -balloonforeground \
+ balloonForeground BalloonForeground black
+ itk_option define -balloonfont balloonFont BalloonFont 6x10
+ itk_option define -balloondelay1 \
+ balloonDelay1 BalloonDelay1 1000
+ itk_option define -balloondelay2 \
+ balloonDelay2 BalloonDelay2 200
+ itk_option define -helpvariable helpVariable HelpVariable {}
+ itk_option define -orient orient Orient "horizontal"
+
+ #
+ # The following options implement propogated configurations to
+ # any widget that might be added to us. The problem is this is
+ # not deterministic as someone might add a new kind of widget with
+ # and option like -armbackground, so we would not be aware of
+ # this kind of option. Anyway we support as many of the obvious
+ # ones that we can. They can always configure them with itemconfigures.
+ #
+ itk_option define -activebackground activeBackground Foreground #c3c3c3
+ itk_option define -activeforeground activeForeground Background Black
+ itk_option define -background background Background #d9d9d9
+ itk_option define -borderwidth borderWidth BorderWidth 2
+ itk_option define -cursor cursor Cursor {}
+ itk_option define -disabledforeground \
+ disabledForeground DisabledForeground #a3a3a3
+ itk_option define -font \
+ font Font "-Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-*"
+ itk_option define -foreground foreground Foreground #000000000000
+ itk_option define -highlightbackground \
+ highlightBackground HighlightBackground #d9d9d9
+ itk_option define -highlightcolor highlightColor HighlightColor Black
+ itk_option define -highlightthickness \
+ highlightThickness HighlightThickness 0
+ itk_option define -insertforeground insertForeground Background #c3c3c3
+ itk_option define -insertbackground insertBackground Foreground Black
+ itk_option define -selectbackground selectBackground Foreground #c3c3c3
+ itk_option define -selectborderwidth selectBorderWidth BorderWidth {}
+ itk_option define -selectcolor selectColor Background #b03060
+ itk_option define -selectforeground selectForeground Background Black
+ itk_option define -state state State normal
+ itk_option define -troughcolor troughColor Background #c3c3c3
+
+ public method add {widgetCommand name args}
+ public method delete {args}
+ public method index {index}
+ public method insert {beforeIndex widgetCommand name args}
+ public method itemcget {index args}
+ public method itemconfigure {index args}
+
+ public method _resetBalloonTimer {}
+ public method _startBalloonDelay {window}
+ public method _stopBalloonDelay {window balloonClick}
+
+ private method _deleteWidgets {index1 index2}
+ private method _addWidget {widgetCommand name args}
+ private method _index {toolList index}
+ private method _getAttachedOption {optionListName widget args retValue}
+ private method _setAttachedOption {optionListName widget option args}
+ private method _packToolbar {}
+
+ public method hideHelp {}
+ public method showHelp {window}
+ public method showBalloon {window}
+ public method hideBalloon {}
+
+ private variable _balloonTimer 0
+ private variable _balloonAfterID 0
+ private variable _balloonClick false
+
+ private variable _interior {}
+ private variable _initialMapping 1 ;# Is this the first mapping?
+ private variable _toolList {} ;# List of all widgets on toolbar
+ private variable _opts ;# New options for child widgets
+ private variable _currHelpWidget {} ;# Widget currently displaying help for
+ private variable _hintWindow {} ;# Balloon help bubble.
+
+ # list of options we want to propogate to widgets added to toolbar.
+ private common _optionList {
+ -activebackground \
+ -activeforeground \
+ -background \
+ -borderwidth \
+ -cursor \
+ -disabledforeground \
+ -font \
+ -foreground \
+ -highlightbackground \
+ -highlightcolor \
+ -highlightthickness \
+ -insertbackground \
+ -insertforeground \
+ -selectbackground \
+ -selectborderwidth \
+ -selectcolor \
+ -selectforeground \
+ -state \
+ -troughcolor \
+ }
+}
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Toolbar::constructor {args} {
+ component hull configure -borderwidth 0
+ set _interior $itk_interior
+
+ #
+ # Handle configs
+ #
+ eval itk_initialize $args
+
+ # build balloon help window
+ set _hintWindow [toplevel $itk_component(hull).balloonHintWindow]
+ wm withdraw $_hintWindow
+ label $_hintWindow.label \
+ -foreground $itk_option(-balloonforeground) \
+ -background $itk_option(-balloonbackground) \
+ -font $itk_option(-balloonfont) \
+ -relief raised \
+ -borderwidth 1
+ pack $_hintWindow.label
+
+ # ... Attach help handler to this widget
+ bind toolbar-help-$itk_component(hull) \
+ <Enter> "+[itcl::code $this showHelp %W]"
+ bind toolbar-help-$itk_component(hull) \
+ <Leave> "+[itcl::code $this hideHelp]"
+
+ # ... Set up Microsoft style balloon help display.
+ set _balloonTimer $itk_option(-balloondelay1)
+ bind $_interior \
+ <Leave> "+[itcl::code $this _resetBalloonTimer]"
+ bind toolbar-balloon-$itk_component(hull) \
+ <Enter> "+[itcl::code $this _startBalloonDelay %W]"
+ bind toolbar-balloon-$itk_component(hull) \
+ <Leave> "+[itcl::code $this _stopBalloonDelay %W false]"
+ bind toolbar-balloon-$itk_component(hull) \
+ <Button-1> "+[itcl::code $this _stopBalloonDelay %W true]"
+}
+
+#
+# Provide a lowercase access method for the Toolbar class
+#
+proc ::iwidgets::toolbar {pathName args} {
+ uplevel ::iwidgets::Toolbar $pathName $args
+}
+
+# ------------------------------------------------------------------
+# DESTURCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Toolbar::destructor {} {
+ if {$_balloonAfterID != 0} {after cancel $_balloonAfterID}
+}
+
+# ------------------------------------------------------------------
+# OPTIONS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# OPTION -balloonbackground
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Toolbar::balloonbackground {
+ if { $_hintWindow != {} } {
+ if { $itk_option(-balloonbackground) != {} } {
+ $_hintWindow.label configure \
+ -background $itk_option(-balloonbackground)
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION -balloonforeground
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Toolbar::balloonforeground {
+ if { $_hintWindow != {} } {
+ if { $itk_option(-balloonforeground) != {} } {
+ $_hintWindow.label configure \
+ -foreground $itk_option(-balloonforeground)
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION -balloonfont
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Toolbar::balloonfont {
+ if { $_hintWindow != {} } {
+ if { $itk_option(-balloonfont) != {} } {
+ $_hintWindow.label configure \
+ -font $itk_option(-balloonfont)
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -orient
+#
+# Position buttons either horizontally or vertically.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Toolbar::orient {
+ switch $itk_option(-orient) {
+ "horizontal" - "vertical" {
+ _packToolbar
+ }
+ default {error "Invalid orientation. Must be either \
+ horizontal or vertical"
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# METHODS
+# ------------------------------------------------------------------
+
+# -------------------------------------------------------------
+# METHOD: add widgetCommand name ?option value?
+#
+# Adds a widget with the command widgetCommand whose name is
+# name to the Toolbar. If widgetCommand is radiobutton
+# or checkbutton, its packing is slightly padded to match the
+# geometry of button widgets.
+# -------------------------------------------------------------
+itcl::body iwidgets::Toolbar::add { widgetCommand name args } {
+
+ eval "_addWidget $widgetCommand $name $args"
+
+ lappend _toolList $itk_component($name)
+
+ if { $widgetCommand == "radiobutton" || \
+ $widgetCommand == "checkbutton" } {
+ set iPad 1
+ } else {
+ set iPad 0
+ }
+
+ # repack the tool bar
+ _packToolbar
+
+ return $itk_component($name)
+
+}
+
+# -------------------------------------------------------------
+#
+# METHOD: delete index ?index2?
+#
+# This command deletes all components between index and
+# index2 inclusive. If index2 is omitted then it defaults
+# to index. Returns an empty string
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Toolbar::delete { args } {
+ # empty toolbar
+ if { $_toolList == {} } {
+ error "can't delete widget, no widgets in the Toolbar \
+ \"$itk_component(hull)\""
+ }
+
+ set len [llength $args]
+ switch -- $len {
+ 1 {
+ set fromWidget [_index $_toolList [lindex $args 0]]
+
+ if { $fromWidget < 0 || $fromWidget >= [llength $_toolList] } {
+ error "bad Toolbar widget index in delete method: \
+ should be between 0 and [expr {[llength $_toolList] - 1} ]"
+ }
+
+ set toWidget $fromWidget
+ _deleteWidgets $fromWidget $toWidget
+ }
+
+ 2 {
+ set fromWidget [_index $_toolList [lindex $args 0]]
+
+ if { $fromWidget < 0 || $fromWidget >= [llength $_toolList] } {
+ error "bad Toolbar widget index1 in delete method: \
+ should be between 0 and [expr {[llength $_toolList] - 1} ]"
+ }
+
+ set toWidget [_index $_toolList [lindex $args 1]]
+
+ if { $toWidget < 0 || $toWidget >= [llength $_toolList] } {
+ error "bad Toolbar widget index2 in delete method: \
+ should be between 0 and [expr {[llength $_toolList] - 1} ]"
+ }
+
+ if { $fromWidget > $toWidget } {
+ error "bad Toolbar widget index1 in delete method: \
+ index1 is greater than index2"
+ }
+
+ _deleteWidgets $fromWidget $toWidget
+ }
+
+ default {
+ # ... too few/many parameters passed
+ error "wrong # args: should be \
+ \"$itk_component(hull) delete index1 ?index2?\""
+ }
+ }
+
+ return {}
+}
+
+
+# -------------------------------------------------------------
+#
+# METHOD: index index
+#
+# Returns the widget's numerical index for the entry corresponding
+# to index. If index is not found, -1 is returned
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Toolbar::index { index } {
+
+ return [_index $_toolList $index]
+
+}
+
+# -------------------------------------------------------------
+#
+# METHOD: insert beforeIndex widgetCommand name ?option value?
+#
+# Insert a new component named name with the command
+# widgetCommand before the com ponent specified by beforeIndex.
+# If widgetCommand is radiobutton or checkbutton, its packing
+# is slightly padded to match the geometry of button widgets.
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Toolbar::insert { beforeIndex widgetCommand name args } {
+
+ set beforeIndex [_index $_toolList $beforeIndex]
+
+ if {$beforeIndex < 0 || $beforeIndex > [llength $_toolList] } {
+ error "bad toolbar entry index $beforeIndex"
+ }
+
+ eval "_addWidget $widgetCommand $name $args"
+
+ # linsert into list
+ set _toolList [linsert $_toolList $beforeIndex $itk_component($name)]
+
+ # repack the tool bar
+ _packToolbar
+
+ return $itk_component($name)
+
+}
+
+# ----------------------------------------------------------------------
+# METHOD: itemcget index ?option?
+#
+# Returns the value for the option setting of the widget at index $index.
+# index can be numeric or widget name
+#
+# ----------------------------------------------------------------------
+itcl::body iwidgets::Toolbar::itemcget { index args} {
+
+ return [lindex [eval itemconfigure $index $args] 4]
+}
+
+# -------------------------------------------------------------
+#
+# METHOD: itemconfigure index ?option? ?value? ?option value...?
+#
+# Query or modify the configuration options of the widget of
+# the Toolbar specified by index. If no option is specified,
+# returns a list describing all of the available options for
+# index (see Tk_ConfigureInfo for information on the format
+# of this list). If option is specified with no value, then
+# the command returns a list describing the one named option
+# (this list will be identical to the corresponding sublist
+# of the value returned if no option is specified). If one
+# or more option-value pairs are specified, then the command
+# modifies the given widget option(s) to have the given
+# value(s); in this case the command returns an empty string.
+# The component type of index determines the valid available options.
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Toolbar::itemconfigure { index args } {
+
+ # Get a numeric index.
+ set index [_index $_toolList $index]
+
+ # Get the tool path
+ set toolPath [lindex $_toolList $index]
+
+ set len [llength $args]
+
+ switch $len {
+ 0 {
+ # show all options
+ # ''''''''''''''''
+
+ # support display of -helpstr and -balloonstr configs
+ set optList [$toolPath configure]
+
+ ## @@@ might want to use _getAttachedOption instead...
+ if { [info exists _opts($toolPath,-helpstr)] } {
+ set value $_opts($toolPath,-helpstr)
+ } else {
+ set value {}
+ }
+ lappend optList [list -helpstr helpStr HelpStr {} $value]
+ if { [info exists _opts($toolPath,-balloonstr)] } {
+ set value $_opts($toolPath,-balloonstr)
+ } else {
+ set value {}
+ }
+ lappend optList [list -balloonstr balloonStr BalloonStr {} $value]
+ return $optList
+ }
+ 1 {
+ # show only option specified
+ # ''''''''''''''''''''''''''
+ # did we satisfy the option get request?
+
+ if { [regexp -- {-helpstr} $args] } {
+ if { [info exists _opts($toolPath,-helpstr)] } {
+ set value $_opts($toolPath,-helpstr)
+ } else {
+ set value {}
+ }
+ return [list -helpstr helpStr HelpStr {} $value]
+ } elseif { [regexp -- {-balloonstr} $args] } {
+ if { [info exists _opts($toolPath,-balloonstr)] } {
+ set value $_opts($toolPath,-balloonstr)
+ } else {
+ set value {}
+ }
+ return [list -balloonstr balloonStr BalloonStr {} $value]
+ } else {
+ return [eval $toolPath configure $args]
+ }
+
+ }
+ default {
+ # ... do a normal configure
+
+ # first screen for all our child options we are adding
+ _setAttachedOption \
+ _opts \
+ $toolPath \
+ "-helpstr" \
+ $args
+
+ _setAttachedOption \
+ _opts \
+ $toolPath \
+ "-balloonstr" \
+ $args
+
+ # with a clean args list do a configure
+
+ # if the stripping process brought us down to no options
+ # to set, then forget the configure of widget.
+ if { [llength $args] != 0 } {
+ return [eval $toolPath configure $args]
+ } else {
+ return ""
+ }
+ }
+ }
+
+}
+
+# -------------------------------------------------------------
+#
+# METHOD: _resetBalloonDelay1
+#
+# Sets the delay that will occur before a balloon could be popped
+# up to balloonDelay1
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Toolbar::_resetBalloonTimer {} {
+ set _balloonTimer $itk_option(-balloondelay1)
+
+ # reset the <1> longer delay
+ set _balloonClick false
+}
+
+# -------------------------------------------------------------
+#
+# METHOD: _startBalloonDelay
+#
+# Starts waiting to pop up a balloon id
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Toolbar::_startBalloonDelay {window} {
+ if {$_balloonAfterID != 0} {
+ after cancel $_balloonAfterID
+ }
+ set _balloonAfterID [after $_balloonTimer [itcl::code $this showBalloon $window]]
+}
+
+# -------------------------------------------------------------
+#
+# METHOD: _stopBalloonDelay
+#
+# This method will stop the timer for a balloon popup if one is
+# in progress. If however there is already a balloon window up
+# it will hide the balloon window and set timing to delay 2 stage.
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Toolbar::_stopBalloonDelay { window balloonClick } {
+
+ # If <1> then got a click cancel
+ if { $balloonClick } {
+ set _balloonClick true
+ }
+ if { $_balloonAfterID != 0 } {
+ after cancel $_balloonAfterID
+ set _balloonAfterID 0
+ } else {
+ hideBalloon
+
+ # If this was cancelled with a <1> use longer delay.
+ if { $_balloonClick } {
+ set _balloonTimer $itk_option(-balloondelay1)
+ } else {
+ set _balloonTimer $itk_option(-balloondelay2)
+ }
+ }
+}
+
+# -------------------------------------------------------------
+# PRIVATE METHOD: _addWidget
+#
+# widgetCommand : command to invoke to create the added widget
+# name : name of the new widget to add
+# args : options for the widget create command
+#
+# Looks for -helpstr, -balloonstr and grabs them, strips from
+# args list. Then tries to add a component and keeps based
+# on known type. If it fails, it tries to clean up. Then it
+# binds handlers for helpstatus and balloon help.
+#
+# Returns the path of the widget added.
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Toolbar::_addWidget { widgetCommand name args } {
+
+ # ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+ # Add the widget to the tool bar
+ # '''''''''''''''''''''''''''''''''''''''''''''''''''''
+
+ # ... Strip out and save the -helpstr, -balloonstr options from args
+ # and save it in _opts
+ _setAttachedOption \
+ _opts \
+ $_interior.$name \
+ -helpstr \
+ $args
+
+ _setAttachedOption \
+ _opts \
+ $_interior.$name \
+ -balloonstr \
+ $args
+
+
+ # ... Add the new widget as a component (catch an error if occurs)
+ set createFailed [catch {
+ itk_component add $name {
+ eval $widgetCommand $_interior.$name $args
+ } {
+ }
+ } errMsg]
+
+ # ... Clean up if the create failed, and exit.
+ # The _opts list if it has -helpstr, -balloonstr just entered for
+ # this, it must be cleaned up.
+ if { $createFailed } {
+ # clean up
+ if {![catch {set _opts($_interior.$name,-helpstr)}]} {
+ set lastIndex [\
+ expr {[llength \
+ $_opts($_interior.$name,-helpstr) ]-1}]
+ lreplace $_opts($_interior.$name,-helpstr) \
+ $lastIndex $lastIndex ""
+ }
+ if {![catch {set _opts($_interior.$name,-balloonstr)}]} {
+ set lastIndex [\
+ expr {[llength \
+ $_opts($_interior.$name,-balloonstr) ]-1}]
+ lreplace $_opts($_interior.$name,-balloonstr) \
+ $lastIndex $lastIndex ""
+ }
+ error $errMsg
+ }
+
+ # ... Add in dynamic options that apply from the _optionList
+ foreach optionSet [$itk_component($name) configure] {
+ set option [lindex $optionSet 0]
+ if { [lsearch $_optionList $option] != -1 } {
+ itk_option add $name.$option
+ }
+ }
+
+ bindtags $itk_component($name) \
+ [linsert [bindtags $itk_component($name)] end \
+ toolbar-help-$itk_component(hull)]
+ bindtags $itk_component($name) \
+ [linsert [bindtags $itk_component($name)] end \
+ toolbar-balloon-$itk_component(hull)]
+
+ return $itk_component($name)
+}
+
+# -------------------------------------------------------------
+#
+# PRIVATE METHOD: _deleteWidgets
+#
+# deletes widget range by numerical index numbers.
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Toolbar::_deleteWidgets { index1 index2 } {
+
+ for { set index $index1 } { $index <= $index2 } { incr index } {
+
+ # kill the widget
+ set component [lindex $_toolList $index]
+ destroy $component
+
+ }
+
+ # physically remove the page
+ set _toolList [lreplace $_toolList $index1 $index2]
+
+}
+
+# -------------------------------------------------------------
+# PRIVATE METHOD: _index
+#
+# toolList : list of widget names to search thru if index
+# is non-numeric
+# index : either number, 'end', 'last', or pattern
+#
+# _index takes takes the value $index converts it to
+# a numeric identifier. If the value is not already
+# an integer it looks it up in the $toolList array.
+# If it fails it returns -1
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Toolbar::_index { toolList index } {
+
+ switch -- $index {
+ end - last {
+ set number [expr {[llength $toolList] -1}]
+ }
+ default {
+ # is it a number already? Then just use the number
+ if { [regexp {^[0-9]+$} $index] } {
+ set number $index
+ # check bounds
+ if { $number < 0 || $number >= [llength $toolList] } {
+ set number -1
+ }
+ # otherwise it is a widget name
+ } else {
+ if { [catch { set itk_component($index) } ] } {
+ set number -1
+ } else {
+ set number [lsearch -exact $toolList \
+ $itk_component($index)]
+ }
+ }
+ }
+ }
+
+ return $number
+}
+
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+# STATUS HELP for linking to helpVariable
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+# -------------------------------------------------------------
+#
+# PUBLIC METHOD: hideHelp
+#
+# Bound to the <Leave> event on a toolbar widget. This clears the
+# status widget help area and resets the help entry.
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Toolbar::hideHelp {} {
+ if { $itk_option(-helpvariable) != {} } {
+ upvar #0 $itk_option(-helpvariable) helpvar
+ set helpvar {}
+ }
+ set _currHelpWidget {}
+}
+
+# -------------------------------------------------------------
+#
+# PUBLIC METHOD: showHelp
+#
+# Bound to the <Motion> event on a tool bar widget. This puts the
+# help string associated with the tool bar widget into the
+# status widget help area. If no help exists for the current
+# entry, the status widget is cleared.
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Toolbar::showHelp { window } {
+
+ set widgetPath $window
+ # already on this item?
+ if { $window == $_currHelpWidget } {
+ return
+ }
+
+ set _currHelpWidget $window
+
+ # Do we have a helpvariable set on the toolbar?
+ if { $itk_option(-helpvariable) != {} } {
+ upvar #0 $itk_option(-helpvariable) helpvar
+
+ # is the -helpstr set for this widget?
+ set args "-helpstr"
+ if {[_getAttachedOption _opts \
+ $window args value]} {
+ set helpvar $value.
+ } else {
+ set helpvar {}
+ }
+ }
+}
+
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+# BALLOON HELP for show/hide of hint window
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+# -------------------------------------------------------------
+#
+# PUBLIC METHOD: showBalloon
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Toolbar::showBalloon {window} {
+ set _balloonClick false
+ set _balloonAfterID 0
+ # Are we still inside the window?
+ set mouseWindow \
+ [winfo containing [winfo pointerx .] [winfo pointery .]]
+
+ if { [string match $window* $mouseWindow] } {
+ # set up the balloonString
+ set args "-balloonstr"
+ if {[_getAttachedOption _opts \
+ $window args hintStr]} {
+ # configure the balloon help
+ $_hintWindow.label configure -text $hintStr
+
+ # Coordinates of the balloon
+ set balloonLeft \
+ [expr {[winfo rootx $window] + round(([winfo width $window]/2.0))}]
+ set balloonTop \
+ [expr {[winfo rooty $window] + [winfo height $window]}]
+
+ # put up balloon window
+ wm overrideredirect $_hintWindow 0
+ wm geometry $_hintWindow "+$balloonLeft+$balloonTop"
+ wm overrideredirect $_hintWindow 1
+ wm deiconify $_hintWindow
+ raise $_hintWindow
+ } else {
+ #NO BALLOON HELP AVAILABLE
+ }
+ } else {
+ #NOT IN BUTTON
+ }
+
+}
+
+# -------------------------------------------------------------
+#
+# PUBLIC METHOD: hideBalloon
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Toolbar::hideBalloon {} {
+ wm withdraw $_hintWindow
+}
+
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+# OPTION MANAGEMENT for -helpstr, -balloonstr
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+# -------------------------------------------------------------
+# PRIVATE METHOD: _getAttachedOption
+#
+# optionListName : the name of the array that holds all attached
+# options. It is indexed via widget,option to get
+# the value.
+# widget : the widget that the option is associated with
+# option : the option whose value we are looking for on
+# this widget.
+#
+# expects to be called only if the $option is length 1
+# -------------------------------------------------------------
+itcl::body iwidgets::Toolbar::_getAttachedOption { optionListName widget args retValue} {
+
+ # get a reference to the option, so we can change it.
+ upvar $args argsRef
+ upvar $retValue retValueRef
+
+ set success false
+
+ if { ![catch { set retValueRef \
+ [eval set [subst [set optionListName]]($widget,$argsRef)]}]} {
+
+ # remove the option argument
+ set success true
+ set argsRef ""
+ }
+
+ return $success
+}
+
+# -------------------------------------------------------------
+# PRIVATE METHOD: _setAttachedOption
+#
+# This method allows us to attach new options to a widget. It
+# catches the 'option' to be attached, strips it out of 'args'
+# attaches it to the 'widget' by stuffing the value into
+# 'optionList(widget,option)'
+#
+# optionListName: where to store the option and widget association
+# widget: is the widget we want to associate the attached option
+# option: is the attached option (unknown to this widget)
+# args: the arg list to search and remove the option from (if found)
+#
+# Modifies the args parameter.
+# Returns boolean indicating the success of the method
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Toolbar::_setAttachedOption {optionListName widget option args} {
+
+ upvar args argsRef
+
+ set success false
+
+ # check for 'option' in the 'args' list for the 'widget'
+ set optPos [eval lsearch $args $option]
+
+ # ... found it
+ if { $optPos != -1 } {
+ # grab a copy of the option from arg list
+ set [subst [set optionListName]]($widget,$option) \
+ [eval lindex $args [expr {$optPos + 1}]]
+
+ # remove the option argument and value from the arg list
+ set argsRef [eval lreplace $args $optPos [expr {$optPos + 1}]]
+ set success true
+ }
+ # ... if not found, will leave args alone
+
+ return $success
+}
+
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+# GEOMETRY MANAGEMENT for tool widgets
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+# -------------------------------------------------------------
+#
+# PRIVATE METHOD: _packToolbar
+#
+#
+#
+# -------------------------------------------------------------
+itcl::body iwidgets::Toolbar::_packToolbar {} {
+
+ # forget the previous locations
+ foreach tool $_toolList {
+ pack forget $tool
+ }
+
+ # pack in order of _toolList.
+ foreach tool $_toolList {
+ # adjust for radios and checks to match buttons
+ if { [winfo class $tool] == "Radiobutton" ||
+ [winfo class $tool] == "Checkbutton" } {
+ set iPad 1
+ } else {
+ set iPad 0
+ }
+
+ # pack by horizontal or vertical orientation
+ if {$itk_option(-orient) == "horizontal" } {
+ pack $tool -side left -fill y \
+ -ipadx $iPad -ipady $iPad
+ } else {
+ pack $tool -side top -fill x \
+ -ipadx $iPad -ipady $iPad
+ }
+ }
+}
diff --git a/iwidgets/generic/unknownimage.gif b/iwidgets/generic/unknownimage.gif
new file mode 100644
index 00000000000..d000bf70258
--- /dev/null
+++ b/iwidgets/generic/unknownimage.gif
Binary files differ
diff --git a/iwidgets/generic/watch.itk b/iwidgets/generic/watch.itk
new file mode 100644
index 00000000000..ace2cc94655
--- /dev/null
+++ b/iwidgets/generic/watch.itk
@@ -0,0 +1,626 @@
+#
+# Watch
+# ----------------------------------------------------------------------
+# Implements a a clock widget in a canvas.
+#
+# ----------------------------------------------------------------------
+# AUTHOR: John A. Tucker EMAIL: jatucker@spd.dsccc.com
+#
+# ======================================================================
+# Copyright (c) 1997 DSC Technologies Corporation
+# ======================================================================
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+
+#
+# Default resources.
+#
+option add *Watch.labelFont \
+ -*-Courier-Medium-R-Normal--*-120-*-*-*-*-*-* widgetDefault
+
+#
+# Usual options.
+#
+itk::usual Watch {
+ keep -background -cursor -labelfont -foreground
+}
+
+itcl::class iwidgets::Watch {
+
+ inherit itk::Widget
+
+ itk_option define -hourradius hourRadius Radius .50
+ itk_option define -hourcolor hourColor Color red
+
+ itk_option define -minuteradius minuteRadius Radius .80
+ itk_option define -minutecolor minuteColor Color yellow
+
+ itk_option define -pivotradius pivotRadius Radius .10
+ itk_option define -pivotcolor pivotColor Color white
+
+ itk_option define -secondradius secondRadius Radius .90
+ itk_option define -secondcolor secondColor Color black
+
+ itk_option define -clockcolor clockColor Color white
+ itk_option define -clockstipple clockStipple ClockStipple {}
+
+ itk_option define -state state State normal
+ itk_option define -showampm showAmPm ShowAmPm true
+
+ itk_option define -tickcolor tickColor Color black
+
+ constructor {args} {}
+ destructor {}
+
+ #
+ # Public methods
+ #
+ public {
+ method get {{format "-string"}}
+ method show {{time "now"}}
+ method watch {args}
+ }
+
+ #
+ # Private methods
+ #
+ private {
+ method _handMotionCB {tag x y}
+ method _drawHand {tag}
+ method _handReleaseCB {tag x y}
+ method _displayClock {{when "later"}}
+
+ variable _interior
+ variable _radius
+ variable _theta
+ variable _extent
+ variable _reposition "" ;# non-null => _displayClock pending
+ variable _timeVar
+ variable _x0 1
+ variable _y0 1
+
+ common _ampmVar
+ common PI [expr {2*asin(1.0)}]
+ }
+}
+
+#
+# Provide a lowercased access method for the Watch class.
+#
+proc ::iwidgets::watch {pathName args} {
+ uplevel ::iwidgets::Watch $pathName $args
+}
+
+#
+# Use option database to override default resources of base classes.
+#
+option add *Watch.width 155 widgetDefault
+option add *Watch.height 175 widgetDefault
+
+# -----------------------------------------------------------------------------
+# CONSTRUCTOR
+# -----------------------------------------------------------------------------
+itcl::body iwidgets::Watch::constructor { args } {
+ #
+ # Add back to the hull width and height options and make the
+ # borderwidth zero since we don't need it.
+ #
+ set _interior $itk_interior
+
+ itk_option add hull.width hull.height
+ component hull configure -borderwidth 0
+ grid propagate $itk_component(hull) no
+
+ set _ampmVar($this) "AM"
+ set _radius(outer) 1
+
+ set _radius(hour) 1
+ set _radius(minute) 1
+ set _radius(second) 1
+
+ set _theta(hour) 30
+ set _theta(minute) 6
+ set _theta(second) 6
+
+ set _extent(hour) 14
+ set _extent(minute) 14
+ set _extent(second) 2
+
+ set _timeVar(hour) 12
+ set _timeVar(minute) 0
+ set _timeVar(second) 0
+
+ #
+ # Create the frame in which the "AM" and "PM" radiobuttons will be drawn
+ #
+ itk_component add frame {
+ frame $itk_interior.frame
+ }
+
+ #
+ # Create the canvas in which the clock will be drawn
+ #
+ itk_component add canvas {
+ canvas $itk_interior.canvas
+ }
+ bind $itk_component(canvas) <Map> +[itcl::code $this _displayClock]
+ bind $itk_component(canvas) <Configure> +[itcl::code $this _displayClock]
+
+ #
+ # Create the "AM" and "PM" radiobuttons to be drawn in the canvas
+ #
+ itk_component add am {
+ radiobutton $itk_component(frame).am \
+ -text "AM" \
+ -value "AM" \
+ -variable [itcl::scope _ampmVar($this)]
+ } {
+ usual
+ rename -font -labelfont labelFont Font
+ }
+
+ itk_component add pm {
+ radiobutton $itk_component(frame).pm \
+ -text "PM" \
+ -value "PM" \
+ -variable [itcl::scope _ampmVar($this)]
+ } {
+ usual
+ rename -font -labelfont labelFont Font
+ }
+
+ #
+ # Create the canvas item for displaying the main oval which encapsulates
+ # the entire clock.
+ #
+ watch create oval 0 0 2 2 -width 5 -tags clock
+
+ #
+ # Create the canvas items for displaying the 60 ticks marks around the
+ # inner perimeter of the watch.
+ #
+ set extent 3
+ for {set i 0} {$i < 60} {incr i} {
+ set start [expr {$i*6-1}]
+ set tag [expr {[expr {$i%5}] == 0 ? "big" : "little"}]
+ watch create arc 0 0 0 0 \
+ -style arc \
+ -extent $extent \
+ -start $start \
+ -tags "tick$i tick $tag"
+ }
+
+ #
+ # Create the canvas items for displaying the hour, minute, and second hands
+ # of the watch. Add bindings to allow the mouse to move and set the
+ # clock hands.
+ #
+ watch create arc 1 1 1 1 -extent 30 -tags minute
+ watch create arc 1 1 1 1 -extent 30 -tags hour
+ watch create arc 1 1 1 1 -tags second
+
+ #
+ # Create the canvas item for displaying the center of the watch in which
+ # the hour, minute, and second hands will pivot.
+ #
+ watch create oval 0 0 1 1 -width 5 -fill black -tags pivot
+
+ #
+ # Position the "AM/PM" button frame and watch canvas.
+ #
+ grid $itk_component(frame) -row 0 -column 0 -sticky new
+ grid $itk_component(canvas) -row 1 -column 0 -sticky nsew
+
+ grid rowconfigure $itk_interior 0 -weight 0
+ grid rowconfigure $itk_interior 1 -weight 1
+ grid columnconfigure $itk_interior 0 -weight 1
+
+ eval itk_initialize $args
+}
+
+# -----------------------------------------------------------------------------
+# DESTURCTOR
+# -----------------------------------------------------------------------------
+itcl::body iwidgets::Watch::destructor {} {
+ if {$_reposition != ""} {
+ after cancel $_reposition
+ }
+}
+
+# -----------------------------------------------------------------------------
+# METHODS
+# -----------------------------------------------------------------------------
+
+# -----------------------------------------------------------------------------
+# METHOD: _handReleaseCB tag x y
+#
+# -----------------------------------------------------------------------------
+itcl::body iwidgets::Watch::_handReleaseCB {tag x y} {
+
+ set atanab [expr {atan2(double($y-$_y0),double($x-$_x0))*(180/$PI)}]
+ set degrees [expr {$atanab > 0 ? [expr {360-$atanab}] : abs($atanab)}]
+ set ticks [expr {round($degrees/$_theta($tag))}]
+ set _timeVar($tag) [expr {((450-$ticks*$_theta($tag))%360)/$_theta($tag)}]
+
+ if {$tag == "hour" && $_timeVar(hour) == 0} {
+ set _timeVar($tag) 12
+ }
+
+ _drawHand $tag
+}
+
+# -----------------------------------------------------------------------------
+# PROTECTED METHOD: _handMotionCB tag x y
+#
+# -----------------------------------------------------------------------------
+itcl::body iwidgets::Watch::_handMotionCB {tag x y} {
+ if {$x == $_x0 || $y == $_y0} {
+ return
+ }
+
+ set a [expr {$y-$_y0}]
+ set b [expr {$x-$_x0}]
+ set c [expr {hypot($a,$b)}]
+
+ set atanab [expr {atan2(double($a),double($b))*(180/$PI)}]
+ set degrees [expr {$atanab > 0 ? [expr 360-$atanab] : abs($atanab)}]
+
+ set x2 [expr {$_x0+$_radius($tag)*($b/double($c))}]
+ set y2 [expr {$_y0+$_radius($tag)*($a/double($c))}]
+ watch coords $tag \
+ [expr {$x2-$_radius($tag)}] \
+ [expr {$y2-$_radius($tag)}] \
+ [expr {$x2+$_radius($tag)}] \
+ [expr {$y2+$_radius($tag)}]
+ set start [expr {$degrees-180-($_extent($tag)/2)}]
+ watch itemconfigure $tag -start $start -extent $_extent($tag)
+}
+
+# -----------------------------------------------------------------------------
+# PROTECTED METHOD: get ?format?
+#
+# -----------------------------------------------------------------------------
+itcl::body iwidgets::Watch::get {{format "-string"}} {
+ set timestr [format "%02d:%02d:%02d %s" \
+ $_timeVar(hour) $_timeVar(minute) \
+ $_timeVar(second) $_ampmVar($this)]
+
+ switch -- $format {
+ "-string" {
+ return $timestr
+ }
+ "-clicks" {
+ return [clock scan $timestr]
+ }
+ default {
+ error "bad format option \"$format\":\
+ should be -string or -clicks"
+ }
+ }
+}
+
+# -----------------------------------------------------------------------------
+# METHOD: watch ?args?
+#
+# Evaluates the specified args against the canvas component.
+# -----------------------------------------------------------------------------
+itcl::body iwidgets::Watch::watch {args} {
+ return [eval $itk_component(canvas) $args]
+}
+
+# -----------------------------------------------------------------------------
+# METHOD: _drawHand tag
+#
+# -----------------------------------------------------------------------------
+itcl::body iwidgets::Watch::_drawHand {tag} {
+
+ set degrees [expr {abs(450-($_timeVar($tag)*$_theta($tag)))%360}]
+ set radians [expr {$degrees*($PI/180)}]
+ set x [expr {$_x0+$_radius($tag)*cos($radians)}]
+ set y [expr {$_y0+$_radius($tag)*sin($radians)*(-1)}]
+ watch coords $tag \
+ [expr {$x-$_radius($tag)}] \
+ [expr {$y-$_radius($tag)}] \
+ [expr {$x+$_radius($tag)}] \
+ [expr {$y+$_radius($tag)}]
+ set start [expr {$degrees-180-($_extent($tag)/2)}]
+ watch itemconfigure $tag -start $start
+}
+
+# ------------------------------------------------------------------
+# PUBLIC METHOD: show time
+#
+# Changes the currently displayed time to be that of the time
+# argument. The time may be specified either as a string or an
+# integer clock value. Reference the clock command for more
+# information on obtaining times and their formats.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Watch::show {{time "now"}} {
+ if {$time == "now"} {
+ set seconds [clock seconds]
+ } elseif {![catch {clock format $time}]} {
+ set seconds $time
+ } elseif {[catch {set seconds [clock scan $time]}]} {
+ error "bad time: \"$time\", must be a valid time\
+ string, clock clicks value or the keyword now"
+ }
+
+ set timestring [clock format $seconds -format "%I %M %S %p"]
+ set _timeVar(hour) [expr int(1[lindex $timestring 0] - 100)]
+ set _timeVar(minute) [expr int(1[lindex $timestring 1] - 100)]
+ set _timeVar(second) [expr int(1[lindex $timestring 2] - 100)]
+ set _ampmVar($this) [lindex $timestring 3]
+
+ _drawHand hour
+ _drawHand minute
+ _drawHand second
+}
+
+# -----------------------------------------------------------------------------
+# PROTECTED METHOD: _displayClock ?when?
+#
+# Places the hour, minute, and second dials in the canvas. If "when" is "now",
+# the change is applied immediately. If it is "later" or it is not specified,
+# then the change is applied later, when the application is idle.
+# -----------------------------------------------------------------------------
+itcl::body iwidgets::Watch::_displayClock {{when "later"}} {
+
+ if {$when == "later"} {
+ if {$_reposition == ""} {
+ set _reposition [after idle [itcl::code $this _displayClock now]]
+ }
+ return
+ }
+
+ #
+ # Compute the center coordinates for the clock based on the
+ # with and height of the canvas.
+ #
+ set width [winfo width $itk_component(canvas)]
+ set height [winfo height $itk_component(canvas)]
+ set _x0 [expr {$width/2}]
+ set _y0 [expr {$height/2}]
+
+ #
+ # Set the radius of the watch, pivot, hour, minute and second items.
+ #
+ set _radius(outer) [expr {$_x0 < $_y0 ? $_x0 : $_y0}]
+ set _radius(pivot) [expr {$itk_option(-pivotradius)*$_radius(outer)}]
+ set _radius(hour) [expr {$itk_option(-hourradius)*$_radius(outer)}]
+ set _radius(minute) [expr {$itk_option(-minuteradius)*$_radius(outer)}]
+ set _radius(second) [expr {$itk_option(-secondradius)*$_radius(outer)}]
+ set outerWidth [watch itemcget clock -width]
+
+ #
+ # Set the coordinates of the clock item
+ #
+ set x1Outer $outerWidth
+ set y1Outer $outerWidth
+ set x2Outer [expr {$width-$outerWidth}]
+ set y2Outer [expr {$height-$outerWidth}]
+ watch coords clock $x1Outer $y1Outer $x2Outer $y2Outer
+
+ #
+ # Set the coordinates of the tick items
+ #
+ set offset [expr {$outerWidth*2}]
+ set x1Tick [expr {$x1Outer+$offset}]
+ set y1Tick [expr {$y1Outer+$offset}]
+ set x2Tick [expr {$x2Outer-$offset}]
+ set y2Tick [expr {$y2Outer-$offset}]
+ for {set i 0} {$i < 60} {incr i} {
+ watch coords tick$i $x1Tick $y1Tick $x2Tick $y2Tick
+ }
+ set maxTickWidth [expr {$_radius(outer)-$_radius(second)+1}]
+ set minTickWidth [expr {round($maxTickWidth/2)}]
+ watch itemconfigure big -width $maxTickWidth
+ watch itemconfigure little -width [expr {round($maxTickWidth/2)}]
+
+ #
+ # Set the coordinates of the pivot item
+ #
+ set x1Center [expr {$_x0-$_radius(pivot)}]
+ set y1Center [expr {$_y0-$_radius(pivot)}]
+ set x2Center [expr {$_x0+$_radius(pivot)}]
+ set y2Center [expr {$_y0+$_radius(pivot)}]
+ watch coords pivot $x1Center $y1Center $x2Center $y2Center
+
+ #
+ # Set the coordinates of the hour, minute, and second dial items
+ #
+ watch itemconfigure hour -extent $_extent(hour)
+ _drawHand hour
+
+ watch itemconfigure minute -extent $_extent(minute)
+ _drawHand minute
+
+ watch itemconfigure second -extent $_extent(second)
+ _drawHand second
+
+ set _reposition ""
+}
+
+# -----------------------------------------------------------------------------
+# OPTIONS
+# -----------------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# OPTION: state
+#
+# Configure the editable state of the widget. Valid values are
+# normal and disabled. In a disabled state, the hands of the
+# watch are not selectabled.
+# ------------------------------------------------------------------
+itcl::configbody ::iwidgets::Watch::state {
+ if {$itk_option(-state) == "normal"} {
+ watch bind minute <B1-Motion> \
+ [itcl::code $this _handMotionCB minute %x %y]
+ watch bind minute <ButtonRelease-1> \
+ [itcl::code $this _handReleaseCB minute %x %y]
+
+ watch bind hour <B1-Motion> \
+ [itcl::code $this _handMotionCB hour %x %y]
+ watch bind hour <ButtonRelease-1> \
+ [itcl::code $this _handReleaseCB hour %x %y]
+
+ watch bind second <B1-Motion> \
+ [itcl::code $this _handMotionCB second %x %y]
+ watch bind second <ButtonRelease-1> \
+ [itcl::code $this _handReleaseCB second %x %y]
+
+ $itk_component(am) configure -state normal
+ $itk_component(pm) configure -state normal
+
+ } elseif {$itk_option(-state) == "disabled"} {
+ watch bind minute <B1-Motion> {}
+ watch bind minute <ButtonRelease-1> {}
+
+ watch bind hour <B1-Motion> {}
+ watch bind hour <ButtonRelease-1> {}
+
+ watch bind second <B1-Motion> {}
+ watch bind second <ButtonRelease-1> {}
+
+ $itk_component(am) configure -state disabled \
+ -disabledforeground [$itk_component(am) cget -background]
+ $itk_component(pm) configure -state normal \
+ -disabledforeground [$itk_component(am) cget -background]
+
+ } else {
+ error "bad state option \"$itk_option(-state)\":\
+ should be normal or disabled"
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: showampm
+#
+# Configure the display of the AM/PM radio buttons.
+# ------------------------------------------------------------------
+itcl::configbody ::iwidgets::Watch::showampm {
+ switch -- $itk_option(-showampm) {
+ 0 - no - false - off {
+ pack forget $itk_component(am)
+ pack forget $itk_component(pm)
+ }
+
+ 1 - yes - true - on {
+ pack $itk_component(am) -side left -fill both -expand 1
+ pack $itk_component(pm) -side right -fill both -expand 1
+ }
+
+ default {
+ error "bad showampm option \"$itk_option(-showampm)\":\
+ should be boolean"
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: pivotcolor
+#
+# Configure the color of the clock pivot.
+#
+itcl::configbody ::iwidgets::Watch::pivotcolor {
+ watch itemconfigure pivot -fill $itk_option(-pivotcolor)
+}
+
+# ------------------------------------------------------------------
+# OPTION: clockstipple
+#
+# Configure the stipple pattern for the clock fill color.
+#
+itcl::configbody ::iwidgets::Watch::clockstipple {
+ watch itemconfigure clock -stipple $itk_option(-clockstipple)
+}
+
+# ------------------------------------------------------------------
+# OPTION: clockcolor
+#
+# Configure the color of the clock.
+#
+itcl::configbody ::iwidgets::Watch::clockcolor {
+ watch itemconfigure clock -fill $itk_option(-clockcolor)
+}
+
+# ------------------------------------------------------------------
+# OPTION: hourcolor
+#
+# Configure the color of the hour hand.
+#
+itcl::configbody ::iwidgets::Watch::hourcolor {
+ watch itemconfigure hour -fill $itk_option(-hourcolor)
+}
+
+# ------------------------------------------------------------------
+# OPTION: minutecolor
+#
+# Configure the color of the minute hand.
+#
+itcl::configbody ::iwidgets::Watch::minutecolor {
+ watch itemconfigure minute -fill $itk_option(-minutecolor)
+}
+
+# ------------------------------------------------------------------
+# OPTION: secondcolor
+#
+# Configure the color of the second hand.
+#
+itcl::configbody ::iwidgets::Watch::secondcolor {
+ watch itemconfigure second -fill $itk_option(-secondcolor)
+}
+
+# ------------------------------------------------------------------
+# OPTION: tickcolor
+#
+# Configure the color of the ticks.
+#
+itcl::configbody ::iwidgets::Watch::tickcolor {
+ watch itemconfigure tick -outline $itk_option(-tickcolor)
+}
+
+# ------------------------------------------------------------------
+# OPTION: hourradius
+#
+# Configure the radius of the hour hand.
+#
+itcl::configbody ::iwidgets::Watch::hourradius {
+ _displayClock
+}
+
+# ------------------------------------------------------------------
+# OPTION: minuteradius
+#
+# Configure the radius of the minute hand.
+#
+itcl::configbody ::iwidgets::Watch::minuteradius {
+ _displayClock
+}
+
+# ------------------------------------------------------------------
+# OPTION: secondradius
+#
+# Configure the radius of the second hand.
+#
+itcl::configbody ::iwidgets::Watch::secondradius {
+ _displayClock
+}
+
diff --git a/iwidgets/incoming/README b/iwidgets/incoming/README
new file mode 100644
index 00000000000..c39533e5add
--- /dev/null
+++ b/iwidgets/incoming/README
@@ -0,0 +1,44 @@
+==========================================================================
+ ------------------ [incr Widgets] Incoming Widgets ---------------------
+==========================================================================
+
+ This directory contains mega-widgets which should be considered beta.
+We're looking for positive or negative feedback concerning their usefullness.
+Should enough of a positive response be felt, then the widget will be
+included in the [incr Widgets] distribution. Otherwise, they will find
+themseleves in the outgoing directory and later in /dev/null. Please see
+the source code to respond to the author of any mega-widgets found here.
+
+ To place your "vote" for any new widget, please contact any [incr Widgets]
+administrator.
+
+
+Layout of the iwidgets4.0.1/incoming directory:
+---------------------------------------------------------------------------
+ src: contains the source code for the new widgets
+ demos: contains scripts you can source to see the widgets in action
+ doc: man pages (Note that a man page may not exist if the author did
+ not submit one)
+
+
+
+NEW WIDGETS
+---------------------------------------------------------------------------
+collapsablewidget: Contributed by Vince Darley
+buttoncage: Contributed by Mark Alston
+
+
+
+PROPOSED WIDGETS
+---------------------------------------------------------------------------
+The following are proposed widgets as listed on SourceForge. If anyone
+has a desire to create one or more of these widgets, have at it!
+
+o - How about adding an optionbox widget for organizing optionmenus. This
+ widget would be analogous to the checkbox and radiobox widgets.
+ (SF ticket #471529)
+
+o - Could it be possible to enhance Scrolledhtml into a browser using the
+ http package included with the tcl core? (SF ticket #426759) (Note
+ from Chad - very cool idea - anyone interested in working on this?
+ Check out the SF ticket for some pointers.)
diff --git a/iwidgets/incoming/demos/buttoncage b/iwidgets/incoming/demos/buttoncage
new file mode 100644
index 00000000000..18fb6f7f8a8
--- /dev/null
+++ b/iwidgets/incoming/demos/buttoncage
@@ -0,0 +1,16 @@
+# ----------------------------------------------------------------------
+# DEMO: new buttoncage
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+source ../src/buttoncage.itk
+
+puts "This demo creates a 5x2 grid of buttons..."
+
+. configure -relief ridge -bd 3
+iwidgets::buttoncage .bc -width 5 -height 2
+pack .bc
+
+for {set i 1} {$i <= 10} {incr i} {
+ .bc add $i -text "Button $i" \
+ -command [eval {list puts "Congratulations. You just pressed button $i"}]
+}
diff --git a/iwidgets/incoming/demos/collapsablewidget b/iwidgets/incoming/demos/collapsablewidget
new file mode 100644
index 00000000000..e496f4953f4
--- /dev/null
+++ b/iwidgets/incoming/demos/collapsablewidget
@@ -0,0 +1,21 @@
+# ----------------------------------------------------------------------
+# DEMO: new collapsablewidget
+# ----------------------------------------------------------------------
+package require Iwidgets 4.0
+source ../src/collapsablewidget.itk
+
+. configure -background white
+
+iwidgets::collapsablewidget .cw -labeltext "Label Text:"
+pack .cw -padx 4 -pady 4
+
+set win [.cw childsite]
+label $win.ex -text "(put your widgets here)" \
+ -background black -foreground white \
+ -width 30 -height 3
+pack $win.ex -expand yes -fill both -padx 4 -pady 4
+
+button .toggle -text "Toggle display of collapsed region" -command {
+ .cw toggle
+}
+pack .toggle -padx 4 -pady 4
diff --git a/iwidgets/incoming/doc/collapsablewidget.n b/iwidgets/incoming/doc/collapsablewidget.n
new file mode 100644
index 00000000000..0c4df819ff6
--- /dev/null
+++ b/iwidgets/incoming/doc/collapsablewidget.n
@@ -0,0 +1,212 @@
+'\"
+'\" Copyright (c) 1995-1999 DSC Technologies Corporation
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\"
+'\" @(#) collapsablewidget.n 1.21 94/12/17 16:04:44
+'\"
+.so man.macros
+.HS collapsablewidget iwid
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+iwidgets::collapsablewidget \- Create and manipulate a labeled widget
+.SH SYNOPSIS
+\fBcollapsablewidget\fI \fIpathName \fR?\fIoptions\fR?
+.SH "INHERITANCE"
+itk::Widget <- iwidgets::collapsablewidget
+.SH "STANDARD OPTIONS"
+.LP
+.nf
+.ta 4c 8c 12c
+\fBbackground\fR \fBcursor\fR \fBforeground\fR
+.fi
+.LP
+See the "options" manual entry for details on the standard options.
+.SH "WIDGET-SPECIFIC OPTIONS"
+.LP
+.nf
+Name: \fBcollapsed\fR
+Class: \fBCollapsed\fR
+Command-Line Switch: \fB-collapsed\fR
+.fi
+.IP
+Specifies whether to hide or display the childsite. Takes a boolean value.
+If true, the childsite is hidden from view, if false it is displayed.
+The default is to display the childsite.
+.LP
+.nf
+Name: \fBforeground\fR
+Class: \fBForeground\fR
+Command-Line Switch: \fB-foreground\fR
+.fi
+.IP
+Specifies the foreground to be used in the label.
+.LP
+.nf
+Name: \fBlabelBitmap\fR
+Class: \fBBitmap\fR
+Command-Line Switch: \fB-labelbitmap\fR
+.fi
+.IP
+Specifies a bitmap to display in the widget, in any of the forms
+acceptable to \fBTk_GetBitmap\fR. This option overrides the \fIlabeltext\fR
+option.
+.LP
+.nf
+Name: \fBlabelFont\fR
+Class: \fBFont\fR
+Command-Line Switch: \fB-labelfont\fR
+.fi
+.IP
+Specifies the font to be used for the label.
+.LP
+.nf
+Name: \fBlabelImage\fR
+Class: \fBImage\fR
+Command-Line Switch: \fB-labelimage\fR
+.fi
+.IP
+Specifies a image to be used as the label. The image may be any of the
+values created by the \fBimage create\fR command. This option overrides
+both the \fIlabelbitmap\fR and \fIlabeletext\fR options.
+.LP
+.nf
+Name: \fBlabelMargin\fR
+Class: \fBMargin\fR
+Command-Line Switch: \fB-labelmargin\fR
+.fi
+.IP
+Specifies the distance between the childsite and label in any of the forms
+acceptable to \fBTk_GetPixels\fR. The default is 2 pixel.
+.LP
+.nf
+Name: \fBlabelText\fR
+Class: \fBText\fR
+Command-Line Switch: \fB-labeltext\fR
+.fi
+.IP
+Specifies the text of the label around the childsite.
+.LP
+.nf
+Name: \fBlabelVariable\fR
+Class: \fBVariable\fR
+Command-Line Switch: \fB-labelvariable\fR
+.fi
+.IP
+Specifies the text variable of the label around the childsite.
+.LP
+.BE
+
+.SH DESCRIPTION
+.PP
+The \fBcollapsablewidget\fR command creates a labeled widget which contains
+a button, a label and child site. The child site is a frame
+which can filled with any widget via a derived class or though the use
+of the childsite method. This class
+was designed to be a general purpose base class for supporting the
+combination of label widget and a childsite, in which the button
+(which displays a suitable image) controls whether to display the
+childsite or not. The options include the ability to modify the
+font and margin, and control the display of the labels.
+
+.SH "METHODS"
+.PP
+The \fBcollapsablewidget\fR command creates a new Tcl command whose
+name is \fIpathName\fR. This
+command may be used to invoke various
+operations on the widget. It has the following general form:
+.DS C
+\fIpathName option \fR?\fIarg arg ...\fR?
+.DE
+\fIOption\fR and the \fIarg\fRs
+determine the exact behavior of the command. The following
+commands are possible for collapsablewidget widgets:
+.SH "WIDGET-SPECIFIC METHODS"
+.TP
+\fIpathName \fBchildsite\fR
+Return the path name of the child site.
+.TP
+\fIpathName \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given
+by \fIoption\fR.
+\fIOption\fR may have any of the values accepted by the \fBcollapsablewidget\fR
+command.
+.TP
+\fIpathName \fBcollapse\fR
+Hides the childsite from view, updating the image in the button to
+reflect the new state.
+.TP
+\fIpathName\fR \fBconfigure\fR ?\fIoption\fR? ?\fIvalue option value ...\fR?
+Query or modify the configuration options of the widget.
+If no \fIoption\fR is specified, returns a list describing all of
+the available options for \fIpathName\fR (see \fBTk_ConfigureInfo\fR for
+information on the format of this list). If \fIoption\fR is specified
+with no \fIvalue\fR, then the command returns a list describing the
+one named option (this list will be identical to the corresponding
+sublist of the value returned if no \fIoption\fR is specified). If
+one or more \fIoption\-value\fR pairs are specified, then the command
+modifies the given widget option(s) to have the given value(s); in
+this case the command returns an empty string.
+\fIOption\fR may have any of the values accepted by the \fBcollapsablewidget\fR
+command.
+.TP
+\fIpathName \fBreveal\fR
+Bring the childsite into view, updating the image in the button to
+reflect the new state.
+.TP
+\fIpathName \fBtoggle\fR
+If the childsite is in view, hide it, and if it is hidden display it.
+Updates the image in the button to reflect the new state.
+
+.SH "STATIC METHODS"
+.TP
+\fBCollapsablewidget::alignlabels\fR \fIwidget\fR ?\fIwidget ...\fR?
+The alignlabels procedure takes a list of widgets derived from
+the Collapsablewidget class and uses the label margin to make each widget
+have the same total space for the combination of label and margin. The
+net effect is to left align the labels.
+
+.SH "COMPONENTS"
+.LP
+.nf
+Name: \fBlabel\fR
+Class: \fBlabel\fR
+.fi
+.IP
+The label component provides the label for the labeled widget. See the
+"label" widget manual entry for details on the label component item.
+.LP
+.nf
+Name: \fBlwchildsite\fR
+Class: \fBframe\fR
+.fi
+.IP
+The lwchildsite component is the user child site for the labeled widget. See
+the "frame" widget manual entry for details on the lwchildsite component item.
+.fi
+
+.SH EXAMPLE
+.IP
+The collapsablewidget is useful when you wish to display a large
+amount of information in a single window, only some of which the
+user is likely to want to see at any one time. By placing a number
+of collapsable widgets in the window, each of which contains some
+of the available information (presumably categorised appropriately),
+you can make very effective use of a small amount of screen
+real-estate. The following is an example of how to create a widget
+which has its childsite hidden, and then reveal the childsite later.
+.LP
+.DS
+ iwidgets::collapsablewidget .cw -labeltext "Canvas Widget" -collapsed 1
+ pack .cw -fill both -expand yes -padx 10 -pady 10
+
+ set cw [canvas [.cw childsite].c -relief raised -width 200 -height 200]
+ pack $cw -padx 10 -pady 10
+ after 2000 {.cw reveal}
+.DE
+.SH AUTHOR
+Vince Darley
+.SH KEYWORDS
+collapsablewidget, widget
diff --git a/iwidgets/incoming/doc/man.macros b/iwidgets/incoming/doc/man.macros
new file mode 100644
index 00000000000..c575ce6befa
--- /dev/null
+++ b/iwidgets/incoming/doc/man.macros
@@ -0,0 +1,186 @@
+'\" The definitions below are for supplemental macros used in Tcl/Tk
+'\" manual entries.
+'\"
+'\" .HS name section [date [version]]
+'\" Replacement for .TH in other man pages. See below for valid
+'\" section names.
+'\"
+'\" .AP type name in/out [indent]
+'\" Start paragraph describing an argument to a library procedure.
+'\" type is type of argument (int, etc.), in/out is either "in", "out",
+'\" or "in/out" to describe whether procedure reads or modifies arg,
+'\" and indent is equivalent to second arg of .IP (shouldn't ever be
+'\" needed; use .AS below instead)
+'\"
+'\" .AS [type [name]]
+'\" Give maximum sizes of arguments for setting tab stops. Type and
+'\" name are examples of largest possible arguments that will be passed
+'\" to .AP later. If args are omitted, default tab stops are used.
+'\"
+'\" .BS
+'\" Start box enclosure. From here until next .BE, everything will be
+'\" enclosed in one large box.
+'\"
+'\" .BE
+'\" End of box enclosure.
+'\"
+'\" .VS
+'\" Begin vertical sidebar, for use in marking newly-changed parts
+'\" of man pages.
+'\"
+'\" .VE
+'\" End of vertical sidebar.
+'\"
+'\" .DS
+'\" Begin an indented unfilled display.
+'\"
+'\" .DE
+'\" End of indented unfilled display.
+'\"
+'\" @(#) man.macros 1.1 94/08/09 13:07:19
+.\"
+'\" # Heading for Tcl/Tk man pages
+.de HS
+.ds ^3 \\0
+.if !"\\$3"" .ds ^3 \\$3
+.if '\\$2'cmds' .TH "\\$1" 1 "\\*(^3" "\\$4" "\\$5"
+.if '\\$2'lib' .TH "\\$1" 3 "\\*(^3" "\\$4" "\\$5"
+.if '\\$2'ncmds' .TH "\\$1" n "\\*(^3" "\\$4" "\\$5"
+.if '\\$2'tcl' .TH "\\$1" n "\\*(^3" Tcl "Tcl Built-In Commands"
+.if '\\$2'tk' .TH "\\$1" n "\\*(^3" Tk "Tk Commands"
+.if '\\$2'tclc' .TH "\\$1" 3 "\\*(^3" Tcl "Tcl Library Procedures"
+.if '\\$2'tkc' .TH "\\$1" 3 "\\*(^3" Tk "Tk Library Procedures"
+.if '\\$2'tclcmds' .TH "\\$1" 1 "\\*(^3" Tk "Tcl Applications"
+.if '\\$2'tkcmds' .TH "\\$1" 1 "\\*(^3" Tk "Tk Applications"
+.if '\\$2'iwid' .TH "\\$1" 1 "\\*(^3" Tk "[incr Widgets]"
+.if t .wh -1.3i ^B
+.nr ^l \\n(.l
+.ad b
+..
+'\" # Start an argument description
+.de AP
+.ie !"\\$4"" .TP \\$4
+.el \{\
+. ie !"\\$2"" .TP \\n()Cu
+. el .TP 15
+.\}
+.ie !"\\$3"" \{\
+.ta \\n()Au \\n()Bu
+\&\\$1 \\fI\\$2\\fP (\\$3)
+.\".b
+.\}
+.el \{\
+.br
+.ie !"\\$2"" \{\
+\&\\$1 \\fI\\$2\\fP
+.\}
+.el \{\
+\&\\fI\\$1\\fP
+.\}
+.\}
+..
+'\" # define tabbing values for .AP
+.de AS
+.nr )A 10n
+.if !"\\$1"" .nr )A \\w'\\$1'u+3n
+.nr )B \\n()Au+15n
+.\"
+.if !"\\$2"" .nr )B \\w'\\$2'u+\\n()Au+3n
+.nr )C \\n()Bu+\\w'(in/out)'u+2n
+..
+'\" # BS - start boxed text
+'\" # ^y = starting y location
+'\" # ^b = 1
+.de BS
+.br
+.mk ^y
+.nr ^b 1u
+.if n .nf
+.if n .ti 0
+.if n \l'\\n(.lu\(ul'
+.if n .fi
+..
+'\" # BE - end boxed text (draw box now)
+.de BE
+.nf
+.ti 0
+.mk ^t
+.ie n \l'\\n(^lu\(ul'
+.el \{\
+.\" Draw four-sided box normally, but don't draw top of
+.\" box if the box started on an earlier page.
+.ie !\\n(^b-1 \{\
+\h'-1.5n'\L'|\\n(^yu-1v'\l'\\n(^lu+3n\(ul'\L'\\n(^tu+1v-\\n(^yu'\l'|0u-1.5n\(ul'
+.\}
+.el \}\
+\h'-1.5n'\L'|\\n(^yu-1v'\h'\\n(^lu+3n'\L'\\n(^tu+1v-\\n(^yu'\l'|0u-1.5n\(ul'
+.\}
+.\}
+.fi
+.br
+.nr ^b 0
+..
+'\" # VS - start vertical sidebar
+'\" # ^Y = starting y location
+'\" # ^v = 1 (for troff; for nroff this doesn't matter)
+.de VS
+.mk ^Y
+.ie n 'mc \s12\(br\s0
+.el .nr ^v 1u
+..
+'\" # VE - end of vertical sidebar
+.de VE
+.ie n 'mc
+.el \{\
+.ev 2
+.nf
+.ti 0
+.mk ^t
+\h'|\\n(^lu+3n'\L'|\\n(^Yu-1v\(bv'\v'\\n(^tu+1v-\\n(^Yu'\h'-|\\n(^lu+3n'
+.sp -1
+.fi
+.ev
+.\}
+.nr ^v 0
+..
+'\" # Special macro to handle page bottom: finish off current
+'\" # box/sidebar if in box/sidebar mode, then invoked standard
+'\" # page bottom macro.
+.de ^B
+.ev 2
+'ti 0
+'nf
+.mk ^t
+.if \\n(^b \{\
+.\" Draw three-sided box if this is the box's first page,
+.\" draw two sides but no top otherwise.
+.ie !\\n(^b-1 \h'-1.5n'\L'|\\n(^yu-1v'\l'\\n(^lu+3n\(ul'\L'\\n(^tu+1v-\\n(^yu'\h'|0u'\c
+.el \h'-1.5n'\L'|\\n(^yu-1v'\h'\\n(^lu+3n'\L'\\n(^tu+1v-\\n(^yu'\h'|0u'\c
+.\}
+.if \\n(^v \{\
+.nr ^x \\n(^tu+1v-\\n(^Yu
+\kx\h'-\\nxu'\h'|\\n(^lu+3n'\ky\L'-\\n(^xu'\v'\\n(^xu'\h'|0u'\c
+.\}
+.bp
+'fi
+.ev
+.if \\n(^b \{\
+.mk ^y
+.nr ^b 2
+.\}
+.if \\n(^v \{\
+.mk ^Y
+.\}
+..
+'\" # DS - begin display
+.de DS
+.RS
+.nf
+.sp
+..
+'\" # DE - end display
+.de DE
+.fi
+.RE
+.sp
+..
diff --git a/iwidgets/incoming/src/buttoncage.itk b/iwidgets/incoming/src/buttoncage.itk
new file mode 100644
index 00000000000..734899f44ef
--- /dev/null
+++ b/iwidgets/incoming/src/buttoncage.itk
@@ -0,0 +1,585 @@
+#
+# Buttoncage
+# ----------------------------------------------------------------------
+# Manages a framed area with Motif style buttons.
+#
+#
+# AUTHOR: Mark Alston EMAIL: mark@beernut.com
+#
+# ----------------------------------------------------------------------
+# Almost entirely Based on Button Box written by:
+# Mark L. Ulferts EMAIL: mulferts@austin.dsccc.com
+# Bret A. Schuhmacher EMAIL: bas@wn.com
+#
+# @(#) $Id$
+# ----------------------------------------------------------------------
+# Copyright (c) 1995 DSC Technologies Corporation
+# ======================================================================
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+
+#
+# Usual options.
+#
+
+itk::usual Buttoncage {
+ keep -background -cursor -foreground
+}
+
+# ------------------------------------------------------------------
+# BUTTONCAGE
+# ------------------------------------------------------------------
+itcl::class iwidgets::Buttoncage {
+ inherit itk::Widget
+
+ constructor {args} {}
+ destructor {}
+
+ itk_option define -pady padY Pad 5
+ itk_option define -padx padX Pad 5
+ itk_option define -width width Width 1
+ itk_option define -height height Height 1
+ itk_option define -foreground foreground Foreground black
+
+ public method index {args}
+ public method add {args}
+ public method insert {args}
+ public method delete {args}
+ public method default {args}
+ public method hide {args}
+ public method show {args}
+ public method invoke {args}
+ public method buttonconfigure {args}
+ public method buttoncget {index option}
+
+ private method _positionButtons {}
+ private method _setBoxSize {{when later}}
+ private method _getMaxWidth {}
+ private method _getMaxHeight {}
+ private method _getNumButtons {}
+
+ private variable _resizeFlag {} ;# Flag for resize needed.
+ private variable _buttonList {} ;# List of all buttons in box.
+ private variable _displayList {} ;# List of displayed buttons.
+ private variable _unique 0 ;# Counter for button widget ids.
+}
+
+namespace eval iwidgets::Buttoncage {
+ #
+ # Set up some class level bindings for map and configure events.
+ #
+ bind bcage-map <Map> [itcl::code %W _setBoxSize]
+ bind bcage-config <Configure> [itcl::code %W _positionButtons]
+}
+
+#
+# Provide a lowercased access method for the Buttoncage class.
+#
+proc ::iwidgets::buttoncage {pathName args} {
+ uplevel ::iwidgets::Buttoncage $pathName $args
+}
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Buttoncage::constructor {args} {
+ #
+ # Add Configure bindings for geometry management.
+ #
+ bindtags $itk_component(hull) \
+ [linsert [bindtags $itk_component(hull)] 0 bcage-map]
+ bindtags $itk_component(hull) \
+ [linsert [bindtags $itk_component(hull)] 1 bcage-config]
+
+ pack propagate $itk_component(hull) no
+
+ #
+ # Initialize the widget based on the command line options.
+ #
+ eval itk_initialize $args
+}
+
+# ------------------------------------------------------------------
+# DESTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Buttoncage::destructor {} {
+ if {$_resizeFlag != ""} {after cancel $_resizeFlag}
+}
+
+# ------------------------------------------------------------------
+# OPTIONS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# OPTION: -pady
+#
+# Pad the y space between the button box frame and the hull.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Buttoncage::pady {
+ _setBoxSize
+}
+
+# ------------------------------------------------------------------
+# OPTION: -padx
+#
+# Pad the x space between the button box frame and the hull.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Buttoncage::padx {
+ _setBoxSize
+}
+
+# ------------------------------------------------------------------
+# OPTION: -height
+#
+# Set buttonbox height in buttons
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Buttoncage::height {
+ if { [regexp {^[0-9]*$} $itk_option(-height)] } {
+ _setBoxSize
+ } else {
+ error "bad height option \"$itk_option(-height)\",\
+ should be an integer."
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -width
+#
+# Set buttonbox width in buttons
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Buttoncage::width {
+ if { [regexp {^[0-9]*$} $itk_option(-width)] } {
+ _setBoxSize
+ } else {
+ error "bad width option \"$itk_option(-width)\",\
+ should be an integer."
+ }
+}
+
+# ------------------------------------------------------------------
+# METHODS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# METHOD: index index
+#
+# Searches the buttons in the box for the one with the requested tag,
+# numerical index, keyword "end" or "default". Returns the button's
+# tag if found, otherwise error.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Buttoncage::index {index} {
+ if {[llength $_buttonList] > 0} {
+ if {[regexp {(^[0-9]+$)} $index]} {
+ if {$index < [llength $_buttonList]} {
+ return $index
+ } else {
+ error "Buttoncage index \"$index\" is out of range"
+ }
+
+ } elseif {$index == "end"} {
+ return [expr {[llength $_buttonList] - 1}]
+
+ } elseif {$index == "default"} {
+ foreach knownButton $_buttonList {
+ if {[$itk_component($knownButton) cget -defaultring]} {
+ return [lsearch -exact $_buttonList $knownButton]
+ }
+ }
+
+ error "Buttoncage \"$itk_component(hull)\" has no default"
+
+ } else {
+ if {[set idx [lsearch $_buttonList $index]] != -1} {
+ return $idx
+ }
+
+ error "bad Buttoncage index \"$index\": must be number, end,\
+ default, or pattern"
+ }
+
+ } else {
+ error "Buttoncage \"$itk_component(hull)\" has no buttons"
+ }
+}
+
+# ------------------------------------------------------------------
+# METHOD: add tag ?option value option value ...?
+#
+# Add the specified button to the button box. All PushButton options
+# are allowed. New buttons are added to the list of buttons and the
+# list of displayed buttons. The PushButton path name is returned.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Buttoncage::add {tag args} {
+ itk_component add $tag {
+ iwidgets::Pushbutton $itk_component(hull).[incr _unique]
+ } {
+ usual
+ rename -highlightbackground -background background Background
+
+ }
+
+ if {$args != ""} {
+ uplevel $itk_component($tag) configure $args
+ }
+
+ if { [llength $_buttonList] < [_getNumButtons] } {
+ lappend _buttonList $tag
+ lappend _displayList $tag
+
+ _setBoxSize
+ } else {
+ error "can't insert more buttons. \
+ Buttoncage \"$itk_component(hull)\" is full."
+ }
+}
+
+# ------------------------------------------------------------------
+# METHOD: insert index tag ?option value option value ...?
+#
+# Insert the specified button in the button box just before the one
+# given by index. All PushButton options are allowed. New buttons
+# are added to the list of buttons and the list of displayed buttons.
+# The PushButton path name is returned.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Buttoncage::insert {index tag args} {
+ itk_component add $tag {
+ iwidgets::Pushbutton $itk_component(hull).[incr _unique]
+ } {
+ usual
+ rename -highlightbackground -background background Background
+ }
+
+ if {$args != ""} {
+ uplevel $itk_component($tag) configure $args
+ }
+
+ if { [llength $_buttonList] < [_getNumButtons] } {
+ set index [index $index]
+ set _buttonList [linsert $_buttonList $index $tag]
+ set _displayList [linsert $_displayList $index $tag]
+
+ _setBoxSize
+ } else {
+ error "can't insert more buttons. \
+ Buttoncage \"$itk_component(hull)\" is full."
+ }
+
+}
+
+# ------------------------------------------------------------------
+# METHOD: delete index
+#
+# Delete the specified button from the button box.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Buttoncage::delete {index} {
+ set index [index $index]
+ set tag [lindex $_buttonList $index]
+
+ destroy $itk_component($tag)
+
+ set _buttonList [lreplace $_buttonList $index $index]
+
+ if {[set dind [lsearch $_displayList $tag]] != -1} {
+ set _displayList [lreplace $_displayList $dind $dind]
+ }
+
+ _setBoxSize
+ update idletasks
+}
+
+# ------------------------------------------------------------------
+# METHOD: default index
+#
+# Sets the default to the push button given by index.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Buttoncage::default {index} {
+ set index [index $index]
+
+ set defbtn [lindex $_buttonList $index]
+
+ foreach knownButton $_displayList {
+ if {$knownButton == $defbtn} {
+ $itk_component($knownButton) configure -defaultring yes
+ } else {
+ $itk_component($knownButton) configure -defaultring no
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# METHOD: hide index
+#
+# Hide the push button given by index. This doesn't remove the button
+# permanently from the display list, just inhibits its display.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Buttoncage::hide {index} {
+ set index [index $index]
+ set tag [lindex $_buttonList $index]
+
+ if {[set dind [lsearch $_displayList $tag]] != -1} {
+ place forget $itk_component($tag)
+ set _displayList [lreplace $_displayList $dind $dind]
+
+ _setBoxSize
+ }
+}
+
+# ------------------------------------------------------------------
+# METHOD: show index
+#
+# Displays a previously hidden push button given by index. Check if
+# the button is already in the display list. If not then add it back
+# at it's original location and redisplay.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Buttoncage::show {index} {
+ set index [index $index]
+ set tag [lindex $_buttonList $index]
+
+ if {[lsearch $_displayList $tag] == -1} {
+ set _displayList [linsert $_displayList $index $tag]
+
+ _setBoxSize
+ }
+}
+
+# ------------------------------------------------------------------
+# METHOD: invoke ?index?
+#
+# Invoke the command associated with a push button. If no arguments
+# are given then the default button is invoked, otherwise the argument
+# is expected to be a button index.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Buttoncage::invoke {args} {
+ if {[llength $args] == 0} {
+ $itk_component([lindex $_buttonList [index default]]) invoke
+
+ } else {
+ $itk_component([lindex $_buttonList [index [lindex $args 0]]]) \
+ invoke
+ }
+}
+
+# ------------------------------------------------------------------
+# METHOD: buttonconfigure index ?option? ?value option value ...?
+#
+# Configure a push button given by index. This method allows
+# configuration of pushbuttons from the Buttoncage level. The options
+# may have any of the values accepted by the add method.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Buttoncage::buttonconfigure {index args} {
+ set tag [lindex $_buttonList [index $index]]
+
+ set retstr [uplevel $itk_component($tag) configure $args]
+
+ _setBoxSize
+
+ return $retstr
+}
+
+# ------------------------------------------------------------------
+# METHOD: buttoncget index option
+#
+# Return value of option for push button given by index. Option may
+# have any of the values accepted by the add method.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Buttoncage::buttoncget {index option} {
+ set tag [lindex $_buttonList [index $index]]
+
+ set retstr [uplevel $itk_component($tag) cget [list $option]]
+
+ return $retstr
+}
+
+# -----------------------------------------------------------------
+# PRIVATE METHOD: _getNumButtons
+#
+# Returns the max number of buttons.
+# -----------------------------------------------------------------
+itcl::body iwidgets::Buttoncage::_getNumButtons {} {
+ set max [expr $itk_option(-width) * $itk_option(-height)]
+ return $max
+}
+
+# -----------------------------------------------------------------
+# PRIVATE METHOD: _getMaxWidth
+#
+# Returns the required width of the largest button.
+# -----------------------------------------------------------------
+itcl::body iwidgets::Buttoncage::_getMaxWidth {} {
+ set max 0
+
+ foreach tag $_displayList {
+ set w [winfo reqwidth $itk_component($tag)]
+
+ if {$w > $max} {
+ set max $w
+ }
+ }
+
+ return $max
+}
+
+# -----------------------------------------------------------------
+# PRIVATE METHOD: _getMaxHeight
+#
+# Returns the required height of the largest button.
+# -----------------------------------------------------------------
+itcl::body iwidgets::Buttoncage::_getMaxHeight {} {
+ set max 0
+
+ foreach tag $_displayList {
+ set h [winfo reqheight $itk_component($tag)]
+
+ if {$h > $max} {
+ set max $h
+ }
+ }
+
+ return $max
+}
+
+# ------------------------------------------------------------------
+# METHOD: _setBoxSize ?when?
+#
+# Sets the proper size of the frame surrounding all the buttons.
+# If "when" is "now", the change is applied immediately. If it is
+# "later" or it is not specified, then the change is applied later,
+# when the application is idle.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Buttoncage::_setBoxSize {{when later}} {
+ if {[winfo ismapped $itk_component(hull)]} {
+ if {$when == "later"} {
+ if {$_resizeFlag == ""} {
+ set _resizeFlag [after idle [itcl::code $this _setBoxSize now]]
+ }
+ return
+ } elseif {$when != "now"} {
+ error "bad option \"$when\": should be now or later"
+ }
+
+ set _resizeFlag ""
+
+ set minw [expr { $itk_option(-width) * [_getMaxWidth] \
+ + ($itk_option(-width) ) * $itk_option(-padx)}]
+ set minh [expr {$itk_option(-height) * [_getMaxHeight] \
+ + ($itk_option(-height)) * $itk_option(-pady)}]
+
+
+ #
+ # Remove the configure event bindings on the hull while we adjust the
+ # width/height and re-position the buttons. Once we're through, we'll
+ # update and reinstall them. This prevents double calls to position
+ # the buttons.
+ #
+ set tags [bindtags $itk_component(hull)]
+ if {[set i [lsearch $tags bcage-config]] != -1} {
+ set tags [lreplace $tags $i $i]
+ bindtags $itk_component(hull) $tags
+ }
+
+ component hull configure -width $minw -height $minh
+
+ update idletasks
+
+ _positionButtons
+
+ bindtags $itk_component(hull) [linsert $tags 0 bcage-config]
+ }
+}
+
+# ------------------------------------------------------------------
+# METHOD: _positionButtons
+#
+# This method is responsible setting the width/height of all the
+# displayed buttons to the same value and for placing all the buttons
+# in equidistant locations.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Buttoncage::_positionButtons {} {
+ set bf $itk_component(hull)
+ set numBtns [llength $_displayList]
+
+ #
+ # First, determine the common width and height for all the
+ # displayed buttons.
+ #
+ if {$numBtns > 0} {
+ set bfWidth [winfo width $itk_component(hull)]
+ set bfHeight [winfo height $itk_component(hull)]
+
+ if {$bfWidth >= [winfo reqwidth $itk_component(hull)]} {
+ set _btnWidth [_getMaxWidth]
+
+ } else {
+ set _btnWidth [expr {$bfWidth / $itk_option(-width)}]
+ }
+
+
+ if {$bfHeight >= [winfo reqheight $itk_component(hull)]} {
+ set _btnHeight [_getMaxHeight]
+
+ } else {
+ set _btnHeight [expr {$bfHeight / $itk_option(-height)}]
+ }
+ }
+
+ #
+ # Place the buttons at the proper locations.
+ #
+ if {$numBtns > 0} {
+ set leftover_width [expr {[winfo width $bf] \
+ - 2 * $itk_option(-padx) - $_btnWidth * $itk_option(-width)}]
+ set offset_width [expr {$leftover_width / ($itk_option(-width) + 1)}]
+ if {$offset_width < 0} {set offset_width 0}
+
+ set xDist [expr {$itk_option(-padx) + $offset_width}]
+ set startxDist $xDist
+
+ set incrAmountX [expr {$_btnWidth + $offset_width}]
+
+
+ set leftover_height [expr {[winfo height $bf] \
+ - 2 * $itk_option(-pady) - $_btnHeight * $itk_option(-height)}]
+ set offset_height [expr {$leftover_height / ($itk_option(-height) + 1)}]
+ if {$offset_height < 0} {set offset_height 0}
+
+
+
+ set yDist [expr {$itk_option(-pady) + $offset_height} + .5 * $_btnHeight]
+ set incrAmountY [expr {$_btnHeight + $offset_height}]
+
+ set i 1
+ foreach button $_displayList {
+ place $itk_component($button) -anchor w \
+ -x $xDist -rely 0 -y $yDist -relx 0 \
+ -width $_btnWidth -height $_btnHeight
+ if { $i == $itk_option(-width) } {
+ set yDist [expr {$yDist + $incrAmountY}]
+ set xDist $startxDist
+ set i 1
+ } else {
+ set xDist [expr {$xDist + $incrAmountX}]
+ incr i
+ }
+ }
+ }
+}
+
+
diff --git a/iwidgets/incoming/src/collapsablewidget.itk b/iwidgets/incoming/src/collapsablewidget.itk
new file mode 100644
index 00000000000..423f04729cd
--- /dev/null
+++ b/iwidgets/incoming/src/collapsablewidget.itk
@@ -0,0 +1,324 @@
+#
+# Collapsablewidget
+# ----------------------------------------------------------------------
+# Implements a collapsable widget which contains a label and child site.
+# The child site is a frame which can filled with any widget via a
+# derived itcl::class or though the use of the childSite method.
+#
+# Clicking on the button/arrow indicator will collapse/reveal the
+# child-site
+#
+# ----------------------------------------------------------------------
+# AUTHOR: Vince Darley EMAIL: vince@biosgroup.com
+#
+# Based upon the labelledwidget distributed under the copyright
+# below, under which all my modifications are also distributed.
+#
+# ----------------------------------------------------------------------
+# Copyright (c) 1995-1999 DSC Technologies Corporation
+# ======================================================================
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+
+#
+# Default resources.
+#
+option add *Collapsablewidget.labelMargin 1 widgetDefault
+package require Itk
+
+#
+# Usual options.
+#
+itk::usual Collapsablewidget {
+ keep -background -cursor -foreground -labelfont
+}
+
+# Define the right pointing and down-pointing triangles
+# for collapsed and expanded entries.
+if {[lsearch [image names] closedNode] == -1} {
+ image create bitmap closedNode -data {
+ #define closednode_width 13
+ #define closednode_height 13
+ static char closednode_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x30, 0x10,
+ 0x70, 0x10, 0xf0, 0x10, 0xf0, 0x11, 0xf0, 0x13,
+ 0xf0, 0x11, 0xf0, 0x10, 0x70, 0x10, 0x30, 0x10,
+ 0x10, 0x10};
+ }
+}
+if {[lsearch [image names] openNode] == -1} {
+ image create bitmap openNode -data {
+ #define opennode_width 13
+ #define opennode_height 13
+ static char opennode_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x1f,
+ 0xf8, 0x0f, 0xf0, 0x07, 0xe0, 0x03, 0xc0, 0x01,
+ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x1f,
+ 0x00, 0x00};
+ }
+}
+
+# ------------------------------------------------------------------
+# COLLAPSABLEWIDGET
+# ------------------------------------------------------------------
+
+itcl::class iwidgets::Collapsablewidget {
+ inherit itk::Widget
+
+ constructor {args} {}
+ destructor {}
+
+ itk_option define -labelmargin labelMargin Margin 1
+ itk_option define -labeltext labelText Text {}
+ itk_option define -labelvariable labelVariable Variable {}
+ itk_option define -labelbitmap labelBitmap Bitmap {}
+ itk_option define -labelimage labelImage Image {}
+ itk_option define -collapsed collapsed Collapsed 1
+
+ public method childsite
+
+ public method collapse
+
+ public method reveal
+
+ public method toggle
+
+ protected method _positionLabel {when}
+
+ proc alignlabels {args} {}
+
+ protected variable _reposition "" ;# non-null => _positionLabel pending
+}
+
+#
+# Provide a lowercased access method for the Collapsablewidget class.
+#
+proc ::iwidgets::collapsablewidget {pathName args} {
+ uplevel ::iwidgets::Collapsablewidget $pathName $args
+}
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+
+itcl::body iwidgets::Collapsablewidget::constructor {args} {
+ #
+ # Create the outermost frame to maintain geometry.
+ #
+ itk_component add shell {
+ frame $itk_interior.shell -relief ridge -bd 2
+ } {
+ keep -background -cursor
+ }
+ pack $itk_component(shell) -fill both -expand yes
+
+ itk_component add frame {
+ frame $itk_component(shell).frame
+ } {
+ }
+ pack $itk_component(frame) -fill x -expand no -side top
+
+ itk_component add trigger {
+ button $itk_component(shell).frame.trigger -command "$this toggle" \
+ -relief flat \
+ -image closedNode
+ } {
+ }
+ pack $itk_component(trigger) -side left
+ #
+ # Create label.
+ #
+ itk_component add label {
+ label $itk_component(shell).frame.label
+ } {
+ keep -background -foreground -cursor
+
+ rename -font -labelfont labelFont Font
+ }
+ pack $itk_component(label) -side right -fill x -expand yes
+
+ #
+ # Create margin between label and the child site.
+ #
+ itk_component add labmargin {
+ frame $itk_component(shell).labmargin
+ } {
+ keep -background -cursor
+ }
+ pack $itk_component(labmargin) -side bottom
+
+ #
+ # Create a frame for the childsite widget.
+ #
+ itk_component add lwchildsite {
+ frame $itk_component(shell).lwchildsite
+ } {
+ keep -background -cursor
+ }
+ #pack $itk_component(lwchildsite) -fill both -expand yes
+ set itk_interior $itk_component(lwchildsite)
+
+
+ ##
+ # Explicitly handle configs that may have been ignored earlier.
+ #
+ eval itk_initialize $args
+
+ #
+ # When idle, position the label.
+ #
+}
+
+# ------------------------------------------------------------------
+# DESTURCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Collapsablewidget::destructor {} {
+ if {$_reposition != ""} {after cancel $_reposition}
+}
+
+itcl::body iwidgets::Collapsablewidget::toggle {} {
+ set itk_option(-collapsed) [expr 1 - $itk_option(-collapsed)]
+ if {$itk_option(-collapsed)} {
+ collapse
+ } else {
+ reveal
+ }
+}
+
+itcl::body iwidgets::Collapsablewidget::collapse {} {
+ pack forget $itk_component(lwchildsite)
+ $itk_component(trigger) configure -image closedNode
+}
+
+itcl::body iwidgets::Collapsablewidget::reveal {} {
+ pack $itk_component(lwchildsite) -side bottom -fill both -expand yes
+ $itk_component(trigger) configure -image openNode
+}
+
+# ------------------------------------------------------------------
+# OPTIONS
+# ------------------------------------------------------------------
+
+itcl::configbody iwidgets::Collapsablewidget::collapsed {
+ if {$itk_option(-collapsed)} {
+ collapse
+ } else {
+ reveal
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -labeltext
+#
+# Specifies the label text.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Collapsablewidget::labeltext {
+ $itk_component(label) configure -text $itk_option(-labeltext)
+
+}
+
+# ------------------------------------------------------------------
+# OPTION: -labelvariable
+#
+# Specifies the label text variable.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Collapsablewidget::labelvariable {
+ $itk_component(label) configure -textvariable $itk_option(-labelvariable)
+
+}
+
+# ------------------------------------------------------------------
+# OPTION: -labelbitmap
+#
+# Specifies the label bitmap.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Collapsablewidget::labelbitmap {
+ $itk_component(label) configure -bitmap $itk_option(-labelbitmap)
+}
+
+# ------------------------------------------------------------------
+# OPTION: -labelimage
+#
+# Specifies the label image.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Collapsablewidget::labelimage {
+ $itk_component(label) configure -image $itk_option(-labelimage)
+}
+
+# ------------------------------------------------------------------
+# METHODS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# METHOD: childsite
+#
+# Returns the path name of the child site widget.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Collapsablewidget::childsite {} {
+ return $itk_component(lwchildsite)
+}
+
+# ------------------------------------------------------------------
+# PROCEDURE: alignlabels widget ?widget ...?
+#
+# The alignlabels procedure takes a list of widgets derived from
+# the Collapsablewidget itcl::class and adjusts the label margin to align
+# the labels.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Collapsablewidget::alignlabels {args} {
+ update
+ set maxLabelWidth 0
+
+ #
+ # Verify that all the widgets are of type Collapsablewidget and
+ # determine the size of the maximum length label string.
+ #
+ foreach iwid $args {
+ if {[catch {$iwid isa iwidgets::Collapsablewidget} ret] || $ret == 0} {
+ error "$iwid is not a \"Collapsablewidget\": $ret"
+ }
+
+ set csWidth [winfo reqwidth $iwid.shell.lwchildsite]
+ set shellWidth [winfo reqwidth $iwid.shell]
+
+ if {[expr $shellWidth - $csWidth] > $maxLabelWidth} {
+ set maxLabelWidth [expr $shellWidth - $csWidth]
+ }
+ }
+
+ #
+ # Adjust the margins for the labels such that the child sites and
+ # labels line up.
+ #
+ foreach iwid $args {
+ set csWidth [winfo reqwidth $iwid.shell.lwchildsite]
+ set shellWidth [winfo reqwidth $iwid.shell]
+
+ set labelSize [expr $shellWidth - $csWidth]
+
+ if {$maxLabelWidth > $labelSize} {
+ set dist [expr $maxLabelWidth - \
+ ($labelSize - [winfo reqwidth $iwid.shell.labmargin])]
+
+ $iwid configure -labelmargin $dist
+ }
+ }
+}
diff --git a/iwidgets/iwidgets.tcl.in b/iwidgets/iwidgets.tcl.in
new file mode 100644
index 00000000000..93098c3b6b3
--- /dev/null
+++ b/iwidgets/iwidgets.tcl.in
@@ -0,0 +1,31 @@
+#
+# iwidgets.tcl
+# ----------------------------------------------------------------------
+# Invoked automatically by [incr Tk] upon startup to initialize
+# the [incr Widgets] package.
+# ----------------------------------------------------------------------
+# AUTHOR: Mark L. Ulferts EMAIL: mulferts@spd.dsccc.com
+#
+# @(#) $Id$
+# ----------------------------------------------------------------------
+# Copyright (c) 1995 Mark L. Ulferts
+# ======================================================================
+# See the file "license.terms" for information on usage and
+# redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+
+package require Tcl 8.0
+package require Tk 8.0
+package require Itcl @ITCL_VERSION@
+package require Itk @ITCL_VERSION@
+
+namespace eval ::iwidgets {
+ namespace export *
+
+ variable library [file dirname [info script]]
+ variable version @VERSION@
+}
+
+lappend auto_path $iwidgets::library \
+ [file join $iwidgets::library generic] \
+ [file join $iwidgets::library scripts]
+package provide Iwidgets $iwidgets::version
diff --git a/iwidgets/license.terms b/iwidgets/license.terms
new file mode 100644
index 00000000000..cc56f996b93
--- /dev/null
+++ b/iwidgets/license.terms
@@ -0,0 +1,31 @@
+This software is copyrighted by DSC Technologies and private individual
+contributors. The copyright holder is specifically listed in the header
+of each file. The following terms apply to all files associated with the
+software unless explicitly disclaimed in individual files by private
+contributors.
+
+Copyright 1997 DSC Technologies Corporation
+
+Permission to use, copy, modify, distribute and license this software and
+its documentation for any purpose, and without fee or written agreement
+with DSC, is hereby granted, provided that the above copyright notice
+appears in all copies and that both the copyright notice and warranty
+disclaimer below appear in supporting documentation, and that the names of
+DSC Technologies Corporation or DSC Communications Corporation not be used
+in advertising or publicity pertaining to the software without specific,
+written prior permission.
+
+DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-INFRINGEMENT.
+THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND
+DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
+ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL DSC BE LIABLE FOR ANY
+SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
+RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, ARISING OUT OF OR IN
+CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+RESTRICTED RIGHTS: Use, duplication or disclosure by the government
+is subject to the restrictions as set forth in subparagraph (c) (1) (ii)
+of the Rights in Technical Data and Computer Software Clause as DFARS
+252.227-7013 and FAR 52.227-19.
diff --git a/iwidgets/outgoing/README b/iwidgets/outgoing/README
new file mode 100644
index 00000000000..8440f1af876
--- /dev/null
+++ b/iwidgets/outgoing/README
@@ -0,0 +1,14 @@
+==========================================================================
+ ----------------- [incr Widgets] Outgoing Widgets ---------------------
+==========================================================================
+
+ This directory contains mega-widgets which appear to be failing in
+public acceptance. The negative feedback has out paced the positive.
+They still have doc, test, and demos, but should be considered on their
+way out of the distribution. If you are one of the minority which feels
+differently as to the widgets usefullness, please copy it to a safe location.
+It will not be around long.
+
+LEAVING WIDGETS
+---------------------------------------------------------------------------
+None
diff --git a/iwidgets/pkgIndex.tcl.in b/iwidgets/pkgIndex.tcl.in
new file mode 100644
index 00000000000..bde254ab383
--- /dev/null
+++ b/iwidgets/pkgIndex.tcl.in
@@ -0,0 +1,3 @@
+# Tcl package index file, version 1.0
+
+package ifneeded Iwidgets @VERSION@ [list source [file join $dir iwidgets.tcl]]
diff --git a/iwidgets/tcl.m4 b/iwidgets/tcl.m4
new file mode 100644
index 00000000000..e1b51065e4a
--- /dev/null
+++ b/iwidgets/tcl.m4
@@ -0,0 +1,2270 @@
+# tcl.m4 --
+#
+# This file provides a set of autoconf macros to help TEA-enable
+# a Tcl extension.
+#
+# Copyright (c) 1999 Scriptics Corporation.
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+
+#------------------------------------------------------------------------
+# SC_PATH_TCLCONFIG --
+#
+# Locate the tclConfig.sh file and perform a sanity check on
+# the Tcl compile flags
+#
+# Arguments:
+# none
+#
+# Results:
+#
+# Adds the following arguments to configure:
+# --with-tcl=...
+#
+# Defines the following vars:
+# TCL_BIN_DIR Full path to the directory containing
+# the tclConfig.sh file
+#------------------------------------------------------------------------
+
+AC_DEFUN(SC_PATH_TCLCONFIG, [
+ #
+ # Ok, lets find the tcl configuration
+ # First, look for one uninstalled.
+ # the alternative search directory is invoked by --with-tcl
+ #
+
+ if test x"${no_tcl}" = x ; then
+ # we reset no_tcl in case something fails here
+ no_tcl=true
+ AC_ARG_WITH(tcl, [ --with-tcl directory containing tcl configuration (tclConfig.sh)], with_tclconfig=${withval})
+ AC_MSG_CHECKING([for Tcl configuration])
+ AC_CACHE_VAL(ac_cv_c_tclconfig,[
+
+ # First check to see if --with-tcl was specified.
+ if test x"${with_tclconfig}" != x ; then
+ if test -f "${with_tclconfig}/tclConfig.sh" ; then
+ ac_cv_c_tclconfig=`(cd ${with_tclconfig}; pwd)`
+ else
+ AC_MSG_ERROR([${with_tclconfig} directory doesn't contain tclConfig.sh])
+ fi
+ fi
+
+ # then check for a private Tcl installation
+ if test x"${ac_cv_c_tclconfig}" = x ; then
+ for i in \
+ ../tcl \
+ `ls -dr ../tcl[[8-9]].[[0-9]]* 2>/dev/null` \
+ ../../tcl \
+ `ls -dr ../../tcl[[8-9]].[[0-9]]* 2>/dev/null` \
+ ../../../tcl \
+ `ls -dr ../../../tcl[[8-9]].[[0-9]]* 2>/dev/null` ; do
+ if test -f "$i/unix/tclConfig.sh" ; then
+ ac_cv_c_tclconfig=`(cd $i/unix; pwd)`
+ break
+ fi
+ done
+ fi
+
+ # check in a few common install locations
+ if test x"${ac_cv_c_tclconfig}" = x ; then
+ for i in `ls -d ${prefix}/lib 2>/dev/null` \
+ `ls -d /usr/local/lib 2>/dev/null` ; do
+ if test -f "$i/tclConfig.sh" ; then
+ ac_cv_c_tclconfig=`(cd $i; pwd)`
+ break
+ fi
+ done
+ fi
+
+ # check in a few other private locations
+ if test x"${ac_cv_c_tclconfig}" = x ; then
+ for i in \
+ ${srcdir}/../tcl \
+ `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]]* 2>/dev/null` ; do
+ if test -f "$i/unix/tclConfig.sh" ; then
+ ac_cv_c_tclconfig=`(cd $i/unix; pwd)`
+ break
+ fi
+ done
+ fi
+ ])
+
+ if test x"${ac_cv_c_tclconfig}" = x ; then
+ TCL_BIN_DIR="# no Tcl configs found"
+ AC_MSG_WARN(Can't find Tcl configuration definitions)
+ exit 0
+ else
+ no_tcl=
+ TCL_BIN_DIR=${ac_cv_c_tclconfig}
+ AC_MSG_RESULT(found $TCL_BIN_DIR/tclConfig.sh)
+ fi
+ fi
+])
+
+#------------------------------------------------------------------------
+# SC_PATH_TKCONFIG --
+#
+# Locate the tkConfig.sh file
+#
+# Arguments:
+# none
+#
+# Results:
+#
+# Adds the following arguments to configure:
+# --with-tk=...
+#
+# Defines the following vars:
+# TK_BIN_DIR Full path to the directory containing
+# the tkConfig.sh file
+#------------------------------------------------------------------------
+
+AC_DEFUN(SC_PATH_TKCONFIG, [
+ #
+ # Ok, lets find the tk configuration
+ # First, look for one uninstalled.
+ # the alternative search directory is invoked by --with-tk
+ #
+
+ if test x"${no_tk}" = x ; then
+ # we reset no_tk in case something fails here
+ no_tk=true
+ AC_ARG_WITH(tk, [ --with-tk directory containing tk configuration (tkConfig.sh)], with_tkconfig=${withval})
+ AC_MSG_CHECKING([for Tk configuration])
+ AC_CACHE_VAL(ac_cv_c_tkconfig,[
+
+ # First check to see if --with-tkconfig was specified.
+ if test x"${with_tkconfig}" != x ; then
+ if test -f "${with_tkconfig}/tkConfig.sh" ; then
+ ac_cv_c_tkconfig=`(cd ${with_tkconfig}; pwd)`
+ else
+ AC_MSG_ERROR([${with_tkconfig} directory doesn't contain tkConfig.sh])
+ fi
+ fi
+
+ # then check for a private Tk library
+ if test x"${ac_cv_c_tkconfig}" = x ; then
+ for i in \
+ ../tk \
+ `ls -dr ../tk[[8-9]].[[0-9]]* 2>/dev/null` \
+ ../../tk \
+ `ls -dr ../../tk[[8-9]].[[0-9]]* 2>/dev/null` \
+ ../../../tk \
+ `ls -dr ../../../tk[[8-9]].[[0-9]]* 2>/dev/null` ; do
+ if test -f "$i/unix/tkConfig.sh" ; then
+ ac_cv_c_tkconfig=`(cd $i/unix; pwd)`
+ break
+ fi
+ done
+ fi
+ # check in a few common install locations
+ if test x"${ac_cv_c_tkconfig}" = x ; then
+ for i in `ls -d ${prefix}/lib 2>/dev/null` \
+ `ls -d /usr/local/lib 2>/dev/null` ; do
+ if test -f "$i/tkConfig.sh" ; then
+ ac_cv_c_tkconfig=`(cd $i; pwd)`
+ break
+ fi
+ done
+ fi
+ # check in a few other private locations
+ if test x"${ac_cv_c_tkconfig}" = x ; then
+ for i in \
+ ${srcdir}/../tk \
+ `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]]* 2>/dev/null` ; do
+ if test -f "$i/unix/tkConfig.sh" ; then
+ ac_cv_c_tkconfig=`(cd $i/unix; pwd)`
+ break
+ fi
+ done
+ fi
+ ])
+ if test x"${ac_cv_c_tkconfig}" = x ; then
+ TK_BIN_DIR="# no Tk configs found"
+ AC_MSG_WARN(Can't find Tk configuration definitions)
+ exit 0
+ else
+ no_tk=
+ TK_BIN_DIR=${ac_cv_c_tkconfig}
+ AC_MSG_RESULT(found $TK_BIN_DIR/tkConfig.sh)
+ fi
+ fi
+
+])
+
+#------------------------------------------------------------------------
+# SC_LOAD_TCLCONFIG --
+#
+# Load the tclConfig.sh file
+#
+# Arguments:
+#
+# Requires the following vars to be set:
+# TCL_BIN_DIR
+#
+# Results:
+#
+# Subst the following vars:
+# TCL_BIN_DIR
+# TCL_SRC_DIR
+# TCL_LIB_FILE
+#
+#------------------------------------------------------------------------
+
+AC_DEFUN(SC_LOAD_TCLCONFIG, [
+ AC_MSG_CHECKING([for existence of $TCL_BIN_DIR/tclConfig.sh])
+
+ if test -f "$TCL_BIN_DIR/tclConfig.sh" ; then
+ AC_MSG_RESULT([loading])
+ . $TCL_BIN_DIR/tclConfig.sh
+ else
+ AC_MSG_RESULT([file not found])
+ fi
+
+ #
+ # The eval is required to do the TCL_DBGX substitution in the
+ # TCL_LIB_FILE variable
+ #
+
+ eval TCL_LIB_FILE=${TCL_LIB_FILE}
+ eval TCL_LIB_FLAG=${TCL_LIB_FLAG}
+
+ AC_SUBST(TCL_DBGX)
+ AC_SUBST(TCL_BIN_DIR)
+ AC_SUBST(TCL_SRC_DIR)
+ AC_SUBST(TCL_LIB_FILE)
+ AC_SUBST(TCL_LIBS)
+ AC_SUBST(TCL_DEFS)
+ AC_SUBST(TCL_SHLIB_LD_LIBS)
+ AC_SUBST(TCL_EXTRA_CFLAGS)
+ AC_SUBST(TCL_LD_FLAGS)
+ AC_SUBST(TCL_LIB_FILE)
+ AC_SUBST(TCL_STUB_LIB_FILE)
+ AC_SUBST(TCL_LIB_SPEC)
+ AC_SUBST(TCL_BUILD_LIB_SPEC)
+ AC_SUBST(TCL_STUB_LIB_SPEC)
+ AC_SUBST(TCL_BUILD_STUB_LIB_SPEC)
+])
+
+#------------------------------------------------------------------------
+# SC_LOAD_TKCONFIG --
+#
+# Load the tkConfig.sh file
+#
+# Arguments:
+#
+# Requires the following vars to be set:
+# TK_BIN_DIR
+#
+# Results:
+#
+# Sets the following vars that should be in tkConfig.sh:
+# TK_BIN_DIR
+#------------------------------------------------------------------------
+
+AC_DEFUN(SC_LOAD_TKCONFIG, [
+ AC_MSG_CHECKING([for existence of $TK_BIN_DIR/tkConfig.sh])
+
+ if test -f "$TK_BIN_DIR/tkConfig.sh" ; then
+ AC_MSG_RESULT([loading])
+ . $TK_BIN_DIR/tkConfig.sh
+ else
+ AC_MSG_RESULT([could not find $TK_BIN_DIR/tkConfig.sh])
+ fi
+
+ AC_SUBST(TK_BIN_DIR)
+ AC_SUBST(TK_SRC_DIR)
+ AC_SUBST(TK_LIB_FILE)
+ AC_SUBST(TK_XINCLUDES)
+])
+
+#------------------------------------------------------------------------
+# SC_ENABLE_GCC --
+#
+# Allows the use of GCC if available
+#
+# Arguments:
+# none
+#
+# Results:
+#
+# Adds the following arguments to configure:
+# --enable-gcc
+#
+# Sets the following vars:
+# CC Command to use for the compiler
+#------------------------------------------------------------------------
+
+AC_DEFUN(SC_ENABLE_GCC, [
+ AC_ARG_ENABLE(gcc, [ --enable-gcc allow use of gcc if available [--disable-gcc]],
+ [ok=$enableval], [ok=no])
+ if test "$ok" = "yes"; then
+ CC=gcc
+ else
+ case "`uname -s`" in
+ *win32* | *WIN32* | *CYGWIN_NT* | *CYGWIN_98* | *CYGWIN_95*)
+ CC=cl
+ ;;
+ *)
+ CC=${CC-cc}
+ ;;
+ esac
+ fi
+ AC_PROG_CC
+])
+
+#------------------------------------------------------------------------
+# SC_ENABLE_SHARED --
+#
+# Allows the building of shared libraries
+#
+# Arguments:
+# none
+#
+# Results:
+#
+# Adds the following arguments to configure:
+# --enable-shared=yes|no
+#
+# Defines the following vars:
+# STATIC_BUILD Used for building import/export libraries
+# on Windows.
+#
+# Sets the following vars:
+# SHARED_BUILD Value of 1 or 0
+#------------------------------------------------------------------------
+
+AC_DEFUN(SC_ENABLE_SHARED, [
+ AC_MSG_CHECKING([how to build libraries])
+ AC_ARG_ENABLE(shared,
+ [ --enable-shared build and link with shared libraries [--enable-shared]],
+ [tcl_ok=$enableval], [tcl_ok=yes])
+
+ if test "${enable_shared+set}" = set; then
+ enableval="$enable_shared"
+ tcl_ok=$enableval
+ else
+ tcl_ok=yes
+ fi
+
+ if test "$tcl_ok" = "yes" ; then
+ AC_MSG_RESULT([shared])
+ SHARED_BUILD=1
+ else
+ AC_MSG_RESULT([static])
+ SHARED_BUILD=0
+ AC_DEFINE(STATIC_BUILD)
+ fi
+])
+
+#------------------------------------------------------------------------
+# SC_ENABLE_THREADS --
+#
+# Specify if thread support should be enabled
+#
+# Arguments:
+# none
+#
+# Results:
+#
+# Adds the following arguments to configure:
+# --enable-threads
+#
+# Sets the following vars:
+# THREADS_LIBS Thread library(s)
+#
+# Defines the following vars:
+# TCL_THREADS
+# _REENTRANT
+#
+#------------------------------------------------------------------------
+
+AC_DEFUN(SC_ENABLE_THREADS, [
+ AC_MSG_CHECKING(for building with threads)
+ AC_ARG_ENABLE(threads, [ --enable-threads build with threads],
+ [tcl_ok=$enableval], [tcl_ok=no])
+
+ if test "$tcl_ok" = "yes"; then
+ TCL_THREADS=1
+ AC_DEFINE(TCL_THREADS)
+ AC_DEFINE(_REENTRANT)
+
+ case "`uname -s`" in
+ *win32* | *WIN32* | *CYGWIN_NT* | *CYGWIN_98* | *CYGWIN_95*)
+ AC_MSG_RESULT(yes)
+ ;;
+ *)
+ AC_CHECK_LIB(pthread,pthread_mutex_init,tcl_ok=yes,tcl_ok=no)
+ if test "$tcl_ok" = "yes"; then
+ # The space is needed
+ THREADS_LIBS=" -lpthread"
+ AC_MSG_RESULT(yes)
+ else
+ TCL_THREADS=0
+ AC_MSG_RESULT(no)
+ AC_MSG_WARN("Don t know how to find pthread lib on your system - you must disable thread support or edit the LIBS in the Makefile...")
+ fi
+ ;;
+ esac
+ else
+ TCL_THREADS=0
+ AC_MSG_RESULT(no (default))
+ fi
+
+])
+
+#------------------------------------------------------------------------
+# SC_ENABLE_SYMBOLS --
+#
+# Specify if debugging symbols should be used
+#
+# Arguments:
+# none
+#
+# Requires the following vars to be set:
+# CFLAGS_DEBUG
+# CFLAGS_OPTIMIZE
+# LDFLAGS_DEBUG
+# LDFLAGS_OPTIMIZE
+#
+# Results:
+#
+# Adds the following arguments to configure:
+# --enable-symbols
+#
+# Defines the following vars:
+# CFLAGS_DEFAULT Sets to CFLAGS_DEBUG if true
+# Sets to CFLAGS_OPTIMIZE if false
+# LDFLAGS_DEFAULT Sets to LDFLAGS_DEBUG if true
+# Sets to LDFLAGS_OPTIMIZE if false
+# DBGX Debug library extension
+#
+#------------------------------------------------------------------------
+
+AC_DEFUN(SC_ENABLE_SYMBOLS, [
+ case "`uname -s`" in
+ *win32* | *WIN32* | *CYGWIN_NT* | *CYGWIN_98* | *CYGWIN_95*)
+ tcl_dbgx=d
+ ;;
+ *)
+ tcl_dbgx=g
+ ;;
+ esac
+
+ AC_MSG_CHECKING([for build with symbols])
+ AC_ARG_ENABLE(symbols, [ --enable-symbols build with debugging symbols [--disable-symbols]], [tcl_ok=$enableval], [tcl_ok=no])
+ if test "$tcl_ok" = "yes"; then
+ CFLAGS_DEFAULT="${CFLAGS_DEBUG}"
+ LDFLAGS_DEFAULT="${LDFLAGS_DEBUG}"
+ DBGX=${tcl_dbgx}
+ TCL_DBGX=${tcl_dbgx}
+ AC_MSG_RESULT([yes])
+ else
+ CFLAGS_DEFAULT="${CFLAGS_OPTIMIZE}"
+ LDFLAGS_DEFAULT="${LDFLAGS_OPTIMIZE}"
+ DBGX=""
+ TCL_DBGX=""
+ AC_MSG_RESULT([no])
+ fi
+
+ AC_SUBST(TCL_DBGX)
+ AC_SUBST(CFLAGS_DEFAULT)
+ AC_SUBST(LDFLAGS_DEFAULT)
+])
+
+#--------------------------------------------------------------------
+# SC_CONFIG_CFLAGS
+#
+# Try to determine the proper flags to pass to the compiler
+# for building shared libraries and other such nonsense.
+#
+# Arguments:
+# none
+#
+# Results:
+#
+# Defines the following vars:
+#
+# DL_OBJS - Name of the object file that implements dynamic
+# loading for Tcl on this system.
+# DL_LIBS - Library file(s) to include in tclsh and other base
+# applications in order for the "load" command to work.
+# LDFLAGS - Flags to pass to the compiler when linking object
+# files into an executable application binary such
+# as tclsh.
+# LD_SEARCH_FLAGS-Flags to pass to ld, such as "-R /usr/local/tcl/lib",
+# that tell the run-time dynamic linker where to look
+# for shared libraries such as libtcl.so. Depends on
+# the variable LIB_RUNTIME_DIR in the Makefile.
+# MAKE_LIB - Command to execute to build the Tcl library;
+# differs depending on whether or not Tcl is being
+# compiled as a shared library.
+# SHLIB_CFLAGS - Flags to pass to cc when compiling the components
+# of a shared library (may request position-independent
+# code, among other things).
+# SHLIB_LD - Base command to use for combining object files
+# into a shared library.
+# SHLIB_LD_LIBS - Dependent libraries for the linker to scan when
+# creating shared libraries. This symbol typically
+# goes at the end of the "ld" commands that build
+# shared libraries. The value of the symbol is
+# "${LIBS}" if all of the dependent libraries should
+# be specified when creating a shared library. If
+# dependent libraries should not be specified (as on
+# SunOS 4.x, where they cause the link to fail, or in
+# general if Tcl and Tk aren't themselves shared
+# libraries), then this symbol has an empty string
+# as its value.
+# SHLIB_SUFFIX - Suffix to use for the names of dynamically loadable
+# extensions. An empty string means we don't know how
+# to use shared libraries on this platform.
+# TCL_LIB_FILE - Name of the file that contains the Tcl library, such
+# as libtcl7.8.so or libtcl7.8.a.
+# TCL_LIB_SUFFIX -Specifies everything that comes after the "libtcl"
+# in the shared library name, using the $VERSION variable
+# to put the version in the right place. This is used
+# by platforms that need non-standard library names.
+# Examples: ${VERSION}.so.1.1 on NetBSD, since it needs
+# to have a version after the .so, and ${VERSION}.a
+# on AIX, since the Tcl shared library needs to have
+# a .a extension whereas shared objects for loadable
+# extensions have a .so extension. Defaults to
+# ${VERSION}${SHLIB_SUFFIX}.
+# TCL_NEEDS_EXP_FILE -
+# 1 means that an export file is needed to link to a
+# shared library.
+# TCL_EXP_FILE - The name of the installed export / import file which
+# should be used to link to the Tcl shared library.
+# Empty if Tcl is unshared.
+# TCL_BUILD_EXP_FILE -
+# The name of the built export / import file which
+# should be used to link to the Tcl shared library.
+# Empty if Tcl is unshared.
+# CFLAGS_DEBUG -
+# Flags used when running the compiler in debug mode
+# CFLAGS_OPTIMIZE -
+# Flags used when running the compiler in optimize mode
+#
+# EXTRA_CFLAGS
+#
+# Subst's the following vars:
+# DL_LIBS
+# CFLAGS_DEBUG
+# CFLAGS_OPTIMIZE
+#--------------------------------------------------------------------
+
+AC_DEFUN(SC_CONFIG_CFLAGS, [
+
+ # Step 0: Enable 64 bit support?
+
+ AC_MSG_CHECKING([if 64bit support is enabled])
+ AC_ARG_ENABLE(64bit,[ --enable-64bit enable 64bit support],,enableval="no")
+
+ if test "$enableval" = "yes"; then
+ AC_MSG_RESULT(Will compile with 64bit support)
+ do64bit=yes
+ else
+ do64bit=no
+ fi
+ AC_MSG_RESULT($do64bit)
+
+ # Step 1: set the variable "system" to hold the name and version number
+ # for the system. This can usually be done via the "uname" command, but
+ # there are a few systems, like Next, where this doesn't work.
+
+ AC_MSG_CHECKING([system version (for dynamic loading)])
+ if test -f /usr/lib/NextStep/software_version; then
+ system=NEXTSTEP-`awk '/3/,/3/' /usr/lib/NextStep/software_version`
+ else
+ system=`uname -s`-`uname -r`
+ if test "$?" -ne 0 ; then
+ AC_MSG_RESULT([unknown (can't find uname command)])
+ system=unknown
+ else
+ # Special check for weird MP-RAS system (uname returns weird
+ # results, and the version is kept in special file).
+
+ if test -r /etc/.relid -a "X`uname -n`" = "X`uname -s`" ; then
+ system=MP-RAS-`awk '{print $3}' /etc/.relid'`
+ fi
+ if test "`uname -s`" = "AIX" ; then
+ system=AIX-`uname -v`.`uname -r`
+ fi
+ AC_MSG_RESULT($system)
+ fi
+ fi
+
+ # Step 2: check for existence of -ldl library. This is needed because
+ # Linux can use either -ldl or -ldld for dynamic loading.
+
+ AC_CHECK_LIB(dl, dlopen, have_dl=yes, have_dl=no)
+
+ # Step 3: set configuration options based on system name and version.
+
+ do64bit_ok=no
+ fullSrcDir=`cd $srcdir; pwd`
+ EXTRA_CFLAGS=""
+ TCL_EXPORT_FILE_SUFFIX=""
+ UNSHARED_LIB_SUFFIX=""
+ TCL_TRIM_DOTS='`echo ${VERSION} | tr -d .`'
+ ECHO_VERSION='`echo ${VERSION}`'
+ TCL_LIB_VERSIONS_OK=ok
+ CFLAGS_DEBUG=-g
+ CFLAGS_OPTIMIZE=-O
+ TCL_NEEDS_EXP_FILE=0
+ TCL_BUILD_EXP_FILE=""
+ TCL_EXP_FILE=""
+ STLIB_LD="ar cr"
+ case $system in
+ AIX-4.[[2-9]])
+ SHLIB_CFLAGS=""
+ SHLIB_LD="$fullSrcDir/ldAix /bin/ld -bhalt:4 -bM:SRE -bE:lib.exp -H512 -T512 -bnoentry"
+ SHLIB_LD_LIBS='${LIBS}'
+ SHLIB_SUFFIX=".so"
+ DL_OBJS="tclLoadDl.o"
+ DL_LIBS="-ldl"
+ LDFLAGS=""
+ LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}'
+ TCL_NEEDS_EXP_FILE=1
+ TCL_EXPORT_FILE_SUFFIX='${VERSION}\$\{DBGX\}.exp'
+ ;;
+ AIX-*)
+ SHLIB_CFLAGS=""
+ SHLIB_LD="$fullSrcDir/ldAix /bin/ld -bhalt:4 -bM:SRE -bE:lib.exp -H512 -T512"
+ SHLIB_LD_LIBS='${LIBS}'
+ SHLIB_SUFFIX=".so"
+ DL_OBJS="tclLoadDl.o"
+ LIBOBJS="$LIBOBJS tclLoadAix.o"
+ DL_LIBS="-lld"
+ LDFLAGS=""
+ LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}'
+ TCL_NEEDS_EXP_FILE=1
+ TCL_EXPORT_FILE_SUFFIX='${VERSION}\$\{DBGX\}.exp'
+ ;;
+ BSD/OS-2.1*|BSD/OS-3*)
+ SHLIB_CFLAGS=""
+ SHLIB_LD="shlicc -r"
+ SHLIB_LD_LIBS='${LIBS}'
+ SHLIB_SUFFIX=".so"
+ DL_OBJS="tclLoadDl.o"
+ DL_LIBS="-ldl"
+ LDFLAGS=""
+ LD_SEARCH_FLAGS=""
+ ;;
+ BSD/OS-4.*)
+ SHLIB_CFLAGS="-export-dynamic -fPIC"
+ SHLIB_LD="cc -shared"
+ SHLIB_LD_LIBS='${LIBS}'
+ SHLIB_SUFFIX=".so"
+ DL_OBJS="tclLoadDl.o"
+ DL_LIBS="-ldl"
+ LDFLAGS="-export-dynamic"
+ LD_SEARCH_FLAGS=""
+ ;;
+ *win32*|*WIN32*|CYGWIN_NT*|cygwin_nt*|*CYGWIN_98*|*CYGWIN_95*)
+ CFLAGS_DEBUG="-nologo -Z7 -Od -WX ${runtime}d"
+ CFLAGS_OPTIMIZE="-nologo -Oti -Gs -GD ${runtime}"
+ LDFLAGS_CONSOLE="-subsystem:console"
+ LDFLAGS_WINDOW="-subsystem:windows"
+ LDFLAGS_DEBUG="-debug:full -debugtype:cv"
+ LDFLAGS_OPTIMIZE="-release"
+ EXTRA_CFLAGS="-YX"
+ PATHTYPE=-w
+ STLIB_LD="lib -nologo"
+ SHLIB_LD="link -dll -nologo"
+ SHLIB_LD_LIBS="user32.lib advapi32.lib"
+ RC="rc"
+ ;;
+ dgux*)
+ SHLIB_CFLAGS="-K PIC"
+ SHLIB_LD="cc -G"
+ SHLIB_LD_LIBS=""
+ SHLIB_SUFFIX=".so"
+ DL_OBJS="tclLoadDl.o"
+ DL_LIBS="-ldl"
+ LDFLAGS=""
+ LD_SEARCH_FLAGS=""
+ ;;
+ HP-UX-*.08.*|HP-UX-*.09.*|HP-UX-*.10.*|HP-UX-*.11.*)
+ SHLIB_SUFFIX=".sl"
+ AC_CHECK_LIB(dld, shl_load, tcl_ok=yes, tcl_ok=no)
+ if test "$tcl_ok" = yes; then
+ SHLIB_CFLAGS="+z"
+ SHLIB_LD="ld -b"
+ SHLIB_LD_LIBS=""
+ DL_OBJS="tclLoadShl.o"
+ DL_LIBS="-ldld"
+ LDFLAGS="-Wl,-E"
+ LD_SEARCH_FLAGS='-Wl,+s,+b,${LIB_RUNTIME_DIR}:.'
+ fi
+ ;;
+ IRIX-4.*)
+ SHLIB_CFLAGS="-G 0"
+ SHLIB_SUFFIX=".a"
+ SHLIB_LD="echo tclLdAout $CC \{$SHLIB_CFLAGS\} | `pwd`/tclsh -r -G 0"
+ SHLIB_LD_LIBS='${LIBS}'
+ DL_OBJS="tclLoadAout.o"
+ DL_LIBS=""
+ LDFLAGS="-Wl,-D,08000000"
+ LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}'
+ SHARED_LIB_SUFFIX='${VERSION}\$\{DBGX\}.a'
+ ;;
+ IRIX-5.*|IRIX-6.*|IRIX64-6.5*)
+ SHLIB_CFLAGS=""
+ SHLIB_LD="ld -n32 -shared -rdata_shared"
+ SHLIB_LD_LIBS=""
+ SHLIB_SUFFIX=".so"
+ DL_OBJS="tclLoadDl.o"
+ DL_LIBS=""
+ LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
+ if test "$CC" = "gcc" -o `$CC -v 2>&1 | grep -c gcc` != "0" ; then
+ EXTRA_CFLAGS="-mabi=n32"
+ LDFLAGS="-mabi=n32"
+ else
+ case $system in
+ IRIX-6.3)
+ # Use to build 6.2 compatible binaries on 6.3.
+ EXTRA_CFLAGS="-n32 -D_OLD_TERMIOS"
+ ;;
+ *)
+ EXTRA_CFLAGS="-n32"
+ ;;
+ esac
+ LDFLAGS="-n32"
+ fi
+ ;;
+ IRIX64-6.*)
+ SHLIB_CFLAGS=""
+ SHLIB_LD="ld -32 -shared -rdata_shared"
+ SHLIB_LD_LIBS='${LIBS}'
+ SHLIB_SUFFIX=".so"
+ DL_OBJS="tclLoadDl.o"
+ DL_LIBS=""
+ LDFLAGS=""
+ LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
+ ;;
+ Linux*)
+ SHLIB_CFLAGS="-fPIC"
+ SHLIB_LD_LIBS='${LIBS}'
+ SHLIB_SUFFIX=".so"
+
+ # egcs-2.91.66 on Redhat Linux 6.0 generates lots of warnings
+ # when you inline the string and math operations. Turn this off to
+ # get rid of the warnings.
+
+ CFLAGS_OPTIMIZE="${CFLAGS_OPTIMIZE} -D__NO_STRING_INLINES -D__NO_MATH_INLINES"
+
+ if test "$have_dl" = yes; then
+ SHLIB_LD="${CC} -shared"
+ DL_OBJS="tclLoadDl.o"
+ DL_LIBS="-ldl"
+ LDFLAGS="-rdynamic"
+ LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
+ else
+ AC_CHECK_HEADER(dld.h, [
+ SHLIB_LD="ld -shared"
+ DL_OBJS="tclLoadDld.o"
+ DL_LIBS="-ldld"
+ LDFLAGS=""
+ LD_SEARCH_FLAGS=""])
+ fi
+ if test "`uname -m`" = "alpha" ; then
+ EXTRA_CFLAGS="-mieee"
+ fi
+ ;;
+ MP-RAS-02*)
+ SHLIB_CFLAGS="-K PIC"
+ SHLIB_LD="cc -G"
+ SHLIB_LD_LIBS=""
+ SHLIB_SUFFIX=".so"
+ DL_OBJS="tclLoadDl.o"
+ DL_LIBS="-ldl"
+ LDFLAGS=""
+ LD_SEARCH_FLAGS=""
+ ;;
+ MP-RAS-*)
+ SHLIB_CFLAGS="-K PIC"
+ SHLIB_LD="cc -G"
+ SHLIB_LD_LIBS=""
+ SHLIB_SUFFIX=".so"
+ DL_OBJS="tclLoadDl.o"
+ DL_LIBS="-ldl"
+ LDFLAGS="-Wl,-Bexport"
+ LD_SEARCH_FLAGS=""
+ ;;
+ NetBSD-*|FreeBSD-[[12]].*|OpenBSD-*)
+ # Not available on all versions: check for include file.
+ AC_CHECK_HEADER(dlfcn.h, [
+ SHLIB_CFLAGS="-fpic"
+ SHLIB_LD="ld -Bshareable -x"
+ SHLIB_LD_LIBS=""
+ SHLIB_SUFFIX=".so"
+ DL_OBJS="tclLoadDl.o"
+ DL_LIBS=""
+ LDFLAGS=""
+ LD_SEARCH_FLAGS=""
+ SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.so.1.0'
+ ], [
+ SHLIB_CFLAGS=""
+ SHLIB_LD="echo tclLdAout $CC \{$SHLIB_CFLAGS\} | `pwd`/tclsh -r"
+ SHLIB_LD_LIBS='${LIBS}'
+ SHLIB_SUFFIX=".a"
+ DL_OBJS="tclLoadAout.o"
+ DL_LIBS=""
+ LDFLAGS=""
+ LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}'
+ SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.a'
+ ])
+
+ # FreeBSD doesn't handle version numbers with dots.
+
+ UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.a'
+ TCL_LIB_VERSIONS_OK=nodots
+ ;;
+ FreeBSD-*)
+ # FreeBSD 3.* and greater have ELF.
+ SHLIB_CFLAGS="-fpic"
+ SHLIB_LD="ld -Bshareable -x"
+ SHLIB_LD_LIBS=""
+ SHLIB_SUFFIX=".so"
+ DL_OBJS="tclLoadDl.o"
+ DL_LIBS=""
+ LDFLAGS=""
+ LD_SEARCH_FLAGS=""
+ ;;
+ NEXTSTEP-*)
+ SHLIB_CFLAGS=""
+ SHLIB_LD="cc -nostdlib -r"
+ SHLIB_LD_LIBS=""
+ SHLIB_SUFFIX=".so"
+ DL_OBJS="tclLoadNext.o"
+ DL_LIBS=""
+ LDFLAGS=""
+ LD_SEARCH_FLAGS=""
+ ;;
+ OS/390-*)
+ CFLAGS_OPTIMIZE="" # Optimizer is buggy
+ AC_DEFINE(_OE_SOCKETS) # needed in sys/socket.h
+ ;;
+ OSF1-1.0|OSF1-1.1|OSF1-1.2)
+ # OSF/1 1.[012] from OSF, and derivatives, including Paragon OSF/1
+ SHLIB_CFLAGS=""
+ # Hack: make package name same as library name
+ SHLIB_LD='ld -R -export $@:'
+ SHLIB_LD_LIBS=""
+ SHLIB_SUFFIX=".so"
+ DL_OBJS="tclLoadOSF.o"
+ DL_LIBS=""
+ LDFLAGS=""
+ LD_SEARCH_FLAGS=""
+ ;;
+ OSF1-1.*)
+ # OSF/1 1.3 from OSF using ELF, and derivatives, including AD2
+ SHLIB_CFLAGS="-fpic"
+ SHLIB_LD="ld -shared"
+ SHLIB_LD_LIBS=""
+ SHLIB_SUFFIX=".so"
+ DL_OBJS="tclLoadDl.o"
+ DL_LIBS=""
+ LDFLAGS=""
+ LD_SEARCH_FLAGS=""
+ ;;
+ OSF1-V*)
+ # Digital OSF/1
+ SHLIB_CFLAGS=""
+ SHLIB_LD='ld -shared -expect_unresolved "*"'
+ SHLIB_LD_LIBS=""
+ SHLIB_SUFFIX=".so"
+ DL_OBJS="tclLoadDl.o"
+ DL_LIBS=""
+ LDFLAGS=""
+ LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
+ ;;
+ RISCos-*)
+ SHLIB_CFLAGS="-G 0"
+ SHLIB_LD="echo tclLdAout $CC \{$SHLIB_CFLAGS\} | `pwd`/tclsh -r -G 0"
+ SHLIB_LD_LIBS='${LIBS}'
+ SHLIB_SUFFIX=".a"
+ DL_OBJS="tclLoadAout.o"
+ DL_LIBS=""
+ LDFLAGS="-Wl,-D,08000000"
+ LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}'
+ ;;
+ SCO_SV-3.2*)
+ # Note, dlopen is available only on SCO 3.2.5 and greater. However,
+ # this test works, since "uname -s" was non-standard in 3.2.4 and
+ # below.
+ SHLIB_CFLAGS="-Kpic -belf"
+ SHLIB_LD="ld -G"
+ SHLIB_LD_LIBS=""
+ SHLIB_SUFFIX=".so"
+ DL_OBJS="tclLoadDl.o"
+ DL_LIBS=""
+ LDFLAGS="-belf -Wl,-Bexport"
+ LD_SEARCH_FLAGS=""
+ ;;
+ SINIX*5.4*)
+ SHLIB_CFLAGS="-K PIC"
+ SHLIB_LD="cc -G"
+ SHLIB_LD_LIBS=""
+ SHLIB_SUFFIX=".so"
+ DL_OBJS="tclLoadDl.o"
+ DL_LIBS="-ldl"
+ LDFLAGS=""
+ LD_SEARCH_FLAGS=""
+ ;;
+ SunOS-4*)
+ SHLIB_CFLAGS="-PIC"
+ SHLIB_LD="ld"
+ SHLIB_LD_LIBS=""
+ SHLIB_SUFFIX=".so"
+ DL_OBJS="tclLoadDl.o"
+ DL_LIBS="-ldl"
+ LDFLAGS=""
+ LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}'
+
+ # SunOS can't handle version numbers with dots in them in library
+ # specs, like -ltcl7.5, so use -ltcl75 instead. Also, it
+ # requires an extra version number at the end of .so file names.
+ # So, the library has to have a name like libtcl75.so.1.0
+
+ SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.so.1.0'
+ UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.a'
+ TCL_LIB_VERSIONS_OK=nodots
+ ;;
+ SunOS-5.[[0-6]]*)
+ SHLIB_CFLAGS="-KPIC"
+ SHLIB_LD="/usr/ccs/bin/ld -G -z text"
+
+ # Note: need the LIBS below, otherwise Tk won't find Tcl's
+ # symbols when dynamically loaded into tclsh.
+
+ SHLIB_LD_LIBS='${LIBS}'
+ SHLIB_SUFFIX=".so"
+ DL_OBJS="tclLoadDl.o"
+ DL_LIBS="-ldl"
+ LDFLAGS=""
+ LD_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}'
+ ;;
+ SunOS-5*)
+ SHLIB_CFLAGS="-KPIC"
+ SHLIB_LD="/usr/ccs/bin/ld -G -z text"
+ LDFLAGS=""
+
+ do64bit_ok=no
+ if test "$do64bit" = "yes" ; then
+ arch=`isainfo`
+ if test "$arch" = "sparcv9 sparc" ; then
+ if test "$CC" != "gcc" -a `$CC -v 2>&1 | grep -c gcc` = "0" ; then
+ do64bit_ok=yes
+ EXTRA_CFLAGS="-xarch=v9"
+ LDFLAGS="-xarch=v9"
+ else
+ AC_MSG_WARN("64bit mode not supported using GCC on $system")
+ fi
+ else
+ AC_MSG_WARN("64bit mode only supported sparcv9 system")
+ fi
+ fi
+
+ # Note: need the LIBS below, otherwise Tk won't find Tcl's
+ # symbols when dynamically loaded into tclsh.
+
+ SHLIB_LD_LIBS='${LIBS}'
+ SHLIB_SUFFIX=".so"
+ DL_OBJS="tclLoadDl.o"
+ DL_LIBS="-ldl"
+ if test "$CC" = "gcc" -o `$CC -v 2>&1 | grep -c gcc` != "0" ; then
+ LD_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}'
+ else
+ LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}'
+ fi
+ ;;
+ ULTRIX-4.*)
+ SHLIB_CFLAGS="-G 0"
+ SHLIB_SUFFIX=".a"
+ SHLIB_LD="echo tclLdAout $CC \{$SHLIB_CFLAGS\} | `pwd`/tclsh -r -G 0"
+ SHLIB_LD_LIBS='${LIBS}'
+ DL_OBJS="tclLoadAout.o"
+ DL_LIBS=""
+ LDFLAGS="-Wl,-D,08000000"
+ LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}'
+ ;;
+ UNIX_SV* | UnixWare-5*)
+ SHLIB_CFLAGS="-KPIC"
+ SHLIB_LD="cc -G"
+ SHLIB_LD_LIBS=""
+ SHLIB_SUFFIX=".so"
+ DL_OBJS="tclLoadDl.o"
+ DL_LIBS="-ldl"
+ # Some UNIX_SV* systems (unixware 1.1.2 for example) have linkers
+ # that don't grok the -Bexport option. Test that it does.
+ hold_ldflags=$LDFLAGS
+ AC_MSG_CHECKING(for ld accepts -Bexport flag)
+ LDFLAGS="${LDFLAGS} -Wl,-Bexport"
+ AC_TRY_LINK(, [int i;], found=yes, found=no)
+ LDFLAGS=$hold_ldflags
+ AC_MSG_RESULT($found)
+ if test $found = yes; then
+ LDFLAGS="-Wl,-Bexport"
+ else
+ LDFLAGS=""
+ fi
+ LD_SEARCH_FLAGS=""
+ ;;
+ esac
+
+ if test "$do64bit" = "yes" -a "$do64bit_ok" = "no" ; then
+ AC_MSG_WARN("64bit support being disabled -- not supported on this platform")
+ fi
+
+ # Step 4: If pseudo-static linking is in use (see K. B. Kenny, "Dynamic
+ # Loading for Tcl -- What Became of It?". Proc. 2nd Tcl/Tk Workshop,
+ # New Orleans, LA, Computerized Processes Unlimited, 1994), then we need
+ # to determine which of several header files defines the a.out file
+ # format (a.out.h, sys/exec.h, or sys/exec_aout.h). At present, we
+ # support only a file format that is more or less version-7-compatible.
+ # In particular,
+ # - a.out files must begin with `struct exec'.
+ # - the N_TXTOFF on the `struct exec' must compute the seek address
+ # of the text segment
+ # - The `struct exec' must contain a_magic, a_text, a_data, a_bss
+ # and a_entry fields.
+ # The following compilation should succeed if and only if either sys/exec.h
+ # or a.out.h is usable for the purpose.
+ #
+ # Note that the modified COFF format used on MIPS Ultrix 4.x is usable; the
+ # `struct exec' includes a second header that contains information that
+ # duplicates the v7 fields that are needed.
+
+ if test "x$DL_OBJS" = "xtclLoadAout.o" ; then
+ AC_MSG_CHECKING(sys/exec.h)
+ AC_TRY_COMPILE([#include <sys/exec.h>],[
+ struct exec foo;
+ unsigned long seek;
+ int flag;
+#if defined(__mips) || defined(mips)
+ seek = N_TXTOFF (foo.ex_f, foo.ex_o);
+#else
+ seek = N_TXTOFF (foo);
+#endif
+ flag = (foo.a_magic == OMAGIC);
+ return foo.a_text + foo.a_data + foo.a_bss + foo.a_entry;
+ ], tcl_ok=usable, tcl_ok=unusable)
+ AC_MSG_RESULT($tcl_ok)
+ if test $tcl_ok = usable; then
+ AC_DEFINE(USE_SYS_EXEC_H)
+ else
+ AC_MSG_CHECKING(a.out.h)
+ AC_TRY_COMPILE([#include <a.out.h>],[
+ struct exec foo;
+ unsigned long seek;
+ int flag;
+#if defined(__mips) || defined(mips)
+ seek = N_TXTOFF (foo.ex_f, foo.ex_o);
+#else
+ seek = N_TXTOFF (foo);
+#endif
+ flag = (foo.a_magic == OMAGIC);
+ return foo.a_text + foo.a_data + foo.a_bss + foo.a_entry;
+ ], tcl_ok=usable, tcl_ok=unusable)
+ AC_MSG_RESULT($tcl_ok)
+ if test $tcl_ok = usable; then
+ AC_DEFINE(USE_A_OUT_H)
+ else
+ AC_MSG_CHECKING(sys/exec_aout.h)
+ AC_TRY_COMPILE([#include <sys/exec_aout.h>],[
+ struct exec foo;
+ unsigned long seek;
+ int flag;
+#if defined(__mips) || defined(mips)
+ seek = N_TXTOFF (foo.ex_f, foo.ex_o);
+#else
+ seek = N_TXTOFF (foo);
+#endif
+ flag = (foo.a_midmag == OMAGIC);
+ return foo.a_text + foo.a_data + foo.a_bss + foo.a_entry;
+ ], tcl_ok=usable, tcl_ok=unusable)
+ AC_MSG_RESULT($tcl_ok)
+ if test $tcl_ok = usable; then
+ AC_DEFINE(USE_SYS_EXEC_AOUT_H)
+ else
+ DL_OBJS=""
+ fi
+ fi
+ fi
+ fi
+
+ # Step 5: disable dynamic loading if requested via a command-line switch.
+
+ AC_ARG_ENABLE(load, [ --disable-load disallow dynamic loading and "load" command],
+ [tcl_ok=$enableval], [tcl_ok=yes])
+ if test "$tcl_ok" = "no"; then
+ DL_OBJS=""
+ fi
+
+ if test "x$DL_OBJS" != "x" ; then
+ BUILD_DLTEST="\$(DLTEST_TARGETS)"
+ else
+ echo "Can't figure out how to do dynamic loading or shared libraries"
+ echo "on this system."
+ SHLIB_CFLAGS=""
+ SHLIB_LD=""
+ SHLIB_SUFFIX=""
+ DL_OBJS="tclLoadNone.o"
+ DL_LIBS=""
+ LDFLAGS=""
+ LD_SEARCH_FLAGS=""
+ BUILD_DLTEST=""
+ fi
+
+ # If we're running gcc, then change the C flags for compiling shared
+ # libraries to the right flags for gcc, instead of those for the
+ # standard manufacturer compiler.
+
+ if test "$DL_OBJS" != "tclLoadNone.o" ; then
+ if test "$CC" = "gcc" -o `$CC -v 2>&1 | grep -c gcc` != "0" ; then
+ case $system in
+ AIX-*)
+ ;;
+ BSD/OS*)
+ ;;
+ IRIX*)
+ ;;
+ NetBSD-*|FreeBSD-*|OpenBSD-*)
+ ;;
+ RISCos-*)
+ ;;
+ ULTRIX-4.*)
+ ;;
+ *)
+ SHLIB_CFLAGS="-fPIC"
+ ;;
+ esac
+ fi
+ fi
+
+ if test "$SHARED_LIB_SUFFIX" = "" ; then
+ SHARED_LIB_SUFFIX='${VERSION}\$\{DBGX\}${SHLIB_SUFFIX}'
+ fi
+ if test "$UNSHARED_LIB_SUFFIX" = "" ; then
+ UNSHARED_LIB_SUFFIX='${VERSION}\$\{DBGX\}.a'
+ fi
+
+ AC_SUBST(STLIB_LD)
+ AC_SUBST(SHLIB_LD)
+ AC_SUBST(SHLIB_CFLAGS)
+ AC_SUBST(SHLIB_LDFLAGS)
+ AC_SUBST(DL_LIBS)
+ AC_SUBST(CFLAGS_DEBUG)
+ AC_SUBST(CFLAGS_OPTIMIZE)
+ AC_SUBST(LDFLAGS_DEBUG)
+ AC_SUBST(LDFLAGS_OPTIMIZE)
+])
+
+#--------------------------------------------------------------------
+# SC_SERIAL_PORT
+#
+# Determine which interface to use to talk to the serial port.
+# Note that #include lines must begin in leftmost column for
+# some compilers to recognize them as preprocessor directives.
+#
+# Arguments:
+# none
+#
+# Results:
+#
+# Defines only one of the following vars:
+# USE_TERMIOS
+# USE_TERMIO
+# USE_SGTTY
+#
+#--------------------------------------------------------------------
+
+AC_DEFUN(SC_SERIAL_PORT, [
+ AC_MSG_CHECKING([termios vs. termio vs. sgtty])
+
+ AC_TRY_RUN([
+#include <termios.h>
+
+main()
+{
+ struct termios t;
+ if (tcgetattr(0, &t) == 0) {
+ cfsetospeed(&t, 0);
+ t.c_cflag |= PARENB | PARODD | CSIZE | CSTOPB;
+ return 0;
+ }
+ return 1;
+}], tk_ok=termios, tk_ok=no, tk_ok=no)
+
+ if test $tk_ok = termios; then
+ AC_DEFINE(USE_TERMIOS)
+ else
+ AC_TRY_RUN([
+#include <termio.h>
+
+main()
+{
+ struct termio t;
+ if (ioctl(0, TCGETA, &t) == 0) {
+ t.c_cflag |= CBAUD | PARENB | PARODD | CSIZE | CSTOPB;
+ return 0;
+ }
+ return 1;
+ }], tk_ok=termio, tk_ok=no, tk_ok=no)
+
+ if test $tk_ok = termio; then
+ AC_DEFINE(USE_TERMIO)
+ else
+ AC_TRY_RUN([
+#include <sgtty.h>
+
+main()
+{
+ struct sgttyb t;
+ if (ioctl(0, TIOCGETP, &t) == 0) {
+ t.sg_ospeed = 0;
+ t.sg_flags |= ODDP | EVENP | RAW;
+ return 0;
+ }
+ return 1;
+}], tk_ok=sgtty, tk_ok=none, tk_ok=none)
+ if test $tk_ok = sgtty; then
+ AC_DEFINE(USE_SGTTY)
+ fi
+ fi
+ fi
+ AC_MSG_RESULT($tk_ok)
+])
+
+#--------------------------------------------------------------------
+# SC_MISSING_POSIX_HEADERS
+#
+# Supply substitutes for missing POSIX header files. Special
+# notes:
+# - stdlib.h doesn't define strtol, strtoul, or
+# strtod insome versions of SunOS
+# - some versions of string.h don't declare procedures such
+# as strstr
+#
+# Arguments:
+# none
+#
+# Results:
+#
+# Defines some of the following vars:
+# NO_DIRENT_H
+# NO_ERRNO_H
+# NO_VALUES_H
+# NO_LIMITS_H
+# NO_STDLIB_H
+# NO_STRING_H
+# NO_SYS_WAIT_H
+# NO_DLFCN_H
+# HAVE_UNISTD_H
+# HAVE_SYS_PARAM_H
+#
+# HAVE_STRING_H ?
+#
+#--------------------------------------------------------------------
+
+AC_DEFUN(SC_MISSING_POSIX_HEADERS, [
+
+ AC_MSG_CHECKING(dirent.h)
+ AC_TRY_LINK([#include <sys/types.h>
+#include <dirent.h>], [
+#ifndef _POSIX_SOURCE
+# ifdef __Lynx__
+ /*
+ * Generate compilation error to make the test fail: Lynx headers
+ * are only valid if really in the POSIX environment.
+ */
+
+ missing_procedure();
+# endif
+#endif
+DIR *d;
+struct dirent *entryPtr;
+char *p;
+d = opendir("foobar");
+entryPtr = readdir(d);
+p = entryPtr->d_name;
+closedir(d);
+], tcl_ok=yes, tcl_ok=no)
+
+ if test $tcl_ok = no; then
+ AC_DEFINE(NO_DIRENT_H)
+ fi
+
+ AC_MSG_RESULT($tcl_ok)
+ AC_CHECK_HEADER(errno.h, , AC_DEFINE(NO_ERRNO_H))
+ AC_CHECK_HEADER(float.h, , AC_DEFINE(NO_FLOAT_H))
+ AC_CHECK_HEADER(values.h, , AC_DEFINE(NO_VALUES_H))
+ AC_CHECK_HEADER(limits.h, , AC_DEFINE(NO_LIMITS_H))
+ AC_CHECK_HEADER(stdlib.h, tcl_ok=1, tcl_ok=0)
+ AC_EGREP_HEADER(strtol, stdlib.h, , tcl_ok=0)
+ AC_EGREP_HEADER(strtoul, stdlib.h, , tcl_ok=0)
+ AC_EGREP_HEADER(strtod, stdlib.h, , tcl_ok=0)
+ if test $tcl_ok = 0; then
+ AC_DEFINE(NO_STDLIB_H)
+ fi
+ AC_CHECK_HEADER(string.h, tcl_ok=1, tcl_ok=0)
+ AC_EGREP_HEADER(strstr, string.h, , tcl_ok=0)
+ AC_EGREP_HEADER(strerror, string.h, , tcl_ok=0)
+
+ # See also memmove check below for a place where NO_STRING_H can be
+ # set and why.
+
+ if test $tcl_ok = 0; then
+ AC_DEFINE(NO_STRING_H)
+ fi
+
+ AC_CHECK_HEADER(sys/wait.h, , AC_DEFINE(NO_SYS_WAIT_H))
+ AC_CHECK_HEADER(dlfcn.h, , AC_DEFINE(NO_DLFCN_H))
+
+ # OS/390 lacks sys/param.h (and doesn't need it, by chance).
+
+ AC_HAVE_HEADERS(unistd.h sys/param.h)
+
+])
+
+#--------------------------------------------------------------------
+# SC_PATH_X
+#
+# Locate the X11 header files and the X11 library archive. Try
+# the ac_path_x macro first, but if it doesn't find the X stuff
+# (e.g. because there's no xmkmf program) then check through
+# a list of possible directories. Under some conditions the
+# autoconf macro will return an include directory that contains
+# no include files, so double-check its result just to be safe.
+#
+# Arguments:
+# none
+#
+# Results:
+#
+# Sets the the following vars:
+# XINCLUDES
+# XLIBSW
+#
+#--------------------------------------------------------------------
+
+AC_DEFUN(SC_PATH_X, [
+ AC_PATH_X
+ not_really_there=""
+ if test "$no_x" = ""; then
+ if test "$x_includes" = ""; then
+ AC_TRY_CPP([#include <X11/XIntrinsic.h>], , not_really_there="yes")
+ else
+ if test ! -r $x_includes/X11/Intrinsic.h; then
+ not_really_there="yes"
+ fi
+ fi
+ fi
+ if test "$no_x" = "yes" -o "$not_really_there" = "yes"; then
+ AC_MSG_CHECKING(for X11 header files)
+ XINCLUDES="# no special path needed"
+ AC_TRY_CPP([#include <X11/Intrinsic.h>], , XINCLUDES="nope")
+ if test "$XINCLUDES" = nope; then
+ dirs="/usr/unsupported/include /usr/local/include /usr/X386/include /usr/X11R6/include /usr/X11R5/include /usr/include/X11R5 /usr/include/X11R4 /usr/openwin/include /usr/X11/include /usr/sww/include"
+ for i in $dirs ; do
+ if test -r $i/X11/Intrinsic.h; then
+ AC_MSG_RESULT($i)
+ XINCLUDES=" -I$i"
+ break
+ fi
+ done
+ fi
+ else
+ if test "$x_includes" != ""; then
+ XINCLUDES=-I$x_includes
+ else
+ XINCLUDES="# no special path needed"
+ fi
+ fi
+ if test "$XINCLUDES" = nope; then
+ AC_MSG_RESULT(couldn't find any!)
+ XINCLUDES="# no include files found"
+ fi
+
+ if test "$no_x" = yes; then
+ AC_MSG_CHECKING(for X11 libraries)
+ XLIBSW=nope
+ dirs="/usr/unsupported/lib /usr/local/lib /usr/X386/lib /usr/X11R6/lib /usr/X11R5/lib /usr/lib/X11R5 /usr/lib/X11R4 /usr/openwin/lib /usr/X11/lib /usr/sww/X11/lib"
+ for i in $dirs ; do
+ if test -r $i/libX11.a -o -r $i/libX11.so -o -r $i/libX11.sl; then
+ AC_MSG_RESULT($i)
+ XLIBSW="-L$i -lX11"
+ x_libraries="$i"
+ break
+ fi
+ done
+ else
+ if test "$x_libraries" = ""; then
+ XLIBSW=-lX11
+ else
+ XLIBSW="-L$x_libraries -lX11"
+ fi
+ fi
+ if test "$XLIBSW" = nope ; then
+ AC_CHECK_LIB(Xwindow, XCreateWindow, XLIBSW=-lXwindow)
+ fi
+ if test "$XLIBSW" = nope ; then
+ AC_MSG_RESULT(couldn't find any! Using -lX11.)
+ XLIBSW=-lX11
+ fi
+])
+#--------------------------------------------------------------------
+# SC_BLOCKING_STYLE
+#
+# The statements below check for systems where POSIX-style
+# non-blocking I/O (O_NONBLOCK) doesn't work or is unimplemented.
+# On these systems (mostly older ones), use the old BSD-style
+# FIONBIO approach instead.
+#
+# Arguments:
+# none
+#
+# Results:
+#
+# Defines some of the following vars:
+# HAVE_SYS_IOCTL_H
+# HAVE_SYS_FILIO_H
+# USE_FIONBIO
+# O_NONBLOCK
+#
+#--------------------------------------------------------------------
+
+AC_DEFUN(SC_BLOCKING_STYLE, [
+ AC_CHECK_HEADERS(sys/ioctl.h)
+ AC_CHECK_HEADERS(sys/filio.h)
+ AC_MSG_CHECKING([FIONBIO vs. O_NONBLOCK for nonblocking I/O])
+ if test -f /usr/lib/NextStep/software_version; then
+ system=NEXTSTEP-`awk '/3/,/3/' /usr/lib/NextStep/software_version`
+ else
+ system=`uname -s`-`uname -r`
+ if test "$?" -ne 0 ; then
+ system=unknown
+ else
+ # Special check for weird MP-RAS system (uname returns weird
+ # results, and the version is kept in special file).
+
+ if test -r /etc/.relid -a "X`uname -n`" = "X`uname -s`" ; then
+ system=MP-RAS-`awk '{print $3}' /etc/.relid'`
+ fi
+ if test "`uname -s`" = "AIX" ; then
+ system=AIX-`uname -v`.`uname -r`
+ fi
+ fi
+ fi
+ case $system in
+ # There used to be code here to use FIONBIO under AIX. However, it
+ # was reported that FIONBIO doesn't work under AIX 3.2.5. Since
+ # using O_NONBLOCK seems fine under AIX 4.*, I removed the FIONBIO
+ # code (JO, 5/31/97).
+
+ OSF*)
+ AC_DEFINE(USE_FIONBIO)
+ AC_MSG_RESULT(FIONBIO)
+ ;;
+ SunOS-4*)
+ AC_DEFINE(USE_FIONBIO)
+ AC_MSG_RESULT(FIONBIO)
+ ;;
+ ULTRIX-4.*)
+ AC_DEFINE(USE_FIONBIO)
+ AC_MSG_RESULT(FIONBIO)
+ ;;
+ *)
+ AC_MSG_RESULT(O_NONBLOCK)
+ ;;
+ esac
+])
+
+#--------------------------------------------------------------------
+# SC_HAVE_VFORK
+#
+# Check to see whether the system provides a vfork kernel call.
+# If not, then use fork instead. Also, check for a problem with
+# vforks and signals that can cause core dumps if a vforked child
+# resets a signal handler. If the problem exists, then use fork
+# instead of vfork.
+#
+# Arguments:
+# none
+#
+# Results:
+#
+# Defines some of the following vars:
+# vfork (=fork)
+#
+#--------------------------------------------------------------------
+
+AC_DEFUN(SC_HAVE_VFORK, [
+ AC_TYPE_SIGNAL()
+ AC_CHECK_FUNC(vfork, tcl_ok=1, tcl_ok=0)
+ if test "$tcl_ok" = 1; then
+ AC_MSG_CHECKING([vfork/signal bug]);
+ AC_TRY_RUN([
+#include <stdio.h>
+#include <signal.h>
+#include <sys/wait.h>
+int gotSignal = 0;
+sigProc(sig)
+ int sig;
+{
+ gotSignal = 1;
+}
+main()
+{
+ int pid, sts;
+ (void) signal(SIGCHLD, sigProc);
+ pid = vfork();
+ if (pid < 0) {
+ exit(1);
+ } else if (pid == 0) {
+ (void) signal(SIGCHLD, SIG_DFL);
+ _exit(0);
+ } else {
+ (void) wait(&sts);
+ }
+ exit((gotSignal) ? 0 : 1);
+}], tcl_ok=1, tcl_ok=0, tcl_ok=0)
+
+ if test "$tcl_ok" = 1; then
+ AC_MSG_RESULT(ok)
+ else
+ AC_MSG_RESULT([buggy, using fork instead])
+ fi
+ fi
+ rm -f core
+ if test "$tcl_ok" = 0; then
+ AC_DEFINE(vfork, fork)
+ fi
+])
+
+#--------------------------------------------------------------------
+# SC_TIME_HANLDER
+#
+# Checks how the system deals with time.h, what time structures
+# are used on the system, and what fields the structures have.
+#
+# Arguments:
+# none
+#
+# Results:
+#
+# Defines some of the following vars:
+# USE_DELTA_FOR_TZ
+# HAVE_TM_GMTOFF
+# HAVE_TM_TZADJ
+# HAVE_TIMEZONE_VAR
+#
+#--------------------------------------------------------------------
+
+AC_DEFUN(SC_TIME_HANDLER, [
+ AC_CHECK_HEADERS(sys/time.h)
+ AC_HEADER_TIME
+ AC_STRUCT_TIMEZONE
+
+ AC_MSG_CHECKING([tm_tzadj in struct tm])
+ AC_TRY_COMPILE([#include <time.h>], [struct tm tm; tm.tm_tzadj;],
+ [AC_DEFINE(HAVE_TM_TZADJ)
+ AC_MSG_RESULT(yes)],
+ AC_MSG_RESULT(no))
+
+ AC_MSG_CHECKING([tm_gmtoff in struct tm])
+ AC_TRY_COMPILE([#include <time.h>], [struct tm tm; tm.tm_gmtoff;],
+ [AC_DEFINE(HAVE_TM_GMTOFF)
+ AC_MSG_RESULT(yes)],
+ AC_MSG_RESULT(no))
+
+ #
+ # Its important to include time.h in this check, as some systems
+ # (like convex) have timezone functions, etc.
+ #
+ have_timezone=no
+ AC_MSG_CHECKING([long timezone variable])
+ AC_TRY_COMPILE([#include <time.h>],
+ [extern long timezone;
+ timezone += 1;
+ exit (0);],
+ [have_timezone=yes
+ AC_DEFINE(HAVE_TIMEZONE_VAR)
+ AC_MSG_RESULT(yes)],
+ AC_MSG_RESULT(no))
+
+ #
+ # On some systems (eg IRIX 6.2), timezone is a time_t and not a long.
+ #
+ if test "$have_timezone" = no; then
+ AC_MSG_CHECKING([time_t timezone variable])
+ AC_TRY_COMPILE([#include <time.h>],
+ [extern time_t timezone;
+ timezone += 1;
+ exit (0);],
+ [AC_DEFINE(HAVE_TIMEZONE_VAR)
+ AC_MSG_RESULT(yes)],
+ AC_MSG_RESULT(no))
+ fi
+
+ #
+ # AIX does not have a timezone field in struct tm. When the AIX bsd
+ # library is used, the timezone global and the gettimeofday methods are
+ # to be avoided for timezone deduction instead, we deduce the timezone
+ # by comparing the localtime result on a known GMT value.
+ #
+
+ if test "`uname -s`" = "AIX" ; then
+ AC_CHECK_LIB(bsd, gettimeofday, libbsd=yes)
+ if test $libbsd = yes; then
+ AC_DEFINE(USE_DELTA_FOR_TZ)
+ fi
+ fi
+])
+
+#--------------------------------------------------------------------
+# SC_BUGGY_STRTOD
+#
+# Under Solaris 2.4, strtod returns the wrong value for the
+# terminating character under some conditions. Check for this
+# and if the problem exists use a substitute procedure
+# "fixstrtod" (provided by Tcl) that corrects the error.
+#
+# Arguments:
+# none
+#
+# Results:
+#
+# Might defines some of the following vars:
+# strtod (=fixstrtod)
+#
+#--------------------------------------------------------------------
+
+AC_DEFUN(SC_BUGGY_STRTOD, [
+ AC_CHECK_FUNC(strtod, tk_strtod=1, tk_strtod=0)
+ if test "$tk_strtod" = 1; then
+ AC_MSG_CHECKING([for Solaris 2.4 strtod bug])
+ AC_TRY_RUN([
+ extern double strtod();
+ int main()
+ {
+ char *string = "NaN";
+ char *term;
+ strtod(string, &term);
+ if ((term != string) && (term[-1] == 0)) {
+ exit(1);
+ }
+ exit(0);
+ }], tk_ok=1, tk_ok=0, tk_ok=0)
+ if test "$tk_ok" = 1; then
+ AC_MSG_RESULT(ok)
+ else
+ AC_MSG_RESULT(buggy)
+ AC_DEFINE(strtod, fixstrtod)
+ fi
+ fi
+])
+
+#--------------------------------------------------------------------
+# SC_TCL_LINK_LIBS
+#
+# Search for the libraries needed to link the Tcl shell.
+# Things like the math library (-lm) and socket stuff (-lsocket vs.
+# -lnsl) are dealt with here.
+#
+# Arguments:
+# Requires the following vars to be set in the Makefile:
+# DL_LIBS
+# LIBS
+# MATH_LIBS
+#
+# Results:
+#
+# Subst's the following var:
+# TCL_LIBS
+# MATH_LIBS
+#
+# Might append to the following vars:
+# LIBS
+#
+# Might define the following vars:
+# HAVE_NET_ERRNO_H
+#
+#--------------------------------------------------------------------
+
+AC_DEFUN(SC_TCL_LINK_LIBS, [
+ #--------------------------------------------------------------------
+ # On a few very rare systems, all of the libm.a stuff is
+ # already in libc.a. Set compiler flags accordingly.
+ # Also, Linux requires the "ieee" library for math to work
+ # right (and it must appear before "-lm").
+ #--------------------------------------------------------------------
+
+ AC_CHECK_FUNC(sin, MATH_LIBS="", MATH_LIBS="-lm")
+ AC_CHECK_LIB(ieee, main, [MATH_LIBS="-lieee $MATH_LIBS"])
+
+ #--------------------------------------------------------------------
+ # On AIX systems, libbsd.a has to be linked in to support
+ # non-blocking file IO. This library has to be linked in after
+ # the MATH_LIBS or it breaks the pow() function. The way to
+ # insure proper sequencing, is to add it to the tail of MATH_LIBS.
+ # This library also supplies gettimeofday.
+ #--------------------------------------------------------------------
+
+ libbsd=no
+ if test "`uname -s`" = "AIX" ; then
+ AC_CHECK_LIB(bsd, gettimeofday, libbsd=yes)
+ if test $libbsd = yes; then
+ MATH_LIBS="$MATH_LIBS -lbsd"
+ fi
+ fi
+
+
+ #--------------------------------------------------------------------
+ # Interactive UNIX requires -linet instead of -lsocket, plus it
+ # needs net/errno.h to define the socket-related error codes.
+ #--------------------------------------------------------------------
+
+ AC_CHECK_LIB(inet, main, [LIBS="$LIBS -linet"])
+ AC_CHECK_HEADER(net/errno.h, AC_DEFINE(HAVE_NET_ERRNO_H))
+
+ #--------------------------------------------------------------------
+ # Check for the existence of the -lsocket and -lnsl libraries.
+ # The order here is important, so that they end up in the right
+ # order in the command line generated by make. Here are some
+ # special considerations:
+ # 1. Use "connect" and "accept" to check for -lsocket, and
+ # "gethostbyname" to check for -lnsl.
+ # 2. Use each function name only once: can't redo a check because
+ # autoconf caches the results of the last check and won't redo it.
+ # 3. Use -lnsl and -lsocket only if they supply procedures that
+ # aren't already present in the normal libraries. This is because
+ # IRIX 5.2 has libraries, but they aren't needed and they're
+ # bogus: they goof up name resolution if used.
+ # 4. On some SVR4 systems, can't use -lsocket without -lnsl too.
+ # To get around this problem, check for both libraries together
+ # if -lsocket doesn't work by itself.
+ #--------------------------------------------------------------------
+
+ tcl_checkBoth=0
+ AC_CHECK_FUNC(connect, tcl_checkSocket=0, tcl_checkSocket=1)
+ if test "$tcl_checkSocket" = 1; then
+ AC_CHECK_LIB(socket, main, LIBS="$LIBS -lsocket", tcl_checkBoth=1)
+ fi
+ if test "$tcl_checkBoth" = 1; then
+ tk_oldLibs=$LIBS
+ LIBS="$LIBS -lsocket -lnsl"
+ AC_CHECK_FUNC(accept, tcl_checkNsl=0, [LIBS=$tk_oldLibs])
+ fi
+ AC_CHECK_FUNC(gethostbyname, , AC_CHECK_LIB(nsl, main,
+ [LIBS="$LIBS -lnsl"]))
+
+ # Don't perform the eval of the libraries here because DL_LIBS
+ # won't be set until we call SC_CONFIG_CFLAGS
+
+ TCL_LIBS='${DL_LIBS} ${LIBS} ${MATH_LIBS}'
+ AC_SUBST(TCL_LIBS)
+ AC_SUBST(MATH_LIBS)
+])
+
+#------------------------------------------------------------------------
+# SC_MAKE_LIB --
+#
+# Generate a line that can be used to build a shared/unshared library
+# in a platform independent manner.
+#
+# Arguments:
+# none
+#
+# Requires:
+#
+# Results:
+#
+# Defines the following vars:
+# MAKE_LIB Makefile rule for building a library
+# MAKE_SHARED_LIB Makefile rule for building a shared library
+# MAKE_UNSHARED_LIB Makefile rule for building a static
+# library
+#------------------------------------------------------------------------
+
+AC_DEFUN(SC_MAKE_LIB, [
+ case "`uname -s`" in
+ *win32* | *WIN32* | *CYGWIN_NT* |*CYGWIN_98*|*CYGWIN_95*)
+ if test "${CC-cc}" = "cl"; then
+ MAKE_STATIC_LIB="\${STLIB_LD} -out:\[$]@ \$(\[$]@_OBJECTS) "
+ MAKE_SHARED_LIB="\${SHLIB_LD} \${SHLIB_LDFLAGS} \${SHLIB_LD_LIBS} \$(LDFLAGS) -out:\[$]@ \$(\[$]@_OBJECTS) "
+ fi
+ ;;
+ *)
+ MAKE_STATIC_LIB="\${STLIB_LD} \[$]@ \$(\[$]@_OBJECTS)"
+ MAKE_SHARED_LIB="\${SHLIB_LD} -o \[$]@ \$(\[$]@_OBJECTS) \${SHLIB_LDFLAGS} \${SHLIB_LD_LIBS}"
+ ;;
+ esac
+
+ if test "${SHARED_BUILD}" = "1" ; then
+ MAKE_LIB=${MAKE_SHARED_LIB}
+ else
+ MAKE_LIB=${MAKE_STATIC_LIB}
+ fi
+
+ AC_SUBST(MAKE_LIB)
+ AC_SUBST(MAKE_SHARED_LIB)
+ AC_SUBST(MAKE_STATIC_LIB)
+])
+
+#------------------------------------------------------------------------
+# SC_LIB_SPEC --
+#
+# Compute the name of an existing object library located in libdir
+# from the given base name and produce the appropriate linker flags.
+#
+# Arguments:
+# basename The base name of the library without version
+# numbers, extensions, or "lib" prefixes.
+# extra_dir Extra directory in which to search for the
+# library. This location is used first, then
+# $prefix/$exec-prefix, then some defaults.
+#
+# Requires:
+# CYGPATH command used to generate native style paths
+#
+# Results:
+#
+# Defines the following vars:
+# ${basename}_LIB_NAME The computed library name.
+# ${basename}_LIB_SPEC The computed linker flags.
+#------------------------------------------------------------------------
+
+AC_DEFUN(SC_LIB_SPEC, [
+ AC_MSG_CHECKING(for $1 library)
+
+ # Look in exec-prefix and prefix for the library. If neither of
+ # these were specified, look in libdir. It doesn't matter if libdir
+ # wasn't specified since a search in the unspecified directory will
+ # fail (NONE/lib)
+
+ if test x"${exec_prefix}" != x"NONE" ; then
+ sc_lib_name_dir="${exec_prefix}/lib"
+ elif test x"${prefix}" != "NONE" ; then
+ sc_lib_name_dir="${prefix}/lib"
+ else
+ eval "sc_lib_name_dir=${libdir}"
+ fi
+
+ if test x"$2" != x ; then
+ sc_extra_lib_dir=$2
+ else
+ sc_extra_lib_dir=NONE
+ fi
+
+ for i in \
+ `ls -dr ${sc_extra_lib_dir}/$1[[0-9]]*.lib 2>/dev/null ` \
+ `ls -dr ${sc_extra_lib_dir}/lib$1[[0-9]]* 2>/dev/null ` \
+ `ls -dr ${sc_lib_name_dir}/$1[[0-9]]*.lib 2>/dev/null ` \
+ `ls -dr ${sc_lib_name_dir}/lib$1[[0-9]]* 2>/dev/null ` \
+ `ls -dr /usr/lib/$1[[0-9]]*.lib 2>/dev/null ` \
+ `ls -dr /usr/lib/lib$1[[0-9]]* 2>/dev/null ` \
+ `ls -dr /usr/local/lib/$1[[0-9]]*.lib 2>/dev/null ` \
+ `ls -dr /usr/local/lib/lib$1[[0-9]]* 2>/dev/null ` ; do
+ if test -f "$i" ; then
+
+ sc_lib_name_dir=`dirname $i`
+ $1_LIB_NAME=`basename $i`
+ $1_LIB_PATH_NAME=$i
+ break
+ fi
+ done
+
+ case "`uname -s`" in
+ *win32* | *WIN32* | *CYGWIN_NT* |*CYGWIN_98*|*CYGWIN_95*)
+ $1_LIB_SPEC=\"`${CYGPATH} ${$1_LIB_PATH_NAME}`\"
+ ;;
+ *)
+ # Strip off the leading "lib" and trailing ".a" or ".so"
+
+ sc_lib_name_lib=`echo ${$1_LIB_NAME}|sed -e 's/^lib//' -e 's/\.[[^.]]*$//'`
+ $1_LIB_SPEC="-L${sc_lib_name_dir} -l${sc_lib_name_lib}"
+ ;;
+ esac
+ if test "x$1_LIB_NAME" = x ; then
+ AC_MSG_ERROR(not found)
+ else
+ AC_MSG_RESULT(${$1_LIB_SPEC})
+ fi
+])
+
+#------------------------------------------------------------------------
+# SC_PRIVATE_TCL_HEADERS --
+#
+# Locate the private Tcl include files
+#
+# Arguments:
+#
+# Requires:
+# TCL_SRC_DIR Assumes that SC_LOAD_TCLCONFIG has
+# already been called.
+#
+# Results:
+#
+# Substs the following vars:
+# TCL_TOP_DIR_NATIVE
+# TCL_GENERIC_DIR_NATIVE
+# TCL_UNIX_DIR_NATIVE
+# TCL_WIN_DIR_NATIVE
+# TCL_BMAP_DIR_NATIVE
+# TCL_TOOL_DIR_NATIVE
+# TCL_PLATFORM_DIR_NATIVE
+# TCL_BIN_DIR_NATIVE
+# TCL_INCLUDES
+#------------------------------------------------------------------------
+
+AC_DEFUN(SC_PRIVATE_TCL_HEADERS, [
+ AC_MSG_CHECKING(for Tcl private include files)
+
+ case "`uname -s`" in
+ *win32* | *WIN32* | *CYGWIN_NT* |*CYGWIN_98*|*CYGWIN_95*)
+ TCL_TOP_DIR_NATIVE=\"`${CYGPATH} ${TCL_SRC_DIR}`\"
+ TCL_GENERIC_DIR_NATIVE=\"`${CYGPATH} ${TCL_SRC_DIR}/generic`\"
+ TCL_UNIX_DIR_NATIVE=\"`${CYGPATH} ${TCL_SRC_DIR}/unix`\"
+ TCL_WIN_DIR_NATIVE=\"`${CYGPATH} ${TCL_SRC_DIR}/win`\"
+ TCL_BMAP_DIR_NATIVE=\"`${CYGPATH} ${TCL_SRC_DIR}/bitmaps`\"
+ TCL_TOOL_DIR_NATIVE=\"`${CYGPATH} ${TCL_SRC_DIR}/tools`\"
+ TCL_COMPAT_DIR_NATIVE=\"`${CYGPATH} ${TCL_SRC_DIR}/compat`\"
+ TCL_PLATFORM_DIR_NATIVE=${TCL_WIN_DIR_NATIVE}
+ ;;
+ *)
+ TCL_TOP_DIR_NATIVE='$(TCL_SRC_DIR)'
+ TCL_GENERIC_DIR_NATIVE='$(TCL_TOP_DIR_NATIVE)/generic'
+ TCL_UNIX_DIR_NATIVE='$(TCL_TOP_DIR_NATIVE)/unix'
+ TCL_WIN_DIR_NATIVE='$(TCL_TOP_DIR_NATIVE)/win'
+ TCL_BMAP_DIR_NATIVE='$(TCL_TOP_DIR_NATIVE)/bitmaps'
+ TCL_TOOL_DIR_NATIVE='$(TCL_TOP_DIR_NATIVE)/tools'
+ TCL_COMPAT_DIR_NATIVE='$(TCL_TOP_DIR_NATIVE)/compat'
+ TCL_PLATFORM_DIR_NATIVE=${TCL_UNIX_DIR_NATIVE}
+ ;;
+ esac
+
+ AC_SUBST(TCL_TOP_DIR_NATIVE)
+ AC_SUBST(TCL_GENERIC_DIR_NATIVE)
+ AC_SUBST(TCL_UNIX_DIR_NATIVE)
+ AC_SUBST(TCL_WIN_DIR_NATIVE)
+ AC_SUBST(TCL_BMAP_DIR_NATIVE)
+ AC_SUBST(TCL_TOOL_DIR_NATIVE)
+ AC_SUBST(TCL_PLATFORM_DIR_NATIVE)
+
+ TCL_INCLUDES="-I${TCL_GENERIC_DIR_NATIVE} -I${TCL_PLATFORM_DIR_NATIVE}"
+ AC_SUBST(TCL_INCLUDES)
+ AC_MSG_RESULT(Using srcdir found in tclConfig.sh: ${TCL_SRC_DIR})
+])
+
+#------------------------------------------------------------------------
+# SC_PUBLIC_TCL_HEADERS --
+#
+# Locate the installed public Tcl header files
+#
+# Arguments:
+# None.
+#
+# Requires:
+# CYGPATH must be set
+#
+# Results:
+#
+# Adds a --with-tclinclude switch to configure.
+# Result is cached.
+#
+# Substs the following vars:
+# TCL_INCLUDES
+#------------------------------------------------------------------------
+
+AC_DEFUN(SC_PUBLIC_TCL_HEADERS, [
+ AC_MSG_CHECKING(for Tcl public headers)
+
+ AC_ARG_WITH(tclinclude, [ --with-tclinclude directory containing the public Tcl header files.], with_tclinclude=${withval})
+
+ if test x"${with_tclinclude}" != x ; then
+ if test -f "${with_tclinclude}/tcl.h" ; then
+ ac_cv_c_tclh=${with_tclinclude}
+ else
+ AC_MSG_ERROR([${with_tclinclude} directory does not contain Tcl public header file tcl.h])
+ fi
+ else
+ AC_CACHE_VAL(ac_cv_c_tclh, [
+ # Use the value from --with-tclinclude, if it was given
+
+ if test x"${with_tclinclude}" != x ; then
+ ac_cv_c_tclh=${with_tclinclude}
+ else
+ # Check in the includedir, if --prefix was specified
+
+ eval "temp_includedir=${includedir}"
+ for i in \
+ `ls -d ${temp_includedir} 2>/dev/null` \
+ /usr/local/include /usr/include ; do
+ if test -f "$i/tcl.h" ; then
+ ac_cv_c_tclh=$i
+ break
+ fi
+ done
+ fi
+ ])
+ fi
+
+ # Print a message based on how we determined the include path
+
+ if test x"${ac_cv_c_tclh}" = x ; then
+ AC_MSG_ERROR(tcl.h not found. Please specify its location with --with-tclinclude)
+ else
+ AC_MSG_RESULT(${ac_cv_c_tclh})
+ fi
+
+ # Convert to a native path and substitute into the output files.
+
+ INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tclh}`
+
+ TCL_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\"
+
+ AC_SUBST(TCL_INCLUDES)
+])
+
+#------------------------------------------------------------------------
+# SC_PRIVATE_TK_HEADERS --
+#
+# Locate the private Tk include files
+#
+# Arguments:
+#
+# Requires:
+# TK_SRC_DIR Assumes that SC_LOAD_TKCONFIG has
+# already been called.
+#
+# Results:
+#
+# Substs the following vars:
+# TK_INCLUDES
+#------------------------------------------------------------------------
+
+AC_DEFUN(SC_PRIVATE_TK_HEADERS, [
+ AC_MSG_CHECKING(for Tk private include files)
+
+ case "`uname -s`" in
+ *win32* | *WIN32* | *CYGWIN_NT* |*CYGWIN_98*|*CYGWIN_95*)
+ TK_UNIX_DIR_NATIVE=\"`${CYGPATH} ${TK_SRC_DIR}/unix`\"
+ TK_WIN_DIR_NATIVE=\"`${CYGPATH} ${TK_SRC_DIR}/win`\"
+ TK_GENERIC_DIR_NATIVE=\"`${CYGPATH} ${TK_SRC_DIR}/generic`\"
+ TK_XLIB_DIR_NATIVE=\"`${CYGPATH} ${TK_SRC_DIR}/xlib`\"
+ TK_PLATFORM_DIR_NATIVE=${TK_WIN_DIR_NATIVE}
+
+ TK_INCLUDES="-I${TK_GENERIC_DIR_NATIVE} -I${TK_PLATFORM_DIR_NATIVE} -I${TK_XLIB_DIR_NATIVE}"
+ ;;
+ *)
+ TK_GENERIC_DIR_NATIVE='$(TK_TOP_DIR_NATIVE)/generic'
+ TK_UNIX_DIR_NATIVE='$(TK_TOP_DIR_NATIVE)/unix'
+ TK_WIN_DIR_NATIVE='$(TK_TOP_DIR_NATIVE)/win'
+ TK_PLATFORM_DIR_NATIVE=${TK_UNIX_DIR_NATIVE}
+
+ TK_INCLUDES="-I${TK_GENERIC_DIR_NATIVE} -I${TK_PLATFORM_DIR_NATIVE}"
+ ;;
+ esac
+
+ AC_SUBST(TK_UNIX_DIR_NATIVE)
+ AC_SUBST(TK_WIN_DIR_NATIVE)
+ AC_SUBST(TK_GENERIC_DIR_NATIVE)
+ AC_SUBST(TK_XLIB_DIR_NATIVE)
+ AC_SUBST(TK_PLATFORM_DIR_NATIVE)
+
+ AC_SUBST(TK_INCLUDES)
+ AC_MSG_RESULT(Using srcdir found in tkConfig.sh)
+])
+
+#------------------------------------------------------------------------
+# SC_PUBLIC_TK_HEADERS --
+#
+# Locate the installed public Tk header files
+#
+# Arguments:
+# None.
+#
+# Requires:
+# CYGPATH must be set
+#
+# Results:
+#
+# Adds a --with-tkinclude switch to configure.
+# Result is cached.
+#
+# Substs the following vars:
+# TK_INCLUDES
+#------------------------------------------------------------------------
+
+AC_DEFUN(SC_PUBLIC_TK_HEADERS, [
+ AC_MSG_CHECKING(for Tk public headers)
+
+ AC_ARG_WITH(tkinclude, [ --with-tkinclude directory containing the public Tk header files.], with_tkinclude=${withval})
+
+ if test x"${with_tkinclude}" != x ; then
+ if test -f "${with_tkinclude}/tk.h" ; then
+ ac_cv_c_tkh=${with_tkinclude}
+ else
+ AC_MSG_ERROR([${with_tkinclude} directory does not contain Tk public header file tk.h])
+ fi
+ else
+ AC_CACHE_VAL(ac_cv_c_tkh, [
+ # Use the value from --with-tkinclude, if it was given
+
+ if test x"${with_tkinclude}" != x ; then
+ ac_cv_c_tkh=${with_tkinclude}
+ else
+ # Check in the includedir, if --prefix was specified
+
+ eval "temp_includedir=${includedir}"
+ for i in \
+ `ls -d ${temp_includedir} 2>/dev/null` \
+ /usr/local/include /usr/include ; do
+ if test -f "$i/tk.h" ; then
+ ac_cv_c_tkh=$i
+ break
+ fi
+ done
+ fi
+ ])
+ fi
+
+ # Print a message based on how we determined the include path
+
+ if test x"${ac_cv_c_tkh}" = x ; then
+ AC_MSG_ERROR(tk.h not found. Please specify its location with --with-tkinclude)
+ else
+ AC_MSG_RESULT(${ac_cv_c_tkh})
+ fi
+
+ # Convert to a native path and substitute into the output files.
+
+ INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tkh}`
+
+ TK_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\"
+
+ AC_SUBST(TK_INCLUDES)
+])
+
+#------------------------------------------------------------------------
+# SC_SIMPLE_EXEEXT
+# Select the executable extension based on the host type. This
+# is a lightweight replacement for AC_EXEEXT that doesn't require
+# a compiler.
+#
+# Arguments
+# none
+#
+# Results
+# Subst's the following values:
+# EXEEXT
+#------------------------------------------------------------------------
+
+AC_DEFUN(SC_SIMPLE_EXEEXT, [
+ AC_MSG_CHECKING(executable extension based on host type)
+
+ case "`uname -s`" in
+ *win32* | *WIN32* | *CYGWIN_NT* |*CYGWIN_98*|*CYGWIN_95*)
+ EXEEXT=".exe"
+ ;;
+ *)
+ EXEEXT=""
+ ;;
+ esac
+
+ AC_MSG_RESULT(${EXEEXT})
+ AC_SUBST(EXEEXT)
+])
+
+#------------------------------------------------------------------------
+# SC_PROG_TCLSH
+# Locate a tclsh shell in the following directories:
+# ${exec_prefix}/bin
+# ${prefix}/bin
+# ${TCL_BIN_DIR}
+# ${TCL_BIN_DIR}/../bin
+# ${PATH}
+#
+# Arguments
+# none
+#
+# Results
+# Subst's the following values:
+# TCLSH_PROG
+#------------------------------------------------------------------------
+
+AC_DEFUN(SC_PROG_TCLSH, [
+ AC_MSG_CHECKING([for tclsh])
+
+ AC_CACHE_VAL(ac_cv_path_tclsh, [
+ search_path=`echo ${exec_prefix}/bin:${prefix}/bin:${TCL_BIN_DIR}:${TCL_BIN_DIR}/../bin:${PATH} | sed -e 's/:/ /g'`
+ for dir in $search_path ; do
+ for j in `ls -r $dir/tclsh[[8-9]]*${EXEEXT} 2> /dev/null` \
+ `ls -r $dir/tclsh*${EXEEXT} 2> /dev/null` ; do
+ if test x"$ac_cv_path_tclsh" = x ; then
+ if test -f "$j" ; then
+ ac_cv_path_tclsh=$j
+ break
+ fi
+ fi
+ done
+ done
+ ])
+
+ if test -f "$ac_cv_path_tclsh" ; then
+ TCLSH_PROG=$ac_cv_path_tclsh
+ AC_MSG_RESULT($TCLSH_PROG)
+ else
+ AC_MSG_ERROR(No tclsh found in PATH: $search_path)
+ fi
+ AC_SUBST(TCLSH_PROG)
+])
+
+#------------------------------------------------------------------------
+# SC_PROG_WISH
+# Locate a wish shell in the following directories:
+# ${exec_prefix}/bin
+# ${prefix}/bin
+# ${TCL_BIN_DIR}
+# ${TCL_BIN_DIR}/../bin
+# ${PATH}
+#
+# Arguments
+# none
+#
+# Results
+# Subst's the following values:
+# WISH_PROG
+#------------------------------------------------------------------------
+
+AC_DEFUN(SC_PROG_WISH, [
+ AC_MSG_CHECKING([for wish])
+
+ AC_CACHE_VAL(ac_cv_path_wish, [
+ search_path=`echo ${exec_prefix}/bin:${prefix}/bin:${TCL_BIN_DIR}:${TCL_BIN_DIR}/../bin:${PATH} | sed -e 's/:/ /g'`
+ for dir in $search_path ; do
+ for j in `ls -r $dir/wish[[8-9]]*${EXEEXT} 2> /dev/null` \
+ `ls -r $dir/wish*${EXEEXT} 2> /dev/null` ; do
+ if test x"$ac_cv_path_wish" = x ; then
+ if test -f "$j" ; then
+ ac_cv_path_wish=$j
+ break
+ fi
+ fi
+ done
+ done
+ ])
+
+ if test -f "$ac_cv_path_wish" ; then
+ WISH_PROG=$ac_cv_path_wish
+ AC_MSG_RESULT($WISH_PROG)
+ else
+ AC_MSG_ERROR(No wish found in PATH: $search_path)
+ fi
+ AC_SUBST(WISH_PROG)
+])
+
diff --git a/iwidgets/tests/all b/iwidgets/tests/all
new file mode 100644
index 00000000000..8581c5a70b0
--- /dev/null
+++ b/iwidgets/tests/all
@@ -0,0 +1,19 @@
+# This file contains a top-level script to run all of the Tcl
+# tests. Execute it by invoking "source all" when running tclTest
+# in this directory.
+#
+# @(#) all 1.2 94/08/10 15:52:50
+# ------------------------------------------------------------------
+# THIS SCRIPT IS NOW DEPRECATED! It is kept for older Tcl
+# installations that don't have the "tcltest" package.
+# Instead, use the "all.tcl" script to run the test suite.
+# ------------------------------------------------------------------
+
+foreach i [lsort [glob *.test]] {
+ if [string match l.*.test $i] {
+ # This is an SCCS lock file; ignore it.
+ continue
+ }
+ puts stdout $i
+ source $i
+}
diff --git a/iwidgets/tests/all.tcl b/iwidgets/tests/all.tcl
new file mode 100644
index 00000000000..3cf9670dfeb
--- /dev/null
+++ b/iwidgets/tests/all.tcl
@@ -0,0 +1,122 @@
+# all.tcl --
+#
+# This file contains a top-level script to run all of the Tcl
+# tests. Execute it by invoking "source all.test" when running tcltest
+# in this directory.
+#
+# Copyright (c) 1998-2000 by Ajuba Solutions
+# All rights reserved.
+#
+# RCS: @(#) $Id$
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+# Look for the -exedir flag and find a suitable tclsh executable.
+
+if {(![info exists argv]) || ([llength $argv] < 1)} {
+ set flagArray {}
+} else {
+ set flagArray $argv
+}
+
+array set flag $flagArray
+if {[info exists flag(-exedir)]} {
+ set shell [lindex \
+ [glob -nocomplain \
+ [file join $flag(-exedir) wish*.bin] \
+ [file join $flag(-exedir) wish*]] 0]
+} else {
+ set shell $::tcltest::tcltest
+}
+
+set ::tcltest::testSingleFile false
+
+# use [pwd] trick to expand relative file paths to absolute paths - MMc
+set cwd [pwd]
+cd [file dirname [info script]]
+set ::tcltest::testsDirectory [pwd]
+cd $cwd
+
+set logfile [file join $::tcltest::temporaryDirectory Log.txt]
+
+puts stdout "Using interp: $shell"
+puts stdout "Running tests in working dir: $::tcltest::testsDirectory"
+if {[llength $::tcltest::skip] > 0} {
+ puts stdout "Skipping tests that match: $::tcltest::skip"
+}
+if {[llength $::tcltest::match] > 0} {
+ puts stdout "Only running tests that match: $::tcltest::match"
+}
+
+if {[llength $::tcltest::skipFiles] > 0} {
+ puts stdout "Skipping test files that match: $::tcltest::skipFiles"
+}
+if {[llength $::tcltest::matchFiles] > 0} {
+ puts stdout "Only sourcing test files that match: $::tcltest::matchFiles"
+}
+
+set timeCmd {clock format [clock seconds]}
+puts stdout "Tests began at [eval $timeCmd]"
+
+# source each of the specified tests
+foreach file [lsort [::tcltest::getMatchingFiles]] {
+ set tail [file tail $file]
+ puts stdout $tail
+
+ # Change to the tests directory so the value of the following
+ # variable is set correctly when we spawn the child test processes
+
+ cd $::tcltest::testsDirectory
+ set cmd [concat [list | $shell $file] [split $argv] \
+ [list -outfile $logfile]]
+ if {[catch {
+ set pipeFd [open $cmd "r"]
+ while {[gets $pipeFd line] >= 0} {
+ puts $::tcltest::outputChannel $line
+ }
+ close $pipeFd
+ } msg]} {
+ # Print results to ::tcltest::outputChannel.
+ puts $::tcltest::outputChannel $msg
+ }
+
+ # Now concatenate the temporary log file to
+ # ::tcltest::outputChannel
+ if {[catch {
+ set fd [open $logfile "r"]
+ while {![eof $fd]} {
+ gets $fd line
+ if {![eof $fd]} {
+ if {[regexp {^([^:]+):\tTotal\t([0-9]+)\tPassed\t([0-9]+)\tSkipped\t([0-9]+)\tFailed\t([0-9]+)} $line null testFile Total Passed Skipped Failed]} {
+ foreach index [list "Total" "Passed" "Skipped" \
+ "Failed"] {
+ incr ::tcltest::numTests($index) [set $index]
+ }
+ incr ::tcltest::numTestFiles
+ if {$Failed > 0} {
+ lappend ::tcltest::failFiles $testFile
+ }
+ }
+ puts $::tcltest::outputChannel $line
+ }
+ }
+ close $fd
+ } msg]} {
+ puts $::tcltest::outputChannel $msg
+ }
+}
+
+set numFailures [llength $::tcltest::failFiles]
+
+# cleanup
+puts stdout "\nTests ended at [eval $timeCmd]"
+::tcltest::cleanupTests 1
+
+if {$numFailures > 0} {
+ return -code error -errorcode $numFailures \
+ -errorinfo "Found $numFailures test file failures"
+} else {
+ return
+}
+exit
diff --git a/iwidgets/tests/buttonbox.test b/iwidgets/tests/buttonbox.test
new file mode 100644
index 00000000000..b4a720fcfa9
--- /dev/null
+++ b/iwidgets/tests/buttonbox.test
@@ -0,0 +1,199 @@
+# This file is a Tcl script to test out [incr Widgets] Buttonbox class.
+# It is organized in the standard fashion for Tcl tests with the following
+# notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+#
+# Copyright (c) 1995 DSC Technologies Corporation
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# @(#) $Id$
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+wm geometry . {}
+raise .
+
+set c 1
+set o 1
+set m 1
+
+#
+# Initial construction test
+#
+test Buttonbox-1.$c {Buttonbox construction} {
+ iwidgets::Buttonbox .bb
+ pack .bb
+ update
+} {}
+
+incr c
+
+#
+# Button additions
+#
+test Buttonbox-1.$c {Buttonbox construction} {
+ .bb add Yes -text Yes
+ update
+ .bb add No -text No
+ update
+ .bb default Yes
+ update
+} {}
+
+incr c
+
+#
+# Option tests which are successful.
+#
+test Buttonbox-2.$o {configuration option} {
+ llength [.bb configure]
+} {14}
+
+incr o
+
+foreach test {
+ {-activebackground #ececec #ececec}
+ {-activeforeground Black Black}
+ {-orient vertical vertical}
+ {-background #d9d9d9 #d9d9d9}
+ {-cursor gumby gumby}
+ {-disabledforeground #a3a3a3 #a3a3a3}
+ {-foreground Black Black}
+ {-highlightcolor Black Black}
+ {-highlightthickness 2 2}
+ {-orient horizontal horizontal}
+ {-padx 10 10}
+ {-pady 10 10}} {
+ set option [lindex $test 0]
+ test Buttonbox-2.$o "configuration options, $option" {
+ .bb configure $option [lindex $test 1]
+ lindex [.bb configure $option] 4
+ } [lindex $test 2]
+ update
+ incr o
+}
+
+#
+# Option tests which fail and produce errors.
+#
+foreach test {
+ {-orient bogus {bad orientation option "bogus", should be either horizontal or vertical}}} {
+ set option [lindex $test 0]
+ test Buttonbox-2.$o "configuration options, $option" {
+ list [catch {.bb configure $option [lindex $test 1]} msg] $msg
+ } [list 1 [lindex $test 2]]
+ incr o
+}
+
+#
+# Method tests which are successful.
+#
+foreach test {
+ {{.bb index 0} {0}}
+ {{.bb index end} {1}}
+ {{.bb index default} {0}}
+ {{.bb index No} {1}}
+ {{.bb index Y*} {0}}
+ {{.bb add Maybe -text Maybe} {}}
+ {{.bb insert 0 Never -text Never} {}}
+ {{.bb default Never} {}}
+ {{.bb hide Yes} {}}
+ {{.bb show Yes } {}}
+ {{.bb hide end} {}}
+ {{.bb show end} {}}
+ {{.bb hide 1} {}}
+ {{.bb show 1} {}}
+ {{.bb hide N*} {}}
+ {{.bb show N*} {}}
+ {{.bb invoke Yes} {}}
+ {{.bb invoke} {}}
+ {{.bb invoke default} {}}
+ {{.bb delete Maybe} {}}
+ {{.bb buttonconfigure Yes -text YES} {}}
+ {{.bb buttonconfigure N* -defaultring no} {}}
+ {{.bb buttonconfigure end -defaultring true} {}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Buttonbox-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 0 [lindex $test 1]]
+ update
+ incr m
+}
+
+#
+# Method tests which fail and produce errors
+#
+foreach test {
+ {{.bb index 12} {Buttonbox index "12" is out of range}}
+ {{.bb index bogus} {bad Buttonbox index "bogus": must be number, end, default, or pattern}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Buttonbox-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 1 [lindex $test 1]]
+ incr m
+}
+
+#
+# Conclusion of constrcution/destruction tests
+#
+test Buttonbox-1.$c {Buttonbox destruction} {
+ destroy .bb
+ update
+} {}
+
+incr c
+
+test Buttonbox-1.$c {Buttonbox construction} {
+ iwidgets::buttonbox .bb
+ pack .bb
+ update
+ .bb add Hello -text Hello
+ update
+ .bb insert end GoodBye -text GoodBye
+ update
+ .bb default Hello
+ update
+ .bb default GoodBye
+ update
+} {}
+
+incr c
+
+test Buttonbox-1.$c {Buttonbox destruction} {
+ destroy .bb
+ update
+} {}
+
+incr c
+
+test Buttonbox-1.$c {Buttonbox destruction} {
+ iwidgets::buttonbox .bb
+ pack .bb
+ destroy .bb
+ update
+} {}
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/tests/calendar.test b/iwidgets/tests/calendar.test
new file mode 100644
index 00000000000..d5d283755fb
--- /dev/null
+++ b/iwidgets/tests/calendar.test
@@ -0,0 +1,171 @@
+# This file is a Tcl script to test out [incr Widgets] Calendar class.
+# It is organized in the standard fashion for Tcl tests with the following
+# notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+#
+# Copyright (c) 1995 DSC Technologies Corporation
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# @(#) $Id$
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+wm geometry . {}
+raise .
+
+set c 1
+set o 1
+set m 1
+
+#
+# Initial construction test
+#
+test Calendar-1.$c {Calendar construction} {
+ iwidgets::Calendar .cal
+ pack .cal -padx 10 -pady 10 -fill both -expand yes
+ update
+} {}
+
+incr c
+
+#
+# Option tests which are successful.
+#
+test Calendar-2.$o {configuration option} {
+ llength [.cal configure]
+} {22}
+
+incr o
+
+foreach test {
+ {-background #d9d9d9 #d9d9d9}
+ {-buttonforeground green green}
+ {-command {.cal configure -background red} {.cal configure -background red}}
+ {-currentdatefont -*-helvetica-bold-r-normal--*-120-* -*-helvetica-bold-r-normal--*-120-*}
+ {-cursor gumby gumby}
+ {-datefont -*-helvetica-medium-r-normal--*-120-* -*-helvetica-medium-r-normal--*-120-*}
+ {-dayfont -*-helvetica-medium-r-normal--*-120-* -*-helvetica-medium-r-normal--*-120-*}
+ {-days {M T W T F S S} {M T W T F S S}}
+ {-foreground black black}
+ {-height 300 300}
+ {-int yes yes}
+ {-int no no}
+ {-outline black black}
+ {-selectcolor blue blue}
+ {-selectthickness 2 2}
+ {-startday monday monday}
+ {-titlefont -*-helvetica-bold-r-normal--*-140-* -*-helvetica-bold-r-normal--*-140-*}
+ {-weekdaybackground mistyrose mistyrose}
+ {-weekendbackground white white}
+ {-width 350 350}} {
+ set option [lindex $test 0]
+ test Calendar-2.$o "configuration options, $option" {
+ .cal configure $option [lindex $test 1]
+ lindex [.cal configure $option] 4
+ } [lindex $test 2]
+ update
+ incr o
+}
+
+#
+# Option tests which fail and produce errors.
+#
+foreach test {
+ {-backwardimage bogus {bad image name "bogus": image does not exist}}
+ {-forwardimage bogus {bad image name "bogus": image does not exist}}
+ {-startday bogus {bad startday option "bogus": should be sunday, monday, tuesday, wednesday, thursday, friday, or saturday}}} {
+ set option [lindex $test 0]
+ test Calendar-2.$o "configuration options, $option" {
+ list [catch {.cal configure $option [lindex $test 1]} msg] $msg
+ } [list 1 [lindex $test 2]]
+ incr o
+}
+
+#
+# Method tests which are successful.
+#
+foreach test {
+ {{.cal select 03/03/1960} {}}
+ {{.cal get} {03/03/1960}}
+ {{.cal show 03/03/1960} {}}
+ {{.cal get -string} {03/03/1960}}
+ {{.cal select now} {}}
+ {{.cal show now} {}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Calendar-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 0 [lindex $test 1]]
+ update
+ incr m
+}
+
+test Calendar-3.$m "object methods, clock clicks" {
+ set clicks [clock scan "06/08/1964"]
+ .cal show $clicks
+ .cal select $clicks
+ update
+ .cal get
+} {06/08/1964}
+incr m
+
+#
+# Method tests which fail and produce errors
+#
+foreach test {
+ {{.cal get bogus} {bad format option "bogus": should be -string or -clicks}}
+ {{.cal select bogus} {bad date: "bogus", must be a valid date string, clock clicks value or the keyword now}}
+ {{.cal show bogus} {bad date: "bogus", must be a valid date string, clock clicks value or the keyword now}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Calendar-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 1 [lindex $test 1]]
+ incr m
+}
+
+#
+# Conclusion of constrcution/destruction tests
+#
+test Calendar-1.$c {Calendar destruction} {
+ destroy .cal
+ update
+} {}
+
+incr c
+
+test Calendar-1.$c {Calendar construction} {
+ iwidgets::calendar .cal
+ pack .cal -padx 10 -pady 10
+ update
+} {}
+
+incr c
+
+test Calendar-1.$c {Calendar destruction} {
+ destroy .cal
+ update
+} {}
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/tests/canvasprintbox.test b/iwidgets/tests/canvasprintbox.test
new file mode 100644
index 00000000000..8d5e54d7219
--- /dev/null
+++ b/iwidgets/tests/canvasprintbox.test
@@ -0,0 +1,162 @@
+# This file is a Tcl script to test out [incr Widgets] Canvasprintbox class.
+# It is organized in the standard fashion for Tcl tests with the following
+# notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+#
+# Copyright (c) 1995 Tako Schotanus
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+wm geometry . {}
+raise .
+
+set c 1
+set o 1
+set m 1
+
+#
+# Initial construction test
+#
+test Canvasprintbox-1.$c {Canvasprintbox construction} {
+ iwidgets::Canvasprintbox .cpb
+ pack .cpb -padx 10 -pady 10 -fill both -expand yes
+ update
+} {}
+
+incr c
+
+#
+# Option tests which are successful.
+#
+test Canvasprintbox-2.$o {configuration option} {
+ llength [.cpb configure]
+} {34}
+
+incr o
+
+foreach test {
+ {-background #d9d9d9 #d9d9d9}
+ {-cursor gumby gumby}
+ {-hpagecnt 2 2}
+ {-orient portrait portrait}
+ {-orient landscape landscape}
+ {-output file file}
+ {-filename test.ps test.ps}
+ {-output printer printer}
+ {-pagesize a5 a5}
+ {-pagesize a4 a4}
+ {-pagesize a3 a3}
+ {-pagesize a2 a2}
+ {-pagesize a1 a1}
+ {-pagesize legal legal}
+ {-pagesize letter letter}
+ {-posterize 1 1}
+ {-posterize 0 0}
+ {-printcmd test test}
+ {-printcmd lpr lpr}
+ {-printregion {10 10 100 100} {10 10 100 100}}
+ {-printregion {} {}}
+ {-stretch 1 1}
+ {-stretch 0 0}
+ {-vpagecnt 2 2}} {
+ set option [lindex $test 0]
+ test Canvasprintbox-2.$o "configuration options, $option" {
+ .cpb configure $option [lindex $test 1]
+ lindex [.cpb configure $option] 4
+ } [lindex $test 2]
+ update
+ incr o
+}
+
+#
+# Option tests which fail and produce errors.
+#
+#foreach test {
+# {-printregion bogus {bad option "printregion": should contain 4 coordinates}}
+# {-output bogus {bad option "output": should be file or printer}}
+# {-orient bogus {bad option "orient": should be portrait or landscape}}
+# {-stretch bogus {bad option "stretch": should be a boolean}}
+# {-posterize bogus {bad option "posterize": should be a boolean}}
+# } {
+# set option [lindex $test 0]
+# test Canvasprintbox-2.$o "configuration options, $option" {
+# list [catch {.cpb configure $option [lindex $test 1]} msg] $msg
+# } [list 1 [lindex $test 2]]
+# incr o
+#}
+
+#
+# Method tests which are successful.
+#
+canvas .c
+foreach test {
+ {{.cpb getoutput} {lpr}}
+ {{.cpb refresh} {}}
+ {{.cpb setcanvas .c} {}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Canvasprintbox-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 0 [lindex $test 1]]
+ update
+ incr m
+}
+
+#
+# Conclusion of constrcution/destruction tests
+#
+test Canvasprintbox-1.$c {Canvasprintbox destruction} {
+ destroy .c
+ destroy .cpb
+ update
+} {}
+
+incr c
+
+test Canvasprintbox-1.$c {Canvasprintbox construction} {
+ iwidgets::canvasprintbox .cpb
+ pack .cpb -padx 10 -pady 10 -fill both -expand yes
+ update
+} {}
+
+incr c
+
+test Canvasprintbox-1.$c {Canvasprintbox destruction} {
+ destroy .cpb
+ update
+} {}
+
+incr c
+
+test Canvasprintbox-1.$c {Canvasprintbox destruction} {
+ iwidgets::canvasprintbox .cpb
+ pack .cpb
+ destroy .cpb
+ update
+} {}
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/tests/canvasprintdialog.test b/iwidgets/tests/canvasprintdialog.test
new file mode 100644
index 00000000000..423f1bced92
--- /dev/null
+++ b/iwidgets/tests/canvasprintdialog.test
@@ -0,0 +1,181 @@
+# This file is a Tcl script to test out [incr Widgets] Canvasprintdialog
+# class. It is organized in the standard fashion for Tcl tests with the
+# following notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+# 4.x - Other tests
+#
+# Copyright (c) 1995 Tako Schotanus
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+wm geometry . {}
+raise .
+
+set c 1
+set o 1
+set m 1
+
+#
+# Initial construction test
+#
+test Canvasprintdialog-1.$c {Canvasprintdialog construction} {
+ iwidgets::Canvasprintdialog .cpd
+ .cpd activate
+} {}
+
+incr c
+
+#
+# Option tests which are successful.
+#
+test Canvasprintdialog-2.$o {configuration option} {
+ llength [.cpd configure]
+} {28}
+
+incr o
+
+foreach test {
+ {-background #d9d9d9 #d9d9d9}
+ {-buttonboxpadx 15 15}
+ {-buttonboxpady 15 15}
+ {-buttonboxpos e e}
+ {-buttonboxpos n n}
+ {-buttonboxpos s s}
+ {-buttonboxpos w w}
+ {-cursor gumby gumby}
+ {-filename test.ps test.ps}
+ {-foreground Black Black}
+ {-hpagecnt 2 2}
+ {-modality application application}
+ {-modality global global}
+ {-modality none none}
+ {-orient portrait portrait}
+ {-orient landscape landscape}
+ {-output file file}
+ {-output printer printer}
+ {-padx 15 15}
+ {-pady 15 15}
+ {-pagesize a5 a5}
+ {-pagesize a4 a4}
+ {-pagesize a3 a3}
+ {-pagesize a2 a2}
+ {-pagesize a1 a1}
+ {-pagesize legal legal}
+ {-pagesize letter letter}
+ {-posterize 1 1}
+ {-posterize 0 0}
+ {-printcmd test test}
+ {-printcmd lpr lpr}
+ {-printregion {10 10 100 100} {10 10 100 100}}
+ {-printregion {} {}}
+ {-separator off off}
+ {-separator on on}
+ {-stretch 1 1}
+ {-stretch 0 0}
+ {-thickness 4 4}
+ {-title Test Test}
+ {-vpagecnt 2 2}} {
+ set option [lindex $test 0]
+ test Canvasprintdialog-2.$o "configuration options, $option" {
+ .cpd configure $option [lindex $test 1]
+ lindex [.cpd configure $option] 4
+ } [lindex $test 2]
+ update
+ incr o
+}
+
+#
+# Option tests which fail and produce errors.
+#
+#foreach test {
+# {-printregion bogus {bad option "printregion": should contain 4 coordinates}}
+# {-output bogus {bad option "output": should be file or printer}}
+# {-orient bogus {bad option "orient": should be portrait or landscape}}
+# {-stretch bogus {bad option "stretch": should be a boolean}}
+# {-posterize bogus {bad option "posterize": should be a boolean}}
+# } {
+# set option [lindex $test 0]
+# test Canvasprintdialog-2.$o "configuration options, $option" {
+# list [catch {.cpd configure $option [lindex $test 1]} msg] $msg
+# } [list 1 [lindex $test 2]]
+# incr o
+#}
+
+#
+# Method tests which are successful.
+#
+canvas .c
+foreach test {
+ {{.cpd getoutput} {lpr}}
+ {{.cpd refresh} {}}
+ {{.cpd setcanvas .c} {}}
+ {{.cpd hide Help} {}}
+ {{.cpd hide Cancel} {}}
+ {{.cpd default Apply} {}}
+ {{.cpd show Cancel} {}}
+ {{.cpd deactivate} {}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Canvasprintdialog-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 0 [lindex $test 1]]
+ update
+ incr m
+}
+
+#
+# Conclusion of constrcution/destruction tests
+#
+test Canvasprintdialog-1.$c {Canvasprintdialog destruction} {
+ destroy .c
+ destroy .cpd
+ update
+} {}
+
+incr c
+
+test Canvasprintdialog-1.$c {Canvasprintdialog construction} {
+ iwidgets::Canvasprintdialog .cpd
+ update
+} {}
+
+incr c
+
+test Canvasprintdialog-1.$c {Canvasprintdialog destruction} {
+ destroy .cpd
+ update
+} {}
+
+incr c
+
+test Canvasprintdialog-1.$c {Canvasprintdialog destruction} {
+ iwidgets::Canvasprintdialog .cpd
+ destroy .cpd
+ update
+} {}
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/tests/checkbox.test b/iwidgets/tests/checkbox.test
new file mode 100644
index 00000000000..9b89661ee2b
--- /dev/null
+++ b/iwidgets/tests/checkbox.test
@@ -0,0 +1,161 @@
+# This file is a Tcl script to test out [incr Widgets] Checkbox class.
+# It is organized in the standard fashion for Tcl tests with the following
+# notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+#
+# Copyright (c) 1995 DSC Technologies Corporation
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# @(#) $Id$
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+wm geometry . {}
+raise .
+
+set c 1
+set o 1
+set m 1
+
+#
+# Initial construction test
+#
+test Checkbox-1.$c {Checkbox construction} {
+ iwidgets::Checkbox .cb -labeltext "Styles"
+ pack .cb -padx 10 -pady 10 -fill both -expand yes
+ update
+} {}
+
+incr c
+
+#
+# Option tests which are successful.
+#
+test Checkbox-2.$o {configuration option} {
+ llength [.cb configure]
+} {16}
+
+incr o
+
+test Checkbox-1.$c {Checkbox add method} {
+ .cb add foo -text "Foo Bar"
+ .cb add bar -text "Bar Foo"
+ update
+} {}
+
+incr m
+
+foreach test {
+ {-background #d9d9d9 #d9d9d9}
+ {-borderwidth 4 4}
+ {-borderwidth 2 2}
+ {-cursor gumby gumby}
+ {-foreground Green Green}
+ {-foreground Black Black}
+ {-labelmargin 5 5}
+ {-labelpos w w}
+ {-labelpos n n}
+ {-labelpos ne ne}
+ {-labelpos e e}
+ {-labelpos se se}
+ {-labelpos s s}
+ {-labelpos sw sw}
+ {-labeltext Label Label}
+ {-labeltext Styles Styles}
+ {-labelpos nw nw}
+ {-relief raised raised}
+ {-relief sunken sunken}} {
+ set option [lindex $test 0]
+ test Checkbox-2.$o "configuration options, $option" {
+ .cb configure $option [lindex $test 1]
+ lindex [.cb configure $option] 4
+ } [lindex $test 2]
+ update
+ incr o
+}
+
+#
+# Method tests which are successful.
+#
+foreach test {
+ {{.cb delete foo} {}}
+ {{.cb delete bar} {}}
+ {{.cb add bold -text Bold} bold}
+ {{.cb insert bold italic -text Italic} italic}
+ {{.cb add underline -text Underline} underline}
+ {{.cb insert underline strikethrough -text "Strike Through"} strikethrough}
+ {{.cb index b*} 1}
+ {{.cb select bold} {}}
+ {{.cb get} bold}
+ {{.cb get bold} 1}
+ {{.cb get italic} 0}
+ {{.cb delete end} {}}
+ {{.cb deselect bold} {}}
+ {{.cb get} {}}
+ {{.cb index end} 2}
+ {{.cb flash 1} {}}
+ {{.cb buttonconfigure bold -text BOLD} {}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Checkbox-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 0 [lindex $test 1]]
+ update
+ incr m
+}
+
+#
+# Conclusion of constrcution/destruction tests
+#
+test Checkbox-1.$c {Checkbox destruction} {
+ destroy .cb
+ update
+} {}
+
+incr c
+
+test Checkbox-1.$c {Checkbox construction} {
+ iwidgets::checkbox .cb
+ pack .cb -padx 10 -pady 10
+ update
+} {}
+
+incr c
+
+test Checkbox-1.$c {Checkbox destruction} {
+ destroy .cb
+ update
+} {}
+
+incr c
+
+test Checkbox-1.$c {Checkbox destruction} {
+ iwidgets::checkbox .cb
+ pack .cb
+ destroy .cb
+ update
+} {}
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/tests/combobox.test b/iwidgets/tests/combobox.test
new file mode 100644
index 00000000000..787d1d5aa6c
--- /dev/null
+++ b/iwidgets/tests/combobox.test
@@ -0,0 +1,328 @@
+# This file is a Tcl script to test out [incr Widgets] Combobox class.
+# It is organized in the standard fashion for Tcl tests with the following
+# notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+#
+# Copyright (c) 1995 John S. Sigler
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+wm geometry . {}
+raise .
+
+set c 1
+set o 1
+set m 1
+
+#
+# Initial construction test
+#
+test Combobox-1.$c {Combobox construction} {
+ iwidgets::Combobox .cb
+ pack .cb -padx 10 -pady 10 -fill x -expand yes
+ image create bitmap flagup -file $tk_library/demos/images/flagup.bmp
+ update
+} {}
+
+incr c
+
+#
+# Option tests which are successful.
+#
+test Combobox-2.$o {configuration option} {
+ llength [.cb configure]
+} {52}
+
+incr o
+
+foreach test {
+ {-listheight 150 150}
+ {-width 20 20}
+ {-textvariable option option}
+ {-labeltext Combobox: Combobox:}
+ {-labelpos nw nw}
+ {-labelpos n n}
+ {-labelpos ne ne}
+ {-labelpos w w}
+ {-labelimage flagup flagup}
+ {-labelpos nw nw}
+ {-labelpos n n}
+ {-labelpos ne ne}
+ {-labelpos w w}
+ {-labelimage {} {}}
+ {-borderwidth 10 10}
+ {-borderwidth 2 2}
+ {-background steelblue steelblue}
+ {-foreground white white}
+ {-background grey85 grey85}
+ {-foreground Black Black}
+ {-textvariable {} {}}
+ {-state disabled disabled}
+ {-state normal normal}
+ {-textvariable option option}
+ {-arrowrelief groove groove}
+ {-arrowrelief flat flat}
+ {-arrowrelief raised raised}
+ {-selectioncommand {doit} {@scope :: doit}}
+ {-selectioncommand {} {}}
+ {-cursor {} {}}
+ {-grab global global}
+ {-grab local local}
+ {-textvariable {} {} }
+ {-dropdown false false}
+ {-dropdown true true}
+ {-textvariable option option}
+ {-editable true true}
+ {-editable false false}
+ {-relief raised raised}
+ {-relief groove groove}
+ {-relief flat flat}
+ {-relief sunken sunken}
+ {-exportselection 1 1}
+ {-exportselection 0 0}
+ {-invalid {catch {blt_bell}} {catch {blt_bell}} }
+ {-labelmargin 2 2}
+ {-labelfont -Adobe-Helvetica-Bold-R-Normal--*-120-* \
+ -Adobe-Helvetica-Bold-R-Normal--*-120-*}
+ {-margin 5 5}
+ {-popupcursor hand1 hand1}
+ {-popupcursor hand2 hand2}
+ {-selectbackground \#b2dfee \#b2dfee}
+ {-selectbackground steelblue steelblue}
+ {-selectborderwidth 1 1}
+ {-selectforeground Black Black}
+ {-sticky w w}
+ {-sticky nw nw}
+ {-sticky n n}
+ {-sticky ne ne}
+ {-sticky e e}
+ {-sticky se se}
+ {-sticky s s}
+ {-sticky sw sw}
+ {-sticky news news}
+ {-textbackground white white}
+ {-textfont 10x20 10x20}
+ {-textfont -Adobe-Helvetica-Medium-R-Normal--*-120-* \
+ -Adobe-Helvetica-Medium-R-Normal--*-120-*}
+ {-textvariable {} {} }
+ {-unique true true}
+ {-validate alpha alpha}
+ {-validate {} {}}
+ {-dropdown false false}
+ {-hscrollmode dynamic static}
+ {-hscrollmode dynamic dynamic}
+ {-vscrollmode dynamic static}
+ {-grab global global}
+ {-vscrollmode dynamic dynamic}
+ {-dropdown true true}} {
+ set option [lindex $test 0]
+ test Combobox-2.$o "configuration options, $option" {
+ .cb configure $option [lindex $test 2]
+ lindex [.cb configure $option] 4
+ } [lindex $test 2]
+ update
+ incr o
+ }
+
+#
+# Option tests which fail and produce errors.
+#
+foreach test {
+ {-borderwidth bogus {bad screen distance "bogus"}}
+ {-completion bogus {bad completion option "bogus": should be boolean}}
+ {-cursor bogus {bad cursor spec "bogus"}}
+ {-dropdown bogus {bad dropdown option "bogus": should be boolean}}
+ {-editable bogus {bad editable option "bogus": should be boolean}}
+ {-exportselection bogus {expected boolean value but got "bogus"}}
+ {-grab bogus {bad grab value "bogus": must be global or local}}
+ {-listheight bogus {bad screen distance "bogus"}}
+ {-hscrollmode bogus {bad hscrollmode option "bogus": should be static, dynamic, or none}}
+ {-margin bogus {bad screen distance "bogus"}}
+ {-popupcursor bogus {bad cursor spec "bogus"}}
+ {-selectborderwidth bogus {bad screen distance "bogus"}}
+ {-state bogus {bad state "bogus": must be disabled or normal}}
+ {-unique bogus {bad unique value "bogus": should be boolean}}
+ {-vscrollmode bogus {bad vscrollmode option "bogus": should be static, dynamic, or none}}
+ {-width bogus {expected integer but got "bogus"}} } {
+ if {[lindex $test 0] == "-state"} {
+ if {$::tk_version >= 8.4} {
+ # A new state was added to the Tk entry widget in 8.4.
+ set test {-state bogus {bad state "bogus": must be disabled, normal, or readonly}}
+ }
+ }
+ set option [lindex $test 0]
+ test Combobox-2.$o "configuration options, $option" {
+ list [catch {.cb configure $option [lindex $test 1]} msg] $msg
+ } [list 1 [lindex $test 2]]
+ incr o
+}
+#
+# Method tests which are successful.
+#
+foreach test {
+ {{.cb configure -editable 1} {}}
+ {{.cb clear all} {}}
+ {{.cb insert list 0 Test1 Test2 Test3 Test4} {}}
+ {{.cb insert list end {More Test}} {}}
+ {{.cb size} {5}}
+ {{.cb delete list 1} {}}
+ {{.cb delete list 0 2} {}}
+ {{.cb size} {1}}
+ {{.cb get 0} {More Test}}
+ {{.cb selection set end end} {}}
+ {{.cb getcurselection} {More Test}}
+ {{.cb get} {More Test}}
+ {{.cb clear entry} {}}
+ {{.cb get} {}}
+ {{.cb insert entry end "this is a test"} {} }
+ {{.cb get} {this is a test}}
+ {{.cb curselection} {}}
+ {{.cb clear} {}}
+ {{.cb size} {0}}
+ {{.cb getcurselection} {}}
+ {{.cb insert list end {Test1} {Test2} {Really Long String Test}} {}}
+ {{.cb size} {3}}
+ {{.cb get 0} {Test1}}
+ {{.cb insert entry end R} {}}
+ {{.cb getcurselection} {Really Long String Test}}
+ {{.cb get} {Really Long String Test}}
+ {{.cb config -completion off} {}}
+ {{.cb selection clear 0 end} {}}
+ {{.cb insert entry end R} {}}
+ {{.cb get} {R}}
+ {{.cb getcurselection} {}}
+ {{.cb config -completion on} {}}
+ {{.cb get [expr [.cb size]-1]} {Really Long String Test}}
+ {{.cb insert list 0 {Test3} {Test4} {Really Long String Test}} {}}
+ {{.cb size} {6}}
+ {{.cb insert list 1 {Test5} {Test6} {Really Long String Test}} {}}
+ {{.cb size} {9}}
+ {{.cb insert list 5 {Test7} {Test8} {Really Long String Test}} {}}
+ {{.cb size} {12}}
+ {{.cb config -state disabled} {}}
+ {{.cb insert list end {not gonna make it in}} {}}
+ {{.cb size} {12}}
+ {{.cb insert entry end {eally!}} {}}
+ {{.cb get} {R}}
+ {{.cb config -state normal} {}}
+ {{.cb config -dropdown 0} {}}
+ {{.cb size} {12}}
+ {{.cb config -dropdown 1} {}}
+ {{.cb size} {12}}
+ {{.cb see 0} {}}
+ {{.cb see 11} {}}
+ {{.cb get end} {Really Long String Test}}
+ {{.cb selection clear 0 end} {}}
+ {{.cb selection set 5 5} {}}
+ {{.cb curselection} {5}}
+ {{.cb justify left} {}}
+ {{.cb justify right} {}}
+ {{.cb justify top} {}}
+ {{.cb justify bottom} {}}
+ {{.cb sort ascending} {}}
+ {{.cb sort descending} {}}
+ {{.cb sort increasing} {}}
+ {{.cb sort decreasing} {}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Combobox-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 0 [lindex $test 1]]
+ update
+ incr m
+}
+
+#
+# Method tests which fail and produce errors
+#
+foreach test {
+ {{.cb clear bogus} {bad Combobox component "bogus": must be entry, list, or all.}}
+ {{.cb delete} {wrong # args: should be ".cb delete component first ?last?"}}
+ {{.cb delete bogus 0} {bad Combobox component "bogus": must be entry or list.}}
+ {{.cb delete list} {wrong # args: should be ".cb delete component first ?last?"}}
+ {{.cb delete entry} {wrong # args: should be ".cb delete component first ?last?"}}
+ {{.cb get bogus1 bogus2} {wrong # args: should be ".cb get ?index?"}}
+ {{.cb insert} {wrong # args: should be ".cb insert component index ?arg arg ...?"}}
+ {{.cb insert bogus 0 bogus0} {bad Combobox component "bogus": must be entry or list.}}
+ {{.cb insert list} {wrong # args: should be ".cb insert component index ?arg arg ...?"}}
+ {{.cb insert list 1} {no value given for parameter "string" in function "Combobox::insert"}}
+ {{.cb insert entry a b c} {called function "Combobox::insert entry" with too many arguments}}
+ {{.cb selection} {wrong # args: should be ".cb selection option first ?last?"}}
+ {{.cb selection bogus1 bogus2 bogus3 bogus4} {wrong # args: should be ".cb selection option first ?last?"}}
+ {{.cb selection bogus bogus} {bad Scrolledlistbox index "bogus": must be active, anchor, end, @x,y, number, or a pattern}}
+ {{.cb sort bogus} {bad sort argument "bogus": must be a valid argument to the Tcl lsort command}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Combobox-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 1 [lindex $test 1]]
+ incr m
+}
+
+#
+# Conclusion of constrcution/destruction tests
+#
+test Combobox-4.1 {Combobox destruction} {
+ destroy .cb
+ update
+} {}
+
+incr c
+
+test Combobox-4.2 {Combobox construction} {
+ iwidgets::Combobox .cb3 -selectioncommand {puts "choice: [.cb get]" } \
+ -dropdown false -listheight 50 \
+ -labeltext "Numeric Simple:" -labelpos w \
+ -validate numeric -unique false
+ .cb3 insert list end 123 456 789 101112
+ pack .cb3 -padx 10 -pady 10 -fill both -expand yes
+ update
+} {}
+
+incr c
+
+test Combobox-4.3 {Combobox destruction} {
+ destroy .cb3
+ update
+} {}
+
+test Combobox-4.4 {Combobox construction} {
+ iwidgets::Combobox .cb4 -arrowrelief flat -selectioncommand {puts "choice: [.cb get]" } \
+ -editable false \
+ -listheight 200 -labeltext "DropDown:" -labelpos w \
+ -popupcursor hand1 -unique true
+ .cb4 insert list end Hello {Out There} World
+ pack .cb4 -padx 10 -pady 10 -fill both -expand yes
+ update
+} {}
+
+incr c
+
+test Combobox-4.5 {Combobox destruction} {
+ destroy .cb4
+ update
+} {}
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/tests/dateentry.test b/iwidgets/tests/dateentry.test
new file mode 100644
index 00000000000..8ea1453ba8c
--- /dev/null
+++ b/iwidgets/tests/dateentry.test
@@ -0,0 +1,219 @@
+# This file is a Tcl script to test out [incr Widgets] Dateentry class.
+# It is organized in the standard fashion for Tcl tests with the following
+# notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+#
+# Copyright (c) 1995 DSC Technologies Corporation
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# @(#) $Id$
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+wm geometry . {}
+raise .
+
+set c 1
+set o 1
+set m 1
+
+#
+# Initial construction test
+#
+test Dateentry-1.$c {Dateentry construction} {
+ iwidgets::Dateentry .de -labeltext "Date Field"
+ pack .de -padx 10 -pady 10 -fill both -expand yes
+ update
+} {}
+
+incr c
+
+#
+# Option tests which are successful.
+#
+test Dateentry-2.$o {configuration option} {
+ llength [.de configure]
+} {46}
+
+incr o
+
+foreach test {
+ {-background #d9d9d9 #d9d9d9}
+ {-buttonforeground green green}
+ {-borderwidth 4 4}
+ {-borderwidth 2 2}
+ {-command {.de configure -background red} {.de configure -background red}}
+ {-cursor gumby gumby}
+ {-exportselection 0 0}
+ {-foreground Green Green}
+ {-foreground Black Black}
+ {-gmt true true}
+ {-gmt false false}
+ {-gmt on on}
+ {-gmt off off}
+ {-gmt 1 1}
+ {-gmt 0 0}
+ {-gmt yes yes}
+ {-gmt no no}
+ {-highlightcolor Red Red}
+ {-highlightthickness 2 2}
+ {-insertbackground Yellow Yellow}
+ {-insertbackground Black Black}
+ {-int yes yes}
+ {-int no no}
+ {-iq low low}
+ {-iq average average}
+ {-iq high high}
+ {-justify right right}
+ {-justify center center}
+ {-justify left left}
+ {-labelmargin 5 5}
+ {-labelpos w w}
+ {-labelpos nw nw}
+ {-labelpos n n}
+ {-labelpos ne ne}
+ {-labelpos e e}
+ {-labelpos se se}
+ {-labelpos s s}
+ {-labelpos sw sw}
+ {-labeltext Label Label}
+ {-relief raised raised}
+ {-relief sunken sunken}
+ {-currentdatefont -*-helvetica-bold-r-normal--*-120-* -*-helvetica-bold-r-normal--*-120-*}
+ {-datefont -*-helvetica-medium-r-normal--*-120-* -*-helvetica-medium-r-normal--*-120-*}
+ {-dayfont -*-helvetica-medium-r-normal--*-120-* -*-helvetica-medium-r-normal--*-120-*}
+ {-days {M T W T F S S} {M T W T F S S}}
+ {-foreground black black}
+ {-height 300 300}
+ {-outline black black}
+ {-selectcolor blue blue}
+ {-selectthickness 2 2}
+ {-startday monday monday}
+ {-sticky w w}
+ {-sticky nw nw}
+ {-sticky n n}
+ {-sticky ne ne}
+ {-sticky e e}
+ {-sticky se se}
+ {-sticky s s}
+ {-sticky sw sw}
+ {-sticky news news}
+ {-titlefont -*-helvetica-bold-r-normal--*-140-* -*-helvetica-bold-r-normal--*-140-*}
+ {-weekdaybackground mistyrose mistyrose}
+ {-weekendbackground white white}
+ {-width 350 350}
+ {-textbackground GhostWhite GhostWhite}
+ {-textbackground #d9d9d9 #d9d9d9}} {
+ set option [lindex $test 0]
+ test Dateentry-2.$o "configuration options, $option" {
+ .de configure $option [lindex $test 1]
+ lindex [.de configure $option] 4
+ } [lindex $test 2]
+ update
+ incr o
+}
+
+#
+# Option tests which fail and produce errors.
+#
+foreach test {
+ {-iq bogus {bad iq option "bogus": should be high, average or low}}
+ {-gmt bogus {bad gmt option "bogus": should be boolean}}
+ {-childsitepos bogus {bad childsite option "bogus": should be n, e, s, or w}}} {
+ set option [lindex $test 0]
+ test Dateentry-2.$o "configuration options, $option" {
+ list [catch {.de configure $option [lindex $test 1]} msg] $msg
+ } [list 1 [lindex $test 2]]
+ incr o
+}
+
+#
+# Method tests which are successful.
+#
+foreach test {
+ {{.de childsite} {.de.lwchildsite}}
+ {{.de show 03/03/1960} {}}
+ {{.de get} {03/03/1960}}
+ {{.de get -string} {03/03/1960}}
+ {{.de isvalid} {1}}
+ {{.de component date delete 0 end} {}}
+ {{.de component date insert end 03/32/1960} {}}
+ {{.de isvalid} {0}}
+ {{.de show 03/03/1960} {}}
+ {{.de show now} {}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Dateentry-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 0 [lindex $test 1]]
+ update
+ incr m
+}
+
+test Dateentry-3.$m "object methods, clock clicks" {
+ set clicks [clock scan "06/08/1964"]
+ .de show $clicks
+ update
+ .de get
+} {06/08/1964}
+incr m
+
+#
+# Method tests which fail and produce errors
+#
+foreach test {
+ {{.de get bogus} {bad format option "bogus": should be -string or -clicks}}
+ {{.de show bogus} {bad date: "bogus", must be a valid date string, clock clicks value or the keyword now}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Dateentry-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 1 [lindex $test 1]]
+ incr m
+}
+
+#
+# Conclusion of constrcution/destruction tests
+#
+test Dateentry-1.$c {Dateentry destruction} {
+ destroy .de
+ update
+} {}
+
+incr c
+
+test Dateentry-1.$c {Dateentry construction} {
+ iwidgets::dateentry .de
+ pack .de -padx 10 -pady 10
+ update
+} {}
+
+incr c
+
+test Dateentry-1.$c {Dateentry destruction} {
+ destroy .de
+ update
+} {}
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/tests/datefield.test b/iwidgets/tests/datefield.test
new file mode 100644
index 00000000000..023990c5925
--- /dev/null
+++ b/iwidgets/tests/datefield.test
@@ -0,0 +1,203 @@
+# This file is a Tcl script to test out [incr Widgets] Datefield class.
+# It is organized in the standard fashion for Tcl tests with the following
+# notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+#
+# Copyright (c) 1995 DSC Technologies Corporation
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# @(#) $Id$
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+wm geometry . {}
+raise .
+
+set c 1
+set o 1
+set m 1
+
+#
+# Initial construction test
+#
+test Datefield-1.$c {Datefield construction} {
+ iwidgets::Datefield .df -labeltext "Date Field"
+ pack .df -padx 10 -pady 10 -fill both -expand yes
+ update
+} {}
+
+incr c
+
+#
+# Option tests which are successful. First confirm proper number of options.
+#
+test Datefield-2.$o {configuration option} {
+ llength [.df configure]
+} {28}
+
+incr o
+
+foreach test {
+ {-background #d9d9d9 #d9d9d9}
+ {-borderwidth 4 4}
+ {-borderwidth 2 2}
+ {-command {.df configure -background red} {.df configure -background red}}
+ {-cursor gumby gumby}
+ {-exportselection 0 0}
+ {-foreground Green Green}
+ {-foreground Black Black}
+ {-highlightcolor Red Red}
+ {-highlightthickness 2 2}
+ {-insertbackground Yellow Yellow}
+ {-insertbackground Black Black}
+ {-int yes yes}
+ {-int no no}
+ {-iq average average}
+ {-iq high high}
+ {-justify right right}
+ {-justify center center}
+ {-justify left left}
+ {-labelmargin 5 5}
+ {-labelpos w w}
+ {-labelpos nw nw}
+ {-labelpos n n}
+ {-labelpos ne ne}
+ {-labelpos e e}
+ {-labelpos se se}
+ {-labelpos s s}
+ {-labelpos sw sw}
+ {-labeltext Label Label}
+ {-relief raised raised}
+ {-relief sunken sunken}
+ {-gmt true true}
+ {-gmt false false}
+ {-gmt on on}
+ {-gmt off off}
+ {-gmt 1 1}
+ {-gmt 0 0}
+ {-gmt yes yes}
+ {-gmt no no}
+ {-sticky w w}
+ {-sticky nw nw}
+ {-sticky n n}
+ {-sticky ne ne}
+ {-sticky e e}
+ {-sticky se se}
+ {-sticky s s}
+ {-sticky sw sw}
+ {-sticky news news}
+ {-textbackground GhostWhite GhostWhite}
+ {-textbackground #d9d9d9 #d9d9d9}} {
+ set option [lindex $test 0]
+ test Datefield-2.$o "configuration options, $option" {
+ .df configure $option [lindex $test 1]
+ lindex [.df configure $option] 4
+ } [lindex $test 2]
+ update
+ incr o
+}
+
+#
+# Option tests which fail and produce errors.
+#
+foreach test {
+ {-iq bogus {bad iq option "bogus": should be high, average or low}}
+ {-gmt bogus {bad gmt option "bogus": should be boolean}}
+ {-childsitepos bogus {bad childsite option "bogus": should be n, e, s, or w}}} {
+ set option [lindex $test 0]
+ test Datefield-2.$o "configuration options, $option" {
+ list [catch {.df configure $option [lindex $test 1]} msg] $msg
+ } [list 1 [lindex $test 2]]
+ incr o
+}
+
+#
+# Method tests which are successful.
+#
+foreach test {
+ {{.df childsite} {.df.lwchildsite}}
+ {{.df show 03/03/1960} {}}
+ {{.df get} {03/03/1960}}
+ {{.df get -string} {03/03/1960}}
+ {{.df isvalid} {1}}
+ {{.df component date delete 0 end} {}}
+ {{.df component date insert end 03/32/1960} {}}
+ {{.df isvalid} {0}}
+ {{.df show 03/03/1960} {}}
+ {{.df show now} {}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Datefield-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 0 [lindex $test 1]]
+ update
+ incr m
+}
+
+test Datefield-3.$m "object methods, clock clicks" {
+ set clicks [clock scan "06/08/1964"]
+ .df show $clicks
+ update
+ .df get
+} {06/08/1964}
+incr m
+
+#
+# Method tests which fail and produce errors
+#
+foreach test {
+ {{.df get bogus} {bad format option "bogus": should be -string or -clicks}}
+ {{.df show bogus} {bad date: "bogus", must be a valid date string, clock clicks value or the keyword now}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Datefield-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 1 [lindex $test 1]]
+ incr m
+}
+
+#
+# Conclusion of constrcution/destruction tests
+#
+test Datefield-1.$c {Datefield destruction} {
+ destroy .df
+ update
+} {}
+
+incr c
+
+test Datefield-1.$c {Datefield construction} {
+ iwidgets::datefield .df
+ pack .df -padx 10 -pady 10
+ update
+} {}
+
+incr c
+
+test Datefield-1.$c {Datefield destruction} {
+ destroy .df
+ update
+} {}
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/tests/defs b/iwidgets/tests/defs
new file mode 100644
index 00000000000..d2ac67b9024
--- /dev/null
+++ b/iwidgets/tests/defs
@@ -0,0 +1,220 @@
+# This file contains support code for the Tcl test suite. It is
+# normally sourced by the individual files in the test suite before
+# they run their tests. This improved approach to testing was designed
+# and initially implemented by Mary Ann May-Pumphrey of Sun Microsystems.
+#
+# Copyright (c) 1994 Sun Microsystems, Inc.
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# @(#) defs 1.7 94/12/17 15:53:52
+# ------------------------------------------------------------------
+# THIS SCRIPT IS NOW DEPRECATED! It is kept for older Tcl
+# installations that don't have the "tcltest" package.
+# Instead, use "package require tcltest" in the test suite.
+# ------------------------------------------------------------------
+
+package require Iwidgets
+
+if ![info exists VERBOSE] {
+ set VERBOSE 0
+}
+if ![info exists DELAY] {
+ set DELAY 0
+}
+if ![info exists TESTS] {
+ set TESTS {}
+}
+
+# Some of the tests don't work on some system configurations due to
+# configuration quirks, not due to Tk problems; in order to prevent
+# false alarms, these tests are only run in the master development
+# directory for Tk. The presence of a file "doAllTests" in this
+# directory is used to indicate that these tests should be run.
+
+set doNonPortableTests [file exists doAllTests]
+
+proc print_verbose {test_name test_description contents_of_test code answer} {
+ puts stdout "\n"
+ puts stdout "==== $test_name $test_description"
+ puts stdout "==== Contents of test case:"
+ puts stdout "$contents_of_test"
+ if {$code != 0} {
+ if {$code == 1} {
+ puts stdout "==== Test generated error:"
+ puts stdout $answer
+ } elseif {$code == 2} {
+ puts stdout "==== Test generated return exception; result was:"
+ puts stdout $answer
+ } elseif {$code == 3} {
+ puts stdout "==== Test generated break exception"
+ } elseif {$code == 4} {
+ puts stdout "==== Test generated continue exception"
+ } else {
+ puts stdout "==== Test generated exception $code; message was:"
+ puts stdout $answer
+ }
+ } else {
+ puts stdout "==== Result was:"
+ puts stdout "$answer"
+ }
+}
+
+proc test {test_name test_description contents_of_test passing_results} {
+ global VERBOSE
+ global TESTS
+ global DELAY
+ if {[string compare $TESTS ""] != 0} then {
+ set ok 0
+ foreach test $TESTS {
+ if [string match $test $test_name] then {
+ set ok 1
+ break
+ }
+ }
+ if !$ok then return
+ }
+ set code [catch {uplevel $contents_of_test} answer]
+ if {$code != 0} {
+ print_verbose $test_name $test_description $contents_of_test \
+ $code $answer
+ } elseif {[string compare $answer $passing_results] == 0} then {
+ if $VERBOSE then {
+ print_verbose $test_name $test_description $contents_of_test \
+ $code $answer
+ puts stdout "++++ $test_name PASSED"
+ }
+ } else {
+ print_verbose $test_name $test_description $contents_of_test \
+ $code $answer
+ puts stdout "---- Result should have been:"
+ puts stdout "$passing_results"
+ puts stdout "---- $test_name FAILED"
+ }
+ after $DELAY
+}
+
+#
+# Like test, but does reg expr check on the results.
+# Useful when the result must follow a pattern but some exact details
+# are not necessary, like an internal number appended to a frame, etc.
+#
+proc test_pattern {test_name test_description contents_of_test passing_results} {
+ global VERBOSE
+ global TESTS
+ if {[string compare $TESTS ""] != 0} then {
+ set ok 0
+ foreach test $TESTS {
+ if [string match $test $test_name] then {
+ set ok 1
+ break
+ }
+ }
+ if !$ok then return
+ }
+
+ set code [catch {uplevel $contents_of_test} answer]
+
+ if {$code != 0} {
+ print_verbose $test_name $test_description $contents_of_test \
+ $code $answer
+ } elseif {[regexp -- [lindex $passing_results 1] [lindex $answer 1]] == 1 } {
+ if $VERBOSE then {
+ print_verbose $test_name $test_description $contents_of_test \
+ $code $answer
+ puts stdout "++++ $test_name PASSED"
+ }
+ } else {
+ print_verbose $test_name $test_description $contents_of_test \
+ $code $answer
+ puts stdout "---- Result should have been:"
+ puts stdout "$passing_results"
+ puts stdout "**** $test_name FAILED ****"
+ }
+}
+
+proc dotests {file args} {
+ global TESTS
+ set savedTests $TESTS
+ set TESTS $args
+ source $file
+ set TESTS $savedTests
+}
+
+# If the main window isn't already mapped (e.g. because the tests are
+# being run automatically) , specify a precise size for it so that the
+# user won't have to position it manually.
+
+if {![winfo ismapped .]} {
+ wm geometry . +0+0
+ update
+}
+
+# The following code can be used to perform tests involving a second
+# process running in the background.
+
+# Locate tktest executable
+global argv0
+if {0} {
+puts "file executable $argv0...[file executable $argv0]"
+if { [file executable $argv0] } {
+ if { [string index $argv0 0] == "/" } {
+ set tktest $argv0
+ } else {
+ set tktest "[pwd]/$argv0"
+ }
+} elseif { [file executable ../$argv0] } {
+ set tktest "[pwd]/../$argv0"
+} else {
+ set tktest {}
+ puts "Unable to find tktest executable, skipping multiple process tests."
+}
+} else {set tktest ../tktest}
+
+# Create background process
+proc setupbg {{args ""}} {
+ global tktest fd bgData
+ set fd [open "|$tktest -geometry +0+0 $args" r+]
+ puts $fd "puts foo; flush stdout"
+ flush $fd
+ gets $fd
+ fileevent $fd readable bgReady
+}
+
+# Send a command to the background process, catching errors and
+# flushing I/O channels
+proc dobg {command} {
+ global fd bgData bgDone
+ puts $fd "catch {$command} msg; update; puts \$msg; puts **DONE**; flush stdout"
+ flush $fd
+ set bgDone 0
+ set bgData {}
+ tkwait variable bgDone
+ set bgData
+}
+
+# Data arrived from background process. Check for special marker
+# indicating end of data for this command, and make data available
+# to dobg procedure.
+proc bgReady {} {
+ global fd bgData bgDone
+ set x [gets $fd]
+ if [eof $fd] {
+ fileevent $fd readable {}
+ set bgDone 1
+ } elseif {$x == "**DONE**"} {
+ set bgDone 1
+ } else {
+ append bgData $x
+ }
+}
+
+# Exit the background process, and close the pipes
+proc cleanupbg {} {
+ global fd
+ catch {
+ puts $fd "exit"
+ close $fd
+ }
+}
diff --git a/iwidgets/tests/dialog.test b/iwidgets/tests/dialog.test
new file mode 100644
index 00000000000..cc2da551aed
--- /dev/null
+++ b/iwidgets/tests/dialog.test
@@ -0,0 +1,147 @@
+# This file is a Tcl script to test out [incr Widgets] Dialog class.
+# It is organized in the standard fashion for Tcl tests with the following
+# notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+# 4.x - Other tests
+#
+# Copyright (c) 1995 DSC Technologies Corporation
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# @(#) $Id$
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+wm geometry . {}
+raise .
+
+set c 1
+set o 1
+set m 1
+
+#
+# Initial construction test
+#
+test Dialog-1.$c {Dialog construction} {
+ iwidgets::Dialog .dlg
+
+ listbox [.dlg childsite].lb -relief sunken
+ pack [.dlg childsite].lb -fill both -expand yes
+
+ .dlg activate
+} {}
+
+incr c
+
+#
+# Option tests which are successful.
+#
+test Dialog-2.$o {configuration option} {
+ llength [.dlg configure]
+} {17}
+
+incr o
+
+foreach test {
+ {-background #d9d9d9 #d9d9d9}
+ {-width 400 400}
+ {-height 400 400}
+ {-buttonboxpadx 10 10}
+ {-buttonboxpady 10 10}
+ {-buttonboxpos n n}
+ {-buttonboxpos e e}
+ {-buttonboxpos w w}
+ {-buttonboxpos s s}
+ {-cursor gumby gumby}
+ {-modality global global}
+ {-modality application application}
+ {-modality none none}
+ {-padx 15 15}
+ {-pady 15 15}
+ {-separator off off}
+ {-thickness 5 5}
+ {-width 0 0}
+ {-height 0 0}
+ {-separator on on}
+ {-title Dialog Dialog}} {
+ set option [lindex $test 0]
+ test Dialog-2.$o "configuration options, $option" {
+ .dlg configure $option [lindex $test 1]
+ lindex [.dlg configure $option] 4
+ } [lindex $test 2]
+ update
+ incr o
+}
+
+#
+# Method tests which are successful.
+#
+foreach test {
+ {{.dlg childsite} {.dlg.shellchildsite.dschildsite}}
+ {{.dlg hide Help} {}}
+ {{.dlg hide Cancel} {}}
+ {{.dlg default Apply} {}}
+ {{.dlg buttonconfigure Help -state disabled} {}}
+ {{.dlg show Cancel} {}}
+ {{.dlg deactivate} {}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Dialog-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 0 [lindex $test 1]]
+ update
+ incr m
+}
+
+#
+# Conclusion of constrcution/destruction tests
+#
+test Dialog-1.$c {Dialog destruction} {
+ destroy .dlg
+ update
+} {}
+
+incr c
+
+test Dialog-1.$c {Dialog construction} {
+ iwidgets::Dialog .dlg
+ update
+} {}
+
+incr c
+
+test Dialog-1.$c {Dialog destruction} {
+ destroy .dlg
+ update
+} {}
+
+incr c
+
+test Dialog-1.$c {Dialog destruction} {
+ iwidgets::dialog .dlg
+ destroy .dlg
+ update
+} {}
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/tests/dialogshell.test b/iwidgets/tests/dialogshell.test
new file mode 100644
index 00000000000..7cee52a307a
--- /dev/null
+++ b/iwidgets/tests/dialogshell.test
@@ -0,0 +1,240 @@
+# This file is a Tcl script to test out [incr Widgets] Dialogshell class.
+# It is organized in the standard fashion for Tcl tests with the following
+# notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+# 4.x - Other tests
+#
+# Copyright (c) 1995 DSC Technologies Corporation
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# @(#) $Id$
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+wm geometry . {}
+raise .
+
+set c 1
+set o 1
+set m 1
+
+#
+# Initial construction test
+#
+test Dialogshell-1.$c {Dialogshell construction} {
+ iwidgets::Dialogshell .ds
+ .ds add OK -text "OK"
+ .ds add Cancel -text "Cancel"
+ .ds default OK
+
+ listbox [.ds childsite].lb -relief sunken
+ pack [.ds childsite].lb -fill both -expand yes
+
+ .ds activate
+} {}
+
+incr c
+
+#
+# Option tests which are successful.
+#
+test Dialogshell-2.$o {configuration option} {
+ llength [.ds configure]
+} {17}
+
+incr o
+
+foreach test {
+ {-background #d9d9d9 #d9d9d9}
+ {-width 300 300}
+ {-height 300 300}
+ {-buttonboxpadx 10 10}
+ {-buttonboxpady 10 10}
+ {-buttonboxpos n n}
+ {-buttonboxpos e e}
+ {-buttonboxpos w w}
+ {-buttonboxpos s s}
+ {-cursor gumby gumby}
+ {-modality global global}
+ {-modality application application}
+ {-modality none none}
+ {-separator off off}
+ {-padx 15 15}
+ {-pady 15 15}
+ {-thickness 5 5}
+ {-width 0 0}
+ {-height 0 0}
+ {-separator on on}
+ {-title "Dialog Shell" "Dialog Shell"}} {
+ set option [lindex $test 0]
+ test Dialogshell-2.$o "configuration options, $option" {
+ .ds configure $option [lindex $test 1]
+ lindex [.ds configure $option] 4
+ } [lindex $test 2]
+ update
+ incr o
+}
+
+#
+# Option tests which fail and produce errors.
+#
+foreach test {
+ {-buttonboxpos bogus {bad buttonboxpos option "bogus": should be n, s, e, or w}}
+ {-modality bogus {bad modality option "bogus": should be none, application, or global}}} {
+ set option [lindex $test 0]
+ test Dialogshell-2.$o "configuration options, $option" {
+ list [catch {.ds configure $option [lindex $test 1]} msg] $msg
+ } [list 1 [lindex $test 2]]
+ incr o
+}
+
+#
+# Method tests which are successful.
+#
+foreach test {
+ {{.ds childsite} {.ds.shellchildsite.dschildsite}}
+ {{.ds add Help -text Help} {}}
+ {{.ds insert 1 Apply -text Apply} {}}
+ {{.ds center .} {}}
+ {{.ds delete Help} {}}
+ {{.ds hide Apply} {}}
+ {{.ds default Cancel} {}}
+ {{.ds center} {}}
+ {{.ds show Apply} {}}
+ {{.ds invoke OK} {}}
+ {{.ds buttonconfigure OK -text Ok} {}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Dialogshell-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 0 [lindex $test 1]]
+ update
+ incr m
+}
+
+#
+# Method tests which fail and produce errors
+#
+test Dialogshell-3.$m "object methods, activate already active" {
+ list [catch {.ds activate} msg] $msg
+} [list 0 {}]
+update
+incr m
+
+test Dialogshell-3.$m "object methods, deactivate" {
+ list [catch {.ds deactivate} msg] $msg
+} [list 0 {}]
+update
+incr m
+
+#
+# Destruction test
+#
+test Dialogshell-1.$c {Dialogshell destruction} {
+ destroy .ds
+ update
+} {}
+incr c
+
+#
+# Global modality test.
+#
+test Dialogshell-4.2 "global modality, activation, and deactivation" {
+ iwidgets::dialogshell .ds -modality global
+ .ds add OK -text "OK"
+ .ds add Cancel -text "Cancel"
+ .ds default OK
+ pack [label [.ds childsite].l -text "Global Modal Dialogshell"]
+ after 2000 {.ds deactivate Test}
+ list [catch {.ds activate} msg] $msg
+} [list 0 Test]
+update
+
+#
+# Destruction test
+#
+test Dialogshell-1.$c {Dialogshell destruction} {
+ destroy .ds
+ update
+} {}
+incr c
+
+#
+# None modality test.
+#
+test Dialogshell-4.3 "no modality, activation, and deactivation" {
+ iwidgets::dialogshell .ds -modality none
+ .ds add OK -text "OK"
+ .ds add Cancel -text "Cancel"
+ .ds default OK
+ pack [label [.ds childsite].l -text "Non-Modal Dialogshell"]
+ .ds activate
+ update
+ after 2000
+ .ds deactivate
+} {}
+update
+
+#
+# Destruction test
+#
+test Dialogshell-1.$c {Dialogshell destruction} {
+ destroy .ds
+ update
+} {}
+
+incr c
+
+#
+# Application modality test.
+#
+test Dialogshell-4.4 "application modality, activation, and deactivation" {
+ iwidgets::dialogshell .ds -modality application
+ .ds add OK -text "OK"
+ .ds add Cancel -text "Cancel"
+ .ds default OK
+ pack [label [.ds childsite].l -text "Application Modal Dialogshell"]
+ after 2000 {.ds deactivate Test}
+ list [catch {.ds activate} msg] $msg
+} [list 0 Test]
+update
+
+#
+# Destruction test
+#
+test Dialogshell-1.$c {Dialogshell destruction} {
+ destroy .ds
+ update
+} {}
+
+incr c
+
+test Dialogshell-1.$c {Dialogshell destruction} {
+ iwidgets::dialogshell .ds
+ destroy .ds
+ update
+} {}
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/tests/disjointlistbox.test b/iwidgets/tests/disjointlistbox.test
new file mode 100644
index 00000000000..0cee69b3d9c
--- /dev/null
+++ b/iwidgets/tests/disjointlistbox.test
@@ -0,0 +1,116 @@
+# This file is a Tcl script to test out [incr Widgets] Disjointlistbox class.
+# It is organized in the standard fashion for Tcl tests with the following
+# notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+#
+# Copyright (c) 1995 DSC Technologies Corporation
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# @(#) $Id$
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+wm geometry . {}
+raise .
+
+set c 1
+set o 1
+set m 1
+
+#
+# Initial construction test
+#
+test Disjointlistbox-1.$c {Disjointlistbox construction} {
+ iwidgets::Disjointlistbox .lf
+ pack .lf -fill both -expand yes
+ update
+} {}
+
+incr c
+
+#
+# Option tests which are successful.
+#
+test Disjointlistbox-2.$o {configuration option} {
+ llength [.lf configure]
+} {30}
+
+incr o
+
+foreach test {
+ {-lhslabeltext "LHS" "LHS"}
+ {-lhslabeltext "Available" "Available"}
+ {-lhslabeltext "Don't Print" "Don't Print"}
+ {-rhslabeltext "RHS" "RHS"}
+ {-rhslabeltext "Current" "Current"}
+ {-rhslabeltext "Print" "Print"}
+ {-lhssortoption "none" "none"}
+ {-rhssortoption "none" "none"}
+ {-buttonplacement bottom bottom}
+ {-buttonplacement center center}
+ } {
+ set option [lindex $test 0]
+ test Disjointlistbox-1.$o "configuration options, $option" {
+ .lf configure $option [lindex $test 1]
+ lindex [.lf configure $option] 4
+ } [lindex $test 2]
+ update
+ incr o
+ }
+
+#
+# Method tests which are successful.
+#
+test Disjointlistbox-1.$c {Disjointlistbox destruction} {
+ destroy .lf
+ update
+} {}
+
+incr c
+
+test Disjointlistbox-1.$c {Disjointlistbox construction} {
+ iwidgets::disjointlistbox .lf -lhslabeltext "Don't Print" -rhslabeltext "Print"
+ pack .lf -fill both -expand yes
+ update
+} {}
+
+incr c
+
+test Disjointlistbox-1.$c {Disjointlistbox destruction} {
+ destroy .lf
+ update
+} {}
+
+incr c
+
+test Disjointlistbox-1.$c {Disjointlistbox construction} {
+ iwidgets::disjointlistbox .lf
+ pack .lf
+ destroy .lf
+ update
+} {}
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/tests/entryfield.test b/iwidgets/tests/entryfield.test
new file mode 100644
index 00000000000..e383ee71f82
--- /dev/null
+++ b/iwidgets/tests/entryfield.test
@@ -0,0 +1,198 @@
+# This file is a Tcl script to test out [incr Widgets] Entryfield class.
+# It is organized in the standard fashion for Tcl tests with the following
+# notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+#
+# Copyright (c) 1995 DSC Technologies Corporation
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# @(#) $Id$
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+wm geometry . {}
+raise .
+
+set c 1
+set o 1
+set m 1
+
+#
+# Initial construction test
+#
+test Entryfield-1.$c {Entryfield construction} {
+ iwidgets::Entryfield .ef -labeltext "Entry Field"
+ .ef insert end test
+ pack .ef -padx 10 -pady 10 -fill both -expand yes
+ update
+} {}
+
+incr c
+
+#
+# Option tests which are successful.
+#
+test Entryfield-2.$o {configuration option} {
+ llength [.ef configure]
+} {40}
+
+incr o
+
+foreach test {
+ {-background #d9d9d9 #d9d9d9}
+ {-borderwidth 4 4}
+ {-borderwidth 2 2}
+ {-childsitepos e e}
+ {-childsitepos s s}
+ {-childsitepos w w}
+ {-childsitepos n n}
+ {-command {.ef configure -background red} {.ef configure -background red}}
+ {-cursor gumby gumby}
+ {-exportselection 0 0}
+ {-fixed 10 10}
+ {-fixed 0 0}
+ {-foreground Green Green}
+ {-foreground Black Black}
+ {-highlightcolor Red Red}
+ {-highlightthickness 2 2}
+ {-insertbackground Yellow Yellow}
+ {-insertbackground Black Black}
+ {-insertborderwidth 1 1}
+ {-insertborderwidth 0 0}
+ {-insertofftime 400 400}
+ {-insertontime 700 700}
+ {-insertwidth 3 3}
+ {-invalid {.ef configure -background Green} {.ef configure -background Green}}
+ {-justify right right}
+ {-justify center center}
+ {-justify left left}
+ {-labelmargin 5 5}
+ {-labelpos w w}
+ {-labelpos nw nw}
+ {-labelpos n n}
+ {-labelpos ne ne}
+ {-labelpos e e}
+ {-labelpos se se}
+ {-labelpos s s}
+ {-labelpos sw sw}
+ {-labeltext Label Label}
+ {-pasting 1 1}
+ {-relief raised raised}
+ {-relief sunken sunken}
+ {-state disabled disabled}
+ {-state normal normal}
+ {-sticky w w}
+ {-sticky nw nw}
+ {-sticky n n}
+ {-sticky ne ne}
+ {-sticky e e}
+ {-sticky se se}
+ {-sticky s s}
+ {-sticky sw sw}
+ {-sticky news news}
+ {-textbackground GhostWhite GhostWhite}
+ {-validate numeric {::iwidgets::Entryfield::numeric %c}}
+ {-validate alphabetic {::iwidgets::Entryfield::alphabetic %c}}
+ {-width 30 30}} {
+ set option [lindex $test 0]
+ test Entryfield-2.$o "configuration options, $option" {
+ .ef configure $option [lindex $test 1]
+ lindex [.ef configure $option] 4
+ } [lindex $test 2]
+ update
+ incr o
+}
+
+#
+# Option tests which fail and produce errors.
+#
+foreach test {
+ {-fixed bogus {bad fixed option "bogus", should be positive integer}}
+ {-childsitepos bogus {bad childsite option "bogus": should be n, e, s, or w}}} {
+ set option [lindex $test 0]
+ test Entryfield-2.$o "configuration options, $option" {
+ list [catch {.ef configure $option [lindex $test 1]} msg] $msg
+ } [list 1 [lindex $test 2]]
+ incr o
+}
+
+#
+# Method tests which are successful.
+#
+foreach test {
+ {{.ef childsite} {.ef.lwchildsite.efchildsite}}
+ {{.ef clear} {}}
+ {{.ef insert end "Test String"} {}}
+ {{.ef get} {Test String}}
+ {{.ef delete 0 end} {}}
+ {{.ef insert end "Another Test"} {}}
+ {{.ef icursor end} {}}
+ {{.ef index end} 12}
+ {{.ef selection from 0} {}}
+ {{.ef selection to end} {}}
+ {{.ef xview 3} {}}
+ {{.ef clear} {}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Entryfield-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 0 [lindex $test 1]]
+ update
+ incr m
+}
+
+#
+# Conclusion of constrcution/destruction tests
+#
+test Entryfield-1.$c {Entryfield destruction} {
+ destroy .ef
+ update
+} {}
+
+incr c
+
+test Entryfield-1.$c {Entryfield construction} {
+ iwidgets::entryfield .ef -width 12 -validate numeric
+ pack .ef -padx 10 -pady 10
+ update
+} {}
+
+incr c
+
+test Entryfield-1.$c {Entryfield destruction} {
+ destroy .ef
+ update
+} {}
+
+incr c
+
+test Entryfield-1.$c {Entryfield destruction} {
+ iwidgets::entryfield .ef
+ pack .ef
+ destroy .ef
+ update
+} {}
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/tests/extbutton.test b/iwidgets/tests/extbutton.test
new file mode 100644
index 00000000000..395932f7e40
--- /dev/null
+++ b/iwidgets/tests/extbutton.test
@@ -0,0 +1,150 @@
+# This file is a Tcl script to test out [incr Widgets] Extbutton class.
+# It is organized in the standard fashion for Tcl tests with the following
+# notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+#
+# Copyright (c) 1995 DSC Technologies Corporation
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# @(#) $Id$
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if {$::tk_version < 8.4} {
+ puts "*****"
+ puts " --> Skipping extbutton tests. This iwidget only available with\
+ Tk 8.4 or greater."
+ puts "*****"
+ ::tcltest::cleanupTests
+ exit
+}
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+wm geometry . {}
+raise .
+
+set c 1
+set o 1
+set m 1
+
+#
+# Initial construction test
+#
+test Extbutton-1.$c {Extbutton construction} {
+ iwidgets::Extbutton .eb
+ pack .eb -padx 10 -pady 10 -expand yes
+ update
+} {}
+
+incr c
+
+#
+# Option tests which are successful.
+#
+test Extbutton-2.$o {configuration option} {
+ llength [.eb configure]
+} {21}
+
+incr o
+
+foreach test {
+ {-activebackground #ececec #ececec}
+ {-activeforeground Black Black}
+ {-background #d9d9d9 #d9d9d9}
+ {-bd 2 2}
+ {-bitmap info info}
+ {-bitmapforeground blue blue}
+ {-command {} {}}
+ {-cursor {} {}}
+ {-defaultring 1 1}
+ {-defaultringpad 4 4}
+ {-disabledforeground #a3a3a3 #a3a3a3}
+ {-font {Helvetica -12 bold} {Helvetica -12 bold}}
+ {-foreground Black Black}
+ {-justify center center}
+ {-relief raised raised}
+ {-ringbackground #d9d9d9 #d9d9d9}
+ {-state normal normal}
+ {-text {Hello World} {Hello World}}} {
+ set option [lindex $test 0]
+ test Extbutton-2.$o "configuration options, $option" {
+ .eb configure $option [lindex $test 1]
+ lindex [.eb configure $option] 4
+ } [lindex $test 2]
+ update
+ incr o
+}
+
+#
+# Option tests which fail and produce errors.
+#
+foreach test {
+ {-image bogus {image "bogus" doesn't exist}}
+ {-bitmap bogus {bitmap "bogus" not defined}}} {
+ set option [lindex $test 0]
+ test Extbutton-2.$o "configuration options, $option" {
+ list [catch {.eb configure $option [lindex $test 1]} msg] $msg
+ } [list 1 [lindex $test 2]]
+ incr o
+}
+
+#
+# Method tests which are successful.
+#
+foreach test {
+ {{.eb invoke} {}}
+ {{.eb flash} {}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Extbutton-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 0 [lindex $test 1]]
+ update
+ incr m
+}
+
+#
+# Conclusion of constrcution/destruction tests
+#
+test Extbutton-1.$c {Extbutton destruction} {
+ destroy .eb
+ update
+} {}
+
+incr c
+
+test Extbutton-1.$c {Extbutton construction} {
+ iwidgets::extbutton .eb
+ pack .eb -padx 10 -pady 10
+ update
+} {}
+
+incr c
+
+test Extbutton-1.$c {Extbutton destruction} {
+ destroy .eb
+ update
+} {}
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/tests/extfileselectionbox.test b/iwidgets/tests/extfileselectionbox.test
new file mode 100644
index 00000000000..87f81901944
--- /dev/null
+++ b/iwidgets/tests/extfileselectionbox.test
@@ -0,0 +1,209 @@
+# This file is a Tcl script to test out [incr Widgets] Extfileselectionbox
+# class. It is organized in the standard fashion for Tcl tests with the
+# following notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+#
+# Copyright (c) 1995 DSC Technologies Corporation
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# @(#) $Id$
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+wm geometry . {}
+raise .
+
+set c 1
+set o 1
+set m 1
+
+#
+# Initial construction test
+#
+test Extfileselectionbox-1.$c {Extfileselectionbox construction} {
+ iwidgets::Extfileselectionbox .fsb
+ pack .fsb -padx 10 -pady 10 -fill both -expand yes
+ update
+} {}
+
+incr c
+
+#
+# Option tests which are successful.
+#
+test Extfileselectionbox-2.$o {configuration option} {
+ llength [.fsb configure]
+} {48}
+
+incr o
+
+foreach test {
+ {-activebackground #ececec #ececec}
+ {-activerelief raised raised}
+ {-background #d9d9d9 #d9d9d9}
+ {-borderwidth 2 2}
+ {-textbackground GhostWhite GhostWhite}
+ {-childsitepos n n}
+ {-childsitepos s s}
+ {-childsitepos e e}
+ {-childsitepos w w}
+ {-childsitepos top top}
+ {-childsitepos bottom bottom}
+ {-cursor gumby gumby}
+ {-directory {..} {..}}
+ {-foreground Black Black}
+ {-highlightcolor black black}
+ {-highlightthickness 2 2}
+ {-insertbackground Black Black}
+ {-insertborderwidth 1 1}
+ {-insertofftime 300 300}
+ {-insertontime 600 600}
+ {-insertwidth 3 3}
+ {-dirslabel "Dirs Label" "Dirs Label"}
+ {-dirson no no}
+ {-dirson yes yes}
+ {-fileslabel "Files Label" "Files Label"}
+ {-fileson no no}
+ {-fileson yes yes}
+ {-filetype any any}
+ {-filetype directory directory}
+ {-filetype regular regular}
+ {-filterlabel "Filter Label" "Filter Label"}
+ {-filteron no no}
+ {-filteron yes yes}
+ {-directory ../tests ../tests}
+ {-mask *.* *.*}
+ {-nomatchstring {No Files} {No Files}}
+ {-labelfont -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-*}
+ {-selectbackground #e6ceb1 #e6ceb1}
+ {-selectborderwidth 1 1}
+ {-selectionlabel "Selection Label" "Selection Label"}
+ {-selectionon no no}
+ {-selectionon yes yes}
+ {-automount {export tmp_mnt} {export tmp_mnt}}
+ {-textfont -*-courier-medium-r-normal--*-120-* -*-courier-medium-r-normal--*-120-*}
+ {-troughcolor #c3c3c3 #c3c3c3}
+ {-width 400 400}
+ {-height 375 375}} {
+ set option [lindex $test 0]
+ test Extfileselectionbox-2.$o "configuration options, $option" {
+ .fsb configure $option [lindex $test 1]
+ lindex [.fsb configure $option] 4
+ } [lindex $test 2]
+ update
+ incr o
+}
+#
+# Option tests which fail and produce errors.
+#
+foreach test {
+ {-directory bogus {bad directory option "bogus": directory does not exist}}
+ {-filetype bogus {bad filetype option "bogus": should be regular, directory, or any}}} {
+ set option [lindex $test 0]
+ test Extfileselectionbox-2.$o "configuration options, $option" {
+ list [catch {.fsb configure $option [lindex $test 1]} msg] $msg
+ } [list 1 [lindex $test 2]]
+ incr o
+}
+
+#
+# Method tests which are successful.
+#
+foreach test {
+ {{.fsb childsite} {.fsb.fsbchildsite}}
+ {{.fsb get} {}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Extfileselectionbox-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 0 [lindex $test 1]]
+ update
+ incr m
+}
+
+#
+# Conclusion of constrcution/destruction tests
+#
+test Extfileselectionbox-1.$c {Extfileselectionbox destruction} {
+ destroy .fsb
+ update
+} {}
+
+
+incr c
+
+test Extfileselectionbox-1.$c {Extfileselectionbox construction} {
+ iwidgets::extfileselectionbox .fsb
+ pack .fsb -padx 10 -pady 10 -fill both -expand yes
+ update
+} {}
+
+
+incr c
+
+test Extfileselectionbox-1.$c {Extfileselectionbox destruction} {
+ destroy .fsb
+ update
+} {}
+
+incr c
+
+
+test Extfileselectionbox-1.$c {Extfileselectionbox destruction} {
+ iwidgets::extfileselectionbox .fsb
+ pack .fsb
+ destroy .fsb
+ update
+} {}
+
+#
+# Childsite tests
+#
+incr o
+
+test Extfileselectionbox-1.$o {Extfileselectionbox -childsitepos} {
+ iwidgets::extfileselectionbox .fsb
+ pack .fsb
+ update
+ label [.fsb childsite].lb -background red -text CS
+ pack [.fsb childsite].lb -fill both -expand yes
+ update
+
+ .fsb configure -childsitepos n
+ update
+ .fsb configure -childsitepos s
+ update
+ .fsb configure -childsitepos e
+ update
+ .fsb configure -childsitepos w
+ update
+ .fsb configure -childsitepos top
+ update
+ .fsb configure -childsitepos bottom
+ update
+ destroy .fsb
+} {}
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/tests/extfileselectiondialog.test b/iwidgets/tests/extfileselectiondialog.test
new file mode 100644
index 00000000000..372bc52d060
--- /dev/null
+++ b/iwidgets/tests/extfileselectiondialog.test
@@ -0,0 +1,218 @@
+# This file is a Tcl script to test out [incr Widgets] Extfileselectiondialog
+# class. It is organized in the standard fashion for Tcl tests with the
+# following notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+# 4.x - Other tests
+#
+# Copyright (c) 1995 DSC Technologies Corporation
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# @(#) $Id$
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+wm geometry . {}
+raise .
+
+set c 1
+set o 1
+set m 1
+
+#
+# Initial construction test
+#
+test Extfileselectiondialog-1.$c {Extfileselectiondialog construction} {
+ iwidgets::Extfileselectiondialog .fsd
+ .fsd activate
+} {}
+
+incr c
+
+#
+# Option tests which are successful.
+#
+test Extfileselectiondialog-2.$o {configuration option} {
+ llength [.fsd configure]
+} {52}
+
+incr o
+
+foreach test {
+ {-activebackground #ececec #ececec}
+ {-borderwidth 2 2}
+ {-childsitepos n n}
+ {-childsitepos s s}
+ {-childsitepos e e}
+ {-childsitepos w w}
+ {-childsitepos top top}
+ {-childsitepos bottom bottom}
+ {-cursor gumby gumby}
+ {-sashcursor xterm xterm}
+ {-directory {..} {..}}
+ {-textbackground GhostWhite GhostWhite}
+ {-foreground Black Black}
+ {-insertbackground Black Black}
+ {-insertborderwidth 1 1}
+ {-insertofftime 200 200}
+ {-insertontime 500 500}
+ {-insertwidth 3 3}
+ {-dirslabel "Dirs Label" "Dirs Label"}
+ {-dirson no no}
+ {-dirson yes yes}
+ {-fileslabel "Files Label" "Files Label"}
+ {-fileson no no}
+ {-directory ../tests ../tests}
+ {-mask *.* *.*}
+ {-nomatchstring {No Files} {No Files}}
+ {-fileson yes yes}
+ {-filetype any any}
+ {-filetype directory directory}
+ {-filetype regular regular}
+ {-filterlabel "Filter Label" "Filter Label"}
+ {-filteron no no}
+ {-filteron yes yes}
+ {-selectbackground #c3c3c3 #c3c3c3}
+ {-selectionlabel "Selection Label" "Selection Label"}
+ {-selectionon no no}
+ {-selectionon yes yes}
+ {-textfont -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-*}
+ {-labelfont -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-*}
+ {-background #d9d9d9 #d9d9d9}
+ {-buttonboxpos n n}
+ {-buttonboxpos e e}
+ {-buttonboxpos w w}
+ {-buttonboxpos s s}
+ {-cursor gumby gumby}
+ {-modality global global}
+ {-modality application application}
+ {-modality none none}
+ {-padx 15 15}
+ {-pady 15 15}
+ {-separator off off}
+ {-thickness 4 4}
+ {-separator on on}
+ {-title Extfileselectiondialog Extfileselectiondialog}} {
+ set option [lindex $test 0]
+ test Extfileselectiondialog-2.$o "configuration options, $option" {
+ .fsd configure $option [lindex $test 1]
+ lindex [.fsd configure $option] 4
+ } [lindex $test 2]
+ update
+ incr o
+}
+
+#
+# Option tests which fail and produce errors.
+#
+foreach test {
+ {-directory bogus {bad directory option "bogus": directory does not exist}}
+ {-filetype bogus {bad filetype option "bogus": should be regular, directory, or any}}} {
+ set option [lindex $test 0]
+ test FileSelectionBox-2.$o "configuration options, $option" {
+ list [catch {.fsd configure $option [lindex $test 1]} msg] $msg
+ } [list 1 [lindex $test 2]]
+ incr o
+}
+
+#
+# Method tests which are successful.
+#
+foreach test {
+ {{.fsd childsite} {.fsd.shellchildsite.dschildsite.fsb.fsbchildsite}}
+ {{.fsd hide Help} {}}
+ {{.fsd hide Cancel} {}}
+ {{.fsd default Apply} {}}
+ {{.fsd show Cancel} {}}
+ {{.fsd deactivate} {}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Extfileselectiondialog-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 0 [lindex $test 1]]
+ update
+ incr m
+}
+
+#
+# Conclusion of constrcution/destruction tests
+#
+test Extfileselectiondialog-1.$c {Extfileselectiondialog destruction} {
+ destroy .fsd
+ update
+} {}
+
+incr c
+
+test Extfileselectiondialog-1.$c {Extfileselectiondialog construction} {
+ iwidgets::extfileselectiondialog .fsd
+ update
+} {}
+
+incr c
+
+test Extfileselectiondialog-1.$c {Extfileselectiondialog destruction} {
+ destroy .fsd
+ update
+} {}
+
+incr c
+
+test Extfileselectiondialog-1.$c {Extfileselectiondialog destruction} {
+ iwidgets::extfileselectiondialog .fsd
+ destroy .fsd
+ update
+} {}
+
+#
+# Childsite tests
+#
+incr o
+
+test Extfileselectiondialog-1.$o {Extfileselectiondialog -childsitepos} {
+ iwidgets::extfileselectiondialog .fsd
+ .fsd activate
+ update
+ label [.fsd childsite].lb -background red -text CS
+ pack [.fsd childsite].lb -fill both -expand yes
+ update
+
+ .fsd configure -childsitepos n
+ update
+ .fsd configure -childsitepos s
+ update
+ .fsd configure -childsitepos e
+ update
+ .fsd configure -childsitepos w
+ update
+ .fsd configure -childsitepos top
+ update
+ .fsd configure -childsitepos bottom
+ update
+ .fsd deactivate
+ update
+ destroy .fsd
+} {}
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/tests/feedback.test b/iwidgets/tests/feedback.test
new file mode 100644
index 00000000000..680cc7da667
--- /dev/null
+++ b/iwidgets/tests/feedback.test
@@ -0,0 +1,157 @@
+# This file is a Tcl script to test out [incr Widgets] feedback class.
+# It is organized in the standard fashion for Tcl tests with the following
+# notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+#
+# Copyright (c) 1995 DSC Technologies Corporation
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# @(#) $Id: feedback.test
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+wm geometry . {}
+raise .
+
+set c 1
+set o 1
+set m 1
+
+#
+# Initial construction test
+#
+test Feedback-1.$c {Feedback construction} {
+ iwidgets::Feedback .f
+ pack .f -padx 10 -pady 10 -fill both -expand yes
+ update
+} {}
+
+incr c
+
+#
+# Option tests which are successful.
+#
+test Feedback-2.$o {configuration option} {
+ llength [.f configure]
+} {22}
+
+incr o
+
+foreach test {
+ {-background #d9d9d9 #d9d9d9}
+ {-cursor gumby gumby}
+ {-foreground Black Black}
+ {-labelmargin 5 5}
+ {-labeltext Label Label}
+ {-labelpos n n}
+ {-labelpos ne ne}
+ {-labelpos e e}
+ {-labelpos se se}
+ {-labelpos s s}
+ {-labelpos sw sw}
+ {-labelpos w w}
+ {-labelpos nw nw}
+ {-barcolor red red}
+ {-steps 50 50}
+ {-sticky w w}
+ {-sticky nw nw}
+ {-sticky n n}
+ {-sticky ne ne}
+ {-sticky e e}
+ {-sticky se se}
+ {-sticky s s}
+ {-sticky sw sw}
+ {-sticky news news}
+ {-barheight 20 20}} {
+ set option [lindex $test 0]
+ test Feedback-2.$o "configuration options, $option" {
+ .f configure $option [lindex $test 1]
+ lindex [.f configure $option] 4
+ } [lindex $test 2]
+ update
+ incr o
+}
+
+#
+# Option tests which fail and produce errors.
+#
+#foreach test {
+# {} {
+# set option [lindex $test 0]
+# test Feedback-2.$o "configuration options, $option" {
+# list [catch {.f configure $option [lindex $test 1]} msg] $msg
+# } [list 1 [lindex $test 2]]
+# incr o
+#}
+
+#
+# Method tests which are successful.
+#
+foreach test {
+ {{.f step} {}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Feedback-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 0 [lindex $test 1]]
+ update
+ incr m
+}
+
+#
+# Conclusion of construction/destruction tests
+#
+test Feedback-1.$c {Feedback destruction} {
+ destroy .f
+ update
+} {}
+
+incr c
+
+test Feedback-1.$c {Feedback construction} {
+ iwidgets::feedback .f -labeltext "Label" \
+ -labelpos n -labelmargin 5
+ pack .f -padx 10 -pady 10 -fill both -expand yes
+ update
+} {}
+
+incr c
+
+test Feedback-1.$c {Feedback destruction} {
+ destroy .f
+ update
+} {}
+
+incr c
+
+test Feedback-1.$c {Feedback destruction} {
+ iwidgets::feedback .f
+ pack .f
+ destroy .f
+ update
+} {}
+
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/tests/fileselectionbox.test b/iwidgets/tests/fileselectionbox.test
new file mode 100644
index 00000000000..eb2eb530933
--- /dev/null
+++ b/iwidgets/tests/fileselectionbox.test
@@ -0,0 +1,212 @@
+# This file is a Tcl script to test out [incr Widgets] Fileselectionbox class.
+# It is organized in the standard fashion for Tcl tests with the following
+# notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+#
+# Copyright (c) 1995 DSC Technologies Corporation
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# @(#) $Id$
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+wm geometry . {}
+raise .
+
+set c 1
+set o 1
+set m 1
+
+#
+# Initial construction test
+#
+test Fileselectionbox-1.$c {Fileselectionbox construction} {
+ iwidgets::Fileselectionbox .fsb
+ pack .fsb -padx 10 -pady 10 -fill both -expand yes
+ update
+} {}
+
+incr c
+
+#
+# Option tests which are successful.
+#
+test Fileselectionbox-2.$o {configuration option} {
+ llength [.fsb configure]
+} {46}
+
+incr o
+
+foreach test {
+ {-activebackground #ececec #ececec}
+ {-activerelief raised raised}
+ {-background #d9d9d9 #d9d9d9}
+ {-borderwidth 2 2}
+ {-textbackground GhostWhite GhostWhite}
+ {-childsitepos n n}
+ {-childsitepos s s}
+ {-childsitepos e e}
+ {-childsitepos w w}
+ {-childsitepos top top}
+ {-childsitepos bottom bottom}
+ {-childsitepos center center}
+ {-cursor gumby gumby}
+ {-directory {..} {..}}
+ {-foreground Black Black}
+ {-highlightcolor black black}
+ {-highlightthickness 2 2}
+ {-insertbackground Black Black}
+ {-insertborderwidth 1 1}
+ {-insertofftime 300 300}
+ {-insertontime 600 600}
+ {-insertwidth 3 3}
+ {-dirslabel "Dirs Label" "Dirs Label"}
+ {-dirson no no}
+ {-dirson yes yes}
+ {-fileslabel "Files Label" "Files Label"}
+ {-fileson no no}
+ {-fileson yes yes}
+ {-filetype any any}
+ {-filetype directory directory}
+ {-filetype regular regular}
+ {-filterlabel "Filter Label" "Filter Label"}
+ {-filteron no no}
+ {-filteron yes yes}
+ {-directory ../tests ../tests}
+ {-mask *.* *.*}
+ {-nomatchstring {No Files} {No Files}}
+ {-labelfont -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-*}
+ {-selectbackground #e6ceb1 #e6ceb1}
+ {-selectborderwidth 1 1}
+ {-selectionlabel "Selection Label" "Selection Label"}
+ {-selectionon no no}
+ {-selectionon yes yes}
+ {-automount {export tmp_mnt} {export tmp_mnt}}
+ {-textfont -*-courier-medium-r-normal--*-120-* -*-courier-medium-r-normal--*-120-*}
+ {-troughcolor #c3c3c3 #c3c3c3}
+ {-width 400 400}
+ {-height 375 375}} {
+ set option [lindex $test 0]
+ test Fileselectionbox-2.$o "configuration options, $option" {
+ .fsb configure $option [lindex $test 1]
+ lindex [.fsb configure $option] 4
+ } [lindex $test 2]
+ update
+ incr o
+}
+#
+# Option tests which fail and produce errors.
+#
+foreach test {
+ {-directory bogus {bad directory option "bogus": directory does not exist}}
+ {-filetype bogus {bad filetype option "bogus": should be regular, directory, or any}}} {
+ set option [lindex $test 0]
+ test Fileselectionbox-2.$o "configuration options, $option" {
+ list [catch {.fsb configure $option [lindex $test 1]} msg] $msg
+ } [list 1 [lindex $test 2]]
+ incr o
+}
+
+#
+# Method tests which are successful.
+#
+foreach test {
+ {{.fsb childsite} {.fsb.fsbchildsite}}
+ {{.fsb get} {}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Fileselectionbox-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 0 [lindex $test 1]]
+ update
+ incr m
+}
+
+#
+# Conclusion of constrcution/destruction tests
+#
+test Fileselectionbox-1.$c {Fileselectionbox destruction} {
+ destroy .fsb
+ update
+} {}
+
+
+incr c
+
+test Fileselectionbox-1.$c {Fileselectionbox construction} {
+ iwidgets::fileselectionbox .fsb
+ pack .fsb -padx 10 -pady 10 -fill both -expand yes
+ update
+} {}
+
+
+incr c
+
+test Fileselectionbox-1.$c {Fileselectionbox destruction} {
+ destroy .fsb
+ update
+} {}
+
+incr c
+
+
+test Fileselectionbox-1.$c {Fileselectionbox destruction} {
+ iwidgets::fileselectionbox .fsb
+ pack .fsb
+ destroy .fsb
+ update
+} {}
+
+#
+# Childsite tests
+#
+incr o
+
+test Fileselectionbox-1.$o {Fileselectionbox -childsitepos} {
+ iwidgets::fileselectionbox .fsb
+ pack .fsb
+ update
+ label [.fsb childsite].lb -background red -text CS
+ pack [.fsb childsite].lb -fill both -expand yes
+ update
+
+ .fsb configure -childsitepos n
+ update
+ .fsb configure -childsitepos s
+ update
+ .fsb configure -childsitepos e
+ update
+ .fsb configure -childsitepos w
+ update
+ .fsb configure -childsitepos top
+ update
+ .fsb configure -childsitepos bottom
+ update
+ .fsb configure -childsitepos center
+ update
+ destroy .fsb
+} {}
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/tests/fileselectiondialog.test b/iwidgets/tests/fileselectiondialog.test
new file mode 100644
index 00000000000..ae3eb07639c
--- /dev/null
+++ b/iwidgets/tests/fileselectiondialog.test
@@ -0,0 +1,219 @@
+# This file is a Tcl script to test out [incr Widgets] Fileselectiondialog
+# class. It is organized in the standard fashion for Tcl tests with the
+# following notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+# 4.x - Other tests
+#
+# Copyright (c) 1995 DSC Technologies Corporation
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# @(#) $Id$
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+wm geometry . {}
+raise .
+
+set c 1
+set o 1
+set m 1
+
+#
+# Initial construction test
+#
+test Fileselectiondialog-1.$c {Fileselectiondialog construction} {
+ iwidgets::Fileselectiondialog .fsd
+ .fsd activate
+} {}
+
+incr c
+
+#
+# Option tests which are successful.
+#
+test Fileselectiondialog-2.$o {configuration option} {
+ llength [.fsd configure]
+} {51}
+
+incr o
+
+foreach test {
+ {-activebackground #ececec #ececec}
+ {-borderwidth 2 2}
+ {-childsitepos n n}
+ {-childsitepos s s}
+ {-childsitepos e e}
+ {-childsitepos w w}
+ {-childsitepos top top}
+ {-childsitepos bottom bottom}
+ {-childsitepos center center}
+ {-cursor gumby gumby}
+ {-directory {..} {..}}
+ {-textbackground GhostWhite GhostWhite}
+ {-foreground Black Black}
+ {-insertbackground Black Black}
+ {-insertborderwidth 1 1}
+ {-insertofftime 200 200}
+ {-insertontime 500 500}
+ {-insertwidth 3 3}
+ {-dirslabel "Dirs Label" "Dirs Label"}
+ {-dirson no no}
+ {-dirson yes yes}
+ {-fileslabel "Files Label" "Files Label"}
+ {-fileson no no}
+ {-directory ../tests ../tests}
+ {-mask *.* *.*}
+ {-nomatchstring {No Files} {No Files}}
+ {-fileson yes yes}
+ {-filetype any any}
+ {-filetype directory directory}
+ {-filetype regular regular}
+ {-filterlabel "Filter Label" "Filter Label"}
+ {-filteron no no}
+ {-filteron yes yes}
+ {-selectbackground #c3c3c3 #c3c3c3}
+ {-selectionlabel "Selection Label" "Selection Label"}
+ {-selectionon no no}
+ {-selectionon yes yes}
+ {-textfont -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-*}
+ {-background #d9d9d9 #d9d9d9}
+ {-buttonboxpos n n}
+ {-buttonboxpos e e}
+ {-buttonboxpos w w}
+ {-buttonboxpos s s}
+ {-cursor gumby gumby}
+ {-modality global global}
+ {-modality application application}
+ {-modality none none}
+ {-padx 15 15}
+ {-pady 15 15}
+ {-separator off off}
+ {-thickness 4 4}
+ {-separator on on}
+ {-title Fileselectiondialog Fileselectiondialog}} {
+ set option [lindex $test 0]
+ test Fileselectiondialog-2.$o "configuration options, $option" {
+ .fsd configure $option [lindex $test 1]
+ lindex [.fsd configure $option] 4
+ } [lindex $test 2]
+ update
+ incr o
+}
+
+#
+# Option tests which fail and produce errors.
+#
+foreach test {
+ {-directory bogus {bad directory option "bogus": directory does not exist}}
+ {-filetype bogus {bad filetype option "bogus": should be regular, directory, or any}}} {
+ set option [lindex $test 0]
+ test FileSelectionBox-2.$o "configuration options, $option" {
+ list [catch {.fsd configure $option [lindex $test 1]} msg] $msg
+ } [list 1 [lindex $test 2]]
+ incr o
+}
+
+#
+# Method tests which are successful.
+#
+foreach test {
+ {{.fsd childsite} {.fsd.shellchildsite.dschildsite.fsb.fsbchildsite}}
+ {{.fsd hide Help} {}}
+ {{.fsd hide Cancel} {}}
+ {{.fsd default Apply} {}}
+ {{.fsd show Cancel} {}}
+ {{.fsd deactivate} {}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Fileselectiondialog-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 0 [lindex $test 1]]
+ update
+ incr m
+}
+
+#
+# Conclusion of constrcution/destruction tests
+#
+test Fileselectiondialog-1.$c {Fileselectiondialog destruction} {
+ destroy .fsd
+ update
+} {}
+
+incr c
+
+test Fileselectiondialog-1.$c {Fileselectiondialog construction} {
+ iwidgets::fileselectiondialog .fsd
+ update
+} {}
+
+incr c
+
+test Fileselectiondialog-1.$c {Fileselectiondialog destruction} {
+ destroy .fsd
+ update
+} {}
+
+incr c
+
+test Fileselectiondialog-1.$c {Fileselectiondialog destruction} {
+ iwidgets::fileselectiondialog .fsd
+ destroy .fsd
+ update
+} {}
+
+#
+# Childsite tests
+#
+incr o
+
+test Fileselectiondialog-1.$o {Fileselectiondialog -childsitepos} {
+ iwidgets::fileselectiondialog .fsd
+ .fsd activate
+ update
+ label [.fsd childsite].lb -background red -text CS
+ pack [.fsd childsite].lb -fill both -expand yes
+ update
+
+ .fsd configure -childsitepos n
+ update
+ .fsd configure -childsitepos s
+ update
+ .fsd configure -childsitepos e
+ update
+ .fsd configure -childsitepos w
+ update
+ .fsd configure -childsitepos top
+ update
+ .fsd configure -childsitepos bottom
+ update
+ .fsd configure -childsitepos center
+ update
+ .fsd deactivate
+ update
+ destroy .fsd
+} {}
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/tests/finddialog.test b/iwidgets/tests/finddialog.test
new file mode 100644
index 00000000000..1bbda5e5499
--- /dev/null
+++ b/iwidgets/tests/finddialog.test
@@ -0,0 +1,168 @@
+# This file is a Tcl script to test out [incr Widgets] Finddialog class.
+# It is organized in the standard fashion for Tcl tests with the following
+# notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+# 4.x - Other tests
+#
+# Copyright (c) 1995 DSC Technologies Corporation
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# @(#) $Id$
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+wm geometry . {}
+raise .
+
+set c 1
+set o 1
+set m 1
+
+#
+# Initial construction test
+#
+test Finddialog-1.$c {Finddialog construction} {
+ iwidgets::Scrolledlistbox .slb
+ iwidgets::Scrolledtext .st
+ pack .st
+ .st insert end "Now is the time for all good men\\n"
+ .st insert end "to come to the aid of their country"
+
+ iwidgets::Finddialog .fd
+ .fd center .st
+ .fd activate
+} {}
+
+incr c
+
+#
+# Option tests which are successful.
+#
+test Finddialog-2.$o {configuration option} {
+ llength [.fd configure]
+} {43}
+
+incr o
+
+foreach test {
+ {-background #d9d9d9 #d9d9d9}
+ {-buttonboxpadx 10 10}
+ {-buttonboxpady 10 10}
+ {-cursor gumby gumby}
+ {-textwidget .st .st}
+ {-patternbackground blue blue}
+ {-patternforeground white white}
+ {-searchbackground skyblue skyblue}
+ {-searchforeground white white}
+ {-title "Find Dialog" "Find Dialog"}} {
+ set option [lindex $test 0]
+ test Finddialog-2.$o "configuration options, $option" {
+ .fd configure $option [lindex $test 1]
+ lindex [.fd configure $option] 4
+ } [lindex $test 2]
+ update
+ incr o
+}
+
+#
+# Option tests which fail and produce errors.
+#
+foreach test {
+ {-buttonboxpos bogus {bad buttonboxpos option "bogus": should be n, s, e, or w}}
+ {-modality bogus {bad modality option "bogus": should be none, application, or global}}} {
+ set option [lindex $test 0]
+ test Finddialog-2.$o "configuration options, $option" {
+ list [catch {.fd configure $option [lindex $test 1]} msg] $msg
+ } [list 1 [lindex $test 2]]
+ incr o
+}
+
+#
+# Method tests which are successful.
+#
+foreach test {
+ {{.fd component pattern insert end "the"} {}}
+ {{.fd find} 1.7}
+ {{.fd find} 1.45}
+ {{.fd clear} {}}
+ {{.fd invoke Find} {}}
+ {{.fd buttonconfigure Find -text Search} {}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Finddialog-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 0 [lindex $test 1]]
+ update
+ incr m
+}
+
+.fd configure -textwidget .bogus
+
+#
+# Method tests which fail and produce errors
+#
+test Finddialog-3.$m "Non existant textwidget" {
+ list [catch {.fd find} msg] $msg
+} [list 1 {bad finddialog text widget value: ".bogus", the widget doesn't exist}]
+update
+incr m
+
+.fd configure -textwidget .slb
+
+test Finddialog-3.$m "Wrong class of textwidget" {
+ list [catch {.fd find} msg] $msg
+} [list 1 {bad finddialog text widget value: ".slb", must be of the class Text or based on Scrolledtext}]
+update
+incr m
+
+#
+# Destruction test
+#
+test Finddialog-1.$c {Finddialog destruction} {
+ destroy .slb
+ destroy .st
+ destroy .fd
+ update
+} {}
+incr c
+
+#
+# Initial construction test
+#
+test Finddialog-1.$c {Finddialog construction} {
+ iwidgets::Finddialog .fd
+} {.fd}
+
+incr c
+
+#
+# Destruction test
+#
+test Finddialog-1.$c {Finddialog destruction} {
+ destroy .fd
+ update
+} {}
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/tests/hierarchy.test b/iwidgets/tests/hierarchy.test
new file mode 100644
index 00000000000..5a956d3cf64
--- /dev/null
+++ b/iwidgets/tests/hierarchy.test
@@ -0,0 +1,321 @@
+# This file is a Tcl script to test out [incr Widgets] Hierarchy class.
+# It is organized in the standard fashion for Tcl tests with the following
+# notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+#
+# Copyright (c) 1995 DSC Technologies Corporation
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# @(#) $Id$
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+wm geometry . {}
+raise .
+
+set c 1
+set o 1
+set m 1
+
+set cdir [pwd]
+
+#
+# Initial construction test
+#
+test Hierarchy-1.$c {Hierarchy construction} {
+ iwidgets::Hierarchy .h
+ pack .h -padx 10 -pady 10 -fill both -expand yes
+ update
+
+ image create bitmap testicon -data {
+ #define node.xbm_width 16
+ #define node.xbm_height 16
+ static unsigned char node.xbm_bits[] = {
+ 0x00, 0x00, 0x00, 0x00, 0xfe, 0x7f, 0x02, 0x40,
+ 0xfa, 0x5f, 0xfa, 0x5f, 0x82, 0x41, 0x82, 0x41,
+ 0x82, 0x41, 0x82, 0x41, 0x82, 0x41, 0x02, 0x40,
+ 0xfe, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+ }
+
+ set homelist [lsort [glob -nocomplain $env(HOME)/*]]
+
+ proc get_files {file} {
+ global env
+
+ if {$file == ""} {
+ set dir $env(HOME)
+ } else {
+ set dir $file
+ }
+
+ if {[catch {cd $dir}] != 0} {
+ return ""
+ }
+
+ set rlist ""
+
+ foreach file [lsort [glob -nocomplain *]] {
+ lappend rlist [list [file join $dir $file] $file]
+ }
+
+ return $rlist
+ }
+} {}
+
+incr c
+
+#
+# Option tests which are successful.
+#
+test Hierarchy-2.$o {configuration option} {
+ llength [.h configure]
+} {58}
+
+incr o
+
+foreach test {
+ {-activebackground #ececec #ececec}
+ {-activeforeground Black Black}
+ {-activerelief raised raised}
+ {-alwaysquery 0 0}
+ {-alwaysquery 1 1}
+ {-alwaysquery true true}
+ {-alwaysquery false false}
+ {-alwaysquery yes yes}
+ {-alwaysquery no no}
+ {-alwaysquery on on}
+ {-alwaysquery off off}
+ {-background #d9d9d9 #d9d9d9}
+ {-borderwidth 2 2}
+ {-cursor gumby gumby}
+ {-disabledforeground #a3a3a3 #a3a3a3}
+ {-elementborderwidth -1 -1}
+ {-foreground Black Black}
+ {-height 300 300}
+ {-width 400 400}
+ {-highlightcolor Black Black}
+ {-highlightthickness 2 2}
+ {-hscrollmode none none}
+ {-hscrollmode static static}
+ {-hscrollmode dynamic dynamic}
+ {-jump 0 0}
+ {-textbackground GhostWhite GhostWhite}
+ {-labelmargin 5 5}
+ {-labeltext Label Label}
+ {-labelpos nw nw}
+ {-labelpos ne ne}
+ {-labelpos en en}
+ {-labelpos e e}
+ {-labelpos es es}
+ {-labelpos se se}
+ {-labelpos s s}
+ {-labelpos sw sw}
+ {-labelpos wn wn}
+ {-labelpos w w}
+ {-labelpos ws ws}
+ {-labelpos n n}
+ {-markbackground #a0a0a0 #a0a0a0}
+ {-markforeground Black Black}
+ {-menucursor gumby gumby}
+ {-relief raised raised}
+ {-relief sunken sunken}
+ {-vscrollmode none none}
+ {-vscrollmode static static}
+ {-vscrollmode dynamic dynamic}
+ {-sbwidth 20 20}
+ {-scrollmargin 5 5}
+ {-textbackground #d9d9d9 #d9d9d9}
+ {-visibleitems 40x20 40x20}
+ {-height 0 0}
+ {-width 0 0}
+ {-selectbackground #c3c3c3 #c3c3c3}
+ {-selectcolor #b03060 #b03060}
+ {-selectforeground Black Black}
+ {-spacing1 0 0}
+ {-spacing2 0 0}
+ {-spacing3 0 0}
+ {-closedicon testicon testicon}
+ {-nodeicon testicon testicon}
+ {-openicon testicon testicon}
+ {-querycommand {get_files %n} {get_files %n}}
+ {-closedicon closedFolder closedFolder}
+ {-nodeicon nodeFolder nodeFolder}
+ {-openicon openFolder openFolder}
+ {-querycommand {get_files %n} {get_files %n}}
+ {-expanded 0 0}
+ {-expanded 1 1}
+ {-expanded true true}
+ {-expanded false false}
+ {-expanded yes yes}
+ {-expanded no no}
+ {-expanded on on}
+ {-expanded off off}
+ {-sticky w w}
+ {-sticky nw nw}
+ {-sticky n n}
+ {-sticky ne ne}
+ {-sticky e e}
+ {-sticky se se}
+ {-sticky s s}
+ {-sticky sw sw}
+ {-sticky news news}
+ {-filter 0 0}
+ {-iconcommand {} {}}
+ {-selectcommand {} {}}} {
+ set option [lindex $test 0]
+ test Hierarchy-2.$o "configuration options, $option" {
+ .h configure $option [lindex $test 1]
+ lindex [.h configure $option] 4
+ } [lindex $test 2]
+ update
+ incr o
+}
+
+#
+# Option tests which fail and produce errors.
+#
+foreach test {
+ {-filter bogus {bad filter option "bogus": should be boolean}}
+ {-alwaysquery bogus {bad alwaysquery option "bogus": should be boolean}}
+ {-expanded bogus {bad expanded option "bogus": should be boolean}}
+ {-openicon bogus {bad openicon option "bogus": should be an existing image}}
+ {-closedicon bogus {bad closedicon option "bogus": should be an existing image}}
+ {-nodeicon bogus {bad nodeicon option "bogus": should be an existing image}}
+ {-visibleitems bogus {bad visibleitems option "bogus": should be widthxheight}}
+ {-hscrollmode bogus {bad hscrollmode option "bogus": should be static, dynamic, or none}}
+ {-vscrollmode bogus {bad vscrollmode option "bogus": should be static, dynamic, or none}}} {
+ set option [lindex $test 0]
+ test Hierarchy-2.$o "configuration options, $option" {
+ list [catch {.h configure $option [lindex $test 1]} msg] $msg
+ } [list 1 [lindex $test 2]]
+ incr o
+}
+
+#
+# Addtional test for selection/mark get
+#
+test Hierarchy-1.$m {Hierarchy selection/mark get} {
+ .h draw -now
+ .h selection clear
+ eval .h selection add $homelist
+ update
+ if {[lsort [.h selection get]] != [lsort $homelist]} {
+ error "selection isn't right"
+ }
+ .h selection clear
+ update
+
+ .h mark clear
+ eval .h mark add $homelist
+ update
+ if {[lsort [.h mark get]] != [lsort $homelist]} {
+ error "mark isn't right"
+ }
+ update
+ .h mark clear
+} {}
+incr m
+
+#
+# Method tests which are successful.
+#
+foreach test {
+ {{eval .h selection add $homelist} {}}
+ {{eval .h selection remove $homelist} {}}
+ {{.h selection clear} {}}
+ {{eval .h mark add $homelist} {}}
+ {{eval .h mark remove $homelist} {}}
+ {{.h mark clear} {}}
+ {{.h current} {}}
+ {{.h expand [lindex $homelist 0]} {}}
+ {{.h collapse [lindex $homelist 0]} {}}
+ {{.h toggle [lindex $homelist 0]} {}}
+ {{.h refresh [lindex $homelist 0]} {}}
+ {{.h prune [lindex $homelist 0]} {}}
+ {{.h draw -now} {}}
+ {{.h draw -eventually} {}}
+ {{.h clear} {}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Hierarchy-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 0 [lindex $test 1]]
+ update
+ incr m
+}
+
+#
+# Method tests which fail and produce errors
+#
+foreach test {
+ {{.h expand bogus} {bad expand node argument: "bogus", the node doesn't exist}}
+ {{.h collapse bogus} {bad collapse node argument: "bogus", the node doesn't exist}}
+ {{.h toggle bogus} {bad toggle node argument: "bogus", the node doesn't exist}}
+ {{.h draw bogus} {bad when option "bogus": should be -eventually or -now}}
+ {{.h mark bogus} {bad mark operation "bogus": should be add, remove, clear or get}}
+ {{.h selection bogus} {bad selection operation "bogus": should be add, remove, clear or get}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Hierarchy-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 1 [lindex $test 1]]
+ incr m
+}
+
+#
+# Conclusion of constrcution/destruction tests
+#
+test Hierarchy-1.$c {Hierarchy destruction} {
+ destroy .h
+ update
+} {}
+
+incr c
+
+test Hierarchy-1.$c {Hierarchy construction} {
+ iwidgets::hierarchy .h -hscrollmode dynamic -labeltext "Label" \
+ -labelpos n -labelmargin 5
+ pack .h -padx 10 -pady 10 -fill both -expand yes
+ update
+} {}
+
+incr c
+
+test Hierarchy-1.$c {Hierarchy destruction} {
+ destroy .h
+ update
+} {}
+
+incr c
+
+test Hierarchy-1.$c {Hierarchy destruction} {
+ iwidgets::hierarchy .h
+ pack .h
+ destroy .h
+ update
+} {}
+
+cd $cdir
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/tests/hyperhelp.html b/iwidgets/tests/hyperhelp.html
new file mode 100644
index 00000000000..76a6b9db367
--- /dev/null
+++ b/iwidgets/tests/hyperhelp.html
@@ -0,0 +1,157 @@
+# This file is a Tcl script to test out [incr Widgets] Hyperhelp class.
+# It is organized in the standard fashion for Tcl tests with the following
+# notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+#
+# Copyright (c) 1995 DSC Technologies Corporation
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# @(#) $Id: hyperhelp.test
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+set c 1
+set o 1
+set m 1
+
+#
+# Initial construction test
+#
+test Hyperhelp-1.$c {Hyperhelp construction} {
+ Hyperhelp .h
+ .h activate
+ update
+} {}
+
+incr c
+
+#
+# Option tests which are successful.
+#
+test Hyperhelp-2.$o {configuration option} {
+ llength [.h configure]
+} {37}
+
+incr o
+
+foreach test [concat {
+ {-activebackground #ececec #ececec}
+ {-activeforeground Black Black}
+ {-activerelief raised raised}
+ {-background #d9d9d9 #d9d9d9}
+ {-borderwidth 3 3}
+ {-cursor gumby gumby}
+ {-font -Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-* \
+ -Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-*}
+ {-foreground Black Black}
+ {-highlightcolor Black Black}
+ {-highlightthickness 3 3}
+ {-height 120 120}
+ {-width 500 500}
+ {-relief raised raised}
+ {-relief sunken sunken}
+ {-vscrollmode none none}
+ {-vscrollmode static static}
+ {-vscrollmode dynamic dynamic}
+ {-hscrollmode none none}
+ {-hscrollmode static static}
+ {-hscrollmode dynamic dynamic}
+ {-sbwidth 20 20}
+ {-scrollmargin 5 5}
+ {-selectborderwidth 2 2}
+ {-textbackground GhostWhite GhostWhite}
+ {-visibleitems 72x40 72x40}
+ {-height 0 0}
+ {-width 0 0}
+ {-wrap char char}
+ {-wrap none none}
+ {-unknownimage {} {}}
+ {-link blue blue}
+ {-linkhighlight red red}
+ {-fontname times times}
+ {-fixedfont courier courier}
+ {-fontsize medium medium}
+ {-topics {} {}}
+ {-title "Test" "Test"} } \
+ [list [list -helpdir . [pwd]/.]]] {
+ set option [lindex $test 0]
+ test Hyperhelp-2.$o "configuration options, $option" {
+ .h configure $option [lindex $test 1]
+ lindex [.h configure $option] 4
+ } [lindex $test 2]
+ update
+ incr o
+}
+
+#
+# Option tests which fail and produce errors.
+#
+foreach test {
+ {-visibleitems bogus {bad visibleitems option "bogus": should be widthxheight}}
+ {-hscrollmode bogus {bad hscrollmode option "bogus": should be static, dynamic, or none}}
+ {-vscrollmode bogus {bad vscrollmode option "bogus": should be static, dynamic, or none}}
+ {-fontname bogus {Invalid font name "bogus". Must be one of helvetica courier times symbol}}
+ {-fontsize bogus {bad fontsize option "bogus": should be small, medium, large, or huge}}
+ {-fixedfont bogus {Invalid font name "bogus". Must be one of helvetica courier times symbol}}} {
+ set option [lindex $test 0]
+ test Hyperhelp-2.$o "configuration options, $option" {
+ list [catch {.h configure $option [lindex $test 1]} msg] $msg
+ } [list 1 [lindex $test 2]]
+ incr o
+}
+
+#
+# Method tests which are successful.
+#
+foreach test {
+ {{.h showtopic hyperhelp} -1}
+ {{.h followlink scrolledhtml.test#} -1}
+ {{.h back} -1}
+ {{.h forward} -1}} {
+ set method [lindex [lindex $test 0] 1]
+ test Hyperhelp-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 0 [lindex $test 1]]
+ update
+ incr m
+}
+
+#
+# Conclusion of construction/destruction tests
+#
+test Hyperhelp-1.$c {Hyperhelp destruction} {
+ destroy .h
+ update
+} {}
+
+incr c
+
+test Hyperhelp-1.$c {Hyperhelp construction} {
+ hyperhelp .h -topics {index} -helpdir ~/public_html
+ .h activate
+ update
+} {}
+
+incr c
+
+test Hyperhelp-1.$c {Hyperhelp destruction} {
+ destroy .h
+ update
+} {}
+
+incr c
+
+test Hyperhelp-1.$c {Hyperhelp destruction} {
+ hyperhelp .h
+ .h activate
+ .h deactivate
+ destroy .h
+ update
+} {}
diff --git a/iwidgets/tests/hyperhelp.test b/iwidgets/tests/hyperhelp.test
new file mode 100644
index 00000000000..1bfc466a9c6
--- /dev/null
+++ b/iwidgets/tests/hyperhelp.test
@@ -0,0 +1,178 @@
+# This file is a Tcl script to test out [incr Widgets] Hyperhelp class.
+# It is organized in the standard fashion for Tcl tests with the following
+# notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+#
+# Copyright (c) 1995 DSC Technologies Corporation
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# @(#) $Id: hyperhelp.test
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+set c 1
+set o 1
+set m 1
+
+#
+# Initial construction test
+#
+test Hyperhelp-1.$c {Hyperhelp construction} {
+ iwidgets::Hyperhelp .h
+ .h center
+ .h activate
+ update
+} {}
+
+incr c
+
+#
+# Option tests which are successful.
+#
+test Hyperhelp-2.$o {configuration option} {
+ llength [.h configure]
+} {43}
+
+incr o
+
+foreach test [concat {
+ {-activebackground #ececec #ececec}
+ {-activeforeground Black Black}
+ {-activerelief raised raised}
+ {-background #d9d9d9 #d9d9d9}
+ {-borderwidth 3 3}
+ {-cursor gumby gumby}
+ {-font -Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-* \
+ -Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-*}
+ {-foreground Black Black}
+ {-highlightcolor Black Black}
+ {-highlightthickness 3 3}
+ {-height 120 120}
+ {-width 500 500}
+ {-relief raised raised}
+ {-relief sunken sunken}
+ {-vscrollmode none none}
+ {-vscrollmode static static}
+ {-vscrollmode dynamic dynamic}
+ {-hscrollmode none none}
+ {-hscrollmode static static}
+ {-hscrollmode dynamic dynamic}
+ {-sbwidth 20 20}
+ {-scrollmargin 5 5}
+ {-selectborderwidth 2 2}
+ {-textbackground GhostWhite GhostWhite}
+ {-visibleitems 72x40 72x40}
+ {-height 0 0}
+ {-width 0 0}
+ {-wrap char char}
+ {-wrap none none}
+ {-unknownimage {} {}}
+ {-link blue blue}
+ {-linkhighlight red red}
+ {-fontname times times}
+ {-fixedfont courier courier}
+ {-fontsize medium medium}
+ {-topics {} {}}
+ {-title "Test" "Test"} } \
+ [list [list -helpdir . [pwd]/.]]] {
+ set option [lindex $test 0]
+ test Hyperhelp-2.$o "configuration options, $option" {
+ .h configure $option [lindex $test 1]
+ lindex [.h configure $option] 4
+ } [lindex $test 2]
+ update
+ incr o
+}
+
+#
+# Option tests which fail and produce errors.
+#
+foreach test {
+ {-visibleitems bogus {bad visibleitems option "bogus": should be widthxheight}}
+ {-hscrollmode bogus {bad hscrollmode option "bogus": should be static, dynamic, or none}}
+ {-vscrollmode bogus {bad vscrollmode option "bogus": should be static, dynamic, or none}}
+ {-fontname bogus {Invalid font name "bogus". Must be one of helvetica courier times symbol}}
+ {-fontsize bogus {bad fontsize option "bogus": should be small, medium, large, or huge}}
+ {-fixedfont bogus {Invalid font name "bogus". Must be one of helvetica courier times symbol}}} {
+ set option [lindex $test 0]
+ test Hyperhelp-2.$o "configuration options, $option" {
+ list [catch {.h configure $option [lindex $test 1]} msg] $msg
+ } [list 1 [lindex $test 2]]
+ incr o
+}
+
+#
+# Method tests which are successful.
+#
+foreach test {
+ {{.h showtopic hyperhelp} -1}
+ {{.h followlink scrolledhtml.test#} -1}
+ {{.h back} -1}
+ {{.h forward} -1}} {
+ set method [lindex [lindex $test 0] 1]
+ test Hyperhelp-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 0 [lindex $test 1]]
+ update
+ incr m
+}
+
+#
+# Conclusion of construction/destruction tests
+#
+test Hyperhelp-1.$c {Hyperhelp destruction} {
+ destroy .h
+ update
+} {}
+
+incr c
+
+test Hyperhelp-1.$c {Hyperhelp construction} {
+ iwidgets::hyperhelp .h -topics {index} -helpdir ~/public_html
+ .h center
+ .h activate
+ update
+} {}
+
+incr c
+
+test Hyperhelp-1.$c {Hyperhelp destruction} {
+ destroy .h
+ update
+} {}
+
+incr c
+
+test Hyperhelp-1.$c {Hyperhelp destruction} {
+ iwidgets::hyperhelp .h
+ .h center
+ .h activate
+ .h deactivate
+ destroy .h
+ update
+} {}
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/tests/labeledframe.test b/iwidgets/tests/labeledframe.test
new file mode 100644
index 00000000000..16d1faecb78
--- /dev/null
+++ b/iwidgets/tests/labeledframe.test
@@ -0,0 +1,194 @@
+# This file is a Tcl script to test out [incr Widgets] Labeledframe class.
+# It is organized in the standard fashion for Tcl tests with the following
+# notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+#
+# Copyright (c) 1995 DSC Technologies Corporation
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# @(#) $Id$
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+wm geometry . {}
+raise .
+
+set c 1
+set o 1
+set m 1
+
+#
+# Initial construction test
+#
+test Labeledframe-1.$c {Labeledframe construction} {
+ iwidgets::Labeledframe .lf
+ set cs [.lf childsite]
+ .lf configure -background yellow
+ pack [radiobutton $cs.w1 -anchor w -text "Button1"] -anchor w -fill x
+ pack [radiobutton $cs.w2 -anchor w -text "Button2"] -anchor w -fill x
+ pack [radiobutton $cs.w3 -anchor w -text "Button3"] -anchor w -fill x
+ pack [radiobutton $cs.w4 -anchor w -text "Button4"] -anchor w -fill x
+ pack [radiobutton $cs.w5 -anchor w -text "Button5"] -anchor w -fill x
+ pack [radiobutton $cs.w6 -anchor w -text "Button6"] -anchor w -fill x
+ pack [radiobutton $cs.w7 -anchor w -text "Button7"] -anchor w -fill x
+ pack [radiobutton $cs.w8 -anchor w -text "Button8"] -anchor w -fill x
+
+ pack .lf -fill both -expand yes
+ update
+} {}
+
+incr c
+
+#
+# Option tests which are successful.
+#
+test Labeledframe-2.$o {configuration option} {
+ llength [.lf configure]
+} {15}
+
+incr o
+
+foreach test {
+ {-labeltext "Label" "Label"}
+ {-labelpos nw nw}
+ {-labelpos n n}
+ {-labelpos ne ne}
+ {-labelpos en en}
+ {-labelpos e e}
+ {-labelpos es es}
+ {-labelpos sw sw}
+ {-labelpos s s}
+ {-labelpos se se}
+ {-labelpos wn wn}
+ {-labelpos w w}
+ {-labelpos ws ws}
+ {-labelfont 6x13 6x13}
+ {-labelpos nw nw}
+ {-labelpos n n}
+ {-labelpos ne ne}
+ {-labelpos en en}
+ {-labelpos e e}
+ {-labelpos es es}
+ {-labelpos sw sw}
+ {-labelpos s s}
+ {-labelpos se se}
+ {-labelpos wn wn}
+ {-labelpos w w}
+ {-labelpos ws ws}
+ {-relief groove groove}
+ {-relief sunken sunken}
+ {-relief raised raised}
+ {-relief ridge ridge}
+ {-relief flat flat}
+ {-borderwidth 2 2}
+ {-borderwidth 4 4}
+ {-borderwidth 6 6}
+ {-borderwidth 8 8}
+ {-borderwidth 10 10}
+ {-ipadx 20 20}
+ {-ipady 20 20}
+ {-ipadx 10 10}
+ {-ipady 10 10}
+ {-ipadx 0 0}
+ {-ipady 0 0}
+ } {
+ set option [lindex $test 0]
+ test Labeledframe-1.$o "configuration options, $option" {
+ .lf configure $option [lindex $test 1]
+ lindex [.lf configure $option] 4
+ } [lindex $test 2]
+ update
+ incr o
+ }
+
+#
+# Method tests which are successful.
+#
+test Labeledframe-3.$m {object method, childsite} {
+ list [catch {.lf childsite} msg] $msg
+} [list 0 .lf.childsite]
+
+incr m
+
+test Labeledframe-3.$m {object static method, initTable} {
+
+} {}
+
+incr m
+
+#
+# Method tests which fail and produce errors
+#
+test Labeledframe-3.$m {initTable static method} {
+ button .b
+
+} {.b}
+
+incr m
+
+test Labeledframe-1.$c {Labeledframe destruction} {
+ destroy .b
+ destroy .lf
+ update
+} {}
+
+incr c
+
+test Labeledframe-1.$c {Labeledframe construction} {
+ iwidgets::labeledframe .lf -labeltext "ListBox" -labelpos s
+ set cs [.lf childsite]
+ .lf configure -background yellow
+ pack [radiobutton $cs.w1 -anchor w -text "Button1"] -anchor w -fill x
+ pack [radiobutton $cs.w2 -anchor w -text "Button2"] -anchor w -fill x
+ pack [radiobutton $cs.w3 -anchor w -text "Button3"] -anchor w -fill x
+ pack [radiobutton $cs.w4 -anchor w -text "Button4"] -anchor w -fill x
+ pack [radiobutton $cs.w5 -anchor w -text "Button5"] -anchor w -fill x
+ pack [radiobutton $cs.w6 -anchor w -text "Button6"] -anchor w -fill x
+ pack [radiobutton $cs.w7 -anchor w -text "Button7"] -anchor w -fill x
+ pack [radiobutton $cs.w8 -anchor w -text "Button8"] -anchor w -fill x
+ pack .lf -fill both -expand yes
+ update
+} {}
+
+incr c
+
+test Labeledframe-1.$c {Labeledframe destruction} {
+ destroy .lf
+ update
+} {}
+
+incr c
+
+test Labeledframe-1.$c {Labeledframe construction} {
+ iwidgets::labeledframe .lf
+ pack .lf
+ destroy .lf
+ update
+} {}
+
+
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/tests/labeledwidget.test b/iwidgets/tests/labeledwidget.test
new file mode 100644
index 00000000000..0ef8fdaee88
--- /dev/null
+++ b/iwidgets/tests/labeledwidget.test
@@ -0,0 +1,172 @@
+# This file is a Tcl script to test out [incr Widgets] Labeledwidget class.
+# It is organized in the standard fashion for Tcl tests with the following
+# notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+#
+# Copyright (c) 1995 DSC Technologies Corporation
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# @(#) $Id$
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+wm geometry . {}
+raise .
+
+set c 1
+set o 1
+set m 1
+
+#
+# Initial construction test
+#
+test Labeledwidget-1.$c {Labeledwidget construction} {
+ iwidgets::Labeledwidget .lw
+ pack [listbox [.lw childsite].lb -relief sunken] -padx 10 -pady 10
+ pack .lw -fill both -expand yes -padx 10 -pady 10
+ image create bitmap flagup -file $tk_library/demos/images/flagup.bmp
+ update
+} {}
+
+incr c
+
+#
+# Option tests which are successful.
+#
+test Labeledwidget-2.$o {configuration option} {
+ llength [.lw configure]
+} {14}
+
+incr o
+
+foreach test {
+ {-labelvariable foo foo}
+ {-labelvariable {} {}}
+ {-labeltext "Label" "Label"}
+ {-labelpos nw nw}
+ {-labelpos n n}
+ {-labelpos ne ne}
+ {-labelpos en en}
+ {-labelpos e e}
+ {-labelpos es es}
+ {-labelpos sw sw}
+ {-labelpos s s}
+ {-labelpos se se}
+ {-labelpos wn wn}
+ {-labelpos w w}
+ {-labelpos ws ws}
+ {-labelmargin 20 20}
+ {-labelfont 6x13 6x13}
+ {-labelimage flagup flagup}
+ {-labelpos nw nw}
+ {-labelpos n n}
+ {-labelpos ne ne}
+ {-labelpos en en}
+ {-labelpos e e}
+ {-labelpos es es}
+ {-labelpos sw sw}
+ {-labelpos s s}
+ {-labelpos se se}
+ {-labelpos wn wn}
+ {-labelpos w w}
+ {-labelpos ws ws}
+ {-sticky w w}
+ {-sticky nw nw}
+ {-sticky n n}
+ {-sticky ne ne}
+ {-sticky e e}
+ {-sticky se se}
+ {-sticky s s}
+ {-sticky sw sw}
+ {-sticky news news}
+ {-labelimage {} {}}} {
+ set option [lindex $test 0]
+ test Labeledwidget-1.$o "configuration options, $option" {
+ .lw configure $option [lindex $test 1]
+ lindex [.lw configure $option] 4
+ } [lindex $test 2]
+ update
+ incr o
+ }
+
+#
+# Method tests which are successful.
+#
+test Labeledwidget-3.$m {object method, childsite} {
+ list [catch {.lw childsite} msg] $msg
+} [list 0 .lw.lwchildsite]
+
+incr m
+
+test Labeledwidget-3.$m {object static method, alignlabels} {
+ list [catch {iwidgets::Labeledwidget::alignlabels .lw} msg] $msg
+} {0 {}}
+
+incr m
+
+#
+# Method tests which fail and produce errors
+#
+test Labeledwidget-3.$m {alignlabels static method} {
+ button .b
+ list [catch {iwidgets::Labeledwidget::alignlabels .b} msg] $msg
+} {1 {.b is not a "Labeledwidget"}}
+
+incr m
+
+test Labeledwidget-1.$c {Labeledwidget destruction} {
+ destroy .b
+ destroy .lw
+ update
+ image delete flagup
+} {}
+
+incr c
+
+test Labeledwidget-1.$c {Labeledwidget construction} {
+ iwidgets::labeledwidget .lw -labeltext "ListBox" -labelpos s
+ pack [listbox [.lw childsite].lb -relief sunken] -padx 10 -pady 10
+ pack .lw -fill both -expand yes -padx 10 -pady 10
+ update
+} {}
+
+incr c
+
+test Labeledwidget-1.$c {Labeledwidget destruction} {
+ destroy .lw
+ update
+} {}
+
+incr c
+
+test Labeledwidget-1.$c {Labeledwidget construction} {
+ iwidgets::labeledwidget .lw
+ pack .lw
+ destroy .lw
+ update
+} {}
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/tests/menubar.test b/iwidgets/tests/menubar.test
new file mode 100644
index 00000000000..aaa68a93a0e
--- /dev/null
+++ b/iwidgets/tests/menubar.test
@@ -0,0 +1,560 @@
+# This file is a Tcl script to test out [incr Widgets] Menubar class.
+# It is organized in the standard fashion for Tcl tests with the following
+# notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+#
+# Copyright (c) 1995 DSC Technologies Corporation
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# @(#) $Id$
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+wm geometry . {}
+raise .
+
+set c 1
+set o 1
+set m 1
+
+#
+# Initial construction test
+#
+test Menubar-1.$c {Menubar construction} {
+ iwidgets::Menubar .mb -menubuttons {
+ menubutton file -text File -menu {
+ options -tearoff no
+ command ok -label "Ok"
+ command quit -label "Quit"
+ }
+ }
+ pack .mb
+ update
+ .mb add menubutton .other -text Other -menu {
+ radiobutton r1 -label "Radio One"
+ radiobutton r2 -label "Radio Two"
+ }
+ update
+ .mb add menubutton view -text View -menu {
+ command uno -label Uno
+ command dos -label Dos
+ }
+ update
+ .mb add cascade .view.more -label More -menu {
+ command one -label One
+ command two -label Two
+ cascade extra -label Extra -menu {
+ radiobutton rad1 -label "Choice One"
+ radiobutton rad2 -label "Choice Two"
+ cascade somemore \
+ -label "Some More" \
+ -helpstr "Yet some more" \
+ -menu {
+ command triangle -label "Triangle" -command {puts TRIANGLE}
+ command square -label "Square" -command {puts SQUARE}
+ command octagon -label "Octagon" -command {puts OCTAGON}
+ }
+ }
+ }
+ update
+} {}
+
+incr c
+
+#
+# Option tests which are successful.
+#
+test Menubar-2.$o {configuration option} {
+ llength [.mb configure]
+} {22}
+
+incr o
+
+foreach test {
+ {-anchor center center }
+ {-disabledforeground #a3a3a3 #a3a3a3 }
+ {-menubuttons {} {} }
+ {-highlightthickness 0 0 }
+ {-borderwidth 2 2 }
+ {-helpvariable {} {} }
+ {-highlightcolor Black Black }
+ {-font -Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-* -Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-* }
+ {-background #CDCDB7B7B5B5 #CDCDB7B7B5B5 }
+ {-highlightbackground #d9d9d9 #d9d9d9 }
+ {-activeborderwidth 2 2 }
+ {-wraplength 0 0 }
+ {-activebackground #ececec #ececec }
+ {-padx 4 4 }
+ {-pady 4 4 }
+ {-justify center center }
+ {-cursor {} {} }
+ {-activeforeground black black }
+ {-width 0 0 }
+ {-height 0 0 }
+ } {
+ set option [lindex $test 0]
+ test Menubar-2.$o "configuration options, $option" {
+ .mb configure $option [lindex $test 1]
+ .mb cget $option
+ } [lindex $test 2]
+ update
+ incr o
+}
+
+#
+# Menuconfigure Option tests which are successful.
+#
+# This happens to be for a command...
+test Menubar-3.$o {menubar menuconfiguration option} {
+ llength [.mb menuconfigure .file.quit]
+} {15}
+
+# do menuconfigure tests also...
+foreach test {
+ { .file.quit -activebackground red red }
+ { .file.quit -activeforeground red red }
+ { .file.quit -accelerator {} {} }
+ { .file.quit -background red red }
+ { .file.quit -bitmap {} {} }
+ { .file.quit -command {} {} }
+ { .file.quit -font fixed fixed }
+ { .file.quit -foreground red red }
+ { .file.quit -image {} {} }
+ { .file.quit -label hello hello }
+ { .file.quit -state normal normal }
+ { .file.quit -underline -1 -1 }
+ { .file.quit -helpstr {} {} }
+ } {
+ set index [lindex $test 0]
+ set option [lindex $test 1]
+ test Menubar-2.$o "tab configuration options, $option" {
+ .mb menuconfigure $index $option [lindex $test 2]
+ .mb menucget $index $option
+ } [lindex $test 3]
+ update
+ incr o
+}
+
+# test on cascade item
+# This happens to be for a cascade...
+test Menubar-3.$o {menubar menuconfiguration option} {
+ llength [.mb menuconfigure .view.more]
+} {17}
+
+# do menuconfigure tests also...
+foreach test {
+ { .view.more -activebackground red red }
+ { .view.more -activeforeground red red }
+ { .view.more -accelerator {} {} }
+ { .view.more -background red red}
+ { .view.more -bitmap {} {} }
+ { .view.more -command {} {} }
+ { .view.more -font }
+ { .view.more -foreground }
+ { .view.more -image {} {} }
+ { .view.more -label {} {} }
+ { .view.more -state normal normal }
+ { .view.more -underline -1 -1 }
+ { .view.more -helpstr {} {} }
+ } {
+ set index [lindex $test 0]
+ set option [lindex $test 1]
+ test Menubar-2.$o "tab configuration options, $option" {
+ .mb menuconfigure $index $option [lindex $test 2]
+ .mb menucget $index $option
+ } [lindex $test 3]
+ update
+ incr o
+}
+
+#
+# Option tests which fail and produce errors.
+#
+#foreach test {
+# { -OPTION BADVALUE {ERROR_MESSAGE} }
+# } {
+# set option [lindex $test 0]
+# test Menubar-2.$o "configuration options, $option" {
+# list [catch {.bb configure $option [lindex $test 1]} msg] $msg
+# } [list 1 [lindex $test 2]]
+# incr o
+#}
+
+#
+# Method tests which are successful.
+#
+foreach test {
+ {{.mb delete 0 end}
+ {}}
+ {{.mb add menubutton .help -text Help}
+ {}}
+ {{.mb add command .help.context -label "On Context..."}
+ {}}
+ {{.mb insert .help.context command index -label "By Index..."}
+ {}}
+ {{.mb delete .help}
+ {}}
+ {{.mb add menubutton .help -text HELP -menu {
+ command index -label "By Index..."
+ command context -label "By Context..."
+ separator sep1
+ command keyword -label "By Keyword..."
+ }}
+ {}}
+ {{.mb delete .help.sep1 .help.keyword}
+ {}}
+ {{.mb menuconfigure .help -text HeLp -menu {
+ command index -label "By Index..."
+ command context -label "By Context..."
+ separator sep1
+ command keyword -label "By Keyword..."
+ }}
+ {}}
+ {{.mb configure -menubuttons {
+ menubutton file -text File -menu {
+ options -tearoff on
+ command ok -label "OK"
+ command quit -label "Quit"
+ }
+ }}
+ {}}
+ {{.mb add menubutton .other -text Other -menu {
+ radiobutton r1 -label "Radio One"
+ radiobutton r2 -label "Radio Two"
+ }}
+ {}}
+ {{.mb insert .other menubutton view -text View -menu {
+ command uno -label Uno
+ command dos -label Dos
+ }}
+ {}}
+ {{.mb add cascade .view.more -label More -menu {
+ command one -label One
+ command two -label Two
+ cascade extra -label Extra -menu {
+ radiobutton rad1 -label "Choice One"
+ radiobutton rad2 -label "Choice Two"
+ cascade somemore \
+ -label "Some More" \
+ -helpstr "Yet some more" \
+ -menu {
+ command triangle -label "Triangle" -command {puts TRIANGLE}
+ command square -label "Square" -command {puts SQUARE}
+ command octagon -label "Octagon" -command {puts OCTAGON}
+ }
+ }
+ }}
+ {}}
+ {{.mb insert .view.uno cascade before -label Before -menu {
+ command red -label Red
+ command green -label Green
+ command blue -label Blue
+ }}
+ {}}
+ {{.mb add menubutton .help -text Help}
+ {}}
+ {{.mb add command .help.context -label "On Context..."}
+ {}}
+ {{.mb insert .help.context command index -label "By Index..."}
+ {}}
+ {{.mb insert .view.before.green cascade colors -label Colors -menu {
+ command orange -label Orange -command "puts ORANGE" -helpstr "orange"
+ separator sep1
+ command purple -label Purple
+ }}
+
+ {}}
+ {{.mb insert .view.before.colors.purple cascade morecolors -label "More Colors" -menu {}}
+ {}}
+ {{.mb add command .view.before.colors.morecolors.pink -label Pink}
+ {}}
+ {{.mb add command .view.before.colors.morecolors.peach -label Peach}
+ {}}
+ {{.mb add command .view.before.colors.morecolors.yellow -label Yellow}
+ {}}
+ {{.mb menuconfigure .view -text VIEW -menu {
+ command o -label OH -command {puts OH}
+ cascade negative -label Negative -menu {
+ command print -label Print
+ command save -label Save
+ }
+ # Comments are supported.
+# command dummy -label PlaceHolder
+ cascade plus -label Plus -menu {
+ command yep -label Yep
+ command nope -label Nope
+ }
+ }}
+ {}}
+ {{.mb menuconfigure .view.negative -label NEGATIVE -menu {
+ command print -label PRINT
+ command save -label SAVE
+ }}
+ {}}
+ {{.mb delete .0 .end}
+ {}}
+ } {
+ set method [lindex [lindex $test 0] 1]
+ set method_invoke [lindex $test 0]
+
+ set testContents "set msg {}\n"
+ append testContents \
+ "set result \[catch \{[lindex $test 0]\} msg\]\n"
+ append testContents \
+ "lappend result \[regexp -- \{[lindex $test 1]\} \$msg\] \n"
+ append testContents "set result\n"
+ test Menubar-4.$m "\[$method_invoke\]" $testContents \
+ [list 0 1]
+ update
+ incr m
+}
+
+#
+# Method tests which fail and produce errors or results
+# Specifically, deals with method invocation on empty menubar.
+#
+foreach test {
+ {1 {.mb delete .0 .last}
+ {bad path:}}
+ {0 {.mb index .0}
+ {-1}}
+ {0 {.mb index .end}
+ {-1}}
+ {0 {.mb index .last}
+ {-1}}
+ {0 {.mb index .help}
+ {-1}}
+ {1 {.mb delete .0}
+ {bad path:}}
+ {1 {.mb delete .end}
+ {bad path:}}
+ {1 {.mb delete .last}
+ {bad path:}}
+ {1 {.mb delete .help}
+ {bad path:}}
+ {1 {.mb insert .0 menubutton file -text File}
+ {bad path:}}
+ {1 {.mb insert .end menubutton file -text File}
+ {bad path:}}
+ {1 {.mb insert .last menubutton file -text File}
+ {bad path:}}
+ {1 {.mb insert .help menubutton file -text File}
+ {bad path:}}
+ {1 {.mb invoke .0.0}
+ {bad path:}}
+ {1 {.mb invoke .end.0}
+ {bad path:}}
+ {1 {.mb invoke .last.0}
+ {bad path:}}
+ {1 {.mb invoke .help.0}
+ {bad path:}}
+ {1 {.mb menucget .0 -text}
+ {bad path:}}
+ {1 {.mb menucget .end -text}
+ {bad path:}}
+ {1 {.mb menucget .last -text}
+ {bad path:}}
+ {1 {.mb menucget .help -text}
+ {bad path:}}
+ {1 {.mb menuconfigure .0 -text}
+ {bad path:}}
+ {1 {.mb menuconfigure .end -text}
+ {bad path:}}
+ {1 {.mb menuconfigure .last -text}
+ {bad path:}}
+ {1 {.mb menuconfigure .help -text}
+ {bad path:}}
+ {0 {.mb path *quit}
+ {}}
+ {1 {.mb type .0.0}
+ {bad path:}}
+ {1 {.mb type .0.end}
+ {bad path:}}
+ {1 {.mb type .0.last}
+ {bad path:}}
+ {1 {.mb type .0.new}
+ {bad path:}}
+ {1 {.mb yposition .0.new}
+ {bad path:}}
+ } {
+ set method_status [lindex $test 0]
+ set method_invoke [lindex $test 1]
+ set method [lindex $method_invoke 1]
+
+ set testContents "set msg {}\n"
+ append testContents \
+ "set result \[catch \{$method_invoke\} msg\]\n"
+ append testContents \
+ "lappend result \[regexp -- \{[lindex $test 2]\} \$msg\] \n"
+ append testContents "set result\n"
+ test Menubar-5.$m "\[$method_invoke\]" $testContents \
+ [list $method_status 1]
+ incr m
+ }
+
+#
+# Method tests which fail and produce errors or results
+# On a non-empty menubar...
+foreach test {
+ {0 {.mb configure -menubuttons {
+ menubutton file -text File -menu {
+ options -tearoff no
+ command ok -label "Ok"
+ command quit -label "Quit"
+ }
+ }}
+ {}}
+ {1 {.mb delete .file.hello}
+ {bad path}}
+ {0 {.mb index .0.hello}
+ {-1}}
+ {0 {.mb index .0.quit}
+ {1}}
+ {0 {.mb index 0.end}
+ {1}}
+ {0 {.mb index .file.last}
+ {1}}
+ {0 {.mb index .file.ok}
+ {0}}
+ {1 {.mb delete .view .file}
+ {bad path:}}
+ {1 {.mb delete .file .help}
+ {bad path:}}
+ {1 {.mb add command .file.menu}
+ {bad name}}
+ {1 {.mb add command .file.last}
+ {bad name}}
+ {1 {.mb add command .file.end}
+ {bad name}}
+ {1 {.mb add command .file.2}
+ {bad name}}
+ {1 {.mb insert .0 menu view -text View}
+ {bad type}}
+ {1 {.mb insert .file command view -text View}
+ {bad entry path}}
+ {0 {.mb insert .file menubutton view -text View}
+ {[.]mb[.]menubar[.]view}}
+ {1 {.mb invoke .0.quit}
+ {bad path}}
+ {0 {.mb menucget .0 -text}
+ {View}}
+ {0 {.mb menucget .end -text}
+ {File}}
+ {0 {.mb menucget .last -text}
+ {File}}
+ {1 {.mb menucget .help -text}
+ {bad path}}
+ {0 {.mb menuconfigure .0 -text}
+ {-text text Text {} View}}
+ {0 {.mb menuconfigure .end.last -label}
+ {-label {} {} {} Quit}}
+ {0 {.mb menuconfigure .last -text}
+ {-text text Text {} File}}
+ {1 {.mb menuconfigure .help -text}
+ {bad path}}
+ {0 {.mb path *quit}
+ {[.]file[.]quit}}
+ {0 {.mb type .end.0}
+ {command}}
+ {0 {.mb type .end.end}
+ {command}}
+ {0 {.mb type .end.last}
+ {command}}
+ {1 {.mb type .0.new}
+ {bad path}}
+ } {
+ set method_status [lindex $test 0]
+ set method_invoke [lindex $test 1]
+ set method [lindex $method_invoke 1]
+
+ set testContents "set msg {}\n"
+ append testContents \
+ "set result \[catch \{$method_invoke\} msg\]\n"
+ append testContents \
+ "lappend result \[regexp -- \{[lindex $test 2]\} \$msg\] \n"
+ append testContents "set result\n"
+ test Menubar-5.$m "\[$method_invoke\]" $testContents \
+ [list $method_status 1]
+ incr m
+ }
+
+#
+# Conclusion of constrcution/destruction tests
+#
+test Menubar-1.$c {Menubar destruction} {
+ destroy .mb
+ update
+} {}
+
+incr c
+
+test Menubar-1.$c {Menubar construction} {
+ iwidgets::Menubar .mb -menubuttons {
+ menubutton file -text File -menu {
+ options -tearoff no
+ command ok -label "Ok"
+ command quit -label "Quit"
+ }
+ }
+ pack .mb
+ update
+ .mb add menubutton .other -text Other -menu {
+ radiobutton r1 -label "Radio One"
+ radiobutton r2 -label "Radio Two"
+ }
+ update
+ .mb add menubutton view -text View -menu {
+ command uno -label Uno
+ command dos -label Dos
+ }
+ update
+ .mb add cascade .view.more -label More -menu {
+ command one -label One
+ command two -label Two
+ cascade extra -label Extra -menu {
+ radiobutton rad1 -label "Choice One"
+ radiobutton rad2 -label "Choice Two"
+ cascade somemore \
+ -label "Some More" \
+ -helpstr "Yet some more" \
+ -menu {
+ command triangle -label "Triangle" -command {puts TRIANGLE}
+ command square -label "Square" -command {puts SQUARE}
+ command octagon -label "Octagon" -command {puts OCTAGON}
+ }
+ }
+ }
+ update
+} {}
+
+incr c
+
+test Menubar-1.$c {Menubar destruction} {
+ destroy .mb
+ update
+} {}
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/tests/messagebox.test b/iwidgets/tests/messagebox.test
new file mode 100644
index 00000000000..6ce614492f5
--- /dev/null
+++ b/iwidgets/tests/messagebox.test
@@ -0,0 +1,195 @@
+# This file is a Tcl script to test out [incr Widgets] Messagebox class.
+# It is organized in the standard fashion for Tcl tests with the following
+# notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+#
+# Copyright (c) 1995 DSC Technologies Corporation
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# @(#) $Id$
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+wm geometry . {}
+raise .
+
+set c 1
+set o 1
+set m 1
+
+#
+# Initial construction test
+#
+test Messagebox-1.$c {Messagebox construction} {
+ iwidgets::Messagebox .mb
+ pack .mb -padx 10 -pady 10 -fill both -expand yes
+ update
+} {}
+
+incr c
+
+#
+# Option tests which are successful.
+#
+test Messagebox-2.$o {configuration option} {
+ llength [.mb configure]
+} {40}
+
+incr o
+
+foreach test {
+ {-activebackground #ececec #ececec}
+ {-activeforeground Black Black}
+ {-background #d9d9d9 #d9d9d9}
+ {-borderwidth 3 3}
+ {-cursor gumby gumby}
+ {-exportselection 0 0}
+ {-exportselection 1 1}
+ {-filename /tmp/foo /tmp/foo}
+ {-foreground Black Black}
+ {-height 0 0}
+ {-width 0 0}
+ {-width 550 550}
+ {-height 120 120}
+ {-highlightcolor Black Black}
+ {-highlightthickness 2 2}
+ {-labelmargin 5 5}
+ {-labeltext Label Label}
+ {-labelpos nw nw}
+ {-labelpos ne ne}
+ {-labelpos en en}
+ {-labelpos e e}
+ {-labelpos es es}
+ {-labelpos se se}
+ {-labelpos s s}
+ {-labelpos sw sw}
+ {-labelpos wn wn}
+ {-labelpos w w}
+ {-labelpos ws ws}
+ {-labelpos n n}
+ {-relief raised raised}
+ {-relief sunken sunken}
+ {-vscrollmode none none}
+ {-vscrollmode static static}
+ {-vscrollmode dynamic dynamic}
+ {-hscrollmode none none}
+ {-hscrollmode static static}
+ {-hscrollmode dynamic dynamic}
+ {-maxlines 1200 1200}
+ {-sbwidth 20 20}
+ {-savedir /tmp /tmp}
+ {-scrollmargin 5 5}
+ {-textbackground GhostWhite GhostWhite}} {
+ set option [lindex $test 0]
+ test Messagebox-2.$o "configuration options, $option" {
+ .mb configure $option [lindex $test 1]
+ lindex [.mb configure $option] 4
+ } [lindex $test 2]
+ update
+ incr o
+}
+
+#
+# Option tests which fail and produce errors.
+#
+foreach test {
+ {-visibleitems bogus {bad visibleitems option "bogus": should be widthxheight}}
+ {-hscrollmode bogus {bad hscrollmode option "bogus": should be static, dynamic, or none}}
+ {-vscrollmode bogus {bad vscrollmode option "bogus": should be static, dynamic, or none}}} {
+ set option [lindex $test 0]
+ test Messagebox-2.$o "configuration options, $option" {
+ list [catch {.mb configure $option [lindex $test 1]} msg] $msg
+ } [list 1 [lindex $test 2]]
+ incr o
+}
+
+#
+# Method tests which are successful.
+#
+foreach test {
+ {{.mb issue "Default test"} {}}
+ {{.mb type add ERROR -background red -foreground white -bell 1} {ERROR}}
+ {{.mb issue "ERROR test" ERROR} {}}
+ {{.mb type configure ERROR -font 7x13 -show 0} {}}
+ {{.mb issue "ERROR test" ERROR} {}}
+ {{.mb type cget ERROR -background} {red}}
+ {{.mb type remove ERROR} {}}
+ {{.mb clear} {}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Messagebox-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 0 [lindex $test 1]]
+ update
+ incr m
+}
+
+#
+# Method tests which fail and produce errors
+#
+foreach test {
+ {{.mb type bogus bogus} {bad type operation: "bogus", should be add, remove, configure or cget}}
+ {{.mb issue foo bogus} {bad message type: "bogus", use the type command to create a new types}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Messagebox-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 1 [lindex $test 1]]
+ incr m
+}
+
+#
+# Conclusion of constrcution/destruction tests
+#
+test Messagebox-1.$c {Messagebox destruction} {
+ destroy .mb
+ update
+} {}
+
+incr c
+
+test Messagebox-1.$c {Messagebox construction} {
+ iwidgets::messagebox .mb -hscrollmode dynamic -labeltext "Label" \
+ -labelpos n -labelmargin 5
+ pack .mb -padx 10 -pady 10 -fill both -expand yes
+ update
+} {}
+
+incr c
+
+test Messagebox-1.$c {Messagebox destruction} {
+ destroy .mb
+ update
+} {}
+
+incr c
+
+test Messagebox-1.$c {Messagebox destruction} {
+ iwidgets::messagebox .mb
+ pack .mb
+ destroy .mb
+ update
+} {}
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/tests/messagedialog.test b/iwidgets/tests/messagedialog.test
new file mode 100644
index 00000000000..7fc43042519
--- /dev/null
+++ b/iwidgets/tests/messagedialog.test
@@ -0,0 +1,163 @@
+# This file is a Tcl script to test out [incr Widgets] Messagedialog class.
+# It is organized in the standard fashion for Tcl tests with the following
+# notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+# 4.x - Other tests
+#
+# Copyright (c) 1995 DSC Technologies Corporation
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# @(#) $Id$
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+wm geometry . {}
+raise .
+
+set c 1
+set o 1
+set m 1
+
+#
+# Initial construction test
+#
+test Messagedialog-1.$c {Messagedialog construction} {
+ iwidgets::Messagedialog .md -text "Are you sure ?" -bitmap questhead
+ image create bitmap flagup -file $tk_library/demos/images/flagup.bmp
+ .md activate
+} {}
+
+incr c
+
+#
+# Option tests which are successful.
+#
+test Messagedialog-2.$o {configuration option} {
+ llength [.md configure]
+} {26}
+
+incr o
+
+foreach test {
+ {-background #d9d9d9 #d9d9d9}
+ {-buttonboxpos n n}
+ {-buttonboxpadx 10 10}
+ {-buttonboxpos e e}
+ {-buttonboxpos w w}
+ {-buttonboxpady 10 10}
+ {-buttonboxpos s s}
+ {-imagepos n n}
+ {-bitmap warning warning}
+ {-imagepos e e}
+ {-imagepos s s}
+ {-cursor gumby gumby}
+ {-image flagup flagup}
+ {-imagepos w w}
+ {-font -Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-* -Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-*}
+ {-foreground Black Black}
+ {-modality global global}
+ {-modality application application}
+ {-modality none none}
+ {-padx 15 15}
+ {-pady 15 15}
+ {-textpadx 15 15}
+ {-textpady 15 15}
+ {-separator off off}
+ {-thickness 4 4}
+ {-separator on on}
+ {-image {} {}}
+ {-title Messagedialog Messagedialog}} {
+ set option [lindex $test 0]
+ test Messagedialog-2.$o "configuration options, $option" {
+ .md configure $option [lindex $test 1]
+ lindex [.md configure $option] 4
+ } [lindex $test 2]
+ update
+ incr o
+}
+
+#
+# Option tests which fail and produce errors.
+#
+foreach test {
+ {-imagepos bogus {bad imagepos option "bogus": should be n, e, s, or w}}} {
+ set option [lindex $test 0]
+ test Messagedialog-2.$o "configuration options, $option" {
+ list [catch {.md configure $option [lindex $test 1]} msg] $msg
+ } [list 1 [lindex $test 2]]
+ incr o
+}
+
+#
+# Method tests which are successful.
+#
+foreach test {
+ {{.md childsite} {.md.shellchildsite.dschildsite}}
+ {{.md hide Help} {}}
+ {{.md hide Cancel} {}}
+ {{.md default Apply} {}}
+ {{.md show Cancel} {}}
+ {{.md deactivate} {}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Messagedialog-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 0 [lindex $test 1]]
+ update
+ incr m
+}
+
+#
+# Conclusion of constrcution/destruction tests
+#
+test Messagedialog-1.$c {Messagedialog destruction} {
+ destroy .md
+ update
+} {}
+
+incr c
+
+test Messagedialog-1.$c {Messagedialog construction} {
+ iwidgets::Messagedialog .md
+ update
+} {}
+
+incr c
+
+test Messagedialog-1.$c {Messagedialog destruction} {
+ destroy .md
+ image delete flagup
+ update
+} {}
+
+incr c
+
+test Messagedialog-1.$c {Messagedialog construction} {
+ iwidgets::messagedialog .md
+ destroy .md
+ update
+} {}
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/tests/notebook.test b/iwidgets/tests/notebook.test
new file mode 100644
index 00000000000..b09a6ef0389
--- /dev/null
+++ b/iwidgets/tests/notebook.test
@@ -0,0 +1,325 @@
+# This file is a Tcl script to test out [incr Widgets] Notebook class.
+# It is organized in the standard fashion for Tcl tests with the following
+# notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+#
+# Copyright (c) 1995 DSC Technologies Corporation
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# @(#) $Id$
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+wm geometry . {}
+raise .
+
+set c 1
+set o 1
+set m 1
+
+#
+# Initial construction test
+#
+test Notebook-1.$c {Notebook construction} {
+ iwidgets::Notebook .nb
+ pack .nb
+ update
+ .nb add -label one
+ update
+ .nb add -label two
+ update
+ .nb add -label three
+ update
+} {}
+
+incr c
+
+#
+# Option tests which are successful.
+#
+test Notebook-2.$o {configuration option} {
+ llength [.nb configure]
+} {7}
+
+incr o
+
+foreach test {
+ {-width 0 0 }
+ {-background #CDCDB7B7B5B5 #CDCDB7B7B5B5 }
+ {-auto true true }
+ {-height 0 0 }
+ {-scrollcommand }
+ {-cursor }
+ } {
+ set option [lindex $test 0]
+ test Notebook-2.$o "configuration options, $option" {
+ .nb configure $option [lindex $test 1]
+ lindex [.nb configure $option] 4
+ } [lindex $test 2]
+ update
+ incr o
+}
+
+#
+# PageConfigure Option tests which are successful.
+#
+test Notebook-2.$o {page configuration option} {
+ llength [.nb pageconfigure 0]
+} {8}
+
+# do pageconfigure tests also...
+foreach test {
+ {0 -label Hello Hello}
+ {end -label "Hello World" "Hello World"}
+ } {
+ set index [lindex $test 0]
+ set option [lindex $test 1]
+ test Notebook-2.$o "configuration options, $option" {
+ .nb pageconfigure $index $option [lindex $test 2]
+ lindex [.nb pageconfigure $index $option] 4
+ } [lindex $test 3]
+ update
+ incr o
+}
+
+#
+# Option tests which fail and produce errors.
+#
+#foreach test {
+# { -OPTION BADVALUE {ERROR_MESSAGE} }
+# } {
+# set option [lindex $test 0]
+# test Notebook-2.$o "configuration options, $option" {
+# list [catch {.bb configure $option [lindex $test 1]} msg] $msg
+# } [list 1 [lindex $test 2]]
+# incr o
+#}
+
+#
+# Method tests which are successful.
+#
+foreach test {
+ {0 {.nb add}
+ {[.]nb[.]cs[.]page[0-9]+[.]cs}}
+ {0 {.nb add}
+ {[.]nb[.]cs[.]page[0-9]+[.]cs}}
+ {0 {.nb add}
+ {[.]nb[.]cs[.]page[0-9]+[.]cs}}
+ {0 {.nb add -label Never}
+ {[.]nb[.]cs[.]page[0-9]+[.]cs}}
+ {0 {.nb add}
+ {[.]nb[.]cs[.]page[0-9]+[.]cs}}
+ {0 {.nb add -label "Hello World" -disabledforeground gray}
+ {[.]nb[.]cs[.]page[0-9]+[.]cs}}
+ {0 {.nb childsite Never}
+ {[.]nb[.]cs[.]page[0-9]+[.]cs}}
+ {0 {.nb childsite 0}
+ {[.]nb[.]cs[.]page[0-9]+[.]cs}}
+ {0 {.nb childsite end}
+ {[.]nb[.]cs[.]page[0-9]+[.]cs}}
+ {0 {.nb index end}
+ {[0-9]+}}
+ {0 {.nb index Never}
+ {[0-9]+}}
+ {0 {.nb index 0}
+ {0}}
+ {0 {.nb select 0}
+ {0}}
+ {0 {.nb select select}
+ {0}}
+ {0 {.nb select end}
+ {[0-9]+}}
+ {0 {.nb select "Hello World"}
+ {[0-9]+}}
+ {0 {.nb insert 0}
+ {[.]nb[.]cs[.]page[0-9]+[.]cs}}
+ {0 {.nb insert select -label "An Insert"}
+ {[.]nb[.]cs[.]page[0-9]+[.]cs}}
+ {0 {.nb insert end -label "Next To Last"}
+ {[.]nb[.]cs[.]page[0-9]+[.]cs}}
+ {0 {.nb select 0}
+ {0}}
+ {0 {.nb next}
+ {1}}
+ {0 {.nb next}
+ {2}}
+ {0 {.nb prev}
+ {1}}
+ {0 {.nb prev}
+ {0}}
+ {0 {.nb delete Never}
+ {}}
+ {0 {.nb delete 1 2}
+ {}}
+ {0 {.nb delete 0 "Hello World"}
+ {}}
+ {0 {.nb add}
+ {[.]nb[.]cs[.]page[0-9]+[.]cs}}
+ {0 {.nb add}
+ {[.]nb[.]cs[.]page[0-9]+[.]cs}}
+ {0 {.nb add}
+ {[.]nb[.]cs[.]page[0-9]+[.]cs}}
+ {0 {.nb add}
+ {[.]nb[.]cs[.]page[0-9]+[.]cs}}
+ {0 {.nb delete 0 end}
+ {}}
+ {0 {.nb add}
+ {[.]nb[.]cs[.]page[0-9]+[.]cs}}
+ {0 {.nb add}
+ {[.]nb[.]cs[.]page[0-9]+[.]cs}}
+ {0 {.nb add}
+ {[.]nb[.]cs[.]page[0-9]+[.]cs}}
+ {0 {.nb add}
+ {[.]nb[.]cs[.]page[0-9]+[.]cs}}
+ {0 {.nb select 2}
+ {[-]*[0-9]+}}
+ {0 {.nb delete select end}
+ {}}
+ {0 {.nb delete 0 end}
+ {}}
+ {0 {.nb add -label "First Page"}
+ {[.]nb[.]cs[.]page[0-9]+[.]cs}}
+ {0 {.nb add -label "Second Page"}
+ {[.]nb[.]cs[.]page[0-9]+[.]cs}}
+ {0 {.nb add -label "Third Page"}
+ {[.]nb[.]cs[.]page[0-9]+[.]cs}}
+ {0 {.nb add -label "Fourth Page"}
+ {[.]nb[.]cs[.]page[0-9]+[.]cs}}
+ {0 {.nb add -label "Fifth Page"}
+ {[.]nb[.]cs[.]page[0-9]+[.]cs}}
+ {0 {.nb add -label "Sixth Page"}
+ {[.]nb[.]cs[.]page[0-9]+[.]cs}}
+ {0 {.nb select "First Page"}
+ {[-]*[0-9]+}}
+ {0 {.nb delete select "Second Page"}
+ {}}
+ {0 {.nb delete "Third Page" 1}
+ {}}
+ {0 {.nb delete "Fifth Page" "Sixth Page"}
+ {}}
+ } {
+ set method_status [lindex $test 0]
+ set method_invoke [lindex $test 1]
+ set method [lindex $method_invoke 1]
+
+ set testContents "set msg {}\n"
+ append testContents \
+ "set result \[catch \{$method_invoke\} msg\]\n"
+ append testContents \
+ "lappend result \[regexp -- \{[lindex $test 2]\} \$msg\] \n"
+ append testContents "set result\n"
+ test Notebook-3.$m "\[$method_invoke\]" $testContents \
+ [list $method_status 1]
+ update
+ incr m
+}
+
+#
+# Method tests which fail and produce errors
+#
+set m 1
+foreach test {
+ {1 {.nb delete 0 end} {can't delete page}}
+ {1 {.nb childsite 0} {can't get childsite, no pages}}
+ {0 {.nb add} {}}
+ {1 {.nb childsite 1} {bad Notebook page index in childsite method}}
+ {1 {.nb childsite -1} {bad Notebook page index in childsite method}}
+ {0 {.nb delete 0} {}}
+ {1 {.nb delete 0} {can't delete page, no pages}}
+ {0 {.nb add} {}}
+ {1 {.nb delete 1} {bad Notebook page index in delete method:}}
+ {1 {.nb delete select} {bad Notebook page index in delete method:}}
+ {0 {.nb delete 0} {}}
+ {0 {.nb add} {}}
+ {1 {.nb delete 0 1} {bad Notebook page index2 in delete method:}}
+ {1 {.nb delete 1 4} {bad Notebook page index1 in delete method:}}
+ {0 {.nb add} {}}
+ {1 {.nb delete 1 0} {bad Notebook page index1 in delete method: index1 is greater than index2}}
+ {0 {.nb delete 0 1} {}}
+ {0 {.nb add} {}}
+ {1 {.nb delete 0 1 4 5 6} {wrong # args}}
+ {1 {.nb delete} {wrong # args}}
+ {0 {.nb delete 0} {}}
+ {1 {.nb delete 0} {can't delete page}}
+ {1 {.nb delete select} {can't delete page}}
+ {1 {.nb insert 0} {can't insert page}}
+ {0 {.nb add} {}}
+ {0 {.nb add} {}}
+ {1 {.nb insert 2} {bad Notebook page index in insert method:}}
+ {1 {.nb insert -1} {bad Notebook page index}}
+ {0 {.nb delete 0 end} {}}
+ {1 {.nb next} {can't move to next page, no pages in the notebook}}
+ {1 {.nb prev} {can't move to previous page, no pages in the notebook}}
+ {1 {.nb select 0} {can't select page}}
+ {0 {.nb add} {}}
+ {1 {.nb select 1} {bad Notebook page index in select method:}}
+ {0 {.nb delete 0} {}}
+ } {
+ set method_status [lindex $test 0]
+ set method_invoke [lindex $test 1]
+ set method [lindex $method_invoke 1]
+
+ set testContents "set msg {}\n"
+ append testContents \
+ "set result \[catch \{$method_invoke\} msg\]\n"
+ append testContents \
+ "lappend result \[regexp -- \{[lindex $test 2]\} \$msg\] \n"
+ append testContents "set result\n"
+ test Notebook-4.$m "\[$method_invoke\]" $testContents \
+ [list $method_status 1]
+ incr m
+ }
+
+
+# Conclusion of constrcution/destruction tests
+#
+test Notebook-1.$c {Notebook destruction} {
+ destroy .nb
+ update
+} {}
+
+incr c
+
+test Notebook-1.$c {Notebook construction} {
+ iwidgets::Notebook .nb -width 100 -height 100
+ pack .nb
+ update
+ .nb add -label one
+ update
+ .nb add -label two
+ update
+ .nb add -label three
+ update
+} {}
+
+incr c
+
+test Notebook-1.$c {Notebook destruction} {
+ destroy .nb
+ update
+} {}
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/tests/optionmenu.test b/iwidgets/tests/optionmenu.test
new file mode 100644
index 00000000000..f0898af4ecb
--- /dev/null
+++ b/iwidgets/tests/optionmenu.test
@@ -0,0 +1,201 @@
+# This file is a Tcl script to test out [incr Widgets] Optionmenu class.
+# It is organized in the standard fashion for Tcl tests with the following
+# notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+#
+# Copyright (c) 1995 DSC Technologies Corporation
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# @(#) $Id$
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+wm geometry . {}
+raise .
+
+set c 1
+set o 1
+set m 1
+
+#
+# Initial construction test
+#
+test Optionmenu-1.$c {Optionmenu construction} {
+ iwidgets::Optionmenu .om
+ pack .om -padx 10 -pady 10 -fill both -expand yes
+ update
+} {}
+
+incr c
+
+#
+# Option tests which are successful.
+#
+test Optionmenu-2.$o {configuration option} {
+ llength [.om configure]
+} {27}
+
+incr o
+
+foreach test {
+ {-activebackground #ececec #ececec}
+ {-activeborderwidth 2 2}
+ {-activeforeground Black Black}
+ {-labeltext Optionmenu Optionmenu}
+ {-background #d9d9d9 #d9d9d9}
+ {-borderwidth 2 2}
+ {-labelpos w w}
+ {-clicktime 100 100}
+ {-command {.om configure -background Red} {.om configure -background Red}}
+ {-cursor gumby gumby}
+ {-labelpos nw nw}
+ {-cyclicon false false}
+ {-cyclicon true true}
+ {-font -Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-* -Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-*}
+ {-labelpos n n}
+ {-foreground Black Black}
+ {-labelpos ne ne}
+ {-labelpos se se}
+ {-labelfont -Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-* -Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-*}
+ {-labelmargin 5 5}
+ {-labelpos e e}
+ {-state disabled disabled}
+ {-labelpos s s}
+ {-state normal normal}
+ {-labelpos sw sw}
+ {-labelpos w w}
+ {-sticky w w}
+ {-sticky nw nw}
+ {-sticky n n}
+ {-sticky ne ne}
+ {-sticky e e}
+ {-sticky se se}
+ {-sticky s s}
+ {-sticky sw sw}
+ {-sticky news news}
+ {-width 140 140}} {
+ set option [lindex $test 0]
+ test Optionmenu-2.$o "configuration options, $option" {
+ .om configure $option [lindex $test 1]
+ lindex [.om configure $option] 4
+ } [lindex $test 2]
+ update
+ incr o
+}
+
+#
+# Option tests which fail and produce errors.
+#
+foreach test {
+ {-state bogus {bad state option "bogus": should be disabled or normal}}} {
+ set option [lindex $test 0]
+ test Optionmenu-2.$o "configuration options, $option" {
+ list [catch {.om configure $option [lindex $test 1]} msg] $msg
+ } [list 1 [lindex $test 2]]
+ incr o
+}
+
+#
+# Method tests which are successful.
+#
+foreach test {
+ {{.om index 0} 0}
+ {{.om insert end Unix VMS Linux OS/2 {Windows NT} DOS} {}}
+ {{.om index end} 5}
+ {{.om index select} 0}
+ {{.om index OS/2} 3}
+ {{.om delete 0 1} {}}
+ {{.om delete OS/2} {}}
+ {{.om disable 0} {}}
+ {{.om enable 0} {}}
+ {{.om disable DOS} {}}
+ {{.om enable DOS} {}}
+ {{.om select Linux} {}}
+ {{.om get} Linux}
+ {{.om get 1} {Windows NT}}
+ {{.om get 0 end} {Linux {Windows NT} DOS}}
+ {{.om insert 0 Unix VMS} {}}
+ {{.om select 3} {}}
+ {{.om select end} {}}
+ {{.om sort ascending} {}}
+ {{.om sort descending} {}}
+ {{.om sort increasing} {}}
+ {{.om sort decreasing} {}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Optionmenu-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 0 [lindex $test 1]]
+ update
+ incr m
+}
+
+#
+# Method tests which fail and produce errors
+#
+foreach test {
+ {{.om index bogus} {bad Optionmenu index "bogus"}}
+ {{.om sort bogus} {bad sort argument "bogus": should be ascending, descending, increasing, or decreasing}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Optionmenu-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 1 [lindex $test 1]]
+ incr m
+}
+
+#
+# Conclusion of constrcution/destruction tests
+#
+test Optionmenu-1.$c {Optionmenu destruction} {
+ destroy .om
+ update
+} {}
+
+incr c
+
+test Optionmenu-1.$c {Optionmenu construction} {
+ iwidgets::optionmenu .om -labeltext "Label" \
+ -labelpos n
+ pack .om -padx 10 -pady 10 -fill both -expand yes
+ update
+} {}
+
+incr c
+
+test Optionmenu-1.$c {Optionmenu destruction} {
+ destroy .om
+ update
+} {}
+
+incr c
+
+test Optionmenu-1.$c {Optionmenu destruction} {
+ iwidgets::optionmenu .om
+ pack .om
+ destroy .om
+ update
+} {}
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/tests/panedwindow.test b/iwidgets/tests/panedwindow.test
new file mode 100644
index 00000000000..8c6f28b8dec
--- /dev/null
+++ b/iwidgets/tests/panedwindow.test
@@ -0,0 +1,175 @@
+# This file is a Tcl script to test out [incr Widgets] Panedwindow class.
+# It is organized in the standard fashion for Tcl tests with the following
+# notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+#
+# Copyright (c) 1995 DSC Technologies Corporation
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# @(#) $Id$
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+wm geometry . {}
+raise .
+
+set c 1
+set o 1
+set m 1
+
+#
+# Initial construction test
+#
+test Panedwindow-1.$c {Panedwindow construction} {
+ iwidgets::Panedwindow .pw -width 200 -height 200
+ .pw add top
+ .pw add bottom
+ pack .pw -fill both -expand yes
+ update
+} {}
+
+incr c
+
+#
+# Option tests which are successful.
+#
+test Panedwindow-2.$o {configuration option} {
+ llength [.pw configure]
+} {13}
+
+incr o
+
+foreach test {
+ {-background #d9d9d9 #d9d9d9}
+ {-cursor gumby gumby}
+ {-height 300 300}
+ {-orient vertical vertical}
+ {-sashborderwidth 3 3}
+ {-sashcursor arrow arrow}
+ {-sashheight 12 12}
+ {-sashindent -20 -20}
+ {-sashwidth 12 12}
+ {-showhandle 0 0}
+ {-showhandle 1 1}
+ {-thickness 5 5}
+ {-orient horizontal horizontal}
+ {-width 300 300}} {
+ set option [lindex $test 0]
+ test Panedwindow-2.$o "configuration options, $option" {
+ .pw configure $option [lindex $test 1]
+ lindex [.pw configure $option] 4
+ } [lindex $test 2]
+ update
+ incr o
+}
+
+#
+# Method tests which are successful.
+#
+foreach test {
+ {{.pw index 0} {0}}
+ {{.pw index end} {1}}
+ {{.pw index top} {0}}
+ {{.pw index b*} {1}}
+ {{.pw childsite 0} {.pw.pane0.childsite}}
+ {{.pw childsite end} {.pw.pane1.childsite}}
+ {{.pw childsite 1} {.pw.pane1.childsite}}
+ {{.pw childsite} {.pw.pane0.childsite .pw.pane1.childsite}}
+ {{.pw fraction 25 75} {}}
+ {{.pw add middle -margin 10 -minimum 10} {.pw.pane2}}
+ {{.pw delete middle} {}}
+ {{.pw insert 1 middle} {.pw.pane3}}
+ {{.pw fraction 20 30 50} {}}
+ {{.pw reset} {}}
+ {{.pw hide end} {}}
+ {{.pw show bottom} {}}
+ {{.pw paneconfigure 0 -minimum} {-minimum minimum Minimum 10 10}}
+ {{.pw paneconfigure end -margin 10} {}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Panedwindow-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 0 [lindex $test 1]]
+ update
+ incr m
+}
+
+#
+# Method tests which fail and produce errors
+#
+foreach test {
+ {{.pw index 5} {Panedwindow index "5" is out of range}}
+ {{.pw index bogus} {bad Panedwindow index "bogus": must be number, end, or pattern}}
+ {{.pw configure -showhandle foo} {Invalid option for -showhandle: foo. Must be 1 or 0.}}
+ {{.pw fraction 10 20 30} {bad fraction arguments "10 20 30": they should add up to 100}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Panedwindow-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 1 [lindex $test 1]]
+ incr m
+}
+
+#
+# Conclusion of constrcution/destruction tests
+#
+test Panedwindow-1.$c {Panedwindow destruction} {
+ destroy .pw
+ update
+} {}
+
+incr c
+
+test Panedwindow-1.$c {Panedwindow construction} {
+ iwidgets::panedwindow .pw -width 200 -height 300
+ .pw add pane0
+ .pw add pane1
+ .pw add pane2
+ .pw add pane3
+ foreach pane [.pw childsite] {
+ button $pane.b -text $pane -relief raised -borderwidth 3
+ pack $pane.b -fill both -expand yes
+ }
+ .pw fraction 20 20 30 30
+ pack .pw -fill both -expand yes
+ update
+} {}
+
+incr c
+
+test Panedwindow-1.$c {Panedwindow destruction} {
+ destroy .pw
+ update
+} {}
+
+incr c
+
+test Panedwindow-1.$c {Panedwindow destruction} {
+ iwidgets::panedwindow .pw
+ pack .pw
+ destroy .pw
+ update
+} {}
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/tests/promptdialog.test b/iwidgets/tests/promptdialog.test
new file mode 100644
index 00000000000..6ac5a8bff83
--- /dev/null
+++ b/iwidgets/tests/promptdialog.test
@@ -0,0 +1,175 @@
+# This file is a Tcl script to test out [incr Widgets] Promptdialog class.
+# It is organized in the standard fashion for Tcl tests with the following
+# notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+# 4.x - Other tests
+#
+# Copyright (c) 1995 DSC Technologies Corporation
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# @(#) $Id$
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+wm geometry . {}
+raise .
+
+set c 1
+set o 1
+set m 1
+
+#
+# Initial construction test
+#
+test Promptdialog-1.$c {Promptdialog construction} {
+ iwidgets::Promptdialog .pd
+ .pd activate
+} {}
+
+incr c
+
+#
+# Option tests which are successful.
+#
+test Promptdialog-2.$o {configuration option} {
+ llength [.pd configure]
+} {38}
+
+incr o
+
+foreach test {
+ {-background #d9d9d9 #d9d9d9}
+ {-buttonboxpos n n}
+ {-buttonboxpadx 10 10}
+ {-buttonboxpos e e}
+ {-buttonboxpos w w}
+ {-buttonboxpady 10 10}
+ {-buttonboxpos s s}
+ {-cursor gumby gumby}
+ {-exportselection 1 1}
+ {-modality global global}
+ {-modality application application}
+ {-modality none none}
+ {-padx 15 15}
+ {-pady 15 15}
+ {-separator off off}
+ {-thickness 5 5}
+ {-separator on on}
+ {-title "Prompt Dialog" "Prompt Dialog"}
+ {-foreground Black Black}
+ {-textbackground GhostWhite GhostWhite}
+ {-insertbackground Black Black}
+ {-insertborderwidth 1 1}
+ {-insertborderwidth 0 0}
+ {-insertofftime 400 400}
+ {-insertontime 700 700}
+ {-insertwidth 3 3}
+ {-labelpos nw nw}
+ {-labelpos n n}
+ {-labelpos ne ne}
+ {-labelpos en en}
+ {-labelpos e e}
+ {-labelpos es es}
+ {-labelpos sw sw}
+ {-labelpos s s}
+ {-labelpos se se}
+ {-labelpos wn wn}
+ {-labelpos w w}
+ {-labelpos ws ws}
+ {-labeltext Label Label}
+ {-relief sunken sunken}
+ {-textbackground GhostWhite GhostWhite}
+ {-validate numeric numeric}
+ {-validate alphabetic alphabetic}
+ {-validate alphanumeric alphanumeric}} {
+ set option [lindex $test 0]
+ test Promptdialog-2.$o "configuration options, $option" {
+ .pd configure $option [lindex $test 1]
+ lindex [.pd configure $option] 4
+ } [lindex $test 2]
+ update
+ incr o
+}
+
+#
+# Method tests which are successful.
+#
+foreach test {
+ {{.pd childsite} {.pd.shellchildsite.dschildsite}}
+ {{.pd insert end "Test String"} {}}
+ {{.pd get} {Test String}}
+ {{.pd delete 0 end} {}}
+ {{.pd insert end "Another Test"} {}}
+ {{.pd icursor end} {}}
+ {{.pd index end} 12}
+ {{.pd selection from 0} {}}
+ {{.pd selection to end} {}}
+ {{.pd xview 3} {}}
+ {{.pd clear} {}}
+ {{.pd hide Help} {}}
+ {{.pd hide Cancel} {}}
+ {{.pd default Apply} {}}
+ {{.pd show Cancel} {}}
+ {{.pd deactivate} {}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Promptdialog-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 0 [lindex $test 1]]
+ update
+ incr m
+}
+
+#
+# Conclusion of constrcution/destruction tests
+#
+test Promptdialog-1.$c {Promptdialog destruction} {
+ destroy .pd
+ update
+} {}
+
+incr c
+
+test Promptdialog-1.$c {Promptdialog construction} {
+ iwidgets::promptdialog .pd
+ update
+} {}
+
+incr c
+
+test Promptdialog-1.$c {Promptdialog destruction} {
+ destroy .pd
+ update
+} {}
+
+incr c
+
+test Promptdialog-1.$c {Promptdialog destruction} {
+ iwidgets::promptdialog .pd
+ destroy .pd
+ update
+} {}
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/tests/pushbutton.test b/iwidgets/tests/pushbutton.test
new file mode 100644
index 00000000000..b2bc8488f60
--- /dev/null
+++ b/iwidgets/tests/pushbutton.test
@@ -0,0 +1,152 @@
+# This file is a Tcl script to test out [incr Widgets] Pushbutton class.
+# It is organized in the standard fashion for Tcl tests with the following
+# notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+#
+# Copyright (c) 1995 DSC Technologies Corporation
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# @(#) $Id$
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+wm geometry . {}
+raise .
+
+set c 1
+set o 1
+set m 1
+
+#
+# Initial construction test
+#
+test Pushbutton-1.$c {Pushbutton construction} {
+ iwidgets::Pushbutton .pb
+ pack .pb -padx 10 -pady 10
+ image create bitmap flagup -file $tk_library/demos/images/flagup.bmp
+ update
+} {}
+
+incr c
+
+#
+# Option tests which are successful.
+#
+test Pushbutton-2.$o {configuration option} {
+ llength [.pb configure]
+} {27}
+
+incr o
+
+foreach test {
+ {-activebackground #ececec #ececec}
+ {-activeforeground Black Black}
+ {-background #d9d9d9 #d9d9d9}
+ {-borderwidth 2 2}
+ {-command {.pb configure -background Red} {.pb configure -background Red}}
+ {-defaultring 1 1}
+ {-text Hello Hello}
+ {-width 100 100}
+ {-bitmap error error}
+ {-image flagup flagup}
+ {-defaultring 0 0}
+ {-padx 10 10}
+ {-padx 8 8}
+ {-pady 8 8}
+ {-pady 4 4}
+ {-image {} {}}
+ {-cursor gumby gumby}
+ {-bitmap {} {}}
+ {-font 6x13 6x13}
+ {-foreground Black Black}
+ {-height 70 70}
+ {-width 100 100}
+ {-underline 0 0}
+ {-highlightthickness 3 3}
+ {-highlightcolor blue blue}
+ {-highlightcolor black black}
+ {-highlightthickness 2 2}
+ {-state disabled disabled}
+ {-state normal normal}
+ {-defaultringpad 6 6}
+ {-width 120 120}} {
+ set option [lindex $test 0]
+ test Pushbutton-2.$o "configuration options, $option" {
+ .pb configure $option [lindex $test 1]
+ lindex [.pb configure $option] 4
+ } [lindex $test 2]
+ update
+ incr o
+}
+
+#
+# Method tests which are successful.
+#
+foreach test {
+ {{.pb flash} {}}
+ {{.pb invoke} {}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Pushbutton-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 0 [lindex $test 1]]
+ update
+ incr m
+}
+
+#
+# Conclusion of constrcution/destruction tests
+#
+test Pushbutton-1.$c {Pushbutton destruction} {
+ destroy .pb
+ update
+ image delete flagup
+} {}
+
+incr c
+
+test Pushbutton-1.$c {Pushbutton construction} {
+ iwidgets::pushbutton .pb -text "Push Button" -defaultring yes
+ pack .pb -padx 10 -pady 10
+ update
+} {}
+
+incr c
+
+test Pushbutton-1.$c {Pushbutton destruction} {
+ destroy .pb
+ update
+} {}
+
+incr c
+
+test Pushbutton-1.$c {Pushbutton destruction} {
+ iwidgets::pushbutton .pb
+ pack .pb
+ destroy .pb
+ update
+} {}
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/tests/radiobox.test b/iwidgets/tests/radiobox.test
new file mode 100644
index 00000000000..a2899b08423
--- /dev/null
+++ b/iwidgets/tests/radiobox.test
@@ -0,0 +1,167 @@
+# This file is a Tcl script to test out [incr Widgets] Radiobox class.
+# It is organized in the standard fashion for Tcl tests with the following
+# notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+#
+# Copyright (c) 1995 DSC Technologies Corporation
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# @(#) $Id$
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+wm geometry . {}
+raise .
+
+set c 1
+set o 1
+set m 1
+
+#
+# Initial construction test
+#
+test Radiobox-1.$c {Radiobox construction} {
+ iwidgets::Radiobox .rb -labeltext "Radiobox"
+ pack .rb -padx 10 -pady 10 -fill both -expand yes
+ update
+} {}
+
+incr c
+
+#
+# Option tests which are successful.
+#
+test Radiobox-2.$o {configuration option} {
+ llength [.rb configure]
+} {19}
+
+incr o
+
+test Radiobox-1.$c {Radiobox add method} {
+ set ::radiocommand 0
+ .rb configure -command {set ::radiocommand 1}
+ .rb add foo -text Foo
+ .rb add bar -text Bar
+} {bar}
+update
+
+incr m
+
+test Radiobox-1.$m {Radiobox add test} {
+ #
+ # This is the 2nd part of the previous test
+ # It was added (along with the modifications to the previous
+ # test) to test for a bug that was fixed in version 1.8 of the
+ # radiobox. -- Marty Backe 26 February 2002
+ #
+ set ::radiocommand
+} {0}
+
+incr m
+
+foreach test {
+ {-background #d9d9d9 #d9d9d9}
+ {-borderwidth 4 4}
+ {-borderwidth 2 2}
+ {-cursor gumby gumby}
+ {-foreground Green Green}
+ {-foreground Black Black}
+ {-labelmargin 5 5}
+ {-labelpos w w}
+ {-labelpos nw nw}
+ {-labelpos n n}
+ {-labelpos ne ne}
+ {-labelpos e e}
+ {-labelpos se se}
+ {-labelpos s s}
+ {-labelpos sw sw}
+ {-labeltext Label Label}
+ {-relief raised raised}
+ {-relief sunken sunken}} {
+ set option [lindex $test 0]
+ test Radiobox-2.$o "configuration options, $option" {
+ .rb configure $option [lindex $test 1]
+ lindex [.rb configure $option] 4
+ } [lindex $test 2]
+ update
+ incr o
+}
+
+#
+# Method tests which are successful.
+#
+foreach test {
+ {{.rb insert bar zoo -text Zoo} zoo}
+ {{.rb index z*} 1}
+ {{.rb select foo} {}}
+ {{.rb get} foo}
+ {{.rb delete end} {}}
+ {{.rb deselect foo} {}}
+ {{.rb get} {}}
+ {{.rb index end} 1}
+ {{.rb flash 1} {}}
+ {{.rb buttonconfigure foo -text FOO} {}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Radiobox-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 0 [lindex $test 1]]
+ update
+ incr m
+}
+
+#
+# Conclusion of constrcution/destruction tests
+#
+test Radiobox-1.$c {Radiobox destruction} {
+ destroy .rb
+ update
+} {}
+
+incr c
+
+test Radiobox-1.$c {Radiobox construction} {
+ iwidgets::radiobox .rb
+ pack .rb -padx 10 -pady 10
+ update
+} {}
+
+incr c
+
+test Radiobox-1.$c {Radiobox destruction} {
+ destroy .rb
+ update
+} {}
+
+incr c
+
+test Radiobox-1.$c {Radiobox destruction} {
+ iwidgets::radiobox .rb
+ pack .rb
+ destroy .rb
+ update
+} {}
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/tests/regexpfield.test b/iwidgets/tests/regexpfield.test
new file mode 100644
index 00000000000..654b247f3e6
--- /dev/null
+++ b/iwidgets/tests/regexpfield.test
@@ -0,0 +1,197 @@
+# This file is a Tcl script to test out [incr Widgets] Regexpfield class.
+# It is organized in the standard fashion for Tcl tests with the following
+# notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+#
+# Copyright (c) 1995 DSC Technologies Corporation
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# @(#) $Id$
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+wm geometry . {}
+raise .
+
+set c 1
+set o 1
+set m 1
+
+#
+# Initial construction test
+#
+test Regexpfield-1.$c {Regexpfield construction} {
+ iwidgets::Regexpfield .ef -labeltext "Entry Field"
+ .ef insert end test
+ pack .ef -padx 10 -pady 10 -fill both -expand yes
+ update
+} {}
+
+incr c
+
+#
+# Option tests which are successful.
+#
+test Regexpfield-2.$o {configuration option} {
+ llength [.ef configure]
+} {40}
+
+incr o
+
+foreach test {
+ {-background #d9d9d9 #d9d9d9}
+ {-borderwidth 4 4}
+ {-borderwidth 2 2}
+ {-childsitepos e e}
+ {-childsitepos s s}
+ {-childsitepos w w}
+ {-childsitepos n n}
+ {-command {.ef configure -background red} {.ef configure -background red}}
+ {-cursor gumby gumby}
+ {-exportselection 0 0}
+ {-fixed 10 10}
+ {-fixed 0 0}
+ {-foreground Green Green}
+ {-foreground Black Black}
+ {-highlightcolor Red Red}
+ {-highlightthickness 2 2}
+ {-insertbackground Yellow Yellow}
+ {-insertbackground Black Black}
+ {-insertborderwidth 1 1}
+ {-insertborderwidth 0 0}
+ {-insertofftime 400 400}
+ {-insertontime 700 700}
+ {-insertwidth 3 3}
+ {-invalid {.ef configure -background Green} {.ef configure -background Green}}
+ {-justify right right}
+ {-justify center center}
+ {-justify left left}
+ {-labelmargin 5 5}
+ {-labelpos w w}
+ {-labelpos nw nw}
+ {-labelpos n n}
+ {-labelpos ne ne}
+ {-labelpos e e}
+ {-labelpos se se}
+ {-labelpos s s}
+ {-labelpos sw sw}
+ {-labeltext Label Label}
+ {-relief raised raised}
+ {-relief sunken sunken}
+ {-state disabled disabled}
+ {-state normal normal}
+ {-sticky w w}
+ {-sticky nw nw}
+ {-sticky n n}
+ {-sticky ne ne}
+ {-sticky e e}
+ {-sticky se se}
+ {-sticky s s}
+ {-sticky sw sw}
+ {-sticky news news}
+ {-textbackground GhostWhite GhostWhite}
+ {-regexp {.*} {.*}}
+ {-nocase 0 0}
+ {-width 30 30}} {
+ set option [lindex $test 0]
+ test Regexpfield-2.$o "configuration options, $option" {
+ .ef configure $option [lindex $test 1]
+ lindex [.ef configure $option] 4
+ } [lindex $test 2]
+ update
+ incr o
+}
+
+#
+# Option tests which fail and produce errors.
+#
+foreach test {
+ {-fixed bogus {bad fixed option "bogus", should be positive integer}}
+ {-childsitepos bogus {bad childsite option "bogus": should be n, e, s, or w}}} {
+ set option [lindex $test 0]
+ test Regexpfield-2.$o "configuration options, $option" {
+ list [catch {.ef configure $option [lindex $test 1]} msg] $msg
+ } [list 1 [lindex $test 2]]
+ incr o
+}
+
+#
+# Method tests which are successful.
+#
+foreach test {
+ {{.ef childsite} {.ef.lwchildsite.efchildsite}}
+ {{.ef clear} {}}
+ {{.ef insert end "Test String"} {}}
+ {{.ef get} {Test String}}
+ {{.ef delete 0 end} {}}
+ {{.ef insert end "Another Test"} {}}
+ {{.ef icursor end} {}}
+ {{.ef index end} 12}
+ {{.ef selection from 0} {}}
+ {{.ef selection to end} {}}
+ {{.ef xview 3} {}}
+ {{.ef clear} {}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Regexpfield-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 0 [lindex $test 1]]
+ update
+ incr m
+}
+
+#
+# Conclusion of constrcution/destruction tests
+#
+test Regexpfield-1.$c {Regexpfield destruction} {
+ destroy .ef
+ update
+} {}
+
+incr c
+
+test Regexpfield-1.$c {Regexpfield construction} {
+ iwidgets::regexpfield .ef -width 12
+ pack .ef -padx 10 -pady 10
+ update
+} {}
+
+incr c
+
+test Regexpfield-1.$c {Regexpfield destruction} {
+ destroy .ef
+ update
+} {}
+
+incr c
+
+test Regexpfield-1.$c {Regexpfield destruction} {
+ iwidgets::regexpfield .ef
+ pack .ef
+ destroy .ef
+ update
+} {}
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/tests/scrolledcanvas.test b/iwidgets/tests/scrolledcanvas.test
new file mode 100644
index 00000000000..ccb929ce99b
--- /dev/null
+++ b/iwidgets/tests/scrolledcanvas.test
@@ -0,0 +1,194 @@
+# This file is a Tcl script to test out [incr Widgets] ScrolledListBox class.
+# It is organized in the standard fashion for Tcl tests with the following
+# notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+#
+# Copyright (c) 1995 DSC Technologies Corporation
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# @(#) $Id$
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+wm geometry . {}
+raise .
+
+set c 1
+set o 1
+set m 1
+
+#
+# Initial construction test
+#
+test Scrolledcanvas-1.$c {Scrolledcanvas construction} {
+ iwidgets::Scrolledcanvas .sc
+ pack .sc -padx 10 -pady 10 -fill both -expand yes
+ update
+} {}
+
+incr c
+
+#
+# Option tests which are successful.
+#
+test Scrolledcanvas-2.$o {configuration option} {
+ llength [.sc configure]
+} {45}
+
+incr o
+
+foreach test {
+ {-automargin 15 15}
+ {-autoresize 0 0}
+ {-autoresize 1 1}
+ {-background #d9d9d9 #d9d9d9}
+ {-borderwidth 2 2}
+ {-closeenough 1.0 1.0}
+ {-confine 1 1}
+ {-cursor gumby gumby}
+ {-height 200 200}
+ {-hscrollmode none none}
+ {-hscrollmode static static}
+ {-hscrollmode dynamic dynamic}
+ {-labelfont 6x13 6x13}
+ {-labeltext scrolledcanvas scrolledcanvas}
+ {-labelmargin 3 3}
+ {-labelpos nw nw}
+ {-labelpos ne ne}
+ {-labelpos en en}
+ {-labelpos e e}
+ {-labelpos es es}
+ {-labelpos se se}
+ {-labelpos s s}
+ {-labelpos sw sw}
+ {-labelpos wn wn}
+ {-labelpos w w}
+ {-labelpos ws ws}
+ {-labelpos n n}
+ {-relief raised raised}
+ {-relief sunken sunken}
+ {-sbwidth 15 15}
+ {-xscrollincrement 10 10}
+ {-yscrollincrement 10 10}
+ {-scrollmargin 3 3}
+ {-scrollregion {0 0 0 0} {0 0 0 0}}
+ {-sticky w w}
+ {-sticky nw nw}
+ {-sticky n n}
+ {-sticky ne ne}
+ {-sticky e e}
+ {-sticky se se}
+ {-sticky s s}
+ {-sticky sw sw}
+ {-sticky news news}
+ {-textbackground GhostWhite GhostWhite}
+ {-vscrollmode static static}
+ {-vscrollmode none none}
+ {-vscrollmode dynamic dynamic}
+ {-width 200 200}} {
+ set option [lindex $test 0]
+ test Scrolledcanvas-2.$o "configuration options, $option" {
+ .sc configure $option [lindex $test 1]
+ lindex [.sc configure $option] 4
+ } [lindex $test 2]
+ update
+ incr o
+}
+
+#
+# Option tests which fail and produce errors.
+#
+foreach test {
+ {-vscrollmode bogus {bad vscrollmode option "bogus": should be static, dynamic, or none}}
+ {-hscrollmode bogus {bad hscrollmode option "bogus": should be static, dynamic, or none}}} {
+ set option [lindex $test 0]
+ test Scrolledcanvas-2.$o "configuration options, $option" {
+ list [catch {.sc configure $option [lindex $test 1]} msg] $msg
+ } [list 1 [lindex $test 2]]
+ incr o
+}
+
+#
+# Method tests which are successful.
+#
+foreach test {
+ {{.sc create rectangle 100 100 400 400 -fill red} {1}}
+ {{.sc create rectangle 300 300 600 600 -fill green} {2}}
+ {{.sc create rectangle 200 200 500 500 -fill blue} {3}}
+ {{.sc bbox 1} {99 99 401 401}}
+ {{.sc coords 2} {300.0 300.0 600.0 600.0}}
+ {{.sc delete 3} {}}
+ {{.sc move 1 10 10} {}}
+ {{.sc scale 1 100 100 0.8 0.8} {}}
+ {{.sc xview moveto 0} {}}
+ {{.sc yview moveto 0} {}}
+ {{.sc childsite} {.sc.lwchildsite.clipper.canvas}}
+ {{.sc justify left} {}}
+ {{.sc justify right} {}}
+ {{.sc justify top} {}}
+ {{.sc justify bottom} {}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Scrolledcanvas-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 0 [lindex $test 1]]
+ update
+ incr m
+}
+
+#
+# Conclusion of constrcution/destruction tests
+#
+test Scrolledcanvas-1.$c {Scrolledcanvas destruction} {
+ destroy .sc
+ update
+} {}
+
+incr c
+
+test Scrolledcanvas-1.$c {Scrolledcanvas construction} {
+ iwidgets::Scrolledcanvas .sc -autoresize no -labelpos nw \
+ -vscrollmode static -hscrollmode dynamic -labeltext "Scrolledcanvas"
+ pack .sc -padx 10 -pady 10 -fill both -expand yes
+ update
+} {}
+
+incr c
+
+test Scrolledcanvas-1.$c {Scrolledcanvas destruction} {
+ destroy .sc
+ update
+} {}
+
+incr c
+
+test Scrolledcanvas-1.$c {Scrolledcanvas destruction} {
+ iwidgets::scrolledcanvas .sc
+ pack .sc
+ destroy .sc
+ update
+} {}
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/tests/scrolledframe.test b/iwidgets/tests/scrolledframe.test
new file mode 100644
index 00000000000..05a54c94161
--- /dev/null
+++ b/iwidgets/tests/scrolledframe.test
@@ -0,0 +1,223 @@
+# This file is a Tcl script to test out [incr Widgets] Scrolledframe class.
+# It is organized in the standard fashion for Tcl tests with the following
+# notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+#
+# Copyright (c) 1995 DSC Technologies Corporation
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# @(#) $Id$
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+wm geometry . {}
+raise .
+
+set c 1
+set o 1
+set m 1
+
+#
+# Initial construction test
+#
+test Scrolledframe-1.$c {Scrolledframe construction} {
+ iwidgets::Scrolledframe .sf
+ pack .sf -padx 10 -pady 10 -fill both -expand yes
+ update
+} {}
+
+incr c
+
+#
+# Option tests which are successful.
+#
+test Scrolledframe-2.$o {configuration option} {
+ llength [.sf configure]
+} {28}
+
+incr o
+
+foreach test {
+ {-borderwidth 3 3}
+ {-height 180 180}
+ {-labeltext "Scrolled Frame" "Scrolled Frame"}
+ {-labelpos nw nw}
+ {-labelpos ne ne}
+ {-labelpos en en}
+ {-labelpos e e}
+ {-labelpos es es}
+ {-labelpos se se}
+ {-labelpos s s}
+ {-labelpos sw sw}
+ {-labelpos wn wn}
+ {-labelpos w w}
+ {-labelpos ws ws}
+ {-labelpos n n}
+ {-hscrollmode static static}
+ {-hscrollmode none none}
+ {-hscrollmode dynamic dynamic}
+ {-relief raised raised}
+ {-sbwidth 20 20}
+ {-relief sunken sunken}
+ {-scrollmargin 10 10}
+ {-sticky w w}
+ {-sticky nw nw}
+ {-sticky n n}
+ {-sticky ne ne}
+ {-sticky e e}
+ {-sticky se se}
+ {-sticky s s}
+ {-sticky sw sw}
+ {-sticky news news}
+ {-vscrollmode static static}
+ {-vscrollmode none none}
+ {-vscrollmode dynamic dynamic}
+ {-width 150 150}} {
+ set option [lindex $test 0]
+ test Scrolledframe-2.$o "configuration options, $option" {
+ .sf configure $option [lindex $test 1]
+ lindex [.sf configure $option] 4
+ } [lindex $test 2]
+ update
+ incr o
+}
+
+#
+# Option tests which fail and produce errors.
+#
+foreach test {
+ {-vscrollmode bogus {bad vscrollmode option "bogus": should be static, dynamic, or none}}
+ {-hscrollmode bogus {bad hscrollmode option "bogus": should be static, dynamic, or none}}} {
+ set option [lindex $test 0]
+ test Scrolledframe-2.$o "configuration options, $option" {
+ list [catch {.sf configure $option [lindex $test 1]} msg] $msg
+ } [list 1 [lindex $test 2]]
+ incr o
+}
+
+#
+# Method tests which are successful.
+#
+foreach test {
+ {{.sf childsite} {.sf.lwchildsite.clipper.canvas.sfchildsite}}
+ {{.sf xview moveto .5} {}}
+ {{.sf yview moveto .5} {}}
+ {{.sf justify left} {}}
+ {{.sf justify right} {}}
+ {{.sf justify top} {}}
+ {{.sf justify bottom} {}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Scrolledframe-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 0 [lindex $test 1]]
+ update
+ incr m
+}
+
+#
+# Creation of children tests.
+#
+test Scrolledframe-1.$c {Scrolledframe children} {
+ pack [button [.sf childsite].b1 -text Hello] -pady 10
+ update
+} {}
+
+incr c
+
+test Scrolledframe-1.$c {Scrolledframe children} {
+ pack [button [.sf childsite].b2 -text World] -pady 10
+ update
+} {}
+
+incr c
+
+test Scrolledframe-1.$c {Scrolledframe children} {
+ pack [button [.sf childsite].b3 -text "This is a test"] -pady 10
+ update
+} {}
+
+incr c
+
+test Scrolledframe-1.$c {Scrolledframe children} {
+ pack [button [.sf childsite].b4 -text "This is a really big button"] -pady 10
+ update
+} {}
+
+incr c
+
+test Scrolledframe-1.$c {Scrolledframe children} {
+ pack [button [.sf childsite].b5 -text "This is another really big button"] -pady 10
+ update
+} {}
+
+incr c
+
+test Scrolledframe-1.$c {Scrolledframe children} {
+ pack [button [.sf childsite].b6 -text "This is the last really big button"] -pady 10
+ update
+} {}
+
+incr c
+
+#
+# Conclusion of constrcution/destruction tests
+#
+test Scrolledframe-1.$c {Scrolledframe destruction} {
+ foreach child [winfo children [.sf childsite]] {
+ destroy $child
+ }
+
+ destroy .sf
+ update
+} {}
+
+incr c
+
+test Scrolledframe-1.$c {Scrolledframe construction} {
+ iwidgets::scrolledframe .sf -width 150 -height 180 \
+ -labelpos nw -labeltext Scrolledframe \
+ -vscrollmode static -hscrollmode dynamic
+ pack .sf -padx 10 -pady 10 -fill both -expand yes
+ update
+} {}
+
+incr c
+
+test Scrolledframe-1.$c {Scrolledframe destruction} {
+ destroy .sf
+ update
+} {}
+
+incr c
+
+test Scrolledframe-1.$c {Scrolledframe destruction} {
+ iwidgets::scrolledframe .sf
+ pack .sf
+ destroy .sf
+ update
+} {}
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/tests/scrolledhtml.test b/iwidgets/tests/scrolledhtml.test
new file mode 100644
index 00000000000..0c92a2b6826
--- /dev/null
+++ b/iwidgets/tests/scrolledhtml.test
@@ -0,0 +1,222 @@
+# This file is a Tcl script to test out [incr Widgets] Scrolledhtml class.
+# It is organized in the standard fashion for Tcl tests with the following
+# notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+#
+# Copyright (c) 1995 DSC Technologies Corporation
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# @(#) $Id: scrolledhtml.test
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+wm geometry . {}
+raise .
+
+set c 1
+set o 1
+set m 1
+
+#
+# Initial construction test
+#
+test Scrolledhtml-1.$c {Scrolledhtml construction} {
+ iwidgets::Scrolledhtml .sh
+ pack .sh -padx 10 -pady 10 -fill both -expand yes
+ update
+} {}
+
+incr c
+
+#
+# Option tests which are successful.
+#
+test Scrolledhtml-2.$o {configuration option} {
+ llength [.sh configure]
+} {60}
+
+incr o
+
+foreach test {
+ {-background #d9d9d9 #d9d9d9}
+ {-borderwidth 3 3}
+ {-cursor gumby gumby}
+ {-exportselection 0 0}
+ {-exportselection 1 1}
+ {-foreground Black Black}
+ {-height 120 120}
+ {-width 500 500}
+ {-insertbackground Black Black}
+ {-insertborderwidth 1 1}
+ {-insertofftime 200 200}
+ {-insertontime 500 500}
+ {-insertwidth 3 3}
+ {-labelmargin 5 5}
+ {-labeltext Label Label}
+ {-labelpos n n}
+ {-labelpos ne ne}
+ {-labelpos e e}
+ {-labelpos se se}
+ {-labelpos s s}
+ {-labelpos sw sw}
+ {-labelpos w w}
+ {-labelpos nw nw}
+ {-relief raised raised}
+ {-relief sunken sunken}
+ {-vscrollmode none none}
+ {-vscrollmode static static}
+ {-vscrollmode dynamic dynamic}
+ {-hscrollmode none none}
+ {-hscrollmode static static}
+ {-hscrollmode dynamic dynamic}
+ {-sbwidth 20 20}
+ {-scrollmargin 5 5}
+ {-selectborderwidth 2 2}
+ {-state disabled disabled}
+ {-state normal normal}
+ {-sticky w w}
+ {-sticky nw nw}
+ {-sticky n n}
+ {-sticky ne ne}
+ {-sticky e e}
+ {-sticky se se}
+ {-sticky s s}
+ {-sticky sw sw}
+ {-sticky news news}
+ {-textbackground GhostWhite GhostWhite}
+ {-visibleitems 72x40 72x40}
+ {-height 0 0}
+ {-width 0 0}
+ {-wrap char char}
+ {-wrap none none}
+ {-feedback puts puts}
+ {-feedback {} {}}
+ {-linkcommand puts puts}
+ {-linkcommand {} {}}
+ {-unknownimage {} {}}
+ {-link blue blue}
+ {-linkhighlight red red}
+ {-fontname times times}
+ {-fixedfont courier courier}
+ {-fontsize medium medium}
+ {-update 1 1}} {
+ set option [lindex $test 0]
+ test Scrolledhtml-2.$o "configuration options, $option" {
+ .sh configure $option [lindex $test 1]
+ lindex [.sh configure $option] 4
+ } [lindex $test 2]
+ update
+ incr o
+}
+
+#
+# Option tests which fail and produce errors.
+#
+foreach test {
+ {-visibleitems bogus {bad visibleitems option "bogus": should be widthxheight}}
+ {-hscrollmode bogus {bad hscrollmode option "bogus": should be static, dynamic, or none}}
+ {-vscrollmode bogus {bad vscrollmode option "bogus": should be static, dynamic, or none}}
+ {-fontname bogus {Invalid font name "bogus". Must be one of helvetica courier times symbol}}
+ {-fontsize bogus {bad fontsize option "bogus": should be small, medium, large, or huge}}
+ {-fixedfont bogus {Invalid font name "bogus". Must be one of helvetica courier times symbol}}} {
+ set option [lindex $test 0]
+ test Scrolledhtml-2.$o "configuration options, $option" {
+ list [catch {.sh configure $option [lindex $test 1]} msg] $msg
+ } [list 1 [lindex $test 2]]
+ incr o
+}
+
+#
+# Method tests which are successful.
+#
+foreach test {
+ {{.sh import ./scrolledhtml.test} {}}
+ {{.sh pwd} {.}}
+ {{.sh export /tmp/scrolledhtml.test} {}}
+ {{.sh render {
+ <title>Test</title>
+ <body bgcolor="#000000" link="#40a0f0" text="#00d0d0" background="notyet.gif">
+ <h1>This is a test</h1>
+ <strong>of the emergency broadcast system.</strong>
+ <em>This is only a test.</em><p>
+ <tt>If this were a real html document</tt><br>
+ <pre>it would be displayed</pre><br>
+ <center>for more than an instant</center>
+ <blockquote>Four score and seven years ago</blockquote>
+ <code>int main { printf(\&quotHello World!\&quot);}</code>
+ <dl><dt>write only memory
+ <dd>the obvious antonym to read-only memory</dl>
+ <ol>reasons this is a short list:<li>it only has one entry</ol>
+ <ul>reasons this is a short list:<li>it only has one entry</ul>
+ <a name="linktome" href="./test.html#linktome">
+ <img src="invalid.filename" alt="No_image_here" width=100 height=100>
+ </a>
+ </body>
+ }} {}}
+ {{.sh title} {Test}}
+ {{.sh clear} {}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Scrolledhtml-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 0 [lindex $test 1]]
+ update
+ incr m
+}
+
+#
+# Conclusion of construction/destruction tests
+#
+test Scrolledhtml-1.$c {Scrolledhtml destruction} {
+ destroy .sh
+ update
+} {}
+
+incr c
+
+test Scrolledhtml-1.$c {Scrolledhtml construction} {
+ iwidgets::scrolledhtml .sh -hscrollmode dynamic -labeltext "Label" \
+ -labelpos n -labelmargin 5
+ pack .sh -padx 10 -pady 10 -fill both -expand yes
+ update
+} {}
+
+incr c
+
+test Scrolledhtml-1.$c {Scrolledhtml destruction} {
+ destroy .sh
+ update
+} {}
+
+incr c
+
+test Scrolledhtml-1.$c {Scrolledhtml destruction} {
+ iwidgets::scrolledhtml .sh
+ pack .sh
+ destroy .sh
+ update
+} {}
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/tests/scrolledlistbox.test b/iwidgets/tests/scrolledlistbox.test
new file mode 100644
index 00000000000..08d75204f6c
--- /dev/null
+++ b/iwidgets/tests/scrolledlistbox.test
@@ -0,0 +1,226 @@
+# This file is a Tcl script to test out [incr Widgets] Scrolledlistbox class.
+# It is organized in the standard fashion for Tcl tests with the following
+# notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+#
+# Copyright (c) 1995 DSC Technologies Corporation
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# @(#) $Id$
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+wm geometry . {}
+raise .
+
+set c 1
+set o 1
+set m 1
+
+#
+# Initial construction test
+#
+test Scrolledlistbox-1.$c {Scrolledlistbox construction} {
+ iwidgets::Scrolledlistbox .slb -height 300 -width 300
+ pack .slb -padx 10 -pady 10 -fill both -expand yes
+ .slb insert end {Hello World} {Hello World}
+ update
+} {}
+
+incr c
+
+#
+# Option tests which are successful.
+#
+test Scrolledlistbox-2.$o {configuration option} {
+ llength [.slb configure]
+} {40}
+
+incr o
+
+foreach test {
+ {-labeltext Scrolledlistbox Scrolledlistbox}
+ {-height 200 200}
+ {-width 200 200}
+ {-labelpos nw nw}
+ {-labelpos ne ne}
+ {-labelpos en en}
+ {-labelpos e e}
+ {-labelpos es es}
+ {-labelpos se se}
+ {-labelpos s s}
+ {-labelpos sw sw}
+ {-labelpos wn wn}
+ {-labelpos w w}
+ {-labelpos ws ws}
+ {-labelpos n n}
+ {-borderwidth 3 3}
+ {-hscrollmode none none}
+ {-hscrollmode static static}
+ {-hscrollmode dynamic dynamic}
+ {-relief raised raised}
+ {-relief sunken sunken}
+ {-sbwidth 20 20}
+ {-sbwidth 15 15}
+ {-textbackground GhostWhite GhostWhite}
+ {-scrollmargin 10 10}
+ {-selectborderwidth 3 3}
+ {-selectforeground blue blue}
+ {-selectmode browse browse}
+ {-selectmode extended extended}
+ {-selectmode single single}
+ {-selectmode multiple multiple}
+ {-sticky w w}
+ {-sticky nw nw}
+ {-sticky n n}
+ {-sticky ne ne}
+ {-sticky e e}
+ {-sticky se se}
+ {-sticky s s}
+ {-sticky sw sw}
+ {-sticky news news}
+ {-textfont 6x13 6x13}
+ {-vscrollmode none none}
+ {-vscrollmode static static}
+ {-vscrollmode dynamic dynamic}
+ {-visibleitems 30x20 30x20}
+ {-width 0 0}
+ {-height 0 0}} {
+ set option [lindex $test 0]
+ test Scrolledlistbox-2.$o "configuration options, $option" {
+ .slb configure $option [lindex $test 1]
+ lindex [.slb configure $option] 4
+ } [lindex $test 2]
+ update
+ incr o
+}
+
+#
+# Option tests which fail and produce errors.
+#
+foreach test {
+ {-visibleitems bogus {bad visibleitems option "bogus": should be widthxheight}}
+ {-vscrollmode bogus {bad vscrollmode option "bogus": should be static, dynamic, or none}}
+ {-hscrollmode bogus {bad hscrollmode option "bogus": should be static, dynamic, or none}}} {
+ set option [lindex $test 0]
+ test Scrolledlistbox-2.$o "configuration options, $option" {
+ list [catch {.slb configure $option [lindex $test 1]} msg] $msg
+ } [list 1 [lindex $test 2]]
+ incr o
+}
+
+#
+# Method tests which are successful.
+#
+foreach test {
+ {{.slb insert 0 Test Test Test Test} {}}
+ {{.slb insert end {More Test}} {}}
+ {{.slb delete 1} {}}
+ {{.slb delete 0 3} {}}
+ {{.slb insert end World} {}}
+ {{.slb selection set World} {}}
+ {{.slb selection set World {More Test}} {}}
+ {{.slb getcurselection} {{More Test} World}}
+ {{.slb selecteditemcount} {2}}
+ {{.slb selection clear 0 end} {}}
+ {{.slb selecteditemcount} {0}}
+ {{.slb clear} {}}
+ {{.slb size} {0}}
+ {{.slb insert end {Test} {Test} {Long String Test}} {}}
+ {{.slb size} {3}}
+ {{.slb insert 0 {Test} {Test} {Long String Test}} {}}
+ {{.slb size} {6}}
+ {{.slb insert 1 {Test} {Test} {Long String Test}} {}}
+ {{.slb size} {9}}
+ {{.slb insert 5 {Test} {Test} {XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}} {}}
+ {{.slb size} {12}}
+ {{.slb get end} {Long String Test}}
+ {{.slb justify left} {}}
+ {{.slb justify right} {}}
+ {{.slb justify top} {}}
+ {{.slb justify bottom} {}}
+ {{.slb sort ascending} {}}
+ {{.slb sort descending} {}}
+ {{.slb sort increasing} {}}
+ {{.slb sort decreasing} {}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Scrolledlistbox-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 0 [lindex $test 1]]
+ update
+ incr m
+}
+
+#
+# Method tests which fail and produce errors
+#
+foreach test {
+ {{.slb index bogus} {bad Scrolledlistbox index "bogus": must be active, anchor, end, @x,y, number, or a pattern}}
+ {{.slb justify bogus} {bad justify argument "bogus": should be left, right, top, or bottom}}
+ {{.slb sort bogus} {bad sort argument "bogus": must be a valid argument to the Tcl lsort command}}} {
+
+ set method [lindex [lindex $test 0] 1]
+ test Scrolledlistbox-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 1 [lindex $test 1]]
+ incr m
+}
+
+#
+# Conclusion of constrcution/destruction tests
+#
+test Scrolledlistbox-1.$c {Scrolledlistbox destruction} {
+ destroy .slb
+ update
+} {}
+
+incr c
+
+test Scrolledlistbox-1.$c {Scrolledlistbox construction} {
+ iwidgets::scrolledlistbox .slb -selectmode extended \
+ -vscrollmode static -hscrollmode dynamic -labeltext "List" \
+ -labelpos nw
+ pack .slb -padx 10 -pady 10 -fill both -expand yes
+ update
+} {}
+
+incr c
+
+test Scrolledlistbox-1.$c {Scrolledlistbox destruction} {
+ destroy .slb
+ update
+} {}
+
+incr c
+
+test Scrolledlistbox-1.$c {Scrolledlistbox destruction} {
+ iwidgets::scrolledlistbox .slb
+ pack .slb
+ destroy .slb
+ update
+} {}
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/tests/scrolledtext.test b/iwidgets/tests/scrolledtext.test
new file mode 100644
index 00000000000..219cefffd47
--- /dev/null
+++ b/iwidgets/tests/scrolledtext.test
@@ -0,0 +1,190 @@
+# This file is a Tcl script to test out [incr Widgets] Scrolledtext class.
+# It is organized in the standard fashion for Tcl tests with the following
+# notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+#
+# Copyright (c) 1995 DSC Technologies Corporation
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# @(#) $Id$
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+wm geometry . {}
+raise .
+
+set c 1
+set o 1
+set m 1
+
+#
+# Initial construction test
+#
+test Scrolledtext-1.$c {Scrolledtext construction} {
+ iwidgets::Scrolledtext .st
+ pack .st -padx 10 -pady 10 -fill both -expand yes
+ update
+} {}
+
+incr c
+
+#
+# Option tests which are successful.
+#
+test Scrolledtext-2.$o {configuration option} {
+ llength [.st configure]
+} {49}
+
+incr o
+
+foreach test {
+ {-background #d9d9d9 #d9d9d9}
+ {-borderwidth 3 3}
+ {-cursor gumby gumby}
+ {-exportselection 0 0}
+ {-exportselection 1 1}
+ {-foreground Black Black}
+ {-height 120 120}
+ {-width 500 500}
+ {-insertbackground Black Black}
+ {-insertborderwidth 1 1}
+ {-insertofftime 200 200}
+ {-insertontime 500 500}
+ {-insertwidth 3 3}
+ {-labelmargin 5 5}
+ {-labeltext Label Label}
+ {-labelpos nw nw}
+ {-labelpos ne ne}
+ {-labelpos en en}
+ {-labelpos e e}
+ {-labelpos es es}
+ {-labelpos se se}
+ {-labelpos s s}
+ {-labelpos sw sw}
+ {-labelpos wn wn}
+ {-labelpos w w}
+ {-labelpos ws ws}
+ {-labelpos n n}
+ {-relief raised raised}
+ {-relief sunken sunken}
+ {-vscrollmode none none}
+ {-vscrollmode static static}
+ {-vscrollmode dynamic dynamic}
+ {-hscrollmode none none}
+ {-hscrollmode static static}
+ {-hscrollmode dynamic dynamic}
+ {-sbwidth 20 20}
+ {-scrollmargin 5 5}
+ {-selectborderwidth 2 2}
+ {-state disabled disabled}
+ {-state normal normal}
+ {-sticky w w}
+ {-sticky nw nw}
+ {-sticky n n}
+ {-sticky ne ne}
+ {-sticky e e}
+ {-sticky se se}
+ {-sticky s s}
+ {-sticky sw sw}
+ {-sticky news news}
+ {-textbackground GhostWhite GhostWhite}
+ {-visibleitems 72x40 72x40}
+ {-height 0 0}
+ {-width 0 0}
+ {-wrap char char}
+ {-wrap none none}} {
+ set option [lindex $test 0]
+ test Scrolledtext-2.$o "configuration options, $option" {
+ .st configure $option [lindex $test 1]
+ lindex [.st configure $option] 4
+ } [lindex $test 2]
+ update
+ incr o
+}
+
+#
+# Option tests which fail and produce errors.
+#
+foreach test {
+ {-visibleitems bogus {bad visibleitems option "bogus": should be widthxheight}}
+ {-hscrollmode bogus {bad hscrollmode option "bogus": should be static, dynamic, or none}}
+ {-vscrollmode bogus {bad vscrollmode option "bogus": should be static, dynamic, or none}}} {
+ set option [lindex $test 0]
+ test Scrolledtext-2.$o "configuration options, $option" {
+ list [catch {.st configure $option [lindex $test 1]} msg] $msg
+ } [list 1 [lindex $test 2]]
+ incr o
+}
+
+#
+# Method tests which are successful.
+#
+foreach test {
+ {{.st import ./scrolledtext.test} {}}
+ {{.st export /tmp/scrolledtext.test} {}}
+ {{.st clear} {}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Scrolledtext-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 0 [lindex $test 1]]
+ update
+ incr m
+}
+
+#
+# Conclusion of constrcution/destruction tests
+#
+test Scrolledtext-1.$c {Scrolledtext destruction} {
+ destroy .st
+ update
+} {}
+
+incr c
+
+test Scrolledtext-1.$c {Scrolledtext construction} {
+ iwidgets::scrolledtext .st -hscrollmode dynamic -labeltext "Label" \
+ -labelpos n -labelmargin 5
+ pack .st -padx 10 -pady 10 -fill both -expand yes
+ update
+} {}
+
+incr c
+
+test Scrolledtext-1.$c {Scrolledtext destruction} {
+ destroy .st
+ update
+} {}
+
+incr c
+
+test Scrolledtext-1.$c {Scrolledtext destruction} {
+ iwidgets::scrolledtext .st
+ pack .st
+ destroy .st
+ update
+} {}
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/tests/selectionbox.test b/iwidgets/tests/selectionbox.test
new file mode 100644
index 00000000000..5d3b7bbe373
--- /dev/null
+++ b/iwidgets/tests/selectionbox.test
@@ -0,0 +1,190 @@
+# This file is a Tcl script to test out [incr Widgets] Selectionbox class.
+# It is organized in the standard fashion for Tcl tests with the following
+# notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+#
+# Copyright (c) 1995 DSC Technologies Corporation
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# @(#) $Id$
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+wm geometry . {}
+raise .
+
+set c 1
+set o 1
+set m 1
+
+#
+# Initial construction test
+#
+test Selectionbox-1.$c {Selectionbox construction} {
+ iwidgets::Selectionbox .sb
+ .sb insert items end Hello {Out There} World
+ set cs [label [.sb childsite].label -text "Child Site"]
+ pack $cs -fill x -padx 10 -pady 10
+ pack .sb -padx 10 -pady 10 -fill both -expand yes
+ update
+} {}
+
+incr c
+
+#
+# Option tests which are successful.
+#
+test Selectionbox-2.$o {configuration option} {
+ llength [.sb configure]
+} {35}
+
+incr o
+
+foreach test {
+ {-width 280 280}
+ {-height 340 340}
+ {-activebackground #ececec #ececec}
+ {-activerelief raised raised}
+ {-background #d9d9d9 #d9d9d9}
+ {-textbackground GhostWhite GhostWhite}
+ {-borderwidth 2 2}
+ {-childsitepos n n}
+ {-childsitepos s s}
+ {-childsitepos e e}
+ {-childsitepos w w}
+ {-childsitepos center center}
+ {-cursor gumby gumby}
+ {-dblclickcommand {.sb configure -background blue} {.sb configure -background blue}}
+ {-exportselection 1 1}
+ {-foreground Black Black}
+ {-highlightcolor Black Black}
+ {-highlightthickness 2 2}
+ {-insertbackground Black Black}
+ {-insertborderwidth 0 0}
+ {-insertofftime 300 300}
+ {-insertontime 600 600}
+ {-insertwidth 2 2}
+ {-itemslabel "Items Label" "Items Label"}
+ {-itemson no no}
+ {-labelfont -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-*}
+ {-margin 10 10}
+ {-itemson yes yes}
+ {-selectbackground #c3c3c3 #c3c3c3}
+ {-selectborderwidth 1 1}
+ {-itemscommand {.sb selectitem} {.sb selectitem}}
+ {-selectforeground Black Black}
+ {-selectioncommand _command _command}
+ {-selectionlabel "Selection Label" "Selection Label"}
+ {-selectionon no no}
+ {-selectionon yes yes}
+ {-textfont 6x13 6x13}
+ {-width 0 0}
+ {-height 0 0}} {
+ set option [lindex $test 0]
+ test Selectionbox-2.$o "configuration options, $option" {
+ .sb configure $option [lindex $test 1]
+ lindex [.sb configure $option] 4
+ } [lindex $test 2]
+ update
+ incr o
+}
+
+#
+# Method tests which are successful.
+#
+foreach test {
+ {{.sb childsite} {.sb.sbchildsite}}
+ {{destroy [.sb childsite]} {}}
+ {{.sb delete Hello 1} {}}
+ {{.sb delete 0} {}}
+ {{.sb insert items 0 One Two Three Four Five Six} {}}
+ {{.sb component items get 0 end} {One Two Three Four Five Six}}
+ {{.sb size} 6}
+ {{.sb clear selection} {}}
+ {{.sb insert selection 0 One} {}}
+ {{.sb get} One}
+ {{.sb index end} 6}
+ {{.sb index Six} 5}
+ {{.sb selection set 1} {}}
+ {{.sb selectitem} {}}
+ {{.sb curselection} 1}
+ {{.sb get} Two}
+ {{.sb delete Three} {}}
+ {{.sb clear items} {}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Selectionbox-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 0 [lindex $test 1]]
+ update
+ incr m
+}
+
+#
+# Method tests which fail and produce errors
+#
+foreach test {
+ {{.sb clear bogus} {bad clear argument "bogus": should be selection or items}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Selectionbox-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 1 [lindex $test 1]]
+ incr m
+}
+
+#
+# Conclusion of constrcution/destruction tests
+#
+test Selectionbox-1.$c {Selectionbox destruction} {
+ destroy .sb
+ update
+} {}
+
+incr c
+
+test Selectionbox-1.$c {Selectionbox construction} {
+ iwidgets::selectionbox .sb
+ .sb component items configure -vscrollmode none -hscrollmode none
+ pack .sb -padx 10 -pady 10 -fill both -expand yes
+ update
+} {}
+
+incr c
+
+test Selectionbox-1.$c {Selectionbox destruction} {
+ destroy .sb
+ update
+} {}
+
+incr c
+
+test Selectionbox-1.$c {Selectionbox destruction} {
+ iwidgets::selectionbox .sb
+ pack .sb
+ destroy .sb
+ update
+} {}
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/tests/selectiondialog.test b/iwidgets/tests/selectiondialog.test
new file mode 100644
index 00000000000..f4d67f753cc
--- /dev/null
+++ b/iwidgets/tests/selectiondialog.test
@@ -0,0 +1,202 @@
+# This file is a Tcl script to test out [incr Widgets] Selectiondialog class.
+# It is organized in the standard fashion for Tcl tests with the following
+# notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+# 4.x - Other tests
+#
+# Copyright (c) 1995 DSC Technologies Corporation
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# @(#) $Id$
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+wm geometry . {}
+raise .
+
+set c 1
+set o 1
+set m 1
+
+#
+# Initial construction test
+#
+test Selectiondialog-1.$c {Selectiondialog construction} {
+ iwidgets::Selectiondialog .sd
+ .sd insert items end Hello {Out There} World
+ .sd activate
+} {}
+
+incr c
+
+#
+# Option tests which are successful.
+#
+test Selectiondialog-2.$o {configuration option} {
+ llength [.sd configure]
+} {44}
+
+incr o
+
+foreach test {
+ {-width 340 340}
+ {-width 360 360}
+ {-activerelief raised raised}
+ {-borderwidth 2 2}
+ {-background #d9d9d9 #d9d9d9}
+ {-buttonboxpos n n}
+ {-buttonboxpadx 10 10}
+ {-buttonboxpos e e}
+ {-buttonboxpos w w}
+ {-buttonboxpady 10 10}
+ {-buttonboxpos s s}
+ {-cursor gumby gumby}
+ {-foreground Black Black}
+ {-highlightcolor Black Black}
+ {-highlightthickness 2 2}
+ {-modality global global}
+ {-modality application application}
+ {-modality none none}
+ {-padx 15 15}
+ {-pady 15 15}
+ {-textbackground GhostWhite GhostWhite}
+ {-separator off off}
+ {-thickness 4 4}
+ {-separator on on}
+ {-title Selectiondialog Selectiondialog}
+ {-childsitepos n n}
+ {-childsitepos s s}
+ {-childsitepos e e}
+ {-childsitepos w w}
+ {-childsitepos center center}
+ {-cursor gumby gumby}
+ {-exportselection 0 0}
+ {-insertbackground Blue Blue}
+ {-insertbackground Black Black}
+ {-insertborderwidth 1 1}
+ {-insertofftime 200 200}
+ {-insertontime 500 500}
+ {-insertwidth 3 3}
+ {-itemslabel "Items Label" "Items Label"}
+ {-itemson no no}
+ {-labelfont 6x13 6x13}
+ {-itemson yes yes}
+ {-selectbackground #c3c3c3 #c3c3c3}
+ {-selectborderwidth 2 2}
+ {-selectforeground Black Black}
+ {-selectionlabel "Selection Label" "Selection Label"}
+ {-selectionon no no}
+ {-selectionon yes yes}
+ {-width 0 0}
+ {-height 0 0}
+ {-textfont 6x13 6x13}} {
+ set option [lindex $test 0]
+ test Selectiondialog-2.$o "configuration options, $option" {
+ .sd configure $option [lindex $test 1]
+ lindex [.sd configure $option] 4
+ } [lindex $test 2]
+ update
+ incr o
+}
+
+#
+# Method tests which are successful.
+#
+foreach test {
+ {{.sd childsite} {.sd.shellchildsite.dschildsite.selectionbox.sbchildsite}}
+ {{.sd clear items} {}}
+ {{.sd component selectionbox component items get 0 end} {}}
+ {{.sd insert items 0 One Two Three Four Five Six} {}}
+ {{.sd component selectionbox component items get 0 end} {One Two Three Four Five Six}}
+ {{.sd size} 6}
+ {{.sd clear selection} {}}
+ {{.sd insert selection 0 One} {}}
+ {{.sd get} One}
+ {{.sd index end} 6}
+ {{.sd index Six} 5}
+ {{.sd selection set 1} {}}
+ {{.sd selectitem} {}}
+ {{.sd curselection} 1}
+ {{.sd get} Two}
+ {{.sd delete Three} {}}
+ {{.sd clear items} {}}
+ {{.sd hide Help} {}}
+ {{.sd hide Cancel} {}}
+ {{.sd default Apply} {}}
+ {{.sd show Cancel} {}}
+ {{.sd deactivate} {}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Selectiondialog-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 0 [lindex $test 1]]
+ update
+ incr m
+}
+
+#
+# Method tests which fail and produce errors
+#
+foreach test {
+ {{.sd clear bogus} {bad clear argument "bogus": should be selection or items}}
+ {{.sd insert bogus bogus} {bad insert argument "bogus": should be selection or items}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Selectiondialog-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 1 [lindex $test 1]]
+ incr m
+}
+
+#
+# Conclusion of constrcution/destruction tests
+#
+test Selectiondialog-1.$c {Selectiondialog destruction} {
+ destroy .sd
+ update
+} {}
+
+incr c
+
+test Selectiondialog-1.$c {Selectiondialog construction} {
+ iwidgets::selectiondialog .sd
+ update
+} {}
+
+incr c
+
+test Selectiondialog-1.$c {Selectiondialog destruction} {
+ destroy .sd
+ update
+} {}
+
+incr c
+
+test Selectiondialog-1.$c {Selectiondialog destruction} {
+ iwidgets::selectiondialog .sd
+ destroy .sd
+ update
+} {}
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/tests/shell.test b/iwidgets/tests/shell.test
new file mode 100644
index 00000000000..adf74ad0a9d
--- /dev/null
+++ b/iwidgets/tests/shell.test
@@ -0,0 +1,212 @@
+# This file is a Tcl script to test out [incr Widgets] Shell class.
+# It is organized in the standard fashion for Tcl tests with the following
+# notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+# 4.x - Other tests
+#
+# Copyright (c) 1995 DSC Technologies Corporation
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# @(#) $Id$
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+wm geometry . {}
+raise .
+
+set c 1
+set o 1
+set m 1
+
+#
+# Initial construction test
+#
+test Shell-1.$c {Shell construction} {
+ iwidgets::Shell .sh
+
+ listbox [.sh childsite].lb -relief sunken
+ pack [.sh childsite].lb -fill both -expand yes
+
+ .sh center
+ .sh activate
+} {}
+
+incr c
+
+#
+# Option tests which are successful.
+#
+test Shell-2.$o {configuration option} {
+ llength [.sh configure]
+} {11}
+
+incr o
+
+foreach test {
+ {-background #d9d9d9 #d9d9d9}
+ {-width 200 200}
+ {-height 200 200}
+ {-cursor gumby gumby}
+ {-modality global global}
+ {-modality application application}
+ {-modality none none}
+ {-padx 15 15}
+ {-pady 15 15}
+ {-width 0 0}
+ {-height 0 0}
+ {-title "Shell" "Shell"}} {
+ set option [lindex $test 0]
+ test Shell-2.$o "configuration options, $option" {
+ .sh configure $option [lindex $test 1]
+ lindex [.sh configure $option] 4
+ } [lindex $test 2]
+ update
+ incr o
+}
+
+#
+# Option tests which fail and produce errors.
+#
+foreach test {
+ {-modality bogus {bad modality option "bogus": should be none, application, or global}}} {
+ set option [lindex $test 0]
+ test Shell-2.$o "configuration options, $option" {
+ list [catch {.sh configure $option [lindex $test 1]} msg] $msg
+ } [list 1 [lindex $test 2]]
+ incr o
+}
+
+#
+# Method tests which are successful.
+#
+foreach test {
+ {{.sh childsite} {.sh.shellchildsite}}
+ {{.sh activate} {}}
+ {{.sh center .} {}}
+ {{.sh center} {}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Shell-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 0 [lindex $test 1]]
+ update
+ incr m
+}
+
+#
+# Deactivate test
+#
+test Shell-3.$m "object methods, deactivate" {
+ list [catch {.sh deactivate} msg] $msg
+} [list 0 {}]
+update
+incr m
+
+#
+# Destruction test
+#
+test Shell-1.$c {Shell destruction} {
+ destroy .sh
+ update
+} {}
+incr c
+
+#
+# Global modality test.
+#
+test Shell-4.2 "global modality, activation, and deactivation" {
+ iwidgets::shell .sh -modality global
+ .sh center
+ pack [label [.sh childsite].l -text "Global Modal Shell"]
+ after 2000 {.sh deactivate Test}
+ .sh center
+ list [catch {.sh activate} msg] $msg
+} [list 0 Test]
+update
+
+#
+# Destruction test
+#
+test Shell-1.$c {Shell destruction} {
+ destroy .sh
+ update
+} {}
+incr c
+
+#
+# None modality test.
+#
+test Shell-4.3 "no modality, activation, and deactivation" {
+ iwidgets::shell .sh -modality none
+ .sh center
+ pack [label [.sh childsite].l -text "Non-Modal Shell"]
+ .sh center
+ .sh activate
+ update
+ after 2000
+ .sh deactivate
+} {}
+update
+
+#
+# Destruction test
+#
+test Shell-1.$c {Shell destruction} {
+ destroy .sh
+ update
+} {}
+
+incr c
+
+#
+# Application modality test.
+#
+test Shell-4.4 "application modality, activation, and deactivation" {
+ iwidgets::shell .sh -modality application
+ .sh center
+ pack [label [.sh childsite].l -text "Application Modal Shell"]
+ after 2000 {.sh deactivate Test}
+ .sh center
+ list [catch {.sh activate} msg] $msg
+} [list 0 Test]
+update
+
+#
+# Destruction test
+#
+test Shell-1.$c {Shell destruction} {
+ destroy .sh
+ update
+} {}
+
+incr c
+
+test Shell-1.$c {Shell destruction} {
+ iwidgets::shell .sh
+ destroy .sh
+ update
+} {}
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/tests/spindate.test b/iwidgets/tests/spindate.test
new file mode 100644
index 00000000000..fde5b58ba45
--- /dev/null
+++ b/iwidgets/tests/spindate.test
@@ -0,0 +1,172 @@
+# This file is a Tcl script to test out [incr Widgets] Spindate class.
+# It is organized in the standard fashion for Tcl tests with the following
+# notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+#
+# Copyright (c) 1995 DSC Technologies Corporation
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# @(#) $Id$
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+wm geometry . {}
+raise .
+
+set c 1
+set o 1
+set m 1
+
+#
+# Initial construction test
+#
+test Spindate-1.$c {Spindate construction} {
+ iwidgets::Spindate .sd
+ pack .sd -padx 10 -pady 10 -fill both -expand yes
+ update
+} {}
+
+incr c
+
+#
+# Option tests which are successful.
+#
+test Spindate-2.$o {configuration option} {
+ llength [.sd configure]
+} {26}
+
+incr o
+
+foreach test {
+ {-arroworient horizontal horizontal}
+ {-arroworient vertical vertical}
+ {-background #d9d9d9 #d9d9d9}
+ {-cursor gumby gumby}
+ {-datemargin 3 3}
+ {-daylabel Day: Day:}
+ {-dayon false false}
+ {-dayon true true}
+ {-daywidth 4 4}
+ {-labelmargin 4 4}
+ {-labelpos n n}
+ {-labelpos s s}
+ {-labelpos e e}
+ {-labelpos w w}
+ {-monthformat integer integer}
+ {-monthformat brief brief}
+ {-monthformat full full}
+ {-monthlabel Month: Month:}
+ {-monthon false false}
+ {-monthon true true}
+ {-monthwidth 4 4}
+ {-orient horizontal horizontal}
+ {-orient vertical vertical}
+ {-textbackground GhostWhite GhostWhite}
+ {-yeardigits 2 2}
+ {-yeardigits 4 4}
+ {-yearlabel Year: Year:}
+ {-yearon false false}
+ {-yearon true true}
+ {-yearwidth 4 4}} {
+ set option [lindex $test 0]
+ test Spindate-2.$o "configuration options, $option" {
+ .sd configure $option [lindex $test 1]
+ lindex [.sd configure $option] 4
+ } [lindex $test 2]
+ update
+ incr o
+}
+
+#
+# Option tests which fail and produce errors.
+#
+foreach test {
+ {-yeardigits bogus {bad yeardigits option "bogus", should be 2 or 4}}
+ {-monthformat bogus {bad monthformat option "bogus", should be "integer", "brief" or "full"}}} {
+ set option [lindex $test 0]
+ test Spindate-2.$o "configuration options, $option" {
+ list [catch {.sd configure $option [lindex $test 1]} msg] $msg
+ } [list 1 [lindex $test 2]]
+ incr o
+}
+
+#
+# Method tests which are successful.
+#
+foreach test {
+ {{.sd show 3/3/1960} {}}
+ {{.sd get -string} "03 March 1960"}} {
+ set method [lindex [lindex $test 0] 1]
+ test Spindate-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 0 [lindex $test 1]]
+ update
+ incr m
+}
+
+foreach test {
+ {{.sd show bogus} {bad date: "bogus", must be a valid date string, clock clicks value or the keyword now}}
+ {{.sd get bogus} {bad format option "bogus": should be -string or -clicks}}} {
+ set method [lindex [lindex $test 0] 1]
+ test ScrolledListBox-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 1 [lindex $test 1]]
+ incr m
+}
+
+#
+# Conclusion of constrcution/destruction tests
+#
+test Spindate-1.$c {Spindate destruction} {
+ destroy .sd
+ update
+} {}
+
+incr c
+
+test Spindate-1.$c {Spindate construction} {
+ iwidgets::spindate .sd -monthformat brief
+ pack .sd -padx 10 -pady 10 -fill both -expand yes
+ update
+} {}
+
+incr c
+
+test Spindate-1.$c {Spindate destruction} {
+ destroy .sd
+ update
+} {}
+
+incr c
+
+test Spindate-1.$c {Spindate destruction} {
+ iwidgets::spindate .sd
+ pack .sd
+ destroy .sd
+ update
+} {}
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/tests/spinint.test b/iwidgets/tests/spinint.test
new file mode 100644
index 00000000000..da27a93b52c
--- /dev/null
+++ b/iwidgets/tests/spinint.test
@@ -0,0 +1,191 @@
+# This file is a Tcl script to test out [incr Widgets] Spinint class.
+# It is organized in the standard fashion for Tcl tests with the following
+# notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+#
+# Copyright (c) 1995 DSC Technologies Corporation
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# @(#) $Id$
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+wm geometry . {}
+raise .
+
+set c 1
+set o 1
+set m 1
+
+#
+# Initial construction test
+#
+test Spinint-1.$c {Spinint construction} {
+ iwidgets::Spinint .spi
+ pack .spi -padx 10 -pady 10 -fill both -expand yes
+ update
+} {}
+
+incr c
+
+#
+# Option tests which are successful.
+#
+test Spinint-2.$o {configuration option} {
+ llength [.spi configure]
+} {48}
+
+incr o
+
+foreach test {
+ {-background #d9d9d9 #d9d9d9}
+ {-childsitepos e e}
+ {-childsitepos s s}
+ {-childsitepos w w}
+ {-childsitepos n n}
+ {-childsitepos e e}
+ {-borderwidth 4 4}
+ {-cursor gumby gumby}
+ {-decrement {.spi insert end Down} {.spi insert end Down}}
+ {-exportselection 0 0}
+ {-fixed 10 10}
+ {-borderwidth 2 2}
+ {-foreground Black Black}
+ {-increment {.spi insert end Up} {.spi insert end Up}}
+ {-insertbackground Black Black}
+ {-insertborderwidth 2 2}
+ {-insertofftime 200 200}
+ {-insertontime 500 500}
+ {-insertwidth 3 3}
+ {-labelfont 6x13 6x13}
+ {-labelmargin 5 5}
+ {-labeltext Label Label}
+ {-labelpos w w}
+ {-labelpos nw nw}
+ {-labelpos n n}
+ {-labelpos ne ne}
+ {-labelpos e e}
+ {-labelpos se se}
+ {-labelpos s s}
+ {-labelpos sw sw}
+ {-arroworient horizontal horizontal}
+ {-range {0 100} {0 100}}
+ {-relief raised raised}
+ {-selectbackground blue blue}
+ {-selectbackground #c3c3c3 #c3c3c3}
+ {-selectborderwidth 2 2}
+ {-selectforeground Blue Blue}
+ {-selectforeground Black Black}
+ {-state disabled disabled}
+ {-state normal normal}
+ {-step 2 2}
+ {-sticky w w}
+ {-sticky nw nw}
+ {-sticky n n}
+ {-sticky ne ne}
+ {-sticky e e}
+ {-sticky se se}
+ {-sticky s s}
+ {-sticky sw sw}
+ {-sticky news news}
+ {-textfont 6x13 6x13}
+ {-width 30 30}
+ {-wrap 0 0}} {
+ set option [lindex $test 0]
+ test Spinint-2.$o "configuration options, $option" {
+ .spi configure $option [lindex $test 1]
+ lindex [.spi configure $option] 4
+ } [lindex $test 2]
+ update
+ incr o
+}
+
+#
+# Option tests which fail and produce errors.
+#
+foreach test {
+ {-range {bogus} {wrong # args: should be ".spi configure -range {begin end}"}}
+ {-range {bogus 0} {bad range option "bogus": begin value must be an integer}}
+ {-range {0 bogus} {bad range option "bogus": end value must be an integer}}
+ {-range {100 10} {bad option starting range "100": must be less than ending: "10"}}} {
+ set option [lindex $test 0]
+ test Spinint-2.$o "configuration options, $option" {
+ list [catch {.spi configure $option [lindex $test 1]} msg] $msg
+ } [list 1 [lindex $test 2]]
+ incr o
+}
+
+#
+# Method tests which are successful.
+#
+foreach test {
+ {{.spi clear} {}}
+ {{.spi insert end 50} {}}
+ {{.spi cget -step} 2}
+ {{.spi up} {}}
+ {{.spi down} {}}
+ {{.spi get} 50}} {
+ set method [lindex [lindex $test 0] 1]
+ test Spinint-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 0 [lindex $test 1]]
+ update
+ incr m
+}
+
+#
+# Conclusion of constrcution/destruction tests
+#
+test Spinint-1.$c {Spinint destruction} {
+ destroy .spi
+ update
+} {}
+
+incr c
+
+test Spinint-1.$c {Spinint construction} {
+ iwidgets::spinint .spi
+ pack .spi -padx 10 -pady 10 -fill both -expand yes
+ update
+} {}
+
+incr c
+
+test Spinint-1.$c {Spinint destruction} {
+ destroy .spi
+ update
+} {}
+
+incr c
+
+test Spinint-1.$c {Spinint destruction} {
+ iwidgets::spinint .spi
+ pack .spi
+ destroy .spi
+ update
+} {}
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/tests/spinner.test b/iwidgets/tests/spinner.test
new file mode 100644
index 00000000000..9b56b9a4d39
--- /dev/null
+++ b/iwidgets/tests/spinner.test
@@ -0,0 +1,173 @@
+# This file is a Tcl script to test out [incr Widgets] Spinner class.
+# It is organized in the standard fashion for Tcl tests with the following
+# notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+#
+# Copyright (c) 1995 DSC Technologies Corporation
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# @(#) $Id$
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+wm geometry . {}
+raise .
+
+set c 1
+set o 1
+set m 1
+
+#
+# Initial construction test
+#
+test Spinner-1.$c {Spinner construction} {
+ iwidgets::Spinner .sp
+ pack .sp -padx 10 -pady 10 -fill both -expand yes
+ update
+} {}
+
+incr c
+
+#
+# Option tests which are successful.
+#
+test Spinner-2.$o {configuration option} {
+ llength [.sp configure]
+} {45}
+
+incr o
+
+foreach test {
+ {-background #d9d9d9 #d9d9d9}
+ {-foreground blue blue}
+ {-borderwidth 4 4}
+ {-childsitepos e e}
+ {-childsitepos s s}
+ {-childsitepos w w}
+ {-childsitepos n n}
+ {-childsitepos e e}
+ {-borderwidth 2 2}
+ {-cursor gumby gumby}
+ {-decrement {.sp insert end Down} {.sp insert end Down}}
+ {-exportselection 0 0}
+ {-fixed 15 15}
+ {-foreground Black Black}
+ {-increment {.sp insert end Up} {.sp insert end Up}}
+ {-insertbackground Blue Blue}
+ {-insertbackground Black Black}
+ {-insertborderwidth 2 2}
+ {-insertofftime 200 200}
+ {-insertontime 500 500}
+ {-insertwidth 3 3}
+ {-labelfont 6x13 6x13}
+ {-labelmargin 5 5}
+ {-labeltext Label Label}
+ {-labelpos w w}
+ {-labelpos nw nw}
+ {-labelpos n n}
+ {-labelpos ne ne}
+ {-labelpos e e}
+ {-labelpos se se}
+ {-labelpos s s}
+ {-labelpos sw sw}
+ {-arroworient horizontal horizontal}
+ {-relief raised raised}
+ {-selectbackground #c3c3c3 #c3c3c3}
+ {-selectborderwidth 2 2}
+ {-selectforeground Black Black}
+ {-state disabled disabled}
+ {-state normal normal}
+ {-sticky w w}
+ {-sticky nw nw}
+ {-sticky n n}
+ {-sticky ne ne}
+ {-sticky e e}
+ {-sticky se se}
+ {-sticky s s}
+ {-sticky sw sw}
+ {-sticky news news}
+ {-textfont 6x13 6x13}
+ {-validate numeric {::iwidgets::Entryfield::numeric %c}}
+ {-repeatdelay 400 400}
+ {-repeatdelay -100 0}
+ {-repeatinterval 200 200}
+ {-repeatinterval -100 0}
+ {-width 30 30}} {
+ set option [lindex $test 0]
+ test Spinner-2.$o "configuration options, $option" {
+ .sp configure $option [lindex $test 1]
+ lindex [.sp configure $option] 4
+ } [lindex $test 2]
+ update
+ incr o
+}
+
+#
+# Method tests which are successful.
+#
+foreach test {
+ {{.sp up} {}}
+ {{.sp down} {}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Spinner-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 0 [lindex $test 1]]
+ update
+ incr m
+}
+
+#
+# Conclusion of constrcution/destruction tests
+#
+test Spinner-1.$c {Spinner destruction} {
+ destroy .sp
+ update
+} {}
+
+incr c
+
+test Spinner-1.$c {Spinner construction} {
+ iwidgets::spinner .sp
+ pack .sp -padx 10 -pady 10 -fill both -expand yes
+ update
+} {}
+
+incr c
+
+test Spinner-1.$c {Spinner destruction} {
+ destroy .sp
+ update
+} {}
+
+incr c
+
+test Spinner-1.$c {Spinner destruction} {
+ iwidgets::spinner .sp
+ pack .sp
+ destroy .sp
+ update
+} {}
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/tests/spintime.test b/iwidgets/tests/spintime.test
new file mode 100644
index 00000000000..f366c1d8593
--- /dev/null
+++ b/iwidgets/tests/spintime.test
@@ -0,0 +1,156 @@
+# This file is a Tcl script to test out [incr Widgets] Spintime class.
+# It is organized in the standard fashion for Tcl tests with the following
+# notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+#
+# Copyright (c) 1995 DSC Technologies Corporation
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# @(#) $Id$
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+wm geometry . {}
+raise .
+
+set c 1
+set o 1
+set m 1
+
+#
+# Initial construction test
+#
+test Spintime-1.$c {Spintime construction} {
+ iwidgets::Spintime .st
+ pack .st -padx 10 -pady 10 -fill both -expand yes
+ update
+} {}
+
+incr c
+
+#
+# Option tests which are successful.
+#
+test Spintime-2.$o {configuration option} {
+ llength [.st configure]
+} {25}
+
+incr o
+
+foreach test {
+ {-arroworient horizontal horizontal}
+ {-arroworient vertical vertical}
+ {-background #d9d9d9 #d9d9d9}
+ {-cursor gumby gumby}
+ {-hourlabel Hour: Hour:}
+ {-houron false false}
+ {-houron true true}
+ {-hourwidth 4 4}
+ {-labelmargin 4 4}
+ {-labelpos n n}
+ {-labelpos s s}
+ {-labelpos e e}
+ {-labelpos w w}
+ {-militaryon no no}
+ {-militaryon yes yes}
+ {-minutelabel Minute: Minute:}
+ {-minuteon false false}
+ {-minuteon true true}
+ {-minutewidth 4 4}
+ {-orient horizontal horizontal}
+ {-orient vertical vertical}
+ {-secondlabel Second: Second:}
+ {-secondon false false}
+ {-secondon true true}
+ {-secondwidth 4 4}
+ {-textbackground GhostWhite GhostWhite}
+ {-timemargin 3 3}} {
+ set option [lindex $test 0]
+ test Spintime-2.$o "configuration options, $option" {
+ .st configure $option [lindex $test 1]
+ lindex [.st configure $option] 4
+ } [lindex $test 2]
+ update
+ incr o
+}
+
+#
+# Method tests which are successful.
+#
+foreach test {
+ {{.st show "21:21:21"} {}}
+ {{.st get -string} "21:21:21"}} {
+ set method [lindex [lindex $test 0] 1]
+ test Spintime-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 0 [lindex $test 1]]
+ update
+ incr m
+}
+
+foreach test {
+ {{.st show bogus} {bad time: "bogus", must be a valid time string, clock clicks value or the keyword now}}
+ {{.st get bogus} {bad format option "bogus": should be -string or -clicks}}} {
+ set method [lindex [lindex $test 0] 1]
+ test ScrolledListBox-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 1 [lindex $test 1]]
+ incr m
+}
+
+#
+# Conclusion of constrcution/destruction tests
+#
+test Spintime-1.$c {Spintime destruction} {
+ destroy .st
+ update
+} {}
+
+incr c
+
+test Spintime-1.$c {Spintime construction} {
+ iwidgets::spintime .st
+ pack .st -padx 10 -pady 10 -fill both -expand yes
+ update
+} {}
+
+incr c
+
+test Spintime-1.$c {Spintime destruction} {
+ destroy .st
+ update
+} {}
+
+incr c
+
+test Spintime-1.$c {Spintime destruction} {
+ iwidgets::spintime .st
+ pack .st
+ destroy .st
+ update
+} {}
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/tests/tabnotebook.test b/iwidgets/tests/tabnotebook.test
new file mode 100644
index 00000000000..8d9b28d82e9
--- /dev/null
+++ b/iwidgets/tests/tabnotebook.test
@@ -0,0 +1,343 @@
+# This file is a Tcl script to test out [incr Widgets] Tabnotebook class.
+# It is organized in the standard fashion for Tcl tests with the following
+# notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+#
+# Copyright (c) 1995 DSC Technologies Corporation
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# @(#) $Id$
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+wm geometry . {}
+raise .
+
+set c 1
+set o 1
+set m 1
+
+#
+# Initial construction test
+#
+test Tabnotebook-1.$c {Tabnotebook construction} {
+ iwidgets::Tabnotebook .tn
+ pack .tn
+ update
+ .tn add -label one
+ update
+ .tn add -label two
+ update
+ .tn add -label three
+ update
+} {}
+
+incr c
+
+#
+# Option tests which are successful.
+#
+test Tabnotebook-2.$o {configuration option} {
+ llength [.tn configure]
+} {26}
+
+incr o
+
+foreach test {
+ {-disabledforeground #a3a3a3 #a3a3a3 }
+ {-start 4 4 }
+ {-backdrop #d9d9d9 #d9d9d9 }
+ {-borderwidth 2 2 }
+ {-scrollcommand }
+ {-font -Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-* -Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-* }
+ {-gap overlap overlap }
+ {-background #CDCDB7B7B5B5 #CDCDB7B7B5B5 }
+ {-state normal normal }
+ {-bevelamount 0 0 }
+ {-equaltabs true true }
+ {-foreground #000000000000 #000000000000 }
+ {-raiseselect false false }
+ {-padx 4 4 }
+ {-pady 4 4 }
+ {-margin 4 4 }
+ {-cursor }
+ {-angle 15 15 }
+ {-tabbackground #d9d9d9 #d9d9d9 }
+ {-tabborders true true }
+ {-width 300 300 }
+ {-tabpos s s }
+ {-auto true true }
+ {-height 150 150 }
+ {-tabforeground Black Black }
+ } {
+ set option [lindex $test 0]
+ test Tabnotebook-2.$o "configuration options, $option" {
+ .tn configure $option [lindex $test 1]
+ lindex [.tn configure $option] 4
+ } [lindex $test 2]
+ update
+ incr o
+}
+
+#
+# PageConfigure Option tests which are successful.
+#
+test Tabnotebook-2.$o {page configuration option} {
+ llength [.tn pageconfigure 0]
+} {30}
+
+# do pageconfigure tests also...
+foreach test {
+ {0 -label Hello Hello}
+ {end -label "Hello World" "Hello World"}
+ } {
+ set index [lindex $test 0]
+ set option [lindex $test 1]
+ test Tabnotebook-2.$o "configuration options, $option" {
+ .tn pageconfigure $index $option [lindex $test 2]
+ lindex [.tn pageconfigure $index $option] 4
+ } [lindex $test 3]
+ update
+ incr o
+}
+
+#
+# Option tests which fail and produce errors.
+#
+#foreach test {
+# { -OPTION BADVALUE {ERROR_MESSAGE} }
+# } {
+# set option [lindex $test 0]
+# test Tabnotebook-2.$o "configuration options, $option" {
+# list [catch {.bb configure $option [lindex $test 1]} msg] $msg
+# } [list 1 [lindex $test 2]]
+# incr o
+#}
+
+#
+# Method tests which are successful.
+#
+foreach test {
+ {{.tn add}
+ {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}}
+ {{.tn add}
+ {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}}
+ {{.tn add}
+ {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}}
+ {{.tn add -label Never}
+ {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}}
+ {{.tn add}
+ {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}}
+ {{.tn add -label "Hello World" -disabledforeground gray}
+ {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}}
+ {{.tn childsite Never}
+ {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}}
+ {{.tn childsite 0}
+ {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}}
+ {{.tn childsite end}
+ {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}}
+ {{.tn index end}
+ {[0-9]+}}
+ {{.tn index Never}
+ {[0-9]+}}
+ {{.tn index 0}
+ {0}}
+ {{.tn select 0}
+ {0}}
+ {{.tn select select}
+ {}}
+ {{.tn select end}
+ {[0-9]+}}
+ {{.tn select "Hello World"}
+ {[0-9]+}}
+ {{.tn insert 0}
+ {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}}
+ {{.tn insert select -label "An Insert"}
+ {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}}
+ {{.tn insert end -label "Next To Last"}
+ {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}}
+ {{.tn select 0}
+ {0}}
+ {{.tn next}
+ {1}}
+ {{.tn next}
+ {2}}
+ {{.tn prev}
+ {1}}
+ {{.tn prev}
+ {0}}
+ {{.tn delete Never}
+ {}}
+ {{.tn delete 1 2}
+ {}}
+ {{.tn delete 0 "Hello World"}
+ {}}
+ {{.tn add}
+ {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}}
+ {{.tn add}
+ {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}}
+ {{.tn add}
+ {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}}
+ {{.tn add}
+ {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}}
+ {{.tn delete 0 end}
+ {}}
+ {{.tn add}
+ {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}}
+ {{.tn add}
+ {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}}
+ {{.tn add}
+ {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}}
+ {{.tn add}
+ {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}}
+ {{.tn select 2}
+ {[-]*[0-9]+}}
+ {{.tn delete select end}
+ {}}
+ {{.tn delete 0 end}
+ {}}
+ {{.tn add -label "First Page"}
+ {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}}
+ {{.tn add -label "Second Page"}
+ {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}}
+ {{.tn add -label "Third Page"}
+ {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}}
+ {{.tn add -label "Fourth Page"}
+ {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}}
+ {{.tn add -label "Fifth Page"}
+ {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}}
+ {{.tn add -label "Sixth Page"}
+ {[.]tn[.]canvas[.]notebook[.]cs[.]page[0-9]+[.]cs}}
+ {{.tn select "First Page"}
+ {[-]*[0-9]+}}
+ {{.tn delete select "Second Page"}
+ {}}
+ {{.tn delete "Third Page" 1}
+ {}}
+ {{.tn delete "Fifth Page" "Sixth Page"}
+ {}}
+ } {
+ set method [lindex [lindex $test 0] 1]
+ set method_invoke [lindex $test 0]
+
+ set testContents "set msg {}\n"
+ append testContents \
+ "set result \[catch \{[lindex $test 0]\} msg\]\n"
+ append testContents \
+ "lappend result \[regexp -- \{[lindex $test 1]\} \$msg\] \n"
+ append testContents "set result\n"
+ test Tabnotebook-3.$m "\[$method_invoke\]" $testContents \
+ [list 0 1]
+ update
+ incr m
+}
+
+#
+# Method tests which fail and produce errors
+#
+set m 1
+foreach test {
+ {1 {.tn delete 0 end} {can't delete page}}
+ {1 {.tn childsite 0} {can't get childsite, no pages}}
+ {0 {.tn add} {}}
+ {1 {.tn childsite 1} {bad Notebook page index in childsite method}}
+ {1 {.tn childsite -1} {bad Notebook page index in childsite method}}
+ {0 {.tn delete 0} {}}
+ {1 {.tn delete 0} {can't delete page, no pages}}
+ {0 {.tn add} {}}
+ {1 {.tn delete 1} {bad Notebook page index in delete method:}}
+ {1 {.tn delete select} {bad Notebook page index in delete method:}}
+ {0 {.tn delete 0} {}}
+ {0 {.tn add} {}}
+ {1 {.tn delete 0 1} {bad Notebook page index2 in delete method:}}
+ {1 {.tn delete 1 4} {bad Notebook page index1 in delete method:}}
+ {0 {.tn add} {}}
+ {1 {.tn delete 1 0} {bad Notebook page index1 in delete method: index1 is greater than index2}}
+ {0 {.tn delete 0 1} {}}
+ {0 {.tn add} {}}
+ {1 {.tn delete 0 1 4 5 6} {wrong # args}}
+ {1 {.tn delete} {wrong # args}}
+ {0 {.tn delete 0} {}}
+ {1 {.tn delete 0} {can't delete page}}
+ {1 {.tn delete select} {can't delete page}}
+ {1 {.tn insert 0} {can't insert page}}
+ {0 {.tn add} {}}
+ {0 {.tn add} {}}
+ {1 {.tn insert 2} {bad Notebook page index in insert method:}}
+ {1 {.tn insert -1} {bad Notebook page index}}
+ {0 {.tn delete 0 end} {}}
+ {1 {.tn next} {can't move to next page, no pages in the notebook}}
+ {1 {.tn prev} {can't move to previous page, no pages in the notebook}}
+ {1 {.tn select 0} {can't select page}}
+ {0 {.tn add} {}}
+ {1 {.tn select 1} {bad Notebook page index in select method:}}
+ {0 {.tn delete 0} {}}
+ } {
+ set method_status [lindex $test 0]
+ set method_invoke [lindex $test 1]
+ set method [lindex $method_invoke 1]
+
+ set testContents "set msg {}\n"
+ append testContents \
+ "set result \[catch \{$method_invoke\} msg\]\n"
+ append testContents \
+ "lappend result \[regexp -- \{[lindex $test 2]\} \$msg\] \n"
+ append testContents "set result\n"
+ test Tabnotebook-4.$m "\[$method_invoke\]" $testContents \
+ [list $method_status 1]
+ incr m
+ }
+
+
+# Conclusion of constrcution/destruction tests
+#
+test Tabnotebook-1.$c {Tabnotebook destruction} {
+ destroy .tn
+ update
+} {}
+
+incr c
+
+test Tabnotebook-1.$c {Tabnotebook construction} {
+ iwidgets::Tabnotebook .tn -width 100 -height 100
+ pack .tn
+ update
+ .tn add -label one
+ update
+ .tn add -label two
+ update
+ .tn add -label three
+ update
+} {}
+
+incr c
+
+test Tabnotebook-1.$c {Tabnotebook destruction} {
+ destroy .tn
+ update
+} {}
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/tests/tabset.test b/iwidgets/tests/tabset.test
new file mode 100644
index 00000000000..3266bc436bf
--- /dev/null
+++ b/iwidgets/tests/tabset.test
@@ -0,0 +1,347 @@
+# This file is a Tcl script to test out [incr Widgets] Tabset class.
+# It is organized in the standard fashion for Tcl tests with the following
+# notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+#
+# Copyright (c) 1995 DSC Technologies Corporation
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# @(#) $Id$
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+wm geometry . {}
+raise .
+
+set c 1
+set o 1
+set m 1
+
+#
+# Initial construction test
+#
+test Tabset-1.$c {Tabset construction} {
+ iwidgets::Tabset .ts
+ pack .ts
+ update
+ .ts add -label one
+ update
+ .ts add -label two
+ update
+ .ts add -label three
+ update
+} {}
+
+incr c
+
+#
+# Option tests which are successful.
+#
+test Tabset-2.$o {configuration option} {
+ llength [.ts configure]
+} {24}
+
+incr o
+
+foreach test {
+ {-disabledforeground #a3a3a3 #a3a3a3 }
+ {-backdrop white white }
+ {-start 4 4 }
+ {-command }
+ {-font fixed fixed }
+ {-selectbackground #ececec #ececec }
+ {-gap overlap overlap }
+ {-background #CDCDB7B7B5B5 #CDCDB7B7B5B5 }
+ {-state normal normal }
+ {-equaltabs true true }
+ {-bevelamount 0 0 }
+ {-selectforeground black black }
+ {-foreground #000000000000 #000000000000 }
+ {-raiseselect false false }
+ {-padx 4 4 }
+ {-pady 4 4 }
+ {-cursor }
+ {-margin 5 5 }
+ {-angle 20 20 }
+ {-width 0 0 }
+ {-tabborders true true }
+ {-height 0 0 }
+ {-tabpos s s }
+ } {
+ set option [lindex $test 0]
+ test Tabset-2.$o "configuration options, $option" {
+ .ts configure $option [lindex $test 1]
+ lindex [.ts configure $option] 4
+ } [lindex $test 2]
+ update
+ incr o
+}
+
+#
+# Tabconfigure Option tests which are successful.
+#
+test Tabset-2.$o {tab configuration option} {
+ llength [.ts tabconfigure 0]
+} {22}
+
+# do tabconfigure tests also...
+foreach test {
+ {0 -bevelamount 0 0}
+ {0 -state normal normal}
+ {0 -anchor c c}
+ {0 -image {} {}}
+ {0 -bitmap {} {}}
+ {0 -label Hello Hello}
+ {0 -label "Hello World" "Hello World"}
+ {0 -padx 4 4}
+ {0 -pady 4 4}
+ {0 -selectbackground gray70 gray70}
+ {0 -selectforeground black black}
+ {0 -disabledforeground gray gray}
+ {0 -background white white}
+ {0 -foreground black black}
+ {0 -orient vertical vertical}
+ {0 -invert false false}
+ {0 -angle 20 20}
+ {0 -font "-adobe-helvetica-bold-r-normal--34-240-100-100-p-182-iso8859-1" "-adobe-helvetica-bold-r-normal--34-240-100-100-p-182-iso8859-1"}
+ {0 -tabborders true true}
+ } {
+ set index [lindex $test 0]
+ set option [lindex $test 1]
+ test Tabset-2.$o "tab configuration options, $option" {
+ .ts tabconfigure $index $option [lindex $test 2]
+ .ts tabcget $index $option
+ } [lindex $test 3]
+ update
+ incr o
+}
+
+#
+# Option tests which fail and produce errors.
+#
+#foreach test {
+# { -OPTION BADVALUE {ERROR_MESSAGE} }
+# } {
+# set option [lindex $test 0]
+# test Tabset-2.$o "configuration options, $option" {
+# list [catch {.bb configure $option [lindex $test 1]} msg] $msg
+# } [list 1 [lindex $test 2]]
+# incr o
+#}
+
+#
+# Method tests which are successful.
+#
+foreach test {
+ {{.ts add}
+ {::.ts-tab[0-9]+}}
+ {{.ts add}
+ {::.ts-tab[0-9]+}}
+ {{.ts add}
+ {::.ts-tab[0-9]+}}
+ {{.ts add -label Never}
+ {::.ts-tab[0-9]+}}
+ {{.ts add}
+ {::.ts-tab[0-9]+}}
+ {{.ts add -label "Hello World" -disabledforeground gray}
+ {::.ts-tab[0-9]+}}
+ {{.ts index end}
+ {[0-9]+}}
+ {{.ts index Never}
+ {[0-9]+}}
+ {{.ts index 0}
+ {0}}
+ {{.ts select 0}
+ {0}}
+ {{.ts select select}
+ {0}}
+ {{.ts select end}
+ {[0-9]+}}
+ {{.ts select "Hello World"}
+ {[0-9]+}}
+ {{.ts insert 0}
+ {::.ts-tab[0-9]+}}
+ {{.ts insert select -label "An Insert"}
+ {::.ts-tab[0-9]+}}
+ {{.ts insert end -label "Next To Last"}
+ {::.ts-tab[0-9]+}}
+ {{.ts select 0}
+ {0}}
+ {{.ts next}
+ {1}}
+ {{.ts next}
+ {2}}
+ {{.ts prev}
+ {1}}
+ {{.ts prev}
+ {0}}
+ {{.ts delete Never}
+ {}}
+ {{.ts delete 1 2}
+ {}}
+ {{.ts delete 0 "Hello World"}
+ {}}
+ {{.ts add}
+ {::.ts-tab[0-9]+}}
+ {{.ts add}
+ {::.ts-tab[0-9]+}}
+ {{.ts add}
+ {::.ts-tab[0-9]+}}
+ {{.ts add}
+ {::.ts-tab[0-9]+}}
+ {{.ts delete 0 end}
+ {}}
+ {{.ts add}
+ {::.ts-tab[0-9]+}}
+ {{.ts add}
+ {::.ts-tab[0-9]+}}
+ {{.ts add}
+ {::.ts-tab[0-9]+}}
+ {{.ts add}
+ {::.ts-tab[0-9]+}}
+ {{.ts select 2}
+ {[-]*[0-9]+}}
+ {{.ts delete select end}
+ {}}
+ {{.ts delete 0 end}
+ {}}
+ {{.ts add -label "First Page"}
+ {::.ts-tab[0-9]+}}
+ {{.ts add -label "Second Page"}
+ {::.ts-tab[0-9]+}}
+ {{.ts add -label "Third Page"}
+ {::.ts-tab[0-9]+}}
+ {{.ts add -label "Fourth Page"}
+ {::.ts-tab[0-9]+}}
+ {{.ts add -label "Fifth Page"}
+ {::.ts-tab[0-9]+}}
+ {{.ts add -label "Sixth Page"}
+ {::.ts-tab[0-9]+}}
+ {{.ts select "First Page"}
+ {[-]*[0-9]+}}
+ {{.ts delete select "Second Page"}
+ {}}
+ {{.ts delete "Third Page" 1}
+ {}}
+ {{.ts delete "Fifth Page" "Sixth Page"}
+ {}}
+ } {
+ set method [lindex [lindex $test 0] 1]
+ set method_invoke [lindex $test 0]
+
+ set testContents "set msg {}\n"
+ append testContents \
+ "set result \[catch \{[lindex $test 0]\} msg\]\n"
+ append testContents \
+ "lappend result \[regexp -- \{[lindex $test 1]\} \$msg\] \n"
+ append testContents "set result\n"
+ test Tabset-3.$m "\[$method_invoke\]" $testContents \
+ [list 0 1]
+ update
+ incr m
+}
+
+#
+# Method tests which fail and produce errors
+#
+set m 1
+foreach test {
+ {1 {.ts delete 0 end} {can't delete tab}}
+ {0 {.ts add} {}}
+ {0 {.ts delete 0} {}}
+ {1 {.ts delete 0} {can't delete tabs, no tabs}}
+ {0 {.ts add} {}}
+ {1 {.ts delete 1} {bad value for index1}}
+ {1 {.ts delete select} {bad value for index1}}
+ {0 {.ts delete 0} {}}
+ {0 {.ts add} {}}
+ {1 {.ts delete 0 1} {bad value for index2}}
+ {1 {.ts delete 1 4} {bad value for index1}}
+ {0 {.ts add} {}}
+ {0 {.ts delete 0 1} {}}
+ {0 {.ts add} {}}
+ {1 {.ts delete 0 1 4 5 6} {wrong # args}}
+ {1 {.ts delete} {wrong # args}}
+ {0 {.ts delete 0} {}}
+ {1 {.ts delete 0} {can't delete tabs}}
+ {1 {.ts delete select} {can't delete tabs}}
+ {1 {.ts insert 0} {no tab to insert before, tabset}}
+ {0 {.ts add} {}}
+ {0 {.ts add} {}}
+ {1 {.ts insert 2} {bad value}}
+ {1 {.ts insert -1} {bad option}}
+ {0 {.ts delete 0 end} {}}
+ {1 {.ts next} {can't goto next tab, no tabs in the tabset}}
+ {1 {.ts prev} {can't goto previous tab, no tabs in the tabset}}
+ {1 {.ts select 0} {can't activate a tab, no tabs in the tabset}}
+ {0 {.ts add} {}}
+ {1 {.ts select 1} {bad value}}
+ {0 {.ts delete 0} {}}
+ } {
+ set method_status [lindex $test 0]
+ set method_invoke [lindex $test 1]
+ set method [lindex $method_invoke 1]
+
+ set testContents "set msg {}\n"
+ append testContents \
+ "set result \[catch \{$method_invoke\} msg\]\n"
+ append testContents \
+ "lappend result \[regexp -- \{[lindex $test 2]\} \$msg\] \n"
+ append testContents "set result\n"
+ test Tabset-4.$m "\[$method_invoke\]" $testContents \
+ [list $method_status 1]
+ incr m
+ }
+
+# Conclusion of constrcution/destruction tests
+#
+test Tabset-1.$c {Tabset destruction} {
+ destroy .ts
+ update
+} {}
+
+incr c
+
+test Tabset-1.$c {Tabset construction} {
+ iwidgets::Tabset .ts -width 100 -height 100
+ pack .ts
+ update
+ .ts add -label one
+ update
+ .ts add -label two
+ update
+ .ts add -label three
+ update
+} {}
+
+incr c
+
+test Tabset-1.$c {Tabset destruction} {
+ destroy .ts
+ update
+} {}
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/tests/timeentry.test b/iwidgets/tests/timeentry.test
new file mode 100644
index 00000000000..09210db8413
--- /dev/null
+++ b/iwidgets/tests/timeentry.test
@@ -0,0 +1,203 @@
+# This file is a Tcl script to test out [incr Widgets] Timeentry class.
+# It is organized in the standard fashion for Tcl tests with the following
+# notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+#
+# Copyright (c) 1995 DSC Technologies Corporation
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# @(#) $Id$
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+wm geometry . {}
+raise .
+
+set c 1
+set o 1
+set m 1
+
+#
+# Initial construction test
+#
+test Timeentry-1.$c {Timeentry construction} {
+ iwidgets::Timeentry .te -labeltext "Time Entry"
+ pack .te -padx 10 -pady 10 -fill both -expand yes
+ update
+} {}
+
+incr c
+
+#
+# Option tests which are successful.
+#
+test Timeentry-2.$o {configuration option} {
+ llength [.te configure]
+} {46}
+
+incr o
+
+foreach test {
+ {-background #d9d9d9 #d9d9d9}
+ {-borderwidth 4 4}
+ {-borderwidth 2 2}
+ {-command {.te configure -background red} {.te configure -background red}}
+ {-cursor gumby gumby}
+ {-exportselection 0 0}
+ {-foreground Green Green}
+ {-foreground Black Black}
+ {-highlightcolor Red Red}
+ {-highlightthickness 2 2}
+ {-insertbackground Yellow Yellow}
+ {-insertbackground Black Black}
+ {-justify right right}
+ {-justify center center}
+ {-justify left left}
+ {-labelmargin 5 5}
+ {-labelpos w w}
+ {-labelpos nw nw}
+ {-labelpos n n}
+ {-labelpos ne ne}
+ {-labelpos e e}
+ {-labelpos se se}
+ {-labelpos s s}
+ {-labelpos sw sw}
+ {-labeltext Label Label}
+ {-relief raised raised}
+ {-relief sunken sunken}
+ {-foreground black black}
+ {-state disabled disabled}
+ {-state normal normal}
+ {-closetext Set Set}
+ {-watchheight 200 200}
+ {-watchwidth 200 200}
+ {-hourradius .40 .40}
+ {-hourcolor green green}
+ {-minuteradius .90 .90}
+ {-minutecolor blue blue}
+ {-secondradius .99 .99}
+ {-secondcolor red red}
+ {-clockcolor brown brown}
+ {-clockstipple error error}
+ {-sticky w w}
+ {-sticky nw nw}
+ {-sticky n n}
+ {-sticky ne ne}
+ {-sticky e e}
+ {-sticky se se}
+ {-sticky s s}
+ {-sticky sw sw}
+ {-sticky news news}
+ {-tickcolor purple purple}
+ {-textbackground GhostWhite GhostWhite}
+ {-textbackground #d9d9d9 #d9d9d9}} {
+ set option [lindex $test 0]
+ test Timeentry-2.$o "configuration options, $option" {
+ .te configure $option [lindex $test 1]
+ lindex [.te configure $option] 4
+ } [lindex $test 2]
+ update
+ incr o
+}
+
+#
+# Option tests which fail and produce errors.
+#
+foreach test {
+ {-childsitepos bogus {bad childsite option "bogus": should be n, e, s, or w}}} {
+ set option [lindex $test 0]
+ test Timeentry-2.$o "configuration options, $option" {
+ list [catch {.te configure $option [lindex $test 1]} msg] $msg
+ } [list 1 [lindex $test 2]]
+ incr o
+}
+
+#
+# Method tests which are successful.
+#
+foreach test {
+ {{.te childsite} {.te.lwchildsite}}
+ {{.te show "11:11:11 PM"} {11:11:11 PM}}
+ {{.te get} {11:11:11 PM}}
+ {{.te get -string} {11:11:11 PM}}
+ {{.te isvalid} {1}}
+ {{.te component time delete 0 end} {}}
+ {{.te component time insert end 44:44:44} {}}
+ {{.te isvalid} {0}}
+ {{.te show now; list} {}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Timeentry-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 0 [lindex $test 1]]
+ update
+ incr m
+}
+
+test Timeentry-3.$m "object methods, clock clicks" {
+ set clicks [clock scan "3:15:00 PM"]
+ .te show $clicks
+ update
+ .te get
+} {03:15:00 PM}
+incr m
+
+#
+# Method tests which fail and produce errors
+#
+foreach test {
+ {{.te get bogus} {bad format option "bogus": should be -string or -clicks}}
+ {{.te show bogus} {bad time: "bogus", must be a valid time string, clock clicks value or the keyword now}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Timeentry-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 1 [lindex $test 1]]
+ incr m
+}
+
+#
+# Conclusion of constrcution/destruction tests
+#
+test Timeentry-1.$c {Timeentry destruction} {
+ destroy .te
+ update
+} {}
+
+incr c
+
+test Timeentry-1.$c {Timeentry construction} {
+ iwidgets::timeentry .te
+ pack .te -padx 10 -pady 10
+ update
+} {}
+
+incr c
+
+test Timeentry-1.$c {Timeentry destruction} {
+ destroy .te
+ update
+} {}
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/tests/timefield.test b/iwidgets/tests/timefield.test
new file mode 100644
index 00000000000..9d57080a694
--- /dev/null
+++ b/iwidgets/tests/timefield.test
@@ -0,0 +1,196 @@
+# This file is a Tcl script to test out [incr Widgets] Timefield class.
+# It is organized in the standard fashion for Tcl tests with the following
+# notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+#
+# Copyright (c) 1995 DSC Technologies Corporation
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# @(#) $Id$
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+wm geometry . {}
+raise .
+
+set c 1
+set o 1
+set m 1
+
+#
+# Initial construction test
+#
+test Timefield-1.$c {Timefield construction} {
+ iwidgets::Timefield .tf -labeltext "Date Field"
+ pack .tf -padx 10 -pady 10 -fill both -expand yes
+ update
+} {}
+
+incr c
+
+#
+# Option tests which are successful.
+#
+test Timefield-2.$o {configuration option} {
+ llength [.tf configure]
+} {30}
+
+incr o
+
+foreach test {
+ {-background #d9d9d9 #d9d9d9}
+ {-borderwidth 4 4}
+ {-borderwidth 2 2}
+ {-command {.tf configure -background red} {.tf configure -background red}}
+ {-cursor gumby gumby}
+ {-exportselection 0 0}
+ {-foreground Green Green}
+ {-foreground Black Black}
+ {-highlightcolor Red Red}
+ {-highlightthickness 2 2}
+ {-insertbackground Yellow Yellow}
+ {-insertbackground Black Black}
+ {-justify right right}
+ {-justify center center}
+ {-justify left left}
+ {-labelmargin 5 5}
+ {-labelpos w w}
+ {-labelpos nw nw}
+ {-labelpos n n}
+ {-labelpos ne ne}
+ {-labelpos e e}
+ {-labelpos se se}
+ {-labelpos s s}
+ {-labelpos sw sw}
+ {-labeltext Label Label}
+ {-gmt true true}
+ {-gmt false false}
+ {-gmt on on}
+ {-gmt off off}
+ {-gmt 1 1}
+ {-gmt 0 0}
+ {-gmt yes yes}
+ {-gmt no no}
+ {-relief raised raised}
+ {-relief sunken sunken}
+ {-sticky w w}
+ {-sticky nw nw}
+ {-sticky n n}
+ {-sticky ne ne}
+ {-sticky e e}
+ {-sticky se se}
+ {-sticky s s}
+ {-sticky sw sw}
+ {-sticky news news}
+ {-textbackground GhostWhite GhostWhite}
+ {-textbackground #d9d9d9 #d9d9d9}} {
+ set option [lindex $test 0]
+ test Timefield-2.$o "configuration options, $option" {
+ .tf configure $option [lindex $test 1]
+ lindex [.tf configure $option] 4
+ } [lindex $test 2]
+ update
+ incr o
+}
+
+#
+# Option tests which fail and produce errors.
+#
+foreach test {
+ {-childsitepos bogus {bad childsite option "bogus": should be n, e, s, or w}}} {
+ set option [lindex $test 0]
+ test Timefield-2.$o "configuration options, $option" {
+ list [catch {.tf configure $option [lindex $test 1]} msg] $msg
+ } [list 1 [lindex $test 2]]
+ incr o
+}
+
+#
+# Method tests which are successful.
+#
+foreach test {
+ {{.tf childsite} {.tf.lwchildsite}}
+ {{.tf show "11:45:00 AM"} {11:45:00 AM}}
+ {{.tf get} {11:45:00 AM}}
+ {{.tf get -string} {11:45:00 AM}}
+ {{.tf isvalid} {1}}
+ {{.tf component time delete 0 end} {}}
+ {{.tf component time insert end "44:44:44 PM"} {}}
+ {{.tf isvalid} {0}}
+ {{.tf show now; list} {}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Timefield-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 0 [lindex $test 1]]
+ update
+ incr m
+}
+
+test Timefield-3.$m "object methods, clock clicks" {
+ set clicks [clock scan "3:15:00 PM"]
+ .tf show $clicks
+ update
+ .tf get
+} {03:15:00 PM}
+incr m
+
+#
+# Method tests which fail and produce errors
+#
+foreach test {
+ {{.tf get bogus} {bad format option "bogus": should be -string or -clicks}}
+ {{.tf show bogus} {bad time: "bogus", must be a valid time string, clock clicks value or the keyword now}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Timefield-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 1 [lindex $test 1]]
+ incr m
+}
+
+#
+# Conclusion of constrcution/destruction tests
+#
+test Timefield-1.$c {Timefield destruction} {
+ destroy .tf
+ update
+} {}
+
+incr c
+
+test Timefield-1.$c {Timefield construction} {
+ iwidgets::timefield .tf
+ pack .tf -padx 10 -pady 10
+ update
+} {}
+
+incr c
+
+test Timefield-1.$c {Timefield destruction} {
+ destroy .tf
+ update
+} {}
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/tests/toolbar.test b/iwidgets/tests/toolbar.test
new file mode 100644
index 00000000000..614ff6f321f
--- /dev/null
+++ b/iwidgets/tests/toolbar.test
@@ -0,0 +1,297 @@
+# This file is a Tcl script to test out [incr Widgets] Toolbar class.
+# It is organized in the standard fashion for Tcl tests with the following
+# notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+#
+# Copyright (c) 1995 DSC Technologies Corporation
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# @(#) $Id$
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+wm geometry . {}
+raise .
+
+set c 1
+set o 1
+set m 1
+
+#
+# Initial construction test
+#
+test Toolbar-1.$c {Toolbar construction} {
+ iwidgets::Toolbar .tb
+ pack .tb
+ update
+ .tb add button item1 -text item1
+ update
+ .tb add button item2 -text item2
+ update
+ .tb add button item3 -text item3
+ update
+} {}
+
+incr c
+
+#
+# Option tests which are successful.
+#
+test Toolbar-2.$o {configuration option} {
+ llength [.tb configure]
+} {27}
+
+incr o
+
+foreach test {
+ {-disabledforeground #a3a3a3 #a3a3a3 }
+ {-highlightthickness 0 0 }
+ {-selectborderwidth 4 4 }
+ {-balloonfont 6x10 6x10 }
+ {-balloondelay1 1000 1000 }
+ {-balloondelay2 200 200 }
+ {-borderwidth 2 2 }
+ {-selectcolor #CDCDB7B7B5B5 #CDCDB7B7B5B5 }
+ {-highlightcolor Black Black }
+ {-font -Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-* -Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-* }
+ {-balloonbackground yellow yellow }
+ {-helpvariable testing testing}
+ {-troughcolor #c3c3c3 #c3c3c3 }
+ {-selectbackground #c3c3c3 #c3c3c3 }
+ {-highlightbackground #d9d9d9 #d9d9d9 }
+ {-background #CDCDB7B7B5B5 #CDCDB7B7B5B5 }
+ {-state normal normal }
+ {-balloonforeground black black }
+ {-selectforeground Black Black }
+ {-foreground #000000000000 #000000000000 }
+ {-activebackground #ececec #ececec }
+ {-insertbackground Black Black }
+ {-cursor crosshair crosshair }
+ {-activeforeground Black Black }
+ {-insertforeground Black Black }
+ {-orient horizontal horizontal }
+ } {
+ set option [lindex $test 0]
+ test Toolbar-2.$o "configuration options, $option" {
+ .tb configure $option [lindex $test 1]
+ .tb cget $option
+ } [lindex $test 2]
+ update
+ incr o
+}
+
+#
+# Itemconfigure Option tests which are successful.
+#
+# This happens to be for a button. Note that the configuration options for
+# the Tk button changed in 8.4. Four new options were added.
+set newoptions [list -compound -overrelief -repeatdelay -repeatinterval]
+set o 0
+if {$::tk_version < 8.4} {
+ test Toolbar-3.$o {tab configuration option} {
+ llength [.tb itemconfigure 0]
+ } {33}
+} else {
+ test Toolbar-3.$o {tab configuration option} {
+ llength [.tb itemconfigure 0]
+ } {37}
+}
+
+# do itemconfigure tests also...
+foreach test {
+ {0 -activebackground #ececec #ececec }
+ {0 -activeforeground Black Black }
+ {0 -anchor center center }
+ {0 -background #d9d9d9 #d9d9d9 }
+ {0 -bd 0 0 }
+ {0 -bg #d9d9d9 #d9d9d9 }
+ {0 -bitmap {} {} }
+ {0 -borderwidth 2 2 }
+ {0 -command {} {} }
+ {0 -compound none none }
+ {0 -cursor {} {} }
+ {0 -default disabled disabled }
+ {0 -disabledforeground #a3a3a3 #a3a3a3 }
+ {0 -fg Black Black }
+ {0 -font -Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-* -Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-* }
+ {0 -foreground Black Black }
+ {0 -height 0 0 }
+ {0 -highlightbackground #d9d9d9 #d9d9d9 }
+ {0 -highlightcolor Black Black }
+ {0 -highlightthickness 2 2 }
+ {0 -image {} {} }
+ {0 -justify center center }
+ {0 -overrelief {} {} }
+ {0 -padx 4 4 }
+ {0 -pady 4 4 }
+ {0 -relief raised raised }
+ {0 -repeatdelay 0 0 }
+ {0 -repeatinterval 0 0 }
+ {0 -state normal normal }
+ {0 -takefocus false false }
+ {0 -text {} {} }
+ {0 -textvariable {} {} }
+ {0 -underline -1 -1 }
+ {0 -width 0 0 }
+ {0 -wraplength 0 0 }
+ {0 -helpstr {} {} }
+ {0 -balloonstr {} {} }
+ } {
+ set option [lindex $test 1]
+ if {$::tk_version < 8.4} {
+ if {[lsearch $newoptions $option] != -1} {
+ # Skip it.
+ continue
+ }
+ }
+ set index [lindex $test 0]
+ test Toolbar-2.$o "tab configuration options, $option" {
+ .tb itemconfigure $index $option [lindex $test 2]
+ .tb itemcget $index $option
+ } [lindex $test 3]
+ update
+ incr o
+}
+
+
+#
+# Method tests which are successful.
+#
+foreach test {
+ {{.tb delete 0 end}
+ {}}
+ {{.tb add radiobutton one}
+ {.tb.one}}
+ {{.tb index end}
+ {0}}
+ {{.tb add checkbutton two}
+ {.tb.two}}
+ {{.tb index end}
+ {1}}
+ {{.tb index one}
+ {0}}
+ {{.tb insert end button oneandhalf -text "One & half"}
+ {.tb.oneandhalf}}
+ {{.tb index oneandhalf}
+ {1}}
+ {{.tb delete oneandhalf}
+ {}}
+ {{.tb index two}
+ {1}}
+ {{.tb delete 0 end}
+ {}}
+ {{.tb index 0}
+ {-1}}
+ } {
+ set method [lindex [lindex $test 0] 1]
+ set method_invoke [lindex $test 0]
+
+ set testContents "set msg {}\n"
+ append testContents \
+ "set result \[catch \{[lindex $test 0]\} msg\]\n"
+ append testContents \
+ "lappend result \[regexp -- \{[lindex $test 1]\} \$msg\] \n"
+ append testContents "set result\n"
+ test Toolbar-4.$m "\[$method_invoke\]" $testContents \
+ [list 0 1]
+ update
+ incr m
+}
+
+#
+# Method tests which fail and produce errors
+#
+foreach test {
+ {1 {.tb delete 0 end} {}}
+ {0 {.tb add button item1} {}}
+ {0 {.tb delete 0} {}}
+ {1 {.tb delete 0} {can't delete widget, no widgets in the Toolbar}}
+ {0 {.tb add button item1} {}}
+ {1 {.tb delete 1} {bad Toolbar widget index in delete method}}
+ {0 {.tb delete 0} {}}
+ {0 {.tb add button item1} {}}
+ {1 {.tb delete 0 1} {bad Toolbar widget index2 in delete method}}
+ {1 {.tb delete 1 4} {bad Toolbar widget index1 in delete method}}
+ {0 {.tb add button item2} {}}
+ {1 {.tb delete 1 0} {bad Toolbar widget index1 in delete method}}
+ {0 {.tb delete 0 1} {}}
+ {0 {.tb add button item1} {}}
+ {1 {.tb delete 0 1 4 5 6} {wrong # args}}
+ {1 {.tb delete} {wrong # args}}
+ {0 {.tb delete 0} {}}
+ {1 {.tb delete 0} {can't delete widget, no widgets in the Toolbar}}
+ {1 {.tb insert 0 button itemA} {}}
+ {0 {.tb add button item1} {}}
+ {0 {.tb add button item2} {}}
+ {0 {.tb insert 0 button itemAA} {}}
+ {1 {.tb insert -1 button bogus} {bad toolbar entry index -1}}
+ {0 {.tb delete 0 end} {}}
+ } {
+ set method_status [lindex $test 0]
+ set method_invoke [lindex $test 1]
+ set method [lindex $method_invoke 1]
+
+ set testContents "set msg {}\n"
+ append testContents \
+ "set result \[catch \{$method_invoke\} msg\]\n"
+ append testContents \
+ "lappend result \[regexp -- \{[lindex $test 2]\} \$msg\] \n"
+ append testContents "set result\n"
+ test Toolbar-5.$m "\[$method_invoke\]" $testContents \
+ [list $method_status 1]
+ incr m
+ }
+
+#
+# Conclusion of constrcution/destruction tests
+#
+test Toolbar-1.$c {Toolbar destruction} {
+ destroy .tb
+ update
+} {}
+
+incr c
+
+test Toolbar-1.$c {Toolbar construction} {
+ iwidgets::Toolbar .tb
+ pack .tb
+ update
+ .tb add iwidgets::optionmenu opt
+ update
+ .tb add button b
+ update
+ .tb add frame filler
+ update
+} {}
+
+incr c
+
+test Toolbar-1.$c {Toolbar destruction} {
+ destroy .tb
+ update
+} {}
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/tests/usual.test b/iwidgets/tests/usual.test
new file mode 100644
index 00000000000..f535002aa69
--- /dev/null
+++ b/iwidgets/tests/usual.test
@@ -0,0 +1,75 @@
+# This file is a Tcl script to test out all of the "usual" options
+# for all of the [incr Widgets]. It looks for other tests in this
+# directory, and tries to create a mega-widget with each of these
+# as a component. If there are any problems with "usual" definitions,
+# they will be found here.
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# @(#) $Id$
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+wm geometry . {}
+raise .
+
+# ----------------------------------------------------------------------
+# Create a new mega-widget class that we can use to add other
+# classes as components.
+# ----------------------------------------------------------------------
+test usual-1.1 {create a mega-widget that we can add components to} {
+ itcl::class TestUsual {
+ inherit itk::Widget
+ method do {cmd} {
+ eval $cmd
+ }
+ }
+ TestUsual .testUsual
+} {.testUsual}
+
+# ----------------------------------------------------------------------
+# Now, scan through all of the tests in this directory and look
+# for mega-widgets. Add each mega-widget to the test class.
+# ----------------------------------------------------------------------
+set unique 0
+foreach file [glob *.test] {
+ set widget [file rootname [file tail $file]]
+ if {$widget == "extbutton"} {
+ if {$::tk_version < 8.4} {
+ # Skip it.
+ continue
+ }
+ }
+
+ if {$widget != "usual"} {
+ set name "c[incr unique]"
+ test usual-1.2.$name "verify \"usual\" options for $widget" {
+ .testUsual do [format {
+ itk_component add %s {
+ iwidgets::%s $itk_interior.%s
+ }
+ } $name $widget $name]
+ } $name
+ }
+}
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/tests/watch.test b/iwidgets/tests/watch.test
new file mode 100644
index 00000000000..ff220bc4e7b
--- /dev/null
+++ b/iwidgets/tests/watch.test
@@ -0,0 +1,165 @@
+# This file is a Tcl script to test out [incr Widgets] Watch class.
+# It is organized in the standard fashion for Tcl tests with the following
+# notation for test case labels:
+#
+# 1.x - Construction/Destruction tests
+# 2.x - Configuration option tests
+# 3.x - Method tests
+#
+# Copyright (c) 1995 DSC Technologies Corporation
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+#
+# @(#) $Id$
+
+package require tcltest
+namespace import -force ::tcltest::*
+
+if [catch {package require Iwidgets 4.0}] {
+ # Let's try modifying the auto_path. Note that the IWIDGETS_LIBRARY
+ # env var is initialized in the Makefile when doing a 'make test'.
+ # If sourcing this file independently, this variable must be set manually.
+ if ![info exists env(IWIDGETS_LIBRARY)] {
+ error "Unable to locate Iwidgets package. Set your IWIDGETS_LIBRARY\
+ environment\nvariable to the directory that contains iwidgets.tcl"
+ }
+ lappend auto_path $env(IWIDGETS_LIBRARY)
+ package require Iwidgets 4.0
+}
+
+if {[string compare test [info procs test]] == 1} {
+ source defs
+}
+
+wm geometry . {}
+raise .
+
+set c 1
+set o 1
+set m 1
+
+catch {destroy .w}
+
+#
+# Initial construction test
+#
+test Watch-1.$c {Watch construction} {
+ iwidgets::Watch .w
+ pack .w -padx 10 -pady 10 -fill both -expand yes
+ update
+} {}
+
+incr c
+
+#
+# Option tests which are successful.
+#
+test Watch-2.$o {configuration option} {
+ llength [.w configure]
+} {34}
+
+incr o
+
+foreach test {
+ {-background #d9d9d9 #d9d9d9}
+ {-cursor gumby gumby}
+ {-hourcolor yellow yellow}
+ {-minutecolor blue blue}
+ {-secondcolor green green}
+ {-tickcolor red red}
+ {-clockcolor orange orange}
+ {-clockstipple error error}
+ {-state disabled disabled}
+ {-state normal normal}
+ {-showampm no no}
+ {-showampm yes yes}
+ {-hourradius .3 .3}
+ {-minuteradius .5 .5}
+ {-secondradius .7 .7}} {
+ set option [lindex $test 0]
+ test Watch-2.$o "configuration options, $option" {
+ .w configure $option [lindex $test 1]
+ lindex [.w configure $option] 4
+ } [lindex $test 2]
+ update
+ incr o
+ .w show
+ after 500
+}
+
+#
+# Option tests which fail and produce errors.
+#
+foreach test {
+ {-state bogus {bad state option "bogus": should be normal or disabled}}
+ {-showampm bogus {bad showampm option "bogus": should be boolean}}} {
+ set option [lindex $test 0]
+ test Watch-2.$o "configuration options, $option" {
+ list [catch {.w configure $option [lindex $test 1]} msg] $msg
+ } [list 1 [lindex $test 2]]
+ incr o
+}
+
+#
+# Method tests which are successful.
+#
+foreach test {
+ {{.w show "11:11:11"} {}}
+ {{.w get} "11:11:11 AM"}
+ {{.w show "now"} {}}} {
+ set method [lindex [lindex $test 0] 1]
+ test Watch-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 0 [lindex $test 1]]
+ update
+ incr m
+ after 500
+}
+
+foreach test {
+ {{.w show bogus} {bad time: "bogus", must be a valid time string, clock clicks value or the keyword now}}
+ {{.w get bogus} {bad format option "bogus": should be -string or -clicks}}} {
+ set method [lindex [lindex $test 0] 1]
+ test ScrolledListBox-3.$m "object methods, $method" {
+ list [catch {eval [lindex $test 0]} msg] $msg
+ } [list 1 [lindex $test 1]]
+ incr m
+ .w show
+ after 500
+}
+
+#
+# Conclusion of constrcution/destruction tests
+#
+test Watch-1.$c {Watch destruction} {
+ destroy .w
+ update
+} {}
+
+incr c
+
+test Watch-1.$c {Watch construction} {
+ iwidgets::watch .w
+ pack .w -padx 10 -pady 10 -fill both -expand yes
+ update
+} {}
+
+incr c
+
+test Watch-1.$c {Watch destruction} {
+ destroy .w
+ update
+} {}
+
+incr c
+
+test Watch-1.$c {Watch destruction} {
+ iwidgets::watch .w
+ pack .w
+ destroy .w
+ update
+} {}
+
+::tcltest::cleanupTests
+exit
diff --git a/iwidgets/win/iwidgets.tcl b/iwidgets/win/iwidgets.tcl
new file mode 100644
index 00000000000..462967ecab3
--- /dev/null
+++ b/iwidgets/win/iwidgets.tcl
@@ -0,0 +1,31 @@
+#
+# iwidgets.tcl
+# ----------------------------------------------------------------------
+# Invoked automatically by [incr Tk] upon startup to initialize
+# the [incr Widgets] package.
+# ----------------------------------------------------------------------
+# AUTHOR: Mark L. Ulferts EMAIL: mulferts@spd.dsccc.com
+#
+# @(#) $Id$
+# ----------------------------------------------------------------------
+# Copyright (c) 1995 Mark L. Ulferts
+# ======================================================================
+# See the file "license.terms" for information on usage and
+# redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+
+package require Tcl 8.1
+package require Tk 8.1
+package require Itcl 3.2
+package require Itk 3.2
+
+namespace eval ::iwidgets {
+ namespace export *
+
+ variable library [file dirname [info script]]
+ variable version 4.0.1
+}
+
+lappend auto_path $iwidgets::library \
+ [file join $iwidgets::library generic] \
+ [file join $iwidgets::library scripts]
+package provide Iwidgets $iwidgets::version
diff --git a/iwidgets/win/makefile.vc b/iwidgets/win/makefile.vc
new file mode 100644
index 00000000000..976533c6992
--- /dev/null
+++ b/iwidgets/win/makefile.vc
@@ -0,0 +1,46 @@
+# Microsoft Visual C++ 4.0 makefile
+#
+# Copyright (c) 1993-1998 Lucent Technologies, Inc.
+#
+# RCS #(@) $Id$
+
+!include "pkg.vc"
+
+# You must define INSTALLDIR on the commandline, if Iwidgets is to be installed
+# from outside the Itcl source tree.
+
+!ifndef INSTALLDIR
+!include "../../config.vc"
+!endif
+
+ROOT = ..
+PACKAGE = iwidgets$(IWIDGETS_DOTVERSION)
+
+LIB_INSTALL_DIR = $(INSTALLDIR)\lib
+BIN_INSTALL_DIR = $(INSTALLDIR)\bin
+INCLUDE_INSTALL_DIR = $(INSTALLDIR)\include
+PKG_INSTALL_DIR = $(INSTALLDIR)\lib\$(PACKAGE)
+SCRIPT_INSTALL_DIR = $(PKG_INSTALL_DIR)\scripts
+DEMO_INSTALL_DIR = $(PKG_INSTALL_DIR)\demos
+
+
+# do nothing for this target.
+release :
+
+
+install :
+ if not exist "$(INSTALLDIR)" mkdir "$(INSTALLDIR)"
+ if not exist "$(LIB_INSTALL_DIR)" mkdir "$(LIB_INSTALL_DIR)"
+ if not exist "$(PKG_INSTALL_DIR)" mkdir "$(PKG_INSTALL_DIR)"
+ if not exist "$(SCRIPT_INSTALL_DIR)" mkdir "$(SCRIPT_INSTALL_DIR)"
+ if not exist "$(DEMO_INSTALL_DIR)" mkdir "$(DEMO_INSTALL_DIR)"
+ if not exist "$(DEMO_INSTALL_DIR)\html" mkdir "$(DEMO_INSTALL_DIR)\html"
+ if not exist "$(DEMO_INSTALL_DIR)\images" mkdir "$(DEMO_INSTALL_DIR)\images"
+ copy $(ROOT)\win\*.tcl "$(PKG_INSTALL_DIR)"
+ copy $(ROOT)\generic\*.* "$(SCRIPT_INSTALL_DIR)"
+ copy $(ROOT)\demos\*.* "$(DEMO_INSTALL_DIR)"
+ copy $(ROOT)\demos\images\*.* "$(DEMO_INSTALL_DIR)\images"
+ copy $(ROOT)\demos\html\*.* "$(DEMO_INSTALL_DIR)\html"
+ copy $(ROOT)\demos\catalog "$(PKG_INSTALL_DIR)\catalog.tcl"
+ echo package ifneeded Iwidgets $(IWIDGETS_DOTVERSION) [list source [file join $$dir iwidgets.tcl]] > \
+ "$(PKG_INSTALL_DIR)\pkgIndex.tcl"
diff --git a/iwidgets/win/pkg.vc b/iwidgets/win/pkg.vc
new file mode 100644
index 00000000000..ab4eab3505d
--- /dev/null
+++ b/iwidgets/win/pkg.vc
@@ -0,0 +1,10 @@
+######################################################################
+#
+# Global package version numbers for iwidgets.
+#
+######################################################################
+# $Id$
+######################################################################
+
+IWIDGETS_DOTVERSION = 4.0.1
+IWIDGETS_VERSION = $(IWIDGETS_DOTVERSION:.=)