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,61 @@
1
+ /*
2
+ * ttkStubInit.c,v 1.4 2006/08/26 23:06:47 jenglish Exp
3
+ *
4
+ * This file is (mostly) automatically generated from ttk.decls.
5
+ * It is compiled and linked in with the tile package proper.
6
+ */
7
+
8
+ #include "tk.h"
9
+ #include "tkTheme.h"
10
+
11
+ /* !BEGIN!: Do not edit below this line. */
12
+
13
+ TtkStubs ttkStubs = {
14
+ TCL_STUB_MAGIC,
15
+ TTK_STUBS_EPOCH,
16
+ TTK_STUBS_REVISION,
17
+ 0,
18
+ Ttk_GetTheme, /* 0 */
19
+ Ttk_GetDefaultTheme, /* 1 */
20
+ Ttk_GetCurrentTheme, /* 2 */
21
+ Ttk_CreateTheme, /* 3 */
22
+ Ttk_RegisterCleanup, /* 4 */
23
+ Ttk_RegisterElementSpec, /* 5 */
24
+ Ttk_RegisterElement, /* 6 */
25
+ Ttk_RegisterElementFactory, /* 7 */
26
+ Ttk_RegisterLayout, /* 8 */
27
+ 0, /* 9 */
28
+ Ttk_GetStateSpecFromObj, /* 10 */
29
+ Ttk_NewStateSpecObj, /* 11 */
30
+ Ttk_GetStateMapFromObj, /* 12 */
31
+ Ttk_StateMapLookup, /* 13 */
32
+ Ttk_StateTableLookup, /* 14 */
33
+ 0, /* 15 */
34
+ 0, /* 16 */
35
+ 0, /* 17 */
36
+ 0, /* 18 */
37
+ 0, /* 19 */
38
+ Ttk_GetPaddingFromObj, /* 20 */
39
+ Ttk_GetBorderFromObj, /* 21 */
40
+ Ttk_GetStickyFromObj, /* 22 */
41
+ Ttk_MakePadding, /* 23 */
42
+ Ttk_UniformPadding, /* 24 */
43
+ Ttk_AddPadding, /* 25 */
44
+ Ttk_RelievePadding, /* 26 */
45
+ Ttk_MakeBox, /* 27 */
46
+ Ttk_BoxContains, /* 28 */
47
+ Ttk_PackBox, /* 29 */
48
+ Ttk_StickBox, /* 30 */
49
+ Ttk_AnchorBox, /* 31 */
50
+ Ttk_PadBox, /* 32 */
51
+ Ttk_ExpandBox, /* 33 */
52
+ Ttk_PlaceBox, /* 34 */
53
+ Ttk_NewBoxObj, /* 35 */
54
+ 0, /* 36 */
55
+ 0, /* 37 */
56
+ 0, /* 38 */
57
+ 0, /* 39 */
58
+ Ttk_GetOrientFromObj, /* 40 */
59
+ };
60
+
61
+ /* !END!: Do not edit above this line. */
@@ -0,0 +1,70 @@
1
+ /*
2
+ * ttkStubLib.c,v 1.4 2006/11/11 22:16:41 jenglish Exp
3
+ * SOURCE: tk/generic/tkStubLib.c, version 1.9 2004/03/17
4
+ */
5
+
6
+ #include "tk.h"
7
+
8
+ #define USE_TTK_STUBS 1
9
+ #include "tkTheme.h"
10
+
11
+ const TtkStubs *ttkStubsPtr;
12
+
13
+ /*
14
+ *----------------------------------------------------------------------
15
+ *
16
+ * TtkInitializeStubs --
17
+ * Load the tile package, initialize stub table pointer.
18
+ * Do not call this function directly, use Ttk_InitStubs() macro instead.
19
+ *
20
+ * Results:
21
+ * The actual version of the package that satisfies the request, or
22
+ * NULL to indicate that an error occurred.
23
+ *
24
+ * Side effects:
25
+ * Sets the stub table pointer.
26
+ *
27
+ */
28
+ const char *
29
+ TtkInitializeStubs(
30
+ Tcl_Interp *interp, const char *version, int epoch, int revision)
31
+ {
32
+ int exact = 0;
33
+ const char *packageName = "tile";
34
+ const char *errMsg = NULL;
35
+ ClientData pkgClientData = NULL;
36
+ const char *actualVersion= Tcl_PkgRequireEx(
37
+ interp, packageName, version, exact, &pkgClientData);
38
+ TtkStubs *stubsPtr = pkgClientData;
39
+
40
+ if (!actualVersion) {
41
+ return NULL;
42
+ }
43
+
44
+ if (!stubsPtr) {
45
+ errMsg = "missing stub table pointer";
46
+ goto error;
47
+ }
48
+ if (stubsPtr->epoch != epoch) {
49
+ errMsg = "epoch number mismatch";
50
+ goto error;
51
+ }
52
+ if (stubsPtr->revision < revision) {
53
+ errMsg = "require later revision";
54
+ goto error;
55
+ }
56
+
57
+ ttkStubsPtr = stubsPtr;
58
+ return actualVersion;
59
+
60
+ error:
61
+ Tcl_ResetResult(interp);
62
+ Tcl_AppendResult(interp,
63
+ "Error loading ", packageName, " package",
64
+ " (requested version '", version,
65
+ "', loaded version '", actualVersion, "'): ",
66
+ errMsg,
67
+ NULL);
68
+ return NULL;
69
+ }
70
+
@@ -0,0 +1,785 @@
1
+ /* widget.c,v 1.52 2007/10/30 14:58:59 jenglish Exp
2
+ * Copyright (c) 2003, Joe English
3
+ *
4
+ * Core widget utilities.
5
+ */
6
+
7
+ #include <string.h>
8
+ #include <tk.h>
9
+ #include "tkTheme.h"
10
+ #include "widget.h"
11
+
12
+ /*------------------------------------------------------------------------
13
+ * +++ Internal helper routines.
14
+ */
15
+
16
+ /* UpdateLayout --
17
+ * Call the widget's get-layout hook to recompute corePtr->layout.
18
+ * Returns TCL_OK if successful, returns TCL_ERROR and leaves
19
+ * the layout unchanged otherwise.
20
+ */
21
+ static int UpdateLayout(Tcl_Interp *interp, WidgetCore *corePtr)
22
+ {
23
+ Ttk_Theme themePtr = Ttk_GetCurrentTheme(interp);
24
+ Ttk_Layout newLayout =
25
+ corePtr->widgetSpec->getLayoutProc(interp, themePtr,corePtr);
26
+
27
+ if (newLayout) {
28
+ if (corePtr->layout) {
29
+ Ttk_FreeLayout(corePtr->layout);
30
+ }
31
+ corePtr->layout = newLayout;
32
+ return TCL_OK;
33
+ }
34
+ return TCL_ERROR;
35
+ }
36
+
37
+ /* SizeChanged --
38
+ * Call the widget's sizeProc to compute new requested size
39
+ * and pass it to the geometry manager.
40
+ */
41
+ static void SizeChanged(WidgetCore *corePtr)
42
+ {
43
+ int reqWidth = 1, reqHeight = 1;
44
+
45
+ if (corePtr->widgetSpec->sizeProc(corePtr,&reqWidth,&reqHeight)) {
46
+ Tk_GeometryRequest(corePtr->tkwin, reqWidth, reqHeight);
47
+ }
48
+ }
49
+
50
+ #ifndef TK_NO_DOUBLE_BUFFERING
51
+
52
+ /* BeginDrawing --
53
+ * Returns a Drawable for drawing the widget contents.
54
+ * This is normally an off-screen Pixmap, copied to
55
+ * the window by EndDrawing().
56
+ */
57
+ static Drawable BeginDrawing(Tk_Window tkwin)
58
+ {
59
+ return Tk_GetPixmap(Tk_Display(tkwin), Tk_WindowId(tkwin),
60
+ Tk_Width(tkwin), Tk_Height(tkwin),
61
+ DefaultDepthOfScreen(Tk_Screen(tkwin)));
62
+ }
63
+
64
+ /* EndDrawing --
65
+ * Copy the drawable contents to the screen and release resources.
66
+ */
67
+ static void EndDrawing(Tk_Window tkwin, Drawable d)
68
+ {
69
+ XGCValues gcValues;
70
+ GC gc;
71
+
72
+ gcValues.function = GXcopy;
73
+ gcValues.graphics_exposures = False;
74
+ gc = Tk_GetGC(tkwin, GCFunction|GCGraphicsExposures, &gcValues);
75
+
76
+ XCopyArea(Tk_Display(tkwin), d, Tk_WindowId(tkwin), gc,
77
+ 0, 0, (unsigned) Tk_Width(tkwin), (unsigned) Tk_Height(tkwin),
78
+ 0, 0);
79
+
80
+ Tk_FreePixmap(Tk_Display(tkwin), d);
81
+ Tk_FreeGC(Tk_Display(tkwin), gc);
82
+ }
83
+ #else
84
+ /* No double-buffering: draw directly into the window. */
85
+ static Drawable BeginDrawing(Tk_Window tkwin) { return Tk_WindowId(tkwin); }
86
+ static void EndDrawing(Tk_Window tkwin, Drawable d) { }
87
+ #endif
88
+
89
+ /* DrawWidget --
90
+ * Redraw a widget. Called as an idle handler.
91
+ */
92
+ static void DrawWidget(ClientData recordPtr)
93
+ {
94
+ WidgetCore *corePtr = recordPtr;
95
+
96
+ corePtr->flags &= ~REDISPLAY_PENDING;
97
+ if (Tk_IsMapped(corePtr->tkwin)) {
98
+ Drawable d = BeginDrawing(corePtr->tkwin);
99
+ corePtr->widgetSpec->layoutProc(recordPtr);
100
+ corePtr->widgetSpec->displayProc(recordPtr, d);
101
+ EndDrawing(corePtr->tkwin, d);
102
+ }
103
+ }
104
+
105
+ /* TtkRedisplayWidget --
106
+ * Schedule redisplay as an idle handler.
107
+ */
108
+ void TtkRedisplayWidget(WidgetCore *corePtr)
109
+ {
110
+ if (corePtr->flags & WIDGET_DESTROYED) {
111
+ return;
112
+ }
113
+
114
+ if (!(corePtr->flags & REDISPLAY_PENDING)) {
115
+ Tcl_DoWhenIdle(DrawWidget, (ClientData) corePtr);
116
+ corePtr->flags |= REDISPLAY_PENDING;
117
+ }
118
+ }
119
+
120
+ /* TtkResizeWidget --
121
+ * Recompute widget size, schedule geometry propagation and redisplay.
122
+ */
123
+ void TtkResizeWidget(WidgetCore *corePtr)
124
+ {
125
+ if (corePtr->flags & WIDGET_DESTROYED) {
126
+ return;
127
+ }
128
+
129
+ SizeChanged(corePtr);
130
+ TtkRedisplayWidget(corePtr);
131
+ }
132
+
133
+ /* TtkWidgetChangeState --
134
+ * Set / clear the specified bits in the 'state' flag,
135
+ */
136
+ void TtkWidgetChangeState(WidgetCore *corePtr,
137
+ unsigned int setBits, unsigned int clearBits)
138
+ {
139
+ Ttk_State oldState = corePtr->state;
140
+ corePtr->state = (oldState & ~clearBits) | setBits;
141
+ if (corePtr->state ^ oldState) {
142
+ TtkRedisplayWidget(corePtr);
143
+ }
144
+ }
145
+
146
+ /* TtkWidgetEnsembleCommand --
147
+ * Invoke an ensemble defined by a WidgetCommandSpec.
148
+ */
149
+ int TtkWidgetEnsembleCommand(
150
+ const WidgetCommandSpec *commands, /* Ensemble definition */
151
+ int cmdIndex, /* Index of command word */
152
+ Tcl_Interp *interp, /* Interpreter to use */
153
+ int objc, Tcl_Obj *const objv[], /* Argument vector */
154
+ void *clientData) /* User data (widget record pointer) */
155
+ {
156
+ int index;
157
+
158
+ if (objc <= cmdIndex) {
159
+ Tcl_WrongNumArgs(interp, cmdIndex, objv, "option ?arg arg...?");
160
+ return TCL_ERROR;
161
+ }
162
+ if (Tcl_GetIndexFromObjStruct(interp, objv[cmdIndex], commands,
163
+ sizeof(commands[0]), "command", 0, &index) != TCL_OK)
164
+ {
165
+ return TCL_ERROR;
166
+ }
167
+ return commands[index].command(interp, objc, objv, clientData);
168
+ }
169
+
170
+ /*
171
+ * WidgetInstanceObjCmd --
172
+ * Widget instance command implementation.
173
+ */
174
+ static int
175
+ WidgetInstanceObjCmd(
176
+ ClientData clientData, /* Widget record pointer */
177
+ Tcl_Interp *interp, /* Current interpreter. */
178
+ int objc, /* Number of arguments. */
179
+ Tcl_Obj * const objv[]) /* Argument objects. */
180
+ {
181
+ WidgetCore *corePtr = (WidgetCore *)clientData;
182
+ const WidgetCommandSpec *commands = corePtr->widgetSpec->commands;
183
+ int status = TCL_OK;
184
+
185
+ Tcl_Preserve(clientData);
186
+ status = TtkWidgetEnsembleCommand(commands,1, interp,objc,objv,clientData);
187
+ Tcl_Release(clientData);
188
+
189
+ return status;
190
+ }
191
+
192
+ /*
193
+ * Command deletion callback for widget instance commands.
194
+ */
195
+ static void
196
+ WidgetInstanceObjCmdDeleted(ClientData clientData)
197
+ {
198
+ WidgetCore *corePtr = (WidgetCore *) clientData;
199
+ corePtr->widgetCmd = NULL;
200
+ if (corePtr->tkwin != NULL)
201
+ Tk_DestroyWindow(corePtr->tkwin);
202
+ }
203
+
204
+ /*
205
+ * WidgetCleanup --
206
+ * Final cleanup for widget.
207
+ *
208
+ * @@@ TODO: check all code paths leading to widget destruction,
209
+ * @@@ describe here.
210
+ * @@@ Call widget-specific cleanup routine at an appropriate point.
211
+ */
212
+ static void
213
+ WidgetCleanup(char *memPtr)
214
+ {
215
+ ckfree(memPtr);
216
+ }
217
+
218
+ /*
219
+ * CoreEventProc --
220
+ * Event handler for basic events.
221
+ * Processes Expose, Configure, FocusIn/Out, and Destroy events.
222
+ * Also handles <<ThemeChanged>> virtual events.
223
+ *
224
+ * For Expose and Configure, simply schedule the widget for redisplay.
225
+ * For Destroy events, handle the cleanup process.
226
+ *
227
+ * For Focus events, set/clear the focus bit in the state field.
228
+ * It turns out this is impossible to do correctly in a binding script,
229
+ * because Tk filters out focus events with detail == NotifyInferior.
230
+ *
231
+ * For Deactivate/Activate pseudo-events, clear/set the background state flag.
232
+ *
233
+ * <<NOTE-REALIZED>> On the first ConfigureNotify event
234
+ * (which indicates that the window has just been created),
235
+ * update the layout. This is to work around two problems:
236
+ * (1) Virtual events aren't delivered to unrealized widgets
237
+ * (see bug #835997), so any intervening <<ThemeChanged>> events
238
+ * will not have been processed.
239
+ *
240
+ * (2) Geometry calculations in the XP theme don't work
241
+ * until the widget is realized.
242
+ */
243
+
244
+ static const unsigned CoreEventMask
245
+ = ExposureMask
246
+ | StructureNotifyMask
247
+ | FocusChangeMask
248
+ | VirtualEventMask
249
+ | ActivateMask
250
+ ;
251
+
252
+ static void CoreEventProc(ClientData clientData, XEvent *eventPtr)
253
+ {
254
+ WidgetCore *corePtr = (WidgetCore *) clientData;
255
+
256
+ switch (eventPtr->type)
257
+ {
258
+ case ConfigureNotify :
259
+ if (!(corePtr->flags & WIDGET_REALIZED)) {
260
+ /* See <<NOTE-REALIZED>> */
261
+ (void)UpdateLayout(corePtr->interp, corePtr);
262
+ SizeChanged(corePtr);
263
+ corePtr->flags |= WIDGET_REALIZED;
264
+ }
265
+ TtkRedisplayWidget(corePtr);
266
+ break;
267
+ case Expose :
268
+ if (eventPtr->xexpose.count == 0) {
269
+ TtkRedisplayWidget(corePtr);
270
+ }
271
+ break;
272
+ case DestroyNotify :
273
+ corePtr->flags |= WIDGET_DESTROYED;
274
+
275
+ Tk_DeleteEventHandler(corePtr->tkwin,
276
+ CoreEventMask,CoreEventProc,clientData);
277
+
278
+ if (corePtr->flags & REDISPLAY_PENDING) {
279
+ Tcl_CancelIdleCall(DrawWidget, clientData);
280
+ }
281
+
282
+ corePtr->widgetSpec->cleanupProc(corePtr);
283
+
284
+ Tk_FreeConfigOptions(
285
+ clientData, corePtr->optionTable, corePtr->tkwin);
286
+ corePtr->tkwin = NULL;
287
+
288
+ if (corePtr->layout) {
289
+ Ttk_FreeLayout(corePtr->layout);
290
+ }
291
+
292
+ /* NB: this can reenter the interpreter via a command traces */
293
+ if (corePtr->widgetCmd) {
294
+ Tcl_Command cmd = corePtr->widgetCmd;
295
+ corePtr->widgetCmd = 0;
296
+ Tcl_DeleteCommandFromToken(corePtr->interp, cmd);
297
+ }
298
+ Tcl_EventuallyFree(clientData, WidgetCleanup);
299
+ break;
300
+
301
+ case FocusIn:
302
+ case FocusOut:
303
+ /* Don't process "virtual crossing" events */
304
+ if ( eventPtr->xfocus.detail == NotifyInferior
305
+ || eventPtr->xfocus.detail == NotifyAncestor
306
+ || eventPtr->xfocus.detail == NotifyNonlinear)
307
+ {
308
+ if (eventPtr->type == FocusIn)
309
+ corePtr->state |= TTK_STATE_FOCUS;
310
+ else
311
+ corePtr->state &= ~TTK_STATE_FOCUS;
312
+ TtkRedisplayWidget(corePtr);
313
+ }
314
+ break;
315
+ case ActivateNotify:
316
+ corePtr->state &= ~TTK_STATE_BACKGROUND;
317
+ TtkRedisplayWidget(corePtr);
318
+ break;
319
+ case DeactivateNotify:
320
+ corePtr->state |= TTK_STATE_BACKGROUND;
321
+ TtkRedisplayWidget(corePtr);
322
+ break;
323
+ case VirtualEvent:
324
+ if (!strcmp("ThemeChanged", ((XVirtualEvent *)(eventPtr))->name)) {
325
+ (void)UpdateLayout(corePtr->interp, corePtr);
326
+ SizeChanged(corePtr);
327
+ TtkRedisplayWidget(corePtr);
328
+ }
329
+ default:
330
+ /* can't happen... */
331
+ break;
332
+ }
333
+ }
334
+
335
+ /*
336
+ * WidgetWorldChanged --
337
+ * Default Tk_ClassWorldChangedProc() for widgets.
338
+ * Invoked whenever fonts or other system resources are changed;
339
+ * recomputes geometry.
340
+ */
341
+ static void WidgetWorldChanged(ClientData clientData)
342
+ {
343
+ WidgetCore *corePtr = (WidgetCore*)clientData;
344
+ SizeChanged(corePtr);
345
+ TtkRedisplayWidget(corePtr);
346
+ }
347
+
348
+ static struct Tk_ClassProcs widgetClassProcs = {
349
+ sizeof(Tk_ClassProcs),
350
+ WidgetWorldChanged
351
+ };
352
+
353
+ /*
354
+ * TtkWidgetConstructorObjCmd --
355
+ * General-purpose widget constructor command implementation.
356
+ * ClientData is a WidgetSpec *.
357
+ */
358
+ int TtkWidgetConstructorObjCmd(
359
+ ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
360
+ {
361
+ WidgetSpec *widgetSpec = (WidgetSpec *)clientData;
362
+ const char *className = widgetSpec->className;
363
+ WidgetCore *corePtr;
364
+ ClientData recordPtr;
365
+ Tk_Window tkwin;
366
+ Tk_OptionTable optionTable;
367
+ int i;
368
+
369
+ if (objc < 2 || objc % 1 == 1) {
370
+ Tcl_WrongNumArgs(interp, 1, objv, "pathName ?options?");
371
+ return TCL_ERROR;
372
+ }
373
+
374
+ tkwin = Tk_CreateWindowFromPath(interp, Tk_MainWindow(interp),
375
+ Tcl_GetStringFromObj(objv[1], NULL), (char *) NULL);
376
+ if (tkwin == NULL)
377
+ return TCL_ERROR;
378
+
379
+ /*
380
+ * Check if a -class resource has been specified:
381
+ * We have to do this before the InitOptions() call,
382
+ * since InitOptions() is affected by the widget class.
383
+ */
384
+ for (i = 2; i < objc; i += 2) {
385
+ const char *resourceName = Tcl_GetString(objv[i]);
386
+ if (!strcmp(resourceName, "-class")) {
387
+ className = Tcl_GetString(objv[i+1]);
388
+ break;
389
+ }
390
+ }
391
+
392
+ Tk_SetClass(tkwin, className);
393
+
394
+ /*
395
+ * Set the BackgroundPixmap to ParentRelative here, so
396
+ * subclasses don't need to worry about setting the background.
397
+ */
398
+ Tk_SetWindowBackgroundPixmap(tkwin, ParentRelative);
399
+
400
+ optionTable = Tk_CreateOptionTable(interp, widgetSpec->optionSpecs);
401
+
402
+ /*
403
+ * Allocate and initialize the widget record.
404
+ */
405
+ recordPtr = ckalloc(widgetSpec->recordSize);
406
+ memset(recordPtr, 0, widgetSpec->recordSize);
407
+ corePtr = (WidgetCore *)recordPtr;
408
+
409
+ corePtr->tkwin = tkwin;
410
+ corePtr->interp = interp;
411
+ corePtr->widgetSpec = widgetSpec;
412
+ corePtr->widgetCmd = Tcl_CreateObjCommand(interp, Tk_PathName(tkwin),
413
+ WidgetInstanceObjCmd, recordPtr, WidgetInstanceObjCmdDeleted);
414
+ corePtr->optionTable = optionTable;
415
+
416
+ Tk_SetClassProcs(tkwin, &widgetClassProcs, recordPtr);
417
+
418
+ if (Tk_InitOptions(interp, recordPtr, optionTable, tkwin) != TCL_OK)
419
+ goto error_nocleanup;
420
+
421
+ if (widgetSpec->initializeProc(interp, recordPtr) != TCL_OK)
422
+ goto error_nocleanup;
423
+
424
+ if (Tk_SetOptions(interp, recordPtr, optionTable, objc - 2,
425
+ objv + 2, tkwin, NULL/*savePtr*/, (int *)NULL/*maskPtr*/) != TCL_OK)
426
+ goto error;
427
+
428
+ if (widgetSpec->configureProc(interp, recordPtr, ~0) != TCL_OK)
429
+ goto error;
430
+
431
+ if (widgetSpec->postConfigureProc(interp, recordPtr, ~0) != TCL_OK)
432
+ goto error;
433
+
434
+ if (WidgetDestroyed(corePtr))
435
+ goto error;
436
+
437
+ if (UpdateLayout(interp, corePtr) != TCL_OK)
438
+ goto error;
439
+
440
+ SizeChanged(corePtr);
441
+ Tk_CreateEventHandler(tkwin, CoreEventMask, CoreEventProc, recordPtr);
442
+
443
+ Tcl_SetObjResult(interp, Tcl_NewStringObj(Tk_PathName(tkwin), -1));
444
+
445
+ return TCL_OK;
446
+
447
+ error:
448
+ widgetSpec->cleanupProc(recordPtr);
449
+ error_nocleanup:
450
+ if (corePtr->layout) {
451
+ Ttk_FreeLayout(corePtr->layout);
452
+ corePtr->layout = 0;
453
+ }
454
+ Tk_FreeConfigOptions(recordPtr, optionTable, tkwin);
455
+ Tk_DestroyWindow(tkwin);
456
+ corePtr->tkwin = 0;
457
+ Tcl_DeleteCommandFromToken(interp, corePtr->widgetCmd);
458
+ ckfree(recordPtr);
459
+ return TCL_ERROR;
460
+ }
461
+
462
+ /*------------------------------------------------------------------------
463
+ * +++ Default implementations for widget hook procedures.
464
+ */
465
+
466
+ /* TtkWidgetGetLayout --
467
+ * Default getLayoutProc.
468
+ * Looks up the layout based on the -style resource (if specified),
469
+ * otherwise use the widget class.
470
+ */
471
+ Ttk_Layout TtkWidgetGetLayout(
472
+ Tcl_Interp *interp, Ttk_Theme themePtr, void *recordPtr)
473
+ {
474
+ WidgetCore *corePtr = recordPtr;
475
+ const char *styleName = 0;
476
+
477
+ if (corePtr->styleObj)
478
+ styleName = Tcl_GetString(corePtr->styleObj);
479
+
480
+ if (!styleName || *styleName == '\0')
481
+ styleName = corePtr->widgetSpec->className;
482
+
483
+ return Ttk_CreateLayout(interp, themePtr, styleName,
484
+ recordPtr, corePtr->optionTable, corePtr->tkwin);
485
+ }
486
+
487
+ /*
488
+ * TtkWidgetGetOrientedLayout --
489
+ * Helper routine. Same as TtkWidgetGetLayout, but prefixes
490
+ * "Horizontal." or "Vertical." to the style name, depending
491
+ * on the value of the 'orient' option.
492
+ */
493
+ Ttk_Layout TtkWidgetGetOrientedLayout(
494
+ Tcl_Interp *interp, Ttk_Theme themePtr, void *recordPtr, Tcl_Obj *orientObj)
495
+ {
496
+ WidgetCore *corePtr = recordPtr;
497
+ const char *baseStyleName = 0;
498
+ Tcl_DString styleName;
499
+ int orient = TTK_ORIENT_HORIZONTAL;
500
+ Ttk_Layout layout;
501
+
502
+ Tcl_DStringInit(&styleName);
503
+
504
+ /* Prefix:
505
+ */
506
+ Ttk_GetOrientFromObj(NULL, orientObj, &orient);
507
+ if (orient == TTK_ORIENT_HORIZONTAL)
508
+ Tcl_DStringAppend(&styleName, "Horizontal.", -1);
509
+ else
510
+ Tcl_DStringAppend(&styleName, "Vertical.", -1);
511
+
512
+ /* Add base style name:
513
+ */
514
+ if (corePtr->styleObj)
515
+ baseStyleName = Tcl_GetString(corePtr->styleObj);
516
+ if (!baseStyleName || *baseStyleName == '\0')
517
+ baseStyleName = corePtr->widgetSpec->className;
518
+
519
+ Tcl_DStringAppend(&styleName, baseStyleName, -1);
520
+
521
+ /* Create layout:
522
+ */
523
+ layout= Ttk_CreateLayout(interp, themePtr, Tcl_DStringValue(&styleName),
524
+ recordPtr, corePtr->optionTable, corePtr->tkwin);
525
+
526
+ Tcl_DStringFree(&styleName);
527
+
528
+ return layout;
529
+ }
530
+
531
+ /* TtkNullInitialize --
532
+ * Default widget initializeProc (no-op)
533
+ */
534
+ int TtkNullInitialize(Tcl_Interp *interp, void *recordPtr)
535
+ {
536
+ return TCL_OK;
537
+ }
538
+
539
+ /* TtkNullPostConfigure --
540
+ * Default widget postConfigureProc (no-op)
541
+ */
542
+ int TtkNullPostConfigure(Tcl_Interp *interp, void *clientData, int mask)
543
+ {
544
+ return TCL_OK;
545
+ }
546
+
547
+ /* TtkCoreConfigure --
548
+ * Default widget configureProc.
549
+ * Handles -style option.
550
+ */
551
+ int TtkCoreConfigure(Tcl_Interp *interp, void *clientData, int mask)
552
+ {
553
+ WidgetCore *corePtr = clientData;
554
+ int status = TCL_OK;
555
+
556
+ if (mask & STYLE_CHANGED) {
557
+ status = UpdateLayout(interp, corePtr);
558
+ }
559
+
560
+ return status;
561
+ }
562
+
563
+ /* TtkNullCleanup --
564
+ * Default widget cleanupProc (no-op)
565
+ */
566
+ void TtkNullCleanup(void *recordPtr)
567
+ {
568
+ return;
569
+ }
570
+
571
+ /* TtkWidgetDoLayout --
572
+ * Default widget layoutProc.
573
+ */
574
+ void TtkWidgetDoLayout(void *clientData)
575
+ {
576
+ WidgetCore *corePtr = clientData;
577
+ Ttk_PlaceLayout(corePtr->layout,corePtr->state,Ttk_WinBox(corePtr->tkwin));
578
+ }
579
+
580
+ /* TtkWidgetDisplay --
581
+ * Default widget displayProc.
582
+ */
583
+ void TtkWidgetDisplay(void *recordPtr, Drawable d)
584
+ {
585
+ WidgetCore *corePtr = recordPtr;
586
+ Ttk_DrawLayout(corePtr->layout, corePtr->state, d);
587
+ }
588
+
589
+ /* TtkWidgetSize --
590
+ * Default widget sizeProc()
591
+ */
592
+ int TtkWidgetSize(void *recordPtr, int *widthPtr, int *heightPtr)
593
+ {
594
+ WidgetCore *corePtr = recordPtr;
595
+ Ttk_LayoutSize(corePtr->layout, corePtr->state, widthPtr, heightPtr);
596
+ return 1;
597
+ }
598
+
599
+ /*------------------------------------------------------------------------
600
+ * +++ Default implementations for widget subcommands.
601
+ */
602
+
603
+ /* $w cget -option
604
+ */
605
+ int TtkWidgetCgetCommand(
606
+ Tcl_Interp *interp, int objc, Tcl_Obj * CONST objv[], void *recordPtr)
607
+ {
608
+ WidgetCore *corePtr = recordPtr;
609
+ Tcl_Obj *result;
610
+
611
+ if (objc != 3) {
612
+ Tcl_WrongNumArgs(interp, 2, objv, "option");
613
+ return TCL_ERROR;
614
+ }
615
+ result = Tk_GetOptionValue(interp, recordPtr,
616
+ corePtr->optionTable, objv[2], corePtr->tkwin);
617
+ if (result == NULL)
618
+ return TCL_ERROR;
619
+ Tcl_SetObjResult(interp, result);
620
+ return TCL_OK;
621
+ }
622
+
623
+ /* $w configure ?-option ?value ....??
624
+ */
625
+ int TtkWidgetConfigureCommand(
626
+ Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[], void *recordPtr)
627
+ {
628
+ WidgetCore *corePtr = recordPtr;
629
+ Tcl_Obj *result;
630
+
631
+ if (objc == 2) {
632
+ result = Tk_GetOptionInfo(interp, recordPtr,
633
+ corePtr->optionTable, (Tcl_Obj *) NULL, corePtr->tkwin);
634
+ } else if (objc == 3) {
635
+ result = Tk_GetOptionInfo(interp, recordPtr,
636
+ corePtr->optionTable, objv[2], corePtr->tkwin);
637
+ } else {
638
+ Tk_SavedOptions savedOptions;
639
+ int status;
640
+ int mask = 0;
641
+
642
+ status = Tk_SetOptions(interp, recordPtr,
643
+ corePtr->optionTable, objc - 2, objv + 2,
644
+ corePtr->tkwin, &savedOptions, &mask);
645
+ if (status != TCL_OK)
646
+ return status;
647
+
648
+ if (mask & READONLY_OPTION) {
649
+ Tcl_SetResult(interp,
650
+ "Attempt to change read-only option", TCL_STATIC);
651
+ Tk_RestoreSavedOptions(&savedOptions);
652
+ return TCL_ERROR;
653
+ }
654
+
655
+ status = corePtr->widgetSpec->configureProc(interp, recordPtr, mask);
656
+ if (status != TCL_OK) {
657
+ Tk_RestoreSavedOptions(&savedOptions);
658
+ return status;
659
+ }
660
+ Tk_FreeSavedOptions(&savedOptions);
661
+
662
+ status = corePtr->widgetSpec->postConfigureProc(interp,recordPtr,mask);
663
+ if (status != TCL_OK) {
664
+ return status;
665
+ }
666
+
667
+ if (mask & (STYLE_CHANGED | GEOMETRY_CHANGED)) {
668
+ SizeChanged(corePtr);
669
+ }
670
+
671
+ TtkRedisplayWidget(corePtr);
672
+ result = Tcl_NewObj();
673
+ }
674
+
675
+ if (result == 0) {
676
+ return TCL_ERROR;
677
+ }
678
+ Tcl_SetObjResult(interp, result);
679
+ return TCL_OK;
680
+ }
681
+
682
+ /* $w state ? $stateSpec ?
683
+ *
684
+ * If $stateSpec is specified, modify the widget state accordingly,
685
+ * return a new stateSpec representing the changed bits.
686
+ *
687
+ * Otherwise, return a statespec matching all the currently-set bits.
688
+ */
689
+
690
+ int TtkWidgetStateCommand(
691
+ Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[], void *recordPtr)
692
+ {
693
+ WidgetCore *corePtr = recordPtr;
694
+ Ttk_StateSpec spec;
695
+ int status;
696
+ Ttk_State oldState, changed;
697
+
698
+ if (objc == 2) {
699
+ Tcl_SetObjResult(interp,
700
+ Ttk_NewStateSpecObj(corePtr->state, 0ul));
701
+ return TCL_OK;
702
+ }
703
+
704
+ if (objc != 3) {
705
+ Tcl_WrongNumArgs(interp, 2, objv, "state-spec");
706
+ return TCL_ERROR;
707
+ }
708
+ status = Ttk_GetStateSpecFromObj(interp, objv[2], &spec);
709
+ if (status != TCL_OK)
710
+ return status;
711
+
712
+ oldState = corePtr->state;
713
+ corePtr->state = Ttk_ModifyState(corePtr->state, &spec);
714
+ changed = corePtr->state ^ oldState;
715
+
716
+ TtkRedisplayWidget(corePtr);
717
+
718
+ Tcl_SetObjResult(interp,
719
+ Ttk_NewStateSpecObj(oldState & changed, ~oldState & changed));
720
+ return status;
721
+ }
722
+
723
+ /* $w instate $stateSpec ?$script?
724
+ *
725
+ * Tests if widget state matches $stateSpec.
726
+ * If $script is specified, execute script if state matches.
727
+ * Otherwise, return true/false
728
+ */
729
+
730
+ int TtkWidgetInstateCommand(
731
+ Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[], void *recordPtr)
732
+ {
733
+ WidgetCore *corePtr = recordPtr;
734
+ Ttk_State state = corePtr->state;
735
+ Ttk_StateSpec spec;
736
+ int status = TCL_OK;
737
+
738
+ if (objc < 3 || objc > 4) {
739
+ Tcl_WrongNumArgs(interp, 2, objv, "state-spec ?script?");
740
+ return TCL_ERROR;
741
+ }
742
+ status = Ttk_GetStateSpecFromObj(interp, objv[2], &spec);
743
+ if (status != TCL_OK)
744
+ return status;
745
+
746
+ if (objc == 3) {
747
+ Tcl_SetObjResult(interp,
748
+ Tcl_NewBooleanObj(Ttk_StateMatches(state,&spec)));
749
+ } else if (objc == 4) {
750
+ if (Ttk_StateMatches(state,&spec)) {
751
+ status = Tcl_EvalObjEx(interp, objv[3], 0);
752
+ }
753
+ }
754
+ return status;
755
+ }
756
+
757
+ /* $w identify $x $y
758
+ * Returns: name of element at $x, $y
759
+ */
760
+ int TtkWidgetIdentifyCommand(
761
+ Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[], void *recordPtr)
762
+ {
763
+ WidgetCore *corePtr = recordPtr;
764
+ Ttk_LayoutNode *node;
765
+ int x, y;
766
+
767
+ if (objc != 4) {
768
+ Tcl_WrongNumArgs(interp, 2, objv, "x y");
769
+ return TCL_ERROR;
770
+ }
771
+
772
+ if (Tcl_GetIntFromObj(interp, objv[2], &x) != TCL_OK
773
+ || Tcl_GetIntFromObj(interp, objv[3], &y) != TCL_OK)
774
+ return TCL_ERROR;
775
+
776
+ node = Ttk_LayoutIdentify(corePtr->layout, x, y);
777
+ if (node) {
778
+ const char *elementName = Ttk_LayoutNodeName(node);
779
+ Tcl_SetObjResult(interp,Tcl_NewStringObj(elementName,-1));
780
+ }
781
+
782
+ return TCL_OK;
783
+ }
784
+
785
+ /*EOF*/