home *** CD-ROM | disk | FTP | other *** search
/ Il CD di internet / CD.iso / SOURCE / TCL / BLT / _BLT.TAR / usr / lib / blt / demos / palette < prev   
Encoding:
Text File  |  1994-01-10  |  10.7 KB  |  355 lines

  1. #!../blt_wish -f
  2.  
  3. if [file exists ../library] {
  4.     set blt_library ../library
  5. }
  6.  
  7. # ----------------------------------------------------------------------
  8. #  PURPOSE:  color palette (demo for drag&drop facilities)
  9. #
  10. #   AUTHOR:  Michael J. McLennan       Phone: (215)770-2842
  11. #            AT&T Bell Laboratories   E-mail: aluxpo!mmc@att.com
  12. #
  13. #     SCCS:  %W% (%G%)
  14. # ----------------------------------------------------------------------
  15. #            Copyright (c) 1993  AT&T  All Rights Reserved
  16. # ======================================================================
  17.  
  18. if {![file exists $blt_library/dd_protocols]} {
  19.     puts stderr "\n================== INSTALLATION ERROR ==================="
  20.     puts stderr "== Cannot find \"dd_protocols\" directory for drag&drop. =="
  21.     puts stderr "== Recompile blt_wish, or set BLT_LIBRARY environment  =="
  22.     puts stderr "== variable to path containing BLT library.            =="
  23.     puts stderr "========================================================="
  24.     exit 1
  25. }
  26. lappend auto_path $blt_library/dd_protocols
  27.  
  28. # ----------------------------------------------------------------------
  29. # Routines for packaging token windows...
  30. # ----------------------------------------------------------------------
  31. proc package_color {color win} {
  32.     if {[winfo children $win] == ""} {
  33.     label $win.label -text "Color"
  34.     pack append $win $win.label top
  35.     }
  36.     set rgb [winfo rgb . $color]
  37.     set r [expr [lindex $rgb 0]/256]
  38.     set g [expr [lindex $rgb 1]/256]
  39.     set b [expr [lindex $rgb 2]/256]
  40.     
  41.     if {[expr $r+$g+$b] > 384} {
  42.     $win.label config -background $color -foreground black
  43.     } else {
  44.     $win.label config -background $color -foreground white
  45.     }
  46.     return $color
  47. }
  48.  
  49. proc package_number {num win} {
  50.     if {[winfo children $win] == ""} {
  51.     label $win.label -text ""
  52.     pack append $win $win.label top
  53.     }
  54.     expr $num*1
  55.     $win.label config -text "Number: $num"
  56.     return $num
  57. }
  58.  
  59. proc package_text {text win} {
  60.     if {[winfo children $win] == ""} {
  61.     label $win.label -text "" -width 30
  62.     pack append $win $win.label top
  63.     }
  64.     $win.label config -text "Text: $text"
  65.     return $text
  66. }
  67.  
  68. # ----------------------------------------------------------------------
  69. # Actions to handle color data...
  70. # ----------------------------------------------------------------------
  71. proc set_color {args} {
  72.     global DragDrop
  73.     set rgb [winfo rgb . $DragDrop(color)]
  74.     
  75.     if {$args == "red" || $args == ""} {
  76.     set_red [expr [lindex $rgb 0]/256]
  77.     }
  78.     if {$args == "green" || $args == ""} {
  79.     set_green [expr [lindex $rgb 1]/256]
  80.     }
  81.     if {$args == "blue" || $args == ""} {
  82.     set_blue  [expr [lindex $rgb 2]/256]
  83.     }
  84. }
  85.  
  86. proc bg_color {win} {
  87.     global DragDrop
  88.     set rgb [winfo rgb . $DragDrop(color)]
  89.     
  90.     set newR [expr [lindex $rgb 0]/256]
  91.     set newG [expr [lindex $rgb 1]/256]
  92.     set newB [expr [lindex $rgb 2]/256]
  93.     
  94.     set actR [expr $newR-20]
  95.     set actG [expr $newG-20]
  96.     set actB [expr $newB-20]
  97.     
  98.     set ncolor #[dec_to_hex $newR][dec_to_hex $newG][dec_to_hex $newB]
  99.     set acolor #[dec_to_hex $actR][dec_to_hex $actG][dec_to_hex $actB]
  100.     
  101.     if {![string match *sample* $win] && $win != "." } {
  102.     catch "$win config -background $ncolor"
  103.     catch "$win config -activebackground $acolor"
  104.     }
  105.     foreach child [winfo children $win] {
  106.     bg_color $child
  107.     }
  108. }
  109.  
  110. proc fg_color {win} {
  111.     global DragDrop
  112.     set rgb [winfo rgb . $DragDrop(color)]
  113.     
  114.     set newR [expr [lindex $rgb 0]/256]
  115.     set newG [expr [lindex $rgb 1]/256]
  116.     set newB [expr [lindex $rgb 2]/256]
  117.     
  118.     set actR [expr $newR-20]
  119.     set actG [expr $newG-20]
  120.     set actB [expr $newB-20]
  121.     
  122.     set ncolor #[dec_to_hex $newR][dec_to_hex $newG][dec_to_hex $newB]
  123.     set acolor #[dec_to_hex $actR][dec_to_hex $actG][dec_to_hex $actB]
  124.     
  125.     if {![string match *sample* $win]} {
  126.     catch "$win config -foreground $ncolor"
  127.     catch "$win config -activeforeground $acolor"
  128.     }
  129.     foreach child [winfo children $win] {
  130.     fg_color $child
  131.     }
  132. }
  133.  
  134. # ----------------------------------------------------------------------
  135. # Setting color samples...
  136. # ----------------------------------------------------------------------
  137. set Red 0
  138. set Green 0
  139. set Blue 0
  140.  
  141. proc update_main_sample {} {
  142.     global Red Green Blue
  143.     set color #[dec_to_hex $Red][dec_to_hex $Green][dec_to_hex $Blue]
  144.     
  145.     if {[expr $Red+$Green+$Blue] > 384} {
  146.     .sample config -background $color -foreground black
  147.     } else {
  148.     .sample config -background $color -foreground white
  149.     }
  150. }
  151.  
  152. proc set_red {val} {
  153.     global Red
  154.     set Red $val
  155.     
  156.     .red.cntl set $Red
  157.     .red.sample config -background #[dec_to_hex $Red]0000
  158.     update_main_sample
  159. }
  160.  
  161. proc set_green {val} {
  162.     global Green
  163.     set Green $val
  164.     
  165.     .green.cntl set $Green
  166.     .green.sample config -background #00[dec_to_hex $Green]00
  167.     update_main_sample
  168. }
  169.  
  170. proc set_blue {val} {
  171.     global Blue
  172.     set Blue $val
  173.     
  174.     .blue.cntl set $Blue
  175.     .blue.sample config -background #0000[dec_to_hex $Blue]
  176.     update_main_sample
  177. }
  178.  
  179. # ----------------------------------------------------------------------
  180. # Mapping numbers to colors...
  181. # ----------------------------------------------------------------------
  182. set dec_to_hex_map(0) 0
  183. set dec_to_hex_map(1) 1
  184. set dec_to_hex_map(2) 2
  185. set dec_to_hex_map(3) 3
  186. set dec_to_hex_map(4) 4
  187. set dec_to_hex_map(5) 5
  188. set dec_to_hex_map(6) 6
  189. set dec_to_hex_map(7) 7
  190. set dec_to_hex_map(8) 8
  191. set dec_to_hex_map(9) 9
  192. set dec_to_hex_map(10) a
  193. set dec_to_hex_map(11) b
  194. set dec_to_hex_map(12) c
  195. set dec_to_hex_map(13) d
  196. set dec_to_hex_map(14) e
  197. set dec_to_hex_map(15) f
  198.  
  199. proc dec_to_hex {val} {
  200.     global dec_to_hex_map
  201.     
  202.     if {$val < 0} {set val 0}
  203.     if {$val > 255} {set val 255}
  204.     
  205.     set dig1 [expr $val/16]
  206.     set dig2 [expr $val-$dig1*16]
  207.     return $dec_to_hex_map($dig1)$dec_to_hex_map($dig2)
  208. }
  209.  
  210. # ----------------------------------------------------------------------
  211. # Main application window...
  212. # ----------------------------------------------------------------------
  213. label .sample -text "Color" -borderwidth 3 -relief raised
  214.  
  215. blt_drag&drop source .sample config \
  216.     -packagecmd {package_color #[dec_to_hex $Red][dec_to_hex $Green][dec_to_hex $Blue]}
  217. blt_drag&drop source .sample handler color dd_send_color
  218. blt_drag&drop target .sample handler color set_color
  219.  
  220. message .explanation -font -Adobe-times-medium-r-normal--*-120* -aspect 200 \
  221.     -text "Press the third mouse button over a slider or a color sample and drag the token window around.  When the token becomes raised, it is over a target window.  Release the mouse button to drop the token and transfer information.  If the transfer fails, a \"no\" symbol is drawn on the token window.\n\nTry the following:\n- Drop a number from one slider onto another\n- Drop a color sample onto the Foreground/Background targets\n- Drop one of the slider color samples onto the main sample\n- Drop tokens from one palette application onto another"
  222.  
  223. #
  224. # Color value entry...
  225. #
  226. frame .value -borderwidth 3
  227. label .value.l -text "Color Value:"
  228. entry .value.e -borderwidth 2 -relief sunken -bg white
  229. pack append .value \
  230.     .value.l left \
  231.     .value.e {left expand fillx}
  232.  
  233. blt_drag&drop source .value.e config \
  234.     -packagecmd {package_color [.value.e get]}
  235. blt_drag&drop source .value.e handler color dd_send_color
  236.  
  237. blt_drag&drop target .value.e handler \
  238.     number {.value.e delete 0 end; .value.e insert 0 $DragDrop(number)} \
  239.     color  {.value.e delete 0 end; .value.e insert 0 $DragDrop(color)}
  240.  
  241. bind .value.e <Key-Return> {set DragDrop(color) [.value.e get]; set_color}
  242.  
  243. #
  244. # Red slider...
  245. #
  246. frame .red -borderwidth 3 -relief raised
  247. scale .red.cntl -label "Red" -orient horizontal -from 0 -to 255 \
  248.     -command set_red
  249. frame .red.sample -geometry 20x20 -borderwidth 3 -relief raised
  250. pack append .red \
  251.     .red.cntl {left expand fillx} \
  252.     .red.sample {right filly}
  253.  
  254. blt_drag&drop source .red.sample config \
  255.     -packagecmd {package_color #[dec_to_hex $Red]0000}
  256. blt_drag&drop source .red.sample handler color dd_send_color
  257.  
  258. blt_drag&drop target .red.sample handler \
  259.     number {set_red $DragDrop(number)} \
  260.     color  {set_color red}
  261.  
  262. blt_drag&drop source .red.cntl config \
  263.     -packagecmd {package_number [.red.cntl get]}
  264. blt_drag&drop source .red.cntl handler number dd_send_number
  265.  
  266. blt_drag&drop target .red.cntl handler \
  267.     number {set_red $DragDrop(number)} \
  268.     color  {set_color red}
  269.  
  270. #
  271. # Green slider...
  272. #
  273. frame .green -borderwidth 3 -relief raised
  274. scale .green.cntl -label "Green" -orient horizontal -from 0 -to 255 \
  275.     -command set_green
  276. frame .green.sample -geometry 20x20 -borderwidth 3 -relief raised
  277. pack append .green \
  278.     .green.cntl {left expand fillx} \
  279.     .green.sample {right filly}
  280.  
  281. blt_drag&drop source .green.sample config \
  282.     -packagecmd {package_color #00[dec_to_hex $Green]00}
  283. blt_drag&drop source .green.sample handler color dd_send_color
  284.  
  285. blt_drag&drop target .green.sample handler \
  286.     number {set_green $DragDrop(number)} \
  287.     color  {set_color green}
  288.  
  289. blt_drag&drop source .green.cntl config \
  290.     -packagecmd {package_number [.green.cntl get]}
  291. blt_drag&drop source .green.cntl handler number dd_send_number
  292.  
  293. blt_drag&drop target .green.cntl handler \
  294.     number {set_green $DragDrop(number)} \
  295.     color  {set_color green}
  296.  
  297. #
  298. # Blue slider...
  299. #
  300. frame .blue -borderwidth 3 -relief raised
  301. scale .blue.cntl -label "Blue" -orient horizontal -from 0 -to 255 \
  302.     -command set_blue
  303. frame .blue.sample -geometry 20x20 -borderwidth 3 -relief raised
  304. pack append .blue \
  305.     .blue.cntl {left expand fillx} \
  306.     .blue.sample {right filly}
  307.  
  308. blt_drag&drop source .blue.sample config \
  309.     -packagecmd {package_color #0000[dec_to_hex $Blue]}
  310. blt_drag&drop source .blue.sample handler color dd_send_color
  311.  
  312. blt_drag&drop target .blue.sample handler \
  313.     number {set_blue $DragDrop(number)} \
  314.     color  {set_color blue}
  315.  
  316. blt_drag&drop source .blue.cntl config \
  317.     -packagecmd {package_number [.blue.cntl get]}
  318. blt_drag&drop source .blue.cntl handler number dd_send_number
  319.  
  320. blt_drag&drop target .blue.cntl handler \
  321.     number {set_blue $DragDrop(number)} \
  322.     color {set_color blue}
  323.  
  324. #
  325. # Foreground/Background color inputs...
  326. #
  327. frame .inputs
  328. label .inputs.bg -text "Background" -borderwidth 3 -relief sunken
  329. label .inputs.fg -text "Foreground" -borderwidth 3 -relief sunken
  330. button .inputs.quit -text "Quit" -borderwidth 3 -command "exit"
  331.  
  332. blt_drag&drop target .inputs.bg handler color "bg_color ."
  333. blt_drag&drop target .inputs.fg handler color "fg_color ."
  334.  
  335. pack append .inputs \
  336.     .inputs.fg {left padx 5 pady 5} \
  337.     .inputs.bg {left padx 5 pady 5} \
  338.     .inputs.quit {right padx 5 pady 5}
  339.  
  340. pack append . \
  341.     .sample {top expand fillx filly} \
  342.     .explanation {top expand fillx filly} \
  343.     .value {top fillx} \
  344.     .red {top fill} \
  345.     .green {top fill} \
  346.     .blue {top fill} \
  347.     .inputs {top fillx}
  348.  
  349. wm minsize . 200 200
  350. wm maxsize . 1000 1000
  351.  
  352. set_red 0
  353. set_green 0
  354. set_blue 0
  355.