arcadia 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (167) hide show
  1. data/README +126 -123
  2. data/arcadia.rb +770 -756
  3. data/base/a-contracts.rb +130 -93
  4. data/base/a-ext.rb +280 -280
  5. data/base/a-libs.rb +5 -11
  6. data/base/a-utils.rb +235 -44
  7. data/conf/arcadia.conf +20 -16
  8. data/conf/arcadia.init.rb +0 -0
  9. data/conf/arcadia.res.rb +74 -0
  10. data/ext/ae-complete-code/ae-complete-code.conf +0 -0
  11. data/ext/ae-complete-code/ae-complete-code.rb +80 -79
  12. data/ext/ae-debug/ae-debug.conf +0 -0
  13. data/ext/ae-debug/ae-debug.rb +2 -6
  14. data/ext/ae-debug/debug1.57.rb +0 -0
  15. data/ext/ae-doc-code/ae-doc-code.conf +15 -0
  16. data/ext/ae-doc-code/ae-doc-code.rb +289 -0
  17. data/ext/ae-editor/ae-editor.conf +17 -8
  18. data/ext/ae-editor/ae-editor.rb +738 -396
  19. data/ext/ae-event-log/ae-event-log.conf +0 -0
  20. data/ext/ae-event-log/ae-event-log.rb +0 -0
  21. data/ext/ae-file-history/ae-file-history.conf +2 -2
  22. data/ext/ae-file-history/ae-file-history.rb +286 -290
  23. data/ext/ae-inspector/ae-inspector.conf +0 -0
  24. data/ext/ae-inspector/ae-inspector.rb +0 -0
  25. data/ext/ae-output-event/ae-output-event.conf +2 -2
  26. data/ext/ae-output/ae-output.conf +2 -2
  27. data/ext/ae-output/ae-output.rb +173 -178
  28. data/ext/ae-palette/ae-palette.conf +0 -0
  29. data/ext/ae-palette/ae-palette.rb +0 -0
  30. data/ext/ae-shell/ae-shell.conf +0 -0
  31. data/ext/ae-shell/ae-shell.rb +54 -54
  32. data/lib/tk/al-tk.rb +3076 -3082
  33. data/lib/tk/al-tk.res.rb +0 -0
  34. data/lib/tk/al-tkarcadia.rb +0 -0
  35. data/lib/tk/al-tkcustom.rb +0 -0
  36. data/lib/tkext/al-bwidget.rb +0 -0
  37. data/lib/tkext/al-iwidgets.rb +0 -0
  38. data/lib/tkext/al-tile.rb +0 -0
  39. data/lib/tkext/al-tktable.rb +0 -0
  40. data/tcl/BWidget-1.8.0/BWman/ArrowButton.html +276 -0
  41. data/tcl/BWidget-1.8.0/BWman/BWidget.html +228 -0
  42. data/tcl/BWidget-1.8.0/BWman/Button.html +273 -0
  43. data/tcl/BWidget-1.8.0/BWman/ButtonBox.html +264 -0
  44. data/tcl/BWidget-1.8.0/BWman/ComboBox.html +402 -0
  45. data/tcl/BWidget-1.8.0/BWman/Dialog.html +314 -0
  46. data/tcl/BWidget-1.8.0/BWman/DragSite.html +139 -0
  47. data/tcl/BWidget-1.8.0/BWman/DropSite.html +254 -0
  48. data/tcl/BWidget-1.8.0/BWman/DynamicHelp.html +248 -0
  49. data/tcl/BWidget-1.8.0/BWman/Entry.html +341 -0
  50. data/tcl/BWidget-1.8.0/BWman/Label.html +331 -0
  51. data/tcl/BWidget-1.8.0/BWman/LabelEntry.html +194 -0
  52. data/tcl/BWidget-1.8.0/BWman/LabelFrame.html +144 -0
  53. data/tcl/BWidget-1.8.0/BWman/ListBox.html +678 -0
  54. data/tcl/BWidget-1.8.0/BWman/MainFrame.html +283 -0
  55. data/tcl/BWidget-1.8.0/BWman/MessageDlg.html +218 -0
  56. data/tcl/BWidget-1.8.0/BWman/NoteBook.html +374 -0
  57. data/tcl/BWidget-1.8.0/BWman/PagesManager.html +180 -0
  58. data/tcl/BWidget-1.8.0/BWman/PanedWindow.html +142 -0
  59. data/tcl/BWidget-1.8.0/BWman/PanelFrame.html +153 -0
  60. data/tcl/BWidget-1.8.0/BWman/PasswdDlg.html +214 -0
  61. data/tcl/BWidget-1.8.0/BWman/ProgressBar.html +152 -0
  62. data/tcl/BWidget-1.8.0/BWman/ProgressDlg.html +145 -0
  63. data/tcl/BWidget-1.8.0/BWman/ScrollView.html +130 -0
  64. data/tcl/BWidget-1.8.0/BWman/ScrollableFrame.html +191 -0
  65. data/tcl/BWidget-1.8.0/BWman/ScrolledWindow.html +116 -0
  66. data/tcl/BWidget-1.8.0/BWman/SelectColor.html +164 -0
  67. data/tcl/BWidget-1.8.0/BWman/SelectFont.html +152 -0
  68. data/tcl/BWidget-1.8.0/BWman/Separator.html +77 -0
  69. data/tcl/BWidget-1.8.0/BWman/SpinBox.html +250 -0
  70. data/tcl/BWidget-1.8.0/BWman/StatusBar.html +147 -0
  71. data/tcl/BWidget-1.8.0/BWman/TitleFrame.html +107 -0
  72. data/tcl/BWidget-1.8.0/BWman/Tree.html +947 -0
  73. data/tcl/BWidget-1.8.0/BWman/Widget.html +502 -0
  74. data/tcl/BWidget-1.8.0/BWman/contents.html +84 -0
  75. data/tcl/BWidget-1.8.0/BWman/index.html +7 -0
  76. data/tcl/BWidget-1.8.0/BWman/navtree.html +41 -0
  77. data/tcl/BWidget-1.8.0/BWman/options.htm +458 -0
  78. data/tcl/BWidget-1.8.0/CHANGES.txt +266 -0
  79. data/tcl/BWidget-1.8.0/ChangeLog +1641 -0
  80. data/tcl/BWidget-1.8.0/LICENSE.txt +41 -0
  81. data/tcl/BWidget-1.8.0/README.txt +127 -0
  82. data/tcl/BWidget-1.8.0/arrow.tcl +551 -0
  83. data/tcl/BWidget-1.8.0/bitmap.tcl +94 -0
  84. data/tcl/BWidget-1.8.0/button.tcl +324 -0
  85. data/tcl/BWidget-1.8.0/buttonbox.tcl +403 -0
  86. data/tcl/BWidget-1.8.0/color.tcl +493 -0
  87. data/tcl/BWidget-1.8.0/combobox.tcl +809 -0
  88. data/tcl/BWidget-1.8.0/demo/basic.tcl +199 -0
  89. data/tcl/BWidget-1.8.0/demo/bwidget.xbm +46 -0
  90. data/tcl/BWidget-1.8.0/demo/demo.tcl +212 -0
  91. data/tcl/BWidget-1.8.0/demo/dnd.tcl +42 -0
  92. data/tcl/BWidget-1.8.0/demo/manager.tcl +141 -0
  93. data/tcl/BWidget-1.8.0/demo/select.tcl +59 -0
  94. data/tcl/BWidget-1.8.0/demo/tmpldlg.tcl +214 -0
  95. data/tcl/BWidget-1.8.0/demo/tree.tcl +260 -0
  96. data/tcl/BWidget-1.8.0/demo/x1.xbm +2258 -0
  97. data/tcl/BWidget-1.8.0/dialog.tcl +345 -0
  98. data/tcl/BWidget-1.8.0/dragsite.tcl +197 -0
  99. data/tcl/BWidget-1.8.0/dropsite.tcl +455 -0
  100. data/tcl/BWidget-1.8.0/dynhelp.tcl +625 -0
  101. data/tcl/BWidget-1.8.0/entry.tcl +469 -0
  102. data/tcl/BWidget-1.8.0/font.tcl +566 -0
  103. data/tcl/BWidget-1.8.0/images/bold.gif +0 -0
  104. data/tcl/BWidget-1.8.0/images/copy.gif +0 -0
  105. data/tcl/BWidget-1.8.0/images/cut.gif +0 -0
  106. data/tcl/BWidget-1.8.0/images/dragfile.gif +0 -0
  107. data/tcl/BWidget-1.8.0/images/dragicon.gif +0 -0
  108. data/tcl/BWidget-1.8.0/images/error.gif +0 -0
  109. data/tcl/BWidget-1.8.0/images/file.gif +0 -0
  110. data/tcl/BWidget-1.8.0/images/folder.gif +0 -0
  111. data/tcl/BWidget-1.8.0/images/hourglass.gif +0 -0
  112. data/tcl/BWidget-1.8.0/images/info.gif +0 -0
  113. data/tcl/BWidget-1.8.0/images/italic.gif +0 -0
  114. data/tcl/BWidget-1.8.0/images/minus.xbm +5 -0
  115. data/tcl/BWidget-1.8.0/images/new.gif +0 -0
  116. data/tcl/BWidget-1.8.0/images/opcopy.xbm +5 -0
  117. data/tcl/BWidget-1.8.0/images/open.gif +0 -0
  118. data/tcl/BWidget-1.8.0/images/openfold.gif +0 -0
  119. data/tcl/BWidget-1.8.0/images/oplink.xbm +5 -0
  120. data/tcl/BWidget-1.8.0/images/opmove.xbm +5 -0
  121. data/tcl/BWidget-1.8.0/images/overstrike.gif +0 -0
  122. data/tcl/BWidget-1.8.0/images/palette.gif +0 -0
  123. data/tcl/BWidget-1.8.0/images/passwd.gif +0 -0
  124. data/tcl/BWidget-1.8.0/images/paste.gif +0 -0
  125. data/tcl/BWidget-1.8.0/images/plus.xbm +5 -0
  126. data/tcl/BWidget-1.8.0/images/print.gif +0 -0
  127. data/tcl/BWidget-1.8.0/images/question.gif +0 -0
  128. data/tcl/BWidget-1.8.0/images/redo.gif +0 -0
  129. data/tcl/BWidget-1.8.0/images/save.gif +0 -0
  130. data/tcl/BWidget-1.8.0/images/target.xbm +9 -0
  131. data/tcl/BWidget-1.8.0/images/underline.gif +0 -0
  132. data/tcl/BWidget-1.8.0/images/undo.gif +0 -0
  133. data/tcl/BWidget-1.8.0/images/warning.gif +0 -0
  134. data/tcl/BWidget-1.8.0/init.tcl +40 -0
  135. data/tcl/BWidget-1.8.0/label.tcl +271 -0
  136. data/tcl/BWidget-1.8.0/labelentry.tcl +100 -0
  137. data/tcl/BWidget-1.8.0/labelframe.tcl +160 -0
  138. data/tcl/BWidget-1.8.0/lang/da.rc +52 -0
  139. data/tcl/BWidget-1.8.0/lang/de.rc +52 -0
  140. data/tcl/BWidget-1.8.0/lang/en.rc +52 -0
  141. data/tcl/BWidget-1.8.0/lang/es.rc +53 -0
  142. data/tcl/BWidget-1.8.0/lang/fr.rc +52 -0
  143. data/tcl/BWidget-1.8.0/listbox.tcl +1638 -0
  144. data/tcl/BWidget-1.8.0/mainframe.tcl +711 -0
  145. data/tcl/BWidget-1.8.0/messagedlg.tcl +128 -0
  146. data/tcl/BWidget-1.8.0/notebook.tcl +1164 -0
  147. data/tcl/BWidget-1.8.0/pagesmgr.tcl +294 -0
  148. data/tcl/BWidget-1.8.0/panedw.tcl +381 -0
  149. data/tcl/BWidget-1.8.0/panelframe.tcl +246 -0
  150. data/tcl/BWidget-1.8.0/passwddlg.tcl +178 -0
  151. data/tcl/BWidget-1.8.0/pkgIndex.tcl +47 -0
  152. data/tcl/BWidget-1.8.0/progressbar.tcl +208 -0
  153. data/tcl/BWidget-1.8.0/progressdlg.tcl +87 -0
  154. data/tcl/BWidget-1.8.0/scrollframe.tcl +226 -0
  155. data/tcl/BWidget-1.8.0/scrollview.tcl +254 -0
  156. data/tcl/BWidget-1.8.0/scrollw.tcl +280 -0
  157. data/tcl/BWidget-1.8.0/separator.tcl +75 -0
  158. data/tcl/BWidget-1.8.0/spinbox.tcl +331 -0
  159. data/tcl/BWidget-1.8.0/statusbar.tcl +422 -0
  160. data/tcl/BWidget-1.8.0/tests/entry.test +173 -0
  161. data/tcl/BWidget-1.8.0/titleframe.tcl +170 -0
  162. data/tcl/BWidget-1.8.0/tree.tcl +2228 -0
  163. data/tcl/BWidget-1.8.0/utils.tcl +645 -0
  164. data/tcl/BWidget-1.8.0/widget.tcl +1576 -0
  165. data/tcl/BWidget-1.8.0/wizard.tcl +1028 -0
  166. data/tcl/BWidget-1.8.0/xpm2image.tcl +115 -0
  167. metadata +141 -5
@@ -0,0 +1,1028 @@
1
+ # ------------------------------------------------------------------------------
2
+ # wizard.tcl
3
+ #
4
+ # ------------------------------------------------------------------------------
5
+ # Index of commands:
6
+ #
7
+ # Public commands
8
+ # - Wizard::create
9
+ # - Wizard::configure
10
+ # - Wizard::cget
11
+ #
12
+ # Private commands (event bindings)
13
+ # - Wizard::_destroy
14
+ # ------------------------------------------------------------------------------
15
+
16
+ namespace eval Wizard {
17
+ Widget::define Wizard wizard ButtonBox Separator PagesManager
18
+
19
+ namespace eval Step {
20
+ Widget::declare Wizard::Step {
21
+ {-type String "step" 1 }
22
+ {-data String "" 0 }
23
+ {-title String "" 0 }
24
+ {-default String "next" 0 }
25
+ {-text1 String "" 0 }
26
+ {-text2 String "" 0 }
27
+ {-text3 String "" 0 }
28
+ {-text4 String "" 0 }
29
+ {-text5 String "" 0 }
30
+ {-icon String "" 0 }
31
+ {-image String "" 0 }
32
+ {-bitmap String "" 0 }
33
+ {-iconbitmap String "" 0 }
34
+
35
+ {-create Boolean "0" 1 }
36
+ {-appendorder Boolean "1" 0 }
37
+
38
+ {-nexttext String "Next >" 0 }
39
+ {-backtext String "< Back" 0 }
40
+ {-helptext String "Help" 0 }
41
+ {-canceltext String "Cancel" 0 }
42
+ {-finishtext String "Finish" 0 }
43
+ {-separatortext String "" 0 }
44
+
45
+ {-createcommand String "" 0 }
46
+ {-raisecommand String "" 0 }
47
+ {-nextcommand String "" 0 }
48
+ {-backcommand String "" 0 }
49
+ {-helpcommand String "" 0 }
50
+ {-cancelcommand String "" 0 }
51
+ {-finishcommand String "" 0 }
52
+
53
+ }
54
+ }
55
+
56
+ namespace eval Branch {
57
+ Widget::declare Wizard::Branch {
58
+ {-type String "branch" 1 }
59
+ {-command String "" 0 }
60
+ {-action Enum "merge" 0 {merge terminate} }
61
+ }
62
+ }
63
+
64
+ namespace eval Widget {
65
+ Widget::declare Wizard::Widget {
66
+ {-type String "widget" 1 }
67
+ {-step String "" 1 }
68
+ {-widget String "" 1 }
69
+ }
70
+ }
71
+
72
+ namespace eval layout {}
73
+
74
+ Widget::tkinclude Wizard frame :cmd \
75
+ include { -width -height -background -foreground -cursor }
76
+
77
+ Widget::declare Wizard {
78
+ {-type Enum "dialog" 1 {dialog frame} }
79
+ {-width TkResource "450" 0 frame}
80
+ {-height TkResource "300" 0 frame}
81
+ {-relief TkResource "flat" 0 frame}
82
+ {-borderwidth TkResource "0" 0 frame}
83
+ {-background TkResource "" 0 frame}
84
+ {-foreground String "black" 0 }
85
+ {-title String "Wizard" 0 }
86
+
87
+ {-autobuttons Boolean "1" 0 }
88
+ {-helpbutton Boolean "0" 1 }
89
+ {-finishbutton Boolean "0" 1 }
90
+ {-resizable String "0 0" 0 }
91
+ {-separator Boolean "1" 1 }
92
+ {-parent String "." 1 }
93
+ {-transient Boolean "1" 1 }
94
+ {-place Enum "center" 1
95
+ {none center left right above below}}
96
+
97
+ {-icon String "" 0 }
98
+ {-image String "" 0 }
99
+ {-bitmap String "" 0 }
100
+ {-iconbitmap String "" 0 }
101
+ {-raisecommand String "" 0 }
102
+ {-createcommand String "" 0 }
103
+ {-separatortext String "" 0 }
104
+
105
+ {-fg Synonym -foreground }
106
+ {-bg Synonym -background }
107
+ {-bd Synonym -borderwidth }
108
+ }
109
+
110
+ image create photo Wizard::none
111
+
112
+ Widget::addmap Wizard "" :cmd { -background {} -relief {} -borderwidth {} }
113
+
114
+ Widget::addmap Wizard "" .steps { -width {} -height {} }
115
+
116
+ bind Wizard <Destroy> [list Wizard::_destroy %W]
117
+ }
118
+
119
+
120
+ # ------------------------------------------------------------------------------
121
+ # Command Wizard::create
122
+ # ------------------------------------------------------------------------------
123
+ proc Wizard::create { path args } {
124
+ array set maps [list Wizard {} :cmd {}]
125
+ array set maps [Widget::parseArgs Wizard $args]
126
+
127
+ Widget::initFromODB Wizard $path $maps(Wizard)
128
+
129
+ Widget::getVariable $path data
130
+ Widget::getVariable $path branches
131
+
132
+ array set data {
133
+ steps ""
134
+ buttons ""
135
+ order ""
136
+ current ""
137
+ }
138
+
139
+ array set branches {
140
+ root ""
141
+ }
142
+
143
+ set frame $path
144
+
145
+ set type [Widget::cget $path -type]
146
+
147
+ if {[string equal $type "dialog"]} {
148
+ set top $path
149
+ eval [list toplevel $path] $maps(:cmd) -class Wizard
150
+ wm withdraw $path
151
+ wm protocol $path WM_DELETE_WINDOW [list $path cancel]
152
+ if {[Widget::cget $path -transient]} {
153
+ wm transient $path [Widget::cget $path -parent]
154
+ }
155
+ eval wm resizable $path [Widget::cget $path -resizable]
156
+
157
+ bind $path <Escape> [list $path cancel]
158
+ bind $path <<WizardFinish>> [list destroy $path]
159
+ bind $path <<WizardCancel>> [list destroy $path]
160
+ } else {
161
+ set top [winfo toplevel $path]
162
+ eval [list frame $path] $maps(:cmd) -class Wizard
163
+ }
164
+
165
+ wm title $top [Widget::cget $path -title]
166
+
167
+ PagesManager $path.steps
168
+ pack $path.steps -expand 1 -fill both
169
+
170
+ widgets $path set steps -widget $path.steps
171
+
172
+ if {[Widget::cget $path -separator]} {
173
+ frame $path.separator
174
+ pack $path.separator -fill x
175
+
176
+ label $path.separator.l -text [Widget::cget $path -separatortext]
177
+ pack $path.separator.l -side left
178
+
179
+ Separator $path.separator.s -orient horizontal
180
+ pack $path.separator.s -side left -expand 1 -fill x -pady 2
181
+
182
+ widgets $path set separator -widget $path.separator.s
183
+ widgets $path set separatortext -widget $path.separator.l
184
+ widgets $path set separatorframe -widget $path.separator
185
+ }
186
+
187
+ ButtonBox $path.buttons -spacing 2 -homogeneous 1
188
+ pack $path.buttons -anchor se -padx 10 -pady 5
189
+
190
+ widgets $path set buttons -widget $path.buttons
191
+
192
+ insert $path button end back -text "< Back" -command "$path back" -width 12
193
+ insert $path button end next -text "Next >" -command "$path next"
194
+ if {[Widget::cget $path -finishbutton]} {
195
+ insert $path button end finish -text "Finish" -command "$path finish"
196
+ }
197
+ insert $path button end cancel -text "Cancel" -command "$path cancel"
198
+
199
+ if {[Widget::cget $path -helpbutton]} {
200
+ $path.buttons configure -spacing 10
201
+ insert $path button 0 help -text "Help" -command "$path help"
202
+ $path.buttons configure -spacing 2
203
+ }
204
+
205
+ return [Widget::create Wizard $path]
206
+ }
207
+
208
+
209
+ # ------------------------------------------------------------------------------
210
+ # Command Wizard::configure
211
+ # ------------------------------------------------------------------------------
212
+ proc Wizard::configure { path args } {
213
+ set res [Widget::configure $path $args]
214
+
215
+ if {[Widget::hasChanged $path -title title]} {
216
+ wm title [winfo toplevel $path] $title
217
+ }
218
+
219
+ if {[Widget::hasChanged $path -resizable resize]} {
220
+ eval wm resizable [winfo toplevel $path] $resize
221
+ }
222
+
223
+ return $res
224
+ }
225
+
226
+
227
+ # ------------------------------------------------------------------------------
228
+ # Command Wizard::cget
229
+ # ------------------------------------------------------------------------------
230
+ proc Wizard::cget { path option } {
231
+ return [Widget::cget $path $option]
232
+ }
233
+
234
+
235
+ proc Wizard::itemcget { path item option } {
236
+ Widget::getVariable $path items
237
+ Widget::getVariable $path steps
238
+ Widget::getVariable $path buttons
239
+ Widget::getVariable $path widgets
240
+
241
+ if {![exists $path $item]} {
242
+ ## It's not an item. Just pass the configure to the widget.
243
+ set item [$path widgets get $item]
244
+ return [eval $item configure $args]
245
+ }
246
+
247
+ if {[_is_step $path $item]} {
248
+ ## It's a step
249
+ return [Widget::cget $items($item) $option]
250
+ }
251
+
252
+ if {[_is_branch $path $item]} {
253
+ ## It's a branch
254
+ return [Widget::cget $items($item) $option]
255
+ }
256
+
257
+ if {[info exists buttons($item)]} {
258
+ ## It's a button
259
+ return [$path.buttons itemcget $items($item) $option]
260
+ }
261
+
262
+ return -code error "item \"$item\" does not exist"
263
+ }
264
+
265
+
266
+ proc Wizard::itemconfigure { path item args } {
267
+ Widget::getVariable $path items
268
+ Widget::getVariable $path steps
269
+ Widget::getVariable $path buttons
270
+ Widget::getVariable $path widgets
271
+
272
+ if {![exists $path $item]} {
273
+ ## It's not an item. Just pass the configure to the widget.
274
+ set item [$path widgets get $item]
275
+ return [eval $item configure $args]
276
+ }
277
+
278
+ if {[info exists steps($item)]} {
279
+ ## It's a step.
280
+ set res [Widget::configure $items($item) $args]
281
+
282
+ if {$item == [$path step current]} {
283
+ if {[Widget::hasChanged $items($item) -title title]} {
284
+ wm title [winfo toplevel $path] $title
285
+ }
286
+ }
287
+
288
+ return $res
289
+ }
290
+
291
+ if {[_is_branch $path $item]} {
292
+ ## It's a branch
293
+ return [Widget::configure $items($item) $args]
294
+ }
295
+
296
+ if {[info exists buttons($item)]} {
297
+ ## It's a button.
298
+ return [eval $path.buttons itemconfigure [list $items($item)] $args]
299
+ }
300
+
301
+ return -code error "item \"$item\" does not exist"
302
+ }
303
+
304
+
305
+ proc Wizard::show { path } {
306
+ wm deiconify [winfo toplevel $path]
307
+ }
308
+
309
+
310
+ proc Wizard::invoke { path button } {
311
+ Widget::getVariable $path buttons
312
+ if {![info exists buttons($button)]} {
313
+ return -code error "button \"$button\" does not exist"
314
+ }
315
+ [$path widgets get $button] invoke
316
+ }
317
+
318
+
319
+ proc Wizard::insert { path type idx args } {
320
+ Widget::getVariable $path items
321
+ Widget::getVariable $path widgets
322
+ Widget::getVariable $path branches
323
+
324
+ switch -- $type {
325
+ "button" {
326
+ set node [lindex $args 0]
327
+ }
328
+
329
+ "step" - "branch" {
330
+ set node [lindex $args 1]
331
+ set branch [lindex $args 0]
332
+
333
+ if {![info exists branches($branch)]} {
334
+ return -code error "branch \"$branch\" does not exist"
335
+ }
336
+ }
337
+
338
+ default {
339
+ set types [list button branch step]
340
+ set err [BWidget::badOptionString option $type $types]
341
+ return -code error $err
342
+ }
343
+ }
344
+
345
+ if {[exists $path $node]} {
346
+ return -code error "item \"$node\" already exists"
347
+ }
348
+
349
+ eval _insert_$type $path $idx $args
350
+ }
351
+
352
+
353
+ proc Wizard::back { path } {
354
+ Widget::getVariable $path data
355
+ Widget::getVariable $path items
356
+ set step [$path raise]
357
+ if {![string equal $step ""]} {
358
+ set cmd [Widget::cget $items($step) -backcommand]
359
+ if {![string equal $cmd ""]} {
360
+ set res [uplevel #0 $cmd]
361
+ if {!$res} { return }
362
+ }
363
+ }
364
+
365
+ set data(order) [lreplace $data(order) end end]
366
+ set item [lindex $data(order) end]
367
+
368
+ $path raise $item
369
+
370
+ event generate $path <<WizardStep>>
371
+ event generate $path <<WizardBack>>
372
+
373
+ return $item
374
+ }
375
+
376
+
377
+ proc Wizard::next { path } {
378
+ Widget::getVariable $path data
379
+ Widget::getVariable $path items
380
+
381
+ set step [$path raise]
382
+ if {![string equal $step ""]} {
383
+ set cmd [Widget::cget $items($step) -nextcommand]
384
+ if {![string equal $cmd ""]} {
385
+ set res [uplevel #0 $cmd]
386
+ if {!$res} { return }
387
+ }
388
+ }
389
+
390
+ set item [step $path next]
391
+
392
+ if {[Widget::cget $items($item) -appendorder]} {
393
+ lappend data(order) $item
394
+ }
395
+
396
+ $path raise $item
397
+
398
+ event generate $path <<WizardStep>>
399
+ event generate $path <<WizardNext>>
400
+
401
+ return $item
402
+ }
403
+
404
+
405
+ proc Wizard::cancel { path } {
406
+ Widget::getVariable $path items
407
+ set step [$path raise]
408
+ if {![string equal $step ""]} {
409
+ set cmd [Widget::cget $items($step) -cancelcommand]
410
+ if {![string equal $cmd ""]} {
411
+ set res [uplevel #0 $cmd]
412
+ if {!$res} { return }
413
+ }
414
+ }
415
+
416
+ event generate $path <<WizardCancel>>
417
+ }
418
+
419
+
420
+ proc Wizard::finish { path } {
421
+ Widget::getVariable $path items
422
+ set step [$path raise]
423
+ if {![string equal $step ""]} {
424
+ set cmd [Widget::cget $items($step) -finishcommand]
425
+ if {![string equal $cmd ""]} {
426
+ set res [uplevel #0 $cmd]
427
+ if {!$res} { return }
428
+ }
429
+ }
430
+
431
+ event generate $path <<WizardFinish>>
432
+ }
433
+
434
+
435
+ proc Wizard::help { path } {
436
+ Widget::getVariable $path items
437
+ set step [$path raise]
438
+ if {![string equal $step ""]} {
439
+ set cmd [Widget::cget $items($step) -helpcommand]
440
+ if {![string equal $cmd ""]} {
441
+ uplevel #0 $cmd
442
+ }
443
+ }
444
+
445
+ event generate $path <<WizardHelp>>
446
+ }
447
+
448
+
449
+ proc Wizard::step { path node {start ""} {traverse 1} } {
450
+ Widget::getVariable $path data
451
+ Widget::getVariable $path items
452
+ Widget::getVariable $path branches
453
+
454
+ if {![string equal $start ""]} {
455
+ if {![exists $path $start]} {
456
+ return -code error "item \"$start\" does not exist"
457
+ }
458
+ }
459
+
460
+ switch -- $node {
461
+ "current" {
462
+ set item [$path raise]
463
+ }
464
+
465
+ "end" - "last" {
466
+ ## Keep looping through 'next' until we hit the end.
467
+ set item [$path step next]
468
+ while {![string equal $item ""]} {
469
+ set last $item
470
+ set item [$path step next $item]
471
+ }
472
+ set item $last
473
+ }
474
+
475
+ "back" - "previous" {
476
+ if {[string equal $start ""]} {
477
+ set item [lindex $data(order) end-1]
478
+ } else {
479
+ set idx [lsearch $data(order) $start]
480
+ incr idx -1
481
+ if {$idx < 0} { return }
482
+ set item [lindex $data(order) $idx]
483
+ }
484
+ }
485
+
486
+ "next" {
487
+ set step [$path raise]
488
+ if {![string equal $start ""]} { set step $start }
489
+
490
+ set branch [$path branch $step]
491
+ if {$traverse && [_is_branch $path $step]} {
492
+ ## This step is a branch. Let's figure out where to go next.
493
+ if {[traverse $path $step]} {
494
+ ## It's ok to traverse into this branch.
495
+ ## Set step to null so that we'll end up finding the
496
+ ## first step in the branch.
497
+ set branch $step
498
+ set step ""
499
+ }
500
+ }
501
+
502
+ set idx [lsearch $branches($branch) $step]
503
+ incr idx
504
+
505
+ set item [lindex $branches($branch) $idx]
506
+
507
+ if {$idx >= [llength $branches($branch)]} {
508
+ ## We've reached the end of this branch.
509
+ ## If it's the root branch, or this branch terminates we return.
510
+ if {[string equal $branch "root"]
511
+ || [Widget::cget $items($branch) -action] == "terminate"} {
512
+ return
513
+ }
514
+
515
+ ## We want to merge back with our parent branch.
516
+ set item [step $path next $branch 0]
517
+ }
518
+
519
+ ## If this step is a branch, find the next step after it.
520
+ if {$traverse && [_is_branch $path $item]} {
521
+ set item [$path step next $item]
522
+ }
523
+ }
524
+
525
+ default {
526
+ if {![exists $path $node]} {
527
+ return -code error "item \"$node\" does not exist"
528
+ }
529
+ set item $node
530
+ }
531
+ }
532
+
533
+ return $item
534
+ }
535
+
536
+
537
+ proc Wizard::nodes { path branch {first ""} {last ""} } {
538
+ Widget::getVariable $path data
539
+ Widget::getVariable $path branches
540
+ if {$first == ""} { return $branches($branch) }
541
+ if {$last == ""} { return [lindex $branches($branch) $first] }
542
+ return [lrange $data(steps) $first $last]
543
+ }
544
+
545
+
546
+ proc Wizard::index { path item } {
547
+ Widget::getVariable $path branches
548
+ set branch [$path branch $item]
549
+ return [lsearch $branches($branch) $item]
550
+ }
551
+
552
+
553
+ proc Wizard::raise { path {item ""} } {
554
+ Widget::getVariable $path data
555
+ Widget::getVariable $path items
556
+
557
+ set steps $path.steps
558
+ set buttons $path.buttons
559
+
560
+ if {[string equal $item ""]} { return $data(current) }
561
+
562
+ $path createStep $item
563
+
564
+ ## Eval the global raisecommand if we have one, appending the item.
565
+ set cmd [Widget::cget $path -raisecommand]
566
+ if {![string equal $cmd ""]} {
567
+ uplevel #0 $cmd [list $item]
568
+ }
569
+
570
+ ## Eval this item's raisecommand if we have one.
571
+ set cmd [Widget::cget $items($item) -raisecommand]
572
+ if {![string equal $cmd ""]} {
573
+ uplevel #0 $cmd
574
+ }
575
+
576
+ set title [getoption $path $item -title]
577
+ wm title [winfo toplevel $path] $title
578
+
579
+ if {[Widget::cget $path -separator]} {
580
+ set txt [getoption $path $item -separatortext]
581
+ $path itemconfigure separatortext -text $txt
582
+ }
583
+
584
+ set default [Widget::cget $items($item) -default]
585
+ set button [lsearch $data(buttons) $default]
586
+ $buttons setfocus $button
587
+
588
+ $steps raise $item
589
+
590
+ set data(current) $item
591
+
592
+ set back [$path step back]
593
+ set next [$path step next]
594
+
595
+ if {[Widget::cget $path -autobuttons]} {
596
+ set txt [Widget::cget $items($item) -backtext]
597
+ $path itemconfigure back -text $txt -state normal
598
+ set txt [Widget::cget $items($item) -nexttext]
599
+ $path itemconfigure next -text $txt -state normal
600
+ set txt [Widget::cget $items($item) -canceltext]
601
+ $path itemconfigure cancel -text $txt -state normal
602
+ if {[Widget::cget $path -helpbutton]} {
603
+ set txt [Widget::cget $items($item) -helptext]
604
+ $path itemconfigure help -text $txt
605
+ }
606
+
607
+ if {[Widget::cget $path -finishbutton]} {
608
+ set txt [Widget::cget $items($item) -finishtext]
609
+ $path itemconfigure finish -text $txt -state disabled
610
+ }
611
+
612
+ if {[string equal $back ""]} {
613
+ $path itemconfigure back -state disabled
614
+ }
615
+
616
+ if {[string equal $next ""]} {
617
+ if {[Widget::cget $path -finishbutton]} {
618
+ $path itemconfigure next -state disabled
619
+ $path itemconfigure finish -state normal
620
+ } else {
621
+ set txt [Widget::cget $items($item) -finishtext]
622
+ $path itemconfigure next -text $txt -command [list $path finish]
623
+ }
624
+ $path itemconfigure back -state disabled
625
+ $path itemconfigure cancel -state disabled
626
+ } else {
627
+ set txt [Widget::cget $items($item) -nexttext]
628
+ $path itemconfigure next -text $txt -command [list $path next]
629
+ }
630
+ }
631
+
632
+ event generate $path <<WizardStep>>
633
+
634
+ if {[string equal $next ""]} { event generate $path <<WizardLastStep>> }
635
+ if {[string equal $back ""]} { event generate $path <<WizardFirstStep>> }
636
+
637
+ return $item
638
+ }
639
+
640
+
641
+ proc Wizard::widgets { path command args } {
642
+ Widget::getVariable $path items
643
+ Widget::getVariable $path widgets
644
+ Widget::getVariable $path stepWidgets
645
+
646
+ switch -- $command {
647
+ "set" {
648
+ set node [lindex $args 0]
649
+ if {[string equal $node ""]} {
650
+ set err [BWidget::wrongNumArgsString \
651
+ "$path widgets set <name> ?option ..?"]
652
+ return -code error $err
653
+ }
654
+ set args [lreplace $args 0 0]
655
+ set item $path.#widget#$node
656
+
657
+ Widget::init Wizard::Widget $item $args
658
+ set step [Widget::cget $item -step]
659
+ set widget [Widget::cget $item -widget]
660
+ if {[string equal $step ""]} {
661
+ set widgets($node) $widget
662
+ } else {
663
+ set stepWidgets($step,$node) $widget
664
+ }
665
+ return $widget
666
+ }
667
+
668
+ "get" {
669
+ set node [lindex $args 0]
670
+ if {[string equal $node ""]} {
671
+ return [array names widgets]
672
+ }
673
+ set args [lreplace $args 0 0]
674
+
675
+ array set map [list Wizard::Widget {}]
676
+ array set map [Widget::parseArgs Wizard::Widget $args]
677
+ array set data $map(Wizard::Widget)
678
+
679
+ if {[info exists data(-step)]} {
680
+ set step $data(-step)
681
+ } else {
682
+ set step [$path step current]
683
+ }
684
+
685
+ ## If a widget exists for this step, return it.
686
+ if {[info exists stepWidgets($step,$node)]} {
687
+ return $stepWidgets($step,$node)
688
+ }
689
+
690
+ ## See if a widget exists on the global level.
691
+ if {![info exists widgets($node)]} {
692
+ return -code error "item \"$node\" does not exist"
693
+ }
694
+ return $widgets($node)
695
+ }
696
+
697
+ default {
698
+ set err [BWidget::badOptionString option $command [list get set]]
699
+ return -code error $err
700
+ }
701
+ }
702
+ }
703
+
704
+
705
+ proc Wizard::variable { path step option } {
706
+ set item $path.$step
707
+ return [Widget::varForOption $item $option]
708
+ }
709
+
710
+
711
+ proc Wizard::branch { path {node "current"} } {
712
+ Widget::getVariable $path data
713
+ if {[string equal $node "current"]} { set item [$path step current] }
714
+ if {[string equal $node ""]} { return "root" }
715
+ if {[info exists data($node,branch)]} { return $data($node,branch) }
716
+ return -code error "item \"$node\" does not exist"
717
+ }
718
+
719
+
720
+ proc Wizard::traverse { path node } {
721
+ Widget::getVariable $path items
722
+
723
+ if {$node == "root"} { return 1 }
724
+
725
+ if {![_is_branch $path $node]} {
726
+ return -code error "branch \"$node\" does not exist"
727
+ }
728
+
729
+ set cmd [Widget::cget $items($node) -command]
730
+ if {[string equal $cmd ""]} { return 1 }
731
+ return [uplevel #0 $cmd]
732
+ }
733
+
734
+
735
+ proc Wizard::exists { path item } {
736
+ Widget::getVariable $path items
737
+ return [info exists items($item)]
738
+ }
739
+
740
+
741
+ proc Wizard::createStep { path item {delete 0} } {
742
+ Widget::getVariable $path data
743
+ Widget::getVariable $path items
744
+ Widget::getVariable $path steps
745
+
746
+ if {![_is_step $path $item]} { return }
747
+
748
+ if {$delete} {
749
+ if {[$path.steps exists $item]} {
750
+ $path.steps delete $item
751
+ }
752
+ if {[info exists data($item,realized)]} {
753
+ unset data($item,realized)
754
+ }
755
+ }
756
+
757
+ if {![info exists data($item,realized)]} {
758
+ ## Eval the global createcommand if we have one, appending the item.
759
+ set cmd [Widget::cget $path -createcommand]
760
+ if {![string equal $cmd ""]} {
761
+ uplevel #0 $cmd [list $item]
762
+ }
763
+
764
+ ## Eval this item's createcommand if we have one.
765
+ set cmd [Widget::cget $items($item) -createcommand]
766
+ if {![string equal $cmd ""]} {
767
+ uplevel #0 $cmd
768
+ }
769
+
770
+ set data($item,realized) 1
771
+ }
772
+
773
+ return
774
+ }
775
+
776
+
777
+ proc Wizard::getoption { path item option } {
778
+ Widget::getVariable $path items
779
+ return [Widget::getOption $option "" $path $items($item)]
780
+ }
781
+
782
+
783
+ proc Wizard::reorder { path parent nodes } {
784
+ Widget::getVariable $path branches
785
+ set branches($parent) $nodes
786
+ }
787
+
788
+
789
+ proc Wizard::_insert_button { path idx node args } {
790
+ Widget::getVariable $path data
791
+ Widget::getVariable $path items
792
+ Widget::getVariable $path buttons
793
+ Widget::getVariable $path widgets
794
+
795
+ set buttons($node) 1
796
+ set widgets($node) [eval $path.buttons insert $idx $args]
797
+ set item [string map [list $path.buttons.b {}] $widgets($node)]
798
+ set items($node) $item
799
+ return $widgets($node)
800
+ }
801
+
802
+
803
+ proc Wizard::_insert_step { path idx branch node args } {
804
+ Widget::getVariable $path data
805
+ Widget::getVariable $path steps
806
+ Widget::getVariable $path items
807
+ Widget::getVariable $path widgets
808
+ Widget::getVariable $path branches
809
+
810
+ set steps($node) 1
811
+ lappend data(steps) $node
812
+ set data($node,branch) $branch
813
+ if {$idx == "end"} {
814
+ lappend branches($branch) $node
815
+ } else {
816
+ set branches($branch) [linsert $branches($branch) $idx $node]
817
+ }
818
+
819
+ set items($node) $path.$node
820
+ Widget::init Wizard::Step $items($node) $args
821
+ set widgets($node) [$path.steps add $node]
822
+ if {[Widget::cget $items($node) -create]} { $path createStep $node }
823
+ return $widgets($node)
824
+ }
825
+
826
+
827
+ proc Wizard::_insert_branch { path idx branch node args } {
828
+ Widget::getVariable $path data
829
+ Widget::getVariable $path items
830
+ Widget::getVariable $path branches
831
+
832
+ set branches($node) [list]
833
+ lappend data(branches) $node
834
+ set data($node,branch) $branch
835
+ if {$idx == "end"} {
836
+ lappend branches($branch) $node
837
+ } else {
838
+ set branches($branch) [linsert $branches($branch) $idx $node]
839
+ }
840
+
841
+ set items($node) $path.$node
842
+ Widget::init Wizard::Branch $items($node) $args
843
+ }
844
+
845
+
846
+ proc Wizard::_is_step { path node } {
847
+ Widget::getVariable $path steps
848
+ return [info exists steps($node)]
849
+ }
850
+
851
+
852
+ proc Wizard::_is_branch { path node } {
853
+ Widget::getVariable $path branches
854
+ return [info exists branches($node)]
855
+ }
856
+
857
+
858
+ # ------------------------------------------------------------------------------
859
+ # Command Wizard::_destroy
860
+ # ------------------------------------------------------------------------------
861
+ proc Wizard::_destroy { path } {
862
+ Widget::destroy $path
863
+ }
864
+
865
+
866
+ proc SimpleWizard { path args } {
867
+ option add *WizLayoutSimple*Label.padX 5 interactive
868
+ option add *WizLayoutSimple*Label.anchor nw interactive
869
+ option add *WizLayoutSimple*Label.justify left interactive
870
+ option add *WizLayoutSimple*Label.borderWidth 0 interactive
871
+ option add *WizLayoutSimple*Label.highlightThickness 0 interactive
872
+
873
+ set cmd [list Wizard::layout::simple $path]
874
+ return [eval [list Wizard $path] $args [list -createcommand $cmd]]
875
+ }
876
+
877
+
878
+ proc ClassicWizard { path args } {
879
+ option add *WizLayoutClassic*Label.padX 5 interactive
880
+ option add *WizLayoutClassic*Label.anchor nw interactive
881
+ option add *WizLayoutClassic*Label.justify left interactive
882
+ option add *WizLayoutClassic*Label.borderWidth 0 interactive
883
+ option add *WizLayoutClassic*Label.highlightThickness 0 interactive
884
+
885
+ set cmd [list Wizard::layout::classic $path]
886
+ return [eval [list Wizard $path] $args [list -createcommand $cmd]]
887
+ }
888
+
889
+
890
+ proc Wizard::layout::simple { wizard step } {
891
+ set frame [$wizard widgets get $step]
892
+
893
+ set layout [$wizard widgets set layout -widget $frame.layout -step $step]
894
+
895
+ foreach w [list titleframe pretext posttext clientArea] {
896
+ set $w [$wizard widgets set $w -widget $layout.$w -step $step]
897
+ }
898
+
899
+ foreach w [list title subtitle icon] {
900
+ set $w [$wizard widgets set $w -widget $titleframe.$w -step $step]
901
+ }
902
+
903
+ frame $layout -class WizLayoutSimple
904
+
905
+ pack $layout -expand 1 -fill both
906
+
907
+ # Client area. This is where the caller places its widgets.
908
+ frame $clientArea -bd 8 -relief flat
909
+
910
+ Separator $layout.sep1 -relief groove -orient horizontal
911
+
912
+ # title and subtitle and icon
913
+ frame $titleframe -bd 4 -relief flat -background white
914
+ label $title -background white -textvariable [$wizard variable $step -text1]
915
+ label $subtitle -height 2 -background white -padx 15 -width 40 \
916
+ -textvariable [$wizard variable $step -text2]
917
+
918
+ label $icon -borderwidth 0 -background white -anchor c
919
+ set iconImage [$wizard getoption $step -icon]
920
+ if {![string equal $iconImage ""]} { $icon configure -image $iconImage }
921
+
922
+ set labelfont [font actual [$title cget -font]]
923
+ $title configure -font [concat $labelfont -weight bold]
924
+
925
+ # put the title, subtitle and icon inside the frame we've built for them
926
+ grid $title -in $titleframe -row 0 -column 0 -sticky nsew
927
+ grid $subtitle -in $titleframe -row 1 -column 0 -sticky nsew
928
+ grid $icon -in $titleframe -row 0 -column 1 -rowspan 2 -padx 8
929
+ grid columnconfigure $titleframe 0 -weight 1
930
+ grid columnconfigure $titleframe 1 -weight 0
931
+
932
+ # pre and post text.
933
+ label $pretext -textvariable [$wizard variable $step -text3]
934
+ label $posttext -textvariable [$wizard variable $step -text4]
935
+
936
+ # when our label widgets change size we want to reset the
937
+ # wraplength to that same size.
938
+ foreach widget {title subtitle pretext posttext} {
939
+ bind [set $widget] <Configure> {
940
+ # yeah, I know this looks weird having two after idle's, but
941
+ # it helps prevent the geometry manager getting into a tight
942
+ # loop under certain circumstances
943
+ #
944
+ # note that subtracting 10 is just a somewhat arbitrary number
945
+ # to provide a little padding...
946
+ after idle {after idle {%W configure -wraplength [expr {%w -10}]}}
947
+ }
948
+ }
949
+
950
+ grid $titleframe -row 0 -column 0 -sticky nsew -padx 0
951
+ grid $layout.sep1 -row 1 -sticky ew
952
+ grid $pretext -row 2 -sticky nsew -padx 8 -pady 8
953
+ grid $clientArea -row 3 -sticky nsew -padx 8 -pady 8
954
+ grid $posttext -row 4 -sticky nsew -padx 8 -pady 8
955
+
956
+ grid columnconfigure $layout 0 -weight 1
957
+ grid rowconfigure $layout 0 -weight 0
958
+ grid rowconfigure $layout 1 -weight 0
959
+ grid rowconfigure $layout 2 -weight 0
960
+ grid rowconfigure $layout 3 -weight 1
961
+ grid rowconfigure $layout 4 -weight 0
962
+ }
963
+
964
+ proc Wizard::layout::classic { wizard step } {
965
+ set frame [$wizard widgets get $step]
966
+
967
+ set layout [$wizard widgets set layout -widget $frame.layout -step $step]
968
+ foreach w [list title subtitle icon pretext posttext clientArea] {
969
+ set $w [$wizard widgets set $w -widget $layout.$w -step $step]
970
+ }
971
+
972
+ frame $layout -class WizLayoutClassic
973
+
974
+ pack $layout -expand 1 -fill both
975
+
976
+ # Client area. This is where the caller places its widgets.
977
+ frame $clientArea -bd 8 -relief flat
978
+
979
+ Separator $layout.sep1 -relief groove -orient vertical
980
+
981
+ # title and subtitle
982
+ label $title -textvariable [$wizard variable $step -text1]
983
+ label $subtitle -textvariable [$wizard variable $step -text2] -height 2
984
+
985
+ array set labelfont [font actual [$title cget -font]]
986
+ incr labelfont(-size) 6
987
+ set labelfont(-weight) bold
988
+ $title configure -font [array get labelfont]
989
+
990
+ # pre and post text.
991
+ label $pretext -textvariable [$wizard variable $step -text3]
992
+ label $posttext -textvariable [$wizard variable $step -text4]
993
+
994
+ # when our label widgets change size we want to reset the
995
+ # wraplength to that same size.
996
+ foreach widget {title subtitle pretext posttext} {
997
+ bind [set $widget] <Configure> {
998
+ # yeah, I know this looks weird having two after idle's, but
999
+ # it helps prevent the geometry manager getting into a tight
1000
+ # loop under certain circumstances
1001
+ #
1002
+ # note that subtracting 10 is just a somewhat arbitrary number
1003
+ # to provide a little padding...
1004
+ after idle {after idle {%W configure -wraplength [expr {%w -10}]}}
1005
+ }
1006
+ }
1007
+
1008
+ label $icon -borderwidth 1 -relief sunken -background white \
1009
+ -anchor c -width 96 -image Wizard::none
1010
+ set iconImage [$wizard getoption $step -icon]
1011
+ if {![string equal $iconImage ""]} { $icon configure -image $iconImage }
1012
+
1013
+ grid $icon -row 0 -column 0 -sticky nsew -padx 8 -pady 8 -rowspan 5
1014
+ grid $title -row 0 -column 1 -sticky ew -padx 8 -pady 8
1015
+ grid $subtitle -row 1 -column 1 -sticky ew -padx 8 -pady 8
1016
+ grid $pretext -row 2 -column 1 -sticky ew -padx 8
1017
+ grid $clientArea -row 3 -column 1 -sticky nsew -padx 8
1018
+ grid $posttext -row 4 -column 1 -sticky ew -padx 8 -pady 24
1019
+
1020
+ grid columnconfigure $layout 0 -weight 0
1021
+ grid columnconfigure $layout 1 -weight 1
1022
+
1023
+ grid rowconfigure $layout 0 -weight 0
1024
+ grid rowconfigure $layout 1 -weight 0
1025
+ grid rowconfigure $layout 2 -weight 0
1026
+ grid rowconfigure $layout 3 -weight 1
1027
+ grid rowconfigure $layout 4 -weight 0
1028
+ }