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
@@ -13,7 +13,10 @@ module Wx
13
13
  wx_auto_complete = instance_method :auto_complete
14
14
  define_method :auto_complete do |completer|
15
15
  if wx_auto_complete.bind(self).call(completer)
16
- @completer = completer # keep the Ruby object alive
16
+ @completer = completer.is_a?(Wx::TextCompleter) ? completer : nil # keep the Ruby object alive or cleanup
17
+ true
18
+ else
19
+ false
17
20
  end
18
21
  end
19
22
 
@@ -1,15 +1,80 @@
1
1
  # Copyright (c) 2023 M.J.N. Corino, The Netherlands
2
2
  #
3
3
  # This software is released under the MIT license.
4
- #
5
- # Some parts are
6
- # Copyright 2004-2007, wxRuby development team
7
- # released under the MIT-like wxRuby2 license
8
4
 
9
5
  class Wx::Validator
6
+
10
7
  # Default implementation of clone, may need to be over-ridden if
11
8
  # custom subclasses should state variables that need to be copied
9
+ # NOTE: There is no way to copy the bindings here so do NOT
12
10
  def clone
13
- self.class.new
11
+ begin
12
+ self.class.new(self)
13
+ rescue
14
+ p $!
15
+ raise
16
+ end
17
+ end
18
+
19
+ # overload for customized functionality
20
+ def do_transfer_from_window
21
+ nil # by default just return nil
14
22
  end
23
+ protected :do_transfer_from_window
24
+
25
+ # overload for customized functionality
26
+ def do_transfer_to_window(_data)
27
+ true # by default just return true
28
+ end
29
+ protected :do_transfer_to_window
30
+
31
+ protected :do_on_transfer_from_window
32
+ protected :do_on_transfer_to_window
33
+
34
+ module Binding
35
+ def self.included(base)
36
+ wx_on_transfer_from_window = base.instance_method :on_transfer_from_window
37
+ base.define_method :on_transfer_from_window do |meth = nil, &block|
38
+ proc = if block and not meth
39
+ block
40
+ elsif meth and not block
41
+ h_meth = case meth
42
+ when Symbol, String then self.method(meth)
43
+ when Proc then meth
44
+ when Method then meth
45
+ end
46
+ # check arity == 1
47
+ if h_meth.arity != 1
48
+ Kernel.raise ArgumentError,
49
+ "on_transfer_from_window handler should accept a single argument"
50
+ end
51
+ h_meth
52
+ end
53
+ wx_on_transfer_from_window.bind(self).call(proc)
54
+ end
55
+
56
+ wx_on_transfer_to_window = base.instance_method :on_transfer_to_window
57
+ base.define_method :on_transfer_to_window do |meth = nil, &block|
58
+ proc = if block and not meth
59
+ block
60
+ elsif meth and not block
61
+ h_meth = case meth
62
+ when Symbol, String then self.method(meth)
63
+ when Proc then meth
64
+ when Method then meth
65
+ end
66
+ # check arity == 0
67
+ if h_meth.arity != 0
68
+ Kernel.raise ArgumentError,
69
+ "on_transfer_to_window handler should not accept any argument"
70
+ end
71
+ h_meth
72
+ end
73
+ wx_on_transfer_to_window.bind(self).call(proc)
74
+ end
75
+ end
76
+ end
77
+
78
+ include Binding
79
+
15
80
  end
@@ -26,13 +26,9 @@ class Wx::Window
26
26
  # In case a more explicit option is preferred.
27
27
  alias :wx_id :get_id
28
28
 
29
- # The name of Wx::Window#raise conflicts with Ruby's core Kernel#raise
30
- # method. This can cause unexpected errors when undecorated #raise is
31
- # used inside a Window method. For wxRuby 2.0 it's too late to remove
32
- # Window#raise completely, but for now, offer alternatives to
33
- # raise/lower that could replace them in future versions.
34
- alias :bring_to_front :raise
35
- alias :send_to_back :lower
29
+ # Z-order alternatives
30
+ alias :bring_to_front :raise_window
31
+ alias :send_to_back :lower_window
36
32
 
37
33
  # Recursively searches all windows below +self+ and returns the first
38
34
  # window which has the id +an_id+. This corresponds to the find_window
@@ -59,6 +59,7 @@ module Wx
59
59
  # @param [String,nil] art_path base path to look up the art file
60
60
  # @param [String,nil] art_section optional owner folder name for art files
61
61
  # @param [Wx::BitmapType,nil] bmp_type bitmap type of art file
62
+ # @return [String,nil] full path of art file or nil if not found
62
63
  def find_art(art_name, art_type: nil, art_path: nil, art_section: nil, bmp_type: nil) end
63
64
 
64
65
  end
@@ -0,0 +1,18 @@
1
+ # :stopdoc:
2
+ # Copyright (c) 2023 M.J.N. Corino, The Netherlands
3
+ #
4
+ # This software is released under the MIT license.
5
+ # :startdoc:
6
+
7
+
8
+ module Wx
9
+
10
+ class OwnerDrawnComboBox < ComboCtrl
11
+
12
+ alias :get_item_data :get_client_object
13
+
14
+ alias :set_item_data :set_client_object
15
+
16
+ end
17
+
18
+ end
@@ -9,6 +9,14 @@ module Wx
9
9
 
10
10
  class ControlWithItems
11
11
 
12
+ alias :get_client_data :get_client_object
13
+
14
+ alias :set_client_data :set_client_object
15
+
16
+ alias :has_client_data :has_client_object_data
17
+
18
+ alias :has_client_data? :has_client_object_data
19
+
12
20
  # Yield each string to the given block.
13
21
  # Returns an Enumerator if no block given.
14
22
  # @yieldparam [String] string the string yielded
@@ -22,6 +30,14 @@ module Wx
22
30
  def is_sorted; end
23
31
  alias :sorted? :is_sorted
24
32
 
33
+ alias :get_list_selection :get_selection
34
+
35
+ alias :set_list_selection :set_selection
36
+
37
+ alias :get_list_string_selection :get_string_selection
38
+
39
+ alias :set_list_string_selection :set_string_selection
40
+
25
41
  end
26
42
 
27
43
  end
@@ -0,0 +1,23 @@
1
+ # :stopdoc:
2
+ # Copyright (c) 2023 M.J.N. Corino, The Netherlands
3
+ #
4
+ # This software is released under the MIT license.
5
+ # :startdoc:
6
+
7
+
8
+ module Wx
9
+
10
+ class DatePickerCtrl < Control
11
+
12
+ # If the control had been previously limited to a range of dates using #set_range, returns the lower and upper bounds of this range.
13
+ #
14
+ # If no range is set (or only one of the bounds is set), dt1 and/or dt2 are set to be invalid.
15
+ #
16
+ # Notice that when using a native MSW implementation of this control the lower range is always set, even
17
+ # if #set_range hadn't been called explicitly, as the native control only supports dates later than year 1601.
18
+ # @return [Array(Time, Time),nil] a set with the lower and upper range limit or nil if no range previously set
19
+ def get_range; end
20
+
21
+ end
22
+
23
+ end
@@ -0,0 +1,44 @@
1
+ # :stopdoc:
2
+ # Copyright (c) 2023 M.J.N. Corino, The Netherlands
3
+ #
4
+ # This software is released under the MIT license.
5
+ # :startdoc:
6
+
7
+
8
+ module Wx
9
+
10
+ class EditableListBox < Panel
11
+
12
+ # Returns list control of composite.
13
+ # @return [Wx::ListCtrl]
14
+ def get_list_ctrl; end
15
+ alias :list_ctrl :get_list_ctrl
16
+
17
+ # Returns button of composite.
18
+ # @return [Wx::BitmapButton]
19
+ def get_del_button; end
20
+ alias :del_button :get_del_button
21
+
22
+ # Returns button of composite.
23
+ # @return [Wx::BitmapButton]
24
+ def get_new_button; end
25
+ alias :new_button :get_new_button
26
+
27
+ # Returns button of composite.
28
+ # @return [Wx::BitmapButton]
29
+ def get_up_button; end
30
+ alias :up_button :get_up_button
31
+
32
+ # Returns button of composite.
33
+ # @return [Wx::BitmapButton]
34
+ def get_down_button; end
35
+ alias :down_button :get_down_button
36
+
37
+ # Returns button of composite.
38
+ # @return [Wx::BitmapButton]
39
+ def get_edit_button; end
40
+ alias :edit_button :get_edit_button
41
+
42
+ end
43
+
44
+ end
data/lib/wx/doc/enum.rb CHANGED
@@ -68,6 +68,21 @@ module Wx
68
68
  # @return [Boolean]
69
69
  def !; end
70
70
 
71
+ # Returns true if all bits that are set (=1) in mask are also set in self; returns false otherwise.
72
+ # @param [Integer] mask
73
+ # @return [Boolean]
74
+ def allbits?(mask) end
75
+
76
+ # Returns true if any bit that is set (=1) in mask is also set in self; returns false otherwise.
77
+ # @param [Integer] mask
78
+ # @return [Boolean]
79
+ def anybits?(mask) end
80
+
81
+ # Returns true if no bit that is set (=1) in mask is also set in self; returns false otherwise.
82
+ # @param [Integer] mask
83
+ # @return [Boolean]
84
+ def nobits?(mask) end
85
+
71
86
  # Return next integer value from enum's value.
72
87
  # @return [Integer] next integer value
73
88
  def succ; end
data/lib/wx/doc/event.rb CHANGED
@@ -27,4 +27,16 @@ module Wx
27
27
 
28
28
  end
29
29
 
30
+ class CommandEvent < Event
31
+
32
+ alias :set_client_data :set_client_object
33
+
34
+ alias :client_data= :set_client_object
35
+
36
+ alias :get_client_data :get_client_object
37
+
38
+ alias :client_data :get_client_object
39
+
40
+ end
41
+
30
42
  end
@@ -0,0 +1,89 @@
1
+ <!--
2
+ # @markup markdown
3
+ # @title 12. Client/User data with wxRuby
4
+ -->
5
+
6
+ # 12. Client/User data with wxRuby
7
+
8
+ ## Introduction
9
+
10
+ The wxWidgets library has widespread support for attaching arbitrary client (or user) data to GUI elements like
11
+ windows (all event handlers actually), window items, sizer items etc.
12
+ To cater to various C++ use cases in most instances this support covers both specific wxWidgets defined types (like
13
+ wxClientData and wxObject instances) and untyped data pointers (represented as `void *`) with subtle but essential
14
+ differences.
15
+
16
+ wxRuby implements a fully compatible version of this support.
17
+
18
+ ## Everything is an Object
19
+
20
+ As Ruby does not do untyped data (everything is an Object), and having two different options is confusing anyway,
21
+ wxRuby provides only a single option and more or less unifies the interface across the entire library.
22
+ In Ruby anywhere the original wxWidgets library supports some type of client (or user) data attachment wxRuby will
23
+ support the attachment of any arbitrary Ruby `Object` by either the method `#set_client_object` (where C++ supports
24
+ `SetClientData` and `SetClientObject`) or `#set_user_data` (where C++ supports `SetUserData`). Data retrieval
25
+ is supported by complementary `#get_client_object` or `#get_user_data` methods in all cases.
26
+ Wherever C++ supports `SetClientObject` wxRuby also provides the method aliases `#set_client_data` and `#get_client_data`.
27
+
28
+ Another difference with C++ is that for typed client data in wxWidgets developers could leverage object destruction as
29
+ callback trigger (through the implementation of virtual destructors) to handle any required 'unlinking' logic. This
30
+ obviously does not apply to untyped data (one of the 'subtle' differences).
31
+ As Ruby does not provide any usable object destruction hooks this does not work there.
32
+ Ruby however has 'Duck-typing' which is what wxRuby uses to provide support for a unlinking callback 'hook' for attached
33
+ client data.
34
+
35
+ > Any attached Ruby Object implementing (responding to) the method `#client_data_unlinked` will have that method called after the
36
+ > attached object has been detached from the element it was attached to (either because of data replacement or element
37
+ > deletion).
38
+
39
+ Regard the following example.
40
+
41
+ ```ruby
42
+ frame = Wx::Frame.new(nil, Wx::ID_ANY)
43
+
44
+ # attach a hash with user data
45
+ frame.set_client_data({ text: 'A string', float: 3.14 })
46
+
47
+ # ... do something with frame
48
+
49
+ # replace the user data
50
+ frame.set_client_data([1,2,3,4])
51
+
52
+ # ... do something else with frame
53
+ ```
54
+
55
+ In this case standard Ruby object are attached. After attachment the object can be retrieved using a call to `get_client_data`
56
+ anywhere access to the frame instance is available.
57
+
58
+ Using a specially derived (or adapted) object a developer can handle specific logic after the object has been unlinked
59
+ like in this example:
60
+
61
+ ```ruby
62
+ # define a user data class
63
+ class MyUserData
64
+ def initialize(payload)
65
+ @payload = payload
66
+ end
67
+ attr_reader :payload
68
+
69
+ def client_data_unlinked
70
+ # handle some logic
71
+ end
72
+ end
73
+
74
+ # ...
75
+
76
+ # attach data to some window
77
+ win.set_client_data(MyUserData.new(some_payload_data))
78
+
79
+ # ...
80
+
81
+ # reset user data for some reason (will call MyUserData#client_data_unlinked after replacement)
82
+ win.set_client_data(nil)
83
+ ```
84
+
85
+ # CommandEvent data
86
+
87
+ wxRuby also fully supports the propagation of attached client data to Wx::CommandEvent objects (see
88
+ {Wx::CommandEvent#get_client_object} and {Wx::CommandEvent#set_client_object}).
89
+ As mentioned above wxRuby provides the method aliases `#set_client_data` and `#get_client_data` here also.
@@ -0,0 +1,139 @@
1
+ <!--
2
+ # @markup markdown
3
+ # @title 13. Validators and data binding
4
+ -->
5
+
6
+ # 13. Validators and data binding
7
+
8
+ ## Introduction
9
+
10
+ wxRuby fully supports validator classes offering input validation and/or data binding and/or event filtering.
11
+
12
+ ## Validation
13
+
14
+ The base Wx::Validator class defines the method {Wx::Validator#validate} which is called when validation of the
15
+ value or content of the associated window is required.
16
+
17
+ The implementation of this method should (somehow) retrieve the value of the associated window and validate that
18
+ value, returning `true` if valid or `false` otherwise. The default implementation always returns `false`.
19
+
20
+ An example would be:
21
+
22
+ ```ruby
23
+ # define custom validator
24
+ class MyTextValidator < Wx::Validator
25
+
26
+ def validate(_parent)
27
+ txt = get_window.value
28
+ # validate that the control text starts with a capital if not empty
29
+ txt.empty? || (?A..?Z).include?(txt[0])
30
+ end
31
+
32
+ end
33
+
34
+ # ...
35
+
36
+ # assign custom validator to text control
37
+ text = Wx::TextCtrl.new(parent, MY_TEXT_ID)
38
+ text.set_validator(MyTextValidator.new)
39
+ ```
40
+
41
+ The derived, specialized, validator classes {Wx::TextValidator}, {Wx::IntegerValidator}, {Wx::IntegerValidator} and
42
+ {Wx::FloatValidator} all have implementations that can be configured through specific options and do not
43
+ normally require an override to be defined.
44
+
45
+ Examples of using the standard validators would be:
46
+
47
+ ```ruby
48
+ text = Wx::TextCtrl.new(parent, MY_TEXT_ID)
49
+
50
+ # accept only hexadecimal characters
51
+ text.set_validator(Wx::TextValidator.new(Wx::TextValidatorStyle::FILTER_XDIGITS))
52
+
53
+ # or only numbers between -20 and 20
54
+ text.set_validator(Wx::IntegerValidator.new(-20, 20))
55
+ ```
56
+
57
+ ## Event filtering
58
+
59
+ All validator classes are event handlers and can have event handling routines defined (see
60
+ [Event Handling](05_event-handling.md)).
61
+ When processing events the core implementation will allow any validator associated with a window to handle an event
62
+ before the associated window itself thereby allowing it to filter events (see {Wx::EvtHandler#process_event} for more
63
+ details).
64
+
65
+ The standard specialized validators use this functionality to filter entry of allowable characters (by handling
66
+ Wx::EVT_CHAR events).
67
+
68
+ ## Data binding
69
+
70
+ Data binding concerns the transfer of a validator's associated window's value to or from a user definable storage (a
71
+ variable, memory cache entry, persistent storage ...).
72
+
73
+ To integrate with the core C++ implementation but allow for Ruby specific differences the scheme implemented for this
74
+ differs somewhat (in naming and functionality) from the original wxWidgets interface.
75
+
76
+ The responsibilities of the standard wxRuby interface for handling validator data binding is distributed over 2 base
77
+ methods and a mixin module.
78
+
79
+ - The protected {Wx::Validator#do_transfer_from_window} and {Wx::Validator#do_transfer_to_window} methods are
80
+ responsible for collecting and transferring data from/to the associated window (possibly applying conversions).<br>
81
+ <br>
82
+ These methods have default implementations in all of the derived validator classes and should not be overridden for
83
+ specializations of these as they will be ignored.<br>
84
+ Overriding these methods is necessary to implement data binding for any user defined specialization of the base
85
+ {Wx::Validator} class.<br>
86
+ <br>
87
+ - The methods the {Wx::Validator::Binding} mixin module provide the means to store data after collection from or retrieve data
88
+ before transfer to the associated window.<br>
89
+ <br>
90
+ The methods {Wx::Validator::Binding#on_transfer_from_window} and {Wx::Validator::Binding#on_transfer_to_window} provide
91
+ the means to specify user defined binding handlers for storing the data transferred from the associated window or retrieving the
92
+ data to transfer to the associated window. Like with event handling the handlers can be specified using a `String` or
93
+ `Symbol`, a `Proc` or a `Method`.<br>
94
+ <br>
95
+ The methods {Wx::Validator::Binding#do_on_transfer_from_window} and {Wx::Validator::Binding#do_on_transfer_to_window} by
96
+ default call the binding handlers if defined.
97
+ These methods can be overridden to create derived validator classes with dedicated data binding functionality like
98
+ with {Wx::GenericValidator}.
99
+
100
+ An example of a custom validator providing data binding would be:
101
+
102
+ ```ruby
103
+ class MyTextValidator < Wx::Validator
104
+
105
+ def do_transfer_from_window
106
+ get_window.get_value
107
+ end
108
+
109
+ def do_transfer_to_window(val)
110
+ get_window.set_value(val)
111
+ true
112
+ end
113
+
114
+ end
115
+
116
+ # ...
117
+
118
+ # use custom validator
119
+ @data = nil # attribute to store data
120
+ text.set_validator(MyTextValidator.new)
121
+ text.get_validator.on_transfer_to_window { @data }
122
+ text.get_validator.on_transfer_from_window { |v| @data = v }
123
+ ```
124
+
125
+ All derived, specialized, validators implement a dedicated value cache which can be accessed through the `#value` attribute
126
+ accessor. Through this accessor the data collected from the associated window can get retrieved or the data to be transferred
127
+ to the associated window set.
128
+ With these classes it is therefor not necessary to define binding handlers. Defining binding handlers can however still be
129
+ useful to implement a custom, persistent, storage solution.
130
+
131
+ ### Wx::GenericValidator
132
+
133
+ The {Wx::GenericValidator} class provides an extendable standard implementation for data binding in combination with a
134
+ large collection of controls (see class documentation).
135
+ The implementation provides a standard accessor {Wx::GenericValidator#value} to get the data value collected
136
+ from the associated window or set the data to transfer to the associated window.
137
+
138
+ To add support for any control unsupported by the standard implementation the method {Wx::GenericValidator.define_handler}
139
+ is provided (see documentation for an example).
@@ -61,8 +61,12 @@ module Wx
61
61
 
62
62
  alias :get_x :get_width
63
63
  alias :x :get_width
64
+ alias :set_x :set_width
65
+ alias :x= :set_width
64
66
  alias :get_y :get_height
65
67
  alias :y :get_height
68
+ alias :set_y :set_height
69
+ alias :y= :set_height
66
70
 
67
71
  # Set this size to the given size's width,height values
68
72
  # @param [Wx::Size] sz
@@ -0,0 +1,95 @@
1
+ # :stopdoc:
2
+ # Copyright (c) 2023 M.J.N. Corino, The Netherlands
3
+ #
4
+ # This software is released under the MIT license.
5
+ # :startdoc:
6
+
7
+
8
+ module Wx
9
+
10
+ # Wx::GenericValidator performs data transfer (but not validation or filtering)
11
+ # for many type of controls.
12
+ #
13
+ # Wx::GenericValidator supports:
14
+ # - boolean type controls
15
+ # - Wx::CheckBox, Wx::RadioButton, Wx::ToggleButton, Wx::BitmapToggleButton
16
+ # - string type controls
17
+ # - Wx::Button, Wx::StaticText, Wx::TextCtrl
18
+ # - Wx::ComboBox in case it does not have style Wx::CB_READONLY
19
+ # - integer type controls
20
+ # - Wx::RadioBox, Wx::SpinButton, Wx::SpinCtrl, Wx::Gauge, Wx::Slider, Wx::ScrollBar, Wx::Choice
21
+ # - Wx::ComboBox in case it has style Wx::CB_READONLY
22
+ # - Wx::ListBox and Wx::CheckListBox in case of style Wx::LB_SINGLE
23
+ # - integer array type controls
24
+ # - Wx::ListBox and Wx::CheckListBox in case of style Wx::LB_MULTIPLE or Wx::LB_EXTENDED
25
+ # - date/time type controls
26
+ # - Wx::DatePickerCtrl, Wx::TimePickerCtrl
27
+ #
28
+ # It checks the type of the window and uses an appropriate type for it.
29
+ # For example, Wx::Button and Wx::TextCtrl transfer data to and from a
30
+ # String variable; Wx::ListBox uses an Array of Integer (in case of multiple
31
+ # selection list) or an Integer (in case of a single choice list); Wx::CheckBox
32
+ # uses a boolean.
33
+ #
34
+ # In wxRuby this is a pure Ruby implementation derived from Wx::Validator and
35
+ # **not** a wrapper for the C++ wxGenericValidator class although the functionality
36
+ # is virtually identical.
37
+ #
38
+ # @see Wx::Validator
39
+ # @see Wx::TextValidator
40
+ # @see Wx::IntegerValidator
41
+ # @see Wx::UnsignedValidator
42
+ # @see Wx::FloatValidator
43
+ #
44
+ # @wxrb_require USE_VALIDATORS
45
+ class GenericValidator < Wx::Validator
46
+
47
+ # Returns a Hash of handlers for the various control types this class supports.
48
+ # User defined extension (or re-definition) of these handlers is possible.
49
+ # @see GenericValidator.define_handler
50
+ # @return [Hash]
51
+ def self.handlers; end
52
+
53
+ # Defines a new handler for a control type (class).
54
+ #
55
+ # When called it should be supplied the control Class and either a Proc or Method
56
+ # instance or a block which should accept a single Wx::Window argument and an optional
57
+ # second argument.
58
+ # The handler will be called when transferring data from or to the associated window.
59
+ # The associated window is always passed as the first argument.
60
+ # In case of a transfer from the associated window that is the only argument and the
61
+ # handler should retrieve and return the data typical for the type of control window.
62
+ # In case of a transfer to the associated window the second argument will be the data
63
+ # to transfer to the associated control window.
64
+ #
65
+ # @example Definition of Wx::TextCtrl handler
66
+ # GenericValidator.define_handler(Wx::TextCtrl) do |win, *val|
67
+ # if val.empty?
68
+ # win.get_value
69
+ # else
70
+ # win.set_value(val.shift)
71
+ # end
72
+ # end
73
+ #
74
+ # @param [Class] klass control window class
75
+ # @param [Proc,Method,nil] meth
76
+ # @return [void]
77
+ def self.define_handler(klass, meth=nil, &block) end
78
+
79
+ # @overload initialize
80
+ # Default constructor.
81
+ # @return [Wx::GenericValidator]
82
+ # @overload initialize(other)
83
+ # Copy constructor.
84
+ # @param [Wx::GenericValidator] other
85
+ # @return [Wx::GenericValidator]
86
+ def initialize(*arg)end
87
+
88
+ # The value store attribute. Initially nil. When set the type should
89
+ # be appropriate for the associated control type.
90
+ # No forced conversions will be applied.
91
+ attr_accessor :value
92
+
93
+ end
94
+
95
+ end
@@ -0,0 +1,22 @@
1
+ # :stopdoc:
2
+ # Copyright (c) 2023 M.J.N. Corino, The Netherlands
3
+ #
4
+ # This software is released under the MIT license.
5
+ # :startdoc:
6
+
7
+
8
+ class Wx
9
+
10
+ module HTML
11
+
12
+ class SimpleHtmlListBox
13
+
14
+ alias :get_client_data :get_client_object
15
+
16
+ alias :set_client_data :set_client_object
17
+
18
+ end
19
+
20
+ end
21
+
22
+ end