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,354 @@
1
+ /*
2
+ * cache.c --
3
+ * Tile theme engine, resource cache.
4
+ *
5
+ * Copyright (c) 2004, Joe English
6
+ *
7
+ * cache.c,v 1.10 2005/06/26 16:28:00 jenglish Exp
8
+ *
9
+ * The problem:
10
+ *
11
+ * Tk maintains reference counts for fonts, colors, and images,
12
+ * and deallocates them when the reference count goes to zero.
13
+ * With the theme engine, resources are allocated right before
14
+ * drawing an element and released immediately after.
15
+ * This causes a severe performance penalty, and on PseudoColor
16
+ * visuals it causes colormap cycling as colormap entries are
17
+ * released and reused.
18
+ *
19
+ * Solution: Acquire fonts, colors, and objects from a
20
+ * resource cache instead of directly from Tk; the cache
21
+ * holds a semipermanent reference to the resource to keep
22
+ * it from being deallocated.
23
+ *
24
+ * The plumbing and control flow here is quite contorted;
25
+ * it would be better to address this problem in the core instead.
26
+ *
27
+ * @@@ BUGS/TODO: Need distinct caches for each combination
28
+ * of display, visual, and colormap.
29
+ *
30
+ * @@@ Colormap flashing on PseudoColor visuals is still possible,
31
+ * but this will be a transient effect.
32
+ */
33
+
34
+ #include <stdio.h> /* for sprintf */
35
+ #include <tk.h>
36
+ #include "tkTheme.h"
37
+
38
+ struct Ttk_ResourceCache_ {
39
+ Tcl_Interp *interp; /* Interpreter for error reporting */
40
+ Tk_Window tkwin; /* Cache window. */
41
+ Tcl_HashTable fontTable; /* Entries: Tcl_Obj* holding FontObjs */
42
+ Tcl_HashTable colorTable; /* Entries: Tcl_Obj* holding ColorObjs */
43
+ Tcl_HashTable borderTable; /* Entries: Tcl_Obj* holding BorderObjs */
44
+ Tcl_HashTable imageTable; /* Entries: Tk_Images */
45
+
46
+ Tcl_HashTable namedColors; /* Entries: RGB values as Tcl_StringObjs */
47
+ };
48
+
49
+ /*
50
+ * Ttk_CreateResourceCache --
51
+ * Initialize a new resource cache.
52
+ */
53
+ Ttk_ResourceCache Ttk_CreateResourceCache(Tcl_Interp *interp)
54
+ {
55
+ Ttk_ResourceCache cache = (Ttk_ResourceCache)ckalloc(sizeof(*cache));
56
+
57
+ cache->tkwin = NULL; /* initialized later */
58
+ cache->interp = interp;
59
+ Tcl_InitHashTable(&cache->fontTable, TCL_STRING_KEYS);
60
+ Tcl_InitHashTable(&cache->colorTable, TCL_STRING_KEYS);
61
+ Tcl_InitHashTable(&cache->borderTable, TCL_STRING_KEYS);
62
+ Tcl_InitHashTable(&cache->imageTable, TCL_STRING_KEYS);
63
+ Tcl_InitHashTable(&cache->namedColors, TCL_STRING_KEYS);
64
+
65
+ return cache;
66
+ }
67
+
68
+ /*
69
+ * Ttk_ClearCache --
70
+ * Release references to all cached resources.
71
+ */
72
+ static void Ttk_ClearCache(Ttk_ResourceCache cache)
73
+ {
74
+ Tcl_HashSearch search;
75
+ Tcl_HashEntry *entryPtr;
76
+
77
+ /*
78
+ * Free fonts:
79
+ */
80
+ entryPtr = Tcl_FirstHashEntry(&cache->fontTable, &search);
81
+ while (entryPtr != NULL) {
82
+ Tcl_Obj *fontObj = (Tcl_Obj*)Tcl_GetHashValue(entryPtr);
83
+ if (fontObj) {
84
+ Tk_FreeFontFromObj(cache->tkwin, fontObj);
85
+ Tcl_DecrRefCount(fontObj);
86
+ }
87
+ entryPtr = Tcl_NextHashEntry(&search);
88
+ }
89
+ Tcl_DeleteHashTable(&cache->fontTable);
90
+ Tcl_InitHashTable(&cache->fontTable, TCL_STRING_KEYS);
91
+
92
+ /*
93
+ * Free colors:
94
+ */
95
+ entryPtr = Tcl_FirstHashEntry(&cache->colorTable, &search);
96
+ while (entryPtr != NULL) {
97
+ Tcl_Obj *colorObj = (Tcl_Obj*)Tcl_GetHashValue(entryPtr);
98
+ if (colorObj) {
99
+ Tk_FreeColorFromObj(cache->tkwin, colorObj);
100
+ Tcl_DecrRefCount(colorObj);
101
+ }
102
+ entryPtr = Tcl_NextHashEntry(&search);
103
+ }
104
+ Tcl_DeleteHashTable(&cache->colorTable);
105
+ Tcl_InitHashTable(&cache->colorTable, TCL_STRING_KEYS);
106
+
107
+ /*
108
+ * Free borders:
109
+ */
110
+ entryPtr = Tcl_FirstHashEntry(&cache->borderTable, &search);
111
+ while (entryPtr != NULL) {
112
+ Tcl_Obj *borderObj = (Tcl_Obj*)Tcl_GetHashValue(entryPtr);
113
+ if (borderObj) {
114
+ Tk_Free3DBorderFromObj(cache->tkwin, borderObj);
115
+ Tcl_DecrRefCount(borderObj);
116
+ }
117
+ entryPtr = Tcl_NextHashEntry(&search);
118
+ }
119
+ Tcl_DeleteHashTable(&cache->borderTable);
120
+ Tcl_InitHashTable(&cache->borderTable, TCL_STRING_KEYS);
121
+
122
+ /*
123
+ * Free images:
124
+ */
125
+ entryPtr = Tcl_FirstHashEntry(&cache->imageTable, &search);
126
+ while (entryPtr != NULL) {
127
+ Tk_Image image = (Tk_Image)Tcl_GetHashValue(entryPtr);
128
+ if (image) {
129
+ Tk_FreeImage(image);
130
+ }
131
+ entryPtr = Tcl_NextHashEntry(&search);
132
+ }
133
+ Tcl_DeleteHashTable(&cache->imageTable);
134
+ Tcl_InitHashTable(&cache->imageTable, TCL_STRING_KEYS);
135
+
136
+ return;
137
+ }
138
+
139
+ /*
140
+ * Ttk_FreeResourceCache --
141
+ * Release references to all cached resources, delete the cache.
142
+ */
143
+
144
+ void Ttk_FreeResourceCache(Ttk_ResourceCache cache)
145
+ {
146
+ Tcl_HashEntry *entryPtr;
147
+ Tcl_HashSearch search;
148
+
149
+ Ttk_ClearCache(cache);
150
+
151
+ Tcl_DeleteHashTable(&cache->colorTable);
152
+ Tcl_DeleteHashTable(&cache->fontTable);
153
+ Tcl_DeleteHashTable(&cache->imageTable);
154
+
155
+ /*
156
+ * Free named colors:
157
+ */
158
+ entryPtr = Tcl_FirstHashEntry(&cache->namedColors, &search);
159
+ while (entryPtr != NULL) {
160
+ Tcl_Obj *colorNameObj = (Tcl_Obj*)Tcl_GetHashValue(entryPtr);
161
+ Tcl_DecrRefCount(colorNameObj);
162
+ entryPtr = Tcl_NextHashEntry(&search);
163
+ }
164
+ Tcl_DeleteHashTable(&cache->namedColors);
165
+
166
+ ckfree((ClientData)cache);
167
+ }
168
+
169
+ /*
170
+ * CacheWinEventHandler --
171
+ * Detect when the cache window is destroyed, clear cache.
172
+ */
173
+ static void CacheWinEventHandler(ClientData clientData, XEvent *eventPtr)
174
+ {
175
+ Ttk_ResourceCache cache = (Ttk_ResourceCache)clientData;
176
+
177
+ if (eventPtr->type != DestroyNotify) {
178
+ return;
179
+ }
180
+ Tk_DeleteEventHandler(cache->tkwin, StructureNotifyMask,
181
+ CacheWinEventHandler, clientData);
182
+ Ttk_ClearCache(cache);
183
+ cache->tkwin = NULL;
184
+ }
185
+
186
+ /*
187
+ * InitCacheWindow --
188
+ * Specify the cache window if not already set.
189
+ * @@@ SHOULD: use separate caches for each combination
190
+ * @@@ of display, visual, and colormap.
191
+ */
192
+ static void InitCacheWindow(Ttk_ResourceCache cache, Tk_Window tkwin)
193
+ {
194
+ if (cache->tkwin == NULL) {
195
+ cache->tkwin = tkwin;
196
+ Tk_CreateEventHandler(tkwin, StructureNotifyMask,
197
+ CacheWinEventHandler, (ClientData)cache);
198
+ }
199
+ }
200
+
201
+ /*
202
+ * Ttk_RegisterNamedColor --
203
+ * Specify an RGB triplet as a named color.
204
+ * Overrides any previous named color specification.
205
+ *
206
+ */
207
+ void Ttk_RegisterNamedColor(
208
+ Ttk_ResourceCache cache,
209
+ const char *colorName,
210
+ XColor *colorPtr)
211
+ {
212
+ int newEntry;
213
+ Tcl_HashEntry *entryPtr;
214
+ char nameBuf[14];
215
+ Tcl_Obj *colorNameObj;
216
+
217
+ sprintf(nameBuf, "#%04X%04X%04X",
218
+ colorPtr->red, colorPtr->green, colorPtr->blue);
219
+ colorNameObj = Tcl_NewStringObj(nameBuf, -1);
220
+ Tcl_IncrRefCount(colorNameObj);
221
+
222
+ entryPtr = Tcl_CreateHashEntry(&cache->namedColors, colorName, &newEntry);
223
+ if (!newEntry) {
224
+ Tcl_Obj *oldColor = (Tcl_Obj*)Tcl_GetHashValue(entryPtr);
225
+ Tcl_DecrRefCount(oldColor);
226
+ }
227
+
228
+ Tcl_SetHashValue(entryPtr, (ClientData)colorNameObj);
229
+ }
230
+
231
+ /*
232
+ * CheckNamedColor(objPtr) --
233
+ * If objPtr is a registered color name, return a Tcl_Obj *
234
+ * containing the registered color value specification.
235
+ * Otherwise, return the input argument.
236
+ */
237
+ static Tcl_Obj *CheckNamedColor(Ttk_ResourceCache cache, Tcl_Obj *objPtr)
238
+ {
239
+ Tcl_HashEntry *entryPtr =
240
+ Tcl_FindHashEntry(&cache->namedColors, Tcl_GetString(objPtr));
241
+ if (entryPtr) { /* Use named color instead */
242
+ objPtr = (Tcl_Obj *)Tcl_GetHashValue(entryPtr);
243
+ }
244
+ return objPtr;
245
+ }
246
+
247
+ /*
248
+ * Template for allocation routines:
249
+ */
250
+ typedef void *(*Allocator)(Tcl_Interp *, Tk_Window, Tcl_Obj *);
251
+
252
+ static Tcl_Obj *Ttk_Use(
253
+ Tcl_Interp *interp,
254
+ Tcl_HashTable *table,
255
+ Allocator allocate,
256
+ Tk_Window tkwin,
257
+ Tcl_Obj *objPtr)
258
+ {
259
+ int newEntry;
260
+ Tcl_HashEntry *entryPtr =
261
+ Tcl_CreateHashEntry(table,Tcl_GetString(objPtr),&newEntry);
262
+ Tcl_Obj *cacheObj;
263
+
264
+ if (!newEntry) {
265
+ return (Tcl_Obj*)Tcl_GetHashValue(entryPtr);
266
+ }
267
+
268
+ cacheObj = Tcl_DuplicateObj(objPtr);
269
+ Tcl_IncrRefCount(cacheObj);
270
+
271
+ if (allocate(interp, tkwin, cacheObj)) {
272
+ Tcl_SetHashValue(entryPtr, cacheObj);
273
+ return cacheObj;
274
+ } else {
275
+ Tcl_DecrRefCount(cacheObj);
276
+ Tcl_SetHashValue(entryPtr, NULL);
277
+ Tcl_BackgroundError(interp);
278
+ return NULL;
279
+ }
280
+ }
281
+
282
+ /*
283
+ * Ttk_UseFont --
284
+ * Acquire a font from the cache.
285
+ */
286
+ Tcl_Obj *Ttk_UseFont(Ttk_ResourceCache cache, Tk_Window tkwin, Tcl_Obj *objPtr)
287
+ {
288
+ InitCacheWindow(cache, tkwin);
289
+ return Ttk_Use(cache->interp,
290
+ &cache->fontTable,(Allocator)Tk_AllocFontFromObj, tkwin, objPtr);
291
+ }
292
+
293
+ /*
294
+ * Ttk_UseColor --
295
+ * Acquire a color from the cache.
296
+ */
297
+ Tcl_Obj *Ttk_UseColor(Ttk_ResourceCache cache, Tk_Window tkwin, Tcl_Obj *objPtr)
298
+ {
299
+ objPtr = CheckNamedColor(cache, objPtr);
300
+ InitCacheWindow(cache, tkwin);
301
+ return Ttk_Use(cache->interp,
302
+ &cache->colorTable,(Allocator)Tk_AllocColorFromObj, tkwin, objPtr);
303
+ }
304
+
305
+ /*
306
+ * Ttk_UseBorder --
307
+ * Acquire a Tk_3DBorder from the cache.
308
+ */
309
+ Tcl_Obj *Ttk_UseBorder(
310
+ Ttk_ResourceCache cache, Tk_Window tkwin, Tcl_Obj *objPtr)
311
+ {
312
+ objPtr = CheckNamedColor(cache, objPtr);
313
+ InitCacheWindow(cache, tkwin);
314
+ return Ttk_Use(cache->interp,
315
+ &cache->borderTable,(Allocator)Tk_Alloc3DBorderFromObj, tkwin, objPtr);
316
+ }
317
+
318
+ /* NullImageChanged --
319
+ * Tk_ImageChangedProc for Ttk_UseImage
320
+ */
321
+
322
+ static void NullImageChanged(ClientData clientData,
323
+ int x, int y, int width, int height, int imageWidth, int imageHeight)
324
+ { /* No-op */ }
325
+
326
+ /*
327
+ * Ttk_UseImage --
328
+ * Acquire a Tk_Image from the cache.
329
+ */
330
+ Tk_Image Ttk_UseImage(Ttk_ResourceCache cache, Tk_Window tkwin, Tcl_Obj *objPtr)
331
+ {
332
+ const char *imageName = Tcl_GetString(objPtr);
333
+ int newEntry;
334
+ Tcl_HashEntry *entryPtr =
335
+ Tcl_CreateHashEntry(&cache->imageTable,imageName,&newEntry);
336
+ Tk_Image image;
337
+
338
+ InitCacheWindow(cache, tkwin);
339
+
340
+ if (!newEntry) {
341
+ return (Tk_Image)Tcl_GetHashValue(entryPtr);
342
+ }
343
+
344
+ image = Tk_GetImage(cache->interp, tkwin, imageName, NullImageChanged,0);
345
+ Tcl_SetHashValue(entryPtr, image);
346
+
347
+ if (!image) {
348
+ Tcl_BackgroundError(cache->interp);
349
+ }
350
+
351
+ return image;
352
+ }
353
+
354
+ /*EOF*/
@@ -0,0 +1,974 @@
1
+ /*
2
+ * clamTheme.c,v 1.30 2007/12/02 04:34:30 jenglish Exp
3
+ *
4
+ * Copyright (C) 2004 Joe English
5
+ *
6
+ * Tile widget set: another theme engine.
7
+ * Inspired by the XFCE family of Gnome themes.
8
+ */
9
+
10
+ #include <tk.h>
11
+ #include "tkTheme.h"
12
+
13
+ /*
14
+ * Under windows, the Tk-provided XDrawLine and XDrawArc have an
15
+ * off-by-one error in the end point. This is especially apparent with this
16
+ * theme. Defining this macro as true handles this case.
17
+ */
18
+ #if defined(WIN32) && !defined(WIN32_XDRAWLINE_HACK)
19
+ # define WIN32_XDRAWLINE_HACK 1
20
+ #else
21
+ # define WIN32_XDRAWLINE_HACK 0
22
+ #endif
23
+
24
+ #define STR(x) StR(x)
25
+ #define StR(x) #x
26
+
27
+ #define SCROLLBAR_THICKNESS 14
28
+
29
+ #define FRAME_COLOR "#dcdad5"
30
+ #define LIGHT_COLOR "#ffffff"
31
+ #define DARK_COLOR "#cfcdc8"
32
+ #define DARKER_COLOR "#bab5ab"
33
+ #define DARKEST_COLOR "#9e9a91"
34
+
35
+ /*------------------------------------------------------------------------
36
+ * +++ Utilities.
37
+ */
38
+
39
+ static GC Ttk_GCForColor(Tk_Window tkwin, Tcl_Obj* colorObj, Drawable d)
40
+ {
41
+ GC gc = Tk_GCForColor(Tk_GetColorFromObj(tkwin, colorObj), d);
42
+
43
+ #ifdef MAC_OSX_TK
44
+ /*
45
+ * Workaround for Tk bug under Aqua where the default line width is 0.
46
+ */
47
+ Display *display = Tk_Display(tkwin);
48
+ unsigned long mask = 0ul;
49
+ XGCValues gcValues;
50
+
51
+ gcValues.line_width = 1;
52
+ mask = GCLineWidth;
53
+
54
+ XChangeGC(display, gc, mask, &gcValues);
55
+ #endif
56
+
57
+ return gc;
58
+ }
59
+
60
+ static void DrawSmoothBorder(
61
+ Tk_Window tkwin, Drawable d, Ttk_Box b,
62
+ Tcl_Obj *outerColorObj, Tcl_Obj *upperColorObj, Tcl_Obj *lowerColorObj)
63
+ {
64
+ Display *display = Tk_Display(tkwin);
65
+ int x1 = b.x, x2 = b.x + b.width - 1;
66
+ int y1 = b.y, y2 = b.y + b.height - 1;
67
+ const int w = WIN32_XDRAWLINE_HACK;
68
+ GC gc;
69
+
70
+ if ( outerColorObj
71
+ && (gc=Ttk_GCForColor(tkwin,outerColorObj,d)))
72
+ {
73
+ XDrawLine(display,d,gc, x1+1,y1, x2-1+w,y1); /* N */
74
+ XDrawLine(display,d,gc, x1+1,y2, x2-1+w,y2); /* S */
75
+ XDrawLine(display,d,gc, x1,y1+1, x1,y2-1+w); /* E */
76
+ XDrawLine(display,d,gc, x2,y1+1, x2,y2-1+w); /* W */
77
+ }
78
+
79
+ if ( upperColorObj
80
+ && (gc=Ttk_GCForColor(tkwin,upperColorObj,d)))
81
+ {
82
+ XDrawLine(display,d,gc, x1+1,y1+1, x2-1+w,y1+1); /* N */
83
+ XDrawLine(display,d,gc, x1+1,y1+1, x1+1,y2-1); /* E */
84
+ }
85
+
86
+ if ( lowerColorObj
87
+ && (gc=Ttk_GCForColor(tkwin,lowerColorObj,d)))
88
+ {
89
+ XDrawLine(display,d,gc, x2-1,y2-1, x1+1-w,y2-1); /* S */
90
+ XDrawLine(display,d,gc, x2-1,y2-1, x2-1,y1+1-w); /* W */
91
+ }
92
+ }
93
+
94
+ static GC BackgroundGC(Tk_Window tkwin, Tcl_Obj *backgroundObj)
95
+ {
96
+ Tk_3DBorder bd = Tk_Get3DBorderFromObj(tkwin, backgroundObj);
97
+ return Tk_3DBorderGC(tkwin, bd, TK_3D_FLAT_GC);
98
+ }
99
+
100
+ /*------------------------------------------------------------------------
101
+ * +++ Border element.
102
+ */
103
+
104
+ typedef struct {
105
+ Tcl_Obj *borderColorObj;
106
+ Tcl_Obj *lightColorObj;
107
+ Tcl_Obj *darkColorObj;
108
+ Tcl_Obj *reliefObj;
109
+ Tcl_Obj *borderWidthObj; /* See <<NOTE-BORDERWIDTH>> */
110
+ } BorderElement;
111
+
112
+ static Ttk_ElementOptionSpec BorderElementOptions[] = {
113
+ { "-bordercolor", TK_OPTION_COLOR,
114
+ Tk_Offset(BorderElement,borderColorObj), DARKEST_COLOR },
115
+ { "-lightcolor", TK_OPTION_COLOR,
116
+ Tk_Offset(BorderElement,lightColorObj), LIGHT_COLOR },
117
+ { "-darkcolor", TK_OPTION_COLOR,
118
+ Tk_Offset(BorderElement,darkColorObj), DARK_COLOR },
119
+ { "-relief", TK_OPTION_RELIEF,
120
+ Tk_Offset(BorderElement,reliefObj), "flat" },
121
+ { "-borderwidth", TK_OPTION_PIXELS,
122
+ Tk_Offset(BorderElement,borderWidthObj), "2" },
123
+ {0,0,0}
124
+ };
125
+
126
+ /*
127
+ * <<NOTE-BORDERWIDTH>>: -borderwidth is only partially supported:
128
+ * in this theme, borders are always exactly 2 pixels thick.
129
+ * With -borderwidth 0, border is not drawn at all;
130
+ * otherwise a 2-pixel border is used. For -borderwidth > 2,
131
+ * the excess is used as padding.
132
+ */
133
+
134
+ static void BorderElementSize(
135
+ void *clientData, void *elementRecord, Tk_Window tkwin,
136
+ int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr)
137
+ {
138
+ BorderElement *border = (BorderElement*)elementRecord;
139
+ int borderWidth = 2;
140
+ Tk_GetPixelsFromObj(NULL, tkwin, border->borderWidthObj, &borderWidth);
141
+ if (borderWidth == 1) ++borderWidth;
142
+ *paddingPtr = Ttk_UniformPadding((short)borderWidth);
143
+ }
144
+
145
+ static void BorderElementDraw(
146
+ void *clientData, void *elementRecord, Tk_Window tkwin,
147
+ Drawable d, Ttk_Box b, unsigned state)
148
+ {
149
+ BorderElement *border = elementRecord;
150
+ int relief = TK_RELIEF_FLAT;
151
+ int borderWidth = 2;
152
+ Tcl_Obj *outer = 0, *upper = 0, *lower = 0;
153
+
154
+ Tk_GetReliefFromObj(NULL, border->reliefObj, &relief);
155
+ Tk_GetPixelsFromObj(NULL, tkwin, border->borderWidthObj, &borderWidth);
156
+
157
+ if (borderWidth == 0) return;
158
+
159
+ switch (relief) {
160
+ case TK_RELIEF_GROOVE :
161
+ case TK_RELIEF_RIDGE :
162
+ case TK_RELIEF_RAISED :
163
+ outer = border->borderColorObj;
164
+ upper = border->lightColorObj;
165
+ lower = border->darkColorObj;
166
+ break;
167
+ case TK_RELIEF_SUNKEN :
168
+ outer = border->borderColorObj;
169
+ upper = border->darkColorObj;
170
+ lower = border->lightColorObj;
171
+ break;
172
+ case TK_RELIEF_FLAT :
173
+ outer = upper = lower = 0;
174
+ break;
175
+ case TK_RELIEF_SOLID :
176
+ outer = upper = lower = border->borderColorObj;
177
+ break;
178
+ }
179
+
180
+ DrawSmoothBorder(tkwin, d, b, outer, upper, lower);
181
+ }
182
+
183
+ static Ttk_ElementSpec BorderElementSpec = {
184
+ TK_STYLE_VERSION_2,
185
+ sizeof(BorderElement),
186
+ BorderElementOptions,
187
+ BorderElementSize,
188
+ BorderElementDraw
189
+ };
190
+
191
+ /*------------------------------------------------------------------------
192
+ * +++ Field element.
193
+ */
194
+
195
+ typedef struct {
196
+ Tcl_Obj *borderColorObj;
197
+ Tcl_Obj *lightColorObj;
198
+ Tcl_Obj *darkColorObj;
199
+ Tcl_Obj *backgroundObj;
200
+ } FieldElement;
201
+
202
+ static Ttk_ElementOptionSpec FieldElementOptions[] = {
203
+ { "-bordercolor", TK_OPTION_COLOR,
204
+ Tk_Offset(FieldElement,borderColorObj), DARKEST_COLOR },
205
+ { "-lightcolor", TK_OPTION_COLOR,
206
+ Tk_Offset(FieldElement,lightColorObj), LIGHT_COLOR },
207
+ { "-darkcolor", TK_OPTION_COLOR,
208
+ Tk_Offset(FieldElement,darkColorObj), DARK_COLOR },
209
+ { "-fieldbackground", TK_OPTION_BORDER,
210
+ Tk_Offset(FieldElement,backgroundObj), "white" },
211
+ {0,0,0}
212
+ };
213
+
214
+ static void FieldElementSize(
215
+ void *clientData, void *elementRecord, Tk_Window tkwin,
216
+ int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr)
217
+ {
218
+ *paddingPtr = Ttk_UniformPadding(2);
219
+ }
220
+
221
+ static void FieldElementDraw(
222
+ void *clientData, void *elementRecord, Tk_Window tkwin,
223
+ Drawable d, Ttk_Box b, unsigned state)
224
+ {
225
+ FieldElement *field = elementRecord;
226
+ Tk_3DBorder bg = Tk_Get3DBorderFromObj(tkwin, field->backgroundObj);
227
+ Ttk_Box f = Ttk_PadBox(b, Ttk_UniformPadding(2));
228
+ Tcl_Obj *outer = field->borderColorObj,
229
+ *inner = field->lightColorObj;
230
+
231
+ DrawSmoothBorder(tkwin, d, b, outer, inner, inner);
232
+ Tk_Fill3DRectangle(
233
+ tkwin, d, bg, f.x, f.y, f.width, f.height, 0, TK_RELIEF_SUNKEN);
234
+ }
235
+
236
+ static Ttk_ElementSpec FieldElementSpec = {
237
+ TK_STYLE_VERSION_2,
238
+ sizeof(FieldElement),
239
+ FieldElementOptions,
240
+ FieldElementSize,
241
+ FieldElementDraw
242
+ };
243
+
244
+ /*
245
+ * Modified field element for comboboxes:
246
+ * Right edge is expanded to overlap the dropdown button.
247
+ */
248
+ static void ComboboxFieldElementDraw(
249
+ void *clientData, void *elementRecord, Tk_Window tkwin,
250
+ Drawable d, Ttk_Box b, unsigned state)
251
+ {
252
+ FieldElement *field = elementRecord;
253
+ GC gc = Ttk_GCForColor(tkwin,field->borderColorObj,d);
254
+
255
+ ++b.width;
256
+ FieldElementDraw(clientData, elementRecord, tkwin, d, b, state);
257
+
258
+ XDrawLine(Tk_Display(tkwin), d, gc,
259
+ b.x + b.width - 1, b.y,
260
+ b.x + b.width - 1, b.y + b.height - 1 + WIN32_XDRAWLINE_HACK);
261
+ }
262
+
263
+ static Ttk_ElementSpec ComboboxFieldElementSpec = {
264
+ TK_STYLE_VERSION_2,
265
+ sizeof(FieldElement),
266
+ FieldElementOptions,
267
+ FieldElementSize,
268
+ ComboboxFieldElementDraw
269
+ };
270
+
271
+ /*------------------------------------------------------------------------
272
+ * +++ Indicator elements for check and radio buttons.
273
+ */
274
+
275
+ typedef struct {
276
+ Tcl_Obj *sizeObj;
277
+ Tcl_Obj *marginObj;
278
+ Tcl_Obj *backgroundObj;
279
+ Tcl_Obj *foregroundObj;
280
+ Tcl_Obj *upperColorObj;
281
+ Tcl_Obj *lowerColorObj;
282
+ } IndicatorElement;
283
+
284
+ static Ttk_ElementOptionSpec IndicatorElementOptions[] = {
285
+ { "-indicatorsize", TK_OPTION_PIXELS,
286
+ Tk_Offset(IndicatorElement,sizeObj), "10" },
287
+ { "-indicatormargin", TK_OPTION_STRING,
288
+ Tk_Offset(IndicatorElement,marginObj), "1" },
289
+ { "-indicatorbackground", TK_OPTION_COLOR,
290
+ Tk_Offset(IndicatorElement,backgroundObj), "white" },
291
+ { "-indicatorforeground", TK_OPTION_COLOR,
292
+ Tk_Offset(IndicatorElement,foregroundObj), "black" },
293
+ { "-upperbordercolor", TK_OPTION_COLOR,
294
+ Tk_Offset(IndicatorElement,upperColorObj), DARKEST_COLOR },
295
+ { "-lowerbordercolor", TK_OPTION_COLOR,
296
+ Tk_Offset(IndicatorElement,lowerColorObj), DARK_COLOR },
297
+ {0,0,0}
298
+ };
299
+
300
+ static void IndicatorElementSize(
301
+ void *clientData, void *elementRecord, Tk_Window tkwin,
302
+ int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr)
303
+ {
304
+ IndicatorElement *indicator = elementRecord;
305
+ Ttk_Padding margins;
306
+ int size = 10;
307
+ Ttk_GetPaddingFromObj(NULL, tkwin, indicator->marginObj, &margins);
308
+ Tk_GetPixelsFromObj(NULL, tkwin, indicator->sizeObj, &size);
309
+ *widthPtr = size + Ttk_PaddingWidth(margins);
310
+ *heightPtr = size + Ttk_PaddingHeight(margins);
311
+ }
312
+
313
+ static void RadioIndicatorElementDraw(
314
+ void *clientData, void *elementRecord, Tk_Window tkwin,
315
+ Drawable d, Ttk_Box b, unsigned state)
316
+ {
317
+ IndicatorElement *indicator = elementRecord;
318
+ GC gcb=Ttk_GCForColor(tkwin,indicator->backgroundObj,d);
319
+ GC gcf=Ttk_GCForColor(tkwin,indicator->foregroundObj,d);
320
+ GC gcu=Ttk_GCForColor(tkwin,indicator->upperColorObj,d);
321
+ GC gcl=Ttk_GCForColor(tkwin,indicator->lowerColorObj,d);
322
+ Ttk_Padding padding;
323
+
324
+ Ttk_GetPaddingFromObj(NULL, tkwin, indicator->marginObj, &padding);
325
+ b = Ttk_PadBox(b, padding);
326
+
327
+ XFillArc(Tk_Display(tkwin),d,gcb, b.x,b.y,b.width,b.height, 0,360*64);
328
+ XDrawArc(Tk_Display(tkwin),d,gcl, b.x,b.y,b.width,b.height, 225*64,180*64);
329
+ XDrawArc(Tk_Display(tkwin),d,gcu, b.x,b.y,b.width,b.height, 45*64,180*64);
330
+
331
+ if (state & TTK_STATE_SELECTED) {
332
+ b = Ttk_PadBox(b,Ttk_UniformPadding(3));
333
+ XFillArc(Tk_Display(tkwin),d,gcf, b.x,b.y,b.width,b.height, 0,360*64);
334
+ XDrawArc(Tk_Display(tkwin),d,gcf, b.x,b.y,b.width,b.height, 0,360*64);
335
+ #if WIN32_XDRAWLINE_HACK
336
+ XDrawArc(Tk_Display(tkwin),d,gcf, b.x,b.y,b.width,b.height, 300*64,360*64);
337
+ #endif
338
+ }
339
+ }
340
+
341
+ static void CheckIndicatorElementDraw(
342
+ void *clientData, void *elementRecord, Tk_Window tkwin,
343
+ Drawable d, Ttk_Box b, unsigned state)
344
+ {
345
+ Display *display = Tk_Display(tkwin);
346
+ IndicatorElement *indicator = elementRecord;
347
+ GC gcb=Ttk_GCForColor(tkwin,indicator->backgroundObj,d);
348
+ GC gcf=Ttk_GCForColor(tkwin,indicator->foregroundObj,d);
349
+ GC gcu=Ttk_GCForColor(tkwin,indicator->upperColorObj,d);
350
+ GC gcl=Ttk_GCForColor(tkwin,indicator->lowerColorObj,d);
351
+ Ttk_Padding padding;
352
+ const int w = WIN32_XDRAWLINE_HACK;
353
+
354
+ Ttk_GetPaddingFromObj(NULL, tkwin, indicator->marginObj, &padding);
355
+ b = Ttk_PadBox(b, padding);
356
+
357
+ XFillRectangle(display,d,gcb, b.x,b.y,b.width,b.height);
358
+ XDrawLine(display,d,gcl,b.x,b.y+b.height,b.x+b.width+w,b.y+b.height);/*S*/
359
+ XDrawLine(display,d,gcl,b.x+b.width,b.y,b.x+b.width,b.y+b.height+w); /*E*/
360
+ XDrawLine(display,d,gcu,b.x,b.y, b.x,b.y+b.height+w); /*W*/
361
+ XDrawLine(display,d,gcu,b.x,b.y, b.x+b.width+w,b.y); /*N*/
362
+
363
+ if (state & TTK_STATE_SELECTED) {
364
+ int p,q,r,s;
365
+
366
+ b = Ttk_PadBox(b,Ttk_UniformPadding(2));
367
+ p = b.x, q = b.y, r = b.x+b.width, s = b.y+b.height;
368
+
369
+ r+=w, s+=w;
370
+ XDrawLine(display, d, gcf, p, q, r, s);
371
+ XDrawLine(display, d, gcf, p+1, q, r, s-1);
372
+ XDrawLine(display, d, gcf, p, q+1, r-1, s);
373
+
374
+ s-=w, q-=w;
375
+ XDrawLine(display, d, gcf, p, s, r, q);
376
+ XDrawLine(display, d, gcf, p+1, s, r, q+1);
377
+ XDrawLine(display, d, gcf, p, s-1, r-1, q);
378
+ }
379
+ }
380
+
381
+ static Ttk_ElementSpec RadioIndicatorElementSpec = {
382
+ TK_STYLE_VERSION_2,
383
+ sizeof(IndicatorElement),
384
+ IndicatorElementOptions,
385
+ IndicatorElementSize,
386
+ RadioIndicatorElementDraw
387
+ };
388
+
389
+ static Ttk_ElementSpec CheckIndicatorElementSpec = {
390
+ TK_STYLE_VERSION_2,
391
+ sizeof(IndicatorElement),
392
+ IndicatorElementOptions,
393
+ IndicatorElementSize,
394
+ CheckIndicatorElementDraw
395
+ };
396
+
397
+ #define MENUBUTTON_ARROW_SIZE 5
398
+
399
+ typedef struct {
400
+ Tcl_Obj *sizeObj;
401
+ Tcl_Obj *colorObj;
402
+ Tcl_Obj *paddingObj;
403
+ } MenuIndicatorElement;
404
+
405
+ static Ttk_ElementOptionSpec MenuIndicatorElementOptions[] =
406
+ {
407
+ { "-arrowsize", TK_OPTION_PIXELS,
408
+ Tk_Offset(MenuIndicatorElement,sizeObj),
409
+ STR(MENUBUTTON_ARROW_SIZE)},
410
+ { "-arrowcolor",TK_OPTION_COLOR,
411
+ Tk_Offset(MenuIndicatorElement,colorObj),
412
+ "black" },
413
+ { "-arrowpadding",TK_OPTION_STRING,
414
+ Tk_Offset(MenuIndicatorElement,paddingObj),
415
+ "3" },
416
+ { NULL }
417
+ };
418
+
419
+ static void MenuIndicatorElementSize(
420
+ void *clientData, void *elementRecord, Tk_Window tkwin,
421
+ int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr)
422
+ {
423
+ MenuIndicatorElement *indicator = elementRecord;
424
+ Ttk_Padding margins;
425
+ int size = MENUBUTTON_ARROW_SIZE;
426
+ Tk_GetPixelsFromObj(NULL, tkwin, indicator->sizeObj, &size);
427
+ Ttk_GetPaddingFromObj(NULL, tkwin, indicator->paddingObj, &margins);
428
+ TtkArrowSize(size, ARROW_DOWN, widthPtr, heightPtr);
429
+ *widthPtr += Ttk_PaddingWidth(margins);
430
+ *heightPtr += Ttk_PaddingHeight(margins);
431
+ }
432
+
433
+ static void MenuIndicatorElementDraw(
434
+ void *clientData, void *elementRecord, Tk_Window tkwin,
435
+ Drawable d, Ttk_Box b, unsigned int state)
436
+ {
437
+ MenuIndicatorElement *indicator = elementRecord;
438
+ XColor *arrowColor = Tk_GetColorFromObj(tkwin, indicator->colorObj);
439
+ GC gc = Tk_GCForColor(arrowColor, d);
440
+ int size = MENUBUTTON_ARROW_SIZE;
441
+ int width, height;
442
+
443
+ Tk_GetPixelsFromObj(NULL, tkwin, indicator->sizeObj, &size);
444
+
445
+ TtkArrowSize(size, ARROW_DOWN, &width, &height);
446
+ b = Ttk_StickBox(b, width, height, 0);
447
+ TtkFillArrow(Tk_Display(tkwin), d, gc, b, ARROW_DOWN);
448
+ }
449
+
450
+ static Ttk_ElementSpec MenuIndicatorElementSpec =
451
+ {
452
+ TK_STYLE_VERSION_2,
453
+ sizeof(MenuIndicatorElement),
454
+ MenuIndicatorElementOptions,
455
+ MenuIndicatorElementSize,
456
+ MenuIndicatorElementDraw
457
+ };
458
+
459
+ /*------------------------------------------------------------------------
460
+ * +++ Grips.
461
+ *
462
+ * TODO: factor this with ThumbElementDraw
463
+ */
464
+
465
+ static Ttk_Orient GripClientData[] = {
466
+ TTK_ORIENT_HORIZONTAL, TTK_ORIENT_VERTICAL
467
+ };
468
+
469
+ typedef struct {
470
+ Tcl_Obj *lightColorObj;
471
+ Tcl_Obj *borderColorObj;
472
+ Tcl_Obj *gripCountObj;
473
+ } GripElement;
474
+
475
+ static Ttk_ElementOptionSpec GripElementOptions[] = {
476
+ { "-lightcolor", TK_OPTION_COLOR,
477
+ Tk_Offset(GripElement,lightColorObj), LIGHT_COLOR },
478
+ { "-bordercolor", TK_OPTION_COLOR,
479
+ Tk_Offset(GripElement,borderColorObj), DARKEST_COLOR },
480
+ { "-gripcount", TK_OPTION_INT,
481
+ Tk_Offset(GripElement,gripCountObj), "5" },
482
+ {0,0,0}
483
+ };
484
+
485
+ static void GripElementSize(
486
+ void *clientData, void *elementRecord, Tk_Window tkwin,
487
+ int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr)
488
+ {
489
+ int horizontal = *((Ttk_Orient*)clientData) == TTK_ORIENT_HORIZONTAL;
490
+ GripElement *grip = elementRecord;
491
+ int gripCount;
492
+
493
+ Tcl_GetIntFromObj(NULL, grip->gripCountObj, &gripCount);
494
+ if (horizontal) {
495
+ *widthPtr = 2*gripCount;
496
+ } else {
497
+ *heightPtr = 2*gripCount;
498
+ }
499
+ }
500
+
501
+ static void GripElementDraw(
502
+ void *clientData, void *elementRecord, Tk_Window tkwin,
503
+ Drawable d, Ttk_Box b, unsigned state)
504
+ {
505
+ const int w = WIN32_XDRAWLINE_HACK;
506
+ int horizontal = *((Ttk_Orient*)clientData) == TTK_ORIENT_HORIZONTAL;
507
+ GripElement *grip = elementRecord;
508
+ GC lightGC = Ttk_GCForColor(tkwin,grip->lightColorObj,d);
509
+ GC darkGC = Ttk_GCForColor(tkwin,grip->borderColorObj,d);
510
+ int gripPad = 1;
511
+ int i, gripCount;
512
+
513
+ Tcl_GetIntFromObj(NULL, grip->gripCountObj, &gripCount);
514
+
515
+ if (horizontal) {
516
+ int x = b.x + b.width / 2 - gripCount;
517
+ int y1 = b.y + gripPad, y2 = b.y + b.height - gripPad - 1 + w;
518
+ for (i=0; i<gripCount; ++i) {
519
+ XDrawLine(Tk_Display(tkwin), d, darkGC, x,y1, x,y2); ++x;
520
+ XDrawLine(Tk_Display(tkwin), d, lightGC, x,y1, x,y2); ++x;
521
+ }
522
+ } else {
523
+ int y = b.y + b.height / 2 - gripCount;
524
+ int x1 = b.x + gripPad, x2 = b.x + b.width - gripPad - 1 + w;
525
+ for (i=0; i<gripCount; ++i) {
526
+ XDrawLine(Tk_Display(tkwin), d, darkGC, x1,y, x2,y); ++y;
527
+ XDrawLine(Tk_Display(tkwin), d, lightGC, x1,y, x2,y); ++y;
528
+ }
529
+ }
530
+ }
531
+
532
+ static Ttk_ElementSpec GripElementSpec = {
533
+ TK_STYLE_VERSION_2,
534
+ sizeof(GripElement),
535
+ GripElementOptions,
536
+ GripElementSize,
537
+ GripElementDraw
538
+ };
539
+
540
+ /*------------------------------------------------------------------------
541
+ * +++ Scrollbar elements: trough, arrows, thumb.
542
+ *
543
+ * Notice that the trough element has 0 internal padding;
544
+ * that way the thumb and arrow borders overlap the trough.
545
+ */
546
+
547
+ typedef struct { /* Common element record for scrollbar elements */
548
+ Tcl_Obj *orientObj;
549
+ Tcl_Obj *backgroundObj;
550
+ Tcl_Obj *borderColorObj;
551
+ Tcl_Obj *troughColorObj;
552
+ Tcl_Obj *lightColorObj;
553
+ Tcl_Obj *darkColorObj;
554
+ Tcl_Obj *arrowColorObj;
555
+ Tcl_Obj *arrowSizeObj;
556
+ Tcl_Obj *gripCountObj;
557
+ Tcl_Obj *sliderlengthObj;
558
+ } ScrollbarElement;
559
+
560
+ static Ttk_ElementOptionSpec ScrollbarElementOptions[] = {
561
+ { "-orient", TK_OPTION_ANY,
562
+ Tk_Offset(ScrollbarElement, orientObj), "horizontal" },
563
+ { "-background", TK_OPTION_BORDER,
564
+ Tk_Offset(ScrollbarElement,backgroundObj), FRAME_COLOR },
565
+ { "-bordercolor", TK_OPTION_COLOR,
566
+ Tk_Offset(ScrollbarElement,borderColorObj), DARKEST_COLOR },
567
+ { "-troughcolor", TK_OPTION_COLOR,
568
+ Tk_Offset(ScrollbarElement,troughColorObj), DARKER_COLOR },
569
+ { "-lightcolor", TK_OPTION_COLOR,
570
+ Tk_Offset(ScrollbarElement,lightColorObj), LIGHT_COLOR },
571
+ { "-darkcolor", TK_OPTION_COLOR,
572
+ Tk_Offset(ScrollbarElement,darkColorObj), DARK_COLOR },
573
+ { "-arrowcolor", TK_OPTION_COLOR,
574
+ Tk_Offset(ScrollbarElement,arrowColorObj), "#000000" },
575
+ { "-arrowsize", TK_OPTION_PIXELS,
576
+ Tk_Offset(ScrollbarElement,arrowSizeObj), STR(SCROLLBAR_THICKNESS) },
577
+ { "-gripcount", TK_OPTION_INT,
578
+ Tk_Offset(ScrollbarElement,gripCountObj), "5" },
579
+ { "-sliderlength", TK_OPTION_INT,
580
+ Tk_Offset(ScrollbarElement,sliderlengthObj), "30" },
581
+ {0,0,0}
582
+ };
583
+
584
+ static void TroughElementDraw(
585
+ void *clientData, void *elementRecord, Tk_Window tkwin,
586
+ Drawable d, Ttk_Box b, unsigned state)
587
+ {
588
+ ScrollbarElement *sb = elementRecord;
589
+ GC gcb = Ttk_GCForColor(tkwin,sb->borderColorObj,d);
590
+ GC gct = Ttk_GCForColor(tkwin,sb->troughColorObj,d);
591
+ XFillRectangle(Tk_Display(tkwin), d, gct, b.x, b.y, b.width-1, b.height-1);
592
+ XDrawRectangle(Tk_Display(tkwin), d, gcb, b.x, b.y, b.width-1, b.height-1);
593
+ }
594
+
595
+ static Ttk_ElementSpec TroughElementSpec = {
596
+ TK_STYLE_VERSION_2,
597
+ sizeof(ScrollbarElement),
598
+ ScrollbarElementOptions,
599
+ TtkNullElementSize,
600
+ TroughElementDraw
601
+ };
602
+
603
+ static void ThumbElementSize(
604
+ void *clientData, void *elementRecord, Tk_Window tkwin,
605
+ int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr)
606
+ {
607
+ ScrollbarElement *sb = elementRecord;
608
+ int size = SCROLLBAR_THICKNESS;
609
+ Tcl_GetIntFromObj(NULL, sb->arrowSizeObj, &size);
610
+ *widthPtr = *heightPtr = size;
611
+ }
612
+
613
+ static void ThumbElementDraw(
614
+ void *clientData, void *elementRecord, Tk_Window tkwin,
615
+ Drawable d, Ttk_Box b, unsigned state)
616
+ {
617
+ ScrollbarElement *sb = elementRecord;
618
+ int gripCount = 3, orient = TTK_ORIENT_HORIZONTAL;
619
+ GC lightGC, darkGC;
620
+ int x1, y1, x2, y2, dx, dy, i;
621
+ const int w = WIN32_XDRAWLINE_HACK;
622
+
623
+ DrawSmoothBorder(tkwin, d, b,
624
+ sb->borderColorObj, sb->lightColorObj, sb->darkColorObj);
625
+ XFillRectangle(
626
+ Tk_Display(tkwin), d, BackgroundGC(tkwin, sb->backgroundObj),
627
+ b.x+2, b.y+2, b.width-4, b.height-4);
628
+
629
+ /*
630
+ * Draw grip:
631
+ */
632
+ Ttk_GetOrientFromObj(NULL, sb->orientObj, &orient);
633
+ Tcl_GetIntFromObj(NULL, sb->gripCountObj, &gripCount);
634
+ lightGC = Ttk_GCForColor(tkwin,sb->lightColorObj,d);
635
+ darkGC = Ttk_GCForColor(tkwin,sb->borderColorObj,d);
636
+
637
+ if (orient == TTK_ORIENT_HORIZONTAL) {
638
+ dx = 1; dy = 0;
639
+ x1 = x2 = b.x + b.width / 2 - gripCount;
640
+ y1 = b.y + 2;
641
+ y2 = b.y + b.height - 3 + w;
642
+ } else {
643
+ dx = 0; dy = 1;
644
+ y1 = y2 = b.y + b.height / 2 - gripCount;
645
+ x1 = b.x + 2;
646
+ x2 = b.x + b.width - 3 + w;
647
+ }
648
+
649
+ for (i=0; i<gripCount; ++i) {
650
+ XDrawLine(Tk_Display(tkwin), d, darkGC, x1,y1, x2,y2);
651
+ x1 += dx; x2 += dx; y1 += dy; y2 += dy;
652
+ XDrawLine(Tk_Display(tkwin), d, lightGC, x1,y1, x2,y2);
653
+ x1 += dx; x2 += dx; y1 += dy; y2 += dy;
654
+ }
655
+ }
656
+
657
+ static Ttk_ElementSpec ThumbElementSpec = {
658
+ TK_STYLE_VERSION_2,
659
+ sizeof(ScrollbarElement),
660
+ ScrollbarElementOptions,
661
+ ThumbElementSize,
662
+ ThumbElementDraw
663
+ };
664
+
665
+ /*------------------------------------------------------------------------
666
+ * +++ Slider element.
667
+ */
668
+ static void SliderElementSize(
669
+ void *clientData, void *elementRecord, Tk_Window tkwin,
670
+ int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr)
671
+ {
672
+ ScrollbarElement *sb = elementRecord;
673
+ int length, thickness, orient;
674
+
675
+ length = thickness = SCROLLBAR_THICKNESS;
676
+ Ttk_GetOrientFromObj(NULL, sb->orientObj, &orient);
677
+ Tcl_GetIntFromObj(NULL, sb->arrowSizeObj, &thickness);
678
+ Tk_GetPixelsFromObj(NULL, tkwin, sb->sliderlengthObj, &length);
679
+ if (orient == TTK_ORIENT_VERTICAL) {
680
+ *heightPtr = length;
681
+ *widthPtr = thickness;
682
+ } else {
683
+ *heightPtr = thickness;
684
+ *widthPtr = length;
685
+ }
686
+
687
+ }
688
+
689
+ static Ttk_ElementSpec SliderElementSpec = {
690
+ TK_STYLE_VERSION_2,
691
+ sizeof(ScrollbarElement),
692
+ ScrollbarElementOptions,
693
+ SliderElementSize,
694
+ ThumbElementDraw
695
+ };
696
+
697
+ /*------------------------------------------------------------------------
698
+ * +++ Progress bar element
699
+ */
700
+ static void PbarElementSize(
701
+ void *clientData, void *elementRecord, Tk_Window tkwin,
702
+ int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr)
703
+ {
704
+ SliderElementSize(clientData, elementRecord, tkwin,
705
+ widthPtr, heightPtr, paddingPtr);
706
+ *paddingPtr = Ttk_UniformPadding(2);
707
+ *widthPtr += 4;
708
+ *heightPtr += 4;
709
+ }
710
+
711
+ static void PbarElementDraw(
712
+ void *clientData, void *elementRecord, Tk_Window tkwin,
713
+ Drawable d, Ttk_Box b, unsigned state)
714
+ {
715
+ ScrollbarElement *sb = elementRecord;
716
+
717
+ b = Ttk_PadBox(b, Ttk_UniformPadding(2));
718
+ if (b.width > 4 && b.height > 4) {
719
+ DrawSmoothBorder(tkwin, d, b,
720
+ sb->borderColorObj, sb->lightColorObj, sb->darkColorObj);
721
+ XFillRectangle(Tk_Display(tkwin), d,
722
+ BackgroundGC(tkwin, sb->backgroundObj),
723
+ b.x+2, b.y+2, b.width-4, b.height-4);
724
+ }
725
+ }
726
+
727
+ static Ttk_ElementSpec PbarElementSpec = {
728
+ TK_STYLE_VERSION_2,
729
+ sizeof(ScrollbarElement),
730
+ ScrollbarElementOptions,
731
+ PbarElementSize,
732
+ PbarElementDraw
733
+ };
734
+
735
+
736
+ /*------------------------------------------------------------------------
737
+ * +++ Scrollbar arrows.
738
+ */
739
+ static int ArrowElements[] = { ARROW_UP, ARROW_DOWN, ARROW_LEFT, ARROW_RIGHT };
740
+
741
+ static void ArrowElementSize(
742
+ void *clientData, void *elementRecord, Tk_Window tkwin,
743
+ int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr)
744
+ {
745
+ ScrollbarElement *sb = elementRecord;
746
+ int size = SCROLLBAR_THICKNESS;
747
+ Tcl_GetIntFromObj(NULL, sb->arrowSizeObj, &size);
748
+ *widthPtr = *heightPtr = size;
749
+ }
750
+
751
+ static void ArrowElementDraw(
752
+ void *clientData, void *elementRecord, Tk_Window tkwin,
753
+ Drawable d, Ttk_Box b, unsigned state)
754
+ {
755
+ ArrowDirection dir = *(ArrowDirection*)clientData;
756
+ ScrollbarElement *sb = elementRecord;
757
+ GC gc = Ttk_GCForColor(tkwin,sb->arrowColorObj, d);
758
+ int h, cx, cy;
759
+
760
+ DrawSmoothBorder(tkwin, d, b,
761
+ sb->borderColorObj, sb->lightColorObj, sb->darkColorObj);
762
+
763
+ XFillRectangle(
764
+ Tk_Display(tkwin), d, BackgroundGC(tkwin, sb->backgroundObj),
765
+ b.x+2, b.y+2, b.width-4, b.height-4);
766
+
767
+ b = Ttk_PadBox(b, Ttk_UniformPadding(3));
768
+ h = b.width < b.height ? b.width : b.height;
769
+ TtkArrowSize(h/2, dir, &cx, &cy);
770
+ b = Ttk_AnchorBox(b, cx, cy, TK_ANCHOR_CENTER);
771
+
772
+ TtkFillArrow(Tk_Display(tkwin), d, gc, b, dir);
773
+ }
774
+
775
+ static Ttk_ElementSpec ArrowElementSpec = {
776
+ TK_STYLE_VERSION_2,
777
+ sizeof(ScrollbarElement),
778
+ ScrollbarElementOptions,
779
+ ArrowElementSize,
780
+ ArrowElementDraw
781
+ };
782
+
783
+
784
+ /*------------------------------------------------------------------------
785
+ * +++ Notebook elements.
786
+ *
787
+ * Note: Tabs, except for the rightmost, overlap the neighbor to
788
+ * their right by one pixel.
789
+ */
790
+
791
+ typedef struct {
792
+ Tcl_Obj *backgroundObj;
793
+ Tcl_Obj *borderColorObj;
794
+ Tcl_Obj *lightColorObj;
795
+ Tcl_Obj *darkColorObj;
796
+ } NotebookElement;
797
+
798
+ static Ttk_ElementOptionSpec NotebookElementOptions[] = {
799
+ { "-background", TK_OPTION_BORDER,
800
+ Tk_Offset(NotebookElement,backgroundObj), FRAME_COLOR },
801
+ { "-bordercolor", TK_OPTION_COLOR,
802
+ Tk_Offset(NotebookElement,borderColorObj), DARKEST_COLOR },
803
+ { "-lightcolor", TK_OPTION_COLOR,
804
+ Tk_Offset(NotebookElement,lightColorObj), LIGHT_COLOR },
805
+ { "-darkcolor", TK_OPTION_COLOR,
806
+ Tk_Offset(NotebookElement,darkColorObj), DARK_COLOR },
807
+ {0,0,0}
808
+ };
809
+
810
+ static void TabElementSize(
811
+ void *clientData, void *elementRecord, Tk_Window tkwin,
812
+ int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr)
813
+ {
814
+ int borderWidth = 2;
815
+ paddingPtr->top = paddingPtr->left = paddingPtr->right = borderWidth;
816
+ paddingPtr->bottom = 0;
817
+ }
818
+
819
+ static void TabElementDraw(
820
+ void *clientData, void *elementRecord, Tk_Window tkwin,
821
+ Drawable d, Ttk_Box b, unsigned int state)
822
+ {
823
+ NotebookElement *tab = elementRecord;
824
+ Tk_3DBorder border = Tk_Get3DBorderFromObj(tkwin, tab->backgroundObj);
825
+ Display *display = Tk_Display(tkwin);
826
+ int borderWidth = 2, dh = 0;
827
+ int x1,y1,x2,y2;
828
+ GC gc;
829
+ const int w = WIN32_XDRAWLINE_HACK;
830
+
831
+ if (state & TTK_STATE_SELECTED) {
832
+ dh = borderWidth;
833
+ }
834
+
835
+ if (state & TTK_STATE_USER2) { /* Rightmost tab */
836
+ --b.width;
837
+ }
838
+
839
+ Tk_Fill3DRectangle(tkwin, d, border,
840
+ b.x+2, b.y+2, b.width-1, b.height-2+dh, borderWidth, TK_RELIEF_FLAT);
841
+
842
+ x1 = b.x, x2 = b.x + b.width;
843
+ y1 = b.y, y2 = b.y + b.height;
844
+
845
+
846
+ gc=Ttk_GCForColor(tkwin,tab->borderColorObj,d);
847
+ XDrawLine(display,d,gc, x1,y1+1, x1,y2+w);
848
+ XDrawLine(display,d,gc, x2,y1+1, x2,y2+w);
849
+ XDrawLine(display,d,gc, x1+1,y1, x2-1+w,y1);
850
+
851
+ gc=Ttk_GCForColor(tkwin,tab->lightColorObj,d);
852
+ XDrawLine(display,d,gc, x1+1,y1+1, x1+1,y2-1+dh+w);
853
+ XDrawLine(display,d,gc, x1+1,y1+1, x2-1+w,y1+1);
854
+ }
855
+
856
+ static Ttk_ElementSpec TabElementSpec =
857
+ {
858
+ TK_STYLE_VERSION_2,
859
+ sizeof(NotebookElement),
860
+ NotebookElementOptions,
861
+ TabElementSize,
862
+ TabElementDraw
863
+ };
864
+
865
+ static void ClientElementSize(
866
+ void *clientData, void *elementRecord, Tk_Window tkwin,
867
+ int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr)
868
+ {
869
+ int borderWidth = 2;
870
+ *paddingPtr = Ttk_UniformPadding((short)borderWidth);
871
+ }
872
+
873
+ static void ClientElementDraw(
874
+ void *clientData, void *elementRecord, Tk_Window tkwin,
875
+ Drawable d, Ttk_Box b, unsigned int state)
876
+ {
877
+ NotebookElement *ce = elementRecord;
878
+ Tk_3DBorder border = Tk_Get3DBorderFromObj(tkwin, ce->backgroundObj);
879
+ int borderWidth = 2;
880
+
881
+ Tk_Fill3DRectangle(tkwin, d, border,
882
+ b.x, b.y, b.width, b.height, borderWidth,TK_RELIEF_FLAT);
883
+ DrawSmoothBorder(tkwin, d, b,
884
+ ce->borderColorObj, ce->lightColorObj, ce->darkColorObj);
885
+ }
886
+
887
+ static Ttk_ElementSpec ClientElementSpec =
888
+ {
889
+ TK_STYLE_VERSION_2,
890
+ sizeof(NotebookElement),
891
+ NotebookElementOptions,
892
+ ClientElementSize,
893
+ ClientElementDraw
894
+ };
895
+
896
+ /*------------------------------------------------------------------------
897
+ * +++ Modified widget layouts.
898
+ */
899
+
900
+ TTK_BEGIN_LAYOUT_TABLE(LayoutTable)
901
+
902
+ TTK_LAYOUT("TCombobox",
903
+ TTK_NODE("Combobox.downarrow", TTK_PACK_RIGHT|TTK_FILL_Y)
904
+ TTK_GROUP("Combobox.field", TTK_PACK_LEFT|TTK_FILL_BOTH|TTK_EXPAND,
905
+ TTK_GROUP("Combobox.padding", TTK_FILL_BOTH,
906
+ TTK_NODE("Combobox.textarea", TTK_FILL_BOTH))))
907
+
908
+ TTK_LAYOUT("Horizontal.Sash",
909
+ TTK_GROUP("Sash.hsash", TTK_FILL_BOTH,
910
+ TTK_NODE("Sash.hgrip", TTK_FILL_BOTH)))
911
+
912
+ TTK_LAYOUT("Vertical.Sash",
913
+ TTK_GROUP("Sash.vsash", TTK_FILL_BOTH,
914
+ TTK_NODE("Sash.vgrip", TTK_FILL_BOTH)))
915
+
916
+ TTK_END_LAYOUT_TABLE
917
+
918
+ /*------------------------------------------------------------------------
919
+ * +++ Initialization.
920
+ */
921
+
922
+ int DLLEXPORT
923
+ TtkClamTheme_Init(Tcl_Interp *interp)
924
+ {
925
+ Ttk_Theme theme = Ttk_CreateTheme(interp, "clam", 0);
926
+
927
+ if (!theme) {
928
+ return TCL_ERROR;
929
+ }
930
+
931
+ Ttk_RegisterElement(interp,
932
+ theme, "border", &BorderElementSpec, NULL);
933
+ Ttk_RegisterElement(interp,
934
+ theme, "field", &FieldElementSpec, NULL);
935
+ Ttk_RegisterElement(interp,
936
+ theme, "Combobox.field", &ComboboxFieldElementSpec, NULL);
937
+ Ttk_RegisterElement(interp,
938
+ theme, "trough", &TroughElementSpec, NULL);
939
+ Ttk_RegisterElement(interp,
940
+ theme, "thumb", &ThumbElementSpec, NULL);
941
+ Ttk_RegisterElement(interp,
942
+ theme, "uparrow", &ArrowElementSpec, &ArrowElements[0]);
943
+ Ttk_RegisterElement(interp,
944
+ theme, "downarrow", &ArrowElementSpec, &ArrowElements[1]);
945
+ Ttk_RegisterElement(interp,
946
+ theme, "leftarrow", &ArrowElementSpec, &ArrowElements[2]);
947
+ Ttk_RegisterElement(interp,
948
+ theme, "rightarrow", &ArrowElementSpec, &ArrowElements[3]);
949
+
950
+ Ttk_RegisterElement(interp,
951
+ theme, "Radiobutton.indicator", &RadioIndicatorElementSpec, NULL);
952
+ Ttk_RegisterElement(interp,
953
+ theme, "Checkbutton.indicator", &CheckIndicatorElementSpec, NULL);
954
+ Ttk_RegisterElement(interp,
955
+ theme, "Menubutton.indicator", &MenuIndicatorElementSpec, NULL);
956
+
957
+ Ttk_RegisterElement(interp, theme, "tab", &TabElementSpec, NULL);
958
+ Ttk_RegisterElement(interp, theme, "client", &ClientElementSpec, NULL);
959
+
960
+ Ttk_RegisterElement(interp, theme, "slider", &SliderElementSpec, NULL);
961
+ Ttk_RegisterElement(interp, theme, "bar", &PbarElementSpec, NULL);
962
+ Ttk_RegisterElement(interp, theme, "pbar", &PbarElementSpec, NULL);
963
+
964
+ Ttk_RegisterElement(interp, theme, "hgrip",
965
+ &GripElementSpec, &GripClientData[0]);
966
+ Ttk_RegisterElement(interp, theme, "vgrip",
967
+ &GripElementSpec, &GripClientData[1]);
968
+
969
+ Ttk_RegisterLayouts(theme, LayoutTable);
970
+
971
+ Tcl_PkgProvide(interp, "ttk::theme::clam", TILE_VERSION);
972
+
973
+ return TCL_OK;
974
+ }