| # |
| # Fileselectionbox |
| # ---------------------------------------------------------------------- |
| # Implements a file selection box in a style similar to the OSF/Motif |
| # standard XmFileselectionbox composite widget. The Fileselectionbox |
| # is composed of directory and file scrolled lists as well as filter |
| # and selection entry fields. |
| # |
| # ---------------------------------------------------------------------- |
| # AUTHOR: Mark L. Ulferts EMAIL: mulferts@spd.dsccc.com |
| # |
| # @(#) $Id: fileselectionbox.itk,v 1.3 2001/08/07 19:56:48 smithc Exp $ |
| # ---------------------------------------------------------------------- |
| # Copyright (c) 1997 DSC Technologies Corporation |
| # ====================================================================== |
| # Permission to use, copy, modify, distribute and license this software |
| # and its documentation for any purpose, and without fee or written |
| # agreement with DSC, is hereby granted, provided that the above copyright |
| # notice appears in all copies and that both the copyright notice and |
| # warranty disclaimer below appear in supporting documentation, and that |
| # the names of DSC Technologies Corporation or DSC Communications |
| # Corporation not be used in advertising or publicity pertaining to the |
| # software without specific, written prior permission. |
| # |
| # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING |
| # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON- |
| # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE |
| # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, |
| # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL |
| # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR |
| # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, |
| # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, |
| # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS |
| # SOFTWARE. |
| # ====================================================================== |
| |
| # |
| # Usual options. |
| # |
| itk::usual Fileselectionbox { |
| keep -activebackground -activerelief -background -borderwidth -cursor \ |
| -elementborderwidth -foreground -highlightcolor -highlightthickness \ |
| -insertbackground -insertborderwidth -insertofftime -insertontime \ |
| -insertwidth -jump -labelfont -selectbackground -selectborderwidth \ |
| -textbackground -textfont -troughcolor |
| } |
| |
| # ------------------------------------------------------------------ |
| # FILESELECTIONBOX |
| # ------------------------------------------------------------------ |
| itcl::class iwidgets::Fileselectionbox { |
| inherit itk::Widget |
| |
| constructor {args} {} |
| destructor {} |
| |
| itk_option define -childsitepos childSitePos Position s |
| itk_option define -fileson filesOn FilesOn true |
| itk_option define -dirson dirsOn DirsOn true |
| itk_option define -selectionon selectionOn SelectionOn true |
| itk_option define -filteron filterOn FilterOn true |
| itk_option define -mask mask Mask {*} |
| itk_option define -directory directory Directory {} |
| itk_option define -automount automount Automount {} |
| itk_option define -nomatchstring noMatchString NoMatchString {} |
| itk_option define -dirsearchcommand dirSearchCommand Command {} |
| itk_option define -filesearchcommand fileSearchCommand Command {} |
| itk_option define -selectioncommand selectionCommand Command {} |
| itk_option define -filtercommand filterCommand Command {} |
| itk_option define -selectdircommand selectDirCommand Command {} |
| itk_option define -selectfilecommand selectFileCommand Command {} |
| itk_option define -invalid invalid Command {bell} |
| itk_option define -filetype fileType FileType {regular} |
| itk_option define -width width Width 350 |
| itk_option define -height height Height 300 |
| |
| public { |
| method childsite {} |
| method get {} |
| method filter {} |
| } |
| |
| public { |
| method _selectDir {} |
| method _dblSelectDir {} |
| method _selectFile {} |
| method _selectSelection {} |
| method _selectFilter {} |
| } |
| |
| protected { |
| method _packComponents {{when later}} |
| method _updateLists {{when later}} |
| } |
| |
| private { |
| method _setFilter {} |
| method _setSelection {} |
| method _setDirList {} |
| method _setFileList {} |
| |
| method _nPos {} |
| method _sPos {} |
| method _ePos {} |
| method _wPos {} |
| method _topPos {} |
| method _centerPos {} |
| method _bottomPos {} |
| |
| variable _packToken "" ;# non-null => _packComponents pending |
| variable _updateToken "" ;# non-null => _updateLists pending |
| variable _pwd "." ;# present working dir |
| variable _interior ;# original interior setting |
| } |
| } |
| |
| # |
| # Provide a lowercased access method for the Fileselectionbox class. |
| # |
| proc ::iwidgets::fileselectionbox {pathName args} { |
| uplevel ::iwidgets::Fileselectionbox $pathName $args |
| } |
| |
| # |
| # Use option database to override default resources of base classes. |
| # |
| option add *Fileselectionbox.borderWidth 2 widgetDefault |
| |
| option add *Fileselectionbox.filterLabel Filter widgetDefault |
| option add *Fileselectionbox.dirsLabel Directories widgetDefault |
| option add *Fileselectionbox.filesLabel Files widgetDefault |
| option add *Fileselectionbox.selectionLabel Selection widgetDefault |
| |
| option add *Fileselectionbox.width 350 widgetDefault |
| option add *Fileselectionbox.height 300 widgetDefault |
| |
| # ------------------------------------------------------------------ |
| # CONSTRUCTOR |
| # ------------------------------------------------------------------ |
| itcl::body iwidgets::Fileselectionbox::constructor {args} { |
| # |
| # Add back to the hull width and height options and make the |
| # borderwidth zero since we don't need it. |
| # |
| itk_option add hull.width hull.height |
| component hull configure -borderwidth 0 |
| |
| set _interior $itk_interior |
| |
| # |
| # Create the filter entry. |
| # |
| itk_component add filter { |
| iwidgets::Entryfield $itk_interior.filter -labelpos nw \ |
| -command [itcl::code $this _selectFilter] -exportselection 0 |
| } { |
| usual |
| |
| rename -labeltext -filterlabel filterLabel Text |
| } |
| |
| # |
| # Create the directory list. |
| # |
| itk_component add dirs { |
| iwidgets::Scrolledlistbox $itk_interior.dirs \ |
| -selectioncommand [itcl::code $this _selectDir] \ |
| -selectmode single -exportselection 0 \ |
| -visibleitems 1x1 -labelpos nw \ |
| -hscrollmode static -vscrollmode static \ |
| -dblclickcommand [itcl::code $this _dblSelectDir] |
| } { |
| usual |
| |
| rename -labeltext -dirslabel dirsLabel Text |
| } |
| |
| # |
| # Create the files list. |
| # |
| itk_component add files { |
| iwidgets::Scrolledlistbox $itk_interior.files \ |
| -selectioncommand [itcl::code $this _selectFile] \ |
| -selectmode single -exportselection 0 \ |
| -visibleitems 1x1 -labelpos nw \ |
| -hscrollmode static -vscrollmode static |
| } { |
| usual |
| |
| rename -labeltext -fileslabel filesLabel Text |
| } |
| |
| # |
| # Create the selection entry. |
| # |
| itk_component add selection { |
| iwidgets::Entryfield $itk_interior.selection -labelpos nw \ |
| -command [itcl::code $this _selectSelection] -exportselection 0 |
| } { |
| usual |
| |
| rename -labeltext -selectionlabel selectionLabel Text |
| } |
| |
| # |
| # Create the child site widget. |
| # |
| itk_component add -protected childsite { |
| frame $itk_interior.fsbchildsite |
| } |
| |
| # |
| # Set the interior variable to the childsite for derived classes. |
| # |
| set itk_interior $itk_component(childsite) |
| |
| # |
| # Explicitly handle configs that may have been ignored earlier. |
| # |
| eval itk_initialize $args |
| |
| # |
| # When idle, pack the childsite and update the lists. |
| # |
| _packComponents |
| _updateLists |
| } |
| |
| # ------------------------------------------------------------------ |
| # DESTRUCTOR |
| # ------------------------------------------------------------------ |
| itcl::body iwidgets::Fileselectionbox::destructor {} { |
| if {$_packToken != ""} {after cancel $_packToken} |
| if {$_updateToken != ""} {after cancel $_updateToken} |
| } |
| |
| # ------------------------------------------------------------------ |
| # OPTIONS |
| # ------------------------------------------------------------------ |
| |
| # ------------------------------------------------------------------ |
| # OPTION: -childsitepos |
| # |
| # Specifies the position of the child site in the selection box. |
| # ------------------------------------------------------------------ |
| itcl::configbody iwidgets::Fileselectionbox::childsitepos { |
| _packComponents |
| } |
| |
| # ------------------------------------------------------------------ |
| # OPTION: -fileson |
| # |
| # Specifies whether or not to display the files list. |
| # ------------------------------------------------------------------ |
| itcl::configbody iwidgets::Fileselectionbox::fileson { |
| _packComponents |
| } |
| |
| # ------------------------------------------------------------------ |
| # OPTION: -dirson |
| # |
| # Specifies whether or not to display the dirs list. |
| # ------------------------------------------------------------------ |
| itcl::configbody iwidgets::Fileselectionbox::dirson { |
| _packComponents |
| } |
| |
| # ------------------------------------------------------------------ |
| # OPTION: -selectionon |
| # |
| # Specifies whether or not to display the selection entry widget. |
| # ------------------------------------------------------------------ |
| itcl::configbody iwidgets::Fileselectionbox::selectionon { |
| _packComponents |
| } |
| |
| # ------------------------------------------------------------------ |
| # OPTION: -filteron |
| # |
| # Specifies whether or not to display the filter entry widget. |
| # ------------------------------------------------------------------ |
| itcl::configbody iwidgets::Fileselectionbox::filteron { |
| _packComponents |
| } |
| |
| # ------------------------------------------------------------------ |
| # OPTION: -mask |
| # |
| # Specifies the initial file mask string. |
| # ------------------------------------------------------------------ |
| itcl::configbody iwidgets::Fileselectionbox::mask { |
| global tcl_platform |
| set prefix $_pwd |
| |
| # |
| # Remove automounter paths. |
| # |
| if {$tcl_platform(platform) == "unix"} { |
| if {$itk_option(-automount) != {}} { |
| foreach autoDir $itk_option(-automount) { |
| # Use catch because we can't be sure exactly what strings |
| # were passed into the -automount option |
| catch { |
| if {[regsub ^/$autoDir $prefix {} prefix] != 0} { |
| break |
| } |
| } |
| } |
| } |
| } |
| |
| set curFilter $itk_option(-mask); |
| $itk_component(filter) delete 0 end |
| $itk_component(filter) insert 0 [file join $_pwd $itk_option(-mask)] |
| |
| # |
| # Make sure the right most text is visable. |
| # |
| $itk_component(filter) xview moveto 1 |
| } |
| |
| # ------------------------------------------------------------------ |
| # OPTION: -directory |
| # |
| # Specifies the initial default directory. |
| # ------------------------------------------------------------------ |
| itcl::configbody iwidgets::Fileselectionbox::directory { |
| if {$itk_option(-directory) != {}} { |
| if {! [file exists $itk_option(-directory)]} { |
| error "bad directory option \"$itk_option(-directory)\":\ |
| directory does not exist" |
| } |
| |
| set olddir [pwd] |
| cd $itk_option(-directory) |
| set _pwd [pwd] |
| cd $olddir |
| |
| configure -mask $itk_option(-mask) |
| _selectFilter |
| } |
| } |
| |
| # ------------------------------------------------------------------ |
| # OPTION: -automount |
| # |
| # Specifies list of directory prefixes to ignore. Typically, this |
| # option would be used with values such as: |
| # -automount {export tmp_mnt} |
| # ------------------------------------------------------------------ |
| itcl::configbody iwidgets::Fileselectionbox::automount { |
| } |
| |
| # ------------------------------------------------------------------ |
| # OPTION: -nomatchstring |
| # |
| # Specifies the string to be displayed in the files list should |
| # not regular files exist in the directory. |
| # ------------------------------------------------------------------ |
| itcl::configbody iwidgets::Fileselectionbox::nomatchstring { |
| } |
| |
| # ------------------------------------------------------------------ |
| # OPTION: -dirsearchcommand |
| # |
| # Specifies a command to be executed to perform a directory search. |
| # The command will receive the current working directory and filter |
| # mask as arguments. The command should return a list of files which |
| # will be placed into the directory list. |
| # ------------------------------------------------------------------ |
| itcl::configbody iwidgets::Fileselectionbox::dirsearchcommand { |
| } |
| |
| # ------------------------------------------------------------------ |
| # OPTION: -filesearchcommand |
| # |
| # Specifies a command to be executed to perform a file search. |
| # The command will receive the current working directory and filter |
| # mask as arguments. The command should return a list of files which |
| # will be placed into the file list. |
| # ------------------------------------------------------------------ |
| itcl::configbody iwidgets::Fileselectionbox::filesearchcommand { |
| } |
| |
| # ------------------------------------------------------------------ |
| # OPTION: -selectioncommand |
| # |
| # Specifies a command to be executed upon pressing return in the |
| # selection entry widget. |
| # ------------------------------------------------------------------ |
| itcl::configbody iwidgets::Fileselectionbox::selectioncommand { |
| } |
| |
| # ------------------------------------------------------------------ |
| # OPTION: -filtercommand |
| # |
| # Specifies a command to be executed upon pressing return in the |
| # filter entry widget. |
| # ------------------------------------------------------------------ |
| itcl::configbody iwidgets::Fileselectionbox::filtercommand { |
| } |
| |
| # ------------------------------------------------------------------ |
| # OPTION: -selectdircommand |
| # |
| # Specifies a command to be executed following selection of a |
| # directory in the directory list. |
| # ------------------------------------------------------------------ |
| itcl::configbody iwidgets::Fileselectionbox::selectdircommand { |
| } |
| |
| # ------------------------------------------------------------------ |
| # OPTION: -selectfilecommand |
| # |
| # Specifies a command to be executed following selection of a |
| # file in the files list. |
| # ------------------------------------------------------------------ |
| itcl::configbody iwidgets::Fileselectionbox::selectfilecommand { |
| } |
| |
| # ------------------------------------------------------------------ |
| # OPTION: -invalid |
| # |
| # Specify a command to executed should the filter contents be |
| # proven invalid. |
| # ------------------------------------------------------------------ |
| itcl::configbody iwidgets::Fileselectionbox::invalid { |
| } |
| |
| # ------------------------------------------------------------------ |
| # OPTION: -filetype |
| # |
| # Specify the type of files which may appear in the file list. |
| # ------------------------------------------------------------------ |
| itcl::configbody iwidgets::Fileselectionbox::filetype { |
| switch $itk_option(-filetype) { |
| regular - |
| directory - |
| any { |
| } |
| default { |
| error "bad filetype option \"$itk_option(-filetype)\":\ |
| should be regular, directory, or any" |
| } |
| } |
| |
| _updateLists |
| } |
| |
| # ------------------------------------------------------------------ |
| # OPTION: -width |
| # |
| # Specifies the width of the file selection box. The value may be |
| # specified in any of the forms acceptable to Tk_GetPixels. |
| # ------------------------------------------------------------------ |
| itcl::configbody iwidgets::Fileselectionbox::width { |
| # |
| # The width option was added to the hull in the constructor. |
| # So, any width value given is passed automatically to the |
| # hull. All we have to do is play with the propagation. |
| # |
| if {$itk_option(-width) != 0} { |
| set propagate 0 |
| } else { |
| set propagate 1 |
| } |
| |
| # |
| # Due to a bug in the tk4.2 grid, we have to check the |
| # propagation before setting it. Setting it to the same |
| # value it already is will cause it to toggle. |
| # |
| if {[grid propagate $itk_component(hull)] != $propagate} { |
| grid propagate $itk_component(hull) $propagate |
| } |
| } |
| |
| # ------------------------------------------------------------------ |
| # OPTION: -height |
| # |
| # Specifies the height of the file selection box. The value may be |
| # specified in any of the forms acceptable to Tk_GetPixels. |
| # ------------------------------------------------------------------ |
| itcl::configbody iwidgets::Fileselectionbox::height { |
| # |
| # The height option was added to the hull in the constructor. |
| # So, any height value given is passed automatically to the |
| # hull. All we have to do is play with the propagation. |
| # |
| if {$itk_option(-height) != 0} { |
| set propagate 0 |
| } else { |
| set propagate 1 |
| } |
| |
| # |
| # Due to a bug in the tk4.2 grid, we have to check the |
| # propagation before setting it. Setting it to the same |
| # value it already is will cause it to toggle. |
| # |
| if {[grid propagate $itk_component(hull)] != $propagate} { |
| grid propagate $itk_component(hull) $propagate |
| } |
| } |
| |
| # ------------------------------------------------------------------ |
| # METHODS |
| # ------------------------------------------------------------------ |
| |
| # ------------------------------------------------------------------ |
| # METHOD: childsite |
| # |
| # Returns the path name of the child site widget. |
| # ------------------------------------------------------------------ |
| itcl::body iwidgets::Fileselectionbox::childsite {} { |
| return $itk_component(childsite) |
| } |
| |
| # ------------------------------------------------------------------ |
| # METHOD: get |
| # |
| # Returns the current selection. |
| # ------------------------------------------------------------------ |
| itcl::body iwidgets::Fileselectionbox::get {} { |
| return [$itk_component(selection) get] |
| } |
| |
| # ------------------------------------------------------------------ |
| # METHOD: filter |
| # |
| # The user has pressed Return in the filter. Make sure the contents |
| # contain a valid directory before setting default to directory. |
| # Use the invalid option to warn the user of any problems. |
| # ------------------------------------------------------------------ |
| itcl::body iwidgets::Fileselectionbox::filter {} { |
| set newdir [file dirname [$itk_component(filter) get]] |
| |
| if {! [file exists $newdir]} { |
| uplevel #0 "$itk_option(-invalid)" |
| return |
| } |
| |
| set _pwd $newdir; |
| if {$_pwd == "."} {set _pwd [pwd]}; |
| |
| _updateLists |
| } |
| |
| # ------------------------------------------------------------------ |
| # PRIVATE METHOD: _updateLists ?now? |
| # |
| # Updates the contents of both the file and directory lists, as well |
| # resets the positions of the filter, and lists. |
| # ------------------------------------------------------------------ |
| itcl::body iwidgets::Fileselectionbox::_updateLists {{when "later"}} { |
| switch -- $when { |
| later { |
| if {$_updateToken == ""} { |
| set _updateToken [after idle [itcl::code $this _updateLists now]] |
| } |
| } |
| now { |
| if {$itk_option(-dirson)} {_setDirList} |
| if {$itk_option(-fileson)} {_setFileList} |
| |
| if {$itk_option(-filteron)} { |
| _setFilter |
| } |
| if {$itk_option(-selectionon)} { |
| $itk_component(selection) icursor end |
| } |
| if {$itk_option(-dirson)} { |
| $itk_component(dirs) justify left |
| } |
| if {$itk_option(-fileson)} { |
| $itk_component(files) justify left |
| } |
| set _updateToken "" |
| } |
| default { |
| error "bad option \"$when\": should be later or now" |
| } |
| } |
| } |
| |
| # ------------------------------------------------------------------ |
| # PRIVATE METHOD: _setFilter |
| # |
| # Set the filter to the current selection in the directory list plus |
| # any existing mask in the filter. Translate the two special cases |
| # of '.', and '..' directory names to full path names.. |
| # ------------------------------------------------------------------ |
| itcl::body iwidgets::Fileselectionbox::_setFilter {} { |
| global tcl_platform |
| set prefix [$itk_component(dirs) getcurselection] |
| set curFilter [file tail [$itk_component(filter) get]] |
| |
| while {[regexp {\.$} $prefix]} { |
| if {[file tail $prefix] == "."} { |
| if {$prefix == "."} { |
| if {$_pwd == "."} { |
| set _pwd [pwd] |
| } elseif {$_pwd == ".."} { |
| set _pwd [file dirname [pwd]] |
| } |
| set prefix $_pwd |
| } else { |
| set prefix [file dirname $prefix] |
| } |
| } elseif {[file tail $prefix] == ".."} { |
| if {$prefix != ".."} { |
| set prefix [file dirname [file dirname $prefix]] |
| } else { |
| if {$_pwd == "."} { |
| set _pwd [pwd] |
| } elseif {$_pwd == ".."} { |
| set _pwd [file dirname [pwd]] |
| } |
| set prefix [file dirname $_pwd] |
| } |
| } else { |
| break |
| } |
| } |
| |
| if { [file pathtype $prefix] != "absolute" } { |
| set prefix [file join $_pwd $prefix] |
| } |
| |
| # |
| # Remove automounter paths. |
| # |
| if {$tcl_platform(platform) == "unix"} { |
| if {$itk_option(-automount) != {}} { |
| foreach autoDir $itk_option(-automount) { |
| # Use catch because we can't be sure exactly what strings |
| # were passed into the -automount option |
| catch { |
| if {[regsub ^/$autoDir $prefix {} prefix] != 0} { |
| break |
| } |
| } |
| } |
| } |
| } |
| |
| $itk_component(filter) delete 0 end |
| $itk_component(filter) insert 0 [file join $prefix $curFilter] |
| |
| # |
| # Make sure insertion cursor is at the end. |
| # |
| $itk_component(filter) icursor end |
| |
| # |
| # Make sure the right most text is visable. |
| # |
| $itk_component(filter) xview moveto 1 |
| } |
| |
| # ------------------------------------------------------------------ |
| # PRIVATE METHOD: _setSelection |
| # |
| # Set the contents of the selection entry to either the current |
| # selection of the file or directory list dependent on which lists |
| # are currently mapped. For the file list, avoid seleciton of the |
| # no match string. As for the directory list, translate file names. |
| # ------------------------------------------------------------------ |
| itcl::body iwidgets::Fileselectionbox::_setSelection {} { |
| global tcl_platform |
| $itk_component(selection) delete 0 end |
| |
| if {$itk_option(-fileson)} { |
| set selection [$itk_component(files) getcurselection] |
| |
| if {$selection != $itk_option(-nomatchstring)} { |
| if {[file pathtype $selection] != "absolute"} { |
| set selection [file join $_pwd $selection] |
| } |
| |
| # |
| # Remove automounter paths. |
| # |
| if {$tcl_platform(platform) == "unix"} { |
| if {$itk_option(-automount) != {}} { |
| foreach autoDir $itk_option(-automount) { |
| # Use catch because we can't be sure exactly what strings |
| # were passed into the -automount option |
| catch { |
| if {[regsub ^/$autoDir $selection {} selection] != 0} { |
| break |
| } |
| } |
| } |
| } |
| } |
| |
| $itk_component(selection) insert 0 $selection |
| } else { |
| $itk_component(files) selection clear 0 end |
| } |
| |
| } else { |
| set selection [$itk_component(dirs) getcurselection] |
| |
| if {[file tail $selection] == "."} { |
| if {$selection != "."} { |
| set selection [file dirname $selection] |
| } else { |
| set selection $_pwd |
| } |
| } elseif {[file tail $selection] == ".."} { |
| if {$selection != ".."} { |
| set selection [file dirname [file dirname $selection]] |
| } else { |
| set selection [file join $_pwd ..] |
| } |
| } else { |
| set selection [file join $_pwd $selection] |
| } |
| |
| # |
| # Remove automounter paths. |
| # |
| if {$tcl_platform(platform) == "unix"} { |
| if {$itk_option(-automount) != {}} { |
| foreach autoDir $itk_option(-automount) { |
| # Use catch because we can't be sure exactly what strings |
| # were passed into the -automount option |
| catch { |
| if {[regsub ^/$autoDir $selection {} selection] != 0} { |
| break |
| } |
| } |
| } |
| } |
| } |
| |
| $itk_component(selection) delete 0 end |
| $itk_component(selection) insert 0 $selection |
| } |
| |
| $itk_component(selection) icursor end |
| |
| # |
| # Make sure the right most text is visable. |
| # |
| $itk_component(selection) xview moveto 1 |
| } |
| |
| # ------------------------------------------------------------------ |
| # PRIVATE METHOD: _setDirList |
| # |
| # Clear the directory list and dependent on whether the user has |
| # defined their own search procedure or not fill the list with their |
| # results or those of a glob. Select the first element if it exists. |
| # ------------------------------------------------------------------ |
| itcl::body iwidgets::Fileselectionbox::_setDirList {} { |
| $itk_component(dirs) clear |
| |
| if {$itk_option(-dirsearchcommand) == {}} { |
| foreach i [lsort [glob -nocomplain \ |
| [file join $_pwd .*] [file join $_pwd *]]] { |
| if {[file isdirectory $i]} { |
| $itk_component(dirs) insert end [file tail "$i"] |
| } |
| } |
| |
| } else { |
| set mask [file tail [$itk_component(filter) get]] |
| |
| foreach file [uplevel #0 $itk_option(-dirsearchcommand) $_pwd $mask] { |
| $itk_component(dirs) insert end $file |
| } |
| } |
| |
| if {[$itk_component(dirs) size]} { |
| $itk_component(dirs) selection clear 0 end |
| $itk_component(dirs) selection set 0 |
| } |
| } |
| |
| # ------------------------------------------------------------------ |
| # PRIVATE METHOD: _setFileList |
| # |
| # Clear the file list and dependent on whether the user has defined |
| # their own search procedure or not fill the list with their results |
| # or those of a 'glob'. If the files list has no contents, then set |
| # the files list to the 'nomatchstring'. Clear all selections. |
| # ------------------------------------------------------------------ |
| itcl::body iwidgets::Fileselectionbox::_setFileList {} { |
| $itk_component(files) clear |
| set mask [file tail [$itk_component(filter) get]] |
| |
| if {$itk_option(-filesearchcommand) == {}} { |
| if {$mask == "*"} { |
| set files [lsort [glob -nocomplain \ |
| [file join $_pwd .*] [file join $_pwd *]]] |
| } else { |
| set files [lsort [glob -nocomplain [file join $_pwd $mask]]] |
| } |
| |
| foreach i $files { |
| if {($itk_option(-filetype) == "regular" && \ |
| ! [file isdirectory $i]) || \ |
| ($itk_option(-filetype) == "directory" && \ |
| [file isdirectory $i]) || \ |
| ($itk_option(-filetype) == "any")} { |
| $itk_component(files) insert end [file tail "$i"] |
| } |
| } |
| |
| } else { |
| foreach file [uplevel #0 $itk_option(-filesearchcommand) $_pwd $mask] { |
| $itk_component(files) insert end $file |
| } |
| } |
| |
| if {[$itk_component(files) size] == 0} { |
| if {$itk_option(-nomatchstring) != {}} { |
| $itk_component(files) insert end $itk_option(-nomatchstring) |
| } |
| } |
| |
| $itk_component(files) selection clear 0 end |
| } |
| |
| # ------------------------------------------------------------------ |
| # PRIVATE METHOD: _selectDir |
| # |
| # For a selection in the directory list, set the filter and possibly |
| # the selection entry based on the fileson option. |
| # ------------------------------------------------------------------ |
| itcl::body iwidgets::Fileselectionbox::_selectDir {} { |
| _setFilter |
| |
| if {$itk_option(-fileson)} {} { |
| _setSelection |
| } |
| |
| if {$itk_option(-selectdircommand) != {}} { |
| uplevel #0 $itk_option(-selectdircommand) |
| } |
| } |
| |
| # ------------------------------------------------------------------ |
| # PRIVATE METHOD: _dblSelectDir |
| # |
| # For a double click event in the directory list, select the |
| # directory, set the default to the selection, and update both the |
| # file and directory lists. |
| # ------------------------------------------------------------------ |
| itcl::body iwidgets::Fileselectionbox::_dblSelectDir {} { |
| filter |
| } |
| |
| # ------------------------------------------------------------------ |
| # PRIVATE METHOD: _selectFile |
| # |
| # The user has selected a file. Put the current selection in the |
| # file list in the selection entry widget. |
| # ------------------------------------------------------------------ |
| itcl::body iwidgets::Fileselectionbox::_selectFile {} { |
| _setSelection |
| |
| if {$itk_option(-selectfilecommand) != {}} { |
| uplevel #0 $itk_option(-selectfilecommand) |
| } |
| } |
| |
| # ------------------------------------------------------------------ |
| # PRIVATE METHOD: _selectSelection |
| # |
| # The user has pressed Return in the selection entry widget. Call |
| # the defined selection command if it exists. |
| # ------------------------------------------------------------------ |
| itcl::body iwidgets::Fileselectionbox::_selectSelection {} { |
| if {$itk_option(-selectioncommand) != {}} { |
| uplevel #0 $itk_option(-selectioncommand) |
| } |
| } |
| |
| # ------------------------------------------------------------------ |
| # PRIVATE METHOD: _selectFilter |
| # |
| # The user has pressed Return in the filter entry widget. Call the |
| # defined selection command if it exists, otherwise just filter. |
| # ------------------------------------------------------------------ |
| itcl::body iwidgets::Fileselectionbox::_selectFilter {} { |
| if {$itk_option(-filtercommand) != {}} { |
| uplevel #0 $itk_option(-filtercommand) |
| } else { |
| filter |
| } |
| } |
| |
| # ------------------------------------------------------------------ |
| # PRIVATE METHOD: _packComponents |
| # |
| # Pack the selection, items, and child site widgets based on options. |
| # Using the -in option of pack, put the childsite around the frame |
| # in the hull for n, s, e, and w positions. Make sure and raise |
| # the child site since using the 'in' option may obscure the site. |
| # ------------------------------------------------------------------ |
| itcl::body iwidgets::Fileselectionbox::_packComponents {{when "later"}} { |
| if {$when == "later"} { |
| if {$_packToken == ""} { |
| set _packToken [after idle [itcl::code $this _packComponents now]] |
| } |
| return |
| } elseif {$when != "now"} { |
| error "bad option \"$when\": should be now or later" |
| } |
| |
| set _packToken "" |
| |
| # |
| # Forget about any previous placements via the grid and |
| # reset all the possible minsizes and weights for all |
| # the rows and columns. |
| # |
| foreach component {childsite filter dirs files selection} { |
| grid forget $itk_component($component) |
| } |
| |
| for {set row 0} {$row < 6} {incr row} { |
| grid rowconfigure $_interior $row -minsize 0 -weight 0 |
| } |
| |
| for {set col 0} {$col < 4} {incr col} { |
| grid columnconfigure $_interior $col -minsize 0 -weight 0 |
| } |
| |
| # |
| # Place all the components based on the childsite poisition |
| # option. |
| # |
| switch $itk_option(-childsitepos) { |
| n { _nPos } |
| |
| w { _wPos } |
| |
| s { _sPos } |
| |
| e { _ePos } |
| |
| center { _centerPos } |
| |
| top { _topPos } |
| |
| bottom { _bottomPos } |
| |
| default { |
| error "bad childsitepos option \"$itk_option(-childsitepos)\":\ |
| should be n, e, s, w, center, top, or bottom" |
| } |
| } |
| } |
| |
| # ------------------------------------------------------------------ |
| # PRIVATE METHOD: _nPos |
| # |
| # Position the childsite to the north and all the other components |
| # appropriately based on the individual "on" options. |
| # ------------------------------------------------------------------ |
| itcl::body iwidgets::Fileselectionbox::_nPos {} { |
| grid $itk_component(childsite) -row 0 -column 0 \ |
| -columnspan 3 -rowspan 1 -sticky nsew |
| |
| if {$itk_option(-filteron)} { |
| grid $itk_component(filter) -row 1 -column 0 \ |
| -columnspan 3 -sticky ew |
| grid rowconfigure $_interior 2 -minsize 7 |
| } |
| |
| if {$itk_option(-dirson)} { |
| grid $itk_component(dirs) -row 3 -column 0 \ |
| -columnspan 1 -sticky nsew |
| } |
| if {$itk_option(-fileson)} { |
| grid $itk_component(files) -row 3 -column 2 \ |
| -columnspan 1 -sticky nsew |
| } |
| if {$itk_option(-dirson)} { |
| if {$itk_option(-fileson)} { |
| grid columnconfigure $_interior 1 -minsize 7 |
| } else { |
| grid configure $itk_component(dirs) -columnspan 3 -column 0 |
| } |
| } else { |
| if {$itk_option(-fileson)} { |
| grid configure $itk_component(files) -columnspan 3 -column 0 |
| } |
| } |
| |
| grid rowconfigure $_interior 3 -weight 1 |
| |
| if {$itk_option(-selectionon)} { |
| grid rowconfigure $_interior 4 -minsize 7 |
| grid $itk_component(selection) -row 5 -column 0 \ |
| -columnspan 3 -sticky ew |
| } |
| |
| grid columnconfigure $_interior 0 -weight 1 |
| grid columnconfigure $_interior 2 -weight 1 |
| } |
| |
| # ------------------------------------------------------------------ |
| # PRIVATE METHOD: _sPos |
| # |
| # Position the childsite to the south and all the other components |
| # appropriately based on the individual "on" options. |
| # ------------------------------------------------------------------ |
| itcl::body iwidgets::Fileselectionbox::_sPos {} { |
| if {$itk_option(-filteron)} { |
| grid $itk_component(filter) -row 0 -column 0 \ |
| -columnspan 3 -sticky ew |
| grid rowconfigure $_interior 1 -minsize 7 |
| } |
| |
| if {$itk_option(-dirson)} { |
| grid $itk_component(dirs) -row 2 -column 0 \ |
| -columnspan 1 -sticky nsew |
| } |
| if {$itk_option(-fileson)} { |
| grid $itk_component(files) -row 2 -column 2 \ |
| -columnspan 1 -sticky nsew |
| } |
| if {$itk_option(-dirson)} { |
| if {$itk_option(-fileson)} { |
| grid columnconfigure $_interior 1 -minsize 7 |
| } else { |
| grid configure $itk_component(dirs) -columnspan 3 -column 0 |
| } |
| } else { |
| if {$itk_option(-fileson)} { |
| grid configure $itk_component(files) -columnspan 3 -column 0 |
| } |
| } |
| |
| grid rowconfigure $_interior 2 -weight 1 |
| |
| if {$itk_option(-selectionon)} { |
| grid rowconfigure $_interior 3 -minsize 7 |
| grid $itk_component(selection) -row 4 -column 0 \ |
| -columnspan 3 -sticky ew |
| } |
| |
| grid $itk_component(childsite) -row 5 -column 0 \ |
| -columnspan 3 -rowspan 1 -sticky nsew |
| grid columnconfigure $_interior 0 -weight 1 |
| grid columnconfigure $_interior 2 -weight 1 |
| } |
| |
| # ------------------------------------------------------------------ |
| # PRIVATE METHOD: _ePos |
| # |
| # Position the childsite to the east and all the other components |
| # appropriately based on the individual "on" options. |
| # ------------------------------------------------------------------ |
| itcl::body iwidgets::Fileselectionbox::_ePos {} { |
| if {$itk_option(-filteron)} { |
| grid $itk_component(filter) -row 0 -column 0 \ |
| -columnspan 3 -sticky ew |
| grid rowconfigure $_interior 1 -minsize 7 |
| } |
| |
| if {$itk_option(-dirson)} { |
| grid $itk_component(dirs) -row 2 -column 0 \ |
| -columnspan 1 -sticky nsew |
| } |
| if {$itk_option(-fileson)} { |
| grid $itk_component(files) -row 2 -column 2 \ |
| -columnspan 1 -sticky nsew |
| } |
| if {$itk_option(-dirson)} { |
| if {$itk_option(-fileson)} { |
| grid columnconfigure $_interior 1 -minsize 7 |
| } else { |
| grid configure $itk_component(dirs) -columnspan 3 -column 0 |
| } |
| } else { |
| if {$itk_option(-fileson)} { |
| grid configure $itk_component(files) -columnspan 3 -column 0 |
| } |
| } |
| |
| grid rowconfigure $_interior 2 -weight 1 |
| |
| if {$itk_option(-selectionon)} { |
| grid rowconfigure $_interior 3 -minsize 7 |
| grid $itk_component(selection) -row 4 -column 0 \ |
| -columnspan 3 -sticky ew |
| } |
| |
| grid $itk_component(childsite) -row 0 -column 3 \ |
| -rowspan 5 -columnspan 1 -sticky nsew |
| grid columnconfigure $_interior 0 -weight 1 |
| grid columnconfigure $_interior 2 -weight 1 |
| } |
| |
| # ------------------------------------------------------------------ |
| # PRIVATE METHOD: _wPos |
| # |
| # Position the childsite to the west and all the other components |
| # appropriately based on the individual "on" options. |
| # ------------------------------------------------------------------ |
| itcl::body iwidgets::Fileselectionbox::_wPos {} { |
| grid $itk_component(childsite) -row 0 -column 0 \ |
| -rowspan 5 -columnspan 1 -sticky nsew |
| |
| if {$itk_option(-filteron)} { |
| grid $itk_component(filter) -row 0 -column 1 \ |
| -columnspan 3 -sticky ew |
| grid rowconfigure $_interior 1 -minsize 7 |
| } |
| |
| if {$itk_option(-dirson)} { |
| grid $itk_component(dirs) -row 2 -column 1 \ |
| -columnspan 1 -sticky nsew |
| } |
| if {$itk_option(-fileson)} { |
| grid $itk_component(files) -row 2 -column 3 \ |
| -columnspan 1 -sticky nsew |
| } |
| if {$itk_option(-dirson)} { |
| if {$itk_option(-fileson)} { |
| grid columnconfigure $_interior 2 -minsize 7 |
| } else { |
| grid configure $itk_component(dirs) -columnspan 3 -column 1 |
| } |
| } else { |
| if {$itk_option(-fileson)} { |
| grid configure $itk_component(files) -columnspan 3 -column 1 |
| } |
| } |
| |
| grid rowconfigure $_interior 2 -weight 1 |
| |
| if {$itk_option(-selectionon)} { |
| grid rowconfigure $_interior 3 -minsize 7 |
| grid $itk_component(selection) -row 4 -column 1 \ |
| -columnspan 3 -sticky ew |
| } |
| |
| grid columnconfigure $_interior 1 -weight 1 |
| grid columnconfigure $_interior 3 -weight 1 |
| } |
| |
| # ------------------------------------------------------------------ |
| # PRIVATE METHOD: _topPos |
| # |
| # Position the childsite below the filter but above the lists and |
| # all the other components appropriately based on the individual |
| # "on" options. |
| # ------------------------------------------------------------------ |
| itcl::body iwidgets::Fileselectionbox::_topPos {} { |
| if {$itk_option(-filteron)} { |
| grid $itk_component(filter) -row 0 -column 0 \ |
| -columnspan 3 -sticky ew |
| } |
| |
| grid $itk_component(childsite) -row 1 -column 0 \ |
| -columnspan 3 -rowspan 1 -sticky nsew |
| |
| if {$itk_option(-dirson)} { |
| grid $itk_component(dirs) -row 2 -column 0 -sticky nsew |
| } |
| if {$itk_option(-fileson)} { |
| grid $itk_component(files) -row 2 -column 2 -sticky nsew |
| } |
| if {$itk_option(-dirson)} { |
| if {$itk_option(-fileson)} { |
| grid columnconfigure $_interior 1 -minsize 7 |
| } else { |
| grid configure $itk_component(dirs) -columnspan 3 -column 0 |
| } |
| } else { |
| if {$itk_option(-fileson)} { |
| grid configure $itk_component(files) -columnspan 3 -column 0 |
| } |
| } |
| |
| grid rowconfigure $_interior 2 -weight 1 |
| |
| if {$itk_option(-selectionon)} { |
| grid rowconfigure $_interior 3 -minsize 7 |
| grid $itk_component(selection) -row 4 -column 0 \ |
| -columnspan 3 -sticky ew |
| } |
| |
| grid columnconfigure $_interior 0 -weight 1 |
| grid columnconfigure $_interior 2 -weight 1 |
| } |
| |
| # ------------------------------------------------------------------ |
| # PRIVATE METHOD: _centerPos |
| # |
| # Position the childsite between the lists and all the other |
| # components appropriately based on the individual "on" options. |
| # ------------------------------------------------------------------ |
| itcl::body iwidgets::Fileselectionbox::_centerPos {} { |
| if {$itk_option(-filteron)} { |
| grid $itk_component(filter) -row 0 -column 0 \ |
| -columnspan 3 -sticky ew |
| grid rowconfigure $_interior 1 -minsize 7 |
| } |
| |
| if {$itk_option(-dirson)} { |
| grid $itk_component(dirs) -row 2 -column 0 \ |
| -columnspan 1 -sticky nsew |
| } |
| if {$itk_option(-fileson)} { |
| grid $itk_component(files) -row 2 -column 2 \ |
| -columnspan 1 -sticky nsew |
| } |
| grid $itk_component(childsite) -row 2 \ |
| -columnspan 1 -rowspan 1 -sticky nsew |
| |
| if {$itk_option(-dirson)} { |
| if {$itk_option(-fileson)} { |
| grid configure $itk_component(childsite) -column 1 |
| grid columnconfigure $_interior 0 -weight 1 |
| grid columnconfigure $_interior 2 -weight 1 |
| |
| } else { |
| grid configure $itk_component(dirs) -columnspan 2 -column 0 |
| grid configure $itk_component(childsite) -column 2 |
| grid columnconfigure $_interior 0 -weight 1 |
| grid columnconfigure $_interior 1 -weight 1 |
| } |
| } else { |
| grid configure $itk_component(childsite) -column 0 |
| if {$itk_option(-fileson)} { |
| grid configure $itk_component(files) -columnspan 2 \ |
| -column 1 |
| grid columnconfigure $_interior 1 -weight 1 |
| grid columnconfigure $_interior 2 -weight 1 |
| } else { |
| grid columnconfigure $_interior 0 -weight 1 |
| } |
| } |
| |
| grid rowconfigure $_interior 2 -weight 1 |
| |
| if {$itk_option(-selectionon)} { |
| grid rowconfigure $_interior 3 -minsize 7 |
| grid $itk_component(selection) -row 4 -column 0 \ |
| -columnspan 3 -sticky ew |
| } |
| } |
| |
| # ------------------------------------------------------------------ |
| # PRIVATE METHOD: _bottomPos |
| # |
| # Position the childsite below the lists and above the selection |
| # and all the other components appropriately based on the individual |
| # "on" options. |
| # ------------------------------------------------------------------ |
| itcl::body iwidgets::Fileselectionbox::_bottomPos {} { |
| if {$itk_option(-filteron)} { |
| grid $itk_component(filter) -row 0 -column 0 \ |
| -columnspan 3 -sticky ew |
| grid rowconfigure $_interior 1 -minsize 7 |
| } |
| |
| if {$itk_option(-dirson)} { |
| grid $itk_component(dirs) -row 2 -column 0 -sticky nsew |
| } |
| if {$itk_option(-fileson)} { |
| grid $itk_component(files) -row 2 -column 2 -sticky nsew |
| } |
| if {$itk_option(-dirson)} { |
| if {$itk_option(-fileson)} { |
| grid columnconfigure $_interior 1 -minsize 7 |
| } else { |
| grid configure $itk_component(dirs) -columnspan 3 -column 0 |
| } |
| } else { |
| if {$itk_option(-fileson)} { |
| grid configure $itk_component(files) -columnspan 3 -column 0 |
| } |
| } |
| grid rowconfigure $_interior 2 -weight 1 |
| |
| grid $itk_component(childsite) -row 3 -column 0 \ |
| -columnspan 3 -rowspan 1 -sticky nsew |
| |
| if {$itk_option(-selectionon)} { |
| grid $itk_component(selection) -row 4 -column 0 \ |
| -columnspan 3 -sticky ew |
| } |
| |
| grid columnconfigure $_interior 0 -weight 1 |
| grid columnconfigure $_interior 2 -weight 1 |
| } |