| Tk-GBARR documentation | Contained in the Tk-GBARR distribution. |
Tk::NumEntryPlain - A numeric entry widget
use Tk::NumEntryPlain;
Tk::NumEntryPlain defines a widget for entering integer numbers.
Tk::NumEntryPlain supports all the options and methods that a normal Entry widget provides, plus the following options
-repeatdelay -repeatinterval
Defines the minimum legal value that the widget can hold. If this
value is undef then there is no minimum value (default = undef).
Defines the maximum legal value that the widget can hold. If this
value is undef then there is no maximum value (default = undef).
Specifies a boolean value. If true then a bell will ring if the user attempts to enter an illegal character into the entry widget, and when the user reaches the upper or lower limits when using the up/down buttons for keys (default = true).
Reference to a scalar variable that contains the value currently in the NumEntry. Use the variable only for reading (see "CAVEATS" below).
Specifies the value to be inserted into the entry widget. Similar to the standard -text option, but will perform a range check on the value.
A callback which is called if <Return> is pressed.
A callback which is called every time an increment or decrement happens in the entry widget.
Increment the value of the entry widget by the specified increment. If increment is 0, then perform a range check.
-textvariable should only be used to read out the current value in the NumEntry.
Values set via -textvariable are not valided. Therefore it's possible to insert, e.g., 'abc', into the NumEntry.
The code was extracted from Tk::NumEntry and slightly modified by Achim Bohnet <ach@mpe.mpg.de>. Tk::NumEntry's author is Graham Barr <gbarr@pobox.com>.
Current maintainer is Slaven Rezic <slaven@rezic.de>.
Copyright (c) 1997-1998 Graham Barr. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
| Tk-GBARR documentation | Contained in the Tk-GBARR distribution. |
# $Id: NumEntryPlain.pm,v 1.10 2003/10/22 21:32:59 eserte Exp $ package Tk::NumEntryPlain; use Tk (); use Tk::Derived; use Tk::Entry; use strict; use vars qw(@ISA $VERSION); @ISA = qw(Tk::Derived Tk::Entry); $VERSION = sprintf("%d.%02d", q$Revision: 1.10 $ =~ /(\d+)\.(\d+)/); Construct Tk::Widget 'NumEntryPlain'; sub ClassInit { my ($class,$mw) = @_; $class->SUPER::ClassInit($mw); $mw->bind($class,'<Leave>', 'Leave'); $mw->bind($class,'<FocusOut>', 'Leave'); $mw->bind($class,'<Return>', 'Return'); $mw->bind($class,'<Up>', 'Up'); $mw->bind($class,'<Down>', 'Down'); $mw->bind($class,'<Home>', 'Home'); $mw->bind($class,'<End>', 'End'); $mw->bind($class,'<Prior>', 'Prior'); $mw->bind($class,'<Next>', 'Next'); } ## Bindings callbacks sub Leave { my $e = shift; $e->incdec(0); # range check } sub Return { my $e = shift; my $v = $e->value; # range check $e->Callback(-command => $v); } sub Up { my $e = shift; $e->incdec($e->cget(-increment)); } sub Down { my $e = shift; $e->incdec(-$e->cget(-increment)); } sub Prior { my $e = shift; $e->incdec($e->cget(-bigincrement) || 1); } sub Next { my $e = shift; $e->incdec(-($e->cget(-bigincrement) || 1)); } sub Insert { my($e,$c) = @_; my $dot = ($e->cget(-increment) =~ /\./ ? '.' : ''); if($c =~ /^[-0-9$dot]$/) { $e->SUPER::Insert($c); } elsif(defined($c) && length($c)) { $e->_ringBell; } } sub Home { my $e = shift; my $min_val = $e->cget(-minvalue); return unless defined $min_val; $e->value($min_val); } sub End { my $e = shift; my $max_val = $e->cget(-maxvalue); return unless defined $max_val; $e->value($max_val); } ## Widget constructor sub Populate { my ($e, $args) = @_; # $e->SUPER::Populate($args); $e->ConfigSpecs( -value => [METHOD => undef, undef, "0" ], -defaultvalue => [PASSIVE => undef, undef, undef ], -maxvalue => [PASSIVE => undef, undef, undef ], -minvalue => [PASSIVE => undef, undef, undef ], -bell => [PASSIVE => "bell", "Bell", 1 ], -command => [CALLBACK => undef, undef, undef ], -browsecmd => [CALLBACK => undef, undef, undef ], -increment => [PASSIVE => undef, undef, 1 ], -bigincrement => [PASSIVE => undef, undef, undef ], ($Tk::platform eq 'MSWin32' ? (-background => ['PASSIVE', qw/background Background/, undef]) : ()), DEFAULT => [$e], ); } ## Options implementation sub value { my $e = shift; my $old; if(@_) { my $new = 0 + shift; my $pos = $e->index('insert'); $old = $e->get; $e->delete(0,'end'); $e->insert(0,$new); $e->icursor($pos); } else { $e->incdec(0); # range check $old = $e->get; } # Do a range check after all configuration has finished, # as we may not yet know the range $e->afterIdle([ $e => 'incdec', 0]); length($old) ? $old + 0 : $e->{Configure}{'-defaultvalue'}; } sub _ringBell { my $e = shift; my $v; return unless defined($v = $e->{Configure}{'-bell'}); $e->bell if(($v =~ /^\d+$/ && $v) || $v =~ /^true$/i); } sub incdec { my($e,$inc) = @_; my $val = $e->get; if($inc == 0 && $val =~ /^-?$/) { $val = ""; } else { my $min = $e->{Configure}{'-minvalue'}; my $max = $e->{Configure}{'-maxvalue'}; $val = 0 if !$val; $val += $inc; my $limit = undef; $limit = $val = $min if(defined($min) && $val < $min); $limit = $val = $max if(defined($max) && $val > $max); if(defined $limit) { $e->_ringBell if $inc; } } my $pos = $e->index('insert'); $e->delete(0,'end'); $e->insert(0,$val); $e->icursor($pos); $e->Callback(-browsecmd) if $inc; } 1; __END__