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,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*/