fzeet 0.6.5 → 0.6.6

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 (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