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,40 @@
1
+ // RCS: @(#) tile.rc,v 1.3 2006/09/30 17:53:08 jenglish Exp
2
+ //
3
+ // Version Resource Script
4
+ //
5
+
6
+ #include <winver.h>
7
+
8
+ LANGUAGE 0x9, 0x1 /* LANG_ENGLISH, SUBLANG_DEFAULT */
9
+
10
+ VS_VERSION_INFO VERSIONINFO
11
+ FILEVERSION COMMAVERSION
12
+ PRODUCTVERSION COMMAVERSION
13
+ FILEFLAGSMASK 0x3fL
14
+ #ifdef DEBUG
15
+ FILEFLAGS VS_FF_DEBUG
16
+ #else
17
+ FILEFLAGS 0x0L
18
+ #endif
19
+ FILEOS VOS__WINDOWS32
20
+ FILETYPE VFT_DLL
21
+ FILESUBTYPE 0x0L
22
+ BEGIN
23
+ BLOCK "StringFileInfo"
24
+ BEGIN
25
+ BLOCK "040904b0" /* LANG_ENGLISH/SUBLANG_ENGLISH_US, Unicode CP */
26
+ BEGIN
27
+ VALUE "FileDescription", "Tile " DOTVERSION " Tk theme extension\0"
28
+ VALUE "OriginalFilename", "tile" VERSION ".dll\0"
29
+ VALUE "FileVersion", DOTVERSION "\0"
30
+ VALUE "LegalCopyright", "Copyright \251 2003 Joe English and other parties\0"
31
+ VALUE "ProductName", "Tile " DOTVERSION " Tk theme extension\0"
32
+ VALUE "ProductVersion", DOTVERSION "\0"
33
+ END
34
+ END
35
+ BLOCK "VarFileInfo"
36
+ BEGIN
37
+ VALUE "Translation", 0x409, 1200
38
+ END
39
+ END
40
+
@@ -0,0 +1,734 @@
1
+ /* winTheme.c - Copyright (C) 2004 Pat Thoyts <patthoyts@users.sf.net>
2
+ *
3
+ * winTheme.c,v 1.41 2007/12/02 04:34:31 jenglish Exp
4
+ */
5
+
6
+ #ifdef _MSC_VER
7
+ #define WIN32_LEAN_AND_MEAN
8
+ #endif
9
+
10
+ #include <windows.h>
11
+
12
+ #include <tk.h>
13
+
14
+ #ifdef NO_PRIVATE_HEADERS
15
+ #include <tkPlatDecls.h>
16
+ #include "gunk.h"
17
+ #else
18
+ #include <tkWinInt.h>
19
+ #endif
20
+
21
+ #ifndef DFCS_HOT /* Windows 98/Me, Windows 200/XP only */
22
+ #define DFCS_HOT 0
23
+ #endif
24
+
25
+ #include "tkTheme.h"
26
+
27
+ /*
28
+ * BoxToRect --
29
+ * Helper routine. Converts a Ttk_Box to a Win32 RECT.
30
+ */
31
+ static RECT BoxToRect(Ttk_Box b)
32
+ {
33
+ RECT rc;
34
+ rc.top = b.y;
35
+ rc.left = b.x;
36
+ rc.bottom = b.y + b.height;
37
+ rc.right = b.x + b.width;
38
+ return rc;
39
+ }
40
+
41
+ /*
42
+ * ReliefToEdge --
43
+ * Convert a Tk "relief" value into an Windows "edge" value.
44
+ * NB: Caller must check for RELIEF_FLAT and RELIEF_SOLID,
45
+ * which must be handled specially.
46
+ *
47
+ * Passing the BF_FLAT flag to DrawEdge() yields something similar
48
+ * to TK_RELIEF_SOLID. TK_RELIEF_FLAT can be implemented by not
49
+ * drawing anything.
50
+ */
51
+ static unsigned int ReliefToEdge(int relief)
52
+ {
53
+ switch (relief) {
54
+ case TK_RELIEF_RAISED: return EDGE_RAISED;
55
+ case TK_RELIEF_SUNKEN: return EDGE_SUNKEN;
56
+ case TK_RELIEF_RIDGE: return EDGE_BUMP;
57
+ case TK_RELIEF_GROOVE: return EDGE_ETCHED;
58
+ case TK_RELIEF_SOLID: return BDR_RAISEDOUTER;
59
+ default:
60
+ case TK_RELIEF_FLAT: return BDR_RAISEDOUTER;
61
+ }
62
+ }
63
+
64
+ /* ---------------------------------------------------------------------- */
65
+
66
+ static Ttk_StateTable checkbutton_statemap[] =
67
+ {
68
+ { DFCS_CHECKED|DFCS_INACTIVE, TTK_STATE_SELECTED|TTK_STATE_DISABLED, 0 },
69
+ { DFCS_CHECKED|DFCS_PUSHED, TTK_STATE_SELECTED|TTK_STATE_PRESSED, 0 },
70
+ { DFCS_CHECKED, TTK_STATE_SELECTED, 0 },
71
+ { DFCS_INACTIVE, TTK_STATE_DISABLED, TTK_STATE_SELECTED },
72
+ { DFCS_PUSHED, TTK_STATE_PRESSED, TTK_STATE_SELECTED},
73
+ { 0, 0, 0 }
74
+ };
75
+
76
+ static Ttk_StateTable pushbutton_statemap[] =
77
+ {
78
+ { DFCS_INACTIVE, TTK_STATE_DISABLED, 0 },
79
+ { DFCS_PUSHED, TTK_STATE_PRESSED, 0 },
80
+ { DFCS_HOT, TTK_STATE_ACTIVE, 0 },
81
+ { 0, 0, 0 }
82
+ };
83
+
84
+ static Ttk_StateTable arrow_statemap[] =
85
+ {
86
+ { DFCS_INACTIVE, TTK_STATE_DISABLED, 0 },
87
+ { DFCS_PUSHED | DFCS_FLAT, TTK_STATE_PRESSED, 0 },
88
+ { 0, 0, 0 }
89
+ };
90
+
91
+ /*------------------------------------------------------------------------
92
+ * +++ FrameControlElement --
93
+ * General-purpose element for things drawn with DrawFrameControl
94
+ */
95
+ typedef struct
96
+ {
97
+ const char *name; /* element name */
98
+ int classId; /* class id for DrawFrameControl */
99
+ int partId; /* part id for DrawFrameControl */
100
+ int cxId; /* system metric id for size in x */
101
+ int cyId; /* system metric id for size in y */
102
+ Ttk_StateTable *stateMap; /* map Tk states to Win32 flags */
103
+ Ttk_Padding margins; /* additional placement padding */
104
+ } FrameControlElementData;
105
+
106
+ static FrameControlElementData FrameControlElements[] =
107
+ {
108
+ { "Checkbutton.indicator",
109
+ DFC_BUTTON, DFCS_BUTTONCHECK, SM_CYMENUCHECK, SM_CYMENUCHECK,
110
+ checkbutton_statemap, {0,0,4,0} },
111
+ { "Radiobutton.indicator",
112
+ DFC_BUTTON, DFCS_BUTTONRADIO, SM_CYMENUCHECK, SM_CYMENUCHECK,
113
+ checkbutton_statemap, {0,0,4,0} },
114
+ { "uparrow",
115
+ DFC_SCROLL, DFCS_SCROLLUP, SM_CXVSCROLL, SM_CYVSCROLL,
116
+ arrow_statemap, {0,0,0,0} },
117
+ { "downarrow",
118
+ DFC_SCROLL, DFCS_SCROLLDOWN, SM_CXVSCROLL, SM_CYVSCROLL,
119
+ arrow_statemap, {0,0,0,0} },
120
+ { "leftarrow",
121
+ DFC_SCROLL, DFCS_SCROLLLEFT, SM_CXHSCROLL, SM_CYHSCROLL,
122
+ arrow_statemap, {0,0,0,0} },
123
+ { "rightarrow",
124
+ DFC_SCROLL, DFCS_SCROLLRIGHT, SM_CXHSCROLL, SM_CYHSCROLL,
125
+ arrow_statemap, {0,0,0,0} },
126
+ { "sizegrip",
127
+ DFC_SCROLL, DFCS_SCROLLSIZEGRIP, SM_CXVSCROLL, SM_CYHSCROLL,
128
+ arrow_statemap, {0,0,0,0} },
129
+
130
+ { 0,0,0,0,0,0, {0,0,0,0} }
131
+ };
132
+
133
+ /* ---------------------------------------------------------------------- */
134
+
135
+ static void FrameControlElementSize(
136
+ void *clientData, void *elementRecord, Tk_Window tkwin,
137
+ int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr)
138
+ {
139
+ FrameControlElementData *p = clientData;
140
+ *widthPtr = GetSystemMetrics(p->cxId) + Ttk_PaddingWidth(p->margins);
141
+ *heightPtr = GetSystemMetrics(p->cyId) + Ttk_PaddingHeight(p->margins);
142
+ }
143
+
144
+ static void FrameControlElementDraw(
145
+ void *clientData, void *elementRecord, Tk_Window tkwin,
146
+ Drawable d, Ttk_Box b, unsigned int state)
147
+ {
148
+ FrameControlElementData *elementData = clientData;
149
+ RECT rc = BoxToRect(b);
150
+ TkWinDCState dcState;
151
+ HDC hdc = TkWinGetDrawableDC(Tk_Display(tkwin), d, &dcState);
152
+
153
+ DrawFrameControl(hdc, &rc,
154
+ elementData->classId,
155
+ elementData->partId|Ttk_StateTableLookup(elementData->stateMap, state));
156
+ TkWinReleaseDrawableDC(d, hdc, &dcState);
157
+ }
158
+
159
+ static Ttk_ElementSpec FrameControlElementSpec =
160
+ {
161
+ TK_STYLE_VERSION_2,
162
+ sizeof(NullElement),
163
+ TtkNullElementOptions,
164
+ FrameControlElementSize,
165
+ FrameControlElementDraw
166
+ };
167
+
168
+ /*----------------------------------------------------------------------
169
+ * +++ Border element implementation.
170
+ */
171
+
172
+ typedef struct {
173
+ Tcl_Obj *reliefObj;
174
+ } BorderElement;
175
+
176
+ static Ttk_ElementOptionSpec BorderElementOptions[] = {
177
+ { "-relief",TK_OPTION_RELIEF,Tk_Offset(BorderElement,reliefObj), "flat" },
178
+ {NULL}
179
+ };
180
+
181
+ static void BorderElementSize(
182
+ void *clientData, void *elementRecord, Tk_Window tkwin,
183
+ int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr)
184
+ {
185
+ paddingPtr->left = paddingPtr->right = GetSystemMetrics(SM_CXEDGE);
186
+ paddingPtr->top = paddingPtr->bottom = GetSystemMetrics(SM_CYEDGE);
187
+ }
188
+
189
+ static void BorderElementDraw(
190
+ void *clientData, void *elementRecord, Tk_Window tkwin,
191
+ Drawable d, Ttk_Box b, unsigned int state)
192
+ {
193
+ BorderElement *border = elementRecord;
194
+ RECT rc = BoxToRect(b);
195
+ int relief = TK_RELIEF_FLAT;
196
+ TkWinDCState dcState;
197
+ HDC hdc;
198
+
199
+ Tk_GetReliefFromObj(NULL, border->reliefObj, &relief);
200
+
201
+ if (relief != TK_RELIEF_FLAT) {
202
+ UINT xFlags = (relief == TK_RELIEF_SOLID) ? BF_FLAT : 0;
203
+ hdc = TkWinGetDrawableDC(Tk_Display(tkwin), d, &dcState);
204
+ DrawEdge(hdc, &rc, ReliefToEdge(relief), BF_RECT | xFlags);
205
+ TkWinReleaseDrawableDC(d, hdc, &dcState);
206
+ }
207
+ }
208
+
209
+ static Ttk_ElementSpec BorderElementSpec =
210
+ {
211
+ TK_STYLE_VERSION_2,
212
+ sizeof(BorderElement),
213
+ BorderElementOptions,
214
+ BorderElementSize,
215
+ BorderElementDraw
216
+ };
217
+
218
+ /*
219
+ * Entry field borders:
220
+ * Sunken border; also fill with window color.
221
+ */
222
+
223
+ typedef struct
224
+ {
225
+ Tcl_Obj *backgroundObj;
226
+ } FieldElement;
227
+
228
+ static Ttk_ElementOptionSpec FieldElementOptions[] =
229
+ {
230
+ { "-fieldbackground", TK_OPTION_BORDER,
231
+ Tk_Offset(FieldElement,backgroundObj), "white" },
232
+ {NULL}
233
+ };
234
+
235
+ static void FieldElementSize(
236
+ void *clientData, void *elementRecord, Tk_Window tkwin,
237
+ int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr)
238
+ {
239
+ paddingPtr->left = paddingPtr->right = GetSystemMetrics(SM_CXEDGE);
240
+ paddingPtr->top = paddingPtr->bottom = GetSystemMetrics(SM_CYEDGE);
241
+ }
242
+
243
+ static void FieldElementDraw(
244
+ void *clientData, void *elementRecord, Tk_Window tkwin,
245
+ Drawable d, Ttk_Box b, unsigned int state)
246
+ {
247
+ FieldElement *field = elementRecord;
248
+ Tk_3DBorder bg = Tk_Get3DBorderFromObj(tkwin, field->backgroundObj);
249
+ RECT rc = BoxToRect(b);
250
+ TkWinDCState dcState;
251
+ HDC hdc;
252
+
253
+ Tk_Fill3DRectangle(
254
+ tkwin, d, bg, b.x, b.y, b.width, b.height, 0, TK_RELIEF_FLAT);
255
+
256
+ hdc = TkWinGetDrawableDC(Tk_Display(tkwin), d, &dcState);
257
+ DrawEdge(hdc, &rc, EDGE_SUNKEN, BF_RECT);
258
+ TkWinReleaseDrawableDC(d, hdc, &dcState);
259
+ }
260
+
261
+ static Ttk_ElementSpec FieldElementSpec =
262
+ {
263
+ TK_STYLE_VERSION_2,
264
+ sizeof(FieldElement),
265
+ FieldElementOptions,
266
+ FieldElementSize,
267
+ FieldElementDraw
268
+ };
269
+
270
+ /*------------------------------------------------------------------------
271
+ * +++ Button borders.
272
+ * Drawn with DrawFrameControl instead of DrawEdge;
273
+ * Also draw default indicator and focus ring.
274
+ */
275
+ typedef struct {
276
+ Tcl_Obj *reliefObj;
277
+ Tcl_Obj *highlightColorObj;
278
+ Tcl_Obj *defaultStateObj;
279
+ } ButtonBorderElement;
280
+
281
+ static Ttk_ElementOptionSpec ButtonBorderElementOptions[] = {
282
+ { "-relief",TK_OPTION_RELIEF,
283
+ Tk_Offset(ButtonBorderElement,reliefObj), "flat" },
284
+ { "-highlightcolor",TK_OPTION_COLOR,
285
+ Tk_Offset(ButtonBorderElement,highlightColorObj), "black" },
286
+ { "-default", TK_OPTION_ANY,
287
+ Tk_Offset(ButtonBorderElement,defaultStateObj), "disabled" },
288
+ {NULL}
289
+ };
290
+
291
+ static void ButtonBorderElementSize(
292
+ void *clientData, void *elementRecord, Tk_Window tkwin,
293
+ int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr)
294
+ {
295
+ ButtonBorderElement *bd = elementRecord;
296
+ int relief = TK_RELIEF_RAISED;
297
+ int defaultState = TTK_BUTTON_DEFAULT_DISABLED;
298
+ short int cx, cy;
299
+
300
+ Tk_GetReliefFromObj(NULL, bd->reliefObj, &relief);
301
+ Ttk_GetButtonDefaultStateFromObj(NULL, bd->defaultStateObj, &defaultState);
302
+ cx = GetSystemMetrics(SM_CXEDGE);
303
+ cy = GetSystemMetrics(SM_CYEDGE);
304
+
305
+ /* Space for default indicator:
306
+ */
307
+ if (defaultState != TTK_BUTTON_DEFAULT_DISABLED) {
308
+ ++cx; ++cy;
309
+ }
310
+
311
+ /* Space for focus ring:
312
+ */
313
+ cx += 2;
314
+ cy += 2;
315
+
316
+ *paddingPtr = Ttk_MakePadding(cx,cy,cx,cy);
317
+ }
318
+
319
+ static void ButtonBorderElementDraw(
320
+ void *clientData, void *elementRecord, Tk_Window tkwin,
321
+ Drawable d, Ttk_Box b, unsigned int state)
322
+ {
323
+ ButtonBorderElement *bd = elementRecord;
324
+ int relief = TK_RELIEF_FLAT;
325
+ int defaultState = TTK_BUTTON_DEFAULT_DISABLED;
326
+ TkWinDCState dcState;
327
+ HDC hdc;
328
+ RECT rc;
329
+
330
+ Tk_GetReliefFromObj(NULL, bd->reliefObj, &relief);
331
+ Ttk_GetButtonDefaultStateFromObj(NULL, bd->defaultStateObj, &defaultState);
332
+
333
+ if (defaultState == TTK_BUTTON_DEFAULT_ACTIVE) {
334
+ XColor *highlightColor =
335
+ Tk_GetColorFromObj(tkwin, bd->highlightColorObj);
336
+ GC gc = Tk_GCForColor(highlightColor, d);
337
+ XDrawRectangle(Tk_Display(tkwin), d, gc, b.x,b.y,b.width-1,b.height-1);
338
+ }
339
+ if (defaultState != TTK_BUTTON_DEFAULT_DISABLED) {
340
+ ++b.x; ++b.y; b.width -= 2; b.height -= 2;
341
+ }
342
+
343
+ hdc = TkWinGetDrawableDC(Tk_Display(tkwin), d, &dcState);
344
+
345
+ rc = BoxToRect(b);
346
+ DrawFrameControl(hdc, &rc,
347
+ DFC_BUTTON, /* classId */
348
+ DFCS_BUTTONPUSH | Ttk_StateTableLookup(pushbutton_statemap, state));
349
+
350
+ /* Draw focus ring:
351
+ */
352
+ if (state & TTK_STATE_FOCUS) {
353
+ short int borderWidth = 3; /* @@@ Use GetSystemMetrics?*/
354
+ rc = BoxToRect(Ttk_PadBox(b, Ttk_UniformPadding(borderWidth)));
355
+ DrawFocusRect(hdc, &rc);
356
+ }
357
+ TkWinReleaseDrawableDC(d, hdc, &dcState);
358
+ }
359
+
360
+ static Ttk_ElementSpec ButtonBorderElementSpec =
361
+ {
362
+ TK_STYLE_VERSION_2,
363
+ sizeof(ButtonBorderElement),
364
+ ButtonBorderElementOptions,
365
+ ButtonBorderElementSize,
366
+ ButtonBorderElementDraw
367
+ };
368
+
369
+ /*------------------------------------------------------------------------
370
+ * +++ Focus element.
371
+ * Draw dashed focus rectangle.
372
+ */
373
+
374
+ static void FocusElementSize(
375
+ void *clientData, void *elementRecord, Tk_Window tkwin,
376
+ int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr)
377
+ {
378
+ *paddingPtr = Ttk_UniformPadding(1);
379
+ }
380
+
381
+ static void FocusElementDraw(
382
+ void *clientData, void *elementRecord, Tk_Window tkwin,
383
+ Drawable d, Ttk_Box b, unsigned int state)
384
+ {
385
+ if (state & TTK_STATE_FOCUS) {
386
+ RECT rc = BoxToRect(b);
387
+ TkWinDCState dcState;
388
+ HDC hdc = TkWinGetDrawableDC(Tk_Display(tkwin), d, &dcState);
389
+ DrawFocusRect(hdc, &rc);
390
+ TkWinReleaseDrawableDC(d, hdc, &dcState);
391
+ }
392
+ }
393
+
394
+ static Ttk_ElementSpec FocusElementSpec =
395
+ {
396
+ TK_STYLE_VERSION_2,
397
+ sizeof(NullElement),
398
+ TtkNullElementOptions,
399
+ FocusElementSize,
400
+ FocusElementDraw
401
+ };
402
+
403
+ /* FillFocusElement --
404
+ * Draws a focus ring filled with the selection color
405
+ */
406
+
407
+ typedef struct {
408
+ Tcl_Obj *fillColorObj;
409
+ } FillFocusElement;
410
+
411
+ static Ttk_ElementOptionSpec FillFocusElementOptions[] = {
412
+ { "-focusfill", TK_OPTION_COLOR,
413
+ Tk_Offset(FillFocusElement,fillColorObj), "white" },
414
+ { NULL }
415
+ };
416
+
417
+ /* @@@ FIX THIS */
418
+ static void FillFocusElementDraw(
419
+ void *clientData, void *elementRecord, Tk_Window tkwin,
420
+ Drawable d, Ttk_Box b, unsigned int state)
421
+ {
422
+ FillFocusElement *focus = elementRecord;
423
+ if (state & TTK_STATE_FOCUS) {
424
+ RECT rc = BoxToRect(b);
425
+ TkWinDCState dcState;
426
+ XColor *fillColor = Tk_GetColorFromObj(tkwin, focus->fillColorObj);
427
+ GC gc = Tk_GCForColor(fillColor, d);
428
+ HDC hdc;
429
+
430
+ XFillRectangle(Tk_Display(tkwin),d,gc, b.x,b.y,b.width,b.height);
431
+ hdc = TkWinGetDrawableDC(Tk_Display(tkwin), d, &dcState);
432
+ DrawFocusRect(hdc, &rc);
433
+ TkWinReleaseDrawableDC(d, hdc, &dcState);
434
+ }
435
+ }
436
+
437
+ /*
438
+ * ComboboxFocusElement --
439
+ * Read-only comboboxes have a filled focus ring, editable ones do not.
440
+ */
441
+ static void ComboboxFocusElementDraw(
442
+ void *clientData, void *elementRecord, Tk_Window tkwin,
443
+ Drawable d, Ttk_Box b, unsigned int state)
444
+ {
445
+ if (state & TTK_STATE_READONLY) {
446
+ FillFocusElementDraw(clientData, elementRecord, tkwin, d, b, state);
447
+ }
448
+ }
449
+
450
+ static Ttk_ElementSpec ComboboxFocusElementSpec =
451
+ {
452
+ TK_STYLE_VERSION_2,
453
+ sizeof(FillFocusElement),
454
+ FillFocusElementOptions,
455
+ FocusElementSize,
456
+ ComboboxFocusElementDraw
457
+ };
458
+
459
+ /*----------------------------------------------------------------------
460
+ * +++ Scrollbar trough element.
461
+ *
462
+ * The native windows scrollbar is drawn using a pattern brush giving a
463
+ * stippled appearance when the trough might otherwise be invisible.
464
+ * We can deal with this here.
465
+ */
466
+
467
+ typedef struct { /* clientData for Trough element */
468
+ HBRUSH PatternBrush;
469
+ HBITMAP PatternBitmap;
470
+ } TroughClientData;
471
+
472
+ static const WORD Pattern[] = {
473
+ 0x5555, 0xaaaa, 0x5555, 0xaaaa, 0x5555, 0xaaaa, 0x5555, 0xaaaa
474
+ };
475
+
476
+ static void TroughClientDataDeleteProc(void *clientData)
477
+ {
478
+ TroughClientData *cd = clientData;
479
+ DeleteObject(cd->PatternBrush);
480
+ DeleteObject(cd->PatternBitmap);
481
+ ckfree(clientData);
482
+ }
483
+
484
+ static TroughClientData *TroughClientDataInit(Tcl_Interp *interp)
485
+ {
486
+ TroughClientData *cd = (TroughClientData*)ckalloc(sizeof(*cd));
487
+ cd->PatternBitmap = CreateBitmap(8, 8, 1, 1, Pattern);
488
+ cd->PatternBrush = CreatePatternBrush(cd->PatternBitmap);
489
+ Ttk_RegisterCleanup(interp, cd, TroughClientDataDeleteProc);
490
+ return cd;
491
+ }
492
+
493
+ static void TroughElementDraw(
494
+ void *clientData, void *elementRecord, Tk_Window tkwin,
495
+ Drawable d, Ttk_Box b, unsigned int state)
496
+ {
497
+ TroughClientData *cd = clientData;
498
+ TkWinDCState dcState;
499
+ HDC hdc = TkWinGetDrawableDC(Tk_Display(tkwin), d, &dcState);
500
+ HBRUSH hbr;
501
+ COLORREF bk, oldbk, oldtxt;
502
+
503
+ hbr = SelectObject(hdc, GetSysColorBrush(COLOR_SCROLLBAR));
504
+ bk = GetSysColor(COLOR_3DHIGHLIGHT);
505
+ oldtxt = SetTextColor(hdc, GetSysColor(COLOR_3DFACE));
506
+ oldbk = SetBkColor(hdc, bk);
507
+
508
+ /* WAS: if (bk (COLOR_3DHIGHLIGHT) == GetSysColor(COLOR_WINDOW)) ... */
509
+ if (GetSysColor(COLOR_SCROLLBAR) == GetSysColor(COLOR_BTNFACE)) {
510
+ /* Draw using the pattern brush */
511
+ SelectObject(hdc, cd->PatternBrush);
512
+ }
513
+
514
+ PatBlt(hdc, b.x, b.y, b.width, b.height, PATCOPY);
515
+ SetBkColor(hdc, oldbk);
516
+ SetTextColor(hdc, oldtxt);
517
+ SelectObject(hdc, hbr);
518
+ TkWinReleaseDrawableDC(d, hdc, &dcState);
519
+ }
520
+
521
+ static Ttk_ElementSpec TroughElementSpec =
522
+ {
523
+ TK_STYLE_VERSION_2,
524
+ sizeof(NullElement),
525
+ TtkNullElementOptions,
526
+ TtkNullElementSize,
527
+ TroughElementDraw
528
+ };
529
+
530
+ /*------------------------------------------------------------------------
531
+ * +++ Thumb element.
532
+ */
533
+
534
+ typedef struct
535
+ {
536
+ Tcl_Obj *orientObj;
537
+ } ThumbElement;
538
+
539
+ static Ttk_ElementOptionSpec ThumbElementOptions[] =
540
+ {
541
+ { "-orient", TK_OPTION_ANY,Tk_Offset(ThumbElement,orientObj),"horizontal"},
542
+ { NULL }
543
+ };
544
+
545
+ static void ThumbElementSize(
546
+ void *clientData, void *elementRecord, Tk_Window tkwin,
547
+ int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr)
548
+ {
549
+ ThumbElement *thumbPtr = elementRecord;
550
+ int orient;
551
+
552
+ Ttk_GetOrientFromObj(NULL, thumbPtr->orientObj, &orient);
553
+ if (orient == TTK_ORIENT_HORIZONTAL) {
554
+ *widthPtr = GetSystemMetrics(SM_CXHTHUMB);
555
+ *heightPtr = GetSystemMetrics(SM_CYHSCROLL);
556
+ } else {
557
+ *widthPtr = GetSystemMetrics(SM_CXVSCROLL);
558
+ *heightPtr = GetSystemMetrics(SM_CYVTHUMB);
559
+ }
560
+ }
561
+
562
+ static void ThumbElementDraw(
563
+ void *clientData, void *elementRecord, Tk_Window tkwin,
564
+ Drawable d, Ttk_Box b, unsigned int state)
565
+ {
566
+ RECT rc = BoxToRect(b);
567
+ TkWinDCState dcState;
568
+ HDC hdc;
569
+
570
+ /* Windows doesn't show a thumb when the scrollbar is disabled */
571
+ if (state & TTK_STATE_DISABLED)
572
+ return;
573
+
574
+ hdc = TkWinGetDrawableDC(Tk_Display(tkwin), d, &dcState);
575
+ DrawEdge(hdc, &rc, EDGE_RAISED, BF_RECT | BF_MIDDLE);
576
+ TkWinReleaseDrawableDC(d, hdc, &dcState);
577
+ }
578
+
579
+ static Ttk_ElementSpec ThumbElementSpec =
580
+ {
581
+ TK_STYLE_VERSION_2,
582
+ sizeof(ThumbElement),
583
+ ThumbElementOptions,
584
+ ThumbElementSize,
585
+ ThumbElementDraw
586
+ };
587
+
588
+ /* ----------------------------------------------------------------------
589
+ * The slider element is the shaped thumb used in the slider widget.
590
+ * Windows likes to call this a trackbar.
591
+ */
592
+
593
+ typedef struct
594
+ {
595
+ Tcl_Obj *orientObj; /* orientation of the slider widget */
596
+ } SliderElement;
597
+
598
+ static Ttk_ElementOptionSpec SliderElementOptions[] =
599
+ {
600
+ { "-orient", TK_OPTION_ANY, Tk_Offset(SliderElement,orientObj),
601
+ "horizontal" },
602
+ { NULL }
603
+ };
604
+
605
+ static void SliderElementSize(
606
+ void *clientData, void *elementRecord, Tk_Window tkwin,
607
+ int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr)
608
+ {
609
+ SliderElement *slider = elementRecord;
610
+ int orient;
611
+
612
+ Ttk_GetOrientFromObj(NULL, slider->orientObj, &orient);
613
+ if (orient == TTK_ORIENT_HORIZONTAL) {
614
+ *widthPtr = (GetSystemMetrics(SM_CXHTHUMB) / 2) | 1;
615
+ *heightPtr = GetSystemMetrics(SM_CYHSCROLL);
616
+ } else {
617
+ *widthPtr = GetSystemMetrics(SM_CXVSCROLL);
618
+ *heightPtr = (GetSystemMetrics(SM_CYVTHUMB) / 2) | 1;
619
+ }
620
+ }
621
+
622
+ static void SliderElementDraw(
623
+ void *clientData, void *elementRecord, Tk_Window tkwin,
624
+ Drawable d, Ttk_Box b, unsigned int state)
625
+ {
626
+ RECT rc = BoxToRect(b);
627
+ TkWinDCState dcState;
628
+ HDC hdc;
629
+
630
+ hdc = TkWinGetDrawableDC(Tk_Display(tkwin), d, &dcState);
631
+ DrawEdge(hdc, &rc, EDGE_RAISED, BF_RECT | BF_MIDDLE);
632
+ TkWinReleaseDrawableDC(d, hdc, &dcState);
633
+ }
634
+
635
+ static Ttk_ElementSpec SliderElementSpec =
636
+ {
637
+ TK_STYLE_VERSION_2,
638
+ sizeof(SliderElement),
639
+ SliderElementOptions,
640
+ SliderElementSize,
641
+ SliderElementDraw
642
+ };
643
+
644
+ /*------------------------------------------------------------------------
645
+ * +++ Notebook elements.
646
+ */
647
+
648
+ static void ClientElementSize(
649
+ void *clientData, void *elementRecord, Tk_Window tkwin,
650
+ int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr)
651
+ {
652
+ paddingPtr->left = paddingPtr->right = GetSystemMetrics(SM_CXEDGE);
653
+ paddingPtr->top = paddingPtr->bottom = GetSystemMetrics(SM_CYEDGE);
654
+ }
655
+
656
+ static void ClientElementDraw(
657
+ void *clientData, void *elementRecord, Tk_Window tkwin,
658
+ Drawable d, Ttk_Box b, unsigned int state)
659
+ {
660
+ RECT rc = BoxToRect(b);
661
+ TkWinDCState dcState;
662
+ HDC hdc = TkWinGetDrawableDC(Tk_Display(tkwin), d, &dcState);
663
+ DrawEdge(hdc, &rc, EDGE_RAISED, BF_RECT | BF_SOFT);
664
+ TkWinReleaseDrawableDC(d, hdc, &dcState);
665
+ }
666
+
667
+ static Ttk_ElementSpec ClientElementSpec =
668
+ {
669
+ TK_STYLE_VERSION_2,
670
+ sizeof(NullElement),
671
+ TtkNullElementOptions,
672
+ ClientElementSize,
673
+ ClientElementDraw
674
+ };
675
+
676
+ /*------------------------------------------------------------------------
677
+ * +++ Layouts.
678
+ */
679
+
680
+ TTK_BEGIN_LAYOUT_TABLE(LayoutTable)
681
+
682
+ TTK_LAYOUT("TButton",
683
+ TTK_GROUP("Button.border", TTK_FILL_BOTH,
684
+ TTK_GROUP("Button.padding", TTK_FILL_BOTH,
685
+ TTK_NODE("Button.label", TTK_FILL_BOTH))))
686
+
687
+ TTK_LAYOUT("TCombobox",
688
+ TTK_GROUP("Combobox.field", TTK_FILL_BOTH,
689
+ TTK_NODE("Combobox.downarrow", TTK_PACK_RIGHT|TTK_FILL_Y)
690
+ TTK_GROUP("Combobox.padding", TTK_PACK_LEFT|TTK_EXPAND|TTK_FILL_BOTH,
691
+ TTK_GROUP("Combobox.focus", TTK_PACK_LEFT|TTK_EXPAND|TTK_FILL_BOTH,
692
+ TTK_NODE("Combobox.textarea", TTK_FILL_BOTH)))))
693
+
694
+ TTK_END_LAYOUT_TABLE
695
+
696
+ /* ---------------------------------------------------------------------- */
697
+
698
+ MODULE_SCOPE
699
+ int TtkWinTheme_Init(Tcl_Interp *interp, HWND hwnd)
700
+ {
701
+ Ttk_Theme themePtr, parentPtr;
702
+ FrameControlElementData *fce = FrameControlElements;
703
+
704
+ parentPtr = Ttk_GetTheme(interp, "alt");
705
+ themePtr = Ttk_CreateTheme(interp, "winnative", parentPtr);
706
+ if (!themePtr) {
707
+ return TCL_ERROR;
708
+ }
709
+
710
+ Ttk_RegisterElementSpec(themePtr, "border", &BorderElementSpec, NULL);
711
+ Ttk_RegisterElementSpec(themePtr, "Button.border",
712
+ &ButtonBorderElementSpec, NULL);
713
+ Ttk_RegisterElementSpec(themePtr, "field", &FieldElementSpec, NULL);
714
+ Ttk_RegisterElementSpec(themePtr, "focus", &FocusElementSpec, NULL);
715
+ Ttk_RegisterElementSpec(themePtr, "Combobox.focus",
716
+ &ComboboxFocusElementSpec, NULL);
717
+ Ttk_RegisterElementSpec(themePtr, "thumb", &ThumbElementSpec, NULL);
718
+ Ttk_RegisterElementSpec(themePtr, "slider", &SliderElementSpec, NULL);
719
+ Ttk_RegisterElementSpec(themePtr, "Scrollbar.trough", &TroughElementSpec,
720
+ TroughClientDataInit(interp));
721
+
722
+ Ttk_RegisterElementSpec(themePtr, "client", &ClientElementSpec, NULL);
723
+
724
+ for (fce = FrameControlElements; fce->name != 0; ++fce) {
725
+ Ttk_RegisterElementSpec(themePtr, fce->name,
726
+ &FrameControlElementSpec, fce);
727
+ }
728
+
729
+ Ttk_RegisterLayouts(themePtr, LayoutTable);
730
+
731
+ Tcl_PkgProvide(interp, "ttk::theme::winnative", TILE_VERSION);
732
+ return TCL_OK;
733
+ }
734
+