wrb 2.0.0

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 (271) hide show
  1. checksums.yaml +7 -0
  2. data/README +28 -0
  3. data/Rakefile +66 -0
  4. data/bin/wrb +41 -0
  5. data/bin/wrb.bat +6 -0
  6. data/ext/rwin/aatree.c +192 -0
  7. data/ext/rwin/aatree.h +55 -0
  8. data/ext/rwin/extconf.rb +47 -0
  9. data/ext/rwin/rw_api.c +2058 -0
  10. data/ext/rwin/rw_devices.c +215 -0
  11. data/ext/rwin/rw_gdiplus.h +278 -0
  12. data/ext/rwin/rw_graphics.c +1583 -0
  13. data/ext/rwin/rw_resources.c +1988 -0
  14. data/ext/rwin/rw_ubfuncs.c +281 -0
  15. data/ext/rwin/rw_windows.c +1936 -0
  16. data/ext/rwin/rwin.c +451 -0
  17. data/ext/rwin/rwin.h +442 -0
  18. data/lib/rwin.rb +820 -0
  19. data/lib/wrb.rb +20 -0
  20. data/lib/wrb/applications/frmdesigner/angle.cur +0 -0
  21. data/lib/wrb/applications/frmdesigner/angle2.cur +0 -0
  22. data/lib/wrb/applications/frmdesigner/controls/Button.bmp +0 -0
  23. data/lib/wrb/applications/frmdesigner/controls/Button.rb +34 -0
  24. data/lib/wrb/applications/frmdesigner/controls/Checkbox.bmp +0 -0
  25. data/lib/wrb/applications/frmdesigner/controls/Checkbox.rb +10 -0
  26. data/lib/wrb/applications/frmdesigner/controls/Combobox.bmp +0 -0
  27. data/lib/wrb/applications/frmdesigner/controls/Combobox.rb +88 -0
  28. data/lib/wrb/applications/frmdesigner/controls/ComboboxEx.rb +97 -0
  29. data/lib/wrb/applications/frmdesigner/controls/Comboboxex.bmp +0 -0
  30. data/lib/wrb/applications/frmdesigner/controls/DateTimePicker.bmp +0 -0
  31. data/lib/wrb/applications/frmdesigner/controls/DateTimePicker.rb +11 -0
  32. data/lib/wrb/applications/frmdesigner/controls/Edit.bmp +0 -0
  33. data/lib/wrb/applications/frmdesigner/controls/Edit.rb +8 -0
  34. data/lib/wrb/applications/frmdesigner/controls/Groupbox.bmp +0 -0
  35. data/lib/wrb/applications/frmdesigner/controls/Groupbox.rb +9 -0
  36. data/lib/wrb/applications/frmdesigner/controls/Hotkeyctrl.bmp +0 -0
  37. data/lib/wrb/applications/frmdesigner/controls/Hotkeyctrl.rb +9 -0
  38. data/lib/wrb/applications/frmdesigner/controls/Imagelist.bmp +0 -0
  39. data/lib/wrb/applications/frmdesigner/controls/Imagelist.rb +115 -0
  40. data/lib/wrb/applications/frmdesigner/controls/Listbox.bmp +0 -0
  41. data/lib/wrb/applications/frmdesigner/controls/Listbox.rb +77 -0
  42. data/lib/wrb/applications/frmdesigner/controls/Listview.bmp +0 -0
  43. data/lib/wrb/applications/frmdesigner/controls/Listview.rb +157 -0
  44. data/lib/wrb/applications/frmdesigner/controls/Menu.bmp +0 -0
  45. data/lib/wrb/applications/frmdesigner/controls/Menu.rb +198 -0
  46. data/lib/wrb/applications/frmdesigner/controls/Menubar.bmp +0 -0
  47. data/lib/wrb/applications/frmdesigner/controls/Menubar.rb +9 -0
  48. data/lib/wrb/applications/frmdesigner/controls/MonthCalender.bmp +0 -0
  49. data/lib/wrb/applications/frmdesigner/controls/Monthcalender.rb +9 -0
  50. data/lib/wrb/applications/frmdesigner/controls/Panel.bmp +0 -0
  51. data/lib/wrb/applications/frmdesigner/controls/Panel.rb +30 -0
  52. data/lib/wrb/applications/frmdesigner/controls/Progressbar.rb +10 -0
  53. data/lib/wrb/applications/frmdesigner/controls/Radiobutton.bmp +0 -0
  54. data/lib/wrb/applications/frmdesigner/controls/Radiobutton.rb +13 -0
  55. data/lib/wrb/applications/frmdesigner/controls/Rebar.bmp +0 -0
  56. data/lib/wrb/applications/frmdesigner/controls/Rebar.rb +162 -0
  57. data/lib/wrb/applications/frmdesigner/controls/Splitter.bmp +0 -0
  58. data/lib/wrb/applications/frmdesigner/controls/Splitter.rb +66 -0
  59. data/lib/wrb/applications/frmdesigner/controls/Static.bmp +0 -0
  60. data/lib/wrb/applications/frmdesigner/controls/Static.rb +9 -0
  61. data/lib/wrb/applications/frmdesigner/controls/Statusbar.bmp +0 -0
  62. data/lib/wrb/applications/frmdesigner/controls/Statusbar.rb +103 -0
  63. data/lib/wrb/applications/frmdesigner/controls/Tabctrl.bmp +0 -0
  64. data/lib/wrb/applications/frmdesigner/controls/Tabctrl.rb +136 -0
  65. data/lib/wrb/applications/frmdesigner/controls/Timer.bmp +0 -0
  66. data/lib/wrb/applications/frmdesigner/controls/Timer.rb +36 -0
  67. data/lib/wrb/applications/frmdesigner/controls/Toolbar.bmp +0 -0
  68. data/lib/wrb/applications/frmdesigner/controls/Toolbar.rb +165 -0
  69. data/lib/wrb/applications/frmdesigner/controls/Trackbar.bmp +0 -0
  70. data/lib/wrb/applications/frmdesigner/controls/Trackbar.rb +34 -0
  71. data/lib/wrb/applications/frmdesigner/controls/Treeview.bmp +0 -0
  72. data/lib/wrb/applications/frmdesigner/controls/Treeview.rb +107 -0
  73. data/lib/wrb/applications/frmdesigner/controls/Updown.bmp +0 -0
  74. data/lib/wrb/applications/frmdesigner/controls/Updown.rb +31 -0
  75. data/lib/wrb/applications/frmdesigner/controls/default.bmp +0 -0
  76. data/lib/wrb/applications/frmdesigner/controls/progressbar.bmp +0 -0
  77. data/lib/wrb/applications/frmdesigner/controls/unselect.bmp +0 -0
  78. data/lib/wrb/applications/frmdesigner/fddialogs.rb +87 -0
  79. data/lib/wrb/applications/frmdesigner/fdesign.rb +1315 -0
  80. data/lib/wrb/applications/frmdesigner/fdmodules.rb +1394 -0
  81. data/lib/wrb/applications/frmdesigner/fdparseform.rb +197 -0
  82. data/lib/wrb/applications/frmdesigner/img13.bmp +0 -0
  83. data/lib/wrb/base.rb +1294 -0
  84. data/lib/wrb/combocommon.rb +77 -0
  85. data/lib/wrb/commctrlconst.rb +139 -0
  86. data/lib/wrb/commdlg.rb +77 -0
  87. data/lib/wrb/components/animate.rb +114 -0
  88. data/lib/wrb/components/bitmap.rb +116 -0
  89. data/lib/wrb/components/button.rb +134 -0
  90. data/lib/wrb/components/canvas.rb +266 -0
  91. data/lib/wrb/components/checkbox.rb +118 -0
  92. data/lib/wrb/components/choosecolordlg.rb +87 -0
  93. data/lib/wrb/components/choosefontdlg.rb +142 -0
  94. data/lib/wrb/components/clipboard.rb +174 -0
  95. data/lib/wrb/components/combobox.rb +282 -0
  96. data/lib/wrb/components/comboboxex.rb +574 -0
  97. data/lib/wrb/components/cursor.rb +91 -0
  98. data/lib/wrb/components/datetimepicker.rb +197 -0
  99. data/lib/wrb/components/ddeclient.rb +180 -0
  100. data/lib/wrb/components/ddeserver.rb +131 -0
  101. data/lib/wrb/components/dialog.rb +228 -0
  102. data/lib/wrb/components/edit.rb +412 -0
  103. data/lib/wrb/components/font.rb +35 -0
  104. data/lib/wrb/components/form.rb +65 -0
  105. data/lib/wrb/components/groupbox.rb +122 -0
  106. data/lib/wrb/components/header.rb +479 -0
  107. data/lib/wrb/components/hotkeyctrl.rb +72 -0
  108. data/lib/wrb/components/icon.rb +109 -0
  109. data/lib/wrb/components/imagelist.rb +396 -0
  110. data/lib/wrb/components/inifile.rb +97 -0
  111. data/lib/wrb/components/listbox.rb +149 -0
  112. data/lib/wrb/components/listview.rb +1467 -0
  113. data/lib/wrb/components/menu.rb +592 -0
  114. data/lib/wrb/components/menubar.rb +84 -0
  115. data/lib/wrb/components/monthcalender.rb +164 -0
  116. data/lib/wrb/components/openfilenamedlg.rb +147 -0
  117. data/lib/wrb/components/pager.rb +199 -0
  118. data/lib/wrb/components/panel.rb +103 -0
  119. data/lib/wrb/components/picture.rb +55 -0
  120. data/lib/wrb/components/printdlg.rb +148 -0
  121. data/lib/wrb/components/printdlgex.rb +117 -0
  122. data/lib/wrb/components/printer.rb +97 -0
  123. data/lib/wrb/components/progressbar.rb +140 -0
  124. data/lib/wrb/components/radiobutton.rb +49 -0
  125. data/lib/wrb/components/rebar.rb +830 -0
  126. data/lib/wrb/components/registry.rb +408 -0
  127. data/lib/wrb/components/richedit.rb +1181 -0
  128. data/lib/wrb/components/savefilenamedlg.rb +27 -0
  129. data/lib/wrb/components/scintilla.rb +1298 -0
  130. data/lib/wrb/components/scrollbar.rb +239 -0
  131. data/lib/wrb/components/splitter.rb +494 -0
  132. data/lib/wrb/components/static.rb +198 -0
  133. data/lib/wrb/components/statusbar.rb +490 -0
  134. data/lib/wrb/components/tabctrl.rb +686 -0
  135. data/lib/wrb/components/timer.rb +117 -0
  136. data/lib/wrb/components/toolbar.rb +1107 -0
  137. data/lib/wrb/components/tooltip.rb +651 -0
  138. data/lib/wrb/components/trackbar.rb +298 -0
  139. data/lib/wrb/components/treeview.rb +845 -0
  140. data/lib/wrb/components/updown.rb +198 -0
  141. data/lib/wrb/ddeml.rb +241 -0
  142. data/lib/wrb/documents/animate.html +46 -0
  143. data/lib/wrb/documents/bitmap.html +69 -0
  144. data/lib/wrb/documents/button.html +78 -0
  145. data/lib/wrb/documents/canvas.html +137 -0
  146. data/lib/wrb/documents/checkbox.html +77 -0
  147. data/lib/wrb/documents/choosecolordlg.html +29 -0
  148. data/lib/wrb/documents/choosefontdlg.html +31 -0
  149. data/lib/wrb/documents/clipboard.html +31 -0
  150. data/lib/wrb/documents/combobox.html +117 -0
  151. data/lib/wrb/documents/comboboxex.html +139 -0
  152. data/lib/wrb/documents/control.html +53 -0
  153. data/lib/wrb/documents/cursor.html +45 -0
  154. data/lib/wrb/documents/datetimepicker.html +70 -0
  155. data/lib/wrb/documents/ddeclient.html +33 -0
  156. data/lib/wrb/documents/ddeserver.html +26 -0
  157. data/lib/wrb/documents/dialog.html +78 -0
  158. data/lib/wrb/documents/edit.html +169 -0
  159. data/lib/wrb/documents/empty.html +11 -0
  160. data/lib/wrb/documents/favicon.png +0 -0
  161. data/lib/wrb/documents/font.html +38 -0
  162. data/lib/wrb/documents/form.html +63 -0
  163. data/lib/wrb/documents/groupbox.html +57 -0
  164. data/lib/wrb/documents/header.html +85 -0
  165. data/lib/wrb/documents/hotkeyctrl.html +42 -0
  166. data/lib/wrb/documents/icon.html +45 -0
  167. data/lib/wrb/documents/imagelist.html +101 -0
  168. data/lib/wrb/documents/images/button.png +0 -0
  169. data/lib/wrb/documents/images/checkbox.png +0 -0
  170. data/lib/wrb/documents/images/combobox.png +0 -0
  171. data/lib/wrb/documents/images/comboboxex.png +0 -0
  172. data/lib/wrb/documents/images/datetimepicker.png +0 -0
  173. data/lib/wrb/documents/images/edit.png +0 -0
  174. data/lib/wrb/documents/images/groupbox.png +0 -0
  175. data/lib/wrb/documents/images/hotkeyctrl.png +0 -0
  176. data/lib/wrb/documents/images/listbox.png +0 -0
  177. data/lib/wrb/documents/images/listview.png +0 -0
  178. data/lib/wrb/documents/images/menu.png +0 -0
  179. data/lib/wrb/documents/images/menubar.png +0 -0
  180. data/lib/wrb/documents/images/monthcalender.png +0 -0
  181. data/lib/wrb/documents/images/progressbar.png +0 -0
  182. data/lib/wrb/documents/images/radiobutton.png +0 -0
  183. data/lib/wrb/documents/images/rebar.png +0 -0
  184. data/lib/wrb/documents/images/richedit.png +0 -0
  185. data/lib/wrb/documents/images/splitter.png +0 -0
  186. data/lib/wrb/documents/images/static.png +0 -0
  187. data/lib/wrb/documents/images/statusbar.png +0 -0
  188. data/lib/wrb/documents/images/tabctrl.png +0 -0
  189. data/lib/wrb/documents/images/toolbar.png +0 -0
  190. data/lib/wrb/documents/images/tooltip.png +0 -0
  191. data/lib/wrb/documents/images/trackbar.png +0 -0
  192. data/lib/wrb/documents/images/treeview.png +0 -0
  193. data/lib/wrb/documents/images/updown.png +0 -0
  194. data/lib/wrb/documents/index.html +155 -0
  195. data/lib/wrb/documents/inifile.html +36 -0
  196. data/lib/wrb/documents/license.txt +22 -0
  197. data/lib/wrb/documents/listbox.html +96 -0
  198. data/lib/wrb/documents/listview.html +277 -0
  199. data/lib/wrb/documents/make_doc.rb +596 -0
  200. data/lib/wrb/documents/menu.html +144 -0
  201. data/lib/wrb/documents/menubar.html +54 -0
  202. data/lib/wrb/documents/monthcalender.html +48 -0
  203. data/lib/wrb/documents/openfilenamedlg.html +36 -0
  204. data/lib/wrb/documents/pager.html +63 -0
  205. data/lib/wrb/documents/panel.html +32 -0
  206. data/lib/wrb/documents/picture.html +48 -0
  207. data/lib/wrb/documents/printdlg.html +35 -0
  208. data/lib/wrb/documents/printdlgex.html +35 -0
  209. data/lib/wrb/documents/printer.html +40 -0
  210. data/lib/wrb/documents/progressbar.html +69 -0
  211. data/lib/wrb/documents/radiobutton.html +51 -0
  212. data/lib/wrb/documents/rebar.html +143 -0
  213. data/lib/wrb/documents/registry.html +36 -0
  214. data/lib/wrb/documents/richedit.html +232 -0
  215. data/lib/wrb/documents/samples/editimg.bmp +0 -0
  216. data/lib/wrb/documents/samples/editimg.iml +0 -0
  217. data/lib/wrb/documents/samples/fileimg.bmp +0 -0
  218. data/lib/wrb/documents/samples/fileimg.iml +0 -0
  219. data/lib/wrb/documents/samples/sample_button.rb +21 -0
  220. data/lib/wrb/documents/samples/sample_checkbox.rb +18 -0
  221. data/lib/wrb/documents/samples/sample_combobox.rb +18 -0
  222. data/lib/wrb/documents/samples/sample_comboboxex.rb +23 -0
  223. data/lib/wrb/documents/samples/sample_datetimepicker.rb +11 -0
  224. data/lib/wrb/documents/samples/sample_edit.rb +25 -0
  225. data/lib/wrb/documents/samples/sample_groupbox.rb +19 -0
  226. data/lib/wrb/documents/samples/sample_hotkeyctrl.rb +12 -0
  227. data/lib/wrb/documents/samples/sample_listbox.rb +12 -0
  228. data/lib/wrb/documents/samples/sample_listview.rb +32 -0
  229. data/lib/wrb/documents/samples/sample_menu.rb +21 -0
  230. data/lib/wrb/documents/samples/sample_menubar.rb +23 -0
  231. data/lib/wrb/documents/samples/sample_monthcalender.rb +11 -0
  232. data/lib/wrb/documents/samples/sample_progressbar.rb +14 -0
  233. data/lib/wrb/documents/samples/sample_radiobutton.rb +14 -0
  234. data/lib/wrb/documents/samples/sample_rebar.rb +25 -0
  235. data/lib/wrb/documents/samples/sample_richedit.rb +60 -0
  236. data/lib/wrb/documents/samples/sample_splitter.rb +33 -0
  237. data/lib/wrb/documents/samples/sample_static.rb +15 -0
  238. data/lib/wrb/documents/samples/sample_statusbar.rb +17 -0
  239. data/lib/wrb/documents/samples/sample_tabctrl.rb +19 -0
  240. data/lib/wrb/documents/samples/sample_toolbar.rb +29 -0
  241. data/lib/wrb/documents/samples/sample_tooltip.rb +50 -0
  242. data/lib/wrb/documents/samples/sample_trackbar.rb +30 -0
  243. data/lib/wrb/documents/samples/sample_treeview.rb +19 -0
  244. data/lib/wrb/documents/samples/sample_updown.rb +18 -0
  245. data/lib/wrb/documents/samples/sampleimg16.iml +0 -0
  246. data/lib/wrb/documents/samples/sampleimg32.iml +0 -0
  247. data/lib/wrb/documents/samples/samplemg16.png +0 -0
  248. data/lib/wrb/documents/samples/samplemg32.png +0 -0
  249. data/lib/wrb/documents/samples/wrb.ico +0 -0
  250. data/lib/wrb/documents/savefilenamedlg.html +19 -0
  251. data/lib/wrb/documents/scrollbar.html +60 -0
  252. data/lib/wrb/documents/splitter.html +96 -0
  253. data/lib/wrb/documents/static.html +84 -0
  254. data/lib/wrb/documents/statusbar.html +110 -0
  255. data/lib/wrb/documents/tabctrl.html +151 -0
  256. data/lib/wrb/documents/timer.html +43 -0
  257. data/lib/wrb/documents/toolbar.html +181 -0
  258. data/lib/wrb/documents/tooltip.html +131 -0
  259. data/lib/wrb/documents/trackbar.html +107 -0
  260. data/lib/wrb/documents/treeview.html +210 -0
  261. data/lib/wrb/documents/updown.html +85 -0
  262. data/lib/wrb/documents/wincontrol.html +258 -0
  263. data/lib/wrb/documents/window.html +499 -0
  264. data/lib/wrb/documents/wrb.css +228 -0
  265. data/lib/wrb/gmem.rb +26 -0
  266. data/lib/wrb/imecommon.rb +59 -0
  267. data/lib/wrb/listcommon.rb +185 -0
  268. data/lib/wrb/lzss.rb +126 -0
  269. data/lib/wrb/scrollinfo.rb +142 -0
  270. data/lib/wrb/toplevelcommon.rb +634 -0
  271. metadata +315 -0
@@ -0,0 +1,197 @@
1
+ require 'ripper'
2
+ require 'wrb'
3
+
4
+ module WR
5
+ class FDParseForm < Ripper::Filter
6
+ # Ripper::SCANNER_EVENTS -> [:CHAR, :__end__, :backref, :backtick, :comma, :comment, :const, :cvar, :embdoc, :embdoc_beg, :embdoc_end, :embexpr_beg, :embexpr_end, :embvar, :float, :gvar, :heredoc_beg, :heredoc_end, :ident, :ignored_nl, :imaginary, :int, :ivar, :kw, :label, :label_end, :lbrace, :lbracket, :lparen, :nl, :op, :period, :qsymbols_beg, :qwords_beg, :rational, :rbrace, :rbracket, :regexp_beg, :regexp_end, :rparen, :semicolon, :sp, :symbeg, :symbols_beg, :tlambda, :tlambeg, :tstring_beg, :tstring_content, :tstring_end, :words_beg, :words_sep]
7
+
8
+
9
+ # ParseData = Struct.new(:event, :text, :line, :column)
10
+
11
+ include RC
12
+
13
+ module ParseData
14
+ attr_accessor :attr, :line, :column
15
+ end
16
+
17
+ attr_reader :result
18
+
19
+ def initialize(src, fname=nil, lnno=1)
20
+ super(src, fname, lnno)
21
+ @result = []
22
+ @_depth = 0
23
+ @_lines = src.split(/\r?\n/)
24
+ @_can_modifier = nil
25
+ # dpp @_lines
26
+ end
27
+
28
+ ############## event handers ##############
29
+
30
+ def on_default(event, token, pd)# ; dpp lineno, event, token, pd
31
+ case event
32
+ when :on_int, :on_rbrace, :on_rbracket, :on_rparen
33
+ @_can_modifier = true
34
+ when :on_comma, :on_lbrace, :on_lbracket, :on_lparen, :on_ignored_nl
35
+ @_can_modifier = nil
36
+ end
37
+ pd << token if pd
38
+ end
39
+
40
+ def on_kw(token, pd)
41
+ case token
42
+ when 'class', 'def'
43
+ @_can_modifier = nil
44
+ @current_column = column
45
+ @_depth += 1
46
+ return token
47
+ when 'begin', 'case', 'do', 'module', 'while'
48
+ @_can_modifier = nil
49
+ @_depth += 1
50
+ when 'if', 'unless' #; dpp lineno, token, pd, @_can_modifier
51
+ if @_can_modifier
52
+ @_can_modifier = nil
53
+ else
54
+ @_depth += 1
55
+ end
56
+ # @_can_modifier = nil
57
+ when 'end'
58
+ @_can_modifier = true
59
+ @_depth -= 1
60
+ if @_in_the_initialize && @_depth < @_in_the_initialize
61
+ @_in_the_initialize = -1
62
+ end
63
+ if @_depth==1 #; dpp @_depth, lineno, column
64
+ token.extend(ParseData)
65
+ token.line = lineno - 1
66
+ token.column = column
67
+ return token
68
+ end
69
+ when 'self' #; dpp lineno, pd, token
70
+ @_can_modifier = true
71
+ if !pd && @_in_the_initialize == @_depth
72
+ token.extend(ParseData)
73
+ token.line = lineno - 1
74
+ token.column = column
75
+ return token
76
+ else
77
+ return pd << token if pd # Argument of method.
78
+ end
79
+ else
80
+ @_can_modifier = true
81
+ return pd << token if pd
82
+ end
83
+ nil
84
+ end
85
+
86
+ def on_ident(token, pd) # dpp [token, pd]
87
+ @_can_modifier = true
88
+ case token
89
+ when 'initialize'
90
+ if pd =~ /^def\s+/
91
+ @_in_the_initialize = @_depth
92
+ end
93
+ nil
94
+ when 'controls', '_', /^\_\w+/ #; dpp lineno, pd, token
95
+ if @_in_the_initialize == @_depth
96
+ unless pd
97
+ token.extend(ParseData)
98
+ token.line = lineno - 1
99
+ token.column = column
100
+ token
101
+ else
102
+ pd << token
103
+ end
104
+ end
105
+ else
106
+ case pd
107
+ when /^\_.*/, /^\_\w+\.*/, /^controls\W.*/, /^self\./ #
108
+ pd << token if pd
109
+ end
110
+ end
111
+ end
112
+
113
+ def on_op(token, pd)
114
+ @_can_modifier = nil
115
+ case token
116
+ when '<<'#; dpp pd
117
+ case pd
118
+ when /^\_.*/, /^controls\W.*/ #; dpp pd + token
119
+ pd << token
120
+ end
121
+ when '<' # inherited class
122
+ if pd =~ /^class\s+[A-Z][A-Za-z0-9_]*\s*/
123
+ pd << token
124
+ end
125
+ when '='
126
+ if pd =~ /^self\.\w+\s*/
127
+ pd << token
128
+ end
129
+ else #; dpp lineno, pd, token
130
+ pd << token if pd
131
+ end
132
+ end
133
+
134
+ def on_const(token, pd)
135
+ @_can_modifier = true
136
+ if pd =~ /^class\s+[A-Z][A-Za-z0-9_]*\s*<\s*/
137
+ case token
138
+ when 'Form', 'Dialog'
139
+ s = pd + token
140
+ s.extend(ParseData)
141
+ s.line = lineno - 1
142
+ s.column = @current_column
143
+ @result << [s]
144
+ @_in_the_form = true
145
+ else #; dpp lineno, pd, token
146
+ nil
147
+ # return pd << token
148
+ end
149
+ nil
150
+ elsif pd =~ /^class\s+/#; dpp lineno, pd, token
151
+ pd << token
152
+ elsif pd =~ /^self.\w+\s*\=.*/
153
+ pd << token
154
+ elsif pd #; dpp lineno, pd, token
155
+ # if File.exist?(WR_INSTALLED_DIR + "/wrb/components/#{token.downcase}.rb")
156
+ # require "wrb/components/#{token.downcase}.rb"
157
+ # pd << token
158
+ # elsif val = (eval(token) rescue nil)
159
+ # pd << token
160
+ # end
161
+ pd << token if (WR.module_eval(token) rescue nil)
162
+ else
163
+ end
164
+ end
165
+
166
+ def on_nl(token, pd)
167
+ @_can_modifier = nil
168
+ @result.last << pd if !@result.empty? && pd
169
+ nil
170
+ end
171
+
172
+ def on_semicolon(token, pd)
173
+ @_can_modifier = nil
174
+ @result.last << pd if !@result.empty? && pd
175
+ nil
176
+ end
177
+
178
+ def on_comment(token, pd)
179
+ @_can_modifier = nil
180
+ @result.last << pd if !@result.empty? && pd
181
+ nil
182
+ end
183
+ end
184
+ end
185
+
186
+ module WR
187
+ require 'pp'
188
+ fname = OpenFileNameDlg.show()
189
+ if fname
190
+ s = open(fname){|f| f.read}
191
+ src = FDParseForm.new(s, fname)
192
+ src.parse
193
+ # dpp src.result[0][0].line
194
+ p src.result
195
+
196
+ end
197
+ end if __FILE__ == $0
@@ -0,0 +1,1294 @@
1
+ # base.rb
2
+ # modules and classes for all windows components of wrb
3
+
4
+ module WR
5
+ require 'rwin' if __FILE__ == $0 # for self-testing
6
+
7
+ APP = RWin::Application
8
+ API = RWin::API
9
+ UNICODE = RWin::UNICODE
10
+ CancelDefWindowProc = APP::CancelDefWindowProc
11
+ NilID = nil.__id__
12
+
13
+ module ModAutoloading
14
+ def self.included(mod)
15
+ def mod.const_missing(id)
16
+ WR.const_missing(id)
17
+ end
18
+ end
19
+ end
20
+
21
+ def self.included(mod)
22
+ def mod.const_missing(id)
23
+ WR.const_missing(id)
24
+ end
25
+ end
26
+
27
+ def self.const_missing(id)
28
+ libname = id.to_s.downcase + ".rb"
29
+ begin
30
+ require(libname)
31
+ if const_defined?(id)
32
+ const_get(id)
33
+ else
34
+ super
35
+ end
36
+ rescue LoadError
37
+ super(id)
38
+ end
39
+ end
40
+
41
+ module RC # Module for gathering constants of resources and APIs.
42
+ ## window messages ##
43
+ WM_NULL = 0x0000
44
+ WM_CREATE = 0x0001
45
+ WM_DESTROY = 0x0002
46
+ WM_MOVE = 0x0003
47
+ WM_SIZE = 0x0005
48
+ WM_ACTIVATE = 0x0006
49
+ WM_SETFOCUS = 0x0007
50
+ WM_KILLFOCUS = 0x0008
51
+ WM_ENABLE = 0x000A
52
+ WM_SETREDRAW = 0x000B
53
+ WM_SETTEXT = 0x000C
54
+ WM_GETTEXT = 0x000D
55
+ WM_GETTEXTLENGTH = 0x000E
56
+ WM_PAINT = 0x000F
57
+ WM_CLOSE = 0x0010
58
+ WM_QUERYENDSESSION = 0x0011
59
+ WM_QUIT = 0x0012
60
+ WM_QUERYOPEN = 0x0013
61
+ WM_ERASEBKGND = 0x0014
62
+ WM_SYSCOLORCHANGE = 0x0015
63
+ WM_ENDSESSION = 0x0016
64
+ WM_SHOWWINDOW = 0x0018
65
+ WM_WININICHANGE = 0x001A
66
+ WM_SETTINGCHANGE = WM_WININICHANGE
67
+ WM_DEVMODECHANGE = 0x001B
68
+ WM_ACTIVATEAPP = 0x001C
69
+ WM_FONTCHANGE = 0x001D
70
+ WM_TIMECHANGE = 0x001E
71
+ WM_CANCELMODE = 0x001F
72
+ WM_SETCURSOR = 0x0020
73
+ WM_MOUSEACTIVATE = 0x0021
74
+ WM_CHILDACTIVATE = 0x0022
75
+ WM_QUEUESYNC = 0x0023
76
+ WM_GETMINMAXINFO = 0x0024
77
+ WM_PAINTICON = 0x0026
78
+ WM_ICONERASEBKGND = 0x0027
79
+ WM_NEXTDLGCTL = 0x0028
80
+ WM_SPOOLERSTATUS = 0x002A
81
+ WM_DRAWITEM = 0x002B
82
+ WM_MEASUREITEM = 0x002C
83
+ WM_DELETEITEM = 0x002D
84
+ WM_VKEYTOITEM = 0x002E
85
+ WM_CHARTOITEM = 0x002F
86
+ WM_SETFONT = 0x0030
87
+ WM_GETFONT = 0x0031
88
+ WM_NOTIFY = 0x004E
89
+ WM_CONTEXTMENU = 0x007B
90
+ WM_STYLECHANGING = 0x007C
91
+ WM_STYLECHANGED = 0x007D
92
+ WM_DISPLAYCHANGE = 0x007E
93
+ WM_GETICON = 0x007F
94
+ WM_SETICON = 0x0080
95
+ WM_KEYDOWN = 0x0100
96
+ WM_KEYUP = 0x0101
97
+ WM_CHAR = 0x0102
98
+ WM_DEADCHAR = 0x0103
99
+ WM_SYSKEYDOWN = 0x0104
100
+ WM_SYSKEYUP = 0x0105
101
+ WM_SYSCHAR = 0x0106
102
+ WM_SYSDEADCHAR = 0x0107
103
+ WM_UNICHAR = 0x0109
104
+ WM_INITDIALOG = 0x0110
105
+ WM_COMMAND = 0x0111
106
+ WM_SYSCOMMAND = 0x0112
107
+ WM_TIMER = 0x0113
108
+ WM_HSCROLL = 0x0114
109
+ WM_VSCROLL = 0x0115
110
+
111
+ WM_MOUSEMOVE = 0x0200
112
+ WM_LBUTTONDOWN = 0x0201
113
+ WM_LBUTTONUP = 0x0202
114
+ WM_LBUTTONDBLCLK = 0x0203
115
+ WM_RBUTTONDOWN = 0x0204
116
+ WM_RBUTTONUP = 0x0205
117
+ WM_RBUTTONDBLCLK = 0x0206
118
+ WM_MBUTTONDOWN = 0x0207
119
+ WM_MBUTTONUP = 0x0208
120
+ WM_MBUTTONDBLCLK = 0x0209
121
+ # WM_MOUSEWHEEL = 0x020A
122
+ # WM_MOUSELAST = 0x020A
123
+ WM_XBUTTONDOWN = 0x020B
124
+ WM_XBUTTONUP = 0x020C
125
+ WM_XBUTTONDBLCLK = 0x020D
126
+ WM_MOUSEWHEEL = 0x020E
127
+ WM_MOUSELAST = 0x020E
128
+ WM_PARENTNOTIFY = 0x0210
129
+ WM_ENTERMENULOOP = 0x0211
130
+ WM_EXITMENULOOP = 0x0212
131
+ WM_NEXTMENU = 0x0213
132
+ WM_SIZING = 0x0214
133
+ WM_CAPTURECHANGED = 0x0215
134
+ WM_MOVING = 0x0216
135
+ WM_POWERBROADCAST = 0x0218
136
+
137
+ WM_DROPFILES = 0x0233
138
+ WM_CUT = 0x0300
139
+ WM_COPY = 0x0301
140
+ WM_PASTE = 0x0302
141
+ WM_CLEAR = 0x0303
142
+ WM_UNDO = 0x0304
143
+ WM_HOTKEY = 0x0312
144
+ WM_USER = 0x0400
145
+ WM_APP = 0x8000
146
+
147
+ # Message of Non Client area
148
+ WM_NCCREATE = 0x0081
149
+ WM_NCDESTROY = 0x0082
150
+ WM_NCCALCSIZE = 0x0083
151
+ WM_NCHITTEST = 0x0084
152
+ WM_NCPAINT = 0x0085
153
+ WM_NCACTIVATE = 0x0086
154
+ WM_GETDLGCODE = 0x0087
155
+ WM_SYNCPAINT = 0x0088
156
+ WM_NCMOUSEMOVE = 0x00A0
157
+ WM_NCLBUTTONDOWN = 0x00A1
158
+ WM_NCLBUTTONUP = 0x00A2
159
+ WM_NCLBUTTONDBLCLK = 0x00A3
160
+ WM_NCRBUTTONDOWN = 0x00A4
161
+ WM_NCRBUTTONUP = 0x00A5
162
+ WM_NCRBUTTONDBLCLK = 0x00A6
163
+ WM_NCMBUTTONDOWN = 0x00A7
164
+ WM_NCMBUTTONUP = 0x00A8
165
+ WM_NCMBUTTONDBLCLK = 0x00A9
166
+ WM_NCXBUTTONDOWN = 0x00AB
167
+ WM_NCXBUTTONUP = 0x00AC
168
+ WM_NCXBUTTONDBLCLK = 0x00AD
169
+
170
+ ## window styles ##
171
+ WS_OVERLAPPED = 0
172
+ WS_TABSTOP = 0x00010000
173
+ WS_GROUP = 0x00020000
174
+ WS_THICKFRAME = 0x00040000
175
+ WS_SYSMENU = 0x00080000
176
+ WS_HSCROLL = 0x00100000
177
+ WS_VSCROLL = 0x00200000
178
+ WS_DLGFRAME = 0x00400000
179
+ WS_BORDER = 0x00800000
180
+ WS_CAPTION = 0x00c00000
181
+ WS_MAXIMIZE = 0x01000000
182
+ WS_CLIPCHILDREN = 0x02000000
183
+ WS_CLIPSIBLINGS = 0x04000000
184
+ WS_DISABLED = 0x08000000
185
+ WS_VISIBLE = 0x10000000
186
+ WS_MINIMIZE = 0x20000000
187
+ WS_CHILD = 0x40000000
188
+ WS_POPUP = 0x80000000
189
+ WS_VISIBLECHILD = 0x50000000
190
+ WS_ICONIC = 0x20000000
191
+ WS_CHILDWINDOW = 0x40000000
192
+ WS_MAXIMIZEBOX = 0x00010000
193
+ WS_MINIMIZEBOX = 0x00020000
194
+ WS_OVERLAPPEDWINDOW = 0x00CF0000
195
+ WS_POPUPWINDOW = 0x80880000
196
+ WS_SIZEBOX = 0x00040000
197
+ WS_TILED = 0
198
+ WS_TILEDWINDOW = 0x00CF0000
199
+
200
+ WS_EX_TOPMOST = 0x00000008
201
+ WS_EX_TRANSPARENT = 0x00000020
202
+ WS_EX_MDICHILD = 0x00000040
203
+ WS_EX_TOOLWINDOW = 0x00000080
204
+ WS_EX_CLIENTEDGE = 0x00000200
205
+ WS_EX_CONTEXTHELP = 0x00000400
206
+ WS_EX_APPWINDOW = 0x00040000
207
+ WS_EX_LAYERED = 0x00080000
208
+ WS_EX_COMPOSITED = 0x02000000
209
+
210
+ ## ShowWindow constants
211
+ SW_HIDE = 0
212
+ SW_SHOWNORMAL = 1
213
+ SW_NORMAL = 1
214
+ SW_SHOWMINIMIZED = 2
215
+ SW_SHOWMAXIMIZED = 3
216
+ SW_MAXIMIZE = 3
217
+ SW_SHOWNOACTIVATE = 4
218
+ SW_SHOW = 5
219
+ SW_MINIMIZE = 6
220
+ SW_SHOWMINNOACTIVE = 7
221
+ SW_SHOWNA = 8
222
+ SW_RESTORE = 9
223
+ SW_SHOWDEFAULT = 10
224
+ SW_FORCEMINIMIZE = 11
225
+ SW_MAX = 11
226
+
227
+ ## GetWindowLong constants ##
228
+ GWL_WNDPROC = -4
229
+ GWL_HINSTANCE = -6
230
+ GWL_HWNDPARENT = -8
231
+ GWL_STYLE = -16
232
+ GWL_EXSTYLE = -20
233
+ GWL_USERDATA = -21
234
+ GWL_ID = -12
235
+
236
+ ## mouse button and key states ##
237
+ MK_LBUTTON = 0x0001 # uses splitter.rb
238
+ MK_RBUTTON = 0x0002
239
+ MK_SHIFT = 0x0004
240
+ MK_CONTROL = 0x0008
241
+ MK_MBUTTON = 0x0010
242
+ MK_XBUTTON1 = 0x0020
243
+ MK_XBUTTON2 = 0x0040
244
+
245
+ ## logfont size ##
246
+ LF_FACESIZE = 32 # uses richedit.rb
247
+
248
+ ## icon sizes ##
249
+ ICON_SMALL = 0
250
+ ICON_BIG = 1
251
+ ICON_SMALL2 = 2
252
+
253
+ ## use default window size and position ##
254
+ CW_USEDEFAULT = 0x80000000 - 0x100000000
255
+
256
+ ## desktop window ##
257
+ HWND_DESKTOP = 0
258
+
259
+ ## pre defined structures ##
260
+ TCHAR = API::TCHAR
261
+ CHAR = API::CHAR
262
+ WORD = API::WORD
263
+ POINT = API::POINT
264
+ RECT = API::RECT
265
+
266
+ ## ownerdraw constants ##
267
+ ODT_MENU = 1
268
+ ODT_LISTBOX = 2
269
+ ODT_COMBOBOX = 3
270
+ ODT_BUTTON = 4
271
+ ODT_STATIC = 5
272
+
273
+ ODA_DRAWENTIRE = 0x0001
274
+ ODA_SELECT = 0x0002
275
+ ODA_FOCUS = 0x0004
276
+
277
+ ODS_SELECTED = 0x0001
278
+ ODS_GRAYED = 0x0002
279
+ ODS_DISABLED = 0x0004
280
+ ODS_CHECKED = 0x0008
281
+ ODS_FOCUS = 0x0010
282
+ ODS_DEFAULT = 0x0020
283
+ ODS_COMBOBOXEDIT = 0x1000
284
+ ODS_HOTLIGHT = 0x0040
285
+ ODS_INACTIVE = 0x0080
286
+ ODS_NOACCEL = 0x0100
287
+ ODS_NOFOCUSRECT = 0x0200
288
+
289
+ # code pages
290
+ CP_ACP = 0
291
+ CP_OEMCP = 1
292
+ CP_MACCP = 2
293
+ CP_THREAD_ACP = 3
294
+ CP_SYMBOL = 42
295
+ CP_UNICODE = 1200 # not defined in winnls.h but uses richedit.rb
296
+ CP_UTF7 = 65000
297
+ CP_UTF8 = 65001
298
+
299
+ # global memory
300
+ GMEM_FIXED = 0x0
301
+ GMEM_MOVEABLE = 0x2
302
+ GMEM_ZEROINIT = 0x40
303
+ GHND = (GMEM_MOVEABLE | GMEM_ZEROINIT)
304
+ GPTR = (GMEM_FIXED | GMEM_ZEROINIT)
305
+
306
+ HWND_TOP = 0
307
+ HWND_BOTTOM = 1
308
+ HWND_TOPMOST = -1
309
+ HWND_NOTOPMOST = -2
310
+
311
+ WA_INACTVE = 0
312
+ WA_ACTVE = 1
313
+ WA_CLICKACTIVE = 2
314
+
315
+ DRAWITEMSTRUCT = API.defstruct "
316
+ INT ctlType;
317
+ INT ctlID;
318
+ INT itemID;
319
+ INT itemAction;
320
+ INT itemState;
321
+ HWND hwndItem;
322
+ HDC hDC;
323
+ RECT rcItem;
324
+ INT itemData;"
325
+
326
+ MEASUREITEMSTRUCT = API.defstruct "
327
+ INT ctlType;
328
+ INT ctlID;
329
+ INT itemID;
330
+ INT itemWidth;
331
+ INT itemHeight;
332
+ INT itemData;"
333
+
334
+ SYSTEMTIME = API.defstruct "
335
+ WORD wYear;
336
+ WORD wMonth;
337
+ WORD wDayOfWeek;
338
+ WORD wDay;
339
+ WORD wHour;
340
+ WORD wMinute;
341
+ WORD wSecond;
342
+ WORD wMilliseconds;"
343
+
344
+ NMHDR = API.defstruct "
345
+ HWND hwndFrom;
346
+ ULONG_PTR idFrom;
347
+ ULONG code;"
348
+
349
+ WINDOWPOS = API.defstruct "
350
+ HWND hwnd;
351
+ HWND hwndInsertAfter;
352
+ int x;
353
+ int y;
354
+ int cx;
355
+ int cy;
356
+ UINT flags;"
357
+
358
+ end
359
+
360
+ ##### Utility functions #####
361
+ module RC
362
+ module_function
363
+ def LOWORD(i)
364
+ i & 0xffff
365
+ end
366
+ def HIWORD(i)
367
+ (i>>16) & 0xffff
368
+ end
369
+ def SPLITPARAM(i)
370
+ [LOWORD(i), HIWORD(i)]
371
+ end
372
+ def MAKELPARAM(lo, hi)
373
+ ((hi & 0xffff) << 16) | (lo & 0xffff)
374
+ end
375
+ def RGB(r, g, b)
376
+ (b << 16) + (g << 8) + r
377
+ end
378
+ def _T(s)
379
+ API.encode_output(s)
380
+ end
381
+ def _X(s)
382
+ API.encode_default(s)
383
+ end
384
+ def _I(s)
385
+ API.encode_internal(s)
386
+ end
387
+ end
388
+
389
+ ##### Base classes #####
390
+ module ModAccessor
391
+ module ModArrayAccess
392
+ def index(obj)
393
+ if obj.is_a?(Integer) && !block_given?
394
+ self.each_with_index{|val, i| return i if (val.idcmd rescue nil)==obj}
395
+ nil
396
+ else
397
+ super
398
+ end
399
+ end
400
+ end
401
+
402
+ attr_reader :_accessors
403
+ def _check_name(name)
404
+ raise NameError, "Name must be Symbol (but got #{name.class})." unless name.is_a? Symbol
405
+ str = name.to_s
406
+ if !(str =~ /^[a-z][a-zA-Z0-9_]*$/)
407
+ raise NameError ,"`#{str}' is not allowed for name of accessor.", caller(2)
408
+ end
409
+ end
410
+
411
+ def _define_access_method(name, obj)
412
+ instance_eval "def #{name}() @_accessors[:#{name}]; end"
413
+ @parent.instance_eval "def _#{name}() controls.#{name}; end"
414
+ end
415
+
416
+ def _add_accessor(obj, name) #dpp self, obj, name#, caller[0, 2]
417
+ @_accessors ||= {}
418
+ raise "Need name for accessor" unless name
419
+ _check_name(name)
420
+ if obj1=@_accessors[name]
421
+ @_accessors[name] = [obj1].extend(ModArrayAccess) unless obj1.is_a? Array
422
+ @_accessors[name] << obj
423
+ else
424
+ @_accessors[name] = obj
425
+ _define_access_method(name, obj)
426
+ end
427
+ obj
428
+ end
429
+
430
+ def _delete_accessor(name, idx=nil)
431
+ if (obj1=@_accessors[name]).is_a?(Array) && obj1.size>1
432
+ raise ArgumentError, "Need index" unless idx
433
+ if idx.is_a?(Integer) && idx <= ModParent::ItemBaseID
434
+ obj1.delete_at(idx)
435
+ else
436
+ obj1.delete(idx)
437
+ end
438
+ @_accessors[name] = obj1[0] if obj1.size == 1
439
+ else
440
+ @_accessors.delete(name)
441
+ instance_eval "undef #{name} if defined?(#{name})"
442
+ end
443
+ end
444
+
445
+ def _delete_accessor_by_obj(obj)
446
+ @_accessors.each{|k, v|
447
+ if v.is_a?(Array)
448
+ if r=v.delete(obj)
449
+ @_accessors[k] = v[0] if v.size==1
450
+ break
451
+ else
452
+ next
453
+ end
454
+ elsif v==obj
455
+ @_accessors.delete_if{|k, v| v==obj}
456
+ instance_eval "undef #{k} if defined?(#{k})"
457
+ break
458
+ end
459
+ }
460
+ end
461
+ end # ModAccessor
462
+
463
+ class Collection < Array
464
+ undef +, -, *, &, |, assoc, at, clone, concat, push, shift, slice
465
+ alias _dup dup
466
+ alias _clear clear
467
+ alias _each each
468
+ alias _equal? equal?
469
+ alias _index index
470
+ alias _map map
471
+ alias _delete delete
472
+ alias _delete_at delete_at
473
+ alias _pop pop
474
+ alias _size size
475
+ end
476
+
477
+ class Controls < Collection
478
+ attr_reader :parent, :receiver
479
+ include ModAccessor
480
+
481
+ def initialize(parent, receiver=parent, sendto=nil) #; dpp self, parent, receiver, caller
482
+ raise "parent must be RWin::Window" if parent && !parent.is_a?(RWin::Window) &&
483
+ !parent.is_a?(RWin::Dialog)
484
+ @parent = parent
485
+ @receiver = receiver
486
+ @sendto = sendto
487
+ end
488
+
489
+ def <<(*args)
490
+ args = args[0] if args[0].is_a?(Array)
491
+ if args[0].respond_to?(:create)
492
+ ret = args[0]
493
+ ret.parent ||= @parent
494
+ elsif args[0].is_a?(Class)
495
+ klass = args.shift
496
+ ret = klass.new(@parent, *args)
497
+ elsif args[0].is_a?(Controls)
498
+ ret = args[0]
499
+ else
500
+ ret = args[0]
501
+ end
502
+
503
+ if @parent && @parent.controls.equal?(self) # is root?
504
+ _add_accessor(ret, ret.name)
505
+ # super(ret)
506
+ end
507
+
508
+ ret.idcmd = @receiver.new_control_id if ret.respond_to?(:idcmd=) && !ret.idcmd
509
+ ret.class::DefaultEvents.each{|i|
510
+ msg, submsg, template, klass = ret.acceptable_events[i]
511
+ handlername = "#{ret.name}_#{i.to_s}"
512
+ @receiver.set_msgtranslator(msg) unless @receiver.get_msgtranslator(msg)
513
+ @receiver.register_event(ret.idcmd, msg, submsg, handlername, template, klass, @sendto)
514
+ } if defined? ret.class::DefaultEvents
515
+
516
+ if ret.respond_to?(:create) && @parent.alive?
517
+ ret.create
518
+ if f=parent.inheritfont && ret.is_a?(RWin::Window)
519
+ if (hf=ret.SendMessage(RC::WM_GETFONT, 0, 0))==0 || hf==Font::SystemFontHandle
520
+ ret.font = @parent.SendMessage(RC::WM_GETFONT, 0, 0)
521
+ elsif f==:force
522
+ ret.font = @parent.SendMessage(RC::WM_GETFONT, 0, 0)
523
+ end
524
+ end
525
+ end
526
+ super(ret)
527
+ ret
528
+ end
529
+
530
+ def [](arg)
531
+ if arg.is_a?(Integer)
532
+ arg > ModParent::ItemBaseID ? self.find{|i| i.idcmd == arg} : super(arg)
533
+ elsif arg.is_a?(String) || arg.is_a?(Symbol)
534
+ sym = arg.intern
535
+ self.find{|i| i.name == sym}
536
+ elsif arg.is_a?(WinControl)
537
+ self._index(arg)
538
+ else
539
+ raise "Type #{arg.class} is not allowed"
540
+ end
541
+ end
542
+
543
+ def _delete(ctl)
544
+ if @_accessors && (ar=@_accessors[ctl.name]).is_a?(Array)
545
+ ar.delete(ctl)
546
+ @_accessors[ctl.name] = ar[0] if ar.size == 1
547
+ else
548
+ self._delete_accessor(ctl.name)
549
+ if @parent && ctl.respond_to?(:idcmd)
550
+ @parent.registered_messages.each{|msg| @parent.unregister_event(ctl.idcmd, msg)}
551
+ end
552
+ end
553
+ if ctl.respond_to?(:alive?) && ctl.alive?
554
+ if ctl.respond_to?(:close)
555
+ ctl.close
556
+ elsif ctl.respond_to?(:destroy) # for Menu
557
+ ctl.destroy
558
+ end
559
+ end
560
+ super
561
+ end
562
+ alias delete _delete
563
+
564
+ def _show()
565
+ self._each{|i| i.visible = true}
566
+ end
567
+
568
+ def _hide()
569
+ self._each{|i| i.visible = false}
570
+ end
571
+
572
+ def _create()
573
+ self._each{|i|
574
+ if i.is_a?(WinControl) && !i.alive? #; dp "@i=%p, parent=%p", i, i.parent
575
+ i.create
576
+ elsif i.is_a?(Controls)
577
+ i._create
578
+ elsif !i.is_a?(RWin::Window) && i.respond_to?(:create)
579
+ i.create
580
+ end
581
+ }
582
+ end
583
+
584
+ def __move(x, y, w, h)
585
+ self._each{|i| i.__move(x, y, w, h) if respond_to?(:__move)}
586
+ end
587
+ end # Controls
588
+
589
+ class Margin
590
+ attr_accessor :x, :y, :w, :h
591
+ attr_reader :target, :left, :top, :right, :bottom
592
+
593
+ def self.[](*args)
594
+ self.new(*args)
595
+ end
596
+
597
+ def initialize(*args)
598
+ raise ArgumentError, "No arguments" if args.empty?
599
+ self.target = args.shift if args[0].is_a? RWin::Window
600
+ @left, @top, @right, @bottom = args
601
+ end
602
+
603
+ def target=(target)
604
+ @target = target
605
+ @x, @y = target.clientpos
606
+ @w, @h = target.windowsize
607
+ end
608
+
609
+ def move(x, y, w, h) #; dpp x, y, w, h
610
+ @x, @y, @w, @h = x, y, w, h
611
+ end
612
+
613
+ def to_s()
614
+ [@left, @top, @right, @bottom].to_s
615
+ end
616
+
617
+ def set(l, t, r, b)
618
+ @left, @top, @right, @bottom = l, t, r, b
619
+ @target.__move(0,0,*target.parent.clientsize) if @target.parent
620
+ end
621
+
622
+ def left=(l)
623
+ @left = l
624
+ @target.__move(0,0,*target.parent.clientsize) if @target.parent
625
+ end
626
+
627
+ def top=(t)
628
+ @top = t
629
+ @target.__move(0,0,*target.parent.clientsize) if @target.parent
630
+ end
631
+
632
+ def right=(r)
633
+ @right = r
634
+ @target.__move(0,0,*target.parent.clientsize) if @target.parent
635
+ end
636
+
637
+ def bottom=(b) #; dpp @x, @y, @w, @h
638
+ @bottom = b
639
+ @target.__move(0,0,*target.parent.clientsize) if @target.parent
640
+ end
641
+
642
+ def to_a()
643
+ [@left, @top, @right, @bottom]
644
+ end
645
+
646
+ def origin()
647
+ [@x, @y, @w, @h]
648
+ end
649
+
650
+ alias l left
651
+ alias t top
652
+ alias r right
653
+ alias b bottom
654
+ end # Margin
655
+
656
+ ##### Fonts #####
657
+ class Font < RWin::Font
658
+ include RC
659
+ def self.[](*args) self.new(*args); end
660
+
661
+ SystemFontHandle = API.GetStockObject(13) # SYSTEM_FONT
662
+
663
+ def initialize(*args)
664
+ if (str=args[2]).is_a?(String) || str.is_a?(Symbol)
665
+ b, i, u, s = nil
666
+ b = str.index('b') ? 700 : nil
667
+ i = !str.index('i').nil?
668
+ u = !str.index('u').nil?
669
+ s = !str.index('s').nil?
670
+ super(args[0], args[1], b, i, u, s)
671
+ else
672
+ super
673
+ end
674
+ end
675
+
676
+ def inspect()
677
+ sprintf("<%p:%#x %s, %d, %#x>", self.class, __id__, facename, height, _hfont)
678
+ end
679
+
680
+ def to_a()
681
+ attrstr.empty? ? [facename, height] : [facename, height, attrstr]
682
+ end
683
+
684
+ def weight()
685
+ logfont.lfWeight
686
+ end
687
+ def italic()
688
+ logfont.lfItalic==1 ? true : nil
689
+ end
690
+ def underline()
691
+ logfont.lfUnderline==1 ? true : nil
692
+ end
693
+ def strikeout()
694
+ logfont.lfStrikeOut==1 ? true : nil
695
+ end
696
+
697
+ def attrstr()
698
+ lf = self.logfont
699
+ atr = ""
700
+ atr << 'b' if lf.lfWeight==700
701
+ atr << 'i' if lf.lfItalic==1
702
+ atr << 'u' if lf.lfUnderline==1
703
+ atr << 's' if lf.lfStrikeOut==1
704
+ atr
705
+ end
706
+ end # Font
707
+
708
+ ##### Base modules #####
709
+ module ModParent
710
+ include RC
711
+ ItemBaseID = 0xfff
712
+
713
+ def controls()
714
+ @controls ||= Controls.new(self)
715
+ end
716
+ alias _ controls
717
+
718
+ def new_control_id()
719
+ unless parent # toplevel window
720
+ @curret_id ||= ItemBaseID
721
+ @curret_id += 1
722
+ else # use toplevel window's
723
+ parent.new_control_id
724
+ end
725
+ end
726
+
727
+ def font=(arg)
728
+ if alive?
729
+ phf = SendMessage(WM_GETFONT, 0, 0)
730
+ super
731
+ hf = SendMessage(WM_GETFONT, 0, 0)
732
+ if hf!=0
733
+ controls.each{|i|
734
+ next unless i.is_a?(Window)
735
+ next unless i.alive?
736
+ if @_inheritfont==:force
737
+ i.font = hf
738
+ else
739
+ cfont = i.SendMessage(WM_GETFONT, 0, 0)
740
+ i.font = hf if cfont!=0 && cfont==phf
741
+ end
742
+ }
743
+ end
744
+ else
745
+ @_font = arg.is_a?(Array) ? Font.new(*arg) : arg
746
+ end
747
+ end
748
+
749
+ def inheritfont=(f)
750
+ if alive?
751
+ f = [f] unless f.is_a?(Array)
752
+ case f.last
753
+ when :force, true, false, nil
754
+ @_inheritfont = f.pop
755
+ @_inheritfont = nil if @_inheritfont==false
756
+ return unless @_inheritfont
757
+ end
758
+ @_inheritfont ||= true
759
+ unless f.empty?
760
+ self.font = f[0].is_a?(RWin::Font) ? f[0] : f
761
+ end
762
+ hfont = SendMessage(WM_GETFONT, 0, 0)
763
+ controls.each{|i| #; dpp i, i.font
764
+ next unless i.respond_to?(:font)
765
+ hf = i.SendMessage(WM_GETFONT, 0, 0)
766
+ if hf==0 || hf==Font::SystemFontHandle
767
+ i.font = hfont
768
+ i.inheritfont = @_inheritfont if i.respond_to?(:inheritfont)
769
+ elsif @_inheritfont==:force && hf==i.default_hfont
770
+ i.font = hfont
771
+ i.inheritfont=:force if i.respond_to?(:inheritfont)
772
+ end
773
+ } if self.font
774
+ else
775
+ @_inheritfont = f
776
+ end
777
+ end
778
+ def inheritfont(*args)
779
+ return @_inheritfont if args.empty?
780
+ self.inheritfont = *args
781
+ end
782
+
783
+ def create()
784
+ super
785
+ controls._create
786
+ self.inheritfont = @_inheritfont if @_inheritfont
787
+ register_event(WM_SIZE, "__resize__", "xh")# SetMenu sends WM_SIZE before children created
788
+ __send__(:created) if respond_to?(:created)
789
+ self
790
+ end
791
+
792
+ def idcmd2ref(id)
793
+ APP.hwnd2ref(API.GetDlgItem(self._hwnd, id))
794
+ end
795
+
796
+ def __resize__(w, h)
797
+ @controls.each{|i| i.__move(0, 0, w, h) if i.respond_to?(:__move)}
798
+ end
799
+ end # ModParent
800
+
801
+ module ModCreateWin
802
+ attr_reader :default_hfont
803
+ def create() #; dp "@%p, style=%#x", self, @_style
804
+ @_style &= ~RC::WS_VISIBLE if @_visible==false
805
+ __create__(@_classname, @_caption.to_s, @_x, @_y, @_w, @_h, @_parent, @_idcmd, @_style,
806
+ @_exstyle.to_i)
807
+ self.accept_events *@_events if @_events
808
+ @default_hfont = SendMessage(RC::WM_GETFONT, 0, 0)
809
+ self.font = @_font if @_font
810
+ self.visible = @_visible if @_visible
811
+ self.setorder(@_zorder) if @_zorder
812
+ self.margin = @_margin if @_margin
813
+ set_subclass(@_setsubclass) if @_setsubclass
814
+ self
815
+ end
816
+ # alias _create create
817
+ end # ModCreateWin
818
+
819
+ module ModBaseWin
820
+ include RC
821
+ PreDefinedEvents = {}
822
+
823
+ def CancelDefWindowProc(arg=nil)
824
+ APP.CancelDefWindowProc(arg)
825
+ end
826
+
827
+ attr_reader :_deny_font_inherit
828
+ def inspect()
829
+ sprintf("#<%p: 0x%x @name=%p, @_idcmd=%p>", self.class, self.__id__, @name, @_idcmd)
830
+ end
831
+
832
+ def classname()
833
+ if alive?
834
+ buff = TCHAR[128]
835
+ GetClassname(_hwnd, buff, buff.size)
836
+ buff.to_s
837
+ else
838
+ @_classname
839
+ end
840
+ end
841
+
842
+ def acceptable_events()
843
+ @_acceptable_events ||= {}.update(PreDefinedEvents)
844
+ end
845
+
846
+ def accept_events(*args)
847
+ return @_events = args[0].is_a?(Array) ? args[0] : args unless alive?
848
+ target = nil
849
+ args.each{|i|
850
+ if i.is_a?(Window)
851
+ target = i
852
+ next
853
+ elsif target
854
+ target.accept_events(i)
855
+ next
856
+ end
857
+ if i.is_a?(Symbol) #; dpp acceptable_events
858
+ a = acceptable_events[nm=i]
859
+ raise "#{i} is not defined in #{self.inspect}" unless a
860
+ else
861
+ raise "#{i.inspect} is not allowed."
862
+ end
863
+ case a[0]
864
+ when WM_COMMAND, WM_NOTIFY
865
+ msg, submsg, template, klass = a
866
+ handlername = "#{self.name}_#{nm}"
867
+ parent.set_msgtranslator(msg) unless @_parent.get_msgtranslator(msg)
868
+ parent.register_event(self.idcmd, msg, submsg, handlername, template, klass)
869
+ else
870
+ msg, template, klass = a
871
+ handlername = "self_#{nm}"
872
+ register_event(msg, handlername, template, klass)
873
+ end
874
+ }
875
+ end
876
+ alias events= accept_events
877
+
878
+ def move(*args)
879
+ if alive?
880
+ super
881
+ else
882
+ case args.size
883
+ when 2, 3
884
+ @_x, @_y = args
885
+ when 4, 5
886
+ @_x, @_y, @_w, @_h = args
887
+ else
888
+ raise ArgumentError, "illegal num of args:#{args.size}"
889
+ end
890
+ end
891
+ end
892
+
893
+ def resize(w, h)
894
+ return super if alive?
895
+ @_w = w
896
+ @_h = h
897
+ end
898
+ def size=(args)
899
+ resize(*args)
900
+ end
901
+ alias windowsize= size=
902
+
903
+ def x
904
+ alive? ? super : @_x
905
+ end
906
+ def x=(_x)
907
+ alive? ? super : @_x = _x
908
+ end
909
+
910
+ def y
911
+ alive? ? super : @_y
912
+ end
913
+ def y=(_y)
914
+ alive? ? super : @_y = _y
915
+ end
916
+
917
+ def w
918
+ alive? ? super : @_w
919
+ end
920
+ def w=(_w)
921
+ alive? ? super : @_w = _w
922
+ end
923
+
924
+ def h
925
+ alive? ? super : @_h
926
+ end
927
+ def h=(_h)
928
+ alive? ? super : @_h = _h
929
+ end
930
+
931
+ def focused?()
932
+ API.GetFocus == self._hwnd
933
+ end
934
+
935
+ def active?()
936
+ API.GetActiveWindow == self._hwnd
937
+ end
938
+
939
+ def setorder(wnd)
940
+ alive? ? super : @_zorder = wnd
941
+ end
942
+
943
+ def refresh(*args)
944
+ super
945
+ end
946
+
947
+ def caption()
948
+ alive? ? super : @_caption
949
+ end
950
+ def caption=(s)
951
+ alive? ? super : @_caption = s
952
+ end
953
+
954
+ def style()
955
+ alive? ? GetWindowLong(GWL_STYLE) : @_style || self.class::DefaultWindowStyle
956
+ end
957
+ def style=(st)
958
+ alive? ? SetWindowLong(GWL_STYLE, st) : @_style = st
959
+ end
960
+
961
+ def exstyle()
962
+ alive? ? GetWindowLong(GWL_EXSTYLE) : @_exstyle || 0
963
+ end
964
+ def exstyle=(st)
965
+ alive? ? SetWindowLong(GWL_EXSTYLE, st) : @_exstyle = st
966
+ end
967
+
968
+ def _sym2style(styles, args)
969
+ args = args[0] if args[0].is_a?(Array)
970
+ st = 0
971
+ while args.last.is_a?(Symbol)
972
+ i = self.class::styles[args.pop].to_i
973
+ i < 0 ? st &= i.abs : st |= i
974
+ end
975
+ st
976
+ end
977
+ private :_sym2style
978
+
979
+ def sym2style(styles, *args)
980
+ _sym2style(self.class::WinExStyles, args)
981
+ end
982
+
983
+ def sym2exstyle(styles, *args)
984
+ _sym2style(self.class::WinExStyles, args)
985
+ end
986
+
987
+ def clientpos()
988
+ alive? ? super : [@_x, @_y]
989
+ end
990
+ def windowsize()
991
+ alive? ? super : [@_w, @_h]
992
+ end
993
+ alias size windowsize
994
+
995
+ def font()
996
+ if alive?
997
+ return @_font if @_font
998
+ hfont = SendMessage(WM_GETFONT, 0, 0)
999
+ hfont==0 ? nil : WR::Font.wraphandle(hfont)
1000
+ else
1001
+ @_font
1002
+ end
1003
+ end
1004
+
1005
+ # font=[Font, Array, Window, HFONT, :parent, nil]
1006
+ # If given nil: Use default but allow if default is SYSTEM_FONT or nil, else deny.
1007
+ def font=(arg)
1008
+ if alive?
1009
+ @_font = nil
1010
+ if arg.nil? || arg==0
1011
+ r = SendMessage(WM_SETFONT, 0, 1)
1012
+ @default_hfont = SendMessage(WM_GETFONT, 0, 0)
1013
+ return r
1014
+ elsif arg==:parent || arg==:p
1015
+ hf = parent.SendMessage(WM_GETFONT, 0, 0)
1016
+ elsif arg.is_a?(Integer)
1017
+ hf = arg
1018
+ elsif arg.is_a?(Window)
1019
+ hf = arg.SendMessage(WM_GETFONT, 0, 0)
1020
+ elsif arg.is_a?(Array)
1021
+ if !arg[0].is_a?(String) || !arg[1].is_a?(Integer)
1022
+ raise ArgumentError, "Need facename and height", caller(1)
1023
+ end
1024
+ @_font = Font.new(*arg) # keep Font object in this window
1025
+ hf = @_font._hfont
1026
+ elsif arg.is_a?(RWin::Font)
1027
+ @_font = arg # keep Font object in this window
1028
+ hf = arg._hfont
1029
+ else
1030
+ raise ArgumentError, "Unrecognized argument: #{arg.inspect}", caller(1)
1031
+ end
1032
+ SendMessage(WM_SETFONT, hf, 1) #== 0 ? nil : true
1033
+ else # dpp arg
1034
+ @_font = arg
1035
+ end
1036
+ end
1037
+
1038
+ def parent() #; dpp [alive?, self]
1039
+ alive? ? super : @_parent
1040
+ end
1041
+ def parent=(arg)
1042
+ alive? ? super(arg) : @_parent = arg
1043
+ end
1044
+
1045
+ def visible()
1046
+ alive? ? super : @_visible
1047
+ end
1048
+ def visible=(state)
1049
+ alive? ? super : @_visible = state
1050
+ end
1051
+ def show()
1052
+ self.visible = true
1053
+ self
1054
+ end
1055
+ def hide()
1056
+ self.visible = false
1057
+ self
1058
+ end
1059
+ def showna()
1060
+ self.visible = SW_SHOWNA
1061
+ self
1062
+ end
1063
+
1064
+ SubclassedHandlers = {
1065
+ :activate => [WM_ACTIVATE, 'hi'],
1066
+ :paint => [WM_PAINT, 'c'],
1067
+ :keydown => [WM_KEYDOWN, 'ih'],
1068
+ :keyup => [WM_KEYUP, 'ih'],
1069
+ :char => [WM_CHAR, 'ih'],
1070
+ :syskeydown => [WM_SYSKEYDOWN, 'ih'],
1071
+ :syskeyup => [WM_SYSKEYUP, 'ih'],
1072
+ :syschar => [WM_SYSCHAR, 'ih'],
1073
+ :mousemove => [WM_MOUSEMOVE, 'ih'],
1074
+ :move => [WM_MOVE, 'ih'],
1075
+ :resize => [WM_SIZE, 'ih'],
1076
+ :lbuttondown => [WM_LBUTTONDOWN, 'ih'],
1077
+ :lbuttonup => [WM_LBUTTONUP, 'ih'],
1078
+ :lbuttondblclk => [WM_LBUTTONDBLCLK, 'ih'],
1079
+ :rbuttondown => [WM_RBUTTONDOWN, 'ih'],
1080
+ :rbuttonup => [WM_RBUTTONUP, 'ih'],
1081
+ :rbuttondblclk => [WM_RBUTTONDBLCLK, 'ih'],
1082
+ :mbuttondown => [WM_MBUTTONDOWN, 'ih'],
1083
+ :mbuttonup => [WM_MBUTTONUP, 'ih'],
1084
+ :mbuttondblclk => [WM_MBUTTONDBLCLK, 'ih'],
1085
+ :xbuttondown => [WM_XBUTTONDOWN, 'ih'],
1086
+ :xbuttonup => [WM_XBUTTONUP, 'ih'],
1087
+ :xbuttondblclk => [WM_XBUTTONDBLCLK, 'ih'],
1088
+ :close => [WM_CLOSE, 'ih'],
1089
+ :setcursor => [WM_SETCURSOR, 'ih'],
1090
+ :contextmenu => [WM_CONTEXTMENU, 'ih']
1091
+ }
1092
+
1093
+ end # ModBaseWin
1094
+
1095
+ module ModStdCtrl
1096
+ include RC
1097
+ def create(*args)
1098
+ super
1099
+ unless parent.controls.receiver.get_msgtranslator(WM_COMMAND)
1100
+ parent.controls.receiver.set_msgtranslator(WM_COMMAND)
1101
+ end
1102
+ end
1103
+ end # ModStdCtrl
1104
+
1105
+ module ModCommCtrl
1106
+ include RC
1107
+ def self.included(mod)
1108
+ require 'wrb/commctrlconst.rb'
1109
+ end
1110
+
1111
+ def create(*)
1112
+ unless parent.controls.receiver.get_msgtranslator(WM_NOTIFY)
1113
+ parent.controls.receiver.set_msgtranslator(WM_NOTIFY)
1114
+ end
1115
+ super
1116
+ end
1117
+
1118
+ protected
1119
+ def _apply_options(arg)
1120
+ if st = CCStyles[arg]
1121
+ self.style |= st
1122
+ return nil
1123
+ end
1124
+ super
1125
+ end
1126
+ end # ModStdCtrl
1127
+
1128
+ ##### winodw classes #####
1129
+
1130
+ class Window < RWin::Window # The root of all windows
1131
+ # PreDefinedEvents = {}
1132
+ alias __create__ create
1133
+ include RC
1134
+ include ModAutoloading
1135
+ include ModBaseWin, ModCreateWin
1136
+
1137
+ alias size windowsize
1138
+ def size=(arg)
1139
+ raise ArgumentError, "Argument must be [w, h]" unless arg.is_a?(Array)
1140
+ resize *arg
1141
+ end
1142
+
1143
+ def position()
1144
+ [self.x, self.y]
1145
+ end
1146
+ def position=(args)
1147
+ x, y = args
1148
+ move(x, y)
1149
+ end
1150
+ end # Window
1151
+
1152
+ class WinControl < Window # The root of child windows
1153
+ undef RegisterHotKey, UnregisterHotKey
1154
+ attr_reader :name
1155
+ alias :_name :name
1156
+
1157
+ DefaultWindowStyle = WS_VISIBLECHILD
1158
+ DefaultEvents = []
1159
+
1160
+ def self.[](*args)#; dpp args
1161
+ self.new(*args)
1162
+ end
1163
+
1164
+ def initialize(*args)
1165
+ if args[0].is_a? RWin::Window
1166
+ @_parent = args.shift
1167
+ end
1168
+ raise ArgumentError, "Control name must be Symbol." unless args[0].is_a? Symbol
1169
+ @_style = DefaultWindowStyle
1170
+ @name = args.shift
1171
+ optionfuncs = args.pop if args.last.is_a?(Hash)
1172
+ @__unplocessed = []
1173
+ while args.last.is_a? Symbol
1174
+ r = _apply_options(args.pop)
1175
+ @__unplocessed << r if r
1176
+ end
1177
+ @_caption = args.shift if args[0].is_a? String
1178
+ case args.size
1179
+ when 4
1180
+ rect = args
1181
+ when 5
1182
+ obj = args.pop
1183
+ obj.is_a?(Integer) ? self.style = WS_VISIBLECHILD | obj : @__remain_arg__ = obj
1184
+ rect = args
1185
+ else
1186
+ raise ArgumentError, "Illegal num of argument"
1187
+ end
1188
+ self.move(*rect)
1189
+ optionfuncs.each{|k, v| __send__(k.to_s + '=', v)} if optionfuncs
1190
+ end
1191
+
1192
+ def idcmd()
1193
+ alive? ? super : @_idcmd;
1194
+ end
1195
+ def idcmd=(id)
1196
+ alive? ? super : @_idcmd = id
1197
+ end
1198
+
1199
+ def enabled()
1200
+ (self.style & WS_ENABLED) != 0
1201
+ end
1202
+ def enabled=(f)
1203
+ f ? self.style &= ~WS_DISABLED : self.style |= WS_DISABLED
1204
+ end
1205
+
1206
+ def delete()
1207
+ parent.controls._delete(self)
1208
+ parent
1209
+ end
1210
+
1211
+ def name=(nm)
1212
+ parent.controls._delete_accessor(name)
1213
+ parent.controls._add_accessor(self, nm.intern)
1214
+ @name = nm.intern
1215
+ end
1216
+
1217
+ def margin()
1218
+ @_margin
1219
+ end
1220
+ def margin=(arg)
1221
+ if arg.is_a? Array
1222
+ @_margin = Margin.new(self) unless @_margin
1223
+ @_margin.set(*arg)
1224
+ elsif arg.is_a?(Margin)
1225
+ @_margin = Margin.new(self) unless @_margin
1226
+ @_margin.set(arg.left, arg.top, arg.right, arg.bottom)
1227
+ elsif arg.nil?
1228
+ return unless @_margin
1229
+ self.move(@_margin.x, @_margin.y, @_margin.w, @_margin.h)
1230
+ @_margin = nil
1231
+ else
1232
+ raise ArgumentError, "argument: #{arg.inspect} is not allowed", caller(1)
1233
+ end
1234
+ parent.SendMessage(WM_SIZE, 0, MAKELPARAM(*parent.clientsize)) if alive?
1235
+ end
1236
+
1237
+ def get_toplevel_win()
1238
+ parent.get_toplevel_win
1239
+ end
1240
+
1241
+ def __move(x, y, w, h)
1242
+ return if !@_margin || !@_margin.target
1243
+ l, t, r, b = @_margin.left, @_margin.top, @_margin.right, @_margin.bottom
1244
+ _x = l ? x+l : (r ? x+w-r-@_margin.w : @_margin.x)
1245
+ _y = t ? y+t : (b ? y+h-b-@_margin.h : @_margin.y);
1246
+ _w = (r && l) ? (w - l - r) : @_margin.w
1247
+ _h = (b && t) ? (h - t - b) : @_margin.h
1248
+ self.move(_x, _y, _w, _h)
1249
+ end
1250
+
1251
+ def set_subclass(f=true)
1252
+ raise "argument must be `true' or `false'" if f!=true && f!=false
1253
+ if alive?
1254
+ @_setsubclass = f
1255
+ if f
1256
+ PreDefinedEvents.update(SubclassedHandlers)
1257
+ SetWindowSubclass()
1258
+ else
1259
+ PreDefinedEvents.reject!{|k, v| SubclassedHandlers[k]}
1260
+ RemoveWindowSubclass()
1261
+ end
1262
+ else
1263
+ @_setsubclass = f
1264
+ end
1265
+ self
1266
+ end
1267
+
1268
+ def is_subclassing()
1269
+ @_setsubclass ? true : false
1270
+ end
1271
+
1272
+ WinStyles = {
1273
+ :tabstop => WS_TABSTOP,
1274
+ :group => WS_GROUP,
1275
+ :disabled => WS_DISABLED,
1276
+ :hscroll => WS_HSCROLL,
1277
+ :vscroll => WS_VSCROLL,
1278
+ :border => WS_BORDER
1279
+ }
1280
+
1281
+ protected
1282
+ def _apply_options(arg)
1283
+ if arg == :parentfont
1284
+ @parentfont = true
1285
+ return nil
1286
+ end
1287
+ if st=WinStyles[arg]
1288
+ self.style |= st
1289
+ return nil
1290
+ end
1291
+ arg
1292
+ end
1293
+ end # WinControl
1294
+ end