#############################################################################
## Name: lib/Wx/DemoModules/wxValidator.pm
## Purpose: wxPerl demo helper
## Author: Mattia Barbon
## Modified by:
## Created: 15/08/2005
## RCS-ID: $Id: wxValidator.pm 2189 2007-08-21 18:15:31Z mbarbon $
## Copyright: (c) 2005-2006 Mattia Barbon
## Licence: This program is free software; you can redistribute it and/or
## modify it under the same terms as Perl itself
#############################################################################
package Wx::DemoModules::wxValidator;
use strict;
use base qw(Wx::Panel Class::Accessor::Fast);
use Wx::Event qw(EVT_BUTTON);
use Wx::Perl::TextValidator;
__PACKAGE__->mk_ro_accessors( qw(numeric string) );
sub new {
my $class = shift;
my $self = $class->SUPER::new( $_[0], -1 );
# filtered text controls
my $numval = Wx::Perl::TextValidator->new( '\d' );
my $charval = Wx::Perl::TextValidator->new( qr/[a-zA-z ]/ );
Wx::StaticText->new( $self, -1, 'Type numbers', [10, 10] );
my $t1 = $self->{numeric} = Wx::TextCtrl->new( $self, -1, '', [10, 30] );
Wx::StaticText->new( $self, -1, 'Type spaces/letters', [10, 60] );
my $t2 = $self->{string} = Wx::TextCtrl->new( $self, -1, '', [10, 80] );
$t1->SetValidator( $numval );
$t2->SetValidator( $charval );
EVT_BUTTON( $self, Wx::Button->new( $self, -1, 'Validator and dialog',
[10, 120] ),
sub { Wx::DemoModules::wxValidator::Dialog
->new( $self )->ShowModal } );
EVT_BUTTON( $self, Wx::Button->new( $self, -1, 'Validator and frame',
[150, 120] ),
sub { Wx::DemoModules::wxValidator::Frame
->new( $self )->Show( 1 ) } );
return $self;
}
sub add_to_tags { qw(misc) }
sub title { 'wxValidator' }
package Wx::DemoModules::wxValidator::Validator;
use strict;
use base qw(Wx::Perl::TextValidator);
# trivial class, just to log method calls
sub Validate {
my $self = shift;
Wx::LogMessage( "In Validate(): data is '%s'",
$self->GetWindow->GetValue );
return $self->SUPER::Validate( @_ );
}
sub TransferFromWindow {
my $self = shift;
Wx::LogMessage( "In TransferFromWindow(): data is '%s'",
$self->GetWindow->GetValue );
return $self->SUPER::TransferFromWindow( @_ );
}
sub TransferToWindow {
my $self = shift;
# peeking at internals; naughty me...
Wx::LogMessage( "In TransferToWindow(): data is '%s'",
${$self->{data}} );
return $self->SUPER::TransferToWindow( @_ );
}
package Wx::DemoModules::wxValidator::Dialog;
use strict;
use base qw(Wx::Dialog);
use Wx qw(wxID_OK wxID_CANCEL);
sub new {
my( $class, $parent ) = @_;
my $self = $class->SUPER::new( $parent, -1, 'Dialog' );
$self->{data} = $parent->numeric->GetValue;
# simple numeric validator
my $numval = Wx::DemoModules::wxValidator::Validator
->new( '\d', \($self->{data}) );
Wx::StaticText->new( $self, -1, 'Type numbers', [10, 10] );
my $t1 = Wx::TextCtrl->new( $self, -1, '', [10, 30] );
$t1->SetValidator( $numval );
# the validation/data transfer phase are automatic for a
# dialog where the Ok button has ID wxID_OK, otherwise
# an explicit call to Validate/TransferDataFromWindow is required
# when closing the dialog
Wx::Button->new( $self, wxID_OK, "Ok", [10, 60] );
Wx::Button->new( $self, wxID_CANCEL, "Cancel", [100, 60] );
return $self;
}
sub get_data { $_[0]->{data} }
package Wx::DemoModules::wxValidator::Frame;
use strict;
use base qw(Wx::Frame);
use Wx::Event qw(EVT_BUTTON);
sub new {
my( $class, $parent ) = @_;
my $self = $class->SUPER::new( $parent, -1, 'Frame' );
$self->{data} = $parent->string->GetValue;
my $strval = Wx::DemoModules::wxValidator::Validator
->new( '[a-zA-Z ]', \($self->{data}) );
Wx::StaticText->new( $self, -1, 'Type spaces/letters', [10, 10] );
my $t1 = Wx::TextCtrl->new( $self, -1, '', [10, 30] );
$t1->SetValidator( $strval );
EVT_BUTTON( $self, Wx::Button->new( $self, -1, "Ok", [10, 60] ),
sub {
if( !$self->Validate ) {
Wx::LogMessage( "Data is invalid" );
return;
}
if( !$self->TransferDataFromWindow ) {
Wx::LogMessage( "Error in data transfer" );
return;
}
$self->Destroy;
} );
EVT_BUTTON( $self, Wx::Button->new( $self, -1, "Cancel", [100, 60] ),
sub {
$self->Destroy;
} );
$self->TransferDataToWindow;
return $self;
}
sub get_data { $_[0]->{data} }
1;