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,44 @@
1
+ /*
2
+ * gunk.h
3
+ *
4
+ * Portability gunk.
5
+ *
6
+ * Tk doesn't seem provide a consistent API across different
7
+ * platforms, at least not in the public interface.
8
+ * This file is a dumping ground for any #ifdeffery needed
9
+ * to get stuff to compile on multiple platforms.
10
+ */
11
+
12
+
13
+ /*
14
+ * ... Tk also doesn't provide a consistent set of #defines
15
+ * to determine what platform we're on ...
16
+ */
17
+
18
+ #if defined(__WIN32__)
19
+ # define WIN_TK 1
20
+ #endif
21
+
22
+ #if !defined(WIN_TK) && !defined(MAC_TK) && !defined(MAC_OSX_TK)
23
+ # define X11_TK 1
24
+ #endif
25
+
26
+ #if X11_TK
27
+ #define TkPutImage(colors, ncolors, display, pixels, gc, image, destx, desty, srcx, srcy, width, height) \
28
+ XPutImage(display, pixels, gc, image, destx, desty, srcx, \
29
+ srcy, width, height);
30
+ #endif
31
+
32
+ #if defined(WIN_TK) && defined(NO_PRIVATE_HEADERS)
33
+ #include <windows.h>
34
+ #include <tkPlatDecls.h>
35
+ /* From tkWinInt.h: */
36
+ typedef struct TkWinDCState {
37
+ HPALETTE palette;
38
+ int bkmode;
39
+ } TkWinDCState;
40
+
41
+ EXTERN HDC TkWinGetDrawableDC(Display *, Drawable, TkWinDCState*);
42
+ EXTERN HDC TkWinReleaseDrawableDC(Drawable, HDC, TkWinDCState*);
43
+ #endif
44
+
@@ -0,0 +1,416 @@
1
+ /* image.c,v 1.9 2007/11/08 01:39:25 jenglish Exp
2
+ * Image specifications and image element factory.
3
+ *
4
+ * Copyright (C) 2004 Pat Thoyts <patthoyts@users.sf.net>
5
+ * Copyright (C) 2004 Joe English
6
+ *
7
+ * An imageSpec is a multi-element list; the first element
8
+ * is the name of the default image to use, the remainder of the
9
+ * list is a sequence of statespec/imagename options as per
10
+ * [style map].
11
+ */
12
+
13
+ #include <string.h>
14
+ #include <tk.h>
15
+ #include "tkTheme.h"
16
+
17
+ #define TILE_07_COMPAT 1
18
+
19
+ #define MIN(a,b) ((a) < (b) ? (a) : (b))
20
+
21
+ /*------------------------------------------------------------------------
22
+ * +++ ImageSpec management.
23
+ */
24
+
25
+ struct TtkImageSpec {
26
+ Tk_Image baseImage; /* Base image to use */
27
+ int mapCount; /* #state-specific overrides */
28
+ Ttk_StateSpec *states; /* array[mapCount] of states ... */
29
+ Tk_Image *images; /* ... per-state images to use */
30
+ };
31
+
32
+ /* NullImageChanged --
33
+ * Do-nothing Tk_ImageChangedProc.
34
+ */
35
+ static void NullImageChanged(ClientData clientData,
36
+ int x, int y, int width, int height, int imageWidth, int imageHeight)
37
+ { /* No-op */ }
38
+
39
+ /* TtkGetImageSpec --
40
+ * Constructs a Ttk_ImageSpec * from a Tcl_Obj *.
41
+ * Result must be released using TtkFreeImageSpec.
42
+ *
43
+ * TODO: Need a variant of this that takes a user-specified ImageChanged proc
44
+ */
45
+ Ttk_ImageSpec *
46
+ TtkGetImageSpec(Tcl_Interp *interp, Tk_Window tkwin, Tcl_Obj *objPtr)
47
+ {
48
+ Ttk_ImageSpec *imageSpec = 0;
49
+ int i = 0, n = 0, objc;
50
+ Tcl_Obj **objv;
51
+
52
+ imageSpec = (Ttk_ImageSpec *)ckalloc(sizeof(*imageSpec));
53
+ imageSpec->baseImage = 0;
54
+ imageSpec->mapCount = 0;
55
+ imageSpec->states = 0;
56
+ imageSpec->images = 0;
57
+
58
+ if (Tcl_ListObjGetElements(interp, objPtr, &objc, &objv) != TCL_OK) {
59
+ goto error;
60
+ }
61
+
62
+ if ((objc % 2) != 1) {
63
+ if (interp) {
64
+ Tcl_SetResult(interp,
65
+ "image specification must contain an odd number of elements",
66
+ TCL_STATIC);
67
+ }
68
+ goto error;
69
+ }
70
+
71
+ n = (objc - 1) / 2;
72
+ imageSpec->states = (Ttk_StateSpec*)ckalloc(n * sizeof(Ttk_StateSpec));
73
+ imageSpec->images = (Tk_Image*)ckalloc(n * sizeof(Tk_Image *));
74
+
75
+ /* Get base image:
76
+ */
77
+ imageSpec->baseImage = Tk_GetImage(
78
+ interp, tkwin, Tcl_GetString(objv[0]), NullImageChanged, NULL);
79
+ if (!imageSpec->baseImage) {
80
+ goto error;
81
+ }
82
+
83
+ /* Extract state and image specifications:
84
+ */
85
+ for (i = 0; i < n; ++i) {
86
+ Tcl_Obj *stateSpec = objv[2*i + 1];
87
+ const char *imageName = Tcl_GetString(objv[2*i + 2]);
88
+ Ttk_StateSpec state;
89
+
90
+ if (Ttk_GetStateSpecFromObj(interp, stateSpec, &state) != TCL_OK) {
91
+ goto error;
92
+ }
93
+ imageSpec->states[i] = state;
94
+
95
+ imageSpec->images[i] = Tk_GetImage(
96
+ interp, tkwin, imageName, NullImageChanged, NULL);
97
+ if (imageSpec->images[i] == NULL) {
98
+ goto error;
99
+ }
100
+ imageSpec->mapCount = i+1;
101
+ }
102
+
103
+ return imageSpec;
104
+
105
+ error:
106
+ TtkFreeImageSpec(imageSpec);
107
+ return NULL;
108
+ }
109
+
110
+ /* TtkFreeImageSpec --
111
+ * Dispose of an image specification.
112
+ */
113
+ void TtkFreeImageSpec(Ttk_ImageSpec *imageSpec)
114
+ {
115
+ int i;
116
+
117
+ for (i=0; i < imageSpec->mapCount; ++i) {
118
+ Tk_FreeImage(imageSpec->images[i]);
119
+ }
120
+
121
+ if (imageSpec->baseImage) { Tk_FreeImage(imageSpec->baseImage); }
122
+ if (imageSpec->states) { ckfree((ClientData)imageSpec->states); }
123
+ if (imageSpec->images) { ckfree((ClientData)imageSpec->images); }
124
+
125
+ ckfree((ClientData)imageSpec);
126
+ }
127
+
128
+ /* TtkSelectImage --
129
+ * Return a state-specific image from an ImageSpec
130
+ */
131
+ Tk_Image TtkSelectImage(Ttk_ImageSpec *imageSpec, Ttk_State state)
132
+ {
133
+ int i;
134
+ for (i = 0; i < imageSpec->mapCount; ++i) {
135
+ if (Ttk_StateMatches(state, imageSpec->states+i)) {
136
+ return imageSpec->images[i];
137
+ }
138
+ }
139
+ return imageSpec->baseImage;
140
+ }
141
+
142
+ /*------------------------------------------------------------------------
143
+ * +++ Drawing utilities.
144
+ */
145
+
146
+ /* LPadding, CPadding, RPadding --
147
+ * Split a box+padding pair into left, center, and right boxes.
148
+ */
149
+ static Ttk_Box LPadding(Ttk_Box b, Ttk_Padding p)
150
+ { return Ttk_MakeBox(b.x, b.y, p.left, b.height); }
151
+
152
+ static Ttk_Box CPadding(Ttk_Box b, Ttk_Padding p)
153
+ { return Ttk_MakeBox(b.x+p.left, b.y, b.width-p.left-p.right, b.height); }
154
+
155
+ static Ttk_Box RPadding(Ttk_Box b, Ttk_Padding p)
156
+ { return Ttk_MakeBox(b.x+b.width-p.right, b.y, p.right, b.height); }
157
+
158
+ /* TPadding, MPadding, BPadding --
159
+ * Split a box+padding pair into top, middle, and bottom parts.
160
+ */
161
+ static Ttk_Box TPadding(Ttk_Box b, Ttk_Padding p)
162
+ { return Ttk_MakeBox(b.x, b.y, b.width, p.top); }
163
+
164
+ static Ttk_Box MPadding(Ttk_Box b, Ttk_Padding p)
165
+ { return Ttk_MakeBox(b.x, b.y+p.top, b.width, b.height-p.top-p.bottom); }
166
+
167
+ static Ttk_Box BPadding(Ttk_Box b, Ttk_Padding p)
168
+ { return Ttk_MakeBox(b.x, b.y+b.height-p.bottom, b.width, p.bottom); }
169
+
170
+ /* Ttk_Fill --
171
+ * Fill the destination area of the drawable by replicating
172
+ * the source area of the image.
173
+ */
174
+ static void Ttk_Fill(
175
+ Tk_Window tkwin, Drawable d, Tk_Image image, Ttk_Box src, Ttk_Box dst)
176
+ {
177
+ int dr = dst.x + dst.width;
178
+ int db = dst.y + dst.height;
179
+ int x,y;
180
+
181
+ if (!(src.width && src.height && dst.width && dst.height))
182
+ return;
183
+
184
+ for (x = dst.x; x < dr; x += src.width) {
185
+ int cw = MIN(src.width, dr - x);
186
+ for (y = dst.y; y <= db; y += src.height) {
187
+ int ch = MIN(src.height, db - y);
188
+ Tk_RedrawImage(image, src.x, src.y, cw, ch, d, x, y);
189
+ }
190
+ }
191
+ }
192
+
193
+ /* Ttk_Stripe --
194
+ * Fill a horizontal stripe of the destination drawable.
195
+ */
196
+ static void Ttk_Stripe(
197
+ Tk_Window tkwin, Drawable d, Tk_Image image,
198
+ Ttk_Box src, Ttk_Box dst, Ttk_Padding p)
199
+ {
200
+ Ttk_Fill(tkwin, d, image, LPadding(src,p), LPadding(dst,p));
201
+ Ttk_Fill(tkwin, d, image, CPadding(src,p), CPadding(dst,p));
202
+ Ttk_Fill(tkwin, d, image, RPadding(src,p), RPadding(dst,p));
203
+ }
204
+
205
+ /* Ttk_Tile --
206
+ * Fill successive horizontal stripes of the destination drawable.
207
+ */
208
+ static void Ttk_Tile(
209
+ Tk_Window tkwin, Drawable d, Tk_Image image,
210
+ Ttk_Box src, Ttk_Box dst, Ttk_Padding p)
211
+ {
212
+ Ttk_Stripe(tkwin, d, image, TPadding(src,p), TPadding(dst,p), p);
213
+ Ttk_Stripe(tkwin, d, image, MPadding(src,p), MPadding(dst,p), p);
214
+ Ttk_Stripe(tkwin, d, image, BPadding(src,p), BPadding(dst,p), p);
215
+ }
216
+
217
+ /*------------------------------------------------------------------------
218
+ * +++ Image element definition.
219
+ */
220
+
221
+ typedef struct { /* ClientData for image elements */
222
+ Ttk_ImageSpec *imageSpec; /* Image(s) to use */
223
+ int minWidth; /* Minimum width; overrides image width */
224
+ int minHeight; /* Minimum width; overrides image width */
225
+ Ttk_Sticky sticky; /* -stickiness specification */
226
+ Ttk_Padding border; /* Fixed border region */
227
+ Ttk_Padding padding; /* Internal padding */
228
+
229
+ #if TILE_07_COMPAT
230
+ Ttk_ResourceCache cache; /* Resource cache for images */
231
+ Ttk_StateMap imageMap; /* State-based lookup table for images */
232
+ #endif
233
+ } ImageData;
234
+
235
+ static void FreeImageData(void *clientData)
236
+ {
237
+ ImageData *imageData = clientData;
238
+ if (imageData->imageSpec) { TtkFreeImageSpec(imageData->imageSpec); }
239
+ #if TILE_07_COMPAT
240
+ if (imageData->imageMap) { Tcl_DecrRefCount(imageData->imageMap); }
241
+ #endif
242
+ ckfree(clientData);
243
+ }
244
+
245
+ static void ImageElementSize(
246
+ void *clientData, void *elementRecord, Tk_Window tkwin,
247
+ int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr)
248
+ {
249
+ ImageData *imageData = clientData;
250
+ Tk_Image image = imageData->imageSpec->baseImage;
251
+
252
+ if (image) {
253
+ Tk_SizeOfImage(image, widthPtr, heightPtr);
254
+ }
255
+ if (imageData->minWidth >= 0) {
256
+ *widthPtr = imageData->minWidth;
257
+ }
258
+ if (imageData->minHeight >= 0) {
259
+ *heightPtr = imageData->minHeight;
260
+ }
261
+
262
+ *paddingPtr = imageData->padding;
263
+ }
264
+
265
+ static void ImageElementDraw(
266
+ void *clientData, void *elementRecord, Tk_Window tkwin,
267
+ Drawable d, Ttk_Box b, unsigned int state)
268
+ {
269
+ ImageData *imageData = clientData;
270
+ Tk_Image image = 0;
271
+ int imgWidth, imgHeight;
272
+ Ttk_Box src, dst;
273
+
274
+ #if TILE_07_COMPAT
275
+ if (imageData->imageMap) {
276
+ Tcl_Obj *imageObj = Ttk_StateMapLookup(NULL,imageData->imageMap,state);
277
+ if (imageObj) {
278
+ image = Ttk_UseImage(imageData->cache, tkwin, imageObj);
279
+ }
280
+ }
281
+ if (!image) {
282
+ image = TtkSelectImage(imageData->imageSpec, state);
283
+ }
284
+ #else
285
+ image = TtkSelectImage(imageData->imageSpec, state);
286
+ #endif
287
+
288
+ if (!image) {
289
+ return;
290
+ }
291
+
292
+ Tk_SizeOfImage(image, &imgWidth, &imgHeight);
293
+ src = Ttk_MakeBox(0, 0, imgWidth, imgHeight);
294
+ dst = Ttk_StickBox(b, imgWidth, imgHeight, imageData->sticky);
295
+
296
+ Ttk_Tile(tkwin, d, image, src, dst, imageData->border);
297
+ }
298
+
299
+ static Ttk_ElementSpec ImageElementSpec =
300
+ {
301
+ TK_STYLE_VERSION_2,
302
+ sizeof(NullElement),
303
+ TtkNullElementOptions,
304
+ ImageElementSize,
305
+ ImageElementDraw
306
+ };
307
+
308
+ /*------------------------------------------------------------------------
309
+ * +++ Image element factory.
310
+ */
311
+ static int
312
+ Ttk_CreateImageElement(
313
+ Tcl_Interp *interp,
314
+ void *clientData,
315
+ Ttk_Theme theme,
316
+ const char *elementName,
317
+ int objc, Tcl_Obj *CONST objv[])
318
+ {
319
+ const char *optionStrings[] =
320
+ { "-border","-height","-padding","-sticky","-width",NULL };
321
+ enum { O_BORDER, O_HEIGHT, O_PADDING, O_STICKY, O_WIDTH };
322
+
323
+ Ttk_ImageSpec *imageSpec = 0;
324
+ ImageData *imageData = 0;
325
+ int padding_specified = 0;
326
+ int i;
327
+
328
+ if (objc <= 0) {
329
+ Tcl_AppendResult(interp, "Must supply a base image", NULL);
330
+ return TCL_ERROR;
331
+ }
332
+
333
+ imageSpec = TtkGetImageSpec(interp, Tk_MainWindow(interp), objv[0]);
334
+ if (!imageSpec) {
335
+ return TCL_ERROR;
336
+ }
337
+
338
+ imageData = (ImageData*)ckalloc(sizeof(*imageData));
339
+ imageData->imageSpec = imageSpec;
340
+ imageData->minWidth = imageData->minHeight = -1;
341
+ imageData->sticky = TTK_FILL_BOTH;
342
+ imageData->border = imageData->padding = Ttk_UniformPadding(0);
343
+ #if TILE_07_COMPAT
344
+ imageData->cache = Ttk_GetResourceCache(interp);
345
+ imageData->imageMap = 0;
346
+ #endif
347
+
348
+ for (i = 1; i < objc; i += 2) {
349
+ int option;
350
+
351
+ if (i == objc - 1) {
352
+ Tcl_AppendResult(interp,
353
+ "Value for ", Tcl_GetString(objv[i]), " missing",
354
+ NULL);
355
+ goto error;
356
+ }
357
+
358
+ #if TILE_07_COMPAT
359
+ if (!strcmp("-map", Tcl_GetString(objv[i]))) {
360
+ imageData->imageMap = objv[i+1];
361
+ Tcl_IncrRefCount(imageData->imageMap);
362
+ continue;
363
+ }
364
+ #endif
365
+
366
+ if (Tcl_GetIndexFromObj(interp, objv[i], optionStrings,
367
+ "option", 0, &option) != TCL_OK) { goto error; }
368
+
369
+ switch (option) {
370
+ case O_BORDER:
371
+ if (Ttk_GetBorderFromObj(interp, objv[i+1], &imageData->border)
372
+ != TCL_OK) { goto error; }
373
+ if (!padding_specified) {
374
+ imageData->padding = imageData->border;
375
+ }
376
+ break;
377
+ case O_PADDING:
378
+ if (Ttk_GetBorderFromObj(interp, objv[i+1], &imageData->padding)
379
+ != TCL_OK) { goto error; }
380
+ padding_specified = 1;
381
+ break;
382
+ case O_WIDTH:
383
+ if (Tcl_GetIntFromObj(interp, objv[i+1], &imageData->minWidth)
384
+ != TCL_OK) { goto error; }
385
+ break;
386
+ case O_HEIGHT:
387
+ if (Tcl_GetIntFromObj(interp, objv[i+1], &imageData->minHeight)
388
+ != TCL_OK) { goto error; }
389
+ break;
390
+ case O_STICKY:
391
+ if (Ttk_GetStickyFromObj(interp, objv[i+1], &imageData->sticky)
392
+ != TCL_OK) { goto error; }
393
+ }
394
+ }
395
+
396
+ if (!Ttk_RegisterElement(interp, theme, elementName, &ImageElementSpec,
397
+ imageData))
398
+ {
399
+ goto error;
400
+ }
401
+
402
+ Ttk_RegisterCleanup(interp, imageData, FreeImageData);
403
+ Tcl_SetObjResult(interp, Tcl_NewStringObj(elementName, -1));
404
+ return TCL_OK;
405
+
406
+ error:
407
+ FreeImageData(imageData);
408
+ return TCL_ERROR;
409
+ }
410
+
411
+ void TtkImage_Init(Tcl_Interp *interp)
412
+ {
413
+ Ttk_RegisterElementFactory(interp, "image", Ttk_CreateImageElement, NULL);
414
+ }
415
+
416
+ /*EOF*/