Spaces:
Running
Running
# -*- mode: TCL; fill-column: 75; tab-width: 8; coding: iso-latin-1-unix -*- | |
# | |
# $Id: DirList.tcl,v 1.5 2004/03/28 02:44:57 hobbs Exp $ | |
# | |
# DirList.tcl -- | |
# | |
# Implements the tixDirList widget. | |
# | |
# - overrides the -browsecmd and -command options of the | |
# HList subwidget | |
# | |
# 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. | |
# | |
tixWidgetClass tixDirList { | |
-classname TixDirList | |
-superclass tixScrolledHList | |
-method { | |
chdir | |
} | |
-flag { | |
-browsecmd -command -dircmd -disablecallback | |
-root -rootname -showhidden -value | |
} | |
-configspec { | |
{-browsecmd browseCmd BrowseCmd ""} | |
{-command command Command ""} | |
{-dircmd dirCmd DirCmd ""} | |
{-disablecallback disableCallback DisableCallback 0 tixVerifyBoolean} | |
{-root root Root ""} | |
{-rootname rootName RootName ""} | |
{-showhidden showHidden ShowHidden 0 tixVerifyBoolean} | |
{-value value Value ""} | |
} | |
-default { | |
{.scrollbar auto} | |
{*borderWidth 1} | |
{*hlist.background #c3c3c3} | |
{*hlist.indent 7} | |
{*hlist.relief sunken} | |
{*hlist.height 10} | |
{*hlist.width 20} | |
{*hlist.padX 2} | |
{*hlist.padY 0} | |
{*hlist.wideSelection 0} | |
{*hlist.drawBranch 0} | |
{*hlist.highlightBackground #d9d9d9} | |
{*hlist.itemType imagetext} | |
{*hlist.takeFocus 1} | |
} | |
-forcecall { | |
-value | |
} | |
} | |
# Important data members: | |
# | |
# data(vpath) | |
# The currently selected vpath. This internal variable is useful on | |
# the Win95 platform, where an directory may correspond to more than | |
# one node in the hierarchy. For example, C:\Windows\Desktop\Foo | |
# can appead as "Desktop\Foo" and | |
# "Desktop\My Computer\C:\Windows\Desktop\Foo". This variable tells us | |
# which icon should we show given the same DOS pathname. | |
# | |
proc tixDirList:InitWidgetRec {w} { | |
upvar #0 $w data | |
tixChainMethod $w InitWidgetRec | |
} | |
proc tixDirList:ConstructWidget {w} { | |
upvar #0 $w data | |
tixChainMethod $w ConstructWidget | |
$data(w:hlist) config -separator [tixFSSep] -selectmode "single" | |
} | |
proc tixDirList:SetBindings {w} { | |
upvar #0 $w data | |
tixChainMethod $w SetBindings | |
$data(w:hlist) config \ | |
-browsecmd [list tixDirList:Browse $w] \ | |
-command [list tixDirList:Command $w] | |
if {$data(-value) eq "" | |
|| [catch {set data(-value) [tixFSNormalize $data(-value)]}]} { | |
set data(-value) [pwd] | |
} | |
set data(vpath) [tixFSInternal $data(-value)] | |
} | |
#---------------------------------------------------------------------- | |
# Incoming-Events | |
#---------------------------------------------------------------------- | |
proc tixDirList:Browse {w args} { | |
upvar #0 $w data | |
set vpath [tixEvent flag V] | |
set value [$data(w:hlist) info data $vpath] | |
tixDirList:HighLight $w $vpath | |
set data(vpath) $vpath | |
set data(-value) [tixFSExternal $value] | |
tixDirList:CallBrowseCmd $w $data(-value) | |
} | |
proc tixDirList:Command {w args} { | |
upvar #0 $w data | |
set vpath [tixEvent value] | |
set value [$data(w:hlist) info data $vpath] | |
set data(-value) [tixFSExternal $value] | |
tixDirList:LoadDir $w [tixFSNativeNorm $value] $vpath | |
tixDirList:HighLight $w $vpath | |
set data(vpath) $vpath | |
tixDirList:CallCommand $w $data(-value) | |
} | |
#---------------------------------------------------------------------- | |
# Outgoing-Events | |
#---------------------------------------------------------------------- | |
proc tixDirList:CallBrowseCmd {w npath} { | |
upvar #0 $w data | |
if {[llength $data(-browsecmd)]} { | |
set bind(specs) "%V" | |
set bind(%V) $npath | |
tixEvalCmdBinding $w $data(-browsecmd) bind $npath | |
} | |
} | |
proc tixDirList:CallCommand {w npath} { | |
upvar #0 $w data | |
if {[llength $data(-command)] && !$data(-disablecallback)} { | |
set bind(specs) "%V" | |
set bind(%V) $npath | |
tixEvalCmdBinding $w $data(-command) bind $npath | |
} | |
} | |
#---------------------------------------------------------------------- | |
# Directory loading | |
#---------------------------------------------------------------------- | |
proc tixDirList:LoadDir {w {npath ""} {vpath ""}} { | |
upvar #0 $w data | |
tixBusy $w on $data(w:hlist) | |
$data(w:hlist) delete all | |
if {$npath eq ""} { | |
set npath [tixFSNativeNorm $data(-value)] | |
set vpath [tixFSInternal $npath] | |
} | |
tixDirList:ListHierachy $w $npath $vpath | |
tixDirList:ListSubDirs $w $npath $vpath | |
tixWidgetDoWhenIdle tixBusy $w off $data(w:hlist) | |
} | |
proc tixDirList:ListHierachy {w npath vpath} { | |
upvar #0 $w data | |
set img [tix getimage openfold] | |
set curpath "" | |
foreach part [tixFSAncestors $npath] { | |
set curpath [file join $curpath $part] | |
set text [tixFSDisplayFileName $curpath] | |
set vpath [tixFSInternal $curpath] | |
$data(w:hlist) add $vpath -text $text -data $curpath -image $img | |
} | |
} | |
proc tixDirList:ListSubDirs {w npath vpath} { | |
upvar #0 $w data | |
$data(w:hlist) entryconfig $vpath -image [tix getimage act_fold] | |
set img [tix getimage folder] | |
foreach ent [tixFSListDir $npath 1 0 0 $data(-showhidden)] { | |
set curpath [file join $npath $ent] | |
set vp [tixFSInternal $curpath] | |
if {![$data(w:hlist) info exists $vp]} { | |
$data(w:hlist) add $vp -text $ent -data $curpath -image $img | |
} | |
} | |
} | |
proc tixDirList:SetValue {w npath vpath {flag ""}} { | |
upvar #0 $w data | |
if {$flag eq "reload" || ![$data(w:hlist) info exists $vpath]} { | |
tixDirList:LoadDir $w $npath $vpath | |
} | |
tixDirList:HighLight $w $vpath | |
set data(-value) [tixFSNativeNorm $npath] | |
set data(vpath) $vpath | |
tixDirList:CallCommand $w $data(-value) | |
} | |
proc tixDirList:HighLight {w vpath} { | |
upvar #0 $w data | |
if {$data(vpath) ne $vpath} { | |
set old $data(vpath) | |
if {[$data(w:hlist) info exists $old]} { | |
# Un-highlight the originally selected entry by changing its | |
# folder image | |
if {[llength [$data(w:hlist) info children $old]]} { | |
set img [tix getimage openfold] | |
} else { | |
set img [tix getimage folder] | |
} | |
$data(w:hlist) entryconfig $old -image $img | |
} | |
} | |
# Highlight the newly selected entry | |
# | |
$data(w:hlist) entryconfig $vpath -image [tix getimage act_fold] | |
$data(w:hlist) anchor set $vpath | |
$data(w:hlist) select clear | |
$data(w:hlist) select set $vpath | |
$data(w:hlist) see $vpath | |
} | |
#---------------------------------------------------------------------- | |
# Config options | |
#---------------------------------------------------------------------- | |
proc tixDirList:config-value {w value} { | |
upvar #0 $w data | |
tixDirList:chdir $w $value | |
return $data(-value) | |
} | |
proc tixDirList:config-showhidden {w value} { | |
upvar #0 $w data | |
tixWidgetDoWhenIdle tixDirList:LoadDir $w | |
} | |
#---------------------------------------------------------------------- | |
# Public methods | |
#---------------------------------------------------------------------- | |
proc tixDirList:chdir {w value} { | |
upvar #0 $w data | |
set npath [tixFSNativeNorm $value] | |
tixDirList:SetValue $w $npath [tixFSInternal $npath] | |
} | |