Devel-WxProf

 view release on metacpan or  search on metacpan

bin/wxprofile  view on Meta::CPAN

          wxWHITE
          );
use Wx::Event qw(
    EVT_SIZE
    EVT_TREE_SEL_CHANGED
    EVT_MENU
    EVT_CLOSE
    EVT_GRID_SELECT_CELL
    EVT_BUTTON
    EVT_LEFT_DOWN
    EVT_MOUSE_EVENTS
    );

use Devel::WxProf::Data;
use Devel::WxProf::Grid;
use Devel::WxProf::Reader::WxProf;
use Devel::WxProf::Reader::DProf;
use Devel::WxProf::Preferences;
use Devel::WxProf::Treemap::Output::Imager;
use Devel::WxProf::Treemap::Squarified;

use UNIVERSAL::require;
use Module::Pluggable::Object;

use File::Path qw(rmtree);

__PACKAGE__->mk_accessors( qw(
    preferences
    filename
    pkg_grid
    sub_grid
    call_grid
    callee_tree
    callee_map
    callee_map_dc
    callee_map_data
    notebook) );

my @wx_defaults = (
        -1,
        wxDefaultPosition,
        wxDefaultSize,
        wxNO_FULL_REPAINT_ON_RESIZE|wxCLIP_CHILDREN
);

sub new {
    my( $class ) = @_;
    my $self = $class->SUPER::new(
        undef,
        -1,
        'wxprofile',
        wxDefaultPosition,
        [ 1024, 768 ],
        wxDEFAULT_FRAME_STYLE|wxNO_FULL_REPAINT_ON_RESIZE|wxCLIP_CHILDREN
    );

    $self->preferences( Devel::WxProf::Preferences->new() );

    Wx::InitAllImageHandlers();
    # create menu bar
    my $bar = Wx::MenuBar->new;
    my $file = Wx::Menu->new;
    $file->Append( wxID_OPEN, "Open" );
    $file->Append( wxID_EXIT, "E&xit" );

    my $help = Wx::Menu->new;
    $help->Append( wxID_ABOUT, "&About..." );

    $bar->Append( $file, "&File" );
    $bar->Append( $help, "&Help" );

    $self->SetMenuBar( $bar );

    my $main = Wx::ScrolledWindow->new($self, @wx_defaults);
    $main->SetScrollbars(20, 20, 55, 40);
    my $main_sizer = Wx::BoxSizer->new(wxVERTICAL);
    $main->SetSizer($main_sizer);

#    INFO: {
#        my $parent = Wx::Panel->new($main, @wx_defaults);
#        Wx::StaticText->new($parent, -1, 'Profile Data - table view');
#        $parent->Fit();
#        $main_sizer->AddSpacer(5);
#        $main_sizer->Add($parent);
#        $main_sizer->AddSpacer(10);
#    };


    CHILDREN: {
        my $parent = Wx::Panel->new($main, @wx_defaults);
        # $parent->SetScrollbars(20, 20, 55, 40);

        my $pkg_label = Wx::StaticText->new( $parent, -1, "Packages");
        my $pkg_grid = Devel::WxProf::Grid->new($parent, -1);

        my $sizer = Wx::FlexGridSizer->new(4,2,5,5);
        $parent->SetSizer($sizer);

        $self->setup_grid( $pkg_grid, 200, ('elapsed', 'calls', 'package') );
        $self->pkg_grid($pkg_grid);

        my $sub_label = Wx::StaticText->new( $parent, -1, "Subroutines",);
        my $sub_grid = Devel::WxProf::Grid->new($parent, -1);
        $self->setup_grid( $sub_grid, 400, ('elapsed', 'calls', 'sub') );
        $self->sub_grid($sub_grid);

        my $call_label = Wx::StaticText->new( $parent, -1, "Calls");
        my $call_grid = Devel::WxProf::Grid->new($parent, -1);
        $self->setup_grid( $call_grid, 200, ('elapsed', 'calls', 'sub') );
        $self->call_grid($call_grid);

        my $tree_label = Wx::StaticText->new( $parent, -1, "Callee Tree");

        my $callee_notebook = Wx::Notebook->new($parent, -1);
#
        my $callee_map;
        CALLEE_MAP: {
            #my $parent = $callee_notebook;
            my $parent = Wx::Panel->new($callee_notebook);
            # create a bitmap
            my $bmp = Wx::Bitmap->new(500, 400);
            # create a graphics device context
            my $temp_dc = Wx::MemoryDC->new();
            # select bitmap
            $temp_dc->SelectObject($bmp);
            # clear bitmap
            $temp_dc->Clear();

            # add (new cleared) bitmap to StaticBitmap display
            $callee_map = Wx::StaticBitmap->new($parent, -1, $bmp, wxDefaultPosition, wxDefaultSize, wxNO_BORDER);
            $callee_map->SetMinSize([500,400]);
            $callee_map->SetMaxSize([500,400]);

bin/wxprofile  view on Meta::CPAN

        : Devel::WxProf::Reader::WxProf->new();

    my @result = eval {
        $reader->read_file($filename)
    };
    if ($@) {
        Wx::LogMessage( "Error: $@");
        return;
    }
    $self->filename($filename);
    $self->_set_title($filename);
    $data->set_child_nodes(\@result);
    $self->populate_pkg_grid($reader->get_packages());
}

sub ask_for_filename {
    my ($self, $label) = shift;
    $label ||= 'Select file';
    my $default_dir = $self->preferences()->get_default_dir();
    my $dialog = Wx::FileDialog->new($self, $label, $default_dir);
    if ($dialog->ShowModal() == wxID_OK) {
        $self->preferences->set_default_dir($dialog->GetDirectory());
        return $dialog->GetPath()
    }
    return;
}

sub on_close {
    my( $self, $event ) = @_;

    Wx::Log::SetActiveTarget( $self->{old_log} );
    $event->Skip;
}

sub on_open {
    my( $self, $event ) = @_;
    my $filename = $self->ask_for_filename();
    if ($filename) {
        $self->read_profile($filename);
    }
}

sub on_about {
    my( $self ) = @_;
    use Wx qw(wxOK wxCENTRE wxVERSION_STRING);

    Wx::MessageBox( "wxprofile (c) 2008 Martin Kutter\n" .
                    "wxPerl $Wx::VERSION, " . wxVERSION_STRING,
                    "About wxprofile", wxOK|wxCENTRE, $self );
}

sub _set_title {
    my $self = shift;
    $self->SetTitle(shift);
}

sub _add_menus {
    my( $self, %menus ) = @_;

    while( my( $title, $menu ) = each %menus ) {
        $self->GetMenuBar->Insert( 1, $menu, $title );
    }
}

sub _remove_menus {
    my( $self ) = @_;

    while( $self->GetMenuBar->GetMenuCount > 2 ) {
        $self->GetMenuBar->Remove( 1 )->Destroy;
    }
}

sub DESTROY {
    rmtree $_[0]->preferences->get_data_dir() . "/$$";
}

my $app = Wx::SimpleApp->new;
my $locale = Wx::Locale->new( Wx::Locale::GetSystemLanguage );
my $profile = WxProf->new();
$profile->read_profile($ARGV[0]) if @ARGV;

# add mouse event handler
# must be added for $app - application filters events.
EVT_LEFT_DOWN($app, sub {
    my ($app, $event) = @_;

    # only handle clicks on our map special
    if ($event->GetEventObject() == $profile->callee_map) {
        my ($x,$y) = $event->GetPositionXY();
        my $found = first {
            $_->[2] > $x && $x > $_->[0]
            && $_->[3] > $y && $y > $_->[1]
        } @{ $profile->callee_map_data() };

        if ($found) {
            my ($package,$sub) = $found->[-1] =~m{^(.+)::([^:]+)$}x;
            # warn ($package, " ", $sub);
            # warn Data::Dumper::Dumper($profile->callee_map_data());
            my $pkg = $profile->select_package($package);
            if ($pkg) {
                $profile->populate_sub_grid($pkg);
                my $sub_data = $profile->select_sub($sub);
                $profile->populate_call_grid($sub_data)
                    if ($sub_data);
            }
        }
        else {
            warn "No sub found for coordinates x=$x, y=$y";
        }
    }
    $event->Skip();
});

$app->MainLoop;



exit 0;



1;

=pod

=head1 NAME

wxprofile - Graphical profile data analyzer



( run in 1.536 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )