Wx-Perl-DataWalker-0.02/0000755000175000017500000000000011163644052013432 5ustar tseetseeWx-Perl-DataWalker-0.02/MANIFEST0000644000175000017500000000035611163644052014567 0ustar tseetseeChanges lib/Wx/Perl/DataWalker.pm lib/Wx/Perl/DataWalker/CurrentLevel.pm Makefile.PL MANIFEST This list of files script/dataWalker.pl t/Wx-Perl-DataWalker.t META.yml Module meta-data (added by MakeMaker) Wx-Perl-DataWalker-0.02/lib/0000755000175000017500000000000011163644052014200 5ustar tseetseeWx-Perl-DataWalker-0.02/lib/Wx/0000755000175000017500000000000011163644052014576 5ustar tseetseeWx-Perl-DataWalker-0.02/lib/Wx/Perl/0000755000175000017500000000000011163644052015500 5ustar tseetseeWx-Perl-DataWalker-0.02/lib/Wx/Perl/DataWalker/0000755000175000017500000000000011163644052017517 5ustar tseetseeWx-Perl-DataWalker-0.02/lib/Wx/Perl/DataWalker/CurrentLevel.pm0000644000175000017500000002706111163644035022476 0ustar tseetseepackage Wx::Perl::DataWalker::CurrentLevel; use 5.008001; use strict; use warnings; use Scalar::Util qw(blessed reftype weaken); use Wx; our $VERSION = '0.01'; our @ISA = qw(Wx::ListCtrl); use constant { DISPLAY_UNINITIALIZED => 0, DISPLAY_SCALAR => 1, DISPLAY_ARRAY => 2, DISPLAY_HASH => 3, DISPLAY_GLOB => 4, }; use constant GLOB_THINGS => [qw(NAME PACKAGE SCALAR ARRAY HASH CODE IO GLOB FORMAT)]; use Class::XSAccessor getters => { parent => 'parent', }, accessors => { show_size => 'show_size', show_recur_size => 'show_recur_size', }; require overload; sub new { my $class = shift; my ($parent, $id, $pos, $size) = @_; my $self = $class->SUPER::new( $parent, $id, $pos||Wx::wxDefaultPosition, $size||Wx::wxDefaultSize, Wx::wxLC_REPORT|Wx::wxLC_VIRTUAL ); $self->{parent} = $parent; weaken($self->{parent}); # Double-click a function name Wx::Event::EVT_LIST_ITEM_ACTIVATED( $self, $self, sub { $self->on_list_item_activated($_[1]); } ); my $imglist = $self->get_icon_list(); $self->AssignImageList($imglist, Wx::wxIMAGE_LIST_SMALL); $self->{show_size} = 0; $self->{show_recur_size} = 0; $self->{display_mode} = DISPLAY_UNINITIALIZED; $self->set_data(''); return $self; } sub refresh { my $self = shift; $self->set_data($self->{data}); } sub set_data { my $self = shift; my $data = shift; my $reftype = reftype($data); return() if defined $reftype and $reftype eq 'CODE'; $self->{data} = $data; delete $self->{hash_cache}; if (!$reftype) { $self->_set_scalar(); } elsif ($reftype eq 'HASH') { $self->_set_hash(); } elsif ($reftype eq 'ARRAY') { $self->_set_array(); } elsif ($reftype eq 'GLOB') { $self->_set_glob(); } else { $self->_set_scalar(); } $self->_set_width; return(1); } ##################################### # display methods sub OnGetItemText { my $self = shift; my $itemno = shift; my $colno = shift; my $data = $self->{data}; if ($self->{display_mode} == DISPLAY_SCALAR) { $colno == 0 and return reftype($data)||''; $colno == 1 and return blessed($data)||''; $colno == 2 and $self->show_size() and return $self->calc_size($$data); return defined($$data) ? overload::StrVal($$data) : 'undef'; } elsif ($self->{display_mode} == DISPLAY_ARRAY) { $colno == 0 and return $itemno; my $item = $data->[$itemno]; $colno == 1 and return reftype($item)||''; $colno == 2 and return blessed($item)||''; $colno == 3 and $self->show_size() and return $self->calc_size($item); return defined($item) ? overload::StrVal($item) : 'undef'; } elsif ($self->{display_mode} == DISPLAY_HASH) { my $key = $self->{hash_cache}[$itemno]; $colno == 0 and return $key; my $item = $data->{$key}; $colno == 1 and return reftype($item)||''; $colno == 2 and return blessed($item)||''; $colno == 3 and $self->show_size() and return $self->calc_size($item); return defined($item) ? overload::StrVal($item) : 'undef'; } elsif ($self->{display_mode} == DISPLAY_GLOB) { $colno == 0 and return GLOB_THINGS->[$itemno]; my $item = *{$data}{GLOB_THINGS->[$itemno]}; $colno == 1 and return reftype($item)||''; $colno == 2 and return blessed($item)||''; $colno == 3 and $self->show_size() and return $self->calc_size($item); return defined($item) ? overload::StrVal($item) : 'undef'; } } { # this is an optimization explicitly allowed according to the wx docs. my $undef_attr = Wx::ListItemAttr->new(); $undef_attr->SetTextColour(Wx::Colour->new("gray")); sub OnGetItemAttr { my $self = shift; my $itemno = shift; my $data = $self->{data}; # colour the undef's gray! if ($self->{display_mode} == DISPLAY_SCALAR) { return defined($$data) ? undef : $undef_attr; } elsif ($self->{display_mode} == DISPLAY_ARRAY) { my $item = $data->[$itemno]; return defined($item) ? undef : $undef_attr; } elsif ($self->{display_mode} == DISPLAY_HASH) { my $key = $self->{hash_cache}[$itemno]; my $item = $data->{$key}; return defined($item) ? undef : $undef_attr; } elsif ($self->{display_mode} == DISPLAY_GLOB) { my $item = *{$data}{GLOB_THINGS->[$itemno]}; return defined($item) ? undef : $undef_attr; } } } sub OnGetItemImage { my $self = shift; my $itemno = shift; my $data = $self->{data}; if ($self->{display_mode} == DISPLAY_SCALAR) { return $self->ref_to_icon(reftype($$data)); } elsif ($self->{display_mode} == DISPLAY_ARRAY) { my $item = $data->[$itemno]; return $self->ref_to_icon(reftype($item)); } elsif ($self->{display_mode} == DISPLAY_HASH) { my $key = $self->{hash_cache}[$itemno]; my $item = $data->{$key}; return $self->ref_to_icon(reftype($item)); } elsif ($self->{display_mode} == DISPLAY_GLOB) { my $item = *{$data}{GLOB_THINGS->[$itemno]}; return $self->ref_to_icon(reftype($item)); } return(-1); } sub calc_size { my $self = shift; my $data = shift; return( $self->show_recur_size() ? Devel::Size::total_size(\$data) : Devel::Size::size($data) ); } ###################### # setup the display data type sub _set_scalar { my $self = shift; $self->{display_mode} = DISPLAY_SCALAR; $self->ClearAll(); $self->SetItemCount(1); # reverse insert for extensibility $self->InsertColumn(0, "Value"); $self->InsertColumn(0, "Size") if $self->show_size(); $self->InsertColumn(0, "Class"); $self->InsertColumn(0, "RefType"); return(); } sub _set_hash { my $self = shift; $self->{display_mode} = DISPLAY_HASH; $self->ClearAll(); $self->SetItemCount(scalar keys %{$self->{data}}); $self->{hash_cache} = [sort keys %{$self->{data}}]; $self->InsertColumn(0, "Value"); $self->InsertColumn(0, "Size") if $self->show_size(); $self->InsertColumn(0, "Class"); $self->InsertColumn(0, "RefType"); $self->InsertColumn(0, "Key"); return(); } sub _set_array { my $self = shift; $self->{display_mode} = DISPLAY_ARRAY; $self->ClearAll(); $self->SetItemCount(scalar @{$self->{data}}); $self->InsertColumn(0, "Value"); $self->InsertColumn(0, "Size") if $self->show_size(); $self->InsertColumn(0, "Class"); $self->InsertColumn(0, "RefType"); $self->InsertColumn(0, "Index"); return(); } sub _set_glob { my $self = shift; $self->{display_mode} = DISPLAY_GLOB; $self->ClearAll(); $self->SetItemCount(scalar @{GLOB_THINGS()}); $self->InsertColumn(0, "Value"); $self->InsertColumn(0, "Size") if $self->show_size(); $self->InsertColumn(0, "Class"); $self->InsertColumn(0, "RefType"); $self->InsertColumn(0, "THING"); return(); } sub _set_width { my $self = shift; # Can't work in virtual mode... # foreach my $col (0..$cols-1) { # $self->SetColumnWidth( $col, Wx::wxLIST_AUTOSIZE ); # $self->SetColumnWidth( $col, 70 ) if $self->GetColumnWidth( $col ) < 70; # } my $widths; my $size = $self->show_size(); for ($self->{display_mode}) { if ($_ == DISPLAY_SCALAR) { $widths = [80, 90, $size?(100):(), 200]; } elsif ($_ == DISPLAY_ARRAY) { my $chars = length(scalar(@{$self->{data}})); $chars = 6 if $chars < 6; $widths = [$chars*11, 80, 90, $size?(100):(), 200]; } elsif ($_ == DISPLAY_HASH) { $widths = [100, 80, 90, $size?(100):(), 200]; } elsif ($_ == DISPLAY_GLOB) { $widths = [100, 80, 90, $size?(100):(), 200]; } } return() unless $widths; my $cols = $self->GetColumnCount(); foreach my $col (0..$cols-1) { $self->SetColumnWidth( $col, $widths->[$col] ); } } ################################### # event handlers sub on_list_item_activated { my $self = shift; my $event = shift; my $row = $event->GetIndex(); #my $col = $event->GetColumn(); my $key; for ($self->{display_mode}) { $_ == DISPLAY_SCALAR and $key = undef, last; $_ == DISPLAY_ARRAY and $key = $row, last; $_ == DISPLAY_HASH and $key = $self->{hash_cache}[$row], last; $_ == DISPLAY_GLOB and $key = GLOB_THINGS->[$row], last; } $self->parent->go_down($key); } ################################### # icon storage { my %icons = ( 'array' => <<'HERE', iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A /wD/oL2nkwAAAU1JREFUOMud0z1IllEYxvGfJPU2CE2FVENEFKQRGURbW7MEOjs1RGs01iBRi63R GO2tJUpTS1FDGBGCS5EfQ4RU9qFXy20d5PUtvOAM5zrX+Z/7fs552KJwLNwJL8Nq+BWWwnS4GgZ0 U9gT7taG9BjL4dLWzZ0wU4Gf4X64EPaF3eFQGA+zDehyC7hX5ocwoofCRFX5IwwJZ8JGWAun/IfC jTrwQXv6VBM4HubCSji/WXazfrC8ReFdTUaawOOm1xddAJ3yvgnfa9JpAl/LOxvOdQGMl/eqH33l 79qm5fVm436M4VZZt4WFop1ugtNNC8+7vIUv4cpm+GGZkw3gRHgTFusjroX3Bb4eBtsruViA1XDU ThSeFORtOLITwIEwX5DP4WYYDntrDIVr4XU4uR1kMDz9x4/0LBzuVUlfGA2PwsewHj7VwxrL3yv/ o99l+f7MpBeL2gAAAABJRU5ErkJggg== HERE 'scalar' => <<'HERE', iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A /wD/oL2nkwAAAMlJREFUOMulkysOwkAURU+LxIADjWMBSBy2LAAP1SwAywZIMKwC2SBI2AACNB9P QoIAEpKLeU0qWmZKJ3mZN5m5531mBhxDoF/7IRVHWBB1KNgI7rZ+CNaCAR4pxwIVmQ/gaodXgrb5 TUEkSHwAbxM1fJqYB9ga4CiYm98VBL6AjmCfU/9ZMPaFBIK+YGbiUwY0LVuSbJ6kmfwLqBvg4xLs BCNBKwXYdS7NvzgjZuyV08zYBegJFoKD4GmimyARRGXrr1X9jc5X+AVi1ZMjWoXKsgAAAABJRU5E rkJggg== HERE 'hash' => <<'HERE', iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A /wD/oL2nkwAAAOtJREFUOMvNk7FqAlEQRU8iWW20sEm37NcIgn+hEfINC1aBZbEUY8g/CP6OiE3U TohbJ3DT3MBj2V0tfdV9M+8OM4d5cBdHEAneBRfBt2AheCq9GQm2gqiqQCaQ4EXwav0W5DuCvWBQ 18HBpr7g2foryM8E66YRfm16ELSsf5xLBGdB3FTgFHTQtz46txGk1yDObRoLJta5YCjYCbqCpQFf DDyiBOlTUPjBStCzeViCPLXOrnWVCjYVkP9HPDSZY4NLKiA/hpDrCqwFs+B+vLkDwcBL0wlieRXk upXeCkaleFvwYciFdfs+PuIfzS2y8qBa0XcAAAAASUVORK5CYII= HERE 'code' => <<'HERE', iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A /wD/oL2nkwAAAOlJREFUOMvNk61OQ0EYRE8ABalAFIcAUxJwON4ARQIKAQ7NO+BBIkgwBFLZpL7B oRBIRA0IDA0YuOEvHMyImyb3plR13Tc7czY72YWJW8K8cC4MhE/hRtj6D6ArKBwJc8KO8DFqeEb4 CmC2pO+NClhKWGF73A4eAngRVsYpsBD6gTwKi0Oeb+GpCnCS4HKpzHuhmf0p4Ue4rAIMEppOoe3M t0JDWM28UQUoYmiUTjyLdi1cCFd1HfRi3h3Sj6MXwkIdYF14F56FzVyjKRxG/xXuhFYdZE3oCK95 VH3hVGgJB4G8CfuT8fn+ANlvk1fzzFNCAAAAAElFTkSuQmCC HERE 'glob' => <<'HERE', iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A /wD/oL2nkwAAAKFJREFUOMvN0k1OAlEQBODvifE+spnhOh7DxJXEJazhRKBbuAPhCMaZcvMWhAw/ xgX0rrrS3VWV5u4r5Bz/8N8Dj0fXpvjBR+F7QM0TXjEqvA3JXYY+bEJzaCE0td+H5TnPk/AVujAL CfOKP0N7TXAlvIRdXbCruPwlxFzAJ6faKrWr0q+3cCHENmwrvzhlYY93jAvrQ6KwwnPl9/fzibev X+/lWAPE64K3AAAAAElFTkSuQmCC HERE 'empty' => <<'HERE', iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A /wD/oL2nkwAAABJJREFUOMtjYBgFo2AUjAIIAAAEEAABhT+qcgAAAABJRU5ErkJggg== HERE ); my %ref_to_icon = ( qw( SCALAR 1 ARRAY 2 HASH 3 CODE 4 GLOB 5 REF 1 ) ); sub get_icon_list { my $self = shift; _icons_to_objects(); my $imglist = Wx::ImageList->new(16, 16, 0, 0); $imglist->Add( $icons{$_} ) foreach qw(empty scalar array hash code glob); return $imglist; } sub ref_to_icon { my $self = shift; my $reftype = shift; return(0) if not $reftype; my $icon_no = $ref_to_icon{$reftype}; return defined($icon_no) ? $icon_no : 0; } sub _icons_to_objects { return if !values(%icons) or ref((values %icons)[0]); require MIME::Base64; my $handler = Wx::PNGHandler->new(); Wx::Image::AddHandler($handler); foreach my $icon_name (keys %icons) { my $str = MIME::Base64::decode_base64($icons{$icon_name}); open my $fh, '<', \$str or die $!; my $img = Wx::Image->new($fh, Wx::wxBITMAP_TYPE_PNG); close $fh; $icons{$icon_name} = Wx::Bitmap->new($img); } } } 1; __END__ Wx-Perl-DataWalker-0.02/lib/Wx/Perl/DataWalker.pm0000644000175000017500000001410311163644034020054 0ustar tseetseepackage Wx::Perl::DataWalker; use 5.008001; use strict; use warnings; our $VERSION = '0.02'; our @ISA = qw(Wx::Frame); use Scalar::Util qw(reftype blessed refaddr); use Devel::Size (); use Wx ':everything'; use Wx::Event ':everything'; require Wx::Perl::DataWalker::CurrentLevel; use Class::XSAccessor getters => { stack => 'stack', }, accessors => { current_head => 'current_head', }; sub new { my $class = shift; my $config = shift; my $self = $class->SUPER::new(@_); $self->{global_head} = $config->{data} or die "Invalid data"; my $rtype = reftype($self->{global_head}); die "top-level display of CODE refs not supported!" if defined $rtype and $rtype eq 'CODE'; $self->{show_size} = $config->{show_size} || 0; $self->{show_recur_size} = $config->{show_recur_size} || 0; my $hsizer = Wx::BoxSizer->new(Wx::wxHORIZONTAL); # tree view here... # $self->{current_level2} = Wx::Button->new( # $self, -1, "FOOO", # Wx::wxDefaultPosition, # Wx::wxDefaultSize, # ); # $hsizer->Add($self->{current_level2}, Wx::wxEXPAND, Wx::wxEXPAND, Wx::wxALL, 2); my $buttonsizer = Wx::BoxSizer->new(Wx::wxHORIZONTAL); $self->{back_button} = Wx::Button->new( $self, -1, "<--" ); $self->{reset_button} = Wx::Button->new( $self, -1, "Reset" ); EVT_BUTTON( $self, $self->{back_button}, sub { $self->go_back(); } ); EVT_BUTTON( $self, $self->{reset_button}, sub { $self->reset_head(); } ); $buttonsizer->Add($self->{back_button}, 0, Wx::wxALL|Wx::wxALIGN_CENTER_VERTICAL, 2); $buttonsizer->Add($self->{reset_button}, 0, Wx::wxALL|Wx::wxALIGN_CENTER_VERTICAL, 2); # show-size radio boxes $self->{size_radio_box} = Wx::RadioBox->new( $self, -1, "Show approx. size", Wx::wxDefaultPosition, Wx::wxDefaultSize, [qw(No Yes Total)], Wx::wxRA_SPECIFY_COLS, ); EVT_RADIOBOX( $self, $self->{size_radio_box}, sub { my $flag = $_[1]->GetInt(); $self->{show_size} = $flag ? 1 : 0; $self->{show_recur_size} = $flag==2 ? 1 : 0; $self->update_size(); } ); $buttonsizer->Add($self->{size_radio_box}, 0, Wx::wxLEFT|Wx::wxALIGN_CENTER_VERTICAL|Wx::wxALIGN_RIGHT, 10); my $vsizer = Wx::BoxSizer->new(Wx::wxVERTICAL); $vsizer->Add($buttonsizer, 0, Wx::wxEXPAND|Wx::wxALL, 2); # the current level in the tree... my $curl = $self->{current_level} = Wx::Perl::DataWalker::CurrentLevel->new( $self, -1, ); $self->update_size(); $vsizer->Add($self->{current_level}, Wx::wxEXPAND, Wx::wxEXPAND|Wx::wxALL, 2); $hsizer->Add($vsizer, Wx::wxEXPAND, Wx::wxEXPAND|Wx::wxALL, 2); $self->SetSizer( $hsizer ); $hsizer->SetSizeHints( $self ); $self->reset_head(); return $self; } sub update_size { my $self = shift; my $curl = $self->{current_level}; $curl->show_size($self->{show_size}); $curl->show_recur_size($self->{show_recur_size}); $curl->refresh(); } sub go_down { my $self = shift; my $where = shift; my $data = $self->current_head; my $target; my $reftype = reftype($data); if (!$reftype) { return(); } elsif ($reftype eq 'SCALAR') { $target = $$data; } elsif ($reftype eq 'HASH') { $target = $data->{$where}; } elsif ($reftype eq 'ARRAY') { $target = $data->[$where]; } elsif ($reftype eq 'REF') { $target = $$data; } elsif ($reftype eq 'GLOB') { $target = *{$data}{$where}; } else { return(); } my $treftype = reftype($target); if (not $treftype and reftype(\$target) eq 'GLOB') { # work around my sucky understanding of GLOBS. Damn you, GLOB, damn you! # $self->current_head(\$target); # push @{$self->stack}, \$target; # $self->{current_level}->set_data(\$target); # return(1); # with kudos to Yves! no strict 'refs'; $target = \*{"$target"}; $treftype = reftype($target); } return() if not $treftype or $treftype eq 'CODE'; # avoid direct recursion into self return() if $treftype eq $reftype and refaddr($target) eq refaddr($data); $self->current_head($target); push @{$self->stack}, $target; $self->{current_level}->set_data($target); return(1); } sub go_back { my $self = shift; my $stack = $self->stack; return() if @$stack == 1; pop(@$stack); $self->current_head($stack->[-1]); $self->{current_level}->set_data($stack->[-1]); return(1); } sub reset_head { my $self = shift; $self->{stack} = [$self->{global_head}]; $self->current_head($self->{global_head}); $self->{current_level}->set_data($self->current_head); } 1; __END__ =head1 NAME Wx::Perl::DataWalker - Perl extension for blah blah blah =head1 SYNOPSIS # alternatively, see the dataWalker.pl script in this distribution! use Wx::Perl::DataWalker; my $data_to_browse = { # complex data structure. # Good test: \%:: }; package MyWalkerDialog; our @ISA = qw(Wx::App); sub OnInit { my $self = shift; my $frame = Wx::Perl::DataWalker->new( {data => $data_to_browse}, undef, -1, "dataWalker", ); $self->SetTopWindow($frame); $frame->Show(1); $frame->SetSize(500,500); return 1; } package main; my $app = MyWalkerDialog->new(); $app->MainLoop(); =head1 DESCRIPTION C implements a C subclass that shows a relatively simple Perl data structure browser. After opening such a frame and supplying it with a reference to an essentially arbitrary data structure, you can visually browse it by double-clicking references. So far, there is no tree view but only a display of the current level of the data structure. You can traverse back up the structure with a I button. Optionally, C displays the (approximate!) size of the data structure using C. =head1 SEE ALSO L, L L =head1 AUTHOR Steffen Mueller, Esmueller@cpan.orgE =head1 COPYRIGHT AND LICENSE Copyright (C) 2009 by Steffen Mueller This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.8 or, at your option, any later version of Perl 5 you may have available. =cut Wx-Perl-DataWalker-0.02/Changes0000644000175000017500000000031611163643777014742 0ustar tseetseeRevision history for Perl extension Wx::Perl::DataWalker. 0.02 Sun Mar 29 12:05 2009 - use overload::StrVal() to disable overloading where appropriate 0.01 Sat Mar 21 14:40 2009 - original version Wx-Perl-DataWalker-0.02/t/0000755000175000017500000000000011163644052013675 5ustar tseetseeWx-Perl-DataWalker-0.02/t/Wx-Perl-DataWalker.t0000644000175000017500000000014111161267327017375 0ustar tseetseeuse strict; use warnings; use Test::More tests => 1; BEGIN { use_ok('Wx::Perl::DataWalker') }; Wx-Perl-DataWalker-0.02/script/0000755000175000017500000000000011163644052014736 5ustar tseetseeWx-Perl-DataWalker-0.02/script/dataWalker.pl0000644000175000017500000000224711161451217017354 0ustar tseetsee#!/usr/bin/env perl use strict; use warnings; use Wx; use Wx::Perl::DataWalker; use YAML::XS; use Getopt::Long qw(GetOptions); sub usage { my $msg = shift; warn("$msg\n\n") if defined $msg; warn < "bar", baz => []}' $0 --yaml YAMLFILE HERE exit(1); } my $eval; my $yamlfile; GetOptions( 'h|help' => \&usage, 'e|eval=s' => \$eval, 'y|yaml=s' => \$yamlfile, ); if (1!=grep {defined $_} ($eval, $yamlfile)) { usage("You need to supply exactly one of the --eval or --yaml options"); } my $data; if (defined $eval) { $data = eval "$eval"; if ($@) { usage("Could not eval your expression: $@"); } } elsif (defined $yamlfile) { usage("Could not find YAML input file '$yamlfile'") unless -f $yamlfile; $data = YAML::XS::LoadFile($yamlfile) } else { die "Should not happen"; } package MyApp; our @ISA = qw(Wx::App); sub OnInit { my $self = shift; my $frame = Wx::Perl::DataWalker->new( {data => $data}, undef, -1, "dataWalker", ); $self->SetTopWindow($frame); $frame->Show(1); $frame->SetSize(500,500); return 1; } package main; my $app = MyApp->new(); $app->MainLoop(); Wx-Perl-DataWalker-0.02/Makefile.PL0000644000175000017500000000120211161455133015375 0ustar tseetseeuse 5.008001; use ExtUtils::MakeMaker; # See lib/ExtUtils/MakeMaker.pm for details of how to influence # the contents of the Makefile that is written. WriteMakefile( NAME => 'Wx::Perl::DataWalker', VERSION_FROM => 'lib/Wx/Perl/DataWalker.pm', # finds $VERSION PREREQ_PM => { 'Wx' => '0.88', 'YAML::XS' => '0.32', 'Scalar::Util' => '0', 'Devel::Size' => '0.71', 'Class::XSAccessor' => '0.06', }, # e.g., Module::Name => 1.1 ABSTRACT_FROM => 'lib/Wx/Perl/DataWalker.pm', # retrieve abstract from module AUTHOR => 'Steffen Mueller ', ); Wx-Perl-DataWalker-0.02/META.yml0000644000175000017500000000120011163644052014674 0ustar tseetsee--- #YAML:1.0 name: Wx-Perl-DataWalker version: 0.02 abstract: Perl extension for blah blah blah author: - Steffen Mueller license: unknown distribution_type: module configure_requires: ExtUtils::MakeMaker: 0 requires: Class::XSAccessor: 0.06 Devel::Size: 0.71 Scalar::Util: 0 Wx: 0.88 YAML::XS: 0.32 no_index: directory: - t - inc generated_by: ExtUtils::MakeMaker version 6.48 meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html version: 1.4