fzeet 0.6.5 → 0.6.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (140) hide show
  1. data/LICENSE_CEF +29 -0
  2. data/checks/Bstr.rb +14 -0
  3. data/checks/Decimal.rb +27 -0
  4. data/checks/OSVERSIONINFOEX.rb +14 -0
  5. data/checks/Point.rb +65 -0
  6. data/checks/Rect.rb +104 -0
  7. data/checks/RunAll.rb +2 -0
  8. data/checks/SafeArray.rb +27 -0
  9. data/checks/Size.rb +45 -0
  10. data/checks/SystemTime.rb +43 -0
  11. data/checks/Variant.rb +160 -0
  12. data/examples/Control/DateTimePicker.rbw +1 -1
  13. data/examples/Control/MonthCalendar.rbw +1 -1
  14. data/examples/Control/{WebBrowser.rbw → WebBrowser/WebBrowser.rbw} +2 -2
  15. data/examples/Control/{WebBrowser1.rbw → WebBrowser/WebBrowser1.rbw} +0 -0
  16. data/examples/Control/WebBrowser/WebBrowser2.rbw +24 -0
  17. data/examples/Control/{WebBrowser3.rbw → WebBrowser/WebBrowser3.rbw} +0 -0
  18. data/examples/Control/{WebBrowser4.rbw → WebBrowser/WebBrowser4.rbw} +8 -3
  19. data/examples/Control/{WebBrowser4Sinatra.rb → WebBrowser/WebBrowser4Sinatra.rb} +0 -0
  20. data/examples/Control/{WebBrowser5.rbw → WebBrowser/WebBrowser5.rbw} +4 -2
  21. data/examples/Control/WebBrowser/jQueryUI.html +53 -0
  22. data/examples/Control/WebBrowser/jQueryUI.rbw +26 -0
  23. data/examples/MDI.rbw +2 -2
  24. data/examples/Raw/UIRibbon/Command.rbw +3 -3
  25. data/examples/Raw/UIRibbon/Minimal.rbw +3 -3
  26. data/examples/Version.rbw +1 -1
  27. data/lib/fzeet.rb +22 -7
  28. data/lib/fzeet/windows.rb +82 -5
  29. data/lib/fzeet/windows/com.rb +1 -318
  30. data/lib/fzeet/windows/com/Common.rb +318 -0
  31. data/lib/fzeet/windows/comctl.rb +1 -1
  32. data/lib/fzeet/windows/comctl/ComboBoxEx.rb +32 -0
  33. data/lib/fzeet/windows/comctl/DateTimePicker.rb +35 -0
  34. data/lib/fzeet/windows/comctl/Header.rb +61 -1
  35. data/lib/fzeet/windows/comctl/ListView.rb +133 -3
  36. data/lib/fzeet/windows/comctl/MonthCalendar.rb +35 -0
  37. data/lib/fzeet/windows/comctl/ProgressBar.rb +37 -0
  38. data/lib/fzeet/windows/comctl/PropertySheet.rb +50 -2
  39. data/lib/fzeet/windows/comctl/SysLink.rb +37 -0
  40. data/lib/fzeet/windows/comctl/Tab.rb +56 -0
  41. data/lib/fzeet/windows/comctl/TreeView.rb +81 -2
  42. data/lib/fzeet/windows/comctl/UpDown.rb +33 -0
  43. data/lib/fzeet/windows/comdlg.rb +1 -0
  44. data/lib/fzeet/windows/comdlg/ColorDialog.rb +41 -0
  45. data/lib/fzeet/windows/comdlg/Common.rb +87 -0
  46. data/lib/fzeet/windows/comdlg/FileDialog.rb +133 -0
  47. data/lib/fzeet/windows/comdlg/FindReplaceDialog.rb +102 -0
  48. data/lib/fzeet/windows/comdlg/FontDialog.rb +36 -0
  49. data/lib/fzeet/windows/comdlg/PrintDialog.rb +72 -0
  50. data/lib/fzeet/{Dialog → windows/comdlg}/ShellFileDialog.rb +0 -0
  51. data/lib/fzeet/windows/core.rb +5 -0
  52. data/lib/fzeet/windows/core/Common.rb +324 -0
  53. data/lib/fzeet/windows/core/Point.rb +42 -0
  54. data/lib/fzeet/windows/core/Rect.rb +114 -0
  55. data/lib/fzeet/windows/core/Size.rb +34 -0
  56. data/lib/fzeet/windows/core/SystemTime.rb +46 -0
  57. data/lib/fzeet/windows/core/Version.rb +57 -0
  58. data/lib/fzeet/windows/gdi.rb +1 -62
  59. data/lib/fzeet/windows/gdi/Common.rb +40 -0
  60. data/lib/fzeet/windows/gdi/Font.rb +64 -0
  61. data/lib/fzeet/windows/kernel.rb +1 -92
  62. data/lib/fzeet/windows/kernel/Common.rb +92 -0
  63. data/lib/fzeet/windows/libc.rb +1 -1
  64. data/lib/fzeet/windows/libcef.rb +1 -0
  65. data/lib/fzeet/windows/mshtml.rb +1 -1135
  66. data/lib/fzeet/windows/mshtml/Common.rb +1135 -0
  67. data/lib/fzeet/windows/ole.rb +1 -561
  68. data/lib/fzeet/windows/ole/Common.rb +112 -0
  69. data/lib/fzeet/windows/ole/PropVariant.rb +141 -0
  70. data/lib/fzeet/windows/oleaut.rb +3 -0
  71. data/lib/fzeet/windows/oleaut/Bstr.rb +39 -0
  72. data/lib/fzeet/windows/oleaut/Common.rb +187 -0
  73. data/lib/fzeet/windows/oleaut/SafeArray.rb +104 -0
  74. data/lib/fzeet/windows/oleaut/Variant.rb +269 -0
  75. data/lib/fzeet/windows/scintilla.rb +115 -1
  76. data/lib/fzeet/windows/{SciLexer.dll → scintilla/SciLexer.dll} +0 -0
  77. data/lib/fzeet/windows/shdocvw.rb +150 -0
  78. data/lib/fzeet/windows/shell.rb +1 -1
  79. data/lib/fzeet/windows/shell/Common.rb +94 -2
  80. data/lib/fzeet/windows/shlwapi.rb +1 -1
  81. data/lib/fzeet/windows/uiribbon.rb +416 -0
  82. data/lib/fzeet/windows/urlmon.rb +2 -2
  83. data/lib/fzeet/windows/user.rb +20 -0
  84. data/lib/fzeet/windows/user/Accelerator.rb +45 -0
  85. data/lib/fzeet/windows/user/Common.rb +3 -2
  86. data/lib/fzeet/windows/user/Control/Button.rb +54 -0
  87. data/lib/fzeet/windows/user/Control/ComboBox.rb +44 -1
  88. data/lib/fzeet/windows/user/Control/Common.rb +88 -1
  89. data/lib/fzeet/windows/user/Control/Edit.rb +50 -0
  90. data/lib/fzeet/windows/user/Control/ListBox.rb +69 -0
  91. data/lib/fzeet/windows/user/Control/Static.rb +31 -0
  92. data/lib/fzeet/windows/user/Menu.rb +130 -0
  93. data/lib/fzeet/windows/user/Message.rb +9 -0
  94. data/lib/fzeet/windows/user/MessageBox.rb +47 -0
  95. data/lib/fzeet/windows/user/SystemParametersInfo.rb +1 -1
  96. data/lib/fzeet/windows/user/Window.rb +5 -463
  97. data/lib/fzeet/{Window → windows/user/Window}/Common.rb +460 -0
  98. data/lib/fzeet/{Window → windows/user/Window}/Container.rb +0 -0
  99. data/lib/fzeet/{Window → windows/user/Window}/Dialog.rb +0 -0
  100. data/lib/fzeet/{Window → windows/user/Window}/MDI.rb +0 -0
  101. data/lib/fzeet/{Window → windows/user/Window}/View.rb +0 -0
  102. data/lib/fzeet/{Window → windows/user/Window}/Window.rb +0 -0
  103. data/lib/fzeet/{Window → windows/user/Window}/WindowMethods.rb +1 -1
  104. metadata +55 -61
  105. data/examples/Control/WebBrowser2.rbw +0 -39
  106. data/lib/fzeet/Accelerator.rb +0 -48
  107. data/lib/fzeet/Application.rb +0 -71
  108. data/lib/fzeet/Common.rb +0 -350
  109. data/lib/fzeet/Control.rb +0 -19
  110. data/lib/fzeet/Control/Button.rb +0 -57
  111. data/lib/fzeet/Control/ComboBox.rb +0 -46
  112. data/lib/fzeet/Control/ComboBoxEx.rb +0 -35
  113. data/lib/fzeet/Control/Common.rb +0 -89
  114. data/lib/fzeet/Control/DateTimePicker.rb +0 -38
  115. data/lib/fzeet/Control/Edit.rb +0 -53
  116. data/lib/fzeet/Control/ExplorerBrowser.rb +0 -66
  117. data/lib/fzeet/Control/Header.rb +0 -63
  118. data/lib/fzeet/Control/ListBox.rb +0 -72
  119. data/lib/fzeet/Control/ListView.rb +0 -133
  120. data/lib/fzeet/Control/MonthCalendar.rb +0 -38
  121. data/lib/fzeet/Control/ProgressBar.rb +0 -40
  122. data/lib/fzeet/Control/PropertySheet.rb +0 -51
  123. data/lib/fzeet/Control/Scintilla.rb +0 -117
  124. data/lib/fzeet/Control/Static.rb +0 -34
  125. data/lib/fzeet/Control/SysLink.rb +0 -40
  126. data/lib/fzeet/Control/Tab.rb +0 -59
  127. data/lib/fzeet/Control/TreeView.rb +0 -82
  128. data/lib/fzeet/Control/UpDown.rb +0 -36
  129. data/lib/fzeet/Control/WebBrowser.rb +0 -153
  130. data/lib/fzeet/Dialog.rb +0 -6
  131. data/lib/fzeet/Dialog/ColorDialog.rb +0 -44
  132. data/lib/fzeet/Dialog/Common.rb +0 -89
  133. data/lib/fzeet/Dialog/FileDialog.rb +0 -136
  134. data/lib/fzeet/Dialog/FindReplaceDialog.rb +0 -105
  135. data/lib/fzeet/Dialog/FontDialog.rb +0 -39
  136. data/lib/fzeet/Dialog/PrintDialog.rb +0 -75
  137. data/lib/fzeet/Menu.rb +0 -133
  138. data/lib/fzeet/UIRibbon.rb +0 -417
  139. data/lib/fzeet/Window.rb +0 -5
  140. data/lib/fzeet/windows/common.rb +0 -244
@@ -0,0 +1,104 @@
1
+ require_relative 'Common'
2
+
3
+ module Fzeet
4
+ module Windows
5
+ class SAFEARRAYBOUND < FFI::Struct
6
+ layout \
7
+ :cElements, :ulong,
8
+ :lLbound, :long
9
+ end
10
+
11
+ class SAFEARRAY < FFI::Struct
12
+ include Enumerable
13
+
14
+ layout \
15
+ :cDims, :ushort,
16
+ :fFeatures, :ushort,
17
+ :cbElements, :ulong,
18
+ :cLocks, :ulong,
19
+ :pvData, :pointer,
20
+ :rgsabound, [SAFEARRAYBOUND, 1]
21
+
22
+ def self.vector(length, vt = :variant)
23
+ raise 'Not implemented.' if vt != :variant
24
+
25
+ raise 'SafeArrayCreateVector failed.' if
26
+ (psa = Windows.SafeArrayCreateVector(Windows.const_get("VT_#{vt.upcase}"), 0, length)).null?
27
+
28
+ sa = new(psa)
29
+
30
+ if block_given?
31
+ yield sa; sa.dispose; return nil
32
+ end
33
+
34
+ sa
35
+ end
36
+
37
+ def length(dim = 0) raise 'Not implemented.' if dim != 0; self[:rgsabound][dim][:cElements] end
38
+
39
+ def vt
40
+ FFI::MemoryPointer.new(:ushort) { |pvt|
41
+ Windows.DetonateHresult(:SafeArrayGetVartype, self, pvt)
42
+
43
+ return pvt.get_ushort(0)
44
+ }
45
+ end
46
+
47
+ alias old_get []
48
+
49
+ def [](i)
50
+ return old_get(i) if i.kind_of?(Symbol)
51
+
52
+ FFI::MemoryPointer.new(:long) { |pi|
53
+ pi.put_long(0, i)
54
+
55
+ Windows.DetonateHresult(:SafeArrayGetElement, self, pi, v = VARIANT.new)
56
+
57
+ return v
58
+ }
59
+ end
60
+
61
+ alias get []
62
+
63
+ alias old_put []=
64
+
65
+ def []=(i, v)
66
+ return old_put(i, v) if i.kind_of?(Symbol)
67
+
68
+ FFI::MemoryPointer.new(:long) { |pi|
69
+ pi.put_long(0, i)
70
+
71
+ Windows.DetonateHresult(:SafeArrayPutElement, self, pi, v)
72
+ }
73
+
74
+ self
75
+ end
76
+
77
+ alias put []=
78
+
79
+ def destroy; Windows.DetonateHresult(:SafeArrayDestroy, self) end
80
+ alias dispose destroy
81
+
82
+ def each; length.times { |i| yield self[i] }; self end
83
+ end
84
+
85
+ attach_function :SafeArrayCreateVector, [:ushort, :long, :uint], :pointer
86
+ attach_function :SafeArrayCreate, [:ushort, :uint, :pointer], :pointer
87
+ attach_function :SafeArrayDestroy, [:pointer], :long
88
+
89
+ attach_function :SafeArrayGetVartype, [:pointer, :pointer], :long
90
+
91
+ attach_function :SafeArrayGetElement, [:pointer, :pointer, :pointer], :long
92
+ attach_function :SafeArrayPutElement, [:pointer, :pointer, :pointer], :long
93
+
94
+ attach_function :SafeArrayLock, [:pointer], :long
95
+ attach_function :SafeArrayUnlock, [:pointer], :long
96
+
97
+ attach_function :SafeArrayPtrOfIndex, [:pointer, :pointer, :pointer], :long
98
+
99
+ attach_function :SafeArrayAccessData, [:pointer, :pointer], :long
100
+ attach_function :SafeArrayUnaccessData, [:pointer], :long
101
+ end
102
+
103
+ SafeArray = Windows::SAFEARRAY
104
+ end
@@ -0,0 +1,269 @@
1
+ require_relative 'Common'
2
+
3
+ module Fzeet
4
+ module Windows
5
+ VT_EMPTY = 0
6
+ VT_NULL = 1
7
+ VT_I2 = 2
8
+ VT_I4 = 3
9
+ VT_R4 = 4
10
+ VT_R8 = 5
11
+ VT_CY = 6
12
+ VT_DATE = 7
13
+ VT_BSTR = 8
14
+ VT_DISPATCH = 9
15
+ VT_ERROR = 10
16
+ VT_BOOL = 11
17
+ VT_VARIANT = 12
18
+ VT_UNKNOWN = 13
19
+ VT_DECIMAL = 14
20
+ VT_I1 = 16
21
+ VT_UI1 = 17
22
+ VT_UI2 = 18
23
+ VT_UI4 = 19
24
+ VT_I8 = 20
25
+ VT_UI8 = 21
26
+ VT_INT = 22
27
+ VT_UINT = 23
28
+ VT_VOID = 24
29
+ VT_HRESULT = 25
30
+ VT_PTR = 26
31
+ VT_SAFEARRAY = 27
32
+ VT_CARRAY = 28
33
+ VT_USERDEFINED = 29
34
+ VT_LPSTR = 30
35
+ VT_LPWSTR = 31
36
+ VT_RECORD = 36
37
+ VT_INT_PTR = 37
38
+ VT_UINT_PTR = 38
39
+ VT_FILETIME = 64
40
+ VT_BLOB = 65
41
+ VT_STREAM = 66
42
+ VT_STORAGE = 67
43
+ VT_STREAMED_OBJECT = 68
44
+ VT_STORED_OBJECT = 69
45
+ VT_BLOB_OBJECT = 70
46
+ VT_CF = 71
47
+ VT_CLSID = 72
48
+ VT_VERSIONED_STREAM = 73
49
+ VT_BSTR_BLOB = 0xfff
50
+ VT_VECTOR = 0x1000
51
+ VT_ARRAY = 0x2000
52
+ VT_BYREF = 0x4000
53
+ VT_RESERVED = 0x8000
54
+ VT_ILLEGAL = 0xffff
55
+ VT_ILLEGALMASKED = 0xfff
56
+ VT_TYPEMASK = 0xfff
57
+
58
+ class VARIANT < FFI::Union
59
+ include AnonymousSupport
60
+
61
+ layout \
62
+ :_, Class.new(FFI::Struct) {
63
+ layout \
64
+ :vt, :ushort,
65
+ :wReserved1, :ushort,
66
+ :wReserved2, :ushort,
67
+ :wReserved3, :ushort,
68
+ :_, Class.new(FFI::Union) {
69
+ layout \
70
+ :llVal, :long_long, # VT_I8
71
+ :lVal, :long, # VT_I4
72
+ :bVal, :uchar, # VT_UI1
73
+ :iVal, :short, # VT_I2
74
+ :fltVal, :float, # VT_R4
75
+ :dblVal, :double, # VT_R8
76
+ :boolVal, :short, # VT_BOOL
77
+ :bool, :short, # obsolete
78
+ :scode, :long, # VT_ERROR
79
+ :cyVal, :long_long, # VT_CY
80
+ :date, :double, # VT_DATE
81
+ :bstrVal, :pointer, # VT_BSTR
82
+ :punkVal, :pointer, # VT_UNKNOWN
83
+ :pdispVal, :pointer, # VT_DISPATCH
84
+ :parray, :pointer, # VT_ARRAY
85
+ :pbVal, :pointer, # VT_BYREF | VT_UI1
86
+ :piVal, :pointer, # VT_BYREF | VT_I2
87
+ :plVal, :pointer, # VT_BYREF | VT_I4
88
+ :pllVal, :pointer, # VT_BYREF | VT_I8
89
+ :pfltVal, :pointer, # VT_BYREF | VT_R4
90
+ :pdblVal, :pointer, # VT_BYREF | VT_R8
91
+ :pboolVal, :pointer, # VT_BYREF | VT_BOOL
92
+ :pbool, :pointer, # obsolete
93
+ :pscode, :pointer, # VT_BYREF | VT_ERROR
94
+ :pcyVal, :pointer, # VT_BYREF | VT_CY
95
+ :pdate, :pointer, # VT_BYREF | VT_DATE
96
+ :pbstrVal, :pointer, # VT_BYREF | VT_BSTR
97
+ :ppunkVal, :pointer, # VT_BYREF | VT_UNKNOWN
98
+ :ppdispVal, :pointer, # VT_BYREF | VT_DISPATCH
99
+ :pparrayv, :pointer, # VT_BYREF | VT_ARRAY
100
+ :pvarVal, :pointer, # VT_BYREF | VT_VARIANT
101
+ :byref, :pointer, # VT_BYREF
102
+ :cVal, :char, # VT_I1
103
+ :uiVal, :ushort, # VT_UI2
104
+ :ulVal, :ulong, # VT_UI4
105
+ :ullVal, :ulong_long, # VT_UI8
106
+ :intVal, :int, # VT_INT
107
+ :uintVal, :uint, # VT_UINT
108
+ :pdecVal, :pointer, # VT_BYREF | VT_DECIMAL
109
+ :pcVal, :pointer, # VT_BYREF | VT_I1
110
+ :puiVal, :pointer, # VT_BYREF | VT_UI2
111
+ :pulVal, :pointer, # VT_BYREF | VT_UI4
112
+ :pullVal, :pointer, # VT_BYREF | VT_UI8
113
+ :pintVal, :pointer, # VT_BYREF | VT_INT
114
+ :puintVal, :pointer, # VT_BYREF | VT_UINT
115
+ :_, Class.new(FFI::Struct) { # VT_RECORD
116
+ layout \
117
+ :pvRecord, :pointer,
118
+ :pRecInfo, :pointer
119
+ }
120
+ }
121
+ },
122
+
123
+ :decVal, DECIMAL # VT_DECIMAL
124
+
125
+ def self.[](type, value) new.tap { |variant| variant.send("#{type}=", value) } end
126
+
127
+ def bool; raise 'Wrong type tag.' unless self[:vt] == VT_BOOL; self[:boolVal] != 0 end
128
+ def bool=(bool) clear; self[:vt] = VT_BOOL; self[:boolVal] = (bool) ? -1 : 0 end
129
+
130
+ %w{int uint i1 ui1 i2 ui2 i4 ui4 i8 ui8 error r4 r8}.zip(
131
+ %w{intVal uintVal cVal bVal iVal uiVal lVal ulVal llVal ullVal scode fltVal dblVal}).each { |vt, val|
132
+ define_method(vt) {
133
+ raise 'Wrong type tag.' unless self[:vt] == Windows.const_get("VT_#{vt.upcase}"); self[val.to_sym]
134
+ }
135
+
136
+ define_method("#{vt}=") { |value|
137
+ clear; self[:vt] = Windows.const_get("VT_#{vt.upcase}"); self[val.to_sym] = value
138
+ }
139
+ }
140
+
141
+ alias char i1
142
+ alias uchar ui1; alias byte uchar
143
+ alias short i2
144
+ alias ushort ui2; alias word ushort
145
+ alias long i4
146
+ alias ulong ui4; alias dword ulong
147
+ alias longlong i8
148
+ alias ulonglong ui8; alias qword ulonglong
149
+ alias float r4
150
+ alias double r8
151
+
152
+ alias char= i1=
153
+ alias uchar= ui1=; alias byte= uchar=
154
+ alias short= i2=
155
+ alias ushort= ui2=; alias word= ushort=
156
+ alias long= i4=
157
+ alias ulong= ui4=; alias dword= ulong=
158
+ alias longlong= i8=
159
+ alias ulonglong= ui8=; alias qword= ulonglong=
160
+ alias float= r4=
161
+ alias double= r8=
162
+
163
+ def bstr; raise 'Wrong type tag.' unless self[:vt] == VT_BSTR; BSTR.new(self[:bstrVal]).multibyte end
164
+ def bstr=(str) clear; self[:vt] = VT_BSTR; self[:bstrVal] = BSTR[str].pointer end
165
+
166
+ alias string bstr
167
+ alias string= bstr=
168
+
169
+ def date
170
+ raise 'Wrong type tag.' unless self[:vt] == VT_DATE
171
+
172
+ raise 'VariantTimeToSystemTime failed.' if Windows.VariantTimeToSystemTime(self[:date], st = SYSTEMTIME.new) == 0
173
+
174
+ st.get
175
+ end
176
+
177
+ def date=(date)
178
+ clear
179
+
180
+ self[:vt] = VT_DATE
181
+
182
+ FFI::MemoryPointer.new(:double) { |pdate|
183
+ raise 'SystemTimeToVariantTime failed.' if Windows.SystemTimeToVariantTime(SYSTEMTIME[date], pdate) == 0
184
+
185
+ self[:date] = pdate.get_double(0)
186
+ }
187
+ end
188
+
189
+ alias time date
190
+ alias time= date=
191
+
192
+ def decimal(as = :double)
193
+ raise 'Wrong type tag.' unless self[:vt] == VT_DECIMAL
194
+
195
+ DECIMAL.new(self[:decVal].pointer).send(as)
196
+ end
197
+
198
+ def decimal=(decimal)
199
+ clear
200
+
201
+ self[:vt] = VT_DECIMAL
202
+
203
+ DECIMAL[decimal].tap { |dec|
204
+ self[:decVal].members.each { |member|
205
+ next if member == :wReserved # This is self[:vt]
206
+
207
+ self[:decVal][member] = dec[member]
208
+ }
209
+ }
210
+ end
211
+
212
+ %w{unknown dispatch}.zip(
213
+ %w{punkVal pdispVal}).each { |vt, val|
214
+ define_method(vt) {
215
+ raise 'Wrong type tag.' unless self[:vt] == Windows.const_get("VT_#{vt.upcase}")
216
+
217
+ Windows.const_get(vt.capitalize).new(self[val.to_sym]).tap { |instance|
218
+ instance.AddRef
219
+ }
220
+ }
221
+
222
+ define_method("#{vt}=") { |instance|
223
+ clear
224
+
225
+ self[:vt] = Windows.const_get("VT_#{vt.upcase}")
226
+
227
+ self[val.to_sym] = instance
228
+
229
+ instance.AddRef
230
+ }
231
+ }
232
+
233
+ def array
234
+ raise 'Wrong type tag.' unless self[:vt] & VT_ARRAY == VT_ARRAY
235
+
236
+ SAFEARRAY.new(self[:parray])
237
+ end
238
+
239
+ def array=(array) clear; self[:vt] = VT_ARRAY | VT_VARIANT; self[:parray] = array end
240
+
241
+ def byref(deref = nil)
242
+ raise 'Wrong type tag.' unless self[:vt] & VT_BYREF == VT_BYREF
243
+
244
+ (deref) ? self[:byref].send("get_#{deref}", 0) : self[:byref]
245
+ end
246
+
247
+ def byref=(byref) clear; self[:vt] = VT_BYREF; self[:byref] = byref end
248
+
249
+ def object; ObjectSpace._id2ref(i4) end
250
+ def object=(object) self.i4 = object.object_id end
251
+
252
+ def clear; Windows.DetonateHresult(:VariantClear, self); self end
253
+ end
254
+
255
+ attach_function :VariantInit, [:pointer], :void
256
+ attach_function :VariantClear, [:pointer], :long
257
+
258
+ attach_function :SystemTimeToVariantTime, [:pointer, :pointer], :int
259
+ attach_function :VariantTimeToSystemTime, [:double, :pointer], :int
260
+
261
+ attach_function :VarDecFromI8, [:long_long, :pointer], :long
262
+ attach_function :VarI8FromDec, [:pointer, :pointer], :long
263
+
264
+ attach_function :VarDecFromR8, [:double, :pointer], :long
265
+ attach_function :VarR8FromDec, [:pointer, :pointer], :long
266
+ end
267
+
268
+ Variant = Windows::VARIANT
269
+ end
@@ -2,7 +2,7 @@ require_relative 'user'
2
2
 
3
3
  module Fzeet
4
4
  module Windows
5
- ffi_lib "#{File.dirname(File.expand_path(__FILE__))}/SciLexer.dll"
5
+ ffi_lib "#{File.dirname(File.expand_path(__FILE__))}/scintilla/SciLexer.dll"
6
6
  ffi_convention :stdcall
7
7
 
8
8
  callback :SciFnDirect, [:long, :uint, :uint, :long], :long
@@ -2276,4 +2276,118 @@ module Fzeet
2276
2276
  SCE_TXT2TAGS_PREPROC = 24
2277
2277
  SCE_TXT2TAGS_POSTPROC = 25
2278
2278
  end
2279
+
2280
+ module ScintillaMethods
2281
+ def text
2282
+ FFI::MemoryPointer.new(:uchar, len = sendmsg(:gettextlength) + 1) { |p|
2283
+ sendmsg(:gettext, len, p)
2284
+
2285
+ return p.read_string
2286
+ }
2287
+ end
2288
+
2289
+ def text=(text)
2290
+ p = FFI::MemoryPointer.from_string(text)
2291
+
2292
+ sendmsg(:settext, 0, p)
2293
+ ensure
2294
+ p.free
2295
+ end
2296
+
2297
+ def font
2298
+ FFI::MemoryPointer.new(:uchar, 33) { |p|
2299
+ sendmsg(:stylegetfont, Windows::STYLE_DEFAULT, p)
2300
+
2301
+ return p.read_string
2302
+ }
2303
+ end
2304
+
2305
+ def font=(name)
2306
+ p = FFI::MemoryPointer.from_string(name)
2307
+
2308
+ sendmsg(:stylesetfont, Windows::STYLE_DEFAULT, p)
2309
+ ensure
2310
+ p.free
2311
+ end
2312
+
2313
+ def fontSize; sendmsg(:stylegetsize, Windows::STYLE_DEFAULT) end
2314
+ def fontSize=(size) sendmsg(:stylesetsize, Windows::STYLE_DEFAULT, size) end
2315
+
2316
+ def tabWidth; sendmsg(:gettabwidth) end
2317
+ def tabWidth=(tabWidth) sendmsg(:settabwidth, tabWidth) end
2318
+
2319
+ def dirty?; @dirty end
2320
+ def dirty=(dirty) (dirty) ? @dirty = true : sendmsg(:setsavepoint) end
2321
+ end
2322
+
2323
+ class Scintilla < Control
2324
+ include ScintillaMethods
2325
+
2326
+ Prefix = {
2327
+ xstyle: [:ws_ex_],
2328
+ style: [:ws_],
2329
+ message: [:sci_, :wm_],
2330
+ notification: [:scn_, :scen_, :nm_]
2331
+ }
2332
+
2333
+ def self.crackNotification(args)
2334
+ case args[:notification]
2335
+ when \
2336
+ Windows::SCN_STYLENEEDED,
2337
+ Windows::SCN_CHARADDED,
2338
+ Windows::SCN_SAVEPOINTREACHED,
2339
+ Windows::SCN_SAVEPOINTLEFT,
2340
+ Windows::SCN_MODIFYATTEMPTRO,
2341
+ Windows::SCN_KEY,
2342
+ Windows::SCN_DOUBLECLICK,
2343
+ Windows::SCN_UPDATEUI,
2344
+ Windows::SCN_MODIFIED,
2345
+ Windows::SCN_MACRORECORD,
2346
+ Windows::SCN_MARGINCLICK,
2347
+ Windows::SCN_NEEDSHOWN,
2348
+ Windows::SCN_PAINTED,
2349
+ Windows::SCN_USERLISTSELECTION,
2350
+ Windows::SCN_URIDROPPED,
2351
+ Windows::SCN_DWELLSTART,
2352
+ Windows::SCN_DWELLEND,
2353
+ Windows::SCN_ZOOM,
2354
+ Windows::SCN_HOTSPOTCLICK,
2355
+ Windows::SCN_HOTSPOTDOUBLECLICK,
2356
+ Windows::SCN_CALLTIPCLICK,
2357
+ Windows::SCN_AUTOCSELECTION,
2358
+ Windows::SCN_INDICATORCLICK,
2359
+ Windows::SCN_INDICATORRELEASE,
2360
+ Windows::SCN_AUTOCCANCELLED,
2361
+ Windows::SCN_AUTOCCHARDELETED
2362
+
2363
+ args[:scn] = Windows::SCNotification.new(FFI::Pointer.new(args[:lParam]))
2364
+ end
2365
+ end
2366
+
2367
+ def initialize(parent, id, opts = {}, &block)
2368
+ super('Scintilla', parent, id, opts)
2369
+
2370
+ @dirty = false
2371
+
2372
+ on(:savepointleft) { @dirty = true }
2373
+ on(:savepointreached) { @dirty = false }
2374
+
2375
+ @parent.on(:notify, @id, &block) if block
2376
+ end
2377
+
2378
+ def on(notification, &block)
2379
+ case c = Fzeet.constant(notification, *self.class::Prefix[:notification])
2380
+ when \
2381
+ Windows::SCEN_CHANGE,
2382
+ Windows::SCEN_SETFOCUS,
2383
+ Windows::SCEN_KILLFOCUS
2384
+
2385
+ @parent.on(:command, @id, c, &block)
2386
+ else
2387
+ @parent.on(:notify, @id, c, &block)
2388
+ end
2389
+
2390
+ self
2391
+ end
2392
+ end
2279
2393
  end