Gtk2-Ex-DbLinker-DbTools

 view release on metacpan or  search on metacpan

lib/Gtk2/Ex/DbLinker/AbForm.pm  view on Meta::CPAN

package Gtk2::Ex::DbLinker::AbForm;
use Class::InsideOut qw(public private register id);
use Gtk2::Ex::DbLinker::DbTools;
use Scalar::Util qw(weaken);
use Log::Any;
#use Carp 'croak';
our $VERSION = $Gtk2::Ex::DbLinker::DbTools::VERSION;
=head1 NAME

Gtk2::Ex::DbLinker::AbForm - Common methods for Gtk2::Ex::DbLinker::Form and Wx::Perl::DbLinker::Wxform

=head1 SYNOPSIS

See L<Gtk2::Ex::DbLinker::Form> and L<Wx::Perl::DbLinker::Wxform>. The methods in this module are not supposed to be called directly. But they are commented here.

=cut

use strict;
use warnings;
#use Data::Dumper;
use DateTime::Format::Strptime;
use Carp qw(confess croak);

private data_manager => my %dman;
public child_class => my %child_class;
private log => my %log;
private event => my %events;
private states => my %states;
private widgets => my %widgets;

my @arg_names;

sub new {

    my $class = shift;
    my $self = \( my $scalar );
    bless $self, $class;
     register $self;
 weaken $self;
    my $id = id $self;
    my @arg   = @_;
    my $def   = {};
    my $arg_value_ref  = { ( %$def, @arg ) };

    my $arg_holder_ref = { 
        childclass=> \%child_class, 
        data_manager=> \%dman,
        datawidgets => \$widgets{ $id}->{cols},
        datawidgets_ro => \$widgets{ $id}->{datawidgets_ro},
        builder => \$widgets{ $id }->{builder}, 
        on_current => \$events{ $id }->{on_current},
        date_formatters => \$widgets{ $id }->{date_formatters},
        time_zone => \$widgets{ $id }->{time_zone},
        locale => \$widgets{ $id }->{locale},
        rec_spinner_callback => \$events{ $id }->{rec_spinner_callback},
        rec_spinner_insert_callback => \$events{ $id}->{rec_spinner_insert_callback},

    } ;

     @arg_names = keys %{$arg_holder_ref};

    for my $name (@arg_names){
        next unless defined ($arg_value_ref->{$name});

        if (ref $arg_holder_ref->{$name} eq "HASH"){
            $arg_holder_ref->{$name}->{ $id } = $arg_value_ref->{$name};
        } 
        #elsif (ref $arg_holder_ref->{$name} eq "ARRAY") {

        #} 
        else {
           ${$arg_holder_ref->{$name} } =  $arg_value_ref->{$name};
        
        }
    
    }
    #$log{ $id } = Log::Log4perl->get_logger(__PACKAGE__);
    $log{ $id } = Log::Any->get_logger();
        my @dates;

    #$self->{subform} = [];

    #my %formatters_db;
    #my %formatters_f;
    # $self->{dates_formatted} = \(keys %{$self->{date_formatters}});
    if ( !defined $widgets{ $id }->{cols} ) {
        my @col = $dman{ $id }->get_field_names;
        $widgets{ $id }->{cols} = \@col;
    }
    foreach my $v ( keys %{ $widgets{ $id }->{date_formatters} } ) {
        $log{ $id }->debug( "** " . $v . " **" );
        push @dates, $v;
    }
    $widgets{ $id }->{dates_formatted} = \@dates;
    my %hdates = map { $_ => 1 } @dates;
    $widgets{ $id }->{hdates_formatted} = \%hdates;
    $widgets{ $id }->{dates_formatters} = {};
    $states{ $id }->{inserting}        = 0;
    $widgets{ $id }->{pos2del}          = [];

    #bless $self, $class;
   return $self;
}

sub _super_args_needed {
        return @arg_names;
}

=head2 C<set_data_manager( $dman ) >

Replaces the current data manager with the one receives. The columns should not changed, but this method can be use to change the join clause. 

=cut

sub set_data_manager {
    my ( $self, $dman ) = @_;
    $dman{ id $self } = $dman;
}

=head2 C<add_childform( $childform )>

You may add any dependant form or datasheet object with this call if you want that a changed in this subform/datasheet be applied when the apply method of this form is called. 

=cut

sub add_childform {
    my ( $self, $sf ) = @_;
    my $id = id $self;
    $log{ $id }->warn(
        "add_childform : do not set auto_apply to 0 if you call this method")
      unless ( $states{ $id }->{auto_apply} );

#carp("add_childform : do not set auto_apply to 0 if you call this method")  unless ($self->{auto_apply});
    push @{ $widgets{ $id }->{subform} }, $sf;
    weaken @{ $widgets{ $id }->{subform} }[-1];


}

sub _init {
    my $self = shift;
    my $id = id $self;
    if ( defined $widgets{ $id }->{datawidgets_ro} ) {
        my %seen;
        %seen = map { $_ => $seen{$_}++ }
          ( @{ $widgets{ $id }->{cols} }, @{ $widgets{ $id }->{datawidgets_ro} } );
        my @fields_to_save = grep { $seen{$_} < 1 } keys %seen;

        #$log{ $id }->debug("cols: " . join(" ", @{$self->{cols}}));
        $log{ $id }->debug( "cols to saved: " . join( " ", @fields_to_save ) );
        $widgets{ $id }->{col2save} = \@fields_to_save;

    } else {
        $widgets{ $id }->{col2save} = $widgets{ $id }->{cols};

    }

}

sub _painting {
    my $self = shift;
    my $idob = id $self;
    $states{ $idob}->{painting} = $_[0] if (defined $_[0]);
    return  $states{ $idob}->{painting};

}

sub _changed {
    my $self = shift;
    my $idob = id $self;
    $states{ $idob}->{changed} = $_[0] if (defined $_[0]);
    return  $states{ $idob }->{changed};

}

sub _builder {
    my $self = shift;
    my $idob = id $self;
    $widgets{ $idob}->{builder} = $_[0] if (defined $_[0]);
    return  $widgets{ $idob}->{builder};

}
#this datawidgets hash has nothing to do with the argument datawidgets 
#used in new ... it just shows my lake of imagination
sub _datawidgets {
    my $self = shift;
    my $idob = id $self;
    $widgets{ $idob}->{datawidgets}->{ $_[0]} = $_[1] if (defined $_[1]);
    return  $widgets{ $idob}->{datawidgets}->{ $_[0] } if (defined $_[0]); 
    return  $widgets{ $idob}->{datawidgets};

}
sub _datawidgetsName {
    my $self = shift;
    my $idob = id $self;



( run in 1.191 second using v1.01-cache-2.11-cpan-0bb4e1dffa6 )