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
@@ -251,7 +251,7 @@ module Fzeet
251
251
  :iSubItem, :int,
252
252
  :iImage, :int,
253
253
  :iOrder, :int,
254
- (WINVER.AtLeastWindowsVista?) ? [
254
+ (Version >= :vista) ? [
255
255
  :cxMin, :int,
256
256
  :cxDefault, :int,
257
257
  :cxIdeal, :int
@@ -290,12 +290,12 @@ module Fzeet
290
290
  :iImage, :int,
291
291
  :lParam, :long,
292
292
  :iIndent, :int,
293
- (WINVER.AtLeastWindowsXP?) ? [
293
+ (Version >= :xp) ? [
294
294
  :iGroupId, :int,
295
295
  :cColumns, :uint,
296
296
  :puColumns, :pointer,
297
297
  ] : nil,
298
- (WINVER.AtLeastWindowsVista?) ? [
298
+ (Version >= :vista) ? [
299
299
  :piColFmt, :pointer,
300
300
  :iGroup, :int
301
301
  ] : nil
@@ -314,4 +314,134 @@ module Fzeet
314
314
  :lParam, :long,
315
315
  end
316
316
  end
317
+
318
+ module ListViewMethods
319
+ class ExStyle
320
+ def initialize(listview) @listview = listview end
321
+
322
+ def <<(xstyle)
323
+ @listview.sendmsg(:setextendedlistviewstyle, 0,
324
+ @listview.sendmsg(:getextendedlistviewstyle) | Fzeet.constant(xstyle, *@listview.class::Prefix[:xstyle])
325
+ )
326
+
327
+ self
328
+ end
329
+
330
+ def >>(xstyle)
331
+ @listview.sendmsg(:setextendedlistviewstyle, 0,
332
+ @listview.sendmsg(:getextendedlistviewstyle) & ~Fzeet.constant(xstyle, *@listview.class::Prefix[:xstyle])
333
+ )
334
+
335
+ self
336
+ end
337
+
338
+ def toggle(what) send((@listview.xstyle?(what)) ? :>> : :<<, what); self end
339
+ end
340
+
341
+ def xstyle?(xstyle) (sendmsg(:getextendedlistviewstyle) & (xstyle = Fzeet.constant(xstyle, *self.class::Prefix[:xstyle]))) == xstyle end
342
+ def xstyle; ExStyle.new(self) end
343
+
344
+ def insertColumn(i, text, width)
345
+ lvc = Windows::LVCOLUMN.new
346
+
347
+ lvc[:mask] = Fzeet.flags([:fmt, :width, :text, :subitem], :lvcf_)
348
+ lvc[:fmt] = Fzeet.flags(:left, :lvcfmt_)
349
+ lvc[:cx] = width
350
+ lvc[:pszText] = ptext = FFI::MemoryPointer.from_string(text)
351
+ lvc[:iSubItem] = i
352
+
353
+ sendmsg(:insertcolumn, 0, lvc.pointer)
354
+
355
+ self
356
+ ensure
357
+ ptext.free if ptext
358
+ end
359
+
360
+ class Item
361
+ def initialize(lvi) @subitems = [lvi] end
362
+
363
+ attr_reader :subitems
364
+ end
365
+
366
+ def insertItem(i, j, text)
367
+ lvi = Windows::LVITEM.new
368
+
369
+ lvi[:mask] = Fzeet.flags(:text, :lvif_)
370
+ lvi[:iItem] = i
371
+ lvi[:iSubItem] = j
372
+ lvi[:pszText] = ptext = FFI::MemoryPointer.from_string(text)
373
+
374
+ if j == 0
375
+ @items << Item.new(lvi)
376
+
377
+ lvi[:mask] |= Windows::LVIF_PARAM
378
+ lvi[:lParam] = @items[i].object_id
379
+
380
+ sendmsg(:insertitem, 0, lvi.pointer)
381
+ else
382
+ @items[i].subitems << lvi
383
+
384
+ sendmsg(:setitem, 0, lvi.pointer)
385
+ end
386
+
387
+ @items[i].subitems[j].instance_variable_set(:@text, text)
388
+
389
+ class << @items[i].subitems[j]
390
+ attr_reader :text
391
+ end
392
+
393
+ self
394
+ ensure
395
+ ptext.free if ptext
396
+ end
397
+
398
+ def sort(j = 0)
399
+ sendmsg(:sortitems, j,
400
+ FFI::Function.new(:int, [:long, :long, :long], convention: :stdcall) { |lParam1, lParam2, lParamSort|
401
+ yield ObjectSpace._id2ref(lParam1).subitems[lParamSort], ObjectSpace._id2ref(lParam2).subitems[lParamSort], j
402
+ }
403
+ )
404
+
405
+ self
406
+ end
407
+
408
+ def clear; sendmsg(:deleteallitems); self end
409
+ end
410
+
411
+ class ListView < Control
412
+ include ListViewMethods
413
+
414
+ Prefix = {
415
+ xstyle: [:lvs_ex_, :ws_ex_],
416
+ style: [:lvs_, :ws_],
417
+ message: [:lvm_, :ccm_, :wm_],
418
+ notification: [:lvn_, :nm_]
419
+ }
420
+
421
+ def self.crackNotification(args)
422
+ case args[:notification]
423
+ when Windows::LVN_COLUMNCLICK
424
+ args[:nmlv] = Windows::NMLISTVIEW.new(FFI::Pointer.new(args[:lParam]))
425
+ args[:index] = args[:nmlv][:iSubItem]
426
+ end
427
+ end
428
+
429
+ def initialize(parent, id, opts = {}, &block)
430
+ super('SysListView32', parent, id, opts)
431
+
432
+ @header = Handle.wrap(FFI::Pointer.new(sendmsg(:getheader)), WindowMethods, HeaderMethods)
433
+
434
+ @items = []
435
+
436
+ @parent.on(:notify, @id, &block) if block
437
+ end
438
+
439
+ attr_reader :header, :items
440
+
441
+ def on(notification, &block)
442
+ @parent.on(:notify, @id, Fzeet.constant(notification, *self.class::Prefix[:notification]), &block)
443
+
444
+ self
445
+ end
446
+ end
317
447
  end
@@ -59,4 +59,39 @@ module Fzeet
59
59
  :stSelEnd, SYSTEMTIME
60
60
  end
61
61
  end
62
+
63
+ module MonthCalendarMethods
64
+
65
+ end
66
+
67
+ class MonthCalendar < Control
68
+ include MonthCalendarMethods
69
+
70
+ Prefix = {
71
+ xstyle: [:ws_ex_],
72
+ style: [:mcs_, :ws_],
73
+ message: [:mcm_, :ccm_, :wm_],
74
+ notification: [:mcn_, :nm_]
75
+ }
76
+
77
+ def self.crackNotification(args)
78
+ case args[:notification]
79
+ when Windows::MCN_SELCHANGE
80
+ args[:sc] = Windows::NMSELCHANGE.new(FFI::Pointer.new(args[:lParam]))
81
+ args[:st1], args[:st2] = args[:sc][:stSelStart], args[:sc][:stSelEnd]
82
+ end
83
+ end
84
+
85
+ def initialize(parent, id, opts = {}, &block)
86
+ super('SysMonthCal32', parent, id, opts)
87
+
88
+ @parent.on(:notify, @id, &block) if block
89
+ end
90
+
91
+ def on(notification, &block)
92
+ @parent.on(:notify, @id, Fzeet.constant(notification, *self.class::Prefix[:notification]), &block)
93
+
94
+ self
95
+ end
96
+ end
62
97
  end
@@ -28,4 +28,41 @@ module Fzeet
28
28
  PBST_ERROR = 0x0002
29
29
  PBST_PAUSED = 0x0003
30
30
  end
31
+
32
+ module ProgressBarMethods
33
+ def step=(step) sendmsg(:setstep, step) end
34
+ def step!; sendmsg(:stepit) end
35
+
36
+ def position=(position) sendmsg(:setpos, position) end
37
+
38
+ def marquee?; @marquee end
39
+ def marquee=(marquee) sendmsg(:setmarquee, (@marquee = marquee) ? 1 : 0) end
40
+ end
41
+
42
+ class ProgressBar < Control
43
+ include ProgressBarMethods
44
+
45
+ Prefix = {
46
+ xstyle: [:ws_ex_],
47
+ style: [:pbs_, :ws_],
48
+ message: [:pbm_, :ccm_, :wm_],
49
+ notification: [:nm_]
50
+ }
51
+
52
+ def self.crackNotification(args) end
53
+
54
+ def initialize(parent, id, opts = {}, &block)
55
+ super('msctls_progress32', parent, id, opts)
56
+
57
+ @marquee = false
58
+
59
+ @parent.on(:notify, @id, &block) if block
60
+ end
61
+
62
+ def on(notification, &block)
63
+ @parent.on(:notify, @id, Fzeet.constant(notification, *self.class::Prefix[:notification]), &block)
64
+
65
+ self
66
+ end
67
+ end
31
68
  end
@@ -41,10 +41,10 @@ module Fzeet
41
41
  :pcRefParent, :pointer,
42
42
  :pszHeaderTitle, :pointer,
43
43
  :pszHeaderSubTitle, :pointer,
44
- (WINVER.AtLeastWindowsXP?) ? [
44
+ (Version >= :xp) ? [
45
45
  :hActCtx, :pointer
46
46
  ] : nil,
47
- (WINVER.AtLeastWindowsVista?) ? [
47
+ (Version >= :vista) ? [
48
48
  :header, Class.new(FFI::Union) {
49
49
  layout \
50
50
  :hbmHeader, :pointer,
@@ -202,4 +202,52 @@ module Fzeet
202
202
  PSNRET_INVALID_NOCHANGEPAGE = 2
203
203
  PSNRET_MESSAGEHANDLED = 3
204
204
  end
205
+
206
+ class PropertyPage
207
+ class PROPSHEETPAGEA1 < FFI::Struct
208
+ layout \
209
+ :array, [Windows::PROPSHEETPAGE, 1]
210
+ end
211
+
212
+ def initialize
213
+
214
+ end
215
+ end
216
+
217
+ class PropertySheet
218
+ def initialize(parent, opts = {wizard: false})
219
+ pointers = []
220
+
221
+ psps = PropertyPage::PROPSHEETPAGEA1.new
222
+
223
+ dt = Windows::DLGTEMPLATE.new
224
+
225
+ dt[:style] = Fzeet.flags([:'3dlook', :control, :child, :tabstop], :ds_, :ws_)
226
+ dt[:x], dt[:y], dt[:cx], dt[:cy] = 100, 100, 300, 150
227
+
228
+ psp = psps[:array][0]
229
+
230
+ psp[:dwSize] = psp.size
231
+ psp[:dwFlags] = Fzeet.flags([:dlgindirect, :usetitle], :psp_)
232
+ psp[:hInstance] = Windows.GetModuleHandle(nil)
233
+ psp[:template][:pResource] = dt
234
+ psp[:pszTitle] = pointers.push(FFI::MemoryPointer.from_string("Page")).last
235
+
236
+ psh = Windows::PROPSHEETHEADER.new
237
+
238
+ psh[:dwSize] = psh.size
239
+ psh[:dwFlags] = Fzeet.flags(:propsheetpage, :psh_)
240
+ psh[:dwFlags] |= Windows::PSH_WIZARD if opts[:wizard]
241
+ psh[:hwndParent] = parent.handle
242
+ psh[:hInstance] = Windows.GetModuleHandle(nil)
243
+ psh[:pszCaption] = pointers.push(FFI::MemoryPointer.from_string('Sheet')).last
244
+ psh[:nPages] = 1
245
+ psh[:start][:nStartPage] = 0
246
+ psh[:pages][:ppsp] = psps
247
+
248
+ Windows.DetonateLastError(-1, :PropertySheet, psh)
249
+ ensure
250
+ pointers.each(&:free)
251
+ end
252
+ end
205
253
  end
@@ -31,4 +31,41 @@ module Fzeet
31
31
  :item, LITEM
32
32
  end
33
33
  end
34
+
35
+ module SysLinkMethods
36
+
37
+ end
38
+
39
+ class SysLink < Control
40
+ include SysLinkMethods
41
+
42
+ Prefix = {
43
+ xstyle: [:ws_ex_],
44
+ style: [:lws_, :ws_],
45
+ message: [:lm_, :ccm_, :wm_],
46
+ notification: [:nm_]
47
+ }
48
+
49
+ def self.crackNotification(args)
50
+ case args[:notification]
51
+ when Windows::NM_CLICK
52
+ args[:link] = Windows::NMLINK.new(FFI::Pointer.new(args[:lParam]))
53
+
54
+ args[:id] = Windows.WCSTOMBS(args[:link][:item][:szID])
55
+ args[:url] = Windows.WCSTOMBS(args[:link][:item][:szUrl])
56
+ end
57
+ end
58
+
59
+ def initialize(parent, id, opts = {}, &block)
60
+ super('SysLink', parent, id, opts)
61
+
62
+ @parent.on(:notify, @id, &block) if block
63
+ end
64
+
65
+ def on(notification, &block)
66
+ @parent.on(:notify, @id, Fzeet.constant(notification, *self.class::Prefix[:notification]), &block)
67
+
68
+ self
69
+ end
70
+ end
34
71
  end
@@ -85,4 +85,60 @@ module Fzeet
85
85
  :lParam, :long
86
86
  end
87
87
  end
88
+
89
+ module TabMethods
90
+ class Item
91
+ def initialize(tab, i) @tab, @index = tab, i end
92
+
93
+ attr_reader :tab, :index
94
+ end
95
+
96
+ def [](i) Item.new(self, i) end
97
+
98
+ def count; sendmsg(:getitemcount) end
99
+ alias :size :count
100
+ alias :length :count
101
+
102
+ def insert(text, i = count)
103
+ tci = Windows::TCITEM.new
104
+
105
+ tci[:mask] = Fzeet.flags(:text, :tcif_)
106
+ tci[:pszText] = ptext = FFI::MemoryPointer.from_string(text)
107
+
108
+ sendmsg(:insertitem, i, tci.pointer)
109
+
110
+ self
111
+ ensure
112
+ ptext.free
113
+ end
114
+
115
+ def current; self[sendmsg(:getcursel)] end
116
+ end
117
+
118
+ class Tab < Control
119
+ include TabMethods
120
+
121
+ Prefix = {
122
+ xstyle: [:tcs_ex_, :ws_ex_],
123
+ style: [:tcs_, :ws_],
124
+ message: [:tcm_, :ccm_, :wm_],
125
+ notification: [:tcn_, :nm_]
126
+ }
127
+
128
+ def self.crackNotification(args) end
129
+
130
+ def initialize(parent, id, opts = {}, &block)
131
+ super('SysTabControl32', parent, id, opts)
132
+
133
+ style << :clipsiblings
134
+
135
+ @parent.on(:notify, @id, &block) if block
136
+ end
137
+
138
+ def on(notification, &block)
139
+ @parent.on(:notify, @id, Fzeet.constant(notification, *self.class::Prefix[:notification]), &block)
140
+
141
+ self
142
+ end
143
+ end
88
144
  end
@@ -157,12 +157,12 @@ module Fzeet
157
157
  :cChildren, :int,
158
158
  :lParam, :long,
159
159
  :iIntegral, :int,
160
- (WINVER.AtLeastWindowsVista?) ? [
160
+ (Version >= :vista) ? [
161
161
  :uStateEx, :uint,
162
162
  :hwnd, :pointer,
163
163
  :iExpandedImage, :int
164
164
  ] : nil,
165
- (WINVER.AtLeastWindows7?) ? [
165
+ (Version >= 7) ? [
166
166
  :iReserved, :int
167
167
  ] : nil
168
168
  ].flatten.compact
@@ -195,4 +195,83 @@ module Fzeet
195
195
  :ptDrag, POINT
196
196
  end
197
197
  end
198
+
199
+ module TreeViewMethods
200
+ class Item
201
+ def initialize(text) @text = text end
202
+
203
+ attr_reader :text, :root, :parent, :handle
204
+
205
+ def root=(root) raise 'Can\'t change established @root.' if @root; @root = root end
206
+ def parent=(parent) raise 'Can\'t change established @parent.' if @parent; @parent = parent end
207
+ def handle=(handle) raise 'Can\'t change established @handle.' if @handle; @handle = handle end
208
+
209
+ def append(text)
210
+ item = Item.new(text)
211
+
212
+ tvis = Windows::TVINSERTSTRUCT.new
213
+
214
+ tvis[:hInsertAfter] = Windows::TVI_LAST
215
+ tvis[:hParent] = @handle
216
+
217
+ tvi = tvis[:item]
218
+
219
+ tvi[:mask] = Windows::TVIF_TEXT
220
+ tvi[:pszText] = ptext = FFI::MemoryPointer.from_string(item.text)
221
+
222
+ item.root, item.parent = @root, self
223
+ item.handle = @root.sendmsg(:insertitem, 0, tvis.pointer)
224
+
225
+ item
226
+ ensure
227
+ ptext.free
228
+ end
229
+ end
230
+
231
+ def append(text)
232
+ item = Item.new(text)
233
+
234
+ tvis = Windows::TVINSERTSTRUCT.new
235
+
236
+ tvis[:hInsertAfter] = Windows::TVI_LAST
237
+ tvis[:hParent] = Windows::TVI_ROOT
238
+
239
+ tvi = tvis[:item]
240
+
241
+ tvi[:mask] = Windows::TVIF_TEXT
242
+ tvi[:pszText] = ptext = FFI::MemoryPointer.from_string(item.text)
243
+
244
+ item.root, item.parent = self, self
245
+ item.handle = sendmsg(:insertitem, 0, tvis.pointer)
246
+
247
+ item
248
+ ensure
249
+ ptext.free
250
+ end
251
+ end
252
+
253
+ class TreeView < Control
254
+ include TreeViewMethods
255
+
256
+ Prefix = {
257
+ xstyle: [:tvs_ex, :ws_ex_],
258
+ style: [:tvs_, :ws_],
259
+ message: [:tvm_, :ccm_, :wm_],
260
+ notification: [:tvn_, :nm_]
261
+ }
262
+
263
+ def self.crackNotification(args) end
264
+
265
+ def initialize(parent, id, opts = {}, &block)
266
+ super('SysTreeView32', parent, id, opts)
267
+
268
+ @parent.on(:notify, @id, &block) if block
269
+ end
270
+
271
+ def on(notification, &block)
272
+ @parent.on(:notify, @id, Fzeet.constant(notification, *self.class::Prefix[:notification]), &block)
273
+
274
+ self
275
+ end
276
+ end
198
277
  end