exerb 6.0.1

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 (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,192 @@
1
+ ###################################
2
+ #
3
+ # vrolednd.rb
4
+ # Programmed by nyasu <nyasu@osk.3web.ne.jp>
5
+ # Copyright 2002-2005 Nishikawa,Yasuhiro
6
+ #
7
+ # More information at http://vruby.sourceforge.net/index.html
8
+ #
9
+ ###################################
10
+
11
+ VR_DIR="vr/" unless defined?(::VR_DIR)
12
+ require VR_DIR+'sysmod'
13
+ require VR_DIR+'dragdropformat'
14
+
15
+ module OleDnDConstants
16
+ IDROPTARGET_NOTIFY_DRAGENTER=0
17
+ IDROPTARGET_NOTIFY_DRAGOVER=1
18
+ IDROPTARGET_NOTIFY_DRAGLEAVE=2
19
+ IDROPTARGET_NOTIFY_DROP=3
20
+
21
+ DROPEFFECT_NONE=0
22
+ DROPEFFECT_COPY=1
23
+ DROPEFFECT_MOVE=2
24
+ DROPEFFECT_LINK=4
25
+ end
26
+
27
+
28
+ module VROleDropTarget
29
+ =begin
30
+ == VROleDropTarget
31
+ A module for OLE drop target.
32
+ Include this module to make a window as an ole drop target.
33
+ === Instance Variables
34
+ --- vr_oledropmessage
35
+ Message ID to notify OLE drag-and-drop matter.
36
+ === Methods
37
+ --- start_oledroptarget(formats)
38
+ Starts the window as OLE drop target.
39
+ ((|formats|)) is an array of acceptable formats (CF_TEXT, and so on).
40
+
41
+ === Event handlers
42
+ --- self_oledragenter(format,keystate)
43
+ This notifies entering OLE drag on the window.
44
+ This method must return ((|Effects|)). The default effect is DROPEFFECT_COPY.
45
+ --- self_oledragover(keystate)
46
+ This notifies OLE dragging cursor is moving on the window.
47
+ This method must return ((|Effects|)) or ((|nil|)).
48
+ ((|nil|)) means "same as before". The default effect is ((|nil|)).
49
+ --- self_oledragleave
50
+ This notifies leaving OLE drag cursor.
51
+ --- self_oledrop(handle,format,keystate)
52
+ This notifies the item is dropped. Global heap handle of ((|handle|))
53
+ containing the contents of dropped object.
54
+ When the object is multi-formattedformat, it's in the first format that
55
+ appears in the argument array of start_oledroptarget() .
56
+ =end
57
+
58
+ include ClipboardFormat
59
+ include OleDnDConstants
60
+ include VRUserMessageUseable
61
+
62
+ IDROPTARGET_NOTIFY = "IIIIII" #*ppt,dwEffect,grfKeyState,cfFormat,hMem,*data
63
+
64
+ def vrinit
65
+ super
66
+ oledroptargetinit
67
+ end
68
+
69
+ def oledroptargetinit
70
+ @vr_oledropmessage = registerUserMessage(ReservedMsg::WM_VR_OLEDND,"vr_olednd",0)
71
+ addEvent @vr_oledropmessage
72
+ end
73
+
74
+ def start_oledroptarget(formats)
75
+ self.dndTargetStart( @vr_oledropmessage ,formats )
76
+ end
77
+
78
+ def self_vr_olednd(wparam,lparam)
79
+ notify = @screen.application.cstruct2array(lparam,IDROPTARGET_NOTIFY)
80
+ @vr_olednd_notify=notify
81
+ case wparam
82
+ when IDROPTARGET_NOTIFY_DRAGENTER
83
+ if notify[3]==0 then
84
+ @screen.application.pokeMemory(lparam+4,0,4) # effect none
85
+ return
86
+ end
87
+ r = selfmsg_dispatching("oledragenter",notify[3],notify[2]).to_i
88
+ @screen.application.pokeMemory(lparam+4,r,4) # effect r
89
+ when IDROPTARGET_NOTIFY_DRAGOVER
90
+ r = selfmsg_dispatching("oledragover",notify[2])
91
+ if r then
92
+ r = r.to_i
93
+ @screen.application.pokeMemory(lparam+4,r,4) # effect r
94
+ end
95
+ when IDROPTARGET_NOTIFY_DRAGLEAVE
96
+ selfmsg_dispatching("oledragleave")
97
+ when IDROPTARGET_NOTIFY_DROP
98
+ return if notify[3]==0
99
+ # selfmsg_dispatching("oledropraw",dataobj,notify[2])
100
+ selfmsg_dispatching("oledrop",notify[4],notify[3],notify[2])
101
+ end
102
+ @vr_olednd_notify=nil
103
+ end
104
+
105
+ def self_oledragenter(format,keystate)
106
+ DROPEFFECT_COPY
107
+ end
108
+
109
+ def self_oledragover(keystate)
110
+ nil
111
+ end
112
+
113
+ def self_oledragleave
114
+ end
115
+
116
+ def self_oledrop(handle,format,keystate)
117
+ end
118
+ end
119
+
120
+
121
+ module VROleDragSourceLow
122
+ =begin
123
+ == VROleDragSourceLow
124
+ A module for OLE drag source. (low level)
125
+
126
+ === Methods
127
+ --- start_oledragsource(formats,effect= DROPEFFECT_COPY|DROPEFFECT_MOVE)
128
+ Starts OLE Drag Drop. The dragged object is in the formats of ((|formats|)).
129
+ Acceptable effects is to be set for ((|effect|)).
130
+
131
+ === Event handlers
132
+ --- self_getoledragitem(format)
133
+ Fired when DropTarget requires the dragged data in the ((|format|))
134
+ This method must return the Global heap handle containing the dragged object.
135
+ If the handle is not available, return 0.
136
+ =end
137
+
138
+ include ClipboardFormat
139
+ include OleDnDConstants
140
+ include VRUserMessageUseable
141
+
142
+ def vrinit
143
+ super
144
+ oledragsourcelowinit
145
+ end
146
+
147
+ def oledragsourcelowinit
148
+ @vr_oledragmessage = registerUserMessage(ReservedMsg::WM_VR_OLEDND,"vr_oledrag",0)
149
+ addEvent @vr_oledragmessage
150
+ end
151
+
152
+ def set_dragobj_lparam(lparam,hMem)
153
+ @screen.application.pokeMemory(lparam,hMem,4)
154
+ end
155
+
156
+ def start_oledragsource(formats,effect=0x3)
157
+ dndSourceStart @vr_oledragmessage,formats,effect
158
+ end
159
+
160
+ def self_vr_oledrag(wparam,lparam)
161
+ handle = selfmsg_dispatching("getoledragitem",wparam).to_i
162
+ set_dragobj_lparam(lparam,handle)
163
+ end
164
+
165
+ def self_getoledragitem(format)
166
+ 0
167
+ end
168
+
169
+ end
170
+
171
+ module VROleDragSource
172
+ include VROleDragSourceLow
173
+
174
+ def start_oledrag(objs,effect=0x3)
175
+ @_vr_draghash={}
176
+ formats = []
177
+ objs.each do |o|
178
+ formats.push o.objectformat
179
+ @_vr_draghash[o.objectformat] = o
180
+ end
181
+ start_oledragsource(formats,effect)
182
+ end
183
+
184
+ def self_getoledragitem(format)
185
+ return 0 unless @_vr_draghash
186
+
187
+ ddobj = @_vr_draghash[format]
188
+
189
+ if ddobj then ddobj.handle else 0 end
190
+ end
191
+
192
+ end
@@ -0,0 +1,108 @@
1
+ ###################################
2
+ #
3
+ # vrowndraw.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
+ ###################################
10
+
11
+ VR_DIR="vr/" unless defined?(::VR_DIR)
12
+ require VR_DIR+'vrcontrol'
13
+
14
+ module WMsg
15
+ WM_DRAWITEM = 0x002B
16
+ end
17
+
18
+ module VROwnerDrawControlContainer
19
+ =begin
20
+ == VROwnerDrawControlContainer
21
+ This module provides a message handler for WM_DRAWITEM.
22
+ VRForm includes this module automatically loading "vrowndraw.rb".
23
+ =end
24
+
25
+ include VRMessageHandler
26
+
27
+ HANDLERNAME="ownerdraw"
28
+
29
+ def ownerdrawinit
30
+ addHandler(WMsg::WM_DRAWITEM,"vrwmdrawitem",
31
+ MSGTYPE::ARGINTSTRUCT,"UUUUUUUUUUUU")
32
+ addEvent WMsg::WM_DRAWITEM
33
+ addNoRelayMessages [WMsg::WM_DRAWITEM]
34
+ end
35
+
36
+ def vrinit
37
+ super
38
+ ownerdrawinit
39
+ end
40
+
41
+ def self_vrwmdrawitem(wParam,args)
42
+ id=LOWORD(wParam)
43
+ ct=@controls[id] # Activated Control
44
+
45
+ return unless ct # can't find?
46
+ r=0
47
+ ct.dopaint(args[6]) do
48
+ if ct.respond_to?(HANDLERNAME)
49
+ r=ct.__send__(HANDLERNAME,*args[2..11])
50
+ end
51
+ end
52
+ SKIP_DEFAULTHANDLER[r]
53
+ end
54
+ end
55
+
56
+ module VRContainersSet
57
+ include VROwnerDrawControlContainer
58
+ end
59
+
60
+
61
+
62
+ class VROwnerDrawButton < VRButton
63
+ =begin
64
+ == VROwnerDrawButton
65
+ Owner draw button.
66
+ This is just a button but the system doesn't draw button faces.
67
+ It's necessary to draw button face manually.
68
+
69
+ === Required methods
70
+ In these method, it doesn't need to call ((*dopaint*)).
71
+
72
+ --- drawpushed(left,top,right,bottom,state)
73
+ Draws the pushed button face.
74
+ --- drawreleased(left,top,right,bottom,state)
75
+ Draws the released button face.
76
+ --- drawfocused(left,top,right,bottom,state)
77
+ Draws the focused button face.
78
+ This method is fired after drawpushed or drawreleased.
79
+ =end
80
+
81
+ BS_OWNERDRAW = 0x0000000B
82
+ WINCLASSINFO = ["BUTTON", BS_OWNERDRAW]
83
+
84
+ def ownerdraw(iid,action,state,hwnd,hdc,left,top,right,bottom,data)
85
+ self.opaque=false
86
+ if (pushed = ((state & 1)>0) ) then
87
+ drawpushed(left,top,right,bottom,state)
88
+ @parent.controlmsg_dispatching(self,
89
+ "drawpushed",left,top,right,bottom,state)
90
+ else
91
+ drawreleased(left,top,right,bottom,state)
92
+ @parent.controlmsg_dispatching(self,
93
+ "drawreleased",left,top,right,bottom,state)
94
+ end
95
+
96
+ if (state & 0x10)>0 then
97
+ drawfocused(left,top,right,bottom,state)
98
+ @parent.controlmsg_dispatching(self,
99
+ "drawfocused",left,top,right,bottom,state)
100
+ end
101
+ end
102
+
103
+ def drawpushed(left,top,right,bottom,state) end
104
+ def drawreleased(left,top,right,bottom,state) end
105
+ def drawfocused(left,top,right,bottom,state) end
106
+ end
107
+
108
+
@@ -0,0 +1,366 @@
1
+ ###################################
2
+ #
3
+ # vrrichedit.rb
4
+ # Programmed by nyasu <nyasu@osk.3web.ne.jp>
5
+ # Copyright 2000-2005 Nishikawa,Yasuhiro
6
+ #
7
+ # More information at http://vruby.sourceforge.net/index.html
8
+ #
9
+ ###################################
10
+
11
+ VR_DIR="vr/" unless defined?(::VR_DIR)
12
+ require VR_DIR+'vrcontrol'
13
+ require VR_DIR+'rscutil'
14
+ require 'Win32API'
15
+
16
+ module WMsg
17
+ EM_EXGETSEL = WM_USER+52
18
+ EM_EXLINEFROMCHAR= WM_USER+54
19
+ EM_EXSETSEL = WM_USER+55
20
+ EM_GETCHARFORMAT = WM_USER+58
21
+ EM_GETEVENTMASK = WM_USER+59
22
+ EM_GETPARAFORMAT = WM_USER+61
23
+ EM_SETBKGNDCOLOR = WM_USER+67
24
+ EM_SETCHARFORMAT = WM_USER+68
25
+ EM_SETEVENTMASK = WM_USER+69
26
+ EM_SETPARAFORMAT = WM_USER+71
27
+ EM_FINDTEXTEX = WM_USER+79
28
+ EM_SETLANGOPTIONS= WM_USER+120
29
+ end
30
+
31
+
32
+ class VRRichedit < VRText
33
+ =begin
34
+ == VRRichedit
35
+ This class represents RichEdit Control.
36
+ The parent class is VRText and this also has the same methods and event handlers.
37
+
38
+ === Overwritten Methods
39
+ These methods are overwritten to support over64k texts.
40
+ --- getSel
41
+ --- setSel(st,en,noscroll=0)
42
+ --- char2line(ptr)
43
+
44
+ === Methods
45
+ --- setTextFont(fontface,height=280,area=SCF_SELECTION)
46
+ Sets the text font. ((|area|)) parameter limits the changed area.
47
+ --- getTextFont(selarea=true)
48
+ Gets the text font and its size of the area.
49
+ If selarea is true, the area is the selected area and the other case,
50
+ it means the default font.
51
+ --- setTextColor(col,area=SCF_SELECTION)
52
+ Sets the color of the text in the area.
53
+ --- getTextColor(selarea=true)
54
+ Gets the text color in the area which is same as ((<getTextFont>)).
55
+ --- setBold(flag=true,area=SCF_SELECTION)
56
+ Sets or resets the text style into BOLD.
57
+ When ((|flag|)) is true, the text is set to bold style.
58
+ --- setItalic(flag=true,area=SCF_SELECTION)
59
+ Sets or resets the text style into ITALIC.
60
+ --- setUnderlined(flag=true,area=SCF_SELECTION)
61
+ Sets or resets the text style into UNDERLINED.
62
+ --- setStriked(flag=true,area=SCF_SELECTION)
63
+ Sets or resets the text style into STRIKE_OUT.
64
+ --- bold?(selarea=true)
65
+ Inspects whether the text style in the area is bold or not.
66
+ If ((|selarea|)) is true, the area is selected area.
67
+ --- italic?(selarea=true)
68
+ Inspects whether the text style in the area is italic or not.
69
+ --- underlined?(selarea=true)
70
+ Inspects whether the text style in the area is underlined or not.
71
+ --- striked?(selarea=true)
72
+ Inspects whether the text style in the area is striked out or not.
73
+ --- setAlignment(align)
74
+ Sets text alignment of current paragraph. ((|align|)) can be PFA_LEFT,
75
+ PFA_RIGHT or PFA_CENTER of VRRichedit constansts.
76
+ --- bkcolor=(color)
77
+ Sets the background color of the control.
78
+ --- selformat(area=SCF_SELECTION)
79
+ Gets the text format in ((|area|)). The return value is an instance of
80
+ FontStruct defined in rscutil.rb.
81
+ --- selformat=(format)
82
+ Set the text format in the selected area. ((|format|)) must be an instance
83
+ of FontStruct.
84
+ --- charFromPos(x,y)
85
+ retrieves information about the character closest to a specified point
86
+ in the client area.
87
+ ((x)) is the horizontal coordinate. ((y)) is the vertical coordinate.
88
+ the return value specifies character index by Fixnum.
89
+ --- charLineFromPos(x,y)
90
+ retrieves information about the character closest to a specified point
91
+ in the client area.
92
+ ((x)) is the horizontal coordinate. ((y)) is the vertical coordinate.
93
+ the return value specifies character index and line index by Array.
94
+ first item means character index. second item means line index.
95
+ =end
96
+
97
+ CFM_BOLD = 0x00000001
98
+ CFM_ITALIC = 0x00000002
99
+ CFM_UNDERLINE = 0x00000004
100
+ CFM_STRIKEOUT = 0x00000008
101
+ CFM_PROTECTED = 0x00000010
102
+ CFM_LINK = 0x00000020
103
+ CFM_SIZE = 0x80000000
104
+ CFM_COLOR = 0x40000000
105
+ CFM_FACE = 0x20000000
106
+ CFM_OFFSET = 0x10000000
107
+ CFM_CHARSET = 0x08000000
108
+
109
+ CFE_BOLD = 0x0001
110
+ CFE_ITALIC = 0x0002
111
+ CFE_UNDERLINE = 0x0004
112
+ CFE_STRIKEOUT = 0x0008
113
+ CFE_PROTECTED = 0x0010
114
+ CFE_LINK = 0x0020
115
+ CFE_AUTOCOLOR = 0x40000000
116
+
117
+ SCF_SELECTION = 0x0001
118
+ SCF_WORD = 0x0002
119
+ SCF_DEFAULT = 0x0000
120
+ SCF_ALL = 0x0004 # not valid with SCF_SELECTION or SCF_WORD
121
+ SCF_USEUIRULES= 0x0008
122
+
123
+ PFA_LEFT = 0x0001
124
+ PFA_RIGHT = 0x0002
125
+ PFA_CENTER= 0x0003
126
+ PFM_STARTINDENT = 0x00000001
127
+ PFM_RIGHTINDENT = 0x00000002
128
+ PFM_OFFSET = 0x00000004
129
+ PFM_ALIGNMENT = 0x00000008
130
+ PFM_TABSTOPS = 0x00000010
131
+ PFM_NUMBERING = 0x00000020
132
+ PFM_OFFSETINDENT= 0x80000000
133
+
134
+ module EventMaskConsts
135
+ ENM_CHANGE = 0x00000001
136
+ ENM_UPDATE = 0x00000002
137
+ ENM_SCROLL = 0x00000004
138
+ end
139
+
140
+ class EventMask < Flags
141
+ CONSTMOD=EventMaskConsts
142
+ private
143
+ def integer_getter
144
+ @win.sendMessage WMsg::EM_GETEVENTMASK,0,0
145
+ end
146
+
147
+ def integer_setter(f)
148
+ @win.sendMessage WMsg::EM_SETEVENTMASK,0,f
149
+ end
150
+ end
151
+
152
+ CHARFORMATSIZE=60
153
+ MAX_TAB_STOPS=32
154
+ DEFAULTTABS=[4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76]
155
+
156
+ private
157
+ loadlib = Win32API.new("kernel32","LoadLibrary",["P"],"I")
158
+
159
+ libhandle = 0
160
+
161
+ =begin oop
162
+ #This causes GeneralProtectionViolation maybe for the late of RichEdit releasing.
163
+ freelib = Win32API.new("kernel32","FreeLibrary",["I"],"")
164
+ at_exit {
165
+ freelib.call(libhandle)
166
+ }
167
+ =end
168
+
169
+ def textlength
170
+ sendMessage WMsg::WM_GETTEXTLENGTH,0,0
171
+ end
172
+
173
+ # ooooops !
174
+ if (libhandle=loadlib.call("riched20"))!=0 then
175
+ RICHVERSION=2
176
+ def self.Controltype()
177
+ ["RICHEDIT20A",WStyle::ES_MULTILINE|WStyle::WS_VSCROLL,0x200]#EX_CLIENTEDGE
178
+ end
179
+ elsif (libhandle=loadlib.call("riched32"))!=0 then
180
+ RICHVERSION=1
181
+ def self.Controltype()
182
+ ["RICHEDIT",WStyle::ES_MULTILINE|WStyle::WS_VSCROLL,0x200] #EX_CLIENTEDGE
183
+ end
184
+ else
185
+ raise "no richedit control found"
186
+ end
187
+
188
+
189
+ public
190
+
191
+ def richeditinit
192
+ sendMessage WMsg::EM_SETLANGOPTIONS,0,0
193
+ eventmask.enm_change=true
194
+ end
195
+
196
+ def vrinit
197
+ super
198
+ richeditinit
199
+ end
200
+
201
+ def text
202
+ len=textlength+1
203
+ buffer = "\0"*len
204
+ sendMessage WMsg::WM_GETTEXT,len,buffer
205
+ buffer[0..-2].gsub(/\r\n/,$/)
206
+ end
207
+
208
+ # parameter order is not the same of the return value of getcharformat()
209
+ def setcharformat(area,effects,col=0,mask=0xf800003f,
210
+ font="System",height=280,off=0,pf=2,charset=128)
211
+ buffer = [CHARFORMATSIZE,mask,effects,
212
+ height,off,col,charset,pf].pack("LLLLLLCC")
213
+ buffer += font.to_s + "\0"
214
+ buffer += "\0"*(CHARFORMATSIZE-buffer.length)
215
+ sendMessage(WMsg::EM_SETCHARFORMAT,area,buffer)
216
+ end
217
+
218
+ def getcharformat(mask=0xf800003f,selectionarea=true)
219
+ buffer = [CHARFORMATSIZE,0,0,0,0,0].pack("LLLLLL")
220
+ buffer += "\0"* (CHARFORMATSIZE-buffer.length)
221
+ f = (selectionarea)? 1 : 0
222
+ sendMessage WMsg::EM_GETCHARFORMAT,f,buffer
223
+ return buffer.unpack("LLLLLLCC") << buffer[26..-2].delete("\0")
224
+ end
225
+
226
+ def getparaformat
227
+ size=4*7+4*MAX_TAB_STOPS
228
+ buffer = ([size]+Array.new(39)).pack("LLLLLLIIL*")
229
+ sendMessage WMsg::EM_GETPARAFORMAT,0,buffer
230
+ return buffer.unpack("LLLLLLIIL*")
231
+ end
232
+
233
+ def setparaformat(mask=0x8000003f,numbering=false,startindent=0,rightindent=0,
234
+ offset=0,align=PFA_LEFT,tabstops=DEFAULTTABS)
235
+ size=4*7+4*MAX_TAB_STOPS
236
+ fNumber= if numbering then 1 else 0 end
237
+ tabcount = (tabstops.size>MAX_TAB_STOPS)? MAX_TAB_STOPS : tabstops.size
238
+
239
+ buffer = [
240
+ size,mask,fNumber,startindent,rightindent,offset,align,tabcount
241
+ ].pack("LLLLLLII")
242
+ buffer += tabstops.pack("L*")
243
+ sendMessage WMsg::EM_SETPARAFORMAT,0,buffer
244
+ end
245
+
246
+ ## ## ## ##
247
+ def getSel
248
+ charrange = [0,0].pack("LL")
249
+ sendMessage WMsg::EM_EXGETSEL,0,charrange
250
+ return charrange.unpack("LL")
251
+ end
252
+ def setSel(st,en,noscroll=0)
253
+ charrange = [st,en].pack("LL")
254
+ r=sendMessage WMsg::EM_EXSETSEL,0,charrange
255
+ if(noscroll!=0 && noscroll) then
256
+ scrolltocaret
257
+ end
258
+ return r
259
+ end
260
+ def char2line(pt)
261
+ sendMessage WMsg::EM_EXLINEFROMCHAR,0,pt
262
+ end
263
+
264
+ def setTextFont(fontface,height=280,area=SCF_SELECTION)
265
+ setcharformat(area,0,0,CFM_FACE|CFM_SIZE,fontface,height)
266
+ end
267
+ def getTextFont(selarea=true)
268
+ r=getcharformat(CFM_FACE|CFM_SIZE,selarea)
269
+ return r[3],r[8]
270
+ end
271
+
272
+ def setTextColor(col,area=SCF_SELECTION)
273
+ setcharformat(area,0,col,CFM_COLOR)
274
+ end
275
+ def getTextColor(selarea=true)
276
+ getcharformat(CFM_COLOR,selarea)[5]
277
+ end
278
+
279
+ def setBold(flag=true,area=SCF_SELECTION)
280
+ f = (flag)? CFE_BOLD : 0
281
+ setcharformat(area,f,0,CFM_BOLD)
282
+ end
283
+
284
+ def setItalic(flag=true,area=SCF_SELECTION)
285
+ f = (flag)? CFE_ITALIC : 0
286
+ setcharformat(area,f,0,CFM_ITALIC)
287
+ end
288
+
289
+ def setUnderlined(flag=true,area=SCF_SELECTION)
290
+ f = (flag)? CFE_UNDERLINE : 0
291
+ setcharformat(area,f,0,CFM_UNDERLINE)
292
+ end
293
+
294
+ def setStriked(flag=true,area=SCF_SELECTION)
295
+ f = (flag)? CFE_STRIKEOUT : 0
296
+ setcharformat(area,f,0,CFM_STRIKEOUT)
297
+ end
298
+
299
+ def bold?(selarea=true)
300
+ r=getcharformat(CFM_BOLD,selarea)[2]
301
+ if (r&CFE_BOLD)==0 then false else true end
302
+ end
303
+ def italic?(selarea=true)
304
+ r=getcharformat(CFM_ITALIC,selarea)[2]
305
+ if (r&CFE_ITALIC)==0 then false else true end
306
+ end
307
+ def underlined?(selarea=true)
308
+ r=getcharformat(CFM_UNDERLINE,selarea)[2]
309
+ if (r&CFE_UNDERLINE)==0 then false else true end
310
+ end
311
+ def striked?(selarea=true)
312
+ r=getcharformat(CFM_STRIKEOUT,selarea)[2]
313
+ if (r&CFE_STRIKEOUT)==0 then false else true end
314
+ end
315
+
316
+ def getAlignment
317
+ return self.getparaformat[6]
318
+ end
319
+
320
+ def setAlignment(align)
321
+ setparaformat(PFM_ALIGNMENT,false,0,0,0,align)
322
+ end
323
+
324
+ def selformat=(f)
325
+ raise "format must be an instance of FontStruct" unless f.is_a?(FontStruct)
326
+ effects = f.style*2 + if f.weight>400 then 1 else 0 end
327
+ height = if f.height>0 then f.height else f.point*2 end
328
+ offset=0
329
+ setcharformat SCF_SELECTION,effects,f.color,0xf800003f,f.fontface,height,
330
+ offset,f.pitch_family,f.charset
331
+ f
332
+ end
333
+
334
+ def selformat(option=SCF_SELECTION)
335
+ r=getcharformat(option)
336
+ weight = if (r[2] & 1)>0 then 600 else 300 end
337
+ style = (r[2]/2) & 0xf #mask
338
+ width = r[3]/2 # tekitou....
339
+ point = r[3]/2
340
+ FontStruct.new2([r[8],r[3],style,weight,width,0,0,r[7],r[6]],point,r[5])
341
+ end
342
+
343
+ def bkcolor=(col)
344
+ if col then
345
+ sendMessage WMsg::EM_SETBKGNDCOLOR,0,col.to_i
346
+ else
347
+ sendMessage WMsg::EM_SETBKGNDCOLOR,1,0
348
+ end
349
+ end
350
+
351
+ def eventmask
352
+ EventMask.new(self)
353
+ end
354
+
355
+ def charFromPos(x,y) # Thanks to yas
356
+ return sendMessage 0x00D7,0,[x,y].pack('ll') #EM_CHARFROMPOS
357
+ end
358
+
359
+ def charLineFromPos(x,y)
360
+ pos=charFromPos(x,y)
361
+ ln=char2line(pos)
362
+ return [pos,ln]
363
+ end
364
+
365
+ end
366
+