package Tk::TList; use vars qw($VERSION); $VERSION = '4.006'; # $Id: //depot/Tkutf8/TList/TList.pm#6 $ use Tk qw(Ev $XS_VERSION); use base qw(Tk::Widget); use strict; Construct Tk::Widget 'TList'; bootstrap Tk::TList; sub Tk_cmd { \&Tk::tlist } Tk::Methods qw(insert index anchor delete dragsite dropsite entrycget entryconfigure info nearest see selection xview yview); use Tk::Submethods ( 'delete' => [qw(all entry offsprings siblings)], 'info' => [qw(anchor dragsite dropsite selection)], 'selection' => [qw(clear get includes set)], 'anchor' => [qw(clear set)], 'dragsite' => [qw(clear set)], 'dropsite' => [qw(clear set)], ); sub ClassInit { my ($class,$mw) = @_; $mw->bind($class,'',[ 'Button1' ] ); $mw->bind($class,'',[ 'ShiftButton1' ] ); $mw->bind($class,'','Control_ButtonRelease_1'); $mw->bind($class,'','ButtonRelease_1'); $mw->bind($class,'',[ 'Button1Motion' ] ); $mw->bind($class,'',[ 'AutoScan' ] ); $mw->bind($class,'',['Double1']); $mw->bind($class,'','Control_B1_Motion'); $mw->bind($class,'',['CtrlButton1']); $mw->bind($class,'',['CtrlButton1']); $mw->bind($class,'','B1_Enter'); $mw->bind($class,'', ['DirKey', 'up']); $mw->bind($class,'',['DirKey', 'down']); $mw->bind($class,'', ['DirKey', 'left']); $mw->bind($class,'',['DirKey', 'right']); $mw->bind($class,'','Prior'); $mw->bind($class,'','Next'); $mw->bind($class,'', ['KeyboardActivate']); $mw->bind($class,'', ['KeyboardBrowse']); return $class; } sub Control_ButtonRelease_1 { } sub ButtonRelease_1 { my $w = shift; my $Ev = $w->XEvent; $w->CancelRepeat if($w->cget('-selectmode') ne 'dragdrop'); $w->ButtonRelease1($Ev); } sub Control_B1_Motion { } sub B1_Enter { my $w = shift; my $Ev = $w->XEvent; $w->CancelRepeat if($w->cget('-selectmode') ne 'dragdrop'); } sub Prior { shift->yview('scroll', -1, 'pages') } sub Next { shift->yview('scroll', 1, 'pages') } sub Button1 { my $w = shift; my $Ev = $w->XEvent; delete $w->{'shiftanchor'}; $w->focus() if($w->cget('-takefocus')); my $mode = $w->cget('-selectmode'); if ($mode eq 'dragdrop') { # $w->Send_WaitDrag($Ev->y); return; } my $ent = $w->GetNearest($Ev->x, $Ev->y); return unless defined $ent; my $browse = 0; if($mode eq 'single') { $w->anchor('set', $ent); } elsif($mode eq 'browse') { $w->anchor('set', $ent); $w->selection('clear' ); $w->selection('set', $ent); $browse = 1; } elsif($mode eq 'multiple') { $w->selection('clear'); $w->anchor('set', $ent); $w->selection('set', $ent); $browse = 1; } elsif($mode eq 'extended') { $w->anchor('set', $ent); $w->selection('clear'); $w->selection('set', $ent); $browse = 1; } $w->Callback(-browsecmd => $ent) if ($browse); } sub ShiftButton1 { my $w = shift; my $Ev = $w->XEvent; my $to = $w->GetNearest($Ev->x,$Ev->y); delete $w->{'shiftanchor'}; return unless defined $to; my $mode = $w->cget('-selectmode'); if ($mode eq 'extended') { my $from = $w->info('anchor'); if (defined $from) { $w->selection('clear'); $w->selection('set', $from, $to); } else { $w->anchor('set', $to); $w->selection('clear'); $w->selection('set', $to); } } } sub GetNearest { my ($w,$x,$y) = @_; my $ent = $w->nearest($x,$y); if (defined $ent) { my $state = $w->entrycget($ent, '-state'); return $ent if (!defined($state) || $state ne 'disabled'); } return undef; } sub ButtonRelease1 { my ($w, $Ev) = @_; delete $w->{'shiftanchor'}; my $mode = $w->cget('-selectmode'); if($mode eq 'dragdrop') { # $w->Send_DoneDrag(); return; } my ($x, $y) = ($Ev->x, $Ev->y); my $ent = $w->GetNearest($x,$y); return unless defined $ent; if($x < 0 || $y < 0 || $x > $w->width || $y > $w->height) { $w->selection('clear'); return if($mode eq 'single' || $mode eq 'browse') } else { if($mode eq 'single' || $mode eq 'browse') { $w->anchor('set', $ent); $w->selection('clear'); $w->selection('set', $ent); } elsif($mode eq 'multiple') { $w->selection('set', $ent); } elsif($mode eq 'extended') { $w->selection('set', $ent); } } $w->Callback(-browsecmd =>$ent); } sub Button1Motion { my $w = shift; my $Ev = $w->XEvent; delete $w->{'shiftanchor'}; my $mode = $w->cget('-selectmode'); if ($mode eq 'dragdrop') { # $w->Send_StartDrag(); return; } my $ent = $w->GetNearest($Ev->x,$Ev->y); return unless defined $ent; if($mode eq 'single') { $w->anchor('set', $ent); } elsif($mode eq 'multiple' || $mode eq 'extended') { my $from = $w->info('anchor'); if (defined $from) { $w->selection('clear'); $w->selection('set', $from, $ent); } else { $w->anchor('set', $ent); $w->selection('clear'); $w->selection('set', $ent); } } if($mode ne 'single') { $w->Callback(-browsecmd =>$ent); } } sub Double1 { my $w = shift; my $Ev = $w->XEvent; delete $w->{'shiftanchor'}; my $ent = $w->GetNearest($Ev->x,$Ev->y); return unless defined $ent; $w->anchor('set', $ent) unless defined($w->info('anchor')); $w->selection('set', $ent); $w->Callback(-command => $ent); } sub CtrlButton1 { my $w = shift; my $Ev = $w->XEvent; delete $w->{'shiftanchor'}; my $ent = $w->GetNearest($Ev->x,$Ev->y); return unless defined $ent; my $mode = $w->cget('-selectmode'); if($mode eq 'extended') { $w->anchor('set', $ent) unless defined( $w->info('anchor') ); if($w->selection('includes', $ent)) { $w->selection('clear', $ent); } else { $w->selection('set', $ent); } $w->Callback(-browsecmd =>$ent); } } sub DirKey { my ($w,$dir) = @_; my $anchor = $w->info('anchor'); my $new = (defined $anchor) ? $w->info($dir,$anchor) : 0; $w->anchorSet($new); $w->see($new); } sub KeyboardActivate { my $w = shift; my $anchor = $w->info('anchor'); return unless defined $anchor; if($w->cget('-selectmode')) { $w->selection('clear'); $w->selection('set', $anchor); } $w->Callback(-command => $anchor); } sub KeyboardBrowse { my $w = shift; my $anchor = $w->info('anchor'); return unless defined $anchor; if($w->cget('-selectmode')) { $w->selection('clear'); $w->selection('set', $anchor); } $w->Callback(-browsecmd =>$anchor); } sub AutoScan { my $w = shift; return if($w->cget('-selectmode') eq 'dragdrop'); my $Ev = $w->XEvent; my $y = $Ev->y; my $x = $Ev->x; if($y >= $w->height) { $w->yview('scroll', 1, 'units'); } elsif($y < 0) { $w->yview('scroll', -1, 'units'); } elsif($x >= $w->width) { $w->xview('scroll', 2, 'units'); } elsif($x < 0) { $w->xview('scroll', -2, 'units'); } else { return; } $w->RepeatId($w->after(50,[AutoScan => $w])); $w->Button1Motion; } 1;