fsdialog000075500000000000000000000000001234257562200121535ustar00nobodynobodyfsdialog/de.msg000064400000000000000000000027241234257562200133370ustar00nobodynobody namespace eval ::ttk::dialog::file { ::msgcat::mcset de Location Ort ::msgcat::mcset de Filter Dateityp ::msgcat::mcset de Name Name ::msgcat::mcset de Size Größe ::msgcat::mcset de Date Änderungsdatum ::msgcat::mcset de Permissions Berechtigungen ::msgcat::mcset de Owner Besitzer ::msgcat::mcset de Group Gruppe ::msgcat::mcset de Folder Ordner ::msgcat::mcset de Sorting Sortierung ::msgcat::mcset de Reverse Umgekehrt ::msgcat::mcset de {Short View} {Listenansicht} ::msgcat::mcset de {Detailed View} {Detailansicht} ::msgcat::mcset de {Show Hidden Files} {Verborgene Dateien anzeigen} ::msgcat::mcset de {Separate Folders} {Seitenleiste} ::msgcat::mcset de {By Name} {Nach Namen} ::msgcat::mcset de {By Date} {Nach Datum} ::msgcat::mcset de {By Size} {Nach Größe} ::msgcat::mcset de {Folders First} {Ordner zuerst} ::msgcat::mcset de {New Folder} {Neuer Ordner} ::msgcat::mcset de {Create new folder in} {Neuer Ordner erstellen in} ::msgcat::mcset de {File "%s" already exists. Do you want to overwrite it?} {Datei "%s" existiert bereits. Soll sie überschrieben werden?} ::msgcat::mcset de {File "%s" does not exist.} {Datei "%s" existiert nicht.} ::msgcat::mcset de {Cannot change to the directory "%s". Permission denied.} {Kann nicht in das Verzeichnis "%s" wechseln. Keine Berechtigung.} } fsdialog/en.msg000064400000000000000000000017221234257562200133460ustar00nobodynobody namespace eval ::ttk::dialog::file { ::msgcat::mcset en Location ::msgcat::mcset en Filter ::msgcat::mcset en Name ::msgcat::mcset en Size ::msgcat::mcset en Date ::msgcat::mcset en Permissions ::msgcat::mcset en Owner ::msgcat::mcset en Group ::msgcat::mcset en Folder ::msgcat::mcset en Sorting ::msgcat::mcset en Reverse ::msgcat::mcset en {Short View} ::msgcat::mcset en {Detailed View} ::msgcat::mcset en {Show Hidden Files} ::msgcat::mcset en {Separate Folders} ::msgcat::mcset en {By Name} ::msgcat::mcset en {By Date} ::msgcat::mcset en {By Size} ::msgcat::mcset en {Folders First} ::msgcat::mcset en {New Folder} ::msgcat::mcset en {Create new folder in} ::msgcat::mcset en {File "%s" already exists. Do you want to overwrite it?} ::msgcat::mcset en {File "%s" does not exist.} ::msgcat::mcset en {Cannot change to the directory "%s". Permission denied.} } fsdialog/fsdialog.tcl000064400000000000000000001651401234257562200145350ustar00nobodynobody# Copyright (C) Schelte Bron. Freely redistributable. # Version 1.15 - 19 Aug 2012 # File names containing will mess up the layout. Tab char = \u2409 # Example proc for saving and restoring the user selections proc ::ttk::__fsOptions {{arglist ""}} { variable fsOptions array set fsOptions $arglist array get fsOptions } # Import the style command in the ttk namespace, if it doesn't exist namespace export style;catch {namespace eval ttk {namespace import ::style}} # Install the example fsOptions proc if no fsOptions proc has been provided if {[catch {rename ::ttk::__fsOptions ::ttk::fsOptions}]} { rename ::ttk::__fsOptions {} } namespace eval ::ttk::dialog { variable dir [file dirname [info script]] if {[catch {source [file join $dir fsdlg-png.tcl]}]} { # Fall back to the gif versions namespace delete ::ttk::dialog::image source [file join $dir fsdlg-gif.tcl] } package require msgcat msgcat::mcload $dir unset dir } namespace eval ::ttk::dialog::file { variable dirlist "" filelist "" filetype none opt array set opt { -sort name -hidden 1 -sepfolders 1 -foldersfirst 1 -details 0 -reverse 0 -filetype none -typevariable "" } namespace import ::msgcat::mc } ### ttk::getOpenFile, ttk::getSaveFile, ttk::getAppendFile interp alias {} ttk::getOpenFile {} ::ttk::dialog::file::tkFDialog open interp alias {} ttk::getSaveFile {} ::ttk::dialog::file::tkFDialog save interp alias {} ttk::getAppendFile {} ::ttk::dialog::file::tkFDialog append proc ::ttk::dialog::file::Create {win class} { toplevel $win -class $class wm withdraw $win set dataName [winfo name $win] upvar ::ttk::dialog::file::$dataName data if {[info exists data(topLevel)] && $data(topLevel) ne $win} { destroy $data(topLevel) } set data(topLevel) $win # Additional frame to make sure the toplevel has the correct # background color for the theme # set w [ttk::frame $win.f] pack $w -fill both -expand 1 # f1: the toolbar # set f1 [ttk::frame $w.f1 -class Toolbar] set data(bgLabel) [ttk::label $f1.bg -style Toolbutton] set data(upBtn) [ttk::button $f1.up -style Toolbutton] $data(upBtn) configure -image {::ttk::dialog::image::up disabled ::ttk::dialog::image::upbw} \ -command [list ::ttk::dialog::file::UpDirCmd $win] set data(prevBtn) [ttk::button $f1.prev -style Toolbutton] $data(prevBtn) configure -image {::ttk::dialog::image::previous disabled ::ttk::dialog::image::previousbw} \ -command [list ::ttk::dialog::file::PrevDirCmd $win] set data(nextBtn) [ttk::button $f1.next -style Toolbutton] $data(nextBtn) configure -image {::ttk::dialog::image::next disabled ::ttk::dialog::image::nextbw} \ -command [list ::ttk::dialog::file::NextDirCmd $win] set data(homeBtn) [ttk::button $f1.home -style Toolbutton] $data(homeBtn) configure -image {::ttk::dialog::image::gohome \ disabled ::ttk::dialog::image::gohomebw} \ -command [list ::ttk::dialog::file::HomeDirCmd $win] set data(reloadBtn) [ttk::button $f1.reload -style Toolbutton] $data(reloadBtn) configure -image ::ttk::dialog::image::reload \ -command [list ::ttk::dialog::file::Update $win] set data(newBtn) [ttk::button $f1.new -style Toolbutton] $data(newBtn) configure -image ::ttk::dialog::image::folder_new \ -command [list ::ttk::dialog::file::NewDirCmd $win] set data(cfgBtn) [ttk::menubutton $f1.cfg -style Toolbutton] set data(cfgMenu) [menu $data(cfgBtn).menu -tearoff 0] $data(cfgBtn) configure -image ::ttk::dialog::image::configure \ -menu $data(cfgMenu) set data(dirMenuBtn) [ttk::combobox $f1.menu] $data(dirMenuBtn) configure \ -textvariable ::ttk::dialog::file::${dataName}(selectPath) set data(sortMenu) [menu $data(cfgMenu).sort -tearoff 0] set image [option get $data(cfgMenu) image Image] set selimage [option get $data(cfgMenu) selectImage Image] $data(cfgMenu) add cascade -label " [mc Sorting]" \ -menu $data(sortMenu) -image $image -compound left $data(cfgMenu) add separator $data(cfgMenu) add radiobutton -label [mc "Short View"] \ -compound left -image $image -indicatoron 0 \ -selectimage ::ttk::dialog::image::radio16 \ -variable ::ttk::dialog::file::opt(-details) -value 0 \ -command [list ::ttk::dialog::file::setopt $win -details] $data(cfgMenu) add radiobutton -label [mc "Detailed View"] \ -compound left -image $image -indicatoron 0 \ -selectimage ::ttk::dialog::image::radio16 \ -variable ::ttk::dialog::file::opt(-details) -value 1 \ -command [list ::ttk::dialog::file::setopt $win -details] $data(cfgMenu) add separator $data(cfgMenu) add checkbutton -label [mc "Show Hidden Files"] \ -image $image -selectimage $selimage -compound left \ -variable ::ttk::dialog::file::opt(-hidden) -indicatoron 0 \ -command [list ::ttk::dialog::file::setopt $win -hidden] $data(cfgMenu) add checkbutton -label [mc "Separate Folders"] \ -image $image -selectimage $selimage -compound left \ -variable ::ttk::dialog::file::opt(-sepfolders) -indicatoron 0 \ -command [list ::ttk::dialog::file::setopt $win -sepfolders] $data(sortMenu) add radiobutton -label [mc "By Name"] -compound left \ -image $image -selectimage ::ttk::dialog::image::radio16 \ -variable ::ttk::dialog::file::opt(-sort) -value name -indicatoron 0 \ -command [list ::ttk::dialog::file::setopt $win -sort] $data(sortMenu) add radiobutton -label [mc "By Date"] -compound left \ -image $image -selectimage ::ttk::dialog::image::radio16 \ -variable ::ttk::dialog::file::opt(-sort) -value date -indicatoron 0 \ -command [list ::ttk::dialog::file::setopt $win -sort] $data(sortMenu) add radiobutton -label [mc "By Size"] -compound left \ -image $image -selectimage ::ttk::dialog::image::radio16 \ -variable ::ttk::dialog::file::opt(-sort) -value size -indicatoron 0 \ -command [list ::ttk::dialog::file::setopt $win -sort] $data(sortMenu) add separator $data(sortMenu) add checkbutton -label [mc "Reverse"] \ -image $image -selectimage $selimage -compound left \ -variable ::ttk::dialog::file::opt(-reverse) -indicatoron 0 \ -command [list ::ttk::dialog::file::setopt $win -reverse] $data(sortMenu) add checkbutton -label [mc "Folders First"] \ -image $image -selectimage $selimage -compound left \ -variable ::ttk::dialog::file::opt(-foldersfirst) -indicatoron 0 \ -command [list ::ttk::dialog::file::setopt $win -foldersfirst] $data(prevBtn) state disabled $data(nextBtn) state disabled if {![info exists ::env(HOME)]} { $data(homeBtn) state disabled } place $data(bgLabel) -relheight 1 -relwidth 1 pack $data(upBtn) -side left -fill y pack $data(prevBtn) -side left -fill y pack $data(nextBtn) -side left -fill y pack $data(homeBtn) -side left -fill y pack $data(reloadBtn) -side left -fill y pack $data(newBtn) -side left -fill y pack $data(cfgBtn) -side left -fill y pack $data(dirMenuBtn) -side left -fill x -expand 1 -padx 8 # f2: the frame with the OK button, cancel button, "file name" field, # and file types field. # set f2 [ttk::frame $w.f2] ttk::label $f2.lab1 -text "[mc Location]:" -anchor w set data(location) [ttk::combobox $f2.loc -validate key \ -validatecommand [list ::ttk::dialog::file::LocEdit $win %S]] $data(location) configure \ -textvariable ::ttk::dialog::file::${dataName}(selectFile) set data(typeMenuLab) [ttk::label $f2.lab2 -anchor w -text "[mc Filter]:"] set data(typeMenuBtn) [ttk::combobox $f2.filter] set data(okBtn) [ttk::button $f2.ok -text [mc OK] -default active \ -width 8 -style Slim.TButton \ -command [list ::ttk::dialog::file::Done $win button]] set data(cancelBtn) [ttk::button $f2.cancel -text [mc Cancel] -width 8 \ -style Slim.TButton -command [list ::ttk::dialog::file::Cancel $win]] grid $f2.lab1 $f2.loc $data(okBtn) -padx 4 -pady 5 -sticky ew grid $f2.lab2 $f2.filter $data(cancelBtn) -padx 4 -pady 5 -sticky ew grid columnconfigure $f2 1 -weight 1 # f3: The file and directory lists # set f3 [ttk::panedwindow $w.f3 -orient horizontal] array set fontinfo [font actual [[label $f3.dummy] cget -font]] set font [maxfont $fontinfo(-family) 16] destroy $f3.dummy $f3 add [ttk::frame $f3.dir] -weight 0 ttk::label $f3.dir.bg -relief sunken set data(dirArea) [text $f3.dir.t -bg white -width 20 -height 16 \ -font $font -bd 0 -highlightthickness 0 -cursor "" \ -wrap none -spacing1 1 -spacing3 1 -exportselection 0 \ -state disabled -yscrollcommand [list $f3.dir.y set] \ -xscrollcommand [list $f3.dir.x set]] ttk::scrollbar $f3.dir.y -command [list $f3.dir.t yview] ttk::scrollbar $f3.dir.x -command [list $f3.dir.t xview] -orient horizontal grid $f3.dir.t $f3.dir.y -sticky ns grid $f3.dir.x -sticky we grid $f3.dir.bg -row 0 -column 0 -rowspan 2 -columnspan 2 -sticky news grid $f3.dir.t -sticky news -padx {2 0} -pady {2 0} grid columnconfigure $f3.dir 0 -weight 1 grid rowconfigure $f3.dir 0 -weight 1 $f3 add [ttk::frame $f3.file] -weight 1 # The short view version # set data(short) [ttk::frame $f3.file.short] ttk::label $data(short).bg -relief sunken set data(fileArea) [text $data(short).t -width 42 -height 16 -bg white \ -font $font -bd 0 -highlightthickness 0 -cursor "" -wrap none \ -spacing1 1 -spacing3 1 -exportselection 0 -state disabled \ -xscrollcommand [list ::ttk::dialog::file::scrollset $win]] set data(xScroll) [ttk::scrollbar $data(short).x -orient horizontal \ -command [list ::ttk::dialog::file::xview $win]] grid $data(short).t -sticky news -padx 2 -pady {2 0} grid $data(short).x -sticky ew grid $data(short).bg -row 0 -column 0 \ -rowspan 2 -columnspan 2 -sticky news grid columnconfigure $data(short) 0 -weight 1 grid rowconfigure $data(short) 0 -weight 1 # The detailed view version # set data(long) [ttk::frame $f3.file.long] ttk::label $data(long).bg -relief sunken ttk::frame $data(long).f set data(fileHdr) [frame $data(long).f.f] ttk::label $data(fileHdr).l0 -style Toolbutton -anchor w -text [mc Name] ttk::label $data(fileHdr).l1 -style Toolbutton -anchor w -text [mc Size] ttk::label $data(fileHdr).l2 -style Toolbutton -anchor w -text [mc Date] ttk::label $data(fileHdr).l3 \ -style Toolbutton -anchor w -text [mc Permissions] ttk::label $data(fileHdr).l4 -style Toolbutton -anchor w -text [mc Owner] ttk::label $data(fileHdr).l5 -style Toolbutton -anchor w -text [mc Group] ttk::separator $data(fileHdr).s1 -orient vertical ttk::separator $data(fileHdr).s2 -orient vertical ttk::separator $data(fileHdr).s3 -orient vertical ttk::separator $data(fileHdr).s4 -orient vertical ttk::separator $data(fileHdr).s5 -orient vertical set height [winfo reqheight $data(fileHdr).l1] $data(long).f configure -height [expr {$height + 1}] $data(fileHdr) configure -height $height place $data(fileHdr) -x 1 -relwidth 1 place $data(fileHdr).l0 -x -1 -relwidth 1 -relheight 1 place $data(fileHdr).s1 -rely .1 -relheight .8 -anchor n place $data(fileHdr).s2 -rely .1 -relheight .8 -anchor n place $data(fileHdr).s3 -rely .1 -relheight .8 -anchor n place $data(fileHdr).s4 -rely .1 -relheight .8 -anchor n place $data(fileHdr).s5 -rely .1 -relheight .8 -anchor n set data(fileList) [text $data(long).t -width 42 -height 12 -bg white \ -font $font -bd 0 -highlightthickness 0 -cursor "" -wrap none \ -spacing1 1 -spacing3 1 -exportselection 0 -state disabled \ -yscrollcommand [list $data(long).y set] \ -xscrollcommand [list ::ttk::dialog::file::scrollhdr $win]] ttk::scrollbar $data(long).y -command [list $data(long).t yview] ttk::scrollbar $data(long).x -orient horizontal \ -command [list $data(long).t xview] grid $data(long).f $data(long).y -sticky ew -padx {2 0} -pady {2 0} grid $data(long).t ^ -sticky news -padx {2 0} grid $data(long).x -sticky ew grid $data(long).y -sticky ns -padx 0 -pady 0 grid $data(long).bg -row 0 -column 0 \ -rowspan 3 -columnspan 2 -sticky news grid columnconfigure $data(long) 0 -weight 1 grid rowconfigure $data(long) 1 -weight 1 grid $data(long) $data(short) -row 0 -column 0 -sticky news grid columnconfigure $f3.file 0 -weight 1 grid rowconfigure $f3.file 0 -weight 1 # Get rid of the default Text bindings bindtags $data(dirArea) [list $data(dirArea) FileDialogDir $win all] bindtags $data(fileArea) [list $data(fileArea) FileDialogFile $win all] bindtags $data(fileList) [list $data(fileList) FileDialogList $win all] $data(fileArea) tag bind file <1> \ {set ::ttk::dialog::file::filetype file} $data(fileArea) tag bind characterSpecial <1> \ {set ::ttk::dialog::file::filetype file} $data(fileArea) tag bind blockSpecial <1> \ {set ::ttk::dialog::file::filetype file} $data(fileArea) tag bind fifo <1> \ {set ::ttk::dialog::file::filetype file} $data(fileArea) tag bind link <1> \ {set ::ttk::dialog::file::filetype link} $data(fileArea) tag bind directory <1> \ {set ::ttk::dialog::file::filetype directory} $data(fileList) tag bind file <1> \ {set ::ttk::dialog::file::filetype file} $data(fileList) tag bind characterSpecial <1> \ {set ::ttk::dialog::file::filetype file} $data(fileList) tag bind blockSpecial <1> \ {set ::ttk::dialog::file::filetype file} $data(fileList) tag bind fifo <1> \ {set ::ttk::dialog::file::filetype file} $data(fileList) tag bind link <1> \ {set ::ttk::dialog::file::filetype link} $data(fileList) tag bind directory <1> \ {set ::ttk::dialog::file::filetype directory} set data(paneWin) $f3 pack $f1 -side top -fill x pack $f2 -side bottom -fill x -padx 8 -pady {0 5} pack $f3 -side bottom -fill both -expand 1 -padx 8 -pady {6 0} set data(columns) 0 set data(history) "" set data(histpos) -1 set data(select) 0 update idletasks pack propagate $w 0 wm protocol $win WM_DELETE_WINDOW [list $data(cancelBtn) invoke] bind $win [list $data(cancelBtn) invoke] bind $data(fileArea) [list ::ttk::dialog::file::configure $win] bind $data(dirMenuBtn) [list ::ttk::dialog::file::chdir $win] bind $data(dirMenuBtn) <> \ [list ::ttk::dialog::file::chdir $win] bind $data(location) [list ::ttk::dialog::file::Done $win return] bind $data(typeMenuBtn) [list ::ttk::dialog::file::SetFilter $win] bind $data(typeMenuBtn) <> \ [list ::ttk::dialog::file::SelectFilter $win] } proc ::ttk::dialog::file::ChangeDir {w dir} { set dataName [winfo name $w] upvar ::ttk::dialog::file::$dataName data set data(history) [lrange $data(history) 0 $data(histpos)] set cwd [lindex $data(history) $data(histpos)] set path [file normalize [JoinFile $cwd $dir]] set data(selectPath) [file nativename $path] lappend data(history) $path if {[incr data(histpos)]} { $data(prevBtn) state !disabled if {$data(type) eq "open"} { set data(selectFile) "" } } $data(nextBtn) state disabled UpdateWhenIdle $w } proc ::ttk::dialog::file::UpdateWhenIdle {w} { upvar ::ttk::dialog::file::[winfo name $w] data if {[info exists data(updateId)]} { return } elseif {[winfo ismapped $w]} { set after idle } else { set after 1 } set data(updateId) [after $after [list ::ttk::dialog::file::Update $w]] } proc ::ttk::dialog::file::Update {w} { # This proc may be called within an idle handler. Make sure that the # window has not been destroyed before this proc is called if {![winfo exists $w]} return set dataName [winfo name $w] upvar ::ttk::dialog::file::$dataName data unset -nocomplain data(updateId) if {$data(-details)} { grid $data(long) grid remove $data(short) } else { grid $data(short) grid remove $data(long) } if {$data(-sepfolders)} { if {![llength [winfo manager $data(paneWin).dir]]} { $data(paneWin) insert 0 $data(paneWin).dir } } else { if {[llength [winfo manager $data(paneWin).dir]]} { $data(paneWin) forget 0 } } $w configure -cursor watch update set dir ::ttk::dialog::image::folder set file ::ttk::dialog::image::file set cwd [lindex $data(history) $data(histpos)] if {$data(-hidden)} { set pattern "* .*" } else { set pattern "*" } # Make the directory list if {[catch [linsert $pattern 0 glob -nocomplain -tails \ -directory $cwd -type d] list]} { $w configure -cursor "" tk_messageBox -icon warning -type ok -parent $w -message \ [mc {Cannot change to the directory "%s". Permission denied.} \ $cwd] set data(history) [lreplace $data(history) \ $data(histpos) $data(histpos)] if {$data(histpos) > 0} {incr data(histpos) -1} return } set dlist "" foreach f $list { if {$f eq "." || $f eq ".."} continue lappend dlist [list $f dir] } # Make the file list set flist "" set filter $data(filter) if {$filter eq "*"} { set filter $pattern } foreach f [eval [linsert $filter 0 glob -nocomplain -tails \ -directory $cwd -type {f l c b p}]] { # Links can still be directories. Skip those. if {[file isdirectory [JoinFile $cwd $f]]} continue lappend flist [list $f file] } # Combine the two lists, if necessary if {$data(-sepfolders)} { set dlist [sort $w $dlist] set flist [sort $w $flist] } elseif {$data(-foldersfirst)} { set flist [concat [sort $w $dlist] [sort $w $flist]] set dlist "" } else { set flist [sort $w [concat $flist $dlist]] set dlist "" } set t $data(dirArea) $t configure -state normal $t delete 1.0 end foreach f $dlist { $t image create end -image $dir $t insert end " [lindex $f 0]\n" } $t delete end-1c end $t configure -state disabled if {$data(-details)} { set data(list) $flist ::ttk::dialog::file::FileList1 $w } else { set t $data(fileArea) set maxsize 50 set list "" set font [$t cget -font] foreach f $flist { lassign $f name type lappend list $name $type set size [font measure $font $name] if {$size > $maxsize} { set maxsize $size } } incr maxsize [font measure $font " "] # Make sure maxsize is a multiple of an average size character set dx [font measure $font 0] set maxsize [expr {($maxsize + 20 + $dx) / $dx * $dx}] $t configure -tabs $maxsize set data(colwidth) $maxsize set data(rows) [expr {[winfo height $t] / 18}] set data(list) $list ::ttk::dialog::file::FileList2 $w } if {[llength [file split $cwd]] == 1} { $data(upBtn) state disabled } else { $data(upBtn) state !disabled } $w configure -cursor "" } # Create a detailed file list proc ::ttk::dialog::file::FileList1 {w} { set dataName [winfo name $w] upvar ::ttk::dialog::file::$dataName data set dir ::ttk::dialog::image::folder set file ::ttk::dialog::image::file set cwd [lindex $data(history) $data(histpos)] set t $data(fileList) $t configure -state normal $t delete 1.0 end set size "";set date "";set mode "";set uid "";set gid "" set files {} set maxsize 50 set font [$t cget -font] foreach f $data(list) { lassign $f name type size date mode uid gid if {![info exists users($uid)] || ![info exists groups($gid)]} { set fname [JoinFile $cwd $name] # May fail for dead links if {![catch {array set attr [file attributes $fname]}]} { if {[info exists attr(-owner)]} { set users($uid) $attr(-owner) } else { set users($uid) "" } if {[info exists attr(-group)]} { set groups($gid) $attr(-group) } else { set groups($gid) "" } } } catch {set uid $users($uid)} catch {set gid $groups($gid)} set image [expr {$type eq "directory" ? $dir : $file}] set img [$t image create end -image $image] $t tag add name $img $t tag add $type $img $t insert end " $name" [list name $type] $t insert end "\t$size\t" $type $t insert end "[datefmt $date]\t" $type $t insert end "[modefmt $type $mode]\t" $type $t insert end "$uid\t$gid\t\n" $type set size [font measure $font " $name"] if {$size > $maxsize} {set maxsize $size} lappend files $name } $t delete end-1c end $t configure -state disabled set today [datefmt [clock seconds]] set maxu [winfo reqwidth $data(fileHdr).l4] foreach n [array names users] { set size [font measure $font $users($n)] if {$size > $maxu} {set maxu $size} } set maxg [winfo reqwidth $data(fileHdr).l5] foreach n [array names groups] { set size [font measure $font $groups($n)] if {$size > $maxg} {set maxg $size} } set tabs [list [set x [incr maxsize 22]]] lappend tabs [incr x [font measure $font 1000000000]] \ [incr x [font measure $font " $today "]] \ [incr x [font measure $font [modefmt w 0777]]] \ [incr x [incr maxu 8]] [incr x [incr maxg 8]] $t configure -tabs $tabs set i 1 foreach n $tabs { place $data(fileHdr).l$i -x $n place $data(fileHdr).s$i -x $n if {[incr i] > 5} break } # Reselect the files the user selected before if {$data(select)} { if {$data(-multiple)} { set select $data(selectFile) } else { set select [list $data(selectFile)] } foreach file $select { set row [lsearch -exact $files $file] if {$row < 0} continue foreach {m1 m2} [$t tag nextrange name [incr row].0] { $t tag add sel "$m1 + 2c" $m2 } } } } # Create a short file list proc ::ttk::dialog::file::FileList2 {w} { set dataName [winfo name $w] upvar ::ttk::dialog::file::$dataName data set dir ::ttk::dialog::image::folder set file ::ttk::dialog::image::file set t $data(fileArea) set lines $data(rows) set row 1;set col 0 set coltag column$col set files {} $t configure -state normal $t delete 1.0 end foreach {name type} $data(list) { set idx $row.end set image [expr {$type eq "directory" ? $dir : $file}] set img [$t image create $idx -image $image] $t tag add $type $img $t tag add name $img $t insert $idx " $name" [list name $type $coltag] "\t" $type lappend files $name if {[incr row] > $lines} { set coltag column[incr col] set row 1 } elseif {$col == 0} { $t insert $idx "\n" } } $t insert 1.end "\t" $t configure -state disabled set data(columns) [expr {$row > 1 ? $col + 1 : $col}] # Should possibly restore the position of the last clicked file? $t mark unset lastpos # Reselect the files the user selected before if {$data(select)} { if {$data(-multiple)} { set select $data(selectFile) } else { set select [list $data(selectFile)] } foreach file $select { set x [lsearch -exact $files $file] if {$x < 0} continue set row [expr {$x % $lines + 1}] set col [expr {$x / $lines}] foreach {m1 m2} [$t tag nextrange column$col $row.0] { $t tag add sel "$m1 + 1c" $m2 } } } } proc ::ttk::dialog::file::LocEdit {w str} { # This proc is called when a user edits the Location field set dataName [winfo name $w] upvar ::ttk::dialog::file::$dataName data $data(fileArea) tag remove sel 1.0 end set data(select) 0 return 1 } proc ::ttk::dialog::file::sort {w list} { set dataName [winfo name $w] upvar ::ttk::dialog::file::$dataName data set cwd [lindex $data(history) $data(histpos)] set order [expr {$data(-reverse) ? "-decreasing" : "-increasing"}] set newlist "" foreach f $list { set file [lindex $f 0] # Use lstat in case the destination doesn't exists # The call may fail due to permissions if {[catch {file lstat [JoinFile $cwd $file] stat}]} { if {[file isdirectory [JoinFile $cwd $file]]} { set stat(type) directory } else { set stat(type) file } } elseif {$stat(type) eq "link"} { # This may fail if the link points to nothing if {![catch {file stat [JoinFile $cwd $file] dest}]} { array set stat [array get dest] if {$stat(type) eq "file"} { set stat(type) link } } } lappend newlist [list $file $stat(type) $stat(size) \ $stat(mtime) $stat(mode) $stat(uid) $stat(gid)] } switch -- $data(-sort) { size { set mode -integer set idx 2 } date { set mode -integer set idx 3 } default { set mode -dictionary set idx 0 } } lsort $order $mode -index $idx $newlist } proc ::ttk::dialog::file::datefmt {str} { clock format $str -format {%d-%m-%Y %H:%M} } proc ::ttk::dialog::file::modefmt {type mode} { switch $type { file {set rc -} default {set rc [string index $type 0]} } binary scan [binary format I $mode] B* bits foreach b [split [string range $bits end-8 end] ""] \ c {r w x r w x r w x} { if {$b} {append rc $c} else {append rc -} } set rc } proc ::ttk::dialog::file::xview {w cmd number {units ""}} { set dataName [winfo name $w] upvar ::ttk::dialog::file::$dataName data set width [winfo width $data(fileArea)] lassign [$data(fileArea) xview] pos1 pos2 set cols $data(columns) set page [expr {int($width / $data(colwidth))}] if {!$page} {set page 1} switch $cmd { scroll { set col [expr {round($pos1 * ($cols + 1))}] if {[string match p* $units]} { incr col [expr {$number * $page}] } else { incr col $number } } moveto { set col [expr {round($number * $cols)}] } } set max [expr {$cols - $page}] if {$col > $max} {set col $max} if {$col < 0} {set col 0} set pos [expr {double($col) / ($cols + 1)}] $data(fileArea) xview moveto $pos } proc ::ttk::dialog::file::scrollset {w first last} { set dataName [winfo name $w] upvar ::ttk::dialog::file::$dataName data if {$data(columns)} { if {$last >= 0.999} { xview $w scroll -1 units return } set w $data(colwidth) set cols $data(columns) set width [winfo width $data(fileArea)] if {$w > $width} {set w $width} set vwidth [expr {$width % $w + $cols * $w}] set total [expr {$width / ($last - $first)}] set first [expr {$first * $total / $vwidth}] set last [expr {$last * $total / $vwidth}] } $data(xScroll) set $first $last } proc ::ttk::dialog::file::scrollhdr {w first last} { set dataName [winfo name $w] upvar ::ttk::dialog::file::$dataName data lassign [$data(fileList) dlineinfo @0,0] x y width height base place $data(fileHdr) -x $x -width $width $data(long).x set $first $last } proc ::ttk::dialog::file::configure {w} { set dataName [winfo name $w] upvar ::ttk::dialog::file::$dataName data if {$data(columns) == 0} return set h [winfo height $data(fileArea)] set rows [expr {$h / 18}] if {$rows != $data(rows)} { set data(rows) $rows ::ttk::dialog::file::FileList2 $w } } proc ::ttk::dialog::file::setopt {w option} { set dataName [winfo name $w] upvar ::ttk::dialog::file::$dataName data variable opt set data($option) $opt($option) UpdateWhenIdle $w } proc ::ttk::dialog::file::maxfont {family max} { set size [expr {2 - $max}] while {[font metrics [list $family $size] -linespace] > $max} { if {[incr size] > -8} break } return [list $family $size] } # Join a file name to a path name. The "file join" command will break # if the filename begins with ~ # proc ::ttk::dialog::file::JoinFile {path file} { if {[string match {~*} $file] && [file exists $path/$file]} { return [file join $path ./$file] } else { return [file join $path $file] } } proc ::ttk::dialog::file::UpDirCmd {w} { set dataName [winfo name $w] upvar ::ttk::dialog::file::$dataName data ChangeDir $w [file dirname [lindex $data(history) $data(histpos)]] } proc ::ttk::dialog::file::PrevDirCmd {w} { set dataName [winfo name $w] upvar ::ttk::dialog::file::$dataName data # set data(selectFile) "" incr data(histpos) -1 set data(selectPath) \ [file nativename [lindex $data(history) $data(histpos)]] $data(nextBtn) state !disabled if {!$data(histpos)} { $data(prevBtn) state disabled } Update $w } proc ::ttk::dialog::file::NextDirCmd {w} { set dataName [winfo name $w] upvar ::ttk::dialog::file::$dataName data # set data(selectFile) "" incr data(histpos) set data(selectPath) \ [file nativename [lindex $data(history) $data(histpos)]] $data(prevBtn) state !disabled if {$data(histpos) >= [llength $data(history)] - 1} { $data(nextBtn) state disabled } Update $w } proc ::ttk::dialog::file::HomeDirCmd {w} { ChangeDir $w ~ } proc ::ttk::dialog::file::NewDirCmd {win} { set dataName [winfo name $win] upvar ::ttk::dialog::file::$dataName data if {[info exists data(history)]} { set dir [file nativename [lindex $data(history) $data(histpos)]] } else { set dir $data(selectPath) } toplevel $win.new wm title $win.new [mc "New Folder"] set w [ttk::frame $win.new.f] pack $w -expand 1 -fill both ttk::label $w.prompt -anchor w -justify left \ -text [mc "Create new folder in"]:\n$dir ttk::entry $w.box -width 36 -validate all \ -validatecommand [list ::ttk::dialog::file::NewDirVCmd $w %P] ttk::separator $w.sep set f [ttk::frame $w.buttons] ttk::button $f.clear -text [mc Clear] -takefocus 0 \ -command [list $w.box delete 0 end] ttk::button $f.ok -text [mc OK] -default active \ -command [list ::ttk::dialog::file::NewDirExit $win 1] ttk::button $f.cancel -text [mc Cancel] \ -command [list ::ttk::dialog::file::NewDirExit $win] grid $f.clear $f.ok $f.cancel -padx 4 -pady {0 10} -sticky we grid columnconfigure $f {0 1 2} -uniform 1 pack $w.prompt $w.box $w.sep $f \ -side top -padx 12 -pady 3 -anchor w -fill x pack $w.prompt -pady {12 0} pack $f -anchor e -fill none -padx 8 wm transient $win.new $win wm resizable $win.new 0 0 wm protocol $win.new WM_DELETE_WINDOW [list $f.cancel invoke] bind $w.box [list $f.ok invoke] ::tk::PlaceWindow $win.new widget $win ::tk::SetFocusGrab $win.new $w.box } proc ::ttk::dialog::file::NewDirVCmd {w str} { if {$str ne ""} { $w.buttons.ok state !disabled $w.buttons.clear state !disabled } else { $w.buttons.ok state disabled $w.buttons.clear state disabled } return 1 } proc ::ttk::dialog::file::NewDirExit {w {save 0}} { upvar ::ttk::dialog::file::[winfo name $w] data if {$save} { if {[info exists data(history)]} { set dir [lindex $data(history) $data(histpos)] } else { set dir [file normalize $data(selectPath)] } set newdir [file join $dir [$w.new.f.box get]] if {[catch {file mkdir $newdir} err]} { tk_messageBox -type ok -parent $w.new -icon error \ -message [string toupper $err 0 0]. return } elseif {[winfo class $w] eq "TkFDialog"} { ChangeDir $w $newdir } else { treeUpdate $w $newdir } } destroy $w.new ::tk::RestoreFocusGrab $w.new $w.new.f.box } proc ::ttk::dialog::file::Cancel {w} { variable selectFilePath "" } proc ::ttk::dialog::file::Done {w {evsrc mouse}} { variable selectFilePath variable filelist set dataName [winfo name $w] upvar ::ttk::dialog::file::$dataName data set cwd [lindex $data(history) $data(histpos)] if {$data(selectFile) eq "" || $data(selectFile) eq "."} { if {$data(-choosedir) && $evsrc ne "mouse"} { set selectFilePath $cwd set filelist $cwd } return -code break } set path "" if {$data(-multiple) && ![catch {llength $data(selectFile)}]} { foreach file $data(selectFile) { if {[file extension $file] eq ""} { append file $data(-defaultextension) } lappend path [JoinFile $cwd $file] } } else { set file [JoinFile $cwd $data(selectFile)] if {[file extension $file] eq ""} { append file $data(-defaultextension) } set path [list $file] } set missing "" foreach file $path { if {[file isdirectory $file]} { set data(selectFile) "" ChangeDir $w $file return -code break } elseif {$data(-choosedir)} { set data(selectFile) "" return -code break } if {![file exists $file]} { lappend missing $file } } if {[llength $missing]} { if {$data(type) eq "open"} { if {[llength $missing] > 1} { set str {Files %s do not exist.} } else { set str {File "%s" does not exist.} } tk_messageBox -icon warning -type ok -parent $w \ -message [mc $str [join $missing {, }]] return } } else { if {$data(type) ne "open" && $data(-confirmoverwrite)} { set str {File "%s" already exists. Do you want to overwrite it?} set reply [tk_messageBox -parent $w -icon warning -type yesno \ -message [mc $str [lindex $path 0]]] if {$reply eq "no"} {return} } } foreach file $path { set filelist [lsearch -exact -all -inline -not $filelist $file] set filelist [linsert $filelist 0 $file] } if {$data(-multiple)} { set selectFilePath $path } else { set selectFilePath [lindex $path 0] } return -code break } proc ::ttk::dialog::file::chdir {w} { upvar ::ttk::dialog::file::[winfo name $w] data if {[catch {file normalize $data(selectPath)} dir]} { tk_messageBox -icon warning -type ok -parent $w \ -message [string toupper $dir 0 0]. return } if {[file isdirectory $dir]} { ChangeDir $w $dir } else { set str {Cannot change to the directory "%s". Permission denied.} tk_messageBox -type ok -parent $w -icon warning \ -message [mc $str $data(selectPath)] } return -code break } proc ::ttk::dialog::file::SelectFilter {w} { upvar ::ttk::dialog::file::[winfo name $w] data set data(filter) [lindex $data(-filetypes) \ [$data(typeMenuBtn) current] 1] set data(typevar) [lindex $data(-filetypes) \ [$data(typeMenuBtn) current] 0] ::ttk::dialog::file::UpdateWhenIdle $w } proc ::ttk::dialog::file::SetFilter {w} { upvar ::ttk::dialog::file::[winfo name $w] data set data(filter) [$data(typeMenuBtn) get] set data(typevar) "" ::ttk::dialog::file::UpdateWhenIdle $w return -code break } proc ::ttk::dialog::file::DirButton1 {w x y} { scan [$w index @$x,$y] %d.%d line char $w tag remove sel 1.0 end $w tag add sel $line.2 $line.end } proc ::ttk::dialog::file::DirRelease1 {w x y} { set top [winfo toplevel $w] $top configure -cursor "" } proc ::ttk::dialog::file::DirRelease1 {w x y} { set top [winfo toplevel $w] if {[$top cget -cursor] ne ""} { # The mouse has been moved, don't perform the action $top configure -cursor "" } elseif {[llength [$w tag ranges sel]]} { set dir [$w get sel.first sel.last] ChangeDir [winfo toplevel $w] $dir } } proc ::ttk::dialog::file::DirMotion1 {w x y} { [winfo toplevel $w] configure -cursor "X_cursor #C00 #000" } proc ::ttk::dialog::file::FileButton1 {w x y} { set dataName [winfo name [winfo toplevel $w]] upvar ::ttk::dialog::file::$dataName data variable filetype if {$filetype eq "none"} return if {$filetype ne "directory" && $data(-choosedir)} return set range [$w tag prevrange name @$x,$y+1c "@$x,$y linestart"] $w mark set lastpos @$x,$y if {[llength $range]} { lassign $range index1 index2 $w tag remove sel 1.0 end $w tag add sel $index1+2c $index2 set data(select) 1 if {$filetype ne "file" && $filetype ne "link"} { } elseif {$data(-multiple)} { set data(selectFile) [list [$w get sel.first sel.last]] } else { set data(selectFile) [$w get sel.first sel.last] } } } proc ::ttk::dialog::file::FileRelease1 {w x y} { set dataName [winfo name [winfo toplevel $w]] upvar ::ttk::dialog::file::$dataName data variable filetype set top [winfo toplevel $w] if {[$top cget -cursor] ne ""} { # The mouse has been moved, don't perform the action $top configure -cursor "" } elseif {$filetype ne "directory"} { # A file was selected } elseif {[llength [$w tag ranges sel]]} { set dir [$w get sel.first sel.last] ChangeDir [winfo toplevel $w] $dir } [winfo toplevel $w] configure -cursor "" set filetype none } proc ::ttk::dialog::file::FileMotion1 {w x y} { [winfo toplevel $w] configure -cursor "X_cursor #C00 #000" } proc ::ttk::dialog::file::FileControl1 {w x y} { set dataName [winfo name [winfo toplevel $w]] upvar ::ttk::dialog::file::$dataName data variable filetype if {!$data(-multiple) || $filetype eq "none"} return if {$filetype ne "file" && $filetype ne "link"} return set range [$w tag prevrange name @$x,$y+1c "@$x,$y linestart"] $w mark set lastpos @$x,$y if {[llength $range]} { lassign $range index1 index2 if {[lsearch [$w tag names @$x,$y] sel] < 0} { $w tag add sel $index1+2c $index2 } else { $w tag remove sel $index1+2c $index2 } set data(select) 1 set files {};foreach {first last} [$w tag ranges sel] { lappend files [$w get $first $last] } set data(selectFile) [lsort -dictionary $files] } } proc ::ttk::dialog::file::FileShift1 {w x y} { set dataName [winfo name [winfo toplevel $w]] upvar ::ttk::dialog::file::$dataName data variable filetype if {!$data(-multiple) || $filetype eq "none"} return set m1 [$w index @$x,$y] if {[catch {$w index lastpos} m2]} { set m2 $m1 } set row1 [lindex [split $m1 .] 0] set col1 [llength [split [$w get $row1.0 $m1] \t]] set row2 [lindex [split $m2 .] 0] set col2 [llength [split [$w get $row2.0 $m2] \t]] if {$row1 > $row2} {lassign [list $row2 $row1] row1 row2} if {$col1 > $col2} {lassign [list $col2 $col1] col1 col2} $w tag remove sel 1.0 end set dir [lindex [$w tag nextrange directory $row1.0] 0] for {} {$row1 <= $row2} {incr row1} { for {set cur $row1.0;set i 1} {$i < $col1} {incr i} { set cur [lindex [$w tag nextrange name $cur] 1] } for {} {$i <= $col2} {incr i} { if {$dir ne "" && [$w compare $dir < $cur]} { set dir [lindex [$w tag nextrange directory $cur] 0] } lassign [$w tag nextrange name $cur] index1 index2 if {$dir eq "" || [$w compare $dir != $index1]} { $w tag add sel $index1+2c $index2 } set cur $index2 } } set data(select) 1 # eval [linsert [$w tag ranges directory] 0 $w tag remove sel] $w mark set lastpos @$x,$y set files {};foreach {first last} [$w tag ranges sel] { lappend files [$w get $first $last] } set data(selectFile) [lsort -dictionary $files] } proc ::ttk::dialog::file::tkFDialog {type args} { global env variable selectFilePath variable filelist variable opt set dataName __ttk_filedialog upvar ::ttk::dialog::file::$dataName data if {[info exists data(active)]} { raise $data(active) return } ::ttk::dialog::file::Config $dataName $type $args if {$data(-parent) eq "."} { set w .$dataName } else { set w $data(-parent).$dataName } if {![winfo exists $w]} { ::ttk::dialog::file::Create $w TkFDialog } elseif {[winfo class $w] ne "TkFDialog"} { destroy $w ::ttk::dialog::file::Create $w TkFDialog } else { $data(fileArea) configure -state normal $data(fileArea) delete 1.0 end $data(fileArea) configure -state disabled $data(dirArea) configure -state normal $data(dirArea) delete 1.0 end $data(dirArea) configure -state disabled $data(prevBtn) state disabled $data(nextBtn) state disabled $data(upBtn) state disabled set data(history) "" set data(histpos) -1 } wm transient $w $data(-parent) if {$data(-typevariable) ne ""} {upvar 1 $data(-typevariable) typevar} if {[llength $data(-filetypes)]} { set type ""; if {[info exists typevar]} {set type $typevar} set titles ""; set current 0 foreach ftype $data(-filetypes) { lassign $ftype title filter regsub {(.*) \(.*\)} $title {\1} str if {$str eq $type} {set current [llength $titles]} lappend titles $title } $data(typeMenuBtn) configure -values $titles $data(typeMenuLab) state !disabled $data(typeMenuBtn) state !disabled $data(typeMenuBtn) current $current ::ttk::dialog::file::SelectFilter $w } else { set data(filter) "*" set data(typevar) "" $data(typeMenuBtn) configure -takefocus 0 $data(typeMenuBtn) state disabled $data(typeMenuLab) state disabled $data(typeMenuBtn) set "" } set dirlist {} foreach n [file volumes] { lappend dirlist [file nativename $n] } if {[info exists env(HOME)] && \ [lsearch -exact $dirlist [file nativename $env(HOME)]] < 0} { lappend dirlist [file nativename $env(HOME)] } if {[lsearch -exact $dirlist [file nativename $data(selectPath)]] < 0} { lappend dirlist [file nativename $data(selectPath)] } foreach n $filelist { set dir [file nativename [file dirname $n]] if {[lsearch -exact $dirlist $dir] < 0} { lappend dirlist $dir } } $data(dirMenuBtn) configure -values $dirlist $data(location) configure -values $filelist ::ttk::dialog::file::ChangeDir $w [file normalize $data(selectPath)] ::tk::PlaceWindow $w widget $data(-parent) wm title $w $data(-title) ::tk::SetFocusGrab $w $data(location) # Make sure the application doesn't hang if the toplevel is destroyed bind $w {set ::ttk::dialog::file::selectFilePath ""} set data(active) $w tkwait variable ::ttk::dialog::file::selectFilePath unset data(active) ::ttk::fsOptions [array get opt] catch {::tk::RestoreFocusGrab $w $data(location) withdraw} set typevar $data(typevar) return $selectFilePath } proc ::ttk::dialog::file::Config {dataName type argList} { upvar ::ttk::dialog::file::$dataName data variable opt set data(type) $type # 1: the configuration specs # array set opt [::ttk::fsOptions] set specs { {-defaultextension "" "" ""} {-filetypes "" "" ""} {-initialdir "" "" ""} {-initialfile "" "" ""} {-parent "" "" "."} {-title "" "" ""} {-typevariable "" "" ""} } lappend specs [list -sepfolders "" "" $opt(-sepfolders)] lappend specs [list -foldersfirst "" "" $opt(-foldersfirst)] lappend specs [list -sort "" "" $opt(-sort)] lappend specs [list -reverse "" "" $opt(-reverse)] lappend specs [list -details "" "" $opt(-details)] lappend specs [list -hidden "" "" $opt(-hidden)] # The "-multiple" and "-choosedir" options are only available for # the "open" file dialog. # if {$type eq "open"} { lappend specs {-multiple "" "" "0"} lappend specs {-choosedir "" "" "0"} array set data {-confirmoverwrite 0} } else { lappend specs [list -confirmoverwrite "" "" [expr {$type eq "save"}]] array set data {-multiple 0 -choosedir 0} } # 2: default values depending on the type of the dialog # if {![info exists data(selectPath)]} { # first time the dialog has been popped up set data(selectPath) [file nativename [pwd]] set data(selectFile) "" } # 3: parse the arguments # tclParseConfigSpec ::ttk::dialog::file::$dataName $specs "" $argList # Make sure the boolean arguments are either 0 or 1 foreach n {-sepfolders -foldersfirst -reverse -details -hidden \ -multiple -choosedir -confirmoverwrite} { if {[info exists data($n)]} { if {[catch {expr {!!$data($n)}} data($n)]} { error "option requires boolean value: \"$n\"" } } } if {$data(-title) == ""} { if {$type ne "open"} { set data(-title) [mc "Save As"] } elseif {$data(-choosedir)} { set data(-title) [mc "Choose Directory"] } else { set data(-title) [mc "Open"] } } # 4: set the default directory and selection according to the -initial # settings # # Ensure that initialdir is an absolute path name. if {$data(-initialdir) ne ""} { set dir [file normalize [file join [pwd] $data(-initialdir)]] set path $dir while {[file exists $path] && [file type $path] eq "link"} { set path [file normalize [JoinFile \ [file dirname $path] [file link $path]]] } if {[file isdirectory $path]} { set data(selectPath) [file nativename $dir] } else { set data(selectPath) [file nativename [pwd]] } } set data(selectFile) $data(-initialfile) # 5. Parse the -filetypes option # set data(-filetypes) [::tk::FDGetFileTypes $data(-filetypes)] if {![winfo exists $data(-parent)]} { error "bad window path name \"$data(-parent)\"" } set opt(-sepfolders) $data(-sepfolders) set opt(-foldersfirst) $data(-foldersfirst) set opt(-sort) $data(-sort) set opt(-reverse) $data(-reverse) set opt(-details) $data(-details) set opt(-hidden) $data(-hidden) } ### ttk::chooseDirectory proc ::ttk::dialog::file::treeCreate {w} { destroy $w toplevel $w -class TkChooseDir wm iconname $w Dialog set dataName [winfo name $w] upvar ::ttk::dialog::file::$dataName data if {[winfo viewable [winfo toplevel $data(-parent)]] } { wm transient $w $data(-parent) } set f1 [ttk::frame $w.f1] set data(dirMenuBtn) [ttk::combobox $f1.dir \ -textvariable ::ttk::dialog::file::${dataName}(selectPath)] pack $f1.dir -fill x -expand 1 -padx 8 -pady 5 set f2 [ttk::frame $w.f2] ttk::frame $f2.f ttk::label $f2.f.bg -relief sunken array set fontinfo [font actual [[label $f2.f.dummy] cget -font]] set font [maxfont $fontinfo(-family) 16] destroy $f2.f.dummy ttk::label $f2.f.title -text [mc Folder] -anchor w -style Toolbutton set data(text) [text $f2.f.text -width 48 -height 16 -font $font \ -tabs 20 -wrap none -highlightthickness 0 -bd 0 -cursor "" \ -spacing1 1 -spacing3 1 -exportselection 0 -background white \ -yscrollcommand [list $f2.f.scroll set]] $data(text) mark set subdir end $data(text) mark gravity subdir left ttk::scrollbar $f2.f.scroll -command [list $data(text) yview] grid $f2.f.title $f2.f.scroll -sticky ns grid $f2.f.text ^ -sticky news -padx {2 0} -pady {0 2} grid $f2.f.title -padx {2 0} -pady {2 1} -sticky ew grid $f2.f.bg -column 0 -row 0 -columnspan 2 -rowspan 2 -sticky news grid columnconfigure $f2.f 0 -weight 1 grid rowconfigure $f2.f 1 -weight 1 pack $f2.f -fill both -expand 1 -padx 8 -pady 4 set f3 [ttk::frame $w.f3] ttk::button $f3.new -text [mc "New Folder"]... \ -command [list ::ttk::dialog::file::NewDirCmd $w] ttk::button $f3.ok -text [mc OK] -default active \ -command [list ::ttk::dialog::file::TreeDone $w] ttk::button $f3.cancel -text [mc Cancel] \ -command [list ::ttk::dialog::file::Cancel $w] grid x $f3.new $f3.ok $f3.cancel -sticky ew -padx {4 8} -pady 8 # grid columnconfigure $f3 {2 3} -uniform buttons -minsize 80 grid columnconfigure $f3 0 -weight 1 pack $f1 -side top -fill x pack $f3 -side bottom -fill x pack $f2 -side top -fill both -expand 1 $data(text) image create end -padx 1 -image ::ttk::dialog::image::folder $data(text) insert end " /" name $data(text) configure -state disabled # Get rid of the default Text bindings bindtags $data(text) [list $data(text) DirDialog $w all] bind $data(dirMenuBtn) \ [list ::ttk::dialog::file::TreeReturn $w] wm protocol $w WM_DELETE_WINDOW [list $f3.cancel invoke] } proc ::ttk::dialog::file::treeUpdate {w dir} { upvar ::ttk::dialog::file::[winfo name $w](text) txt set dir [file normalize [file join [pwd] $dir]] set list [lassign [file split $dir] parent] lappend list . $txt configure -state normal $txt delete 1.end end $txt mark set subdir end foreach d $list { # File split may produce terms starting with "./", strip those if {[string match {./*} $d]} {set d [string range $d 2 end]} treeOpen $w $parent subdir $d set parent [JoinFile $parent $d] } $txt yview subdir-5l TreeSelect $w subdir } proc ::ttk::dialog::file::treeOpen {w path {index insert} {subdir .}} { upvar ::ttk::dialog::file::[winfo name $w](text) txt set level [llength [file split $path]] set tabs [string repeat "\t" [expr {$level - 1}]] set img [lindex [$txt dump -image \ "$index linestart" "$index lineend"] 1] if {$img ne "" && [$txt image cget $img -name] eq "diropen"} { $txt image configure $img -image ::ttk::dialog::image::dirclose } else { set img "" } # Do we already have this data available, but perhaps elided? if {[llength [$txt tag ranges $path]]} { # Also show all subdirectories that were expanded before set list [lsearch -all -inline [$txt tag names] $path/*] foreach n [lappend list $path] { $txt tag configure $n -elide 0 } return } # This may take a little longer so give some indication to the user $w configure -cursor watch update if {[catch {glob -nocomplain -tails -dir $path -type d * .*} list]} { if {$img ne ""} { $txt image configure $img -image ::ttk::dialog::image::diropen } $w configure -cursor "" tk_messageBox -icon warning -type ok -parent $w -message \ [mc {Cannot change to the directory "%s". Permission denied.} \ $path] return } $txt configure -state normal $txt mark set insert $index foreach d [lsort -dictionary $list] { # Skip . and .. if {$d eq "." || $d eq ".."} continue # Specify no tags so the tags at the current position are used $txt insert insert "\n" # Insert the line with the appropriate tags $txt insert insert $tabs [list $path] file stat [JoinFile $path $d] stat if {$stat(nlink) != 2} { set img [$txt image create insert -name diropen \ -image ::ttk::dialog::image::diropen -padx 3] $txt tag add $path $img } $txt insert insert "\t" [list $path] set img [$txt image create insert -padx 1 \ -image ::ttk::dialog::image::folder] $txt tag add $path $img $txt insert insert " $d" [list name $path] # Remove tags from the lineend foreach n [$txt tag names insert] { $txt tag remove $n insert } # Add the correct tag to the lineend $txt tag add $path insert # Put a mark if this is the specified subdirectory if {$d eq $subdir} { $txt mark set subdir insert } } # Directory is considered empty if it only contains . and .. if {[llength $list] <= 2 && $img ne ""} { if {[llength [lsearch -all -not -regexp $list {^\.{1,2}$}]] == 0} { $txt delete $img } } $txt configure -state disabled $w configure -cursor "" } proc ::ttk::dialog::file::treeClose {w path} { upvar ::ttk::dialog::file::[winfo name $w](text) txt set img root set pathindex [lindex [$txt tag ranges $path] 0] lassign [$txt dump -image "$pathindex-1l" $pathindex] - img pos if {[string match diropen* $img]} { $txt image configure $img -image ::ttk::dialog::image::diropen } set list [lsearch -all -inline [$txt tag names] $path/*] lappend list $path $txt configure -state normal foreach n $list { # Eliding sounds promising, but doesn't work correctly # $txt tag configure $n -elide 1 catch {eval [list $txt delete] [$txt tag ranges $n]} $txt tag delete $n } $txt configure -state disabled } proc ::ttk::dialog::file::TreeDone {w} { upvar ::ttk::dialog::file::[winfo name $w] data if {[file exists $data(selectPath)]} { if {![file isdirectory $data(selectPath)]} { return } } elseif {[string is true $data(-mustexist)]} { return } variable selectFilePath [file normalize $data(selectPath)] } proc ::ttk::dialog::file::cdTree {w dir {subdir .}} { upvar ::ttk::dialog::file::[winfo name $w](text) txt set parent [file dirname $dir] set ranges [$txt tag ranges $parent] if {[llength $ranges]} { set pat [format {^\t* %s$} [file tail $dir]] foreach {index1 index2} $ranges { set idx [$txt search -regexp $pat $index1 $index2] if {$idx ne ""} { $txt mark set subdir "$idx lineend" break } } } else { cdTree $w $parent [file tail $dir] } ::ttk::dialog::file::treeOpen $w $dir subdir $subdir } proc ::ttk::dialog::file::TreeSelect {w index} { upvar ::ttk::dialog::file::[winfo name [winfo toplevel $w]] data focus $data(text) set idx [$data(text) index "$index lineend"] set range [$data(text) tag prevrange name $idx "$idx linestart"] if {[llength $range]} { lassign $range index1 index2 $data(text) tag remove sel 1.0 end $data(text) tag add sel $index1-1c $index2+1c set path [lsearch -inline [$data(text) tag names $index1] */*] set dir [$data(text) get $index1+1c $index2] set data(selectPath) [file nativename [JoinFile $path $dir]] } } proc ::ttk::dialog::file::TreeRelease1 {w} { set w [winfo toplevel $w] upvar ::ttk::dialog::file::[winfo name $w](text) txt if {[$w cget -cursor] ne ""} { $w configure -cursor "" return } set dir [string range [$txt get sel.first sel.last] 1 end-1] set path [lsearch -inline [$txt tag names sel.first] */*] if {![catch {$txt image cget sel.first-2c -image} name]} { set index [$txt index sel.last-1c] $txt mark set selmark sel.first switch -glob $name { *::diropen { treeOpen $w [JoinFile $path $dir] $index } *::dirclose { treeClose $w [JoinFile $path $dir] } } $txt tag remove sel 1.0 end $txt tag add sel selmark "selmark lineend+1c" } } proc ::ttk::dialog::file::TreeMotion1 {w} { [winfo toplevel $w] configure -cursor "X_cursor #C00 #000" } proc ::ttk::dialog::file::TreeReturn {w} { upvar ::ttk::dialog::file::[winfo name $w] data if {[file isdirectory $data(selectPath)]} { ::ttk::dialog::file::cdTree $w [file normalize $data(selectPath)] $data(text) yview subdir-5l TreeSelect $w subdir } return -code break } proc ttk::chooseDirectory {args} { set dataName __ttk_dirdialog upvar ::ttk::dialog::file::$dataName data set specs { {-initialdir "" "" .} {-mustexist "" "" 0} {-parent "" "" .} {-title "" "" ""} } tclParseConfigSpec ::ttk::dialog::file::$dataName $specs "" $args if {$data(-title) == ""} { set data(-title) "[::tk::mc "Choose Directory"]" } if {![winfo exists $data(-parent)]} { error "bad window path name \"$data(-parent)\"" } if {$data(-parent) eq "."} { set w .$dataName } else { set w $data(-parent).$dataName } if {![winfo exists $w]} { ::ttk::dialog::file::treeCreate $w } ::tk::PlaceWindow $w widget $data(-parent) wm title $w $data(-title) ::tk::SetFocusGrab $w $data(text) ::ttk::dialog::file::treeUpdate $w $data(-initialdir) # Make sure the application doesn't hang if the toplevel is destroyed bind $w {set ::ttk::dialog::file::selectFilePath ""} tkwait variable ::ttk::dialog::file::selectFilePath catch {::tk::RestoreFocusGrab $w $data(text) withdraw} return $::ttk::dialog::file::selectFilePath } # Alternative procedure names interp alias {} ttk_getOpenFile {} ::ttk::dialog::file::tkFDialog open interp alias {} ttk_getSaveFile {} ::ttk::dialog::file::tkFDialog save interp alias {} ttk_getAppendFile {} ::ttk::dialog::file::tkFDialog append # Need to have a lassign command if {![llength [info commands lassign]]} { proc lassign {list args} { uplevel 1 [list foreach $args [linsert $list end {}] break] lrange $list [llength $args] end } } ttk::style configure Slim.TButton -padding 0 option add *TkFDialog*selectBackground #0a5f89 startupFile option add *TkFDialog*inactiveSelectBackground #0a5f89 startupFile option add *TkFDialog*selectForeground #ffffff startupFile option add *TkFDialog*Toolbar*takeFocus 0 option add *TkFDialog*Text.background white startupFile option add *TkFDialog*Menu.activeBackground #0a5f89 startupFile option add *TkFDialog*Menu.activeForeground #ffffff startupFile option add *TkFDialog*Menu.activeBorderWidth 1 startupFile option add *TkFDialog*Menu.borderWidth 1 startupFile option add *TkFDialog*Menu.relief solid startupFile option add *TkFDialog*Menu.Image ::ttk::dialog::image::blank16 startupFile option add *TkFDialog*Menu*selectImage ::ttk::dialog::image::tick16 startupFile # Bindings bind FileDialogDir {::ttk::dialog::file::DirButton1 %W %x %y} bind FileDialogDir {::ttk::dialog::file::DirRelease1 %W %x %y} bind FileDialogDir {::ttk::dialog::file::DirMotion1 %W %x %y} bind FileDialogDir {;} bind FileDialogDir <4> {%W yview scroll -5 units} bind FileDialogDir <5> {%W yview scroll 5 units} bind FileDialogDir \ {%W yview scroll [expr {(%D >= 0 ? -%D : 2-%D)/3}] pixels} bind FileDialogFile {::ttk::dialog::file::FileButton1 %W %x %y} bind FileDialogFile {::ttk::dialog::file::FileRelease1 %W %x %y} bind FileDialogFile {::ttk::dialog::file::FileShift1 %W %x %y} bind FileDialogFile {;} bind FileDialogFile {;} bind FileDialogFile {::ttk::dialog::file::FileControl1 %W %x %y} bind FileDialogFile {;} bind FileDialogFile {;} bind FileDialogFile {::ttk::dialog::file::FileMotion1 %W %x %y} bind FileDialogFile {;} bind FileDialogFile {;} bind FileDialogFile {::ttk::dialog::file::Done [winfo toplevel %W]} bind FileDialogFile <4> \ {::ttk::dialog::file::xview [winfo toplevel %W] scroll -1 units} bind FileDialogFile <5> \ {::ttk::dialog::file::xview [winfo toplevel %W] scroll 1 units} bind FileDialogFile {::ttk::dialog::file::xview \ [winfo toplevel %W] scroll [expr {%D >= 0 ? -1 : 1}] units} bind FileDialogList {::ttk::dialog::file::FileButton1 %W %x %y} bind FileDialogList {::ttk::dialog::file::FileRelease1 %W %x %y} bind FileDialogList {::ttk::dialog::file::FileShift1 %W %x %y} bind FileDialogList {;} bind FileDialogList {;} bind FileDialogList {::ttk::dialog::file::FileControl1 %W %x %y} bind FileDialogList {;} bind FileDialogList {;} bind FileDialogList {::ttk::dialog::file::FileMotion1 %W %x %y} bind FileDialogList {::ttk::dialog::file::Done [winfo toplevel %W]} bind FileDialogList <4> {%W yview scroll -5 units} bind FileDialogList <5> {%W yview scroll 5 units} bind FileDialogList \ {%W yview scroll [expr {(%D >= 0 ? -%D : 2-%D)/3}] pixels} bind DirDialog <4> {%W yview scroll -5 units} bind DirDialog <5> {%W yview scroll 5 units} bind DirDialog {::ttk::dialog::file::TreeSelect %W @%x,%y} bind DirDialog {::ttk::dialog::file::TreeRelease1 %W} bind DirDialog {::ttk::dialog::file::TreeMotion1 %W} bind DirDialog \ {%W yview scroll [expr {(%D >= 0 ? -%D : 2-%D)/3}] pixels} fsdialog/fsdlg-gif.tcl000064400000000000000000000401121234257562200145760ustar00nobodynobodynamespace eval ::ttk::dialog::image {} # Images for the configuration menu image create photo ::ttk::dialog::image::blank16 -height 16 -width 16 image create photo ::ttk::dialog::image::tick16 -data { R0lGODlhEAAQAMIAAExOTFRSVPz+/AQCBP///////////////yH5BAEKAAQALAAAAAAQABAA AAM4CAHcvkEAQqu18uqat+4eFoTEwE3eYFLCWK2lelqyChMtbd84+sqX3IXH8pFwrmNPyRI4 n9CoIAEAOw==} image create photo ::ttk::dialog::image::radio16 -data { R0lGODlhEAAQAMIAAJyZi////83OxQAAAP///////////////yH5BAEKAAEALAAAAAAQABAA AAMtGLrc/jCAOaNsAGYn3A5DuHTMFp4KuZjnkGJK6waq8qEvzGlNzQlAn2VILC4SADs=} # Images for ttk::getOpenFile, ttk::getSaveFile, ttk::getAppendFile image create photo ::ttk::dialog::image::next -data { R0lGODlhFgAWAMYAADt1BDpzBFiJKb7ZpGaVOTx2A8HcqbfVm3ShSjt0BDp1BDx3Bb/apYe7 V7DSkIOtWzt0A8Dbpr/apL7ao7zZoXu0RXy0R6bMgo23Zz12CbzZoH+2Sn61SX21R3qzRHiy QnaxPnOvOnCuNpjFb5e/cUV8ELnXnHiyQXaxP3WwPXCtNm2sMmqqLWaoKIm8WJ3FeEuBGLXV l2+tNGGlIWanJ2urLWutLmqtK2irJ2SpIl+lHJ/GeFaKIjt1A6jNhU+aB06aBk+cBlKhCFWl CViqDF6uEmCvFWGtFl2qE3e2Op3HdVWLIjt2BKPLflSjCFipClyvDF6zDWC2Dl+0DYTER5zK cEqDFjt3A1eoClywDGG3DmW9EGfBEWnCE5XTWZjJZ0R9D6TLfqbPf6nUgazYgq/cg2nDEXPM GqPfaY7DWj53CTlzBD13Ba7bg3HGH6fecn+0SqbWdmufOjhwBKTPelqNKTNmAk6DHi9dAzdu A////////////////////////yH5BAEKAH8ALAAAAAAWABYAAAfGgH+Cg4SFhoeIiYgAio0B Ao2JAQMEBZGGAQYHCAmNCgGgoAsMDQ4PEIoBEasREhMUFRYXGBmSGhsbHB0eHyAhIiMkJYgB JifHKCkhKissLS4vMIcBMTItMzM0NTY3ODk6Jzs9mD4/QEBBQkNERUZHSElKTJhN50FOT1BR UlJTVFVXptUDIgRLFi1buHTx8gUMsSZNwogZQ6aMmTNo0qhJtCYUKDZt3LyB0+mSoABk4siZ Y3JQADp17LR0eQfPzEF5burcKSgQADs=} image create photo ::ttk::dialog::image::nextbw -data { R0lGODlhFgAWAOcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0N DQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8f HyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDEx MTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkND Q0REREVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVV VVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdn Z2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5 eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouL i4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOTk5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2d nZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+v r7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8DAwMHB wcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT 09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl 5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf3 9/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///yH5BAEKAP8ALAAAAAAWABYAAAjUAP8JHEiwoMGD CBMivKKwYZU3DRNWWcaHYcSCVZwVS2SloZUqIEFiYQYK2KWOEpupbLZsmTJLl3CFwiJRWaZM mDBVoiQJkiNXqr4grHKMklFJkSA1WpTIUChYZQ5WIdbIkCBBhRItUoSoECBKsSwSrJJrjhw5 dPDsAUTIUCFBlcIarGLrLB09fwgdSpQI0ShZNOfWlYPHDyFFjyRRkvVKqFRbkHP1CkaMUidg p7JIDAkyyzBNwTChvPivSrBehKaQHlgFl5wlq1mfKRJ7YJTauHMLDAgAOw==} image create photo ::ttk::dialog::image::previous -data { R0lGODlhFgAWAOcAADp0BFSIJTx1Bzp0A2KSNLrWnz93Czt1BHGeRbXUmL/apTx0BH6qVa/R joS5UrzZoEF7CzpzBD13CIu2Y6TLf3iyQniyQbnXnbzZob7ao7/apMDbpj92CkR7D5S8bJbD a22sMW+tNHKvOXaxPnqzRH21R361SX+2SrvYn0mAFprDdIe6VWOmI2aoKGqqLW2sMnCtNnOv OnWwPXaxP7jWmj52CTt1A1SIIJvEdHWxPlqhF16jHGGlIWSnJWmrK2uvLGqwKGevI2uvKXKy NrTVlT11CDt3A1SKIJrEcVOdDVWeEFSeD1ekD1enC1mrCluuC1ywDFqqC6rThEmCFZXAbE6a BlKgB1enCV+0DWK4DmS7D2O7D1+zDajUfkJ5DYy5YYa7U1elDFqsC2jBEWvGEmrFEmfBEWO6 D6rXfzx1CDx2B4GwU5TGY2GxFGC2Dq7dgLLhhLXmhrTlha/dg63Zgjx2CDpyA3WmRZ3Ob2m5 HK3bgEF9CTtzBDduA2aYNqHQdazYgTNlAleLJaPOeS1ZA0yBGzx0Bv////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// /////////////////////////////////yH5BAEKAP8ALAAAAAAWABYAAAjgAP8JHEiwoMGD CBMq/AdgYcIAAhwaHECggAGJBA8gSKDgIsZ/Cxg0cPAAQoSTJw8klDCBQgULFzBk0LChJgeE HTx8ABFCxIgKJEqYOIHipsEUKlawaOHiBYwYMmZYsECjhkEbOHLo2MGjh48fQIIEETKESBGD RpDASKJkCZMmTp5AgfIkipSzBgFQIVHFypUnWLJo2ZKFSxe8Br18ARNGDBYtY8iUMXMGTZqE atawaePmDZw4cuDMoVNHoZ07ePLo2YPyJJ+Fffz8AVT6o8BAggbVtv2PUCFDvAn2CU7cdkAA Ow==} image create photo ::ttk::dialog::image::previousbw -data { R0lGODlhFgAWAOcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0N DQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8f HyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDEx MTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkND Q0REREVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVV VVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdn Z2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5 eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouL i4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOTk5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2d nZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+v r7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8DAwMHB wcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT 09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl 5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf3 9/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///yH5BAEKAP8ALAAAAAAWABYAAAjXAP8JHEiwoMGD CBMq/GdlYcI2VxwatJLnmBaJBK8YIsbsIkaGk351UtalikmTERFm+WSLEqVjypYta0YzC0Iv p1YtavRIEqVKmDBlSmbT4BhXnwYZSrQTUiSflIwVzehKEp8/ggglYsRIkaJFkYhhMYjFVSM7 ePDw6QNoECFCgwD5GjsxVSU5d/oMQrSz0aJDvega5BLqE59AiBpJsmRJUqNfKQ9iucTqUCJi yJgtQ1ZMmOCDVBjRejTMy8mTC6P4uRXsM8YlcG65xiikTOSPA6Pg3s1bYEAAOw==} image create photo ::ttk::dialog::image::up -data { R0lGODlhFgAWAOcAADx2Azx2BFWLIlWNIjx1A0uBGJzFdZrFckuDF0V8EJzDdnKvOm+tNZbB bUR7Dz52CZa/cIW5UlqhGFaeEXmzQ467ZD14CIy2ZZTCaWOmI16jHFmgFlSdDoO4UIKyVTt1 Azp2BIKsWaLKfWysMWaoKGGlIVyiGlSeD0+bCI2+X3anSDt2BHShSa3RjXexQG+tNGusLWir J2GoHFOhCVGgB1ahDpXDamiaOWSUN7XVmIS4UXm1QXe1O3O0NG6zLFyqEVeoClenCVamCV6o F5zIcluOKViKKLvXoL/bpb7bo73coH27QXm8OmWzGVywDFyvDKrVganTgKjRgKDLeU+FHzt1 BDpzBD14BcDeooLBRXK7KmC2DmG4DmK4DmG3DqzZgj55BcLhpYfHSma6FGW9EGe/EGfAEWa/ EK/cg8TjpnzDOGnDEWvHEmzIE2vGErDfhMbkqXTBKW/MFHHQFW3KE7HghGy9Hma+EGrEEm3J E27LFGzHE7HfhMXjqa/aha7bg7Deg6/dg/////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// /////////////////////////////////yH5BAEKAP8ALAAAAAAWABYAAAjWAP8JHEiwoMGD CBMqXMiw4UEAARwWLGDgAAGJAhMoWMCggQOJDyBEkDCBQgULDQFcwJBBwwYOHTx8WAgihIgR JEqYOIEihYoVCQGwaOHiBYwYMmbQqGHjxsWDOHLo2MGjh48fQIIIGUKkyEEjR5AkUbKESRMn Tp5AiSJlCpWCVazIvYIli5YtXLp4+QJGrhUQCK2EETOGTBkzZ9BYYWgljRoya9i0cfNm8UIr cOKccSNnDp06lhVitnMHTx49e/iETmilj58/gPjU4RNodWC/uOVi3L07IAA7} image create photo ::ttk::dialog::image::upbw -data { R0lGODlhFgAWAOcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0N DQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8f HyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDEx MTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkND Q0REREVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVV VVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdn Z2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5 eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouL i4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOTk5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2d nZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+v r7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8DAwMHB wcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT 09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl 5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf3 9/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///yH5BAEKAP8ALAAAAAAWABYAAAjPAP8JHEiwoMGD CBMqXMiw4cErWBwWLPPK1RWJAr+4etRIlReJWVR54oOn0qgsDa+AUjXoz547nDJdVHjFUq1F hgT5wUOHVKOZDxP5mtRIEaJBeO7oWQUIaME9xDpZoiTpUSA/ffgEijXnIBxkzMJqyqSIkFlf vXbVSlPwSpW3WZyBqpRo0SJFwbS8reKUYJVophw9iiQpErEqDKtI8/SI0iVMlowhXliFWqZI ljZ5ynRsssLKkyBVyqTpUufE04YNM3asdTHPCffK3ouxdu2AADs=} image create photo ::ttk::dialog::image::gohome -data { R0lGODlhFgAWAMYAAKQAAPR1deU5OeInJ+xGRvFMTPBRUfJVVeAmJvNbW/JeXntMSohaWN4m JvNkZJldW4SFgpubmsCKitwmJvRsbPRmZp11c4+Qjbi5uMLCwbq6ucShodwlJfNjY6ONi5+g nr+/vt7e3d3d3dfX18m1tZwICKefnaOjotra2urq6unp6efn59zQ0IQiIaGgnqKjodjY2Obm 5uTk5OPj4+Le3tvc21VXU3d4enZ5fXV1dXV2dvPz8+7u7n6Ae3+BfICCfeXl5XZ5fHmZw3eY wnV4fPLy8u3t7YSGgYWHguLi4nV4e1+Gt0p2rnJ1evHx8ezs7IaIg4qIZYmIcODg4HF4gTRl pG52gfDw8Ovr64eJhIiJfvn5+bGztri8wbq7vLm9waSkpO/v74iKhd7e3qKioqOjo2VnY5eZ lJiZlpmalpmal/j4+P////////////////////////////////////////////////////// /////////////////////////yH5BAEKAH8ALAAAAAAWABYAAAf+gH+Cg4QAAISIiYUBAYeK j38AjIyOkIsCjAONloOSBAWZmpWPkgYHjZIIopCSCQqNCwySDauJkg4OjQ8QERKSE7WdARQV jRYXGBkaG5IcwZEBHY0eHyAhISIjJCUBHJvCjSYnKCnlKiorLNzfgpItLi8wMSv0MTIyMzTc o5E1Nv//0N3AkQOHjh38/tjgYaOHjx8/YgAJIiTHECJFbCSyYcTGkY9IZCRRsiQHkyZONCKy 8cQGFChRpCSZQqVKjipWrqgkZAOLjSxZtPiYsoVLFy9fwITZOchGChtioooZs4VMmatlRDAV ZOOKmTNo0qjZwaOs2TVbFQJcyxYgp7cEcDkFAgA7} image create photo ::ttk::dialog::image::gohomebw -data { R0lGODlhFgAWAOcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0N DQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8f HyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDEx MTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkND Q0REREVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVV VVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdn Z2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5 eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouL i4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOTk5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2d nZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+v r7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8DAwMHB wcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT 09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl 5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf3 9/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///yH5BAEKAP8ALAAAAAAWABYAAAj+AP8JHEgwRgyC CBMW3LTpoMKH/2IwZOgQ4kI2DL80tDhQ4p0+GTVWfCgREKGGEruIhCgRkaKGWc6kXJlQoiNH Dd0Q0qRJIheaHTdRgtQQ0CNcwXKtkrgFaMRNOGNM+uSrm9Vru2hs2rIxaMNQorSpG5su3blp WrsKlPgDlChs5s7JNUeO3LhvWkdG3Falb1+zd/DUETxP778q7qr4+QMIkLlyeCjVkXRHXpWE VdpVIcS5EDlxd/7UcUMn3mWEVdhVMWSIUCFx4Ox0qdOFDrzTBKusq3Ko9x9w+WTt0sWL1Dvc A6uoq4KoOSJv+USNmj6qG3KBVeCVuYQpU6Z57sIPi8d3/bDf8+j9clzPnmNAADs=} image create photo ::ttk::dialog::image::reload -data { R0lGODlhFgAWAOcAADtqqDtrqDdnpTVmpThopjpqpzdopjpqqHeaxaC726zG4q7I46jC3p25 2X6hyk16sDZnpTdnpjRlpFqDt7fN5bDI4qC82q3G4bfN5rrP5rvR57vQ57vR6K/H4W+VwThp pnOYxUZ0rkVyrJ+52Ux4sDlppjdmpU56sYWmzbbN5bXM5abC4LHK5KO/3X+iy8PW6kNxrDtq p1N+sz5tq0BvqzZnpDpppzprqH+kzLHJ45a325G02bTM5cja7EBuqjtrpzVlpE56tGKNw0x4 r6fA3a/J43Sfz83d7j1sqD9uq2yWyjpqqT5tqbTJ4pS22nKfz9Xi8DdopabA3cna7M3d7dTi 8Nzn8zZnpjRlpTlppzhopzZmpTVlpdrl8eDp8+Dp9OHq9Nnk8FV+szVmpOLr9aC+3qG+3dvm 8n+gx0FwrOPs9Zu63L3S6Nzm8lB8smWOxEd2sDxsqDRmpOTs9crb7K7I4sHV6oKjyzdopz5u qz1sqUd0ruXt9sDS5tjj8dHf7qrG4sDU6bjN5YSkzGqQv1B7sj1rqEBuqVeBtZOy1sXV6Dlo pjtppoelysjY6bDJ5LPK5KrE4Zq42j9vqURxqjxpo2qOvJSx07LJ4rbN5qK+3XKXwy9ZjzNl pDFbkTZlojZno0FuqDdnpDZmpDRfl/////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// /////////////////////////////////yH5BAEKAP8ALAAAAAAWABYAAAj+AP8JHEiwoMGD CBMWBBBAwAACBQwYHGCwwAEECRQsYNDAwQMIAyNIKFhgAoUKFi5gyKBhA4cOHj5EABGioIgR JCKUMAHhBIoUKlawaOHiBQyCMWTEmEGjxkAbN3Dk0LGDRw8fBH8ACSLEhsEPQ4gUMXIECUEb SZT8W3KQSRMnT6B4HShAYRQpU6hUsXJFIUEsEm5k0WLgChaCA7YoXszF78ABXbx8ARNGjMIx BIGQKWPmDBqJBW8ITAMAsZo1bNq4yWLQwBs4EuIQlDOHTh07Vu7gASlwQB49MPYUlMOnj58/ gAIJGkSokKFDiFwkIlAQgqJFjBo5osBDxSMWkBYmRJI0yeAYSgMrWbqEiU2mHJo2leBksJNB T59AhRI1ipTj/wD6FRAAOw==} image create photo ::ttk::dialog::image::folder_new -data { R0lGODlhEAAQAMYAAG1va2dpZc7OzsrEuW1pXvyxPsDAv5aXlZuYkOOrVb6cZODCkfvSkNyy bMuYSfywPsnJyaamptm5hv3nw/765/740f3urPzJZvuyQGF6mjRlpDtnoFJwlNvFnv766P77 5P32u/3xkfzkddSsW2R4jMbY677S6MjMy+64Y/zTk/740/32vP3zo/zue/zoYPq+SNCgVK7H 44yx2I+w05yxwebFif3vrv3xkvzufPzrYfzfUe2+YV9hXdCyfvzLavzld/zoYfzgUfvDRNu6 gVVXU5OwzeGwYs2yf+a7Zvq9SeW6YNCxeem1ZT5onpWwy5Gw0J2xwOOxX7PF2ERrm4+x0p6x vomu1qbC4Dlnoq3H44uw14qv14iu1oWr1YCo03qk0nOgz26dzpi53Fh2m5u73XCeznCdz26c zm2czmybzmubzWqazmmZzWiZzZS226mrqYmv12uazWqazWiYzWaYzGWYzWWXzGSWzGOVzJq6 3lNxlkVdeT5giT9ghv///////yH5BAEKAH8ALAAAAAAQABAAAAfNgH8Ag4MBAX+IiYgAAo2O AwSIBYoABgeXlwgJCgsMDQ4PghARpKUSExQVFhcYfwEGGRqyGxwdHh8gISIjJAEQGiUmJico KSorLC0uLzCvGjEyMjM0NTY3ODk6Oxw8v9DRMj0+P0BBQkMaRAbP4EVGR0hJSktMTUTe4E5P MlBRNDJSpqhjBy4alSozrFxJBwFLFi0ytGzh0sXLFzBhxKQzMIZMGTNhzqBJo2YNmzZu0r2B oyaOHDZz6NSxcwdPHj17+MjayZNnH0VAgyIKBAA7} image create photo ::ttk::dialog::image::configure -data { R0lGODlhFgAWAMYAAH9/f+rp6Pn5+NjY1/j39vPy8YKXsjRlpOzq6P///050pHx8fLu7u+3r 6szMzK+vr2WErOjn5Orq6q2trePj4vr6+Xl4dNzc3JmZmejn5vLx7+3r6evp5/r6+oeHh8/N yvj49/n59/n49/7+/p6enrW1tfb29Z+fnvj4+Ofm5LvByEVxqfT09J2wyt/f31l9q6enpiBK h1R8rqSttvv7+3WQrqS60JCmvqexvcHBwePi4dPf6qKuvJ22zmN7lYScttfi7Y2YpZ240mB3 kZmtw9/n8IGTqVhthFtxiYaGhqG0yO7z9mB2j+Tj4V9fXpGmvvD095eltgAAALDG2+3y9oGK lWyFocDR4v////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// /////////////////////////yH5BAEKAH8ALAAAAAAWABYAAAfygH+CggAAg4eIiX8AAQID hoqRhAQFj5EGB5EACAKQiAcJCpl/C4WCDA2diaAODxCEERIAExQIFRarFw+jfxgZGhsIHMOq gwcdB7yCHh8gAiECwyKQByPKhySFACUCwiYnByjXkgACKSorLOOSiy0HLi8w7Icx9QcsMjM0 npIxNTY3YhzAkUPHCH6J/O3g0cNHDAAjhh2MFOMHkCA+hAyJsWiEsImIYhApYuSIkBpIOHaU mISekiVGmJxMeQhiEycgYzyBEkUmSpWCpAgdKvRPjClUqswEGpToUKNWhFx5QjORUymDYlix 4lAS0ZD15hUVFAgAOw==} image create photo ::ttk::dialog::image::folder -data { R0lGODlhEAAQAKUAAG1va2dpZc7OzsbGxWNlYcDAv5aXlVVXU8nJyaampqenp6ioqGF6mjRl pEZtnMbY677S6K7H44yx2F9hXYmu1qbC4Dlnoq3H44uw14qv14iu1oWr1YCo03qk0nOgz26d zpi53Fh2m5u73XCeznCdz26czm2czmybzmubzWqazmmZzWiZzZS226mrqYmv12uazWqazWiY zWaYzGWYzWWXzGSWzGOVzJq63lNxlkVdeT5giT9ghv///////////////yH5BAEKAD8ALAAA AAAQABAAAAaGwB9gOAwEfsgkEiBoOgcEZRJQMFivhoNWu0QkvmCwYnFABgqMhnrNVjsCiMYD Qq/bH41zIyLp+/8RDRNxfH+GgQcFe4aHDQeEjICOioWRFBWOCBYXGBIYGRobHB0eHyCTISIj JB8lJicoKSorLI4tLigvMCoxMjM0NTY3ODk6bcdqO1LLy0EAOw==} image create photo ::ttk::dialog::image::file -data { R0lGODlhEAAQAIQAAJmZmYGBgf///+zs7Orq6uvr6+3t7fDw8MTExMXFxcbGxsfHx+7u7u3t 5e3t5u/v78jIyPHx8fLy8pWVlf////////////////////////////////////////////// /yH5BAEKAB8ALAAAAAAQABAAAAVuIBCMZDl+aCCsbLsGqTAQRGEPg3EI8KcSiERCQVQsdr3f DWcwMJCxwrBIPPKiBaahMXhefYIClcFweJOynJPxaEPBg+JiAam/VTmyO8L/qgxGdHV8En4C TWwPBwcREoVoLpE9EyaVARMomZqbmiEAOw==} # Images for ttk::chooseDirectory image create photo ::ttk::dialog::image::dirclose -data { R0lGODlhCQAJAKUAAFRWUlVXU1pcWP///1lbV2BiXt/i3Obo5O3u6/P08vj4911fW2NlYeHk 3+bp5Ovt6u/x7vDx72ZoZAAAAGNmYWpsZ93g2t7h2+Di3WdpZG1vatjb1dfb1Njb1Nfb09XZ 0WpsaHBybW1wa3N1cP////////////////////////////////////////////////////// /////////////////////////////////////////////////////////yH5BAEKAD8ALAAA AAAJAAkAAAY4QEBgSBwKBsjkgFAYGA6IhGKwYAwajgckMihIBpNweECpDCwXDOYyyGgGG07H 8xmAQsqkaMTv94MAOw==} image create photo ::ttk::dialog::image::diropen -data { R0lGODlhCQAJAKUAAFRWUlVXU1pcWP///1lbV2BiXt/i3Obo5AAAAPP08vj4911fW2NlYeHk 3+bp5O/x7vDx72ZoZGNmYWpsZ93g2t7h2+Di3WdpZG1vatjb1dfb1Nfb09XZ0WpsaHBybW1w a3N1cP////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////yH5BAEKAD8ALAAA AAAJAAkAAAY4QEBgSBwKBsjkgFAYGA6IhGKwYAwaDsQDMihEBohweCCZDCgVhKUyuGAGGQ1i wxl0PMrkB8Tv94MAOw==} fsdialog/fsdlg-png.tcl000064400000000000000000000405301234257562200146210ustar00nobodynobodynamespace eval ::ttk::dialog::image {} # Images for the configuration menu image create photo ::ttk::dialog::image::blank16 -height 16 -width 16 image create photo ::ttk::dialog::image::tick16 -data { R0lGODlhEAAQAMIAAExOTFRSVPz+/AQCBP///////////////yH5BAEKAAQALAAAAAAQABAA AAM4CAHcvkEAQqu18uqat+4eFoTEwE3eYFLCWK2lelqyChMtbd84+sqX3IXH8pFwrmNPyRI4 n9CoIAEAOw==} image create photo ::ttk::dialog::image::radio16 -data { R0lGODlhEAAQAMIAAJyZi////83OxQAAAP///////////////yH5BAEKAAEALAAAAAAQABAA AAMtGLrc/jCAOaNsAGYn3A5DuHTMFp4KuZjnkGJK6waq8qEvzGlNzQlAn2VILC4SADs=} # Images for ttk::getOpenFile, ttk::getSaveFile, ttk::getAppendFile image create photo ::ttk::dialog::image::next -data { iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAABl0 RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAM0SURBVDiNtZVbaB1VFIa/NbPn 5GLtRSkpKNYnb+2DhQo1idCCVgRBRa36IlKlFHxpSUkLgqJgUaQ+9EVQS2nMQ4haCiliSzSG JqYqmhY1NMZL1KSxxgTTk+TMZc9ePpw5dZI20Yd0wc/MhjXf2v/ai9miqlyN8K4K9f+CG5uD rvom8+CSg9WxeW3dLe83Nhd2LykYYMfDL1Svu3njq/fsNW9v2yb+koF9P+CRzdtrNq27/+nz a03nludl2WL5Jr9oaA7+wFF3WXUjoXO2+sz5Tho3bK1asWxVw8d9bf2b9sqW06/ryJXAkh+3 hj2B7t/ZMidB1aEoTh1dQ60IHnesaWBsfNQd62r521p77+cH4v7/BL+y411O/dSeQRXFkboU pw6nltRZUrXcVnc3Gnsc/eTwTCksPnXqDdsxx+X8SqmzRLZEZEvEaUhkQ5I0IklDYhsSpyGx LfHN7ye4mI7x5AM7r1lx7eq2hj1B06Jg6xJKSZHJ2TEuFIcZn/6NqdKfhLZIQkgqEU5inMQM XOhhaOILHrvvmdob6256ubHZHKxwzHxwMZxkeOJblHKLxAM/8PCd4Ac+BVPAMz7iBCcpaqLy UxBEblgQnLhoDjSo8jCFsjwjeL4FLM4pt66sZ03hdj48cWR2anriUG9tumtBcD78wMMPPEyV d6mAZwRPPNav2oo/u5y2jsOz01Mz+04fTN8B4KV5YBEJ6pvKy8c37EMAz0gZbgTfCCfH3qS2 poY7r3+I8ZEpPXa8ZWbyl+jZ79pdN1ALGBGJVDUxGdQABYXxt9r2r75s50bi3c+9WKj2l7Px ukc59/25tPOzkxPDvbp9tM8NATX8OwgqImllxz7g9x2w64GqTNWV9/om0+tS5a6VT9DT3RN/ ffbLnwc+sLsujvAXUAAckGaygFm0x/kISyEffdoRDw4O9pw54l5LI2YWSXcVcL6anykGBMoj 0n68Nf71h9FDZ99zrVlukinOvsur3ApVtSJCBiJnzQImTfSrH/tHWgaOuu6skMtBKvAEKAGh quqcf4WU6UHW24Dy1FQcSM6BznMZAZGq2kushS5TEfEpn7SfU8VN/rBSvQLkHy0nh7/z4dY0 AAAAAElFTkSuQmCC} image create photo ::ttk::dialog::image::nextbw -data { iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAAAXNSR0IArs4c6QAAAolJREFU OMvdlD1v00AYx/9+SRqCEzWpEVLTDhm6RHwIkBhhZGsZ4AsYsbAyIDFGjKB2SG9A4isgIUSZ +QBIIKS0SWO7ddzY9cvdPSw2ckzaBqkTlv7yDc/97v+83AH/5ccY+7S/v//gX/aoS8bdrdfr Hxhjz64bjG63W2s2m68YY2/39va0awMrioL19fUb7Xb7cbVa/TgYDIxL40u1HAO4vSAu6vV6 tZOTEzQaDfi+nx4fH/8ions7OzvDZcDU6/UWOiAiOI4DAGg0GoiiSI5GI4+I7m9vb3+7shQ5 wHEc2LYN27YxmUxg2zaklBBC4PT0FLquqxsbG21N074wxh4uBZZSQko5ty7L8zxwzrG5uXmz Uqm8Z4w9vxIshECSJIiiCHEcg3MOIQSIaE6+72M2m6HT6dRrtdpLxtibnKOXwZxzBEEwn5aq /pkMVVWhKMqcESLK+9W50LGU8i9oDixCiQiGYcAwDBwdHYVRFO0qivLoQseLoEVw7rzZbAIA hsNhyDl/4bruu4Xj1u/3K6ZpJt1ud+5SFGGTyQSqqmJ1dRVxHNNoNAriOH7q+/5nACmABEBs WVaqZFAdwIppmj8B3FpgPtna2qo6joNWq4WzszNh27YbhuGTMAy/58CCzvNSaAA0x3HuAFjJ VMvXpml+JSK0Wi24rpt4nvfD930rTVMHQBWABCAycQC6vuxbIYTAeDxOZrPZwXQ6fS2lDC4J lzm4eJqWKcl6QABweHiYBEGwO51OWRabFurKSxLF5ulZ+lUAlcJfX1tbY2maDrImUZZ6Dsnh KYBzAJFlWTT3CPX7fSWDreTQQgZKIQMqZRln08AXvm6lQ7TsAmkFIXNbbJawLIvK+38DjjNz OyQohckAAAAASUVORK5CYII=} image create photo ::ttk::dialog::image::previous -data { iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAABl0 RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAANNSURBVDiNtZVNaFxVGIaf75xz 782fUvsjGI00BY2IoILGmJks2igRqcH6H4pdSOmmK2sToS6iiBsRhIouTDetYnVRjSJCLbYb FSKdKiiIQZRY04ihNmnoZGbuufdzMXeSMaZjXPTAyzmLj+d7v5d77hFV5Uosc0WogPs/xb37 gwERDoRtvv/UqPpGtWt23DcS7r1+U+eHRmzfWgz9J1heEpMbdm/e3HH7q3sGD7RY49K1GGnY eWBYWnPixrtv3Zq/r/vRpsCFa2E2Buefl3bBneq/e0fnnV33Bt9Of07P5kGMo1JecIu5/cE/ 6sUwG7T69lr2q4JzI+Ed1jSdGNy285rrNt1gJ6Y+BZQkTXhh11vNRgyCILKc5OjY7vXgHbA6 uPc5t721ue3ow1ufbjORMjH1CUYs1gR8MXkYIw4jBmssgkFEyG95vHEUueFg37qrN7y8o39X y/nFKX4+ewZrApwJSDUlTROscRix+NRgMsdJGqMosho4P+IOtm/seGYg/1jL5PlvmJ77aRmo CYGkpLZCRTyJxqDgCInsVXiNWXmDlx0b2jGIkhD7EmVfJBaLotgQwGNQjBXEVL1pqmgJiumF f0WxlP5XzckT5/78/dBHJ9+9dNOGbrquvYeyL5KaEtgKLoKw2RK1WJpaLVFr9Rw0G1KpXB6s o5p+/Zrf99fsheFjxw8X14cd9HQ+RBAE2MDgQkMQmSp8CWpxkcFYQYGFc8u8pShEJACiiTf8 B7c9VZwZT947cn/v9ra+zielMPsxaio8uOVZnHPYwKCqpF5JfHVHYOYMLSISq2rsMqgDwkzR D+8n392Y55Hjfvyd3F3bNuZv2elOzx5DU3j90CvlcjGOVo4uMDd/FgOEIpLUHNtMrqbfvkz+ mP+VocSfPDh/cb4r1zMUaiLEZQ0KY/6B8kUWgHKmUrbXWK7hT2h+moXC28neQuH0yc9OjJcX i6VG5fUrrTlOMvk69xVAfAktjKUvVoZ+mbxUPLKHNI3EUMxcxlmdX6FqFKrqRSSLqtqxrpED 3PdHk7HK4MyP6zbL7iRmLhvd18FjYBEoqapK/Y2RKj0Aomx3dRNIJs1UP2UZKKsuvypyucdU RCzV79zWqTZNbaIESHQVyN9x5li6vCTOrQAAAABJRU5ErkJggg==} image create photo ::ttk::dialog::image::previousbw -data { iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAAAXNSR0IArs4c6QAAAqpJREFU OMvVlD9r20AYxp/3zpacWMTYaoQtshQKhk79AG2XDvXQuVC8lA5dsohAl06FfgGRrp0qhdKl dAwU2o/Q0bgkY4jBKecmVmTJ0l0XyZXjP2np1IMHIXj1u+ee9z0B/9uivyn2ff8hgJdE9KDb 7SbratlfQHcrlcpHAPcAlK6rv7bg4OCAKaXeGIbxdGdnZ7Pf76d/YmQt2PO8qlLqU71ev2tZ VoUx9u8Ze55nE9FXy7Ju1mq18vn5ORqNBvr9fiil3FjyyZCI7Dz70oo87xDR51arVdd1nQsh AABKKbTb7Q2iRT+9Xq+R8ZaDPc97xBh7b9u2QUQQQoCIQEQYDofIocWnaZrrM/Z9f69cLr+2 bXsziiIEQTCDFpUDiQhKKSilVoN939/Xdf1Zs9ncHI/HCMNwDpY3Tko5AxEROOfrwQBsIiKl FKSUkFL+7nAh06v5xnGMNE1XXxAiejyZTN6enp4GhmHAMIwFd4wxMMbAOQfnfPa+zPEM3O12 5dnZ2V4cxy9OTk4uNU1Do9EAY2wujmXKT5EkCVuYY9d1ywB0AFqtVruvadq77e1tQ9M0Go1G AIBWqzXXwGLjjo6O0vF43AzD8KfjOFPKoKUMOlO1Wr1VqVQ80zRvbG1tlYQQsCwLx8fHkZRS XzL+P0aj0e0kSQIAYd48nqmUKwiCQRzHTwDsJ0nSNk1TyxyWhRCdNE0vAESZJtkzZ5XWXv7p dHohhNgVQnwZDAbRsu6vWDJ3nGZKCu5jACSlVEKIV1LK72maPldK6QAuM5fTrC65opQDwOHh oex0OqrQTAlAFTZLoij6BqDHOW+FYfhBKRUWooiyDUIAE8dx1Ny0u65LAPLpKGd55yegTKqw ab5xBCByHCe59rfpui7P5pwXlJ9GFsCp4zgLN+QXtd89kPTevIwAAAAASUVORK5CYII=} image create photo ::ttk::dialog::image::up -data { iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAABl0 RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAL/SURBVDiNtZRNaFxVFMd/5368 eZkxRmQsbTEGxbZC0IWMpU5SbCmxILapFCO2LgSlWbhLbFJBcKErP0BcCIqCdeEiUAviQoJI wIgW3biwCoYGjTImTIXWTjsz7+O4yLzwUkuSgjlwuPdd7vmd/z33vCuqymaY2RTqZoLdRjfu nXTvg2zfNh8PT01p8r+AByf9S9vv6DuGQWr627vA6Hox65ZiYMIdva1Ufvlg9WhpaM+RYs+t 5eN7J4IX1ouTtbpicCyoFEulmacOniidr8+SpBG7ynv4dPrjxpVW48i3b0Rf3rTiR8al13o3 /cSBZ0uLV+f46/IFapfmWLh8nsf2PVnyzp0ZnAx33RR4cFK6U2dnDu97pie1LS5c/BFnHNZ4 fl36nkZSZ6h6qBuNv6qOye0bAo+MiFXc54/uHundUt5qfln6Dmt8xx2I8MPCF5RuKcrAg0Nb jHfTlVHx64Jrd9v3qv1Du/t3VPxPta+xYvHOUwgCfGBQ28Z45dzCWfruvMfdf+9D/V099vSa 4IEX/fh9d1WO7a8Mhz/XZjFOCMMCYVggCD2RaeAKQlAw4CPO/XmGygMPh33bdg5XJ/ypPGul K6rj7vG+rTumnjt0qss5j5KikjAzf5pYWtSvzXMt+Wc5SuHwzpNoqmgKzXaLs9OfXK1f/OPp 2bfizyD3gxgr478vznW98sHzAFgvzVdPfBj6wNFoLxLZBt4bBFAF44R3PnqtGbc17CCKOBkD VoNnX4/2X1cWNdbiA8+V1hK+YDAGEEFVsVaI2xp+82Yk19d3FfhGZozQiP9GbYwLBOMEEUFT RewNeRsEi6WZXkIMGCs4bzBOiNspsjZ3dVfIsjkRKWRrzbgBCppCmihJpGgC6EpMUUQKIrJK pMuAgO98u84cVTjQO4pKirEgIizfHqTpyhvTDcRAJCJxNne5BDYHdUD95NvHy2sfmHomImcK JKKqmeI8NBuzZKbjHb2kHY+BJFMJtIG2qqb/eTY7SWzOM6jtbElz8CQHV83B/gXtSQriGSyg 6AAAAABJRU5ErkJggg==} image create photo ::ttk::dialog::image::upbw -data { iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAAAXNSR0IArs4c6QAAAmZJREFU OMvtlDFr21AQx//3nuQochynTi0T40DW0I4le/dCCp0ay0uWDl1Es7TQD+Gp0A4B8zR1LJ1K KfkKhUDokDF4EXawU8dW/HQdoufIbqiddu3BoXfi7nfv/k9PwH9LjRZNDMPwA4BqHMe7+/v7 el6+tSD0jeM4e0REAN4BeDGvRiwAfWbb9ttKpZL3PM+1bbsehuHLf5JCKfXIsqyjWq2W7/f7 YGasrKzg7OzsZ5IkT33f/3pnsFJqUwjxvVar3YvjGAacz+eRy+XQbrd7AHbq9fqPhaVQShWI 6GhjY6MIAIPBANfyAhcXF9Baw/O8AjN/U0qVFgIfHh5KIvpcqVQ2l5aWRL/fBxFNHADOz88h paT19XWPiL60Wi17LjiXy70vlUo7q6urdhYqhIAQN+ndbheu61rFYvGBlLL1R3AYhgeFQmGv XC47vV7vOkEISCkhhECSJJMmANDpdLC2tua4rrsbhuHrWw9PKfXEdd2PW1tby2ZkZkYURWBm jEYjaH1zL6rVKpgZAKC1RrvdHgyHw+eNRuPT1AUhooPLy8vlk5MTEw+3t7cdIQTiOAYzT0lB RDg9PR0ys5O+conoFYBpsO/7j2dkYaOv1noKaoyZHd/36c5X2kDN2jyZeRL/1b8iCzbxPOCt 4GazSQBk6gCAJElmx58cWlrjAtAAdBAE4ylwCrTT2ErXYGaUy+WpHWcbpFYAMAZw1Ww2x2Zt ZRrIDNQCEB0fH9+fM3FkNpEdCoA24PHsdx1F0cNMM5E6pYVJ6uNUhjGAKwAxgDgIguS3k5jR WWagRvckA9cZOAdBMNHnFwC59UF9xwcGAAAAAElFTkSuQmCC} image create photo ::ttk::dialog::image::gohome -data { iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABmJLR0QA/wD/AP+gvaeTAAAA CXBIWXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH1QoOFCMCb8BVTwAAAyVJREFUOMullcFvG0UU h7+Z7Dq1G+NtnEBdRG0hVTSiqkAoNFIvHCCgKmotWVUiCMpf4FO1FQKVf2CFVEgFJyCIHIKg 0jpSLz330AMHGkI5EEEPkRM1iZ1CXLvx7gyHXa/WTZ1E6kij3Z2Z9703v3lvVnCINg85oBp+ vjkNv/G8bR7emge9Y9t6x7b1POjQ0b5NHAQFfi3adte46zgAJ6ZhrZetPAz00Z070XhtcZHQ UXW/yOVB0Na9ewxks13zh4GL/aDeygrSMJCFQmf7FG2bzUoFKQSDFy/2lEX2gupqFZlOR9A/ Jy6w+uEUruMwdOkSntb7Ri5i0Gngx6Jto+v1YPLYMVzHofHxR2ycfo2XXjzOqfo2q1evUrRt 1isVEj0ij4N10bah2YTdXchkcB2HJ/YV/n35BCMjr5NKJmm1WqTW1nkwMxPAXZeElBF8OmQa IfRIx4FuNhGDg7iOg/7CQWazvJEvkM/ng3kNu6+cxLx1i4VSialymXXX3XN4RvhMRdqE0L7v v8UzTM6fG8OyrMhAaw2AZVlk795lYWyMqXL54HS7fvMX/LnvaBsGo6NvMzAwgO/7Xb3dbuP7 Pv3ZLOP377MwOxtPANml8e2zZ2ceLi3NnVv5i08/+2RPBDe++hqlFNe/nEWLPrTXQhhH0P4T Pr92jUo6zdCZM+UPlpdvxKVgfGnph8uTpbkLg0ExjIycRgiBEIFv3/fRWqOFpK8wjreyiMi/ h35wG601lckShZOvfsPy8rOl6GiYSCQwTRPDMDBNE6VUBK9u7QDw+9+b+L6KbBzH0c/S2IiD pZRIKUnIVQxRQymFUgqPBH/8swXAw/pjPNEf2RBkl4hL0QccjYM7EihyNFsBNJfL8c75Ud5P HkXq47wrTTbWiIOzBAXiGaEHoxcY+kkmQSkFwKP6JmJ7q/tSqtX2VLIRG5AdbS3LIpPJIJAE fMHw8DCNRoOJiYk9GZNKRWXQAHQHKEIp0pcnS7Xn+dv8/NNNE/DioXfk6A8P4IVQryEgGc75 4dqd8L0NbAP/ARvA49iarvtYPCWLAMzYrogZ6rD7YddPR/8/aWZWKFzoJj8AAAAASUVORK5C YII=} image create photo ::ttk::dialog::image::gohomebw -data { iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAAAXNSR0IArs4c6QAAAo1JREFU OMuVlc1q20AURs/V6MdRkLHcEkg3GcgqISSUvkWy9q7QJyj4UbQodNuSZfZ5CkO6SRYBg1Yu JIu4pHYSy5K6iGaQ7MRxL4gZzXDP/fTNHSSsEWdnZ9vAqHr92Ov1fr2V46wB/QSMtNZorQEu qkIrQ9aADiqgjTRNAT70er3f/624Dr2/v7fr4/HYKB+tUu68BX14eMD3/cb+OnBZBX16ekJE 8H3ffD5aa8bjMQCdTudVW5zXoFmW4TiOhXqex8bGBmma0ul0KMtypXKpQT8Dp1pr8jwHQClF mqZEUYRSiiAIUEoxGo3QWnN3d4eIvKi8rvhUa01RFA1oHMf4vk8cx0RRRBAE7Ozs2L1F5Qbm VmpbZqEsSwvd2tpCKUUYhoRhaBXkec7u7i7D4dAqXwy3Gm2WgW5vbyMidLtdPM9jsbDv++zv 73N1dcVin7/YbgYKEMcxSinKsnzx8TyPw8ND2zHV1zuNwzs/P/8ymUx+HBwccHl5uaTg6OgI gOFwCEBRFDiOQ1EU7O3tMRgMCMPw68nJybeG4uPj45+mZwGiKCKKItrtNu1226oE2NzctKPj PCNEBBH5vujxskfO8qU08NlsBsBkMqEoClvw+vq6XPI4SRLXJNdjPp83kkWE6XQKQJZliEg9 p5UkiVjFSZIoYLNxc+TZftd1bW+3Wi263a49UBHh8fGxnvYO+A3M3aqCuwiuFzAggNlsZoua yLJs6Sa7tQXHgDzPa/SuiBAEAfP53LZiPZRSZjoByjp4Xi1ycXEBwO3tbSP55uZmnb/Yn36/ n1vpNTsCoAW0K7/eAxvVXl4l/63mGTAG7oFbYGqgDU/MadZsEcCrRrNnEsvqyYG83++Xi9L/ AQeKOvjuY6uLAAAAAElFTkSuQmCC} image create photo ::ttk::dialog::image::reload -data { iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAABl0 RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAATmSURBVDiNtZVpTBRnGMf/7zsz O7uzSzmWW+QQa5GgFkWoaBuPmiatMWnaEIKamKYC1k+2TROTJv3SNDE1adJaFCQ1toCkNGm1 sUdiPEqtCgRBWwVCPRAWAXGBved4n35gIRx+8Esn+WeSmWd+85tnnpmXERH+j40/S1FZWYv0 LHUb9jdnl77bkgAA7GnGJZXfrlAU9SMwbDVNK00QFIkzP+ds1BJ0QZBoERT4o6O20pi55qV9 p1MEp79MC1s76ysezAMzBlb6XnM9wMpffnGpbWVOsuxyquCcQdcNBEIGHjyatG70egIj4wGJ MRz2c+ULl6Rz6LzdEmIFMZHVUbtnYB5444Hmk9lpcWV7Xl+tRQwLE/4wYjQVmqpA4gDjDKBp A38wgkud98PX/x7SScCzqTBr2a3+EWNyIph37cSuQXkGWlT1XUmCS3t7e/Ey7euWdjHmDXLO AWEREYOZ6naFSgoynIUvpEpEQMggbF2fay/Kz7D3P3wS82pRFuvqHTZ1IYl5L88uK9XPuVRn /ZlOmgoYzGFXwpYQ31+rreAhjhTPiH/7uda+Hz79pjXY1jNMTlXC0HgITwIm1uenM0XmsCwB 2R6eDwbDawPDk8wdF+Ndnp16Q9dNLyA+B4CbNRXe9vqKtis15eWGbm38/Upf+4kfO4LxDo7M JA2Xbo1CkTgsIVhkoTEJqJpDHcrMSK6N1ewNYLzPIpt34cS01VV06YZ5aCqgSzEOBUPjIQgA doXDsogpQhYAMNtjS4hgosvxZYzD/rOuq48pwk7FLE2eWgguqmpcpcjS2eq3itSkeA1piU5s LkiGqkgwBTGbtQDsSEvPOYvL4szeNwQAoHLFovkuqmpIY8R/syzSjra0R0gQiADC9F4IsulW QABzPpDiqqYxBrgW0QAQwce42P7E5u5x+UYcT6sBAIWgtp/aO0oEkuccj2v4ZIdskzkABsaA sG7i47rWyP2RyfevH9/dHa2LTNvXKUC8VlpQGHbH6PHd/z4sHRx9XEeExHmtABGz22RcuDUC BkJpXhKazt+JDIz6jrYd39Ww0E4WzhRJFcdUh++nybBImvD7q2yybM2cnzNu05aGKZCR6AQD 0N0/RpyxVcXvNC9d9NwSnrMssWHSF9x9+97gh75AOJtx3J298awwiDEAa3LiMDgexJCX48iB Lfam8z3bzl3p7ympbvpKWNQBYgNcsWQi6YhDVeJ67g5ttikSuWM1wzsRql8EnpZmCIZ05C+J RcS00HnPi1cKM6Xi/HSt487wB57HvrBnzMfGJ4JOycaQ4taQl5OMxDgna/ylK6yZeuMiMGeM 3X80hUM1lyY4A9+xablty7osuzdgwiKgMC9NLrBSXYxN988QBNMUmPBH0PjrDb9lGAcvntwb npUkIjDGpPWVDUas0xbo77q4w9Nx5lHulsqd7iW51aufT8vIz01RMlNjmdNhQ8QQMEwLkwEd Xb0ecfXmQz04MXK4+/TBGgBhAGEi0mfA9nX7Grx+z+2y3nOf/QPAEY09fe3ONSkrt5UrWvxa cKY6VcUIRkyJCBAR35+jfa3HBq42dQMIRRMkouAMmK3efezNmw37LwOwA1DnRIlGkpxuJSGj ICHoHfYGRvu8APToXEeiUB+ACBHRoqWJMSbNgc1EBiBh+jdvRWNEowMwiciay/kPKWlcmnLc 32AAAAAASUVORK5CYII=} image create photo ::ttk::dialog::image::folder_new -data { iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABmJLR0QAAAAAAAD5Q7t/AAAA CXBIWXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH1QsRDwMVXP7WwgAAAtNJREFUOMvVlU1rE0Ec xn8zO4lNNFWrNlRBhQpCTQ9aQRREv4E3ETz5dhJRz4LgF7AnERVvXop4qBc9qdCDoGhrqyVp fUHUNmnaNG3eNtndGQ/ZjTFabRUPDjyzM/vf/c0z/52Zhf+tCIALF89f8bR7uTVYq9UA0J4+ duvm7YEVg8+dP2tOnTiz5EPXb1wjl8vtvTtw70VrzM0cEUAIcFR80PwA3r/vAOl0ekn48KuX OI6DMaYhSxoOH4j1nz6aTwJhYBgYVvHBsgpe7OnZhZTWkuDNm7d817csQ+f6OUJ66GLN2ptF tCulUx+FTve7mSMDKsjl+PgbHk0YRr4sJ4OGHfEFjh9MsWfnblx1bJOlOihVhtbPZO5f7o6n XzQcJxK9XH08yqWTh7Ad75dYicvG6Du616WJRrqw1AaEkCgrQr4S7gbWNsCvX48BMF+qkV2s /uaLa4pRxWq5FikmiVlDhEI7cZ2XvE+H6dtOTgLYtk0i0bvspWSQzFc28Wamj1R2K9nZp+Rz A3yekzwc2Qow9YPj5RbPKGbLnRRr7XzKd7NKVbBUF28zYwAFBVAul+uOH4+ucH9JbDeK7UYB WBNyqTpqUsUHjfxTxz8rCwsFpLtYrA/ZtCoAImGrKZf4mwG0MWgNWhu0Nni+3CaV7SrSeBMA Kth9gWPX01RdDSYAg8BghN/BYBD1oDBgBAbDmjbFzPy8I71yCZANcCLRS1/yGdKSVB1dZwga A7SC8Otgah0xSWZ2UUg7+wRQyj9AGBtP0r6uk3S+iu07DngNeHNtaIwciyiqjiabL3hq7jlA WAFRgLauHrbFLJLTJQSgmxPdaPtpqNvHUDewKqT5PJkyhUKp8Ck5UQQiCqiMjo6d+XBn5Nbf nu3F1IP+6anpqWAuFtAGxICI3w77K0Z8y/R3Z3hwzwCer5qvCrAomuDKV6gJSgtYtFy1H9OA 2yT9z/55XwFw92OAfbBE1wAAAABJRU5ErkJggg==} image create photo ::ttk::dialog::image::configure -data { iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAAAXNSR0IArs4c6QAAA9RJREFU OMullHFMlGUcxz/vccKloIdhyhECbk6yQk4YLbib1Am1CHQuK5OVWCyr9YdjLWS4pzeJo/6h rREjXWuO1TBX2rRNYqNasJFwp0vrUIluF+cJBxKBcndwb39473meB7X1/PV+nz3vZ9/n9/v+ HomoJYQQwDsh+TZgk2W5i/+7hBDK6DWP4vPNKg7Hb4oQQqmpqSkDpH/5VQI0qtDEOGBo+bgV JRgkzWBg167nSUxMPAUoC8Hzq9tT3239Jphf3X40GiwJIXIBZFm+ChisTe/jm71JVlZWtKto aC7gPrivHMMK1uRXt3epYKm+vl4G7EKIQyrcZDIhSXddKBjDsP3sJ7sZGBigqmiZxZihswBo gSVxcXEHX9tXjSYu/i2gPicnh+zsDShKEEmS8Ptm+oQQubIsn4vhlqGhIVwuF+99OwNgCF+t ra3tl20V5Q8tXXoPAb8fRVFQFCUMWK5PprHRCmAIlUqF2ntbnqXwjWPqUWP/4cpzYbAQIlWn 0/36ZKlF/8CDDyNJUrhXU5PXb8FX6Gm0NgEYTrvXrwbsP7e9MFfw6udaoKT/cGVXzGYIIXIz MjKOOJ3OPHWvoKAgsHWrZcnff02iKArLkpbT0dFBS288P330DKY3j9/hMpIrLZLnVMAMdNTV HWBi3MuFy3/ywQknXx8qo3j/iQWhgCL9h4HJBexrjWW0nr7El3VF1H3aT8XGAA7HoDGioWr9 YucyMvTeEZdb1Slp6XzfvJ09TZ1sN+p4rqKEhoYGtaGjwPyigY+E7izdwKaN6/B6J/iwvY+U tHRqnk7FoNeyLiuTtPvTkWUZwBgdRc1i0Be3mQhOe0nS67EYl+MdceGw/YjZbEaXEM/42DVu vVnY1cmNCVahr+zYxN4dW+g88x0/DAyCRsv83Fw4q7Isc++q1UiStCBcEw098LKJ3WWFHDvZ xdmLwxSazTgcVwj4ZwGYmpry+v3+PFmWWZlyH0AYnpCQEIZr1Cnyjrjc8uuPsbM0j6PHzzDs clNSVoHDcQW38zI9g0G0c6Prm5ubr1ut1ksej8ekOvf5/VRV7aG2thbAHm5e5lNWZX/lI7xU 8ShfnOym7/wg5sctd0ADozajEpzXuG1fjYUM/bFYTLXqR0ZmOvNBhdGR4bug0793Fnsd3YEQ MHmBdzw2uKu7l/EpI1ueKOf8xdvQG87uIq+j2xvVkyCQDTgW4moBVq5J3Xyqx21TC3TzxjQ9 g0ESNDPFweS0ScAbkXs1+wqwChiLYfb2SG/e+5lxwnPVpurEpPi1FzpqPJFjGgGVosbYF9Jx Ia38A2FguUpFCYd6AAAAAElFTkSuQmCC} image create photo ::ttk::dialog::image::folder -data { iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QAAAAAAAD5Q7t/AAAA CXBIWXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH1QsKEjkN+d1wUAAAAX9JREFUOMulkU2IUlEY hp9jKv5AposQWgRBtA6CmSCa5SzjYhG0qYggiP6Y3WxmtrMIol1QM84qRKRlSVC2bBcYRpuI IigFC7F7j0fP/WZx7QriBc2XDw6cw/e8L+9Rly6XtorF4jZTMsYE58Dc2tvdf0KE1J17t+X6 1RszH7X2eLb3lF6vd6VaqT2PBJSci7Q+taJMeNt4M331qFqpPQCIA6TTGY7k8pEA50IpcFMK pRS1F9X7QAAwxuB5Lq8/9ml2Msylww5nbjpSSOnPYYJmJ8PjjXW0sXMxUslD3H1YPxUH8DwX gJ+/NV/af+cCnDiaBSCmtSadnjP6DMVc1w0T/BfgXwdLARZNYK2PHgZlh7+QiPkIICIopRAR RMAXwVphaH3MSBiMLEMr5LLJCcDzXI7nBnT7hh9dD0ThI4wHERAEkTEYGFmZAH512pw+e44P X/+MlwJ3EfARBAUiYaqVkwXqL1+R19/L6vy1nYabOLa2aHnZ4bf378qbqyyrA8KHtMqnsOL4 AAAAAElFTkSuQmCC} image create photo ::ttk::dialog::image::file -data { iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAA CXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1QQWFA84umAmQgAAANpJREFUOMutkj1uhDAQ hb8HSLtbISGfgZ+zbJkix0HmFhwhUdocBnMBGvqtTIqIFSReWKK8aix73nwzHrVt+zEMwwvH 9FrX9TsA1trpqKy10+yUzME4jnjvAZB0LzXHkojjmDRNVyh3A+89zrlVwlKSqKrqVy/J8lAU xSZBSMny4ZLgp54iyPM8UPHGNJ2IomibAKDv+9VlWZbABbgB5/0WQgSSkC4PF2JF4JzbHN43 0c4vhAm0TyCJruuClefph4yCBCGT3T3Isoy/KDHGfDZNcz2SZIx547/0BVRRX7n8uT/sAAAA AElFTkSuQmCC} # Images for ttk::chooseDirectory image create photo ::ttk::dialog::image::dirclose -data { R0lGODlhCQAJAKUAAFRWUlVXU1pcWP///1lbV2BiXt/i3Obo5O3u6/P08vj4911fW2NlYeHk 3+bp5Ovt6u/x7vDx72ZoZAAAAGNmYWpsZ93g2t7h2+Di3WdpZG1vatjb1dfb1Njb1Nfb09XZ 0WpsaHBybW1wa3N1cP////////////////////////////////////////////////////// /////////////////////////////////////////////////////////yH5BAEKAD8ALAAA AAAJAAkAAAY4QEBgSBwKBsjkgFAYGA6IhGKwYAwajgckMihIBpNweECpDCwXDOYyyGgGG07H 8xmAQsqkaMTv94MAOw==} image create photo ::ttk::dialog::image::diropen -data { R0lGODlhCQAJAKUAAFRWUlVXU1pcWP///1lbV2BiXt/i3Obo5AAAAPP08vj4911fW2NlYeHk 3+bp5O/x7vDx72ZoZGNmYWpsZ93g2t7h2+Di3WdpZG1vatjb1dfb1Nfb09XZ0WpsaHBybW1w a3N1cP////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////yH5BAEKAD8ALAAA AAAJAAkAAAY4QEBgSBwKBsjkgFAYGA6IhGKwYAwaDsQDMihEBohweCCZDCgVhKUyuGAGGQ1i wxl0PMrkB8Tv94MAOw==} fsdialog/license.txt000064400000000000000000000013401234257562200144130ustar00nobodynobodyCopyright (c) 2006-2014, Schelte Bron Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 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 TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. fsdialog/pl.msg000064400000000000000000000032131234257562200133540ustar00nobodynobody namespace eval ::ttk::dialog::file { ::msgcat::mcset pl Open {Otwórz} ::msgcat::mcset pl {Save As} {Zapisz pod nazwÄ…} ::msgcat::mcset pl Cancel Zaniechaj ::msgcat::mcset pl Clear Wyczyść ::msgcat::mcset pl Location Lokalizacja ::msgcat::mcset pl Filter {Rodzaj pliku} ::msgcat::mcset pl Name Nazwa ::msgcat::mcset pl Size Rozmiar ::msgcat::mcset pl Date {Data modyfikacji} ::msgcat::mcset pl Permissions {Prawa dostÄ™pu} ::msgcat::mcset pl Owner WÅ‚aÅ›ciciel ::msgcat::mcset pl Group Grupa ::msgcat::mcset pl Folder Katalog ::msgcat::mcset pl Sorting Sortowanie ::msgcat::mcset pl Reverse Odwrotnie ::msgcat::mcset pl {Short View} {Widok listy} ::msgcat::mcset pl {Detailed View} {Widok szczegółowy} ::msgcat::mcset pl {Show Hidden Files} {Pokaż ukryte pliki} ::msgcat::mcset pl {Separate Folders} {Katalogi osobno} ::msgcat::mcset pl {By Name} {WedÅ‚ug nazwy} ::msgcat::mcset pl {By Date} {WedÅ‚ug daty} ::msgcat::mcset pl {By Size} {WedÅ‚ug rozmiaru} ::msgcat::mcset pl {Folders First} {Najpierw katalogi} ::msgcat::mcset pl {New Folder} {Nowy katalog} ::msgcat::mcset pl {Create new folder in} {Utwórz nowy katalog w} ::msgcat::mcset pl {File "%s" already exists. Do you want to overwrite it?} "Istnieje już plik o nazwie\n\"%s\"\nCzy przekasować ten plik?" ::msgcat::mcset pl {File "%s" does not exist.} "Nie stwierdzono obecnoÅ›ci pliku o nazwie\n\"%s\"" ::msgcat::mcset pl {Cannot change to the directory "%s". Permission denied.} "Nie udaÅ‚o siÄ™ przejść do katalogu\n\"%s\"\n(odmowa dostÄ™pu)" } fsdialog/pt_br.msg000064400000000000000000000031471234257562200140550ustar00nobodynobody#(C) Carlos A. R. de Souza. Distributable under the ISC license. namespace eval ::ttk::dialog::file { ::msgcat::mcset pt_BR Ok Ok ::msgcat::mcset pt_BR Cancel Cancelar ::msgcat::mcset pt_BR Open Abrir ::msgcat::mcset pt_BR Location Localização ::msgcat::mcset pt_BR Filter Filtro ::msgcat::mcset pt_BR Name Nome ::msgcat::mcset pt_BR Size Tamanho ::msgcat::mcset pt_BR Date Data ::msgcat::mcset pt_BR Permissions Permissões ::msgcat::mcset pt_BR Owner Dono ::msgcat::mcset pt_BR Group Grupo ::msgcat::mcset pt_BR Folder Pasta ::msgcat::mcset pt_BR Sorting Filtragem ::msgcat::mcset pt_BR Reverse {Ao contrário} ::msgcat::mcset pt_BR {Short View} {Visão resumida} ::msgcat::mcset pt_BR {Detailed View} {Visão detalhada} ::msgcat::mcset pt_BR {Show Hidden Files} {Mostrar arquivos ocultos} ::msgcat::mcset pt_BR {Separate Folders} {Separar pastas} ::msgcat::mcset pt_BR {By Name} {Por nome} ::msgcat::mcset pt_BR {By Date} {Por data} ::msgcat::mcset pt_BR {By Size} {Por tamanho} ::msgcat::mcset pt_BR {Folders First} {Pastas primeiro} ::msgcat::mcset pt_BR {New Folder} {Nova pasta} ::msgcat::mcset pt_BR {Create new folder in} {Criar nova pasta em...} ::msgcat::mcset pt_BR {File "%s" already exists. Do you want to overwrite it?} \ {O arquivo "%s" já existe. Deseja sobreescrevê-lo?} ::msgcat::mcset pt_BR {File "%s" does not exist.} {O arquivo "%s" não existe} ::msgcat::mcset pt_BR {Cannot change to the directory "%s". Permission denied.} \ {Não é possível visualizar a pasta "%s". Permissão negada.} } fsdialog/sv.msg000064400000000000000000000032201234257562200133670ustar00nobodynobody namespace eval ::ttk::dialog::file { ::msgcat::mcset sv Location Plats ::msgcat::mcset sv Filter Filter ::msgcat::mcset sv Name Namn ::msgcat::mcset sv Size Storlek ::msgcat::mcset sv Date Datum ::msgcat::mcset sv Permissions Behörigheter ::msgcat::mcset sv Owner Ägare ::msgcat::mcset sv Group Grupp ::msgcat::mcset sv Folder Mapp ::msgcat::mcset sv Sorting Sortering ::msgcat::mcset sv Reverse Omvänd ::msgcat::mcset sv {Short View} {Enkel vy} ::msgcat::mcset sv {Detailed View} {Detaljerad vy} ::msgcat::mcset sv {Show Hidden Files} {Visa dolda filer} ::msgcat::mcset sv {Separate Folders} {Mappar separat} ::msgcat::mcset sv {By Name} {Efter namn} ::msgcat::mcset sv {By Date} {Efter datum} ::msgcat::mcset sv {By Size} {Efter storlek} ::msgcat::mcset sv {Folders First} {Mappar först} ::msgcat::mcset sv {New Folder} {Ny mapp} ::msgcat::mcset sv {Create new folder in} {Skapa ny mapp i} ::msgcat::mcset sv {File "%s" already exists. Do you want to overwrite it?} {Filen "%s" finns redan. Vill du skriva över den?} ::msgcat::mcset sv {File "%s" does not exist.} {Filen "%s" finns ej.} ::msgcat::mcset sv {Cannot change to the directory "%s". Permission denied.} {Kan ej skifta till mappen "%s". Ej tillräcklig behörighet.} } fsdialog/tclIndex000064400000000000000000000005521234257562200137310ustar00nobodynobody# Tcl autoload index file, version 2.0 set auto_index(::ttk::getOpenFile) [list source [file join $dir fsdialog.tcl]] set auto_index(::ttk::getSaveFile) [list source [file join $dir fsdialog.tcl]] set auto_index(::ttk::getAppendFile) [list source [file join $dir fsdialog.tcl]] set auto_index(::ttk::chooseDirectory) [list source [file join $dir fsdialog.tcl]]