palette.tcl
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:8k
源码类别:

通讯编程

开发平台:

Visual C++

  1. # palette.tcl --
  2. #
  3. # This file contains procedures that change the color palette used
  4. # by Tk.
  5. #
  6. # RCS: @(#) $Id: palette.tcl,v 1.8.2.3 2007/05/09 12:56:32 das Exp $
  7. #
  8. # Copyright (c) 1995-1997 Sun Microsystems, Inc.
  9. #
  10. # See the file "license.terms" for information on usage and redistribution
  11. # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  12. #
  13. # ::tk_setPalette --
  14. # Changes the default color scheme for a Tk application by setting
  15. # default colors in the option database and by modifying all of the
  16. # color options for existing widgets that have the default value.
  17. #
  18. # Arguments:
  19. # The arguments consist of either a single color name, which
  20. # will be used as the new background color (all other colors will
  21. # be computed from this) or an even number of values consisting of
  22. # option names and values.  The name for an option is the one used
  23. # for the option database, such as activeForeground, not -activeforeground.
  24. proc ::tk_setPalette {args} {
  25.     if {[winfo depth .] == 1} {
  26. # Just return on monochrome displays, otherwise errors will occur
  27. return
  28.     }
  29.     # Create an array that has the complete new palette.  If some colors
  30.     # aren't specified, compute them from other colors that are specified.
  31.     if {[llength $args] == 1} {
  32. set new(background) [lindex $args 0]
  33.     } else {
  34. array set new $args
  35.     }
  36.     if {![info exists new(background)]} {
  37. error "must specify a background color"
  38.     }
  39.     set bg [winfo rgb . $new(background)]
  40.     if {![info exists new(foreground)]} {
  41. # Note that the range of each value in the triple returned by
  42. # [winfo rgb] is 0-65535, and your eyes are more sensitive to
  43. # green than to red, and more to red than to blue.
  44. foreach {r g b} $bg {break}
  45. if {$r+1.5*$g+0.5*$b > 100000} {
  46.     set new(foreground) black
  47. } else {
  48.     set new(foreground) white
  49. }
  50.     }
  51.     # To avoir too many lindex...
  52.     foreach {fg_r fg_g fg_b} [winfo rgb . $new(foreground)] {break}
  53.     foreach {bg_r bg_g bg_b} $bg {break}
  54.     set darkerBg [format #%02x%02x%02x [expr {(9*$bg_r)/2560}] 
  55.     [expr {(9*$bg_g)/2560}] [expr {(9*$bg_b)/2560}]]
  56.     foreach i {activeForeground insertBackground selectForeground 
  57.     highlightColor} {
  58. if {![info exists new($i)]} {
  59.     set new($i) $new(foreground)
  60. }
  61.     }
  62.     if {![info exists new(disabledForeground)]} {
  63. set new(disabledForeground) [format #%02x%02x%02x 
  64. [expr {(3*$bg_r + $fg_r)/1024}] 
  65. [expr {(3*$bg_g + $fg_g)/1024}] 
  66. [expr {(3*$bg_b + $fg_b)/1024}]]
  67.     }
  68.     if {![info exists new(highlightBackground)]} {
  69. set new(highlightBackground) $new(background)
  70.     }
  71.     if {![info exists new(activeBackground)]} {
  72. # Pick a default active background that islighter than the
  73. # normal background.  To do this, round each color component
  74. # up by 15% or 1/3 of the way to full white, whichever is
  75. # greater.
  76. foreach i {0 1 2} color "$bg_r $bg_g $bg_b" {
  77.     set light($i) [expr {$color/256}]
  78.     set inc1 [expr {($light($i)*15)/100}]
  79.     set inc2 [expr {(255-$light($i))/3}]
  80.     if {$inc1 > $inc2} {
  81. incr light($i) $inc1
  82.     } else {
  83. incr light($i) $inc2
  84.     }
  85.     if {$light($i) > 255} {
  86. set light($i) 255
  87.     }
  88. }
  89. set new(activeBackground) [format #%02x%02x%02x $light(0) 
  90. $light(1) $light(2)]
  91.     }
  92.     if {![info exists new(selectBackground)]} {
  93. set new(selectBackground) $darkerBg
  94.     }
  95.     if {![info exists new(troughColor)]} {
  96. set new(troughColor) $darkerBg
  97.     }
  98.     if {![info exists new(selectColor)]} {
  99. set new(selectColor) #b03060
  100.     }
  101.     # let's make one of each of the widgets so we know what the 
  102.     # defaults are currently for this platform.
  103.     toplevel .___tk_set_palette
  104.     wm withdraw .___tk_set_palette
  105.     foreach q {
  106. button canvas checkbutton entry frame label labelframe
  107. listbox menubutton menu message radiobutton scale scrollbar
  108. spinbox text
  109.     } {
  110. $q .___tk_set_palette.$q
  111.     }
  112.     # Walk the widget hierarchy, recoloring all existing windows.
  113.     # The option database must be set according to what we do here, 
  114.     # but it breaks things if we set things in the database while 
  115.     # we are changing colors...so, ::tk::RecolorTree now returns the
  116.     # option database changes that need to be made, and they
  117.     # need to be evalled here to take effect.
  118.     # We have to walk the whole widget tree instead of just 
  119.     # relying on the widgets we've created above to do the work
  120.     # because different extensions may provide other kinds
  121.     # of widgets that we don't currently know about, so we'll
  122.     # walk the whole hierarchy just in case.
  123.     eval [tk::RecolorTree . new]
  124.     destroy .___tk_set_palette
  125.     # Change the option database so that future windows will get the
  126.     # same colors.
  127.     foreach option [array names new] {
  128. option add *$option $new($option) widgetDefault
  129.     }
  130.     # Save the options in the variable ::tk::Palette, for use the
  131.     # next time we change the options.
  132.     array set ::tk::Palette [array get new]
  133. }
  134. # ::tk::RecolorTree --
  135. # This procedure changes the colors in a window and all of its
  136. # descendants, according to information provided by the colors
  137. # argument. This looks at the defaults provided by the option 
  138. # database, if it exists, and if not, then it looks at the default
  139. # value of the widget itself.
  140. #
  141. # Arguments:
  142. # w - The name of a window.  This window and all its
  143. # descendants are recolored.
  144. # colors - The name of an array variable in the caller,
  145. # which contains color information.  Each element
  146. # is named after a widget configuration option, and
  147. # each value is the value for that option.
  148. proc ::tk::RecolorTree {w colors} {
  149.     upvar $colors c
  150.     set result {}
  151.     set prototype .___tk_set_palette.[string tolower [winfo class $w]]
  152.     if {![winfo exists $prototype]} {
  153. unset prototype
  154.     }
  155.     foreach dbOption [array names c] {
  156. set option -[string tolower $dbOption]
  157. set class [string replace $dbOption 0 0 [string toupper 
  158. [string index $dbOption 0]]]
  159. if {![catch {$w configure $option} value]} {
  160.     # if the option database has a preference for this
  161.     # dbOption, then use it, otherwise use the defaults
  162.     # for the widget.
  163.     set defaultcolor [option get $w $dbOption $class]
  164.     if {[string match {} $defaultcolor] || 
  165.     ([info exists prototype] && 
  166.     [$prototype cget $option] ne "$defaultcolor")} {
  167. set defaultcolor [lindex $value 3]
  168.     }
  169.     if {![string match {} $defaultcolor]} {
  170. set defaultcolor [winfo rgb . $defaultcolor]
  171.     }
  172.     set chosencolor [lindex $value 4]
  173.     if {![string match {} $chosencolor]} {
  174. set chosencolor [winfo rgb . $chosencolor]
  175.     }
  176.     if {[string match $defaultcolor $chosencolor]} {
  177. # Change the option database so that future windows will get
  178. # the same colors.
  179. append result ";noption add [list 
  180.     *[winfo class $w].$dbOption $c($dbOption) 60]"
  181. $w configure $option $c($dbOption)
  182.     }
  183. }
  184.     }
  185.     foreach child [winfo children $w] {
  186. append result ";n[::tk::RecolorTree $child c]"
  187.     }
  188.     return $result
  189. }
  190. # ::tk::Darken --
  191. # Given a color name, computes a new color value that darkens (or
  192. # brightens) the given color by a given percent.
  193. #
  194. # Arguments:
  195. # color - Name of starting color.
  196. # perecent - Integer telling how much to brighten or darken as a
  197. # percent: 50 means darken by 50%, 110 means brighten
  198. # by 10%.
  199. proc ::tk::Darken {color percent} {
  200.     foreach {red green blue} [winfo rgb . $color] {
  201. set red [expr {($red/256)*$percent/100}]
  202. set green [expr {($green/256)*$percent/100}]
  203. set blue [expr {($blue/256)*$percent/100}]
  204. break
  205.     }
  206.     if {$red > 255} {
  207. set red 255
  208.     }
  209.     if {$green > 255} {
  210. set green 255
  211.     }
  212.     if {$blue > 255} {
  213. set blue 255
  214.     }
  215.     return [format "#%02x%02x%02x" $red $green $blue]
  216. }
  217. # ::tk_bisque --
  218. # Reset the Tk color palette to the old "bisque" colors.
  219. #
  220. # Arguments:
  221. # None.
  222. proc ::tk_bisque {} {
  223.     tk_setPalette activeBackground #e6ceb1 activeForeground black 
  224.     background #ffe4c4 disabledForeground #b0b0b0 foreground black 
  225.     highlightBackground #ffe4c4 highlightColor black 
  226.     insertBackground black selectColor #b03060 
  227.     selectBackground #e6ceb1 selectForeground black 
  228.     troughColor #cdb79e
  229. }