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,1029 @@
1
+ /*
2
+ * xpTheme.c,v 1.94 2007/12/02 04:34:31 jenglish Exp
3
+ *
4
+ * Tk theme engine which uses the Windows XP "Visual Styles" API
5
+ * Adapted from Georgios Petasis' XP theme patch.
6
+ *
7
+ * Copyright (c) 2003 by Georgios Petasis, petasis@iit.demokritos.gr.
8
+ * Copyright (c) 2003 by Joe English
9
+ * Copyright (c) 2003 by Pat Thoyts
10
+ *
11
+ * See the file "license.terms" for information on usage and redistribution
12
+ * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
13
+ *
14
+ * See also:
15
+ *
16
+ * <URL: http://msdn.microsoft.com/library/en-us/
17
+ * shellcc/platform/commctls/userex/refentry.asp >
18
+ */
19
+
20
+ #ifndef HAVE_UXTHEME_H
21
+ /* Stub for platforms that lack the XP theme API headers: */
22
+ #include <windows.h>
23
+ #include <tcl.h>
24
+ int XPTheme_Init(Tcl_Interp *interp, HWND hwnd) { return TCL_OK; }
25
+ #else
26
+
27
+ #define WINVER 0x0501 /* Requires Windows XP APIs */
28
+
29
+ #include <windows.h>
30
+ #include <uxtheme.h>
31
+ #include <tmschema.h>
32
+
33
+ #ifdef NO_PRIVATE_HEADERS
34
+ #include <tk.h>
35
+ #include "gunk.h"
36
+ #else
37
+ #include <tkWinInt.h>
38
+ #endif
39
+
40
+ #include "tkTheme.h"
41
+
42
+ typedef HTHEME (STDAPICALLTYPE OpenThemeDataProc)(HWND hwnd,
43
+ LPCWSTR pszClassList);
44
+ typedef HRESULT (STDAPICALLTYPE CloseThemeDataProc)(HTHEME hTheme);
45
+ typedef HRESULT (STDAPICALLTYPE DrawThemeBackgroundProc)(HTHEME hTheme,
46
+ HDC hdc, int iPartId, int iStateId, const RECT *pRect,
47
+ OPTIONAL const RECT *pClipRect);
48
+ typedef HRESULT (STDAPICALLTYPE GetThemePartSizeProc)(HTHEME,HDC,
49
+ int iPartId, int iStateId,
50
+ RECT *prc, enum THEMESIZE eSize, SIZE *psz);
51
+ typedef int (STDAPICALLTYPE GetThemeSysSizeProc)(HTHEME,int);
52
+ /* GetThemeTextExtent and DrawThemeText only used with BROKEN_TEXT_ELEMENT */
53
+ typedef HRESULT (STDAPICALLTYPE GetThemeTextExtentProc)(HTHEME hTheme, HDC hdc,
54
+ int iPartId, int iStateId, LPCWSTR pszText, int iCharCount,
55
+ DWORD dwTextFlags, const RECT *pBoundingRect, RECT *pExtent);
56
+ typedef HRESULT (STDAPICALLTYPE DrawThemeTextProc)(HTHEME hTheme, HDC hdc,
57
+ int iPartId, int iStateId, LPCWSTR pszText, int iCharCount,
58
+ DWORD dwTextFlags, DWORD dwTextFlags2, const RECT *pRect);
59
+ typedef BOOL (STDAPICALLTYPE IsThemeActiveProc)(VOID);
60
+ typedef BOOL (STDAPICALLTYPE IsAppThemedProc)(VOID);
61
+
62
+ typedef struct
63
+ {
64
+ OpenThemeDataProc *OpenThemeData;
65
+ CloseThemeDataProc *CloseThemeData;
66
+ GetThemePartSizeProc *GetThemePartSize;
67
+ GetThemeSysSizeProc *GetThemeSysSize;
68
+ DrawThemeBackgroundProc *DrawThemeBackground;
69
+ DrawThemeTextProc *DrawThemeText;
70
+ GetThemeTextExtentProc *GetThemeTextExtent;
71
+ IsThemeActiveProc *IsThemeActive;
72
+ IsAppThemedProc *IsAppThemed;
73
+
74
+ HWND stubWindow;
75
+ } XPThemeProcs;
76
+
77
+ typedef struct
78
+ {
79
+ HINSTANCE hlibrary;
80
+ XPThemeProcs *procs;
81
+ } XPThemeData;
82
+
83
+ /*
84
+ *----------------------------------------------------------------------
85
+ *
86
+ * LoadXPThemeProcs --
87
+ * Initialize XP theming support.
88
+ *
89
+ * XP theme support is included in UXTHEME.DLL
90
+ * We dynamically load this DLL at runtime instead of linking
91
+ * to it at build-time.
92
+ *
93
+ * Returns:
94
+ * A pointer to an XPThemeProcs table if successful, NULL otherwise.
95
+ */
96
+
97
+ static XPThemeProcs *
98
+ LoadXPThemeProcs(HINSTANCE *phlib)
99
+ {
100
+ /*
101
+ * Load the library "uxtheme.dll", where the native widget
102
+ * drawing routines are implemented. This will only succeed
103
+ * if we are running at least on Windows XP.
104
+ */
105
+ HINSTANCE handle;
106
+ *phlib = handle = LoadLibrary("uxtheme.dll");
107
+ if (handle != 0)
108
+ {
109
+ /*
110
+ * We have successfully loaded the library. Proceed in storing the
111
+ * addresses of the functions we want to use.
112
+ */
113
+ XPThemeProcs *procs = (XPThemeProcs*)ckalloc(sizeof(XPThemeProcs));
114
+ #define LOADPROC(name) \
115
+ (0 != (procs->name = (name ## Proc *)GetProcAddress(handle, #name) ))
116
+
117
+ if ( LOADPROC(OpenThemeData)
118
+ && LOADPROC(CloseThemeData)
119
+ && LOADPROC(GetThemePartSize)
120
+ && LOADPROC(GetThemeSysSize)
121
+ && LOADPROC(DrawThemeBackground)
122
+ && LOADPROC(GetThemeTextExtent)
123
+ && LOADPROC(DrawThemeText)
124
+ && LOADPROC(IsThemeActive)
125
+ && LOADPROC(IsAppThemed)
126
+ )
127
+ {
128
+ return procs;
129
+ }
130
+ #undef LOADPROC
131
+ ckfree((char*)procs);
132
+ }
133
+ return 0;
134
+ }
135
+
136
+ /*
137
+ * XPThemeDeleteProc --
138
+ *
139
+ * Release any theme allocated resources.
140
+ */
141
+
142
+ static void
143
+ XPThemeDeleteProc(void *clientData)
144
+ {
145
+ XPThemeData *themeData = clientData;
146
+ FreeLibrary(themeData->hlibrary);
147
+ ckfree(clientData);
148
+ }
149
+
150
+ static int
151
+ XPThemeEnabled(Ttk_Theme theme, void *clientData)
152
+ {
153
+ XPThemeData *themeData = clientData;
154
+ int active = themeData->procs->IsThemeActive();
155
+ int themed = themeData->procs->IsAppThemed();
156
+ return (active && themed);
157
+ }
158
+
159
+ /*
160
+ * BoxToRect --
161
+ * Helper routine. Returns a RECT data structure.
162
+ */
163
+ static RECT
164
+ BoxToRect(Ttk_Box b)
165
+ {
166
+ RECT rc;
167
+ rc.top = b.y;
168
+ rc.left = b.x;
169
+ rc.bottom = b.y + b.height;
170
+ rc.right = b.x + b.width;
171
+ return rc;
172
+ }
173
+
174
+ /*
175
+ * Map Tk state bitmaps to XP style enumerated values.
176
+ */
177
+ static Ttk_StateTable null_statemap[] = { {0,0,0} };
178
+
179
+ /*
180
+ * Pushbuttons (Tk: "Button")
181
+ */
182
+ static Ttk_StateTable pushbutton_statemap[] =
183
+ {
184
+ { PBS_DISABLED, TTK_STATE_DISABLED, 0 },
185
+ { PBS_PRESSED, TTK_STATE_PRESSED, 0 },
186
+ { PBS_HOT, TTK_STATE_ACTIVE, 0 },
187
+ { PBS_DEFAULTED, TTK_STATE_ALTERNATE, 0 },
188
+ { PBS_NORMAL, 0, 0 }
189
+ };
190
+
191
+ /*
192
+ * Checkboxes (Tk: "Checkbutton")
193
+ */
194
+ static Ttk_StateTable checkbox_statemap[] =
195
+ {
196
+ {CBS_MIXEDDISABLED, TTK_STATE_ALTERNATE|TTK_STATE_DISABLED, 0},
197
+ {CBS_MIXEDPRESSED, TTK_STATE_ALTERNATE|TTK_STATE_PRESSED, 0},
198
+ {CBS_MIXEDHOT, TTK_STATE_ALTERNATE|TTK_STATE_ACTIVE, 0},
199
+ {CBS_MIXEDNORMAL, TTK_STATE_ALTERNATE, 0},
200
+ {CBS_CHECKEDDISABLED, TTK_STATE_SELECTED|TTK_STATE_DISABLED, 0},
201
+ {CBS_CHECKEDPRESSED, TTK_STATE_SELECTED|TTK_STATE_PRESSED, 0},
202
+ {CBS_CHECKEDHOT, TTK_STATE_SELECTED|TTK_STATE_ACTIVE, 0},
203
+ {CBS_CHECKEDNORMAL, TTK_STATE_SELECTED, 0},
204
+ {CBS_UNCHECKEDDISABLED, TTK_STATE_DISABLED, 0},
205
+ {CBS_UNCHECKEDPRESSED, TTK_STATE_PRESSED, 0},
206
+ {CBS_UNCHECKEDHOT, TTK_STATE_ACTIVE, 0},
207
+ {CBS_UNCHECKEDNORMAL, 0,0 }
208
+ };
209
+
210
+ /*
211
+ * Radiobuttons:
212
+ */
213
+ static Ttk_StateTable radiobutton_statemap[] =
214
+ {
215
+ {RBS_CHECKEDDISABLED, TTK_STATE_SELECTED|TTK_STATE_DISABLED, 0},
216
+ {RBS_CHECKEDPRESSED, TTK_STATE_SELECTED|TTK_STATE_PRESSED, 0},
217
+ {RBS_CHECKEDHOT, TTK_STATE_SELECTED|TTK_STATE_ACTIVE, 0},
218
+ {RBS_CHECKEDNORMAL, TTK_STATE_SELECTED, 0},
219
+ {RBS_UNCHECKEDDISABLED, TTK_STATE_DISABLED, 0},
220
+ {RBS_UNCHECKEDPRESSED, TTK_STATE_PRESSED, 0},
221
+ {RBS_UNCHECKEDHOT, TTK_STATE_ACTIVE, 0},
222
+ {RBS_UNCHECKEDNORMAL, 0,0 }
223
+ };
224
+
225
+ /*
226
+ * Groupboxes (tk: "frame")
227
+ */
228
+ static Ttk_StateTable groupbox_statemap[] =
229
+ {
230
+ {GBS_DISABLED, TTK_STATE_DISABLED, 0},
231
+ {GBS_NORMAL, 0,0 }
232
+ };
233
+
234
+ /*
235
+ * Edit fields (tk: "entry")
236
+ */
237
+ static Ttk_StateTable edittext_statemap[] =
238
+ {
239
+ { ETS_DISABLED, TTK_STATE_DISABLED, 0 },
240
+ { ETS_READONLY, TTK_STATE_READONLY, 0 },
241
+ { ETS_FOCUSED, TTK_STATE_FOCUS, 0 },
242
+ { ETS_HOT, TTK_STATE_ACTIVE, 0 },
243
+ { ETS_NORMAL, 0, 0 }
244
+ /* NOT USED: ETS_ASSIST, ETS_SELECTED */
245
+ };
246
+
247
+ /*
248
+ * Combobox text field statemap:
249
+ * Same as edittext_statemap, but doesn't use ETS_READONLY
250
+ * (fixes: #1032409)
251
+ */
252
+ static Ttk_StateTable combotext_statemap[] =
253
+ {
254
+ { ETS_DISABLED, TTK_STATE_DISABLED, 0 },
255
+ { ETS_FOCUSED, TTK_STATE_FOCUS, 0 },
256
+ { ETS_HOT, TTK_STATE_ACTIVE, 0 },
257
+ { ETS_NORMAL, 0, 0 }
258
+ };
259
+
260
+ /*
261
+ * Combobox button: (CBP_DROPDOWNBUTTON)
262
+ */
263
+ static Ttk_StateTable combobox_statemap[] = {
264
+ { CBXS_DISABLED, TTK_STATE_DISABLED, 0 },
265
+ { CBXS_PRESSED, TTK_STATE_PRESSED, 0 },
266
+ { CBXS_HOT, TTK_STATE_ACTIVE, 0 },
267
+ { CBXS_NORMAL, 0, 0 }
268
+ };
269
+
270
+ /*
271
+ * Toolbar buttons (TP_BUTTON):
272
+ */
273
+ static Ttk_StateTable toolbutton_statemap[] = {
274
+ { TS_DISABLED, TTK_STATE_DISABLED, 0 },
275
+ { TS_PRESSED, TTK_STATE_PRESSED, 0 },
276
+ { TS_HOTCHECKED, TTK_STATE_SELECTED|TTK_STATE_ACTIVE, 0 },
277
+ { TS_CHECKED, TTK_STATE_SELECTED, 0 },
278
+ { TS_HOT, TTK_STATE_ACTIVE, 0 },
279
+ { TS_NORMAL, 0,0 }
280
+ };
281
+
282
+ /*
283
+ * Scrollbars (Tk: "Scrollbar.thumb")
284
+ */
285
+ static Ttk_StateTable scrollbar_statemap[] =
286
+ {
287
+ { SCRBS_DISABLED, TTK_STATE_DISABLED, 0 },
288
+ { SCRBS_PRESSED, TTK_STATE_PRESSED, 0 },
289
+ { SCRBS_HOT, TTK_STATE_ACTIVE, 0 },
290
+ { SCRBS_NORMAL, 0, 0 }
291
+ };
292
+
293
+ static Ttk_StateTable uparrow_statemap[] =
294
+ {
295
+ { ABS_UPDISABLED, TTK_STATE_DISABLED, 0 },
296
+ { ABS_UPPRESSED, TTK_STATE_PRESSED, 0 },
297
+ { ABS_UPHOT, TTK_STATE_ACTIVE, 0 },
298
+ { ABS_UPNORMAL, 0, 0 }
299
+ };
300
+
301
+ static Ttk_StateTable downarrow_statemap[] =
302
+ {
303
+ { ABS_DOWNDISABLED, TTK_STATE_DISABLED, 0 },
304
+ { ABS_DOWNPRESSED, TTK_STATE_PRESSED, 0 },
305
+ { ABS_DOWNHOT, TTK_STATE_ACTIVE, 0 },
306
+ { ABS_DOWNNORMAL, 0, 0 }
307
+ };
308
+
309
+ static Ttk_StateTable leftarrow_statemap[] =
310
+ {
311
+ { ABS_LEFTDISABLED, TTK_STATE_DISABLED, 0 },
312
+ { ABS_LEFTPRESSED, TTK_STATE_PRESSED, 0 },
313
+ { ABS_LEFTHOT, TTK_STATE_ACTIVE, 0 },
314
+ { ABS_LEFTNORMAL, 0, 0 }
315
+ };
316
+
317
+ static Ttk_StateTable rightarrow_statemap[] =
318
+ {
319
+ { ABS_RIGHTDISABLED,TTK_STATE_DISABLED, 0 },
320
+ { ABS_RIGHTPRESSED, TTK_STATE_PRESSED, 0 },
321
+ { ABS_RIGHTHOT, TTK_STATE_ACTIVE, 0 },
322
+ { ABS_RIGHTNORMAL, 0, 0 }
323
+ };
324
+
325
+ /*
326
+ * Trackbar thumb: (Tk: "scale slider")
327
+ */
328
+ static Ttk_StateTable scale_statemap[] =
329
+ {
330
+ { TUS_DISABLED, TTK_STATE_DISABLED, 0 },
331
+ { TUS_PRESSED, TTK_STATE_PRESSED, 0 },
332
+ { TUS_FOCUSED, TTK_STATE_FOCUS, 0 },
333
+ { TUS_HOT, TTK_STATE_ACTIVE, 0 },
334
+ { TUS_NORMAL, 0, 0 }
335
+ };
336
+
337
+ static Ttk_StateTable tabitem_statemap[] =
338
+ {
339
+ { TIS_DISABLED, TTK_STATE_DISABLED, 0 },
340
+ { TIS_SELECTED, TTK_STATE_SELECTED, 0 },
341
+ { TIS_HOT, TTK_STATE_ACTIVE, 0 },
342
+ { TIS_FOCUSED, TTK_STATE_FOCUS, 0 },
343
+ { TIS_NORMAL, 0, 0 },
344
+ };
345
+
346
+
347
+ /*
348
+ *----------------------------------------------------------------------
349
+ * +++ Element data:
350
+ *
351
+ * The following structure is passed as the 'clientData' pointer
352
+ * to most elements in this theme. It contains data relevant
353
+ * to a single XP Theme "part".
354
+ *
355
+ * <<NOTE-GetThemeMargins>>:
356
+ * In theory, we should be call GetThemeMargins(...TMT_CONTENTRECT...)
357
+ * to calculate the internal padding. In practice, this routine
358
+ * only seems to work properly for BP_PUSHBUTTON. So we hardcode
359
+ * the required padding at element registration time instead.
360
+ *
361
+ * The PAD_MARGINS flag bit determines whether the padding
362
+ * should be added on the inside (0) or outside (1) of the element.
363
+ *
364
+ * <<NOTE-GetThemePartSize>>:
365
+ * This gives bogus metrics for some parts (in particular,
366
+ * BP_PUSHBUTTONS). Set the IGNORE_THEMESIZE flag to skip this call.
367
+ */
368
+
369
+ typedef struct /* XP element specifications */
370
+ {
371
+ const char *elementName; /* Tk theme engine element name */
372
+ Ttk_ElementSpec *elementSpec;
373
+ /* Element spec (usually GenericElementSpec) */
374
+ LPCWSTR className; /* Windows window class name */
375
+ int partId; /* BP_PUSHBUTTON, BP_CHECKBUTTON, etc. */
376
+ Ttk_StateTable *statemap; /* Map Tk states to XP states */
377
+ Ttk_Padding padding; /* See NOTE-GetThemeMargins */
378
+ int flags;
379
+ # define IGNORE_THEMESIZE 0x80000000 /* See NOTE-GetThemePartSize */
380
+ # define PAD_MARGINS 0x40000000 /* See NOTE-GetThemeMargins */
381
+ } ElementInfo;
382
+
383
+ typedef struct
384
+ {
385
+ /*
386
+ * Static data, initialized when element is registered:
387
+ */
388
+ ElementInfo *info;
389
+ XPThemeProcs *procs; /* Pointer to theme procedure table */
390
+
391
+ /*
392
+ * Dynamic data, allocated by InitElementData:
393
+ */
394
+ HTHEME hTheme;
395
+ HDC hDC;
396
+ HWND hwnd;
397
+
398
+ /* For TkWinDrawableReleaseDC: */
399
+ Drawable drawable;
400
+ TkWinDCState dcState;
401
+ } ElementData;
402
+
403
+ static ElementData *
404
+ NewElementData(XPThemeProcs *procs, ElementInfo *info)
405
+ {
406
+ ElementData *elementData = (ElementData*)ckalloc(sizeof(ElementData));
407
+
408
+ elementData->procs = procs;
409
+ elementData->info = info;
410
+ elementData->hTheme = elementData->hDC = 0;
411
+
412
+ return elementData;
413
+ }
414
+
415
+ static void DestroyElementData(void *elementData)
416
+ {
417
+ ckfree(elementData);
418
+ }
419
+
420
+ /*
421
+ * InitElementData --
422
+ * Looks up theme handle. If Drawable argument is non-NULL,
423
+ * also initializes DC.
424
+ *
425
+ * Returns:
426
+ * 1 on success, 0 on error.
427
+ * Caller must later call FreeElementData() so this element
428
+ * can be reused.
429
+ */
430
+
431
+ static int
432
+ InitElementData(ElementData *elementData, Tk_Window tkwin, Drawable d)
433
+ {
434
+ Window win = Tk_WindowId(tkwin);
435
+
436
+ if (win != None) {
437
+ elementData->hwnd = Tk_GetHWND(win);
438
+ } else {
439
+ elementData->hwnd = elementData->procs->stubWindow;
440
+ }
441
+
442
+ elementData->hTheme = elementData->procs->OpenThemeData(
443
+ elementData->hwnd, elementData->info->className);
444
+
445
+ if (!elementData->hTheme)
446
+ return 0;
447
+
448
+ elementData->drawable = d;
449
+ if (d != 0) {
450
+ elementData->hDC = TkWinGetDrawableDC(Tk_Display(tkwin), d,
451
+ &elementData->dcState);
452
+ }
453
+
454
+ return 1;
455
+ }
456
+
457
+ static void
458
+ FreeElementData(ElementData *elementData)
459
+ {
460
+ elementData->procs->CloseThemeData(elementData->hTheme);
461
+ if (elementData->drawable != 0) {
462
+ TkWinReleaseDrawableDC(
463
+ elementData->drawable, elementData->hDC, &elementData->dcState);
464
+ }
465
+ }
466
+
467
+ /*----------------------------------------------------------------------
468
+ * +++ Generic element implementation.
469
+ *
470
+ * Used for elements which are handled entirely by the XP Theme API,
471
+ * such as radiobutton and checkbutton indicators, scrollbar arrows, etc.
472
+ */
473
+
474
+ static void GenericElementSize(
475
+ void *clientData, void *elementRecord, Tk_Window tkwin,
476
+ int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr)
477
+ {
478
+ ElementData *elementData = clientData;
479
+ HRESULT result;
480
+ SIZE size;
481
+
482
+ if (!InitElementData(elementData, tkwin, 0))
483
+ return;
484
+
485
+ if (!(elementData->info->flags & IGNORE_THEMESIZE)) {
486
+ result = elementData->procs->GetThemePartSize(
487
+ elementData->hTheme,
488
+ elementData->hDC,
489
+ elementData->info->partId,
490
+ Ttk_StateTableLookup(elementData->info->statemap, 0),
491
+ NULL /*RECT *prc*/,
492
+ TS_TRUE,
493
+ &size);
494
+
495
+ if (SUCCEEDED(result)) {
496
+ *widthPtr = size.cx;
497
+ *heightPtr = size.cy;
498
+ }
499
+ }
500
+
501
+ /* See NOTE-GetThemeMargins
502
+ */
503
+ *paddingPtr = elementData->info->padding;
504
+ if (elementData->info->flags & PAD_MARGINS) {
505
+ *widthPtr += Ttk_PaddingWidth(elementData->info->padding);
506
+ *heightPtr += Ttk_PaddingHeight(elementData->info->padding);
507
+ }
508
+ }
509
+
510
+ static void GenericElementDraw(
511
+ void *clientData, void *elementRecord, Tk_Window tkwin,
512
+ Drawable d, Ttk_Box b, unsigned int state)
513
+ {
514
+ ElementData *elementData = clientData;
515
+ RECT rc;
516
+
517
+ if (!InitElementData(elementData, tkwin, d)) {
518
+ return;
519
+ }
520
+
521
+ if (elementData->info->flags & PAD_MARGINS) {
522
+ b = Ttk_PadBox(b, elementData->info->padding);
523
+ }
524
+ rc = BoxToRect(b);
525
+
526
+ elementData->procs->DrawThemeBackground(
527
+ elementData->hTheme,
528
+ elementData->hDC,
529
+ elementData->info->partId,
530
+ Ttk_StateTableLookup(elementData->info->statemap, state),
531
+ &rc,
532
+ NULL/*pContentRect*/);
533
+
534
+ FreeElementData(elementData);
535
+ }
536
+
537
+ static Ttk_ElementSpec GenericElementSpec =
538
+ {
539
+ TK_STYLE_VERSION_2,
540
+ sizeof(NullElement),
541
+ TtkNullElementOptions,
542
+ GenericElementSize,
543
+ GenericElementDraw
544
+ };
545
+
546
+ /*----------------------------------------------------------------------
547
+ * +++ Sized element implementation.
548
+ *
549
+ * Used for elements which are handled entirely by the XP Theme API,
550
+ * but that require a fixed size adjustment.
551
+ * Note that GetThemeSysSize calls through to GetSystemMetrics
552
+ */
553
+
554
+ static void
555
+ GenericSizedElementSize(
556
+ void *clientData, void *elementRecord, Tk_Window tkwin,
557
+ int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr)
558
+ {
559
+ ElementData *elementData = clientData;
560
+
561
+ if (!InitElementData(elementData, tkwin, 0))
562
+ return;
563
+
564
+ GenericElementSize(clientData, elementRecord, tkwin,
565
+ widthPtr, heightPtr, paddingPtr);
566
+
567
+ *widthPtr = elementData->procs->GetThemeSysSize(NULL,
568
+ (elementData->info->flags >> 8) & 0xff);
569
+ *heightPtr = elementData->procs->GetThemeSysSize(NULL,
570
+ elementData->info->flags & 0xff);
571
+ }
572
+
573
+ static Ttk_ElementSpec GenericSizedElementSpec = {
574
+ TK_STYLE_VERSION_2,
575
+ sizeof(NullElement),
576
+ TtkNullElementOptions,
577
+ GenericSizedElementSize,
578
+ GenericElementDraw
579
+ };
580
+
581
+ /*----------------------------------------------------------------------
582
+ * +++ Scrollbar thumb element.
583
+ * Same as a GenericElement, but don't draw in the disabled state.
584
+ */
585
+
586
+ static void ThumbElementDraw(
587
+ void *clientData, void *elementRecord, Tk_Window tkwin,
588
+ Drawable d, Ttk_Box b, unsigned int state)
589
+ {
590
+ ElementData *elementData = clientData;
591
+ unsigned stateId = Ttk_StateTableLookup(elementData->info->statemap, state);
592
+ RECT rc = BoxToRect(b);
593
+
594
+ /*
595
+ * Don't draw the thumb if we are disabled.
596
+ */
597
+ if (state & TTK_STATE_DISABLED)
598
+ return;
599
+
600
+ if (!InitElementData(elementData, tkwin, d))
601
+ return;
602
+
603
+ elementData->procs->DrawThemeBackground(elementData->hTheme,
604
+ elementData->hDC, elementData->info->partId, stateId,
605
+ &rc, NULL);
606
+
607
+ FreeElementData(elementData);
608
+ }
609
+
610
+ static Ttk_ElementSpec ThumbElementSpec =
611
+ {
612
+ TK_STYLE_VERSION_2,
613
+ sizeof(NullElement),
614
+ TtkNullElementOptions,
615
+ GenericElementSize,
616
+ ThumbElementDraw
617
+ };
618
+
619
+ /*----------------------------------------------------------------------
620
+ * +++ Progress bar element.
621
+ * Increases the requested length of PP_CHUNK and PP_CHUNKVERT parts
622
+ * so that indeterminate progress bars show 3 bars instead of 1.
623
+ */
624
+
625
+ static void PbarElementSize(
626
+ void *clientData, void *elementRecord, Tk_Window tkwin,
627
+ int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr)
628
+ {
629
+ ElementData *elementData = clientData;
630
+ int nBars = 3;
631
+
632
+ GenericElementSize(clientData, elementRecord, tkwin,
633
+ widthPtr, heightPtr, paddingPtr);
634
+
635
+ if (elementData->info->partId == PP_CHUNK) {
636
+ *widthPtr *= nBars;
637
+ } else if (elementData->info->partId == PP_CHUNKVERT) {
638
+ *heightPtr *= nBars;
639
+ }
640
+ }
641
+
642
+ static Ttk_ElementSpec PbarElementSpec =
643
+ {
644
+ TK_STYLE_VERSION_2,
645
+ sizeof(NullElement),
646
+ TtkNullElementOptions,
647
+ PbarElementSize,
648
+ GenericElementDraw
649
+ };
650
+
651
+ /*----------------------------------------------------------------------
652
+ * +++ Notebook tab element.
653
+ * Same as generic element, with additional logic to select
654
+ * proper iPartID for the leftmost tab.
655
+ *
656
+ * Notes: TABP_TABITEMRIGHTEDGE (or TABP_TOPTABITEMRIGHTEDGE,
657
+ * which appears to be identical) should be used if the
658
+ * tab is exactly at the right edge of the notebook, but
659
+ * not if it's simply the rightmost tab. This information
660
+ * is not available.
661
+ *
662
+ * The TIS_* and TILES_* definitions are identical, so
663
+ * we can use the same statemap no matter what the partId.
664
+ */
665
+ static void TabElementDraw(
666
+ void *clientData, void *elementRecord, Tk_Window tkwin,
667
+ Drawable d, Ttk_Box b, unsigned int state)
668
+ {
669
+ ElementData *elementData = clientData;
670
+ int partId = elementData->info->partId;
671
+ RECT rc = BoxToRect(b);
672
+
673
+ if (!InitElementData(elementData, tkwin, d))
674
+ return;
675
+ if (state & TTK_STATE_USER1)
676
+ partId = TABP_TABITEMLEFTEDGE;
677
+ elementData->procs->DrawThemeBackground(
678
+ elementData->hTheme, elementData->hDC, partId,
679
+ Ttk_StateTableLookup(elementData->info->statemap, state), &rc, NULL);
680
+ FreeElementData(elementData);
681
+ }
682
+
683
+ static Ttk_ElementSpec TabElementSpec =
684
+ {
685
+ TK_STYLE_VERSION_2,
686
+ sizeof(NullElement),
687
+ TtkNullElementOptions,
688
+ GenericElementSize,
689
+ TabElementDraw
690
+ };
691
+
692
+ /*----------------------------------------------------------------------
693
+ * +++ Tree indicator element.
694
+ *
695
+ * Generic element, but don't display at all if TTK_STATE_LEAF (=USER2) set
696
+ */
697
+
698
+ #define TTK_STATE_OPEN TTK_STATE_USER1
699
+ #define TTK_STATE_LEAF TTK_STATE_USER2
700
+
701
+ static Ttk_StateTable header_statemap[] =
702
+ {
703
+ { HIS_PRESSED, TTK_STATE_PRESSED, 0 },
704
+ { HIS_HOT, TTK_STATE_ACTIVE, 0 },
705
+ { HIS_NORMAL, 0,0 },
706
+ };
707
+
708
+ static Ttk_StateTable tvpglyph_statemap[] =
709
+ {
710
+ { GLPS_OPENED, TTK_STATE_OPEN, 0 },
711
+ { GLPS_CLOSED, 0,0 },
712
+ };
713
+
714
+ static void TreeIndicatorElementDraw(
715
+ void *clientData, void *elementRecord, Tk_Window tkwin,
716
+ Drawable d, Ttk_Box b, unsigned int state)
717
+ {
718
+ if (!(state & TTK_STATE_LEAF)) {
719
+ GenericElementDraw(clientData,elementRecord,tkwin,d,b,state);
720
+ }
721
+ }
722
+
723
+ static Ttk_ElementSpec TreeIndicatorElementSpec =
724
+ {
725
+ TK_STYLE_VERSION_2,
726
+ sizeof(NullElement),
727
+ TtkNullElementOptions,
728
+ GenericElementSize,
729
+ TreeIndicatorElementDraw
730
+ };
731
+
732
+ #if BROKEN_TEXT_ELEMENT
733
+
734
+ /*
735
+ *----------------------------------------------------------------------
736
+ * Text element (does not work yet).
737
+ *
738
+ * According to "Using Windows XP Visual Styles", we need to select
739
+ * a font into the DC before calling DrawThemeText().
740
+ * There's just no easy way to get an HFONT out of a Tk_Font.
741
+ * Maybe GetThemeFont() would work?
742
+ *
743
+ */
744
+
745
+ typedef struct
746
+ {
747
+ Tcl_Obj *textObj;
748
+ Tcl_Obj *fontObj;
749
+ } TextElement;
750
+
751
+ static Ttk_ElementOptionSpec TextElementOptions[] =
752
+ {
753
+ { "-text", TK_OPTION_STRING,
754
+ Tk_Offset(TextElement,textObj), "" },
755
+ { "-font", TK_OPTION_FONT,
756
+ Tk_Offset(TextElement,fontObj), DEFAULT_FONT },
757
+ { NULL }
758
+ };
759
+
760
+ static void TextElementSize(
761
+ void *clientData, void *elementRecord, Tk_Window tkwin,
762
+ int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr)
763
+ {
764
+ TextElement *element = elementRecord;
765
+ ElementData *elementData = clientData;
766
+ RECT rc = {0, 0};
767
+ HRESULT hr = S_OK;
768
+
769
+ if (!InitElementData(elementData, tkwin, 0))
770
+ return;
771
+
772
+ hr = elementData->procs->GetThemeTextExtent(
773
+ elementData->hTheme,
774
+ elementData->hDC,
775
+ elementData->info->partId,
776
+ Ttk_StateTableLookup(elementData->info->statemap, 0),
777
+ Tcl_GetUnicode(element->textObj),
778
+ -1,
779
+ DT_LEFT,// | DT_BOTTOM | DT_NOPREFIX,
780
+ NULL,
781
+ &rc);
782
+
783
+ if (SUCCEEDED(hr)) {
784
+ *widthPtr = rc.right - rc.left;
785
+ *heightPtr = rc.bottom - rc.top;
786
+ }
787
+ if (*widthPtr < 80) *widthPtr = 80;
788
+ if (*heightPtr < 20) *heightPtr = 20;
789
+
790
+ FreeElementData(elementData);
791
+ }
792
+
793
+ static void TextElementDraw(
794
+ ClientData clientData, void *elementRecord, Tk_Window tkwin,
795
+ Drawable d, Ttk_Box b, unsigned int state)
796
+ {
797
+ TextElement *element = elementRecord;
798
+ ElementData *elementData = clientData;
799
+ RECT rc = BoxToRect(b);
800
+ HRESULT hr = S_OK;
801
+
802
+ if (!InitElementData(elementData, tkwin, d))
803
+ return;
804
+
805
+ hr = elementData->procs->DrawThemeText(
806
+ elementData->hTheme,
807
+ elementData->hDC,
808
+ elementData->info->partId,
809
+ Ttk_StateTableLookup(elementData->info->statemap, state),
810
+ Tcl_GetUnicode(element->textObj),
811
+ -1,
812
+ DT_LEFT,// | DT_BOTTOM | DT_NOPREFIX,
813
+ (state & TTK_STATE_DISABLED) ? DTT_GRAYED : 0,
814
+ &rc);
815
+ FreeElementData(elementData);
816
+ }
817
+
818
+ static Ttk_ElementSpec TextElementSpec =
819
+ {
820
+ TK_STYLE_VERSION_2,
821
+ sizeof(TextElement),
822
+ TextElementOptions,
823
+ TextElementSize,
824
+ TextElementDraw
825
+ };
826
+
827
+ #endif /* BROKEN_TEXT_ELEMENT */
828
+
829
+ /*----------------------------------------------------------------------
830
+ * +++ Widget layouts:
831
+ */
832
+
833
+ TTK_BEGIN_LAYOUT_TABLE(LayoutTable)
834
+
835
+ TTK_LAYOUT("TButton",
836
+ TTK_GROUP("Button.button", TTK_FILL_BOTH,
837
+ TTK_GROUP("Button.focus", TTK_FILL_BOTH,
838
+ TTK_GROUP("Button.padding", TTK_FILL_BOTH,
839
+ TTK_NODE("Button.label", TTK_FILL_BOTH)))))
840
+
841
+ TTK_LAYOUT("TMenubutton",
842
+ TTK_NODE("Menubutton.dropdown", TTK_PACK_RIGHT|TTK_FILL_Y)
843
+ TTK_GROUP("Menubutton.button", TTK_PACK_RIGHT|TTK_EXPAND|TTK_FILL_BOTH,
844
+ TTK_GROUP("Menubutton.padding", TTK_PACK_LEFT|TTK_EXPAND|TTK_FILL_X,
845
+ TTK_NODE("Menubutton.label", 0))))
846
+
847
+ TTK_LAYOUT("Horizontal.TScrollbar",
848
+ TTK_GROUP("Horizontal.Scrollbar.trough", TTK_FILL_X,
849
+ TTK_NODE("Horizontal.Scrollbar.leftarrow", TTK_PACK_LEFT)
850
+ TTK_NODE("Horizontal.Scrollbar.rightarrow", TTK_PACK_RIGHT)
851
+ TTK_GROUP("Horizontal.Scrollbar.thumb", TTK_FILL_BOTH|TTK_UNIT,
852
+ TTK_NODE("Horizontal.Scrollbar.grip", 0))))
853
+
854
+ TTK_LAYOUT("Vertical.TScrollbar",
855
+ TTK_GROUP("Vertical.Scrollbar.trough", TTK_FILL_Y,
856
+ TTK_NODE("Vertical.Scrollbar.uparrow", TTK_PACK_TOP)
857
+ TTK_NODE("Vertical.Scrollbar.downarrow", TTK_PACK_BOTTOM)
858
+ TTK_GROUP("Vertical.Scrollbar.thumb", TTK_FILL_BOTH|TTK_UNIT,
859
+ TTK_NODE("Vertical.Scrollbar.grip", 0))))
860
+
861
+ TTK_LAYOUT("Horizontal.TScale",
862
+ TTK_GROUP("Scale.focus", TTK_EXPAND|TTK_FILL_BOTH,
863
+ TTK_GROUP("Horizontal.Scale.trough", TTK_EXPAND|TTK_FILL_BOTH,
864
+ TTK_NODE("Horizontal.Scale.track", TTK_FILL_X)
865
+ TTK_NODE("Horizontal.Scale.slider", TTK_PACK_LEFT) )))
866
+
867
+ TTK_LAYOUT("Vertical.TScale",
868
+ TTK_GROUP("Scale.focus", TTK_EXPAND|TTK_FILL_BOTH,
869
+ TTK_GROUP("Vertical.Scale.trough", TTK_EXPAND|TTK_FILL_BOTH,
870
+ TTK_NODE("Vertical.Scale.track", TTK_FILL_Y)
871
+ TTK_NODE("Vertical.Scale.slider", TTK_PACK_TOP) )))
872
+
873
+ TTK_END_LAYOUT_TABLE
874
+
875
+ /*----------------------------------------------------------------------
876
+ * +++ XP element info table:
877
+ */
878
+
879
+ #define PAD(l,t,r,b) {l,t,r,b}
880
+ #define NOPAD {0,0,0,0}
881
+
882
+ /* name spec className partId statemap padding flags */
883
+
884
+ static ElementInfo ElementInfoTable[] = {
885
+ { "Checkbutton.indicator", &GenericElementSpec, L"BUTTON",
886
+ BP_CHECKBOX, checkbox_statemap, PAD(0, 0, 4, 0), PAD_MARGINS },
887
+ { "Radiobutton.indicator", &GenericElementSpec, L"BUTTON",
888
+ BP_RADIOBUTTON, radiobutton_statemap, PAD(0, 0, 4, 0), PAD_MARGINS },
889
+ { "Button.button", &GenericElementSpec, L"BUTTON",
890
+ BP_PUSHBUTTON, pushbutton_statemap, PAD(3, 3, 3, 3), IGNORE_THEMESIZE },
891
+ { "Labelframe.border", &GenericElementSpec, L"BUTTON",
892
+ BP_GROUPBOX, groupbox_statemap, PAD(2, 2, 2, 2), 0 },
893
+ { "Entry.field", &GenericElementSpec, L"EDIT", EP_EDITTEXT,
894
+ edittext_statemap, PAD(1, 1, 1, 1), 0 },
895
+ { "Combobox.field", &GenericElementSpec, L"EDIT",
896
+ EP_EDITTEXT, combotext_statemap, PAD(1, 1, 1, 1), 0 },
897
+ { "Combobox.downarrow", &GenericSizedElementSpec, L"COMBOBOX",
898
+ CP_DROPDOWNBUTTON, combobox_statemap, NOPAD,
899
+ (SM_CXVSCROLL << 8) | SM_CYVSCROLL },
900
+ { "Vertical.Scrollbar.trough", &GenericElementSpec, L"SCROLLBAR",
901
+ SBP_UPPERTRACKVERT, scrollbar_statemap, NOPAD, 0 },
902
+ { "Vertical.Scrollbar.thumb", &ThumbElementSpec, L"SCROLLBAR",
903
+ SBP_THUMBBTNVERT, scrollbar_statemap, NOPAD, 0 },
904
+ { "Vertical.Scrollbar.grip", &GenericElementSpec, L"SCROLLBAR",
905
+ SBP_GRIPPERVERT, scrollbar_statemap, NOPAD, 0 },
906
+ { "Horizontal.Scrollbar.trough", &GenericElementSpec, L"SCROLLBAR",
907
+ SBP_UPPERTRACKHORZ, scrollbar_statemap, NOPAD, 0 },
908
+ { "Horizontal.Scrollbar.thumb", &ThumbElementSpec, L"SCROLLBAR",
909
+ SBP_THUMBBTNHORZ, scrollbar_statemap, NOPAD, 0 },
910
+ { "Horizontal.Scrollbar.grip", &GenericElementSpec, L"SCROLLBAR",
911
+ SBP_GRIPPERHORZ, scrollbar_statemap, NOPAD, 0 },
912
+ { "Scrollbar.uparrow", &GenericSizedElementSpec, L"SCROLLBAR",
913
+ SBP_ARROWBTN, uparrow_statemap, NOPAD,
914
+ (SM_CXVSCROLL << 8) | SM_CYVSCROLL },
915
+ { "Scrollbar.downarrow", &GenericSizedElementSpec, L"SCROLLBAR",
916
+ SBP_ARROWBTN, downarrow_statemap, NOPAD,
917
+ (SM_CXVSCROLL << 8) | SM_CYVSCROLL },
918
+ { "Scrollbar.leftarrow", &GenericSizedElementSpec, L"SCROLLBAR",
919
+ SBP_ARROWBTN, leftarrow_statemap, NOPAD,
920
+ (SM_CXHSCROLL << 8) | SM_CYHSCROLL },
921
+ { "Scrollbar.rightarrow", &GenericSizedElementSpec, L"SCROLLBAR",
922
+ SBP_ARROWBTN, rightarrow_statemap, NOPAD,
923
+ (SM_CXHSCROLL << 8) | SM_CYHSCROLL },
924
+ { "Horizontal.Scale.slider", &GenericElementSpec, L"TRACKBAR",
925
+ TKP_THUMB, scale_statemap, NOPAD, 0 },
926
+ { "Vertical.Scale.slider", &GenericElementSpec, L"TRACKBAR",
927
+ TKP_THUMBVERT, scale_statemap, NOPAD, 0 },
928
+ { "Horizontal.Scale.track", &GenericElementSpec, L"TRACKBAR",
929
+ TKP_TRACK, scale_statemap, NOPAD, 0 },
930
+ { "Vertical.Scale.track", &GenericElementSpec, L"TRACKBAR",
931
+ TKP_TRACKVERT, scale_statemap, NOPAD, 0 },
932
+ /* ttk::progressbar elements */
933
+ { "Horizontal.Progressbar.pbar", &PbarElementSpec, L"PROGRESS",
934
+ PP_CHUNK, null_statemap, NOPAD, 0 },
935
+ { "Vertical.Progressbar.pbar", &PbarElementSpec, L"PROGRESS",
936
+ PP_CHUNKVERT, null_statemap, NOPAD, 0 },
937
+ { "Horizontal.Progressbar.trough", &GenericElementSpec, L"PROGRESS",
938
+ PP_BAR, null_statemap, PAD(3,3,3,3), IGNORE_THEMESIZE },
939
+ { "Vertical.Progressbar.trough", &GenericElementSpec, L"PROGRESS",
940
+ PP_BARVERT, null_statemap, PAD(3,3,3,3), IGNORE_THEMESIZE },
941
+ /* ttk::notebook */
942
+ { "tab", &TabElementSpec, L"TAB",
943
+ TABP_TABITEM, tabitem_statemap, PAD(3,3,3,0), 0 },
944
+ { "client", &GenericElementSpec, L"TAB",
945
+ TABP_PANE, null_statemap, PAD(1,1,3,3), 0 },
946
+ { "NotebookPane.background", &GenericElementSpec, L"TAB",
947
+ TABP_BODY, null_statemap, NOPAD, 0 },
948
+ { "Toolbutton.border", &GenericElementSpec, L"TOOLBAR",
949
+ TP_BUTTON, toolbutton_statemap, NOPAD,0 },
950
+ { "Menubutton.button", &GenericElementSpec, L"TOOLBAR",
951
+ TP_SPLITBUTTON,toolbutton_statemap, NOPAD,0 },
952
+ { "Menubutton.dropdown", &GenericElementSpec, L"TOOLBAR",
953
+ TP_SPLITBUTTONDROPDOWN,toolbutton_statemap, NOPAD,0 },
954
+ { "Treeitem.indicator", &TreeIndicatorElementSpec, L"TREEVIEW",
955
+ TVP_GLYPH, tvpglyph_statemap, PAD(1,1,6,0), PAD_MARGINS },
956
+ { "Treeheading.border", &GenericElementSpec, L"HEADER",
957
+ HP_HEADERITEM, header_statemap, PAD(4,0,4,0),0 },
958
+ { "sizegrip", &GenericElementSpec, L"STATUS",
959
+ SP_GRIPPER, null_statemap, NOPAD,0 },
960
+
961
+ #if BROKEN_TEXT_ELEMENT
962
+ { "Labelframe.text", &TextElementSpec, L"BUTTON",
963
+ BP_GROUPBOX, groupbox_statemap, NOPAD,0 },
964
+ #endif
965
+
966
+ { 0,0,0,0,0,NOPAD,0 }
967
+ };
968
+ #undef PAD
969
+
970
+ /*----------------------------------------------------------------------
971
+ * +++ Initialization routine:
972
+ */
973
+
974
+ int TtkXPTheme_Init(Tcl_Interp *interp, HWND hwnd)
975
+ {
976
+ XPThemeData *themeData;
977
+ XPThemeProcs *procs;
978
+ HINSTANCE hlibrary;
979
+ Ttk_Theme themePtr, parentPtr;
980
+ ElementInfo *infoPtr;
981
+
982
+ procs = LoadXPThemeProcs(&hlibrary);
983
+ if (!procs)
984
+ return TCL_ERROR;
985
+ procs->stubWindow = hwnd;
986
+
987
+ /*
988
+ * Create the new style engine.
989
+ */
990
+ parentPtr = Ttk_GetTheme(interp, "winnative");
991
+ themePtr = Ttk_CreateTheme(interp, "xpnative", parentPtr);
992
+
993
+ if (!themePtr)
994
+ return TCL_ERROR;
995
+
996
+ /*
997
+ * Set theme data and cleanup proc
998
+ */
999
+
1000
+ themeData = (XPThemeData *)ckalloc(sizeof(XPThemeData));
1001
+ themeData->procs = procs;
1002
+ themeData->hlibrary = hlibrary;
1003
+
1004
+ Ttk_SetThemeEnabledProc(themePtr, XPThemeEnabled, themeData);
1005
+ Ttk_RegisterCleanup(interp, themeData, XPThemeDeleteProc);
1006
+
1007
+ /*
1008
+ * New elements:
1009
+ */
1010
+ for (infoPtr = ElementInfoTable; infoPtr->elementName != 0; ++infoPtr) {
1011
+ ClientData clientData = NewElementData(procs, infoPtr);
1012
+ Ttk_RegisterElementSpec(
1013
+ themePtr, infoPtr->elementName, infoPtr->elementSpec, clientData);
1014
+ Ttk_RegisterCleanup(interp, clientData, DestroyElementData);
1015
+ }
1016
+
1017
+ Ttk_RegisterElementSpec(themePtr, "Scale.trough", &ttkNullElementSpec, 0);
1018
+
1019
+ /*
1020
+ * Layouts:
1021
+ */
1022
+ Ttk_RegisterLayouts(themePtr, LayoutTable);
1023
+
1024
+ Tcl_PkgProvide(interp, "ttk::theme::xpnative", TILE_VERSION);
1025
+
1026
+ return TCL_OK;
1027
+ }
1028
+
1029
+ #endif /* HAVE_UXTHEME_H */