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,554 @@
1
+ /* manager.c,v 1.14 2007/11/25 17:17:09 jenglish Exp
2
+ *
3
+ * Copyright 2005, Joe English. Freely redistributable.
4
+ *
5
+ * Support routines for geometry managers.
6
+ */
7
+
8
+ #include <string.h>
9
+ #include <tk.h>
10
+ #include "manager.h"
11
+
12
+ /*------------------------------------------------------------------------
13
+ * +++ The Geometry Propagation Dance.
14
+ *
15
+ * When a slave window requests a new size or some other parameter changes,
16
+ * the manager recomputes the required size for the master window and calls
17
+ * Tk_GeometryRequest(). This is scheduled as an idle handler so multiple
18
+ * updates can be processed as a single batch.
19
+ *
20
+ * If all goes well, the master's manager will process the request
21
+ * (and so on up the chain to the toplevel window), and the master
22
+ * window will eventually receive a <Configure> event. At this point
23
+ * it recomputes the size and position of all slaves and places them.
24
+ *
25
+ * If all does not go well, however, the master's request may be ignored
26
+ * (typically because the top-level window has a fixed, user-specified size).
27
+ * Tk doesn't provide any notification when this happens; to account for this,
28
+ * we also schedule an idle handler to call the layout procedure
29
+ * after making a geometry request.
30
+ *
31
+ * +++ Slave removal <<NOTE-LOSTSLAVE>>.
32
+ *
33
+ * There are three conditions under which a slave is removed:
34
+ *
35
+ * (1) Another GM claims control
36
+ * (2) Manager voluntarily relinquishes control
37
+ * (3) Slave is destroyed
38
+ *
39
+ * In case (1), Tk calls the manager's lostSlaveProc.
40
+ * Case (2) is performed by calling Tk_ManageGeometry(slave,NULL,0);
41
+ * in this case Tk does _not_ call the LostSlaveProc (documented behavior).
42
+ * Tk doesn't handle case (3) either; to account for that we
43
+ * register an event handler on the slave widget to track <Destroy> events.
44
+ */
45
+
46
+ /* ++ Data structures.
47
+ */
48
+ typedef struct
49
+ {
50
+ Tk_Window slaveWindow;
51
+ Ttk_Manager *manager;
52
+ void *slaveData;
53
+ unsigned flags;
54
+ } Ttk_Slave;
55
+
56
+ /* slave->flags bits:
57
+ */
58
+ #define SLAVE_MAPPED 0x1 /* slave to be mapped when master is */
59
+
60
+ struct TtkManager_
61
+ {
62
+ Ttk_ManagerSpec *managerSpec;
63
+ void *managerData;
64
+ Tk_Window masterWindow;
65
+ unsigned flags;
66
+ int nSlaves;
67
+ Ttk_Slave **slaves;
68
+ };
69
+
70
+ /* manager->flags bits:
71
+ */
72
+ #define MGR_UPDATE_PENDING 0x1
73
+ #define MGR_RESIZE_REQUIRED 0x2
74
+ #define MGR_RELAYOUT_REQUIRED 0x4
75
+
76
+ static void ManagerIdleProc(void *); /* forward */
77
+
78
+ /* ++ ScheduleUpdate --
79
+ * Schedule a call to recompute the size and/or layout,
80
+ * depending on flags.
81
+ */
82
+ static void ScheduleUpdate(Ttk_Manager *mgr, unsigned flags)
83
+ {
84
+ if (!(mgr->flags & MGR_UPDATE_PENDING)) {
85
+ Tcl_DoWhenIdle(ManagerIdleProc, mgr);
86
+ mgr->flags |= MGR_UPDATE_PENDING;
87
+ }
88
+ mgr->flags |= flags;
89
+ }
90
+
91
+ /* ++ RecomputeSize --
92
+ * Recomputes the required size of the master window,
93
+ * makes geometry request.
94
+ */
95
+ static void RecomputeSize(Ttk_Manager *mgr)
96
+ {
97
+ int width = 1, height = 1;
98
+
99
+ if (mgr->managerSpec->RequestedSize(mgr->managerData, &width, &height)) {
100
+ Tk_GeometryRequest(mgr->masterWindow, width, height);
101
+ ScheduleUpdate(mgr, MGR_RELAYOUT_REQUIRED);
102
+ }
103
+ mgr->flags &= ~MGR_RESIZE_REQUIRED;
104
+ }
105
+
106
+ /* ++ RecomputeLayout --
107
+ * Recompute geometry of all slaves.
108
+ */
109
+ static void RecomputeLayout(Ttk_Manager *mgr)
110
+ {
111
+ mgr->managerSpec->PlaceSlaves(mgr->managerData);
112
+ mgr->flags &= ~MGR_RELAYOUT_REQUIRED;
113
+ }
114
+
115
+ /* ++ ManagerIdleProc --
116
+ * DoWhenIdle procedure for deferred updates.
117
+ */
118
+ static void ManagerIdleProc(ClientData clientData)
119
+ {
120
+ Ttk_Manager *mgr = clientData;
121
+ mgr->flags &= ~MGR_UPDATE_PENDING;
122
+
123
+ if (mgr->flags & MGR_RESIZE_REQUIRED) {
124
+ RecomputeSize(mgr);
125
+ }
126
+ if (mgr->flags & MGR_RELAYOUT_REQUIRED) {
127
+ if (mgr->flags & MGR_UPDATE_PENDING) {
128
+ /* RecomputeSize has scheduled another update; relayout later */
129
+ return;
130
+ }
131
+ RecomputeLayout(mgr);
132
+ }
133
+ }
134
+
135
+ /*------------------------------------------------------------------------
136
+ * +++ Event handlers.
137
+ */
138
+
139
+ /* ++ ManagerEventHandler --
140
+ * Recompute slave layout when master widget is resized.
141
+ * Keep the slave's map state in sync with the master's.
142
+ */
143
+ static const int ManagerEventMask = StructureNotifyMask;
144
+ static void ManagerEventHandler(ClientData clientData, XEvent *eventPtr)
145
+ {
146
+ Ttk_Manager *mgr = clientData;
147
+ int i;
148
+
149
+ switch (eventPtr->type)
150
+ {
151
+ case ConfigureNotify:
152
+ RecomputeLayout(mgr);
153
+ break;
154
+ case MapNotify:
155
+ for (i = 0; i < mgr->nSlaves; ++i) {
156
+ Ttk_Slave *slave = mgr->slaves[i];
157
+ if (slave->flags & SLAVE_MAPPED) {
158
+ Tk_MapWindow(slave->slaveWindow);
159
+ }
160
+ }
161
+ break;
162
+ case UnmapNotify:
163
+ for (i = 0; i < mgr->nSlaves; ++i) {
164
+ Ttk_Slave *slave = mgr->slaves[i];
165
+ Tk_UnmapWindow(slave->slaveWindow);
166
+ }
167
+ break;
168
+ }
169
+ }
170
+
171
+ /* ++ SlaveEventHandler --
172
+ * Notifies manager when a slave is destroyed
173
+ * (see <<NOTE-LOSTSLAVE>>).
174
+ */
175
+ static const unsigned SlaveEventMask = StructureNotifyMask;
176
+ static void SlaveEventHandler(ClientData clientData, XEvent *eventPtr)
177
+ {
178
+ Ttk_Slave *slave = clientData;
179
+ if (eventPtr->type == DestroyNotify) {
180
+ slave->manager->managerSpec->tkGeomMgr.lostSlaveProc(
181
+ slave->manager, slave->slaveWindow);
182
+ }
183
+ }
184
+
185
+ /*------------------------------------------------------------------------
186
+ * +++ Slave initialization and cleanup.
187
+ */
188
+
189
+ static Ttk_Slave *NewSlave(
190
+ Ttk_Manager *mgr, Tk_Window slaveWindow, void *slaveData)
191
+ {
192
+ Ttk_Slave *slave = (Ttk_Slave*)ckalloc(sizeof(*slave));
193
+
194
+ slave->slaveWindow = slaveWindow;
195
+ slave->manager = mgr;
196
+ slave->flags = 0;
197
+ slave->slaveData = slaveData;
198
+
199
+ return slave;
200
+ }
201
+
202
+ static void DeleteSlave(Ttk_Slave *slave)
203
+ {
204
+ ckfree((ClientData)slave);
205
+ }
206
+
207
+ /*------------------------------------------------------------------------
208
+ * +++ Manager initialization and cleanup.
209
+ */
210
+
211
+ Ttk_Manager *Ttk_CreateManager(
212
+ Ttk_ManagerSpec *managerSpec, void *managerData, Tk_Window masterWindow)
213
+ {
214
+ Ttk_Manager *mgr = (Ttk_Manager*)ckalloc(sizeof(*mgr));
215
+
216
+ mgr->managerSpec = managerSpec;
217
+ mgr->managerData = managerData;
218
+ mgr->masterWindow = masterWindow;
219
+ mgr->nSlaves = 0;
220
+ mgr->slaves = NULL;
221
+ mgr->flags = 0;
222
+
223
+ Tk_CreateEventHandler(
224
+ mgr->masterWindow, ManagerEventMask, ManagerEventHandler, mgr);
225
+
226
+ return mgr;
227
+ }
228
+
229
+ void Ttk_DeleteManager(Ttk_Manager *mgr)
230
+ {
231
+ Tk_DeleteEventHandler(
232
+ mgr->masterWindow, ManagerEventMask, ManagerEventHandler, mgr);
233
+
234
+ while (mgr->nSlaves > 0) {
235
+ Ttk_ForgetSlave(mgr, mgr->nSlaves - 1);
236
+ }
237
+ if (mgr->slaves) {
238
+ ckfree((ClientData)mgr->slaves);
239
+ }
240
+
241
+ Tk_CancelIdleCall(ManagerIdleProc, mgr);
242
+
243
+ ckfree((ClientData)mgr);
244
+ }
245
+
246
+ /*------------------------------------------------------------------------
247
+ * +++ Slave management.
248
+ */
249
+
250
+ /* ++ InsertSlave --
251
+ * Adds slave to the list of managed windows.
252
+ */
253
+ static void InsertSlave(Ttk_Manager *mgr, Ttk_Slave *slave, int index)
254
+ {
255
+ int endIndex = mgr->nSlaves++;
256
+ mgr->slaves = (Ttk_Slave**)ckrealloc(
257
+ (ClientData)mgr->slaves, mgr->nSlaves * sizeof(Ttk_Slave *));
258
+
259
+ while (endIndex > index) {
260
+ mgr->slaves[endIndex] = mgr->slaves[endIndex - 1];
261
+ --endIndex;
262
+ }
263
+
264
+ mgr->slaves[index] = slave;
265
+
266
+ Tk_ManageGeometry(slave->slaveWindow,
267
+ &mgr->managerSpec->tkGeomMgr, (ClientData)mgr);
268
+
269
+ Tk_CreateEventHandler(slave->slaveWindow,
270
+ SlaveEventMask, SlaveEventHandler, (ClientData)slave);
271
+
272
+ ScheduleUpdate(mgr, MGR_RESIZE_REQUIRED);
273
+ }
274
+
275
+ /* RemoveSlave --
276
+ * Unmanage and delete the slave.
277
+ *
278
+ * NOTES/ASSUMPTIONS:
279
+ *
280
+ * [1] It's safe to call Tk_UnmapWindow / Tk_UnmaintainGeometry even if this
281
+ * routine is called from the slave's DestroyNotify event handler.
282
+ */
283
+ static void RemoveSlave(Ttk_Manager *mgr, int index)
284
+ {
285
+ Ttk_Slave *slave = mgr->slaves[index];
286
+ int i;
287
+
288
+ /* Notify manager:
289
+ */
290
+ mgr->managerSpec->SlaveRemoved(mgr->managerData, index);
291
+
292
+ /* Remove from array:
293
+ */
294
+ --mgr->nSlaves;
295
+ for (i = index ; i < mgr->nSlaves; ++i) {
296
+ mgr->slaves[i] = mgr->slaves[i+1];
297
+ }
298
+
299
+ /* Clean up:
300
+ */
301
+ Tk_DeleteEventHandler(
302
+ slave->slaveWindow, SlaveEventMask, SlaveEventHandler, slave);
303
+
304
+ /* Note [1] */
305
+ Tk_UnmaintainGeometry(slave->slaveWindow, mgr->masterWindow);
306
+ Tk_UnmapWindow(slave->slaveWindow);
307
+
308
+ DeleteSlave(slave);
309
+
310
+ ScheduleUpdate(mgr, MGR_RESIZE_REQUIRED);
311
+ }
312
+
313
+ /*------------------------------------------------------------------------
314
+ * +++ Tk_GeomMgr hooks.
315
+ */
316
+
317
+ void Ttk_GeometryRequestProc(ClientData clientData, Tk_Window slaveWindow)
318
+ {
319
+ Ttk_Manager *mgr = clientData;
320
+ int slaveIndex = Ttk_SlaveIndex(mgr, slaveWindow);
321
+ int reqWidth = Tk_ReqWidth(slaveWindow);
322
+ int reqHeight= Tk_ReqHeight(slaveWindow);
323
+
324
+ if (mgr->managerSpec->SlaveRequest(
325
+ mgr->managerData, slaveIndex, reqWidth, reqHeight))
326
+ {
327
+ ScheduleUpdate(mgr, MGR_RESIZE_REQUIRED);
328
+ }
329
+ }
330
+
331
+ void Ttk_LostSlaveProc(ClientData clientData, Tk_Window slaveWindow)
332
+ {
333
+ Ttk_Manager *mgr = clientData;
334
+ int index = Ttk_SlaveIndex(mgr, slaveWindow);
335
+
336
+ /* ASSERT: index >= 0 */
337
+ RemoveSlave(mgr, index);
338
+ }
339
+
340
+ /*------------------------------------------------------------------------
341
+ * +++ Public API.
342
+ */
343
+
344
+ /* ++ Ttk_InsertSlave --
345
+ * Add a new slave window at the specified index.
346
+ */
347
+ void Ttk_InsertSlave(
348
+ Ttk_Manager *mgr, int index, Tk_Window tkwin, void *slaveData)
349
+ {
350
+ Ttk_Slave *slave = NewSlave(mgr, tkwin, slaveData);
351
+ InsertSlave(mgr, slave, index);
352
+ }
353
+
354
+ /* ++ Ttk_ForgetSlave --
355
+ * Unmanage the specified slave.
356
+ */
357
+ void Ttk_ForgetSlave(Ttk_Manager *mgr, int slaveIndex)
358
+ {
359
+ Tk_Window slaveWindow = mgr->slaves[slaveIndex]->slaveWindow;
360
+ RemoveSlave(mgr, slaveIndex);
361
+ Tk_ManageGeometry(slaveWindow, NULL, 0);
362
+ }
363
+
364
+ /* ++ Ttk_PlaceSlave --
365
+ * Set the position and size of the specified slave window.
366
+ *
367
+ * NOTES:
368
+ * Contrary to documentation, Tk_MaintainGeometry doesn't always
369
+ * map the slave.
370
+ */
371
+ void Ttk_PlaceSlave(
372
+ Ttk_Manager *mgr, int slaveIndex, int x, int y, int width, int height)
373
+ {
374
+ Ttk_Slave *slave = mgr->slaves[slaveIndex];
375
+ Tk_MaintainGeometry(slave->slaveWindow,mgr->masterWindow,x,y,width,height);
376
+ slave->flags |= SLAVE_MAPPED;
377
+ if (Tk_IsMapped(mgr->masterWindow)) {
378
+ Tk_MapWindow(slave->slaveWindow);
379
+ }
380
+ }
381
+
382
+ /* ++ Ttk_UnmapSlave --
383
+ * Unmap the specified slave, but leave it managed.
384
+ */
385
+ void Ttk_UnmapSlave(Ttk_Manager *mgr, int slaveIndex)
386
+ {
387
+ Ttk_Slave *slave = mgr->slaves[slaveIndex];
388
+ Tk_UnmaintainGeometry(slave->slaveWindow, mgr->masterWindow);
389
+ slave->flags &= ~SLAVE_MAPPED;
390
+ /* Contrary to documentation, Tk_UnmaintainGeometry doesn't always
391
+ * unmap the slave:
392
+ */
393
+ Tk_UnmapWindow(slave->slaveWindow);
394
+ }
395
+
396
+ /* LayoutChanged, SizeChanged --
397
+ * Schedule a relayout, resp. resize request.
398
+ */
399
+ void Ttk_ManagerLayoutChanged(Ttk_Manager *mgr)
400
+ {
401
+ ScheduleUpdate(mgr, MGR_RELAYOUT_REQUIRED);
402
+ }
403
+
404
+ void Ttk_ManagerSizeChanged(Ttk_Manager *mgr)
405
+ {
406
+ ScheduleUpdate(mgr, MGR_RESIZE_REQUIRED);
407
+ }
408
+
409
+ /* +++ Accessors.
410
+ */
411
+ int Ttk_NumberSlaves(Ttk_Manager *mgr)
412
+ {
413
+ return mgr->nSlaves;
414
+ }
415
+ void *Ttk_SlaveData(Ttk_Manager *mgr, int slaveIndex)
416
+ {
417
+ return mgr->slaves[slaveIndex]->slaveData;
418
+ }
419
+ Tk_Window Ttk_SlaveWindow(Ttk_Manager *mgr, int slaveIndex)
420
+ {
421
+ return mgr->slaves[slaveIndex]->slaveWindow;
422
+ }
423
+
424
+ /*------------------------------------------------------------------------
425
+ * +++ Utility routines.
426
+ */
427
+
428
+ /* ++ Ttk_SlaveIndex --
429
+ * Returns the index of specified slave window, -1 if not found.
430
+ */
431
+ int Ttk_SlaveIndex(Ttk_Manager *mgr, Tk_Window slaveWindow)
432
+ {
433
+ int index;
434
+ for (index = 0; index < mgr->nSlaves; ++index)
435
+ if (mgr->slaves[index]->slaveWindow == slaveWindow)
436
+ return index;
437
+ return -1;
438
+ }
439
+
440
+ /* ++ Ttk_GetSlaveIndexFromObj(interp, mgr, objPtr, indexPtr) --
441
+ * Return the index of the slave specified by objPtr.
442
+ * Slaves may be specified as an integer index or
443
+ * as the name of the managed window.
444
+ *
445
+ * Returns:
446
+ * Standard Tcl completion code. Leaves an error message in case of error.
447
+ */
448
+
449
+ int Ttk_GetSlaveIndexFromObj(
450
+ Tcl_Interp *interp, Ttk_Manager *mgr, Tcl_Obj *objPtr, int *indexPtr)
451
+ {
452
+ const char *string = Tcl_GetString(objPtr);
453
+ int slaveIndex = 0;
454
+ Tk_Window tkwin;
455
+
456
+ /* Try interpreting as an integer first:
457
+ */
458
+ if (Tcl_GetIntFromObj(NULL, objPtr, &slaveIndex) == TCL_OK) {
459
+ if (slaveIndex < 0 || slaveIndex >= mgr->nSlaves) {
460
+ Tcl_ResetResult(interp);
461
+ Tcl_AppendResult(interp,
462
+ "Slave index ", Tcl_GetString(objPtr), " out of bounds",
463
+ NULL);
464
+ return TCL_ERROR;
465
+ }
466
+ *indexPtr = slaveIndex;
467
+ return TCL_OK;
468
+ }
469
+
470
+ /* Try interpreting as a slave window name;
471
+ */
472
+ if ( (*string == '.')
473
+ && (tkwin = Tk_NameToWindow(interp, string, mgr->masterWindow)))
474
+ {
475
+ slaveIndex = Ttk_SlaveIndex(mgr, tkwin);
476
+ if (slaveIndex < 0) {
477
+ Tcl_ResetResult(interp);
478
+ Tcl_AppendResult(interp,
479
+ string, " is not managed by ", Tk_PathName(mgr->masterWindow),
480
+ NULL);
481
+ return TCL_ERROR;
482
+ }
483
+ *indexPtr = slaveIndex;
484
+ return TCL_OK;
485
+ }
486
+
487
+ Tcl_ResetResult(interp);
488
+ Tcl_AppendResult(interp, "Invalid slave specification ", string, NULL);
489
+ return TCL_ERROR;
490
+ }
491
+
492
+ /* ++ Ttk_ReorderSlave(mgr, fromIndex, toIndex) --
493
+ * Change slave order.
494
+ */
495
+ void Ttk_ReorderSlave(Ttk_Manager *mgr, int fromIndex, int toIndex)
496
+ {
497
+ Ttk_Slave *moved = mgr->slaves[fromIndex];
498
+
499
+ /* Shuffle down: */
500
+ while (fromIndex > toIndex) {
501
+ mgr->slaves[fromIndex] = mgr->slaves[fromIndex - 1];
502
+ --fromIndex;
503
+ }
504
+ /* Or, shuffle up: */
505
+ while (fromIndex < toIndex) {
506
+ mgr->slaves[fromIndex] = mgr->slaves[fromIndex + 1];
507
+ ++fromIndex;
508
+ }
509
+ /* ASSERT: fromIndex == toIndex */
510
+ mgr->slaves[fromIndex] = moved;
511
+
512
+ /* Schedule a relayout. In general, rearranging slaves
513
+ * may also change the size:
514
+ */
515
+ ScheduleUpdate(mgr, MGR_RESIZE_REQUIRED);
516
+ }
517
+
518
+ /* ++ Ttk_Maintainable(interp, slave, master) --
519
+ * Utility routine. Verifies that 'master' may be used to maintain
520
+ * the geometry of 'slave' via Tk_MaintainGeometry:
521
+ *
522
+ * + 'master' is either 'slave's parent -OR-
523
+ * + 'master is a descendant of 'slave's parent.
524
+ * + 'slave' is not a toplevel window
525
+ * + 'slave' belongs to the same toplevel as 'master'
526
+ *
527
+ * Returns: 1 if OK; otherwise 0, leaving an error message in 'interp'.
528
+ */
529
+ int Ttk_Maintainable(Tcl_Interp *interp, Tk_Window slave, Tk_Window master)
530
+ {
531
+ Tk_Window ancestor = master, parent = Tk_Parent(slave), sibling = NULL;
532
+
533
+ if (Tk_IsTopLevel(slave) || slave == master) {
534
+ goto badWindow;
535
+ }
536
+
537
+ while (ancestor != parent) {
538
+ if (Tk_IsTopLevel(ancestor)) {
539
+ goto badWindow;
540
+ }
541
+ sibling = ancestor;
542
+ ancestor = Tk_Parent(ancestor);
543
+ }
544
+
545
+ return 1;
546
+
547
+ badWindow:
548
+ Tcl_AppendResult(interp,
549
+ "can't add ", Tk_PathName(slave),
550
+ " as slave of ", Tk_PathName(master),
551
+ NULL);
552
+ return 0;
553
+ }
554
+