#############################################################################
## Name: lib/Wx/DemoModules/wxListCtrl.pm
## Purpose: wxPerl demo helper for Wx::ListCtrl
## Author: Mattia Barbon
## Modified by:
## Created: 12/09/2001
## RCS-ID: $Id: wxListCtrl.pm 2468 2008-09-08 20:55:33Z szabgab $
## Copyright: (c) 2001, 2003-2004, 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::wxListCtrl;
use strict;
use Wx::DemoModules::lib::Utility;
use base qw(Wx::ListCtrl);
use Wx qw(:icon wxTheApp :listctrl);
use Wx::Event
qw(EVT_LIST_BEGIN_DRAG EVT_LIST_BEGIN_RDRAG
EVT_LIST_BEGIN_LABEL_EDIT EVT_LIST_END_LABEL_EDIT EVT_LIST_DELETE_ITEM
EVT_LIST_DELETE_ALL_ITEMS
EVT_LIST_ITEM_SELECTED EVT_LIST_ITEM_DESELECTED EVT_LIST_KEY_DOWN
EVT_LIST_ITEM_ACTIVATED EVT_LIST_COL_CLICK EVT_CHAR
EVT_MENU
);
sub new {
my $class = shift;
my $self = $class->SUPER::new(@_);
$self->create_menu;
return $self;
}
sub create_image_lists {
my $images_sm = Wx::ImageList->new( 16, 16, 1 );
my $images_no = Wx::ImageList->new( 32, 32, 1 );
$images_sm->Add( Wx::GetWxPerlIcon( 1 ) );
$images_sm->Add( resize_to( wxTheApp->GetStdIcon( wxICON_EXCLAMATION ),
16 ) );
$images_sm->Add( resize_to( wxTheApp->GetStdIcon( wxICON_ERROR ), 16 ) );
$images_no->Add( Wx::GetWxPerlIcon() );
$images_no->Add( wxTheApp->GetStdIcon( wxICON_HAND ) );
$images_no->Add( wxTheApp->GetStdIcon( wxICON_EXCLAMATION ) );
$images_no->Add( wxTheApp->GetStdIcon( wxICON_ERROR ) );
$images_no->Add( wxTheApp->GetStdIcon( wxICON_QUESTION ) );
return ( $images_sm, $images_no );
}
sub bind_events {
my( $listctrl ) = @_;
# bind events
EVT_LIST_BEGIN_DRAG( $listctrl, $listctrl, \&OnBeginDrag);
EVT_LIST_BEGIN_RDRAG( $listctrl, $listctrl, \&OnBeginRDrag );
EVT_LIST_BEGIN_LABEL_EDIT( $listctrl, $listctrl, \&OnBeginLabelEdit );
EVT_LIST_END_LABEL_EDIT( $listctrl, $listctrl, \&OnEndLabelEdit );
EVT_LIST_DELETE_ITEM( $listctrl, $listctrl, \&OnDeleteItem );
EVT_LIST_DELETE_ALL_ITEMS( $listctrl, $listctrl, \&OnDeleteAllItems );
EVT_LIST_ITEM_SELECTED( $listctrl, $listctrl, \&OnSelected );
EVT_LIST_ITEM_DESELECTED( $listctrl, $listctrl, \&OnDeselected );
EVT_LIST_KEY_DOWN( $listctrl, $listctrl, \&OnListKeyDown );
EVT_LIST_ITEM_ACTIVATED( $listctrl, $listctrl, \&OnActivated );
EVT_LIST_COL_CLICK( $listctrl, $listctrl, \&OnColClick );
EVT_CHAR( $listctrl, \&OnChar );
}
sub create_menu {
my( $listctrl ) = @_;
my $top = Wx::GetTopLevelParent( $listctrl );
my $menu = Wx::Menu->new;
EVT_MENU( $top, $menu->Append( -1, "Toggle first selection" ),
sub { $listctrl->on_toggle_first } );
EVT_MENU( $top, $menu->Append( -1, "Deselect all" ),
sub { $listctrl->on_deselect_all } );
EVT_MENU( $top, $menu->Append( -1, "Select all" ),
sub { $listctrl->on_select_all } );
$menu->AppendSeparator;
EVT_MENU( $top, $menu->Append( -1, "Sort" ),
sub { $listctrl->on_sort } );
$menu->AppendSeparator;
EVT_MENU( $top, $menu->Append( -1, "Delete all items" ),
sub { $listctrl->on_delete_all } );
$listctrl->{menu} = [ '&List Control', $menu ];
return;
}
sub menu { @{$_[0]->{menu}} }
sub on_toggle_first {
my( $listctrl ) = @_;
my $state = $listctrl->GetItemState( 0, wxLIST_STATE_SELECTED );
my $newState = $state ? 0 : wxLIST_STATE_SELECTED;
$listctrl->SetItemState( 0, $newState, wxLIST_STATE_SELECTED );
}
sub on_deselect_all {
my( $listctrl ) = @_;
foreach ( 0 .. $listctrl->GetItemCount - 1 ) {
$listctrl->SetItemState( $_, 0, wxLIST_STATE_SELECTED );
}
}
sub on_select_all {
my( $listctrl ) = @_;
foreach ( 0 .. $listctrl->GetItemCount - 1 ) {
$listctrl->SetItemState( $_, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED );
}
}
my $sort_order = 'asc';
sub on_sort {
my( $listctrl ) = @_;
if( $sort_order eq 'asc' ) {
$sort_order = 'desc';
$listctrl->SortItems( sub { $_[0] < $_[1] } );
} else {
$sort_order = 'asc';
$listctrl->SortItems( sub { $_[1] < $_[0] } );
}
}
sub on_delete_all {
my( $listctrl ) = @_;
$listctrl->DeleteAllItems;
}
sub OnColClick {
my( $listctrl, $event ) = @_;
Wx::LogMessage( "OnClumnClick at %d.", $event->GetColumn );
$event->Skip;
}
sub OnBeginDrag {
my( $listctrl, $event ) = @_;
Wx::LogMessage( "OnBeginDrag ad ( %d, %d ).",
$event->GetPoint->x, $event->GetPoint->y );
$event->Skip;
}
sub OnBeginRDrag {
my( $listctrl, $event ) = @_;
Wx::LogMessage( "OnBeginRDrag ad ( %d, %d ).",
$event->GetPoint->x, $event->GetPoint->y );
$event->Skip;
}
sub OnBeginLabelEdit {
my( $listctrl, $event ) = @_;
Wx::LogMessage( "OnBeginLabelEdit: %s",
$event->GetItem->GetText );
$event->Skip;
}
sub OnEndLabelEdit {
my( $listctrl, $event ) = @_;
Wx::LogMessage( "OnBeginLabelEdit: %s",
$event->GetItem->GetText );
$event->Skip;
}
sub OnDeleteItem {
my( $listctrl, $event ) = @_;
LogEvent( $listctrl, $event, "OnDeleteItem" );
}
sub OnDeleteAllItems {
my( $listctrl, $event ) = @_;
LogEvent( $listctrl, $event, "OnDeleteAllItems" );
}
sub OnSelected {
my( $listctrl, $event ) = @_;
LogEvent( $listctrl, $event, "OnSelected" );
}
sub OnDeselected {
my( $listctrl, $event ) = @_;
LogEvent( $listctrl, $event, "OnDeselected" );
}
sub OnActivated {
my( $listctrl, $event ) = @_;
LogEvent( $listctrl, $event, "OnActivated" );
}
sub OnListKeyDown {
my( $listctrl, $event ) = @_;
LogEvent( $listctrl, $event, "OnListKeyDown" );
}
sub OnChar {
my( $listctrl, $event ) = @_;
Wx::LogMessage( "OnChar" );
}
sub LogEvent {
my( $listctrl, $event, $name ) = @_;
Wx::LogMessage( "Item %d: %s ( item text = %s, data = %d )",
$event->GetIndex(), $name,
$event->GetText(), $event->GetData() );
$event->Skip;
}
sub tags { [ 'controls/listctrl', 'wxListCtrl' ] }
package Wx::DemoModules::wxListCtrl::Report;
use strict;
use base qw(Wx::ListView Wx::DemoModules::wxListCtrl);
use Wx qw(:listctrl wxDefaultPosition wxDefaultSize);
sub new {
my( $class, $parent ) = @_;
my $self = $class->SUPER::new( $parent, -1, wxDefaultPosition,
wxDefaultSize, wxLC_REPORT );
$self->bind_events;
$self->create_menu;
my @names = ( "Cheese", "Apples", "Oranges" );
my( $small, $normal ) = $self->create_image_lists;
$self->AssignImageList( $small, wxIMAGE_LIST_SMALL );
$self->AssignImageList( $normal, wxIMAGE_LIST_NORMAL );
$self->InsertColumn( 0, "Type" );
$self->InsertColumn( 1, "Amount" );
$self->InsertColumn( 2, "Price" );
foreach my $i ( 0 .. 50 ) {
my $t = ( rand() * 100 ) % 3;
my $q = int( rand() * 100 );
my $idx = $self->InsertImageStringItem( $i, $names[$t], 0 );
$self->SetItemData( $idx, $i );
$self->SetItem( $idx, 1, $q );
$self->SetItem( $idx, 2, $q * ( $t + 1 ) );
}
return $self;
}
sub add_to_tags { qw(controls/listctrl) }
sub title { 'Report' }
sub file { __FILE__ }
package Wx::DemoModules::wxListCtrl::Virtual;
use strict;
use base qw(Wx::ListCtrl Wx::DemoModules::wxListCtrl);
use Wx qw(:listctrl wxRED wxBLUE wxITALIC_FONT
wxDefaultPosition wxDefaultSize);
sub new {
my( $class, $parent ) = @_;
my $self = $class->SUPER::new
( $parent, -1, wxDefaultPosition, wxDefaultSize,
wxLC_REPORT | wxLC_VIRTUAL );
$self->bind_events;
$self->create_menu;
my( $small, $normal ) = $self->create_image_lists;
$self->AssignImageList( $small, wxIMAGE_LIST_SMALL );
$self->AssignImageList( $normal, wxIMAGE_LIST_NORMAL );
$self->InsertColumn( 0, "Column 1" );
$self->InsertColumn( 1, "Column 2" );
$self->InsertColumn( 2, "Column 3" );
$self->InsertColumn( 3, "Column 4" );
$self->InsertColumn( 4, "Column 5" );
$self->SetItemCount( 100000 );
return $self;
}
sub OnGetItemText {
my( $self, $item, $column ) = @_;
return "( $item, $column )";
}
sub OnGetItemAttr {
my( $self, $item ) = @_;
my $attr = Wx::ListItemAttr->new;
if( $item % 2 == 0 ) { $attr->SetTextColour( wxRED ) }
if( $item % 3 == 0 ) { $attr->SetBackgroundColour( wxBLUE ) }
if( $item % 5 == 0 ) { $attr->SetFont( wxITALIC_FONT ) }
return $attr;
}
sub OnGetItemImage {
my( $self, $item ) = @_;
return 0;
}
sub OnGetItemColumnImage {
my( $self, $item, $column ) = @_;
return $column % 3;
}
sub add_to_tags { qw(controls/listctrl) }
sub title { 'Virtual' }
sub file { __FILE__ }
package Wx::DemoModules::wxListCtrl::List;
use strict;
use base qw(Wx::ListView Wx::DemoModules::wxListCtrl);
use Wx qw(:listctrl wxDefaultPosition wxDefaultSize);
sub new {
my( $class, $parent ) = @_;
my $self = $class->SUPER::new( $parent, -1, wxDefaultPosition,
wxDefaultSize, wxLC_LIST );
$self->bind_events;
$self->create_menu;
foreach my $i ( 0 .. 40 ) {
my $idx = $self->InsertStringItem( $i, "Item $i" );
$self->SetItemData( $idx, $i );
}
return $self;
}
sub add_to_tags { qw(controls/listctrl) }
sub title { 'Text' }
sub file { __FILE__ }
package Wx::DemoModules::wxListCtrl::Icon;
use strict;
use base qw(Wx::ListView Wx::DemoModules::wxListCtrl);
use Wx qw(:listctrl wxDefaultPosition wxDefaultSize);
sub new {
my( $class, $parent ) = @_;
my $self = $class->SUPER::new( $parent, -1, wxDefaultPosition,
wxDefaultSize, wxLC_ICON );
$self->bind_events;
$self->create_menu;
my( $small, $normal ) = $self->create_image_lists;
$self->AssignImageList( $small, wxIMAGE_LIST_SMALL );
$self->AssignImageList( $normal, wxIMAGE_LIST_NORMAL );
foreach my $i ( 0 .. 7 ) {
my $idx = $self->InsertImageItem( $i, $i % 5 );
$self->SetItemData( $idx, $i );
}
return $self;
}
sub add_to_tags { qw(controls/listctrl) }
sub title { 'Icon' }
sub file { __FILE__ }
package Wx::DemoModules::wxListCtrl::IconText;
use strict;
use base qw(Wx::ListView Wx::DemoModules::wxListCtrl);
use Wx qw(:listctrl wxDefaultPosition wxDefaultSize);
sub new {
my( $class, $parent ) = @_;
my $self = $class->SUPER::new( $parent, -1, wxDefaultPosition,
wxDefaultSize, wxLC_ICON );
$self->bind_events;
$self->create_menu;
my( $small, $normal ) = $self->create_image_lists;
$self->AssignImageList( $small, wxIMAGE_LIST_SMALL );
$self->AssignImageList( $normal, wxIMAGE_LIST_NORMAL );
foreach my $i ( 0 .. 7 ) {
my $idx = $self->InsertStringImageItem( $i, "Item $i", $i % 5 );
$self->SetItemData( $idx, $i );
}
return $self;
}
sub add_to_tags { qw(controls/listctrl) }
sub title { 'Icon and Text' }
sub file { __FILE__ }
1;