The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#############################################################################
## Name:        lib/Wx/DemoModules/wxToolBar.pm
## Purpose:     wxPerl demo helper for Wx::ToolBar
## Author:      Mattia Barbon
## Modified by:
## Created:     29/10/2000
## RCS-ID:      $Id: wxToolBar.pm 2189 2007-08-21 18:15:31Z mbarbon $
## Copyright:   (c) 2000, 2003, 2005-2006 Mattia Barbon
## Licence:     This program is free software; you can redistribute it and/or
##              modify it under the same terms as Perl itself
#############################################################################

package Wx::DemoModules::wxToolBar;

use strict;
use base qw(Wx::Frame Class::Accessor::Fast);

use Wx qw(:id :textctrl :bitmap :toolbar wxNullBitmap wxDefaultPosition
          wxDefaultSize);
use Wx::Event qw(EVT_SIZE EVT_MENU EVT_COMBOBOX EVT_UPDATE_UI
                 EVT_TOOL_ENTER);

__PACKAGE__->mk_accessors( qw(textctrl small_toolbar horizontal_toolbar) );

my( $ID_TOOLBAR, $ID_COMBO, $ID_QUOTES ) = ( 1 .. 100 );

sub BITMAP($) {
    my( $name ) = @_;
    my $file = Wx::Demo->get_data_file( "xrc/$name.gif" );

    return Wx::Bitmap->new( $file, wxBITMAP_TYPE_GIF );
}

sub new {
    my( $class, $parent ) = @_;
    my $this = $class->SUPER::new( $parent, -1, 'wxToolBar demo' );

    $this->SetIcon( Wx::GetWxPerlIcon );
    my $textctrl = Wx::TextCtrl->new( $this, -1, '', [0, 0], [-1, -1],
                                      wxTE_MULTILINE );
    $this->textctrl( $textctrl );
    $this->small_toolbar( 1 );
    $this->horizontal_toolbar( 1 );

    $this->CreateStatusBar;

    EVT_MENU( $this, -1, \&OnToolLeftClick ); # must be the first bound event

    my $tmenu = Wx::Menu->new;
    EVT_MENU( $this,  $tmenu->AppendCheckItem( -1, "Toggle toolbar" ),
              \&OnToggleToolbar );
    EVT_MENU( $this, $tmenu->AppendCheckItem( -1, "Toggle icon size" ),
              \&OnToggleToolbarSize );
    EVT_MENU( $this, $tmenu->AppendCheckItem( -1, "Toggle orientation" ),
              \&OnToggleToolbarOrient );
    $tmenu->AppendSeparator;
    EVT_MENU( $this, $tmenu->Append( -1, "Insert open button" ),
              \&OnInsertOpen );
    EVT_MENU( $this, $tmenu->Append( -1, "Enable open button" ),
              sub { $_[0]->DoEnableOpen } );
    EVT_MENU( $this, $tmenu->Append( -1, "Delete open button" ),
              sub { $_[0]->DoDeleteOpen } );
    EVT_MENU( $this, $tmenu->Append( -1,  "Toggle quotes button" ),
              sub { $_[0]->DoToggleQuotes } );

    my $menu = Wx::MenuBar->new;
    $menu->Append( $tmenu, 'Toolbar' );
    $this->SetMenuBar( $menu );

    $this->RecreateToolbar;

    EVT_COMBOBOX( $this, $ID_COMBO, \&OnCombo );
    EVT_TOOL_ENTER( $this, $ID_TOOLBAR, \&OnToolEnter );

    return $this;
}

sub OnToggleToolbar {
    my( $this, $event ) = @_;
    my $t = $this->GetToolBar;
    if( $t ) {
        $t->Destroy;
        $this->SetToolBar( undef );
        $this->LayoutChildren;
    } else {
        $this->RecreateToolbar;
    }
}

sub LayoutChildren {
    my( $this ) = @_;
    my $size = $this->GetClientSize;

    $this->textctrl->SetSize( 0, 0, $size->x, $size->y );
}

sub OnToggleToolbarSize {
    my( $this, $event ) = @_;

    $this->small_toolbar( $this->small_toolbar ? 0 : 1 );
    $this->RecreateToolbar;
}

sub OnToggleToolbarOrient {
    my( $this, $event ) = @_;

    $this->horizontal_toolbar( $this->horizontal_toolbar ? 0 : 1 );
    $this->RecreateToolbar;
}

sub OnToolLeftClick {
    my( $this, $event ) = @_;

    $this->textctrl->WriteText( sprintf "Clicked on tool %d\n",
                                $event->GetId );
    if( $event->GetId == $ID_QUOTES ) {
        if( $event->GetExtraLong != 0 ) {
            $this->textctrl->WriteText( "Quotes button down now\n" );
        } else {
            $this->textctrl->WriteText( "Quotes button up now\n" );
        }
    }

    if( $event->GetId == wxID_OPEN ) {
        $this->DoDeleteOpen;
    }
}

sub DoEnableOpen {
    my( $this ) = @_;
    my $t = $this->GetToolBar;
    unless( $t->FindById( wxID_OPEN ) ) {
        $this->textctrl->WriteText( "No tool\n" );
        return;
    }
    $t->EnableTool( wxID_OPEN, !$t->GetToolEnabled( wxID_OPEN ) );
}

sub DoDeleteOpen {
    my( $this ) = @_;
    my $t = $this->GetToolBar;
    unless( $t->FindById( wxID_OPEN ) ) {
        $this->textctrl->WriteText( "No tool\n" );
        return;
    }
    $t->DeleteTool( wxID_OPEN );
}

sub DoToggleQuotes {
    my( $this ) = @_;
    my $t = $this->GetToolBar;

    $t->ToggleTool( $ID_QUOTES, !$t->GetToolState( $ID_QUOTES ) );
}

sub OnInsertOpen {
    my( $this, $event ) = @_;
    my $t = $this->GetToolBar;
    my $bmp = BITMAP( 'fileopen' );
    $t->InsertTool( 0, wxID_OPEN, $bmp, wxNullBitmap,
                    0, undef, 'Delete this tool',
                    'This button was inserted into the toolbar'
                    );
    $t->Realize;
}

sub RecreateToolbar {
    my( $this ) = @_;
    my $t = $this->GetToolBar;
    $t->Destroy if $t;
    $this->SetToolBar( undef );

    my( $style ) =
      ( $this->horizontal_toolbar ? wxTB_HORIZONTAL : wxTB_VERTICAL ) |
        wxNO_BORDER | wxTB_FLAT | wxTB_DOCKABLE;
    $t = $this->CreateToolBar( $style, $ID_TOOLBAR );
    $t->SetMargins( 4, 4 );

    my( @bitmaps ) = map { BITMAP( $_ ) } qw(fileopen filesave fuzzy quotes);
    if( !$this->small_toolbar ) {
        my( $w, $h ) = ( $bitmaps[0]->GetWidth * 2,
                         $bitmaps[0]->GetHeight * 2 );
        @bitmaps =
            map { Wx::Bitmap->new( Wx::Image->new( $_ )->Scale( $w, $h ) ) }
                @bitmaps;
        $t->SetToolBitmapSize( [ $w, $h ] );
    }

    my $width = ( Wx::wxMSW() ) ? 24 : 16;
    $t->AddTool( wxID_SAVE, $bitmaps[1], wxNullBitmap, 0, undef, 'Open File' );
    if( $this->horizontal_toolbar ) {
        my $c = Wx::ComboBox->new
            ( $t, $ID_COMBO, '', wxDefaultPosition, wxDefaultSize,
              [ 'This', 'is a', 'combobox', 'in a', 'toolbar' ] );
        $t->AddControl( $c );
    }
    $t->AddTool( -1, $bitmaps[2], wxNullBitmap, 1, undef,
                     'Toggle button 1' );
    $t->AddSeparator;
    $t->AddTool( $ID_QUOTES, $bitmaps[3], wxNullBitmap, 1, undef,
                 'Toggle button 1' );

    $t->Realize;
}

sub OnCombo {
    my( $this, $event ) = @_;

    Wx::LogStatus( "ComboBox string '%s' selected", $event->GetString );
}

sub OnToolEnter {
    my( $this, $event ) = @_;

    if( $event->GetSelection > -1 ) {
        $this->SetStatusText( sprintf 'This is tool number %d',
                              $event->GetSelection );
    } else {
        $this->SetStatusText( '' );
    }
}

sub add_to_tags { qw(controls) }
sub title { 'wxToolBar' }

1;