home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World 2000 December
/
PCWorld_2000-12_cd.bin
/
Komunikace
/
Comanche
/
BWidget-1.2
/
demo
/
tree.tcl
< prev
next >
Wrap
Text File
|
2000-11-02
|
8KB
|
255 lines
namespace eval DemoTree {
variable count
variable dblclick
}
proc DemoTree::create { nb } {
set frame [$nb insert end demoTree -text "Tree"]
set pw [PanedWindow $frame.pw -side top]
set pane [$pw add -weight 1]
set title [TitleFrame $pane.lf -text "Directory tree"]
set sw [ScrolledWindow [$title getframe].sw \
-relief sunken -borderwidth 2]
set tree [Tree $sw.tree \
-relief flat -borderwidth 0 -width 15 -highlightthickness 0\
-redraw 0 -dropenabled 1 -dragenabled 1 \
-dragevent 3 \
-droptypes {
TREE_NODE {copy {} move {} link {}}
LISTBOX_ITEM {copy {} move {} link {}}
} \
-opencmd "DemoTree::moddir 1 $sw.tree" \
-closecmd "DemoTree::moddir 0 $sw.tree"]
$sw setwidget $tree
pack $sw -side top -expand yes -fill both
pack $title -fill both -expand yes
set pane [$pw add -weight 2]
set lf [TitleFrame $pane.lf -text "Content"]
set sw [ScrolledWindow [$lf getframe].sw \
-scrollbar horizontal -auto none -relief sunken -borderwidth 2]
set list [ListBox::create $sw.lb \
-relief flat -borderwidth 0 \
-dragevent 3 \
-dropenabled 1 -dragenabled 1 \
-width 20 -highlightthickness 0 -multicolumn true \
-redraw 0 -dragenabled 1 \
-droptypes {
TREE_NODE {copy {} move {} link {}}
LISTBOX_ITEM {copy {} move {} link {}}}]
$sw setwidget $list
pack $sw $lf -fill both -expand yes
pack $pw -fill both -expand yes
$tree bindText <ButtonPress-1> "DemoTree::select tree 1 $tree $list"
$tree bindText <Double-ButtonPress-1> "DemoTree::select tree 2 $tree $list"
$list bindText <ButtonPress-1> "DemoTree::select list 1 $tree $list"
$list bindText <Double-ButtonPress-1> "DemoTree::select list 2 $tree $list"
$list bindImage <Double-ButtonPress-1> "DemoTree::select list 2 $tree $list"
$nb itemconfigure demoTree \
-createcmd "DemoTree::init $tree $list" \
-raisecmd {
regexp {[0-9]+x[0-9]+([+-][0-9]+)([+-][0-9]+)} [wm geom .] \
global_foo global_w global_h
BWidget::place .top 0 0 at [expr {$global_w-[winfo screenwidth .]}] $global_h
wm deiconify .top
bind . <Unmap> {wm withdraw .top}
bind . <Map> {wm deiconify .top}
bind . <Configure> {
if { ![string compare %W "."] } {
regexp {[0-9]+x[0-9]+([+-][0-9]+)([+-][0-9]+)} [wm geom .] \
global_foo global_w global_h
BWidget::place .top 0 0 at [expr {$global_w-[winfo screenwidth .]}] $global_h
}
}
} \
-leavecmd {
wm withdraw .top
bind . <Unmap> {}
bind . <Map> {}
bind . <Configure> {}
return 1
}
}
proc DemoTree::init { tree list args } {
global tcl_platform
variable count
set count 0
if { $tcl_platform(platform) == "unix" } {
set rootdir [glob "~"]
} else {
set rootdir "c:\\"
}
$tree insert end root home -text $rootdir -data $rootdir -open 1 \
-image [Bitmap::get openfold]
getdir $tree home $rootdir
DemoTree::select tree 1 $tree $list home
$tree configure -redraw 1
$list configure -redraw 1
# ScrollView
toplevel .top -relief raised -borderwidth 2
wm protocol .top WM_DELETE_WINDOW {
# don't kill me
}
wm overrideredirect .top 1
wm withdraw .top
wm transient .top .
ScrollView .top.sv -window $tree -fill black
pack .top.sv -fill both -expand yes
}
proc DemoTree::getdir { tree node path } {
variable count
set lentries [glob -nocomplain [file join $path "*"]]
set lfiles {}
foreach f $lentries {
set tail [file tail $f]
if { [file isdirectory $f] } {
$tree insert end $node n:$count \
-text $tail \
-image [Bitmap::get folder] \
-drawcross allways \
-data $f
incr count
} else {
lappend lfiles $tail
}
}
$tree itemconfigure $node -drawcross auto -data $lfiles
}
proc DemoTree::moddir { idx tree node } {
if { $idx && [$tree itemcget $node -drawcross] == "allways" } {
getdir $tree $node [$tree itemcget $node -data]
if { [llength [$tree nodes $node]] } {
$tree itemconfigure $node -image [Bitmap::get openfold]
} else {
$tree itemconfigure $node -image [Bitmap::get folder]
}
} else {
$tree itemconfigure $node -image [Bitmap::get [lindex {folder openfold} $idx]]
}
}
proc DemoTree::select { where num tree list node } {
variable dblclick
set dblclick 1
if { $num == 1 } {
if { $where == "tree" && [lsearch [$tree selection get] $node] != -1 } {
unset dblclick
after 500 "DemoTree::edit tree $tree $list $node"
return
}
if { $where == "list" && [lsearch [$list selection get] $node] != -1 } {
unset dblclick
after 500 "DemoTree::edit list $tree $list $node"
return
}
if { $where == "tree" } {
select_node $tree $list $node
} else {
$list selection set $node
}
} elseif { $where == "list" && [$tree exists $node] } {
set parent [$tree parent $node]
while { $parent != "root" } {
$tree itemconfigure $parent -open 1
set parent [$tree parent $parent]
}
select_node $tree $list $node
}
}
proc DemoTree::select_node { tree list node } {
$tree selection set $node
update
eval $list delete [$list item 0 end]
set dir [$tree itemcget $node -data]
if { [$tree itemcget $node -drawcross] == "allways" } {
getdir $tree $node $dir
set dir [$tree itemcget $node -data]
}
foreach subnode [$tree nodes $node] {
$list insert end $subnode \
-text [$tree itemcget $subnode -text] \
-image [Bitmap::get folder]
}
set num 0
foreach f $dir {
$list insert end f:$num \
-text $f \
-image [Bitmap::get file]
incr num
}
}
proc DemoTree::edit { where tree list node } {
variable dblclick
if { [info exists dblclick] } {
return
}
if { $where == "tree" && [lsearch [$tree selection get] $node] != -1 } {
set res [$tree edit $node [$tree itemcget $node -text]]
if { $res != "" } {
$tree itemconfigure $node -text $res
if { [$list exists $node] } {
$list itemconfigure $node -text $res
}
$tree selection set $node
}
return
}
if { $where == "list" } {
set res [$list edit $node [$list itemcget $node -text]]
if { $res != "" } {
$list itemconfigure $node -text $res
if { [$tree exists $node] } {
$tree itemconfigure $node -text $res
} else {
set cursel [$tree selection get]
set index [expr {[$list index $node]-[llength [$tree nodes $cursel]]}]
set data [$tree itemcget $cursel -data]
set data [lreplace $data $index $index $res]
$tree itemconfigure $cursel -data $data
}
$list selection set $node
}
}
}
proc DemoTree::expand { tree but } {
if { [set cur [$tree selection get]] != "" } {
if { $but == 0 } {
$tree opentree $cur
} else {
$tree closetree $cur
}
}
}