#############################################################################
## Name: lib/Wx/DemoModules/wxArtProvider.pm
## Purpose: wxPerl demo helper for Wx::ArtProvider
## Author: Matthew "Cheetah" Gabeler-Lee
## Modified by: Mattia Barbon
## Created: 11/01/2005
## RCS-ID: $Id: wxArtProvider.pm 2189 2007-08-21 18:15:31Z mbarbon $
## Copyright: (c) 2005-2006 Matthew "Cheetah" Gabeler-Lee
## Licence: This program is free software; you can redistribute it and/or
## modify it under the same terms as Perl itself
#############################################################################
package Wx::DemoModules::wxArtProvider;
use strict;
use base qw(Wx::Panel Class::Accessor::Fast);
use Wx qw(:sizer :checkbox);
use Wx::Event qw(EVT_CHECKBOX);
__PACKAGE__->mk_accessors( qw(icon_browser) );
sub new {
my( $class, $parent ) = @_;
my $self = $class->SUPER::new( $parent );
my $sizer = Wx::BoxSizer->new( wxHORIZONTAL );
my $plug_provider = Wx::CheckBox->new( $self, -1, "Plug-in art provider" );
my $browser = Wx::DemoModules::wxArtProvider::Browser->new( $self );
$sizer->Add( $plug_provider, 0, wxALL, 5 );
$sizer->Add( $browser, 1, wxGROW|wxALL, 5 );
$self->SetSizer( $sizer );
$self->icon_browser( $browser );
EVT_CHECKBOX( $self, $plug_provider, \&OnPlugProvider );
return $self;
}
sub OnPlugProvider {
my( $this, $event ) = @_;
if ($event->IsChecked) {
Wx::ArtProvider::PushProvider(Wx::DemoModules::wxArtProvider::Custom->new);
} else {
Wx::ArtProvider::PopProvider;
}
# refresh list and currently-selected icon
my $browser = $this->icon_browser;
if( defined $browser->GetArtClient ) {
$browser->SetArtClient( $browser->GetArtClient );
}
if( defined $browser->GetArtId ) {
$browser->SetArtId( $browser->GetArtId );
}
}
sub add_to_tags { qw(misc) }
sub title { 'wxArtProvider' }
package Wx::DemoModules::wxArtProvider::Browser;
use strict;
use base qw(Wx::Panel);
use Wx qw/:panel :window :sizer :listctrl :bitmap :misc :id :window/;
use Wx::Event qw(EVT_LIST_ITEM_SELECTED EVT_CHOICE);
use Wx::ArtProvider qw/:artid :clientid/;
my @artids = (
wxART_ERROR, wxART_QUESTION, wxART_WARNING, wxART_INFORMATION,
wxART_ADD_BOOKMARK, wxART_DEL_BOOKMARK, wxART_HELP_SIDE_PANEL,
wxART_HELP_SETTINGS, wxART_HELP_BOOK, wxART_HELP_FOLDER, wxART_HELP_PAGE,
wxART_GO_BACK, wxART_GO_FORWARD, wxART_GO_UP, wxART_GO_DOWN,
wxART_GO_TO_PARENT, wxART_GO_HOME, wxART_FILE_OPEN, wxART_PRINT,
wxART_HELP, wxART_TIP, wxART_REPORT_VIEW, wxART_LIST_VIEW, wxART_NEW_DIR,
wxART_FOLDER, wxART_GO_DIR_UP, wxART_EXECUTABLE_FILE, wxART_NORMAL_FILE,
wxART_TICK_MARK, wxART_CROSS_MARK, wxART_MISSING_IMAGE,
);
my @clientids = (
wxART_OTHER, wxART_TOOLBAR, wxART_MENU, wxART_FRAME_ICON,
wxART_CMN_DIALOG, wxART_HELP_BROWSER, wxART_MESSAGE_BOX, wxART_BUTTON,
);
sub new {
my ( $class, $parent ) = @_;
my $this = $class->SUPER::new( $parent, -1 );
# create sizers and widgets
my $sizer = Wx::BoxSizer->new(wxVERTICAL);
my $subsizer1 = Wx::BoxSizer->new(wxHORIZONTAL);
my $subsizer2 = Wx::BoxSizer->new(wxHORIZONTAL);
my $subsub = Wx::BoxSizer->new(wxVERTICAL);
my $choice = Wx::Choice->new($this, -1);
for my $index (0 .. $#clientids) {
$choice->Append($clientids[$index], $index);
}
$this->{list} = Wx::ListCtrl->new($this, -1, wxDefaultPosition, [250, 300],
wxLC_REPORT | wxSUNKEN_BORDER);
$this->{list}->InsertColumn(0, 'wxArtID');
$this->{canvas} = Wx::StaticBitmap->new($this, -1,
Wx::Bitmap->new(Wx::Demo->get_data_file('artprovider/null.xpm'), wxBITMAP_TYPE_XPM));
# layout widgets in sizers
$subsizer1->Add(Wx::StaticText->new($this, -1, "Client:"), 0,
wxALIGN_CENTER_VERTICAL);
$subsizer1->Add($choice, 1, wxLEFT, 5);
$sizer->Add($subsizer1, 0, wxALL | wxEXPAND, 10);
$subsizer2->Add($this->{list}, 1, wxEXPAND | wxRIGHT, 10);
$subsub->Add($this->{canvas});
$subsub->Add(100, 100);
$subsizer2->Add($subsub);
$sizer->Add($subsizer2, 1, wxEXPAND | wxLEFT | wxRIGHT, 10);
$this->SetSizer($sizer);
$sizer->Fit($this);
$choice->SetSelection(6); # wxART_MESSAGE_BOX
$this->SetArtClient(wxART_MESSAGE_BOX);
EVT_LIST_ITEM_SELECTED($this, $this->{list}, \&OnSelectItem);
EVT_CHOICE($this, $choice, \&OnChooseClient);
return $this;
}
sub GetArtId { $_[0]->{artid} }
sub SetArtId {
my( $this, $artid ) = @_;
my $bmp = Wx::ArtProvider::GetBitmap($artid, $this->{client});
$this->{canvas}->SetBitmap($bmp);
$this->{canvas}->SetSize($bmp->GetWidth, $bmp->GetHeight);
$this->{artid} = $artid;
}
sub GetArtClient { $_[0]->{client} }
sub SetArtClient {
my $this = shift;
my ($client) = @_;
my $bcur = Wx::BusyCursor->new;
# funky jazz with image list to get memory management to function
# correctly
my $img = Wx::ImageList->new(16, 16);
$img->Add(Wx::Bitmap->new(Wx::Demo->get_data_file('artprovider/null.xpm'), wxBITMAP_TYPE_XPM));
$this->{list}->DeleteAllItems;
for my $index (0 .. $#artids) {
my $icon = Wx::ArtProvider::GetIcon($artids[$index], $client, [16, 16]);
my $ind = 0;
if ($icon->Ok) {
$ind = $img->Add($icon);
}
$this->{list}->InsertImageStringItem($index, $artids[$index], $ind);
$this->{list}->SetItemData($index, $index);
}
$this->{list}->SetImageList($img, wxIMAGE_LIST_SMALL);
$this->{listimg} = $img; # preserve image list in memory
$this->{list}->SetColumnWidth(0, wxLIST_AUTOSIZE);
$this->{client} = $client;
}
sub OnSelectItem {
my ($this, $event) = @_;
my $data = $event->GetData;
$this->SetArtId( $artids[$data] );
}
sub OnChooseClient {
my ($this, $event) = @_;
my $data = $event->GetClientData;
$this->SetArtClient($clientids[$data]);
}
package Wx::DemoModules::wxArtProvider::Custom;
use strict;
use base qw(Wx::PlArtProvider);
use Wx qw/:bitmap/;
use Wx::ArtProvider qw/:artid :clientid/;
sub new {
my( $class ) = @_;
my $this = $class->SUPER::new;
return $this;
}
sub _bitmap {
return Wx::Bitmap->new( Wx::Demo->get_data_file( "artprovider/$_[0]" ),
wxBITMAP_TYPE_XPM );
}
sub CreateBitmap {
my( $this, $id, $client, $size ) = @_;
if( $client eq wxART_MESSAGE_BOX ) {
if( $id eq wxART_INFORMATION ) {
return _bitmap( 'info.xpm' );
} elsif( $id eq wxART_ERROR ) {
return _bitmap( 'error.xpm' );
} elsif( $id eq wxART_WARNING ) {
return _bitmap( 'warning.xpm' );
} elsif( $id eq wxART_QUESTION ) {
return _bitmap( 'question.xpm' );
}
}
return wxNullBitmap;
}
1;