Pratt 1.5.6

Sign up to get free protection for your applications and to get access to all the features.
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*