home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World 2000 February
/
PCWorld_2000-02_cd.bin
/
live
/
usr
/
X11R6
/
lib
/
X11
/
cbb
/
filebox.tcl
< prev
next >
Wrap
Text File
|
1998-10-07
|
11KB
|
371 lines
#!/usr/bin/wish -f
# 'CBB' -- Check Book Balancer
#
# filebox.tcl -- file selection box (yanked out of tkispell) with
# minute modifications.
#
# $Id: filebox.tcl,v 2.4 1996/12/17 14:53:57 curt Exp $
# (Log is kept at end of this file)
#-----------------------------------------------------------------------
# File Selection Box
#-----------------------------------------------------------------------
global ut_glob
# whether default is to show hidden files in fsbox
if {![info exists ut_glob(hidden)]} {set ut_glob(hidden) 0}
global ut_hidden; set ut_hidden $ut_glob(hidden)
# whether to make dialogs transient
if {![info exists ut_glob(transient)]} {set ut_glob(transient) 1}
# possible prefix to Escape for cancels (needed by emacs users)
if {![info exists ut_glob(cancel)]} {set ut_glob(cancel) ""}
# procedure to call to get key seq for special bindings
if {![info exists ut_glob(key-hook)]} {set ut_glob(key-hook) ut:key-hook}
proc ut:key-hook {k} {return <Meta-[string tolower $k]>}
###############################################
# BEGINNING OF FILESELECTOR PACKAGES
# hacked from code by Mario J. Silva
# Arguments:
# -prompt a text string to prompt with
# -cancelvalue value to return if Cancel pressed
# -default value to set as default
# -grab whether to grab focus or not
# -callback possible command to eval before event loop
# which will be given the fileselector toplevel
# as a first argument
# -cbargs arguments to callback in addition to toplevel
# -master name of toplevel to be transient to
# -title title for fileselector toplevel
# -dir startup directory
# -hidden whether to show hidden directories
# -quick pair list of label and directory for quick change
#
proc ut:fsbox { args } {
global env ut_fs ut_hidden ut_glob
j:parse_args { \
{prompt "File: "} \
{default ""} \
{cancelvalue ""} \
{grab 0} \
{callback ""} \
{cbargs ""} \
{master ""} \
{title "Select File"} \
{dir ""} \
{hidden -1} \
{quick {}} }
set w .utfsbox
if {[winfo exists $w]} {return $cancelvalue }
set ut_fs(result) $cancelvalue
if {$hidden < 0} {
set hidden $ut_hidden
} else { set ut_hidden $hidden }
toplevel $w -class UTFSBox
wm protocol $w WM_DELETE_WINDOW "ut:fscancelcmd $w {$cancelvalue} $grab"
if {[string length $master]} {
if $ut_glob(transient) {wm transient $w $master}
set xpos [expr [winfo rootx $master]+[winfo width $master]/3]
set ypos [expr [winfo rooty $master]+[winfo height $master]/3]
wm geometry $w +${xpos}+${ypos}
}
wm title $w $title
if {$grab != 0} {after 20 grab $w}
# widgets
frame $w.file -bd 10
frame $w.bframe -bd 10
pack $w.bframe -side bottom
pack $w.file -side top -expand 1 -fill both
frame $w.file.eframe
frame $w.file.sframe
frame $w.file.bframe
if {[string length $dir] && [file isdirectory $dir]} {cd $dir}
set dir [pwd]
if {[string length $dir] > 32} {
set dir [join "... $dir" ""]
while {[string length $dir] > 32} {
set dir [string range $dir 4 end]
set dir [string range $dir [string first "/" $dir] end]
set dir [join "... $dir" ""]
}
}
label $w.file.dirlabel -width 32 -anchor w -text "Dir: $dir"
pack $w.file.dirlabel -side top -fill x
pack $w.file.eframe -side top -fill x
pack $w.file.bframe -side bottom -fill x
pack $w.file.sframe -side top -expand 1 -fill both
label $w.file.eframe.label -text "$prompt"
entry $w.file.eframe.entry -relief sunken \
-exportselection 0
$w.file.eframe.entry insert 0 $default
pack $w.file.eframe.label -side left
pack $w.file.eframe.entry -side left -pady 10 -expand true \
-fill x -ipady 3
scrollbar $w.file.sframe.yscroll -relief flat \
-command "$w.file.sframe.list yview"
listbox $w.file.sframe.list -relief sunken \
-width 25 -height 10 \
-yscroll "$w.file.sframe.yscroll set" \
-exportselection 0
pack $w.file.sframe.yscroll -side left -fill y
pack $w.file.sframe.list -expand 1 -fill both
# buttons
checkbutton $w.file.bframe.hide -text "hidden" -variable ut_hidden \
-relief raised -command "ut:fsfill $w.file.sframe.list \[pwd\]"
button $w.file.bframe.home -text Home -relief raised \
-command "global env; ut:fsgo \$env(HOME) $w $grab"
pack $w.file.bframe.hide -side left -expand 1 -fill x
pack $w.file.bframe.home -side left -expand 1 -fill x
set cnt 0
foreach quickref $quick {
button $w.file.bframe.quick$cnt -text [lindex $quickref 0] \
-command "ut:fsgo [lindex $quickref 1] $w $grab" \
-relief raised
if {[regexp {[A-Z]} [lindex $quickref 0] char]} {
bind $w.file.eframe.entry [$ut_glob(key-hook) [string tolower $char]] \
"$w.file.bframe.quick$cnt invoke"
}
pack $w.file.bframe.quick$cnt -side left -expand 1 -fill x
incr cnt
}
button $w.bframe.ok -text OK -relief raised -width 10 \
-command "ut:fsokcmd $w $grab"
button $w.bframe.cancel -text Cancel -relief raised -width 10 \
-command "ut:fscancelcmd $w {$cancelvalue} $grab"
pack $w.bframe.ok -side left -padx 15
pack $w.bframe.cancel -side left -padx 15
# Set up bindings for the browser.
bind $w.file.eframe.entry <Return> "$w.bframe.ok invoke"
bind $w.file.eframe.entry [$ut_glob(key-hook) o] "$w.bframe.ok invoke"
bind $w.file.eframe.entry <$ut_glob(cancel)Escape> "$w.bframe.cancel invoke"
bind $w.file.eframe.entry [$ut_glob(key-hook) c] "$w.bframe.cancel invoke"
bind $w.file.eframe.entry [$ut_glob(key-hook) h] "$w.file.bframe.home invoke"
bind $w.file.eframe.entry [$ut_glob(key-hook) period] "$w.file.bframe.hide invoke"
bind $w.file.eframe.entry <Tab> {
set f [%W get]
%W delete 0 end
%W insert end [j:expand_filename $f]
}
bind $w.file.eframe.entry <Up> {
set lw [winfo toplevel %W].file.sframe.list
if {![string length [set ndx [$lw curselection]]]} {set ndx 0}
incr ndx -1
ut:fsselect $lw $ndx
set ymax [$lw nearest [winfo height $lw]]
set ymin [$lw nearest 0]
if {$ndx > $ymax} {
$lw yview [expr $ndx-$ymax+$ymin]
} elseif {$ndx < $ymin} {
$lw yview $ndx
}
}
bind $w.file.eframe.entry <Down> {
set lw [winfo toplevel %W].file.sframe.list
if {![string length [set ndx [$lw curselection]]]} {set ndx 0}
incr ndx 1
ut:fsselect $lw $ndx
set ymax [$lw nearest [winfo height $lw]]
set ymin [$lw nearest 0]
if {$ndx > $ymax} {
$lw yview [expr $ndx-$ymax+$ymin]
} elseif {$ndx < $ymin} {
$lw yview $ndx
}
}
bind $w.file.sframe.list <Button-1> "ut:fsselect %W \[%W nearest %y\]"
bind $w.file.sframe.list <Key> "ut:fsselect %W \[%W nearest %y\]"
bind $w.file.sframe.list <B1-Motion> " "
bind $w.file.sframe.list <Double-Button-1> "eval $w.bframe.ok invoke"
bind $w.file.sframe.list <Return> \
"ut:fsselect %W \[%W nearest %y\]; eval $w.bframe.ok invoke"
ut:fsfill $w.file.sframe.list [pwd]
if {[string length $callback]} {eval "$callback $w $cbargs"}
set savefocus [focus]
focus $w.file.eframe.entry
tkwait window $w
focus $savefocus
if {$ut_fs(result) == $cancelvalue} {return $cancelvalue}
if {[file isdirectory [set dir [file dirname $ut_fs(result)]]]} {
cd $dir
return [pwd]/[file tail $ut_fs(result)]
} else {
return [pwd]/$ut_fs(result)
}
}
proc ut:fsgo {dir w grab} {
$w.file.eframe.entry delete 0 end
$w.file.eframe.entry insert 0 "$dir/"
eval "ut:fsokcmd $w $grab"
}
proc ut:fsselect {W ndx} {
set B_entry [winfo toplevel $W].file.eframe.entry
$W select anchor $ndx
$B_entry delete 0 end
$B_entry insert 0 [$W get $ndx]
}
proc ut:fsokcmd {w grab} {
global ut_fs env
set selected [$w.file.eframe.entry get]
set ndx [expr [string length $selected]-1]
if {[string index $selected $ndx] == "/"} {
set selected [string range $selected 0 [expr $ndx-1]]
}
$w.file.eframe.entry delete 0 end
if {![string length $selected]} {return}
if {![catch {set res [glob $selected]}]} {
set selected $res
}
if {[file isdirectory $selected] != 0} {
cd $selected
set dir [pwd]
if {[string length $dir] > 32} {
set dir [join "... $dir" ""]
while {[string length $dir] > 32} {
set dir [string range $dir 4 end]
set dir [string range $dir [string first "/" $dir] end]
set dir [join "... $dir" ""]
}
}
$w.file.dirlabel configure -text "Dir: $dir"
ut:fsfill $w.file.sframe.list [pwd]
return
}
if {$grab != 0} {grab release $w}
set ut_fs(result) $selected
after idle destroy $w
}
proc ut:fscancelcmd {w cancelvalue grab} {
global ut_fs
if {$grab != 0} {grab release $w}
set ut_fs(result) $cancelvalue
destroy $w
}
proc ut:fsfill {fslist dir} {
global ut_hidden
if {$ut_hidden} {
set opt "-a"
set dirlist ""
} else {
set opt ""
set dirlist ".."
}
$fslist delete 0 end
foreach i [split [eval "exec ls $opt $dir"] \n] {
if {[string compare $i "."] != 0} {
if {[file isdirectory $i]} {
set dirlist [linsert $dirlist 0 $i]
} else {
$fslist insert end $i
}
}
}
foreach i $dirlist {
$fslist insert 0 "$i/"
}
}
######################################################################
# j:parse_args arglist - parse arglist in parent procedure
# arglist is a list of option names (without leading "-");
# this proc puts their values (if any) into variables (named after
# the option name) in d parent procedure
# any element of arglist can also be a list consisting of an option
# name and a default value.
######################################################################
proc j:parse_args {arglist} {
upvar args args
foreach pair $arglist {
set option [lindex $pair 0]
set default [lindex $pair 1] ;# will be null if not supplied
set index [lsearch -exact $args "-$option"]
if {$index != -1} {
set index1 [expr {$index + 1}]
set value [lindex $args $index1]
uplevel 1 [list set $option $value] ;# caller's variable "$option"
set args [lreplace $args $index $index1]
} else {
uplevel 1 [list set $option $default] ;# caller's variable "$option"
}
}
}
# ----------------------------------------------------------------------------
# $Log: filebox.tcl,v $
# Revision 2.4 1996/12/17 14:53:57 curt
# Updated copyright date.
#
# Revision 2.3 1996/12/11 18:33:37 curt
# Ran a spell checker.
#
# Revision 2.2 1996/12/08 07:39:59 curt
# Rearranged quite a bit of code.
# Put most global variables in cbb() structure.
#
# Revision 2.1 1996/12/07 20:38:15 curt
# Renamed *.tk -> *.tcl
#
# Revision 2.3 1996/09/30 15:14:37 curt
# Updated CBB URL, and hardwired wish path.
#
# Revision 2.2 1996/07/13 02:57:46 curt
# Version 0.65
# Packing Changes
# Documentation changes
# Changes to handle a value in both debit and credit fields.
#
# Revision 2.1 1996/02/27 05:35:44 curt
# Just stumbling around a bit with cvs ... :-(
#
# Revision 2.0 1996/02/27 04:42:58 curt
# Initial 2.0 revision. (See "Log" files for old history.)