wxruby3 0.9.2 → 0.9.3

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 (347) hide show
  1. checksums.yaml +4 -4
  2. data/INSTALL.md +35 -29
  3. data/README.md +24 -15
  4. data/ext/wxruby3/include/wxruby-ClientData.h +48 -0
  5. data/ext/wxruby3/include/wxruby-Validator.h +39 -0
  6. data/ext/wxruby3/include/wxruby-ValidatorBinding.h +64 -0
  7. data/ext/wxruby3/swig/custom/director.swg +8 -0
  8. data/ext/wxruby3/swig/mark_free_impl.i +0 -33
  9. data/lib/wx/core/bitmap_combobox.rb +17 -21
  10. data/lib/wx/core/combobox.rb +13 -3
  11. data/lib/wx/core/controlwithitems.rb +40 -130
  12. data/lib/wx/core/enum.rb +17 -1
  13. data/lib/wx/core/event.rb +6 -1
  14. data/lib/wx/core/evthandler.rb +8 -2
  15. data/lib/wx/core/generic_validator.rb +312 -0
  16. data/lib/wx/core/listbox.rb +2 -2
  17. data/lib/wx/core/log.rb +1 -1
  18. data/lib/wx/core/owner_drawn_combobox.rb +45 -0
  19. data/lib/wx/core/size.rb +4 -0
  20. data/lib/wx/core/sizer.rb +1 -2
  21. data/lib/wx/core/standard_paths.rb +22 -0
  22. data/lib/wx/core/text_entry.rb +4 -1
  23. data/lib/wx/core/validator.rb +70 -5
  24. data/lib/wx/core/window.rb +3 -7
  25. data/lib/wx/doc/art_locator.rb +1 -0
  26. data/lib/wx/doc/comboctrl.rb +18 -0
  27. data/lib/wx/doc/controlwithitems.rb +16 -0
  28. data/lib/wx/doc/date_picker_ctrl.rb +23 -0
  29. data/lib/wx/doc/editable_listbox.rb +44 -0
  30. data/lib/wx/doc/enum.rb +15 -0
  31. data/lib/wx/doc/event.rb +12 -0
  32. data/lib/wx/doc/extra/12_client_data.md +89 -0
  33. data/lib/wx/doc/extra/13_validators.md +139 -0
  34. data/lib/wx/doc/gdi_common.rb +4 -0
  35. data/lib/wx/doc/generic_validator.rb +95 -0
  36. data/lib/wx/doc/html/simple_html_listbox.rb +22 -0
  37. data/lib/wx/doc/num_validator.rb +387 -0
  38. data/lib/wx/doc/owner_drawn_combobox.rb +96 -0
  39. data/lib/wx/doc/pg/numeric_property_validator.rb +33 -0
  40. data/lib/wx/doc/static_bitmap.rb +25 -0
  41. data/lib/wx/doc/text_validator.rb +10 -0
  42. data/lib/wx/doc/validator.rb +113 -0
  43. data/lib/wx/doc/window.rb +30 -0
  44. data/lib/wx/html/simple_html_listbox.rb +24 -91
  45. data/lib/wx/keyword_defs.rb +34 -2
  46. data/lib/wx/rbn/ribbon_gallery.rb +0 -21
  47. data/lib/wx/version.rb +1 -1
  48. data/rakelib/lib/config/mingw.rb +12 -0
  49. data/rakelib/lib/core/include/client_data.inc +65 -0
  50. data/rakelib/lib/core/include/funcall.inc +1 -1
  51. data/rakelib/lib/core/package.rb +17 -2
  52. data/rakelib/lib/core/parameter.rb +1 -1
  53. data/rakelib/lib/core/spec_helper.rb +7 -1
  54. data/rakelib/lib/director/app.rb +18 -0
  55. data/rakelib/lib/director/app_traits.rb +3 -1
  56. data/rakelib/lib/director/bitmap_combobox.rb +2 -2
  57. data/rakelib/lib/director/combobox.rb +22 -0
  58. data/rakelib/lib/director/comboctrl.rb +1 -55
  59. data/rakelib/lib/director/ctrl_with_items.rb +88 -21
  60. data/rakelib/lib/director/date_picker_ctrl.rb +8 -6
  61. data/rakelib/lib/director/editable_listbox.rb +30 -0
  62. data/rakelib/lib/director/event.rb +102 -12
  63. data/rakelib/lib/director/event_handler.rb +3 -2
  64. data/rakelib/lib/director/functions.rb +4 -2
  65. data/rakelib/lib/director/generic_dirctrl.rb +17 -0
  66. data/rakelib/lib/director/grid_cell_attr.rb +0 -2
  67. data/rakelib/lib/director/grid_cell_editor.rb +0 -2
  68. data/rakelib/lib/director/grid_cell_renderer.rb +0 -2
  69. data/rakelib/lib/director/header_ctrl.rb +6 -1
  70. data/rakelib/lib/director/html_listbox.rb +96 -22
  71. data/rakelib/lib/director/num_validator.rb +495 -0
  72. data/rakelib/lib/director/numeric_property_validator.rb +131 -6
  73. data/rakelib/lib/director/owner_drawn_combobox.rb +192 -0
  74. data/rakelib/lib/director/pgproperty.rb +3 -29
  75. data/rakelib/lib/director/ribbon_button_bar.rb +3 -3
  76. data/rakelib/lib/director/ribbon_gallery.rb +3 -5
  77. data/rakelib/lib/director/sizer.rb +15 -4
  78. data/rakelib/lib/director/sizer_item.rb +13 -0
  79. data/rakelib/lib/director/static_bitmap.rb +28 -0
  80. data/rakelib/lib/director/text_entry.rb +4 -0
  81. data/rakelib/lib/director/text_validator.rb +124 -13
  82. data/rakelib/lib/director/toggle_button.rb +1 -0
  83. data/rakelib/lib/director/top_level_window.rb +0 -2
  84. data/rakelib/lib/director/tree_ctrl.rb +35 -0
  85. data/rakelib/lib/director/utils.rb +16 -2
  86. data/rakelib/lib/director/validator.rb +196 -21
  87. data/rakelib/lib/director/window.rb +16 -2
  88. data/rakelib/lib/extractor/function.rb +2 -1
  89. data/rakelib/lib/generate/analyzer.rb +1 -1
  90. data/rakelib/lib/generate/doc.rb +10 -4
  91. data/rakelib/lib/specs/interfaces.rb +2 -0
  92. data/rakelib/lib/swig_runner.rb +55 -9
  93. data/rakelib/lib/typemap/client_data.rb +67 -0
  94. data/rakelib/lib/typemap/common.rb +3 -3
  95. data/rakelib/lib/typemap/datetime.rb +1 -1
  96. data/rakelib/lib/typemap/tree_itemid.rb +2 -2
  97. data/samples/aui/aui.rb +1237 -1233
  98. data/samples/calendar/calendar.rb +293 -289
  99. data/samples/controls/get_item_sample.rb +83 -79
  100. data/samples/controls/htlbox.rb +331 -327
  101. data/samples/dialogs/dialogs.rb +682 -694
  102. data/samples/dialogs/wizard.rb +52 -55
  103. data/samples/dragdrop/dragdrop.rb +146 -142
  104. data/samples/drawing/bitmap.rb +29 -26
  105. data/samples/drawing/bitmap_image.rb +84 -80
  106. data/samples/drawing/graphics_drawing.rb +209 -205
  107. data/samples/drawing/image_prt.rb +344 -340
  108. data/samples/drawing/maths_images.rb +18 -1
  109. data/samples/drawing/rmagic_bitmap_image.rb +88 -84
  110. data/samples/etc/caret.rb +306 -0
  111. data/samples/etc/miniframe.rb +65 -60
  112. data/samples/etc/sash.rb +109 -105
  113. data/samples/etc/scrollwin.rb +86 -80
  114. data/samples/etc/system_settings.rb +216 -209
  115. data/samples/event/activation.rb +72 -67
  116. data/samples/event/event.rb +160 -153
  117. data/samples/event/threaded.rb +8 -1
  118. data/samples/event/update_ui_event.rb +67 -60
  119. data/samples/grid/grid.rb +188 -181
  120. data/samples/grid/gridtablebase.rb +136 -129
  121. data/samples/html/html.rb +208 -204
  122. data/samples/mdi/mdi.rb +59 -54
  123. data/samples/minimal/minimal.rb +54 -51
  124. data/samples/minimal/nothing.rb +1 -0
  125. data/samples/printing/printing.rb +367 -377
  126. data/samples/printing/printing2.rb +203 -198
  127. data/samples/propgrid/propgrid.rb +2312 -2308
  128. data/samples/propgrid/propgrid_minimal.rb +57 -50
  129. data/samples/ribbon/ribbon.rb +780 -774
  130. data/samples/sampler/ext.rb +0 -33
  131. data/samples/sampler/sample.rb +4 -9
  132. data/samples/sampler.rb +1 -1
  133. data/samples/splash/splash.rb +118 -116
  134. data/samples/text/rich_textctrl.rb +207 -201
  135. data/samples/text/richtext.rb +1409 -1405
  136. data/samples/text/scintilla.rb +137 -128
  137. data/samples/text/textctrl.rb +89 -83
  138. data/samples/text/unicode.rb +175 -168
  139. data/samples/treectrl/treectrl.rb +1430 -1426
  140. data/samples/widgets/activityindicator.rb +95 -0
  141. data/samples/widgets/art/widgets/activityindicator.xpm +278 -0
  142. data/samples/widgets/art/widgets/bmpbtn.xpm +37 -0
  143. data/samples/widgets/art/widgets/bmpcombobox.xpm +54 -0
  144. data/samples/widgets/art/widgets/button.xpm +54 -0
  145. data/samples/widgets/art/widgets/checkbox.xpm +54 -0
  146. data/samples/{bigdemo/icons → widgets/art/widgets}/choice.xpm +1 -1
  147. data/samples/widgets/art/widgets/choicebk.xpm +54 -0
  148. data/samples/widgets/art/widgets/clrpicker.xpm +193 -0
  149. data/samples/widgets/art/widgets/combobox.xpm +54 -0
  150. data/samples/widgets/art/widgets/datepick.xpm +200 -0
  151. data/samples/widgets/art/widgets/dirctrl.xpm +54 -0
  152. data/samples/widgets/art/widgets/dirpicker.xpm +213 -0
  153. data/samples/widgets/art/widgets/filepicker.xpm +214 -0
  154. data/samples/widgets/art/widgets/fontpicker.xpm +185 -0
  155. data/samples/widgets/art/widgets/gauge.xpm +54 -0
  156. data/samples/widgets/art/widgets/header.xpm +54 -0
  157. data/samples/widgets/art/widgets/hyperlnk.xpm +54 -0
  158. data/samples/widgets/art/widgets/listbook.xpm +54 -0
  159. data/samples/widgets/art/widgets/listbox.xpm +54 -0
  160. data/samples/widgets/art/widgets/native.xpm +81 -0
  161. data/samples/widgets/art/widgets/notebook.xpm +54 -0
  162. data/samples/widgets/art/widgets/odcombobox.xpm +54 -0
  163. data/samples/widgets/art/widgets/radiobox.xpm +54 -0
  164. data/samples/widgets/art/widgets/scrolbar.xpm +54 -0
  165. data/samples/widgets/art/widgets/slider.xpm +54 -0
  166. data/samples/widgets/art/widgets/spinbtn.xpm +40 -0
  167. data/samples/widgets/art/widgets/statbmp.xpm +40 -0
  168. data/samples/widgets/art/widgets/statbox.xpm +54 -0
  169. data/samples/widgets/art/widgets/stattext.xpm +54 -0
  170. data/samples/widgets/art/widgets/text.xpm +54 -0
  171. data/samples/widgets/art/widgets/timepick.xpm +207 -0
  172. data/samples/widgets/art/widgets/toggle.xpm +54 -0
  173. data/samples/widgets/art/widgets/toucan.png +0 -0
  174. data/samples/widgets/bmpcombobox.rb +651 -0
  175. data/samples/widgets/button.rb +462 -0
  176. data/samples/widgets/checkbox.rb +211 -0
  177. data/samples/widgets/choice.rb +287 -0
  178. data/samples/widgets/clrpicker.rb +156 -0
  179. data/samples/widgets/combobox.rb +516 -0
  180. data/samples/widgets/datepick.rb +215 -0
  181. data/samples/widgets/dirctrl.rb +265 -0
  182. data/samples/widgets/dirpicker.rb +158 -0
  183. data/samples/widgets/editlbox.rb +122 -0
  184. data/samples/widgets/filectrl.rb +216 -0
  185. data/samples/widgets/filepicker.rb +214 -0
  186. data/samples/widgets/fontpicker.rb +135 -0
  187. data/samples/widgets/gauge.rb +311 -0
  188. data/samples/widgets/headerctrl.rb +236 -0
  189. data/samples/widgets/hyperlink.rb +203 -0
  190. data/samples/widgets/itemcontainer.rb +185 -0
  191. data/samples/widgets/listbox.rb +473 -0
  192. data/samples/widgets/notebook.rb +488 -0
  193. data/samples/widgets/odcombobox.rb +608 -0
  194. data/samples/widgets/radiobox.rb +328 -0
  195. data/samples/widgets/searchctrl.rb +159 -0
  196. data/samples/widgets/slider.rb +594 -0
  197. data/samples/widgets/spinbtn.rb +443 -0
  198. data/samples/widgets/statbmp.rb +130 -0
  199. data/samples/widgets/static.rb +436 -0
  200. data/samples/widgets/textctrl.rb +700 -0
  201. data/samples/widgets/timepick.rb +148 -0
  202. data/samples/widgets/tn_widgets.png +0 -0
  203. data/samples/widgets/toggle.rb +385 -0
  204. data/samples/widgets/widgets.rb +1233 -0
  205. data/samples/xrc/custom_xrc_sample.rb +47 -41
  206. data/samples/xrc/xrc_sample.rb +53 -47
  207. data/tests/test_event_handling.rb +52 -34
  208. data/tests/test_events.rb +7 -0
  209. data/tests/test_item_data.rb +24 -0
  210. data/tests/test_sizer.rb +44 -1
  211. data/tests/test_validators.rb +805 -0
  212. metadata +92 -138
  213. data/lib/wx/core/choice.rb +0 -14
  214. data/lib/wx/core/combo_ctrl.rb +0 -110
  215. data/rakelib/lib/typemap/grid_client_data.rb +0 -58
  216. data/samples/bigdemo/About.rbw +0 -39
  217. data/samples/bigdemo/ColorPanel.rbw +0 -23
  218. data/samples/bigdemo/GridSimple.rbw +0 -78
  219. data/samples/bigdemo/MDIDemo.rbw +0 -57
  220. data/samples/bigdemo/PopupMenu.rbw +0 -146
  221. data/samples/bigdemo/ShapedWindow.rbw +0 -128
  222. data/samples/bigdemo/Sizers.rbw +0 -541
  223. data/samples/bigdemo/bigdemo.rb +0 -817
  224. data/samples/bigdemo/demoTemplate.rbw +0 -33
  225. data/samples/bigdemo/helpfile.htb +0 -0
  226. data/samples/bigdemo/icons/Test 015.jpg +0 -0
  227. data/samples/bigdemo/icons/Test 015.png +0 -0
  228. data/samples/bigdemo/icons/choice.bmp +0 -0
  229. data/samples/bigdemo/icons/combo.bmp +0 -0
  230. data/samples/bigdemo/icons/combo.xpm +0 -27
  231. data/samples/bigdemo/icons/copy.xpm +0 -25
  232. data/samples/bigdemo/icons/cut.xpm +0 -24
  233. data/samples/bigdemo/icons/gauge.bmp +0 -0
  234. data/samples/bigdemo/icons/gauge.xpm +0 -27
  235. data/samples/bigdemo/icons/help.xpm +0 -25
  236. data/samples/bigdemo/icons/list.bmp +0 -0
  237. data/samples/bigdemo/icons/list.xpm +0 -27
  238. data/samples/bigdemo/icons/mondrian.ico +0 -0
  239. data/samples/bigdemo/icons/mondrian.xpm +0 -44
  240. data/samples/bigdemo/icons/new.xpm +0 -24
  241. data/samples/bigdemo/icons/ogl.ico +0 -0
  242. data/samples/bigdemo/icons/ogl.xpm +0 -45
  243. data/samples/bigdemo/icons/open.xpm +0 -26
  244. data/samples/bigdemo/icons/paste.bmp +0 -0
  245. data/samples/bigdemo/icons/paste.xpm +0 -38
  246. data/samples/bigdemo/icons/pointy.png +0 -0
  247. data/samples/bigdemo/icons/preview.xpm +0 -26
  248. data/samples/bigdemo/icons/print.xpm +0 -26
  249. data/samples/bigdemo/icons/radio.bmp +0 -0
  250. data/samples/bigdemo/icons/radio.xpm +0 -27
  251. data/samples/bigdemo/icons/robert.xpm +0 -415
  252. data/samples/bigdemo/icons/sashtest.ico +0 -0
  253. data/samples/bigdemo/icons/save.xpm +0 -25
  254. data/samples/bigdemo/icons/smiles.bmp +0 -0
  255. data/samples/bigdemo/icons/smiles.xpm +0 -39
  256. data/samples/bigdemo/icons/smiley.ico +0 -0
  257. data/samples/bigdemo/icons/smiley.xpm +0 -42
  258. data/samples/bigdemo/icons/stattext.xpm +0 -24
  259. data/samples/bigdemo/icons/test2.bmp +0 -0
  260. data/samples/bigdemo/icons/test2.png +0 -0
  261. data/samples/bigdemo/icons/test2.xpm +0 -79
  262. data/samples/bigdemo/icons/text.bmp +0 -0
  263. data/samples/bigdemo/icons/text.xpm +0 -27
  264. data/samples/bigdemo/icons/tog1.bmp +0 -0
  265. data/samples/bigdemo/icons/tog1.xpm +0 -38
  266. data/samples/bigdemo/icons/tog2.bmp +0 -0
  267. data/samples/bigdemo/icons/tog2.xpm +0 -38
  268. data/samples/bigdemo/icons/wxruby-128x128.png +0 -0
  269. data/samples/bigdemo/icons/wxwin.ico +0 -0
  270. data/samples/bigdemo/icons/wxwin16x16.png +0 -0
  271. data/samples/bigdemo/icons/wxwin16x16.xpm +0 -25
  272. data/samples/bigdemo/icons/wxwin32x32.png +0 -0
  273. data/samples/bigdemo/icons/wxwin48x48.png +0 -0
  274. data/samples/bigdemo/run.rb +0 -98
  275. data/samples/bigdemo/tips.txt +0 -7
  276. data/samples/bigdemo/utils.rb +0 -20
  277. data/samples/bigdemo/wxArtProvider.rbw +0 -282
  278. data/samples/bigdemo/wxBitmapButton.rbw +0 -65
  279. data/samples/bigdemo/wxButton.rbw +0 -64
  280. data/samples/bigdemo/wxCalendarCtrl.rbw +0 -59
  281. data/samples/bigdemo/wxCheckBox.rbw +0 -50
  282. data/samples/bigdemo/wxCheckListBox.rbw +0 -65
  283. data/samples/bigdemo/wxChoice.rbw +0 -47
  284. data/samples/bigdemo/wxChoicebook.rbw +0 -78
  285. data/samples/bigdemo/wxColourDialog.rbw +0 -33
  286. data/samples/bigdemo/wxComboBox.rbw +0 -77
  287. data/samples/bigdemo/wxCursor.rbw +0 -136
  288. data/samples/bigdemo/wxDialog.rbw +0 -74
  289. data/samples/bigdemo/wxDirDialog.rbw +0 -29
  290. data/samples/bigdemo/wxDragImage.rbw +0 -70
  291. data/samples/bigdemo/wxFileDialog.rbw +0 -37
  292. data/samples/bigdemo/wxFileDialog_Save.rbw +0 -35
  293. data/samples/bigdemo/wxFindReplaceDialog.rbw +0 -82
  294. data/samples/bigdemo/wxFontDialog.rbw +0 -200
  295. data/samples/bigdemo/wxFrame.rbw +0 -53
  296. data/samples/bigdemo/wxGauge.rbw +0 -65
  297. data/samples/bigdemo/wxGenericDirCtrl.rbw +0 -74
  298. data/samples/bigdemo/wxGrid.rbw +0 -66
  299. data/samples/bigdemo/wxHtmlHelpController.rbw +0 -52
  300. data/samples/bigdemo/wxListBox.rbw +0 -140
  301. data/samples/bigdemo/wxListCtrl_virtual.rbw +0 -112
  302. data/samples/bigdemo/wxMDIWindows.rbw +0 -50
  303. data/samples/bigdemo/wxMenu.rbw +0 -247
  304. data/samples/bigdemo/wxMessageDialog.rbw +0 -27
  305. data/samples/bigdemo/wxMiniFrame.rbw +0 -70
  306. data/samples/bigdemo/wxMultipleChoiceDialog.rbw +0 -29
  307. data/samples/bigdemo/wxNotebook.rbw +0 -136
  308. data/samples/bigdemo/wxProgressDialog.rbw +0 -43
  309. data/samples/bigdemo/wxRadioBox.rbw +0 -72
  310. data/samples/bigdemo/wxRadioButton.rbw +0 -125
  311. data/samples/bigdemo/wxSashWindow.rbw +0 -141
  312. data/samples/bigdemo/wxScrolledMessageDialog.rbw +0 -57
  313. data/samples/bigdemo/wxScrolledWindow.rbw +0 -199
  314. data/samples/bigdemo/wxSingleChoiceDialog.rbw +0 -33
  315. data/samples/bigdemo/wxSlider.rbw +0 -42
  316. data/samples/bigdemo/wxSpinButton.rbw +0 -50
  317. data/samples/bigdemo/wxSpinCtrl.rbw +0 -51
  318. data/samples/bigdemo/wxSplitterWindow.rbw +0 -63
  319. data/samples/bigdemo/wxStaticBitmap.rbw +0 -47
  320. data/samples/bigdemo/wxStaticText.rbw +0 -55
  321. data/samples/bigdemo/wxStatusBar.rbw +0 -126
  322. data/samples/bigdemo/wxTextCtrl.rbw +0 -149
  323. data/samples/bigdemo/wxTextEntryDialog.rbw +0 -31
  324. data/samples/bigdemo/wxToggleButton.rbw +0 -49
  325. data/samples/bigdemo/wxToolBar.rbw +0 -131
  326. data/samples/bigdemo/wxTreeCtrl.rbw +0 -191
  327. data/samples/caret/caret.rb +0 -298
  328. data/samples/caret/mondrian.xpm +0 -44
  329. data/samples/controls/books.rb +0 -189
  330. data/samples/controls/choice.xpm +0 -27
  331. data/samples/controls/combo.xpm +0 -27
  332. data/samples/controls/controls.rb +0 -1099
  333. data/samples/controls/gauge.xpm +0 -27
  334. data/samples/controls/list.xpm +0 -27
  335. data/samples/controls/mondrian.ico +0 -0
  336. data/samples/controls/mondrian.xpm +0 -44
  337. data/samples/controls/radio.xpm +0 -27
  338. data/samples/controls/stattext.xpm +0 -24
  339. data/samples/controls/test2.bmp +0 -0
  340. data/samples/controls/text.xpm +0 -27
  341. data/samples/controls/tn_books.png +0 -0
  342. data/samples/controls/tn_controls.png +0 -0
  343. data/samples/etc/choice.rb +0 -87
  344. data/samples/etc/tn_choice.png +0 -0
  345. data/samples/text/mondrian.ico +0 -0
  346. data/samples/text/mondrian.xpm +0 -44
  347. /data/samples/{caret → etc}/tn_caret.png +0 -0
@@ -0,0 +1,192 @@
1
+ # Copyright (c) 2023 M.J.N. Corino, The Netherlands
2
+ #
3
+ # This software is released under the MIT license.
4
+
5
+ ###
6
+ # wxRuby3 wxWidgets interface director
7
+ ###
8
+
9
+ require_relative './window'
10
+
11
+ module WXRuby3
12
+
13
+ class Director
14
+
15
+ class OwnerDrawnComboBox < Window
16
+
17
+ include Typemap::ClientData
18
+
19
+ def setup
20
+ super
21
+ spec.items << 'wxItemContainer'
22
+ # override inheritance chain
23
+ spec.override_inheritance_chain('wxOwnerDrawnComboBox', %w[wxComboCtrl wxControl wxWindow wxEvtHandler wxObject])
24
+ spec.fold_bases('wxOwnerDrawnComboBox' => %w[wxItemContainer])
25
+ spec.regard %w[
26
+ wxOwnerDrawnComboBox::OnDrawBackground
27
+ wxOwnerDrawnComboBox::OnDrawItem
28
+ wxOwnerDrawnComboBox::OnMeasureItem
29
+ wxOwnerDrawnComboBox::OnMeasureItemWidth
30
+ ]
31
+ # unuseful overloads
32
+ spec.ignore 'wxOwnerDrawnComboBox::wxOwnerDrawnComboBox(wxWindow *, wxWindowID, const wxString &, const wxPoint &, const wxSize &, int, const wxString [], long, const wxValidator &, const wxString &)',
33
+ 'wxOwnerDrawnComboBox::Create(wxWindow *, wxWindowID, const wxString &, const wxPoint &, const wxSize &, int, const wxString [], long, const wxValidator &, const wxString &)'
34
+ spec.ignore('wxItemContainer::Append(const wxString &, void *)',
35
+ 'wxItemContainer::Append(const std::vector< wxString > &)',
36
+ 'wxItemContainer::Append(const wxArrayString &, void **)',
37
+ 'wxItemContainer::Append(unsigned int, const wxString *)',
38
+ 'wxItemContainer::Append(unsigned int, const wxString *, void **)',
39
+ 'wxItemContainer::Append(unsigned int, const wxString *, wxClientData **)',
40
+ 'wxItemContainer::Insert(const wxString &, unsigned int, void *)',
41
+ 'wxItemContainer::Insert(const std::vector< wxString > &)',
42
+ 'wxItemContainer::Insert(const wxArrayString &, unsigned int, void **)',
43
+ 'wxItemContainer::Insert(unsigned int, const wxString *, unsigned int)',
44
+ 'wxItemContainer::Insert(unsigned int, const wxString *, unsigned int, void **)',
45
+ 'wxItemContainer::Insert(unsigned int, const wxString *, unsigned int, wxClientData **)',
46
+ 'wxItemContainer::Set(const std::vector< wxString > &)',
47
+ 'wxItemContainer::Set(const wxArrayString &, void **)',
48
+ 'wxItemContainer::Set(unsigned int, const wxString *)',
49
+ 'wxItemContainer::Set(unsigned int, const wxString *, void **)',
50
+ 'wxItemContainer::Set(unsigned int, const wxString *, wxClientData **)',
51
+ 'wxItemContainer::GetClientData',
52
+ 'wxItemContainer::SetClientData',
53
+ 'wxItemContainer::HasClientUntypedData',
54
+ 'wxItemContainer::Clear')
55
+ # ignore these but keep docs; will add custom versions below
56
+ spec.ignore([
57
+ 'wxItemContainer::DetachClientObject',
58
+ 'wxItemContainer::Append(const wxArrayString &, wxClientData **)',
59
+ 'wxItemContainer::Insert(const wxArrayString &, unsigned int, wxClientData **)',
60
+ 'wxItemContainer::Set(const wxArrayString &, wxClientData **)'], ignore_doc: false)
61
+ # ambiguous
62
+ spec.ignore 'wxOwnerDrawnComboBox::IsEmpty', ignore_doc: false
63
+ # missing from docs; needed to override TextEntry version
64
+ spec.extend_interface 'wxOwnerDrawnComboBox', 'void Clear()'
65
+ # missing from docs; required so proxy calls correct override
66
+ spec.extend_interface 'wxOwnerDrawnComboBox',
67
+ 'virtual void DoSetPopupControl(wxComboPopup* popup)',
68
+ visibility: 'protected'
69
+ # missing from docs; implementations of wxItemContainerImmutable methods
70
+ spec.extend_interface 'wxOwnerDrawnComboBox',
71
+ 'unsigned int GetCount() const',
72
+ 'wxString GetString(unsigned int n) const',
73
+ 'void SetString(unsigned int n, const wxString& s)',
74
+ 'int FindString(const wxString& s, bool bCase = false) const',
75
+ 'void Select(int n)',
76
+ 'wxArrayString GetStrings() const'
77
+ # for doc only
78
+ spec.map 'void** clientData' => 'Array', swig: false do
79
+ map_in code: ''
80
+ end
81
+ # Replace the old Wx definitions of these methods adding
82
+ # proper checks on the data arrays.
83
+ # Also add an item enumerator.
84
+ spec.add_extend_code 'wxOwnerDrawnComboBox', <<~__HEREDOC
85
+ wxString GetListStringSelection()
86
+ {
87
+ return $self->wxItemContainerImmutable::GetStringSelection();
88
+ }
89
+
90
+ bool SetListStringSelection(const wxString& string)
91
+ {
92
+ return $self->wxItemContainerImmutable::SetStringSelection(string);
93
+ }
94
+
95
+ void SetListSelection(int n)
96
+ {
97
+ $self->SetSelection(n);
98
+ }
99
+
100
+ int GetListSelection()
101
+ {
102
+ return $self->GetSelection();
103
+ }
104
+
105
+ VALUE DetachClientObject(unsigned int n)
106
+ {
107
+ VALUE rc = Qnil;
108
+ wxClientData *wxcd = $self->DetachClientObject(n);
109
+ wxRubyClientData *rbcd = wxcd ? dynamic_cast<wxRubyClientData*> (wxcd) : nullptr;
110
+ if (rbcd)
111
+ {
112
+ rc = rbcd->GetData();
113
+ delete rbcd;
114
+ }
115
+ return rc;
116
+ }
117
+
118
+ int Append(const wxArrayString &items, VALUE rb_clientData)
119
+ {
120
+ if (TYPE(rb_clientData) != T_ARRAY ||
121
+ static_cast<unsigned int> (RARRAY_LEN(rb_clientData)) != items.GetCount())
122
+ {
123
+ rb_raise(rb_eArgError,
124
+ TYPE(rb_clientData) == T_ARRAY ?
125
+ "expected Array for client_data" :
126
+ "client_data Array needs to be equal in size to items Array");
127
+ }
128
+
129
+ std::unique_ptr<wxClientData*[]> cd_arr = std::make_unique<wxClientData*[]> (RARRAY_LEN(rb_clientData));
130
+ for (int i=0; i<RARRAY_LEN(rb_clientData) ;++i)
131
+ {
132
+ cd_arr[i] = new wxRubyClientData(rb_ary_entry(rb_clientData, i));
133
+ }
134
+ return $self->Append(items, cd_arr.get());
135
+ }
136
+
137
+ int Insert(const wxArrayString &items, unsigned int pos, VALUE rb_clientData)
138
+ {
139
+ if (TYPE(rb_clientData) != T_ARRAY ||
140
+ static_cast<unsigned int> (RARRAY_LEN(rb_clientData)) != items.GetCount())
141
+ {
142
+ rb_raise(rb_eArgError,
143
+ TYPE(rb_clientData) == T_ARRAY ?
144
+ "expected Array for client_data" :
145
+ "client_data Array needs to be equal in size to items Array");
146
+ }
147
+
148
+ std::unique_ptr<wxClientData*[]> cd_arr = std::make_unique<wxClientData*[]> (RARRAY_LEN(rb_clientData));
149
+ for (int i=0; i<RARRAY_LEN(rb_clientData) ;++i)
150
+ {
151
+ cd_arr[i] = new wxRubyClientData(rb_ary_entry(rb_clientData, i));
152
+ }
153
+ return $self->Insert(items, pos, cd_arr.get());
154
+ }
155
+
156
+ void Set(const wxArrayString &items, VALUE rb_clientData)
157
+ {
158
+ if (TYPE(rb_clientData) != T_ARRAY ||
159
+ static_cast<unsigned int> (RARRAY_LEN(rb_clientData)) != items.GetCount())
160
+ {
161
+ rb_raise(rb_eArgError,
162
+ TYPE(rb_clientData) == T_ARRAY ?
163
+ "expected Array for client_data" :
164
+ "client_data Array needs to be equal in size to items Array");
165
+ }
166
+
167
+ std::unique_ptr<wxClientData*[]> cd_arr = std::make_unique<wxClientData*[]> (RARRAY_LEN(rb_clientData));
168
+ for (int i=0; i<RARRAY_LEN(rb_clientData) ;++i)
169
+ {
170
+ cd_arr[i] = new wxRubyClientData(rb_ary_entry(rb_clientData, i));
171
+ }
172
+ $self->Set(items, cd_arr.get());
173
+ }
174
+
175
+ VALUE each_string()
176
+ {
177
+ VALUE rc = Qnil;
178
+ for (unsigned int i=0; i<$self->GetCount() ;++i)
179
+ {
180
+ VALUE rb_s = WXSTR_TO_RSTR($self->GetString(i));
181
+ rc = rb_yield(rb_s);
182
+ }
183
+ return rc;
184
+ }
185
+ __HEREDOC
186
+ end
187
+
188
+ end # class OwnerDrawnComboBox
189
+
190
+ end # class Director
191
+
192
+ end # module WXRuby3
@@ -18,6 +18,8 @@ module WXRuby3
18
18
 
19
19
  include Typemap::PGCell
20
20
 
21
+ include Typemap::ClientData
22
+
21
23
  def setup
22
24
  super
23
25
  if spec.module_name == 'wxPGProperty'
@@ -113,7 +115,7 @@ module WXRuby3
113
115
  # obsolete
114
116
  spec.ignore %w[wxPGProperty::AddChild wxPGProperty::GetValueString]
115
117
  # not of use in Ruby
116
- spec.ignore(%w[wxPGProperty::GetClientObject wxPGProperty::SetClientObject])
118
+ spec.ignore(%w[wxPGProperty::GetClientData wxPGProperty::SetClientData])
117
119
  # only keep the const version
118
120
  spec.ignore 'wxPGProperty::GetCell'
119
121
  spec.regard 'wxPGProperty::GetCell(unsigned int) const'
@@ -146,32 +148,6 @@ module WXRuby3
146
148
  spec.suppress_warning(473,
147
149
  'wxPGProperty::DoGetEditorClass',
148
150
  'wxPGProperty::DoGetValidator')
149
- spec.add_header_code <<~__HEREDOC
150
- extern void GC_mark_wxPGProperty(void* ptr)
151
- {
152
- #ifdef __WXRB_DEBUG__
153
- if (wxRuby_TraceLevel()>1)
154
- {
155
- std::wcout << "> GC_mark_wxPGProperty : " << ptr;
156
- if (ptr) std::wcout << " (" << ((wxPGProperty*)ptr)->GetName() << ')';
157
- std::wcout << std::endl;
158
- }
159
- #endif
160
- if (ptr)
161
- {
162
- VALUE object = (VALUE)((wxPGProperty*)ptr)->GetClientData();
163
- if (object && !NIL_P(object))
164
- {
165
- #ifdef __WXRB_DEBUG__
166
- if (wxRuby_TraceLevel()>2)
167
- std::wcout << "*** marking property data " << ptr << std::endl;
168
- #endif
169
- rb_gc_mark(object);
170
- }
171
- }
172
- }
173
- __HEREDOC
174
- spec.add_swig_code '%markfunc wxPGProperty "GC_mark_wxPGProperty";'
175
151
  spec.ignore 'wxPGProperty::m_clientData' # not wanted for wxRuby
176
152
  # take protected members into account
177
153
  spec.regard 'wxPGProperty::wxPGProperty',
@@ -237,7 +213,6 @@ module WXRuby3
237
213
  }
238
214
  __CODE
239
215
  else
240
- spec.add_header_code 'extern void GC_mark_wxPGProperty(void* ptr);'
241
216
  spec.items.each do |itm|
242
217
  unless itm == 'wxColourPropertyValue'
243
218
  # add protected member methods and var to complement base class
@@ -250,7 +225,6 @@ module WXRuby3
250
225
  'wxVariant m_value',
251
226
  visibility: 'protected'
252
227
  spec.rename_for_ruby 'value_' => "#{itm}::m_value"
253
- spec.add_swig_code %Q{%markfunc #{itm} "GC_mark_wxPGProperty";}
254
228
  spec.new_object %Q{#{itm}::GetEditorDialog}
255
229
  spec.suppress_warning(473, "#{itm}::GetEditorDialog")
256
230
  end
@@ -14,13 +14,13 @@ module WXRuby3
14
14
 
15
15
  class RibbonButtonBar < Window
16
16
 
17
+ include Typemap::ClientData
18
+
17
19
  def setup
18
20
  super
19
21
  # exclude these; far better done in pure Ruby
20
22
  spec.ignore 'wxRibbonButtonBar::SetItemClientData',
21
- 'wxRibbonButtonBar::GetItemClientData', ignore_doc: false
22
- spec.ignore 'wxRibbonButtonBar::SetItemClientObject',
23
- 'wxRibbonButtonBar::GetItemClientObject'
23
+ 'wxRibbonButtonBar::GetItemClientData'
24
24
  # not needed because of type mapping
25
25
  spec.ignore 'wxRibbonButtonBar::GetItemId',
26
26
  'wxRibbonButtonBar::GetItemById'
@@ -14,15 +14,13 @@ module WXRuby3
14
14
 
15
15
  class RibbonGallery < Window
16
16
 
17
+ include Typemap::ClientData
18
+
17
19
  def setup
18
20
  super
19
- # exclude these; far better done in pure Ruby
20
- spec.ignore 'wxRibbonGallery::SetItemClientObject',
21
- 'wxRibbonGallery::GetItemClientObject',
22
- 'wxRibbonGallery::Append(const wxBitmap &, int, wxClientData *)'
23
21
  spec.ignore 'wxRibbonGallery::SetItemClientData',
24
22
  'wxRibbonGallery::GetItemClientData',
25
- 'wxRibbonGallery::Append(const wxBitmap &, int, void *)', ignore_doc: false
23
+ 'wxRibbonGallery::Append(const wxBitmap &, int, void *)'
26
24
  spec.map 'wxRibbonGalleryItem*' => 'Integer' do
27
25
  map_out code: '$result = ULL2NUM(reinterpret_cast<uintptr_t> ($1));'
28
26
  map_directorout code: '$result = reinterpret_cast<wxRibbonGalleryItem*> ((uintptr_t)NUM2ULL($1));'
@@ -12,12 +12,19 @@ module WXRuby3
12
12
 
13
13
  class Sizer < Director
14
14
 
15
+ include Typemap::ClientData
16
+
15
17
  def setup
16
- # Any nested sizers passed to Add() in are owned by C++, not GC'd by Ruby
18
+ # Any nested sizers passed to Add() in are owned by C++, not GC-ed by Ruby
17
19
  case spec.module_name
18
20
  when 'wxSizer'
19
21
  spec.items << 'wxSizerFlags'
20
22
  spec.gc_as_untracked('wxSizerFlags')
23
+ if Config.instance.wx_version < '3.3.0'
24
+ # missing from docs
25
+ spec.extend_interface 'wxSizerFlags',
26
+ 'wxSizerFlags& HorzBorder()'
27
+ end
21
28
  spec.make_abstract('wxSizer')
22
29
  spec.ignore %w[wxSizer::IsShown wxSizer::SetVirtualSizeHints]
23
30
  # cannot use these with wxRuby
@@ -45,7 +52,7 @@ module WXRuby3
45
52
  spec.ignore 'wxSizer::Detach(wxSizer*)',
46
53
  'wxSizer::Detach(int)', ignore_doc: false
47
54
  spec.add_extend_code 'wxSizer', <<~__HEREDOC
48
- bool detach(wxSizer* szr)
55
+ bool Detach(wxSizer* szr)
49
56
  {
50
57
  if ($self->Detach(szr))
51
58
  {
@@ -60,7 +67,7 @@ module WXRuby3
60
67
  return false;
61
68
  }
62
69
 
63
- bool detach(int itm_nr)
70
+ bool Detach(int itm_nr)
64
71
  {
65
72
  wxSizerItem* itm = $self->GetItem(itm_nr);
66
73
  if (itm)
@@ -124,9 +131,13 @@ module WXRuby3
124
131
  spec.ignore 'wxGridBagSizer::Add(wxGBSizerItem *)'
125
132
  # need to adjust sizer arg name to apply disown specs
126
133
  spec.ignore 'wxGridBagSizer::Add(wxSizer *, const wxGBPosition &, const wxGBSpan &, int, int, wxObject *)',
134
+ 'wxGridBagSizer::Add(wxWindow *, const wxGBPosition &, const wxGBSpan &, int, int, wxObject *)',
135
+ 'wxGridBagSizer::Add(int, int, const wxGBPosition &, const wxGBSpan &, int, int, wxObject *)',
127
136
  ignore_doc: false
128
137
  spec.extend_interface 'wxGridBagSizer',
129
- 'wxSizerItem *Add(wxSizer *sizer_disown, const wxGBPosition &pos, const wxGBSpan &span=wxDefaultSpan, int flag=0, int border=0, wxObject *userData=NULL)'
138
+ 'wxSizerItem * Add(wxSizer *sizer_disown, const wxGBPosition &pos, const wxGBSpan &span=wxDefaultSpan, int flag=0, int border=0, wxObject *userData=NULL)',
139
+ 'wxSizerItem * Add(wxWindow *window, const wxGBPosition &pos, const wxGBSpan &span=wxDefaultSpan, int flag=0, int border=0, wxObject *userData=NULL)',
140
+ 'wxSizerItem * Add(int width, int height, const wxGBPosition &pos, const wxGBSpan &span=wxDefaultSpan, int flag=0, int border=0, wxObject *userData=NULL)'
130
141
  spec.disown 'wxSizer* sizer_disown'
131
142
  end
132
143
  # no real use for allowing these to be overloaded but a whole lot of grieve
@@ -12,15 +12,27 @@ module WXRuby3
12
12
 
13
13
  class SizerItem < Director
14
14
 
15
+ include Typemap::ClientData
16
+
15
17
  def setup
16
18
  spec.disable_proxies
17
19
  # do not allow creating SizerItems in Ruby; this has limited benefits and
18
20
  # memory management of sizer items is a nightmare
19
21
  case spec.module_name
20
22
  when 'wxSizerItem'
23
+ spec.gc_as_untracked 'wxSizerItem'
21
24
  spec.make_abstract 'wxSizerItem'
22
25
  # ignore constructors
23
26
  spec.ignore 'wxSizerItem::wxSizerItem'
27
+ # needs more discriminating return type for type map
28
+ spec.ignore 'wxSizerItem::GetUserData', ignore_doc: false
29
+ spec.add_header_code 'typedef wxObject* WxUserDataObject;'
30
+ spec.extend_interface 'wxSizerItem',
31
+ 'WxUserDataObject GetUserData() const'
32
+ # for doc gen only
33
+ spec.map 'wxObject*' => 'Object', swig: false do
34
+ map_out code: ''
35
+ end
24
36
  spec.ignore(%w[wxSizerItem::SetSizer wxSizerItem::SetSpacer wxSizerItem::SetWindow])
25
37
  # need to adjust sizer arg name to apply disown specs
26
38
  spec.ignore 'wxSizerItem::AssignSizer(wxSizer *)', ignore_doc: false
@@ -45,6 +57,7 @@ module WXRuby3
45
57
  }
46
58
  __HEREDOC
47
59
  when 'wxGBSizerItem'
60
+ spec.gc_as_untracked 'wxGBSizerItem'
48
61
  spec.make_abstract 'wxGBSizerItem'
49
62
  # ignore constructors
50
63
  spec.ignore 'wxGBSizerItem::wxGBSizerItem',
@@ -20,6 +20,34 @@ module WXRuby3
20
20
  __HEREDOC
21
21
  super
22
22
  end
23
+
24
+ def process(gendoc: false)
25
+ defmod = super
26
+ spec.include 'wx/generic/statbmpg.h'
27
+ def_statbmp = defmod.find_item('wxStaticBitmap')
28
+ # create a definition for 'wxGenericStaticBitmap' which is not documented
29
+ def_genstatbmp = def_statbmp.dup
30
+ def_genstatbmp.name = 'wxGenericStaticBitmap'
31
+ def_genstatbmp.brief_doc = nil
32
+ def_genstatbmp.detailed_doc = nil
33
+ def_genstatbmp.items = def_genstatbmp.items.collect { |itm| itm.dup }
34
+ def_genstatbmp.items.each do |itm|
35
+ if itm.is_a?(Extractor::MethodDef)
36
+ itm.overloads = itm.overloads.collect { |ovl| ovl.dup }
37
+ itm.all.each do |ovl|
38
+ ovl.name = 'wxGenericStaticBitmap' if ovl.is_ctor
39
+ ovl.class_name = 'wxGenericStaticBitmap'
40
+ ovl.update_attributes(klass: def_genstatbmp)
41
+ end
42
+ end
43
+ end
44
+ def_genstatbmp.items.delete_if { |itm| itm.is_a?(Extractor::EnumDef) && itm.name == 'ScaleMode' }
45
+ spec.add_swig_code %Q{typedef wxStaticBitmap::ScaleMode ScaleMode; }
46
+ spec.add_header_code %Q{typedef wxStaticBitmap::ScaleMode ScaleMode; }
47
+ defmod.items << def_genstatbmp
48
+ defmod
49
+ end
50
+
23
51
  end # class StaticBitmap
24
52
 
25
53
  end # class Director
@@ -26,6 +26,10 @@ module WXRuby3
26
26
  spec.add_header_code '#define wxTextEntry wxTextEntryBase'
27
27
  spec.disown 'wxTextCompleter *completer' # managed by wxWidgets after passing in
28
28
  spec.map_apply 'long * OUTPUT' => 'long *' # for GetSelection
29
+ # missing non-pure virtual overrides in docs for wxTextCompleterSimple
30
+ spec.extend_interface 'wxTextCompleterSimple',
31
+ 'virtual bool Start(const wxString &prefix)',
32
+ 'virtual wxString GetNext()'
29
33
  # for wxTextCompleterSimple::GetCompletions
30
34
  spec.map 'wxArrayString &res' => 'Array<String>' do
31
35
 
@@ -6,48 +6,159 @@
6
6
  # wxRuby3 wxWidgets interface director
7
7
  ###
8
8
 
9
- require_relative './event_handler'
9
+ require_relative './validator'
10
10
 
11
11
  module WXRuby3
12
12
 
13
13
  class Director
14
14
 
15
- class TextValidator < EvtHandler
15
+ class TextValidator < Validator
16
16
 
17
17
  def setup
18
18
  super
19
19
  # need a custom implementation to handle event handler proc cleanup
20
20
  spec.add_header_code <<~__HEREDOC
21
- class WXRubyTextValidator : public wxTextValidator
21
+ class WXRubyTextValidator : public wxTextValidator, public wxRubyValidatorBinding
22
22
  {
23
23
  public:
24
- WXRubyTextValidator(const wxTextValidator& v)
25
- : wxTextValidator(v) {}
26
24
  WXRubyTextValidator(long style=wxFILTER_NONE)
27
- : wxTextValidator(style) {}
25
+ : wxTextValidator(style, &m_valueCache)
26
+ {
27
+ }
28
+ WXRubyTextValidator(const WXRubyTextValidator& other)
29
+ : wxTextValidator(other.GetStyle(), &m_valueCache)
30
+ , wxRubyValidatorBinding(other)
31
+ {
32
+ }
28
33
  virtual ~WXRubyTextValidator()
29
34
  {
30
35
  wxRuby_ReleaseEvtHandlerProcs(this);
31
- }
36
+ }
37
+
38
+ virtual wxObject* Clone() const override
39
+ {
40
+ WXRubyTextValidator* clone = new WXRubyTextValidator(*this);
41
+ clone->m_valueCache = this->m_valueCache;
42
+ return clone;
43
+ }
44
+
45
+ virtual void SetWindow(wxWindow *win) override
46
+ {
47
+ this->wxTextValidator::SetWindow(win);
48
+ VALUE self = this->get_self();
49
+ // make sure Ruby does not own this validator instance anymore
50
+ RDATA(self)->dfree = SWIG_RubyRemoveTracking;
51
+ }
52
+
53
+ virtual bool TransferFromWindow () override
54
+ {
55
+ // call super
56
+ if (this->wxTextValidator::TransferFromWindow())
57
+ {
58
+ // ok, data is retrieved from window and cached
59
+ // now allow any defined binding handler to pass on the data
60
+ return this->DoOnTransferFromWindow(WXSTR_TO_RSTR(m_valueCache));
61
+ }
62
+ return false;
63
+ }
64
+ virtual bool TransferToWindow () override
65
+ {
66
+ // collect data from any defined binding handler
67
+ VALUE data = this->DoOnTransferToWindow();
68
+ // if Qnil returned there is no data returned from handler so we just keep what's in the store
69
+ if (!NIL_P(data))
70
+ {
71
+ m_valueCache = RSTR_TO_WXSTR(data);
72
+ }
73
+ // now allow standard functionality to transfer to window
74
+ return this->wxTextValidator::TransferToWindow();
75
+ }
76
+
77
+ const wxString& GetValue () const
78
+ {
79
+ return m_valueCache;
80
+ }
81
+
82
+ void SetValue (const wxString& val)
83
+ {
84
+ m_valueCache = val;
85
+ }
86
+
87
+ private:
88
+ static VALUE c_TextValidator;
89
+
90
+ virtual VALUE get_self() override
91
+ {
92
+ if (NIL_P(this->self_))
93
+ {
94
+ this->self_ = SWIG_RubyInstanceFor(this);
95
+ // if this is a C++ created clone (wxWidgets clones validators that are set) it's not tracked yet
96
+ if (NIL_P(this->self_))
97
+ {
98
+ if (NIL_P(c_TextValidator))
99
+ {
100
+ c_TextValidator = rb_const_get(mWxCore, rb_intern("TextValidator"));
101
+ }
102
+ swig_type_info* swig_type = wxRuby_GetSwigTypeForClass(c_TextValidator);
103
+ this->self_ = SWIG_NewPointerObj(this, swig_type, 0); // wrap but don't make Ruby own it
104
+ }
105
+ }
106
+ return this->self_;
107
+ }
108
+
109
+ wxString m_valueCache;
32
110
  };
33
- __HEREDOC
111
+
112
+ VALUE WXRubyTextValidator::c_TextValidator = Qnil;
113
+
114
+ static void GC_mark_wxTextValidator(void* ptr)
115
+ {
116
+ if (ptr)
117
+ {
118
+ wxValidator* vp = reinterpret_cast<wxValidator*> (ptr);
119
+ WXRubyTextValidator* rbvp = dynamic_cast<WXRubyTextValidator*> (vp);
120
+ // This might be a pointer to a non-customized validator (or clone thereof) created internally
121
+ // by wxWidgets C++ code
122
+ if (rbvp) rbvp->GC_Mark();
123
+ }
124
+ }
125
+
126
+ __HEREDOC
127
+ spec.add_swig_code '%markfunc wxTextValidator "GC_mark_wxTextValidator";'
128
+ # make Ruby director and wrappers use custom implementation
34
129
  spec.use_class_implementation 'wxTextValidator', 'WXRubyTextValidator'
35
- # ignore copy ctor doc
36
- spec.regard 'wxTextValidator::wxTextValidator(const wxTextValidator&)', regard_doc: false
37
130
  # ignore this ctor
38
131
  spec.ignore 'wxTextValidator::wxTextValidator(long, wxString*)'
39
132
  # add alternative
40
133
  spec.extend_interface 'wxTextValidator', 'wxTextValidator(long style=wxFILTER_NONE)'
41
- # ignore non-virtual standard handler (not really useful in Ruby)
134
+ # add wxRuby extensions
135
+ spec.add_extend_code 'wxTextValidator', <<~__HEREDOC
136
+ VALUE GetValue()
137
+ {
138
+ WXRubyTextValidator* rb_self = dynamic_cast<WXRubyTextValidator*> ($self);
139
+ if (rb_self)
140
+ return WXSTR_TO_RSTR(rb_self->GetValue());
141
+ else
142
+ return Qnil;
143
+ }
144
+
145
+ void SetValue(const wxString& val)
146
+ {
147
+ WXRubyTextValidator* rb_self = dynamic_cast<WXRubyTextValidator*> ($self);
148
+ if (rb_self)
149
+ rb_self->SetValue(val);
150
+ }
151
+ __HEREDOC
152
+ # ignore non-virtual standard handler (not useful in Ruby)
42
153
  spec.ignore 'wxTextValidator::OnChar'
43
- spec.no_proxy 'wxTextValidator::Clone'
44
154
  spec.new_object 'wxTextValidator::Clone'
45
155
  # handle clone mapping
46
156
  spec.map 'wxObject *' => 'Wx::TextValidator' do
47
157
  map_out code: <<~__CODE
48
- $result = SWIG_NewPointerObj(SWIG_as_voidptr($1), SWIGTYPE_p_wxTextValidator, SWIG_POINTER_OWN | 0 );
158
+ $result = SWIG_NewPointerObj(SWIG_as_voidptr($1), SWIGTYPE_p_wxTextValidator, SWIG_POINTER_OWN);
49
159
  __CODE
50
160
  end
161
+ spec.suppress_warning(473, 'wxTextValidator::Clone')
51
162
  # not provided in Ruby
52
163
  spec.ignore %w[wxTextValidator::TransferFromWindow wxTextValidator::TransferToWindow]
53
164
  end
@@ -15,6 +15,7 @@ module WXRuby3
15
15
  class ToggleButton < Window
16
16
 
17
17
  def setup
18
+ spec.items << 'wxBitmapToggleButton'
18
19
  spec.include('wx/tglbtn.h')
19
20
  super
20
21
  end
@@ -26,10 +26,8 @@ module WXRuby3
26
26
  # for upcalls
27
27
  spec.extend_interface('wxTopLevelWindow',
28
28
  'virtual bool Destroy() override',
29
- #'virtual bool IsTopLevel() override',
30
29
  'virtual void SetLayoutDirection(wxLayoutDirection dir) override',
31
30
  'virtual bool Show(bool show = true) override',
32
- 'virtual void Raise() override',
33
31
  'virtual void Refresh(bool eraseBackground = true, wxRect const *rect = NULL) override')
34
32
  spec.add_wrapper_code <<~__HEREDOC
35
33
  extern VALUE wxRuby_GetTopLevelWindowClass() {
@@ -50,6 +50,41 @@ module WXRuby3
50
50
  wxTreeCtrl::GetFirstChild
51
51
  wxTreeCtrl::GetNextChild
52
52
  ]
53
+ if Config.instance.wx_version >= '3.3.0'
54
+ # new method with bitmap bundle vector
55
+ spec.no_proxy 'wxTreeCtrl::SetStateImages'
56
+ spec.map 'const wxVector<wxBitmapBundle>& images' => 'Array<Wx::ImageBundle>' do
57
+ map_in temp: 'wxVector<wxBitmapBundle> tmp', code: <<~__CODE
58
+ if ($input != Qnil)
59
+ {
60
+ if (TYPE($input) == T_ARRAY)
61
+ {
62
+ for (int i=0; i<RARRAY_LEN($input) ;++i)
63
+ {
64
+ void* ptr;
65
+ VALUE rb_image = rb_ary_entry($input, i);
66
+ int res = SWIG_ConvertPtr(rb_image, &ptr, wxRuby_GetSwigTypeForClassName("BitmapBundle"), 0);
67
+ if (!SWIG_IsOK(res))
68
+ {
69
+ VALUE msg = rb_inspect(rb_image);
70
+ rb_raise(rb_eTypeError, "Expected Wx::ImageBundle at index %d but got %s", i, StringValuePtr(msg));
71
+ }
72
+ tmp.push_back(*static_cast<wxBitmapBundle*>(ptr));
73
+ }
74
+ }
75
+ else
76
+ {
77
+ VALUE msg = rb_inspect($input);
78
+ rb_raise(rb_eArgError, "Expected Array of Wx::ImageBundle for $argnum but got %s", StringValuePtr(msg));
79
+ }
80
+ }
81
+ $1 = &tmp;
82
+ __CODE
83
+ end
84
+ end
85
+ # don't see how supporting overloading this one in Ruby is helpful
86
+ # (also seeing SetButtonsImageList isn't virtual at all)
87
+ spec.no_proxy 'wxTreeCtrl::SetStateImageList'
53
88
  # these are potentially involved in GC mark phase so
54
89
  # we can't have them redirecting to Ruby calls
55
90
  spec.no_proxy %w[