Wx-Perl-DbLinker

 view release on metacpan or  search on metacpan

lib/Wx/Perl/DbLinker/Wxform.pm  view on Meta::CPAN


package Wx::Perl::DbLinker::Wxform;
use Class::InsideOut qw(public private register id);
use Wx::Perl::DbLinker;
our $VERSION = $Wx::Perl::DbLinker::VERSION;

use strict;
use warnings;
use parent 'Gtk2::Ex::DbLinker::AbForm';

use Carp qw(croak confess carp);
use Log::Any;
#use DateTime::Format::Strptime;
#use Data::Dumper;
use Scalar::Util qw( weaken );
use Wx qw[:everything];

#EVT_DATAVIEW_ITEM_VALUE_CHANGED
use Wx::Event
  qw[EVT_TEXT EVT_LIST_ITEM_SELECTED EVT_COMBOBOX EVT_LISTBOX &EVT_CHECKBOX EVT_RADIOBUTTON EVT_SPINCTRL  EVT_TEXT_ENTER];

#my %pos_seen;

my %signals = (

    'Wx::TextEntry'   => \&EVT_TEXT,
    'Wx::ComboBox'    => \&EVT_COMBOBOX,
    'Wx::CheckBox'    => \&EVT_CHECKBOX,
    'Wx::SpinCtrl'    => \&EVT_SPINCTRL,
    'Wx::TextCtrl'    => \&EVT_TEXT,
    'Wx::ListCtrl'    => \&EVT_LIST_ITEM_SELECTED,
    'Wx::ListBox'     => \&EVT_LISTBOX,
    'Wx::RadioButton' => \&EVT_RADIOBUTTON,
);

#
#coderef to place the value of record x in each field, combo, toggle...
#'Wx::DataViewListCtrl' => \&_set_combo,
my %setter = (
    'Wx::TextCtrl'    => \&_set_entry,
    'Wx::RadioButton' => \&_set_check,
    'Wx::ComboBox'    => \&_set_combo,
    'Wx::CheckBox'    => \&_set_check,
    'Wx::SpinButton'  => \&_set_spinbutton,
    'Wx::ListCtrl'    => \&_set_combo,
    'Wx::ListBox'     => \&_set_combo,

);

my %getter = (
    'Wx::TextCtrl' => sub { my ( $self, $w, $id ) = @_; return $w->GetValue; },
    'Wx::ToggleButton' =>
      sub { my ( $self, $w, $id ) = @_; return $w->GetValue; },
    'Wx::ComboBox' => sub {
        my ( $self, $w, $id ) = @_;
        return $self->_get_combobox_selectedvalue($id);
    },
    'Wx::ListBox' => sub {
        my ( $self, $w, $id ) = @_;
        return $self->_get_combobox_selectedvalue($id);
    },
    'Wx::CheckBox' => sub {
        my ( $self, $w, $id ) = @_;
        return $w->IsChecked;
    },
    'Wx::SpinButton' => sub {
        my ( $self, $w, $id ) = @_;
        return $w->IsChecked;
    },
    'Wx::ListCtrl' => sub {
        my ( $self, $w, $id ) = @_;
        $self->_get_combobox_selectedvalue($id);
    },

);

private log => my %log;
private event => my %events;
# private states => my %states;
private widgets => my %widgets;
private fields_with_event => my %ecols;
private is_with_event => my %is_ecols;
private datawidgets_value => my %datawidgets_value;
private datawidgets_pos => my %datawidgets_pos;
private combos => my %combos;

sub new {
    my $class = shift;

    #my $class, $req)=@_;
    my %def = (
        null_string     => "null",
        rec_spinner     => "RecordSpinner",
        status_label    => "lbl_RecordStatus",
        rec_count_label => "lbl_RecordCount",
        locale          => "fr_CH",
        auto_apply      => 1
    );

    my %arg = ( ref $_[0] eq "HASH" ? ( %def, %{ $_[0] } ) : ( %def, @_ ) );
   
    my $self = $class->SUPER::new(
        childclass           => __PACKAGE__,
         data_manager => $arg{data_manager},
        builder => $arg{builder},
        datawidgets => $arg{datawidgets},
        datawidgets_ro => $arg{datawidgets_ro},
        on_current => $arg{on_current},
        date_formatters => $arg{date_formatters},
        datawidgets_ro => $arg{datawidgets_ro},
        time_zone => $arg{time_zone},
        locale => $arg{locale},
        rec_spinner_callback => sub {
            my $self = shift;
             my $id = id $self;
            return unless $widgets{ $id }->{rec_spinner};
            $widgets{ $id }->{rec_spinner}->SetValue( $self->_pos + 1 );
        },
        rec_spinner_insert_callback => sub {
            my ( $self, $new_pos ) = @_;
             my $id = id $self;
            return unless $widgets{ $id }->{rec_spinner};
            my $first = ( $self->_pos < 0 ? 0 : 1 );
            $widgets{ $id }->{rec_spinner}->SetRange( $first, $new_pos + 1 );
            $widgets{ $id }->{rec_spinner}->SetValue( $new_pos + 1 );
        },
    );
    register $self;
     my $ido = id $self;
      delete @arg{ $self->_super_args_needed };
      # @$self{qw(dman cols ecols)} = delete @arg{qw(data_manager datawidgets datawidgets_changed)};
      #@$self{ keys %arg } = values(%arg);

lib/Wx/Perl/DbLinker/Wxform.pm  view on Meta::CPAN


        #print "value: $x selected : ", $w->GetSelectedItemCount, "\n";

        my $item = $w->FindItem( -1, $x );

        $w->SetItemState( $item, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED );
    } elsif ( $name eq "Wx::ComboBox" || $name eq "Wx::ListBox" ) {
        confess($log{$id }->error( "undef datawidgetsPos  for ", $id ))
        unless ( $datawidgets_pos{ $ido }->{$id} );
        #unless ( $self->{datawidgetsPos}->{$id} );
        #my %idpos = %{ $self->{datawidgetsPos}->{$id} };
        my %idpos = %{ $datawidgets_pos{ $ido }->{$id} };

        my $i = $idpos{$x} if ( defined $x );
        $log{ $ido }
          ->debug( "_set_combo pos is " . ( defined $i ? $i : " undef" ) );

        # $w->SetSelection(wxNOT_FOUND);
        if ( defined $i ) {
            $w->SetSelection($i);
        } else {
            $w->SetSelection(wxNOT_FOUND);
        }

        # $log{ $id }->debug($w->GetStringSelection);

    }
}

sub _set_check {
    my ( $self, $w, $x, $id ) = @_;
    $w->SetValue($x);
}

#$comboid is the combo id and the field name in the table that received the value selected in the combo
# $field[1] is the name of the field that is displayed in the combo
# $field[0] is the field name of the values returned from the combo
sub _on_combo_newval {
    my ( $self, $comboid, $frame, $event ) = @_;
     my $id = id $self;
    my $value = $event->GetString;
    $log{ $id }->debug( "combo_newval: " . $value );
    $value = ( $value eq "" ? undef : $value );
    return unless ( defined $value );
    my $href   = $combos{ $id }->{$comboid};
    my $dman   = $href->{dman};
    my @fields = @{ $href->{fields} };
    $dman->new_row;
    $dman->set_field( $fields[1], $value );
    $dman->save;
    $self->add_combo(
        {
            data_manager => $dman,
            fields       => $href->{fields},
            id           => $comboid,
            init         => 0
        }
    );
}

sub _get_combobox_selectedvalue {
    my ( $self, $id ) = @_;
     my $ido = id $self;
    confess($log{$id }->error("id undef")) unless ( defined $id );
   
    my $w    = $self->_datawidgets( $id );
    my $name = $self->_datawidgetsName( $id );
    my $x;

    if ( $name eq "Wx::ListCtrl" ) {
        $x =
          (   $datawidgets_value{ $ido }->{$id}
            ? $datawidgets_value{ $ido }->{$id}
            : undef );
    } elsif ( $name eq "Wx::ComboBox" || $name eq "Wx::ListBox" ) {

        my $pos = $w->GetSelection();

        #die ((($pos == wxNOT_FOUND) ? "not": "") . " found");
        #$log{ $id }->debug ("id : ", $id, " pos ", $pos);
        #$log{ $id }->debug(  $self->{datawidgetsValue}->{$id}->{$pos});

        $x =
          ( $pos == wxNOT_FOUND )
          ? undef
          : $datawidgets_value{ $ido }->{$id}->{$pos};

    }
    $log{ $ido }->debug( "_get_combobox_selectedvalue: found "
          . ( defined $x ? $x : " undef" ) );
    return $x;
}

sub _set_spinbutton {
    my ( $self, $w, $x ) = @_;
     my $id = id $self;
=for comment
    if ( $self->getID($w) eq $self->getID( $widgets{ $id }->{rec_spinner} ) ) {
        $log{ $id }->debug("Found record_spinner... leaving");
        return;
    }
=cut
    $w->SetValue( $x || 0 );

}

sub _change_values {
    my ( $self, $fieldname, $w, $frame, $event ) = @_;
 my $id = id $self;
    #my $name = ref $w;
    my $name = $self->_datawidgetsName($fieldname);
    $log{ $id }->debug("self->changed for $fieldname ($name)");
    die ("$fieldname without type") unless defined $name;
    if ( $name eq "Wx::ListCtrl" ) {
        print "text: ", $event->GetText, "Index: ", $event->GetIndex, "Data: ",
          $event->GetData, "\n";
        $datawidgets_value{ $id }->{$fieldname} = $event->GetText;

    }
    if ( $is_ecols{ $id }->{$fieldname} ) {
        my $coderef = $ecols{ $id }->{$fieldname};
        &$coderef( $w, $event );
    }
    if ( !$self->_painting ) {
        $self->_changed(1);
        if ( $events{$id}->{on_change} ) {
            $events{$id}->{on_change}();
        }
        $self->_set_record_status_label;
    }
    return 0;

}

sub _on_selected {
    my ( $self, $id, $list, $event ) = @_;
 my $ido = id $self;
#print Dumper $self;
#print "_on_selected: name: ", ref $list, "\n";
#print "text: " , $event->GetText, "Index: ", $event->GetIndex, "Data: ", $event->GetData, "\n";
    if ( $self->_datawidgetsName( $id  ) eq "Wx::ListCtrl" ) {
        $datawidgets_value{ $ido }->{$id} = $event->GetText;
    } else {
        croak($log{$id }->error(  "_on_selected not implemented for $id ("
              . $self->_datawidgetsName($id)
              . ")" ));
    }

}



( run in 1.669 second using v1.01-cache-2.11-cpan-2398b32b56e )