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,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
+