123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207 |
- # -*- mode: TCL; fill-column: 75; tab-width: 8; coding: iso-latin-1-unix -*-
- #
- # $Id: DirBox.tcl,v 1.4 2004/03/28 02:44:57 hobbs Exp $
- #
- # DirBox.tcl --
- #
- # Implements the tixDirSelectBox 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 tixDirSelectBox {
- -classname TixDirSelectBox
- -superclass tixPrimitive
- -method {
- }
- -flag {
- -command -disablecallback -value
- }
- -configspec {
- {-command command Command ""}
- {-disablecallback disableCallback DisableCallback 0 tixVerifyBoolean}
- {-label label Label "Directory:"}
- {-value value Value ""}
- }
- -forcecall {
- -value -label
- }
- -default {
- {*combo*listbox.height 5}
- {*combo.label.anchor w}
- {*combo.labelSide top}
- {*combo.history true}
- {*combo.historyLimit 20}
- }
- }
- proc tixDirSelectBox:InitWidgetRec {w} {
- upvar #0 $w data
- tixChainMethod $w InitWidgetRec
- }
- proc tixDirSelectBox:ConstructWidget {w} {
- upvar #0 $w data
- tixChainMethod $w ConstructWidget
- set data(w:dircbx) [tixFileComboBox $w.dircbx]
- set data(w:dirlist) [tixDirList $w.dirlist]
- pack $data(w:dircbx) -side top -fill x -padx 4 -pady 2
- pack $data(w:dirlist) -side top -fill both -expand yes -padx 4 -pady 2
- if {$data(-value) eq ""} {
- set data(-value) [pwd]
- }
- }
- proc tixDirSelectBox:SetBindings {w} {
- upvar #0 $w data
- tixChainMethod $w SetBindings
- $data(w:dircbx) config -command [list tixDirSelectBox:Cmd-DirCbx $w]
- $data(w:dirlist) config -command [list tixDirSelectBox:Cmd-DirList $w]\
- -browsecmd [list tixDirSelectBox:Browse-DirList $w]
- }
- #----------------------------------------------------------------------
- # Incoming event: User
- #----------------------------------------------------------------------
- # User activates the FileComboBox
- #
- #
- proc tixDirSelectBox:Cmd-DirCbx {w args} {
- upvar #0 $w data
- set fInfo [tixEvent value]
- set path [lindex $fInfo 0]
- if {![file exists $path]} {
- # 1.1 Check for validity. The pathname cannot contain invalid chars
- #
- if {![tixFSIsValid $path]} {
- tk_messageBox -title "Invalid Directory" \
- -type ok -icon error \
- -message "\"$path\" is not a valid directory name"
- $data(w:dircbx) config \
- -text [tixFSDisplayName [file normalize $data(-value)]] \
- -directory $data(-value)
- return
- }
- # 1.2 Prompt for creation
- #
- set choice [tk_messageBox -title "Create Directory?" \
- -type yesno -icon question \
- -message "Directory \"$path\" does not exist.\
- \nDo you want to create it?"]
- if {$choice eq "yes"
- && [catch {file mkdir [file dirname $path]} err]} {
- tk_messageBox -title "Error Creating Directory" \
- -icon error -type ok \
- -message "Cannot create directory \"$path\":\n$err"
- set choice "no"
- }
- if {$choice eq "no"} {
- $data(w:dircbx) config \
- -text [tixFSDisplayName [file normalize $data(-value)]] \
- -directory $data(-value)
- return
- }
- tixDirSelectBox:SetValue $w $path 1 1
- } elseif {![file isdirectory $path]} {
- # 2.1: Can't choose a non-directory file
- #
- tk_messageBox -title "Invalid Directory" \
- -type ok -icon error \
- -message "\"$path\" is not a directory"
- $data(w:dircbx) config \
- -text [tixFSDisplayName [file normalize $data(-value)]] \
- -directory $data(-value)
- return
- } else {
- # OK. It is an existing directory
- #
- tixDirSelectBox:SetValue $w $path 1 1
- }
- }
- # User activates the dir list
- #
- #
- proc tixDirSelectBox:Cmd-DirList {w args} {
- upvar #0 $w data
- set dir $data(-value)
- catch {set dir [tixEvent flag V]}
- set dir [tixFSNormalize $dir]
- tixDirSelectBox:SetValue $w $dir 0 0
- }
- # User browses the dir list
- #
- #
- proc tixDirSelectBox:Browse-DirList {w args} {
- upvar #0 $w data
- set dir $data(-value)
- catch {set dir [tixEvent flag V]}
- set dir [tixFSNormalize $dir]
- tixDirSelectBox:SetValue $w $dir 0 0
- }
- #----------------------------------------------------------------------
- # Incoming event: Application
- #----------------------------------------------------------------------
- proc tixDirSelectBox:config-value {w value} {
- upvar #0 $w data
- set value [tixFSNormalize $value]
- tixDirSelectBox:SetValue $w $value 1 1
- return $value
- }
- proc tixDirSelectBox:config-label {w value} {
- upvar #0 $w data
- $data(w:dircbx) subwidget combo config -label $value
- }
- #----------------------------------------------------------------------
- #
- # Internal functions
- #
- #----------------------------------------------------------------------
- # Arguments:
- # callback:Bool Should we invoke the the -command.
- # setlist:Bool Should we set the -value of the DirList subwidget.
- #
- proc tixDirSelectBox:SetValue {w dir callback setlist} {
- upvar #0 $w data
- set data(-value) $dir
- $data(w:dircbx) config -text [tixFSDisplayName $dir] -directory $dir
- if {$setlist && [file isdirectory $dir]} {
- tixSetSilent $data(w:dirlist) $dir
- }
- if {$callback} {
- if {!$data(-disablecallback) && [llength $data(-command)]} {
- set bind(specs) {%V}
- set bind(%V) $data(-value)
- tixEvalCmdBinding $w $data(-command) bind $data(-value)
- }
- }
- }
|