123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917 |
- # -*- mode: TCL; fill-column: 75; tab-width: 8; coding: iso-latin-1-unix -*-
- #
- # $Id: HList.tcl,v 1.6 2004/03/28 02:44:57 hobbs Exp $
- #
- # HList.tcl --
- #
- # This file defines the default bindings for Tix Hierarchical Listbox
- # widgets.
- #
- # Copyright (c) 1993-1999 Ioi Kim Lam.
- # Copyright (c) 2000-2001 Tix Project Group.
- # Copyright (c) 2004 ActiveState
- #
- # See the file "license.terms" for information on usage and redistribution
- # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
- #
- global tkPriv
- if {![llength [info globals tkPriv]]} {
- tk::unsupported::ExposePrivateVariable tkPriv
- }
- #--------------------------------------------------------------------------
- # tkPriv elements used in this file:
- #
- # afterId - Token returned by "after" for autoscanning.
- # fakeRelease - Cancel the ButtonRelease-1 after the user double click
- #--------------------------------------------------------------------------
- #
- foreach fun {tkCancelRepeat} {
- if {![llength [info commands $fun]]} {
- tk::unsupported::ExposePrivateCommand $fun
- }
- }
- unset fun
- proc tixHListBind {} {
- tixBind TixHList <ButtonPress-1> {
- tixHList:Button-1 %W %x %y ""
- }
- tixBind TixHList <Shift-ButtonPress-1> {
- tixHList:Button-1 %W %x %y s
- }
- tixBind TixHList <Control-ButtonPress-1> {
- tixHList:Button-1 %W %x %y c
- }
- tixBind TixHList <ButtonRelease-1> {
- tixHList:ButtonRelease-1 %W %x %y
- }
- tixBind TixHList <Double-ButtonPress-1> {
- tixHList:Double-1 %W %x %y
- }
- tixBind TixHList <B1-Motion> {
- set tkPriv(x) %x
- set tkPriv(y) %y
- set tkPriv(X) %X
- set tkPriv(Y) %Y
- tixHList:B1-Motion %W %x %y
- }
- tixBind TixHList <B1-Leave> {
- set tkPriv(x) %x
- set tkPriv(y) %y
- set tkPriv(X) %X
- set tkPriv(Y) %Y
- tixHList:B1-Leave %W
- }
- tixBind TixHList <B1-Enter> {
- tixHList:B1-Enter %W %x %y
- }
- # Keyboard bindings
- #
- tixBind TixHList <Up> {
- tixHList:UpDown %W prev ""
- }
- tixBind TixHList <Down> {
- tixHList:UpDown %W next ""
- }
- tixBind TixHList <Shift-Up> {
- tixHList:UpDown %W prev s
- }
- tixBind TixHList <Shift-Down> {
- tixHList:UpDown %W next s
- }
- tixBind TixHList <Left> {
- tixHList:LeftRight %W left
- }
- tixBind TixHList <Right> {
- tixHList:LeftRight %W right
- }
- tixBind TixHList <Prior> {
- %W yview scroll -1 pages
- }
- tixBind TixHList <Next> {
- %W yview scroll 1 pages
- }
- tixBind TixHList <Return> {
- tixHList:Keyboard-Activate %W
- }
- tixBind TixHList <space> {
- tixHList:Keyboard-Browse %W
- }
- # Under Windows <Home> moves up, clears the sel and sets the selection
- # Under Windows <Control-Home> moves up, leaves the selection, and sets the anchor
- tixBind TixHList <Home> {
- set w %W
- $w yview moveto 0; # $w xview moveto 0
- set sel [lindex [$w info children] 0]
- # should be first not disabled
- $w anchor set $sel
- tixHList:Keyboard-Browse $w
- }
- tixBind TixHList <End> {
- set w %W
- $w yview moveto 1; # $w xview moveto 0
- $w select clear
- # should be last not disabled
- set sel [lindex [$w info children .] end]
- while {[set next [$w info next $sel]] ne "" && \
- ![$w info hidden $next] && \
- [llength [set kids [$w info child $sel]]]} {
- set sel [lindex $kids end]
- }
- $w anchor set $sel
- tixHList:Keyboard-Browse $w
- }
- tixBind TixHList <Control-Home> {
- set w %W
- $w yview moveto 0; # $w xview moveto 0
- set sel [lindex [$w info children] 0]
- # should be first not disabled
- $w anchor set $sel
- }
- tixBind TixHList <Control-End> {
- set w %W
- $w yview moveto 1; # $w xview moveto 0
- # should be last not disabled
- set sel [lindex [$w info children .] end]
- while {[set next [$w info next $sel]] ne "" && \
- ![$w info hidden $next] && \
- [llength [set kids [$w info child $sel]]]} {
- set sel [lindex $kids end]
- }
- $w anchor set $sel
- }
- #
- # Don't use tixBind because %A causes Tk 8.3.2 to crash
- #
- bind TixHList <MouseWheel> {
- %W yview scroll [expr {- (%D / 120) * 2}] units
- }
- }
- #----------------------------------------------------------------------
- #
- #
- # Key bindings
- #
- #
- #----------------------------------------------------------------------
- proc tixHList:Keyboard-Activate {w} {
- if {[tixHList:GetState $w] != 0} {
- return
- }
- set ent [$w info anchor]
- if {$ent eq ""} {
- return
- }
- if {[$w cget -selectmode] eq "single"} {
- $w select clear
- }
- $w select set $ent
- set command [$w cget -command]
- if {$command ne ""} {
- set bind(specs) {%V}
- set bind(%V) $ent
- tixEvalCmdBinding $w $command bind $ent
- }
- }
- proc tixHList:Keyboard-Browse {w} {
- if {[tixHList:GetState $w] != 0} {
- return
- }
- set ent [$w info anchor]
- if {$ent eq ""} {
- return
- }
- if {[$w cget -selectmode] eq "single"} {
- $w select clear
- }
- $w select set $ent
- tixHList:Browse $w $ent
- }
- proc tixHList:LeftRight {w spec} {
- catch {
- uplevel #0 unset $w:priv:shiftanchor
- }
- if {[tixHList:GetState $w] != 0} {
- return
- }
- set anchor [$w info anchor]
- if {$anchor eq ""} {
- set anchor [lindex [$w info children] 0]
- }
- if {$anchor eq ""} {
- return
- }
- set ent $anchor
- while {1} {
- set e $ent
- if {$spec eq "left"} {
- set ent [$w info parent $e]
- if {$ent eq "" || [$w entrycget $ent -state] eq "disabled"} {
- set ent [$w info prev $e]
- }
- } else {
- set ent [lindex [$w info children $e] 0]
- if {$ent eq "" || [$w entrycget $ent -state] eq "disabled"} {
- set ent [$w info next $e]
- }
- }
- if {$ent eq ""} {
- break
- }
- if {[$w entrycget $ent -state] eq "disabled"} {
- continue
- }
- if {[$w info hidden $ent]} {
- continue
- }
- break
- }
- if {$ent eq ""} {
- return
- }
- $w anchor set $ent
- $w see $ent
- if {[$w cget -selectmode] ne "single"} {
- $w select clear
- $w selection set $ent
- tixHList:Browse $w $ent
- }
- }
- proc tixHList:UpDown {w spec mod} {
- if {[tixHList:GetState $w] ne 0} {
- return
- }
- set anchor [$w info anchor]
- set done 0
- if {$anchor eq ""} {
- set anchor [lindex [$w info children] 0]
- if {$anchor eq ""} {
- return
- }
- if {[$w entrycget $anchor -state] ne "disabled"} {
- # That's a good anchor
- set done 1
- } else {
- # We search for the first non-disabled entry (downward)
- set spec next
- }
- }
- set ent $anchor
- # mike - bulletproofing
- if {![$w info exists $ent]} {return}
- # Find the prev/next non-disabled entry
- #
- while {!$done} {
- set ent [$w info $spec $ent]
- if {$ent eq ""} {
- break
- }
- if {[$w entrycget $ent -state] eq "disabled"} {
- continue
- }
- if {[$w info hidden $ent]} {
- continue
- }
- break
- }
- if {$ent eq ""} {
- return
- } else {
- $w see $ent
- $w anchor set $ent
- set selMode [$w cget -selectmode]
- if {$mod eq "s" && ($selMode eq "extended" || $selMode eq "multiple")} {
- global $w:priv:shiftanchor
- if {![info exists $w:priv:shiftanchor]} {
- set $w:priv:shiftanchor $anchor
- }
- $w selection clear
- # mike - bulletproofing
- if {![catch {$w selection set $ent [set $w:priv:shiftanchor]}]} {
- tixHList:Browse $w $ent
- }
- } else {
- catch {
- uplevel #0 unset $w:priv:shiftanchor
- }
- if {[$w cget -selectmode] ne "single"} {
- $w select clear
- $w selection set $ent
- tixHList:Browse $w $ent
- }
- }
- }
- }
- #----------------------------------------------------------------------
- #
- #
- # Mouse bindings
- #
- #
- #----------------------------------------------------------------------
- proc tixHList:Button-1 {w x y mod} {
- # if {[$w cget -state] eq "disabled"} {
- # return
- # }
- if {[$w cget -takefocus]} {
- focus $w
- }
- set selMode [$w cget -selectmode]
- case [tixHList:GetState $w] {
- {0} {
- if {$mod eq "s" && $selMode eq "multiple"} {
- tixHList:GoState 28 $w $x $y
- return
- }
- if {$mod eq "s" && $selMode eq "extended"} {
- tixHList:GoState 28 $w $x $y
- return
- }
- if {$mod eq "c" && $selMode eq "extended"} {
- tixHList:GoState 33 $w $x $y
- return
- }
- tixHList:GoState 1 $w $x $y
- }
- }
- }
- proc tixHList:ButtonRelease-1 {w x y} {
- case [tixHList:GetState $w] {
- {5 16} {
- tixHList:GoState 6 $w $x $y
- }
- {15} {
- tixHList:GoState 17 $w $x $y
- }
- {10 11} {
- tixHList:GoState 18 $w
- }
- {13 20} {
- tixHList:GoState 14 $w $x $y
- }
- {21} {
- tixHList:GoState 22 $w
- }
- {24} {
- tixHList:GoState 25 $w
- }
- {26 28 33} {
- tixHList:GoState 27 $w
- }
- {30} {
- tixHList:GoState 32 $w
- }
- }
- }
- proc tixHList:Double-1 {w x y} {
- case [tixHList:GetState $w] {
- {0} {
- tixHList:GoState 23 $w $x $y
- }
- }
- }
- proc tixHList:B1-Motion {w x y} {
- case [tixHList:GetState $w] {
- {1} {
- tixHList:GoState 5 $w $x $y
- }
- {5 16} {
- tixHList:GoState 5 $w $x $y
- }
- {13 20 21} {
- tixHList:GoState 20 $w $x $y
- }
- {24 26 28} {
- tixHList:GoState 26 $w $x $y
- }
- }
- }
- proc tixHList:B1-Leave {w} {
- case [tixHList:GetState $w] {
- {5} {
- tixHList:GoState 10 $w
- }
- {26} {
- tixHList:GoState 29 $w
- }
- }
- }
- proc tixHList:B1-Enter {w x y} {
- case [tixHList:GetState $w] {
- {10 11} {
- tixHList:GoState 12 $w $x $y
- }
- {29 30} {
- tixHList:GoState 31 $w $x $y
- }
- }
- }
- proc tixHList:AutoScan {w} {
- case [tixHList:GetState $w] {
- {29 30} {
- tixHList:GoState 30 $w
- }
- }
- }
- #----------------------------------------------------------------------
- #
- # STATE MANIPULATION
- #
- #
- #----------------------------------------------------------------------
- proc tixHList:GetState {w} {
- global $w:priv:state
- if {![info exists $w:priv:state]} {
- set $w:priv:state 0
- }
- return [set $w:priv:state]
- }
- proc tixHList:SetState {w n} {
- global $w:priv:state
- set $w:priv:state $n
- }
- proc tixHList:GoState {n w args} {
- # puts "going from [tixHList:GetState $w] --> $n"
- tixHList:SetState $w $n
- eval tixHList:GoState-$n $w $args
- }
- #----------------------------------------------------------------------
- # States
- #----------------------------------------------------------------------
- proc tixHList:GoState-0 {w} {
- }
- proc tixHList:GoState-1 {w x y} {
- set oldEnt [$w info anchor]
- set ent [tixHList:SetAnchor $w $x $y 1]
- if {$ent eq ""} {
- tixHList:GoState 0 $w
- return
- }
- set info [$w info item $x $y]
- if {[lindex $info 1] eq "indicator"} {
- tixHList:GoState 13 $w $ent $oldEnt
- } else {
- if {[$w entrycget $ent -state] eq "disabled"} {
- tixHList:GoState 0 $w
- } else {
- case [$w cget -selectmode] {
- {single browse} {
- tixHList:GoState 16 $w $ent
- }
- default {
- tixHList:GoState 24 $w $ent
- }
- }
- }
- }
- }
- proc tixHList:GoState-5 {w x y} {
- set oldEnt [$w info anchor]
- set ent [tixHList:SetAnchor $w $x $y]
- if {$ent eq "" || $oldEnt eq $ent} {
- return
- }
- if {[$w cget -selectmode] ne "single"} {
- tixHList:Select $w $ent
- tixHList:Browse $w $ent
- }
- }
- proc tixHList:GoState-6 {w x y} {
- set ent [tixHList:SetAnchor $w $x $y]
- if {$ent eq ""} {
- tixHList:GoState 0 $w
- return
- }
- tixHList:Select $w $ent
- tixHList:Browse $w $ent
- tixHList:GoState 0 $w
- }
- proc tixHList:GoState-10 {w} {
- tixHList:StartScan $w
- }
- proc tixHList:GoState-11 {w} {
- global tkPriv
- tixHList:DoScan $w
- set oldEnt [$w info anchor]
- set ent [tixHList:SetAnchor $w $tkPriv(x) $tkPriv(y)]
- if {$ent eq "" || $oldEnt eq $ent} {
- return
- }
- if {[$w cget -selectmode] ne "single"} {
- tixHList:Select $w $ent
- tixHList:Browse $w $ent
- }
- }
- proc tixHList:GoState-12 {w x y} {
- tkCancelRepeat
- tixHList:GoState 5 $w $x $y
- }
- proc tixHList:GoState-13 {w ent oldEnt} {
- global tkPriv
- set tkPriv(tix,indicator) $ent
- set tkPriv(tix,oldEnt) $oldEnt
- tixHList:CallIndicatorCmd $w <Arm> $ent
- }
- proc tixHList:GoState-14 {w x y} {
- global tkPriv
- if {[tixHList:InsideArmedIndicator $w $x $y]} {
- $w anchor set $tkPriv(tix,indicator)
- $w select clear
- $w select set $tkPriv(tix,indicator)
- tixHList:CallIndicatorCmd $w <Activate> $tkPriv(tix,indicator)
- } else {
- tixHList:CallIndicatorCmd $w <Disarm> $tkPriv(tix,indicator)
- }
- unset tkPriv(tix,indicator)
- tixHList:GoState 0 $w
- }
- proc tixHList:GoState-16 {w ent} {
- if {$ent ne "" && [$w cget -selectmode] ne "single"} {
- tixHList:Select $w $ent
- tixHList:Browse $w $ent
- }
- }
- proc tixHList:GoState-18 {w} {
- global tkPriv
- tkCancelRepeat
- tixHList:GoState 6 $w $tkPriv(x) $tkPriv(y)
- }
- proc tixHList:GoState-20 {w x y} {
- global tkPriv
- if {![tixHList:InsideArmedIndicator $w $x $y]} {
- tixHList:GoState 21 $w $x $y
- } else {
- tixHList:CallIndicatorCmd $w <Arm> $tkPriv(tix,indicator)
- }
- }
- proc tixHList:GoState-21 {w x y} {
- global tkPriv
- if {[tixHList:InsideArmedIndicator $w $x $y]} {
- tixHList:GoState 20 $w $x $y
- } else {
- tixHList:CallIndicatorCmd $w <Disarm> $tkPriv(tix,indicator)
- }
- }
- proc tixHList:GoState-22 {w} {
- global tkPriv
- if {$tkPriv(tix,oldEnt) ne ""} {
- $w anchor set $tkPriv(tix,oldEnt)
- } else {
- $w anchor clear
- }
- tixHList:GoState 0 $w
- }
- proc tixHList:GoState-23 {w x y} {
- set ent [tixHList:GetNearest $w $y]
- if {$ent ne ""} {
- set info [$w info item $x $y]
- if {[lindex $info 1] eq "indicator"} {
- tixHList:CallIndicatorCmd $w <Activate> $ent
- } else {
- $w select set $ent
- set command [$w cget -command]
- if {$command ne ""} {
- set bind(specs) {%V}
- set bind(%V) $ent
- tixEvalCmdBinding $w $command bind $ent
- }
- }
- }
- tixHList:GoState 0 $w
- }
- proc tixHList:GoState-24 {w ent} {
- if {$ent ne ""} {
- tixHList:Select $w $ent
- tixHList:Browse $w $ent
- }
- }
- proc tixHList:GoState-25 {w} {
- set ent [$w info anchor]
- if {$ent ne ""} {
- tixHList:Select $w $ent
- tixHList:Browse $w $ent
- }
- tixHList:GoState 0 $w
- }
- proc tixHList:GoState-26 {w x y} {
- set anchor [$w info anchor]
- if {$anchor eq ""} {
- set first [lindex [$w info children ""] 0]
- if {$first ne ""} {
- $w anchor set $first
- set anchor $first
- } else {
- return
- }
- }
- set ent [tixHList:GetNearest $w $y 1]
- if {$ent ne ""} {
- $w selection clear
- $w selection set $anchor $ent
- tixHList:Browse $w $ent
- }
- }
- proc tixHList:GoState-27 {w} {
- set ent [$w info anchor]
- if {$ent ne ""} {
- tixHList:Browse $w $ent
- }
- tixHList:GoState 0 $w
- }
- proc tixHList:GoState-28 {w x y} {
- set anchor [$w info anchor]
- if {$anchor eq ""} {
- set first [lindex [$w info children ""] 0]
- if {$first ne ""} {
- $w anchor set $first
- set anchor $first
- } else {
- return
- }
- }
- set ent [tixHList:GetNearest $w $y 1]
- if {$ent ne ""} {
- $w selection clear
- $w selection set $anchor $ent
- tixHList:Browse $w $ent
- }
- }
- proc tixHList:GoState-29 {w} {
- tixHList:StartScan $w
- }
- proc tixHList:GoState-30 {w} {
- global tkPriv
- tixHList:DoScan $w
- set anchor [$w info anchor]
- if {$anchor eq ""} {
- set first [lindex [$w info children ""] 0]
- if {$first ne ""} {
- $w anchor set $first
- set anchor $first
- } else {
- return
- }
- }
- set ent [tixHList:GetNearest $w $tkPriv(y) 1]
- if {$ent ne ""} {
- $w selection clear
- $w selection set $anchor $ent
- tixHList:Browse $w $ent
- }
- }
- proc tixHList:GoState-31 {w x y} {
- tkCancelRepeat
- tixHList:GoState 26 $w $x $y
- }
- proc tixHList:GoState-32 {w} {
- tkCancelRepeat
- tixHList:GoState 0 $w
- }
- proc tixHList:GoState-33 {w x y} {
- set ent [tixHList:GetNearest $w $y]
- if {$ent ne ""} {
- $w anchor set $ent
- if {[lsearch [$w selection get] $ent] > -1} {
- # This was missing - mike
- $w selection clear $ent
- } else {
- $w selection set $ent
- }
- tixHList:Browse $w $ent
- }
- }
- #----------------------------------------------------------------------
- #
- # Common actions
- #
- #----------------------------------------------------------------------
- proc tixHList:GetNearest {w y {disableOK 0}} {
- set ent [$w nearest $y]
- if {$ent ne ""} {
- if {!$disableOK && [$w entrycget $ent -state] eq "disabled"} {
- return ""
- }
- }
- return $ent
- }
- proc tixHList:SetAnchor {w x y {disableOK 0}} {
- set ent [tixHList:GetNearest $w $y $disableOK]
- if {$ent ne ""} {
- if {[$w entrycget $ent -state] ne "disabled"} {
- $w anchor set $ent
- # mike This is non-standard and has a wierd effect: too much motion
- # $w see $ent
- return $ent
- } elseif $disableOK {
- return $ent
- }
- }
- return ""
- }
- proc tixHList:Select {w ent} {
- if {[$w info selection] ne $ent} {
- $w selection clear
- $w select set $ent
- }
- }
- #----------------------------------------------------------------------
- #
- # Auto scan
- #
- #----------------------------------------------------------------------
- proc tixHList:StartScan {w} {
- global tkPriv
- set tkPriv(afterId) [after 50 tixHList:AutoScan $w]
- }
- proc tixHList:DoScan {w} {
- global tkPriv
- set x $tkPriv(x)
- set y $tkPriv(y)
- set X $tkPriv(X)
- set Y $tkPriv(Y)
- if {$y >= [winfo height $w]} {
- $w yview scroll 1 units
- } elseif {$y < 0} {
- $w yview scroll -1 units
- } elseif {$x >= [winfo width $w]} {
- $w xview scroll 2 units
- } elseif {$x < 0} {
- $w xview scroll -2 units
- } else {
- return
- }
- set tkPriv(afterId) [after 50 tixHList:AutoScan $w]
- }
- #----------------------------------------------------------------------
- #
- # Indicator handling
- #
- #----------------------------------------------------------------------
- proc tixHList:CallIndicatorCmd {w event ent} {
- set cmd [$w cget -indicatorcmd]
- if {$cmd ne ""} {
- set bind(type) $event
- set bind(specs) {%V}
- set bind(%V) $ent
- tixEvalCmdBinding $w $cmd bind $ent
- }
- }
- proc tixHList:InsideArmedIndicator {w x y} {
- global tkPriv
- set ent [tixHList:GetNearest $w $y 1]
- if {$ent eq "" || $ent ne $tkPriv(tix,indicator)} {
- return 0
- }
- set info [$w info item $x $y]
- if {[lindex $info 1] eq "indicator"} {
- return 1
- } else {
- return 0
- }
- }
- proc tixHList:Browse {w ent} {
- set browsecmd [$w cget -browsecmd]
- if {$browsecmd ne ""} {
- set bind(specs) {%V}
- set bind(%V) $ent
- tixEvalCmdBinding $w $browsecmd bind $ent
- }
- }
|