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,203 @@
1
+ # Copyright (c) 2023 M.J.N. Corino, The Netherlands
2
+ #
3
+ # This software is released under the MIT license.
4
+ #
5
+ # Adapted for wxRuby from wxWidgets widgets sample
6
+ # Copyright (c) 2001 Vadim Zeitlin
7
+
8
+ module Widgets
9
+
10
+ module Hyperlink
11
+
12
+ class HyperlinkPage < Widgets::Page
13
+
14
+ module ID
15
+ include Wx::IDHelper
16
+
17
+ Reset = self.next_id(Widgets::Frame::ID::Last)
18
+ SetLabel = self.next_id
19
+ SetURL = self.next_id
20
+ Ctrl = self.next_id
21
+
22
+ Align_Left = 0
23
+ Align_Centre = 1
24
+ Align_Right = 2
25
+ Align_Max = 3
26
+ end
27
+
28
+ def initialize(book, images)
29
+ super(book, images, :hyperlnk)
30
+ end
31
+
32
+ Info = Widgets::PageInfo.new(self, 'Hyperlink', GENERIC_CTRLS)
33
+
34
+ def get_widget
35
+ @hyperlink
36
+ end
37
+ def recreate_widget
38
+ create_hyperlink
39
+ end
40
+
41
+ # lazy creation of the content
42
+ def create_content
43
+ sizerTop = Wx::HBoxSizer.new
44
+
45
+ # left pane
46
+ sizerLeft = Wx::StaticBoxSizer.new(Wx::VERTICAL, self, 'Hyperlink details')
47
+ sizerLeftBox = sizerLeft.get_static_box
48
+
49
+ szr, @label = create_sizer_with_text_and_button(ID::SetLabel,'Set &Label', Wx::ID_ANY, sizerLeftBox)
50
+ sizerLeft.add(szr, 0, Wx::ALL | Wx::ALIGN_RIGHT, 5)
51
+
52
+ szr, @url = create_sizer_with_text_and_button(ID::SetURL,'Set &URL', Wx::ID_ANY, sizerLeftBox)
53
+ sizerLeft.add(szr, 0, Wx::ALL | Wx::ALIGN_RIGHT, 5)
54
+
55
+ alignments = %w{&left &centre &right}
56
+
57
+ @radioAlignMode = Wx::RadioBox.new(sizerLeftBox, Wx::ID_ANY, 'alignment',
58
+ choices: alignments)
59
+ @radioAlignMode.set_selection(1) # start with "centre" selected since
60
+ # wxHL_DEFAULT_STYLE contains wxHL_ALIGN_CENTRE
61
+ sizerLeft.add(@radioAlignMode, 0, Wx::ALL|Wx::GROW, 5)
62
+
63
+ # right pane
64
+ szHyperlinkLong = Wx::VBoxSizer.new
65
+ szHyperlink = Wx::HBoxSizer.new
66
+
67
+ @visit = Wx::StaticText.new(self, Wx::ID_ANY, 'Visit ')
68
+
69
+ @hyperlink = Wx::HyperlinkCtrl.new(self,
70
+ ID::Ctrl,
71
+ 'wxRuby website',
72
+ 'www.github.com/mcorino/wxRuby3')
73
+
74
+ @fun = Wx::StaticText.new(self, Wx::ID_ANY, " for fun!")
75
+
76
+ szHyperlink.add(0, 0, 1, Wx::CENTRE)
77
+ szHyperlink.add(@visit, 0, Wx::CENTRE)
78
+ szHyperlink.add(@hyperlink, 0, Wx::CENTRE)
79
+ szHyperlink.add(@fun, 0, Wx::CENTRE)
80
+ szHyperlink.add(0, 0, 1, Wx::CENTRE)
81
+ szHyperlink.set_min_size(150, 0)
82
+
83
+ @hyperlinkLong = Wx::HyperlinkCtrl.new(self,
84
+ Wx::ID_ANY,
85
+ 'This is a long hyperlink',
86
+ 'www.github.com/mcorino/wxRuby3')
87
+
88
+ szHyperlinkLong.add(0, 0, 1, Wx::CENTRE)
89
+ szHyperlinkLong.add(szHyperlink, 0, Wx::CENTRE|Wx::GROW)
90
+ szHyperlinkLong.add(0, 0, 1, Wx::CENTRE)
91
+ szHyperlinkLong.add(@hyperlinkLong, 0, Wx::GROW)
92
+ szHyperlinkLong.add(0, 0, 1, Wx::CENTRE)
93
+
94
+
95
+ # the 3 panes panes compose the window
96
+ sizerTop.add(sizerLeft, 0, (Wx::ALL & ~Wx::LEFT), 10)
97
+ sizerTop.add(szHyperlinkLong, 1, Wx::GROW | (Wx::ALL & ~Wx::RIGHT), 10)
98
+
99
+ # final initializations
100
+ reset
101
+
102
+ set_sizer(sizerTop)
103
+
104
+ # connect event handlers
105
+ evt_button(ID::Reset, :on_button_reset)
106
+ evt_button(ID::SetLabel, :on_button_set_label)
107
+ evt_button(ID::SetURL, :on_button_set_url)
108
+
109
+ evt_radiobox(Wx::ID_ANY, :on_alignment)
110
+ end
111
+
112
+ protected
113
+
114
+ # event handlers
115
+ def on_button_set_label(_event)
116
+ @hyperlink.set_label(@label.value)
117
+ create_hyperlink
118
+ end
119
+
120
+ def on_button_set_url(_event)
121
+ @hyperlink.set_url(@url.value)
122
+ create_hyperlink
123
+ end
124
+
125
+ def on_button_reset(_event)
126
+ reset
127
+
128
+ create_hyperlink
129
+ end
130
+
131
+ def on_alignment(_event)
132
+ case @radioAlignMode.selection
133
+ when ID::Align_Left
134
+ addstyle = Wx::HL_ALIGN_LEFT
135
+ when ID::Align_Centre
136
+ addstyle = Wx::HL_ALIGN_CENTRE
137
+ when ID::Align_Right
138
+ addstyle = Wx::HL_ALIGN_RIGHT
139
+ else
140
+ ::Kernel.raise RuntimeError, 'unknown alignment'
141
+ end
142
+
143
+ create_hyperlink_long(addstyle)
144
+ end
145
+
146
+ # reset the control parameters
147
+ def reset
148
+ @label.set_value(@hyperlink.label)
149
+ @url.set_value(@hyperlink.url)
150
+ end
151
+
152
+ # (re)create the hyperlinkctrl
153
+ def create_hyperlink
154
+ label = @hyperlink.label
155
+ url = @hyperlink.url
156
+ style = get_attrs.default_flags
157
+
158
+ style |= Wx::HL_DEFAULT_STYLE & ~Wx::BORDER_MASK
159
+
160
+ hyp = Wx::HyperlinkCtrl.new(self,
161
+ ID::Ctrl,
162
+ label,
163
+ url,
164
+ style: style)
165
+
166
+ # update sizer's child window
167
+ get_sizer.replace(@hyperlink, hyp, true)
168
+
169
+ # update our pointer
170
+ @hyperlink.destroy
171
+ @hyperlink = hyp
172
+
173
+ # re-layout the sizer
174
+ get_sizer.layout
175
+ end
176
+
177
+ def create_hyperlink_long(align)
178
+ style = get_attrs.default_flags
179
+ style |= align
180
+ style |= Wx::HL_DEFAULT_STYLE & ~(Wx::HL_ALIGN_CENTRE | Wx::BORDER_MASK)
181
+
182
+ hyp = Wx::HyperlinkCtrl.new(self,
183
+ Wx::ID_ANY,
184
+ 'This is a long hyperlink',
185
+ 'www.github.com/mcorino/wxRuby3',
186
+ style: style)
187
+
188
+ # update sizer's child window
189
+ get_sizer.replace(@hyperlinkLong, hyp, true)
190
+
191
+ # update our pointer
192
+ @hyperlinkLong.destroy
193
+ @hyperlinkLong = hyp
194
+
195
+ # re-layout the sizer
196
+ get_sizer.layout
197
+ end
198
+
199
+ end
200
+
201
+ end
202
+
203
+ end
@@ -0,0 +1,185 @@
1
+ # Copyright (c) 2023 M.J.N. Corino, The Netherlands
2
+ #
3
+ # This software is released under the MIT license.
4
+ #
5
+ # Adapted for wxRuby from wxWidgets widgets sample
6
+ # Copyright (c) 2001 Vadim Zeitlin
7
+
8
+ module Widgets
9
+
10
+ module ItemContainer
11
+
12
+ class Page < Widgets::Page
13
+
14
+ # Help track client data objects in wxItemContainer instances.
15
+ class TrackedClientData
16
+ def initialize(tracker, value)
17
+ @tracker = tracker
18
+ @value = value
19
+ @tracker.__send__(:start_tracking_data)
20
+ end
21
+
22
+ def client_data_unlinked
23
+ @tracker.__send__(:stop_tracking_data)
24
+ end
25
+
26
+ def get_value
27
+ @value
28
+ end
29
+ end
30
+
31
+ def initialize(book, images, icon)
32
+ super(book, images, icon)
33
+ @trackedDataObjects = 0
34
+ @items = %w[This is a List of strings]
35
+ @container = nil
36
+ end
37
+
38
+ def on_button_test_item_container(event)
39
+ @container = get_container
40
+ ::Kernel.raise RuntimeError, 'Widget must have a test widget' unless @container
41
+
42
+ Wx.log_message('wxItemContainer test for %s, %s:',
43
+ get_widget.class.name,
44
+ @container.is_sorted ? 'Sorted' : 'Unsorted')
45
+
46
+ expected_result = @container.sorted? ? self.sorted_items : @items
47
+
48
+ start_test('Append one item')
49
+ item = @items.first
50
+ @container.append(item)
51
+ end_test([item])
52
+
53
+ start_test("Append some items")
54
+ @container.append(@items)
55
+ end_test(expected_result)
56
+
57
+ start_test('Append some items with data')
58
+ objects = []
59
+ @items.size.times { |i| objects << create_client_data(i) }
60
+ @container.append(@items, objects)
61
+ end_test(expected_result)
62
+ objects = nil
63
+
64
+ start_test('Append some items with data, one by one')
65
+ @items.each_with_index { |item, i| @container.append(item, create_client_data(i)) }
66
+ end_test(expected_result)
67
+
68
+ unless @container.sorted?
69
+ start_test('Insert in reverse order with data, one by one')
70
+ @items.reverse.each_with_index do |item, i|
71
+ @container.insert(item, 0, create_client_data(@items.size-(i+1)))
72
+ end
73
+ end_test(expected_result)
74
+ end
75
+ end
76
+
77
+ def get_container
78
+ ::Kernel.raise NotImplementedError
79
+ end
80
+
81
+ private
82
+
83
+ def start_test(label)
84
+ @container.clear
85
+ Wx.log_message("Test - #{label}:")
86
+ end
87
+
88
+ def end_test(items)
89
+ count = @container.count
90
+
91
+ ok = (count == items.size)
92
+ ::Kernel.raise RuntimeError, 'Item count does not match.' unless ok
93
+
94
+ count.times do |i|
95
+ str = @container.get_string(i)
96
+ if str != items[i]
97
+ Wx.log_error("Wrong string \"#{str}\" at position #{i} (expected \"#{items[i]}\")")
98
+ ok = false
99
+ break
100
+ end
101
+
102
+ if @container.has_client_data?
103
+ data = @container.get_client_data(i)
104
+ if data && !verify_client_data(data.get_value, str)
105
+ ok = false
106
+ break
107
+ end
108
+ end
109
+ end
110
+
111
+ Wx.log_message(dump_container_data(items)) unless ok
112
+
113
+ @container.clear
114
+ ok &= verify_all_client_data_destroyed
115
+
116
+ Wx.log_message("...%s", ok ? "passed" : "failed")
117
+ end
118
+
119
+ # Track client data in wxItemContainer instances
120
+ def create_client_data(value)
121
+ TrackedClientData.new(self, value)
122
+ end
123
+
124
+ def start_tracking_data
125
+ @trackedDataObjects += 1
126
+ end
127
+
128
+ def stop_tracking_data
129
+ @trackedDataObjects -= 1
130
+ end
131
+
132
+ def verify_all_client_data_destroyed
133
+ if @trackedDataObjects > 0
134
+ message = 'Bug in managing wxClientData: '
135
+ if @trackedDataObjects > 0
136
+ message << @trackedDataObjects.to_s << ' lost objects'
137
+ else
138
+ message << (-@trackedDataObjects).to_s << ' extra deletes'
139
+ end
140
+ ::Kernel.raise RuntimeError, message
141
+ else
142
+ true
143
+ end
144
+ end
145
+
146
+ def verify_client_data(i, str)
147
+ if i > @items.size || @items[i] != str
148
+ Wx.log_error("Client data for '%s' does not match.", str)
149
+ false
150
+ else
151
+ true
152
+ end
153
+ end
154
+
155
+ def dump_container_data(expected)
156
+ str = "Current content:\n"
157
+
158
+ @container.each_string.each_with_index do |s, i|
159
+ str << " - " << s << " ["
160
+ if @container.has_client_data?
161
+ data = @container.get_client_data(i)
162
+ str << data.get_value.to_s if data
163
+ end
164
+ str << "]\n"
165
+ end
166
+
167
+ str << "Expected content:\n"
168
+ expected.each do |item|
169
+ str << " - " << item << "["
170
+ str << @items.find_index(item).to_s
171
+ str << "]\n"
172
+ end
173
+
174
+ return str
175
+ end
176
+
177
+ def sorted_items
178
+ @items.sort { |a,b| a.casecmp(b) }
179
+ end
180
+
181
+ end
182
+
183
+ end
184
+
185
+ end