272 lines
6.9 KiB
Tcl
272 lines
6.9 KiB
Tcl
# -*- 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]
|
|
}
|