arcadia 0.13.0 → 0.13.1

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