diff options
-rw-r--r-- | library/treectrl.tcl | 109 |
1 files changed, 80 insertions, 29 deletions
diff --git a/library/treectrl.tcl b/library/treectrl.tcl index c401871..8ed4d92 100644 --- a/library/treectrl.tcl +++ b/library/treectrl.tcl @@ -1,4 +1,4 @@ -# RCS: @(#) $Id: treectrl.tcl,v 1.35 2006/11/19 00:49:36 treectrl Exp $ +# RCS: @(#) $Id: treectrl.tcl,v 1.36 2006/11/19 23:46:13 treectrl Exp $ bind TreeCtrl <Motion> { TreeCtrl::CursorCheck %W %x %y @@ -247,6 +247,73 @@ proc ::TreeCtrl::ColumnCanMoveHere {w column before} { [$w column compare $before <= "last lock $lock next"]}] } +# ::TreeCtrl::ColumnDragFindBefore -- +# +# This is called when dragging a column header. The result is 1 if the given +# coordinates are near a column header before which the dragged column can +# be moved. +# +# Arguments: +# w The treectrl widget. +# x Window x-coord. +# y Window y-coord. +# dragColumn The column being dragged. +# indColumn_ Out: what to set -indicatorcolumn to. +# indSide_ Out: what to set -indicatorside to. + +proc ::TreeCtrl::ColumnDragFindBefore {w x y dragColumn indColumn_ indSide_} { + upvar $indColumn_ indColumn + upvar $indSide_ indSide + + scan [$w contentbox] "%d %d %d %d" x1 y1 x2 y2 + set lock [$w column cget $dragColumn -lock] + switch -- $lock { + left { + set minX 0 ; # FIXME: plus borders + set maxX $x1 + } + none { + set minX $x1 + set maxX $x2 + } + right { + set minX $x2 + set maxX [winfo width $w] ; # FIXME: minus borders + } + } + if {$x < $minX} { + set x $minX + } + if {$x >= $maxX} { + set x [expr {$maxX - 1}] + } + set id [$w identify $x $y] + if {[lindex $id 0] ne "header"} { + return 0 + } + set indColumn [lindex $id 1] + set before $indColumn + set prev [$w column id "$dragColumn prev visible"] + set next [$w column id "$dragColumn next visible"] + if {[$w column compare $indColumn == "tail"]} { + set indSide left + } elseif {$prev ne "" && [$w column compare $prev == $indColumn]} { + set indSide left + } elseif {$next ne "" && [$w column compare $next == $indColumn]} { + set before [$w column id "$indColumn next visible"] + set indSide right + } else { + scan [$w column bbox $indColumn] "%d %d %d %d" x1 y1 x2 y2 + if {$x < $x1 + ($x2 - $x1) / 2} { + set indSide left + } else { + set before [$w column id "$indColumn next visible"] + set indSide right + } + } + return [ColumnCanMoveHere $w $dragColumn $before] +} + # ::TreeCtrl::CursorAction -- # # If the given point is at the left or right edge of a resizable column, the @@ -590,34 +657,11 @@ proc ::TreeCtrl::Motion1 {w x y} { } if {$inside} { $w column dragconfigure -imageoffset [expr {$x - $Priv(columnDrag,x)}] - set id [$w identify $x $Priv(columnDrag,y)] - if {[lindex $id 0] eq "header"} { - set column [lindex $id 1] - set before $column - set prev [$w column id "$Priv(column) prev visible"] - set next [$w column id "$Priv(column) next visible"] - if {[$w column compare $column == "tail"]} { - set side left - } elseif {$prev ne "" && [$w column compare $prev == $column]} { - set side left - } elseif {$next ne "" && [$w column compare $next == $column]} { - set before [$w column id "$column next visible"] - set side right - } else { - scan [$w column bbox $column] "%d %d %d %d" x1 y1 x2 y2 - if {$x < $x1 + ($x2 - $x1) / 2} { - set side left - } else { - set before [$w column id "$column next visible"] - set side right - } - } - if {[ColumnCanMoveHere $w $Priv(column) $before]} { - $w column dragconfigure -indicatorcolumn $column \ - -indicatorside $side - } else { - $w column dragconfigure -indicatorcolumn "" - } + if {[ColumnDragFindBefore $w $x $Priv(columnDrag,y) $Priv(column) indColumn indSide]} { + $w column dragconfigure -indicatorcolumn $indColumn \ + -indicatorside $indSide + } else { + $w column dragconfigure -indicatorcolumn "" } } if {[$w column cget $Priv(column) -lock] eq "none"} { @@ -1057,6 +1101,13 @@ proc ::TreeCtrl::ColumnDragScrollCheck {w x y} { if {[lindex $bbox1 0] != [lindex $bbox2 0]} { incr Priv(columnDrag,x) [expr {[lindex $bbox2 0] - [lindex $bbox1 0]}] $w column dragconfigure -imageoffset [expr {$x - $Priv(columnDrag,x)}] + + if {[ColumnDragFindBefore $w $x $Priv(columnDrag,y) $Priv(column) indColumn indSide]} { + $w column dragconfigure -indicatorcolumn $indColumn \ + -indicatorside $indSide + } else { + $w column dragconfigure -indicatorcolumn "" + } } set Priv(autoscan,afterId,$w) [after 50 [list TreeCtrl::ColumnDragScrollCheckAux $w]] } |