wxruby3 0.9.2 → 0.9.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (379) 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-Config.h +23 -5
  6. data/ext/wxruby3/include/wxruby-Persistence.h +79 -0
  7. data/ext/wxruby3/include/wxruby-Validator.h +39 -0
  8. data/ext/wxruby3/include/wxruby-ValidatorBinding.h +64 -0
  9. data/ext/wxruby3/swig/custom/director.swg +8 -0
  10. data/ext/wxruby3/swig/mark_free_impl.i +0 -33
  11. data/ext/wxruby3/swig/memory_management.i +6 -0
  12. data/lib/wx/core/bitmap_combobox.rb +17 -21
  13. data/lib/wx/core/book_ctrl_base.rb +16 -0
  14. data/lib/wx/core/combobox.rb +13 -3
  15. data/lib/wx/core/config.rb +454 -83
  16. data/lib/wx/core/controlwithitems.rb +40 -130
  17. data/lib/wx/core/enum.rb +17 -1
  18. data/lib/wx/core/event.rb +6 -1
  19. data/lib/wx/core/evthandler.rb +8 -2
  20. data/lib/wx/core/generic_validator.rb +312 -0
  21. data/lib/wx/core/listbox.rb +2 -2
  22. data/lib/wx/core/log.rb +1 -1
  23. data/lib/wx/core/notebook.rb +10 -8
  24. data/lib/wx/core/owner_drawn_combobox.rb +45 -0
  25. data/lib/wx/core/peristent_object.rb +15 -0
  26. data/lib/wx/core/persistence_manager.rb +39 -0
  27. data/lib/wx/core/persistent_window.rb +16 -0
  28. data/lib/wx/core/size.rb +4 -0
  29. data/lib/wx/core/sizer.rb +1 -2
  30. data/lib/wx/core/standard_paths.rb +22 -0
  31. data/lib/wx/core/text_entry.rb +4 -1
  32. data/lib/wx/core/top_level_window.rb +16 -0
  33. data/lib/wx/core/treebook.rb +18 -0
  34. data/lib/wx/core/validator.rb +70 -5
  35. data/lib/wx/core/window.rb +3 -7
  36. data/lib/wx/core.rb +4 -0
  37. data/lib/wx/doc/art_locator.rb +1 -0
  38. data/lib/wx/doc/book_ctrl_base.rb +19 -0
  39. data/lib/wx/doc/comboctrl.rb +18 -0
  40. data/lib/wx/doc/config.rb +101 -41
  41. data/lib/wx/doc/controlwithitems.rb +16 -0
  42. data/lib/wx/doc/date_picker_ctrl.rb +23 -0
  43. data/lib/wx/doc/editable_listbox.rb +44 -0
  44. data/lib/wx/doc/enum.rb +15 -0
  45. data/lib/wx/doc/event.rb +12 -0
  46. data/lib/wx/doc/extra/12_client_data.md +89 -0
  47. data/lib/wx/doc/extra/13_validators.md +139 -0
  48. data/lib/wx/doc/extra/14_config.md +101 -0
  49. data/lib/wx/doc/extra/15_persistence.md +148 -0
  50. data/lib/wx/doc/gdi_common.rb +4 -0
  51. data/lib/wx/doc/generic_validator.rb +95 -0
  52. data/lib/wx/doc/html/simple_html_listbox.rb +22 -0
  53. data/lib/wx/doc/num_validator.rb +387 -0
  54. data/lib/wx/doc/owner_drawn_combobox.rb +96 -0
  55. data/lib/wx/doc/persistence_manager.rb +36 -0
  56. data/lib/wx/doc/persistent_object.rb +27 -0
  57. data/lib/wx/doc/pg/numeric_property_validator.rb +33 -0
  58. data/lib/wx/doc/static_bitmap.rb +25 -0
  59. data/lib/wx/doc/text_validator.rb +10 -0
  60. data/lib/wx/doc/top_level_window.rb +19 -0
  61. data/lib/wx/doc/treebook.rb +6 -1
  62. data/lib/wx/doc/validator.rb +113 -0
  63. data/lib/wx/doc/window.rb +30 -0
  64. data/lib/wx/html/simple_html_listbox.rb +24 -91
  65. data/lib/wx/keyword_defs.rb +34 -2
  66. data/lib/wx/rbn/ribbon_gallery.rb +0 -21
  67. data/lib/wx/version.rb +1 -1
  68. data/rakelib/build.rb +1 -1
  69. data/rakelib/lib/config/mingw.rb +12 -0
  70. data/rakelib/lib/core/include/client_data.inc +65 -0
  71. data/rakelib/lib/core/include/funcall.inc +1 -1
  72. data/rakelib/lib/core/package.rb +39 -3
  73. data/rakelib/lib/core/parameter.rb +1 -1
  74. data/rakelib/lib/core/spec.rb +10 -0
  75. data/rakelib/lib/core/spec_helper.rb +8 -2
  76. data/rakelib/lib/director/app.rb +18 -0
  77. data/rakelib/lib/director/app_traits.rb +3 -1
  78. data/rakelib/lib/director/bitmap_combobox.rb +2 -2
  79. data/rakelib/lib/director/combobox.rb +22 -0
  80. data/rakelib/lib/director/comboctrl.rb +1 -55
  81. data/rakelib/lib/director/config_base.rb +490 -19
  82. data/rakelib/lib/director/ctrl_with_items.rb +88 -21
  83. data/rakelib/lib/director/date_picker_ctrl.rb +8 -6
  84. data/rakelib/lib/director/editable_listbox.rb +30 -0
  85. data/rakelib/lib/director/event.rb +102 -12
  86. data/rakelib/lib/director/event_filter.rb +1 -1
  87. data/rakelib/lib/director/event_handler.rb +3 -2
  88. data/rakelib/lib/director/event_loop.rb +1 -1
  89. data/rakelib/lib/director/file_dialog_customize_hook.rb +2 -2
  90. data/rakelib/lib/director/functions.rb +4 -2
  91. data/rakelib/lib/director/generic_dirctrl.rb +17 -0
  92. data/rakelib/lib/director/grid_cell_attr.rb +1 -3
  93. data/rakelib/lib/director/grid_cell_editor.rb +1 -3
  94. data/rakelib/lib/director/grid_cell_renderer.rb +1 -3
  95. data/rakelib/lib/director/header_ctrl.rb +9 -1
  96. data/rakelib/lib/director/html_listbox.rb +97 -22
  97. data/rakelib/lib/director/num_validator.rb +495 -0
  98. data/rakelib/lib/director/numeric_property_validator.rb +131 -6
  99. data/rakelib/lib/director/owner_drawn_combobox.rb +192 -0
  100. data/rakelib/lib/director/persistence_manager.rb +410 -0
  101. data/rakelib/lib/director/persistent_object.rb +70 -0
  102. data/rakelib/lib/director/persistent_window.rb +73 -0
  103. data/rakelib/lib/director/pgproperty.rb +3 -29
  104. data/rakelib/lib/director/ribbon_button_bar.rb +3 -3
  105. data/rakelib/lib/director/ribbon_gallery.rb +3 -5
  106. data/rakelib/lib/director/sizer.rb +15 -4
  107. data/rakelib/lib/director/sizer_item.rb +13 -0
  108. data/rakelib/lib/director/static_bitmap.rb +32 -0
  109. data/rakelib/lib/director/text_entry.rb +5 -1
  110. data/rakelib/lib/director/text_validator.rb +124 -13
  111. data/rakelib/lib/director/toggle_button.rb +1 -0
  112. data/rakelib/lib/director/top_level_window.rb +0 -2
  113. data/rakelib/lib/director/tree_ctrl.rb +35 -0
  114. data/rakelib/lib/director/utils.rb +16 -2
  115. data/rakelib/lib/director/validator.rb +196 -21
  116. data/rakelib/lib/director/window.rb +16 -2
  117. data/rakelib/lib/extractor/function.rb +2 -1
  118. data/rakelib/lib/generate/analyzer.rb +44 -44
  119. data/rakelib/lib/generate/doc.rb +11 -5
  120. data/rakelib/lib/specs/interfaces.rb +5 -0
  121. data/rakelib/lib/swig_runner.rb +55 -9
  122. data/rakelib/lib/typemap/client_data.rb +67 -0
  123. data/rakelib/lib/typemap/common.rb +3 -3
  124. data/rakelib/lib/typemap/config.rb +8 -0
  125. data/rakelib/lib/typemap/datetime.rb +1 -1
  126. data/rakelib/lib/typemap/tree_itemid.rb +2 -2
  127. data/samples/aui/aui.rb +1237 -1233
  128. data/samples/calendar/calendar.rb +293 -289
  129. data/samples/controls/get_item_sample.rb +83 -79
  130. data/samples/controls/htlbox.rb +331 -327
  131. data/samples/dialogs/dialogs.rb +682 -694
  132. data/samples/dialogs/wizard.rb +52 -55
  133. data/samples/dragdrop/dragdrop.rb +146 -142
  134. data/samples/drawing/bitmap.rb +29 -26
  135. data/samples/drawing/bitmap_image.rb +84 -80
  136. data/samples/drawing/graphics_drawing.rb +209 -205
  137. data/samples/drawing/image_prt.rb +344 -340
  138. data/samples/drawing/maths_images.rb +18 -1
  139. data/samples/drawing/rmagic_bitmap_image.rb +88 -84
  140. data/samples/etc/caret.rb +306 -0
  141. data/samples/etc/miniframe.rb +65 -60
  142. data/samples/etc/sash.rb +109 -105
  143. data/samples/etc/scrollwin.rb +86 -80
  144. data/samples/etc/system_settings.rb +216 -209
  145. data/samples/event/activation.rb +72 -67
  146. data/samples/event/event.rb +160 -153
  147. data/samples/event/threaded.rb +8 -1
  148. data/samples/event/update_ui_event.rb +67 -60
  149. data/samples/grid/grid.rb +188 -181
  150. data/samples/grid/gridtablebase.rb +136 -129
  151. data/samples/html/html.rb +208 -204
  152. data/samples/mdi/mdi.rb +59 -54
  153. data/samples/minimal/minimal.rb +54 -51
  154. data/samples/minimal/nothing.rb +1 -0
  155. data/samples/printing/printing.rb +367 -377
  156. data/samples/printing/printing2.rb +203 -198
  157. data/samples/propgrid/propgrid.rb +2312 -2308
  158. data/samples/propgrid/propgrid_minimal.rb +57 -50
  159. data/samples/ribbon/ribbon.rb +780 -774
  160. data/samples/sampler/ext.rb +0 -33
  161. data/samples/sampler/sample.rb +4 -9
  162. data/samples/sampler.rb +1 -1
  163. data/samples/splash/splash.rb +118 -116
  164. data/samples/text/rich_textctrl.rb +207 -201
  165. data/samples/text/richtext.rb +1409 -1405
  166. data/samples/text/scintilla.rb +137 -128
  167. data/samples/text/textctrl.rb +89 -83
  168. data/samples/text/unicode.rb +175 -168
  169. data/samples/treectrl/treectrl.rb +1430 -1426
  170. data/samples/widgets/activityindicator.rb +95 -0
  171. data/samples/widgets/art/widgets/activityindicator.xpm +278 -0
  172. data/samples/widgets/art/widgets/bmpbtn.xpm +37 -0
  173. data/samples/widgets/art/widgets/bmpcombobox.xpm +54 -0
  174. data/samples/widgets/art/widgets/button.xpm +54 -0
  175. data/samples/widgets/art/widgets/checkbox.xpm +54 -0
  176. data/samples/{bigdemo/icons → widgets/art/widgets}/choice.xpm +1 -1
  177. data/samples/widgets/art/widgets/choicebk.xpm +54 -0
  178. data/samples/widgets/art/widgets/clrpicker.xpm +193 -0
  179. data/samples/widgets/art/widgets/combobox.xpm +54 -0
  180. data/samples/widgets/art/widgets/datepick.xpm +200 -0
  181. data/samples/widgets/art/widgets/dirctrl.xpm +54 -0
  182. data/samples/widgets/art/widgets/dirpicker.xpm +213 -0
  183. data/samples/widgets/art/widgets/filepicker.xpm +214 -0
  184. data/samples/widgets/art/widgets/fontpicker.xpm +185 -0
  185. data/samples/widgets/art/widgets/gauge.xpm +54 -0
  186. data/samples/widgets/art/widgets/header.xpm +54 -0
  187. data/samples/widgets/art/widgets/hyperlnk.xpm +54 -0
  188. data/samples/widgets/art/widgets/listbook.xpm +54 -0
  189. data/samples/widgets/art/widgets/listbox.xpm +54 -0
  190. data/samples/widgets/art/widgets/native.xpm +81 -0
  191. data/samples/widgets/art/widgets/notebook.xpm +54 -0
  192. data/samples/widgets/art/widgets/odcombobox.xpm +54 -0
  193. data/samples/widgets/art/widgets/radiobox.xpm +54 -0
  194. data/samples/widgets/art/widgets/scrolbar.xpm +54 -0
  195. data/samples/widgets/art/widgets/slider.xpm +54 -0
  196. data/samples/widgets/art/widgets/spinbtn.xpm +40 -0
  197. data/samples/widgets/art/widgets/statbmp.xpm +40 -0
  198. data/samples/widgets/art/widgets/statbox.xpm +54 -0
  199. data/samples/widgets/art/widgets/stattext.xpm +54 -0
  200. data/samples/widgets/art/widgets/text.xpm +54 -0
  201. data/samples/widgets/art/widgets/timepick.xpm +207 -0
  202. data/samples/widgets/art/widgets/toggle.xpm +54 -0
  203. data/samples/widgets/art/widgets/toucan.png +0 -0
  204. data/samples/widgets/bmpcombobox.rb +651 -0
  205. data/samples/widgets/button.rb +462 -0
  206. data/samples/widgets/checkbox.rb +211 -0
  207. data/samples/widgets/choice.rb +287 -0
  208. data/samples/widgets/clrpicker.rb +156 -0
  209. data/samples/widgets/combobox.rb +516 -0
  210. data/samples/widgets/datepick.rb +215 -0
  211. data/samples/widgets/dirctrl.rb +265 -0
  212. data/samples/widgets/dirpicker.rb +158 -0
  213. data/samples/widgets/editlbox.rb +122 -0
  214. data/samples/widgets/filectrl.rb +216 -0
  215. data/samples/widgets/filepicker.rb +214 -0
  216. data/samples/widgets/fontpicker.rb +135 -0
  217. data/samples/widgets/gauge.rb +311 -0
  218. data/samples/widgets/headerctrl.rb +236 -0
  219. data/samples/widgets/hyperlink.rb +203 -0
  220. data/samples/widgets/itemcontainer.rb +185 -0
  221. data/samples/widgets/listbox.rb +473 -0
  222. data/samples/widgets/notebook.rb +488 -0
  223. data/samples/widgets/odcombobox.rb +608 -0
  224. data/samples/widgets/radiobox.rb +328 -0
  225. data/samples/widgets/searchctrl.rb +159 -0
  226. data/samples/widgets/slider.rb +594 -0
  227. data/samples/widgets/spinbtn.rb +443 -0
  228. data/samples/widgets/statbmp.rb +130 -0
  229. data/samples/widgets/static.rb +436 -0
  230. data/samples/widgets/textctrl.rb +700 -0
  231. data/samples/widgets/timepick.rb +148 -0
  232. data/samples/widgets/tn_widgets.png +0 -0
  233. data/samples/widgets/toggle.rb +385 -0
  234. data/samples/widgets/widgets.rb +1229 -0
  235. data/samples/xrc/custom_xrc_sample.rb +47 -41
  236. data/samples/xrc/xrc_sample.rb +53 -47
  237. data/tests/test_config.rb +207 -42
  238. data/tests/test_event_handling.rb +52 -34
  239. data/tests/test_events.rb +7 -0
  240. data/tests/test_item_data.rb +24 -0
  241. data/tests/test_persistence.rb +142 -0
  242. data/tests/test_sizer.rb +44 -1
  243. data/tests/test_validators.rb +805 -0
  244. metadata +109 -138
  245. data/lib/wx/core/choice.rb +0 -14
  246. data/lib/wx/core/combo_ctrl.rb +0 -110
  247. data/rakelib/lib/typemap/grid_client_data.rb +0 -58
  248. data/samples/bigdemo/About.rbw +0 -39
  249. data/samples/bigdemo/ColorPanel.rbw +0 -23
  250. data/samples/bigdemo/GridSimple.rbw +0 -78
  251. data/samples/bigdemo/MDIDemo.rbw +0 -57
  252. data/samples/bigdemo/PopupMenu.rbw +0 -146
  253. data/samples/bigdemo/ShapedWindow.rbw +0 -128
  254. data/samples/bigdemo/Sizers.rbw +0 -541
  255. data/samples/bigdemo/bigdemo.rb +0 -817
  256. data/samples/bigdemo/demoTemplate.rbw +0 -33
  257. data/samples/bigdemo/helpfile.htb +0 -0
  258. data/samples/bigdemo/icons/Test 015.jpg +0 -0
  259. data/samples/bigdemo/icons/Test 015.png +0 -0
  260. data/samples/bigdemo/icons/choice.bmp +0 -0
  261. data/samples/bigdemo/icons/combo.bmp +0 -0
  262. data/samples/bigdemo/icons/combo.xpm +0 -27
  263. data/samples/bigdemo/icons/copy.xpm +0 -25
  264. data/samples/bigdemo/icons/cut.xpm +0 -24
  265. data/samples/bigdemo/icons/gauge.bmp +0 -0
  266. data/samples/bigdemo/icons/gauge.xpm +0 -27
  267. data/samples/bigdemo/icons/help.xpm +0 -25
  268. data/samples/bigdemo/icons/list.bmp +0 -0
  269. data/samples/bigdemo/icons/list.xpm +0 -27
  270. data/samples/bigdemo/icons/mondrian.ico +0 -0
  271. data/samples/bigdemo/icons/mondrian.xpm +0 -44
  272. data/samples/bigdemo/icons/new.xpm +0 -24
  273. data/samples/bigdemo/icons/ogl.ico +0 -0
  274. data/samples/bigdemo/icons/ogl.xpm +0 -45
  275. data/samples/bigdemo/icons/open.xpm +0 -26
  276. data/samples/bigdemo/icons/paste.bmp +0 -0
  277. data/samples/bigdemo/icons/paste.xpm +0 -38
  278. data/samples/bigdemo/icons/pointy.png +0 -0
  279. data/samples/bigdemo/icons/preview.xpm +0 -26
  280. data/samples/bigdemo/icons/print.xpm +0 -26
  281. data/samples/bigdemo/icons/radio.bmp +0 -0
  282. data/samples/bigdemo/icons/radio.xpm +0 -27
  283. data/samples/bigdemo/icons/robert.xpm +0 -415
  284. data/samples/bigdemo/icons/sashtest.ico +0 -0
  285. data/samples/bigdemo/icons/save.xpm +0 -25
  286. data/samples/bigdemo/icons/smiles.bmp +0 -0
  287. data/samples/bigdemo/icons/smiles.xpm +0 -39
  288. data/samples/bigdemo/icons/smiley.ico +0 -0
  289. data/samples/bigdemo/icons/smiley.xpm +0 -42
  290. data/samples/bigdemo/icons/stattext.xpm +0 -24
  291. data/samples/bigdemo/icons/test2.bmp +0 -0
  292. data/samples/bigdemo/icons/test2.png +0 -0
  293. data/samples/bigdemo/icons/test2.xpm +0 -79
  294. data/samples/bigdemo/icons/text.bmp +0 -0
  295. data/samples/bigdemo/icons/text.xpm +0 -27
  296. data/samples/bigdemo/icons/tog1.bmp +0 -0
  297. data/samples/bigdemo/icons/tog1.xpm +0 -38
  298. data/samples/bigdemo/icons/tog2.bmp +0 -0
  299. data/samples/bigdemo/icons/tog2.xpm +0 -38
  300. data/samples/bigdemo/icons/wxruby-128x128.png +0 -0
  301. data/samples/bigdemo/icons/wxwin.ico +0 -0
  302. data/samples/bigdemo/icons/wxwin16x16.png +0 -0
  303. data/samples/bigdemo/icons/wxwin16x16.xpm +0 -25
  304. data/samples/bigdemo/icons/wxwin32x32.png +0 -0
  305. data/samples/bigdemo/icons/wxwin48x48.png +0 -0
  306. data/samples/bigdemo/run.rb +0 -98
  307. data/samples/bigdemo/tips.txt +0 -7
  308. data/samples/bigdemo/utils.rb +0 -20
  309. data/samples/bigdemo/wxArtProvider.rbw +0 -282
  310. data/samples/bigdemo/wxBitmapButton.rbw +0 -65
  311. data/samples/bigdemo/wxButton.rbw +0 -64
  312. data/samples/bigdemo/wxCalendarCtrl.rbw +0 -59
  313. data/samples/bigdemo/wxCheckBox.rbw +0 -50
  314. data/samples/bigdemo/wxCheckListBox.rbw +0 -65
  315. data/samples/bigdemo/wxChoice.rbw +0 -47
  316. data/samples/bigdemo/wxChoicebook.rbw +0 -78
  317. data/samples/bigdemo/wxColourDialog.rbw +0 -33
  318. data/samples/bigdemo/wxComboBox.rbw +0 -77
  319. data/samples/bigdemo/wxCursor.rbw +0 -136
  320. data/samples/bigdemo/wxDialog.rbw +0 -74
  321. data/samples/bigdemo/wxDirDialog.rbw +0 -29
  322. data/samples/bigdemo/wxDragImage.rbw +0 -70
  323. data/samples/bigdemo/wxFileDialog.rbw +0 -37
  324. data/samples/bigdemo/wxFileDialog_Save.rbw +0 -35
  325. data/samples/bigdemo/wxFindReplaceDialog.rbw +0 -82
  326. data/samples/bigdemo/wxFontDialog.rbw +0 -200
  327. data/samples/bigdemo/wxFrame.rbw +0 -53
  328. data/samples/bigdemo/wxGauge.rbw +0 -65
  329. data/samples/bigdemo/wxGenericDirCtrl.rbw +0 -74
  330. data/samples/bigdemo/wxGrid.rbw +0 -66
  331. data/samples/bigdemo/wxHtmlHelpController.rbw +0 -52
  332. data/samples/bigdemo/wxListBox.rbw +0 -140
  333. data/samples/bigdemo/wxListCtrl_virtual.rbw +0 -112
  334. data/samples/bigdemo/wxMDIWindows.rbw +0 -50
  335. data/samples/bigdemo/wxMenu.rbw +0 -247
  336. data/samples/bigdemo/wxMessageDialog.rbw +0 -27
  337. data/samples/bigdemo/wxMiniFrame.rbw +0 -70
  338. data/samples/bigdemo/wxMultipleChoiceDialog.rbw +0 -29
  339. data/samples/bigdemo/wxNotebook.rbw +0 -136
  340. data/samples/bigdemo/wxProgressDialog.rbw +0 -43
  341. data/samples/bigdemo/wxRadioBox.rbw +0 -72
  342. data/samples/bigdemo/wxRadioButton.rbw +0 -125
  343. data/samples/bigdemo/wxSashWindow.rbw +0 -141
  344. data/samples/bigdemo/wxScrolledMessageDialog.rbw +0 -57
  345. data/samples/bigdemo/wxScrolledWindow.rbw +0 -199
  346. data/samples/bigdemo/wxSingleChoiceDialog.rbw +0 -33
  347. data/samples/bigdemo/wxSlider.rbw +0 -42
  348. data/samples/bigdemo/wxSpinButton.rbw +0 -50
  349. data/samples/bigdemo/wxSpinCtrl.rbw +0 -51
  350. data/samples/bigdemo/wxSplitterWindow.rbw +0 -63
  351. data/samples/bigdemo/wxStaticBitmap.rbw +0 -47
  352. data/samples/bigdemo/wxStaticText.rbw +0 -55
  353. data/samples/bigdemo/wxStatusBar.rbw +0 -126
  354. data/samples/bigdemo/wxTextCtrl.rbw +0 -149
  355. data/samples/bigdemo/wxTextEntryDialog.rbw +0 -31
  356. data/samples/bigdemo/wxToggleButton.rbw +0 -49
  357. data/samples/bigdemo/wxToolBar.rbw +0 -131
  358. data/samples/bigdemo/wxTreeCtrl.rbw +0 -191
  359. data/samples/caret/caret.rb +0 -298
  360. data/samples/caret/mondrian.xpm +0 -44
  361. data/samples/controls/books.rb +0 -189
  362. data/samples/controls/choice.xpm +0 -27
  363. data/samples/controls/combo.xpm +0 -27
  364. data/samples/controls/controls.rb +0 -1099
  365. data/samples/controls/gauge.xpm +0 -27
  366. data/samples/controls/list.xpm +0 -27
  367. data/samples/controls/mondrian.ico +0 -0
  368. data/samples/controls/mondrian.xpm +0 -44
  369. data/samples/controls/radio.xpm +0 -27
  370. data/samples/controls/stattext.xpm +0 -24
  371. data/samples/controls/test2.bmp +0 -0
  372. data/samples/controls/text.xpm +0 -27
  373. data/samples/controls/tn_books.png +0 -0
  374. data/samples/controls/tn_controls.png +0 -0
  375. data/samples/etc/choice.rb +0 -87
  376. data/samples/etc/tn_choice.png +0 -0
  377. data/samples/text/mondrian.ico +0 -0
  378. data/samples/text/mondrian.xpm +0 -44
  379. /data/samples/{caret → etc}/tn_caret.png +0 -0
@@ -0,0 +1,1229 @@
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
+ require 'wx'
9
+
10
+ module Widgets
11
+
12
+ if Wx.has_feature?(:USE_TREEBOOK)
13
+ BookCtrl = Wx::Treebook
14
+ elsif Wx.has_feature?(:USE_NOTEBOOK)
15
+ BookCtrl = Wx::Notebook
16
+ else
17
+ BookCtrl = Wx::Choicebook
18
+ end
19
+
20
+ ICON_SIZE = 16
21
+
22
+ NATIVE_PAGE = 0
23
+ GENERIC_PAGE = 1
24
+ PICKER_PAGE = 2
25
+ COMBO_PAGE = 3
26
+ WITH_ITEMS_PAGE = 4
27
+ EDITABLE_PAGE = 5
28
+ BOOK_PAGE = 6
29
+ ALL_PAGE = 7
30
+ MAX_PAGES = 8
31
+
32
+ NATIVE_CTRLS = 1 << NATIVE_PAGE
33
+ GENERIC_CTRLS = 1 << GENERIC_PAGE
34
+ PICKER_CTRLS = 1 << PICKER_PAGE
35
+ COMBO_CTRLS = 1 << COMBO_PAGE
36
+ WITH_ITEMS_CTRLS = 1 << WITH_ITEMS_PAGE
37
+ EDITABLE_CTRLS = 1 << EDITABLE_PAGE
38
+ BOOK_CTRLS = 1 << BOOK_PAGE
39
+ ALL_CTRLS = 1 << ALL_PAGE
40
+
41
+ class Attributes
42
+
43
+ attr_accessor :tool_tip if Wx.has_feature?(:USE_TOOLTIPS)
44
+ attr_accessor :font if Wx.has_feature?(:USE_FONTDLG)
45
+ attr_accessor :col_fg, :col_bg, :col_page_bg
46
+ attr_accessor :enabled, :show, :dir, :variant, :cursor, :default_flags
47
+
48
+ def initialize
49
+ @tool_tip = 'This is a tooltip'
50
+ @enabled = true
51
+ @show = true
52
+ @dir = Wx::LayoutDirection::Layout_Default
53
+ @variant = Wx::WindowVariant::WINDOW_VARIANT_NORMAL
54
+ @cursor = Wx::NULL_CURSOR
55
+ @default_flags = Wx::Border::BORDER_DEFAULT
56
+ end
57
+
58
+ end
59
+
60
+ class Page < Wx::Panel
61
+
62
+ ATTRS = Attributes.new
63
+
64
+ def initialize(book, images, icon)
65
+ super(book, Wx::ID_ANY, style: Wx::CLIP_CHILDREN | Wx::TAB_TRAVERSAL)
66
+ images << Wx.Image(icon).scale(ICON_SIZE, ICON_SIZE).to_bitmap
67
+ end
68
+
69
+ # return the control shown by this page
70
+ def get_widget
71
+ nil
72
+ end
73
+
74
+ # return the control shown by this page, if it supports text entry interface
75
+ def get_text_entry
76
+ nil
77
+ end
78
+
79
+ # lazy creation of the content
80
+ def create_content
81
+ ::Kernel.raise NotImplementedError
82
+ end
83
+
84
+ # some pages show additional controls, in this case override this one to
85
+ # return all of them (including the one returned by GetWidget())
86
+ def get_widgets
87
+ [get_widget]
88
+ end
89
+
90
+ # recreate the control shown by this page
91
+ #
92
+ # this is currently used only to take into account the border flags
93
+ def recreate_widget
94
+ ::Kernel.raise NotImplementedError
95
+ end
96
+
97
+ # apply current attributes to the widget(s)
98
+ def set_up_widget
99
+ widgets = get_widgets
100
+
101
+ widgets.each do |widget|
102
+ ::Kernel.raise 'nil widget' if widget.nil?
103
+
104
+ if Wx.has_feature?(:USE_TOOLTIPS)
105
+ widget.set_tool_tip(get_attrs.tool_tip)
106
+ end # wxUSE_TOOLTIPS
107
+ if Wx.has_feature?(:USE_FONTDLG)
108
+ widget.set_font(get_attrs.font) if get_attrs.font&.ok?
109
+ end # wxUSE_FONTDLG
110
+
111
+ widget.set_foreground_colour(get_attrs.col_fg) if get_attrs.col_fg&.ok?
112
+ widget.set_background_colour(get_attrs.col_bg) if get_attrs.col_bg&.ok?
113
+
114
+ widget.set_layout_direction(get_attrs.dir) if get_attrs.dir != Wx::LayoutDirection::Layout_Default
115
+
116
+ widget.enable(get_attrs.enabled)
117
+ widget.show(get_attrs.show)
118
+
119
+ widget.set_cursor(get_attrs.cursor)
120
+
121
+ widget.set_window_variant(get_attrs.variant)
122
+
123
+ widget.refresh
124
+ end
125
+
126
+ if get_attrs.col_page_bg&.ok?
127
+ set_background_colour(get_attrs.col_page_bg)
128
+ refresh
129
+ end
130
+ end
131
+
132
+ # the default attributes for the widget
133
+ def get_attrs
134
+ Page::ATTRS
135
+ end
136
+
137
+ # return true if we're showing logs in the log window (always the case
138
+ # except during startup and shutdown)
139
+ def self.is_using_log_window
140
+ Wx.get_app.is_using_log_window
141
+ end
142
+
143
+ protected
144
+
145
+ # several helper functions for page creation
146
+
147
+ # create a horz sizer containing the given control and the text ctrl
148
+ # (pointer to which will be returned next to sizer)
149
+ # with the specified id
150
+ def create_sizer_with_text(control, id = Wx::ID_ANY)
151
+ sizerRow = Wx::HBoxSizer.new
152
+ text = Wx::TextCtrl.new(control.parent, id, style: Wx::TE_PROCESS_ENTER)
153
+
154
+ sizerRow.add(control, Wx::SizerFlags.new(0).border(Wx::RIGHT).centre_vertical)
155
+ sizerRow.add(text, Wx::SizerFlags.new(1).border(Wx::LEFT).centre_vertical)
156
+
157
+ [sizerRow, text]
158
+ end
159
+
160
+ # create a sizer containing a label and a text ctrl
161
+ def create_sizer_with_text_and_label(label, id = Wx::ID_ANY, statBoxParent = nil)
162
+ create_sizer_with_text(Wx::StaticText.new(statBoxParent ? statBoxParent: self, Wx::ID_ANY, label), id)
163
+ end
164
+
165
+ # create a sizer containing a button and a text ctrl
166
+ def create_sizer_with_text_and_button(idBtn, labelBtn, id = Wx::ID_ANY, statBoxParent = nil)
167
+ create_sizer_with_text(Wx::Button.new(statBoxParent ? statBoxParent: self, idBtn, labelBtn), id)
168
+ end
169
+
170
+ # create a checkbox and add it to the sizer
171
+ def create_check_box_and_add_to_sizer(sizer, label, id = Wx::ID_ANY, statBoxParent = nil)
172
+ checkbox = Wx::CheckBox.new(statBoxParent ? statBoxParent: self, id, label)
173
+ sizer.add(checkbox, Wx::SizerFlags.new.horz_border)
174
+ sizer.add_spacer(2)
175
+
176
+ checkbox
177
+ end
178
+
179
+ class << self
180
+ # the list containing info about all pages
181
+ def widget_pages
182
+ @widget_pages ||= []
183
+ end
184
+ end
185
+ end
186
+
187
+ class PageInfo
188
+
189
+ # our ctor
190
+ def initialize(klass, label, categories = 0)
191
+ @klass = klass
192
+ @label = label
193
+ @categories = Widgets::ALL_CTRLS | categories
194
+ # dummy sorting: add and immediately sort in the list according to label
195
+ if Page.widget_pages.empty? || (pg_gt = Page.widget_pages.bsearch_index { |p| p.label > @label }).nil?
196
+ # add when first (or 'largest' label)
197
+ Page.widget_pages << self
198
+ else
199
+ Page.widget_pages.insert(pg_gt, self)
200
+ end
201
+ end
202
+
203
+ def create(book, images)
204
+ @klass.new(book, images)
205
+ end
206
+
207
+ # the label of the page
208
+ attr_reader :label
209
+
210
+ # the list (flags) for sharing page between categories
211
+ attr_reader :categories
212
+
213
+ # the class of this page
214
+ attr_reader :klass
215
+ end
216
+
217
+ if Wx.has_feature?(:USE_LOG)
218
+ # A log target which just redirects the messages to a listbox
219
+ class LboxLogger < Wx::Log
220
+
221
+ def initialize(lbox, logOld)
222
+ super()
223
+ @lbox = lbox
224
+ #@lbox->Disable() -- looks ugly under MSW
225
+ @logOld = logOld
226
+ end
227
+
228
+ def reset
229
+ Wx::Log.set_active_target(@logOld)
230
+ end
231
+
232
+ protected
233
+
234
+ # implement sink functions
235
+
236
+ def do_log_record(level, msg, info)
237
+ if level == Wx::LOG_Trace
238
+ @logOld.log_record(level, msg, info) if @logOld
239
+ else
240
+ super
241
+ end
242
+ end
243
+
244
+ def do_log_text_at_level(level, msg)
245
+ # if Wx.has_feature?(:WXUNIVERSAL)
246
+ # @lbox.append_and_ensure_visible(msg)
247
+ # else # other ports don't have this method yet
248
+ @lbox.append(msg)
249
+ @lbox.set_first_item(@lbox.count - 1)
250
+ # end
251
+ end
252
+
253
+ end
254
+ end # USE_LOG
255
+
256
+ Categories = [
257
+ # if Wx.has_feature?(:WXUNIVERSAL)
258
+ # 'Universal'
259
+ # else
260
+ 'Native',
261
+ # end,
262
+ 'Generic',
263
+ 'Pickers',
264
+ 'Comboboxes',
265
+ 'With items',
266
+ 'Editable',
267
+ 'Books',
268
+ 'All controls'
269
+ ]
270
+
271
+ class Frame < Wx::Frame
272
+
273
+ module ID
274
+ include Wx::IDHelper
275
+
276
+ Widgets_ClearLog = self.next_id
277
+ Widgets_Quit = self.next_id
278
+
279
+ Widgets_BookCtrl = self.next_id
280
+
281
+ if Wx.has_feature?(:USE_TOOLTIPS)
282
+ Widgets_SetTooltip = self.next_id
283
+ end # wxUSE_TOOLTIPS
284
+ Widgets_SetFgColour = self.next_id
285
+ Widgets_SetBgColour = self.next_id
286
+ Widgets_SetPageBg = self.next_id
287
+ Widgets_SetFont = self.next_id
288
+ Widgets_Enable = self.next_id
289
+ Widgets_Show = self.next_id
290
+
291
+ Widgets_BorderNone = self.next_id
292
+ Widgets_BorderStatic = self.next_id
293
+ Widgets_BorderSimple = self.next_id
294
+ Widgets_BorderRaised = self.next_id
295
+ Widgets_BorderSunken = self.next_id
296
+ Widgets_BorderDouble = self.next_id
297
+ Widgets_BorderDefault = self.next_id
298
+
299
+ Widgets_VariantNormal = self.next_id
300
+ Widgets_VariantSmall = self.next_id
301
+ Widgets_VariantMini = self.next_id
302
+ Widgets_VariantLarge = self.next_id
303
+
304
+ Widgets_LayoutDirection = self.next_id
305
+
306
+ Widgets_GlobalBusyCursor = self.next_id
307
+ Widgets_BusyCursor = self.next_id
308
+
309
+ Widgets_GoToPage = self.next_id
310
+ Widgets_GoToPageLast = self.next_id(Widgets_GoToPage + 100)
311
+
312
+
313
+ TextEntry_Begin = self.next_id
314
+ TextEntry_DisableAutoComplete = TextEntry_Begin
315
+ TextEntry_AutoCompleteFixed = self.next_id
316
+ TextEntry_AutoCompleteFilenames = self.next_id
317
+ TextEntry_AutoCompleteDirectories = self.next_id
318
+ TextEntry_AutoCompleteCustom = self.next_id
319
+ TextEntry_AutoCompleteKeyLength = self.next_id
320
+
321
+ TextEntry_SetHint = self.next_id
322
+ TextEntry_End = self.next_id
323
+
324
+ Last = self.next_id
325
+ end
326
+
327
+ def initialize(title)
328
+ super(nil, Wx::ID_ANY, title)
329
+
330
+ set_icon(Wx.Icon(:sample, art_path: File.dirname(__dir__)))
331
+
332
+ # init everything
333
+ if Wx.has_feature?(:USE_LOG)
334
+ @lboxLog = nil
335
+ @logTarget = nil
336
+ end # USE_LOG
337
+ @book = nil
338
+
339
+ if Wx.has_feature?(:USE_MENUS)
340
+ # create the menubar
341
+ mbar = Wx::MenuBar.new
342
+ menuWidget = Wx::Menu.new
343
+ if Wx.has_feature?(:USE_TOOLTIPS)
344
+ menuWidget.append(ID::Widgets_SetTooltip, "Set &tooltip...\tCtrl-T")
345
+ menuWidget.append_separator
346
+ end # wxUSE_TOOLTIPS
347
+ menuWidget.append(ID::Widgets_SetFgColour, "Set &foreground...\tCtrl-F")
348
+ menuWidget.append(ID::Widgets_SetBgColour, "Set &background...\tCtrl-B")
349
+ menuWidget.append(ID::Widgets_SetPageBg, "Set &page background...\tShift-Ctrl-B")
350
+ menuWidget.append(ID::Widgets_SetFont, "Set f&ont...\tCtrl-O")
351
+ menuWidget.append_check_item(ID::Widgets_Enable, "&Enable/disable\tCtrl-E")
352
+ menuWidget.append_check_item(ID::Widgets_Show, "Show/Hide")
353
+
354
+ menuBorders = Wx::Menu.new
355
+ menuBorders.append_radio_item(ID::Widgets_BorderDefault, "De&fault\tCtrl-Shift-9")
356
+ menuBorders.append_radio_item(ID::Widgets_BorderNone, "&None\tCtrl-Shift-0")
357
+ menuBorders.append_radio_item(ID::Widgets_BorderSimple, "&Simple\tCtrl-Shift-1")
358
+ menuBorders.append_radio_item(ID::Widgets_BorderDouble, "&Double\tCtrl-Shift-2")
359
+ menuBorders.append_radio_item(ID::Widgets_BorderStatic, "Stati&c\tCtrl-Shift-3")
360
+ menuBorders.append_radio_item(ID::Widgets_BorderRaised, "&Raised\tCtrl-Shift-4")
361
+ menuBorders.append_radio_item(ID::Widgets_BorderSunken, "S&unken\tCtrl-Shift-5")
362
+ menuWidget.append_sub_menu(menuBorders, "Set &border")
363
+
364
+ menuVariants = Wx::Menu.new
365
+ menuVariants.append_radio_item(ID::Widgets_VariantMini, "&Mini\tCtrl-Shift-6")
366
+ menuVariants.append_radio_item(ID::Widgets_VariantSmall, "&Small\tCtrl-Shift-7")
367
+ menuVariants.append_radio_item(ID::Widgets_VariantNormal, "&Normal\tCtrl-Shift-8")
368
+ menuVariants.append_radio_item(ID::Widgets_VariantLarge, "&Large\tCtrl-Shift-9")
369
+ menuWidget.append_sub_menu(menuVariants, "Set &variant")
370
+
371
+ menuWidget.append_separator
372
+ menuWidget.append_check_item(ID::Widgets_LayoutDirection,
373
+ "Toggle &layout direction\tCtrl-L")
374
+ menuWidget.check(ID::Widgets_LayoutDirection,
375
+ get_layout_direction == Wx::LayoutDirection::Layout_RightToLeft)
376
+
377
+ menuWidget.append_separator
378
+ menuWidget.append_check_item(ID::Widgets_GlobalBusyCursor,
379
+ "Toggle &global busy cursor\tCtrl-Shift-U")
380
+ menuWidget.append_check_item(ID::Widgets_BusyCursor,
381
+ "Toggle b&usy cursor\tCtrl-U")
382
+
383
+ menuWidget.append_separator
384
+ menuWidget.append(Wx::ID_EXIT, "&Quit\tCtrl-Q")
385
+ mbar.append(menuWidget, "&Widget")
386
+
387
+ menuTextEntry = Wx::Menu.new
388
+ menuTextEntry.append_radio_item(ID::TextEntry_DisableAutoComplete,
389
+ "&Disable auto-completion")
390
+ menuTextEntry.append_radio_item(ID::TextEntry_AutoCompleteFixed,
391
+ "Fixed-&list auto-completion")
392
+ menuTextEntry.append_radio_item(ID::TextEntry_AutoCompleteFilenames,
393
+ "&Files names auto-completion")
394
+ menuTextEntry.append_radio_item(ID::TextEntry_AutoCompleteDirectories,
395
+ "&Directories names auto-completion")
396
+ menuTextEntry.append_radio_item(ID::TextEntry_AutoCompleteCustom,
397
+ "&Custom auto-completion")
398
+ menuTextEntry.append_radio_item(ID::TextEntry_AutoCompleteKeyLength,
399
+ "Custom with &min length")
400
+ menuTextEntry.append_separator
401
+ menuTextEntry.append(ID::TextEntry_SetHint, "Set help &hint")
402
+
403
+ mbar.append(menuTextEntry, "&Text")
404
+
405
+ set_menu_bar(mbar)
406
+
407
+ mbar.check(ID::Widgets_Enable, true)
408
+ mbar.check(ID::Widgets_Show, true)
409
+
410
+ mbar.check(ID::Widgets_VariantNormal, true)
411
+ end # wxUSE_MENUS
412
+
413
+ # create controls
414
+ @panel = Wx::Panel.new(self)
415
+
416
+ sizerTop = Wx::VBoxSizer.new
417
+
418
+ # we have 2 panes: book with pages demonstrating the controls in the
419
+ # upper one and the log window with some buttons in the lower
420
+
421
+ style = Wx::BK_DEFAULT
422
+ # Uncomment to suppress page theme (draw in solid colour)
423
+ #style |= Wx::NB_NOPAGETHEME
424
+
425
+ @book = Widgets::BookCtrl.new(@panel, ID::Widgets_BookCtrl,
426
+ style: style, name: 'Widgets')
427
+
428
+ init_book
429
+
430
+ # the lower one only has the log listbox and a button to clear it
431
+ if Wx.has_feature?(:USE_LOG)
432
+ sizerDown = Wx::StaticBoxSizer.new(Wx::VERTICAL, @panel, '&Log window')
433
+ sizerDownBox = sizerDown.get_static_box
434
+
435
+ @lboxLog = Wx::ListBox.new(sizerDownBox)
436
+ sizerDown.add(@lboxLog, Wx::SizerFlags.new(1).expand.border)
437
+ sizerDown.set_min_size(100, 150)
438
+ else
439
+ sizerDown = Wx::VBoxSizer.new
440
+ end # USE_LOG
441
+
442
+ sizerBtns = Wx::HBoxSizer.new
443
+ if Wx.has_feature?(:USE_LOG)
444
+ btn = Wx::Button.new(sizerDownBox, ID::Widgets_ClearLog, 'Clear &log')
445
+ sizerBtns.add(btn)
446
+ sizerBtns.add_spacer(10)
447
+ end # USE_LOG
448
+ btn = Wx::Button.new(sizerDownBox, ID::Widgets_Quit, 'E&xit')
449
+ sizerBtns.add(btn)
450
+ sizerDown.add(sizerBtns, Wx::SizerFlags.new.border.right)
451
+
452
+ # put everything together
453
+ sizerTop.add(@book, Wx::SizerFlags.new(1).expand.double_border(Wx::ALL & ~(Wx::TOP | Wx::BOTTOM)))
454
+ sizerTop.add_spacer(5)
455
+ sizerTop.add(sizerDown, Wx::SizerFlags.new(0).expand.double_border(Wx::ALL & ~Wx::TOP))
456
+
457
+ @panel.set_sizer(sizerTop)
458
+
459
+ sizeSet = Wx.persistent_register_and_restore(self, "Main")
460
+
461
+ sizeMin = @panel.get_best_size
462
+ set_client_size(sizeMin) unless sizeSet
463
+ set_min_client_size(sizeMin)
464
+
465
+ # connect the event handlers
466
+ if Wx.has_feature?(:USE_LOG)
467
+ evt_button(ID::Widgets_ClearLog, :on_button_clear_log)
468
+ end # USE_LOG
469
+ evt_button(ID::Widgets_Quit, :on_exit)
470
+
471
+ if Wx.has_feature?(:USE_TOOLTIPS)
472
+ evt_menu(ID::Widgets_SetTooltip, :on_set_tooltip)
473
+ end # wxUSE_TOOLTIPS
474
+
475
+ if Wx.has_feature?(:USE_TREEBOOK)
476
+ evt_treebook_page_changing(Wx::ID_ANY, :on_page_changing)
477
+ elsif Wx.has_feature?(:USE_NOTEBOOK)
478
+ evt_notebook_page_changing(Wx::ID_ANY, :on_page_changing)
479
+ else
480
+ evt_choicebook_page_changing(Wx::ID_ANY, :on_page_changing)
481
+ end
482
+ if Wx.has_feature?(:USE_MENUS)
483
+ evt_menu_range(ID::Widgets_GoToPage, ID::Widgets_GoToPageLast,
484
+ :on_go_to_page)
485
+
486
+ evt_menu(ID::Widgets_SetFgColour, :on_set_fg_col)
487
+ evt_menu(ID::Widgets_SetBgColour, :on_set_bg_col)
488
+ evt_menu(ID::Widgets_SetPageBg, :on_set_page_bg)
489
+ evt_menu(ID::Widgets_SetFont, :on_set_font)
490
+ evt_menu(ID::Widgets_Enable, :on_enable)
491
+ evt_menu(ID::Widgets_Show, :on_show)
492
+
493
+ evt_menu_range(ID::Widgets_BorderNone, ID::Widgets_BorderDefault,
494
+ :on_set_border)
495
+
496
+ evt_menu_range(ID::Widgets_VariantNormal, ID::Widgets_VariantLarge,
497
+ :on_set_variant)
498
+
499
+ evt_menu(ID::Widgets_LayoutDirection, :on_toggle_layout_direction)
500
+
501
+ evt_menu(ID::Widgets_GlobalBusyCursor, :on_toggle_global_busy_cursor)
502
+ evt_menu(ID::Widgets_BusyCursor, :on_toggle_busy_cursor)
503
+
504
+ evt_menu(ID::TextEntry_DisableAutoComplete, :on_disable_auto_complete)
505
+ evt_menu(ID::TextEntry_AutoCompleteFixed, :on_auto_complete_fixed)
506
+ evt_menu(ID::TextEntry_AutoCompleteFilenames, :on_auto_complete_filenames)
507
+ evt_menu(ID::TextEntry_AutoCompleteDirectories, :on_auto_complete_directories)
508
+ evt_menu(ID::TextEntry_AutoCompleteCustom, :on_auto_complete_custom)
509
+ evt_menu(ID::TextEntry_AutoCompleteKeyLength, :on_auto_complete_key_length)
510
+
511
+ evt_menu(ID::TextEntry_SetHint, :on_set_hint)
512
+
513
+ evt_update_ui_range(ID::TextEntry_Begin, ID::TextEntry_End - 1,
514
+ :on_update_text_ui)
515
+
516
+ evt_menu(Wx::ID_EXIT, :on_exit)
517
+ end # wxUSE_MENUS
518
+
519
+ if Wx.has_feature?(:USE_LOG)
520
+ # now that everything is created we can redirect the log messages to the
521
+ # listbox
522
+ @logTarget = LboxLogger.new(@lboxLog, Wx::Log.get_active_target)
523
+ Wx::Log.set_active_target(@logTarget)
524
+ end
525
+ end
526
+
527
+ protected
528
+
529
+ if Wx.has_feature?(:USE_LOG)
530
+ def on_button_clear_log(_event)
531
+ @lboxLog.clear
532
+ end
533
+ end # USE_LOG
534
+
535
+ def on_exit(_event)
536
+ @logTarget.reset if @logTarget
537
+ @logTarget = nil
538
+ close
539
+ end
540
+
541
+ if Wx.has_feature?(:USE_MENUS)
542
+
543
+ def on_page_changing(event)
544
+ if Wx.has_feature?(:USE_TREEBOOK)
545
+ # don't allow selection of entries without pages (categories)
546
+ event.veto unless @book.get_page(event.selection)
547
+ end
548
+ end
549
+
550
+ def on_page_changed(event)
551
+ sel = event.selection
552
+
553
+ # adjust "Page" menu selection
554
+ item, _ = get_menu_bar.find_item(ID::Widgets_GoToPage + sel)
555
+ item.check if item
556
+
557
+ get_menu_bar.check(ID::Widgets_BusyCursor, false)
558
+
559
+ # create the pages on demand, otherwise the sample startup is too slow as
560
+ # it creates hundreds of controls
561
+ curPage = current_page
562
+ if curPage.get_children.empty?
563
+ Wx::WindowUpdateLocker.update(curPage) do
564
+ curPage.create_content
565
+ curPage.layout
566
+
567
+ connect_to_widget_events
568
+ end
569
+ end
570
+
571
+ # re-apply the attributes to the widget(s)
572
+ curPage.set_up_widget
573
+
574
+ event.skip
575
+ end
576
+
577
+ def on_go_to_page(event)
578
+ if Wx.has_feature?(:USE_TREEBOOK)
579
+ @book.set_selection(event.id - ID::Widgets_GoToPage)
580
+ else
581
+ @book.set_selection(@book.get_page_count-1)
582
+ book = @book.get_current_page
583
+ book.set_selection(event.id - ID::Widgets_GoToPage)
584
+ end
585
+ end
586
+
587
+ if Wx.has_feature?(:USE_TOOLTIPS)
588
+ def on_set_tooltip(_event)
589
+ Wx.TextEntryDialog(self,
590
+ 'Tooltip text (may use \\n, leave empty to remove): ',
591
+ 'Widgets sample',
592
+ Page::ATTRS.tool_tip) do |dialog|
593
+ return if dialog.show_modal != Wx::ID_OK
594
+
595
+ Page::ATTRS.tool_tip = dialog.value
596
+ Page::ATTRS.tool_tip.gsub!("\\n", "\n")
597
+ end
598
+
599
+ current_page.set_up_widget
600
+ end
601
+ end # wxUSE_TOOLTIPS
602
+
603
+ # Trivial wrapper for wxGetColourFromUser() which also does something even if
604
+ # the colour dialog is not available in the current build (which may happen
605
+ # for the ports in development and it is still useful to see how colours work)
606
+ def get_colour_from_user(colDefault)
607
+ if Wx.has_feature?(:USE_COLOURDLG)
608
+ Wx.get_colour_from_user(self, colDefault)
609
+ else # !wxUSE_COLOURDLG
610
+ if colDefault == Wx::BLACK
611
+ Wx::WHITE
612
+ else
613
+ Wx::BLACK
614
+ end
615
+ end # wxUSE_COLOURDLG/!wxUSE_COLOURDLG
616
+ end
617
+
618
+ def on_set_fg_col(_event)
619
+ # allow for debugging the default colour the first time this is called
620
+ page = current_page
621
+
622
+ unless Page::ATTRS.col_fg&.ok?
623
+ Page::ATTRS.col_fg = page.get_foreground_colour
624
+ end
625
+
626
+ col = get_colour_from_user(Page::ATTRS.col_fg)
627
+ return unless col&.ok?
628
+
629
+ Page::ATTRS.col_fg = col
630
+
631
+ page.set_up_widget
632
+ end
633
+
634
+ def on_set_bg_col(_event)
635
+ # allow for debugging the default colour the first time this is called
636
+ page = current_page
637
+
638
+ unless Page::ATTRS.col_bg&.ok?
639
+ Page::ATTRS.col_bg = page.get_background_colour
640
+ end
641
+
642
+ col = get_colour_from_user(Page::ATTRS.col_bg)
643
+ return unless col&.ok?
644
+
645
+ Page::ATTRS.col_bg = col
646
+
647
+ page.set_up_widget
648
+ end
649
+
650
+ def on_set_page_bg(_event)
651
+ col = get_colour_from_user(get_background_colour)
652
+ return unless col&.ok?
653
+
654
+ Page::ATTRS.col_page_bg = col
655
+
656
+ current_page.set_up_widget
657
+ end
658
+
659
+ def on_set_font(_event)
660
+ if Wx.has_feature?(:USE_FONTDLG)
661
+ page = current_page
662
+
663
+ unless Page::ATTRS.font&.ok?
664
+ Page::ATTRS.font = page.get_font
665
+ end
666
+
667
+ font = Wx.get_font_from_user(self, Page::ATTRS.font)
668
+ return unless font&.ok?
669
+
670
+ Page::ATTRS.font = font
671
+
672
+ page.set_up_widget
673
+ # The best size of the widget could have changed after changing its font,
674
+ # so re-layout to show it correctly.
675
+ page.layout
676
+ else
677
+ Wx.log_message('Font selection dialog not available in current build.')
678
+ end
679
+ end
680
+
681
+ def on_enable(event)
682
+ Page::ATTRS.enabled = event.checked?
683
+
684
+ current_page.set_up_widget
685
+ end
686
+
687
+ def on_show(event)
688
+ Page::ATTRS.show = event.checked?
689
+
690
+ current_page.set_up_widget
691
+ end
692
+
693
+ def on_set_border(event)
694
+ case event.id
695
+ when ID::Widgets_BorderNone
696
+ border = Wx::BORDER_NONE
697
+ when ID::Widgets_BorderStatic
698
+ border = Wx::BORDER_STATIC
699
+ when ID::Widgets_BorderSimple
700
+ border = Wx::BORDER_SIMPLE
701
+ when ID::Widgets_BorderRaised
702
+ border = Wx::BORDER_RAISED
703
+ when ID::Widgets_BorderSunken
704
+ border = Wx::BORDER_SUNKEN
705
+ when ID::Widgets_BorderDouble
706
+ border = Wx::BORDER_DOUBLE
707
+ when ID::Widgets_BorderDefault
708
+ border = Wx::BORDER_DEFAULT
709
+ else
710
+ ::Kernel.raise RuntimeError, 'unknown border style'
711
+ end
712
+
713
+ Page::ATTRS.default_flags &= ~Wx::BORDER_MASK
714
+ Page::ATTRS.default_flags |= border
715
+
716
+ page = current_page
717
+
718
+ page.recreate_widget
719
+
720
+ connect_to_widget_events
721
+
722
+ # re-apply the attributes to the widget(s)
723
+ page.set_up_widget
724
+ end
725
+
726
+ def on_set_variant(event)
727
+ case event.id
728
+ when ID::Widgets_VariantSmall
729
+ v = Wx::WINDOW_VARIANT_SMALL
730
+ when ID::Widgets_VariantMini
731
+ v = Wx::WINDOW_VARIANT_MINI
732
+ when ID::Widgets_VariantLarge
733
+ v = Wx::WINDOW_VARIANT_LARGE
734
+ when ID::Widgets_VariantNormal
735
+ v = Wx::WINDOW_VARIANT_NORMAL
736
+ else
737
+ ::Kernel.raise RuntimeError, 'unknown window variant'
738
+ end
739
+
740
+ Page::ATTRS.variant = v
741
+
742
+ current_page.set_up_widget
743
+ current_page.layout
744
+ end
745
+
746
+ def on_toggle_layout_direction(_event)
747
+ dir = Page::ATTRS.dir
748
+ dir = get_layout_direction if dir == Wx::LayoutDirection::Layout_Default
749
+ Page::ATTRS.dir =
750
+ (dir == Wx::LayoutDirection::Layout_LeftToRight) ?
751
+ Wx::LayoutDirection::Layout_RightToLeft :
752
+ Wx::LayoutDirection::Layout_LeftToRight
753
+
754
+ current_page.set_up_widget
755
+ end
756
+
757
+ def on_toggle_global_busy_cursor(event)
758
+ if event.checked?
759
+ Wx.begin_busy_cursor
760
+ else
761
+ Wx.end_busy_cursor
762
+ end
763
+ end
764
+
765
+ def on_toggle_busy_cursor(event)
766
+ Page::ATTRS.cursor = event.checked? ? Wx::HOURGLASS_CURSOR : Wx::NULL_CURSOR
767
+
768
+ current_page.set_up_widget
769
+ end
770
+
771
+ # wxTextEntry-specific tests
772
+ def on_disable_auto_complete(_event)
773
+ unless (entry = current_page.get_text_entry)
774
+ Wx.log_error('menu item should be disabled')
775
+ return
776
+ end
777
+
778
+ if entry.auto_complete(nil)
779
+ Wx.log_message('Disabled auto completion.')
780
+ else
781
+ Wx.log_message('auto_complete() failed.')
782
+ end
783
+ end
784
+
785
+ def on_auto_complete_fixed(_event)
786
+ unless (entry = current_page.get_text_entry)
787
+ Wx.log_error('menu item should be disabled')
788
+ return
789
+ end
790
+
791
+ completion_choices = (?a..?z).collect { |c| c*2 }
792
+ completion_choices <<
793
+ 'is this string for test?' <<
794
+ 'this is a test string' <<
795
+ 'this is another test string' <<
796
+ 'this string is for test'
797
+
798
+ if entry.auto_complete(completion_choices)
799
+ Wx.log_message('Enabled auto completion of a set of fixed strings.')
800
+ else
801
+ Wx.log_message('auto_complete() failed.')
802
+ end
803
+ end
804
+
805
+ def on_auto_complete_filenames(_event)
806
+ unless (entry = current_page.get_text_entry)
807
+ Wx.log_error('menu item should be disabled')
808
+ return
809
+ end
810
+
811
+ if entry.auto_complete_file_names
812
+ Wx.log_message('Enabled auto completion of file names.')
813
+ else
814
+ Wx.log_message('auto_complete_file_names failed.')
815
+ end
816
+ end
817
+
818
+ def on_auto_complete_directories(_event)
819
+ unless (entry = current_page.get_text_entry)
820
+ Wx.log_error('menu item should be disabled')
821
+ return
822
+ end
823
+
824
+ if entry.auto_complete_directories
825
+ Wx.log_message('Enabled auto completion of directories.')
826
+ else
827
+ Wx.log_message('AutoCompleteDirectories() failed.')
828
+ end
829
+ end
830
+
831
+ def on_auto_complete_custom(_event)
832
+ do_use_custom_auto_complete
833
+ end
834
+
835
+ def on_auto_complete_key_length(_event)
836
+ message = "The auto-completion is triggered if and only if\n" +
837
+ "the length of the search key (prefix) is at least [LENGTH].\n" +
838
+ "Hint: 0 disables the length check completely."
839
+ prompt = 'Enter the minimum key length:'
840
+ caption = 'Minimum key length'
841
+
842
+ res = Wx.get_number_from_user(message, prompt, caption, 1, 0, 100, self)
843
+ return if res == -1
844
+
845
+ Wx.log_message("The minimum key length for autocomplete is #{res}.")
846
+
847
+ do_use_custom_auto_complete(res)
848
+ end
849
+
850
+ # This is a simple (and hence rather useless) example of a custom
851
+ # completer class that completes the first word (only) initially and only
852
+ # build the list of the possible second words once the first word is
853
+ # known. This allows to avoid building the full 676000 item list of
854
+ # possible strings all at once as the we have 1000 possibilities for the
855
+ # first word (000..999) and 676 (aa..zz) for the second one.
856
+ class CustomTextCompleter < Wx::TextCompleterSimple
857
+
858
+ def initialize(min_length)
859
+ super()
860
+ @min_length = min_length
861
+ end
862
+
863
+ def get_completions(prefix)
864
+ res = []
865
+ 1.times do
866
+ # Wait for enough text to be entered before proposing completions:
867
+ # this is done to avoid proposing too many of them when the
868
+ # control is empty, for example.
869
+ break if prefix.size < @min_length
870
+
871
+ # The only valid strings start with 3 digits so check for their
872
+ # presence proposing to complete the remaining ones.
873
+ break unless prefix.start_with?(/\d/)
874
+
875
+ if prefix.size == 1
876
+ 10.times { |i| 10.times { |j| res << "#{prefix}#{i}#{j}"} }
877
+ break
878
+ else
879
+ break unless (?0..?9).include?(prefix[1])
880
+ end
881
+
882
+ if prefix.size == 2
883
+ 10.times { |i| res << "#{prefix}#{i}" }
884
+ break
885
+ else
886
+ break unless (?0..?9).include?(prefix[2])
887
+ end
888
+
889
+ # Next we must have a space and two letters.
890
+ prefix2 = prefix.dup
891
+ if prefix.size == 3
892
+ prefix2 += ' '
893
+ elsif prefix[3] != ' '
894
+ break
895
+ end
896
+
897
+ if prefix2.size == 4
898
+ (?a..?z).each { |c| (?a..?z).each { |d| res << "#{prefix2}#{c}#{d}"} }
899
+ break
900
+ else
901
+ break unless (?a..?z).include?(prefix[4])
902
+ end
903
+
904
+ if prefix.size == 5
905
+ (?a..?z).each { |c| res << "#{prefix}#{c}" }
906
+ end
907
+ ensure
908
+ # This is used for illustrative purposes only and shows how many
909
+ # completions we return every time when we're called.
910
+ Wx.log_message("Returning #{res.size} possible completions for prefix \"#{prefix}\"")
911
+ end
912
+ res
913
+ end
914
+
915
+ end
916
+
917
+ def do_use_custom_auto_complete(min_length = 1)
918
+ unless (entry = current_page.get_text_entry)
919
+ Wx.log_error('menu item should be disabled')
920
+ return
921
+ end
922
+
923
+ if entry.auto_complete(CustomTextCompleter.new(min_length))
924
+ Wx.log_message('Enabled custom auto completer for "NNN XX" items ' +
925
+ '(where N is a digit and X is a letter).')
926
+ else
927
+ Wx.log_message('auto_complete() failed.')
928
+ end
929
+ end
930
+
931
+ class << self
932
+
933
+ def s_hint
934
+ @s_hint ||= 'Type here'
935
+ end
936
+
937
+ def s_hint=(v)
938
+ @s_hint = v
939
+ end
940
+
941
+ end
942
+
943
+ def on_set_hint(_event)
944
+ unless (entry = current_page.get_text_entry)
945
+ Wx.log_error('menu item should be disabled')
946
+ return
947
+ end
948
+
949
+ hint = Wx.get_text_from_user('Text hint:', 'Widgets sample', self.class.s_hint, self)
950
+ return if hint.empty?
951
+
952
+ self.class.s_hint = hint
953
+
954
+ if entry.set_hint(hint)
955
+ Wx.log_message("Set hint to \"#{hint}\".")
956
+ else
957
+ Wx.log_message('Text hints not supported.')
958
+ end
959
+ end
960
+
961
+ def on_update_text_ui(event)
962
+ event.enable( !current_page.get_text_entry.nil? )
963
+ end
964
+ end # wxUSE_MENUS
965
+
966
+ # initialize the book: add all pages to it
967
+ def init_book
968
+ images = []
969
+
970
+ img = Wx.Image(:sample, art_path: File.dirname(__dir__))
971
+ images << img.scale(ICON_SIZE, ICON_SIZE).to_bitmap
972
+
973
+ unless Wx.has_feature?(:USE_TREEBOOK)
974
+ books = []
975
+ end
976
+
977
+ pages = []
978
+ labels = []
979
+
980
+ menuPages = Wx::Menu.new
981
+ nPage = 0
982
+ imageId = 1
983
+
984
+ # we need to first create all pages and only then add them to the book
985
+ # as we need the image list first
986
+ #
987
+ # we also construct the pages menu during this first iteration
988
+ MAX_PAGES.times do |cat|
989
+ if Wx.has_feature?(:USE_TREEBOOK)
990
+ nPage += 1 # increase for parent page
991
+ else
992
+ books << BookCtrl.new(@book, style: Wx::BK_DEFAULT)
993
+ end
994
+
995
+ pages << []
996
+ labels << []
997
+ Page.widget_pages.each do |info|
998
+ next if info.categories.nobits?(1 << cat)
999
+
1000
+ page = info.create(
1001
+ if Wx.has_feature?(:USE_TREEBOOK)
1002
+ @book
1003
+ else
1004
+ books.last
1005
+ end,
1006
+ images)
1007
+ pages.last << page
1008
+
1009
+ labels.last << info.label
1010
+ if cat == ALL_PAGE
1011
+ menuPages.append_radio_item(
1012
+ ID::Widgets_GoToPage + nPage,
1013
+ info.label)
1014
+ unless Wx.has_feature?(:USE_TREEBOOK)
1015
+ # consider only for book in book architecture
1016
+ nPage += 1
1017
+ end
1018
+ end
1019
+
1020
+ if Wx.has_feature?(:USE_TREEBOOK)
1021
+ # consider only for treebook architecture (with subpages)
1022
+ nPage += 1
1023
+ end
1024
+ end
1025
+ end
1026
+
1027
+ self.menu_bar.append(menuPages, '&Page')
1028
+
1029
+ images.collect! { |img_| img_.is_a?(Wx::BitmapBundle) ? img_ : Wx::BitmapBundle.new(img_) }
1030
+ @book.set_images(images)
1031
+
1032
+ MAX_PAGES.times do |cat|
1033
+ if Wx.has_feature?(:USE_TREEBOOK)
1034
+ @book.add_page(nil, Categories[cat],false,0)
1035
+ else
1036
+ @book.add_page(books[cat], Categories[cat],false,0)
1037
+ books[cat].set_images(images)
1038
+ end
1039
+
1040
+ # now do add them
1041
+ pages[cat].size.times do |n|
1042
+ if Wx.has_feature?(:USE_TREEBOOK)
1043
+ @book.add_sub_page(
1044
+ pages[cat][n],
1045
+ labels[cat][n],
1046
+ false, # don't select
1047
+ imageId
1048
+ )
1049
+ else
1050
+ books[cat].add_page(
1051
+ pages[cat][n],
1052
+ labels[cat][n],
1053
+ false, # don't select
1054
+ imageId
1055
+ )
1056
+ end
1057
+ imageId += 1
1058
+ end
1059
+ end
1060
+
1061
+ if Wx.has_feature?(:USE_TREEBOOK)
1062
+ evt_treebook_page_changed(ID::Widgets_BookCtrl, :on_page_changed)
1063
+ elsif Wx.has_feature?(:USE_NOTEBOOK)
1064
+ evt_notebook_page_changed(ID::Widgets_BookCtrl, :on_page_changed)
1065
+ else
1066
+ evt_choicebook_page_changed(ID::Widgets_BookCtrl, :on_page_changed)
1067
+ end
1068
+
1069
+ pageSet = Wx.persistent_register_and_restore(@book)
1070
+
1071
+ if Wx.has_feature?(:USE_TREEBOOK)
1072
+ # for treebook page #0 is empty parent page only so select the first page
1073
+ # with some contents
1074
+ @book.set_selection(1) if !pageSet || !@book.get_current_page
1075
+
1076
+ # but ensure that the top of the tree is shown nevertheless
1077
+ tree = @book.get_tree_ctrl
1078
+
1079
+ first_child, _ = tree.get_first_child(tree.root_item)
1080
+ tree.ensure_visible(first_child)
1081
+ else
1082
+ if !pageSet || !@book.get_current_page
1083
+ # for other books set selection twice to force connected event handler
1084
+ # to force lazy creation of initial visible content
1085
+ @book.set_selection(1)
1086
+ @book.set_selection(0)
1087
+ end
1088
+ end # USE_TREEBOOK
1089
+ end
1090
+
1091
+ # return the currently selected page (never null)
1092
+ def current_page
1093
+ page = @book.get_current_page
1094
+
1095
+ unless Wx.has_feature?(:USE_TREEBOOK)
1096
+ ::Kernel.raise 'no WidgetsBookCtrl?' unless page.is_a?(Wx::Treebook)
1097
+
1098
+ page = page.get_current_page
1099
+ end # !USE_TREEBOOK
1100
+
1101
+ page
1102
+ end
1103
+
1104
+ private
1105
+
1106
+ def on_widget_focus(event)
1107
+ # Don't show annoying message boxes when starting or closing the sample,
1108
+ # only log these events in our own logger.
1109
+ if Wx.get_app.is_using_log_window
1110
+ win = event.get_event_object
1111
+ Wx.log_message("Widget '#{win.class.name}' #{event.event_type == Wx::EVT_SET_FOCUS ? "got" : "lost"} focus")
1112
+ end
1113
+
1114
+ event.skip
1115
+ end
1116
+ def on_widget_context_menu(event)
1117
+ win = event.get_event_object
1118
+ Wx.log_message("Context menu event for #{win.class.name} at #{event.position.x}x#{event.position.y}")
1119
+
1120
+ event.skip
1121
+ end
1122
+
1123
+ def connect_to_widget_events
1124
+ widgets = current_page.get_widgets
1125
+
1126
+ widgets.each do |w|
1127
+ ::Kernel.raise RuntimeError, 'nil widget' unless w
1128
+
1129
+ w.evt_set_focus self.method(:on_widget_focus)
1130
+ w.evt_kill_focus self.method(:on_widget_focus)
1131
+
1132
+ w.evt_context_menu self.method(:on_widget_context_menu)
1133
+ end
1134
+ end
1135
+
1136
+ end
1137
+
1138
+ class App < Wx::App
1139
+ def initialize
1140
+ super
1141
+ if Wx.has_feature?(:USE_LOG)
1142
+ @logTarget = nil
1143
+ end
1144
+ end
1145
+
1146
+ # this one is called on application startup and is a good place for the app
1147
+ # initialization (doing it here and not in the ctor allows to have an error
1148
+ # return: if OnInit() returns false, the application terminates)
1149
+ def on_init
1150
+ set_vendor_name('wxWidgets_Samples')
1151
+
1152
+ # when running multiple copies of this sample side by side this is useful to see which one is which
1153
+ title = ''
1154
+ # if Wx.has_feature?(:WXUNIVERSAL)
1155
+ # title << "wxUniv/"
1156
+ # end
1157
+ title << Wx::PLATFORM
1158
+
1159
+ frame = Frame.new(title + ' widgets demo')
1160
+ frame.show
1161
+
1162
+ if Wx.has_feature?(:USE_LOG)
1163
+ @logTarget = Wx::Log.get_active_target
1164
+ end # USE_LOG
1165
+
1166
+ true
1167
+ end
1168
+
1169
+ # real implementation of WidgetsPage method with the same name
1170
+ def is_using_log_window
1171
+ Wx.has_feature?(:USE_LOG) && (Wx::Log.get_active_target == @logTarget)
1172
+ end
1173
+ end
1174
+
1175
+ end # module Widgets
1176
+
1177
+ require_relative './activityindicator' if Wx.has_feature?(:USE_ACTIVITYINDICATOR)
1178
+ require_relative './bmpcombobox' if Wx.has_feature?(:USE_BITMAPCOMBOBOX)
1179
+ require_relative './button' if Wx.has_feature?(:USE_BUTTON)
1180
+ require_relative './checkbox' if Wx.has_feature?(:USE_CHECKBOX)
1181
+ require_relative './choice' if Wx.has_feature?(:USE_CHOICE)
1182
+ require_relative './clrpicker' if Wx.has_feature?(:USE_COLOURPICKERCTRL) && Wx.has_feature?(:USE_COLOURDLG)
1183
+ require_relative './combobox' if Wx.has_feature?(:USE_COMBOBOX)
1184
+ require_relative './datepick' if Wx.has_feature?(:USE_DATEPICKCTRL)
1185
+ require_relative './dirctrl' if Wx.has_feature?(:USE_FILEDLG) || Wx.has_feature?(:USE_DIRDLG)
1186
+ require_relative './dirpicker' if Wx.has_feature?(:USE_DIRPICKERCTRL) && Wx.has_feature?(:USE_DIRDLG)
1187
+ require_relative './editlbox' if Wx.has_feature?(:USE_EDITABLELISTBOX)
1188
+ require_relative './filectrl' if Wx.has_feature?(:USE_FILECTRL)
1189
+ require_relative './filepicker' if Wx.has_feature?(:USE_FILEPICKERCTRL) && Wx.has_feature?(:USE_FILEDLG)
1190
+ require_relative './fontpicker' if Wx.has_feature?(:USE_FONTPICKERCTRL) && Wx.has_feature?(:USE_FONTDLG)
1191
+ require_relative './gauge' if Wx.has_feature?(:USE_GAUGE)
1192
+ require_relative './headerctrl'
1193
+ require_relative './hyperlink' if Wx.has_feature?(:USE_HYPERLINKCTRL)
1194
+ require_relative './listbox' if Wx.has_feature?(:USE_LISTBOX)
1195
+ require_relative './notebook' if Wx.has_feature?(:USE_NOTEBOOK) || Wx.has_feature?(:USE_LISTBOOK) || Wx.has_feature?(:USE_CHOICEBOOK)
1196
+ require_relative './odcombobox' if Wx.has_feature?(:USE_ODCOMBOBOX)
1197
+ require_relative './radiobox' if Wx.has_feature?(:USE_RADIOBOX)
1198
+ require_relative './searchctrl' if Wx.has_feature?(:USE_SEARCHCTRL)
1199
+ require_relative './slider' if Wx.has_feature?(:USE_SLIDER)
1200
+ require_relative './spinbtn' if Wx.has_feature?(:USE_SPINBTN)
1201
+ require_relative './statbmp' if Wx.has_feature?(:USE_STATBMP)
1202
+ require_relative './static'
1203
+ require_relative './timepick' if Wx.has_feature?(:USE_TIMEPICKCTRL)
1204
+ require_relative './toggle' if Wx.has_feature?(:USE_TOGGLEBTN)
1205
+ require_relative './textctrl'
1206
+
1207
+ module WidgetsSample
1208
+
1209
+ include WxRuby::Sample if defined? WxRuby::Sample
1210
+
1211
+ def self.describe
1212
+ { file: __FILE__,
1213
+ summary: 'wxRuby Widgets example.',
1214
+ description: <<~__DESC
1215
+ A Ruby port of the extensive wxWidgets widgets sample which showcases
1216
+ a wide selection of widgets (controls).
1217
+ __DESC
1218
+ }
1219
+ end
1220
+
1221
+ def self.run
1222
+ execute(__FILE__)
1223
+ end
1224
+
1225
+ if $0 == __FILE__
1226
+ Widgets::App.run
1227
+ end
1228
+
1229
+ end