Version 3 of colorChooser for pocketPC/etcl

Updated 2006-03-13 21:28:27

2006-03-13 HE An alternative to the old-fashioned Unix colorchooser. Developed for the use in etcl, you can use it together with the Alternative dialogs for pocketPC/etcl. There I also describe how to replace tk_chooseColor.

With some changes you can use it in other enviroments than etcl (Remove windowfit is the first step)

 # colorBox.tcl (wiki version)
 # Version 0.0

 # inspired by the book 'Effektiv Tcl/Tk programmieren'. Used their code to begin the project.
 #        Mark Harrison, DSC Communications Corp.
 #        Michael McLennan, Bell Labs Innovations for Lucent Technologies
 # based on informationen from http://de.wikipedia.org/wiki/HSV-Farbraum

 # Function:
 # A color chooser (a replacement for tk_chooseColor)

 namespace eval ::he::dialog {
        variable colordialog

        set colordialog(c00) #000019
        set colordialog(c01) #000033
        set colordialog(c02) #00004c
        set colordialog(c03) #000066
        set colordialog(c04) #00007f
        set colordialog(c05) #000099
        set colordialog(c06) #0000b2
        set colordialog(c07) #0000cc
        set colordialog(c08) #0000e5
        set colordialog(c09) #0000ff
        set colordialog(c10) #001900
        set colordialog(c11) #003300
        set colordialog(c12) #004c00
        set colordialog(c13) #006600
        set colordialog(c14) #007f00
        set colordialog(c15) #009900
        set colordialog(c16) #00b200
        set colordialog(c17) #00cc00
        set colordialog(c18) #00e500
        set colordialog(c19) #00ff00
        set colordialog(c20) #190000
        set colordialog(c21) #330000
        set colordialog(c22) #4c0000
        set colordialog(c23) #660000
        set colordialog(c24) #7f0000
        set colordialog(c25) #990000
        set colordialog(c26) #b20000
        set colordialog(c27) #cc0000
        set colordialog(c28) #e50000
        set colordialog(c29) #ff0000
        set colordialog(c30) #191919
        set colordialog(c31) #333333
        set colordialog(c32) #4c4c4c
        set colordialog(c33) #666666
        set colordialog(c34) #7f7f7f
        set colordialog(c35) #999999
        set colordialog(c36) #b2b2b2
        set colordialog(c37) #cccccc
        set colordialog(c38) #e5e5e5
        set colordialog(c39) #ffffff

        package require msgcat
        namespace import ::msgcat::mc
 }

 # de.msg
 namespace eval ::he::dialog {
        msgcat::mcset de "Color" "Farbe"
        msgcat::mcset de "Bad option %1\$s:" "Falscher Parameter: %1\$s:"
        msgcat::mcset de "Must be -initialcolor, -parent, or -title ." "Erlaubt: -initialcolor, -parent, oder -title ."
        msgcat::mcset de "Bad window path name %1\$s" "Fenster %1\$s existiert nicht."
        msgcat::mcset de "Ok" "OK"
        msgcat::mcset de "Cancel" "Abbrechen"
        msgcat::mcset de "Add color" "Farbe hinzufügen"
        msgcat::mcset de "Red" "Rot"
        msgcat::mcset de "Green" "Grün"
        msgcat::mcset de "Blue" "Blau"
        msgcat::mcset de "Hue" "Farbt."
        msgcat::mcset de "Sat." "Sätt."
        msgcat::mcset de "Bright." "Hell."

}

 # en.msg
 namespace eval ::he::dialog {
        msgcat::mcset en "Color"
        msgcat::mcset en "Bad option %1\$s:"
        msgcat::mcset en "Must be -initialcolor, -parent, or -title."
        msgcat::mcset en "Bad window path name %1\$s"
        msgcat::mcset en "Ok"
        msgcat::mcset en "Cancel"
        msgcat::mcset en "Add color"
        msgcat::mcset en "Red"
        msgcat::mcset en "Green"
        msgcat::mcset en "Blue"
        msgcat::mcset en "Hue"
        msgcat::mcset en "Sat."
        msgcat::mcset en "Bright."
 }

 proc ::he::dialog::windowFit {top} {
        if {$::tcl_platform(os) eq {Windows CE}} {
                if {[info exists ::etcl::etcl]} {
                        bind $top  <ConfigureRequest> {::etcl::autofit %W}
                        ::etcl::autofit $top
                } else {
                        wm geometry $top 240x[expr 320 - 51]+0+0
                }
        } else {
                wm geometry $top 240x[expr 320 - 51]+[expr [winfo pointerx .] - 120]+[expr [winfo pointery .] - 135]
        }
        return
 }

 proc ::he::dialog::colordialog {args} {
        variable colordialog

        set colordialog(-initialcolor) #408080
        set colordialog(-parent)       {.}
        set colordialog(-title)        [mc "Color"]
        # First we check the parameter
        foreach {para value} $args {
                switch -exact -- $para {
                        -initialcolor {
                                colordialog_checkAndSetInitialcolor
                        }
                        -parent {
                                if {![winfo exists $value]} {
                                        error [mc "Bad window path name %1\$s" $value]
                                }
                                set colordialog(-parent) $value
                        }
                        -title {
                                set colordialog(-title) $value
                        }
                        default {
                                error "[mc "Bad option %1\$s." $value] [mc "Must be -initialcolor, -parent, or -title ."]"
                        }
                }
        }
        scan $colordialog(-initialcolor) "#%2x%2x%2x" colordialog(red) colordialog(green) colordialog(blue)
        colordialog_set_hsb

        # create the windowname for the dialogbox
        if {$colordialog(-parent)  eq {.}} {
                set colordialog(w) ._colordialog
        } else {
                set colordialog(w) [set colordialog(-parent)]._colordialog
        }

        set w $colordialog(w)
        if {[winfo exists $w]} {
                colordialog_destroy
        }
        colordialog_create
        set colordialog(selected) {}
        vwait ::he::dialog::colordialog(selected)

        return $colordialog(selected) 
 }

 proc ::he::dialog::colordialog_create {} {
        variable dir
        variable colordialog

        set w $colordialog(w)

        toplevel $w -class colordialog
        wm protocol $w WM_DELETE_WINDOW ::he::dialog::colordialog_cancel
        wm minsize $w 216 65 ;#220
        wm maxsize $w 240 [expr 320 - 52]
        wm title $w $colordialog(-title)

        frame $w.e   ;# frame with the entries
        frame $w.c   ;# frame with HSB-chooser
        frame $w.c.s ;# frame with the user defined colors
        frame $w.b   ;# frame with buttons

        # frame with HSB-chooser
        canvas $w.c.dial
        frame $w.c.sample -width 10 -height 101

        grid $w.c.dial   -row 0 -column 0
        grid $w.c.sample -row 0 -column 1
        grid $w.c.s      -row 1 -column 0 -columnspan 2
        grid rowconfigure $w.c 0 -weight 0
        grid rowconfigure $w.c 1 -weight 1
        grid columnconfigure $w.c 0 -weight 1
        grid columnconfigure $w.c 1 -weight 0

        # frame with the entries
        label $w.e.lr -text "[mc "Red"]:"
        label $w.e.lg -text "[mc "Green"]:"
        label $w.e.lb -text "[mc "Blue"]:"
        label $w.e.lh -text "[mc "Hue"]:"
        label $w.e.ls -text "[mc "Sat."]:"
        label $w.e.lv -text "[mc "Bright."]:"
        entry $w.e.er -width 5 -validate all -vcmd {::he::dialog::colordialog_vcmdRGB %P %V red}
        entry $w.e.eg -width 5 -validate all -vcmd {::he::dialog::colordialog_vcmdRGB %P %V green}
        entry $w.e.eb -width 5 -validate all -vcmd {::he::dialog::colordialog_vcmdRGB %P %V blue}
        entry $w.e.eh -width 5 -validate all -vcmd {::he::dialog::colordialog_vcmdH %P %V}
        entry $w.e.es -width 5 -validate all -vcmd {::he::dialog::colordialog_vcmdS %P %V}
        entry $w.e.ev -width 5 -validate all -vcmd {::he::dialog::colordialog_vcmdB %P %V}

        grid configure $w.e.lr -column 0 -row 0
        grid configure $w.e.lg -column 2 -row 0
        grid configure $w.e.lb -column 4 -row 0
        grid configure $w.e.lh -column 0 -row 1
        grid configure $w.e.ls -column 2 -row 1
        grid configure $w.e.lv -column 4 -row 1
        grid configure $w.e.er -column 1 -row 0
        grid configure $w.e.eg -column 3 -row 0
        grid configure $w.e.eb -column 5 -row 0
        grid configure $w.e.eh -column 1 -row 1
        grid configure $w.e.es -column 3 -row 1
        grid configure $w.e.ev -column 5 -row 1

        $w.c.dial create image   5   5 -anchor nw -image $colordialog(img_hs)
        $w.c.dial create image 190   5 -anchor nw -image $colordialog(img_v)
        $w.c.dial create oval    0   0   5 5 -fill black -tags hsval -width 3 -fill {}
        $w.c.dial create line  189   5 201 5 -fill black -tags bval  -width 3
        $w.c.dial configure -width 201 -height 107

        $w.c.dial bind hsval <B1-Motion> "::he::dialog::colordialog_set_hs %x %y"
        $w.c.dial bind bval  <B1-Motion> "::he::dialog::colordialog_set_b  %y"

        # frame with the user defined colors
        for {set n 0} {$n <= 3} {incr n} {
                for {set m 0} {$m <= 9} {incr m} {
                        radiobutton $w.c.s.c$n$m \
                                -indicatoron 0 \
                                -bg $colordialog(c$n$m) \
                                -selectcolor $colordialog(c$n$m) \
                                -value c$n$m \
                                -variable ::he::dialog::colordialog(c) \
                                -width 2 \
                                -command "::he::dialog::colordialog_sel $w.c.s.c$n$m"
                        grid configure $w.c.s.c$n$m -row $n -column $m
                }
        }

        # frame with buttons

        button $w.b.ok     -text [mc "Ok"]        -command ::he::dialog::colordialog_ok
        button $w.b.cancel -text [mc "Cancel"]    -command ::he::dialog::colordialog_cancel
        button $w.b.add    -text [mc "Add color"] -command ::he::dialog::colordialog_add

        pack $w.b.ok $w.b.cancel -side left
        pack $w.b.add -side right

        # Frames darstellen
        grid configure $w.e -row 0 -sticky nsew
        grid configure $w.c -row 1 -sticky ew
        grid configure $w.b -row 2 -sticky nsew

        grid rowconfigure $w {0 2} -weight 0
        grid rowconfigure $w 1 -weight 1

        colordialog_refresh
        windowFit $w
        grab set $w
        return
 }

 proc ::he::dialog::colordialog_checkAndSetInitialcolor {value} {
        variable colordialog
        switch -regexp -- $value {
                {^#[0-9a-fA-F]{3}$} {
                        scan $value "#%1x%1x%1x" r g b
                        set r [ expr {$r * 255 / 15}]
                        set g [ expr {$g * 255 / 15}]
                        set b [ expr {$b * 255 / 15}]
                        set colordialog(-initialcolor) [format "#%02x%02x%02x" $r $g $b]
                }
                {^#[0-9a-fA-F]{6}$} {
                        set colordialog(-initialcolor) $value
                }
                {^#[0-9a-fA-F]{9}$} {
                        scan $value "#%3x%3x%3x" r g b
                        set r [ expr {$r * 255 / 4095}]
                        set g [ expr {$g * 255 / 4095}]
                        set b [ expr {$b * 255 / 4095}]
                        set colordialog(-initialcolor) [format "#%02x%02x%02x" $r $g $b]
                }
                {^#[0-9a-fA-F]{12}$} {
                        scan $value "#%4x%4x%4x" r g b
                        set r [ expr {$r * 255 / 65535}]
                        set g [ expr {$g * 255 / 65535}]
                        set b [ expr {$b * 255 / 65535}]
                        set colordialog(-initialcolor) [format "#%02x%02x%02x" $r $g $b]
                }
                {^#} {
                        error "invalid color name \"$value\""
                }
                default {
                        if {[set value1 [colorname2color $value]] eq {}} {
                                error "unknown color name \"$value\""
                        }
                        set colordialog(-initialcolor) $value1
                }
        }
        return
 }

 proc ::he::dialog::colordialog_refresh {} {
        variable colordialog

        set w $colordialog(w)
        set h $colordialog(hue)
        set s $colordialog(saturation)

        if {$h eq {}} {
                set h 180
        }

        set x0 [expr ($h / 2) + 5]
        set y0 [expr (100 - $s) + 5]

        $w.c.dial coords hsval [expr $x0-4] [expr $y0-4] [expr $x0+4] [expr $y0+4]

        set b $colordialog(brightness)
        set y1 [expr (100 - $b) + 5]

        $w.c.dial coords bval 189 $y1 201 $y1
        $w.c.sample configure -background [colordialog_hsb2rgb1 $colordialog(hue) $colordialog(saturation) $colordialog(brightness)]

        foreach {win index} [list $w.e.er red $w.e.eg green $w.e.eb blue $w.e.eh hue $w.e.es saturation $w.e.ev brightness] {
                $win configure -validate none
                $win delete 0 end
                $win insert end $colordialog($index)
                $win configure -validate all
        }

        return
 }

 proc ::he::dialog::colordialog_vcmdRGB {value type name2} {
        variable colordialog
        set state 0
        switch -exact -- $type {
                key {
                        if {($value >= 0 && $value <= 255) || ($value eq {})} {
                                set state 1
                        }
                }
                focusout {
                        if {($value >= 0 && $value <= 255)} {
                                set colordialog($name2) $value
                                set state 1
                        }
                        if {$value ne {}} {
                                colordialog_set_hsb
                        }
                        colordialog_refresh
                }
        }
        return $state
 }

 proc ::he::dialog::colordialog_vcmdH {value type} {
        variable colordialog
        set state 0
        switch -exact -- $type {
                key {
                        if {($value >= 0 && $value <= 359) || ($value eq {})} {
                                set state 1
                        }
                }
                focusout {
                        if {$value >= 0 && $value <= 359} {
                                set colordialog(hue) $value
                                set state 1
                                colordialog_set_rgb
                        } elseif {$value eq {}} {
                                set colordialog(hue) $value
                                set colordialog(saturation) 0
                                set state 1
                                colordialog_set_rgb
                        }
                        colordialog_refresh
                }
        }
        return $state
 }

 proc ::he::dialog::colordialog_vcmdS {value type} {
        variable colordialog
        set state 0
        switch -exact -- $type {
                key {
                        if {($value >= 0 && $value <= 100) || ($value eq {})} {
                                set state 1
                        }
                }
                focusout {
                        if {($value >= 0 && $value <= 100)} {
                                set colordialog(saturation) $value
                                set state 1
                        }
                        if {$value ne {}} {
                                if {$colordialog(hue) eq {}} {
                                        set colordialog(hue) 0
                                }
                                colordialog_set_rgb
                        }
                        colordialog_refresh
                }
        }
        return $state
 }

 proc ::he::dialog::colordialog_vcmdB {value type} {
        variable colordialog
        set state 0
        switch -exact -- $type {
                key {
                        if {($value >= 0 && $value <= 100) || ($value eq {})} {
                                set state 1
                        }
                }
                focusout {
                        if {($value >= 0 && $value <= 100)} {
                                set colordialog(hue) $value
                                set state 1
                        }
                        if {$value ne {}} {
                                colordialog_set_rgb
                        }
                        colordialog_refresh
                }
        }
        return $state
 }


 proc ::he::dialog::colordialog_destroy {} {
        variable colordialog

        grab release $colordialog(w)
        destroy $colordialog(w)
        return
 }

 # command of ok button
 proc ::he::dialog::colordialog_ok {} {
        variable colordialog
        set colordialog(selected) [format "#%02x%02x%02x" $colordialog(red) $colordialog(green) $colordialog(blue)]
        colordialog_destroy
        return
 }

 # command of cancel button
 proc ::he::dialog::colordialog_cancel {} {
        variable colordialog
        set colordialog(selected) {}
        colordialog_destroy
        return
 }

 # add user defined color
 proc ::he::dialog::colordialog_add {} {
        variable colordialog
        if {$colordialog(c) eq {}} {
                tk_messageBox -icon error -type ok -message "No color button selcted!"
                return
        }
        set w $colordialog(w)
        set color [$w.c.sample cget -background]
        set colordialog($colordialog(c)) $color
        $w.c.s.$colordialog(c) configure -bg $color -selectcolor $color
        return
 }

 # choose user defined color
 proc ::he::dialog::colordialog_sel {win} {
        variable colordialog
        set color [$win cget -background]
        scan $color "#%2x%2x%2x"  colordialog(red) colordialog(green) colordialog(blue)

        colordialog_set_hsb
        colordialog_refresh
        return
 }

 # calculate Brightness from y-coordinate
 proc ::he::dialog::colordialog_set_b {y} {
        variable colordialog

        if {$y < 5} {
                set y 5
        } elseif {$y > 105} {
                set y 105
        }
        set colordialog(brightness) [expr 100 - ($y - 5)]

        colordialog_set_rgb
        colordialog_refresh
        return
 }

 # calculate hue and saturation from x- and y-coordinate
 proc ::he::dialog::colordialog_set_hs {x y} {
        variable colordialog

        if {$y < 5} {
                set y 5
        } elseif {$y > 105} {
                set y 105
        }
        if {$x < 5} {
                set x 5
        } elseif {$x > 184} {
                set x 184
        }
        set colordialog(hue)        [expr ($x - 5) * 2]
        set colordialog(saturation) [expr 100 - ($y - 5)]

        colordialog_set_rgb
        colordialog_refresh
        return
 }

 proc ::he::dialog::colordialog_set_rgb {} {
        variable colordialog
        set rgb [colordialog_hsb2rgb $colordialog(hue) $colordialog(saturation) $colordialog(brightness)]
        set colordialog(red)   [lindex $rgb 0]
        set colordialog(green) [lindex $rgb 1]
        set colordialog(blue)  [lindex $rgb 2]
        return
 }

 proc ::he::dialog::colordialog_set_hsb {} {
        variable colordialog
        set hsb [colordialog_rgb2hsb  $colordialog(red) $colordialog(green) $colordialog(blue)]
        set colordialog(hue)        [lindex $hsb 0]
        set colordialog(saturation) [lindex $hsb 1]
        set colordialog(brightness) [lindex $hsb 2]
        return
 }

 proc ::he::dialog::colordialog_hsb2rgb {h s v} {
        set s [expr $s / 100.0]
        set v [expr $v / 100.0]

        if {$s == 0} {
                set v [expr round(255*$v)]
                set r $v
                set g $v
                set b $v
        } else {
                set hi [expr fmod(floor($h / 60.0), 6)]
                set f  [expr $h / 60.0 - $hi]

                set p [expr round(255 * $v * (1.0 - $s))]
                set q [expr round(255 * $v * (1.0 - $s * $f))]
                set t [expr round(255 * $v * (1.0 - $s * (1.0 - $f)))]
                set v [expr round(255 * $v)]
                switch [expr int($hi)] {
                        0 {set r $v; set g $t; set b $p}
                        1 {set r $q; set g $v; set b $p}
                        2 {set r $p; set g $v; set b $t}
                        3 {set r $p; set g $q; set b $v}
                        4 {set r $t; set g $p; set b $v}
                        5 {set r $v; set g $p; set b $q}
                }
        }
        return [list $r $g $b]
 }

 proc ::he::dialog::colordialog_hsb2rgb1 {h s v} {
        variable colordialog
        set rgb [colordialog_hsb2rgb $h $s $v]
        return [format "#%02x%02x%02x" [lindex $rgb 0] [lindex $rgb 1] [lindex $rgb 2]]
 }

 proc ::he::dialog::colordialog_rgb2hsb {r g b} {
        variable colordialog
        if {$r == 0 && $g == 0 && $b == 0} {
                set h 0
                set s 0
                set v 0
        } else {
                set r [expr $r / 255.0]
                set g [expr $g / 255.0]
                set b [expr $b / 255.0]

                set l [list $r $g $b]
                set max [lindex [lsort -real $l] end]
                set min [lindex [lsort -real $l] 0]
                set maxColor [lindex [lindex [lsort -index 0 -real [list [list $r r] [list $g g] [list $b b]]] end] 1]


                set s [expr int(($max - $min) / $max * 100)]
                set v [expr int($max * 100)]

                if {$s == 0} {
                        set h {}
                } else {
                        switch -exact -- $maxColor {
                                r {
                                        set h [expr int((0.0 + ($g - $b) / ($max - $min)) * 60)]
                                }
                                g {
                                        set h [expr int((2.0 + ($b - $r) / ($max - $min)) * 60)]
                                }
                                b {
                                        set h [expr int((4.0 + ($r - $g) / ($max - $min)) * 60)]
                                }
                        }
                        if {$h < 0} {
                                set h [expr $h + 360]
                        }
                }
        }
        return [list $h $s $v]
 }

 set ::he::dialog::colordialog(img_hs) [image create photo -data {
        R0lGODlhtQBlAPcAAAAAAIAAAACAAICAAAAAgIAAgACAgICAgMDAwP8AAAD/
        AP//AAAA//8A/wD//////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
        AAAAMwAAZgAAmQAAzAAA/wAzAAAzMwAzZgAzmQAzzAAz/wBmAABmMwBmZgBm
        mQBmzABm/wCZAACZMwCZZgCZmQCZzACZ/wDMAADMMwDMZgDMmQDMzADM/wD/
        AAD/MwD/ZgD/mQD/zAD//zMAADMAMzMAZjMAmTMAzDMA/zMzADMzMzMzZjMz
        mTMzzDMz/zNmADNmMzNmZjNmmTNmzDNm/zOZADOZMzOZZjOZmTOZzDOZ/zPM
        ADPMMzPMZjPMmTPMzDPM/zP/ADP/MzP/ZjP/mTP/zDP//2YAAGYAM2YAZmYA
        mWYAzGYA/2YzAGYzM2YzZmYzmWYzzGYz/2ZmAGZmM2ZmZmZmmWZmzGZm/2aZ
        AGaZM2aZZmaZmWaZzGaZ/2bMAGbMM2bMZmbMmWbMzGbM/2b/AGb/M2b/Zmb/
        mWb/zGb//5kAAJkAM5kAZpkAmZkAzJkA/5kzAJkzM5kzZpkzmZkzzJkz/5lm
        AJlmM5lmZplmmZlmzJlm/5mZAJmZM5mZZpmZmZmZzJmZ/5nMAJnMM5nMZpnM
        mZnMzJnM/5n/AJn/M5n/Zpn/mZn/zJn//8wAAMwAM8wAZswAmcwAzMwA/8wz
        AMwzM8wzZswzmcwzzMwz/8xmAMxmM8xmZsxmmcxmzMxm/8yZAMyZM8yZZsyZ
        mcyZzMyZ/8zMAMzMM8zMZszMmczMzMzM/8z/AMz/M8z/Zsz/mcz/zMz///8A
        AP8AM/8AZv8Amf8AzP8A//8zAP8zM/8zZv8zmf8zzP8z//9mAP9mM/9mZv9m
        mf9mzP9m//+ZAP+ZM/+ZZv+Zmf+ZzP+Z///MAP/MM//MZv/Mmf/MzP/M////
        AP//M///Zv//mf//zP///yH5BAEAABAALAAAAAC1AGUAAAj/ALlxEzdQnEF0
        4tApROeOobuH9NzRm0hPX0V9GPVZ02itoyxrskLKcjTSkUk1jtSoVGOEpREj
        R2AemYnkCJKbSJLkTMJTSRIlQJUsEbqk6JIiR4so/VHkh9MfOaDmmDojx4yr
        M1pkbdEiStcoYOtEqUO2TiazmdL2ytSrba9wb8PJDQeOLri738B92/vNW19v
        gLt560a4GzfDAgUSNHgw4cKGDyFKpGgx48aOHkGKJGnyZMqVLV+KjjmTpk2c
        Onn2/Bl0qFGkSpc2fRp1KlWrWLVy3e0VbNixZc+mVcvWLdy5de/i1cvXL+DA
        gwsfTixwHOPG6R47fCdx8sR9Fy3v/8MMEuSskJxNPkK5kuWa0TLZ2Dx9s83O
        1W5aE31TFLbSNEw9BdUYtlllVRdX6cbVFb79tkdwaH3CVnFtnRMXcucop5de
        5ezlHGDkCFaYYeNQN1BBjS3EkEOSUVRReJdh9pFII5XkWXuhiQaTTKbhlNN9
        P7EGlGv9JSWbgLXZVhVWWW3F21e/lWUWWsS59daFySmXF199/QXdiNNVx02J
        1qUjTnbZvYOOmtxxVw89b74J3j760DnendZcI4ue5/XpyCyOrCeoGmsQasR7
        axyRaKJsINGofZAm0UYS+eX3hhKX8qdpEW8UkYanPwA4xg+jEkggggheMYOq
        V7TQ6qtR7P8Rax0PflKHrRJKOEwvu+5q4TnhAJvhsOCY842xHSbrTTnehOhs
        N+NAO+aJ16W4ImSRReRiZRjFmBmN6HXG3mcqwVdaaTXdlJpqqwUlFFFHGdnU
        bE4leduSuWXVW4NjAScclRNaeZxcWS7HpYfPiRgdYYmRKU6ZZ56JTprutOlO
        PRfDSc+cddZpzXjX5LmnLH4C+kiggaqxXqGIHqroEfLF7CgSk07qBqWUKmEp
        pkts2umnAAZNag6n5tCF0TOkuqqrrkbBoKxQ03prJrlmMozVvPbya7DBgpOh
        OcUe+42yzJLTbLPdhBgtmdQWZKaKCqkZWXdvTsTteBx5pOdmIwH/Kq5K77HE
        Ukzv9TizujtN6pO7l7521KfzPkWgVLYhmC/TvX0lq5Rk2TrchLu2NXCGduFl
        bHN9MZswYSUaRuLDsJuJ5pprVnxxxnJuvHHHdn4ssp58kvwnyoOu7DKjMMM8
        c6Q157xzpj1H3+nPoZJqvalGI600rAw+PWutU+uKta9aa821sF6HbSyyYy97
        9rNqT+swxLOzabubuOveO8i/j1wy8SojlKFatqjkNepRNJOUAm9WKUzxbHqe
        ApXQSkW07KFqVUt7VdO89yDwVU18vSof+r6mPrGR7X1pg5a02GYd+k2MdhbD
        mAw1xrH95emGwCOZ8EyWspUJEFEvkxkC/5vHQOc5UFM941QEgVY9ChbtgqzK
        oNNi9b1bhc9qWAzh1kZYrC6ub2ztKxva1KbC+cVOYvWrnQzzV0PfhSyH/+Ph
        oFg2wOMZcHk0S2ARGwg9CDJRVEPD3tGgmMENTjFqHbQiCMcnwq6R8IsnFOOz
        1rbCcZRpHLJLR5rS0aZ3yLAecqrHnPZhJ1J+7BpvnAWfZgGoWTziZK8U1BpY
        NkuYrSFmbHgUG2rWBga6wVJuyNQbNDVMTqUhaGMQ1RhM1YVBNjNpV2BVNGN1
        BajtoVZ7yNUnrjaMbmptGL86h7DE6TVzgM0c5UBWOZhVDnKYzZ3OsuQKzyi7
        F9ovhmzcHZ7eOP+y4LWSeCmjIxCRd0A8EhFnfHygEv/YxEBaMGkYZJUhoVZF
        XFHtotzM2hbTd06xsY+d70MbJeeHyTNpck2cXNM73OTJi4FyY6Kskyn3gco8
        oXJPrCTZI1r5SpWtYWW1nCUudQmpNtisl5T6JaaC2bNivuGYnjpmqJZJqi4w
        E1VXSNU0o2lNbOLqE7raptW8eQ5wBouc5zBnscx5rHWOjRzsdGfaxqE2S44J
        di5MU+3wFyca6tONONTh/2AZQB8ONIjKG+ICEaqzIybxZxK8nkMHCdHtGZKD
        UrMoCLNGPi6eM2zJCiMKJ1lJS6YDk5rkJCdX6snWghKU+xClKElJW5r/0hSV
        11AlK1m5097G8qezDK5Qb5nLXe7SqMh1Qy9/GczmDvO5w0zDU4+ZhmRadwxW
        zW4zu5DVaHqXq9W8ZjazCdZtmreb3SyresXJ3rSm1ZzoROc620lfeJKDrpbM
        bwtLmtqJpZS1F2spbGFqp2uA7Ka5XSVPTdbTR/yUUEG9Jcxy6ahd0syolOql
        zoK5VE1JN6pASyaplkk0qxrtmdyVZveqGatr0iqbtwKr1cSa3m8KyxxfY2t8
        x7bOZcG1WXK9b11Ni0nUavIdqmWta18L29qS0sC4xa1ud8tbV/7WwQ4eLhuI
        m8s2GBe5vVwuc50LXelSl7rXXeYytbtd7qa4/5pwFu94P0FesA5jm+hNb3vF
        iWP4wjed850vXO2L3/uSib+Y9C+bOFkxAb90wLQ95YGBl1NXMhiWDw7uoWq5
        5QNaGLmSQipzNyzM6UGVulMtFYm3a7SsriqarmLxHqr5Ylxlk2o09maN2VvO
        HK/PrfQF8jvpCi27Ejm1qUWykuuxZNjK1slPvi0qdZvb3fbWyq8ErpaL6+Vu
        JzfMY34DmaH71Oke07rVVTOb3dxd8Mr5mnQu73nxnF5wgnPP7vUzoOW7zkG3
        E5741e9pB57sJLOW2UyOrcKjHeVpV7vKvs02loV7y4oX98vHVa7GmSvujkfX
        3GhO95qxi93tdvfN7v8OL7znXN4751m99863n+MbaH8TWsj6LbIm1VHwlcLj
        4J6shz1eu3B+MByV2HD4bmkB8VdCQuLBhYTFixuJ44JZEmJm7iTI/dRJnPnc
        jVCzug/R5mZeIRDenfU1AyHeeH+iFC3HczLQu9528Pm95mCHOQG9znX0+9/k
        UIc7A55fgiNb2UpuNtFna9uGJ5jKTY/lxIXb6Yt/GczgHvO4zQzyNKu75G1u
        d9pV3vY6xz3P9WZvn2fO95oDHuCGHoc6ZC/7dPAcHunA/c9/bo939H7oQ+dH
        PYRv9OLvgx/XQH7Slz8LbMyC6dB/BC0e8fTqr0Hq2GcDJNhQ9e63IRJtwLr/
        +N0gCTdMwvzmf8PW158GrzciDe8Pe9gPMQb6k53sgehC/tHO/7Pvge2lsAcB
        CHdwlwyfYIBzN3ftMAwLaHcOeA7tYA4RqHcUWA7sUA5+l4HksA6B14GzN3sD
        Z2RJtlorhXBB52wL13gNN2VUFnFXFlydxmUYB2Yal3UdF0wf93XVJXKfV3bs
        lnJyFm+m53L0Zm/rJXP6xm+C9nqDF3sfaHtQqHvvsHu+53tCd4XEd3xaiHxc
        eA3M53zOF33TN33Wh33Xp31o6H3gB37jV37ld37rp37q1350GH9jIH/1V39d
        cH/6p39n94dsF4gCKIBvV4gIOAwJyIAMCIGMGIGO/5h3eWeBkqiBHMiBgveB
        tHdaIIhsuUeCrNV7TAZKwkdbUIZ8UpZbzmdtrjR9Lyh127Z9XXZc4GdUG1d+
        v+RxXldu1BV2O6hmZEdy24V27DZraPdugyhvYGWAqKeIqpdWEfhn6HSBS7iB
        N0d7T8hzt5d7U7iNv2eFwTd8w7eFx5d8XliOYPh86DiG1LeOZrh97sh93Pd9
        8tiG5Id+cCiH7Od+8Ad/d5iH9reHfbh/gPh/BDmAhViAB3iAiKiIDdiIECiB
        kFiBF5iBGEiNlxh41lh72NiJVMh73oiF4Fh85Lh85th86fh80seO1Hd9LPmO
        26eG8xh+9fiG9jiHXqePdv84f/4IkPvnh/0niABIiASYkImogAz5kBMYkZE4
        kRhYkZbogRm5kbqnjR75e1f4jcYnkl34hSYZhiipjmV4hi8Jj2sYfmbphvV4
        j3F4k3W4j3iok3yIfwHpf0FpkAh5iInYkA/4iEl5gX45iU5pkRiJiVLJkVRZ
        hVYJfCE5jlvphV2ZjilJhuzYkmKZhmQZk/RIk/nYlm+5k3zYkz9Jl4M4gEJJ
        lAqZl4vIlxEpiUxZiYJ5idaoDrenDroHD7sHD79nD8Cnm8NnD8XHD7/Jhdiw
        fMPZfLQQhrQwhpCgnNUHCS8JCd0XCWsYCeJHneQnCW8oCXA4CevHne3XCPEH
        nnf/eAjzdwj3FwjnuX+BAICBMIClQIClgIDJkIDzyYDJ4IDtgJ+OyA4UyJ8W
        uA4TuQ6VqA4DCpvXaJgdiZhXGZLhqJXm6JjnKIYpGZbZN5YwyYYyiZZqaZOc
        yY94+I+f6ZMDWZeleZcLaZR6iZRK+ZetSY1PSZiyKZu5R5u0aZu+h5u4yZv8
        4Ju+CZzHB5zYwA9BmnzDOZzHaZzJmaTS55xM6o5MGgnQyX3SSZ3UGX7YqZ3a
        aX7cuaU32QiT4KXgCX/kOab2Z57ouZ76t55qyp6l0J7veYDxGZ/12Q73eZ/5
        CYH5yQ7toKcSyJ/8CaD/KaCCuoExGqMaGYUcyY2I+ZFY/8mYIwmhJgl9Xzmh
        k+mSZBmPGCp+GZqW6ceWONmPcKmHISqQQDmapYmARHmiR6maEgmYlPiagxmj
        8ECjtmmb9oCjupmrubqjvAqcviqkQlqkRooNx1msSZqcy9mkTwqd0DmlkkCl
        VxqtWMql1Aqm4HmtY9oIZGqmh3Cma7qebRqu7xmnySCn83mudUqn+bmuebqn
        fvqn7ACg8iqoAkqghSqjsql7tJl7NnqrubmbxOejwEqkxAmGR6qktLCc1Oec
        C+uk3RelU/p9VXql1wmH2ql+3vml4Sl/5Fl/5rmH6Jmm6hmI7SmAJTuucCqf
        9NmAd7qn+9mffgmog7oOBBp4sv9ps4U6q7W6s7iao7rJqz36q8AapEQrrMRK
        rMeasEqrrFDatFP6tM8atVc6CdNKrV96tdZ6rdqqrebZtWfard26puI6ruNa
        rmZ7rupqp+zqsnratu8ar/FKrzQ7t4Uqe/i6r7U6hbh5o7sJsMMHnESqfMV5
        tEj6fMm5pGTonNfnnNoHsdIpsdUpfthpflm6pd/pfmG6tR5bpueJf+t5duv5
        fyf7pu+JgPGJiPU5nyy7nxPon3AbqBgooIRqibJptzpbozvrrz67qzwqtL9K
        tMEqrMWKtMearAnrnE3brFALrdJKtc5rtdwJphqrtdnatV4Ltmoarm5KtmZr
        rmibrmv/u65t667vKq9xS6/2SrP3Sqs8q7v+qqu967vAK7xHm7RJarzKirzK
        66zQSp3Nq51WK73Uu7XWa71f+63gur1lS67eq7pqy67jW75wK7eCmr73Gg/s
        a5vx0LO6eQ+8u6P94Lv80A/zO5zZMKzFWgvFm7C1sKxQWgtPS6W24L/RegtV
        y523EL1YewtaC56HEAvbap6rwK1qugrtqcCrwMDz+QzfS6fzEL7tMA8RzJ/y
        AK/yGg/oS7MYnLO0iru1+r7w27tBW8JGW7/Eu7THy7TM6rTLK63TesMC3MM+
        TMDX663fqr1ju8Doiq5pK75s+7ZWfL50q74xisGGDA8bnMjw/3APi7zI9uDB
        /WAPkTzJI1zJIUzCmIwNJ7zJmkwL2UALKhzKoAwJLVzKpBwJMJzKkTDDrCwJ
        tuDKkmDDsjwJOVzLtNwIPJzLjRALu7zLP3wIQxzMgWDExDzMw1wKSZzMpfAM
        y7zMycDE85AM0TzNUVzNTyzF2MwOVbzN2rwO8rAOWBzO4KwOhtzFOtu+HAy/
        vSq0ZGzGxrrCyaq/yRvD/Su10fq81Yq12ErAXGvA2JvAeEy2StzA4Lu2UxzI
        85rF9iqb5azIG8zIEP3IEg3JkizJljzC2JDJJMzJn9zRngzKIG3KIn3KMMzK
        qwzLr/zKshzLtNzStYzLMM3LMv3LQP8MxMEMzMZczMqcxMzc08/809AszdJs
        zVHMDtksxdz8zUrtzeDc1A0tqzW6wbnbyGEcyUALnCQ8tCZMvx9tvy28tM7Z
        wvQMw9Ipta98z7EMwDssx75Mx8Dsz8YM0Mgs0OXKzHss1H1c1H+szRLM1BSM
        wXR7yIoM0Y3swYZd0ZR8yRet0RmtyY7t0R4tyiOtyiad0iid1rNsy5oN07os
        075c07980zo91zzdzD7NxEFNzddM1Edt1Hy9zUy91OL81IKNyIXtyId92Ilt
        yY290Y/dyZEd0qMs0qhc3JR90pat0pjt0rfc2b0806At2jk93Ttt2s6M2kAt
        1Kt9za6N1K//3c2y7dTj3NC2PdiFPdESPckWrdjs3dgcDdwfLdkhTdLGvcr2
        ndywvNKa7dKc/dz+Hd1vLczETNpz3dPXnd3TPNTbbc2undTgzdSz7dTkPOEO
        fdsRrduIvd69/dub/NGfLN+TTcr0XdL3jdz5jdksrcs87NnQHdoBjtM6ndME
        buCn/dMJrtrd/d2wHd6zTeHkHA+JDOSLHA8QfQ+GbeSSfA+T3A+XzOQjzOQZ
        nQ2YnA2bTOWeXAsdXQuhrOWkrOWo7OW2UAusbAspTeaxbAuyfAu1rOa0rOa4
        HAu5HAsyLec/vAo1vQrBjOfAjOfIzOfPsAo9/QyoLejS/AzTPA/X/4zoUYzo
        Ri0P2CwP2wzp3hwPSg3k4AzkPl7hhH3h6Z3h7I3RmfzekC3coSzipVzflW3i
        lq3fzK3i//3ZLi7do63MNH7gqa3drJ3jDr7U3xzh5A3kD03kQ17kRz7JSi7J
        Ts7klyzlUV7lzn7lWb7lqQzmYr7K1U7mZa7SaB7LbK7max7nKy7nu0znsWDn
        dZ7nyezngL7M6y7ogz7Nhi7Nio7o1+zojR7p+D7plR7OmF7h5r3p6K3eib3h
        vt3ho/7hpD7iqF7i+K3fKd7fLA7roG3TLz7g1V3aNI7g2q3gOe7dOx7bEC7e
        hgzs90DkJl/yRp7yKd8PSq7kyv7yyi7lMv/fD1Re8zafDVie8ziv5Twv5j4f
        5kCP7UJ/C2iO5t5+9N4O50p/C3Le9E5f7lBv53g+9Xj+51YP6IDu7lo/D4Zu
        6PT+9fTu6GI/D5Be9mYvD5Se9mgP7EIO7Igs7Ci/yEhu5Ma+5E0+5RtN5Zps
        5Tif5R+u5aDs5Tz/5ax87WZO5rK87d7e5uA+7nN+55C/5+je5+ne0+1O6IIO
        74ee6I+O1JCuzZKO9pXe65bO9myP8kSu8ivf8izf+jAP8zMv8zev8znf87b/
        82Iu9NhO9Lxf9Ej/+0uv9E8v9VFP9caP9Vav9e7O9czf9WD//GMv9mev9mlv
        +j8e5BAN93O//XX/j+x4H+V5/+x9H/jS3uXTXvhjnu2urPiK7+ZM3/hN7/h1
        btN6PvXDzOdVz+6BPujvXuib3+gAMY/dPHkC5R1kd1DeOnnxFsaDuA5iPHUT
        4927ePHeRo4c+937GLLfSJIls/U7mRIlymwtW9bKBlNmLZo1bdW6aUvnTp23
        bPkE+vPWUKJFh8a6hVRpLKZNY616GnXVVKqrnlm1+kzr1q3znnkFO0/sWLIF
        zRJEq1ChQ7YNLVrEGFdjx44hQYIsOVJlSpd9X8aMWVOwTZyFeR7+mRio0aSN
        myZ12hTq5KqVsV7FzFUz2K9fyYo9a1bt6LZv4WbEl7EjPo93/d0t6S8v/0p/
        e1tq8xtTm8zAtXbnLKwNsa1tihNvY3wLueOk2yIzrcZ08tNqVDGvqp5Za7Wu
        nfN1JpvvM8F8oQ/iG90wdUO3plWrplsXNt6Ve1nm5p1/8GDgOYf3NI4opZh7
        TjqppLKsquu000wrzsJKK8L0DiqNvbdSwzAeDO9hrcN7XgPxww/7ka1EEk8s
        MZvaVswGNxdbbNE3GXejcUZbhMOROB2L41E5H5ED8sdYnCMyluiONNJI7Jas
        rkkmn+Euyme+o3LKKecRL0sst8xSnvK+lAc9McMMU0MzU5Mrzbnim0+kvOzj
        Cz/A9DOsTv/+C2oxowbks8Dp/pxqwcuyatBB8P88+yy0tCaskC2IMtzQQw9D
        pBRFS1NksbYXN52x0xpzzLE44XgkTrlSg0R1SFWLdA5JV5mEVUpZraySSi5v
        7RLM8sbk9UxfH31vI9bie82uj4rVizbbYMxttzl1I+ym3w4TDkCfistTOT6b
        KzA6yagDdMkFoSz0uwetHMus8hYlM731SoNUQw7nZe21ekWs1ER9UVSxX01h
        3BRgT28kGNQdD0b1R4VZVTW6VpNsUkknZ+Xuu4pppRVXjXX1kkxePS4z3kjp
        nddefPG91F+VA+b0U099KzhmUmc+VUiGH3YV4lh3pphcizG2VUuOwfy4V5Hl
        lZRkSlEG8VJ+M10ZYIH/P70RZoNp7jFhrVflGmeIJX6y54trvTLojTseGmSj
        fRWZ5ElPzldlFlme+mWXaYw5VIR31PZmrnOemOdYyZ2V7FqxRDvxoj1m+0x8
        Onycw8j9wQfEyj/0B8TMSdw88xIzV1GbFUUP3UVtTEf9xtNVH1UbHl0nbhsg
        ZVeOdtlnJ7Ka3HM/sprem/QdyuB9r7gaKo2fMh8qlceSeeWzVN5LfL6cXnox
        Hw8Te0g5RNptuOFOGWqoWfYtRqoNvnrvrG3uOkmvAR+8ScLnNzxjoRNPu2gN
        Q9bw8cj9r9zkAkg5zXmucwYEnT9Et8DRKVCBqDvd6iI4QeK4zoKv24brbHe7
        /9vVjoO7053vhkQ84hmJhMMjXj6Cp0IWIu95L2zeC6mXj+lVj4Y31B4AH4e0
        7iXNZEsr0YhWRCK59YtuLirf3fJGMFGpj29+YxjgdDYxKGFnflL6meGwVDYv
        IS5/amOcmPqnwwGWkYCVQ2Aa1Si6zDHQjQ+cYBwnmEE6XvCCH8RjHnUnuxBu
        o48hPGEgU2g8QraQhTJEZCKnp7wa4hCHZPTfGCUHOctV8kOX8xznGhi6TUaw
        Raf7JI0kOEocwe50GKwgjza4uxGysoSvFCHxsIPCKLnQlsdbHvRmKL1d+i97
        18MQJCn3uDMWc4BqRKbn3ujG08FRjnKsYzTvmEc87v/Rj9f8ox8FKUgV+s6Q
        hSxkIsX5vEaWk4aPOycAJem/SUrOkgS8ZAE5OU8HztOT9zydb0jJOtWhko6x
        UyWRZNdKgvquVbFEKPBquVDh4XJKt0zeLm/IS4r60qI7BKAxNZo5NCbTo210
        4DJDCk07SvN2GqRmSjmYTZZq84TfhKnyjDdOmpLTkeasISR1qFEzdrSjBmRj
        SIXKzGcW9ZQRNOk0UbrS27X0jwbdJjfBCdOZHlKGi7xpVnWqw3/474xdNeY/
        OGpAsaaxrEAtqxv/scy1HjWDa5UmXJf6jzzSFY92/eM/WKpXqPqOr+DU6zf/
        IdMXDhaRhn0hPgxbzq7etKv/W/VqTzdKQJCCVKTLNGocM+jWkpZUdii1plOx
        2deobpOqMbUqVnGq1XSSsauvVWxsX+uP2YrVtrTF7W11m1vaasO2vgXuWoUb
        XOIO17i+3QZdlZtc5i7Xuc1NbjWUK13q6tW61cXuda2bj+0O1rvcBe93xRte
        7iq2vLBFr2x3Kln2eu6nyoTvZYfazGdutrNJPakem4pN/rKUtCQ87VTDadXE
        2nS1OEWn/9K7YMXStsG7hTBvfzvh3h7XwsUtbnKR+1wOQ5fD2QWxdkNcXe5K
        l7zjRXF4zfva86o3vcRUcE/BWkawjrW38V3rUHOs1me21Y5yrSOQNQhXPspO
        r/09/3Jen0pdbxIvsIAVcGAJW14DN5axOH1sjBfs4Ah3WcJf1q1vK1xhDBtX
        wx1Gs4fVjGbpRlfEby5xiuV8YjqLd8V3ZnCeXfzgB4M5t2K+cKDLPGgzC/fM
        Hm6zdd084jczmtFxrvOJ8bxnPVeay372cqb/PGFCb3jDawZ1mtk8XVI72rsm
        nnOqI+3dSVea0pS+dG03TWZB17rTFj60cxO960b32tSmhnR3VcxqV+f5H689
        Nm2TfWzbLtvZzYa2sqPNbGlXm9m+PTa2hXvs5HKb2d1WrrfFHW5yg9vczJbu
        sdNt3WNzt93Mdrd33z1vedc73veGd76P/Wr0xprPmqawcPBpfWuCK9fTom4u
        r928aF/3OtioRvWqzzvxYrv42da+OLU1nnGOTzvb1wb5uM8t8m+XnOQnLze6
        9W3vleOb3i5n+cuZrdh9F9vftu1zwAG9c07b2ucHz/WnSb3whv8azt2FOIrx
        TPFW85vZT4d61KU+dapX3epXx3rWtb51rnc96zRHNrTBjnGPl13a2j57yLe9
        dm2PPOUodzu41z13lat75euGed5bPvOVgx3sXgd84AU/eMIX3vB+33jYpT32
        xKf92WhXu+PJ3Xa1g5vyKF+33E3Obs7jve719rzMa05vsMe79Hw3fOpVv3rW
        t57qAQEAOw==
 }]
 set ::he::dialog::colordialog(img_v) [image create photo -data {
        R0lGODlhCgBlAPcAAP////z8/Pr6+vf39/X19fLy8vDw8O3t7evr6+jo6Obm
        5uPj4+Dg4N7e3tvb29nZ2dbW1tTU1NHR0c/Pz8zMzMnJycfHx8TExMLCwr+/
        v729vbq6uri4uLW1tbOzs7CwsK2traurq6ioqKampqOjo6GhoZ6enpycnJmZ
        mZaWlpSUlJGRkY+Pj4yMjIqKioeHh4WFhYKCgoCAgH19fXp6enh4eHV1dXNz
        c3BwcG5ubmtra2lpaWZmZmNjY2FhYV5eXlxcXFlZWVdXV1RUVFJSUk9PT01N
        TUpKSkdHR0VFRUJCQkBAQD09PTs7Ozg4ODY2NjMzMzAwMC4uLisrKykpKSYm
        JiQkJCEhIR8fHxwcHBoaGhcXFxQUFBISEg8PDw0NDQoKCggICAUFBQMDAwAA
        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
        AAAAAAAAAAAAAAAAAAAAACwAAAAACgBlAAAI/wABCBxIMIDBgwgFKFzIcIDD
        hxAJSJxIsYDFixgNaNzI8YDHjyARiBxJMoHJkygVqFzJcoHLlzAZyJxJs4HN
        mzgd6NzJ84HPn0AhCB1KNILRo0glKF3KdILTp1ApSJ1KtYLVq1gtaN3K9YLX
        r2AxiB1LNoPZs2g1qF3LdoPbt3A5yJ1Lt4Pdu3g96N3L94Pfv4BBCB5MOITh
        w4hFKF7MeITjx5BJSJ5MuYTly5hNaN7M+YTnz6BRiB5NOoXp06hVqF7NeoXr
        17BZyJ5Nu4Xt27hd6N7N+4Xv38BhCB9OPIbx48hlKF/OfIbz59BpSJ9OvYb1
        69htaN/O/Yb37+BxiN0fTz6H+fPodahfz36H+/fwecifT7+H/fv4fejfz/+H
        //8AAiHggAQGYeCBCAqh4IIMDuHggxASIeGEFBZh4YUYGqHhhhwe4eGHICIh
        4ogkJmHiiSgqoeKKLC7h4oswMiHjjDQ2YeONODqh4448PuHjj0BCIeSQREZh
        5JFISqHkkkxO4eSTUFIh5ZRUVmHllVhaoeWWXF7h5ZdgYiHmmGRmYeaZaGqh
        5ppsbuHmm3ByIeecdHZh5514eqHnnnx+4eefgIIh6KCEhmHooYiKoeiijI7h
        6KOQkiHppJQGBAA7
 }]

 # Their is no way to get the color to a known colorname from inside tcl/tk
 proc ::he::dialog::colorname2color {colorname} {
        variable colors
        regsub -all -- {\s} $colorname {} colorname
        set colorname [string tolower $colorname]
        if {[info exists colors($colorname)]} {
                return $colors($colorname)
        }
        return
 }
 array set ::he::dialog::colors "
        aliceblue #f0f8ff
        antiquewhite #faebd7
        antiquewhite1 #ffefdb
        antiquewhite2 #eedfcc
        antiquewhite3 #cdc0b0
        antiquewhite4 #8b8378
        aquamarine #7fffd4
        aquamarine1 #7fffd4
        aquamarine2 #76eec6
        aquamarine3 #66cdaa
        aquamarine4 #458b74
        azure #f0ffff
        azure1 #f0ffff
        azure2 #e0eeee
        azure3 #c1cdcd
        azure4 #838b8b
        beige #f5f5dc
        bisque #ffe4c4
        bisque1 #ffe4c4
        bisque2 #eed5b7
        bisque3 #cdb79e
        bisque4 #8b7d6b
        black #000000
        blanchedalmond #ffebcd
        blue #0000ff
        blue1 #0000ff
        blue2 #0000ee
        blue3 #0000cd
        blue4 #00008b
        blueviolet #8a2be2
        brown #a52a2a
        brown1 #ff4040
        brown2 #ee3b3b
        brown3 #cd3333
        brown4 #8b2323
        burlywood #deb887
        burlywood1 #ffd39b
        burlywood2 #eec591
        burlywood3 #cdaa7d
        burlywood4 #8b7355
        cadetblue #5f9ea0
        cadetblue1 #98f5ff
        cadetblue2 #8ee5ee
        cadetblue3 #7ac5cd
        cadetblue4 #53868b
        chartreuse #7fff00
        chartreuse1 #7fff00
        chartreuse2 #76ee00
        chartreuse3 #66cd00
        chartreuse4 #458b00
        chocolate #d2691e
        chocolate1 #ff7f24
        chocolate2 #ee7621
        chocolate3 #cd661d
        chocolate4 #8b4513
        coral #ff7f50
        coral1 #ff7256
        coral2 #ee6a50
        coral3 #cd5b45
        coral4 #8b3e2f
        cornflowerblue #6495ed
        cornsilk #fff8dc
        cornsilk1 #fff8dc
        cornsilk2 #eee8cd
        cornsilk3 #cdc8b1
        cornsilk4 #8b8878
        cyan #00ffff
        cyan1 #00ffff
        cyan2 #00eeee
        cyan3 #00cdcd
        cyan4 #008b8b
        darkblue #00008b
        darkcyan #008b8b
        darkgoldenrod #b8860b
        darkgoldenrod1 #ffb90f
        darkgoldenrod2 #eead0e
        darkgoldenrod3 #cd950c
        darkgoldenrod4 #8b6508
        darkgray #a9a9a9
        darkgreen #006400
        darkgrey #a9a9a9
        darkkhaki #bdb76b
        darkmagenta #8b008b
        darkolivegreen #556b2f
        darkolivegreen1 #caff70
        darkolivegreen2 #bcee68
        darkolivegreen3 #a2cd5a
        darkolivegreen4 #6e8b3d
        darkorange #ff8c00
        darkorange1 #ff7f00
        darkorange2 #ee7600
        darkorange3 #cd6600
        darkorange4 #8b4500
        darkorchid #9932cc
        darkorchid1 #bf3eff
        darkorchid2 #b23aee
        darkorchid3 #9a32cd
        darkorchid4 #68228b
        darkred #8b0000
        darksalmon #e9967a
        darkseagreen #8fbc8f
        darkseagreen1 #c1ffc1
        darkseagreen2 #b4eeb4
        darkseagreen3 #9bcd9b
        darkseagreen4 #698b69
        darkslateblue #483d8b
        darkslategray #2f4f4f
        darkslategray1 #97ffff
        darkslategray2 #8deeee
        darkslategray3 #79cdcd
        darkslategray4 #528b8b
        darkslategrey #2f4f4f
        darkturquoise #00ced1
        darkviolet #9400d3
        deeppink #ff1493
        deeppink1 #ff1493
        deeppink2 #ee1289
        deeppink3 #cd1076
        deeppink4 #8b0a50
        deepskyblue #00bfff
        deepskyblue1 #00bfff
        deepskyblue2 #00b2ee
        deepskyblue3 #009acd
        deepskyblue4 #00688b
        dimgray #696969
        dimgrey #696969
        dodgerblue #1e90ff
        dodgerblue1 #1e90ff
        dodgerblue2 #1c86ee
        dodgerblue3 #1874cd
        dodgerblue4 #104e8b
        firebrick #b22222
        firebrick1 #ff3030
        firebrick2 #ee2c2c
        firebrick3 #cd2626
        firebrick4 #8b1a1a
        floralwhite #fffaf0
        forestgreen #228b22
        gainsboro #dcdcdc
        ghostwhite #f8f8ff
        gold #ffd700
        gold1 #ffd700
        gold2 #eec900
        gold3 #cdad00
        gold4 #8b7500
        goldenrod #daa520
        goldenrod1 #ffc125
        goldenrod2 #eeb422
        goldenrod3 #cd9b1d
        goldenrod4 #8b6914
        gray #bebebe
        gray0 #000000
        gray1 #030303
        gray10 #1a1a1a
        gray100 #ffffff
        gray11 #1c1c1c
        gray12 #1f1f1f
        gray13 #212121
        gray14 #242424
        gray15 #262626
        gray16 #292929
        gray17 #2b2b2b
        gray18 #2e2e2e
        gray19 #303030
        gray2 #050505
        gray20 #333333
        gray21 #363636
        gray22 #383838
        gray23 #3b3b3b
        gray24 #3d3d3d
        gray25 #404040
        gray26 #424242
        gray27 #454545
        gray28 #474747
        gray29 #4a4a4a
        gray3 #080808
        gray30 #4d4d4d
        gray31 #4f4f4f
        gray32 #525252
        gray33 #545454
        gray34 #575757
        gray35 #595959
        gray36 #5c5c5c
        gray37 #5e5e5e
        gray38 #616161
        gray39 #636363
        gray4 #0a0a0a
        gray40 #666666
        gray41 #696969
        gray42 #6b6b6b
        gray43 #6e6e6e
        gray44 #707070
        gray45 #737373
        gray46 #757575
        gray47 #787878
        gray48 #7a7a7a
        gray49 #7d7d7d
        gray5 #0d0d0d
        gray50 #7f7f7f
        gray51 #828282
        gray52 #858585
        gray53 #878787
        gray54 #8a8a8a
        gray55 #8c8c8c
        gray56 #8f8f8f
        gray57 #919191
        gray58 #949494
        gray59 #969696
        gray6 #0f0f0f
        gray60 #999999
        gray61 #9c9c9c
        gray62 #9e9e9e
        gray63 #a1a1a1
        gray64 #a3a3a3
        gray65 #a6a6a6
        gray66 #a8a8a8
        gray67 #ababab
        gray68 #adadad
        gray69 #b0b0b0
        gray7 #121212
        gray70 #b3b3b3
        gray71 #b5b5b5
        gray72 #b8b8b8
        gray73 #bababa
        gray74 #bdbdbd
        gray75 #bfbfbf
        gray76 #c2c2c2
        gray77 #c4c4c4
        gray78 #c7c7c7
        gray79 #c9c9c9
        gray8 #141414
        gray80 #cccccc
        gray81 #cfcfcf
        gray82 #d1d1d1
        gray83 #d4d4d4
        gray84 #d6d6d6
        gray85 #d9d9d9
        gray86 #dbdbdb
        gray87 #dedede
        gray88 #e0e0e0
        gray89 #e3e3e3
        gray9 #171717
        gray90 #e5e5e5
        gray91 #e8e8e8
        gray92 #ebebeb
        gray93 #ededed
        gray94 #f0f0f0
        gray95 #f2f2f2
        gray96 #f5f5f5
        gray97 #f7f7f7
        gray98 #fafafa
        gray99 #fcfcfc
        green #00ff00
        green1 #00ff00
        green2 #00ee00
        green3 #00cd00
        green4 #008b00
        greenyellow #adff2f
        grey #bebebe
        grey0 #000000
        grey1 #030303
        grey10 #1a1a1a
        grey100 #ffffff
        grey11 #1c1c1c
        grey12 #1f1f1f
        grey13 #212121
        grey14 #242424
        grey15 #262626
        grey16 #292929
        grey17 #2b2b2b
        grey18 #2e2e2e
        grey19 #303030
        grey2 #050505
        grey20 #333333
        grey21 #363636
        grey22 #383838
        grey23 #3b3b3b
        grey24 #3d3d3d
        grey25 #404040
        grey26 #424242
        grey27 #454545
        grey28 #474747
        grey29 #4a4a4a
        grey3 #080808
        grey30 #4d4d4d
        grey31 #4f4f4f
        grey32 #525252
        grey33 #545454
        grey34 #575757
        grey35 #595959
        grey36 #5c5c5c
        grey37 #5e5e5e
        grey38 #616161
        grey39 #636363
        grey4 #0a0a0a
        grey40 #666666
        grey41 #696969
        grey42 #6b6b6b
        grey43 #6e6e6e
        grey44 #707070
        grey45 #737373
        grey46 #757575
        grey47 #787878
        grey48 #7a7a7a
        grey49 #7d7d7d
        grey5 #0d0d0d
        grey50 #7f7f7f
        grey51 #828282
        grey52 #858585
        grey53 #878787
        grey54 #8a8a8a
        grey55 #8c8c8c
        grey56 #8f8f8f
        grey57 #919191
        grey58 #949494
        grey59 #969696
        grey6 #0f0f0f
        grey60 #999999
        grey61 #9c9c9c
        grey62 #9e9e9e
        grey63 #a1a1a1
        grey64 #a3a3a3
        grey65 #a6a6a6
        grey66 #a8a8a8
        grey67 #ababab
        grey68 #adadad
        grey69 #b0b0b0
        grey7 #121212
        grey70 #b3b3b3
        grey71 #b5b5b5
        grey72 #b8b8b8
        grey73 #bababa
        grey74 #bdbdbd
        grey75 #bfbfbf
        grey76 #c2c2c2
        grey77 #c4c4c4
        grey78 #c7c7c7
        grey79 #c9c9c9
        grey8 #141414
        grey80 #cccccc
        grey81 #cfcfcf
        grey82 #d1d1d1
        grey83 #d4d4d4
        grey84 #d6d6d6
        grey85 #d9d9d9
        grey86 #dbdbdb
        grey87 #dedede
        grey88 #e0e0e0
        grey89 #e3e3e3
        grey9 #171717
        grey90 #e5e5e5
        grey91 #e8e8e8
        grey92 #ebebeb
        grey93 #ededed
        grey94 #f0f0f0
        grey95 #f2f2f2
        grey96 #f5f5f5
        grey97 #f7f7f7
        grey98 #fafafa
        grey99 #fcfcfc
        honeydew #f0fff0
        honeydew1 #f0fff0
        honeydew2 #e0eee0
        honeydew3 #c1cdc1
        honeydew4 #838b83
        hotpink #ff69b4
        hotpink1 #ff6eb4
        hotpink2 #ee6aa7
        hotpink3 #cd6090
        hotpink4 #8b3a62
        indianred #cd5c5c
        indianred1 #ff6a6a
        indianred2 #ee6363
        indianred3 #cd5555
        indianred4 #8b3a3a
        ivory #fffff0
        ivory1 #fffff0
        ivory2 #eeeee0
        ivory3 #cdcdc1
        ivory4 #8b8b83
        khaki #f0e68c
        khaki1 #fff68f
        khaki2 #eee685
        khaki3 #cdc673
        khaki4 #8b864e
        lavender #e6e6fa
        lavenderblush #fff0f5
        lavenderblush1 #fff0f5
        lavenderblush2 #eee0e5
        lavenderblush3 #cdc1c5
        lavenderblush4 #8b8386
        lawngreen #7cfc00
        lemonchiffon #fffacd
        lemonchiffon1 #fffacd
        lemonchiffon2 #eee9bf
        lemonchiffon3 #cdc9a5
        lemonchiffon4 #8b8970
        lightblue #add8e6
        lightblue1 #bfefff
        lightblue2 #b2dfee
        lightblue3 #9ac0cd
        lightblue4 #68838b
        lightcoral #f08080
        lightcyan #e0ffff
        lightcyan1 #e0ffff
        lightcyan2 #d1eeee
        lightcyan3 #b4cdcd
        lightcyan4 #7a8b8b
        lightgoldenrod #eedd82
        lightgoldenrod1 #ffec8b
        lightgoldenrod2 #eedc82
        lightgoldenrod3 #cdbe70
        lightgoldenrod4 #8b814c
        lightgoldenrodyellow #fafad2
        lightgray #d3d3d3
        lightgreen #90ee90
        lightgrey #d3d3d3
        lightpink #ffb6c1
        lightpink1 #ffaeb9
        lightpink2 #eea2ad
        lightpink3 #cd8c95
        lightpink4 #8b5f65
        lightsalmon #ffa07a
        lightsalmon1 #ffa07a
        lightsalmon2 #ee9572
        lightsalmon3 #cd8162
        lightsalmon4 #8b5742
        lightseagreen #20b2aa
        lightskyblue #87cefa
        lightskyblue1 #b0e2ff
        lightskyblue2 #a4d3ee
        lightskyblue3 #8db6cd
        lightskyblue4 #607b8b
        lightslateblue #8470ff
        lightslategray #778899
        lightslategrey #778899
        lightsteelblue #b0c4de
        lightsteelblue1 #cae1ff
        lightsteelblue2 #bcd2ee
        lightsteelblue3 #a2b5cd
        lightsteelblue4 #6e7b8b
        lightyellow #ffffe0
        lightyellow1 #ffffe0
        lightyellow2 #eeeed1
        lightyellow3 #cdcdb4
        lightyellow4 #8b8b7a
        limegreen #32cd32
        linen #faf0e6
        magenta #ff00ff
        magenta1 #ff00ff
        magenta2 #ee00ee
        magenta3 #cd00cd
        magenta4 #8b008b
        maroon #b03060
        maroon1 #ff34b3
        maroon2 #ee30a7
        maroon3 #cd2990
        maroon4 #8b1c62
        mediumaquamarine #66cdaa
        mediumblue #0000cd
        mediumorchid #ba55d3
        mediumorchid1 #e066ff
        mediumorchid2 #d15fee
        mediumorchid3 #b452cd
        mediumorchid4 #7a378b
        mediumpurple #9370db
        mediumpurple1 #ab82ff
        mediumpurple2 #9f79ee
        mediumpurple3 #8968cd
        mediumpurple4 #5d478b
        mediumseagreen #3cb371
        mediumslateblue #7b68ee
        mediumspringgreen #00fa9a
        mediumturquoise #48d1cc
        mediumvioletred #c71585
        midnightblue #191970
        mintcream #f5fffa
        mistyrose #ffe4e1
        mistyrose1 #ffe4e1
        mistyrose2 #eed5d2
        mistyrose3 #cdb7b5
        mistyrose4 #8b7d7b
        moccasin #ffe4b5
        navajowhite #ffdead
        navajowhite1 #ffdead
        navajowhite2 #eecfa1
        navajowhite3 #cdb38b
        navajowhite4 #8b795e
        navy #000080
        navyblue #000080
        oldlace #fdf5e6
        olivedrab #6b8e23
        olivedrab1 #c0ff3e
        olivedrab2 #b3ee3a
        olivedrab3 #9acd32
        olivedrab4 #698b22
        orange #ffa500
        orange1 #ffa500
        orange2 #ee9a00
        orange3 #cd8500
        orange4 #8b5a00
        orangered #ff4500
        orangered1 #ff4500
        orangered2 #ee4000
        orangered3 #cd3700
        orangered4 #8b2500
        orchid #da70d6
        orchid1 #ff83fa
        orchid2 #ee7ae9
        orchid3 #cd69c9
        orchid4 #8b4789
        palegoldenrod #eee8aa
        palegreen #98fb98
        palegreen1 #9aff9a
        palegreen2 #90ee90
        palegreen3 #7ccd7c
        palegreen4 #548b54
        paleturquoise #afeeee
        paleturquoise1 #bbffff
        paleturquoise2 #aeeeee
        paleturquoise3 #96cdcd
        paleturquoise4 #668b8b
        palevioletred #db7093
        palevioletred1 #ff82ab
        palevioletred2 #ee799f
        palevioletred3 #cd687f
        palevioletred4 #8b475d
        papayawhip #ffefd5
        peachpuff #ffdab9
        peachpuff1 #ffdab9
        peachpuff2 #eecbad
        peachpuff3 #cdaf95
        peachpuff4 #8b7765
        peru #cd853f
        pink #ffc0cb
        pink1 #ffb5c5
        pink2 #eea9b8
        pink3 #cd919e
        pink4 #8b636c
        plum #dda0dd
        plum1 #ffbbff
        plum2 #eeaeee
        plum3 #cd96cd
        plum4 #8b668b
        powderblue #b0e0e6
        purple #a020f0
        purple1 #9b30ff
        purple2 #912cee
        purple3 #7d26cd
        purple4 #551a8b
        red #ff0000
        red1 #ff0000
        red2 #ee0000
        red3 #cd0000
        red4 #8b0000
        rosybrown #bc8f8f
        rosybrown1 #ffc1c1
        rosybrown2 #eeb4b4
        rosybrown3 #cd9b9b
        rosybrown4 #8b6969
        royalblue #4169e1
        royalblue1 #4876ff
        royalblue2 #436eee
        royalblue3 #3a5fcd
        royalblue4 #27408b
        saddlebrown #8b4513
        salmon #fa8072
        salmon1 #ff8c69
        salmon2 #ee8262
        salmon3 #cd7054
        salmon4 #8b4c39
        sandybrown #f4a460
        seagreen #2e8b57
        seagreen1 #54ff9f
        seagreen2 #4eee94
        seagreen3 #43cd80
        seagreen4 #2e8b57
        seashell #fff5ee
        seashell1 #fff5ee
        seashell2 #eee5de
        seashell3 #cdc5bf
        seashell4 #8b8682
        sienna #a0522d
        sienna1 #ff8247
        sienna2 #ee7942
        sienna3 #cd6839
        sienna4 #8b4726
        skyblue #87ceeb
        skyblue1 #87ceff
        skyblue2 #7ec0ee
        skyblue3 #6ca6cd
        skyblue4 #4a708b
        slateblue #6a5acd
        slateblue1 #836fff
        slateblue2 #7a67ee
        slateblue3 #6959cd
        slateblue4 #473c8b
        slategray #708090
        slategray1 #c6e2ff
        slategray2 #b9d3ee
        slategray3 #9fb6cd
        slategray4 #6c7b8b
        slategrey #708090
        snow #fffafa
        snow1 #fffafa
        snow2 #eee9e9
        snow3 #cdc9c9
        snow4 #8b8989
        springgreen #00ff7f
        springgreen1 #00ff7f
        springgreen2 #00ee76
        springgreen3 #00cd66
        springgreen4 #008b45
        steelblue #4682b4
        steelblue1 #63b8ff
        steelblue2 #5cacee
        steelblue3 #4f94cd
        steelblue4 #36648b
        tan #d2b48c
        tan1 #ffa54f
        tan2 #ee9a49
        tan3 #cd853f
        tan4 #8b5a2b
        thistle #d8bfd8
        thistle1 #ffe1ff
        thistle2 #eed2ee
        thistle3 #cdb5cd
        thistle4 #8b7b8b
        tomato #ff6347
        tomato1 #ff6347
        tomato2 #ee5c42
        tomato3 #cd4f39
        tomato4 #8b3626
        turquoise #40e0d0
        turquoise1 #00f5ff
        turquoise2 #00e5ee
        turquoise3 #00c5cd
        turquoise4 #00868b
        violet #ee82ee
        violetred #d02090
        violetred1 #ff3e96
        violetred2 #ee3a8c
        violetred3 #cd3278
        violetred4 #8b2252
        wheat #f5deb3
        wheat1 #ffe7ba
        wheat2 #eed8ae
        wheat3 #cdba96
        wheat4 #8b7e66
        white #ffffff
        whitesmoke #f5f5f5
        yellow #ffff00
        yellow1 #ffff00
        yellow2 #eeee00
        yellow3 #cdcd00
        yellow4 #8b8b00
        yellowgreen #9acd32
 "