fzeet 0.6.5 → 0.6.6
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE_CEF +29 -0
- data/checks/Bstr.rb +14 -0
- data/checks/Decimal.rb +27 -0
- data/checks/OSVERSIONINFOEX.rb +14 -0
- data/checks/Point.rb +65 -0
- data/checks/Rect.rb +104 -0
- data/checks/RunAll.rb +2 -0
- data/checks/SafeArray.rb +27 -0
- data/checks/Size.rb +45 -0
- data/checks/SystemTime.rb +43 -0
- data/checks/Variant.rb +160 -0
- data/examples/Control/DateTimePicker.rbw +1 -1
- data/examples/Control/MonthCalendar.rbw +1 -1
- data/examples/Control/{WebBrowser.rbw → WebBrowser/WebBrowser.rbw} +2 -2
- data/examples/Control/{WebBrowser1.rbw → WebBrowser/WebBrowser1.rbw} +0 -0
- data/examples/Control/WebBrowser/WebBrowser2.rbw +24 -0
- data/examples/Control/{WebBrowser3.rbw → WebBrowser/WebBrowser3.rbw} +0 -0
- data/examples/Control/{WebBrowser4.rbw → WebBrowser/WebBrowser4.rbw} +8 -3
- data/examples/Control/{WebBrowser4Sinatra.rb → WebBrowser/WebBrowser4Sinatra.rb} +0 -0
- data/examples/Control/{WebBrowser5.rbw → WebBrowser/WebBrowser5.rbw} +4 -2
- data/examples/Control/WebBrowser/jQueryUI.html +53 -0
- data/examples/Control/WebBrowser/jQueryUI.rbw +26 -0
- data/examples/MDI.rbw +2 -2
- data/examples/Raw/UIRibbon/Command.rbw +3 -3
- data/examples/Raw/UIRibbon/Minimal.rbw +3 -3
- data/examples/Version.rbw +1 -1
- data/lib/fzeet.rb +22 -7
- data/lib/fzeet/windows.rb +82 -5
- data/lib/fzeet/windows/com.rb +1 -318
- data/lib/fzeet/windows/com/Common.rb +318 -0
- data/lib/fzeet/windows/comctl.rb +1 -1
- data/lib/fzeet/windows/comctl/ComboBoxEx.rb +32 -0
- data/lib/fzeet/windows/comctl/DateTimePicker.rb +35 -0
- data/lib/fzeet/windows/comctl/Header.rb +61 -1
- data/lib/fzeet/windows/comctl/ListView.rb +133 -3
- data/lib/fzeet/windows/comctl/MonthCalendar.rb +35 -0
- data/lib/fzeet/windows/comctl/ProgressBar.rb +37 -0
- data/lib/fzeet/windows/comctl/PropertySheet.rb +50 -2
- data/lib/fzeet/windows/comctl/SysLink.rb +37 -0
- data/lib/fzeet/windows/comctl/Tab.rb +56 -0
- data/lib/fzeet/windows/comctl/TreeView.rb +81 -2
- data/lib/fzeet/windows/comctl/UpDown.rb +33 -0
- data/lib/fzeet/windows/comdlg.rb +1 -0
- data/lib/fzeet/windows/comdlg/ColorDialog.rb +41 -0
- data/lib/fzeet/windows/comdlg/Common.rb +87 -0
- data/lib/fzeet/windows/comdlg/FileDialog.rb +133 -0
- data/lib/fzeet/windows/comdlg/FindReplaceDialog.rb +102 -0
- data/lib/fzeet/windows/comdlg/FontDialog.rb +36 -0
- data/lib/fzeet/windows/comdlg/PrintDialog.rb +72 -0
- data/lib/fzeet/{Dialog → windows/comdlg}/ShellFileDialog.rb +0 -0
- data/lib/fzeet/windows/core.rb +5 -0
- data/lib/fzeet/windows/core/Common.rb +324 -0
- data/lib/fzeet/windows/core/Point.rb +42 -0
- data/lib/fzeet/windows/core/Rect.rb +114 -0
- data/lib/fzeet/windows/core/Size.rb +34 -0
- data/lib/fzeet/windows/core/SystemTime.rb +46 -0
- data/lib/fzeet/windows/core/Version.rb +57 -0
- data/lib/fzeet/windows/gdi.rb +1 -62
- data/lib/fzeet/windows/gdi/Common.rb +40 -0
- data/lib/fzeet/windows/gdi/Font.rb +64 -0
- data/lib/fzeet/windows/kernel.rb +1 -92
- data/lib/fzeet/windows/kernel/Common.rb +92 -0
- data/lib/fzeet/windows/libc.rb +1 -1
- data/lib/fzeet/windows/libcef.rb +1 -0
- data/lib/fzeet/windows/mshtml.rb +1 -1135
- data/lib/fzeet/windows/mshtml/Common.rb +1135 -0
- data/lib/fzeet/windows/ole.rb +1 -561
- data/lib/fzeet/windows/ole/Common.rb +112 -0
- data/lib/fzeet/windows/ole/PropVariant.rb +141 -0
- data/lib/fzeet/windows/oleaut.rb +3 -0
- data/lib/fzeet/windows/oleaut/Bstr.rb +39 -0
- data/lib/fzeet/windows/oleaut/Common.rb +187 -0
- data/lib/fzeet/windows/oleaut/SafeArray.rb +104 -0
- data/lib/fzeet/windows/oleaut/Variant.rb +269 -0
- data/lib/fzeet/windows/scintilla.rb +115 -1
- data/lib/fzeet/windows/{SciLexer.dll → scintilla/SciLexer.dll} +0 -0
- data/lib/fzeet/windows/shdocvw.rb +150 -0
- data/lib/fzeet/windows/shell.rb +1 -1
- data/lib/fzeet/windows/shell/Common.rb +94 -2
- data/lib/fzeet/windows/shlwapi.rb +1 -1
- data/lib/fzeet/windows/uiribbon.rb +416 -0
- data/lib/fzeet/windows/urlmon.rb +2 -2
- data/lib/fzeet/windows/user.rb +20 -0
- data/lib/fzeet/windows/user/Accelerator.rb +45 -0
- data/lib/fzeet/windows/user/Common.rb +3 -2
- data/lib/fzeet/windows/user/Control/Button.rb +54 -0
- data/lib/fzeet/windows/user/Control/ComboBox.rb +44 -1
- data/lib/fzeet/windows/user/Control/Common.rb +88 -1
- data/lib/fzeet/windows/user/Control/Edit.rb +50 -0
- data/lib/fzeet/windows/user/Control/ListBox.rb +69 -0
- data/lib/fzeet/windows/user/Control/Static.rb +31 -0
- data/lib/fzeet/windows/user/Menu.rb +130 -0
- data/lib/fzeet/windows/user/Message.rb +9 -0
- data/lib/fzeet/windows/user/MessageBox.rb +47 -0
- data/lib/fzeet/windows/user/SystemParametersInfo.rb +1 -1
- data/lib/fzeet/windows/user/Window.rb +5 -463
- data/lib/fzeet/{Window → windows/user/Window}/Common.rb +460 -0
- data/lib/fzeet/{Window → windows/user/Window}/Container.rb +0 -0
- data/lib/fzeet/{Window → windows/user/Window}/Dialog.rb +0 -0
- data/lib/fzeet/{Window → windows/user/Window}/MDI.rb +0 -0
- data/lib/fzeet/{Window → windows/user/Window}/View.rb +0 -0
- data/lib/fzeet/{Window → windows/user/Window}/Window.rb +0 -0
- data/lib/fzeet/{Window → windows/user/Window}/WindowMethods.rb +1 -1
- metadata +55 -61
- data/examples/Control/WebBrowser2.rbw +0 -39
- data/lib/fzeet/Accelerator.rb +0 -48
- data/lib/fzeet/Application.rb +0 -71
- data/lib/fzeet/Common.rb +0 -350
- data/lib/fzeet/Control.rb +0 -19
- data/lib/fzeet/Control/Button.rb +0 -57
- data/lib/fzeet/Control/ComboBox.rb +0 -46
- data/lib/fzeet/Control/ComboBoxEx.rb +0 -35
- data/lib/fzeet/Control/Common.rb +0 -89
- data/lib/fzeet/Control/DateTimePicker.rb +0 -38
- data/lib/fzeet/Control/Edit.rb +0 -53
- data/lib/fzeet/Control/ExplorerBrowser.rb +0 -66
- data/lib/fzeet/Control/Header.rb +0 -63
- data/lib/fzeet/Control/ListBox.rb +0 -72
- data/lib/fzeet/Control/ListView.rb +0 -133
- data/lib/fzeet/Control/MonthCalendar.rb +0 -38
- data/lib/fzeet/Control/ProgressBar.rb +0 -40
- data/lib/fzeet/Control/PropertySheet.rb +0 -51
- data/lib/fzeet/Control/Scintilla.rb +0 -117
- data/lib/fzeet/Control/Static.rb +0 -34
- data/lib/fzeet/Control/SysLink.rb +0 -40
- data/lib/fzeet/Control/Tab.rb +0 -59
- data/lib/fzeet/Control/TreeView.rb +0 -82
- data/lib/fzeet/Control/UpDown.rb +0 -36
- data/lib/fzeet/Control/WebBrowser.rb +0 -153
- data/lib/fzeet/Dialog.rb +0 -6
- data/lib/fzeet/Dialog/ColorDialog.rb +0 -44
- data/lib/fzeet/Dialog/Common.rb +0 -89
- data/lib/fzeet/Dialog/FileDialog.rb +0 -136
- data/lib/fzeet/Dialog/FindReplaceDialog.rb +0 -105
- data/lib/fzeet/Dialog/FontDialog.rb +0 -39
- data/lib/fzeet/Dialog/PrintDialog.rb +0 -75
- data/lib/fzeet/Menu.rb +0 -133
- data/lib/fzeet/UIRibbon.rb +0 -417
- data/lib/fzeet/Window.rb +0 -5
- 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
|