exerb 6.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (179) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +8 -0
  3. data/ChangeLog.ja.rd +305 -0
  4. data/README.en.txt +12 -0
  5. data/README.ja.html +143 -0
  6. data/README.ja.txt +6 -0
  7. data/README.md +50 -0
  8. data/Rakefile +205 -0
  9. data/bin/exerb +185 -0
  10. data/bin/mkexy +47 -0
  11. data/doc/LGPL +513 -0
  12. data/doc/class.ja.html +92 -0
  13. data/doc/command.ja.html +109 -0
  14. data/doc/core.ja.html +72 -0
  15. data/doc/example.ja.html +89 -0
  16. data/doc/faq.ja.html +59 -0
  17. data/doc/inside.ja.rd +404 -0
  18. data/doc/license.ja.html +62 -0
  19. data/doc/logo.gif +0 -0
  20. data/doc/misc.ja.html +72 -0
  21. data/doc/navi.gif +0 -0
  22. data/doc/recipe.ja.html +317 -0
  23. data/doc/style.css +187 -0
  24. data/doc/tutorial.ja.html +182 -0
  25. data/example/Makefile +54 -0
  26. data/example/cat_n.rb +14 -0
  27. data/example/exception.rb +9 -0
  28. data/example/ext/Win32API.so +0 -0
  29. data/example/ext/swin.so +0 -0
  30. data/example/msgbox.rb +14 -0
  31. data/example/rubytk.rb +22 -0
  32. data/example/runtime.ico +0 -0
  33. data/example/runtime.rb +19 -0
  34. data/example/vr/clipboard.rb +106 -0
  35. data/example/vr/compat/rubycompat.rb +18 -0
  36. data/example/vr/compat/vrcomctl.rb +12 -0
  37. data/example/vr/compat/vrcontrol.rb +50 -0
  38. data/example/vr/compat/vrmmedia.rb +24 -0
  39. data/example/vr/contrib/inifile.rb +116 -0
  40. data/example/vr/contrib/msgboxconst.rb +55 -0
  41. data/example/vr/contrib/toolbar.rb +371 -0
  42. data/example/vr/contrib/vrctlcolor.rb +110 -0
  43. data/example/vr/contrib/vrhotkey.rb +35 -0
  44. data/example/vr/contrib/vrlistviewex.rb +71 -0
  45. data/example/vr/contrib/vrstdscrollbar.rb +414 -0
  46. data/example/vr/contrib/vrwincomponent.rb +54 -0
  47. data/example/vr/dragdropformat.rb +209 -0
  48. data/example/vr/rscutil.rb +168 -0
  49. data/example/vr/sysmod.rb +249 -0
  50. data/example/vr/vractivex.rb +56 -0
  51. data/example/vr/vrclipboard.rb +53 -0
  52. data/example/vr/vrcomctl.rb +1819 -0
  53. data/example/vr/vrcontrol.rb +1374 -0
  54. data/example/vr/vrdde.rb +623 -0
  55. data/example/vr/vrddrop.rb +190 -0
  56. data/example/vr/vrdialog.rb +406 -0
  57. data/example/vr/vrhandler.rb +195 -0
  58. data/example/vr/vrlayout.old.rb +209 -0
  59. data/example/vr/vrlayout.rb +173 -0
  60. data/example/vr/vrlayout2.rb +340 -0
  61. data/example/vr/vrmargin.rb +141 -0
  62. data/example/vr/vrmgdlayout.rb +381 -0
  63. data/example/vr/vrmmedia.rb +287 -0
  64. data/example/vr/vrolednd.rb +192 -0
  65. data/example/vr/vrowndraw.rb +108 -0
  66. data/example/vr/vrrichedit.rb +366 -0
  67. data/example/vr/vrtimer.rb +148 -0
  68. data/example/vr/vrtooltip.rb +273 -0
  69. data/example/vr/vrtray.rb +143 -0
  70. data/example/vr/vrtvitem.rb +118 -0
  71. data/example/vr/vrtwopane.rb +223 -0
  72. data/example/vr/vruby.rb +1051 -0
  73. data/example/vr/winconst.rb +158 -0
  74. data/example/vruby.rb +38 -0
  75. data/exerb.gemspec +26 -0
  76. data/extconf.rb +7 -0
  77. data/lib/exerb/archive.rb +143 -0
  78. data/lib/exerb/config.rb +51 -0
  79. data/lib/exerb/error.rb +15 -0
  80. data/lib/exerb/executable.rb +68 -0
  81. data/lib/exerb/file_table.rb +189 -0
  82. data/lib/exerb/mkexy.rb +81 -0
  83. data/lib/exerb/name_table.rb +120 -0
  84. data/lib/exerb/recipe.rb +465 -0
  85. data/lib/exerb/resource.rb +190 -0
  86. data/lib/exerb/resource/base.rb +29 -0
  87. data/lib/exerb/resource/binary.rb +31 -0
  88. data/lib/exerb/resource/dialog.rb +30 -0
  89. data/lib/exerb/resource/group_icon.rb +85 -0
  90. data/lib/exerb/resource/icon.rb +52 -0
  91. data/lib/exerb/resource/version_info.rb +155 -0
  92. data/lib/exerb/resource_library.rb +120 -0
  93. data/lib/exerb/utility.rb +95 -0
  94. data/lib/exerb/utility2.rb +122 -0
  95. data/lib/exerb/version.rb +13 -0
  96. data/lib/exerb/win32/const/resource.rb +51 -0
  97. data/lib/exerb/win32/icon_file.rb +78 -0
  98. data/lib/exerb/win32/pe_file.rb +59 -0
  99. data/lib/exerb/win32/resource_directory.rb +105 -0
  100. data/lib/exerb/win32/resource_directory_root.rb +67 -0
  101. data/lib/exerb/win32/resource_entry.rb +98 -0
  102. data/lib/exerb/win32/struct/base.rb +43 -0
  103. data/lib/exerb/win32/struct/icon_dir_entry.rb +83 -0
  104. data/lib/exerb/win32/struct/icon_header.rb +43 -0
  105. data/lib/exerb/win32/struct/icon_res_entry.rb +48 -0
  106. data/lib/exerb/win32/struct/image_dos_header.rb +73 -0
  107. data/lib/exerb/win32/struct/image_file_header.rb +47 -0
  108. data/lib/exerb/win32/struct/image_nt_headers32.rb +53 -0
  109. data/lib/exerb/win32/struct/image_optional_header32.rb +107 -0
  110. data/lib/exerb/win32/struct/image_resource_data_entry.rb +45 -0
  111. data/lib/exerb/win32/struct/image_resource_directory.rb +47 -0
  112. data/lib/exerb/win32/struct/image_resource_directory_entry.rb +72 -0
  113. data/lib/exerb/win32/struct/image_section_header.rb +53 -0
  114. data/lib/exerb/win32/struct/version_info_block.rb +75 -0
  115. data/lib/exerb/win32/struct/vs_fixed_file_info.rb +62 -0
  116. data/src/exerb/cui.c +48 -0
  117. data/src/exerb/default.rb +1 -0
  118. data/src/exerb/exerb.c +877 -0
  119. data/src/exerb/exerb.h +92 -0
  120. data/src/exerb/gui.c +176 -0
  121. data/src/exerb/module.c +138 -0
  122. data/src/exerb/module.h +7 -0
  123. data/src/exerb/patch.c +27 -0
  124. data/src/exerb/resource.h +22 -0
  125. data/src/exerb/resource.rc +121 -0
  126. data/src/exerb/ruby.ico +0 -0
  127. data/src/exerb/utility.c +263 -0
  128. data/src/exerb/utility.h +33 -0
  129. data/test/alltests.rb +16 -0
  130. data/test/test-argv.rb +26 -0
  131. data/test/test-argv/test-argv.rb +9 -0
  132. data/test/test-argv/test-argv.ret +1 -0
  133. data/test/test-dollarzero.rb +26 -0
  134. data/test/test-dollarzero/test-dollarzero.rb +10 -0
  135. data/test/test-dollarzero/test-dollarzero.ret +2 -0
  136. data/test/test-dot.rb +26 -0
  137. data/test/test-dot/dot.dot.dot.rb +9 -0
  138. data/test/test-dot/dot.dot.rb +9 -0
  139. data/test/test-dot/test-dot.rb +13 -0
  140. data/test/test-dot/test-dot.ret +5 -0
  141. data/test/test-exitcode.rb +28 -0
  142. data/test/test-exitcode/test-exitcode.rb +9 -0
  143. data/test/test-kcode.rb +43 -0
  144. data/test/test-kcode/euc.rb +10 -0
  145. data/test/test-kcode/euc.ret +2 -0
  146. data/test/test-kcode/none.rb +10 -0
  147. data/test/test-kcode/none.ret +2 -0
  148. data/test/test-kcode/sjis.rb +10 -0
  149. data/test/test-kcode/sjis.ret +2 -0
  150. data/test/test-kcode/utf8.rb +10 -0
  151. data/test/test-kcode/utf8.ret +2 -0
  152. data/test/test-loadpath.rb +24 -0
  153. data/test/test-loadpath/test-loadpath.rb +9 -0
  154. data/test/test-nest.rb +18 -0
  155. data/test/test-nest/foo.rb +1 -0
  156. data/test/test-nest/foo/bar.rb +2 -0
  157. data/test/test-nest/foo/foo.rb +1 -0
  158. data/test/test-nest/test-nest.rb +1 -0
  159. data/test/test-nest/test-nest.ret +1 -0
  160. data/test/test-preload.rb +24 -0
  161. data/test/test-preload/test-preload.rb +9 -0
  162. data/test/test-regexp.rb +26 -0
  163. data/test/test-regexp/test-regexp.rb +23 -0
  164. data/test/test-regexp/test-regexp.ret +13 -0
  165. data/test/test-require1.rb +26 -0
  166. data/test/test-require1/require1.rb +9 -0
  167. data/test/test-require1/require2.rb +9 -0
  168. data/test/test-require1/require3.rb +9 -0
  169. data/test/test-require1/require4.rb +9 -0
  170. data/test/test-require1/require5.rb +9 -0
  171. data/test/test-require1/require6.rb +9 -0
  172. data/test/test-require1/test-require1.rb +41 -0
  173. data/test/test-require1/test-require1.ret +27 -0
  174. data/test/test-socket.rb +26 -0
  175. data/test/test-socket/test-socket.rb +7 -0
  176. data/test/test-socket/test-socket.ret +1 -0
  177. data/test/testcase.rb +66 -0
  178. data/vendor/mkexports.rb +167 -0
  179. metadata +352 -0
@@ -0,0 +1,381 @@
1
+ ###################################
2
+ #
3
+ # vrmgdlayout.rb
4
+ #
5
+ # Programmed by yukimi_sake <yukimi_sake@mbi.nifty.com>
6
+ # Copyright 2003-2004 Yukio Sakaue
7
+ #
8
+ ###################################
9
+
10
+ require 'vr/vrmargin'
11
+ require 'vr/vrlayout2'
12
+
13
+ module VRMarginedFrameUseable
14
+ =begin
15
+ == VRMarginedFrameUseable
16
+ This is a extension of VRParent for enable to use WM_SIZE message handler.
17
+ === Extended methods
18
+ --- setMarginedFrame(class,*args)
19
+ Register class on VRParent and setups WM_SIZE message handler.
20
+ =end
21
+
22
+ include VRMessageHandler
23
+ def vrinit
24
+ super
25
+ vrmarginedframe_init
26
+ end
27
+
28
+ def vrmarginedframe_init
29
+ addHandler(WMsg::WM_SIZE, "vrmgresize", MSGTYPE::ARGLINTINT,nil)
30
+ acceptEvents [WMsg::WM_SIZE]
31
+ end
32
+
33
+ def setMarginedFrame(klass,*args)
34
+ raise "Only one margined frame can set this window." if
35
+ @__regsterd_vr_margined_frame
36
+ if klass <= VRTwoPaneFrame
37
+ @__regsterd_vr_margined_frame=klass.new(args[0],args[1]).setup(self)
38
+ elsif klass <= VRGridLayoutFrame
39
+ @__regsterd_vr_margined_frame=klass.new(args[0],args[1])
40
+ else
41
+ @__regsterd_vr_margined_frame=klass.new
42
+ end
43
+
44
+ def self.self_vrmgresize(w,h)
45
+ @__regsterd_vr_margined_frame.move(0,0,w,h) if
46
+ @__regsterd_vr_margined_frame
47
+ end
48
+ sendMessage(WMsg::WM_SIZE, 0, MAKELPARAM(self.w, self.h))
49
+ @__regsterd_vr_margined_frame
50
+ end
51
+
52
+ module VRMgdLayoutFrame
53
+ =begin
54
+ == VRMgdLayoutFrame
55
+ This is the extension of VRLayoutFrame.
56
+ All classes are extended VRMargin which enables client's spacing.
57
+ And following methods are available.
58
+ === Extended method of instance
59
+ --- VRGridLayoutFrame#register(*cntl)
60
+ Allowd Arrays as arguments
61
+ --- VRMgdFullsizeLayoutFrame#_vr_relayout
62
+ Redefined for that all clients are received same 'move(x,y,w,h)' method.
63
+ =end
64
+
65
+ include VRMargin
66
+ def initialize()
67
+ self.initMargin(0,0,0,0)
68
+ @_vr_layoutclients=[]
69
+ @_vr_lx,@_vr_ly,@_vr_lw,@_vr_lh = 0,0,10,10
70
+ end
71
+ def register(*cntl)
72
+ @_vr_layoutclients.concat(cntl.flatten.map{|i|
73
+ i.extend(VRMargin).initMargin(0,0,0,0)})
74
+ _vr_relayout
75
+ end
76
+ end
77
+
78
+ class VRMgdVertLayoutFrame < VRVertLayoutFrame
79
+ include VRMgdLayoutFrame
80
+ end
81
+
82
+ class VRMgdHorizLayoutFrame < VRHorizLayoutFrame
83
+ include VRMgdLayoutFrame
84
+ end
85
+
86
+ class VRMgdFullsizeLayoutFrame < VRFullsizeLayoutFrame
87
+ include VRMgdLayoutFrame
88
+ def _vr_relayout
89
+ return if @_vr_layoutclients.size==0
90
+ @_vr_layoutclients.each_index do |i|
91
+ @_vr_layoutclients[i].move @_vr_lx, @_vr_ly,@_vr_lw,@_vr_lh
92
+ end
93
+ end
94
+ end
95
+
96
+ class VRMgdGridLayoutFrame < VRGridLayoutFrame
97
+ include VRMargin
98
+ def initialize(xs,ys)
99
+ self.initMargin(0,0,0,0)
100
+ super
101
+ end
102
+ def register(*cntl)
103
+ if cntl[0].is_a? Array
104
+ cntl.each{|i| i[0].extend(VRMargin).initMargin(0,0,0,0); super(*i)}
105
+ else
106
+ cntl[0].extend(VRMargin).initMargin(0,0,0,0)
107
+ super
108
+ end
109
+ end
110
+ end
111
+
112
+ module VRMgdTwoPaneFrame
113
+ =begin
114
+ == VRMgdTwoPaneFrame
115
+ This is the extension of VRPaneFrame.
116
+ All classes are extended VRMargin which enables client's spacing.
117
+ And extended class has following methods and constants.
118
+
119
+ === Extended methods
120
+ ---position
121
+ ---position=
122
+ Position of splitter.
123
+ If it is a positive integer, it means the distance from the left or top edge.
124
+ If negative, it calculates opposite side.
125
+ If this value sets, 'ratio' will be reseted.
126
+ 'ratio' and 'position' are exclusive each other.
127
+ ===R/W attributes
128
+ ---bevel
129
+ It is the form of the edge of a gap.You can draw it like below.
130
+ bevel=[[0x000000,0xffffff],[0xffffff,0x000000]]
131
+ First one is left/top feature,other is right/botm.
132
+ Drawn line in an order from an outside.
133
+ or
134
+ bevel=VRSplitter::BevelGroove1
135
+ see below constants.
136
+ ---gap
137
+ space between panes.
138
+ ===Class constants
139
+ ---BevelNone
140
+ ---BevelGroove1
141
+ ---BevelGroove2
142
+ ---BevelRaise1
143
+ ---BevelRaise2
144
+ ---BevelSunken1
145
+ ---BevelSunken2
146
+ =end
147
+ include VRMargin
148
+
149
+ BevelNone = [[],[]]
150
+ BevelGroove1 = [[0x666666,0xffffff],[0xffffff,0x666666]]
151
+ BevelGroove2 = [[0x666666,0xffffff,0x666666,0xffffff],
152
+ [0xffffff,0x666666,0xffffff,0x666666]]
153
+ BevelRaise1 = [[0xffffff],[0x666666]]
154
+ BevelRaise2 = [[0xffffff,0xffffff],[0x666666,0x666666]]
155
+ BevelSunken1 = [[0x666666],[0xffffff]]
156
+ BevelSunken2 = [[0x666666,0x666666],[0xffffff,0xffffff]]
157
+
158
+ attr :ratio
159
+ attr :bevel
160
+ attr :position
161
+
162
+ module VRTwoPaneFrame::VRTwoPaneFrameUsable
163
+ def _vr_twopaneframesinit
164
+ return if defined?(@_vr_twopaneframes) # no init twice
165
+ @_vr_twopaneframes = Array.new
166
+ @_vr_current_tpframe=nil
167
+ addHandler(
168
+ WMsg::WM_LBUTTONUP, "vrsepl2buttonup", MSGTYPE::ARGINTSINTSINT,nil)
169
+ addHandler(
170
+ WMsg::WM_LBUTTONDOWN,"vrsepl2buttondown",MSGTYPE::ARGINTSINTSINT,nil)
171
+ addHandler(
172
+ WMsg::WM_MOUSEMOVE, "vrsepl2mousemove", MSGTYPE::ARGINTSINTSINT,nil)
173
+ addHandler(WMsg::WM_PAINT, "vrsepl2paint", MSGTYPE::ARGNONE,nil)
174
+
175
+ acceptEvents [
176
+ WMsg::WM_LBUTTONUP,WMsg::WM_LBUTTONDOWN,WMsg::WM_MOUSEMOVE,
177
+ WMsg::WM_PAINT]
178
+ end
179
+
180
+ def self_vrsepl2paint
181
+ @_vr_twopaneframes.each do |f|
182
+ f._vr_draw_bevel(self)
183
+ end
184
+ end
185
+
186
+ end
187
+
188
+ def initialize(pane1,pane2)
189
+ def set_margin_to_panes(pn)
190
+ if pn.is_a? Array
191
+ pn.each{|i| i.extend(VRMargin).initMargin(0,0,0,0)}
192
+ elsif pn
193
+ pn.extend(VRMargin).initMargin(0,0,0,0)
194
+ end
195
+ end
196
+ super
197
+ self.initMargin(0,0,0,0)
198
+ set_margin_to_panes(@pane1)
199
+ set_margin_to_panes(@pane2)
200
+ @bevel=BevelNone
201
+ end
202
+
203
+ def position=(pos)
204
+ return unless pos.is_a?(Integer)
205
+ @position=pos
206
+ @ratio=nil
207
+ self._vr_relayout if @_vr_lw && @_vr_lh
208
+ end
209
+
210
+ def ratio=(r)
211
+ return unless r.is_a?(Float) && ((0.0 <= r) && (r <= 1.0))
212
+ @ratio=r
213
+ @position=nil
214
+ self._vr_relayout if @_vr_lw && @_vr_lh
215
+ end
216
+
217
+ def bevel=(b)
218
+ @bevel=b
219
+ self._vr_relayout if @_vr_lw && @_vr_lh
220
+ end
221
+
222
+ def gap(); @separatorheight; end
223
+ def gap=(h)
224
+ @separatorheight=h
225
+ self._vr_relayout if @_vr_lw && @_vr_lh
226
+ end
227
+ end
228
+
229
+ class VRMgdVertTwoPaneFrame < VRVertTwoPaneFrame
230
+ include VRMgdTwoPaneFrame
231
+ attr :uLimit,1
232
+ attr :lLimit,1
233
+ def initialize(p1,p2)
234
+ super
235
+ @uLimit = 0; @lLimit = 0
236
+ end
237
+
238
+ def splitterDragging(x,y)
239
+ return if y<@separatorheight+@_vr_ly+@uLimit or
240
+ y>@_vr_ly+@_vr_lh-@separatorheight-@lLimit
241
+ if @ratio then
242
+ @ratio=(y-@_vr_ly).to_f/@_vr_lh
243
+ elsif @position < 0
244
+ @position = y - @_vr_lh - @_vr_ly
245
+ else
246
+ @position = y - @_vr_ly
247
+ end
248
+
249
+ case(splitter_operation_type)
250
+ when SPLITTER_MOVEWINDOW
251
+ _vr_relayout(y-@_vr_ly)
252
+ when SPLITTER_DRAWLINE
253
+ w = window_parent
254
+ w.dopaint do |hdc|
255
+ w.setBrush(RGB(0x255,0x255,0x255))
256
+ if @_vr_splitter_last then
257
+ VRTwoPaneFrame::PatBlt.call(hdc,*@_vr_splitter_last)
258
+ end
259
+ current=[@_vr_lx,y,@_vr_lw,@separatorheight,0x5a0049] # PATINVERT
260
+ VRTwoPaneFrame::PatBlt.call(hdc,*current)
261
+ @_vr_splitter_last = current
262
+ end
263
+ end
264
+ end
265
+
266
+ def _vr_relayout(ys =
267
+ if @ratio then (@_vr_lh*@ratio).to_i
268
+ elsif @position < 0
269
+ @_vr_lh + @position
270
+ else
271
+ @position
272
+ end )
273
+ sh=(@separatorheight/2).to_i
274
+ @_vr_lxs,@_vr_lxe = @_vr_lx,@_vr_lx+@_vr_lw
275
+ @_vr_lys,@_vr_lye = @_vr_ly+ys-sh,@_vr_ly+ys+sh
276
+ if @pane1.is_a? Array
277
+ @pane1.each{|i| i.move(@_vr_lx,@_vr_ly,@_vr_lw,ys-sh)}
278
+ elsif @pane1
279
+ @pane1.move(@_vr_lx,@_vr_ly,@_vr_lw,ys-sh)
280
+ end
281
+ if @pane2.is_a? Array
282
+ @pane2.each{|i| i.move(@_vr_lx,@_vr_lys+@separatorheight, @_vr_lw,
283
+ @_vr_lh-ys-sh)}
284
+ elsif @pane2
285
+ @pane2.move(@_vr_lx,@_vr_lys+@separatorheight, @_vr_lw,@_vr_lh-ys-sh)
286
+ end
287
+ end
288
+
289
+ def _vr_draw_bevel(win)
290
+ return unless @_vr_lxs
291
+ win.dopaint do
292
+ @bevel[0].each_with_index{|cl,idx|
293
+ win.setPen(@bevel[0][idx],1)
294
+ win.grMoveTo(@_vr_lxs+idx,@_vr_lye-idx-1)
295
+ win.grLineTo(@_vr_lxs+idx,@_vr_lys+idx)
296
+ win.grLineTo(@_vr_lxe-idx,@_vr_lys+idx)
297
+ win.setPen(@bevel[1][idx],1)
298
+ win.grMoveTo(@_vr_lxe-idx-1,@_vr_lys+idx)
299
+ win.grLineTo(@_vr_lxe-idx-1,@_vr_lye-idx-1)
300
+ win.grLineTo(@_vr_lxs+idx,@_vr_lye-idx-1)
301
+ }
302
+ end
303
+ end
304
+ end
305
+
306
+ class VRMgdHorizTwoPaneFrame < VRHorizTwoPaneFrame
307
+ include VRMgdTwoPaneFrame
308
+ attr :rLimit,1
309
+ attr :lLimit,1
310
+ def initialize(p1,p2)
311
+ super
312
+ @rLimit = 0; @lLimit = 0
313
+ end
314
+ def splitterDragging(x,y)
315
+ return if x<@separatorheight+@_vr_lx+@lLimit or
316
+ x>@_vr_lx+@_vr_lw-@separatorheight-@rLimit
317
+ if @ratio then
318
+ @ratio=(x-@_vr_lx).to_f/@_vr_lw
319
+ elsif @position < 0
320
+ @position = x - @_vr_lw - @_vr_lx
321
+ else
322
+ @position = x - @_vr_lx
323
+ end
324
+ case splitter_operation_type
325
+ when SPLITTER_MOVEWINDOW
326
+ _vr_relayout(x-@_vr_lx)
327
+ when SPLITTER_DRAWLINE
328
+ w = window_parent
329
+ w.dopaint do |hdc|
330
+ w.setBrush(RGB(0x255,0x255,0x255))
331
+ if @_vr_splitter_last then
332
+ VRTwoPaneFrame::PatBlt.call(hdc,*@_vr_splitter_last)
333
+ end
334
+ current=[x,@_vr_ly,@separatorheight,@_vr_lh,0x5a0049] # PATINVERT
335
+ VRTwoPaneFrame::PatBlt.call(hdc,*current)
336
+ @_vr_splitter_last = current
337
+ end
338
+ end
339
+ end
340
+
341
+ def _vr_relayout(xs =
342
+ if @ratio then (@_vr_lw*@ratio).to_i
343
+ elsif @position < 0
344
+ @_vr_lw + @position
345
+ else
346
+ @position
347
+ end)
348
+ sh=(@separatorheight/2).to_i
349
+ @_vr_lxs,@_vr_lxe = @_vr_lx+xs-sh,@_vr_lx+xs+sh
350
+ @_vr_lys,@_vr_lye = @_vr_ly,@_vr_ly+@_vr_lh
351
+
352
+ if @pane1.is_a? Array then
353
+ @pane1.each{|i| i.move(@_vr_lx,@_vr_ly,xs-sh,@_vr_lh)}
354
+ elsif @pane1
355
+ @pane1.move(@_vr_lx,@_vr_ly,xs-sh,@_vr_lh)
356
+ end
357
+ if @pane2.is_a? Array
358
+ @pane2.each{|i| i.move(@_vr_lxs+@separatorheight,@_vr_ly,
359
+ @_vr_lw-xs-sh, @_vr_lh)}
360
+ elsif @pane2
361
+ @pane2.move(@_vr_lxs+@separatorheight,@_vr_ly, @_vr_lw-xs-sh, @_vr_lh)
362
+ end
363
+ end
364
+
365
+ def _vr_draw_bevel(win)
366
+ return unless @_vr_lxs
367
+ win.dopaint do
368
+ @bevel[0].each_with_index{|cl,idx|
369
+ win.setPen(@bevel[0][idx],1)
370
+ win.grMoveTo(@_vr_lxe-idx-1,@_vr_lys+idx+1)
371
+ win.grLineTo(@_vr_lxs+idx,@_vr_lys+idx+1)
372
+ win.grLineTo(@_vr_lxs+idx,@_vr_lye-idx)
373
+ win.setPen(@bevel[1][idx],1)
374
+ win.grMoveTo(@_vr_lxs+idx,@_vr_ly+@_vr_lh-idx-1)
375
+ win.grLineTo(@_vr_lxe-idx-1,@_vr_lye-idx-1)
376
+ win.grLineTo(@_vr_lxe-idx-1,@_vr_lys+idx)
377
+ }
378
+ end
379
+ end
380
+ end
381
+ end
@@ -0,0 +1,287 @@
1
+ ###################################
2
+ #
3
+ # vrmmedia.rb
4
+ # Programmed by nyasu <nyasu@osk.3web.ne.jp>
5
+ # Copyright 1999-2005 Nishikawa,Yasuhiro
6
+ #
7
+ # More information at http://vruby.sourceforge.net/index.html
8
+ #
9
+ # Good Reference: vfw.h
10
+ #
11
+ ###################################
12
+
13
+ VR_DIR="vr/" unless defined?(::VR_DIR)
14
+ require VR_DIR+'vrcontrol'
15
+ require 'Win32API'
16
+
17
+ =begin
18
+ = VisualuRuby(tmp) modules for MCI
19
+ =end
20
+
21
+
22
+ #if RUBY_VERSION<"1.4.4" then # Quick Hacking..
23
+ # require 'DLLManager'
24
+ # DLLManager.load("msvfw32.dll")
25
+ #end
26
+
27
+ MCIWndRegisterClass = Win32API.new("msvfw32","MCIWndRegisterClass",[],"I")
28
+ MCIWndRegisterClass.call
29
+
30
+
31
+ module VRMediaViewContainer
32
+ =begin
33
+ == VRMediaViewContainer
34
+ This module provides a message handler for MCI messages.
35
+ VRForm includes this module automatically loading "vrmmedia.rb".
36
+ =end
37
+ include VRMessageHandler
38
+
39
+ def vrinit
40
+ super
41
+ mediaviewcontainerinit
42
+ end
43
+
44
+ def mediaviewcontainerinit
45
+ addHandler(VRMediaView::MCIWNDM_NOTIFYMODE,
46
+ "mmnotifies",MSGTYPE::ARGPASS,nil)
47
+ addHandler(VRMediaView::MCIWNDM_NOTIFYERROR,
48
+ "mmnotifies",MSGTYPE::ARGPASS,nil)
49
+ addHandler(VRMediaView::MCIWNDM_NOTIFYSIZE,
50
+ "mmnotifies",MSGTYPE::ARGPASS,nil)
51
+ addHandler(VRMediaView::MCIWNDM_NOTIFYMEDIA,
52
+ "mmnotifies",MSGTYPE::ARGPASS,nil)
53
+ acceptEvents [ VRMediaView::MCIWNDM_NOTIFYMODE,
54
+ VRMediaView::MCIWNDM_NOTIFYSIZE,
55
+ VRMediaView::MCIWNDM_NOTIFYMEDIA,
56
+ VRMediaView::MCIWNDM_NOTIFYERROR ]
57
+
58
+ addNoRelayMessages [ VRMediaView::MCIWNDM_NOTIFYMODE,
59
+ VRMediaView::MCIWNDM_NOTIFYSIZE,
60
+ VRMediaView::MCIWNDM_NOTIFYMEDIA,
61
+ VRMediaView::MCIWNDM_NOTIFYERROR ]
62
+ end
63
+
64
+ def self_mmnotifies(msg)
65
+ ct=@_vr_mediaviewers_hwnd[msg.wParam]
66
+ return unless ct
67
+ messageid=msg.msg
68
+
69
+ return unless ct._vr_mmhandlers and ct._vr_mmhandlers[messageid]
70
+
71
+ ct._vr_mmhandlers[messageid].each do |shandler|
72
+ args=msgarg2handlerarg(shandler[1],msg,shandler[2])
73
+ ct.__send__(shandler[0],*args) if ct.respond_to?(shandler[0])
74
+ msg.retval = controlmsg_dispatching(ct,shandler[0],*args)
75
+ end
76
+ end
77
+
78
+ def addControl(*args)
79
+ @_vr_mediaviewers_hwnd={} unless defined?(@_vr_mediaviewers_hwnd)
80
+ a=super
81
+ @_vr_mediaviewers_hwnd[a.hWnd]=a if a.is_a?(VRMediaView)
82
+ return a
83
+ end
84
+ end
85
+
86
+ module VRContainersSet
87
+ include VRMediaViewContainer
88
+ INITIALIZERS.push :mediaviewcontainerinit
89
+ end
90
+
91
+
92
+ #####
93
+
94
+ module VRMediaViewModeNotifier
95
+ include VRMediaViewContainer
96
+
97
+ =begin
98
+ == VRMediaViewModeNotifier
99
+ This module is to use another event handlers for mci.
100
+ These new handlers are not relayed to parent by VRMessageParentRelayer.
101
+ (Use setnotifier() as setnotifier("cname1_cname2))
102
+
103
+ === Methods
104
+ --- setnotifier(cname)
105
+ This enables ((<VRMediaView>))'s other event handlers such as cname_stopped,
106
+ cname_playing,cname_paused and cname_open, named after
107
+ ((<VRMediaView>))#modestring.
108
+ =end
109
+
110
+ def setnotifier(cname)
111
+ instance_eval(
112
+ "def "+cname+"_modechanged(n)\n" +
113
+ " fname='#{cname}_'+@#{cname}.modestring(n) \n" +
114
+ " __send__(fname) if respond_to?(fname) \n" +
115
+ "end\n"
116
+ )
117
+ end
118
+ end
119
+
120
+
121
+ class VRMediaView < VRControl
122
+ =begin
123
+ == VRMediaView
124
+ This is a control window to play multimedia files.
125
+
126
+ === Methods
127
+ --- mediaopen(filename,flag=0)
128
+ Open mediafile as filename.
129
+ --- mediaclose
130
+ Close mediafile.
131
+ --- mode
132
+ Return current mode number.
133
+ --- modestring(n)
134
+ Return description for mode number #n
135
+ --- errorstring
136
+ Return error description
137
+ --- play
138
+ --- pause
139
+ --- stop
140
+ --- eject
141
+ --- step(n=1)
142
+ --- seek(pos)
143
+ --- seekHome
144
+ --- seekEnd
145
+ --- playable?
146
+ --- ejectable?
147
+ --- window?
148
+ --- length
149
+ --- position
150
+ --- volume
151
+ --- volume=(vl)
152
+ --- speed
153
+ --- speed=
154
+ --- zoom
155
+ --- zoom=
156
+
157
+ === Event Handlers
158
+ --- ????_onerror()
159
+ --- ????_modechanged(newmode)
160
+ --- ????_sizechanged()
161
+ --- ????_mediachanged(str)
162
+ =end
163
+
164
+
165
+ attr :_vr_mmhandlers
166
+
167
+ MCI_CLOSE = 0x0804
168
+ MCI_PLAY = 0x0806
169
+ MCI_SEEK = 0x0807
170
+ MCI_STOP = 0x0808
171
+ MCI_PAUSE = 0x0809
172
+ MCI_STEP = 0x080E
173
+
174
+ MCIWNDM_GETPOSITION = (WMsg::WM_USER + 102) # A message
175
+ MCIWNDM_GETLENGTH = (WMsg::WM_USER + 104)
176
+ MCIWNDM_GETMODE = (WMsg::WM_USER + 106) # A message
177
+ MCIWNDM_EJECT = (WMsg::WM_USER + 107)
178
+ MCIWNDM_SETZOOM = (WMsg::WM_USER + 108)
179
+ MCIWNDM_GETZOOM = (WMsg::WM_USER + 109)
180
+ MCIWNDM_SETVOLUME = (WMsg::WM_USER + 110)
181
+ MCIWNDM_GETVOLUME = (WMsg::WM_USER + 111)
182
+ MCIWNDM_SETSPEED = (WMsg::WM_USER + 112)
183
+ MCIWNDM_GETSPEED = (WMsg::WM_USER + 113)
184
+
185
+ MCIWNDM_GETERROR = (WMsg::WM_USER + 128) # A message
186
+
187
+ MCIWNDM_CAN_PLAY = (WMsg::WM_USER + 144)
188
+ MCIWNDM_CAN_WINDOW = (WMsg::WM_USER + 145)
189
+ MCIWNDM_CAN_EJECT = (WMsg::WM_USER + 148)
190
+ MCIWNDM_CAN_CONFIG = (WMsg::WM_USER + 149)
191
+ MCIWNDM_SETOWNER = (WMsg::WM_USER + 152)
192
+ MCIWNDM_OPEN = (WMsg::WM_USER + 153) # A message
193
+
194
+ MCIWNDM_NOTIFYMODE = (WMsg::WM_USER + 200) # wparam = hwnd, lparam = mode
195
+ MCIWNDM_NOTIFYSIZE = (WMsg::WM_USER + 202) # wparam = hwnd
196
+ MCIWNDM_NOTIFYMEDIA = (WMsg::WM_USER + 203) # wparam = hwnd, lparam = fn
197
+ MCIWNDM_NOTIFYERROR = (WMsg::WM_USER + 205) # wparam = hwnd, lparam = error
198
+
199
+ MCIWNDF_NOPLAYBAR = 0x0002
200
+ MCIWNDF_NOAUTOSIZEMOVIE = 0x0004
201
+ MCIWNDF_NOMENU = 0x0008
202
+
203
+ MCIWNDF_SIMPLE = 0xe
204
+
205
+ WINCLASSINFO = ["MCIWndClass",0x5500 | 0x400 | 0x880 ]
206
+ #notify:mode,error,size,media
207
+
208
+ def addMMHandler(msg,handlername,handlertype,argparsestr)
209
+ @_vr_mmhandlers={} unless defined? @_vr_mmhandlers
210
+ @_vr_mmhandlers[msg]=[] unless @_vr_mmhandlers[msg]
211
+ @_vr_mmhandlers[msg].push [handlername,handlertype,argparsestr]
212
+ end
213
+
214
+ def deleteMMHandler(msg,handlername)
215
+ return false unless defined?(@_vr_mmhandlers) and @_vr_mmhandlers[msg]
216
+ @_vr_mmhandlers.delete_if do |shandler|
217
+ shandler[0] != (PREHANDLERSTR+handlername).intern
218
+ end
219
+ end
220
+
221
+ def vrinit
222
+ super
223
+ addMMHandler(VRMediaView::MCIWNDM_NOTIFYERROR,"onerror",MSGTYPE::ARGINT,nil)
224
+ addMMHandler(VRMediaView::MCIWNDM_NOTIFYMODE,"modechanged",MSGTYPE::ARGINT,nil)
225
+ addMMHandler(VRMediaView::MCIWNDM_NOTIFYSIZE, "sizechanged",MSGTYPE::ARGNONE,nil)
226
+ addMMHandler(VRMediaView::MCIWNDM_NOTIFYMEDIA,"mediachanged",MSGTYPE::ARGSTRING,nil)
227
+ end
228
+
229
+ def mediaopen(filename,flag=0)
230
+ sendMessage MCIWNDM_OPEN,flag,filename
231
+ sendMessage MCIWNDM_SETOWNER,@parent.hWnd,0
232
+ end
233
+
234
+ def play() sendMessage MCI_PLAY,0,0 end
235
+ def pause() sendMessage MCI_PAUSE,0,0 end
236
+ def stop() sendMessage MCI_STOP,0,0 end
237
+ def mediaclose() sendMessage MCI_CLOSE,0,0 end
238
+ def eject() sendMessage MCI_EJECT,0,0 end
239
+ def step(n=1) sendMessage MCI_STEP,0,n.to_i end
240
+ def seek(pos) sendMessage MCI_SEEK,0,pos.to_i end
241
+ def seekHome() sendMessage MCI_SEEK,0,-1 end
242
+ def seekEnd() sendMessage MCI_SEEK,0,-2 end
243
+
244
+ def playable?() sendMessage(MCIWNDM_CAN_PLAY,0,0)!=0 end
245
+ def ejectable?() sendMessage(MCIWNDM_CAN_EJECT,0,0)!=0 end
246
+ def window?() sendMessage(MCIWNDM_CAN_WINDOW,0,0)!=0 end
247
+
248
+ def length() sendMessage MCIWNDM_GETLENGTH,0,0 end
249
+ def position() sendMessage MCI_SEEK,0,0 end
250
+
251
+ def volume=(vl) sendMessage MCIWNDM_SETVOLUME,0,vl.to_i end
252
+ def volume() sendMessage MCIWNDM_GETVOLUME,0,0 end
253
+ def speed=(sp) sendMessage MCIWNDM_SETSPEED,0,sp.to_i end
254
+ def speed() sendMessage MCIWNDM_GETSPEED,0,0 end
255
+ def zoom=(zm) sendMessage MCIWNDM_SETZOOM,0,zm.to_i end
256
+ def zoom() sendMessage MCIWNDM_GETZOOM,0,0 end
257
+
258
+ def mode
259
+ p="\0 " #32bytes
260
+ sendMessage MCIWNDM_GETMODE,31,p
261
+ p
262
+ end
263
+
264
+ def modestring(n)
265
+ case n
266
+ when 524; "not_ready"
267
+ when 525; "stopped"
268
+ when 526; "playing"
269
+ when 527; "recording"
270
+ when 528; "seeking"
271
+ when 529; "paused"
272
+ when 530; "open"
273
+ else; "unknown_mode"
274
+ end
275
+ end
276
+
277
+ def errorstring
278
+ p="\0 "*8 #256bytes
279
+ sendMessage MCIWNDM_GETERROR,255,p
280
+ p
281
+ end
282
+
283
+ end
284
+
285
+ if VR_COMPATIBILITY_LEVEL then
286
+ require VR_DIR + 'compat/vrmmedia.rb'
287
+ end