? ipentry-variable.patch.txt Index: ipentry.man =================================================================== RCS file: /cvsroot/tcllib/tklib/modules/ipentry/ipentry.man,v retrieving revision 1.4 diff -u -r1.4 ipentry.man --- ipentry.man 16 Mar 2005 05:59:20 -0000 1.4 +++ ipentry.man 2 Feb 2006 18:18:46 -0000 @@ -1,9 +1,9 @@ [comment {-*- tcl -*- doctools manpage}] -[manpage_begin ipentry n 0.1] +[manpage_begin ipentry n 0.2] [moddesc {An IP address entry widget}] [titledesc {An IP address entry widget}] [require Tcl 8.4] -[require ipentry [opt 0.1]] +[require ipentry [opt 0.2]] [description] This package provides a widget for the entering of a IP address. It @@ -63,6 +63,10 @@ [list_begin tkoption] +[tkoption_def -textvariable textvariable Variable] + +The name of a variable which holds the value of the IP address. The value must be a string of the form NNN.NNN.NNN.NNN or it will be modified to represent a valid IP address. + [tkoption_def -state state State] Specifies one of three states for the entry: [const normal], Index: ipentry.tcl =================================================================== RCS file: /cvsroot/tcllib/tklib/modules/ipentry/ipentry.tcl,v retrieving revision 1.9 diff -u -r1.9 ipentry.tcl --- ipentry.tcl 1 Jun 2005 02:37:51 -0000 1.9 +++ ipentry.tcl 2 Feb 2006 18:18:46 -0000 @@ -10,7 +10,7 @@ # RCS: @(#) $Id: ipentry.tcl,v 1.9 2005/06/01 02:37:51 andreas_kupries Exp $ package require Tk -package provide ipentry 0.1 +package provide ipentry 0.2 namespace eval ::ipentry { namespace export ipentry @@ -43,7 +43,8 @@ destroy $w.d4 rename ::$w ::ipentry::_$w interp alias {} ::$w {} ::ipentry::widgetCommand $w - bind $w [list rename ::$w {}] + namespace eval _tvns$w {variable textvarname} + bind $w [list ::ipentry::destroyWidget $w] #bind $w [list focus $w.0] if {[llength $args] > 0} { eval [list $w configure] $args @@ -196,10 +197,19 @@ } proc ::ipentry::cget {w cmd} { - switch -exact -- [lindex $args 0] { + switch -exact -- $cmd { -bd - -relief { - return [::ipentry::_$w cget [lindex $args 0]] + return [::ipentry::_$w cget $cmd] + } + -textvariable { + namespace eval _tvns$w { + if { [info exists textvarname] } { + return $textvarname + } else { + return {} + } + } } default { return [$w.0 cget $cmd] @@ -265,6 +275,26 @@ foreach x {0 1 2 3} { $w.$x configure $cmd [lindex $args 1] } set args [lrange $args 2 end] } + -textvariable { + namespace eval _tvns$w { + if { [info exists textvarname] } { + set _w [join [lrange [split [namespace current] .] 1 end] .] + trace remove variable $textvarname \ + [list array read write unset] \ + [list ::ipentry::traceVar .$_w] + } + } + set _tvns[set w]::textvarname [lindex $args 1] + upvar #0 [lindex $args 1] var + if { [info exists var] && [isValid $var] } { + $w insert [split $var .] + } else { + set var {} + } + trace add variable var [list array read write unset] \ + [list ::ipentry::traceVar $w] + set args [lrange $args 2 end] + } default { error "unknown option \"[lindex $args 0]\"" } @@ -272,6 +302,64 @@ } } +proc ::ipentry::destroyWidget {w} { + upvar #0 [$w cget -textvariable] var + trace remove variable var [list array read write unset] \ + [list ::ipentry::traceVar $w] + namespace forget _tvns$w + rename $w {} +} + +proc ::ipentry::traceVar {w varname key op} { + upvar #0 $varname var + + if { $op == "write" } { + if { $key != "" } { + $w insert [split $var($key) .] + } else { + $w insert [split $var .] + } + } + + if { $op == "unset" } { + if { $key != "" } { + trace add variable var($key) [list array read write unset] \ + [list ::ipentry::traceVar $w] + } else { + trace add variable var [list array read write unset] \ + [list ::ipentry::traceVar $w] + } + } + + set val [join [$w get] .] + if { ![isValid $val] } { + set val {} + } + if { $key != "" } { + set var($key) $val + } else { + set var $val + } + +} + +proc ::ipentry::isValid {val} { + set lval [split [join $val] {. }] + set valid 1 + if { [llength $lval] != 4 } { + set valid 0 + } else { + foreach n $lval { + if { $n == "" || ![string is integer -strict $n] + || $n > 255 || $n < 0 } { + set valid 0 + break + } + } + } + return $valid +} + proc ::ipentry::widgetCommand {w cmd args} { switch -exact -- $cmd { get { @@ -290,8 +378,8 @@ error "cannot insert non-numeric arguments" } if {$n > 255} { set n 255 } - if {$n < 0} { set n 0 } - if {$x == 0 && $n < 1} { set n 1 } + if {$n <= 0} { set n 0 } + #if {$x == 0 && $n < 1} { set n 1 } } $w.$x delete 0 end $w.$x insert 0 $n Index: pkgIndex.tcl =================================================================== RCS file: /cvsroot/tcllib/tklib/modules/ipentry/pkgIndex.tcl,v retrieving revision 1.2 diff -u -r1.2 pkgIndex.tcl --- pkgIndex.tcl 28 Jul 2003 06:50:59 -0000 1.2 +++ pkgIndex.tcl 2 Feb 2006 18:18:46 -0000 @@ -9,5 +9,5 @@ # full path name of this file's directory. if { ![package vsatisfies [package provide Tcl] 8.4] } { return } -package ifneeded ipentry 0.1 [list source [file join $dir ipentry.tcl]] +package ifneeded ipentry 0.2 [list source [file join $dir ipentry.tcl]]