| proc TkW:dirbrowse {pattern patternF mode} { | |
| # input arg: initial pattern mode (File or Folder | |
| # returns selected folders as a global SelectFolder | |
| # or selected file as a global: SelectFile | |
| # variable: SelectFolder | |
| # You can use WAITbrowse in the calling app to wait | |
| # for dirbrowse to exit (set to 0 on exit, or -1 on CANCEL) | |
| global WAITbrowse | |
| global SelectFolder | |
| global SelectFile | |
| if {![info exists SelectFile]} {set SelectFile ""} | |
| if {![info exists SelectFolder]} {set SelectFolder [pwd]} | |
| global ndirs nfiles;set ndirs 0;set nfiles 0 | |
| global ModeBrowse Restore;set Restore $SelectFolder | |
| global FTPcd | |
| if {$mode == "local"} {set FTPcd 1} {set FTPcd 0} | |
| set ModeBrowse $mode | |
| global DIRBROWSE WinBrowse | |
| ################### | |
| # CREATING WIDGETS | |
| ################### | |
| if {$mode != "local" } { | |
| toplevel .dirbrowse -class Toplevel \ | |
| -background #feffff | |
| wm focusmodel .dirbrowse passive | |
| wm geometry .dirbrowse 464x296 | |
| wm maxsize .dirbrowse 1265 994 | |
| wm minsize .dirbrowse 1 1 | |
| wm overrideredirect .dirbrowse 0 | |
| wm resizable .dirbrowse 1 1 | |
| wm deiconify .dirbrowse | |
| wm title .dirbrowse "TkWine: $DIRBROWSE" | |
| set WinBrowse dirbrowse | |
| } else { | |
| set WinBrowse ftp.browsers.local | |
| #frame .$WinBrowse -background #feffff -height 300 -width 464 | |
| } | |
| # Lang globals: | |
| global FolderSelection OK CANCEL FILTERFOLD FILTERFILES | |
| global RESCAN VIEW HELP | |
| # Other globals: | |
| global BrowsePattern;set BrowsePattern $pattern | |
| global BrowsePatternF;set BrowsePatternF $patternF | |
| global dirscroll MouseY | |
| # label and entrybox for selection: | |
| label .$WinBrowse.foldselLab \ | |
| -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-*-* \ | |
| -relief groove -text $FolderSelection | |
| entry .$WinBrowse.foldsel \ | |
| -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-*-* \ | |
| -textvariable SelectFolder | |
| if {$ModeBrowse == "File"} { | |
| .$WinBrowse.foldsel configure -textvar SelectFile | |
| } | |
| # frame for display of currently available folders: | |
| frame .$WinBrowse.dirframe \ | |
| -borderwidth 1 -height 30 -relief sunken -width 30 \ | |
| -background #dddddd | |
| scrollbar .$WinBrowse.dirframe_scr -width 10 | |
| frame .$WinBrowse.fileframe \ | |
| -borderwidth 1 -height 30 -relief sunken -width 30 | |
| scrollbar .$WinBrowse.fileframe_scr -width 10 | |
| # label/entry for pattern | |
| label .$WinBrowse.patternLab \ | |
| -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-*-* \ | |
| -relief groove -text $FILTERFOLD | |
| entry .$WinBrowse.patternF \ | |
| -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-*-* \ | |
| -textvariable BrowsePatternF | |
| label .$WinBrowse.patternLabF \ | |
| -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-*-* \ | |
| -relief groove -text $FILTERFILES | |
| entry .$WinBrowse.pattern \ | |
| -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-*-* \ | |
| -textvariable BrowsePattern | |
| frame .$WinBrowse.fra25 \ | |
| -borderwidth 1 -height 30 -relief sunken -width 30 | |
| menubutton .$WinBrowse.fra25.men26 \ | |
| -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-*-* \ | |
| -menu .$WinBrowse.fra25.men26.m -padx 4 -pady 3 -relief ridge -text $VIEW | |
| menu .$WinBrowse.fra25.men26.m \ | |
| -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-*-* | |
| button .$WinBrowse.fra25.but28 \ | |
| -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-*-* -padx 9 \ | |
| -pady 3 -relief ridge -text $HELP | |
| button .$WinBrowse.butOK \ | |
| -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-*-* -padx 9 \ | |
| -pady 3 -text $OK \ | |
| -command {destroy .$WinBrowse | |
| set WAITbrowse 0 | |
| return "$SelectFolder $SelectFile" | |
| } | |
| button .$WinBrowse.butCANCEL \ | |
| -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-*-* -padx 9 \ | |
| -pady 3 -text $CANCEL \ | |
| -command {destroy .$WinBrowse | |
| set WAITbrowse -1 | |
| return "$SelectFolder $SelectFile" | |
| } | |
| button .$WinBrowse.butRESCAN \ | |
| -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-*-* -padx 9 \ | |
| -pady 3 -text $RESCAN -command {TkW:DisplayCurrentDir $BrowsePattern} | |
| ################### | |
| # SETTING GEOMETRY | |
| ################### | |
| global YHeight;set YHeight 170 | |
| if {$mode !="local" && $mode != "remote"} { | |
| place .$WinBrowse.foldselLab \ | |
| -x 47 -y 270 -width 78 -height 20 -anchor nw -bordermode ignore | |
| place .$WinBrowse.foldsel \ | |
| -x 148 -y 268 -width 290 -height 24 -anchor nw -bordermode ignore | |
| place .$WinBrowse.dirframe \ | |
| -x 5 -y 90 -width 145 -height $YHeight -anchor nw -bordermode ignore | |
| place .$WinBrowse.dirframe_scr -x 150 -y 90 -width 17 -height $YHeight | |
| place .$WinBrowse.fileframe \ | |
| -x 180 -y 90 -width 175 -height 170 -anchor nw -bordermode ignore | |
| place .$WinBrowse.fileframe_scr -x 355 -y 90 -width 17 -height $YHeight | |
| place .$WinBrowse.patternLab \ | |
| -x 27 -y 60 -width 143 -height 20 -anchor nw -bordermode ignore | |
| place .$WinBrowse.pattern \ | |
| -x 190 -y 58 -width 150 -height 24 -anchor nw -bordermode ignore | |
| place .$WinBrowse.patternLabF \ | |
| -x 27 -y 35 -width 143 -height 20 -anchor nw -bordermode ignore | |
| place .$WinBrowse.patternF \ | |
| -x 190 -y 32 -width 150 -height 24 -anchor nw -bordermode ignore | |
| place .$WinBrowse.fra25 \ | |
| -x 0 -y 1 -width 455 -height 25 -anchor nw -bordermode ignore | |
| place .$WinBrowse.fra25.men26 \ | |
| -x -1 -y 0 -width 67 -height 24 -anchor nw -bordermode ignore | |
| place .$WinBrowse.fra25.but28 \ | |
| -x 397 -y -3 -width 60 -height 28 -anchor nw -bordermode ignore | |
| place .$WinBrowse.butOK \ | |
| -x 380 -y 115 -width 77 -height 28 -anchor nw -bordermode ignore | |
| place .$WinBrowse.butCANCEL \ | |
| -x 380 -y 155 -width 77 -height 28 -anchor nw -bordermode ignore | |
| place .$WinBrowse.butRESCAN \ | |
| -x 380 -y 195 -width 77 -height 28 -anchor nw -bordermode ignore | |
| } else { | |
| # case of ftp filebrowser .... | |
| bind .$WinBrowse.pattern <Return> {.$WinBrowse.butRESCAN invoke} | |
| bind .$WinBrowse.patternF <Return> {.$WinBrowse.butRESCAN invoke} | |
| place .$WinBrowse.pattern -x 0 -y 3 -width 145 -height 25 | |
| place .$WinBrowse.patternF -x 163 -y 3 -width 145 -height 25 | |
| place .$WinBrowse.dirframe -x 0 -y 28 -width 145 -height $YHeight | |
| place .$WinBrowse.dirframe_scr -x 145 -y 28 -width 17 -height $YHeight | |
| place .$WinBrowse.fileframe -x 163 -y 28 -width 145 -height $YHeight | |
| place .$WinBrowse.fileframe_scr -x 308 -y 28 -width 17 -height $YHeight | |
| } | |
| # binding the scrollbar: | |
| bind .$WinBrowse.dirframe_scr <ButtonPress> { TkW:ScrollDirs %x %y } | |
| bind .$WinBrowse.dirframe_scr <ButtonRelease> { set dirscroll no; grab release .$WinBrowse.dirframe_scr } | |
| bind .$WinBrowse.dirframe_scr <Motion> { set MouseY %y } | |
| bind .$WinBrowse.fileframe_scr <ButtonPress> { TkW:ScrollFiles %x %y } | |
| bind .$WinBrowse.fileframe_scr <ButtonRelease> { set filescroll no; grab release .$WinBrowse.fileframe_scr } | |
| bind .$WinBrowse.fileframe_scr <Motion> { set MouseY %y } | |
| global TKW | |
| image create photo "fold" -file \ | |
| $TKW/shared/icons/smalls/small_folder_yellow.gif | |
| image create photo "unknown" -file \ | |
| $TKW/shared/icons/smalls/unknown.gif | |
| image create photo "execfile" -file \ | |
| $TKW/shared/icons/smalls/exec.gif | |
| image create photo "imgfile" -file \ | |
| $TKW/shared/icons/smalls/xpaint.gif | |
| image create photo "htmlfile" -file \ | |
| $TKW/shared/icons/smalls/html.gif | |
| #image create photo "up" -file $TKW/shared/icons/up.gif | |
| TkW:DisplayCurrentDir $BrowsePattern | |
| } | |
| proc TkW:DisplayCurrentDir {BrowsePattern} { | |
| global ndirs nfiles Ybase dirlist filelist FYbase specialwhere | |
| global FYbase BrowsePatternF ModeBrowse | |
| DestroyDirs | |
| set ndirs 0 | |
| set dirlist "" | |
| set filelist "" | |
| # First we get the directory list: | |
| if {$ModeBrowse != "remote"} { | |
| set fileList "" | |
| set fileList [glob -nocomplain [pwd]/$BrowsePattern] | |
| set fileList "$fileList [glob -nocomplain [pwd]/.$BrowsePattern]" | |
| set UpLevel 0 | |
| foreach i $fileList { | |
| if {[file tail $i] == ".."} {set UpLevel 1} | |
| if { [file isdir $i] } { set dirlist "$dirlist \"$i\"" } | |
| } | |
| set fileList "" | |
| set fileList [glob -nocomplain [pwd]/$BrowsePatternF] | |
| set fileList "$fileList [glob -nocomplain [pwd]/.$BrowsePatternF]" | |
| foreach i $fileList { | |
| if { ![file isdir $i] } { set filelist "$filelist \"$i\"" } | |
| } | |
| if {$UpLevel == 0} {set dirlist ".. $dirlist"} | |
| set dirlist [lsort $dirlist] | |
| set filelist [lsort $filelist] | |
| } else {set filelist ""; set dirlist ".."} | |
| set Ybase 5 | |
| set FYbase 5 | |
| TkW:ShowDirs | |
| TkW:ShowFiles | |
| } | |
| proc TkW:ShowDirs {} { | |
| global dirlist ndirs | |
| DestroyDirs | |
| set ndirs 0 | |
| set showedIn 0 | |
| set showedbelow 0 | |
| set showedabove 0 | |
| foreach i $dirlist { | |
| set inout [TkW:showdir $i] | |
| if {$inout == 0} {set showedIn [expr $showedIn + 1]} | |
| if {$inout == -1} {set showedabove [expr $showedabove + 1]} | |
| if {$inout == 1} {set showedbelow [expr $showedbelow + 1]} | |
| } | |
| # Scrollbars management: | |
| TkW:DirBrowseScroll [expr (100.*$showedabove/$ndirs)/100.] \ | |
| [expr 1. - (100.*$showedbelow/$ndirs)/100.] | |
| update | |
| } | |
| proc TkW:DirBrowseScroll { y1 y2} { | |
| global SliderY1 SliderY2 WinBrowse | |
| set SliderY1 $y1 | |
| set SliderY2 $y2 | |
| .$WinBrowse.dirframe_scr set $y1 $y2 | |
| } | |
| proc TkW:FileBrowseScroll { y1 y2} { | |
| global FSliderY1 FSliderY2 WinBrowse | |
| set FSliderY1 $y1 | |
| set FSliderY2 $y2 | |
| .$WinBrowse.fileframe_scr set $y1 $y2 | |
| } | |
| proc TkW:hilightFold {y} { | |
| global YDIRS ndirs DIRS SelectNum WinBrowse | |
| global SelectFolder BrowsePattern FTPcd | |
| if { $y > $YDIRS($ndirs)} {set num $ndirs} else { | |
| set i 1 | |
| set ok 0 | |
| while {$ok == 0} { | |
| if { | |
| $YDIRS($i) < $y &&\ | |
| $y <= $YDIRS([expr $i + 1])} { | |
| set num $i | |
| set ok 1 | |
| } else { set i [expr $i + 1] } | |
| } | |
| } | |
| if {$SelectFolder == $DIRS($num)} { | |
| cd $SelectFolder | |
| if {$FTPcd == 1} {FTP_Lcd $SelectFolder} | |
| set SelectFolder [pwd] | |
| TkW:DisplayCurrentDir $BrowsePattern | |
| unset SelectNum | |
| } else { | |
| .$WinBrowse.dirframe.label$num configure -background #ffffff | |
| set SelectFolder $DIRS($num) | |
| if {[info exists SelectNum]} { | |
| .$WinBrowse.dirframe.label$SelectNum configure \ | |
| -background #dddddd | |
| } | |
| set SelectNum $num | |
| } | |
| update | |
| } | |
| proc TkW:showdir {fulldirname} { | |
| global TKW ndirs Ybase YHeight YDIRS DIRS Ydecal ModeBrowse WinBrowse | |
| set Ydecal 20 | |
| set dirname [file tail $fulldirname] | |
| if {$dirname == "."} return | |
| set Y [expr $Ybase + $ndirs * $Ydecal] | |
| set In 0 | |
| if {$Y < 0 } {set In -1} | |
| if {$Y > [expr $YHeight - $Ydecal]} { set In 1 } | |
| set ndirs [expr $ndirs + 1] | |
| set YDIRS($ndirs) $Y | |
| set DIRS($ndirs) $fulldirname | |
| label .$WinBrowse.dirframe.icon$ndirs -image fold | |
| label .$WinBrowse.dirframe.label$ndirs -text $dirname\ | |
| -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-*-* | |
| if {$In == 0} { | |
| place .$WinBrowse.dirframe.icon$ndirs -x 5 -y $Y | |
| place .$WinBrowse.dirframe.label$ndirs -x 30 -y $Y | |
| } | |
| #dirframe bindings | |
| bind .$WinBrowse.dirframe.icon$ndirs <Button-1> { | |
| set Y [expr %Y - [winfo rooty .$WinBrowse.dirframe] -$Ybase] | |
| TkW:hilightFold $Y | |
| } | |
| #dirframe bindings | |
| bind .$WinBrowse.dirframe.label$ndirs <ButtonPress-1> { | |
| set Y [expr %Y - [winfo rooty .$WinBrowse.dirframe] -$Ybase] | |
| TkW:hilightFold $Y | |
| } | |
| return $In | |
| } | |
| proc TkW:ScrollDirs {X Y} { | |
| global Ybase Ydecal ndirs dirscroll global nextLoop MouseY WinBrowse | |
| global SliderY1 SliderY2 YHeight Nabove Nbelow | |
| set MinBase [expr -$Ydecal * ($ndirs - [expr $YHeight/$Ydecal])] | |
| set Slider1 $SliderY1 | |
| set Slider2 $SliderY2 | |
| set MaxSlide1 [expr 1-($SliderY2-$SliderY1)] | |
| set MinSlide2 [expr $SliderY2-$SliderY1] | |
| switch [.$WinBrowse.dirframe_scr identify $X $Y] { | |
| {arrow1} { set dirscroll UP; set modeUP 1} | |
| {arrow2} { set dirscroll DOWN;set modeDOWN 1} | |
| {slider} {set dirscroll SLIDER} | |
| {trough1} {set dirscroll UP; set modeUP page} | |
| {trough2} {set dirscroll DOWN;set modeDOWN page} | |
| } | |
| while {$dirscroll == "UP"} { | |
| if {$modeUP == "1"} {set XUP 1} { | |
| set XUP [expr ($YHeight/$Ydecal ) -1] | |
| } | |
| set Ybase [expr $Ybase + $XUP * $Ydecal] | |
| if {$Ybase > $Ydecal} { | |
| set Ybase 5 | |
| set dirscroll no | |
| set Slider1 0 | |
| set Slider2 $MinSlide2 | |
| } | |
| TkW:ReShowDirs | |
| TkW:DirBrowseScroll [expr (100.*$Nabove/$ndirs)/100.] \ | |
| [expr 1. - (100.*$Nbelow/$ndirs)/100.] | |
| set nextLoop 0 | |
| after 30 {set nextLoop 1} | |
| while {$nextLoop == 0} {update} | |
| set Slider1 $SliderY1 | |
| set Slider2 $SliderY2 | |
| } | |
| while {$dirscroll == "DOWN"} { | |
| if {$modeDOWN == "1"} {set XDOWN 1} { | |
| set XDOWN [expr ($YHeight/$Ydecal ) -1] | |
| } | |
| set Ybase [expr $Ybase - $XDOWN * $Ydecal] | |
| if {$Ybase < $MinBase} { | |
| set Ybase $MinBase | |
| set dirscroll no | |
| set Slider2 1 | |
| set Slider1 $MaxSlide1 | |
| } | |
| TkW:ReShowDirs | |
| TkW:DirBrowseScroll [expr (100.*$Nabove/$ndirs)/100.] \ | |
| [expr 1. - (100.*$Nbelow/$ndirs)/100.] | |
| set nextLoop 0 | |
| after 30 {set nextLoop 1} | |
| while {$nextLoop == 0} {update} | |
| set Slider1 $SliderY1 | |
| set Slider2 $SliderY2 | |
| } | |
| while {$dirscroll == "SLIDER"} { | |
| set nextLoop 0 | |
| after 20 {set nextLoop 1} | |
| while {$nextLoop == 0} { | |
| set Delta [expr (100.*($MouseY - $Y)/$YHeight)/100. ] | |
| set Slider1 [expr $SliderY1 +$Delta] | |
| set Slider2 [expr $SliderY2 +$Delta] | |
| if {$Slider2 > 1} { | |
| set Slider2 1 | |
| set Slider1 $MaxSlide1 | |
| } | |
| if {$Slider1 < 0} { | |
| set Slider1 0 | |
| set Slider2 $MinSlide2 | |
| } | |
| .$WinBrowse.dirframe_scr set $Slider1 $Slider2 | |
| set Ybase [expr 5 - $Slider1 * $ndirs *$Ydecal] | |
| TkW:ReShowDirs | |
| update | |
| } | |
| } | |
| set SliderY1 $Slider1 | |
| set SliderY2 $Slider2 | |
| } | |
| proc TkW:ScrollFiles {X Y} { | |
| global FYbase Ydecal nfiles filescroll nextLoop MouseY WinBrowse | |
| global FSliderY1 FSliderY2 YHeight NFabove NFbelow | |
| set MinBase [expr -$Ydecal * ($nfiles - [expr $YHeight/$Ydecal])] | |
| set FSlider1 $FSliderY1 | |
| set FSlider2 $FSliderY2 | |
| set MaxSlide1 [expr 1-($FSliderY2-$FSliderY1)] | |
| set MinSlide2 [expr $FSliderY2-$FSliderY1] | |
| switch [.$WinBrowse.fileframe_scr identify $X $Y] { | |
| {arrow1} { set filescroll UP; set modeUP 1} | |
| {arrow2} { set filescroll DOWN;set modeDOWN 1} | |
| {slider} {set filescroll SLIDER} | |
| {trough1} {set filescroll UP; set modeUP page} | |
| {trough2} {set filescroll DOWN;set modeDOWN page} | |
| } | |
| while {$filescroll == "UP"} { | |
| if {$modeUP == "1"} {set XUP 1} { | |
| set XUP [expr ($YHeight/$Ydecal ) -1] | |
| } | |
| set FYbase [expr $FYbase + $XUP * $Ydecal] | |
| if {$FYbase > $Ydecal} { | |
| set FYbase 5 | |
| set filescroll no | |
| set FSlider1 0 | |
| set FSlider2 $MinSlide2 | |
| } | |
| TkW:ReShowFiles | |
| if {$nfiles != 0} { | |
| TkW:FileBrowseScroll [expr (100.*$NFabove/$nfiles)/100.] \ | |
| [expr 1. - (100.*$NFbelow/$nfiles)/100.] | |
| } else { | |
| TkW:FileBrowseScroll 0 1 | |
| } | |
| set nextLoop 0 | |
| after 30 {set nextLoop 1} | |
| while {$nextLoop == 0} {update} | |
| set FSlider1 $FSliderY1 | |
| set FSlider2 $FSliderY2 | |
| } | |
| while {$filescroll == "DOWN"} { | |
| if {$modeDOWN == "1"} {set XDOWN 1} { | |
| set XDOWN [expr ($YHeight/$Ydecal ) -1] | |
| } | |
| set FYbase [expr $FYbase - $XDOWN * $Ydecal] | |
| if {$FYbase < $MinBase} { | |
| set FYbase $MinBase | |
| set filescroll no | |
| set FSlider2 1 | |
| set FSlider1 $MaxSlide1 | |
| } | |
| TkW:ReShowFiles | |
| if {$nfiles != 0} { | |
| TkW:FileBrowseScroll [expr (100.*$NFabove/$nfiles)/100.] \ | |
| [expr 1. - (100.*$NFbelow/$nfiles)/100.] | |
| } else { | |
| TkW:FileBrowseScroll 0 1 | |
| } | |
| set nextLoop 0 | |
| after 30 {set nextLoop 1} | |
| while {$nextLoop == 0} {update} | |
| set FSlider1 $FSliderY1 | |
| set FSlider2 $FSliderY2 | |
| } | |
| while {$filescroll == "SLIDER"} { | |
| set nextLoop 0 | |
| after 20 {set nextLoop 1} | |
| while {$nextLoop == 0} { | |
| set Delta [expr (100.*($MouseY - $Y)/$YHeight)/100. ] | |
| set FSlider1 [expr $FSliderY1 +$Delta] | |
| set FSlider2 [expr $FSliderY2 +$Delta] | |
| if {$FSlider2 > 1} { | |
| set FSlider2 1 | |
| set FSlider1 $MaxSlide1 | |
| } | |
| if {$FSlider1 < 0} { | |
| set FSlider1 0 | |
| set FSlider2 $MinSlide2 | |
| } | |
| .$WinBrowse.fileframe_scr set $FSlider1 $FSlider2 | |
| set FYbase [expr 5 - $FSlider1 * $nfiles *$Ydecal] | |
| TkW:ReShowFiles | |
| update | |
| } | |
| } | |
| set FSliderY1 $FSlider1 | |
| set FSliderY2 $FSlider2 | |
| } | |
| proc TkW:ReShowDirs {} { | |
| global dirlist Ybase Ydecal ndirs YHeight WinBrowse | |
| global Nabove Nbelow | |
| set n 0 | |
| set Nabove 0 | |
| set Nbelow 0 | |
| foreach i $dirlist { | |
| set dirname [file tail $i] | |
| if {$dirname != "."} { | |
| set Y0 [expr $Ybase + $n * $Ydecal] | |
| if {$Y0 < -5} {set Nabove [expr $Nabove + 1]} | |
| if {$Y0 > [expr $YHeight - $Ydecal]} { set Nbelow [expr $Nbelow + 1]} | |
| set n [expr $n + 1] | |
| place .$WinBrowse.dirframe.icon$n -x 5 -y $Y0 | |
| place .$WinBrowse.dirframe.label$n -x 30 -y $Y0 | |
| } | |
| } | |
| } | |
| proc TkW:ReShowFiles {} { | |
| global filelist FYbase Ydecal nfiles YHeight WinBrowse | |
| global NFabove NFbelow | |
| set n 0 | |
| set NFabove 0 | |
| set NFbelow 0 | |
| foreach i $filelist { | |
| set filename [file tail $i] | |
| if {$filename != "."} { | |
| set Y0 [expr $FYbase + $n * $Ydecal] | |
| if {$Y0 < -5} {set NFabove [expr $NFabove + 1]} | |
| if {$Y0 > [expr $YHeight - $Ydecal]} { set NFbelow [expr $NFbelow + 1]} | |
| set n [expr $n + 1] | |
| place .$WinBrowse.fileframe.icon$n -x 5 -y $Y0 | |
| place .$WinBrowse.fileframe.label$n -x 30 -y $Y0 | |
| } | |
| } | |
| } | |
| proc TkW:ShowFiles {} { | |
| global filelist nfiles | |
| DestroyFiles | |
| set nfiles 0 | |
| set FshowedIn 0 | |
| set NFbelow 0 | |
| set NFabove 0 | |
| foreach i $filelist { | |
| set inout [TkW:showfile $i] | |
| if {$inout == 0} {set FshowedIn [expr $FshowedIn + 1]} | |
| if {$inout == -1} {set NFabove [expr $NFabove + 1]} | |
| if {$inout == 1} {set NFbelow [expr $NFbelow + 1]} | |
| } | |
| # Scrollbar management: | |
| if {$nfiles != 0} { | |
| TkW:FileBrowseScroll [expr (100.*$NFabove/$nfiles)/100.] \ | |
| [expr 1. - (100.*$NFbelow/$nfiles)/100.] | |
| } else { | |
| TkW:FileBrowseScroll 0 1 | |
| } | |
| } | |
| proc TkW:showfile {fullfilename} { | |
| global TKW nfiles FYbase YHeight YFILES Ydecal FILES | |
| set Y [expr $FYbase + $nfiles * $Ydecal] | |
| set In 0 | |
| if {$Y < 0 } {set In -1} | |
| if {$Y > [expr $YHeight - $Ydecal]} { set In 1 } | |
| set nfiles [expr $nfiles + 1] | |
| set YFILES($nfiles) $Y | |
| set FILES($nfiles) $fullfilename | |
| createPlaceFileIcon $nfiles $Y | |
| return $In | |
| } | |
| proc createPlaceFileIcon {n Y} { | |
| global FILES ModeBrowse WinBrowse | |
| set fullfilename $FILES($n) | |
| set icon unknown | |
| if {[file executable $fullfilename]} {set icon execfile} | |
| if {[file extension $fullfilename] == ".html"} {set icon htmlfile} | |
| if {[file extension $fullfilename] == ".htm"} {set icon htmlfile} | |
| if {[file extension $fullfilename] == ".gif"} {set icon imgfile} | |
| if {[file extension $fullfilename] == ".jpg"} {set icon imgfile} | |
| set filename [file tail $fullfilename] | |
| label .$WinBrowse.fileframe.icon$n -image $icon | |
| label .$WinBrowse.fileframe.label$n -text $filename\ | |
| -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-*-*\ | |
| -background #dddddd | |
| place .$WinBrowse.fileframe.icon$n -x 5 -y $Y | |
| place .$WinBrowse.fileframe.label$n -x 30 -y $Y | |
| if {$ModeBrowse == "File"} { | |
| #fileframe bindings | |
| bind .$WinBrowse.fileframe.icon$n <Button-1> { | |
| set Y [expr %Y - [winfo rooty .$WinBrowse.fileframe] -$FYbase] | |
| TkW:hilightFile $Y | |
| } | |
| bind .$WinBrowse.fileframe.icon$n <Double-Button-1> { | |
| destroy .$WinBrowse | |
| set WAITbrowse 0 | |
| return "$SelectFolder $SelectFile" | |
| } | |
| #fileframe bindings | |
| bind .$WinBrowse.fileframe.label$n <ButtonPress-1> { | |
| set Y [expr %Y - [winfo rooty .$WinBrowse.fileframe] -$FYbase] | |
| TkW:hilightFile $Y | |
| } | |
| bind .$WinBrowse.fileframe.label$n <Double-Button-1> { | |
| destroy .$WinBrowse | |
| set WAITbrowse 0 | |
| return "$SelectFolder $SelectFile" | |
| } | |
| } | |
| } | |
| proc DestroyDirs {} { | |
| global ndirs WinBrowse | |
| for {set i 1} {$i <= $ndirs} {set i [expr $i + 1 ]} { | |
| if {[winfo exists .$WinBrowse.dirframe.icon$i]} { | |
| destroy .$WinBrowse.dirframe.icon$i | |
| destroy .$WinBrowse.dirframe.label$i | |
| } | |
| } | |
| } | |
| proc DestroyFiles {} { | |
| global nfiles WinBrowse | |
| for {set i 1} {$i <= $nfiles} {set i [expr $i + 1 ]} { | |
| if {[winfo exists .$WinBrowse.fileframe.icon$i]} { | |
| destroy .$WinBrowse.fileframe.icon$i | |
| destroy .$WinBrowse.fileframe.label$i | |
| } | |
| } | |
| } | |
| proc TkW:hilightFile {y} { | |
| global YFILES nfiles FILES SelectNumF WinBrowse | |
| global SelectFile BrowsePattern | |
| if { $y > $YFILES($nfiles)} {set num $nfiles} else { | |
| set i 1 | |
| set ok 0 | |
| while {$ok == 0} { | |
| if { | |
| $YFILES($i) < $y &&\ | |
| $y <= $YFILES([expr $i + 1])} { | |
| set num $i | |
| set ok 1 | |
| } else { set i [expr $i + 1] } | |
| } | |
| } | |
| if {$SelectFile == $FILES($num)} { | |
| return | |
| } else { | |
| .$WinBrowse.fileframe.label$num configure -background #ffffff | |
| set SelectFile $FILES($num) | |
| if {[info exists SelectNumF]} { | |
| .$WinBrowse.fileframe.label$SelectNumF configure -background #dddddd | |
| } | |
| set SelectNumF $num | |
| } | |
| update | |
| } |