Pratt 1.5.6

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 (283) hide show
  1. data/.exrc +61 -0
  2. data/.gitignore +4 -0
  3. data/History.txt +6 -0
  4. data/Manifest.txt +46 -0
  5. data/Pratt.gemspec +351 -0
  6. data/README.txt +66 -0
  7. data/Rakefile +85 -0
  8. data/TODO +54 -0
  9. data/VERSION +1 -0
  10. data/bin/pratt.rb +13 -0
  11. data/config.rb +34 -0
  12. data/lib/pratt.rb +527 -0
  13. data/lib/pratt/array.rb +11 -0
  14. data/lib/pratt/string.rb +18 -0
  15. data/models/app.rb +40 -0
  16. data/models/customer.rb +24 -0
  17. data/models/payment.rb +22 -0
  18. data/models/pratt.rb +19 -0
  19. data/models/project.rb +82 -0
  20. data/models/whence.rb +70 -0
  21. data/pkgs/tile-0.8.2.tar.gz +0 -0
  22. data/pkgs/tile-0.8.2/ANNOUNCE.txt +95 -0
  23. data/pkgs/tile-0.8.2/ChangeLog +4651 -0
  24. data/pkgs/tile-0.8.2/Makefile +250 -0
  25. data/pkgs/tile-0.8.2/Makefile.in +250 -0
  26. data/pkgs/tile-0.8.2/README.txt +86 -0
  27. data/pkgs/tile-0.8.2/aclocal.m4 +2 -0
  28. data/pkgs/tile-0.8.2/altTheme.o +0 -0
  29. data/pkgs/tile-0.8.2/blink.o +0 -0
  30. data/pkgs/tile-0.8.2/button.o +0 -0
  31. data/pkgs/tile-0.8.2/cache.o +0 -0
  32. data/pkgs/tile-0.8.2/clamTheme.o +0 -0
  33. data/pkgs/tile-0.8.2/classicTheme.o +0 -0
  34. data/pkgs/tile-0.8.2/config.log +1330 -0
  35. data/pkgs/tile-0.8.2/config.status +795 -0
  36. data/pkgs/tile-0.8.2/configure +15248 -0
  37. data/pkgs/tile-0.8.2/configure.in +89 -0
  38. data/pkgs/tile-0.8.2/demos/autocomplete.tcl +59 -0
  39. data/pkgs/tile-0.8.2/demos/demo.tcl +870 -0
  40. data/pkgs/tile-0.8.2/demos/dirbrowser.tcl +167 -0
  41. data/pkgs/tile-0.8.2/demos/dlgtest.tcl +97 -0
  42. data/pkgs/tile-0.8.2/demos/iconlib.tcl +110 -0
  43. data/pkgs/tile-0.8.2/demos/repeater.tcl +117 -0
  44. data/pkgs/tile-0.8.2/demos/toolbutton.tcl +101 -0
  45. data/pkgs/tile-0.8.2/doc/Geometry.3 +230 -0
  46. data/pkgs/tile-0.8.2/doc/INDEX.MAP +153 -0
  47. data/pkgs/tile-0.8.2/doc/Makefile +36 -0
  48. data/pkgs/tile-0.8.2/doc/TILE.XML +45 -0
  49. data/pkgs/tile-0.8.2/doc/Theme.3 +34 -0
  50. data/pkgs/tile-0.8.2/doc/button.n +75 -0
  51. data/pkgs/tile-0.8.2/doc/checkbutton.n +61 -0
  52. data/pkgs/tile-0.8.2/doc/combobox.n +98 -0
  53. data/pkgs/tile-0.8.2/doc/converting.txt +97 -0
  54. data/pkgs/tile-0.8.2/doc/dialog.n +122 -0
  55. data/pkgs/tile-0.8.2/doc/entry.n +438 -0
  56. data/pkgs/tile-0.8.2/doc/frame.n +43 -0
  57. data/pkgs/tile-0.8.2/doc/html/Geometry.html +304 -0
  58. data/pkgs/tile-0.8.2/doc/html/Theme.html +48 -0
  59. data/pkgs/tile-0.8.2/doc/html/button.html +120 -0
  60. data/pkgs/tile-0.8.2/doc/html/category-index.html +18 -0
  61. data/pkgs/tile-0.8.2/doc/html/checkbutton.html +94 -0
  62. data/pkgs/tile-0.8.2/doc/html/combobox.html +164 -0
  63. data/pkgs/tile-0.8.2/doc/html/converting.txt +97 -0
  64. data/pkgs/tile-0.8.2/doc/html/dialog.html +159 -0
  65. data/pkgs/tile-0.8.2/doc/html/entry.html +613 -0
  66. data/pkgs/tile-0.8.2/doc/html/frame.html +76 -0
  67. data/pkgs/tile-0.8.2/doc/html/image.html +100 -0
  68. data/pkgs/tile-0.8.2/doc/html/index.html +25 -0
  69. data/pkgs/tile-0.8.2/doc/html/keyword-index.html +228 -0
  70. data/pkgs/tile-0.8.2/doc/html/label.html +133 -0
  71. data/pkgs/tile-0.8.2/doc/html/labelframe.html +91 -0
  72. data/pkgs/tile-0.8.2/doc/html/manpage.css +212 -0
  73. data/pkgs/tile-0.8.2/doc/html/menubutton.html +63 -0
  74. data/pkgs/tile-0.8.2/doc/html/notebook.html +280 -0
  75. data/pkgs/tile-0.8.2/doc/html/paned.html +149 -0
  76. data/pkgs/tile-0.8.2/doc/html/progressbar.html +138 -0
  77. data/pkgs/tile-0.8.2/doc/html/radiobutton.html +89 -0
  78. data/pkgs/tile-0.8.2/doc/html/scrollbar.html +221 -0
  79. data/pkgs/tile-0.8.2/doc/html/separator.html +48 -0
  80. data/pkgs/tile-0.8.2/doc/html/sizegrip.html +62 -0
  81. data/pkgs/tile-0.8.2/doc/html/style.html +172 -0
  82. data/pkgs/tile-0.8.2/doc/html/tile-intro.html +164 -0
  83. data/pkgs/tile-0.8.2/doc/html/treeview.html +634 -0
  84. data/pkgs/tile-0.8.2/doc/html/widget.html +342 -0
  85. data/pkgs/tile-0.8.2/doc/image.n +81 -0
  86. data/pkgs/tile-0.8.2/doc/internals.txt +409 -0
  87. data/pkgs/tile-0.8.2/doc/label.n +75 -0
  88. data/pkgs/tile-0.8.2/doc/labelframe.n +64 -0
  89. data/pkgs/tile-0.8.2/doc/man.macros +239 -0
  90. data/pkgs/tile-0.8.2/doc/menubutton.n +41 -0
  91. data/pkgs/tile-0.8.2/doc/notebook.n +188 -0
  92. data/pkgs/tile-0.8.2/doc/paned.n +95 -0
  93. data/pkgs/tile-0.8.2/doc/progressbar.n +79 -0
  94. data/pkgs/tile-0.8.2/doc/radiobutton.n +57 -0
  95. data/pkgs/tile-0.8.2/doc/scrollbar.n +160 -0
  96. data/pkgs/tile-0.8.2/doc/separator.n +30 -0
  97. data/pkgs/tile-0.8.2/doc/sizegrip.n +53 -0
  98. data/pkgs/tile-0.8.2/doc/style.n +119 -0
  99. data/pkgs/tile-0.8.2/doc/tile-intro.n +165 -0
  100. data/pkgs/tile-0.8.2/doc/tmml.options +4 -0
  101. data/pkgs/tile-0.8.2/doc/treeview.n +415 -0
  102. data/pkgs/tile-0.8.2/doc/widget.n +227 -0
  103. data/pkgs/tile-0.8.2/doc/xml/Geometry.tmml +379 -0
  104. data/pkgs/tile-0.8.2/doc/xml/INDEX.MAP +153 -0
  105. data/pkgs/tile-0.8.2/doc/xml/Theme.tmml +63 -0
  106. data/pkgs/tile-0.8.2/doc/xml/button.tmml +134 -0
  107. data/pkgs/tile-0.8.2/doc/xml/checkbutton.tmml +119 -0
  108. data/pkgs/tile-0.8.2/doc/xml/combobox.tmml +184 -0
  109. data/pkgs/tile-0.8.2/doc/xml/dialog.tmml +195 -0
  110. data/pkgs/tile-0.8.2/doc/xml/entry.tmml +630 -0
  111. data/pkgs/tile-0.8.2/doc/xml/frame.tmml +98 -0
  112. data/pkgs/tile-0.8.2/doc/xml/image.tmml +101 -0
  113. data/pkgs/tile-0.8.2/doc/xml/label.tmml +154 -0
  114. data/pkgs/tile-0.8.2/doc/xml/labelframe.tmml +116 -0
  115. data/pkgs/tile-0.8.2/doc/xml/menubutton.tmml +80 -0
  116. data/pkgs/tile-0.8.2/doc/xml/notebook.tmml +306 -0
  117. data/pkgs/tile-0.8.2/doc/xml/paned.tmml +154 -0
  118. data/pkgs/tile-0.8.2/doc/xml/progressbar.tmml +151 -0
  119. data/pkgs/tile-0.8.2/doc/xml/radiobutton.tmml +109 -0
  120. data/pkgs/tile-0.8.2/doc/xml/scrollbar.tmml +233 -0
  121. data/pkgs/tile-0.8.2/doc/xml/separator.tmml +59 -0
  122. data/pkgs/tile-0.8.2/doc/xml/sizegrip.tmml +82 -0
  123. data/pkgs/tile-0.8.2/doc/xml/style.tmml +171 -0
  124. data/pkgs/tile-0.8.2/doc/xml/tile-intro.tmml +192 -0
  125. data/pkgs/tile-0.8.2/doc/xml/treeview.tmml +604 -0
  126. data/pkgs/tile-0.8.2/doc/xml/widget.tmml +372 -0
  127. data/pkgs/tile-0.8.2/entry.o +0 -0
  128. data/pkgs/tile-0.8.2/frame.o +0 -0
  129. data/pkgs/tile-0.8.2/generic/Makefile.in +221 -0
  130. data/pkgs/tile-0.8.2/generic/TODO +493 -0
  131. data/pkgs/tile-0.8.2/generic/altTheme.c +1172 -0
  132. data/pkgs/tile-0.8.2/generic/blink.c +168 -0
  133. data/pkgs/tile-0.8.2/generic/button.c +858 -0
  134. data/pkgs/tile-0.8.2/generic/cache.c +354 -0
  135. data/pkgs/tile-0.8.2/generic/clamTheme.c +974 -0
  136. data/pkgs/tile-0.8.2/generic/classicTheme.c +518 -0
  137. data/pkgs/tile-0.8.2/generic/configure +10334 -0
  138. data/pkgs/tile-0.8.2/generic/configure.in +100 -0
  139. data/pkgs/tile-0.8.2/generic/entry.c +1922 -0
  140. data/pkgs/tile-0.8.2/generic/frame.c +648 -0
  141. data/pkgs/tile-0.8.2/generic/gunk.h +44 -0
  142. data/pkgs/tile-0.8.2/generic/image.c +416 -0
  143. data/pkgs/tile-0.8.2/generic/label.c +663 -0
  144. data/pkgs/tile-0.8.2/generic/layout.c +1215 -0
  145. data/pkgs/tile-0.8.2/generic/manager.c +554 -0
  146. data/pkgs/tile-0.8.2/generic/manager.h +91 -0
  147. data/pkgs/tile-0.8.2/generic/notebook.c +1380 -0
  148. data/pkgs/tile-0.8.2/generic/paned.c +958 -0
  149. data/pkgs/tile-0.8.2/generic/pkgIndex.tcl.in +7 -0
  150. data/pkgs/tile-0.8.2/generic/progress.c +549 -0
  151. data/pkgs/tile-0.8.2/generic/scale.c +526 -0
  152. data/pkgs/tile-0.8.2/generic/scroll.c +253 -0
  153. data/pkgs/tile-0.8.2/generic/scrollbar.c +346 -0
  154. data/pkgs/tile-0.8.2/generic/separator.c +132 -0
  155. data/pkgs/tile-0.8.2/generic/square.c +306 -0
  156. data/pkgs/tile-0.8.2/generic/tagset.c +147 -0
  157. data/pkgs/tile-0.8.2/generic/tile.c +296 -0
  158. data/pkgs/tile-0.8.2/generic/tkElements.c +1280 -0
  159. data/pkgs/tile-0.8.2/generic/tkTheme.c +1708 -0
  160. data/pkgs/tile-0.8.2/generic/tkTheme.h +419 -0
  161. data/pkgs/tile-0.8.2/generic/tkThemeInt.h +45 -0
  162. data/pkgs/tile-0.8.2/generic/tkstate.c +268 -0
  163. data/pkgs/tile-0.8.2/generic/trace.c +145 -0
  164. data/pkgs/tile-0.8.2/generic/track.c +174 -0
  165. data/pkgs/tile-0.8.2/generic/treeview.c +3211 -0
  166. data/pkgs/tile-0.8.2/generic/ttk.decls +154 -0
  167. data/pkgs/tile-0.8.2/generic/ttkDecls.h +340 -0
  168. data/pkgs/tile-0.8.2/generic/ttkStubInit.c +61 -0
  169. data/pkgs/tile-0.8.2/generic/ttkStubLib.c +70 -0
  170. data/pkgs/tile-0.8.2/generic/widget.c +785 -0
  171. data/pkgs/tile-0.8.2/generic/widget.h +263 -0
  172. data/pkgs/tile-0.8.2/image.o +0 -0
  173. data/pkgs/tile-0.8.2/label.o +0 -0
  174. data/pkgs/tile-0.8.2/layout.o +0 -0
  175. data/pkgs/tile-0.8.2/library/altTheme.tcl +101 -0
  176. data/pkgs/tile-0.8.2/library/aquaTheme.tcl +62 -0
  177. data/pkgs/tile-0.8.2/library/button.tcl +85 -0
  178. data/pkgs/tile-0.8.2/library/clamTheme.tcl +139 -0
  179. data/pkgs/tile-0.8.2/library/classicTheme.tcl +108 -0
  180. data/pkgs/tile-0.8.2/library/combobox.tcl +439 -0
  181. data/pkgs/tile-0.8.2/library/cursors.tcl +36 -0
  182. data/pkgs/tile-0.8.2/library/defaults.tcl +118 -0
  183. data/pkgs/tile-0.8.2/library/dialog.tcl +274 -0
  184. data/pkgs/tile-0.8.2/library/entry.tcl +580 -0
  185. data/pkgs/tile-0.8.2/library/fonts.tcl +153 -0
  186. data/pkgs/tile-0.8.2/library/icons.tcl +105 -0
  187. data/pkgs/tile-0.8.2/library/keynav.tcl +192 -0
  188. data/pkgs/tile-0.8.2/library/menubutton.tcl +171 -0
  189. data/pkgs/tile-0.8.2/library/notebook.tcl +193 -0
  190. data/pkgs/tile-0.8.2/library/paned.tcl +87 -0
  191. data/pkgs/tile-0.8.2/library/progress.tcl +51 -0
  192. data/pkgs/tile-0.8.2/library/scale.tcl +54 -0
  193. data/pkgs/tile-0.8.2/library/scrollbar.tcl +125 -0
  194. data/pkgs/tile-0.8.2/library/sizegrip.tcl +77 -0
  195. data/pkgs/tile-0.8.2/library/tile.tcl +211 -0
  196. data/pkgs/tile-0.8.2/library/treeview.tcl +382 -0
  197. data/pkgs/tile-0.8.2/library/utils.tcl +254 -0
  198. data/pkgs/tile-0.8.2/library/winTheme.tcl +77 -0
  199. data/pkgs/tile-0.8.2/library/xpTheme.tcl +63 -0
  200. data/pkgs/tile-0.8.2/libtile0.8.2.so +0 -0
  201. data/pkgs/tile-0.8.2/libttkstub.a +0 -0
  202. data/pkgs/tile-0.8.2/license.terms +24 -0
  203. data/pkgs/tile-0.8.2/macosx/aquaTheme.c +1076 -0
  204. data/pkgs/tile-0.8.2/manager.o +0 -0
  205. data/pkgs/tile-0.8.2/notebook.o +0 -0
  206. data/pkgs/tile-0.8.2/paned.o +0 -0
  207. data/pkgs/tile-0.8.2/pkgIndex.tcl +3 -0
  208. data/pkgs/tile-0.8.2/progress.o +0 -0
  209. data/pkgs/tile-0.8.2/scale.o +0 -0
  210. data/pkgs/tile-0.8.2/scroll.o +0 -0
  211. data/pkgs/tile-0.8.2/scrollbar.o +0 -0
  212. data/pkgs/tile-0.8.2/separator.o +0 -0
  213. data/pkgs/tile-0.8.2/tagset.o +0 -0
  214. data/pkgs/tile-0.8.2/tclconfig/install-sh +119 -0
  215. data/pkgs/tile-0.8.2/tclconfig/tcl.m4 +4069 -0
  216. data/pkgs/tile-0.8.2/tclconfig/teax.m4 +109 -0
  217. data/pkgs/tile-0.8.2/tests/all.tcl +18 -0
  218. data/pkgs/tile-0.8.2/tests/bwidget.test +103 -0
  219. data/pkgs/tile-0.8.2/tests/cbtest.tcl +125 -0
  220. data/pkgs/tile-0.8.2/tests/combobox.test +51 -0
  221. data/pkgs/tile-0.8.2/tests/compound.tcl +92 -0
  222. data/pkgs/tile-0.8.2/tests/entry.test +285 -0
  223. data/pkgs/tile-0.8.2/tests/entrytest.tcl +78 -0
  224. data/pkgs/tile-0.8.2/tests/image.test +94 -0
  225. data/pkgs/tile-0.8.2/tests/labelframe.tcl +41 -0
  226. data/pkgs/tile-0.8.2/tests/labelframe.test +137 -0
  227. data/pkgs/tile-0.8.2/tests/layout.test +33 -0
  228. data/pkgs/tile-0.8.2/tests/misc.test +35 -0
  229. data/pkgs/tile-0.8.2/tests/nbtest.tcl +66 -0
  230. data/pkgs/tile-0.8.2/tests/notebook.test +500 -0
  231. data/pkgs/tile-0.8.2/tests/paned.test +298 -0
  232. data/pkgs/tile-0.8.2/tests/progress.test +92 -0
  233. data/pkgs/tile-0.8.2/tests/pwtest.tcl +90 -0
  234. data/pkgs/tile-0.8.2/tests/sbtest.tcl +79 -0
  235. data/pkgs/tile-0.8.2/tests/scrollbar.test +77 -0
  236. data/pkgs/tile-0.8.2/tests/sgtest.tcl +52 -0
  237. data/pkgs/tile-0.8.2/tests/testutils.tcl +20 -0
  238. data/pkgs/tile-0.8.2/tests/tile.test +674 -0
  239. data/pkgs/tile-0.8.2/tests/treetags.test +78 -0
  240. data/pkgs/tile-0.8.2/tests/treeview.test +563 -0
  241. data/pkgs/tile-0.8.2/tests/tvtest.tcl +332 -0
  242. data/pkgs/tile-0.8.2/tests/validate.test +278 -0
  243. data/pkgs/tile-0.8.2/tile.o +0 -0
  244. data/pkgs/tile-0.8.2/tkElements.o +0 -0
  245. data/pkgs/tile-0.8.2/tkTheme.o +0 -0
  246. data/pkgs/tile-0.8.2/tkstate.o +0 -0
  247. data/pkgs/tile-0.8.2/tools/genStubs.tcl +861 -0
  248. data/pkgs/tile-0.8.2/trace.o +0 -0
  249. data/pkgs/tile-0.8.2/track.o +0 -0
  250. data/pkgs/tile-0.8.2/treeview.o +0 -0
  251. data/pkgs/tile-0.8.2/ttkStubInit.o +0 -0
  252. data/pkgs/tile-0.8.2/ttkStubLib.o +0 -0
  253. data/pkgs/tile-0.8.2/widget.o +0 -0
  254. data/pkgs/tile-0.8.2/win/Tile.dsp +261 -0
  255. data/pkgs/tile-0.8.2/win/makefile.vc +527 -0
  256. data/pkgs/tile-0.8.2/win/monitor.c +164 -0
  257. data/pkgs/tile-0.8.2/win/nmakehlp.c +483 -0
  258. data/pkgs/tile-0.8.2/win/rules.vc +512 -0
  259. data/pkgs/tile-0.8.2/win/tile.rc +40 -0
  260. data/pkgs/tile-0.8.2/win/winTheme.c +734 -0
  261. data/pkgs/tile-0.8.2/win/xpTheme.c +1029 -0
  262. data/spec/app_spec.rb +48 -0
  263. data/spec/customer_spec.rb +31 -0
  264. data/spec/fixtures/graph.expectation +18 -0
  265. data/spec/payment_spec.rb +19 -0
  266. data/spec/pratt_spec.rb +148 -0
  267. data/spec/project_spec.rb +163 -0
  268. data/spec/rcov.opts +0 -0
  269. data/spec/spec.opts +1 -0
  270. data/spec/spec_helper.rb +21 -0
  271. data/spec/whence_spec.rb +54 -0
  272. data/tasks/pratt.rb +84 -0
  273. data/templates/model.eruby +12 -0
  274. data/templates/spec.eruby +8 -0
  275. data/views/env.rb +22 -0
  276. data/views/graph.eruby +20 -0
  277. data/views/invoice.eruby +148 -0
  278. data/views/main.rb +92 -0
  279. data/views/pid.eruby +3 -0
  280. data/views/pop.rb +94 -0
  281. data/views/pop2.rb +75 -0
  282. data/views/raw.eruby +11 -0
  283. metadata +390 -0
@@ -0,0 +1,36 @@
1
+ #
2
+ # cursors.tcl,v 1.3 2006/11/05 18:40:48 jenglish Exp
3
+ #
4
+ # Tile package: Symbolic cursor names.
5
+ #
6
+ # @@@ TODO: Figure out appropriate platform-specific cursors
7
+ # for the various functions.
8
+ #
9
+
10
+ namespace eval ttk {
11
+
12
+ variable Cursors
13
+
14
+ switch -glob $::tcl_platform(platform) {
15
+
16
+ "windows" {
17
+ array set Cursors {
18
+ hresize sb_h_double_arrow
19
+ vresize sb_v_double_arrow
20
+ seresize size_nw_se
21
+ }
22
+ }
23
+
24
+ "unix" -
25
+ * {
26
+ array set Cursors {
27
+ hresize sb_h_double_arrow
28
+ vresize sb_v_double_arrow
29
+ seresize bottom_right_corner
30
+ }
31
+ }
32
+
33
+ }
34
+ }
35
+
36
+ #*EOF*
@@ -0,0 +1,118 @@
1
+ #
2
+ # defaults.tcl,v 1.38 2007/11/18 18:09:26 jenglish Exp
3
+ #
4
+ # Settings for default theme.
5
+ #
6
+
7
+ namespace eval ttk::theme::default {
8
+ variable colors
9
+ array set colors {
10
+ -frame "#d9d9d9"
11
+ -window "#ffffff"
12
+ -activebg "#ececec"
13
+ -selectbg "#4a6984"
14
+ -selectfg "#ffffff"
15
+ -darker "#c3c3c3"
16
+ -disabledfg "#a3a3a3"
17
+ -indicator "#4a6984"
18
+ }
19
+
20
+ ttk::style theme settings default {
21
+
22
+ ttk::style configure "." \
23
+ -borderwidth 1 \
24
+ -background $colors(-frame) \
25
+ -foreground black \
26
+ -troughcolor $colors(-darker) \
27
+ -font TkDefaultFont \
28
+ -selectborderwidth 1 \
29
+ -selectbackground $colors(-selectbg) \
30
+ -selectforeground $colors(-selectfg) \
31
+ -insertwidth 1 \
32
+ -indicatordiameter 10 \
33
+ ;
34
+
35
+ ttk::style map "." -background \
36
+ [list disabled $colors(-frame) active $colors(-activebg)]
37
+ ttk::style map "." -foreground \
38
+ [list disabled $colors(-disabledfg)]
39
+
40
+ ttk::style configure TButton \
41
+ -anchor center -padding "3 3" -width -9 \
42
+ -relief raised -shiftrelief 1
43
+ ttk::style map TButton -relief [list {!disabled pressed} sunken]
44
+
45
+ ttk::style configure TCheckbutton \
46
+ -indicatorcolor "#ffffff" -indicatorrelief sunken -padding 1
47
+ ttk::style map TCheckbutton -indicatorcolor \
48
+ [list pressed $colors(-activebg) selected $colors(-indicator)]
49
+
50
+ ttk::style configure TRadiobutton \
51
+ -indicatorcolor "#ffffff" -indicatorrelief sunken -padding 1
52
+ ttk::style map TRadiobutton -indicatorcolor \
53
+ [list pressed $colors(-activebg) selected $colors(-indicator)]
54
+
55
+ ttk::style configure TMenubutton \
56
+ -relief raised -padding "10 3"
57
+
58
+ ttk::style configure TEntry \
59
+ -relief sunken -fieldbackground white -padding 1
60
+ ttk::style map TEntry -fieldbackground \
61
+ [list readonly $colors(-frame) disabled $colors(-frame)]
62
+
63
+ ttk::style configure TCombobox -arrowsize 12 -padding 1
64
+ ttk::style map TCombobox -fieldbackground \
65
+ [list readonly $colors(-frame) disabled $colors(-frame)]
66
+
67
+ ttk::style configure TLabelframe \
68
+ -relief groove -borderwidth 2
69
+
70
+ ttk::style configure TScrollbar \
71
+ -width 12 -arrowsize 12
72
+ ttk::style map TScrollbar \
73
+ -arrowcolor [list disabled $colors(-disabledfg)]
74
+
75
+ ttk::style configure TScale \
76
+ -sliderrelief raised
77
+ ttk::style configure TProgressbar \
78
+ -background $colors(-selectbg)
79
+
80
+ ttk::style configure TNotebook.Tab \
81
+ -padding {4 2} -background $colors(-darker)
82
+ ttk::style map TNotebook.Tab \
83
+ -background [list selected $colors(-frame)]
84
+
85
+ # Treeview.
86
+ #
87
+ ttk::style configure Heading -font TkHeadingFont -relief raised
88
+ ttk::style configure Row -background $colors(-window)
89
+ ttk::style configure Cell -background $colors(-window)
90
+ ttk::style map Row \
91
+ -background [list selected $colors(-selectbg)] \
92
+ -foreground [list selected $colors(-selectfg)] ;
93
+ ttk::style map Cell \
94
+ -background [list selected $colors(-selectbg)] \
95
+ -foreground [list selected $colors(-selectfg)] ;
96
+ ttk::style map Item \
97
+ -background [list selected $colors(-selectbg)] \
98
+ -foreground [list selected $colors(-selectfg)] ;
99
+
100
+ #
101
+ # Toolbar buttons:
102
+ #
103
+ ttk::style layout Toolbutton {
104
+ Toolbutton.border -children {
105
+ Toolbutton.padding -children {
106
+ Toolbutton.label
107
+ }
108
+ }
109
+ }
110
+
111
+ ttk::style configure Toolbutton \
112
+ -padding 2 -relief flat
113
+ ttk::style map Toolbutton -relief \
114
+ [list disabled flat selected sunken pressed sunken active raised]
115
+ ttk::style map Toolbutton -background \
116
+ [list pressed $colors(-darker) active $colors(-activebg)]
117
+ }
118
+ }
@@ -0,0 +1,274 @@
1
+ #
2
+ # dialog.tcl,v 1.6 2007/07/10 21:53:26 jenglish Exp
3
+ #
4
+ # Copyright (c) 2005, Joe English. Freely redistributable.
5
+ #
6
+ # Tile widget set: dialog boxes.
7
+ #
8
+ # TODO: option to keep dialog onscreen ("persistent" / "transient")
9
+ # TODO: accelerator keys.
10
+ # TODO: use message catalogs for button labels
11
+ # TODO: routines to selectively enable/disable individual command buttons
12
+ # TODO: use megawidgetoid API [$dlg dismiss] vs. [ttk::dialog::dismiss $dlg]
13
+ # TODO: MAYBE: option for app-modal dialogs
14
+ # TODO: MAYBE: [wm withdraw] dialog on dismiss instead of self-destructing
15
+ #
16
+
17
+ package provide ttk::dialog 0.8
18
+
19
+ namespace eval ttk::dialog {
20
+
21
+ variable Config
22
+ #
23
+ # Spacing parameters:
24
+ # (taken from GNOME HIG 2.0, may need adjustment for other platforms)
25
+ # (textwidth just a guess)
26
+ #
27
+ set Config(margin) 12 ;# space between icon and text
28
+ set Config(interspace) 6 ;# horizontal space between buttons
29
+ set Config(sepspace) 24 ;# vertical space above buttons
30
+ set Config(textwidth) 400 ;# width of dialog box text (pixels)
31
+
32
+ variable DialogTypes ;# map -type => list of dialog options
33
+ variable ButtonOptions ;# map button name => list of button options
34
+
35
+ # stockButton -- define new built-in button
36
+ #
37
+ proc stockButton {button args} {
38
+ variable ButtonOptions
39
+ set ButtonOptions($button) $args
40
+ }
41
+
42
+ # Built-in button types:
43
+ #
44
+ stockButton ok -text OK
45
+ stockButton cancel -text Cancel
46
+ stockButton yes -text Yes
47
+ stockButton no -text No
48
+ stockButton retry -text Retry
49
+
50
+ # stockDialog -- define new dialog type.
51
+ #
52
+ proc stockDialog {type args} {
53
+ variable DialogTypes
54
+ set DialogTypes($type) $args
55
+ }
56
+
57
+ # Built-in dialog types:
58
+ #
59
+ stockDialog ok \
60
+ -icon info -buttons {ok} -default ok
61
+ stockDialog okcancel \
62
+ -icon info -buttons {ok cancel} -default ok -cancel cancel
63
+ stockDialog retrycancel \
64
+ -icon question -buttons {retry cancel} -cancel cancel
65
+ stockDialog yesno \
66
+ -icon question -buttons {yes no}
67
+ stockDialog yesnocancel \
68
+ -icon question -buttons {yes no cancel} -cancel cancel
69
+ }
70
+
71
+ ## ttk::dialog::nop --
72
+ # Do nothing (used as a default callback command).
73
+ #
74
+ proc ttk::dialog::nop {args} { }
75
+
76
+ ## ttk::dialog -- dialog box constructor.
77
+ #
78
+ interp alias {} ttk::dialog {} ttk::dialog::Constructor
79
+
80
+ proc ttk::dialog::Constructor {dlg args} {
81
+ upvar #0 $dlg D
82
+ variable Config
83
+ variable ButtonOptions
84
+ variable DialogTypes
85
+
86
+ #
87
+ # Option processing:
88
+ #
89
+ array set defaults {
90
+ -title ""
91
+ -message ""
92
+ -detail ""
93
+ -command ttk::dialog::nop
94
+ -icon ""
95
+ -buttons {}
96
+ -labels {}
97
+ -default {}
98
+ -cancel {}
99
+ -parent #AUTO
100
+ }
101
+
102
+ array set options [array get defaults]
103
+
104
+ foreach {option value} $args {
105
+ if {$option eq "-type"} {
106
+ array set options $DialogTypes($value)
107
+ } elseif {![info exists options($option)]} {
108
+ set validOptions [join [lsort [array names options]] ", "]
109
+ return -code error \
110
+ "Illegal option $option: must be one of $validOptions"
111
+ }
112
+ }
113
+ array set options $args
114
+
115
+ # ...
116
+ #
117
+ array set buttonOptions [array get ::ttk::dialog::ButtonOptions]
118
+ foreach {button label} $options(-labels) {
119
+ lappend buttonOptions($button) -text $label
120
+ }
121
+
122
+ #
123
+ # Initialize dialog private data:
124
+ #
125
+ foreach option {-command -message -detail} {
126
+ set D($option) $options($option)
127
+ }
128
+
129
+ toplevel $dlg -class Dialog; wm withdraw $dlg
130
+
131
+ #
132
+ # Determine default transient parent.
133
+ #
134
+ # NB: menus (including menubars) are considered toplevels,
135
+ # so skip over those.
136
+ #
137
+ if {$options(-parent) eq "#AUTO"} {
138
+ set parent [winfo toplevel [winfo parent $dlg]]
139
+ while {[winfo class $parent] eq "Menu" && $parent ne "."} {
140
+ set parent [winfo toplevel [winfo parent $parent]]
141
+ }
142
+ set options(-parent) $parent
143
+ }
144
+
145
+ #
146
+ # Build dialog:
147
+ #
148
+ if {$options(-parent) ne ""} {
149
+ wm transient $dlg $options(-parent)
150
+ }
151
+ wm title $dlg $options(-title)
152
+ wm protocol $dlg WM_DELETE_WINDOW { }
153
+
154
+ set f [ttk::frame $dlg.f]
155
+
156
+ ttk::label $f.icon
157
+ if {$options(-icon) ne ""} {
158
+ $f.icon configure -image [ttk::stockIcon dialog/$options(-icon)]
159
+ }
160
+ ttk::label $f.message -textvariable ${dlg}(-message) \
161
+ -font TkCaptionFont -wraplength $Config(textwidth)\
162
+ -anchor w -justify left
163
+ ttk::label $f.detail -textvariable ${dlg}(-detail) \
164
+ -font TkTextFont -wraplength $Config(textwidth) \
165
+ -anchor w -justify left
166
+
167
+ #
168
+ # Command buttons:
169
+ #
170
+ set cmd [ttk::frame $f.cmd]
171
+ set column 0
172
+ grid columnconfigure $f.cmd 0 -weight 1
173
+
174
+ foreach button $options(-buttons) {
175
+ incr column
176
+ eval [linsert $buttonOptions($button) 0 ttk::button $cmd.$button]
177
+ $cmd.$button configure -command [list ttk::dialog::Done $dlg $button]
178
+ grid $cmd.$button -row 0 -column $column \
179
+ -padx [list $Config(interspace) 0] -sticky ew
180
+ grid columnconfigure $cmd $column -uniform buttons
181
+ }
182
+
183
+ if {$options(-default) ne ""} {
184
+ keynav::defaultButton $cmd.$options(-default)
185
+ focus $cmd.$options(-default)
186
+ }
187
+ if {$options(-cancel) ne ""} {
188
+ bind $dlg <KeyPress-Escape> \
189
+ [list event generate $cmd.$options(-cancel) <<Invoke>>]
190
+ wm protocol $dlg WM_DELETE_WINDOW \
191
+ [list event generate $cmd.$options(-cancel) <<Invoke>>]
192
+ }
193
+
194
+ #
195
+ # Assemble dialog.
196
+ #
197
+ pack $f.cmd -side bottom -expand false -fill x \
198
+ -pady [list $Config(sepspace) $Config(margin)] -padx $Config(margin)
199
+
200
+ if {0} {
201
+ # GNOME and Apple HIGs say not to use separators.
202
+ # But in case we want them anyway:
203
+ #
204
+ pack [ttk::separator $f.sep -orient horizontal] \
205
+ -side bottom -expand false -fill x \
206
+ -pady [list $Config(sepspace) 0] \
207
+ -padx $Config(margin)
208
+ }
209
+
210
+ if {$options(-icon) ne ""} {
211
+ pack $f.icon -side left -anchor n -expand false \
212
+ -pady $Config(margin) -padx $Config(margin)
213
+ }
214
+
215
+ pack $f.message -side top -expand false -fill x \
216
+ -padx $Config(margin) -pady $Config(margin)
217
+ if {$options(-detail) != ""} {
218
+ pack $f.detail -side top -expand false -fill x \
219
+ -padx $Config(margin)
220
+ }
221
+
222
+ # Client area goes here.
223
+
224
+ pack $f -expand true -fill both
225
+ keynav::enableMnemonics $dlg
226
+ wm deiconify $dlg
227
+ }
228
+
229
+ ## ttk::dialog::clientframe --
230
+ # Returns the widget path of the dialog client frame,
231
+ # creating and managing it if necessary.
232
+ #
233
+ proc ttk::dialog::clientframe {dlg} {
234
+ variable Config
235
+ set client $dlg.f.client
236
+ if {![winfo exists $client]} {
237
+ pack [ttk::frame $client] -side top -expand true -fill both \
238
+ -pady $Config(margin) -padx $Config(margin)
239
+ lower $client ;# so it's first in keyboard traversal order
240
+ }
241
+ return $client
242
+ }
243
+
244
+ ## ttk::dialog::Done --
245
+ # -command callback for dialog command buttons (internal)
246
+ #
247
+ proc ttk::dialog::Done {dlg button} {
248
+ upvar #0 $dlg D
249
+ set rc [catch [linsert $D(-command) end $button] result]
250
+ if {$rc == 1} {
251
+ return -code $rc -errorinfo $::errorInfo -errorcode $::errorCode $result
252
+ } elseif {$rc == 3 || $rc == 4} {
253
+ # break or continue -- don't dismiss dialog
254
+ return
255
+ }
256
+ dismiss $dlg
257
+ }
258
+
259
+ ## ttk::dialog::activate $dlg $button --
260
+ # Simulate a button press.
261
+ #
262
+ proc ttk::dialog::activate {dlg button} {
263
+ event generate $dlg.f.cmd.$button <<Invoke>>
264
+ }
265
+
266
+ ## dismiss --
267
+ # Dismiss the dialog (without invoking any actions).
268
+ #
269
+ proc ttk::dialog::dismiss {dlg} {
270
+ uplevel #0 [list unset $dlg]
271
+ destroy $dlg
272
+ }
273
+
274
+ #*EOF*
@@ -0,0 +1,580 @@
1
+ #
2
+ # entry.tcl,v 1.15 2007/09/30 16:56:11 jenglish Exp
3
+ #
4
+ # DERIVED FROM: tk/library/entry.tcl r1.22
5
+ #
6
+ # Copyright (c) 1992-1994 The Regents of the University of California.
7
+ # Copyright (c) 1994-1997 Sun Microsystems, Inc.
8
+ # Copyright (c) 2004, Joe English
9
+ #
10
+ # See the file "license.terms" for information on usage and redistribution
11
+ # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
12
+ #
13
+
14
+ namespace eval ttk {
15
+ namespace eval entry {
16
+ variable State
17
+
18
+ set State(x) 0
19
+ set State(selectMode) char
20
+ set State(anchor) 0
21
+ set State(scanX) 0
22
+ set State(scanIndex) 0
23
+ set State(scanMoved) 0
24
+
25
+ # Button-2 scan speed is (scanNum/scanDen) characters
26
+ # per pixel of mouse movement.
27
+ # The standard Tk entry widget uses the equivalent of
28
+ # scanNum = 10, scanDen = average character width.
29
+ # I don't know why that was chosen.
30
+ #
31
+ set State(scanNum) 1
32
+ set State(scanDen) 1
33
+ set State(deadband) 3 ;# #pixels for mouse-moved deadband.
34
+ }
35
+ }
36
+
37
+ ### Bindings.
38
+ #
39
+ # Removed the following standard Tk bindings:
40
+ #
41
+ # <Control-Key-space>, <Control-Shift-Key-space>,
42
+ # <Key-Select>, <Shift-Key-Select>:
43
+ # Tile entry widget doesn't use selection anchor.
44
+ # <Key-Insert>:
45
+ # Inserts PRIMARY selection (on non-Windows platforms).
46
+ # This is inconsistent with typical platform bindings.
47
+ # <Double-Shift-ButtonPress-1>, <Triple-Shift-ButtonPress-1>:
48
+ # These don't do the right thing to start with.
49
+ # <Meta-Key-b>, <Meta-Key-d>, <Meta-Key-f>,
50
+ # <Meta-Key-BackSpace>, <Meta-Key-Delete>:
51
+ # Judgment call. If <Meta> happens to be assigned to the Alt key,
52
+ # these could conflict with application accelerators.
53
+ # (Plus, who has a Meta key these days?)
54
+ # <Control-Key-t>:
55
+ # Another judgment call. If anyone misses this, let me know
56
+ # and I'll put it back.
57
+ #
58
+
59
+ ## Clipboard events:
60
+ #
61
+ bind TEntry <<Cut>> { ttk::entry::Cut %W }
62
+ bind TEntry <<Copy>> { ttk::entry::Copy %W }
63
+ bind TEntry <<Paste>> { ttk::entry::Paste %W }
64
+ bind TEntry <<Clear>> { ttk::entry::Clear %W }
65
+
66
+ ## Button1 bindings:
67
+ # Used for selection and navigation.
68
+ #
69
+ bind TEntry <ButtonPress-1> { ttk::entry::Press %W %x }
70
+ bind TEntry <Shift-ButtonPress-1> { ttk::entry::Shift-Press %W %x }
71
+ bind TEntry <Double-ButtonPress-1> { ttk::entry::Select %W %x word }
72
+ bind TEntry <Triple-ButtonPress-1> { ttk::entry::Select %W %x line }
73
+ bind TEntry <B1-Motion> { ttk::entry::Drag %W %x }
74
+
75
+ bind TEntry <B1-Leave> { ttk::Repeatedly ttk::entry::AutoScroll %W }
76
+ bind TEntry <B1-Enter> { ttk::CancelRepeat }
77
+ bind TEntry <ButtonRelease-1> { ttk::CancelRepeat }
78
+
79
+ bind TEntry <Control-ButtonPress-1> {
80
+ %W instate {!readonly !disabled} { %W icursor @%x ; focus %W }
81
+ }
82
+
83
+ ## Button2 bindings:
84
+ # Used for scanning and primary transfer.
85
+ # Note: ButtonRelease-2 is mapped to <<PasteSelection>> in tk.tcl.
86
+ #
87
+ bind TEntry <ButtonPress-2> { ttk::entry::ScanMark %W %x }
88
+ bind TEntry <B2-Motion> { ttk::entry::ScanDrag %W %x }
89
+ bind TEntry <ButtonRelease-2> { ttk::entry::ScanRelease %W %x }
90
+ bind TEntry <<PasteSelection>> { ttk::entry::ScanRelease %W %x }
91
+
92
+ ## Keyboard navigation bindings:
93
+ #
94
+ bind TEntry <Key-Left> { ttk::entry::Move %W prevchar }
95
+ bind TEntry <Key-Right> { ttk::entry::Move %W nextchar }
96
+ bind TEntry <Control-Key-Left> { ttk::entry::Move %W prevword }
97
+ bind TEntry <Control-Key-Right> { ttk::entry::Move %W nextword }
98
+ bind TEntry <Key-Home> { ttk::entry::Move %W home }
99
+ bind TEntry <Key-End> { ttk::entry::Move %W end }
100
+
101
+ bind TEntry <Shift-Key-Left> { ttk::entry::Extend %W prevchar }
102
+ bind TEntry <Shift-Key-Right> { ttk::entry::Extend %W nextchar }
103
+ bind TEntry <Shift-Control-Key-Left> { ttk::entry::Extend %W prevword }
104
+ bind TEntry <Shift-Control-Key-Right> { ttk::entry::Extend %W nextword }
105
+ bind TEntry <Shift-Key-Home> { ttk::entry::Extend %W home }
106
+ bind TEntry <Shift-Key-End> { ttk::entry::Extend %W end }
107
+
108
+ bind TEntry <Control-Key-slash> { %W selection range 0 end }
109
+ bind TEntry <Control-Key-backslash> { %W selection clear }
110
+
111
+ bind TEntry <<TraverseIn>> { %W selection range 0 end; %W icursor end }
112
+
113
+ ## Edit bindings:
114
+ #
115
+ bind TEntry <KeyPress> { ttk::entry::Insert %W %A }
116
+ bind TEntry <Key-Delete> { ttk::entry::Delete %W }
117
+ bind TEntry <Key-BackSpace> { ttk::entry::Backspace %W }
118
+
119
+ # Ignore all Alt, Meta, and Control keypresses unless explicitly bound.
120
+ # Otherwise, the <KeyPress> class binding will fire and insert the character.
121
+ # Ditto for Escape, Return, and Tab.
122
+ #
123
+ bind TEntry <Alt-KeyPress> {# nothing}
124
+ bind TEntry <Meta-KeyPress> {# nothing}
125
+ bind TEntry <Control-KeyPress> {# nothing}
126
+ bind TEntry <Key-Escape> {# nothing}
127
+ bind TEntry <Key-Return> {# nothing}
128
+ bind TEntry <Key-KP_Enter> {# nothing}
129
+ bind TEntry <Key-Tab> {# nothing}
130
+
131
+ # Argh. Apparently on Windows, the NumLock modifier is interpreted
132
+ # as a Command modifier.
133
+ if {[tk windowingsystem] eq "aqua"} {
134
+ bind TEntry <Command-KeyPress> {# nothing}
135
+ }
136
+
137
+ ## Additional emacs-like bindings:
138
+ #
139
+ bind TEntry <Control-Key-a> { ttk::entry::Move %W home }
140
+ bind TEntry <Control-Key-b> { ttk::entry::Move %W prevchar }
141
+ bind TEntry <Control-Key-d> { ttk::entry::Delete %W }
142
+ bind TEntry <Control-Key-e> { ttk::entry::Move %W end }
143
+ bind TEntry <Control-Key-f> { ttk::entry::Move %W nextchar }
144
+ bind TEntry <Control-Key-h> { ttk::entry::Backspace %W }
145
+ bind TEntry <Control-Key-k> { %W delete insert end }
146
+
147
+ ### Clipboard procedures.
148
+ #
149
+
150
+ ## EntrySelection -- Return the selected text of the entry.
151
+ # Raises an error if there is no selection.
152
+ #
153
+ proc ttk::entry::EntrySelection {w} {
154
+ set entryString [string range [$w get] [$w index sel.first] \
155
+ [expr {[$w index sel.last] - 1}]]
156
+ if {[$w cget -show] ne ""} {
157
+ return [string repeat [string index [$w cget -show] 0] \
158
+ [string length $entryString]]
159
+ }
160
+ return $entryString
161
+ }
162
+
163
+ ## Paste -- Insert clipboard contents at current insert point.
164
+ #
165
+ proc ttk::entry::Paste {w} {
166
+ catch {
167
+ set clipboard [::tk::GetSelection $w CLIPBOARD]
168
+ PendingDelete $w
169
+ $w insert insert $clipboard
170
+ See $w insert
171
+ }
172
+ }
173
+
174
+ ## Copy -- Copy selection to clipboard.
175
+ #
176
+ proc ttk::entry::Copy {w} {
177
+ if {![catch {EntrySelection $w} selection]} {
178
+ clipboard clear -displayof $w
179
+ clipboard append -displayof $w $selection
180
+ }
181
+ }
182
+
183
+ ## Clear -- Delete the selection.
184
+ #
185
+ proc ttk::entry::Clear {w} {
186
+ catch { $w delete sel.first sel.last }
187
+ }
188
+
189
+ ## Cut -- Copy selection to clipboard then delete it.
190
+ #
191
+ proc ttk::entry::Cut {w} {
192
+ Copy $w; Clear $w
193
+ }
194
+
195
+ ### Navigation procedures.
196
+ #
197
+
198
+ ## ClosestGap -- Find closest boundary between characters.
199
+ # Returns the index of the character just after the boundary.
200
+ #
201
+ proc ttk::entry::ClosestGap {w x} {
202
+ set pos [$w index @$x]
203
+ set bbox [$w bbox $pos]
204
+ if {$x - [lindex $bbox 0] > [lindex $bbox 2]/2} {
205
+ incr pos
206
+ }
207
+ return $pos
208
+ }
209
+
210
+ ## See $index -- Make sure that the character at $index is visible.
211
+ #
212
+ proc ttk::entry::See {w {index insert}} {
213
+ update idletasks ;# ensure scroll data up-to-date
214
+ set c [$w index $index]
215
+ # @@@ OR: check [$w index left] / [$w index right]
216
+ if {$c < [$w index @0] || $c >= [$w index @[winfo width $w]]} {
217
+ $w xview $c
218
+ }
219
+ }
220
+
221
+ ## NextWord -- Find the next word position.
222
+ # Note: The "next word position" follows platform conventions:
223
+ # either the next end-of-word position, or the start-of-word
224
+ # position following the next end-of-word position.
225
+ #
226
+ set ::ttk::entry::State(startNext) \
227
+ [string equal $tcl_platform(platform) "windows"]
228
+
229
+ proc ttk::entry::NextWord {w start} {
230
+ variable State
231
+ set pos [tcl_endOfWord [$w get] [$w index $start]]
232
+ if {$pos >= 0 && $State(startNext)} {
233
+ set pos [tcl_startOfNextWord [$w get] $pos]
234
+ }
235
+ if {$pos < 0} {
236
+ return end
237
+ }
238
+ return $pos
239
+ }
240
+
241
+ ## PrevWord -- Find the previous word position.
242
+ #
243
+ proc ttk::entry::PrevWord {w start} {
244
+ set pos [tcl_startOfPreviousWord [$w get] [$w index $start]]
245
+ if {$pos < 0} {
246
+ return 0
247
+ }
248
+ return $pos
249
+ }
250
+
251
+ ## RelIndex -- Compute character/word/line-relative index.
252
+ #
253
+ proc ttk::entry::RelIndex {w where {index insert}} {
254
+ switch -- $where {
255
+ prevchar { expr {[$w index $index] - 1} }
256
+ nextchar { expr {[$w index $index] + 1} }
257
+ prevword { PrevWord $w $index }
258
+ nextword { NextWord $w $index }
259
+ home { return 0 }
260
+ end { $w index end }
261
+ default { error "Bad relative index $index" }
262
+ }
263
+ }
264
+
265
+ ## Move -- Move insert cursor to relative location.
266
+ # Also clears the selection, if any, and makes sure
267
+ # that the insert cursor is visible.
268
+ #
269
+ proc ttk::entry::Move {w where} {
270
+ $w icursor [RelIndex $w $where]
271
+ $w selection clear
272
+ See $w insert
273
+ }
274
+
275
+ ### Selection procedures.
276
+ #
277
+
278
+ ## ExtendTo -- Extend the selection to the specified index.
279
+ #
280
+ # The other end of the selection (the anchor) is determined as follows:
281
+ #
282
+ # (1) if there is no selection, the anchor is the insert cursor;
283
+ # (2) if the index is outside the selection, grow the selection;
284
+ # (3) if the insert cursor is at one end of the selection, anchor the other end
285
+ # (4) otherwise anchor the start of the selection
286
+ #
287
+ # The insert cursor is placed at the new end of the selection.
288
+ #
289
+ # Returns: selection anchor.
290
+ #
291
+ proc ttk::entry::ExtendTo {w index} {
292
+ set index [$w index $index]
293
+ set insert [$w index insert]
294
+
295
+ # Figure out selection anchor:
296
+ if {![$w selection present]} {
297
+ set anchor $insert
298
+ } else {
299
+ set selfirst [$w index sel.first]
300
+ set sellast [$w index sel.last]
301
+
302
+ if { ($index < $selfirst)
303
+ || ($insert == $selfirst && $index <= $sellast)
304
+ } {
305
+ set anchor $sellast
306
+ } else {
307
+ set anchor $selfirst
308
+ }
309
+ }
310
+
311
+ # Extend selection:
312
+ if {$anchor < $index} {
313
+ $w selection range $anchor $index
314
+ } else {
315
+ $w selection range $index $anchor
316
+ }
317
+
318
+ $w icursor $index
319
+ return $anchor
320
+ }
321
+
322
+ ## Extend -- Extend the selection to a relative position, show insert cursor
323
+ #
324
+ proc ttk::entry::Extend {w where} {
325
+ ExtendTo $w [RelIndex $w $where]
326
+ See $w
327
+ }
328
+
329
+ ### Button 1 binding procedures.
330
+ #
331
+ # Double-clicking followed by a drag enters "word-select" mode.
332
+ # Triple-clicking enters "line-select" mode.
333
+ #
334
+
335
+ ## Press -- ButtonPress-1 binding.
336
+ # Set the insertion cursor, claim the input focus, set up for
337
+ # future drag operations.
338
+ #
339
+ proc ttk::entry::Press {w x} {
340
+ variable State
341
+
342
+ $w icursor [ClosestGap $w $x]
343
+ $w selection clear
344
+ $w instate !disabled { focus $w }
345
+
346
+ # Set up for future drag, double-click, or triple-click.
347
+ set State(x) $x
348
+ set State(selectMode) char
349
+ set State(anchor) [$w index insert]
350
+ }
351
+
352
+ ## Shift-Press -- Shift-ButtonPress-1 binding.
353
+ # Extends the selection, sets anchor for future drag operations.
354
+ #
355
+ proc ttk::entry::Shift-Press {w x} {
356
+ variable State
357
+
358
+ focus $w
359
+ set anchor [ExtendTo $w @$x]
360
+
361
+ set State(x) $x
362
+ set State(selectMode) char
363
+ set State(anchor) $anchor
364
+ }
365
+
366
+ ## Select $w $x $mode -- Binding for double- and triple- clicks.
367
+ # Selects a word or line (according to mode),
368
+ # and sets the selection mode for subsequent drag operations.
369
+ #
370
+ proc ttk::entry::Select {w x mode} {
371
+ variable State
372
+ set cur [ClosestGap $w $x]
373
+
374
+ switch -- $mode {
375
+ word { WordSelect $w $cur $cur }
376
+ line { LineSelect $w $cur $cur }
377
+ char { # no-op }
378
+ }
379
+
380
+ set State(anchor) $cur
381
+ set State(selectMode) $mode
382
+ }
383
+
384
+ ## Drag -- Button1 motion binding.
385
+ #
386
+ proc ttk::entry::Drag {w x} {
387
+ variable State
388
+ set State(x) $x
389
+ DragTo $w $x
390
+ }
391
+
392
+ ## DragTo $w $x -- Extend selection to $x based on current selection mode.
393
+ #
394
+ proc ttk::entry::DragTo {w x} {
395
+ variable State
396
+
397
+ set cur [ClosestGap $w $x]
398
+ switch $State(selectMode) {
399
+ char { CharSelect $w $State(anchor) $cur }
400
+ word { WordSelect $w $State(anchor) $cur }
401
+ line { LineSelect $w $State(anchor) $cur }
402
+ }
403
+ }
404
+
405
+ ## AutoScroll
406
+ # Called repeatedly when the mouse is outside an entry window
407
+ # with Button 1 down. Scroll the window left or right,
408
+ # depending on where the mouse is, and extend the selection
409
+ # according to the current selection mode.
410
+ #
411
+ # TODO: AutoScroll should repeat faster (50ms) than normal autorepeat.
412
+ # TODO: Need a way for Repeat scripts to cancel themselves.
413
+ #
414
+ proc ttk::entry::AutoScroll {w} {
415
+ variable State
416
+ if {![winfo exists $w]} return
417
+ set x $State(x)
418
+ if {$x > [winfo width $w]} {
419
+ $w xview scroll 2 units
420
+ DragTo $w $x
421
+ } elseif {$x < 0} {
422
+ $w xview scroll -2 units
423
+ DragTo $w $x
424
+ }
425
+ }
426
+
427
+ ## CharSelect -- select characters between index $from and $to
428
+ #
429
+ proc ttk::entry::CharSelect {w from to} {
430
+ if {$to <= $from} {
431
+ $w selection range $to $from
432
+ } else {
433
+ $w selection range $from $to
434
+ }
435
+ $w icursor $to
436
+ }
437
+
438
+ ## WordSelect -- Select whole words between index $from and $to
439
+ #
440
+ proc ttk::entry::WordSelect {w from to} {
441
+ if {$to < $from} {
442
+ set first [WordBack [$w get] $to]
443
+ set last [WordForward [$w get] $from]
444
+ $w icursor $first
445
+ } else {
446
+ set first [WordBack [$w get] $from]
447
+ set last [WordForward [$w get] $to]
448
+ $w icursor $last
449
+ }
450
+ $w selection range $first $last
451
+ }
452
+
453
+ ## WordBack, WordForward -- helper routines for WordSelect.
454
+ #
455
+ proc ttk::entry::WordBack {text index} {
456
+ if {[set pos [tcl_wordBreakBefore $text $index]] < 0} { return 0 }
457
+ return $pos
458
+ }
459
+ proc ttk::entry::WordForward {text index} {
460
+ if {[set pos [tcl_wordBreakAfter $text $index]] < 0} { return end }
461
+ return $pos
462
+ }
463
+
464
+ ## LineSelect -- Select the entire line.
465
+ #
466
+ proc ttk::entry::LineSelect {w _ _} {
467
+ variable State
468
+ $w selection range 0 end
469
+ $w icursor end
470
+ }
471
+
472
+ ### Button 2 binding procedures.
473
+ #
474
+
475
+ ## ScanMark -- ButtonPress-2 binding.
476
+ # Marks the start of a scan or primary transfer operation.
477
+ #
478
+ proc ttk::entry::ScanMark {w x} {
479
+ variable State
480
+ set State(scanX) $x
481
+ set State(scanIndex) [$w index @0]
482
+ set State(scanMoved) 0
483
+ }
484
+
485
+ ## ScanDrag -- Button2 motion binding.
486
+ #
487
+ proc ttk::entry::ScanDrag {w x} {
488
+ variable State
489
+
490
+ set dx [expr {$State(scanX) - $x}]
491
+ if {abs($dx) > $State(deadband)} {
492
+ set State(scanMoved) 1
493
+ }
494
+ set left [expr {$State(scanIndex) + ($dx*$State(scanNum))/$State(scanDen)}]
495
+ $w xview $left
496
+
497
+ if {$left != [set newLeft [$w index @0]]} {
498
+ # We've scanned past one end of the entry;
499
+ # reset the mark so that the text will start dragging again
500
+ # as soon as the mouse reverses direction.
501
+ #
502
+ set State(scanX) $x
503
+ set State(scanIndex) $newLeft
504
+ }
505
+ }
506
+
507
+ ## ScanRelease -- Button2 release binding.
508
+ # Do a primary transfer if the mouse has not moved since the button press.
509
+ #
510
+ proc ttk::entry::ScanRelease {w x} {
511
+ variable State
512
+ if {!$State(scanMoved)} {
513
+ $w instate {!disabled !readonly} {
514
+ $w icursor [ClosestGap $w $x]
515
+ catch {$w insert insert [::tk::GetSelection $w PRIMARY]}
516
+ }
517
+ }
518
+ }
519
+
520
+ ### Insertion and deletion procedures.
521
+ #
522
+
523
+ ## PendingDelete -- Delete selection prior to insert.
524
+ # If the entry currently has a selection, delete it and
525
+ # set the insert position to where the selection was.
526
+ # Returns: 1 if pending delete occurred, 0 if nothing was selected.
527
+ #
528
+ proc ttk::entry::PendingDelete {w} {
529
+ if {[$w selection present]} {
530
+ $w icursor sel.first
531
+ $w delete sel.first sel.last
532
+ return 1
533
+ }
534
+ return 0
535
+ }
536
+
537
+ ## Insert -- Insert text into the entry widget.
538
+ # If a selection is present, the new text replaces it.
539
+ # Otherwise, the new text is inserted at the insert cursor.
540
+ #
541
+ proc ttk::entry::Insert {w s} {
542
+ if {$s eq ""} { return }
543
+ PendingDelete $w
544
+ $w insert insert $s
545
+ See $w insert
546
+ }
547
+
548
+ ## Backspace -- Backspace over the character just before the insert cursor.
549
+ # If there is a selection, delete that instead.
550
+ # If the new insert position is offscreen to the left,
551
+ # scroll to place the cursor at about the middle of the window.
552
+ #
553
+ proc ttk::entry::Backspace {w} {
554
+ if {[PendingDelete $w]} {
555
+ See $w
556
+ return
557
+ }
558
+ set x [expr {[$w index insert] - 1}]
559
+ if {$x < 0} { return }
560
+
561
+ $w delete $x
562
+
563
+ if {[$w index @0] >= [$w index insert]} {
564
+ set range [$w xview]
565
+ set left [lindex $range 0]
566
+ set right [lindex $range 1]
567
+ $w xview moveto [expr {$left - ($right - $left)/2.0}]
568
+ }
569
+ }
570
+
571
+ ## Delete -- Delete the character after the insert cursor.
572
+ # If there is a selection, delete that instead.
573
+ #
574
+ proc ttk::entry::Delete {w} {
575
+ if {![PendingDelete $w]} {
576
+ $w delete insert
577
+ }
578
+ }
579
+
580
+ #*EOF*