arcadia 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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,645 @@
1
+ # ----------------------------------------------------------------------------
2
+ # utils.tcl
3
+ # This file is part of Unifix BWidget Toolkit
4
+ # $Id: utils.tcl,v 1.12 2004/09/24 23:57:13 hobbs Exp $
5
+ # ----------------------------------------------------------------------------
6
+ # Index of commands:
7
+ # - GlobalVar::exists
8
+ # - GlobalVar::setvarvar
9
+ # - GlobalVar::getvarvar
10
+ # - BWidget::assert
11
+ # - BWidget::clonename
12
+ # - BWidget::get3dcolor
13
+ # - BWidget::XLFDfont
14
+ # - BWidget::place
15
+ # - BWidget::grab
16
+ # - BWidget::focus
17
+ # ----------------------------------------------------------------------------
18
+
19
+ namespace eval GlobalVar {
20
+ proc use {} {}
21
+ }
22
+
23
+
24
+ namespace eval BWidget {
25
+ variable _top
26
+ variable _gstack {}
27
+ variable _fstack {}
28
+ proc use {} {}
29
+ }
30
+
31
+
32
+ # ----------------------------------------------------------------------------
33
+ # Command GlobalVar::exists
34
+ # ----------------------------------------------------------------------------
35
+ proc GlobalVar::exists { varName } {
36
+ return [uplevel \#0 [list info exists $varName]]
37
+ }
38
+
39
+
40
+ # ----------------------------------------------------------------------------
41
+ # Command GlobalVar::setvar
42
+ # ----------------------------------------------------------------------------
43
+ proc GlobalVar::setvar { varName value } {
44
+ return [uplevel \#0 [list set $varName $value]]
45
+ }
46
+
47
+
48
+ # ----------------------------------------------------------------------------
49
+ # Command GlobalVar::getvar
50
+ # ----------------------------------------------------------------------------
51
+ proc GlobalVar::getvar { varName } {
52
+ return [uplevel \#0 [list set $varName]]
53
+ }
54
+
55
+
56
+ # ----------------------------------------------------------------------------
57
+ # Command GlobalVar::tracevar
58
+ # ----------------------------------------------------------------------------
59
+ proc GlobalVar::tracevar { cmd varName args } {
60
+ return [uplevel \#0 [list trace $cmd $varName] $args]
61
+ }
62
+
63
+
64
+
65
+ # ----------------------------------------------------------------------------
66
+ # Command BWidget::lreorder
67
+ # ----------------------------------------------------------------------------
68
+ proc BWidget::lreorder { list neworder } {
69
+ set pos 0
70
+ set newlist {}
71
+ foreach e $neworder {
72
+ if { [lsearch -exact $list $e] != -1 } {
73
+ lappend newlist $e
74
+ set tabelt($e) 1
75
+ }
76
+ }
77
+ set len [llength $newlist]
78
+ if { !$len } {
79
+ return $list
80
+ }
81
+ if { $len == [llength $list] } {
82
+ return $newlist
83
+ }
84
+ set pos 0
85
+ foreach e $list {
86
+ if { ![info exists tabelt($e)] } {
87
+ set newlist [linsert $newlist $pos $e]
88
+ }
89
+ incr pos
90
+ }
91
+ return $newlist
92
+ }
93
+
94
+
95
+ # ----------------------------------------------------------------------------
96
+ # Command BWidget::assert
97
+ # ----------------------------------------------------------------------------
98
+ proc BWidget::assert { exp {msg ""}} {
99
+ set res [uplevel 1 expr $exp]
100
+ if { !$res} {
101
+ if { $msg == "" } {
102
+ return -code error "Assertion failed: {$exp}"
103
+ } else {
104
+ return -code error $msg
105
+ }
106
+ }
107
+ }
108
+
109
+
110
+ # ----------------------------------------------------------------------------
111
+ # Command BWidget::clonename
112
+ # ----------------------------------------------------------------------------
113
+ proc BWidget::clonename { menu } {
114
+ set path ""
115
+ set menupath ""
116
+ set found 0
117
+ foreach widget [lrange [split $menu "."] 1 end] {
118
+ if { $found || [winfo class "$path.$widget"] == "Menu" } {
119
+ set found 1
120
+ append menupath "#" $widget
121
+ append path "." $menupath
122
+ } else {
123
+ append menupath "#" $widget
124
+ append path "." $widget
125
+ }
126
+ }
127
+ return $path
128
+ }
129
+
130
+
131
+ # ----------------------------------------------------------------------------
132
+ # Command BWidget::getname
133
+ # ----------------------------------------------------------------------------
134
+ proc BWidget::getname { name } {
135
+ if { [string length $name] } {
136
+ set text [option get . "${name}Name" ""]
137
+ if { [string length $text] } {
138
+ return [parsetext $text]
139
+ }
140
+ }
141
+ return {}
142
+ }
143
+
144
+
145
+ # ----------------------------------------------------------------------------
146
+ # Command BWidget::parsetext
147
+ # ----------------------------------------------------------------------------
148
+ proc BWidget::parsetext { text } {
149
+ set result ""
150
+ set index -1
151
+ set start 0
152
+ while { [string length $text] } {
153
+ set idx [string first "&" $text]
154
+ if { $idx == -1 } {
155
+ append result $text
156
+ set text ""
157
+ } else {
158
+ set char [string index $text [expr {$idx+1}]]
159
+ if { $char == "&" } {
160
+ append result [string range $text 0 $idx]
161
+ set text [string range $text [expr {$idx+2}] end]
162
+ set start [expr {$start+$idx+1}]
163
+ } else {
164
+ append result [string range $text 0 [expr {$idx-1}]]
165
+ set text [string range $text [expr {$idx+1}] end]
166
+ incr start $idx
167
+ set index $start
168
+ }
169
+ }
170
+ }
171
+ return [list $result $index]
172
+ }
173
+
174
+
175
+ # ----------------------------------------------------------------------------
176
+ # Command BWidget::get3dcolor
177
+ # ----------------------------------------------------------------------------
178
+ proc BWidget::get3dcolor { path bgcolor } {
179
+ foreach val [winfo rgb $path $bgcolor] {
180
+ lappend dark [expr {60*$val/100}]
181
+ set tmp1 [expr {14*$val/10}]
182
+ if { $tmp1 > 65535 } {
183
+ set tmp1 65535
184
+ }
185
+ set tmp2 [expr {(65535+$val)/2}]
186
+ lappend light [expr {($tmp1 > $tmp2) ? $tmp1:$tmp2}]
187
+ }
188
+ return [list [eval format "#%04x%04x%04x" $dark] [eval format "#%04x%04x%04x" $light]]
189
+ }
190
+
191
+
192
+ # ----------------------------------------------------------------------------
193
+ # Command BWidget::XLFDfont
194
+ # ----------------------------------------------------------------------------
195
+ proc BWidget::XLFDfont { cmd args } {
196
+ switch -- $cmd {
197
+ create {
198
+ set font "-*-*-*-*-*-*-*-*-*-*-*-*-*-*"
199
+ }
200
+ configure {
201
+ set font [lindex $args 0]
202
+ set args [lrange $args 1 end]
203
+ }
204
+ default {
205
+ return -code error "XLFDfont: commande incorrect: $cmd"
206
+ }
207
+ }
208
+ set lfont [split $font "-"]
209
+ if { [llength $lfont] != 15 } {
210
+ return -code error "XLFDfont: description XLFD incorrect: $font"
211
+ }
212
+
213
+ foreach {option value} $args {
214
+ switch -- $option {
215
+ -foundry { set index 1 }
216
+ -family { set index 2 }
217
+ -weight { set index 3 }
218
+ -slant { set index 4 }
219
+ -size { set index 7 }
220
+ default { return -code error "XLFDfont: option incorrecte: $option" }
221
+ }
222
+ set lfont [lreplace $lfont $index $index $value]
223
+ }
224
+ return [join $lfont "-"]
225
+ }
226
+
227
+
228
+
229
+ # ----------------------------------------------------------------------------
230
+ # Command BWidget::place
231
+ # ----------------------------------------------------------------------------
232
+ #
233
+ # Notes:
234
+ # For Windows systems with more than one monitor the available screen area may
235
+ # have negative positions. Geometry settings with negative numbers are used
236
+ # under X to place wrt the right or bottom of the screen. On windows, Tk
237
+ # continues to do this. However, a geometry such as 100x100+-200-100 can be
238
+ # used to place a window onto a secondary monitor. Passing the + gets Tk
239
+ # to pass the remainder unchanged so the Windows manager then handles -200
240
+ # which is a position on the left hand monitor.
241
+ # I've tested this for left, right, above and below the primary monitor.
242
+ # Currently there is no way to ask Tk the extent of the Windows desktop in
243
+ # a multi monitor system. Nor what the legal co-ordinate range might be.
244
+ #
245
+ proc BWidget::place { path w h args } {
246
+ variable _top
247
+
248
+ update idletasks
249
+ set reqw [winfo reqwidth $path]
250
+ set reqh [winfo reqheight $path]
251
+ if { $w == 0 } {set w $reqw}
252
+ if { $h == 0 } {set h $reqh}
253
+
254
+ set arglen [llength $args]
255
+ if { $arglen > 3 } {
256
+ return -code error "BWidget::place: bad number of argument"
257
+ }
258
+
259
+ if { $arglen > 0 } {
260
+ set where [lindex $args 0]
261
+ set list [list "at" "center" "left" "right" "above" "below"]
262
+ set idx [lsearch $list $where]
263
+ if { $idx == -1 } {
264
+ return -code error [BWidget::badOptionString position $where $list]
265
+ }
266
+ if { $idx == 0 } {
267
+ set err [catch {
268
+ # purposely removed the {} around these expressions - [PT]
269
+ set x [expr int([lindex $args 1])]
270
+ set y [expr int([lindex $args 2])]
271
+ }]
272
+ if { $err } {
273
+ return -code error "BWidget::place: incorrect position"
274
+ }
275
+ if {$::tcl_platform(platform) == "windows"} {
276
+ # handle windows multi-screen. -100 != +-100
277
+ if {[string index [lindex $args 1] 0] != "-"} {
278
+ set x "+$x"
279
+ }
280
+ if {[string index [lindex $args 2] 0] != "-"} {
281
+ set y "+$y"
282
+ }
283
+ } else {
284
+ if { $x >= 0 } {
285
+ set x "+$x"
286
+ }
287
+ if { $y >= 0 } {
288
+ set y "+$y"
289
+ }
290
+ }
291
+ } else {
292
+ if { $arglen == 2 } {
293
+ set widget [lindex $args 1]
294
+ if { ![winfo exists $widget] } {
295
+ return -code error "BWidget::place: \"$widget\" does not exist"
296
+ }
297
+ } else {
298
+ set widget .
299
+ }
300
+ set sw [winfo screenwidth $path]
301
+ set sh [winfo screenheight $path]
302
+ if { $idx == 1 } {
303
+ if { $arglen == 2 } {
304
+ # center to widget
305
+ set x0 [expr {[winfo rootx $widget] + ([winfo width $widget] - $w)/2}]
306
+ set y0 [expr {[winfo rooty $widget] + ([winfo height $widget] - $h)/2}]
307
+ } else {
308
+ # center to screen
309
+ set x0 [expr {([winfo screenwidth $path] - $w)/2 - [winfo vrootx $path]}]
310
+ set y0 [expr {([winfo screenheight $path] - $h)/2 - [winfo vrooty $path]}]
311
+ }
312
+ set x "+$x0"
313
+ set y "+$y0"
314
+ if {$::tcl_platform(platform) != "windows"} {
315
+ if { $x0+$w > $sw } {set x "-0"; set x0 [expr {$sw-$w}]}
316
+ if { $x0 < 0 } {set x "+0"}
317
+ if { $y0+$h > $sh } {set y "-0"; set y0 [expr {$sh-$h}]}
318
+ if { $y0 < 0 } {set y "+0"}
319
+ }
320
+ } else {
321
+ set x0 [winfo rootx $widget]
322
+ set y0 [winfo rooty $widget]
323
+ set x1 [expr {$x0 + [winfo width $widget]}]
324
+ set y1 [expr {$y0 + [winfo height $widget]}]
325
+ if { $idx == 2 || $idx == 3 } {
326
+ set y "+$y0"
327
+ if {$::tcl_platform(platform) != "windows"} {
328
+ if { $y0+$h > $sh } {set y "-0"; set y0 [expr {$sh-$h}]}
329
+ if { $y0 < 0 } {set y "+0"}
330
+ }
331
+ if { $idx == 2 } {
332
+ # try left, then right if out, then 0 if out
333
+ if { $x0 >= $w } {
334
+ set x [expr {$x0-$sw}]
335
+ } elseif { $x1+$w <= $sw } {
336
+ set x "+$x1"
337
+ } else {
338
+ set x "+0"
339
+ }
340
+ } else {
341
+ # try right, then left if out, then 0 if out
342
+ if { $x1+$w <= $sw } {
343
+ set x "+$x1"
344
+ } elseif { $x0 >= $w } {
345
+ set x [expr {$x0-$sw}]
346
+ } else {
347
+ set x "-0"
348
+ }
349
+ }
350
+ } else {
351
+ set x "+$x0"
352
+ if {$::tcl_platform(platform) != "windows"} {
353
+ if { $x0+$w > $sw } {set x "-0"; set x0 [expr {$sw-$w}]}
354
+ if { $x0 < 0 } {set x "+0"}
355
+ }
356
+ if { $idx == 4 } {
357
+ # try top, then bottom, then 0
358
+ if { $h <= $y0 } {
359
+ set y [expr {$y0-$sh}]
360
+ } elseif { $y1+$h <= $sh } {
361
+ set y "+$y1"
362
+ } else {
363
+ set y "+0"
364
+ }
365
+ } else {
366
+ # try bottom, then top, then 0
367
+ if { $y1+$h <= $sh } {
368
+ set y "+$y1"
369
+ } elseif { $h <= $y0 } {
370
+ set y [expr {$y0-$sh}]
371
+ } else {
372
+ set y "-0"
373
+ }
374
+ }
375
+ }
376
+ }
377
+ }
378
+
379
+ ## If there's not a + or - in front of the number, we need to add one.
380
+ if {[string is integer [string index $x 0]]} { set x +$x }
381
+ if {[string is integer [string index $y 0]]} { set y +$y }
382
+
383
+ wm geometry $path "${w}x${h}${x}${y}"
384
+ } else {
385
+ wm geometry $path "${w}x${h}"
386
+ }
387
+ update idletasks
388
+ }
389
+
390
+
391
+ # ----------------------------------------------------------------------------
392
+ # Command BWidget::grab
393
+ # ----------------------------------------------------------------------------
394
+ proc BWidget::grab { option path } {
395
+ variable _gstack
396
+
397
+ if { $option == "release" } {
398
+ catch {::grab release $path}
399
+ while { [llength $_gstack] } {
400
+ set grinfo [lindex $_gstack end]
401
+ set _gstack [lreplace $_gstack end end]
402
+ foreach {oldg mode} $grinfo {
403
+ if { ![string equal $oldg $path] && [winfo exists $oldg] } {
404
+ if { $mode == "global" } {
405
+ catch {::grab -global $oldg}
406
+ } else {
407
+ catch {::grab $oldg}
408
+ }
409
+ return
410
+ }
411
+ }
412
+ }
413
+ } else {
414
+ set oldg [::grab current]
415
+ if { $oldg != "" } {
416
+ lappend _gstack [list $oldg [::grab status $oldg]]
417
+ }
418
+ if { $option == "global" } {
419
+ ::grab -global $path
420
+ } else {
421
+ ::grab $path
422
+ }
423
+ }
424
+ }
425
+
426
+
427
+ # ----------------------------------------------------------------------------
428
+ # Command BWidget::focus
429
+ # ----------------------------------------------------------------------------
430
+ proc BWidget::focus { option path {refocus 1} } {
431
+ variable _fstack
432
+
433
+ if { $option == "release" } {
434
+ while { [llength $_fstack] } {
435
+ set oldf [lindex $_fstack end]
436
+ set _fstack [lreplace $_fstack end end]
437
+ if { ![string equal $oldf $path] && [winfo exists $oldf] } {
438
+ if {$refocus} {catch {::focus -force $oldf}}
439
+ return
440
+ }
441
+ }
442
+ } elseif { $option == "set" } {
443
+ lappend _fstack [::focus]
444
+ ::focus -force $path
445
+ }
446
+ }
447
+
448
+ # BWidget::refocus --
449
+ #
450
+ # Helper function used to redirect focus from a container frame in
451
+ # a megawidget to a component widget. Only redirects focus if
452
+ # focus is already on the container.
453
+ #
454
+ # Arguments:
455
+ # container container widget to redirect from.
456
+ # component component widget to redirect to.
457
+ #
458
+ # Results:
459
+ # None.
460
+
461
+ proc BWidget::refocus {container component} {
462
+ if { [string equal $container [::focus]] } {
463
+ ::focus $component
464
+ }
465
+ return
466
+ }
467
+
468
+ ## These mirror tk::(Set|Restore)FocusGrab
469
+
470
+ # BWidget::SetFocusGrab --
471
+ # swap out current focus and grab temporarily (for dialogs)
472
+ # Arguments:
473
+ # grab new window to grab
474
+ # focus window to give focus to
475
+ # Results:
476
+ # Returns nothing
477
+ #
478
+ proc BWidget::SetFocusGrab {grab {focus {}}} {
479
+ variable _focusGrab
480
+ set index "$grab,$focus"
481
+
482
+ lappend _focusGrab($index) [::focus]
483
+ set oldGrab [::grab current $grab]
484
+ lappend _focusGrab($index) $oldGrab
485
+ if {[winfo exists $oldGrab]} {
486
+ lappend _focusGrab($index) [::grab status $oldGrab]
487
+ }
488
+ # The "grab" command will fail if another application
489
+ # already holds the grab. So catch it.
490
+ catch {::grab $grab}
491
+ if {[winfo exists $focus]} {
492
+ ::focus $focus
493
+ }
494
+ }
495
+
496
+ # BWidget::RestoreFocusGrab --
497
+ # restore old focus and grab (for dialogs)
498
+ # Arguments:
499
+ # grab window that had taken grab
500
+ # focus window that had taken focus
501
+ # destroy destroy|withdraw - how to handle the old grabbed window
502
+ # Results:
503
+ # Returns nothing
504
+ #
505
+ proc BWidget::RestoreFocusGrab {grab focus {destroy destroy}} {
506
+ variable _focusGrab
507
+ set index "$grab,$focus"
508
+ if {[info exists _focusGrab($index)]} {
509
+ foreach {oldFocus oldGrab oldStatus} $_focusGrab($index) break
510
+ unset _focusGrab($index)
511
+ } else {
512
+ set oldGrab ""
513
+ }
514
+
515
+ catch {::focus $oldFocus}
516
+ ::grab release $grab
517
+ if {[string equal $destroy "withdraw"]} {
518
+ wm withdraw $grab
519
+ } else {
520
+ ::destroy $grab
521
+ }
522
+ if {[winfo exists $oldGrab] && [winfo ismapped $oldGrab]} {
523
+ if {[string equal $oldStatus "global"]} {
524
+ ::grab -global $oldGrab
525
+ } else {
526
+ ::grab $oldGrab
527
+ }
528
+ }
529
+ }
530
+
531
+ # BWidget::badOptionString --
532
+ #
533
+ # Helper function to return a proper error string when an option
534
+ # doesn't match a list of given options.
535
+ #
536
+ # Arguments:
537
+ # type A string that represents the type of option.
538
+ # value The value that is in-valid.
539
+ # list A list of valid options.
540
+ #
541
+ # Results:
542
+ # None.
543
+ proc BWidget::badOptionString {type value list} {
544
+ set last [lindex $list end]
545
+ set list [lreplace $list end end]
546
+ return "bad $type \"$value\": must be [join $list ", "], or $last"
547
+ }
548
+
549
+
550
+ proc BWidget::wrongNumArgsString { string } {
551
+ return "wrong # args: should be \"$string\""
552
+ }
553
+
554
+
555
+ proc BWidget::read_file { file } {
556
+ set fp [open $file]
557
+ set x [read $fp [file size $file]]
558
+ close $fp
559
+ return $x
560
+ }
561
+
562
+
563
+ proc BWidget::classes { class } {
564
+ variable use
565
+
566
+ ${class}::use
567
+ set classes [list $class]
568
+ if {![info exists use($class)]} { return }
569
+ foreach class $use($class) {
570
+ eval lappend classes [classes $class]
571
+ }
572
+ return [lsort -unique $classes]
573
+ }
574
+
575
+
576
+ proc BWidget::library { args } {
577
+ variable use
578
+
579
+ set libs [list widget init utils]
580
+ set classes [list]
581
+ foreach class $args {
582
+ ${class}::use
583
+ eval lappend classes [classes $class]
584
+ }
585
+
586
+ eval lappend libs [lsort -unique $classes]
587
+
588
+ set library ""
589
+ foreach lib $libs {
590
+ if {![info exists use($lib,file)]} {
591
+ set file [file join $::BWIDGET::LIBRARY $lib.tcl]
592
+ } else {
593
+ set file [file join $::BWIDGET::LIBRARY $use($lib,file).tcl]
594
+ }
595
+ append library [read_file $file]
596
+ }
597
+
598
+ return $library
599
+ }
600
+
601
+
602
+ proc BWidget::inuse { class } {
603
+ variable ::Widget::_inuse
604
+
605
+ if {![info exists _inuse($class)]} { return 0 }
606
+ return [expr $_inuse($class) > 0]
607
+ }
608
+
609
+
610
+ proc BWidget::write { filename {mode w} } {
611
+ variable use
612
+
613
+ if {![info exists use(classes)]} { return }
614
+
615
+ set classes [list]
616
+ foreach class $use(classes) {
617
+ if {![inuse $class]} { continue }
618
+ lappend classes $class
619
+ }
620
+
621
+ set fp [open $filename $mode]
622
+ puts $fp [eval library $classes]
623
+ close $fp
624
+
625
+ return
626
+ }
627
+
628
+
629
+ # BWidget::bindMouseWheel --
630
+ #
631
+ # Bind mouse wheel actions to a given widget.
632
+ #
633
+ # Arguments:
634
+ # widget - The widget to bind.
635
+ #
636
+ # Results:
637
+ # None.
638
+ proc BWidget::bindMouseWheel { widget } {
639
+ bind $widget <MouseWheel> {%W yview scroll [expr {-%D/24}] units}
640
+ bind $widget <Shift-MouseWheel> {%W yview scroll [expr {-%D/120}] pages}
641
+ bind $widget <Control-MouseWheel> {%W yview scroll [expr {-%D/120}] units}
642
+
643
+ bind $widget <Button-4> {event generate %W <MouseWheel> -delta 120}
644
+ bind $widget <Button-5> {event generate %W <MouseWheel> -delta -120}
645
+ }