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,56 @@
1
+ ###################################
2
+ #
3
+ # vractivex.rb
4
+ # Programmed by nyasu <nyasu@osk.3web.ne.jp>
5
+ # Copyright 2003-2005 Nishikawa,Yasuhiro
6
+ #
7
+ # More information at http://vruby.sourceforge.net/index.html
8
+ #
9
+ ###################################
10
+
11
+ require 'vr/vruby'
12
+ require 'Win32API'
13
+ require 'win32ole'
14
+
15
+ class VRActiveXControl < VRControl
16
+ AtlAxWinInit=Win32API.new("atl.dll","AtlAxWinInit","","I")
17
+ AtlAxWinInit.call
18
+
19
+ WINCLASSINFO=["AtlAxWin",0]
20
+ ACTIVEXCINFO=["",""] # PROGID,EVENTSINK
21
+
22
+ alias :progId :caption
23
+ alias :progId= :caption=
24
+ def caption() "" end
25
+ def caption=(arg) arg end
26
+
27
+ def initialize
28
+ self.progId = self.class::ACTIVEXCINFO[0]
29
+ class <<self
30
+ undef_method :progId=
31
+ end
32
+ end
33
+
34
+ def vrinit
35
+ super
36
+ @_vr_win32ole = self.get_oleinterface
37
+ if self.class::ACTIVEXCINFO[1] then
38
+ @_vr_win32ole_event =
39
+ WIN32OLE_EVENT.new(@_vr_win32ole,self.class::ACTIVEXCINFO[1])
40
+ end
41
+ end
42
+
43
+ def ole_interface() @_vr_win32ole; end
44
+ def ole_events() @_vr_win32ole_event; end
45
+
46
+ def add_oleeventhandler(evname,handlername=evname.downcase)
47
+ ole_events.on_event(evname) do |*args|
48
+ @parent.controlmsg_dispatching(self,handlername,*args)
49
+ end
50
+ end
51
+
52
+ def _invoke(*args) @_vr_win32ole._invoke(*args) end
53
+ def _setproperty(*args) @_vr_win32ole._setproperty(*args) end
54
+ def _getproperty(*args) @_vr_win32ole._getproperty(*args) end
55
+
56
+ end
@@ -0,0 +1,53 @@
1
+ ###################################
2
+ #
3
+ # vrclipboard.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
+
12
+ VR_DIR="vr/" unless defined?(::VR_DIR)
13
+ require VR_DIR+'vruby'
14
+
15
+ module VRClipboardObserver
16
+ =begin
17
+ == VRClipboardObserver
18
+ module for clipboard observing.
19
+
20
+ === Handlers
21
+ --- self_drawclipboard
22
+ Fired when clipboard is changed.
23
+ =end
24
+
25
+ include VRMessageHandler
26
+
27
+ SetClipboardViewer = Win32API.new('user32','SetClipboardViewer','L','L')
28
+ ChangeClipboardChain = Win32API.new('user32','ChangeClipboardChain','LL','I')
29
+ WM_CHANGECBCHAIN = 781
30
+ WM_DRAWCLIPBOARD = 776
31
+
32
+ def clipboardobserverinit
33
+ @cbchainnext = SetClipboardViewer.call(self.hWnd)
34
+ addHandler WM_DRAWCLIPBOARD,"drawclipboard",MSGTYPE::ARGNONE,nil
35
+ addHandler WM_CHANGECBCHAIN,"vrchangecbchain",MSGTYPE::ARGINTINT,nil
36
+ addHandler WMsg::WM_DESTROY,"vrcbdestroy",MSGTYPE::ARGNONE,nil
37
+ acceptEvents [WM_DRAWCLIPBOARD,WM_CHANGECBCHAIN,WMsg::WM_DESTROY]
38
+ end
39
+
40
+ def vrinit
41
+ super
42
+ clipboardobserverinit
43
+ end
44
+
45
+ def self_vrchangecbchain(hwndremove,hwndnext)
46
+ @cbchainnext=hwndnext if hwndremove == @cbchainnext
47
+ end
48
+
49
+ def self_vrcbdestroy
50
+ ChangeClipboardChain.call self.hWnd,@cbchainnext
51
+ end
52
+ end
53
+
@@ -0,0 +1,1819 @@
1
+ ###################################
2
+ #
3
+ # vrcomctl.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+'vruby'
13
+
14
+ =begin
15
+ = VisualuRuby(tmp) Common Controls.
16
+ This file prepares classes of common controls, panels and menu modules.
17
+
18
+ <<< handlers.rd
19
+
20
+ =end
21
+
22
+ require 'Win32API'
23
+
24
+ begin
25
+ Win32API.new("comctl32","InitCommonControlsEx","P","").call [8,0x400].pack("LL")
26
+ VR_OLDCOMCTL=false
27
+ rescue
28
+ # puts "comctl too old to use rebar and so on"
29
+ VR_OLDCOMCTL=true
30
+ end
31
+
32
+ module WMsg
33
+ NFR_ANSI=1
34
+ NFR_UNICODE=2
35
+ NF_QUERY=3
36
+ NF_REQUERY=4
37
+ WM_NOTIFYFORMAT=85
38
+ end
39
+
40
+ module WStyle
41
+ CCS_TOP = 0x00000001
42
+ CCS_NOMOVEY = 0x00000002
43
+ CCS_BOTTOM = 0x00000003
44
+ CCS_NORESIZE = 0x00000004
45
+ end
46
+
47
+ module WStruct
48
+ NMHDR="UUU"
49
+ end
50
+
51
+
52
+ ##################
53
+ #
54
+ # The following control windows send WM_NOTIFY message to their parent
55
+ # This definition is for handling them.
56
+ #
57
+
58
+ module VRComCtlContainer
59
+ =begin
60
+ == VRComCtlContainer
61
+ This module provides a message handler for WM_NOTIFY, which calls
62
+ defined method in a parent window.
63
+ VRForm includes this module automatically loading "vrcomctl.rb".
64
+ =end
65
+
66
+ include VRMessageHandler
67
+
68
+ def comctlcontainerinit
69
+ addHandler(WMsg::WM_NOTIFY,"wmnotify", MSGTYPE::ARGPASS, nil)
70
+ addHandler(WMsg::WM_NOTIFYFORMAT,"wmnotifyformat",MSGTYPE::ARGINTINT,nil)
71
+ addEvent WMsg::WM_NOTIFY
72
+ addEvent WMsg::WM_NOTIFYFORMAT
73
+
74
+ addNoRelayMessages [WMsg::WM_NOTIFY,WMsg::WM_NOTIFYFORMAT]
75
+ end
76
+
77
+ def vrinit
78
+ super
79
+ comctlcontainerinit
80
+ end
81
+
82
+ def self_wmnotifyformat(parent,command)
83
+ SKIP_DEFAULTHANDLER[1]
84
+ end
85
+
86
+ def self_wmnotify(msg)
87
+
88
+ orig_arg= @screen.application.cstruct2array(msg.lParam,WStruct::NMHDR)
89
+
90
+ id=msg.wParam
91
+ ct=@controls[id] # Activated Control
92
+ if !ct then return end # Ignore message passed through childwin
93
+
94
+ return unless ct.is_a?(VRNotifyControl) and # Added by yukimi_sake
95
+ ct._vr_ntfyhandlers and ct._vr_ntfyhandlers[orig_arg[2]]
96
+ ct._vr_ntfyhandlers[orig_arg[2]].each do |shandler|
97
+ args=msgarg2handlerarg(shandler[1],msg,shandler[2])
98
+ if args.size>0 and ct.respond_to?("_vr_notifyarg") then
99
+ necessary_arg=ct._vr_notifyarg[orig_arg[2]]
100
+ if necessary_arg then
101
+ n=necessary_arg.size-1
102
+ 0.upto(n) do |idx|
103
+ args[idx+3]=nil if necessary_arg[idx,1]=='F'
104
+ end
105
+ end
106
+ args=args[3..-1].compact
107
+ end
108
+
109
+ ct.__send__(shandler[0],*args) if ct.respond_to?(shandler[0])
110
+ msg.retval = controlmsg_dispatching(ct,shandler[0],*args)
111
+
112
+ end
113
+ end
114
+ end
115
+
116
+ module VRContainersSet
117
+ include VRComCtlContainer
118
+ INITIALIZERS.push :comctlcontainerinit
119
+ end
120
+
121
+
122
+ ####################################
123
+ #
124
+ # Argument Utilities for Common Controls
125
+ #
126
+
127
+ class VRNotifyControl < VRControl
128
+ =begin
129
+ == VRNotifyControl
130
+ All common controls have these event handlers.
131
+ === Event handlers
132
+ --- ????_clicked
133
+ fired when the control is clicked with left button.
134
+ --- ????_hitreturn
135
+ fired when the control has the input focus and the user press ((*ENTER*)) key.
136
+ --- ????_dblclicked
137
+ fired when the control is double-clicked with left button.
138
+ --- ????_rclicked
139
+ fired when the control is clicked with right button.
140
+ --- ????_rdblclicked
141
+ fired when the control is double-clicked with rightbutton.
142
+ --- ????_gotfocus
143
+ fired when the control has got the input focus
144
+ --- ????_lostfocus
145
+ fired when the control has lost the input focus
146
+ =end
147
+
148
+ attr :_vr_notifyarg
149
+
150
+ def _vr_ntfyhandlers
151
+ unless defined?(@_vr_ntfyhandlers)
152
+ @_vr_ntfyhandlers={}
153
+ else
154
+ @_vr_ntfyhandlers
155
+ end
156
+ end
157
+
158
+
159
+ def notifycontrolinit
160
+ @_vr_notifyarg={}
161
+ addNotifyHandler(0xfffffffe,"clicked",MSGTYPE::ARGNONE,nil)
162
+ addNotifyHandler(0xfffffffd,"dblclicked",MSGTYPE::ARGNONE,nil)
163
+ addNotifyHandler(0xfffffffc,"hitreturn",MSGTYPE::ARGNONE,nil)
164
+ addNotifyHandler(0xfffffffb,"rclicked",MSGTYPE::ARGNONE,nil)
165
+ addNotifyHandler(0xfffffffa,"rdblclicked",MSGTYPE::ARGNONE,nil)
166
+ addNotifyHandler(0xfffffff9,"gotfocus",MSGTYPE::ARGNONE,nil)
167
+ addNotifyHandler(0xfffffff8,"lostfocus",MSGTYPE::ARGNONE,nil)
168
+ end
169
+ def vrinit
170
+ super
171
+ notifycontrolinit
172
+ end
173
+
174
+ def addFilterArg(msg,filter) # filter as str : 'T'=true, 'F'=false
175
+ @_vr_notifyarg[msg]=filter
176
+ end
177
+ def deleteFilterArg(msg)
178
+ @_vr_notifyarg[msg]=nil
179
+ end
180
+
181
+ def addNotifyHandler(msg,handlername,handlertype,argparsestr)
182
+ @_vr_ntfyhandlers={} unless defined?(@_vr_ntfyhandlers)
183
+ @_vr_ntfyhandlers[msg]=[] unless @_vr_ntfyhandlers[msg]
184
+ @_vr_ntfyhandlers[msg].push [handlername,handlertype,argparsestr]
185
+ end
186
+
187
+ def deleteNotifyHandler(msg,handlername)
188
+ return false unless @_vr_ntfyhandlers and @_vr_ntfyhandlers[msg]
189
+ @_vr_ntfyhandlers.delete_if do |shandler|
190
+ shandler[0] != (PREHANDLERSTR+handlername).intern
191
+ end
192
+ end
193
+ end
194
+
195
+
196
+ ###################################
197
+ # Common Controls
198
+ #
199
+
200
+ # Listview
201
+
202
+ module WMsg
203
+ LVM_GETBKCOLOR = 0x1000 #GETBKCOLOR, LVM_FIRST
204
+ LVM_SETBKCOLOR = 0x1001
205
+
206
+ LVM_SETIMAGELIST = 0x1003
207
+ LVM_GETITEMCOUNT = 0x1004
208
+ LVM_GETITEM = 0x1005 #GETITEMA
209
+ LVM_SETITEM = 0x1006 #SETITEMA
210
+ LVM_INSERTITEM = 0x1007 #INSERTITEMA
211
+ LVM_DELETEITEM = 0x1008
212
+ LVM_DELETEALLITEM = 0x1009
213
+
214
+ LVM_GETNEXTITEM = 0x1000 + 12
215
+ LVM_GETITEMRECT = 0x1000 + 14
216
+ LVM_HITTEST = 0x1000 + 18
217
+ LVM_ENSUREVISIBLE = 0x1000 + 19
218
+
219
+ LVM_GETCOLUMN = 0x1000+25 #GETCOLUMNA
220
+ LVM_SETCOLUMN = 0x1000+26 #SETCOLUMNA
221
+ LVM_INSERTCOLUMN = 0x1000+27 #INSERTCOLUMNA
222
+ LVM_DELETECOLUMN = 0x1000+28 #DELETECOLUMNA
223
+ LVM_GETCOLUMNWIDTH= 0x1000+29
224
+ LVM_SETCOLUMNWIDTH= 0x1000+30
225
+
226
+ LVM_SETITEMSTATE = 0x1000+43
227
+ LVM_GETITEMSTATE = 0x1000+44
228
+ LVM_GETITEMTEXT = 0x1000+45 #GETITEMTEXTA
229
+ LVM_SETITEMTEXT = 0x1000+46 #SETITEMTEXTA
230
+ LVM_SORTITEMS = 0x1000+48
231
+ LVM_GETSELECTED = 0x1000+50 #LVM_GETSELECTEDCOUNT
232
+ LVM_SETEXTENDEDLISTVIEWSTYLE = 0x1000 + 54
233
+ LVM_GETEXTENDEDLISTVIEWSTYLE = 0x1000 + 55
234
+ LVM_SUBITEMHITTEST= 0x1000+57
235
+
236
+ LVN_ITEMCHANGING = 0xffffffff-99
237
+ LVN_ITEMCHANGED = LVN_ITEMCHANGING-1
238
+ LVN_INSERTITEM = LVN_ITEMCHANGING-2
239
+ LVN_DELETEITEM = LVN_ITEMCHANGING-3
240
+ LVN_COLUMNCLICK = LVN_ITEMCHANGING-8
241
+ LVN_BEGINDRAG = LVN_ITEMCHANGING-9
242
+ LVN_BEGINRDRAG = LVN_ITEMCHANGING-11
243
+ end
244
+ module WStyle
245
+ LVS_ICON = 0x0000
246
+ LVS_REPORT = 0x0001
247
+ LVS_SMALLICON = 0x0002
248
+ LVS_LIST = 0x0003
249
+ LVS_SINGLESEL = 4
250
+ LVS_SHOWSELALWAYS = 8
251
+ end
252
+ module WExStyle
253
+ LVS_EX_FULLROWSELECT=32
254
+ LVS_EX_GRIDLINES=1
255
+ end
256
+
257
+ module WConst
258
+ LVIS_FOCUSED = 0x0001
259
+ LVIS_SELECTED = 0x0002
260
+ LVIS_CUT = 0x0004
261
+ LVIS_DROPHILITED = 0x0008
262
+ end
263
+ module WStruct
264
+ LVITEM = "UIIUUPIIL"
265
+ LVCOLUMN = "UIIPIIII"
266
+ LVFIND = "UPLPU"
267
+ LVHITTEST = "IIUI"
268
+ NM_LISTVIEW= NMHDR+"IIUUULLL" #INT item,subitem,UINT nst,ost,chg,POINT,LParam
269
+ end
270
+
271
+ class VRListview < VRNotifyControl
272
+ =begin
273
+ == VRListview
274
+ Listview.
275
+ Some features has not implemented yet.
276
+ === Method
277
+ --- setViewMode(mode)
278
+ ((|mode|)) as viewmode. 0 for ICON, 1 for REPORT, 2 for SMALLICON and
279
+ 3 for LIST
280
+ --- getViewMode
281
+ Returns the view mode.
282
+ --- iconview
283
+ Sets the view mode for Icon view.
284
+ --- reportview
285
+ Sets the view mode for Report view.
286
+ --- smalliconview
287
+ Sets the view mode for Small icon view.
288
+ --- listview
289
+ Sets the view mode for listing view.
290
+ --- setBkColor(color)
291
+ --- bkcolor=(color)
292
+ Sets the background color.
293
+ --- lvexstyle
294
+ --- lvexstyle=(style)
295
+ Gets/Sets Listview extended style.
296
+ If you need style mask, use setListviewExStyle()
297
+ --- setListviewExStyle(style,mask=0xffffffff)
298
+ Sets Listview extended style using style mask.
299
+
300
+ --- insertColumn(column,text,width=50,format=0,textsize=title.size)
301
+ Inserts a new column specified by ((|text|)), ((|width|)) and ((|format|))
302
+ into the index of ((|column|)), which is started from 0.
303
+ ((|format|)) means 0 for left-padded, 1 for right-padded, 2 for centred.
304
+ --- deleteColumn(column)
305
+ Deletes the column at the index of ((|column|))
306
+ --- clearColumns
307
+ Deletes all columns.
308
+ --- countColumns
309
+ Counts the number of columns.
310
+ --- addColumn(text,width=50,format=0,textsize=title.size)
311
+ Adds a new column after the last column.
312
+ --- setImagelist(imagelist,itype=0)
313
+ Set ((|imagelist|)) for displaying icons of items. ((|imagelist|)) must be
314
+ a kind of SWin::Imagelist. ((|itype|)) specifies the type of Imagelist.
315
+ itype : 0 for normal icon, 1 for small icon (,2 for state icon).
316
+ --- setItemIconOf(hitem,img)
317
+ Sets image ids in a imagelist of the item.
318
+ The imagelist is set by ((<setImagelist>)) method.
319
+ --- getItemIconOf(hitem)
320
+ Returns images id of the item.
321
+ --- getColumnWidthOf(column)
322
+ Returns the width of the column whose index is ((|column|)).
323
+ --- setColumnWidthOf(column,width)
324
+ Sets the width of the column.
325
+ --- getColumnTextOf(column)
326
+ Returns the text of the column whose index is ((|column|)).
327
+ --- setColumnTextOf(column,text)
328
+ Sets the text of the column.
329
+ --- getColumnFormatOf(column)
330
+ Returns the format of the column whose index is ((|column|)).
331
+ (see ((<insertColumn>)) about format)
332
+ --- setColumnFormatOf(column,format)
333
+ Sets the format of the column.
334
+ --- insertItem(index,texts,lparam=0,textsize=128)
335
+ Inserts a new item into the index of ((|index|)).((|texts|)) is an array of
336
+ String which means [item_text, subitem_text, subitem2_text,...].
337
+ ((|lparam|)) is a 32bit value concerned with the item.
338
+ ((|textsize|)) is the limit length of the item texts.
339
+ --- addItem(texts,lparam=0,textsize=128)
340
+ Adds a new item after the last item.
341
+ --- insertMultiItems(index,multitexts)
342
+ Inserts new items into the index of ((|index|)).
343
+ ((|multitexts|)) is an array which is the arguments of ((<insertItem>))
344
+ excluding ((|index|))
345
+ --- deleteItem(idx)
346
+ Deletes an item at the index of ((|idx|)).
347
+ --- clearItems
348
+ Deletes all items.
349
+ --- countItems
350
+ Counts the items.
351
+ --- hittest(x,y)
352
+ Inspect the item index which is at the co-ordinate(((|x|)),((|y|)))
353
+ --- hittest2(x,y)
354
+ Returns the item information which is at the co-ordinate(((|x|)),((|y|))).
355
+ The information is the array [x,y,part,index,subitem]
356
+ --- getItemRect(idx)
357
+ Returns an co-ordinates array of integers [left,top,right,bottom]
358
+ --- getItemStateOf(idx)
359
+ Returns the item state at the index of ((|idx|)).
360
+ The state is 1 for forcused, 2 for selected, 3 for cut and 4 fordrophilited.
361
+ --- setItemStateOf(idx,state)
362
+ Sets the item state.
363
+ --- selectItem(idx,flag)
364
+ Change selected state of the item at the index of ((|idx|)).
365
+ If ((|flag|)) is true, the item is selected and if it's false the item is
366
+ un-selected.
367
+ --- getNextItem(start,flags)
368
+ Searches for an item described by ((|start|)) and ((|flags|)).
369
+ ((|flags|)) is
370
+ * 1 : focused item after ((|start|))
371
+ * 2 : selected item after ((|start|))
372
+ * 4 : cut item after ((|start|))
373
+ * 8 : drophilited item after ((|start|))
374
+ * 0x100 : item above ((|start|))
375
+ * 0x200 : item below ((|start|))
376
+ * 0x400 : left item from ((|start|))
377
+ * 0x800 : right item from ((|start|))
378
+ --- focusedItem
379
+ Returns index of the focused item.
380
+ --- getItemTextOf(idx,subitem=0,textsize=128)
381
+ Retrieves the sub-text of the item (index ((|idx|)) ).
382
+ ((|subitem|)) specifies the subitem number.
383
+ --- setItemTextOf(idx,subitem,text,textsize=text.size)
384
+ Sets the sub-text of the item.
385
+ --- getItemLParamOf(idx)
386
+ Gets the lParam of the item.
387
+ --- setItemLParamOf(idx,lparam)
388
+ Sets the lParam of the item.
389
+ --- selected?(idx)
390
+ Returns true if the item is selected.
391
+ --- focused?(idx)
392
+ Returns true if the item is focused.
393
+ --- eachSelectedItems
394
+ Yields each selected item index.
395
+ --- countSelectedItems()
396
+ Counts the selected items.
397
+ --- ensureVisible(i,partial=true)
398
+ Ensures the item(idx) is visible by scrolling.
399
+
400
+ === Event handlers
401
+ --- ????_itemchanged(idx,state)
402
+ fired when the item state is changed. This also means that this is fired after changing selected items.
403
+ ((|idx|)) is the index of the item and ((|state|)) is the new state.
404
+ --- ????_itemchanging(idx,state)
405
+ fired when the item state is changing.
406
+ --- ????_columnclick(subitem)
407
+ fired when the column is clicked. ((|subitem|)) is the column index.
408
+ --- ????_begindrag
409
+ --- ????_beginrdrag
410
+ =end
411
+
412
+ public
413
+ WINCLASSINFO = ["SysListView32",WStyle::LVS_REPORT,0x200]
414
+
415
+ def listviewinit
416
+ addNotifyHandler(WMsg::LVN_ITEMCHANGED,"itemchanged",
417
+ MSGTYPE::ARGSTRUCT,WStruct::NM_LISTVIEW)
418
+ addFilterArg WMsg::LVN_ITEMCHANGED,"TFFTFFFF"
419
+
420
+ addNotifyHandler(WMsg::LVN_ITEMCHANGING,"itemchanging",
421
+ MSGTYPE::ARGSTRUCT,WStruct::NM_LISTVIEW)
422
+ addFilterArg WMsg::LVN_ITEMCHANGING,"TFFTFFFF"
423
+
424
+ addNotifyHandler(WMsg::LVN_COLUMNCLICK,"columnclick",
425
+ MSGTYPE::ARGSTRUCT,WStruct::NM_LISTVIEW)
426
+ addFilterArg WMsg::LVN_COLUMNCLICK,"FTFFFFFF"
427
+
428
+ addNotifyHandler(WMsg::LVN_BEGINDRAG,"begindrag",
429
+ MSGTYPE::ARGNONE,nil)
430
+
431
+ addNotifyHandler(WMsg::LVN_BEGINRDRAG,"beginrdrag",
432
+ MSGTYPE::ARGNONE,nil)
433
+ end
434
+ def vrinit
435
+ super
436
+ listviewinit
437
+ end
438
+
439
+ def setViewMode(mode)
440
+ self.style = (self.style & 0xfffffff8) + (mode&3)
441
+ end
442
+ def getViewMode
443
+ self.style & 0xfffffff8
444
+ end
445
+ def iconview() setViewMode(0) end
446
+ def reportview() setViewMode(1) end
447
+ def smalliconview() setViewMode(2) end
448
+ def listview() setViewMode(3) end
449
+
450
+
451
+ def setBkColor(color)
452
+ sendMessage WMsg::LVM_SETBKCOLOR,0,color.to_i
453
+ end
454
+
455
+ def bkcolor=(color)
456
+ setBkColor(color)
457
+ end
458
+
459
+ def setListviewExStyle(sty,mask=0xffffffff)
460
+ sendMessage WMsg::LVM_SETEXTENDEDLISTVIEWSTYLE,mask,sty
461
+ end
462
+ def lvexstyle=(sty)
463
+ setListviewExStyle(sty)
464
+ end
465
+ def lvexstyle
466
+ sendMessage WMsg::LVM_GETEXTENDEDLISTVIEWSTYLE,0,0
467
+ end
468
+
469
+ def insertColumn(column,title,width=50,style=0,textsize=title.size)
470
+ lv=@screen.application.arg2cstructStr(WStruct::LVCOLUMN,
471
+ 0xf,style.to_i,width.to_i,title.to_s,textsize,column,0,0)
472
+ sendMessage WMsg::LVM_INSERTCOLUMN,column.to_i,lv
473
+ end
474
+
475
+ def deleteColumn(column)
476
+ sendMessage(WMsg::LVM_DELETECOLUMN,column.to_i,0)
477
+ end
478
+ def clearColumns
479
+ while sendMessage(WMsg::LVM_DELETECOLUMN,0,0)!=0 do; end
480
+ end
481
+
482
+ def countColumns
483
+ r=0
484
+ while getColumnTextOf(r) do r+=1; end
485
+ r
486
+ end
487
+
488
+ def addColumn(*args)
489
+ insertColumn(30000,*args) #30000 as a big number. I believe this is enough.
490
+ end
491
+
492
+ def getColumnWidthOf(column)
493
+ sendMessage(WMsg::LVM_GETCOLUMNWIDTH,column.to_i,0)
494
+ end
495
+
496
+ def setColumnWidthOf(column,width)
497
+ sendMessage(WMsg::LVM_SETCOLUMNWIDTH,column.to_i,width.to_i)
498
+ end
499
+
500
+ def setColumnTextOf(column,text)
501
+ p=@screen.application.arg2cstructStr(WStruct::LVCOLUMN,
502
+ 4,0,0,text,text.size,0)
503
+ sendMessage WMsg::LVM_SETCOLUMN,column.to_i,p
504
+ end
505
+ def setColumnFormatOf(column,format)
506
+ p=@screen.application.arg2cstructStr(WStruct::LVCOLUMN,
507
+ 1,format,0,"",0,0)
508
+ sendMessage WMsg::LVM_SETCOLUMN,column.to_i,p
509
+ end
510
+ def getColumnTextOf(column)
511
+ p=@screen.application.arg2cstructStr(WStruct::LVCOLUMN,
512
+ 4,0,0,"\0"*128,128,0)
513
+ rv=sendMessage WMsg::LVM_GETCOLUMN,column.to_i,p
514
+ r=@screen.application.unpack(p,WStruct::LVCOLUMN)[3]
515
+ if rv!=0 then
516
+ @screen.application.pointer2string(r)
517
+ else
518
+ nil
519
+ end
520
+ end
521
+ def getColumnFormatOf(column)
522
+ p=@screen.application.arg2cstructStr(WStruct::LVCOLUMN,
523
+ 1,0,0,"",0,0)
524
+ rv=sendMessage WMsg::LVM_GETCOLUMN,column.to_i,p
525
+ if rv!=0 then
526
+ @screen.application.unpack(p,WStruct::LVCOLUMN)[1]
527
+ else
528
+ nil
529
+ end
530
+ end
531
+
532
+ def insertItem(index,texts,lparam=0,textsize=128)
533
+ lvitem=@screen.application.arg2cstructStr(WStruct::LVITEM,
534
+ 0xf,index,0,0,0,texts[0].to_s,textsize,0,lparam)
535
+ item=sendMessage(WMsg::LVM_INSERTITEM,0,lvitem)
536
+
537
+ 1.upto(texts.size-1) do |subitem|
538
+ setItemTextOf(item,subitem,texts[subitem],textsize)
539
+ end
540
+ item
541
+ end
542
+
543
+ def addItem(*args)
544
+ insertItem(30000,*args)
545
+ end
546
+
547
+ def insertMultiItems(index,multitexts,textsize=128)
548
+ n=multitexts.size
549
+ 0.upto(n-1) do |i|
550
+ insertItem(index+i,*multitexts[i])
551
+ end
552
+ end
553
+
554
+ def deleteItem(idx)
555
+ sendMessage WMsg::LVM_DELETEITEM,idx.to_i,0
556
+ end
557
+ def clearItems
558
+ sendMessage WMsg::LVM_DELETEALLITEM,0,0
559
+ end
560
+ def countItems
561
+ sendMessage WMsg::LVM_GETITEMCOUNT,0,0
562
+ end
563
+ def hittest(x,y)
564
+ lvhit=@screen.application.arg2cstructStr(WStruct::LVHITTEST,
565
+ x.to_i,y.to_i,0,0)
566
+ sendMessage WMsg::LVM_HITTEST,0,lvhit
567
+ @screen.application.unpack(lvhit,WStruct::LVHITTEST)[3]
568
+ end
569
+ def hittest2(x,y)
570
+ lvhit=@screen.application.arg2cstructStr(WStruct::LVHITTEST,
571
+ x.to_i,y.to_i,0,0)
572
+ sendMessage WMsg::LVM_SUBITEMHITTEST,0,lvhit
573
+ @screen.application.unpack(lvhit,WStruct::LVHITTEST)
574
+ end
575
+
576
+ def getNextItem(start,flag)
577
+ r=sendMessage WMsg::LVM_GETNEXTITEM,start,MAKELPARAM(flag,0)
578
+ case(r)
579
+ when -1
580
+ 0
581
+ when 0
582
+ nil
583
+ else
584
+ r
585
+ end
586
+ end
587
+
588
+ def focusedItem
589
+ getNextItem(0,1)
590
+ end
591
+
592
+ def setImagelist(imagelist,itype=0)
593
+ raise "not Imagelist" unless imagelist.is_a?(SWin::Imagelist)
594
+ self.properties["imagelist"]=imagelist
595
+ sendMessage WMsg::LVM_SETIMAGELIST,itype,imagelist.himagelist
596
+ end
597
+
598
+ def setItemIconOf(idx,imageid)
599
+ lvitem=@screen.application.arg2cstructStr(WStruct::LVITEM,
600
+ 2,idx,0,0,0xffff,"",0,imageid.to_i,0) # 2=LVIF_IMAGE
601
+ sendMessage WMsg::LVM_SETITEM,idx.to_i,lvitem
602
+ end
603
+ def getItemIconOf(idx)
604
+ lvitem=@screen.application.arg2cstructStr(WStruct::LVITEM,
605
+ 0x2,idx,0,0,0,"",0,0,0)
606
+ sendMessage( WMsg::LVM_GETITEM,0,lvitem )
607
+ @screen.application.unpack(lvitem,WStruct::LVITEM)[7]
608
+ end
609
+
610
+ def setItemStateOf(idx,state)
611
+ lvitem=@screen.application.arg2cstructStr(WStruct::LVITEM,
612
+ 0,0,0,state,0xffff,"",0,0,0)
613
+ sendMessage WMsg::LVM_SETITEMSTATE,idx.to_i,lvitem
614
+ end
615
+ def getItemStateOf(idx)
616
+ sendMessage WMsg::LVM_GETITEMSTATE,idx.to_i,0xffff
617
+ end
618
+ def selectItem(idx,flag)
619
+ if flag then
620
+ s = getItemStateOf(idx) | WConst::LVIS_SELECTED
621
+ else
622
+ s = getItemStateOf(idx) & (~ WConst::LVIS_SELECTED)
623
+ end
624
+ setItemStateOf(idx,s)
625
+ end
626
+
627
+ def setItemTextOf(idx,subitem,text,textsize=text.size)
628
+ lvitem=@screen.application.arg2cstructStr(WStruct::LVITEM,
629
+ 0,0,subitem,0,0,text.to_s,textsize,0,0)
630
+ sendMessage WMsg::LVM_SETITEMTEXT,idx.to_i,lvitem
631
+ end
632
+ def getItemTextOf(idx,subitem=0,textsize=128)
633
+ app=@screen.application
634
+ lvitem=app.arg2cstructStr(WStruct::LVITEM,
635
+ 0,0,subitem,0,0,"\0"*textsize,textsize,0,0)
636
+ sendMessage( WMsg::LVM_GETITEMTEXT,idx,lvitem )
637
+ app.pointer2string(app.unpack(lvitem,WStruct::LVITEM)[5])
638
+ end
639
+
640
+ def setItemLParamOf(idx,lparam)
641
+ lvitem=@screen.application.arg2cstructStr(WStruct::LVITEM,
642
+ 0x4,idx,0,0,0,"",0,0,lparam.to_i)
643
+ sendMessage WMsg::LVM_SETITEM,0,lvitem
644
+ end
645
+ def getItemLParamOf(idx)
646
+ lvitem=@screen.application.arg2cstructStr(WStruct::LVITEM,
647
+ 0x4,idx,0,0,0,"",0,0,0)
648
+ sendMessage( WMsg::LVM_GETITEM,0,lvitem )
649
+ @screen.application.unpack(lvitem,WStruct::LVITEM)[8]
650
+ end
651
+
652
+ def selected?(idx) (getItemStateOf(idx)&1)>0 end
653
+ def focused?(idx) (getItemStateOf(idx)&2)>0 end
654
+
655
+ def eachSelectedItems
656
+ n=countItems
657
+ 0.upto(n-1) do |i|
658
+ if (getItemStateOf(i)&WConst::LVIS_SELECTED)>0 then
659
+ yield i
660
+ end
661
+ end
662
+ end
663
+
664
+ def countSelectedItems()
665
+ sendMessage WMsg::LVM_GETSELECTED,0,0
666
+ end
667
+
668
+ def getItemRect(item,code=0)
669
+ prc = [code,0,0,0].pack("iiii")
670
+ sendMessage WMsg::LVM_GETITEMRECT,item,prc
671
+ prc.unpack("iiii")
672
+ end
673
+
674
+ def ensureVisible(i,partial=true)
675
+ flag = if partial then 1 else 0 end
676
+ sendMessage WMsg::LVM_ENSUREVISIBLE,i.to_i,flag
677
+ end
678
+
679
+ end
680
+
681
+
682
+ #Treeview
683
+ module WMsg
684
+ TVM_INSERTITEM = 0x1100 #INSERTITEMA
685
+ TVM_DELETEITEM = 0x1100+1
686
+ TVM_GETCOUNT = 0x1100+5
687
+ TVM_SETIMAGELIST = 0x1100+9
688
+ TVM_GETNEXTITEM = 0x1100+10
689
+ TVM_SELECTITEM = 0x1100+11
690
+ TVM_GETINDENT = 0x1100+6
691
+ TVM_SETINDENT = 0x1100+7
692
+ TVM_GETITEM = 0x1100+12 #GETITEMA
693
+ TVM_SETITEM = 0x1100+13 #SETITEMA
694
+ TVM_HITTEST = 0x1100+17
695
+ TVM_SORTCHILDREN = 0x1100+19
696
+
697
+ TVN_START = 0xffffffff-399
698
+ TVN_SELCHANGED = TVN_START-2 #SELCHANGEDA
699
+ TVN_ITEMEXPANDED = TVN_START-6 #ITEMEXPANDEDA
700
+ TVN_BEGINDRAG = TVN_START-7 #BEGINDRAGA
701
+ TVN_BEGINRDRAG = TVN_START-8 #BEGINRDRAGA
702
+ TVN_DELETEITEM = TVN_START-9 #DELETEITEMA
703
+ TVN_KEYDOWN = TVN_START-12
704
+ end
705
+ module WStyle
706
+ TVS_DEFAULT = 0xf
707
+ end
708
+
709
+ module WConst
710
+ TVI_ROOT = 0xffff0000
711
+ TVI_FIRST = 0xffff0001
712
+ TVI_LAST = 0xffff0002
713
+ TVI_SORT = 0xffff0003
714
+
715
+ TVGN_ROOT = 0x0000
716
+ TVGN_NEXT = 0x0001
717
+ TVGN_PARENT = 0x0003
718
+ TVGN_CHILD = 0x0004
719
+ TVGN_CARET = 0x0009
720
+ end
721
+ module WStruct
722
+ TVITEM="UUUUPIIIIL"
723
+ TREEINSERTITEM="UU"+TVITEM
724
+ TVHITTEST = LVHITTEST
725
+ NM_TREEVIEW= NMHDR+"U"+TVITEM+TVITEM+"LL" #UINT action,TV_ITEM old, new,POINT
726
+ end
727
+
728
+
729
+ class VRTreeview < VRNotifyControl
730
+ =begin
731
+ == VRTreeview
732
+ Treeview.
733
+
734
+ === Methods
735
+ ((|hitem|)) is an Integer value identifying treeview item.
736
+
737
+ --- insertItem(hparent,hafter,text,lparam=0,textsize=text.size)
738
+ Inserts a new item below ((|hparent|)) and after ((|hafter|)), the text is
739
+ ((|text|)) and lparam=((|lparam|)).
740
+ --- insertMultiItems(hparent,hafter,items)
741
+ Inserts new items below ((|hparent|)) and after ((|hafter|)).
742
+ ((|items|)) is a structured array of item array.
743
+ [text,lparam, child item array as optional].
744
+ --- addItem(hparent,text,lparam=0,textsize=text.size)
745
+ Adds a new item below ((|hparent|)) at the last.
746
+ --- addMultiItems(hparent,items)
747
+ Same as insertMultiItems( ((|hparent|)),last,((|items|)) )
748
+ --- deleteItem(hitem)
749
+ Deletes the item.
750
+ --- clearItems
751
+ Deletes all items.
752
+ --- countItems
753
+ Counts items.
754
+ --- selectItem(hitem)
755
+ Selects the item.
756
+ --- indent
757
+ Returns the indent width.
758
+ --- indent=
759
+ Sets the indent width.
760
+ --- hittest(x,y)
761
+ Inspect the item index which is at the co-ordinate(((|x|)),((|y|)))
762
+ --- hittest2(x,y)
763
+ Returns the item information which is at the co-ordinate(((|x|)),((|y|))).
764
+ The information is the array [x,y,part,index,subitem]
765
+ --- getNextItem(hitem,code)
766
+ Searches for an item described by ((|start|)) and ((|code|)).
767
+ ((|code|)) is the series of TVGN_???? in commctrl.h
768
+ --- topItem
769
+ The top item in the listview. (not the visible top item)
770
+ --- root
771
+ The virtual root item which is not visible and touched.
772
+ --- last
773
+ The last item in the listview (not the visible last item)
774
+ --- selectedItem()
775
+ Returns the selected item. aliased as selected
776
+ --- getParentOf(hitem)
777
+ Returns the parent item of ((|hitem|)).
778
+ --- getChildOf(hitem)
779
+ Returns the first child item of ((|hitem|)).
780
+ --- getNextSiblingOf(hitem)
781
+ Returns the next sibling item of ((|hitem|)).
782
+ --- setImagelist(imagelist)
783
+ Set ((|imagelist|)) for displaying icons of items. ((|imagelist|)) must be
784
+ a kind of SWin::Imagelist.
785
+ --- setItemIconOf(hitem,img,simg)
786
+ Sets image ids of the item. ((|img|)) for normal state image and ((|simg|))
787
+ for selected state image. Both of them are Integers of id in ImageList and
788
+ ((|img|)) and ((|simg|)) can be ignored by setting nil instead of integer.
789
+ The imagelist is set by ((<setImagelist>)) method.
790
+ --- getItemIconOf(hitem)
791
+ Returns images id of the item.
792
+ --- setItemLParamOf(hitem,lparam)
793
+ Sets lparam of the item.
794
+ --- getItemLParamOf(hitem)
795
+ Returns lparam of the item.
796
+ --- setItemTextOf(hitem,text)
797
+ Sets text of the item.
798
+ --- getItemTextOf(hitem,textsize=128)
799
+ Returns text of the item.
800
+ --- setItemStateOf(hitem,state)
801
+ Sets state of the item.
802
+ * 1 : focused
803
+ * 2 : selected
804
+ * 4 : cut
805
+ * 8 : drophilited
806
+ *16 : bold
807
+ *32 : expanded
808
+ --- getItemStateOf(hitem)
809
+ Returns state of the item.
810
+
811
+ === Event handlers
812
+ --- ????_selchanged(hitem,lparam)
813
+ fired when selected item is changed to ((|hitem|))
814
+ whose lparam is ((|lparam|)).
815
+ --- ????_itemexpanded(hitem,state,lparam)
816
+ fired when the ((|hitem|)) item is expanded or closed.
817
+ --- ????_deleteitem(hitem,lparam)
818
+ fired when the item is deleted.
819
+ --- ????_begindrag(hitem,state,lparam)
820
+ --- ????_beginrdrag(hitem,state,lparam)
821
+ =end
822
+
823
+ private
824
+ def nilnull(r) if r==0 then nil else r end end
825
+
826
+ public
827
+ WINCLASSINFO = ["SysTreeView32",WStyle::TVS_DEFAULT,0x200]
828
+
829
+ def treeviewinit
830
+ # "F FFFFFFFFFF FTFFFFFFFT FF"
831
+ addNotifyHandler(WMsg::TVN_SELCHANGED,"selchanged",
832
+ MSGTYPE::ARGSTRUCT,WStruct::NM_TREEVIEW)
833
+ addFilterArg WMsg::TVN_SELCHANGED,"FFFFFFFFFFFFTFFFFFFFTFF" #hitem,lparam
834
+ addNotifyHandler(WMsg::TVN_ITEMEXPANDED,"itemexpanded",
835
+ MSGTYPE::ARGSTRUCT,WStruct::NM_TREEVIEW)
836
+ addFilterArg WMsg::TVN_ITEMEXPANDED,"FFFFFFFFFFFFTTFFFFFFTFF" #hitem,state,lparam
837
+ addNotifyHandler(WMsg::TVN_DELETEITEM,"deleteitem",
838
+ MSGTYPE::ARGSTRUCT,WStruct::NM_TREEVIEW)
839
+ addFilterArg WMsg::TVN_DELETEITEM,"FFTFFFFFFFTFFFFFFFFFFFF" #hitem,lparam
840
+ addNotifyHandler(WMsg::TVN_BEGINDRAG,"begindrag",
841
+ MSGTYPE::ARGSTRUCT,WStruct::NM_TREEVIEW)
842
+ addFilterArg WMsg::TVN_BEGINDRAG,"FFFFFFFFFFFFTTFFFFFFTFF" #hitem,state,lparam
843
+ addNotifyHandler(WMsg::TVN_BEGINRDRAG,"beginrdrag",
844
+ MSGTYPE::ARGSTRUCT,WStruct::NM_TREEVIEW)
845
+ addFilterArg WMsg::TVN_BEGINRDRAG,"FFFFFFFFFFFFTTFFFFFFTFF" #hitem,state,lparam
846
+ end
847
+
848
+ def vrinit
849
+ super
850
+ treeviewinit
851
+ end
852
+
853
+ def insertItem(hparent,hafter,text,lparam=0,textsize=text.size)
854
+ ti=@screen.application.arg2cstructStr(WStruct::TREEINSERTITEM,hparent,hafter,
855
+ 0x0f,0,0,0,text.to_s,textsize,0,0,0,lparam)
856
+ sendMessage WMsg::TVM_INSERTITEM,0,ti
857
+ end
858
+
859
+ def addItem(hparent,*args)
860
+ insertItem(hparent, WConst::TVI_LAST,*args)
861
+ end
862
+
863
+ def insertMultiItems(hparent,hafter,multitext)
864
+ ha = if hafter then hafter else WConst::TVI_LAST end
865
+
866
+ multitext.each do |item|
867
+ if item.is_a?(Array)
868
+ item[1] = 0 unless item[1]
869
+ h=insertItem(hparent,ha,item[0],item[1])
870
+ if item.size>2 and item[2].is_a?(Array) then
871
+ insertMultiItems(h,WConst::TVI_LAST,item[2])
872
+ end
873
+ ha=h
874
+ else
875
+ raise ArgumentError,"Arg2 illegal"
876
+ end
877
+ end
878
+ end
879
+ def addMultiItems(hparent,*args)
880
+ insertMultiItems(hparent, WConst::TVI_LAST,*args)
881
+ end
882
+
883
+ def deleteItem(htreei)
884
+ sendMessage WMsg::TVM_DELETEITEM,0,htreei
885
+ end
886
+ def clearItems
887
+ deleteItem(WConst::TVGN_ROOT)
888
+ end
889
+ def countItems
890
+ sendMessage WMsg::TVM_GETCOUNT,0,0
891
+ end
892
+ def selectItem(hitem)
893
+ sendMessage WMsg::TVM_SELECTITEM,9,hitem
894
+ end
895
+
896
+ def indent
897
+ sendMessage WMsg::TVM::TVM_GETINDENT,0,0
898
+ end
899
+ def indent=(idt)
900
+ sendMessage WMsg::TVM::TVM_SETINDENT,idt.to_i,0
901
+ end
902
+
903
+ def hittest(x,y)
904
+ tvhit=@screen.application.arg2cstructStr(WStruct::TVHITTEST,
905
+ x.to_i,y.to_i,0,0)
906
+ sendMessage WMsg::TVM_HITTEST,0,tvhit
907
+ @screen.application.unpack(tvhit,WStruct::TVHITTEST)[3]
908
+ end
909
+ def hittest2(x,y)
910
+ tvhit=@screen.application.arg2cstructStr(WStruct::TVHITTEST,
911
+ x.to_i,y.to_i,0,0)
912
+ sendMessage WMsg::TVM_HITTEST,0,tvhit
913
+ @screen.application.unpack(tvhit,WStruct::TVHITTEST)
914
+ end
915
+
916
+ def getNextItem(hitem,code)
917
+ sendMessage WMsg::TVM_GETNEXTITEM,code,hitem
918
+ end
919
+ def topItem() getNextItem(0,WConst::TVGN_ROOT) end
920
+ def root() WConst::TVI_ROOT end
921
+ def last() WCONST::TVI_LAST end
922
+
923
+ def selectedItem() nilnull(getNextItem(0,WConst::TVGN_CARET)) end
924
+ alias selected :selectedItem
925
+ def getParentOf(hitem) nilnull(getNextItem(hitem,WConst::TVGN_PARENT))end
926
+ def getChildOf(hitem) nilnull(getNextItem(hitem,WConst::TVGN_CHILD)) end
927
+ def getNextSiblingOf(hitem) nilnull(getNextItem(hitem,WConst::TVGN_NEXT)) end
928
+
929
+ def setImagelist(imagelist,itype=0)
930
+ raise "not Imagelist" unless imagelist.is_a?(SWin::Imagelist)
931
+ self.properties["imagelist"]=imagelist
932
+ sendMessage WMsg::TVM_SETIMAGELIST,itype,imagelist.himagelist
933
+ end
934
+
935
+ def setItemIconOf(hitem,img,simg=nil)
936
+ # TVIF_IMAGE=2, TVIF_SELECTEDIMAGE=0x20
937
+ mask=0; image=0; simage=0
938
+ if img then mask |= 2; image = img end
939
+ if simg then mask |= 0x20; simage = simg end
940
+
941
+ tvitem=@screen.application.arg2cstructStr(WStruct::TVITEM,
942
+ mask,hitem.to_i,0,0,"",0,image,simage,0,0)
943
+ sendMessage WMsg::TVM_SETITEM,0,tvitem
944
+ end
945
+ def getItemIconOf(hitem)
946
+ tvitem=@screen.application.arg2cstructStr(WStruct::TVITEM,
947
+ 0x22,hitem.to_i,0,0,"",0,0,0,0,0)
948
+ sendMessage WMsg::TVM_GETITEM,0,tvitem
949
+ @screen.application.unpack(tvitem,WStruct::TVITEM)[6..7]
950
+ end
951
+
952
+ def setItemLParamOf(hitem,lparam)
953
+ tvitem=@screen.application.arg2cstructStr(WStruct::TVITEM,
954
+ 4,hitem.to_i,0,0,"",0,0,0,0,lparam.to_i) # 4=TVIF_PARAM
955
+ sendMessage WMsg::TVM_SETITEM,0,tvitem
956
+ end
957
+ def getItemLParamOf(hitem)
958
+ tvitem=@screen.application.arg2cstructStr(WStruct::TVITEM,
959
+ 4,hitem.to_i,0,0,"",0,0,0,0,0) # 4=TVIF_PARAM
960
+ sendMessage WMsg::TVM_GETITEM,0,tvitem
961
+ @screen.application.unpack(tvitem,WStruct::TVITEM)[9]
962
+ end
963
+ def setItemTextOf(hitem,text)
964
+ tvitem=@screen.application.arg2cstructStr(WStruct::TVITEM,
965
+ 1,hitem.to_i,0,0,text.to_s,text.size,0,0,0,0) # 1=TVIF_TEXT
966
+ sendMessage WMsg::TVM_SETITEM,0,tvitem
967
+ end
968
+ def getItemTextOf(hitem,textsize=128)
969
+ app=@screen.application
970
+ tvitem=app.arg2cstructStr(WStruct::TVITEM,
971
+ 1,hitem.to_i,0,0,"\0"*textsize,textsize,0,0,0,0) # 1=TVIF_TEXT
972
+ sendMessage WMsg::TVM_GETITEM,0,tvitem
973
+ app.pointer2string(app.unpack(tvitem,WStruct::TVITEM)[4])
974
+ end
975
+ def setItemStateOf(hitem,state)
976
+ tvitem=@screen.application.arg2cstructStr(WStruct::TVITEM,
977
+ 8,hitem.to_i,state.to_i,0x00ff,"",0,0,0,0,0) # 8=TVIF_STATE
978
+ sendMessage WMsg::TVM_SETITEM,0,tvitem
979
+ end
980
+ def getItemStateOf(hitem)
981
+ tvitem=@screen.application.arg2cstructStr(WStruct::TVITEM,
982
+ 8,hitem.to_i,0,0x00ff,"",0,0,0,0,0) # 8=TVIF_STATE
983
+ sendMessage WMsg::TVM_GETITEM,0,tvitem
984
+ @screen.application.unpack(tvitem,WStruct::TVITEM)[2]
985
+ end
986
+ end
987
+
988
+ # Progressbar
989
+ module WMsg
990
+ PBM_SETRANGE = WM_USER+1
991
+ PBM_SETPOS = WM_USER+2
992
+ PBM_DELTAPOS = WM_USER+3
993
+ PBM_SETSTEP = WM_USER+4
994
+ PBM_STEPIT = WM_USER+5
995
+ end
996
+ module WStyle
997
+ PBS_SMOOTH = 1 # ?
998
+ end
999
+
1000
+ class VRProgressbar < VRNotifyControl
1001
+ =begin
1002
+ == VRProgressbar
1003
+ Progressbar.
1004
+ === Methods
1005
+ --- setRange(minr,maxr)
1006
+ Sets the range from ((|minr|)) to ((|maxr|)).
1007
+ --- position
1008
+ Returns the current position.
1009
+ --- position=(pos)
1010
+ Sets the current position.
1011
+ --- stepwidth=(st)
1012
+ Sets the step width for ((<step>)).
1013
+ --- step
1014
+ Steps one step in position.
1015
+ --- advance(n=1)
1016
+ Steps multi steps in position.
1017
+ =end
1018
+
1019
+ WINCLASSINFO = ["msctls_progress32",0]
1020
+
1021
+ attr :stepwidth # oops!
1022
+ attr :minrange # oops!
1023
+ attr :maxrange # ooooo.....
1024
+
1025
+ def progressbarinit
1026
+ @stepwidth=10
1027
+ @minrange=0
1028
+ @maxrange=100
1029
+ end
1030
+ def vrinit
1031
+ super
1032
+ progressbarinit
1033
+ end
1034
+
1035
+ def setRange(minr,maxr)
1036
+ @minrange=minr
1037
+ @maxrange=maxr
1038
+ sendMessage WMsg::PBM_SETRANGE,0,MAKELPARAM(minr,maxr)
1039
+ end
1040
+ def position=(pos)
1041
+ sendMessage WMsg::PBM_SETPOS,pos.to_i,0
1042
+ end
1043
+ def position
1044
+ raise StandardError,"not implemented"
1045
+ end
1046
+ def advance(n=1)
1047
+ sendMessage WMsg::PBM_DELTAPOS,n.to_i,0
1048
+ end
1049
+ def stepwidth=(st)
1050
+ @stepwidth=st
1051
+ sendMessage WMsg::PBM_SETSTEP,st.to_i,0
1052
+ end
1053
+ def step
1054
+ sendMessage WMsg::PBM_STEPIT,0,0
1055
+ end
1056
+ end
1057
+
1058
+
1059
+ # Trackbar
1060
+ module WMsg
1061
+ TBM_GETPOS = WM_USER + 0
1062
+ TBM_SETPOS = WM_USER + 1
1063
+ TBM_GETRANGEMIN = WM_USER + 2
1064
+ TBM_GETRANGEMAX = WM_USER + 8
1065
+ TBM_SETRANGEMIN = WM_USER + 7
1066
+ TBM_SETRANGEMAX = WM_USER + 8
1067
+ TBM_SETSEL = WM_USER + 10
1068
+ TBM_SETSELSTART = WM_USER + 11
1069
+ TBM_SETSELEND = WM_USER + 12
1070
+ TBM_GETSELSTART = WM_USER + 17
1071
+ TBM_GETSELEND = WM_USER + 18
1072
+ TBM_CLEARSEL = WM_USER + 19
1073
+ TBM_SETPAGESIZE = WM_USER + 21
1074
+ TBM_GETPAGESIZE = WM_USER + 22
1075
+ TBM_SETLINESIZE = WM_USER + 23
1076
+ TBM_GETLINESIZE = WM_USER + 24
1077
+ end
1078
+ module WStyle
1079
+ TBS_AUTOTICS = 0x001
1080
+ TBS_VERT = 0x002
1081
+ TBS_HORZ = 0x000
1082
+ TBS_LEFT = 0x004
1083
+ TBS_BOTH = 0x008
1084
+ TBS_ENABLESEL= 0x020 #ENABELSELRANGE
1085
+ end
1086
+
1087
+ class VRTrackbar < VRNotifyControl
1088
+ =begin
1089
+ == VRTrackbar
1090
+ Trackbar.
1091
+ === Methods
1092
+ --- position
1093
+ Returns the position.
1094
+ --- position=(pos)
1095
+ Sets the position.
1096
+ --- linesize
1097
+ Returns the number of positions moved on by arrow keys.
1098
+ --- linesize=(s)
1099
+ Sets the number of positions mvoed on by arrow keys.
1100
+ --- pagesize
1101
+ Returns the number of positions moved on by [page up]/[pagedown] keys.
1102
+ --- pagesize=(p)
1103
+ Sets the number of positions moved on by [page up]/[pagedown] keys.
1104
+ --- rangeMin
1105
+ Returns minimum value of the trackbar.
1106
+ --- rangeMin=(m)
1107
+ Sets minimum value of the trackbar.
1108
+ --- rangeMax
1109
+ Returns maximum value of the trackbar.
1110
+ --- rangeMax=(m)
1111
+ Sets maximum value of the trackbar.
1112
+ --- selStart
1113
+ Returns the selection start of the trackbar.
1114
+ --- selStart=(m)
1115
+ Sets the selection start of the trackbar.
1116
+ --- selEnd
1117
+ Returns the selection end of the trackbar.
1118
+ --- selEnd=(m)
1119
+ Sets the selection end of the trackbar.
1120
+ --- clearSel
1121
+ Clears the selection.
1122
+ =end
1123
+
1124
+ WINCLASSINFO = ["msctls_trackbar32",0]
1125
+
1126
+ def vrinit
1127
+ super
1128
+ end
1129
+
1130
+ def position
1131
+ sendMessage WMsg::TBM_GETPOS,0,0
1132
+ end
1133
+ def position=(pos)
1134
+ sendMessage WMsg::TBM_SETPOS,1,pos.to_i
1135
+ end
1136
+
1137
+ def linesize
1138
+ sendMessage WMsg::TBM_GETLINESIZE,0,0
1139
+ end
1140
+ def linesize=(s)
1141
+ sendMessage WMsg::TBM_SETLINESIZE,0,s.to_i
1142
+ end
1143
+ def pagesize
1144
+ sendMessage WMsg::TBM_GETPAGESIZE,0,0
1145
+ end
1146
+ def pagesize=(s)
1147
+ sendMessage WMsg::TBM_SETPAGESIZE,0,s.to_i
1148
+ end
1149
+
1150
+ def rangeMin
1151
+ sendMessage WMsg::TBM_GETRANGEMIN,0,0
1152
+ end
1153
+ def rangeMin=(m)
1154
+ sendMessage WMsg::TBM_SETRANGEMIN,1,m.to_i
1155
+ end
1156
+ def rangeMax
1157
+ sendMessage WMsg::TBM_GETRANGEMAX,0,0
1158
+ end
1159
+ def rangeMax=(m)
1160
+ sendMessage WMsg::TBM_SETRANGEMAX,1,m.to_i
1161
+ end
1162
+ def selStart
1163
+ sendMessage WMsg::TBM_GETSELSTART,0,0
1164
+ end
1165
+ def selStart=(m)
1166
+ sendMessage WMsg::TBM_SETSELSTART,1,m.to_i
1167
+ end
1168
+ def selEnd
1169
+ sendMessage WMsg::TBM_GETSELEND,0,0
1170
+ end
1171
+ def clearSel
1172
+ sendMessage WMsg::TBM_CLEARSEL,1,0
1173
+ end
1174
+ end
1175
+
1176
+ # updown control
1177
+ module WMsg
1178
+ UDM_SETRANGE = WM_USER+101
1179
+ UDM_GETRANGE = WM_USER+102
1180
+ UDM_SETPOS = WM_USER+103
1181
+ UDM_GETPOS = WM_USER+104
1182
+ UDM_SETBUDDY = WM_USER+105
1183
+ UDM_GETBUDDY = WM_USER+106
1184
+ UDM_SETACCEL = WM_USER+107
1185
+ UDM_GETACCEL = WM_USER+108
1186
+ UDM_SETBASE = WM_USER+109
1187
+ UDM_GETBASE = WM_USER+110
1188
+
1189
+ UDN_DELTAPOS = 0x100000000-722
1190
+ end
1191
+ module WStyle
1192
+ UDS_ALIGNRIGHT = 0x04
1193
+ UDS_ALIGNLEFT = 0x08
1194
+ UDS_HORZ = 0x40
1195
+
1196
+ # Thanks to Katonbo-san
1197
+ UDS_SETBUDDYINT = 0x0002
1198
+ UDS_AUTOBUDDY = 0x0010
1199
+ UDS_ARROWKEYS = 0x0020
1200
+ UDS_NOTHOUSANDS = 0x0080
1201
+
1202
+ UDS_INTBUDDYRIGHT = UDS_SETBUDDYINT | UDS_AUTOBUDDY | UDS_ALIGNRIGHT
1203
+ end
1204
+
1205
+ module WStruct
1206
+ NM_UPDOWN = NMHDR+"UU"
1207
+ end
1208
+ class VRUpdown < VRNotifyControl
1209
+ =begin
1210
+ == VRUpdown
1211
+ Updown control.
1212
+ ===Methods
1213
+ --- setRange(minr,maxr)
1214
+ Sets the range from ((|minr|)) to ((|maxr|)).
1215
+ --- getRange
1216
+ Returns the range as an array [minr,maxr]
1217
+ --- position
1218
+ Returns current position.
1219
+ --- position=
1220
+ Sets current position.
1221
+ --- base
1222
+ Radix.
1223
+ --- base=(b)
1224
+ Sets the radix that is 10 or 16.
1225
+ === Event handlers
1226
+ --- ????_changed(pos)
1227
+ Fired when the position is changing from ((|pos|)).
1228
+ Note that ((|pos|)) is a previous value. To obtain the current value,
1229
+ use buddy control which is a (edit) control made directry before
1230
+ the updown control(using VREdit#changed or its parent handler).
1231
+ =end
1232
+ WINCLASSINFO = ["msctls_updown32",0]
1233
+
1234
+ def updowninit
1235
+ addNotifyHandler(WMsg::UDN_DELTAPOS,"deltapos",
1236
+ MSGTYPE::ARGSTRUCT,WStruct::NM_UPDOWN)
1237
+ addFilterArg WMsg::UDN_DELTAPOS,"TF"
1238
+ end
1239
+ def vrinit
1240
+ super
1241
+ updowninit
1242
+ end
1243
+
1244
+ def setRange(minr,maxr)
1245
+ sendMessage WMsg::UDM_SETRANGE,0,MAKELPARAM(maxr,minr)
1246
+ end
1247
+ def getRange
1248
+ r=sendMessage WMsg::UDM_GETRANGE,0,0
1249
+ return HIWORD(r),LOWORD(r)
1250
+ end
1251
+
1252
+ def position=(p)
1253
+ sendMessage WMsg::UDM_SETPOS,0,MAKELPARAM(p.to_i,0)
1254
+ end
1255
+ def position
1256
+ sendMessage WMsg::UDM_GETPOS,0,0
1257
+ end
1258
+
1259
+ def base=(b)
1260
+ sendMessage WMsg::UDM_SETBASE,b.to_i,0
1261
+ end
1262
+ def base
1263
+ sendMessage WMsg::UDM_GETBASE,0,0
1264
+ end
1265
+ end
1266
+
1267
+ # Statusbar
1268
+
1269
+ module WMsg
1270
+ SB_SETTEXT = WM_USER+1 #SETTEXT
1271
+ SB_GETTEXT = WM_USER+2 #GETTEXT
1272
+ SB_GETTEXTLENGTH = WM_USER+3 #GETTEXTLENGTH
1273
+ SB_SETPARTS = WM_USER+4
1274
+ SB_GETPARTS = WM_USER+6
1275
+ SB_SETMINHEIGHT = WM_USER+8
1276
+ SB_GETRECT = WM_USER+10
1277
+ end
1278
+ module WConst
1279
+ SBT_OWNERDRAW =0x1000
1280
+ SBT_NOBORDERS =0x0100
1281
+ SBT_POPOUT =0x0200
1282
+ SBT_RTLREADING =0x0400
1283
+ end
1284
+
1285
+ class VRStatusbar < VRNotifyControl
1286
+ =begin
1287
+ == VRStatusbar
1288
+ Statusbar.
1289
+ === Methods
1290
+ --- setparts(p,width=[-1])
1291
+ Devides the statusbar into ((|p|)) parts with the widths specified by
1292
+ ((|width|)) which is an Integer array. If the width is -1, the right edge
1293
+ of the part is to be at the right edge of the statusbar.
1294
+ --- parts
1295
+ Returns the number of parts.
1296
+ --- getTextOf(idx)
1297
+ Returns the text of the parts.
1298
+ --- setTextOf(idx,text,style=0)
1299
+ Sets the text of the parts whose index is ((|idx|)) to ((|text|))
1300
+ --- getRectOf(idx)
1301
+ Returns the position and size of the parts as an array [x,y,w,h].
1302
+ --- minheight=(minh)
1303
+ Sets the minimum height of the statusbar.
1304
+ =end
1305
+
1306
+ WINCLASSINFO = ["msctls_statusbar32",0]
1307
+
1308
+ def getTextOf(idx)
1309
+ len = 1+LOWORD(sendMessage(WMsg::SB_GETTEXTLENGTH,idx,0))
1310
+ r="\0"*len
1311
+ sendMessage WMsg::SB_GETTEXT,idx,r
1312
+ r
1313
+ end
1314
+ def setTextOf(idx,text,style=0)
1315
+ sendMessage WMsg::SB_SETTEXT,(idx|(style&0xff00)),text.to_s
1316
+ end
1317
+ def parts
1318
+ sendMessage WMsg::SB_GETPARTS,0,0
1319
+ end
1320
+ def setparts(p,widths=[-1])
1321
+ if widths then
1322
+ raise(ArgumentError,"width illegal") unless widths.is_a?(Array)
1323
+ end
1324
+ r=@screen.application.arg2cstructStr("I"*p,*widths)
1325
+ sendMessage WMsg::SB_SETPARTS,p.to_i,r
1326
+ end
1327
+ def getRectOf(idx)
1328
+ r=@screen.application.arg2cstructStr("UUUU",0,0,0,0)
1329
+ sendMessage WMsg::SB_GETRECT,idx.to_i,r
1330
+ @screen.application.cstruct2array(r,"UUUU")
1331
+ end
1332
+ def minheight=(h)
1333
+ sendMessage WMsg::SB_SETMINHEIGHT,h.to_i,0
1334
+ end
1335
+ end
1336
+
1337
+ module VRStatusbarDockable
1338
+ =begin
1339
+ == VRStatusbarDockable
1340
+ This is a module to be added into VRForm for a statusbar that follows form resizing.
1341
+
1342
+ === Method
1343
+ --- addStatusbar(caption='',height=10,control=VRStatusbar)
1344
+ Adds a statusbar on a form. If you have another statusbar control, you may
1345
+ set it for ((|control|)).
1346
+ =end
1347
+
1348
+ def statusbardockableinit
1349
+ addHandler WMsg::WM_SIZE, "vr_statusbardock", MSGTYPE::ARGLINTINT,nil
1350
+ acceptEvents [WMsg::WM_SIZE]
1351
+ end
1352
+
1353
+ def vrinit
1354
+ super
1355
+ statusbardockableinit
1356
+ end
1357
+
1358
+ def addStatusbar(caption="",height=10,control=VRStatusbar)
1359
+ @_vr_statusbar=addControl control,"statusbar",caption,10,10,10,height
1360
+ if self.visible? then
1361
+ a=self.clientrect
1362
+ sendMessage WMsg::WM_SIZE,0,MAKELPARAM(a[2]-a[0],a[3]-a[1])
1363
+ end
1364
+ @statusbar = @_vr_statusbar
1365
+ end
1366
+
1367
+ def self_vr_statusbardock(w,h)
1368
+ if defined?(@_vr_statusbar) then
1369
+ s=@_vr_statusbar
1370
+ s.move 0, self.h - s.h, self.w, self.h - s.h
1371
+ end
1372
+ end
1373
+
1374
+ end
1375
+
1376
+
1377
+ #Tabcontrol
1378
+
1379
+ module WMsg
1380
+ TCM_FIRST=0x1300
1381
+ TCM_GETIMAGELIST = (TCM_FIRST + 2)
1382
+ TCM_SETIMAGELIST = (TCM_FIRST + 3)
1383
+ TCM_GETITEMCOUNT = (TCM_FIRST + 4)
1384
+ TCM_GETITEM = (TCM_FIRST + 5)
1385
+ TCM_SETITEM = (TCM_FIRST + 6)
1386
+ TCM_INSERTITEM = (TCM_FIRST + 7)
1387
+ TCM_DELETEITEM = (TCM_FIRST + 8)
1388
+ TCM_DELETEALLITEMS = (TCM_FIRST + 9)
1389
+ TCM_GETITEMRECT = (TCM_FIRST + 10)
1390
+ TCM_GETCURSEL = (TCM_FIRST + 11)
1391
+ TCM_SETCURSEL = (TCM_FIRST + 12)
1392
+ TCM_ADJUSTRECT = (TCM_FIRST + 40)
1393
+ TCM_SETITEMSIZE = (TCM_FIRST + 41)
1394
+ TCM_GETCURFOCUS = (TCM_FIRST + 47)
1395
+ TCM_SETCURFOCUS = (TCM_FIRST + 48)
1396
+
1397
+ TCN_FIRST = 0xffffffff-549
1398
+ TCN_SELCHANGE = (TCN_FIRST - 1)
1399
+ end
1400
+
1401
+ module WStyle
1402
+ TCS_BOTTOM = 0x0002
1403
+ TCS_RIGHT = 0x0002
1404
+ TCS_MULTISELECT = 0x0004
1405
+ TCS_FLATBUTTONS = 0x0008
1406
+
1407
+ TCS_FORCEICONLEFT = 0x0010
1408
+ TCS_FORCELABELLEFT = 0x0020
1409
+ TCS_HOTTRACK = 0x0040
1410
+ TCS_VERTICAL = 0x0080
1411
+ TCS_TABS = 0x0000
1412
+ TCS_BUTTONS = 0x0100
1413
+ TCS_SINGLELINE = 0x0000
1414
+ TCS_MULTILINE = 0x0200
1415
+ TCS_RIGHTJUSTIFY = 0x0000
1416
+ TCS_FIXEDWIDTH = 0x0400
1417
+ TCS_RAGGEDRIGHT = 0x0800
1418
+ TCS_FOCUSONBUTTONDOWN= 0x1000
1419
+ TCS_OWNERDRAWFIXED = 0x2000
1420
+ TCS_TOOLTIPS = 0x4000
1421
+ TCS_FOCUSNEVER = 0x8000
1422
+ end
1423
+
1424
+ module WStruct
1425
+ TC_ITEM = "UUUPUUU" # Mask,rsrv1,rsrv2,Text,TextMax,iImage,lParam
1426
+ end
1427
+
1428
+ class VRTabControl < VRNotifyControl
1429
+ =begin
1430
+ == VRTabControl
1431
+ Tabs.
1432
+ This class doesn't have a function to show/hide controls according to
1433
+ the selected tab. For that function ((<VRTabbedPanel>)) class is provided below.
1434
+ === Methods
1435
+ --- insertTab(index,text,textmax=text.size,lparam=0)
1436
+ Inserts a new tab named ((|text|)) with ((|lparam|)) at ((|index|))-th.
1437
+ ((|index|)) is ordinal number for tabs.
1438
+ --- clearTabs
1439
+ Deletes all tabs.
1440
+ --- deleteTab(idx)
1441
+ Deletes a tab at ((|index|))
1442
+ --- countTabs
1443
+ Counts tabs in the control.
1444
+ --- selectedTab
1445
+ Returns the selected tab's index.
1446
+ --- selectTab(idx)
1447
+ Selects the tab at ((|idx|))
1448
+ --- setImagelist(imagelist)
1449
+ Sets an imagelist for the tabs.
1450
+ --- setTabSize(width,height)
1451
+ Sets each tab size.
1452
+ --- getTabRect(i)
1453
+ Returns the client area of the tab at ((|idx|)) as an array of [x,y,w,h].
1454
+ --- adjustRect(x,y,w,h,flag=false)
1455
+ Adjusts a rectangle coodinates for tabcontrol's clientarea which is
1456
+ excluded tab buttons area. ((|flag|)) means the direction of adjusting.
1457
+ adjustRect(0,0,10,10,false) returns a leftsided rectangle below the
1458
+ tab buttons.
1459
+ --- getTabTextOf(idx)
1460
+ Gets a title text of tab at ((|idx|)).
1461
+ --- setTabTextOf(idx,text)
1462
+ Sets a title text of tab at ((|idx|)) as ((|text|)).
1463
+ --- getTabImageOf(idx)
1464
+ Gets a image id in the imagelist for tab at((|idx|)).
1465
+ --- setTabImageOf(idx,image)
1466
+ Sets a image id into ((|image|)) in the imagelist for tab at((|idx|)).
1467
+ --- getTabLParamOf(idx)
1468
+ Gets lparam value of tab at((|idx|)).
1469
+ --- setTabLParamOf(idx,lparam)
1470
+ Sets lparam value of tab at((|idx|)) as ((|lparam|)).
1471
+
1472
+ === Event Handlers
1473
+ --- ????_selchanged
1474
+ Fired when the selected tab changed. To get current tab id, use selectedTab
1475
+ method.
1476
+ =end
1477
+
1478
+ include VRParent
1479
+
1480
+ WINCLASSINFO = ["SysTabControl32",0] #TCS_TAB
1481
+
1482
+ def tabcontrolinit
1483
+ addNotifyHandler WMsg::TCN_SELCHANGE,"selchanged",MSGTYPE::ARGNONE,nil
1484
+ end
1485
+
1486
+ def vrinit
1487
+ super
1488
+ tabcontrolinit
1489
+ end
1490
+
1491
+ def clearTabs
1492
+ sendMessage WMsg::TCM_DELETEALLITEMS,0,0
1493
+ end
1494
+
1495
+ def deleteTab(i)
1496
+ sendMessage WMsg::TCM_DELETEITEM,i,0
1497
+ end
1498
+
1499
+ def selectedTab
1500
+ sendMessage WMsg::TCM_GETCURSEL,0,0
1501
+ end
1502
+
1503
+ def countTabs
1504
+ sendMessage WMsg::TCM_GETITEMCOUNT,0,0
1505
+ end
1506
+
1507
+ def insertTab(idx,text,textmax=text.size,lparam=0)
1508
+ tb=@screen.application.arg2cstructStr(WStruct::TC_ITEM,
1509
+ 0x9,0,0,text,textmax,0,lparam)
1510
+ # Mask,rsrv1,rsrv2,Text,TextMax,iImage,lParam
1511
+ sendMessage WMsg::TCM_INSERTITEM,idx.to_i,tb
1512
+ end
1513
+
1514
+ def selectTab(i)
1515
+ sendMessage WMsg::TCM_SETCURSEL,i,0
1516
+ end
1517
+
1518
+ def setImagelist(imagelist)
1519
+ raise "not Imagelist" unless imagelist.is_a?(SWin::Imagelist)
1520
+ sendMessage WMsg::TCM_SETIMAGELIST,0,imagelist.himagelist
1521
+ end
1522
+
1523
+ def setTabSize(width,height)
1524
+ sendMessage WMsg::TCM_SETITEMSIZE,0,MAKELPARAM(width,height)
1525
+ end
1526
+
1527
+ def getTabRect(i)
1528
+ rect="\0"*16
1529
+ sendMessage WMsg::TCM_GETITEMRECT,i.to_i,rect
1530
+ return @screen.application.unpack(rect,"UUUU")
1531
+ end
1532
+
1533
+ def adjustRect(x,y,w,h,flag=false)
1534
+ f = if flag then 1 else 0 end
1535
+ rect=@screen.application.arg2cstructStr("UUUU",x,y,w,h)
1536
+ sendMessage WMsg::TCM_ADJUSTRECT,f,rect
1537
+ return @screen.application.unpack(rect,"UUUU")
1538
+ end
1539
+
1540
+ # tab's properties = text,image,lparam
1541
+
1542
+ def getTabTextOf(idx)
1543
+ tb=@screen.application.arg2cstructStr(WStruct::TC_ITEM,
1544
+ 0x1,0,0,"\0"*128,128,0,0)
1545
+ rv=sendMessage WMsg::TCM_GETITEM,idx.to_i,tb
1546
+ if rv!=0 then
1547
+ r=@screen.application.unpack(tb,WStruct::TC_ITEM)[3]
1548
+ @screen.application.pointer2string(r)
1549
+ else
1550
+ nil
1551
+ end
1552
+ end
1553
+ def getTabImageOf(idx)
1554
+ tb=@screen.application.arg2cstructStr(WStruct::TC_ITEM,
1555
+ 0x2,0,0," \0",1,0,0)
1556
+ rv=sendMessage WMsg::TCM_GETITEM,idx.to_i,tb
1557
+ r=@screen.application.unpack(tb,WStruct::TC_ITEM)[5]
1558
+ end
1559
+ def getTabLParamOf(idx)
1560
+ tb=@screen.application.arg2cstructStr(WStruct::TC_ITEM,
1561
+ 0x8,0,0," \0",1,0,0)
1562
+ rv=sendMessage WMsg::TCM_GETITEM,idx.to_i,tb
1563
+ r=@screen.application.unpack(tb,WStruct::TC_ITEM)[6]
1564
+ end
1565
+
1566
+ def setTabTextOf(idx,text)
1567
+ tb=@screen.application.arg2cstructStr(WStruct::TC_ITEM,
1568
+ 0x1,0,0,text,text.length,0,0)
1569
+ sendMessage WMsg::TCM_SETITEM,idx.to_i,tb
1570
+ self.refresh
1571
+ end
1572
+ def setTabImageOf(idx,iImage)
1573
+ tb=@screen.application.arg2cstructStr(WStruct::TC_ITEM,
1574
+ 0x2,0,0," \0",1,iImage,0)
1575
+ sendMessage WMsg::TCM_SETITEM,idx.to_i,tb
1576
+ self.refresh
1577
+ end
1578
+ def setTabLParamOf(idx,lparam)
1579
+ tb=@screen.application.arg2cstructStr(WStruct::TC_ITEM,
1580
+ 0x8,0,0," \0",1,0,lparam)
1581
+ sendMessage WMsg::TCM_SETITEM,idx.to_i,tb
1582
+ end
1583
+ end
1584
+
1585
+ class VRTabbedPanel < VRTabControl
1586
+ =begin
1587
+ == VRTabbedPanel
1588
+ This is a class utilizing VRTabControl.
1589
+ On this control, each tab has a VRPanel and be shown/hidden automatically
1590
+ according to the selected tab.
1591
+
1592
+ === Class method
1593
+ --- auto_panelresize(flag)
1594
+ Resize panels on the tabs automatically when this control resized.
1595
+ === Methods
1596
+ --- setupPanels(arg-1,arg-2,arg-3,....)
1597
+ Creates tabs each titled ((|arg-n|)) if args are String.
1598
+ When ((|arg-n|)) is array of ((|[title, contorl-class, control-name]|)),
1599
+ Creates control and relates with the tab.
1600
+ Use like follows.
1601
+ class Panel1 < VRPanel
1602
+ include VRContainersSet
1603
+ ...
1604
+ end
1605
+ class Panel2 < VRPanel
1606
+ ...
1607
+ end
1608
+ ...
1609
+ setupPanels(["tab-1",Panel1,"panel1"],["tab-2",Panel2,"panel2"])
1610
+ --- send_parent2(idx,controlname,eventname)
1611
+ Sets to send to its parent an event of control named ((|controlname|))
1612
+ on the panel at ((|idx|)).
1613
+ === Attribute(s)
1614
+ --- panels
1615
+ An array that contains panels for each tab.
1616
+ panels[i] means a panel concerned with the tab at ((|i|)).
1617
+ === Event Handlers
1618
+ Same as ((<VRTabControl>)).
1619
+ VRTabbedPanel#selchanged is already defined, so you need to call super when you
1620
+ override this method.
1621
+ =end
1622
+ attr :panels
1623
+ include VRMessageHandler
1624
+ include VRParent
1625
+
1626
+ @@_auto_tabpanelresize = nil
1627
+
1628
+ def self.auto_panelresize(flag)
1629
+ @@_auto_tabpanelresize = flag
1630
+ end
1631
+
1632
+ def vrinit
1633
+ super
1634
+ if @@_auto_tabpanelresize
1635
+ addHandler(WMsg::WM_SIZE, "_vr_tabpanelresize", MSGTYPE::ARGLINTINT,nil)
1636
+ acceptEvents [WMsg::WM_SIZE]
1637
+ end
1638
+ end
1639
+
1640
+ def setupPanels(*args)
1641
+ @panels=Array.new(args.size)
1642
+ 0.upto(args.size-1) do |i|
1643
+ if args[i].is_a? Array
1644
+ insertTab i,args[i][0]
1645
+ c = args[i][1] ? args[i][1] : VRPanel
1646
+ s = args[i][2] ? args[i][2] : "panel#{i}"
1647
+ x,y,w,h = adjustRect(0,0,self.w,self.h,false)
1648
+ @panels[i] = addControl(c,s,s,x,y,w-x,h-y)
1649
+ else
1650
+ insertTab i,args[i]
1651
+ x,y,w,h = adjustRect(0,0,self.w,self.h,false)
1652
+ @panels[i] = addControl(VRPanel,"panel#{i}","panel#{i}",x,y,w-x,h-y)
1653
+ @panels[i].extend VRContainersSet
1654
+ @panels[i].containers_init
1655
+ end
1656
+ @panels[i].show 0
1657
+ end
1658
+
1659
+ @_vr_prevpanel=0
1660
+ selectTab 0
1661
+ end
1662
+
1663
+ def send_parent2(i,name,method)
1664
+ @panels[i].send_parent(name,method)
1665
+ send_parent "panel#{i}","#{name}_#{method}"
1666
+ end
1667
+
1668
+ def selectTab(i)
1669
+ super
1670
+ selchanged
1671
+ end
1672
+
1673
+ def selchanged
1674
+ raise "assigned no panels" if @panels.size<1
1675
+ @panels[@_vr_prevpanel].show(0)
1676
+ t=selectedTab
1677
+ @panels[t].show
1678
+ @_vr_prevpanel=t
1679
+ @panels[t].refresh
1680
+ end
1681
+
1682
+ def self__vr_tabpanelresize(w,h)
1683
+ x,y,w,h = adjustRect(0,0,self.w,self.h,false)
1684
+ @panels.each{|i| i.move(x,y,w-x,h-y)}
1685
+ end
1686
+ end
1687
+
1688
+ unless VR_OLDCOMCTL then
1689
+
1690
+
1691
+ module WMsg
1692
+ RB_INSERTBAND = WM_USER + 1
1693
+ RB_DELETEBAND = WM_USER + 2
1694
+ RB_GETBARINFO = WM_USER + 3
1695
+ RB_SETBARINFO = WM_USER + 4
1696
+ RB_GETBANDCOUNT = WM_USER + 12
1697
+ RB_GETROWCOUNT = WM_USER + 13
1698
+ RB_GETROWHEIGHT = WM_USER + 14
1699
+ RB_SETBKCOLOR = WM_USER + 19
1700
+ RB_GETBKCOLOR = WM_USER + 20
1701
+ RB_SETTEXTCOLOR = WM_USER + 21
1702
+ RB_GETTEXTCOLOR = WM_USER + 22
1703
+ RB_SIZETORECT = WM_USER + 23
1704
+ RB_GETBARHEIGHT = WM_USER + 27
1705
+ RB_GETBANDINFO = WM_USER + 29
1706
+ RB_SHOWBAND = WM_USER + 35
1707
+ RB_SETPALETTE = WM_USER + 37
1708
+ RB_GETPALETTE = WM_USER + 38
1709
+ RB_MOVEBAND = WM_USER + 39
1710
+
1711
+ RBN_LAYOUTCHANGED = 0x100000000-831-2
1712
+ end
1713
+
1714
+
1715
+ module WConst
1716
+ RBBIM_STYLE = 0x00000001
1717
+ RBBIM_COLORS = 0x00000002
1718
+ RBBIM_TEXT = 0x00000004
1719
+ RBBIM_IMAGE = 0x00000008
1720
+ RBBIM_CHILD = 0x00000010
1721
+ RBBIM_CHILDSIZE = 0x00000020
1722
+ RBBIM_SIZE = 0x00000040
1723
+ RBBIM_BACKGROUND = 0x00000080
1724
+ end
1725
+
1726
+ class VRRebar < VRNotifyControl
1727
+ =begin
1728
+ == VRRebar
1729
+ Rebar control.
1730
+ If comctl32.dll on your system is too old, this is not available.
1731
+ === Methods
1732
+ --- insertband(cntl,txt,minx=30,miny=cnt.h+2,band=-1)
1733
+ Creates a new band and set the control on it.
1734
+ ((|txt|)) is the caption of the band and minx/miny is the minimum size of
1735
+ the band.
1736
+ The control is created by rebar's addControl() but its event handling is on
1737
+ the parent window.
1738
+ --- bkColor=(c)
1739
+ --- bkColor
1740
+ Sets/Gets background color of rebar.
1741
+ --- textColor=(c)
1742
+ --- textColor
1743
+ Sets/Gets band caption color.
1744
+ --- relayout(x=self.x, y=self.y, w=self.w, h=self.h)
1745
+ rearranges rebar's bands in the specified rectangle.
1746
+ =end
1747
+
1748
+ WINCLASSINFO = ["ReBarWindow32",0]
1749
+
1750
+ def rebarinit
1751
+ sendMessage WMsg::RB_SETBARINFO,0,[12,0,0].pack("LLL")
1752
+ addNotifyHandler WMsg::RBN_LAYOUTCHANGED,"layoutchanged",MSGTYPE::ARGNONE,nil
1753
+ end
1754
+
1755
+ def vrinit
1756
+ super
1757
+ rebarinit
1758
+ end
1759
+
1760
+ def insertband(cnt,txt,minx=30,miny=cnt.h+2,band=-1)
1761
+ size = 4*14
1762
+ mask= WConst::RBBIM_TEXT | WConst::RBBIM_STYLE | WConst::RBBIM_CHILD | WConst::RBBIM_CHILDSIZE | WConst::RBBIM_SIZE
1763
+ style= 4 #RBBS_CHILDEDGE
1764
+ frcolor= 0
1765
+ bkcolor= 0
1766
+ text= txt
1767
+ cch= 0
1768
+ image= 0
1769
+ hwndChild= cnt.hWnd
1770
+ cxmin= minx
1771
+ cymin= miny
1772
+ cx= 100
1773
+ bkBmp= 0
1774
+ wid= 0
1775
+ tis = [size,mask,style,frcolor,bkcolor,text,cch,image,hwndChild,cxmin,cymin,cx,bkBmp,wid].pack("LLLLLP#{text.length}LLLLLLLL")
1776
+ sendMessage WMsg::RB_INSERTBAND,band,tis
1777
+ end
1778
+
1779
+ def h
1780
+ sendMessage WMsg::RB_GETBARHEIGHT,0,0
1781
+ end
1782
+
1783
+ def bkColor
1784
+ sendMessage WMsg::RB_GETBKCOLOR,0,0
1785
+ end
1786
+ def bkColor=(c)
1787
+ sendMessage WMsg::RB_SETBKCOLOR,0,c
1788
+ end
1789
+
1790
+ def textColor
1791
+ sendMessage WMsg::RB_GETTEXTCOLOR,0,0
1792
+ end
1793
+ def textColor=(c)
1794
+ sendMessage WMsg::RB_SETTEXTCOLOR,0,c
1795
+ end
1796
+
1797
+ def relayout(x=self.x,y=self.y,w=self.w,h=self.h)
1798
+ sendMessage WMsg::RB_SIZETORECT,0,[x,y,w,h].pack("LLLL")
1799
+ end
1800
+
1801
+ include VRParent
1802
+ def newControlID
1803
+ @parent.newControlID
1804
+ end
1805
+ def registerControl(*arg)
1806
+ @parent.registerControl(*arg)
1807
+ end
1808
+ end
1809
+
1810
+ end # unlessVR_OLDCOMCTL
1811
+
1812
+
1813
+ # contribute files
1814
+ require VR_DIR+'contrib/toolbar'
1815
+ require VR_DIR+'contrib/vrlistviewex'
1816
+
1817
+ if VR_COMPATIBILITY_LEVEL then
1818
+ require VR_DIR + 'compat/vrcomctl.rb'
1819
+ end