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,495 @@
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 './validator'
10
+
11
+ module WXRuby3
12
+
13
+ class Director
14
+
15
+ class NumValidator < Validator
16
+
17
+ def setup
18
+ spec.items.replace ['valnum.h'] # enum from XML but only manually defined custom wxRuby classes
19
+ super
20
+ spec.initialize_at_end = true # no inheritance/XML info to analyze
21
+ spec.ignore 'wxMakeIntegerValidator', 'wxMakeFloatingPointValidator'
22
+ # need to explicitly declare this here as we do not have any XML extracted items
23
+ # so the post processing of the EvtHandler director does not work
24
+ spec.add_header_code <<~__HEREDOC
25
+ static WxRuby_ID __wxrb_try_before_id("try_before");
26
+ static WxRuby_ID __wxrb_try_after_id("try_after");
27
+ __HEREDOC
28
+ # provide custom wxRuby numeric validator classes
29
+ spec.add_header_code <<~__HEREDOC
30
+ #include <wx/valnum.h>
31
+
32
+ #ifdef wxLongLong_t
33
+ typedef wxLongLong_t LongestValueType;
34
+ typedef wxULongLong_t ULongestValueType;
35
+ #else
36
+ typedef long LongestValueType;
37
+ typedef unsigned long ULongestValueType;
38
+ #endif
39
+ class WXIntegerValidator : public wxIntegerValidator<LongestValueType>, public wxRubyValidatorBinding
40
+ {
41
+ public:
42
+ WXIntegerValidator(const WXIntegerValidator& v)
43
+ : wxIntegerValidator(v)
44
+ , wxRubyValidatorBinding(v)
45
+ {
46
+ // this is horrible but why they needed to explicitly declare this as a const member is beyond me
47
+ *reinterpret_cast<LongestValueType**> ((void*)&m_value) = &m_valueCache;
48
+ }
49
+ WXIntegerValidator(long style=wxNUM_VAL_DEFAULT)
50
+ : wxIntegerValidator(&m_valueCache, style)
51
+ {}
52
+ WXIntegerValidator(LongestValueType min, LongestValueType max, long style=wxFILTER_NONE)
53
+ : wxIntegerValidator(&m_valueCache, min, max, style)
54
+ {}
55
+ virtual ~WXIntegerValidator()
56
+ {
57
+ wxRuby_ReleaseEvtHandlerProcs(this);
58
+ }
59
+
60
+ virtual wxObject* Clone() const override
61
+ {
62
+ WXIntegerValidator* clone = new WXIntegerValidator(*this);
63
+ clone->m_valueCache = this->m_valueCache;
64
+ return clone;
65
+ }
66
+
67
+ virtual void SetWindow(wxWindow *win) override
68
+ {
69
+ this->wxIntegerValidator::SetWindow(win);
70
+ VALUE self = get_self();
71
+ // make sure Ruby does not own this validator instance anymore
72
+ RDATA(self)->dfree = SWIG_RubyRemoveTracking;
73
+ }
74
+
75
+ virtual bool TransferFromWindow () override
76
+ {
77
+ // call super
78
+ if (this->wxIntegerValidator::TransferFromWindow())
79
+ {
80
+ // ok, data is retrieved from window and cached
81
+ // now allow any defined binding handler to pass on the data
82
+ return this->DoOnTransferFromWindow(LL2NUM(m_valueCache));
83
+ }
84
+ return false;
85
+ }
86
+ virtual bool TransferToWindow () override
87
+ {
88
+ // collect data from any defined binding handler
89
+ VALUE data = this->DoOnTransferToWindow();
90
+ // if Qnil returned there is no data returned from handler so we just keep what's in the store
91
+ if (!NIL_P(data))
92
+ {
93
+ m_valueCache = NUM2LL(data);
94
+ }
95
+ // now allow standard functionality to transfer to window
96
+ return this->wxIntegerValidator::TransferToWindow();
97
+ }
98
+
99
+ LongestValueType GetValue () const
100
+ {
101
+ return m_valueCache;
102
+ }
103
+
104
+ void SetValue (LongestValueType val)
105
+ {
106
+ m_valueCache = val;
107
+ }
108
+
109
+ protected:
110
+ static VALUE c_IntegerValidator;
111
+
112
+ virtual VALUE get_self() override
113
+ {
114
+ if (NIL_P(this->self_))
115
+ {
116
+ this->self_ = SWIG_RubyInstanceFor(this);
117
+ // if this is a C++ created clone (wxWidgets clones validators that are set) it's not tracked yet
118
+ if (NIL_P(this->self_))
119
+ {
120
+ if (NIL_P(c_IntegerValidator))
121
+ {
122
+ c_IntegerValidator = rb_const_get(mWxCore, rb_intern("IntegerValidator"));
123
+ }
124
+ swig_type_info* swig_type = wxRuby_GetSwigTypeForClass(c_IntegerValidator);
125
+ this->self_ = SWIG_NewPointerObj(this, swig_type, 0); // wrap but don't make Ruby own it
126
+ }
127
+ }
128
+ return this->self_;
129
+ }
130
+
131
+ LongestValueType m_valueCache {};
132
+ };
133
+
134
+ VALUE WXIntegerValidator::c_IntegerValidator = Qnil;
135
+
136
+ static void GC_mark_wxIntegerValidator(void* ptr)
137
+ {
138
+ if (ptr)
139
+ {
140
+ wxValidator* vp = reinterpret_cast<wxValidator*> (ptr);
141
+ WXIntegerValidator* rbvp = dynamic_cast<WXIntegerValidator*> (vp);
142
+ // This might be a pointer to a non-customized validator (or clone thereof) created internally
143
+ // by wxWidgets C++ code
144
+ if (rbvp) rbvp->GC_Mark();
145
+ }
146
+ }
147
+
148
+ class WXUnsignedValidator : public wxIntegerValidator<ULongestValueType>, public wxRubyValidatorBinding
149
+ {
150
+ public:
151
+ WXUnsignedValidator(const WXUnsignedValidator& v)
152
+ : wxIntegerValidator(v)
153
+ , wxRubyValidatorBinding(v)
154
+ {
155
+ // this is horrible but why they needed to explicitly declare this as a const member is beyond me
156
+ *reinterpret_cast<ULongestValueType**> ((void*)&m_value) = &m_valueCache;
157
+ }
158
+ WXUnsignedValidator(long style=wxFILTER_NONE)
159
+ : wxIntegerValidator(&m_valueCache, style)
160
+ {}
161
+ WXUnsignedValidator(LongestValueType min, LongestValueType max, long style=wxFILTER_NONE)
162
+ : wxIntegerValidator(&m_valueCache, min, max, style)
163
+ {}
164
+ virtual ~WXUnsignedValidator()
165
+ {
166
+ wxRuby_ReleaseEvtHandlerProcs(this);
167
+ }
168
+
169
+ virtual wxObject* Clone() const override
170
+ {
171
+ WXUnsignedValidator* clone = new WXUnsignedValidator(*this);
172
+ clone->m_valueCache = this->m_valueCache;
173
+ return clone;
174
+ }
175
+
176
+ virtual void SetWindow(wxWindow *win) override
177
+ {
178
+ this->wxIntegerValidator::SetWindow(win);
179
+ VALUE self = get_self();
180
+ // make sure Ruby does not own this validator instance anymore
181
+ RDATA(self)->dfree = SWIG_RubyRemoveTracking;
182
+ }
183
+
184
+ virtual bool TransferFromWindow () override
185
+ {
186
+ // call super
187
+ if (this->wxIntegerValidator::TransferFromWindow())
188
+ {
189
+ // ok, data is retrieved from window and cached
190
+ // now allow any defined binding handler to pass on the data
191
+ return this->DoOnTransferFromWindow(ULL2NUM(m_valueCache));
192
+ }
193
+ return false;
194
+ }
195
+ virtual bool TransferToWindow () override
196
+ {
197
+ // collect data from any defined binding handler
198
+ VALUE data = this->DoOnTransferToWindow();
199
+ // if Qnil returned there is no data returned from handler so we just keep what's in the store
200
+ if (!NIL_P(data))
201
+ {
202
+ m_valueCache = NUM2ULL(data);
203
+ }
204
+ // now allow standard functionality to transfer to window
205
+ return this->wxIntegerValidator::TransferToWindow();
206
+ }
207
+
208
+ ULongestValueType GetValue () const
209
+ {
210
+ return m_valueCache;
211
+ }
212
+
213
+ void SetValue (ULongestValueType val)
214
+ {
215
+ m_valueCache = val;
216
+ }
217
+
218
+ protected:
219
+ static VALUE c_UnsignedValidator;
220
+
221
+ virtual VALUE get_self() override
222
+ {
223
+ if (NIL_P(this->self_))
224
+ {
225
+ this->self_ = SWIG_RubyInstanceFor(this);
226
+ // if this is a C++ created clone (wxWidgets clones validators that are set) it's not tracked yet
227
+ if (NIL_P(this->self_))
228
+ {
229
+ if (NIL_P(c_UnsignedValidator))
230
+ {
231
+ c_UnsignedValidator = rb_const_get(mWxCore, rb_intern("UnsignedValidator"));
232
+ }
233
+ swig_type_info* swig_type = wxRuby_GetSwigTypeForClass(c_UnsignedValidator);
234
+ this->self_ = SWIG_NewPointerObj(this, swig_type, 0); // wrap but don't make Ruby own it
235
+ }
236
+ }
237
+ return this->self_;
238
+ }
239
+
240
+ ULongestValueType m_valueCache {};
241
+ };
242
+
243
+ VALUE WXUnsignedValidator::c_UnsignedValidator = Qnil;
244
+
245
+ static void GC_mark_wxUnsignedValidator(void* ptr)
246
+ {
247
+ if (ptr)
248
+ {
249
+ wxValidator* vp = reinterpret_cast<wxValidator*> (ptr);
250
+ WXUnsignedValidator* rbvp = dynamic_cast<WXUnsignedValidator*> (vp);
251
+ // This might be a pointer to a non-customized validator (or clone thereof) created internally
252
+ // by wxWidgets C++ code
253
+ if (rbvp) rbvp->GC_Mark();
254
+ }
255
+ }
256
+
257
+ class WXFloatValidator : public wxFloatingPointValidator<double>, public wxRubyValidatorBinding
258
+ {
259
+ public:
260
+ WXFloatValidator(const WXFloatValidator& v)
261
+ : wxFloatingPointValidator(v)
262
+ , wxRubyValidatorBinding(v)
263
+ {
264
+ // this is horrible but why they needed to explicitly declare this as a const member is beyond me
265
+ *reinterpret_cast<double**> ((void*)&m_value) = &m_valueCache;
266
+ }
267
+ WXFloatValidator(long style=wxFILTER_NONE)
268
+ : wxFloatingPointValidator(&m_valueCache, style)
269
+ {}
270
+ WXFloatValidator(int precision, long style=wxFILTER_NONE)
271
+ : wxFloatingPointValidator(precision, &m_valueCache, style)
272
+ {}
273
+ virtual ~WXFloatValidator()
274
+ {
275
+ wxRuby_ReleaseEvtHandlerProcs(this);
276
+ }
277
+
278
+ virtual wxObject* Clone() const override
279
+ {
280
+ return new WXFloatValidator(*this);
281
+ }
282
+
283
+ virtual void SetWindow(wxWindow *win) override
284
+ {
285
+ this->wxFloatingPointValidator::SetWindow(win);
286
+ VALUE self = get_self();
287
+ // make sure Ruby does not own this validator instance anymore
288
+ RDATA(self)->dfree = SWIG_RubyRemoveTracking;
289
+ }
290
+
291
+ virtual bool TransferFromWindow () override
292
+ {
293
+ // call super
294
+ if (this->wxFloatingPointValidator::TransferFromWindow())
295
+ {
296
+ // ok, data is retrieved from window and cached
297
+ // now allow any defined binding handler to pass on the data
298
+ return this->DoOnTransferFromWindow(DBL2NUM(m_valueCache));
299
+ }
300
+ return false;
301
+ }
302
+ virtual bool TransferToWindow () override
303
+ {
304
+ // collect data from any defined binding handler
305
+ VALUE data = this->DoOnTransferToWindow();
306
+ // if Qnil returned there is no data returned from handler so we just keep what's in the store
307
+ if (!NIL_P(data))
308
+ {
309
+ m_valueCache = NUM2DBL(data);
310
+ }
311
+ // now allow standard functionality to transfer to window
312
+ return this->wxFloatingPointValidator::TransferToWindow();
313
+ }
314
+
315
+ double GetValue () const
316
+ {
317
+ return m_valueCache;
318
+ }
319
+
320
+ void SetValue (double val)
321
+ {
322
+ m_valueCache = val;
323
+ }
324
+
325
+ protected:
326
+ static VALUE c_FloatValidator;
327
+
328
+ virtual VALUE get_self() override
329
+ {
330
+ if (NIL_P(this->self_))
331
+ {
332
+ this->self_ = SWIG_RubyInstanceFor(this);
333
+ // if this is a C++ created clone (wxWidgets clones validators that are set) it's not tracked yet
334
+ if (NIL_P(this->self_))
335
+ {
336
+ if (NIL_P(c_FloatValidator))
337
+ {
338
+ c_FloatValidator = rb_const_get(mWxCore, rb_intern("FloatValidator"));
339
+ }
340
+ swig_type_info* swig_type = wxRuby_GetSwigTypeForClass(c_FloatValidator);
341
+ this->self_ = SWIG_NewPointerObj(this, swig_type, 0); // wrap but don't make Ruby own it
342
+ }
343
+ }
344
+ return this->self_;
345
+ }
346
+
347
+ double m_valueCache {};
348
+ };
349
+
350
+ VALUE WXFloatValidator::c_FloatValidator = Qnil;
351
+
352
+ static void GC_mark_wxFloatValidator(void* ptr)
353
+ {
354
+ if (ptr)
355
+ {
356
+ wxValidator* vp = reinterpret_cast<wxValidator*> (ptr);
357
+ WXFloatValidator* rbvp = dynamic_cast<WXFloatValidator*> (vp);
358
+ // This might be a pointer to a non-customized validator (or clone thereof) created internally
359
+ // by wxWidgets C++ code
360
+ if (rbvp) rbvp->GC_Mark();
361
+ }
362
+ }
363
+ __HEREDOC
364
+ spec.add_swig_code 'GC_MANAGE_AS_OBJECT(WXIntegerValidator);',
365
+ '%markfunc WXIntegerValidator "GC_mark_wxIntegerValidator";',
366
+ 'GC_MANAGE_AS_OBJECT(WXUnsignedValidator);',
367
+ '%markfunc WXUnsignedValidator "GC_mark_wxUnsignedValidator";',
368
+ 'GC_MANAGE_AS_OBJECT(WXFloatValidator);',
369
+ '%markfunc WXFloatValidator "GC_mark_wxFloatValidator";'
370
+ spec.new_object 'WXIntegerValidator::Clone',
371
+ 'WXUnsignedValidator::Clone',
372
+ 'WXFloatValidator::Clone'
373
+ spec.suppress_warning(473,
374
+ 'WXIntegerValidator::Clone',
375
+ 'WXUnsignedValidator::Clone',
376
+ 'WXFloatValidator::Clone')
377
+ spec.map_apply 'long long * OUTPUT' => ['wxLongLong_t& min', 'wxLongLong_t& max']
378
+ spec.map_apply 'unsigned long long * OUTPUT' => ['wxULongLong_t& min', 'wxULongLong_t& max']
379
+ spec.map_apply 'double * OUTPUT' => ['double& min', 'double& max']
380
+ spec.swig_import 'swig/classes/include/wxObject.h'
381
+ spec.swig_import 'swig/classes/include/wxEvtHandler.h'
382
+ spec.swig_import 'swig/classes/include/wxValidator.h'
383
+ # hardcoded interface declarations
384
+ spec.add_interface_code <<~__HEREDOC
385
+ // Bit masks used for numeric validator styles.
386
+ enum wxNumValidatorStyle
387
+ {
388
+ wxNUM_VAL_DEFAULT = 0x0,
389
+ wxNUM_VAL_THOUSANDS_SEPARATOR = 0x1,
390
+ wxNUM_VAL_ZERO_AS_BLANK = 0x2,
391
+ wxNUM_VAL_NO_TRAILING_ZEROES = 0x4
392
+ };
393
+
394
+ %alias WXIntegerValidator::GetMin "min";
395
+ %alias WXIntegerValidator::SetMin "min=";
396
+ %alias WXIntegerValidator::GetMax "max";
397
+ %alias WXIntegerValidator::SetMax "max=";
398
+ %alias WXIntegerValidator::SetStyle "style=";
399
+ %alias WXIntegerValidator::GetValue "value";
400
+ %alias WXIntegerValidator::SetValue "value=";
401
+
402
+ class WXIntegerValidator : public wxValidator
403
+ {
404
+ public:
405
+ WXIntegerValidator(const WXIntegerValidator& v);
406
+ WXIntegerValidator(long style=wxNUM_VAL_DEFAULT);
407
+ WXIntegerValidator(wxLongLong_t min, wxLongLong_t max, long style=wxFILTER_NONE);
408
+ virtual ~WXIntegerValidator();
409
+
410
+ virtual WXIntegerValidator* Clone() const;
411
+
412
+ void SetMin(wxLongLong_t min);
413
+ wxLongLong_t GetMin() const;
414
+ void SetMax(wxLongLong_t max);
415
+ wxLongLong_t GetMax() const;
416
+ void SetRange(wxLongLong_t min, wxLongLong_t max);
417
+ void GetRange(wxLongLong_t& min, wxLongLong_t& max) const;
418
+ void SetStyle(int style);
419
+
420
+ // wxRuby extensions
421
+ wxLongLong_t GetValue () const;
422
+ void SetValue (wxLongLong_t val);
423
+ };
424
+
425
+ %alias WXUnsignedValidator::GetMin "min";
426
+ %alias WXUnsignedValidator::SetMin "min=";
427
+ %alias WXUnsignedValidator::GetMax "max";
428
+ %alias WXUnsignedValidator::SetMax "max=";
429
+ %alias WXUnsignedValidator::SetStyle "style=";
430
+ %alias WXUnsignedValidator::GetValue "value";
431
+ %alias WXUnsignedValidator::SetValue "value=";
432
+
433
+ class WXUnsignedValidator : public wxValidator
434
+ {
435
+ public:
436
+ WXUnsignedValidator(const WXUnsignedValidator& v);
437
+ WXUnsignedValidator(long style=wxNUM_VAL_DEFAULT);
438
+ WXUnsignedValidator(wxULongLong_t min, wxULongLong_t max, long style=wxFILTER_NONE);
439
+ virtual ~WXUnsignedValidator();
440
+
441
+ virtual WXUnsignedValidator* Clone() const;
442
+
443
+ void SetMin(wxULongLong_t min);
444
+ wxULongLong_t GetMin() const;
445
+ void SetMax(wxULongLong_t max);
446
+ wxULongLong_t GetMax() const;
447
+ void SetRange(wxULongLong_t min, wxULongLong_t max);
448
+ void GetRange(wxULongLong_t& min, wxULongLong_t& max) const;
449
+ void SetStyle(int style);
450
+
451
+ // wxRuby extensions
452
+ wxULongLong_t GetValue () const;
453
+ void SetValue (wxULongLong_t val);
454
+ };
455
+
456
+ %alias WXFloatValidator::GetMin "min";
457
+ %alias WXFloatValidator::SetMin "min=";
458
+ %alias WXFloatValidator::GetMax "max";
459
+ %alias WXFloatValidator::SetMax "max=";
460
+ %alias WXFloatValidator::SetStyle "style=";
461
+ %alias WXFloatValidator::GetValue "value";
462
+ %alias WXFloatValidator::SetValue "value=";
463
+
464
+ class WXFloatValidator : public wxValidator
465
+ {
466
+ public:
467
+ WXFloatValidator(const WXFloatValidator& v);
468
+ WXFloatValidator(long style=wxNUM_VAL_DEFAULT);
469
+ WXFloatValidator(int precision, long style);
470
+ virtual ~WXFloatValidator();
471
+
472
+ virtual WXFloatValidator* Clone() const;
473
+
474
+ void SetMin(double min);
475
+ double GetMin() const;
476
+ void SetMax(double max);
477
+ double GetMax() const;
478
+ void SetRange(double min, double max);
479
+ void GetRange(double& min, double& max) const;
480
+ void SetStyle(int style);
481
+
482
+ void SetPrecision(unsigned precision);
483
+ void SetFactor(double factor);
484
+
485
+ // wxRuby extensions
486
+ double GetValue () const;
487
+ void SetValue (double val);
488
+ };
489
+ __HEREDOC
490
+ end
491
+ end # class NumValidator
492
+
493
+ end # class Director
494
+
495
+ end # module WXRuby3
@@ -6,31 +6,156 @@
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 NumericPropertyValidator < EvtHandler
15
+ class NumericPropertyValidator < 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 WXRubyNumericPropertyValidator : public wxNumericPropertyValidator
21
+ class WXRubyNumericPropertyValidator : public wxNumericPropertyValidator, public wxRubyValidatorBinding
22
22
  {
23
23
  public:
24
24
  WXRubyNumericPropertyValidator(NumericType numericType, int base=10)
25
- : wxNumericPropertyValidator(numericType, base) {}
25
+ : wxNumericPropertyValidator(numericType, base)
26
+ {
27
+ m_stringValue = &m_valueCache;
28
+ }
29
+ WXRubyNumericPropertyValidator(const WXRubyNumericPropertyValidator& other)
30
+ : wxNumericPropertyValidator(other)
31
+ , wxRubyValidatorBinding(other)
32
+ {
33
+ m_stringValue = &m_valueCache;
34
+ }
26
35
  virtual ~WXRubyNumericPropertyValidator()
27
36
  {
28
37
  wxRuby_ReleaseEvtHandlerProcs(this);
29
38
  }
39
+
40
+ virtual wxObject* Clone() const override
41
+ {
42
+ WXRubyNumericPropertyValidator *clone = new WXRubyNumericPropertyValidator(*this);
43
+ clone->m_valueCache = this->m_valueCache;
44
+ return clone;
45
+ }
46
+
47
+ virtual void SetWindow(wxWindow *win) override
48
+ {
49
+ this->wxNumericPropertyValidator::SetWindow(win);
50
+ VALUE self = get_self();
51
+ // make sure Ruby does not own this validator instance anymore
52
+ RDATA(self)->dfree = SWIG_RubyRemoveTracking;
53
+ }
54
+
55
+ virtual bool TransferFromWindow () override
56
+ {
57
+ // call super
58
+ if (this->wxNumericPropertyValidator::TransferFromWindow())
59
+ {
60
+ // ok, data is retrieved from window and cached
61
+ // now allow any defined binding handler to pass on the data
62
+ return this->DoOnTransferFromWindow(WXSTR_TO_RSTR(m_valueCache));
63
+ }
64
+ return false;
65
+ }
66
+ virtual bool TransferToWindow () override
67
+ {
68
+ // collect data from any defined binding handler
69
+ VALUE data = this->DoOnTransferToWindow();
70
+ // if Qnil returned there is no data returned from handler so we just keep what's in the store
71
+ if (!NIL_P(data))
72
+ {
73
+ m_valueCache = RSTR_TO_WXSTR(data);
74
+ }
75
+ // now allow standard functionality to transfer to window
76
+ return this->wxNumericPropertyValidator::TransferToWindow();
77
+ }
78
+
79
+ const wxString& GetValue () const
80
+ {
81
+ return m_valueCache;
82
+ }
83
+
84
+ void SetValue (const wxString& val)
85
+ {
86
+ m_valueCache = val;
87
+ }
88
+
89
+ private:
90
+ static VALUE c_NumericPropertyValidator;
91
+
92
+ virtual VALUE get_self() override
93
+ {
94
+ if (NIL_P(this->self_))
95
+ {
96
+ this->self_ = SWIG_RubyInstanceFor(this);
97
+ // if this is a C++ created clone (wxWidgets clones validators that are set) it's not tracked yet
98
+ if (NIL_P(this->self_))
99
+ {
100
+ if (NIL_P(c_NumericPropertyValidator))
101
+ {
102
+ c_NumericPropertyValidator = rb_eval_string("Wx::PG::NumericPropertyValidator");
103
+ }
104
+ swig_type_info* swig_type = wxRuby_GetSwigTypeForClass(c_NumericPropertyValidator);
105
+ this->self_ = SWIG_NewPointerObj(this, swig_type, 0); // wrap but don't make Ruby own it
106
+ }
107
+ }
108
+ return this->self_;
109
+ }
110
+
111
+ wxString m_valueCache;
30
112
  };
31
- __HEREDOC
113
+
114
+ VALUE WXRubyNumericPropertyValidator::c_NumericPropertyValidator = Qnil;
115
+
116
+ static void GC_mark_wxNumericPropertyValidator(void* ptr)
117
+ {
118
+ if (ptr)
119
+ {
120
+ wxValidator* vp = reinterpret_cast<wxValidator*> (ptr);
121
+ WXRubyNumericPropertyValidator* rbvp = dynamic_cast<WXRubyNumericPropertyValidator*> (vp);
122
+ // This might be a pointer to a non-customized validator (or clone thereof) created internally
123
+ // by wxWidgets C++ code
124
+ if (rbvp) rbvp->GC_Mark();
125
+ }
126
+ }
127
+ __HEREDOC
128
+ spec.add_swig_code '%markfunc wxValidator "GC_mark_wxValidator";'
129
+ # make Ruby director and wrappers use custom implementation
32
130
  spec.use_class_implementation 'wxNumericPropertyValidator', 'WXRubyNumericPropertyValidator'
33
- spec.no_proxy 'wxNumericPropertyValidator::Clone'
131
+ spec.new_object 'wxNumericPropertyValidator::Clone'
132
+ # add wxRuby extensions
133
+ spec.add_extend_code 'wxNumericPropertyValidator', <<~__HEREDOC
134
+ VALUE GetValue()
135
+ {
136
+ WXRubyNumericPropertyValidator* rb_self = dynamic_cast<WXRubyNumericPropertyValidator*> ($self);
137
+ if (rb_self)
138
+ return WXSTR_TO_RSTR(rb_self->GetValue());
139
+ else
140
+ return Qnil;
141
+ }
142
+
143
+ void SetValue(const wxString& val)
144
+ {
145
+ WXRubyNumericPropertyValidator* rb_self = dynamic_cast<WXRubyNumericPropertyValidator*> ($self);
146
+ if (rb_self)
147
+ rb_self->SetValue(val);
148
+ }
149
+ __HEREDOC
150
+ # handle clone mapping
151
+ spec.map 'wxObject *' => 'Wx::PG::NumericPropertyValidator' do
152
+ map_out code: <<~__CODE
153
+ $result = SWIG_NewPointerObj(SWIG_as_voidptr($1), SWIGTYPE_p_wxTextValidator, SWIG_POINTER_OWN);
154
+ __CODE
155
+ end
156
+ spec.suppress_warning(473, 'wxNumericPropertyValidator::Clone')
157
+ spec.extend_interface 'wxNumericPropertyValidator',
158
+ 'wxNumericPropertyValidator(const wxNumericPropertyValidator &other)'
34
159
  spec.do_not_generate :variables, :defines, :enums, :functions
35
160
  end
36
161