The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#############################################################################
## 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;