# $Id: NumEntryPlain.pm,v 1.5 2000/10/22 17:12:09 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.5 $ =~ /(\d+)\.(\d+)/); Construct Tk::Widget 'NumEntryPlain'; sub ClassInit { my ($class,$mw) = @_; $class->SUPER::ClassInit($mw); $mw->bind($class,'', 'Leave'); $mw->bind($class,'', 'Leave'); $mw->bind($class,'', 'Return'); $mw->bind($class,'', 'Up'); $mw->bind($class,'', 'Down'); $mw->bind($class,'', 'Home'); $mw->bind($class,'', 'End'); $mw->bind($class,'', 'Prior'); $mw->bind($class,'', '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 ], -increment => [PASSIVE => undef, undef, 1 ], -bigincrement => [PASSIVE => undef, undef, undef ], ); } ## 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 += $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); } 1; __END__ =head1 NAME Tk::NumEntryPlain - A numeric entry widget =head1 SYNOPSIS S< >B; =head1 DESCRIPTION B defines a widget for entering integer numbers. B supports all the options and methods that a normal L widget provides, plus the following options =head1 STANDARD OPTIONS B<-repeatdelay> B<-repeatinterval> =head1 WIDGET-SPECIFIC OPTIONS =over 4 =item -minvalue Defines the minimum legal value that the widget can hold. If this value is C then there is no minimum value (default = undef). =item -maxvalue Defines the maximum legal value that the widget can hold. If this value is C then there is no maximum value (default = undef). =item -bell 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). =item -textvariable Reference to a scalar variable that contains the value currently in the B. Use the variable only for reading (see L<"CAVEATS"> below). =item -value Specifies the value to be inserted into the entry widget. Similar to the standard B<-text> option, but will perform a range check on the value. =back =head1 WIDGET METHODS =over 4 =item I<$numentry>->B(I) Increment the value of the entry widget by the specified increment. If increment is 0, then perform a range check. =back =head1 CAVEATS =over 4 =item -textvariable B<-textvariable> should only be used to read out the current value in the B. Values set via B<-textvariable> are not valided. Therefore it's possible to insert, e.g., 'abc', into the B. =back =head1 SEE ALSO L L =head1 HISTORY The code was extracted from B and slightly modified by Achim Bohnet Each@mpe.mpg.deE. B's author is Graham Barr Egbarr@pobox.comE. Current maintainer is Slaven Rezic Eeserte@cs.tu-berlin.deE. =head1 COPYRIGHT 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. =cut