File Coverage

blib/lib/Wx/DemoModules/wxTreeCtrl.pm
Criterion Covered Total %
statement 6 6 100.0
branch n/a
condition n/a
subroutine 2 2 100.0
pod n/a
total 8 8 100.0


line stmt bran cond sub pod time code
1             #############################################################################
2             ## Name: lib/Wx/DemoModules/wxTreeCtrl.pm
3             ## Purpose: wxPerl demo helper for Wx::TreeCtrl
4             ## Author: Mattia Barbon
5             ## Modified by:
6             ## Created: 17/02/2001
7             ## RCS-ID: $Id: wxTreeCtrl.pm 3324 2012-08-09 01:21:55Z mdootson $
8             ## Copyright: (c) 2001, 2004, 2006 Mattia Barbon
9             ## Licence: This program is free software; you can redistribute it and/or
10             ## modify it under the same terms as Perl itself
11             #############################################################################
12              
13             package Wx::DemoModules::wxTreeCtrl;
14              
15 1     1   1330 use strict;
  1         3  
  1         35  
16 1     1   4 use base qw(Wx::TreeCtrl);
  1         2  
  1         696  
17              
18             use Wx qw(:treectrl :window wxDefaultPosition wxDefaultSize
19             wxMOD_ALT wxMOD_SHIFT wxMOD_META wxMOD_CONTROL);
20             use Wx::Event qw(EVT_TREE_BEGIN_DRAG EVT_TREE_END_DRAG
21             EVT_TREE_SEL_CHANGED EVT_MENU
22             EVT_TREE_KEY_DOWN);
23              
24             use Wx::DemoModules::lib::Utility;
25              
26             sub new {
27             my( $class, $parent ) = @_;
28             my $self = $class->SUPER::new
29             ( $parent, -1, wxDefaultPosition, wxDefaultSize,
30             wxTR_HAS_BUTTONS|wxTR_EDIT_LABELS|wxSUNKEN_BORDER );
31              
32             my $imagelist = Wx::ImageList->new( 16, 16, 1 );
33             $imagelist->Add( Wx::GetWxPerlIcon( 1 ) );
34             $imagelist->Add
35             ( resize_to( Wx::wxTheApp()->GetStdIcon( Wx::wxICON_EXCLAMATION() ),
36             16 ) );
37              
38             $self->AssignImageList( $imagelist );
39             $self->PopulateTree( 2, 3 );
40              
41             EVT_TREE_BEGIN_DRAG( $self, $self, \&OnBeginDrag );
42             EVT_TREE_END_DRAG( $self, $self, \&OnEndDrag );
43             EVT_TREE_SEL_CHANGED( $self, $self, \&OnSelChange );
44             EVT_TREE_KEY_DOWN( $self, $self, \&OnTreeKeyDown );
45              
46             # drop down menus
47             my $top = Wx::GetTopLevelParent( $self );
48             my $treemenu = Wx::Menu->new;
49             EVT_MENU( $top, $treemenu->Append( -1, "Traverse" ),
50             sub { $self->on_traverse } );
51             my $itemmenu = Wx::Menu->new;
52             EVT_MENU( $top, $itemmenu->Append( -1, "Rename" ),
53             sub { $self->on_rename } );
54             EVT_MENU( $top, $itemmenu->Append( -1, "Sort childs ascending" ),
55             sub { $self->on_sort( 1 ) } );
56             EVT_MENU( $top, $itemmenu->Append( -1, "Sort childs descending" ),
57             sub { $self->on_sort( 0 ) } );
58             $itemmenu->AppendSeparator;
59             EVT_MENU( $top, $itemmenu->Append( -1, "Deselect All" ),
60             sub { $self->UnselectAll } );
61             $self->{menu} = [ '&Tree Control', $treemenu,
62             '&Items', $itemmenu ];
63              
64             return $self;
65             }
66              
67             sub on_sort {
68             my( $self, $ascending ) = @_;
69             my $item = $self->GetSelection;
70              
71             if( !$item->IsOk ) {
72             Wx::MessageBox( "Must select an item, first!" );
73             return;
74             }
75             $self->DoSortChildren( $item, $ascending );
76             }
77              
78             sub on_rename {
79             my( $self ) = @_;
80             my $item = $self->GetSelection;
81              
82             if( !$item->IsOk ) {
83             Wx::MessageBox( "Must select an item, first!" );
84             return;
85             }
86             $self->EditLabel( $item );
87             }
88              
89             sub on_traverse {
90             my( $self ) = @_;
91              
92             $self->DoTraverse( $self->GetRootItem, -1 );
93             }
94              
95             sub DoTraverse {
96             my( $self, $parent ) = @_;
97              
98             # non-leaf: display now
99             Wx::LogMessage( "%s", $self->GetItemText( $parent ) );
100              
101             my( $id, $cookie ) = $self->GetFirstChild( $parent );
102             while( $id->IsOk ) {
103             # traverse childs first
104             if( $self->ItemHasChildren( $id ) ) {
105             $self->DoTraverse( $id, -1 );
106             } else {
107             # display leaf
108             Wx::LogMessage( "%s", $self->GetItemText( $id ) );
109             }
110             ( $id, $cookie ) = $self->GetNextChild( $parent, $cookie );
111             }
112             }
113              
114             sub PopulateTree {
115             my( $self, $childs, $depth ) = @_;
116              
117             my $root = $self->AddRoot( 'Root', -1, -1,
118             Wx::TreeItemData->new( 'Data' ) );
119             $self->PopulateRecursively( $root, $childs, $depth );
120             }
121              
122             sub PopulateRecursively {
123             my( $self, $parent, $childs, $depth ) = @_;
124             my( $text, $item );
125              
126             use Wx qw(wxITALIC_FONT wxRED wxBLUE);
127              
128             foreach my $i ( 1 .. $childs ) {
129             my $text = ( $depth > 0 ) ? "Node $i/$childs" : "Leaf $i/$childs";
130              
131             $item = $self->AppendItem( $parent, $text, 0, 1,
132             Wx::TreeItemData->new( $text ) );
133             $self->SetItemFont( $item, wxITALIC_FONT ) if $depth == 0;
134             $self->SetItemBackgroundColour( $item, wxBLUE ) if $depth == 1;
135             $self->SetItemTextColour( $item, wxRED ) if $depth == 2;
136              
137             if( $i == 2 ) {
138             my $t = Wx::TreeItemData->new; $t->SetData( "Foo $i" );
139             $self->SetItemData( $item, $t );
140             }
141             $self->SetPlData( $item, "Bar $i" )
142             if $i == 3;
143             $self->GetItemData( $item )->SetData( "A" )
144             if $i == 4;
145              
146             $self->PopulateRecursively( $item, $childs + 1, $depth - 1 )
147             if $depth >= 1;
148             }
149             }
150              
151             sub DoSortChildren {
152             my( $self, $item, $ascending ) = @_;
153              
154             $self->{reverse_sort} = !$ascending;
155             $self->SortChildren( $item );
156             }
157              
158             sub OnCompareItems {
159             my( $self, $item1, $item2 ) = @_;
160              
161             if( $self->{reverse_sort} ) {
162             return $self->SUPER::OnCompareItems( $item2, $item1 );
163             } else {
164             return $self->SUPER::OnCompareItems( $item1, $item2 );
165             }
166             }
167              
168             sub OnBeginDrag {
169             my( $self, $event ) = @_;
170              
171             if( $event->GetItem != $self->GetRootItem ) {
172             $self->{dragged_item} = $event->GetItem;
173              
174             Wx::LogMessage( "Dragging %s",
175             $self->GetItemText( $self->{dragged_item} ) );
176              
177             $event->Allow;
178             } else {
179             Wx::LogMessage( "This item can't be dragged" );
180             }
181             }
182              
183             # this is only a test: a real implementation probably will
184             # move ( mot copy ) a node, and probably the node childrens, too
185             # and drop the item at the right place ( not just append it )
186             sub OnEndDrag {
187             my( $self, $event ) = @_;
188             my( $src, $dst ) = ( $self->{dragged_item}, $event->GetItem );
189              
190             if( $dst->IsOk && !$self->ItemHasChildren( $dst ) ) {
191             # copy to parent
192             $dst = $self->GetParent( $dst );
193             }
194              
195             if( !$dst->IsOk ) {
196             Wx::LogMessage( "Can't drop here" );
197             return;
198             }
199              
200             my $text = $self->GetItemText( $src );
201             Wx::LogMessage( "'%s' copied to '%s'", $text, $self->GetItemText( $dst ) );
202             $self->AppendItem( $dst, $text, -1 );
203             }
204              
205             sub OnSelChange {
206             my( $self, $event ) = @_;
207             my $item = $event->GetItem;
208             my $data;
209              
210             Wx::LogMessage( 'Text: %s', $self->GetItemText( $item ) );
211             if( $data = $self->GetItemData( $item ) ) {
212             Wx::LogMessage( 'Data: %s', $data->GetData );
213             }
214             Wx::LogMessage( 'Perl data: %s', $self->GetPlData( $item ) );
215             }
216              
217             sub OnTreeKeyDown {
218             my( $self, $event ) = @_;
219             my $keycode = $event->GetKeyCode;
220             my $output = qq(KEYCODE: $keycode);
221            
222             # Wx >= 0.9911
223             if( defined( &Wx::TreeEvent::GetKeyEvent ) ) {
224             my $modifiers = $event->GetKeyEvent->GetModifiers;
225             $output .= qq( MODIFIERS:);
226             if( $modifiers & wxMOD_ALT ) {
227             $output .= qq( Alt);
228             }
229             if( $modifiers & wxMOD_SHIFT ) {
230             $output .= qq( Shift);
231             }
232             if( $modifiers & wxMOD_CONTROL ) {
233             $output .= qq( Control);
234             }
235             if( $modifiers & wxMOD_META ) {
236             $output .= qq( Meta);
237             }
238             }
239             Wx::LogMessage( qq(Keys $output) );
240            
241             }
242              
243              
244             sub menu { @{$_[0]->{menu}} }
245             sub add_to_tags { qw(controls) }
246             sub title { 'wxTreeCtrl' }
247              
248             1;