|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
tixWidgetClass tixExFileSelectBox { |
|
-classname TixExFileSelectBox |
|
-superclass tixPrimitive |
|
-method { |
|
filter invoke |
|
} |
|
-flag { |
|
-browsecmd -command -dialog -dir -dircmd -directory |
|
-disablecallback -filetypes -pattern -selection -showhidden -value |
|
} |
|
-forcecall { |
|
-filetypes |
|
} |
|
-configspec { |
|
{-browsecmd browseCmd BrowseCmd ""} |
|
{-command command Command ""} |
|
{-dialog dialog Dialog ""} |
|
{-dircmd dirCmd DirCmd ""} |
|
{-directory directory Directory ""} |
|
{-disablecallback disableCallback DisableCallback 0 tixVerifyBoolean} |
|
{-filetypes fileTypes FileTypes ""} |
|
{-pattern pattern Pattern *} |
|
{-showhidden showHidden ShowHidden 0 tixVerifyBoolean} |
|
{-value value Value ""} |
|
} |
|
-alias { |
|
{-dir -directory} |
|
{-selection -value} |
|
} |
|
|
|
-default { |
|
{*dir.label {Directories:}} |
|
{*dir.editable true} |
|
{*dir.history true} |
|
{*dir*listbox.height 5} |
|
{*file.label Files:} |
|
{*file.editable true} |
|
{*file.history false} |
|
{*file*listbox.height 5} |
|
{*types.label {List Files of Type:}} |
|
{*types*listbox.height 3} |
|
{*TixComboBox.labelSide top} |
|
{*TixComboBox*Label.anchor w} |
|
{*dir.label.underline 0} |
|
{*file.label.underline 0} |
|
{*types.label.underline 14} |
|
{*TixComboBox.anchor e} |
|
{*TixHList.height 7} |
|
{*filelist*listbox.height 7} |
|
{*hidden.wrapLength 3c} |
|
{*hidden.justify left} |
|
} |
|
} |
|
|
|
proc tixExFileSelectBox:InitWidgetRec {w} { |
|
upvar #0 $w data |
|
global env |
|
|
|
tixChainMethod $w InitWidgetRec |
|
|
|
if {$data(-directory) eq ""} { |
|
set data(-directory) [pwd] |
|
} |
|
set data(oldDir) "" |
|
set data(flag) 0 |
|
} |
|
|
|
|
|
|
|
|
|
|
|
proc tixExFileSelectBox:ConstructWidget {w} { |
|
upvar #0 $w data |
|
|
|
tixChainMethod $w ConstructWidget |
|
|
|
|
|
set lf [frame $w.lf] |
|
|
|
|
|
|
|
set pane [tixPanedWindow $lf.pane -orientation horizontal] |
|
set dpane [$pane add 1 -size 160] |
|
set fpane [$pane add 2 -size 160] |
|
|
|
$dpane config -relief flat |
|
$fpane config -relief flat |
|
|
|
|
|
|
|
set data(w:file) [tixComboBox $fpane.file\ |
|
-command [list tixExFileSelectBox:Cmd-FileCombo $w]\ |
|
-prunehistory true \ |
|
-options { |
|
label.anchor w |
|
}] |
|
set data(w:filelist) \ |
|
[tixScrolledListBox $fpane.filelist \ |
|
-command [list tixExFileSelectBox:Cmd-FileList $w 1] \ |
|
-browsecmd [list tixExFileSelectBox:Cmd-FileList $w 0]] |
|
pack $data(w:file) -padx 8 -pady 4 -side top -fill x |
|
pack $data(w:filelist) -padx 8 -pady 4 -side top -fill both -expand yes |
|
|
|
|
|
|
|
set data(w:dir) [tixComboBox $dpane.dir \ |
|
-command [list tixExFileSelectBox:Cmd-DirCombo $w]\ |
|
-prunehistory true \ |
|
-options { |
|
label.anchor w |
|
}] |
|
set data(w:dirlist) \ |
|
[tixDirList $dpane.dirlist \ |
|
-command [list tixExFileSelectBox:Cmd-DirList $w]\ |
|
-browsecmd [list tixExFileSelectBox:Browse-DirList $w]] |
|
pack $data(w:dir) -padx 8 -pady 4 -side top -fill x |
|
pack $data(w:dirlist) -padx 8 -pady 4 -side top -fill both -expand yes |
|
|
|
|
|
|
|
set data(w:types) [tixComboBox $lf.types\ |
|
-command [list tixExFileSelectBox:Cmd-TypeCombo $w]\ |
|
-options { |
|
label.anchor w |
|
}] |
|
|
|
pack $data(w:types) -padx 12 -pady 4 -side bottom -fill x -anchor w |
|
pack $pane -side top -padx 4 -pady 4 -expand yes -fill both |
|
|
|
|
|
|
|
set bf [frame $w.bf] |
|
set data(w:ok) [button $bf.ok -text Ok -width 6 \ |
|
-underline 0 -command [list tixExFileSelectBox:Ok $w]] |
|
set data(w:cancel) [button $bf.cancel -text Cancel -width 6 \ |
|
-underline 0 -command [list tixExFileSelectBox:Cancel $w]] |
|
set data(w:hidden) [checkbutton $bf.hidden -text "Show Hidden Files"\ |
|
-underline 0\ |
|
-variable [format %s(-showhidden) $w] -onvalue 1 -offvalue 0\ |
|
-command [list tixExFileSelectBox:SetShowHidden $w]] |
|
|
|
pack $data(w:ok) $data(w:cancel) $data(w:hidden)\ |
|
-side top -fill x -padx 6 -pady 3 |
|
|
|
pack $bf -side right -fill y -pady 6 |
|
pack $lf -side left -expand yes -fill both |
|
|
|
tixDoWhenMapped $w [list tixExFileSelectBox:Map $w] |
|
|
|
if {$data(-filetypes) == ""} { |
|
$data(w:types) config -state disabled |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
proc tixExFileSelectBox:config-showhidden {w value} { |
|
upvar #0 $w data |
|
|
|
set data(-showhidden) $value |
|
tixExFileSelectBox:SetShowHidden $w |
|
} |
|
|
|
|
|
|
|
proc tixExFileSelectBox:config-directory {w value} { |
|
upvar #0 $w data |
|
|
|
set data(-directory) [tixFSNormalize $value] |
|
tixSetSilent $data(w:dirlist) $data(-directory) |
|
tixSetSilent $data(w:dir) $data(-directory) |
|
tixWidgetDoWhenIdle tixExFileSelectBox:LoadFiles $w reload |
|
|
|
return $data(-directory) |
|
} |
|
|
|
proc tixExFileSelectBox:config-filetypes {w value} { |
|
upvar #0 $w data |
|
|
|
$data(w:types) subwidget listbox delete 0 end |
|
|
|
foreach name [array names data] { |
|
if {[string match type,* $name]} { |
|
catch {unset data($name)} |
|
} |
|
} |
|
|
|
if {$value == ""} { |
|
$data(w:types) config -state disabled |
|
} else { |
|
$data(w:types) config -state normal |
|
|
|
foreach type $value { |
|
$data(w:types) insert end [lindex $type 1] |
|
set data(type,[lindex $type 1]) [lindex $type 0] |
|
} |
|
tixSetSilent $data(w:types) "" |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
proc tixExFileSelectBox:SetShowHidden {w} { |
|
upvar #0 $w data |
|
|
|
$data(w:dirlist) config -showhidden $data(-showhidden) |
|
|
|
tixWidgetDoWhenIdle tixExFileSelectBox:LoadFiles $w reload |
|
} |
|
|
|
|
|
|
|
|
|
proc tixExFileSelectBox:Cmd-DirCombo {w args} { |
|
upvar #0 $w data |
|
|
|
set dir [tixEvent flag V] |
|
set dir [tixFSExternal $dir] |
|
if {![file isdirectory $dir]} { |
|
return |
|
} |
|
set dir [tixFSNormalize $dir] |
|
|
|
$data(w:dirlist) config -value $dir |
|
set data(-directory) $dir |
|
} |
|
|
|
|
|
|
|
|
|
proc tixExFileSelectBox:Cmd-DirList {w args} { |
|
upvar #0 $w data |
|
|
|
set dir $data(-directory) |
|
catch {set dir [tixEvent flag V]} |
|
set dir [tixFSNormalize [tixFSExternal $dir]] |
|
|
|
tixSetSilent $data(w:dir) $dir |
|
set data(-directory) $dir |
|
|
|
tixWidgetDoWhenIdle tixExFileSelectBox:LoadFiles $w noreload |
|
} |
|
|
|
|
|
|
|
|
|
proc tixExFileSelectBox:Browse-DirList {w args} { |
|
upvar #0 $w data |
|
|
|
set dir [tixEvent flag V] |
|
set dir [tixFSNormalize [tixFSExternal $dir]] |
|
tixExFileSelectBox:Cmd-DirList $w $dir |
|
} |
|
|
|
proc tixExFileSelectBox:IsPattern {w string} { |
|
return [regexp "\[\[\\\{\\*\\?\]" $string] |
|
} |
|
|
|
proc tixExFileSelectBox:Cmd-FileCombo {w value} { |
|
upvar #0 $w data |
|
|
|
if {[tixEvent type] eq "<Return>"} { |
|
tixExFileSelectBox:Ok $w |
|
} |
|
} |
|
|
|
proc tixExFileSelectBox:Ok {w} { |
|
upvar #0 $w data |
|
|
|
set value [string trim [$data(w:file) subwidget entry get]] |
|
if {$value == ""} { |
|
set value $data(-pattern) |
|
} |
|
tixSetSilent $data(w:file) $value |
|
|
|
if {[tixExFileSelectBox:IsPattern $w $value]} { |
|
set data(-pattern) $value |
|
tixWidgetDoWhenIdle tixExFileSelectBox:LoadFiles $w reload |
|
} else { |
|
|
|
set value [file join $data(-directory) $value] |
|
set data(-value) [tixFSNativeNorm $value] |
|
tixExFileSelectBox:Invoke $w |
|
} |
|
} |
|
|
|
proc tixExFileSelectBox:Cancel {w} { |
|
upvar #0 $w data |
|
|
|
if {$data(-dialog) != ""} { |
|
eval $data(-dialog) popdown |
|
} |
|
} |
|
|
|
proc tixExFileSelectBox:Invoke {w} { |
|
upvar #0 $w data |
|
|
|
|
|
|
|
$data(w:dir) addhistory [$data(w:dir) cget -value] |
|
$data(w:file) addhistory $data(-pattern) |
|
$data(w:file) addhistory $data(-value) |
|
if {$data(-dialog) != ""} { |
|
eval $data(-dialog) popdown |
|
} |
|
if {$data(-command) != "" && !$data(-disablecallback)} { |
|
set bind(specs) "%V" |
|
set bind(%V) $data(-value) |
|
tixEvalCmdBinding $w $data(-command) bind $data(-value) |
|
} |
|
} |
|
|
|
proc tixExFileSelectBox:Cmd-FileList {w invoke args} { |
|
upvar #0 $w data |
|
|
|
set index [lindex [$data(w:filelist) subwidget listbox curselection] 0] |
|
if {$index == ""} { |
|
set index 0 |
|
} |
|
|
|
set file [$data(w:filelist) subwidget listbox get $index] |
|
tixSetSilent $data(w:file) $file |
|
|
|
set value [file join $data(-directory) $file] |
|
set data(-value) [tixFSNativeNorm $value] |
|
|
|
if {$invoke == 1} { |
|
tixExFileSelectBox:Invoke $w |
|
} elseif {$data(-browsecmd) != ""} { |
|
tixEvalCmdBinding $w $data(-browsecmd) "" $data(-value) |
|
} |
|
} |
|
|
|
proc tixExFileSelectBox:Cmd-TypeCombo {w args} { |
|
upvar #0 $w data |
|
|
|
set value [tixEvent flag V] |
|
|
|
if {[info exists data(type,$value)]} { |
|
set data(-pattern) $data(type,$value) |
|
tixSetSilent $data(w:file) $data(-pattern) |
|
tixWidgetDoWhenIdle tixExFileSelectBox:LoadFiles $w reload |
|
} |
|
} |
|
|
|
proc tixExFileSelectBox:LoadFiles {w flag} { |
|
upvar #0 $w data |
|
|
|
if {$flag ne "reload" && $data(-directory) eq $data(oldDir)} { |
|
return |
|
} |
|
|
|
if {![winfo ismapped [winfo toplevel $w]]} { |
|
tixDoWhenMapped [winfo toplevel $w] \ |
|
[list tixExFileSelectBox:LoadFiles $w $flag] |
|
return |
|
} |
|
|
|
set listbox [$data(w:filelist) subwidget listbox] |
|
$listbox delete 0 end |
|
|
|
set data(-value) "" |
|
|
|
tixBusy $w on [$data(w:dirlist) subwidget hlist] |
|
|
|
|
|
if {[catch { |
|
foreach name [tixFSListDir $data(-directory) 0 1 0 \ |
|
$data(-showhidden) $data(-pattern)] { |
|
$listbox insert end $name |
|
} |
|
|
|
if {$data(oldDir) ne $data(-directory)} { |
|
|
|
|
|
tixSetSilent $data(w:file) $data(-pattern) |
|
} |
|
} err]} { |
|
tixDebug "tixExFileSelectBox:LoadFiles error for $w\n$err" |
|
} |
|
set data(oldDir) $data(-directory) |
|
|
|
tixWidgetDoWhenIdle tixBusy $w off [$data(w:dirlist) subwidget hlist] |
|
} |
|
|
|
|
|
|
|
proc tixExFileSelectBox:Map {w} { |
|
if {![winfo exists $w]} { |
|
return |
|
} |
|
upvar #0 $w data |
|
|
|
set bind(specs) "%V" |
|
set bind(%V) $data(-value) |
|
tixEvalCmdBinding $w bind \ |
|
[list tixExFileSelectBox:Cmd-DirList $w] $data(-directory) |
|
} |
|
|
|
|
|
|
|
|
|
|
|
proc tixExFileSelectBox:invoke {w} { |
|
tixExFileSelectBox:Invoke $w |
|
} |
|
|
|
proc tixExFileSelectBox:filter {w} { |
|
tixExFileSelectBox:LoadFiles $w reload |
|
} |
|
|
|
|