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.
Files changed (186) hide show
  1. data/README +11 -10
  2. data/bin/arcadia +3 -0
  3. data/conf/arcadia.conf +117 -75
  4. data/conf/arcadia.res.rb +219 -58
  5. data/conf/theme-dark.conf +11 -8
  6. data/conf/theme-dark.res.rb +81 -10
  7. data/ext/ae-breakpoints/ae-breakpoints.rb +1 -1
  8. data/ext/ae-dir-projects/ae-dir-projects.conf +2 -2
  9. data/ext/ae-dir-projects/ae-dir-projects.rb +84 -47
  10. data/ext/ae-editor/ae-editor.rb +541 -190
  11. data/ext/ae-editor/langs/coderay.tokens +1 -0
  12. data/ext/ae-editor/langs/conf.lang +5 -4
  13. data/ext/ae-editor/langs/java.lang +2 -1
  14. data/ext/ae-editor/langs/python.lang +4 -0
  15. data/ext/ae-editor/langs/rhtml.lang +2 -1
  16. data/ext/ae-editor/langs/ruby.lang +45 -0
  17. data/ext/ae-editor/langs/tcl.lang +80 -2
  18. data/ext/ae-editor/langs/text.lang +2 -0
  19. data/ext/ae-editor/langs/xml.lang +1 -0
  20. data/ext/ae-file-history/ae-file-history.conf +2 -2
  21. data/ext/ae-file-history/ae-file-history.rb +66 -20
  22. data/ext/ae-output/ae-output.conf +3 -3
  23. data/ext/ae-output/ae-output.rb +37 -23
  24. data/ext/ae-rad/ae-rad-palette.rb +3 -3
  25. data/ext/ae-ruby-debug/ae-ruby-debug.conf +2 -2
  26. data/ext/ae-ruby-debug/ae-ruby-debug.rb +38 -42
  27. data/ext/ae-search-in-files/ae-search-in-files.conf +2 -2
  28. data/ext/ae-search-in-files/ae-search-in-files.rb +20 -9
  29. data/ext/ae-search-in-files/ext/ack-in-files/ack-in-files.conf +2 -2
  30. data/ext/ae-shell/ae-shell.conf +1 -1
  31. data/ext/ae-shell/ae-shell.rb +57 -46
  32. data/ext/ae-subprocess-inspector/ae-subprocess-inspector.rb +99 -46
  33. data/ext/ae-subprocess-inspector/process.res +0 -0
  34. data/lib/a-commons.rb +13 -9
  35. data/lib/a-contracts.rb +24 -1
  36. data/lib/a-core.rb +586 -196
  37. data/lib/a-tkcommons.rb +155 -55
  38. data/lib/anigif.rb +9 -0
  39. data/lib/ctags.exe +0 -0
  40. data/tcl/anigif/anigif.tcl +199 -0
  41. data/tcl/anigif/pkgIndex.tcl +3 -0
  42. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/ArrowButton.html +0 -0
  43. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/BWidget.html +0 -0
  44. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/Button.html +36 -2
  45. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/ButtonBox.html +9 -7
  46. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/ComboBox.html +0 -0
  47. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/Dialog.html +5 -11
  48. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/DragSite.html +0 -0
  49. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/DropSite.html +0 -0
  50. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/DynamicHelp.html +0 -0
  51. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/Entry.html +0 -0
  52. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/Label.html +32 -1
  53. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/LabelEntry.html +0 -0
  54. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/LabelFrame.html +0 -0
  55. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/ListBox.html +0 -0
  56. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/MainFrame.html +0 -0
  57. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/MessageDlg.html +0 -0
  58. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/NoteBook.html +0 -0
  59. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/PagesManager.html +0 -0
  60. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/PanedWindow.html +0 -0
  61. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/PanelFrame.html +0 -0
  62. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/PasswdDlg.html +0 -0
  63. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/ProgressBar.html +0 -0
  64. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/ProgressDlg.html +0 -0
  65. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/ScrollView.html +0 -0
  66. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/ScrollableFrame.html +0 -0
  67. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/ScrolledWindow.html +13 -1
  68. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/SelectColor.html +0 -0
  69. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/SelectFont.html +0 -0
  70. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/Separator.html +0 -0
  71. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/SpinBox.html +0 -0
  72. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/StatusBar.html +0 -0
  73. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/TitleFrame.html +0 -0
  74. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/Tree.html +0 -0
  75. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/Widget.html +0 -0
  76. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/contents.html +12 -1
  77. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/index.html +0 -0
  78. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/navtree.html +0 -0
  79. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/BWman/options.htm +0 -0
  80. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/CHANGES.txt +0 -0
  81. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/ChangeLog +70 -0
  82. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/LICENSE.txt +0 -0
  83. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/README.txt +0 -0
  84. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/arrow.tcl +0 -0
  85. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/bitmap.tcl +0 -0
  86. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/button.tcl +121 -53
  87. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/buttonbox.tcl +10 -5
  88. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/color.tcl +0 -0
  89. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/combobox.tcl +0 -0
  90. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/demo/basic.tcl +0 -0
  91. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/demo/bwidget.xbm +0 -0
  92. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/demo/demo.tcl +0 -0
  93. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/demo/dnd.tcl +0 -0
  94. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/demo/manager.tcl +0 -0
  95. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/demo/select.tcl +0 -0
  96. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/demo/tmpldlg.tcl +0 -0
  97. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/demo/tree.tcl +0 -0
  98. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/demo/x1.xbm +0 -0
  99. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/dialog.tcl +14 -2
  100. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/dragsite.tcl +0 -0
  101. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/dropsite.tcl +0 -0
  102. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/dynhelp.tcl +0 -0
  103. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/entry.tcl +0 -0
  104. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/font.tcl +0 -0
  105. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/bold.gif +0 -0
  106. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/copy.gif +0 -0
  107. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/cut.gif +0 -0
  108. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/dragfile.gif +0 -0
  109. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/dragicon.gif +0 -0
  110. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/error.gif +0 -0
  111. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/file.gif +0 -0
  112. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/folder.gif +0 -0
  113. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/hourglass.gif +0 -0
  114. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/info.gif +0 -0
  115. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/italic.gif +0 -0
  116. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/minus.xbm +0 -0
  117. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/new.gif +0 -0
  118. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/opcopy.xbm +0 -0
  119. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/open.gif +0 -0
  120. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/openfold.gif +0 -0
  121. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/oplink.xbm +0 -0
  122. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/opmove.xbm +0 -0
  123. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/overstrike.gif +0 -0
  124. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/palette.gif +0 -0
  125. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/passwd.gif +0 -0
  126. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/paste.gif +0 -0
  127. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/plus.xbm +0 -0
  128. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/print.gif +0 -0
  129. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/question.gif +0 -0
  130. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/redo.gif +0 -0
  131. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/save.gif +0 -0
  132. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/target.xbm +0 -0
  133. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/underline.gif +0 -0
  134. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/undo.gif +0 -0
  135. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/images/warning.gif +0 -0
  136. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/init.tcl +15 -1
  137. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/label.tcl +76 -18
  138. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/labelentry.tcl +0 -0
  139. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/labelframe.tcl +0 -0
  140. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/lang/da.rc +0 -0
  141. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/lang/de.rc +0 -0
  142. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/lang/en.rc +0 -0
  143. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/lang/es.rc +0 -0
  144. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/lang/fr.rc +0 -0
  145. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/lang/hu.rc +0 -0
  146. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/lang/nl.rc +0 -0
  147. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/lang/no.rc +0 -0
  148. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/lang/pl.rc +0 -0
  149. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/listbox.tcl +0 -0
  150. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/mainframe.tcl +3 -2
  151. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/messagedlg.tcl +0 -0
  152. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/notebook.tcl +0 -0
  153. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/pagesmgr.tcl +0 -0
  154. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/panedw.tcl +0 -0
  155. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/panelframe.tcl +0 -0
  156. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/passwddlg.tcl +0 -0
  157. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/pkgIndex.tcl +2 -2
  158. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/progressbar.tcl +0 -0
  159. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/progressdlg.tcl +0 -0
  160. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/scrollframe.tcl +0 -0
  161. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/scrollview.tcl +0 -0
  162. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/scrollw.tcl +37 -25
  163. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/separator.tcl +0 -0
  164. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/spinbox.tcl +0 -0
  165. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/statusbar.tcl +0 -0
  166. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/tests/entry.test +0 -0
  167. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/titleframe.tcl +0 -0
  168. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/tree.tcl +17 -9
  169. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/utils.tcl +0 -0
  170. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/widget.tcl +0 -0
  171. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/wizard.tcl +0 -0
  172. data/tcl/{BWidget-1.9.2 → bwidget-1.9.4}/xpm2image.tcl +0 -0
  173. data/tcl/fsdialog/de.msg +30 -0
  174. data/tcl/fsdialog/en.msg +31 -0
  175. data/tcl/fsdialog/fsdialog.tcl +1749 -0
  176. data/tcl/fsdialog/fsdlg-gif.tcl +259 -0
  177. data/tcl/fsdialog/fsdlg-png.tcl +265 -0
  178. data/tcl/fsdialog/sv.msg +32 -0
  179. data/tcl/fsdialog/tclIndex +6 -0
  180. metadata +179 -174
  181. data/ext/ae-editor/langs/erb.lang.bind +0 -1
  182. data/ext/ae-editor/langs/lang.lang.bind +0 -1
  183. data/ext/ae-editor/langs/pers.lang.bind +0 -1
  184. data/ext/ae-editor/langs/rb.lang +0 -73
  185. data/ext/ae-editor/langs/rbw.lang.bind +0 -1
  186. data/ext/ae-editor/langs/tokens.lang.bind +0 -1
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.1 2009/08/10 11:28:50 oehhar Exp $
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
- lappend data(upd,nodes) $parent 8
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
- if { [set idx [lsearch -exact $data(upd,nodes) $node]] == -1 } {
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
@@ -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
+
@@ -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}