arcadia 0.9.3 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README +11 -10
- data/bin/arcadia +3 -0
- data/conf/arcadia.conf +117 -75
- data/conf/arcadia.res.rb +219 -58
- data/conf/theme-dark.conf +11 -8
- data/conf/theme-dark.res.rb +81 -10
- data/ext/ae-breakpoints/ae-breakpoints.rb +1 -1
- data/ext/ae-dir-projects/ae-dir-projects.conf +2 -2
- data/ext/ae-dir-projects/ae-dir-projects.rb +84 -47
- data/ext/ae-editor/ae-editor.rb +541 -190
- data/ext/ae-editor/langs/coderay.tokens +1 -0
- data/ext/ae-editor/langs/conf.lang +5 -4
- data/ext/ae-editor/langs/java.lang +2 -1
- data/ext/ae-editor/langs/python.lang +4 -0
- data/ext/ae-editor/langs/rhtml.lang +2 -1
- data/ext/ae-editor/langs/ruby.lang +45 -0
- data/ext/ae-editor/langs/tcl.lang +80 -2
- data/ext/ae-editor/langs/text.lang +2 -0
- data/ext/ae-editor/langs/xml.lang +1 -0
- data/ext/ae-file-history/ae-file-history.conf +2 -2
- data/ext/ae-file-history/ae-file-history.rb +66 -20
- data/ext/ae-output/ae-output.conf +3 -3
- data/ext/ae-output/ae-output.rb +37 -23
- data/ext/ae-rad/ae-rad-palette.rb +3 -3
- data/ext/ae-ruby-debug/ae-ruby-debug.conf +2 -2
- data/ext/ae-ruby-debug/ae-ruby-debug.rb +38 -42
- data/ext/ae-search-in-files/ae-search-in-files.conf +2 -2
- data/ext/ae-search-in-files/ae-search-in-files.rb +20 -9
- data/ext/ae-search-in-files/ext/ack-in-files/ack-in-files.conf +2 -2
- data/ext/ae-shell/ae-shell.conf +1 -1
- data/ext/ae-shell/ae-shell.rb +57 -46
- data/ext/ae-subprocess-inspector/ae-subprocess-inspector.rb +99 -46
- data/ext/ae-subprocess-inspector/process.res +0 -0
- data/lib/a-commons.rb +13 -9
- data/lib/a-contracts.rb +24 -1
- data/lib/a-core.rb +586 -196
- data/lib/a-tkcommons.rb +155 -55
- data/lib/anigif.rb +9 -0
- data/lib/ctags.exe +0 -0
- data/tcl/anigif/anigif.tcl +199 -0
- data/tcl/anigif/pkgIndex.tcl +3 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/ArrowButton.html +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/BWidget.html +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/Button.html +36 -2
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/ButtonBox.html +9 -7
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/ComboBox.html +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/Dialog.html +5 -11
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/DragSite.html +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/DropSite.html +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/DynamicHelp.html +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/Entry.html +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/Label.html +32 -1
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/LabelEntry.html +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/LabelFrame.html +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/ListBox.html +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/MainFrame.html +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/MessageDlg.html +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/NoteBook.html +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/PagesManager.html +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/PanedWindow.html +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/PanelFrame.html +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/PasswdDlg.html +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/ProgressBar.html +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/ProgressDlg.html +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/ScrollView.html +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/ScrollableFrame.html +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/ScrolledWindow.html +13 -1
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/SelectColor.html +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/SelectFont.html +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/Separator.html +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/SpinBox.html +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/StatusBar.html +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/TitleFrame.html +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/Tree.html +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/Widget.html +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/contents.html +12 -1
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/index.html +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/navtree.html +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/options.htm +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/CHANGES.txt +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/ChangeLog +70 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/LICENSE.txt +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/README.txt +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/arrow.tcl +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/bitmap.tcl +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/button.tcl +121 -53
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/buttonbox.tcl +10 -5
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/color.tcl +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/combobox.tcl +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/demo/basic.tcl +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/demo/bwidget.xbm +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/demo/demo.tcl +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/demo/dnd.tcl +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/demo/manager.tcl +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/demo/select.tcl +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/demo/tmpldlg.tcl +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/demo/tree.tcl +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/demo/x1.xbm +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/dialog.tcl +14 -2
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/dragsite.tcl +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/dropsite.tcl +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/dynhelp.tcl +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/entry.tcl +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/font.tcl +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/bold.gif +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/copy.gif +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/cut.gif +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/dragfile.gif +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/dragicon.gif +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/error.gif +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/file.gif +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/folder.gif +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/hourglass.gif +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/info.gif +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/italic.gif +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/minus.xbm +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/new.gif +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/opcopy.xbm +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/open.gif +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/openfold.gif +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/oplink.xbm +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/opmove.xbm +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/overstrike.gif +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/palette.gif +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/passwd.gif +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/paste.gif +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/plus.xbm +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/print.gif +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/question.gif +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/redo.gif +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/save.gif +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/target.xbm +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/underline.gif +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/undo.gif +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/warning.gif +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/init.tcl +15 -1
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/label.tcl +76 -18
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/labelentry.tcl +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/labelframe.tcl +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/lang/da.rc +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/lang/de.rc +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/lang/en.rc +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/lang/es.rc +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/lang/fr.rc +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/lang/hu.rc +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/lang/nl.rc +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/lang/no.rc +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/lang/pl.rc +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/listbox.tcl +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/mainframe.tcl +3 -2
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/messagedlg.tcl +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/notebook.tcl +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/pagesmgr.tcl +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/panedw.tcl +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/panelframe.tcl +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/passwddlg.tcl +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/pkgIndex.tcl +2 -2
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/progressbar.tcl +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/progressdlg.tcl +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/scrollframe.tcl +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/scrollview.tcl +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/scrollw.tcl +37 -25
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/separator.tcl +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/spinbox.tcl +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/statusbar.tcl +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/tests/entry.test +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/titleframe.tcl +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/tree.tcl +17 -9
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/utils.tcl +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/widget.tcl +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/wizard.tcl +0 -0
- data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/xpm2image.tcl +0 -0
- data/tcl/fsdialog/de.msg +30 -0
- data/tcl/fsdialog/en.msg +31 -0
- data/tcl/fsdialog/fsdialog.tcl +1749 -0
- data/tcl/fsdialog/fsdlg-gif.tcl +259 -0
- data/tcl/fsdialog/fsdlg-png.tcl +265 -0
- data/tcl/fsdialog/sv.msg +32 -0
- data/tcl/fsdialog/tclIndex +6 -0
- metadata +179 -174
- data/ext/ae-editor/langs/erb.lang.bind +0 -1
- data/ext/ae-editor/langs/lang.lang.bind +0 -1
- data/ext/ae-editor/langs/pers.lang.bind +0 -1
- data/ext/ae-editor/langs/rb.lang +0 -73
- data/ext/ae-editor/langs/rbw.lang.bind +0 -1
- data/ext/ae-editor/langs/tokens.lang.bind +0 -1
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# ----------------------------------------------------------------------------
|
|
2
2
|
# tree.tcl
|
|
3
3
|
# This file is part of Unifix BWidget Toolkit
|
|
4
|
-
# $Id: tree.tcl,v 1.60.2.
|
|
4
|
+
# $Id: tree.tcl,v 1.60.2.3 2010/12/14 21:24:15 oehhar Exp $
|
|
5
5
|
# ----------------------------------------------------------------------------
|
|
6
6
|
# Index of commands:
|
|
7
7
|
# - Tree::create
|
|
@@ -350,7 +350,7 @@ proc Tree::insert { path index parent node args } {
|
|
|
350
350
|
_redraw_idle $path 3
|
|
351
351
|
} else {
|
|
352
352
|
# ...and closed -> redraw cross
|
|
353
|
-
|
|
353
|
+
MergeFlag $path $parent 8
|
|
354
354
|
_redraw_idle $path 2
|
|
355
355
|
}
|
|
356
356
|
}
|
|
@@ -400,19 +400,27 @@ proc Tree::itemconfigure { path node args } {
|
|
|
400
400
|
}
|
|
401
401
|
|
|
402
402
|
if { $data(upd,level) < 3 && $flag } {
|
|
403
|
-
|
|
404
|
-
lappend data(upd,nodes) $node $flag
|
|
405
|
-
} else {
|
|
406
|
-
incr idx
|
|
407
|
-
set flag [expr {[lindex $data(upd,nodes) $idx] | $flag}]
|
|
408
|
-
set data(upd,nodes) [lreplace $data(upd,nodes) $idx $idx $flag]
|
|
409
|
-
}
|
|
403
|
+
MergeFlag $path $node $flag
|
|
410
404
|
_redraw_idle $path 2
|
|
411
405
|
}
|
|
412
406
|
}
|
|
413
407
|
return $result
|
|
414
408
|
}
|
|
415
409
|
|
|
410
|
+
proc Tree::MergeFlag { path node flag } {
|
|
411
|
+
variable $path
|
|
412
|
+
upvar 0 $path data
|
|
413
|
+
|
|
414
|
+
# data(upd,nodes) is a key-val list: emulate a dict by an array
|
|
415
|
+
array set n $data(upd,nodes)
|
|
416
|
+
if {![info exists n($node)]} {
|
|
417
|
+
lappend data(upd,nodes) $node $flag
|
|
418
|
+
} else {
|
|
419
|
+
set n($node) [expr {$n($node) | $flag}]
|
|
420
|
+
set data(upd,nodes) [array get n]
|
|
421
|
+
}
|
|
422
|
+
return
|
|
423
|
+
}
|
|
416
424
|
|
|
417
425
|
# ----------------------------------------------------------------------------
|
|
418
426
|
# Command Tree::itemcget
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
data/tcl/fsdialog/de.msg
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
|
|
2
|
+
namespace eval ::ttk::dialog::file {
|
|
3
|
+
::msgcat::mcset de Location Ort
|
|
4
|
+
::msgcat::mcset de Filter Dateityp
|
|
5
|
+
::msgcat::mcset de Name Name
|
|
6
|
+
::msgcat::mcset de Size Größe
|
|
7
|
+
::msgcat::mcset de Date Änderungsdatum
|
|
8
|
+
::msgcat::mcset de Permissions Berechtigungen
|
|
9
|
+
::msgcat::mcset de Owner Besitzer
|
|
10
|
+
::msgcat::mcset de Group Gruppe
|
|
11
|
+
::msgcat::mcset de Folder Ordner
|
|
12
|
+
::msgcat::mcset de Sorting Sortierung
|
|
13
|
+
::msgcat::mcset de Reverse Umgekehrt
|
|
14
|
+
|
|
15
|
+
::msgcat::mcset de {Short View} {Listenansicht}
|
|
16
|
+
::msgcat::mcset de {Detailed View} {Detailansicht}
|
|
17
|
+
::msgcat::mcset de {Show Hidden Files} {Verborgene Dateien anzeigen}
|
|
18
|
+
::msgcat::mcset de {Separate Folders} {Seitenleiste}
|
|
19
|
+
::msgcat::mcset de {By Name} {Nach Namen}
|
|
20
|
+
::msgcat::mcset de {By Date} {Nach Datum}
|
|
21
|
+
::msgcat::mcset de {By Size} {Nach Größe}
|
|
22
|
+
::msgcat::mcset de {Folders First} {Ordner zuerst}
|
|
23
|
+
::msgcat::mcset de {New Folder} {Neuer Ordner}
|
|
24
|
+
::msgcat::mcset de {Create new folder in} {Neuer Ordner erstellen in}
|
|
25
|
+
|
|
26
|
+
::msgcat::mcset de {File "%s" already exists. Do you want to overwrite it?} {Datei "%s" existiert bereits. Soll sie überschrieben werden?}
|
|
27
|
+
::msgcat::mcset de {File "%s" does not exist.} {Datei "%s" existiert nicht.}
|
|
28
|
+
::msgcat::mcset de {Cannot change to the directory "%s". Permission denied.} {Kann nicht in das Verzeichnis "%s" wechseln. Keine Berechtigung.}
|
|
29
|
+
}
|
|
30
|
+
|
data/tcl/fsdialog/en.msg
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
|
|
2
|
+
namespace eval ::ttk::dialog::file {
|
|
3
|
+
::msgcat::mcset en Location
|
|
4
|
+
::msgcat::mcset en Filter
|
|
5
|
+
::msgcat::mcset en Name
|
|
6
|
+
::msgcat::mcset en Size
|
|
7
|
+
::msgcat::mcset en Date
|
|
8
|
+
::msgcat::mcset en Permissions
|
|
9
|
+
::msgcat::mcset en Owner
|
|
10
|
+
::msgcat::mcset en Group
|
|
11
|
+
::msgcat::mcset en Folder
|
|
12
|
+
::msgcat::mcset en Sorting
|
|
13
|
+
::msgcat::mcset en Reverse
|
|
14
|
+
|
|
15
|
+
::msgcat::mcset en {Short View}
|
|
16
|
+
::msgcat::mcset en {Detailed View}
|
|
17
|
+
::msgcat::mcset en {Show Hidden Files}
|
|
18
|
+
::msgcat::mcset en {Separate Folders}
|
|
19
|
+
::msgcat::mcset en {By Name}
|
|
20
|
+
::msgcat::mcset en {By Date}
|
|
21
|
+
::msgcat::mcset en {By Size}
|
|
22
|
+
::msgcat::mcset en {Folders First}
|
|
23
|
+
::msgcat::mcset en {New Folder}
|
|
24
|
+
::msgcat::mcset en {Create new folder in}
|
|
25
|
+
|
|
26
|
+
::msgcat::mcset en {File "%s" already exists. Do you want to overwrite it?}
|
|
27
|
+
::msgcat::mcset en {File "%s" does not exist.}
|
|
28
|
+
::msgcat::mcset en {Cannot change to the directory "%s". Permission denied.}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
|
|
@@ -0,0 +1,1749 @@
|
|
|
1
|
+
# Copyright (C) Schelte Bron. Freely redistributable.
|
|
2
|
+
# Version 1.14 - 27 Jun 2009
|
|
3
|
+
|
|
4
|
+
# File names containing <TAB> will mess up the layout. Tab char = \u2409
|
|
5
|
+
|
|
6
|
+
# Example proc for saving and restoring the user selections
|
|
7
|
+
proc ::ttk::__fsOptions {{arglist ""}} {
|
|
8
|
+
variable fsOptions
|
|
9
|
+
array set fsOptions $arglist
|
|
10
|
+
array get fsOptions
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
# Import the style command in the ttk namespace, if it doesn't exist
|
|
14
|
+
namespace export style;catch {namespace eval ttk {namespace import ::style}}
|
|
15
|
+
|
|
16
|
+
# Install the example fsOptions proc if no fsOptions proc has been provided
|
|
17
|
+
if {[catch {rename ::ttk::__fsOptions ::ttk::fsOptions}]} {
|
|
18
|
+
rename ::ttk::__fsOptions {}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
namespace eval ::ttk::dialog {
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
namespace eval ::ttk::dialog::file {
|
|
25
|
+
variable dirlist "" filelist "" filetype none opt
|
|
26
|
+
array set opt {
|
|
27
|
+
-sort name
|
|
28
|
+
-hidden 1
|
|
29
|
+
-sepfolders 1
|
|
30
|
+
-foldersfirst 1
|
|
31
|
+
-details 0
|
|
32
|
+
-reverse 0
|
|
33
|
+
-filetype none
|
|
34
|
+
-typevariable ""
|
|
35
|
+
}
|
|
36
|
+
package require msgcat
|
|
37
|
+
namespace import ::msgcat::mc
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
namespace eval ::ttk::dialog::image {
|
|
41
|
+
variable dir [file dirname [info script]] err
|
|
42
|
+
catch {image create photo -format png -data xxx} err
|
|
43
|
+
if {$err eq "couldn't recognize image data"} {
|
|
44
|
+
# Apparently png support is present
|
|
45
|
+
source [file join $dir fsdlg-png.tcl]
|
|
46
|
+
} else {
|
|
47
|
+
# Fall back to the gif versions
|
|
48
|
+
source [file join $dir fsdlg-gif.tcl]
|
|
49
|
+
}
|
|
50
|
+
unset dir err
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
### ttk::getOpenFile, ttk::getSaveFile, ttk::getAppendFile
|
|
54
|
+
|
|
55
|
+
interp alias {} ttk::getOpenFile {} ::ttk::dialog::file::tkFDialog open
|
|
56
|
+
interp alias {} ttk::getSaveFile {} ::ttk::dialog::file::tkFDialog save
|
|
57
|
+
interp alias {} ttk::getAppendFile {} ::ttk::dialog::file::tkFDialog append
|
|
58
|
+
|
|
59
|
+
proc ::ttk::dialog::file::Create {win class} {
|
|
60
|
+
toplevel $win -class $class
|
|
61
|
+
wm withdraw $win
|
|
62
|
+
|
|
63
|
+
set dataName [winfo name $win]
|
|
64
|
+
upvar ::ttk::dialog::file::$dataName data
|
|
65
|
+
|
|
66
|
+
if {[info exists data(topLevel)] && $data(topLevel) ne $win} {
|
|
67
|
+
destroy $data(topLevel)
|
|
68
|
+
}
|
|
69
|
+
set data(topLevel) $win
|
|
70
|
+
|
|
71
|
+
# Additional frame to make sure the toplevel has the correct
|
|
72
|
+
# background color for the theme
|
|
73
|
+
#
|
|
74
|
+
set w [ttk::frame $win.f]
|
|
75
|
+
pack $w -fill both -expand 1
|
|
76
|
+
|
|
77
|
+
# f1: the toolbar
|
|
78
|
+
#
|
|
79
|
+
set f1 [ttk::frame $w.f1 -class Toolbar]
|
|
80
|
+
set data(bgLabel) [ttk::label $f1.bg -style Toolbutton]
|
|
81
|
+
set data(upBtn) [ttk::button $f1.up -style Toolbutton]
|
|
82
|
+
$data(upBtn) configure -image {::ttk::dialog::image::up
|
|
83
|
+
disabled ::ttk::dialog::image::upbw} \
|
|
84
|
+
-command [list ::ttk::dialog::file::UpDirCmd $win]
|
|
85
|
+
set data(prevBtn) [ttk::button $f1.prev -style Toolbutton]
|
|
86
|
+
$data(prevBtn) configure -image {::ttk::dialog::image::previous
|
|
87
|
+
disabled ::ttk::dialog::image::previousbw} \
|
|
88
|
+
-command [list ::ttk::dialog::file::PrevDirCmd $win]
|
|
89
|
+
set data(nextBtn) [ttk::button $f1.next -style Toolbutton]
|
|
90
|
+
$data(nextBtn) configure -image {::ttk::dialog::image::next
|
|
91
|
+
disabled ::ttk::dialog::image::nextbw} \
|
|
92
|
+
-command [list ::ttk::dialog::file::NextDirCmd $win]
|
|
93
|
+
set data(homeBtn) [ttk::button $f1.home -style Toolbutton]
|
|
94
|
+
$data(homeBtn) configure -image {::ttk::dialog::image::gohome \
|
|
95
|
+
disabled ::ttk::dialog::image::gohomebw} \
|
|
96
|
+
-command [list ::ttk::dialog::file::HomeDirCmd $win]
|
|
97
|
+
set data(reloadBtn) [ttk::button $f1.reload -style Toolbutton]
|
|
98
|
+
$data(reloadBtn) configure -image ::ttk::dialog::image::reload \
|
|
99
|
+
-command [list ::ttk::dialog::file::Update $win]
|
|
100
|
+
set data(newBtn) [ttk::button $f1.new -style Toolbutton]
|
|
101
|
+
$data(newBtn) configure -image ::ttk::dialog::image::folder_new \
|
|
102
|
+
-command [list ::ttk::dialog::file::NewDirCmd $win]
|
|
103
|
+
set data(cfgBtn) [ttk::menubutton $f1.cfg -style Toolbutton]
|
|
104
|
+
set data(cfgMenu) [menu $data(cfgBtn).menu -tearoff 0]
|
|
105
|
+
$data(cfgBtn) configure -image ::ttk::dialog::image::configure \
|
|
106
|
+
-menu $data(cfgMenu)
|
|
107
|
+
set data(dirMenuBtn) [ttk::combobox $f1.menu]
|
|
108
|
+
$data(dirMenuBtn) configure \
|
|
109
|
+
-textvariable ::ttk::dialog::file::${dataName}(selectPath)
|
|
110
|
+
|
|
111
|
+
set data(sortMenu) [menu $data(cfgMenu).sort -tearoff 0]
|
|
112
|
+
set image [option get $data(cfgMenu) image Image]
|
|
113
|
+
set selimage [option get $data(cfgMenu) selectImage Image]
|
|
114
|
+
|
|
115
|
+
$data(cfgMenu) add cascade -label " [mc Sorting]" \
|
|
116
|
+
-menu $data(sortMenu) -image $image -compound left
|
|
117
|
+
$data(cfgMenu) add separator
|
|
118
|
+
$data(cfgMenu) add radiobutton -label [mc "Short View"] \
|
|
119
|
+
-compound left -image $image -indicatoron 0 \
|
|
120
|
+
-selectimage ::ttk::dialog::image::radio16 \
|
|
121
|
+
-variable ::ttk::dialog::file::opt(-details) -value 0 \
|
|
122
|
+
-command [list ::ttk::dialog::file::setopt $win -details]
|
|
123
|
+
$data(cfgMenu) add radiobutton -label [mc "Detailed View"] \
|
|
124
|
+
-compound left -image $image -indicatoron 0 \
|
|
125
|
+
-selectimage ::ttk::dialog::image::radio16 \
|
|
126
|
+
-variable ::ttk::dialog::file::opt(-details) -value 1 \
|
|
127
|
+
-command [list ::ttk::dialog::file::setopt $win -details]
|
|
128
|
+
$data(cfgMenu) add separator
|
|
129
|
+
$data(cfgMenu) add checkbutton -label [mc "Show Hidden Files"] \
|
|
130
|
+
-image $image -selectimage $selimage -compound left \
|
|
131
|
+
-variable ::ttk::dialog::file::opt(-hidden) -indicatoron 0 \
|
|
132
|
+
-command [list ::ttk::dialog::file::setopt $win -hidden]
|
|
133
|
+
$data(cfgMenu) add checkbutton -label [mc "Separate Folders"] \
|
|
134
|
+
-image $image -selectimage $selimage -compound left \
|
|
135
|
+
-variable ::ttk::dialog::file::opt(-sepfolders) -indicatoron 0 \
|
|
136
|
+
-command [list ::ttk::dialog::file::setopt $win -sepfolders]
|
|
137
|
+
|
|
138
|
+
$data(sortMenu) add radiobutton -label [mc "By Name"] -compound left \
|
|
139
|
+
-image $image -selectimage ::ttk::dialog::image::radio16 \
|
|
140
|
+
-variable ::ttk::dialog::file::opt(-sort) -value name -indicatoron 0 \
|
|
141
|
+
-command [list ::ttk::dialog::file::setopt $win -sort]
|
|
142
|
+
$data(sortMenu) add radiobutton -label [mc "By Date"] -compound left \
|
|
143
|
+
-image $image -selectimage ::ttk::dialog::image::radio16 \
|
|
144
|
+
-variable ::ttk::dialog::file::opt(-sort) -value date -indicatoron 0 \
|
|
145
|
+
-command [list ::ttk::dialog::file::setopt $win -sort]
|
|
146
|
+
$data(sortMenu) add radiobutton -label [mc "By Size"] -compound left \
|
|
147
|
+
-image $image -selectimage ::ttk::dialog::image::radio16 \
|
|
148
|
+
-variable ::ttk::dialog::file::opt(-sort) -value size -indicatoron 0 \
|
|
149
|
+
-command [list ::ttk::dialog::file::setopt $win -sort]
|
|
150
|
+
$data(sortMenu) add separator
|
|
151
|
+
$data(sortMenu) add checkbutton -label [mc "Reverse"] \
|
|
152
|
+
-image $image -selectimage $selimage -compound left \
|
|
153
|
+
-variable ::ttk::dialog::file::opt(-reverse) -indicatoron 0 \
|
|
154
|
+
-command [list ::ttk::dialog::file::setopt $win -reverse]
|
|
155
|
+
$data(sortMenu) add checkbutton -label [mc "Folders First"] \
|
|
156
|
+
-image $image -selectimage $selimage -compound left \
|
|
157
|
+
-variable ::ttk::dialog::file::opt(-foldersfirst) -indicatoron 0 \
|
|
158
|
+
-command [list ::ttk::dialog::file::setopt $win -foldersfirst]
|
|
159
|
+
|
|
160
|
+
$data(prevBtn) state disabled
|
|
161
|
+
$data(nextBtn) state disabled
|
|
162
|
+
if {![info exists ::env(HOME)]} {
|
|
163
|
+
$data(homeBtn) state disabled
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
place $data(bgLabel) -relheight 1 -relwidth 1
|
|
167
|
+
|
|
168
|
+
pack $data(upBtn) -side left -fill y
|
|
169
|
+
pack $data(prevBtn) -side left -fill y
|
|
170
|
+
pack $data(nextBtn) -side left -fill y
|
|
171
|
+
pack $data(homeBtn) -side left -fill y
|
|
172
|
+
pack $data(reloadBtn) -side left -fill y
|
|
173
|
+
pack $data(newBtn) -side left -fill y
|
|
174
|
+
pack $data(cfgBtn) -side left -fill y
|
|
175
|
+
pack $data(dirMenuBtn) -side left -fill x -expand 1 -padx 8
|
|
176
|
+
|
|
177
|
+
# f2: the frame with the OK button, cancel button, "file name" field,
|
|
178
|
+
# and file types field.
|
|
179
|
+
#
|
|
180
|
+
set f2 [ttk::frame $w.f2]
|
|
181
|
+
ttk::label $f2.lab1 -text "[mc Location]:" -anchor w
|
|
182
|
+
set data(location) [ttk::combobox $f2.loc -validate key \
|
|
183
|
+
-validatecommand [list ::ttk::dialog::file::LocEdit $win %S]]
|
|
184
|
+
$data(location) configure \
|
|
185
|
+
-textvariable ::ttk::dialog::file::${dataName}(selectFile)
|
|
186
|
+
set data(typeMenuLab) [ttk::label $f2.lab2 -anchor w -text "[mc Filter]:"]
|
|
187
|
+
set data(typeMenuBtn) [ttk::combobox $f2.filter]
|
|
188
|
+
set data(okBtn) [ttk::button $f2.ok -text [mc OK] -default active \
|
|
189
|
+
-width 8 -style Slim.TButton \
|
|
190
|
+
-command [list ::ttk::dialog::file::Done $win]]
|
|
191
|
+
set data(cancelBtn) [ttk::button $f2.cancel -text [mc Cancel] -width 8 \
|
|
192
|
+
-style Slim.TButton -command [list ::ttk::dialog::file::Cancel $win]]
|
|
193
|
+
|
|
194
|
+
grid $f2.lab1 $f2.loc $data(okBtn) -padx 4 -pady 5 -sticky ew
|
|
195
|
+
grid $f2.lab2 $f2.filter $data(cancelBtn) -padx 4 -pady 5 -sticky ew
|
|
196
|
+
grid columnconfigure $f2 1 -weight 1
|
|
197
|
+
|
|
198
|
+
# f3: The file and directory lists
|
|
199
|
+
#
|
|
200
|
+
set f3 [ttk::panedwindow $w.f3 -orient horizontal]
|
|
201
|
+
array set fontinfo [font actual [[label $f3.dummy] cget -font]]
|
|
202
|
+
set font [maxfont $fontinfo(-family) 16]
|
|
203
|
+
destroy $f3.dummy
|
|
204
|
+
$f3 add [ttk::frame $f3.dir] -weight 0
|
|
205
|
+
ttk::label $f3.dir.bg -relief sunken
|
|
206
|
+
set data(dirArea) [text $f3.dir.t -bg white -width 20 -height 16 \
|
|
207
|
+
-font $font -bd 0 -highlightthickness 0 -cursor "" \
|
|
208
|
+
-wrap none -spacing1 1 -spacing3 1 -exportselection 0 \
|
|
209
|
+
-state disabled -yscrollcommand [list $f3.dir.y set] \
|
|
210
|
+
-xscrollcommand [list $f3.dir.x set]]
|
|
211
|
+
ttk::scrollbar $f3.dir.y -command [list $f3.dir.t yview]
|
|
212
|
+
ttk::scrollbar $f3.dir.x -command [list $f3.dir.t xview] -orient horizontal
|
|
213
|
+
grid $f3.dir.t $f3.dir.y -sticky ns
|
|
214
|
+
grid $f3.dir.x -sticky we
|
|
215
|
+
grid $f3.dir.bg -row 0 -column 0 -rowspan 2 -columnspan 2 -sticky news
|
|
216
|
+
grid $f3.dir.t -sticky news -padx {2 0} -pady {2 0}
|
|
217
|
+
grid columnconfigure $f3.dir 0 -weight 1
|
|
218
|
+
grid rowconfigure $f3.dir 0 -weight 1
|
|
219
|
+
|
|
220
|
+
$f3 add [ttk::frame $f3.file] -weight 1
|
|
221
|
+
|
|
222
|
+
# The short view version
|
|
223
|
+
#
|
|
224
|
+
set data(short) [ttk::frame $f3.file.short]
|
|
225
|
+
ttk::label $data(short).bg -relief sunken
|
|
226
|
+
set data(fileArea) [text $data(short).t -width 42 -height 16 -bg white \
|
|
227
|
+
-font $font -bd 0 -highlightthickness 0 -cursor "" -wrap none \
|
|
228
|
+
-spacing1 1 -spacing3 1 -exportselection 0 -state disabled \
|
|
229
|
+
-xscrollcommand [list ::ttk::dialog::file::scrollset $win]]
|
|
230
|
+
set data(xScroll) [ttk::scrollbar $data(short).x -orient horizontal \
|
|
231
|
+
-command [list ::ttk::dialog::file::xview $win]]
|
|
232
|
+
grid $data(short).t -sticky news -padx 2 -pady {2 0}
|
|
233
|
+
grid $data(short).x -sticky ew
|
|
234
|
+
grid $data(short).bg -row 0 -column 0 \
|
|
235
|
+
-rowspan 2 -columnspan 2 -sticky news
|
|
236
|
+
grid columnconfigure $data(short) 0 -weight 1
|
|
237
|
+
grid rowconfigure $data(short) 0 -weight 1
|
|
238
|
+
|
|
239
|
+
# The detailed view version
|
|
240
|
+
#
|
|
241
|
+
set data(long) [ttk::frame $f3.file.long]
|
|
242
|
+
ttk::label $data(long).bg -relief sunken
|
|
243
|
+
ttk::frame $data(long).f
|
|
244
|
+
set data(fileHdr) [frame $data(long).f.f]
|
|
245
|
+
ttk::label $data(fileHdr).l0 -style Toolbutton -anchor w -text [mc Name]
|
|
246
|
+
ttk::label $data(fileHdr).l1 -style Toolbutton -anchor w -text [mc Size]
|
|
247
|
+
ttk::label $data(fileHdr).l2 -style Toolbutton -anchor w -text [mc Date]
|
|
248
|
+
ttk::label $data(fileHdr).l3 \
|
|
249
|
+
-style Toolbutton -anchor w -text [mc Permissions]
|
|
250
|
+
ttk::label $data(fileHdr).l4 -style Toolbutton -anchor w -text [mc Owner]
|
|
251
|
+
ttk::label $data(fileHdr).l5 -style Toolbutton -anchor w -text [mc Group]
|
|
252
|
+
ttk::separator $data(fileHdr).s1 -orient vertical
|
|
253
|
+
ttk::separator $data(fileHdr).s2 -orient vertical
|
|
254
|
+
ttk::separator $data(fileHdr).s3 -orient vertical
|
|
255
|
+
ttk::separator $data(fileHdr).s4 -orient vertical
|
|
256
|
+
ttk::separator $data(fileHdr).s5 -orient vertical
|
|
257
|
+
set height [winfo reqheight $data(fileHdr).l1]
|
|
258
|
+
$data(long).f configure -height [expr {$height + 1}]
|
|
259
|
+
$data(fileHdr) configure -height $height
|
|
260
|
+
place $data(fileHdr) -x 1 -relwidth 1
|
|
261
|
+
place $data(fileHdr).l0 -x -1 -relwidth 1 -relheight 1
|
|
262
|
+
place $data(fileHdr).s1 -rely .1 -relheight .8 -anchor n
|
|
263
|
+
place $data(fileHdr).s2 -rely .1 -relheight .8 -anchor n
|
|
264
|
+
place $data(fileHdr).s3 -rely .1 -relheight .8 -anchor n
|
|
265
|
+
place $data(fileHdr).s4 -rely .1 -relheight .8 -anchor n
|
|
266
|
+
place $data(fileHdr).s5 -rely .1 -relheight .8 -anchor n
|
|
267
|
+
set data(fileList) [text $data(long).t -width 42 -height 12 -bg white \
|
|
268
|
+
-font $font -bd 0 -highlightthickness 0 -cursor "" -wrap none \
|
|
269
|
+
-spacing1 1 -spacing3 1 -exportselection 0 -state disabled \
|
|
270
|
+
-yscrollcommand [list $data(long).y set] \
|
|
271
|
+
-xscrollcommand [list ::ttk::dialog::file::scrollhdr $win]]
|
|
272
|
+
ttk::scrollbar $data(long).y -command [list $data(long).t yview]
|
|
273
|
+
ttk::scrollbar $data(long).x -orient horizontal \
|
|
274
|
+
-command [list $data(long).t xview]
|
|
275
|
+
grid $data(long).f $data(long).y -sticky ew -padx {2 0} -pady {2 0}
|
|
276
|
+
grid $data(long).t ^ -sticky news -padx {2 0}
|
|
277
|
+
grid $data(long).x -sticky ew
|
|
278
|
+
grid $data(long).y -sticky ns -padx 0 -pady 0
|
|
279
|
+
grid $data(long).bg -row 0 -column 0 \
|
|
280
|
+
-rowspan 3 -columnspan 2 -sticky news
|
|
281
|
+
grid columnconfigure $data(long) 0 -weight 1
|
|
282
|
+
grid rowconfigure $data(long) 1 -weight 1
|
|
283
|
+
|
|
284
|
+
grid $data(long) $data(short) -row 0 -column 0 -sticky news
|
|
285
|
+
grid columnconfigure $f3.file 0 -weight 1
|
|
286
|
+
grid rowconfigure $f3.file 0 -weight 1
|
|
287
|
+
|
|
288
|
+
# Get rid of the default Text bindings
|
|
289
|
+
bindtags $data(dirArea) [list $data(dirArea) FileDialogDir $win all]
|
|
290
|
+
bindtags $data(fileArea) [list $data(fileArea) FileDialogFile $win all]
|
|
291
|
+
bindtags $data(fileList) [list $data(fileList) FileDialogList $win all]
|
|
292
|
+
|
|
293
|
+
$data(fileArea) tag bind file <1> \
|
|
294
|
+
{set ::ttk::dialog::file::filetype file}
|
|
295
|
+
$data(fileArea) tag bind characterSpecial <1> \
|
|
296
|
+
{set ::ttk::dialog::file::filetype file}
|
|
297
|
+
$data(fileArea) tag bind blockSpecial <1> \
|
|
298
|
+
{set ::ttk::dialog::file::filetype file}
|
|
299
|
+
$data(fileArea) tag bind fifo <1> \
|
|
300
|
+
{set ::ttk::dialog::file::filetype file}
|
|
301
|
+
$data(fileArea) tag bind link <1> \
|
|
302
|
+
{set ::ttk::dialog::file::filetype link}
|
|
303
|
+
$data(fileArea) tag bind directory <1> \
|
|
304
|
+
{set ::ttk::dialog::file::filetype directory}
|
|
305
|
+
$data(fileList) tag bind file <1> \
|
|
306
|
+
{set ::ttk::dialog::file::filetype file}
|
|
307
|
+
$data(fileList) tag bind characterSpecial <1> \
|
|
308
|
+
{set ::ttk::dialog::file::filetype file}
|
|
309
|
+
$data(fileList) tag bind blockSpecial <1> \
|
|
310
|
+
{set ::ttk::dialog::file::filetype file}
|
|
311
|
+
$data(fileList) tag bind fifo <1> \
|
|
312
|
+
{set ::ttk::dialog::file::filetype file}
|
|
313
|
+
$data(fileList) tag bind link <1> \
|
|
314
|
+
{set ::ttk::dialog::file::filetype link}
|
|
315
|
+
$data(fileList) tag bind directory <1> \
|
|
316
|
+
{set ::ttk::dialog::file::filetype directory}
|
|
317
|
+
|
|
318
|
+
set data(paneWin) $f3
|
|
319
|
+
|
|
320
|
+
pack $f1 -side top -fill x
|
|
321
|
+
pack $f2 -side bottom -fill x -padx 8 -pady {0 5}
|
|
322
|
+
pack $f3 -side bottom -fill both -expand 1 -padx 8 -pady {6 0}
|
|
323
|
+
|
|
324
|
+
set data(columns) 0
|
|
325
|
+
set data(history) ""
|
|
326
|
+
set data(histpos) -1
|
|
327
|
+
set data(select) 0
|
|
328
|
+
|
|
329
|
+
update idletasks
|
|
330
|
+
pack propagate $w 0
|
|
331
|
+
|
|
332
|
+
wm protocol $win WM_DELETE_WINDOW [list $data(cancelBtn) invoke]
|
|
333
|
+
|
|
334
|
+
bind $win <Escape> [list $data(cancelBtn) invoke]
|
|
335
|
+
bind $data(fileArea) <Configure> [list ::ttk::dialog::file::configure $win]
|
|
336
|
+
bind $data(dirMenuBtn) <Return> [list ::ttk::dialog::file::chdir $win]
|
|
337
|
+
bind $data(dirMenuBtn) <<ComboboxSelected>> \
|
|
338
|
+
[list ::ttk::dialog::file::chdir $win]
|
|
339
|
+
bind $data(location) <Return> [list ::ttk::dialog::file::Done $win]
|
|
340
|
+
bind $data(typeMenuBtn) <Return> [list ::ttk::dialog::file::SetFilter $win]
|
|
341
|
+
bind $data(typeMenuBtn) <<ComboboxSelected>> \
|
|
342
|
+
[list ::ttk::dialog::file::SelectFilter $win]
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
proc ::ttk::dialog::file::ChangeDir {w dir} {
|
|
346
|
+
set dataName [winfo name $w]
|
|
347
|
+
upvar ::ttk::dialog::file::$dataName data
|
|
348
|
+
|
|
349
|
+
set data(history) [lrange $data(history) 0 $data(histpos)]
|
|
350
|
+
set cwd [lindex $data(history) $data(histpos)]
|
|
351
|
+
set data(selectPath) [file normalize [file join $cwd $dir]]
|
|
352
|
+
lappend data(history) $data(selectPath)
|
|
353
|
+
if {[incr data(histpos)]} {
|
|
354
|
+
$data(prevBtn) state !disabled
|
|
355
|
+
set data(selectFile) ""
|
|
356
|
+
}
|
|
357
|
+
$data(nextBtn) state disabled
|
|
358
|
+
|
|
359
|
+
UpdateWhenIdle $w
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
proc ::ttk::dialog::file::UpdateWhenIdle {w} {
|
|
363
|
+
upvar ::ttk::dialog::file::[winfo name $w] data
|
|
364
|
+
|
|
365
|
+
if {[info exists data(updateId)]} {
|
|
366
|
+
return
|
|
367
|
+
} elseif {[winfo ismapped $w]} {
|
|
368
|
+
set after idle
|
|
369
|
+
} else {
|
|
370
|
+
set after 1
|
|
371
|
+
}
|
|
372
|
+
set data(updateId) [after $after [list ::ttk::dialog::file::Update $w]]
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
proc ::ttk::dialog::file::Update {w} {
|
|
376
|
+
# This proc may be called within an idle handler. Make sure that the
|
|
377
|
+
# window has not been destroyed before this proc is called
|
|
378
|
+
if {![winfo exists $w]} return
|
|
379
|
+
|
|
380
|
+
set dataName [winfo name $w]
|
|
381
|
+
upvar ::ttk::dialog::file::$dataName data
|
|
382
|
+
unset -nocomplain data(updateId)
|
|
383
|
+
|
|
384
|
+
if {$data(-details)} {
|
|
385
|
+
grid $data(long)
|
|
386
|
+
grid remove $data(short)
|
|
387
|
+
} else {
|
|
388
|
+
grid $data(short)
|
|
389
|
+
grid remove $data(long)
|
|
390
|
+
}
|
|
391
|
+
if {$data(-sepfolders)} {
|
|
392
|
+
if {![llength [winfo manager $data(paneWin).dir]]} {
|
|
393
|
+
$data(paneWin) insert 0 $data(paneWin).dir
|
|
394
|
+
}
|
|
395
|
+
} else {
|
|
396
|
+
if {[llength [winfo manager $data(paneWin).dir]]} {
|
|
397
|
+
$data(paneWin) forget 0
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
$w configure -cursor watch
|
|
402
|
+
update
|
|
403
|
+
|
|
404
|
+
set dir ::ttk::dialog::image::folder
|
|
405
|
+
set file ::ttk::dialog::image::file
|
|
406
|
+
|
|
407
|
+
set cwd [lindex $data(history) $data(histpos)]
|
|
408
|
+
|
|
409
|
+
if {$data(-hidden)} {
|
|
410
|
+
set pattern "* .*"
|
|
411
|
+
} else {
|
|
412
|
+
set pattern "*"
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
# Make the directory list
|
|
416
|
+
if {[catch [linsert $pattern 0 glob -nocomplain -tails \
|
|
417
|
+
-directory $cwd -type d] list]} {
|
|
418
|
+
$w configure -cursor ""
|
|
419
|
+
tk_messageBox -icon warning -type ok -parent $w -message \
|
|
420
|
+
[mc {Cannot change to the directory "%s". Permission denied.} \
|
|
421
|
+
$cwd]
|
|
422
|
+
set data(history) [lreplace $data(history) \
|
|
423
|
+
$data(histpos) $data(histpos)]
|
|
424
|
+
if {$data(histpos) > 0} {incr data(histpos) -1}
|
|
425
|
+
return
|
|
426
|
+
}
|
|
427
|
+
set dlist ""
|
|
428
|
+
foreach f $list {
|
|
429
|
+
if {$f eq "."} continue
|
|
430
|
+
if {$f eq ".."} continue
|
|
431
|
+
lappend dlist [list $f dir]
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
# Make the file list
|
|
435
|
+
set flist ""
|
|
436
|
+
set filter $data(filter)
|
|
437
|
+
if {$filter eq "*"} {
|
|
438
|
+
set filter $pattern
|
|
439
|
+
}
|
|
440
|
+
foreach f [eval [linsert $filter 0 glob -nocomplain -tails \
|
|
441
|
+
-directory $cwd -type {f l c b p}]] {
|
|
442
|
+
# Links can still be directories. Skip those.
|
|
443
|
+
if {[file isdirectory [file join $cwd $f]]} continue
|
|
444
|
+
lappend flist [list $f file]
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
# Combine the two lists, if necessary
|
|
448
|
+
if {$data(-sepfolders)} {
|
|
449
|
+
set dlist [sort $w $dlist]
|
|
450
|
+
set flist [sort $w $flist]
|
|
451
|
+
} elseif {$data(-foldersfirst)} {
|
|
452
|
+
set flist [concat [sort $w $dlist] [sort $w $flist]]
|
|
453
|
+
set dlist ""
|
|
454
|
+
} else {
|
|
455
|
+
set flist [sort $w [concat $flist $dlist]]
|
|
456
|
+
set dlist ""
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
set t $data(dirArea)
|
|
460
|
+
$t configure -state normal
|
|
461
|
+
$t delete 1.0 end
|
|
462
|
+
foreach f $dlist {
|
|
463
|
+
$t image create end -image $dir
|
|
464
|
+
$t insert end " [lindex $f 0]\n"
|
|
465
|
+
}
|
|
466
|
+
$t delete end-1c end
|
|
467
|
+
$t configure -state disabled
|
|
468
|
+
|
|
469
|
+
if {$data(-details)} {
|
|
470
|
+
set data(list) $flist
|
|
471
|
+
::ttk::dialog::file::FileList1 $w
|
|
472
|
+
} else {
|
|
473
|
+
set t $data(fileArea)
|
|
474
|
+
set maxsize 50
|
|
475
|
+
set list ""
|
|
476
|
+
set font [$t cget -font]
|
|
477
|
+
foreach f $flist {
|
|
478
|
+
lassign $f name type
|
|
479
|
+
lappend list $name $type
|
|
480
|
+
set size [font measure $font " $name"]
|
|
481
|
+
if {$size > $maxsize} {
|
|
482
|
+
set maxsize $size
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
# Make sure maxsize is a multiple of an average size character
|
|
486
|
+
set dx [font measure $font 0]
|
|
487
|
+
set maxsize [expr {($maxsize + 20 + $dx) / $dx * $dx}]
|
|
488
|
+
$t configure -tabs $maxsize
|
|
489
|
+
set data(colwidth) $maxsize
|
|
490
|
+
set data(rows) [expr {[winfo height $t] / 18}]
|
|
491
|
+
set data(list) $list
|
|
492
|
+
::ttk::dialog::file::FileList2 $w
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
if {$cwd eq "/"} {
|
|
496
|
+
$data(upBtn) state disabled
|
|
497
|
+
} else {
|
|
498
|
+
$data(upBtn) state !disabled
|
|
499
|
+
}
|
|
500
|
+
$w configure -cursor ""
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
# Create a detailed file list
|
|
504
|
+
proc ::ttk::dialog::file::FileList1 {w} {
|
|
505
|
+
set dataName [winfo name $w]
|
|
506
|
+
upvar ::ttk::dialog::file::$dataName data
|
|
507
|
+
|
|
508
|
+
set dir ::ttk::dialog::image::folder
|
|
509
|
+
set file ::ttk::dialog::image::file
|
|
510
|
+
|
|
511
|
+
set cwd [lindex $data(history) $data(histpos)]
|
|
512
|
+
|
|
513
|
+
set t $data(fileList)
|
|
514
|
+
$t configure -state normal
|
|
515
|
+
$t delete 1.0 end
|
|
516
|
+
set size "";set date "";set mode "";set uid "";set gid ""
|
|
517
|
+
set files {}
|
|
518
|
+
set maxsize 50
|
|
519
|
+
set font [$t cget -font]
|
|
520
|
+
foreach f $data(list) {
|
|
521
|
+
lassign $f name type size date mode uid gid
|
|
522
|
+
if {![info exists users($uid)] || ![info exists groups($gid)]} {
|
|
523
|
+
set fname [file join $cwd $name]
|
|
524
|
+
# May fail for dead links
|
|
525
|
+
if {![catch {array set attr [file attributes $fname]}]} {
|
|
526
|
+
if {[info exists attr(-owner)]} {
|
|
527
|
+
set users($uid) $attr(-owner)
|
|
528
|
+
} else {
|
|
529
|
+
set users($uid) ""
|
|
530
|
+
}
|
|
531
|
+
if {[info exists attr(-group)]} {
|
|
532
|
+
set groups($gid) $attr(-group)
|
|
533
|
+
} else {
|
|
534
|
+
set groups($gid) ""
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
catch {set uid $users($uid)}
|
|
539
|
+
catch {set gid $groups($gid)}
|
|
540
|
+
set image [expr {$type eq "directory" ? $dir : $file}]
|
|
541
|
+
set img [$t image create end -image $image]
|
|
542
|
+
$t tag add name $img
|
|
543
|
+
$t tag add $type $img
|
|
544
|
+
$t insert end " $name" [list name $type]
|
|
545
|
+
$t insert end "\t$size\t" $type
|
|
546
|
+
$t insert end "[datefmt $date]\t" $type
|
|
547
|
+
$t insert end "[modefmt $type $mode]\t" $type
|
|
548
|
+
$t insert end "$uid\t$gid\t\n" $type
|
|
549
|
+
set size [font measure $font " $name"]
|
|
550
|
+
if {$size > $maxsize} {set maxsize $size}
|
|
551
|
+
lappend files $name
|
|
552
|
+
}
|
|
553
|
+
$t delete end-1c end
|
|
554
|
+
$t configure -state disabled
|
|
555
|
+
set today [datefmt [clock seconds]]
|
|
556
|
+
set maxu [winfo reqwidth $data(fileHdr).l4]
|
|
557
|
+
foreach n [array names users] {
|
|
558
|
+
set size [font measure $font $users($n)]
|
|
559
|
+
if {$size > $maxu} {set maxu $size}
|
|
560
|
+
}
|
|
561
|
+
set maxg [winfo reqwidth $data(fileHdr).l5]
|
|
562
|
+
foreach n [array names groups] {
|
|
563
|
+
set size [font measure $font $groups($n)]
|
|
564
|
+
if {$size > $maxg} {set maxg $size}
|
|
565
|
+
}
|
|
566
|
+
set tabs [list [set x [incr maxsize 22]]]
|
|
567
|
+
lappend tabs [incr x [font measure $font 1000000000]] \
|
|
568
|
+
[incr x [font measure $font " $today "]] \
|
|
569
|
+
[incr x [font measure $font [modefmt w 0777]]] \
|
|
570
|
+
[incr x [incr maxu 8]] [incr x [incr maxg 8]]
|
|
571
|
+
$t configure -tabs $tabs
|
|
572
|
+
set i 1
|
|
573
|
+
foreach n $tabs {
|
|
574
|
+
place $data(fileHdr).l$i -x $n
|
|
575
|
+
place $data(fileHdr).s$i -x $n
|
|
576
|
+
if {[incr i] > 5} break
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
# Reselect the files the user selected before
|
|
580
|
+
if {$data(select)} {
|
|
581
|
+
if {$data(-multiple)} {
|
|
582
|
+
set select $data(selectFile)
|
|
583
|
+
} else {
|
|
584
|
+
set select [list $data(selectFile)]
|
|
585
|
+
}
|
|
586
|
+
foreach file $select {
|
|
587
|
+
set row [lsearch -exact $files $file]
|
|
588
|
+
if {$row < 0} continue
|
|
589
|
+
foreach {m1 m2} [$t tag nextrange name [incr row].0] {
|
|
590
|
+
$t tag add sel "$m1 + 2c" $m2
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
# Create a short file list
|
|
597
|
+
proc ::ttk::dialog::file::FileList2 {w} {
|
|
598
|
+
set dataName [winfo name $w]
|
|
599
|
+
upvar ::ttk::dialog::file::$dataName data
|
|
600
|
+
|
|
601
|
+
set dir ::ttk::dialog::image::folder
|
|
602
|
+
set file ::ttk::dialog::image::file
|
|
603
|
+
|
|
604
|
+
set t $data(fileArea)
|
|
605
|
+
set lines $data(rows)
|
|
606
|
+
set row 1;set col 0
|
|
607
|
+
set coltag column$col
|
|
608
|
+
set files {}
|
|
609
|
+
$t configure -state normal
|
|
610
|
+
$t delete 1.0 end
|
|
611
|
+
foreach {name type} $data(list) {
|
|
612
|
+
set idx $row.end
|
|
613
|
+
set image [expr {$type eq "directory" ? $dir : $file}]
|
|
614
|
+
set img [$t image create $idx -image $image]
|
|
615
|
+
$t tag add $type $img
|
|
616
|
+
$t tag add name $img
|
|
617
|
+
$t insert $idx " $name" [list name $type $coltag] "\t" $type
|
|
618
|
+
lappend files $name
|
|
619
|
+
if {[incr row] > $lines} {
|
|
620
|
+
set coltag column[incr col]
|
|
621
|
+
set row 1
|
|
622
|
+
} elseif {$col == 0} {
|
|
623
|
+
$t insert $idx "\n"
|
|
624
|
+
}
|
|
625
|
+
}
|
|
626
|
+
$t insert 1.end "\t"
|
|
627
|
+
$t configure -state disabled
|
|
628
|
+
set data(columns) [expr {$row > 1 ? $col + 1 : $col}]
|
|
629
|
+
|
|
630
|
+
# Should possibly restore the position of the last clicked file?
|
|
631
|
+
$t mark unset lastpos
|
|
632
|
+
|
|
633
|
+
# Reselect the files the user selected before
|
|
634
|
+
if {$data(select)} {
|
|
635
|
+
if {$data(-multiple)} {
|
|
636
|
+
set select $data(selectFile)
|
|
637
|
+
} else {
|
|
638
|
+
set select [list $data(selectFile)]
|
|
639
|
+
}
|
|
640
|
+
foreach file $select {
|
|
641
|
+
set x [lsearch -exact $files $file]
|
|
642
|
+
if {$x < 0} continue
|
|
643
|
+
set row [expr {$x % $lines + 1}]
|
|
644
|
+
set col [expr {$x / $lines}]
|
|
645
|
+
foreach {m1 m2} [$t tag nextrange column$col $row.0] {
|
|
646
|
+
$t tag add sel "$m1 + 1c" $m2
|
|
647
|
+
}
|
|
648
|
+
}
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
|
|
652
|
+
proc ::ttk::dialog::file::LocEdit {w str} {
|
|
653
|
+
# This proc is called when a user edits the Location field
|
|
654
|
+
set dataName [winfo name $w]
|
|
655
|
+
upvar ::ttk::dialog::file::$dataName data
|
|
656
|
+
|
|
657
|
+
$data(fileArea) tag remove sel 1.0 end
|
|
658
|
+
set data(select) 0
|
|
659
|
+
|
|
660
|
+
return 1
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
proc ::ttk::dialog::file::sort {w list} {
|
|
664
|
+
set dataName [winfo name $w]
|
|
665
|
+
upvar ::ttk::dialog::file::$dataName data
|
|
666
|
+
|
|
667
|
+
set cwd [lindex $data(history) $data(histpos)]
|
|
668
|
+
set order [expr {$data(-reverse) ? "-decreasing" : "-increasing"}]
|
|
669
|
+
set newlist ""
|
|
670
|
+
foreach f $list {
|
|
671
|
+
set file [lindex $f 0]
|
|
672
|
+
# Use lstat in case the destination doesn't exists
|
|
673
|
+
file lstat [file join $cwd $file] stat
|
|
674
|
+
if {$stat(type) eq "link"} {
|
|
675
|
+
# This may fail if the link points to nothing
|
|
676
|
+
if {![catch {file stat [file join $cwd $file] dest}]} {
|
|
677
|
+
array set stat [array get dest]
|
|
678
|
+
if {$stat(type) eq "file"} {
|
|
679
|
+
set stat(type) link
|
|
680
|
+
}
|
|
681
|
+
}
|
|
682
|
+
}
|
|
683
|
+
lappend newlist [list $file $stat(type) $stat(size) \
|
|
684
|
+
$stat(mtime) $stat(mode) $stat(uid) $stat(gid)]
|
|
685
|
+
}
|
|
686
|
+
switch -- $data(-sort) {
|
|
687
|
+
size {
|
|
688
|
+
set mode -integer
|
|
689
|
+
set idx 2
|
|
690
|
+
}
|
|
691
|
+
date {
|
|
692
|
+
set mode -integer
|
|
693
|
+
set idx 3
|
|
694
|
+
}
|
|
695
|
+
default {
|
|
696
|
+
set mode -dictionary
|
|
697
|
+
set idx 0
|
|
698
|
+
}
|
|
699
|
+
}
|
|
700
|
+
lsort $order $mode -index $idx $newlist
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
proc ::ttk::dialog::file::datefmt {str} {
|
|
704
|
+
clock format $str -format {%d-%m-%Y %H:%M}
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
proc ::ttk::dialog::file::modefmt {type mode} {
|
|
708
|
+
switch $type {
|
|
709
|
+
file {set rc -}
|
|
710
|
+
default {set rc [string index $type 0]}
|
|
711
|
+
}
|
|
712
|
+
binary scan [binary format I $mode] B* bits
|
|
713
|
+
foreach b [split [string range $bits end-8 end] ""] \
|
|
714
|
+
c {r w x r w x r w x} {
|
|
715
|
+
if {$b} {append rc $c} else {append rc -}
|
|
716
|
+
}
|
|
717
|
+
set rc
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
proc ::ttk::dialog::file::xview {w cmd number {units ""}} {
|
|
721
|
+
set dataName [winfo name $w]
|
|
722
|
+
upvar ::ttk::dialog::file::$dataName data
|
|
723
|
+
|
|
724
|
+
set width [winfo width $data(fileArea)]
|
|
725
|
+
lassign [$data(fileArea) xview] pos1 pos2
|
|
726
|
+
set cols $data(columns)
|
|
727
|
+
set page [expr {int($width / $data(colwidth))}]
|
|
728
|
+
if {!$page} {set page 1}
|
|
729
|
+
|
|
730
|
+
switch $cmd {
|
|
731
|
+
scroll {
|
|
732
|
+
set col [expr {round($pos1 * ($cols + 1))}]
|
|
733
|
+
if {[string match p* $units]} {
|
|
734
|
+
incr col [expr {$number * $page}]
|
|
735
|
+
} else {
|
|
736
|
+
incr col $number
|
|
737
|
+
}
|
|
738
|
+
}
|
|
739
|
+
moveto {
|
|
740
|
+
set col [expr {round($number * $cols)}]
|
|
741
|
+
}
|
|
742
|
+
}
|
|
743
|
+
set max [expr {$cols - $page}]
|
|
744
|
+
if {$col > $max} {set col $max}
|
|
745
|
+
if {$col < 0} {set col 0}
|
|
746
|
+
set pos [expr {double($col) / ($cols + 1)}]
|
|
747
|
+
$data(fileArea) xview moveto $pos
|
|
748
|
+
}
|
|
749
|
+
|
|
750
|
+
proc ::ttk::dialog::file::scrollset {w first last} {
|
|
751
|
+
set dataName [winfo name $w]
|
|
752
|
+
upvar ::ttk::dialog::file::$dataName data
|
|
753
|
+
|
|
754
|
+
if {$data(columns)} {
|
|
755
|
+
if {$last >= 0.999} {
|
|
756
|
+
xview $w scroll -1 units
|
|
757
|
+
return
|
|
758
|
+
}
|
|
759
|
+
set w $data(colwidth)
|
|
760
|
+
set cols $data(columns)
|
|
761
|
+
set width [winfo width $data(fileArea)]
|
|
762
|
+
if {$w > $width} {set w $width}
|
|
763
|
+
set vwidth [expr {$width % $w + $cols * $w}]
|
|
764
|
+
set total [expr {$width / ($last - $first)}]
|
|
765
|
+
set first [expr {$first * $total / $vwidth}]
|
|
766
|
+
set last [expr {$last * $total / $vwidth}]
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
$data(xScroll) set $first $last
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
proc ::ttk::dialog::file::scrollhdr {w first last} {
|
|
773
|
+
set dataName [winfo name $w]
|
|
774
|
+
upvar ::ttk::dialog::file::$dataName data
|
|
775
|
+
|
|
776
|
+
lassign [$data(fileList) dlineinfo @0,0] x y width height base
|
|
777
|
+
place $data(fileHdr) -x $x -width $width
|
|
778
|
+
$data(long).x set $first $last
|
|
779
|
+
}
|
|
780
|
+
|
|
781
|
+
proc ::ttk::dialog::file::configure {w} {
|
|
782
|
+
set dataName [winfo name $w]
|
|
783
|
+
upvar ::ttk::dialog::file::$dataName data
|
|
784
|
+
|
|
785
|
+
if {$data(columns) == 0} return
|
|
786
|
+
|
|
787
|
+
set h [winfo height $data(fileArea)]
|
|
788
|
+
set rows [expr {$h / 18}]
|
|
789
|
+
if {$rows != $data(rows)} {
|
|
790
|
+
set data(rows) $rows
|
|
791
|
+
::ttk::dialog::file::FileList2 $w
|
|
792
|
+
}
|
|
793
|
+
}
|
|
794
|
+
|
|
795
|
+
proc ::ttk::dialog::file::setopt {w option} {
|
|
796
|
+
set dataName [winfo name $w]
|
|
797
|
+
upvar ::ttk::dialog::file::$dataName data
|
|
798
|
+
variable opt
|
|
799
|
+
|
|
800
|
+
set data($option) $opt($option)
|
|
801
|
+
UpdateWhenIdle $w
|
|
802
|
+
}
|
|
803
|
+
|
|
804
|
+
proc ::ttk::dialog::file::maxfont {family max} {
|
|
805
|
+
set size [expr {2 - $max}]
|
|
806
|
+
while {[font metrics [list $family $size] -linespace] > $max} {
|
|
807
|
+
if {[incr size] > -8} break
|
|
808
|
+
}
|
|
809
|
+
return [list $family $size]
|
|
810
|
+
}
|
|
811
|
+
|
|
812
|
+
proc ::ttk::dialog::file::UpDirCmd {w} {
|
|
813
|
+
set dataName [winfo name $w]
|
|
814
|
+
upvar ::ttk::dialog::file::$dataName data
|
|
815
|
+
|
|
816
|
+
ChangeDir $w [file dirname [lindex $data(history) $data(histpos)]]
|
|
817
|
+
}
|
|
818
|
+
|
|
819
|
+
proc ::ttk::dialog::file::PrevDirCmd {w} {
|
|
820
|
+
set dataName [winfo name $w]
|
|
821
|
+
upvar ::ttk::dialog::file::$dataName data
|
|
822
|
+
|
|
823
|
+
# set data(selectFile) ""
|
|
824
|
+
incr data(histpos) -1
|
|
825
|
+
set data(selectPath) [lindex $data(history) $data(histpos)]
|
|
826
|
+
$data(nextBtn) state !disabled
|
|
827
|
+
if {!$data(histpos)} {
|
|
828
|
+
$data(prevBtn) state disabled
|
|
829
|
+
}
|
|
830
|
+
Update $w
|
|
831
|
+
}
|
|
832
|
+
|
|
833
|
+
proc ::ttk::dialog::file::NextDirCmd {w} {
|
|
834
|
+
set dataName [winfo name $w]
|
|
835
|
+
upvar ::ttk::dialog::file::$dataName data
|
|
836
|
+
|
|
837
|
+
# set data(selectFile) ""
|
|
838
|
+
incr data(histpos)
|
|
839
|
+
set data(selectPath) [lindex $data(history) $data(histpos)]
|
|
840
|
+
$data(prevBtn) state !disabled
|
|
841
|
+
if {$data(histpos) >= [llength $data(history)] - 1} {
|
|
842
|
+
$data(nextBtn) state disabled
|
|
843
|
+
}
|
|
844
|
+
Update $w
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
proc ::ttk::dialog::file::HomeDirCmd {w} {
|
|
848
|
+
ChangeDir $w ~
|
|
849
|
+
}
|
|
850
|
+
|
|
851
|
+
proc ::ttk::dialog::file::NewDirCmd {win} {
|
|
852
|
+
set dataName [winfo name $win]
|
|
853
|
+
upvar ::ttk::dialog::file::$dataName data
|
|
854
|
+
|
|
855
|
+
set dir [lindex $data(history) $data(histpos)]
|
|
856
|
+
|
|
857
|
+
toplevel $win.new
|
|
858
|
+
wm title $win.new [mc "New Folder"]
|
|
859
|
+
set w [ttk::frame $win.new.f]
|
|
860
|
+
pack $w -expand 1 -fill both
|
|
861
|
+
|
|
862
|
+
ttk::label $w.prompt -anchor w -justify left \
|
|
863
|
+
-text [mc "Create new folder in"]:\n$dir
|
|
864
|
+
ttk::entry $w.box -width 36 -validate all \
|
|
865
|
+
-validatecommand [list ::ttk::dialog::file::NewDirVCmd $w %P]
|
|
866
|
+
ttk::separator $w.sep
|
|
867
|
+
set f [ttk::frame $w.buttons]
|
|
868
|
+
ttk::button $f.clear -text [mc Clear] -takefocus 0 \
|
|
869
|
+
-command [list $w.box delete 0 end]
|
|
870
|
+
ttk::button $f.ok -text [mc OK] -default active \
|
|
871
|
+
-command [list ::ttk::dialog::file::NewDirExit $win 1]
|
|
872
|
+
ttk::button $f.cancel -text [mc Cancel] \
|
|
873
|
+
-command [list ::ttk::dialog::file::NewDirExit $win]
|
|
874
|
+
grid $f.clear $f.ok $f.cancel -padx 4 -pady {0 10} -sticky we
|
|
875
|
+
grid columnconfigure $f {0 1 2} -uniform 1
|
|
876
|
+
pack $w.prompt $w.box $w.sep $f \
|
|
877
|
+
-side top -padx 12 -pady 3 -anchor w -fill x
|
|
878
|
+
pack $w.prompt -pady {12 0}
|
|
879
|
+
pack $f -anchor e -fill none -padx 8
|
|
880
|
+
wm transient $win.new $win
|
|
881
|
+
wm resizable $win.new 0 0
|
|
882
|
+
wm protocol $win.new WM_DELETE_WINDOW [list $f.cancel invoke]
|
|
883
|
+
|
|
884
|
+
bind $w.box <Return> [list $f.ok invoke]
|
|
885
|
+
|
|
886
|
+
::tk::PlaceWindow $win.new widget $win
|
|
887
|
+
::tk::SetFocusGrab $win.new $w.box
|
|
888
|
+
}
|
|
889
|
+
|
|
890
|
+
proc ::ttk::dialog::file::NewDirVCmd {w str} {
|
|
891
|
+
if {$str ne ""} {
|
|
892
|
+
$w.buttons.ok state !disabled
|
|
893
|
+
$w.buttons.clear state !disabled
|
|
894
|
+
} else {
|
|
895
|
+
$w.buttons.ok state disabled
|
|
896
|
+
$w.buttons.clear state disabled
|
|
897
|
+
}
|
|
898
|
+
return 1
|
|
899
|
+
}
|
|
900
|
+
|
|
901
|
+
proc ::ttk::dialog::file::NewDirExit {w {save 0}} {
|
|
902
|
+
upvar ::ttk::dialog::file::[winfo name $w] data
|
|
903
|
+
|
|
904
|
+
if {$save} {
|
|
905
|
+
set dir [lindex $data(history) $data(histpos)]
|
|
906
|
+
set newdir [file join $dir [$w.new.f.box get]]
|
|
907
|
+
if {[catch {file mkdir $newdir} err]} {
|
|
908
|
+
tk_messageBox -type ok -parent $w.new -icon error -message "$err"
|
|
909
|
+
return
|
|
910
|
+
} else {
|
|
911
|
+
ChangeDir $w $newdir
|
|
912
|
+
}
|
|
913
|
+
}
|
|
914
|
+
destroy $w.new
|
|
915
|
+
::tk::RestoreFocusGrab $w.new $w.new.f.box
|
|
916
|
+
}
|
|
917
|
+
|
|
918
|
+
proc ::ttk::dialog::file::Cancel {w} {
|
|
919
|
+
variable selectFilePath ""
|
|
920
|
+
}
|
|
921
|
+
|
|
922
|
+
proc ::ttk::dialog::file::Done {w} {
|
|
923
|
+
variable selectFilePath
|
|
924
|
+
variable filelist
|
|
925
|
+
set dataName [winfo name $w]
|
|
926
|
+
upvar ::ttk::dialog::file::$dataName data
|
|
927
|
+
|
|
928
|
+
if {$data(selectFile) eq "" || $data(selectFile) eq "."} {
|
|
929
|
+
return -code break
|
|
930
|
+
}
|
|
931
|
+
|
|
932
|
+
set cwd [lindex $data(history) $data(histpos)]
|
|
933
|
+
set path ""
|
|
934
|
+
if {$data(-multiple) && ![catch {llength $data(selectFile)}]} {
|
|
935
|
+
foreach file $data(selectFile) {
|
|
936
|
+
if {[file extension $file] eq ""} {
|
|
937
|
+
append file $data(-defaultextension)
|
|
938
|
+
}
|
|
939
|
+
lappend path [file join $cwd $file]
|
|
940
|
+
}
|
|
941
|
+
} else {
|
|
942
|
+
set file [file join $cwd $data(selectFile)]
|
|
943
|
+
if {[file extension $file] eq ""} {
|
|
944
|
+
append file $data(-defaultextension)
|
|
945
|
+
}
|
|
946
|
+
set path [list $file]
|
|
947
|
+
}
|
|
948
|
+
|
|
949
|
+
set missing ""
|
|
950
|
+
foreach file $path {
|
|
951
|
+
if {[file isdirectory $file]} {
|
|
952
|
+
set data(selectFile) ""
|
|
953
|
+
ChangeDir $w $file
|
|
954
|
+
return -code break
|
|
955
|
+
}
|
|
956
|
+
if {![file exists $file]} {
|
|
957
|
+
lappend missing $file
|
|
958
|
+
}
|
|
959
|
+
}
|
|
960
|
+
|
|
961
|
+
if {[llength $missing]} {
|
|
962
|
+
if {$data(type) eq "open"} {
|
|
963
|
+
if {[llength $missing] > 1} {
|
|
964
|
+
set str {Files %s do not exist.}
|
|
965
|
+
} else {
|
|
966
|
+
set str {File "%s" does not exist.}
|
|
967
|
+
}
|
|
968
|
+
tk_messageBox -icon warning -type ok -parent $w \
|
|
969
|
+
-message [mc $str [join $missing {, }]]
|
|
970
|
+
return
|
|
971
|
+
}
|
|
972
|
+
} else {
|
|
973
|
+
if {$data(type) eq "save"} {
|
|
974
|
+
set str {File "%s" already exists. Do you want to overwrite it?}
|
|
975
|
+
set reply [tk_messageBox -parent $w -icon warning -type yesno \
|
|
976
|
+
-message [mc $str [lindex $path 0]]]
|
|
977
|
+
if {$reply eq "no"} {return}
|
|
978
|
+
}
|
|
979
|
+
}
|
|
980
|
+
|
|
981
|
+
foreach file $path {
|
|
982
|
+
set filelist [lsearch -exact -all -inline -not $filelist $file]
|
|
983
|
+
set filelist [linsert $filelist 0 $file]
|
|
984
|
+
}
|
|
985
|
+
if {$data(-multiple)} {
|
|
986
|
+
set selectFilePath $path
|
|
987
|
+
} else {
|
|
988
|
+
set selectFilePath [lindex $path 0]
|
|
989
|
+
}
|
|
990
|
+
return -code break
|
|
991
|
+
}
|
|
992
|
+
|
|
993
|
+
proc ::ttk::dialog::file::chdir {w} {
|
|
994
|
+
upvar ::ttk::dialog::file::[winfo name $w] data
|
|
995
|
+
|
|
996
|
+
set dir $data(selectPath)
|
|
997
|
+
if {[file isdirectory $dir]} {
|
|
998
|
+
ChangeDir $w $dir
|
|
999
|
+
} else {
|
|
1000
|
+
set str {Cannot change to the directory "%s". Permission denied.}
|
|
1001
|
+
tk_messageBox -type ok -parent $w -icon warning \
|
|
1002
|
+
-message [mc $str $data(selectPath)]
|
|
1003
|
+
}
|
|
1004
|
+
return -code break
|
|
1005
|
+
}
|
|
1006
|
+
|
|
1007
|
+
proc ::ttk::dialog::file::SelectFilter {w} {
|
|
1008
|
+
upvar ::ttk::dialog::file::[winfo name $w] data
|
|
1009
|
+
|
|
1010
|
+
set data(filter) [lindex $data(-filetypes) \
|
|
1011
|
+
[$data(typeMenuBtn) current] 1]
|
|
1012
|
+
set data(typevar) [lindex $data(-filetypes) \
|
|
1013
|
+
[$data(typeMenuBtn) current] 0]
|
|
1014
|
+
::ttk::dialog::file::UpdateWhenIdle $w
|
|
1015
|
+
}
|
|
1016
|
+
|
|
1017
|
+
proc ::ttk::dialog::file::SetFilter {w} {
|
|
1018
|
+
upvar ::ttk::dialog::file::[winfo name $w] data
|
|
1019
|
+
|
|
1020
|
+
set data(filter) [$data(typeMenuBtn) get]
|
|
1021
|
+
set data(typevar) ""
|
|
1022
|
+
::ttk::dialog::file::UpdateWhenIdle $w
|
|
1023
|
+
return -code break
|
|
1024
|
+
}
|
|
1025
|
+
|
|
1026
|
+
proc ::ttk::dialog::file::DirButton1 {w x y} {
|
|
1027
|
+
scan [$w index @$x,$y] %d.%d line char
|
|
1028
|
+
$w tag remove sel 1.0 end
|
|
1029
|
+
$w tag add sel $line.2 $line.end
|
|
1030
|
+
}
|
|
1031
|
+
|
|
1032
|
+
proc ::ttk::dialog::file::DirRelease1 {w x y} {
|
|
1033
|
+
set top [winfo toplevel $w]
|
|
1034
|
+
$top configure -cursor ""
|
|
1035
|
+
}
|
|
1036
|
+
|
|
1037
|
+
proc ::ttk::dialog::file::DirRelease1 {w x y} {
|
|
1038
|
+
set top [winfo toplevel $w]
|
|
1039
|
+
if {[$top cget -cursor] ne ""} {
|
|
1040
|
+
# The mouse has been moved, don't perform the action
|
|
1041
|
+
$top configure -cursor ""
|
|
1042
|
+
} elseif {[llength [$w tag ranges sel]]} {
|
|
1043
|
+
set dir [$w get sel.first sel.last]
|
|
1044
|
+
ChangeDir [winfo toplevel $w] $dir
|
|
1045
|
+
}
|
|
1046
|
+
}
|
|
1047
|
+
|
|
1048
|
+
proc ::ttk::dialog::file::DirMotion1 {w x y} {
|
|
1049
|
+
[winfo toplevel $w] configure -cursor "X_cursor #C00 #000"
|
|
1050
|
+
}
|
|
1051
|
+
|
|
1052
|
+
proc ::ttk::dialog::file::FileButton1 {w x y} {
|
|
1053
|
+
set dataName [winfo name [winfo toplevel $w]]
|
|
1054
|
+
upvar ::ttk::dialog::file::$dataName data
|
|
1055
|
+
variable filetype
|
|
1056
|
+
|
|
1057
|
+
if {$filetype eq "none"} return
|
|
1058
|
+
|
|
1059
|
+
set range [$w tag prevrange name @$x,$y+1c "@$x,$y linestart"]
|
|
1060
|
+
$w mark set lastpos @$x,$y
|
|
1061
|
+
|
|
1062
|
+
if {[llength $range]} {
|
|
1063
|
+
lassign $range index1 index2
|
|
1064
|
+
$w tag remove sel 1.0 end
|
|
1065
|
+
$w tag add sel $index1+2c $index2
|
|
1066
|
+
set data(select) 1
|
|
1067
|
+
if {$filetype ne "file" && $filetype ne "link"} {
|
|
1068
|
+
} elseif {$data(-multiple)} {
|
|
1069
|
+
set data(selectFile) [list [$w get sel.first sel.last]]
|
|
1070
|
+
} else {
|
|
1071
|
+
set data(selectFile) [$w get sel.first sel.last]
|
|
1072
|
+
}
|
|
1073
|
+
}
|
|
1074
|
+
}
|
|
1075
|
+
|
|
1076
|
+
proc ::ttk::dialog::file::FileRelease1 {w x y} {
|
|
1077
|
+
set dataName [winfo name [winfo toplevel $w]]
|
|
1078
|
+
upvar ::ttk::dialog::file::$dataName data
|
|
1079
|
+
variable filetype
|
|
1080
|
+
|
|
1081
|
+
set top [winfo toplevel $w]
|
|
1082
|
+
if {[$top cget -cursor] ne ""} {
|
|
1083
|
+
# The mouse has been moved, don't perform the action
|
|
1084
|
+
$top configure -cursor ""
|
|
1085
|
+
} elseif {$filetype ne "directory"} {
|
|
1086
|
+
# A file was selected
|
|
1087
|
+
} elseif {[llength [$w tag ranges sel]]} {
|
|
1088
|
+
set dir [$w get sel.first sel.last]
|
|
1089
|
+
ChangeDir [winfo toplevel $w] $dir
|
|
1090
|
+
}
|
|
1091
|
+
[winfo toplevel $w] configure -cursor ""
|
|
1092
|
+
set filetype none
|
|
1093
|
+
}
|
|
1094
|
+
|
|
1095
|
+
proc ::ttk::dialog::file::FileMotion1 {w x y} {
|
|
1096
|
+
[winfo toplevel $w] configure -cursor "X_cursor #C00 #000"
|
|
1097
|
+
}
|
|
1098
|
+
|
|
1099
|
+
proc ::ttk::dialog::file::FileControl1 {w x y} {
|
|
1100
|
+
set dataName [winfo name [winfo toplevel $w]]
|
|
1101
|
+
upvar ::ttk::dialog::file::$dataName data
|
|
1102
|
+
variable filetype
|
|
1103
|
+
|
|
1104
|
+
if {!$data(-multiple) || $filetype eq "none"} return
|
|
1105
|
+
if {$filetype ne "file" && $filetype ne "link"} return
|
|
1106
|
+
|
|
1107
|
+
set range [$w tag prevrange name @$x,$y+1c "@$x,$y linestart"]
|
|
1108
|
+
$w mark set lastpos @$x,$y
|
|
1109
|
+
|
|
1110
|
+
if {[llength $range]} {
|
|
1111
|
+
lassign $range index1 index2
|
|
1112
|
+
if {[lsearch [$w tag names @$x,$y] sel] < 0} {
|
|
1113
|
+
$w tag add sel $index1+2c $index2
|
|
1114
|
+
} else {
|
|
1115
|
+
$w tag remove sel $index1+2c $index2
|
|
1116
|
+
}
|
|
1117
|
+
set data(select) 1
|
|
1118
|
+
set files {};foreach {first last} [$w tag ranges sel] {
|
|
1119
|
+
lappend files [$w get $first $last]
|
|
1120
|
+
}
|
|
1121
|
+
set data(selectFile) [lsort -dictionary $files]
|
|
1122
|
+
}
|
|
1123
|
+
}
|
|
1124
|
+
|
|
1125
|
+
proc ::ttk::dialog::file::FileShift1 {w x y} {
|
|
1126
|
+
set dataName [winfo name [winfo toplevel $w]]
|
|
1127
|
+
upvar ::ttk::dialog::file::$dataName data
|
|
1128
|
+
variable filetype
|
|
1129
|
+
|
|
1130
|
+
if {!$data(-multiple) || $filetype eq "none"} return
|
|
1131
|
+
|
|
1132
|
+
set m1 [$w index @$x,$y]
|
|
1133
|
+
if {[catch {$w index lastpos} m2]} {
|
|
1134
|
+
set m2 $m1
|
|
1135
|
+
}
|
|
1136
|
+
set row1 [lindex [split $m1 .] 0]
|
|
1137
|
+
set col1 [llength [split [$w get $row1.0 $m1] \t]]
|
|
1138
|
+
set row2 [lindex [split $m2 .] 0]
|
|
1139
|
+
set col2 [llength [split [$w get $row2.0 $m2] \t]]
|
|
1140
|
+
|
|
1141
|
+
if {$row1 > $row2} {lassign [list $row2 $row1] row1 row2}
|
|
1142
|
+
if {$col1 > $col2} {lassign [list $col2 $col1] col1 col2}
|
|
1143
|
+
|
|
1144
|
+
$w tag remove sel 1.0 end
|
|
1145
|
+
set dir [lindex [$w tag nextrange directory $row1.0] 0]
|
|
1146
|
+
for {} {$row1 <= $row2} {incr row1} {
|
|
1147
|
+
for {set cur $row1.0;set i 1} {$i < $col1} {incr i} {
|
|
1148
|
+
set cur [lindex [$w tag nextrange name $cur] 1]
|
|
1149
|
+
}
|
|
1150
|
+
for {} {$i <= $col2} {incr i} {
|
|
1151
|
+
if {$dir ne "" && [$w compare $dir < $cur]} {
|
|
1152
|
+
set dir [lindex [$w tag nextrange directory $cur] 0]
|
|
1153
|
+
}
|
|
1154
|
+
lassign [$w tag nextrange name $cur] index1 index2
|
|
1155
|
+
if {$dir eq "" || [$w compare $dir != $index1]} {
|
|
1156
|
+
$w tag add sel $index1+2c $index2
|
|
1157
|
+
}
|
|
1158
|
+
set cur $index2
|
|
1159
|
+
}
|
|
1160
|
+
}
|
|
1161
|
+
set data(select) 1
|
|
1162
|
+
# eval [linsert [$w tag ranges directory] 0 $w tag remove sel]
|
|
1163
|
+
|
|
1164
|
+
$w mark set lastpos @$x,$y
|
|
1165
|
+
|
|
1166
|
+
set files {};foreach {first last} [$w tag ranges sel] {
|
|
1167
|
+
lappend files [$w get $first $last]
|
|
1168
|
+
}
|
|
1169
|
+
set data(selectFile) [lsort -dictionary $files]
|
|
1170
|
+
}
|
|
1171
|
+
|
|
1172
|
+
proc ::ttk::dialog::file::tkFDialog {type args} {
|
|
1173
|
+
global env
|
|
1174
|
+
variable selectFilePath
|
|
1175
|
+
variable filelist
|
|
1176
|
+
variable opt
|
|
1177
|
+
set dataName __ttk_filedialog
|
|
1178
|
+
upvar ::ttk::dialog::file::$dataName data
|
|
1179
|
+
|
|
1180
|
+
if {[info exists data(active)]} {
|
|
1181
|
+
raise $data(active)
|
|
1182
|
+
return
|
|
1183
|
+
}
|
|
1184
|
+
|
|
1185
|
+
::ttk::dialog::file::Config $dataName $type $args
|
|
1186
|
+
|
|
1187
|
+
if {$data(-parent) eq "."} {
|
|
1188
|
+
set w .$dataName
|
|
1189
|
+
} else {
|
|
1190
|
+
set w $data(-parent).$dataName
|
|
1191
|
+
}
|
|
1192
|
+
|
|
1193
|
+
if {![winfo exists $w]} {
|
|
1194
|
+
::ttk::dialog::file::Create $w TkFDialog
|
|
1195
|
+
} elseif {[winfo class $w] ne "TkFDialog"} {
|
|
1196
|
+
destroy $w
|
|
1197
|
+
::ttk::dialog::file::Create $w TkFDialog
|
|
1198
|
+
} else {
|
|
1199
|
+
$data(fileArea) configure -state normal
|
|
1200
|
+
$data(fileArea) delete 1.0 end
|
|
1201
|
+
$data(fileArea) configure -state disabled
|
|
1202
|
+
$data(dirArea) configure -state normal
|
|
1203
|
+
$data(dirArea) delete 1.0 end
|
|
1204
|
+
$data(dirArea) configure -state disabled
|
|
1205
|
+
$data(prevBtn) state disabled
|
|
1206
|
+
$data(nextBtn) state disabled
|
|
1207
|
+
$data(upBtn) state disabled
|
|
1208
|
+
set data(history) ""
|
|
1209
|
+
set data(histpos) -1
|
|
1210
|
+
}
|
|
1211
|
+
|
|
1212
|
+
wm transient $w $data(-parent)
|
|
1213
|
+
if {$data(-typevariable) ne ""} {upvar 1 $data(-typevariable) typevar}
|
|
1214
|
+
|
|
1215
|
+
if {[llength $data(-filetypes)]} {
|
|
1216
|
+
set type ""; if {[info exists typevar]} {set type $typevar}
|
|
1217
|
+
set titles ""; set current 0
|
|
1218
|
+
foreach ftype $data(-filetypes) {
|
|
1219
|
+
lassign $ftype title filter
|
|
1220
|
+
regsub {(.*) \(.*\)} $title {\1} str
|
|
1221
|
+
if {$str eq $type} {set current [llength $titles]}
|
|
1222
|
+
lappend titles $title
|
|
1223
|
+
}
|
|
1224
|
+
$data(typeMenuBtn) configure -values $titles
|
|
1225
|
+
$data(typeMenuLab) state !disabled
|
|
1226
|
+
$data(typeMenuBtn) state !disabled
|
|
1227
|
+
$data(typeMenuBtn) current $current
|
|
1228
|
+
::ttk::dialog::file::SelectFilter $w
|
|
1229
|
+
} else {
|
|
1230
|
+
set data(filter) "*"
|
|
1231
|
+
set data(typevar) ""
|
|
1232
|
+
$data(typeMenuBtn) configure -takefocus 0
|
|
1233
|
+
$data(typeMenuBtn) state disabled
|
|
1234
|
+
$data(typeMenuLab) state disabled
|
|
1235
|
+
$data(typeMenuBtn) set ""
|
|
1236
|
+
}
|
|
1237
|
+
|
|
1238
|
+
set dirlist "/"
|
|
1239
|
+
if {[info exists env(HOME)] && $env(HOME) ne "/"} {
|
|
1240
|
+
lappend dirlist $env(HOME)
|
|
1241
|
+
}
|
|
1242
|
+
if {[lsearch -exact $dirlist $data(selectPath)] < 0} {
|
|
1243
|
+
lappend dirlist $data(selectPath)
|
|
1244
|
+
}
|
|
1245
|
+
foreach n $filelist {
|
|
1246
|
+
set dir [file dirname $n]
|
|
1247
|
+
if {[lsearch -exact $dirlist $dir] < 0} {
|
|
1248
|
+
lappend dirlist $dir
|
|
1249
|
+
}
|
|
1250
|
+
}
|
|
1251
|
+
$data(dirMenuBtn) configure -values $dirlist
|
|
1252
|
+
$data(location) configure -values $filelist
|
|
1253
|
+
|
|
1254
|
+
::ttk::dialog::file::ChangeDir $w $data(selectPath)
|
|
1255
|
+
|
|
1256
|
+
::tk::PlaceWindow $w widget $data(-parent)
|
|
1257
|
+
wm title $w $data(-title)
|
|
1258
|
+
|
|
1259
|
+
::tk::SetFocusGrab $w $data(location)
|
|
1260
|
+
|
|
1261
|
+
set data(active) $w
|
|
1262
|
+
tkwait variable ::ttk::dialog::file::selectFilePath
|
|
1263
|
+
unset data(active)
|
|
1264
|
+
|
|
1265
|
+
::ttk::fsOptions [array get opt]
|
|
1266
|
+
::tk::RestoreFocusGrab $w $data(location) withdraw
|
|
1267
|
+
|
|
1268
|
+
set typevar $data(typevar)
|
|
1269
|
+
return $selectFilePath
|
|
1270
|
+
}
|
|
1271
|
+
|
|
1272
|
+
proc ::ttk::dialog::file::Config {dataName type argList} {
|
|
1273
|
+
upvar ::ttk::dialog::file::$dataName data
|
|
1274
|
+
variable opt
|
|
1275
|
+
|
|
1276
|
+
set data(type) $type
|
|
1277
|
+
|
|
1278
|
+
# 1: the configuration specs
|
|
1279
|
+
#
|
|
1280
|
+
array set opt [::ttk::fsOptions]
|
|
1281
|
+
set specs {
|
|
1282
|
+
{-defaultextension "" "" ""}
|
|
1283
|
+
{-filetypes "" "" ""}
|
|
1284
|
+
{-initialdir "" "" ""}
|
|
1285
|
+
{-initialfile "" "" ""}
|
|
1286
|
+
{-parent "" "" "."}
|
|
1287
|
+
{-title "" "" ""}
|
|
1288
|
+
{-typevariable "" "" ""}
|
|
1289
|
+
}
|
|
1290
|
+
lappend specs [list -sepfolders "" "" $opt(-sepfolders)]
|
|
1291
|
+
lappend specs [list -foldersfirst "" "" $opt(-foldersfirst)]
|
|
1292
|
+
lappend specs [list -sort "" "" $opt(-sort)]
|
|
1293
|
+
lappend specs [list -reverse "" "" $opt(-reverse)]
|
|
1294
|
+
lappend specs [list -details "" "" $opt(-details)]
|
|
1295
|
+
lappend specs [list -hidden "" "" $opt(-hidden)]
|
|
1296
|
+
|
|
1297
|
+
# The "-multiple" option is only available for the "open" file dialog.
|
|
1298
|
+
#
|
|
1299
|
+
if {$type eq "open"} {
|
|
1300
|
+
lappend specs {-multiple "" "" "0"}
|
|
1301
|
+
}
|
|
1302
|
+
|
|
1303
|
+
# 2: default values depending on the type of the dialog
|
|
1304
|
+
#
|
|
1305
|
+
if {![info exists data(selectPath)]} {
|
|
1306
|
+
# first time the dialog has been popped up
|
|
1307
|
+
set data(selectPath) [pwd]
|
|
1308
|
+
set data(selectFile) ""
|
|
1309
|
+
}
|
|
1310
|
+
|
|
1311
|
+
# 3: parse the arguments
|
|
1312
|
+
#
|
|
1313
|
+
tclParseConfigSpec ::ttk::dialog::file::$dataName $specs "" $argList
|
|
1314
|
+
|
|
1315
|
+
if {$data(-title) == ""} {
|
|
1316
|
+
if {$type eq "save"} {
|
|
1317
|
+
set data(-title) [mc "Save As"]
|
|
1318
|
+
} else {
|
|
1319
|
+
set data(-title) [mc "Open"]
|
|
1320
|
+
}
|
|
1321
|
+
}
|
|
1322
|
+
|
|
1323
|
+
# 4: set the default directory and selection according to the -initial
|
|
1324
|
+
# settings
|
|
1325
|
+
#
|
|
1326
|
+
|
|
1327
|
+
# Ensure that initialdir is an absolute path name.
|
|
1328
|
+
if {$data(-initialdir) ne ""} {
|
|
1329
|
+
set dir [file normalize [file join [pwd] $data(-initialdir)]]
|
|
1330
|
+
set path $dir
|
|
1331
|
+
while {[file exists $path] && [file type $path] eq "link"} {
|
|
1332
|
+
set path [file normalize [file join \
|
|
1333
|
+
[file dirname $path] [file link $path]]]
|
|
1334
|
+
}
|
|
1335
|
+
if {[file isdirectory $path]} {
|
|
1336
|
+
set data(selectPath) $dir
|
|
1337
|
+
} else {
|
|
1338
|
+
set data(selectPath) [pwd]
|
|
1339
|
+
}
|
|
1340
|
+
}
|
|
1341
|
+
set data(selectFile) $data(-initialfile)
|
|
1342
|
+
|
|
1343
|
+
# 5. Parse the -filetypes option
|
|
1344
|
+
#
|
|
1345
|
+
set data(-filetypes) [::tk::FDGetFileTypes $data(-filetypes)]
|
|
1346
|
+
|
|
1347
|
+
if {![winfo exists $data(-parent)]} {
|
|
1348
|
+
error "bad window path name \"$data(-parent)\""
|
|
1349
|
+
}
|
|
1350
|
+
|
|
1351
|
+
set opt(-sepfolders) $data(-sepfolders)
|
|
1352
|
+
set opt(-foldersfirst) $data(-foldersfirst)
|
|
1353
|
+
set opt(-sort) $data(-sort)
|
|
1354
|
+
set opt(-reverse) $data(-reverse)
|
|
1355
|
+
set opt(-details) $data(-details)
|
|
1356
|
+
set opt(-hidden) $data(-hidden)
|
|
1357
|
+
|
|
1358
|
+
# Set -multiple to a one or zero value (not other boolean types
|
|
1359
|
+
# like "yes") so we can use it in tests more easily.
|
|
1360
|
+
|
|
1361
|
+
set data(-multiple) [expr {$type eq "open" && $data(-multiple)}]
|
|
1362
|
+
}
|
|
1363
|
+
|
|
1364
|
+
### ttk::chooseDirectory
|
|
1365
|
+
|
|
1366
|
+
proc ::ttk::dialog::file::treeCreate {w} {
|
|
1367
|
+
destroy $w
|
|
1368
|
+
toplevel $w -class TkChooseDir
|
|
1369
|
+
wm iconname $w Dialog
|
|
1370
|
+
|
|
1371
|
+
set dataName [winfo name $w]
|
|
1372
|
+
upvar ::ttk::dialog::file::$dataName data
|
|
1373
|
+
|
|
1374
|
+
if {[winfo viewable [winfo toplevel $data(-parent)]] } {
|
|
1375
|
+
wm transient $w $data(-parent)
|
|
1376
|
+
}
|
|
1377
|
+
|
|
1378
|
+
set f1 [ttk::frame $w.f1]
|
|
1379
|
+
set data(dirMenuBtn) [ttk::combobox $f1.dir \
|
|
1380
|
+
-textvariable ::ttk::dialog::file::${dataName}(selectPath)]
|
|
1381
|
+
pack $f1.dir -fill x -expand 1 -padx 8 -pady 5
|
|
1382
|
+
|
|
1383
|
+
set f2 [ttk::frame $w.f2]
|
|
1384
|
+
ttk::frame $f2.f
|
|
1385
|
+
ttk::label $f2.f.bg -relief sunken
|
|
1386
|
+
array set fontinfo [font actual [[label $f2.f.dummy] cget -font]]
|
|
1387
|
+
set font [maxfont $fontinfo(-family) 16]
|
|
1388
|
+
destroy $f2.f.dummy
|
|
1389
|
+
ttk::label $f2.f.title -text [mc Folder] -anchor w -style Toolbutton
|
|
1390
|
+
set data(text) [text $f2.f.text -width 48 -height 16 -font $font \
|
|
1391
|
+
-tabs 20 -wrap none -highlightthickness 0 -bd 0 -cursor "" \
|
|
1392
|
+
-spacing1 1 -spacing3 1 -exportselection 0 \
|
|
1393
|
+
-yscrollcommand [list $f2.f.scroll set]]
|
|
1394
|
+
$data(text) mark set subdir end
|
|
1395
|
+
$data(text) mark gravity subdir left
|
|
1396
|
+
ttk::scrollbar $f2.f.scroll -command [list $data(text) yview]
|
|
1397
|
+
grid $f2.f.title $f2.f.scroll -sticky ns
|
|
1398
|
+
grid $f2.f.text ^ -sticky news -padx {2 0} -pady {0 2}
|
|
1399
|
+
grid $f2.f.title -padx {2 0} -pady {2 1} -sticky ew
|
|
1400
|
+
grid $f2.f.bg -column 0 -row 0 -columnspan 2 -rowspan 2 -sticky news
|
|
1401
|
+
grid columnconfigure $f2.f 0 -weight 1
|
|
1402
|
+
grid rowconfigure $f2.f 1 -weight 1
|
|
1403
|
+
pack $f2.f -fill both -expand 1 -padx 8 -pady 4
|
|
1404
|
+
|
|
1405
|
+
set f3 [ttk::frame $w.f3]
|
|
1406
|
+
ttk::button $f3.ok -text [mc OK] -default active \
|
|
1407
|
+
-command [list ::ttk::dialog::file::TreeDone $w]
|
|
1408
|
+
ttk::button $f3.cancel -text [mc Cancel] \
|
|
1409
|
+
-command [list ::ttk::dialog::file::Cancel $w]
|
|
1410
|
+
grid x $f3.ok $f3.cancel -sticky ew -padx {4 8} -pady 8
|
|
1411
|
+
grid columnconfigure $f3 {1 2} -uniform buttons -minsize 80
|
|
1412
|
+
grid columnconfigure $f3 0 -weight 1
|
|
1413
|
+
|
|
1414
|
+
pack $f1 -side top -fill x
|
|
1415
|
+
pack $f3 -side bottom -fill x
|
|
1416
|
+
pack $f2 -side top -fill both -expand 1
|
|
1417
|
+
|
|
1418
|
+
$data(text) image create end -padx 1 -image ::ttk::dialog::image::folder
|
|
1419
|
+
$data(text) insert end " /" name
|
|
1420
|
+
$data(text) configure -state disabled
|
|
1421
|
+
|
|
1422
|
+
# Get rid of the default Text bindings
|
|
1423
|
+
bindtags $data(text) [list $data(text) DirDialog $w all]
|
|
1424
|
+
|
|
1425
|
+
bind $data(dirMenuBtn) <Return> \
|
|
1426
|
+
[list ::ttk::dialog::file::TreeReturn $w]
|
|
1427
|
+
|
|
1428
|
+
wm protocol $w WM_DELETE_WINDOW [list $f3.cancel invoke]
|
|
1429
|
+
}
|
|
1430
|
+
|
|
1431
|
+
proc ::ttk::dialog::file::treeUpdate {w dir} {
|
|
1432
|
+
upvar ::ttk::dialog::file::[winfo name $w](text) txt
|
|
1433
|
+
|
|
1434
|
+
set dir [file normalize [file join [pwd] $dir]]
|
|
1435
|
+
set list [lassign [file split $dir] parent]
|
|
1436
|
+
lappend list .
|
|
1437
|
+
$txt configure -state normal
|
|
1438
|
+
$txt delete 1.end end
|
|
1439
|
+
$txt mark set subdir end
|
|
1440
|
+
|
|
1441
|
+
foreach d $list {
|
|
1442
|
+
treeOpen $w $parent subdir $d
|
|
1443
|
+
set parent [file join $parent $d]
|
|
1444
|
+
}
|
|
1445
|
+
$txt yview subdir-5l
|
|
1446
|
+
TreeSelect $w subdir
|
|
1447
|
+
}
|
|
1448
|
+
|
|
1449
|
+
proc ::ttk::dialog::file::treeOpen {w path {index insert} {subdir .}} {
|
|
1450
|
+
upvar ::ttk::dialog::file::[winfo name $w](text) txt
|
|
1451
|
+
|
|
1452
|
+
set level [llength [file split $path]]
|
|
1453
|
+
set tabs [string repeat "\t" [expr {$level - 1}]]
|
|
1454
|
+
set img [lindex [$txt dump -image \
|
|
1455
|
+
"$index linestart" "$index lineend"] 1]
|
|
1456
|
+
if {$img ne "" && [$txt image cget $img -name] eq "diropen"} {
|
|
1457
|
+
$txt image configure $img -image ::ttk::dialog::image::dirclose
|
|
1458
|
+
} else {
|
|
1459
|
+
set img ""
|
|
1460
|
+
}
|
|
1461
|
+
|
|
1462
|
+
# Do we already have this data available, but perhaps elided?
|
|
1463
|
+
if {[llength [$txt tag ranges $path]]} {
|
|
1464
|
+
# Also show all subdirectories that were expanded before
|
|
1465
|
+
set list [lsearch -all -inline [$txt tag names] $path/*]
|
|
1466
|
+
foreach n [lappend list $path] {
|
|
1467
|
+
$txt tag configure $n -elide 0
|
|
1468
|
+
}
|
|
1469
|
+
return
|
|
1470
|
+
}
|
|
1471
|
+
|
|
1472
|
+
# This may take a little longer so give some indication to the user
|
|
1473
|
+
$w configure -cursor watch
|
|
1474
|
+
update
|
|
1475
|
+
|
|
1476
|
+
if {[catch {glob -nocomplain -tails -dir $path -type d * .*} list]} {
|
|
1477
|
+
if {$img ne ""} {
|
|
1478
|
+
$txt image configure $img -image ::ttk::dialog::image::diropen
|
|
1479
|
+
}
|
|
1480
|
+
$w configure -cursor ""
|
|
1481
|
+
tk_messageBox -icon warning -type ok -parent $w -message \
|
|
1482
|
+
[mc {Cannot change to the directory "%s". Permission denied.} \
|
|
1483
|
+
$path]
|
|
1484
|
+
return
|
|
1485
|
+
}
|
|
1486
|
+
$txt configure -state normal
|
|
1487
|
+
$txt mark set insert $index
|
|
1488
|
+
foreach d [lsort -dictionary $list] {
|
|
1489
|
+
# Skip . and ..
|
|
1490
|
+
if {$d eq "." || $d eq ".."} continue
|
|
1491
|
+
# Specify no tags so the tags at the current position are used
|
|
1492
|
+
$txt insert insert "\n"
|
|
1493
|
+
# Insert the line with the appropriate tags
|
|
1494
|
+
$txt insert insert $tabs [list $path]
|
|
1495
|
+
file stat [file join $path $d] stat
|
|
1496
|
+
if {$stat(nlink) != 2} {
|
|
1497
|
+
set img [$txt image create insert -name diropen \
|
|
1498
|
+
-image ::ttk::dialog::image::diropen -padx 3]
|
|
1499
|
+
$txt tag add $path $img
|
|
1500
|
+
}
|
|
1501
|
+
$txt insert insert "\t" [list $path]
|
|
1502
|
+
set img [$txt image create insert -padx 1 \
|
|
1503
|
+
-image ::ttk::dialog::image::folder]
|
|
1504
|
+
$txt tag add $path $img
|
|
1505
|
+
$txt insert insert " $d" [list name $path]
|
|
1506
|
+
# Remove tags from the lineend
|
|
1507
|
+
foreach n [$txt tag names insert] {
|
|
1508
|
+
$txt tag remove $n insert
|
|
1509
|
+
}
|
|
1510
|
+
# Add the correct tag to the lineend
|
|
1511
|
+
$txt tag add $path insert
|
|
1512
|
+
# Put a mark if this is the specified subdirectory
|
|
1513
|
+
if {$d eq $subdir} {
|
|
1514
|
+
$txt mark set subdir insert
|
|
1515
|
+
}
|
|
1516
|
+
}
|
|
1517
|
+
# Directory is considered empty if it only contains . and ..
|
|
1518
|
+
if {[llength $list] <= 2 && $img ne ""} {
|
|
1519
|
+
$txt delete $img
|
|
1520
|
+
}
|
|
1521
|
+
$txt configure -state disabled
|
|
1522
|
+
$w configure -cursor ""
|
|
1523
|
+
}
|
|
1524
|
+
|
|
1525
|
+
proc ::ttk::dialog::file::treeClose {w path} {
|
|
1526
|
+
upvar ::ttk::dialog::file::[winfo name $w](text) txt
|
|
1527
|
+
|
|
1528
|
+
set img root
|
|
1529
|
+
set pathindex [lindex [$txt tag ranges $path] 0]
|
|
1530
|
+
lassign [$txt dump -image "$pathindex-1l" $pathindex] - img pos
|
|
1531
|
+
if {[string match diropen* $img]} {
|
|
1532
|
+
$txt image configure $img -image ::ttk::dialog::image::diropen
|
|
1533
|
+
}
|
|
1534
|
+
|
|
1535
|
+
set list [lsearch -all -inline [$txt tag names] $path/*]
|
|
1536
|
+
lappend list $path
|
|
1537
|
+
$txt configure -state normal
|
|
1538
|
+
foreach n $list {
|
|
1539
|
+
# Eliding sounds promising, but doesn't work correctly
|
|
1540
|
+
# $txt tag configure $n -elide 1
|
|
1541
|
+
eval [list $txt delete] [$txt tag ranges $n]
|
|
1542
|
+
$txt tag delete $n
|
|
1543
|
+
}
|
|
1544
|
+
$txt configure -state disabled
|
|
1545
|
+
}
|
|
1546
|
+
|
|
1547
|
+
proc ::ttk::dialog::file::TreeDone {w} {
|
|
1548
|
+
upvar ::ttk::dialog::file::[winfo name $w] data
|
|
1549
|
+
|
|
1550
|
+
if {[file exists $data(selectPath)]} {
|
|
1551
|
+
if {![file isdirectory $data(selectPath)]} {
|
|
1552
|
+
return
|
|
1553
|
+
}
|
|
1554
|
+
} elseif {[string is true $data(-mustexist)]} {
|
|
1555
|
+
return
|
|
1556
|
+
}
|
|
1557
|
+
variable selectFilePath $data(selectPath)
|
|
1558
|
+
}
|
|
1559
|
+
|
|
1560
|
+
proc ::ttk::dialog::file::cdTree {w dir {subdir .}} {
|
|
1561
|
+
upvar ::ttk::dialog::file::[winfo name $w](text) txt
|
|
1562
|
+
|
|
1563
|
+
set parent [file dirname $dir]
|
|
1564
|
+
|
|
1565
|
+
set ranges [$txt tag ranges $parent]
|
|
1566
|
+
if {[llength $ranges]} {
|
|
1567
|
+
set pat [format {^\t* %s$} [file tail $dir]]
|
|
1568
|
+
foreach {index1 index2} $ranges {
|
|
1569
|
+
set idx [$txt search -regexp $pat $index1 $index2]
|
|
1570
|
+
if {$idx ne ""} {
|
|
1571
|
+
$txt mark set subdir "$idx lineend"
|
|
1572
|
+
break
|
|
1573
|
+
}
|
|
1574
|
+
}
|
|
1575
|
+
} else {
|
|
1576
|
+
cdTree $w $parent [file tail $dir]
|
|
1577
|
+
}
|
|
1578
|
+
::ttk::dialog::file::treeOpen $w $dir subdir $subdir
|
|
1579
|
+
}
|
|
1580
|
+
|
|
1581
|
+
proc ::ttk::dialog::file::TreeSelect {w index} {
|
|
1582
|
+
upvar ::ttk::dialog::file::[winfo name [winfo toplevel $w]] data
|
|
1583
|
+
|
|
1584
|
+
set idx [$data(text) index "$index lineend"]
|
|
1585
|
+
set range [$data(text) tag prevrange name $idx "$idx linestart"]
|
|
1586
|
+
if {[llength $range]} {
|
|
1587
|
+
lassign $range index1 index2
|
|
1588
|
+
$data(text) tag remove sel 1.0 end
|
|
1589
|
+
$data(text) tag add sel $index1-1c $index2+1c
|
|
1590
|
+
set path [lsearch -inline [$data(text) tag names $index1] /*]
|
|
1591
|
+
set dir [$data(text) get $index1+1c $index2]
|
|
1592
|
+
set data(selectPath) [file join $path $dir]
|
|
1593
|
+
}
|
|
1594
|
+
}
|
|
1595
|
+
|
|
1596
|
+
proc ::ttk::dialog::file::TreeRelease1 {w} {
|
|
1597
|
+
set w [winfo toplevel $w]
|
|
1598
|
+
upvar ::ttk::dialog::file::[winfo name $w](text) txt
|
|
1599
|
+
|
|
1600
|
+
if {[$w cget -cursor] ne ""} {
|
|
1601
|
+
$w configure -cursor ""
|
|
1602
|
+
return
|
|
1603
|
+
}
|
|
1604
|
+
|
|
1605
|
+
set dir [string range [$txt get sel.first sel.last] 1 end-1]
|
|
1606
|
+
set path [lsearch -inline [$txt tag names sel.first] /*]
|
|
1607
|
+
if {![catch {$txt image cget sel.first-2c -image} name]} {
|
|
1608
|
+
set index [$txt index sel.last-1c]
|
|
1609
|
+
$txt mark set selmark sel.first
|
|
1610
|
+
switch -glob $name {
|
|
1611
|
+
*::diropen {
|
|
1612
|
+
treeOpen $w [file join $path $dir] $index
|
|
1613
|
+
}
|
|
1614
|
+
*::dirclose {
|
|
1615
|
+
treeClose $w [file join $path $dir]
|
|
1616
|
+
}
|
|
1617
|
+
}
|
|
1618
|
+
$txt tag remove sel 1.0 end
|
|
1619
|
+
$txt tag add sel selmark "selmark lineend+1c"
|
|
1620
|
+
}
|
|
1621
|
+
}
|
|
1622
|
+
|
|
1623
|
+
proc ::ttk::dialog::file::TreeMotion1 {w} {
|
|
1624
|
+
[winfo toplevel $w] configure -cursor "X_cursor #C00 #000"
|
|
1625
|
+
}
|
|
1626
|
+
|
|
1627
|
+
proc ::ttk::dialog::file::TreeReturn {w} {
|
|
1628
|
+
upvar ::ttk::dialog::file::[winfo name $w] data
|
|
1629
|
+
|
|
1630
|
+
if {[file isdirectory $data(selectPath)]} {
|
|
1631
|
+
::ttk::dialog::file::cdTree $w $data(selectPath)
|
|
1632
|
+
$data(text) yview subdir-5l
|
|
1633
|
+
TreeSelect $w subdir
|
|
1634
|
+
}
|
|
1635
|
+
|
|
1636
|
+
return -code break
|
|
1637
|
+
}
|
|
1638
|
+
|
|
1639
|
+
proc ttk::chooseDirectory {args} {
|
|
1640
|
+
set dataName __ttk_dirdialog
|
|
1641
|
+
upvar ::ttk::dialog::file::$dataName data
|
|
1642
|
+
|
|
1643
|
+
set specs {
|
|
1644
|
+
{-initialdir "" "" .}
|
|
1645
|
+
{-mustexist "" "" 0}
|
|
1646
|
+
{-parent "" "" .}
|
|
1647
|
+
{-title "" "" ""}
|
|
1648
|
+
}
|
|
1649
|
+
tclParseConfigSpec ::ttk::dialog::file::$dataName $specs "" $args
|
|
1650
|
+
|
|
1651
|
+
if {$data(-title) == ""} {
|
|
1652
|
+
set data(-title) "[::tk::mc "Choose Directory"]"
|
|
1653
|
+
}
|
|
1654
|
+
|
|
1655
|
+
if {![winfo exists $data(-parent)]} {
|
|
1656
|
+
error "bad window path name \"$data(-parent)\""
|
|
1657
|
+
}
|
|
1658
|
+
|
|
1659
|
+
if {$data(-parent) eq "."} {
|
|
1660
|
+
set w .$dataName
|
|
1661
|
+
} else {
|
|
1662
|
+
set w $data(-parent).$dataName
|
|
1663
|
+
}
|
|
1664
|
+
|
|
1665
|
+
if {![winfo exists $w]} {
|
|
1666
|
+
::ttk::dialog::file::treeCreate $w
|
|
1667
|
+
}
|
|
1668
|
+
|
|
1669
|
+
::tk::PlaceWindow $w widget $data(-parent)
|
|
1670
|
+
wm title $w $data(-title)
|
|
1671
|
+
::tk::SetFocusGrab $w $data(text)
|
|
1672
|
+
|
|
1673
|
+
::ttk::dialog::file::treeUpdate $w $data(-initialdir)
|
|
1674
|
+
|
|
1675
|
+
tkwait variable ::ttk::dialog::file::selectFilePath
|
|
1676
|
+
|
|
1677
|
+
::tk::RestoreFocusGrab $w $data(text) withdraw
|
|
1678
|
+
|
|
1679
|
+
return $::ttk::dialog::file::selectFilePath
|
|
1680
|
+
}
|
|
1681
|
+
|
|
1682
|
+
# Alternative procedure names
|
|
1683
|
+
interp alias {} ttk_getOpenFile {} ::ttk::dialog::file::tkFDialog open
|
|
1684
|
+
interp alias {} ttk_getSaveFile {} ::ttk::dialog::file::tkFDialog save
|
|
1685
|
+
interp alias {} ttk_getAppendFile {} ::ttk::dialog::file::tkFDialog append
|
|
1686
|
+
|
|
1687
|
+
# Need to have a lassign command
|
|
1688
|
+
if {![llength [info commands lassign]]} {
|
|
1689
|
+
proc lassign {list args} {
|
|
1690
|
+
uplevel 1 [list foreach $args [linsert $list end {}] break]
|
|
1691
|
+
lrange $list [llength $args] end
|
|
1692
|
+
}
|
|
1693
|
+
}
|
|
1694
|
+
|
|
1695
|
+
ttk::style configure Slim.TButton -padding 0
|
|
1696
|
+
option add *TkFDialog*selectBackground #0a5f89 startupFile
|
|
1697
|
+
option add *TkFDialog*inactiveSelectBackground #0a5f89 startupFile
|
|
1698
|
+
option add *TkFDialog*selectForeground #ffffff startupFile
|
|
1699
|
+
option add *TkFDialog*Toolbar*takeFocus 0
|
|
1700
|
+
option add *TkFDialog*Text.background white startupFile
|
|
1701
|
+
option add *TkFDialog*Menu.activeBackground #0a5f89 startupFile
|
|
1702
|
+
option add *TkFDialog*Menu.activeForeground #ffffff startupFile
|
|
1703
|
+
option add *TkFDialog*Menu.activeBorderWidth 1 startupFile
|
|
1704
|
+
option add *TkFDialog*Menu.borderWidth 1 startupFile
|
|
1705
|
+
option add *TkFDialog*Menu.relief solid startupFile
|
|
1706
|
+
option add *TkFDialog*Menu.Image ::ttk::dialog::image::blank16 startupFile
|
|
1707
|
+
option add *TkFDialog*Menu*selectImage ::ttk::dialog::image::tick16 startupFile
|
|
1708
|
+
|
|
1709
|
+
# Bindings
|
|
1710
|
+
bind FileDialogDir <ButtonPress-1> {::ttk::dialog::file::DirButton1 %W %x %y}
|
|
1711
|
+
bind FileDialogDir <ButtonRelease-1> {::ttk::dialog::file::DirRelease1 %W %x %y}
|
|
1712
|
+
bind FileDialogDir <B1-Motion> {::ttk::dialog::file::DirMotion1 %W %x %y}
|
|
1713
|
+
bind FileDialogDir <Double-1> {;}
|
|
1714
|
+
bind FileDialogDir <4> {%W yview scroll -5 units}
|
|
1715
|
+
bind FileDialogDir <5> {%W yview scroll 5 units}
|
|
1716
|
+
bind FileDialogFile <ButtonPress-1> {::ttk::dialog::file::FileButton1 %W %x %y}
|
|
1717
|
+
bind FileDialogFile <ButtonRelease-1> {::ttk::dialog::file::FileRelease1 %W %x %y}
|
|
1718
|
+
bind FileDialogFile <Shift-1> {::ttk::dialog::file::FileShift1 %W %x %y}
|
|
1719
|
+
bind FileDialogFile <Shift-ButtonRelease-1> {;}
|
|
1720
|
+
bind FileDialogFile <Control-ButtonRelease-1> {;}
|
|
1721
|
+
bind FileDialogFile <Control-1> {::ttk::dialog::file::FileControl1 %W %x %y}
|
|
1722
|
+
bind FileDialogFile <Double-Control-1> {;}
|
|
1723
|
+
bind FileDialogFile <Double-Shift-1> {;}
|
|
1724
|
+
bind FileDialogFile <B1-Motion> {::ttk::dialog::file::FileMotion1 %W %x %y}
|
|
1725
|
+
bind FileDialogFile <Control-B1-Motion> {;}
|
|
1726
|
+
bind FileDialogFile <Double-B1-Motion> {;}
|
|
1727
|
+
bind FileDialogFile <Double-1> {::ttk::dialog::file::Done [winfo toplevel %W]}
|
|
1728
|
+
bind FileDialogFile <4> \
|
|
1729
|
+
{::ttk::dialog::file::xview [winfo toplevel %W] scroll -1 units}
|
|
1730
|
+
bind FileDialogFile <5> \
|
|
1731
|
+
{::ttk::dialog::file::xview [winfo toplevel %W] scroll 1 units}
|
|
1732
|
+
bind FileDialogList <ButtonPress-1> {::ttk::dialog::file::FileButton1 %W %x %y}
|
|
1733
|
+
bind FileDialogList <ButtonRelease-1> {::ttk::dialog::file::FileRelease1 %W %x %y}
|
|
1734
|
+
bind FileDialogList <Shift-1> {::ttk::dialog::file::FileShift1 %W %x %y}
|
|
1735
|
+
bind FileDialogList <Shift-ButtonRelease-1> {;}
|
|
1736
|
+
bind FileDialogList <Control-ButtonRelease-1> {;}
|
|
1737
|
+
bind FileDialogList <Control-1> {::ttk::dialog::file::FileControl1 %W %x %y}
|
|
1738
|
+
bind FileDialogList <Double-Control-1> {;}
|
|
1739
|
+
bind FileDialogList <Double-Shift-1> {;}
|
|
1740
|
+
bind FileDialogList <B1-Motion> {::ttk::dialog::file::FileMotion1 %W %x %y}
|
|
1741
|
+
bind FileDialogList <Double-1> {::ttk::dialog::file::Done [winfo toplevel %W]}
|
|
1742
|
+
bind FileDialogList <4> {%W yview scroll -5 units}
|
|
1743
|
+
bind FileDialogList <5> {%W yview scroll 5 units}
|
|
1744
|
+
|
|
1745
|
+
bind DirDialog <4> {%W yview scroll -5 units}
|
|
1746
|
+
bind DirDialog <5> {%W yview scroll 5 units}
|
|
1747
|
+
bind DirDialog <ButtonPress-1> {::ttk::dialog::file::TreeSelect %W @%x,%y}
|
|
1748
|
+
bind DirDialog <ButtonRelease-1> {::ttk::dialog::file::TreeRelease1 %W}
|
|
1749
|
+
bind DirDialog <B1-Motion> {::ttk::dialog::file::TreeMotion1 %W}
|