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,493 @@
1
+ namespace eval SelectColor {
2
+ Widget::define SelectColor color Dialog
3
+
4
+ Widget::declare SelectColor {
5
+ {-title String "Select a color" 0}
6
+ {-parent String "" 0}
7
+ {-color TkResource "" 0 {label -background}}
8
+ {-type Enum "dialog" 1 {dialog popup}}
9
+ {-placement String "center" 1}
10
+ }
11
+
12
+ variable _baseColors {
13
+ \#0000ff \#00ff00 \#00ffff \#ff0000 \#ff00ff \#ffff00
14
+ \#000099 \#009900 \#009999 \#990000 \#990099 \#999900
15
+ \#000000 \#333333 \#666666 \#999999 \#cccccc \#ffffff
16
+ }
17
+
18
+ variable _userColors {
19
+ \#ffffff \#ffffff \#ffffff \#ffffff \#ffffff \#ffffff
20
+ \#ffffff \#ffffff \#ffffff \#ffffff \#ffffff
21
+ }
22
+
23
+ if {[string equal $::tcl_platform(platform) "unix"]} {
24
+ set useTkDialogue 0
25
+ } else {
26
+ set useTkDialogue 1
27
+ }
28
+
29
+ variable _selectype
30
+ variable _selection
31
+ variable _wcolor
32
+ variable _image
33
+ variable _hsv
34
+ }
35
+
36
+ proc SelectColor::create { path args } {
37
+ Widget::init SelectColor $path $args
38
+
39
+ set type [Widget::cget $path -type]
40
+
41
+ switch -- [Widget::cget $path -type] {
42
+ "dialog" {
43
+ return [eval [list SelectColor::dialog $path] $args]
44
+ }
45
+
46
+ "popup" {
47
+ set list [list at center left right above below]
48
+ set placement [Widget::cget $path -placement]
49
+ set where [lindex $placement 0]
50
+
51
+ if {[lsearch $list $where] < 0} {
52
+ return -code error \
53
+ [BWidget::badOptionString placement $placement $list]
54
+ }
55
+
56
+ ## If they specified a parent and didn't pass a second argument
57
+ ## in the placement, set the placement relative to the parent.
58
+ set parent [Widget::cget $path -parent]
59
+ if {[string length $parent]} {
60
+ if {[llength $placement] == 1} { lappend placement $parent }
61
+ }
62
+ return [eval [list SelectColor::menu $path $placement] $args]
63
+ }
64
+ }
65
+ }
66
+
67
+ proc SelectColor::menu {path placement args} {
68
+ variable _baseColors
69
+ variable _userColors
70
+ variable _wcolor
71
+ variable _selectype
72
+ variable _selection
73
+
74
+ Widget::init SelectColor $path $args
75
+ set top [toplevel $path]
76
+ set parent [winfo toplevel [winfo parent $top]]
77
+ wm withdraw $top
78
+ wm transient $top $parent
79
+ wm overrideredirect $top 1
80
+ catch { wm attributes $top -topmost 1 }
81
+
82
+ set frame [frame $top.frame \
83
+ -highlightthickness 0 \
84
+ -relief raised -borderwidth 2]
85
+ set col 0
86
+ set row 0
87
+ set count 0
88
+ set colors [concat $_baseColors $_userColors]
89
+ foreach color $colors {
90
+ set f [frame $frame.c$count \
91
+ -highlightthickness 2 \
92
+ -highlightcolor white \
93
+ -relief solid -borderwidth 1 \
94
+ -width 16 -height 16 -background $color]
95
+ bind $f <1> "set SelectColor::_selection $count; break"
96
+ bind $f <Enter> {focus %W}
97
+ grid $f -column $col -row $row
98
+ incr count
99
+ if {[incr col] == 6 } {
100
+ set col 0
101
+ incr row
102
+ }
103
+ }
104
+ set f [label $frame.c$count \
105
+ -highlightthickness 2 \
106
+ -highlightcolor white \
107
+ -relief flat -borderwidth 0 \
108
+ -width 16 -height 16 -image [Bitmap::get palette]]
109
+ grid $f -column $col -row $row
110
+ bind $f <1> "set SelectColor::_selection $count; break"
111
+ bind $f <Enter> {focus %W}
112
+ pack $frame
113
+
114
+ bind $top <1> {set SelectColor::_selection -1}
115
+ bind $top <Escape> {set SelectColor::_selection -2}
116
+ bind $top <FocusOut> [subst {if {"%W" == "$top"} \
117
+ {set SelectColor::_selection -2}}]
118
+ eval [list BWidget::place $top 0 0] $placement
119
+
120
+ wm deiconify $top
121
+ raise $top
122
+ if {$::tcl_platform(platform) == "unix"} {
123
+ tkwait visibility $top
124
+ update
125
+ }
126
+ BWidget::SetFocusGrab $top $frame.c0
127
+
128
+ vwait SelectColor::_selection
129
+ BWidget::RestoreFocusGrab $top $frame.c0 destroy
130
+ Widget::destroy $top
131
+ if {$_selection == $count} {
132
+ array set opts {
133
+ -parent -parent
134
+ -title -title
135
+ -color -initialcolor
136
+ }
137
+ if {[Widget::theme]} {
138
+ set native 1
139
+ set nativecmd [list tk_chooseColor -parent $parent]
140
+ foreach {key val} $args {
141
+ if {![info exists opts($key)]} {
142
+ set native 0
143
+ break
144
+ }
145
+ lappend nativecmd $opts($key) $val
146
+ }
147
+ if {$native} {
148
+ return [eval $nativecmd]
149
+ }
150
+ }
151
+ return [eval [list dialog $path] $args]
152
+ } else {
153
+ return [lindex $colors $_selection]
154
+ }
155
+ }
156
+
157
+
158
+ proc SelectColor::dialog {path args} {
159
+ variable _baseColors
160
+ variable _userColors
161
+ variable _widget
162
+ variable _selection
163
+ variable _image
164
+ variable _hsv
165
+
166
+ Widget::init SelectColor $path:SelectColor $args
167
+ set top [Dialog::create $path \
168
+ -title [Widget::cget $path:SelectColor -title] \
169
+ -parent [Widget::cget $path:SelectColor -parent] \
170
+ -separator 1 -default 0 -cancel 1 -anchor e]
171
+ wm resizable $top 0 0
172
+ set dlgf [$top getframe]
173
+ set fg [frame $dlgf.fg]
174
+ set desc [list \
175
+ base _baseColors "Base colors" \
176
+ user _userColors "User colors"]
177
+ set count 0
178
+ foreach {type varcol defTitle} $desc {
179
+ set col 0
180
+ set lin 0
181
+ set title [lindex [BWidget::getname "${type}Colors"] 0]
182
+ if {![string length $title]} {
183
+ set title $defTitle
184
+ }
185
+ set titf [TitleFrame $fg.$type -text $title]
186
+ set subf [$titf getframe]
187
+ foreach color [set $varcol] {
188
+ set fround [frame $fg.round$count \
189
+ -highlightthickness 1 \
190
+ -relief sunken -borderwidth 2]
191
+ set fcolor [frame $fg.color$count -width 16 -height 12 \
192
+ -highlightthickness 0 \
193
+ -relief flat -borderwidth 0 \
194
+ -background $color]
195
+ pack $fcolor -in $fround
196
+ grid $fround -in $subf -row $lin -column $col -padx 1 -pady 1
197
+
198
+ bind $fround <ButtonPress-1> [list SelectColor::_select_rgb $count]
199
+ bind $fcolor <ButtonPress-1> [list SelectColor::_select_rgb $count]
200
+
201
+ bind $fround <Double-1> \
202
+ "SelectColor::_select_rgb [list $count]; [list $top] invoke 0"
203
+ bind $fcolor <Double-1> \
204
+ "SelectColor::_select_rgb [list $count]; [list $top] invoke 0"
205
+
206
+ incr count
207
+ if {[incr col] == 6} {
208
+ incr lin
209
+ set col 0
210
+ }
211
+ }
212
+ pack $titf -anchor w -pady 2
213
+ }
214
+ set fround [frame $fg.round \
215
+ -highlightthickness 0 \
216
+ -relief sunken -borderwidth 2]
217
+ set fcolor [frame $fg.color \
218
+ -width 50 \
219
+ -highlightthickness 0 \
220
+ -relief flat -borderwidth 0]
221
+ pack $fcolor -in $fround -fill y -expand yes
222
+ pack $fround -anchor e -pady 2 -fill y -expand yes
223
+
224
+ set fd [frame $dlgf.fd]
225
+ set f1 [frame $fd.f1 -relief sunken -borderwidth 2]
226
+ set f2 [frame $fd.f2 -relief sunken -borderwidth 2]
227
+ set c1 [canvas $f1.c -width 200 -height 200 -bd 0 -highlightthickness 0]
228
+ set c2 [canvas $f2.c -width 15 -height 200 -bd 0 -highlightthickness 0]
229
+
230
+ for {set val 0} {$val < 40} {incr val} {
231
+ $c2 create rectangle 0 [expr {5*$val}] 15 [expr {5*$val+5}] -tags val[expr {39-$val}]
232
+ }
233
+ $c2 create polygon 0 0 10 5 0 10 -fill black -outline white -tags target
234
+
235
+ pack $c1 $c2
236
+ pack $f1 $f2 -side left -padx 10 -anchor n
237
+
238
+ pack $fg $fd -side left -anchor n -fill y
239
+
240
+ bind $c1 <ButtonPress-1> [list SelectColor::_select_hue_sat %x %y]
241
+ bind $c1 <B1-Motion> [list SelectColor::_select_hue_sat %x %y]
242
+
243
+ bind $c2 <ButtonPress-1> [list SelectColor::_select_value %x %y]
244
+ bind $c2 <B1-Motion> [list SelectColor::_select_value %x %y]
245
+
246
+ if {![info exists _image] || [catch {image type $_image}]} {
247
+ set _image [image create photo -width 200 -height 200]
248
+ for {set x 0} {$x < 200} {incr x 4} {
249
+ for {set y 0} {$y < 200} {incr y 4} {
250
+ $_image put \
251
+ [eval [list format "\#%04x%04x%04x"] \
252
+ [hsvToRgb [expr {$x/196.0}] [expr {(196-$y)/196.0}] 0.85]] \
253
+ -to $x $y [expr {$x+4}] [expr {$y+4}]
254
+ }
255
+ }
256
+ }
257
+ $c1 create image 0 0 -anchor nw -image $_image
258
+ $c1 create bitmap 0 0 \
259
+ -bitmap @[file join $::BWIDGET::LIBRARY "images" "target.xbm"] \
260
+ -anchor nw -tags target
261
+
262
+ set _selection -1
263
+ set _widget(fcolor) $fg
264
+ set _widget(chs) $c1
265
+ set _widget(cv) $c2
266
+ set rgb [winfo rgb $path [Widget::cget $path:SelectColor -color]]
267
+ set _hsv [eval rgbToHsv $rgb]
268
+ _set_rgb [eval [list format "\#%04x%04x%04x"] $rgb]
269
+ _set_hue_sat [lindex $_hsv 0] [lindex $_hsv 1]
270
+ _set_value [lindex $_hsv 2]
271
+
272
+ $top add -name ok
273
+ $top add -name cancel
274
+ set res [$top draw]
275
+ if {$res == 0} {
276
+ set color [$fg.color cget -background]
277
+ } else {
278
+ set color ""
279
+ }
280
+ destroy $top
281
+ return $color
282
+ }
283
+
284
+ proc SelectColor::setcolor { idx color } {
285
+ variable _userColors
286
+ set _userColors [lreplace $_userColors $idx $idx $color]
287
+ }
288
+
289
+ proc SelectColor::_select_rgb {count} {
290
+ variable _baseColors
291
+ variable _userColors
292
+ variable _selection
293
+ variable _widget
294
+ variable _hsv
295
+
296
+ set frame $_widget(fcolor)
297
+ if {$_selection >= 0} {
298
+ $frame.round$_selection configure \
299
+ -relief sunken -highlightthickness 1 -borderwidth 2
300
+ }
301
+ $frame.round$count configure \
302
+ -relief flat -highlightthickness 2 -borderwidth 1
303
+ focus $frame.round$count
304
+ set _selection $count
305
+ set bg [$frame.color$count cget -background]
306
+ set user [expr {$_selection-[llength $_baseColors]}]
307
+ if {$user >= 0 &&
308
+ [string equal \
309
+ [winfo rgb $frame.color$_selection $bg] \
310
+ [winfo rgb $frame.color$_selection white]]} {
311
+ set bg [$frame.color cget -bg]
312
+ $frame.color$_selection configure -background $bg
313
+ set _userColors [lreplace $_userColors $user $user $bg]
314
+ } else {
315
+ set _hsv [eval rgbToHsv [winfo rgb $frame.color$count $bg]]
316
+ _set_hue_sat [lindex $_hsv 0] [lindex $_hsv 1]
317
+ _set_value [lindex $_hsv 2]
318
+ $frame.color configure -background $bg
319
+ }
320
+ }
321
+
322
+
323
+ proc SelectColor::_set_rgb {rgb} {
324
+ variable _selection
325
+ variable _baseColors
326
+ variable _userColors
327
+ variable _widget
328
+
329
+ set frame $_widget(fcolor)
330
+ $frame.color configure -background $rgb
331
+ set user [expr {$_selection-[llength $_baseColors]}]
332
+ if {$user >= 0} {
333
+ $frame.color$_selection configure -background $rgb
334
+ set _userColors [lreplace $_userColors $user $user $rgb]
335
+ }
336
+ }
337
+
338
+
339
+ proc SelectColor::_select_hue_sat {x y} {
340
+ variable _widget
341
+ variable _hsv
342
+
343
+ if {$x < 0} {
344
+ set x 0
345
+ } elseif {$x > 200} {
346
+ set x 200
347
+ }
348
+ if {$y < 0 } {
349
+ set y 0
350
+ } elseif {$y > 200} {
351
+ set y 200
352
+ }
353
+ set hue [expr {$x/200.0}]
354
+ set sat [expr {(200-$y)/200.0}]
355
+ set _hsv [lreplace $_hsv 0 1 $hue $sat]
356
+ $_widget(chs) coords target [expr {$x-9}] [expr {$y-9}]
357
+ _draw_values $hue $sat
358
+ _set_rgb [eval [list format "\#%04x%04x%04x"] [eval [list hsvToRgb] $_hsv]]
359
+ }
360
+
361
+
362
+ proc SelectColor::_set_hue_sat {hue sat} {
363
+ variable _widget
364
+
365
+ set x [expr {$hue*200-9}]
366
+ set y [expr {(1-$sat)*200-9}]
367
+ $_widget(chs) coords target $x $y
368
+ _draw_values $hue $sat
369
+ }
370
+
371
+
372
+
373
+ proc SelectColor::_select_value {x y} {
374
+ variable _widget
375
+ variable _hsv
376
+
377
+ if {$y < 0} {
378
+ set y 0
379
+ } elseif {$y > 200} {
380
+ set y 200
381
+ }
382
+ $_widget(cv) coords target 0 [expr {$y-5}] 10 $y 0 [expr {$y+5}]
383
+ set _hsv [lreplace $_hsv 2 2 [expr {(200-$y)/200.0}]]
384
+ _set_rgb [eval [list format "\#%04x%04x%04x"] [eval [list hsvToRgb] $_hsv]]
385
+ }
386
+
387
+
388
+ proc SelectColor::_draw_values {hue sat} {
389
+ variable _widget
390
+
391
+ for {set val 0} {$val < 40} {incr val} {
392
+ set l [hsvToRgb $hue $sat [expr {$val/39.0}]]
393
+ set col [eval [list format "\#%04x%04x%04x"] $l]
394
+ $_widget(cv) itemconfigure val$val -fill $col -outline $col
395
+ }
396
+ }
397
+
398
+
399
+ proc SelectColor::_set_value {value} {
400
+ variable _widget
401
+
402
+ set y [expr {int((1-$value)*200)}]
403
+ $_widget(cv) coords target 0 [expr {$y-5}] 10 $y 0 [expr {$y+5}]
404
+ }
405
+
406
+
407
+ # --
408
+ # Taken from tk8.0/demos/tcolor.tcl
409
+ # --
410
+ # The procedure below converts an HSB value to RGB. It takes hue, saturation,
411
+ # and value components (floating-point, 0-1.0) as arguments, and returns a
412
+ # list containing RGB components (integers, 0-65535) as result. The code
413
+ # here is a copy of the code on page 616 of "Fundamentals of Interactive
414
+ # Computer Graphics" by Foley and Van Dam.
415
+
416
+ proc SelectColor::hsvToRgb {hue sat val} {
417
+ set v [expr {round(65535.0*$val)}]
418
+ if {$sat == 0} {
419
+ return [list $v $v $v]
420
+ } else {
421
+ set hue [expr {$hue*6.0}]
422
+ if {$hue >= 6.0} {
423
+ set hue 0.0
424
+ }
425
+ set i [expr {int($hue)}]
426
+ set f [expr {$hue-$i}]
427
+ set p [expr {round(65535.0*$val*(1 - $sat))}]
428
+ set q [expr {round(65535.0*$val*(1 - ($sat*$f)))}]
429
+ set t [expr {round(65535.0*$val*(1 - ($sat*(1 - $f))))}]
430
+ switch $i {
431
+ 0 {return [list $v $t $p]}
432
+ 1 {return [list $q $v $p]}
433
+ 2 {return [list $p $v $t]}
434
+ 3 {return [list $p $q $v]}
435
+ 4 {return [list $t $p $v]}
436
+ 5 {return [list $v $p $q]}
437
+ }
438
+ }
439
+ }
440
+
441
+
442
+ # --
443
+ # Taken from tk8.0/demos/tcolor.tcl
444
+ # --
445
+ # The procedure below converts an RGB value to HSB. It takes red, green,
446
+ # and blue components (0-65535) as arguments, and returns a list containing
447
+ # HSB components (floating-point, 0-1) as result. The code here is a copy
448
+ # of the code on page 615 of "Fundamentals of Interactive Computer Graphics"
449
+ # by Foley and Van Dam.
450
+
451
+ proc SelectColor::rgbToHsv {red green blue} {
452
+ if {$red > $green} {
453
+ set max $red.0
454
+ set min $green.0
455
+ } else {
456
+ set max $green.0
457
+ set min $red.0
458
+ }
459
+ if {$blue > $max} {
460
+ set max $blue.0
461
+ } else {
462
+ if {$blue < $min} {
463
+ set min $blue.0
464
+ }
465
+ }
466
+ set range [expr {$max-$min}]
467
+ if {$max == 0} {
468
+ set sat 0
469
+ } else {
470
+ set sat [expr {($max-$min)/$max}]
471
+ }
472
+ if {$sat == 0} {
473
+ set hue 0
474
+ } else {
475
+ set rc [expr {($max - $red)/$range}]
476
+ set gc [expr {($max - $green)/$range}]
477
+ set bc [expr {($max - $blue)/$range}]
478
+ if {$red == $max} {
479
+ set hue [expr {.166667*($bc - $gc)}]
480
+ } else {
481
+ if {$green == $max} {
482
+ set hue [expr {.166667*(2 + $rc - $bc)}]
483
+ } else {
484
+ set hue [expr {.166667*(4 + $gc - $rc)}]
485
+ }
486
+ }
487
+ if {$hue < 0.0} {
488
+ set hue [expr {$hue + 1.0}]
489
+ }
490
+ }
491
+ return [list $hue $sat [expr {$max/65535}]]
492
+ }
493
+