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