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,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
+ }