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,473 @@
1
+ # Copyright (c) 2023 M.J.N. Corino = self.next_id 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_relative './itemcontainer'
9
+
10
+ module Widgets
11
+
12
+ module ListBox
13
+
14
+ class ListBoxPage < ItemContainer::Page
15
+
16
+ module ID
17
+ include Wx::IDHelper
18
+
19
+ Reset = self.next_id(Widgets::Frame::ID::Last)
20
+ Add = self.next_id
21
+ AddText = self.next_id
22
+ AddSeveral = self.next_id
23
+ AddMany = self.next_id
24
+ Clear = self.next_id
25
+ Change = self.next_id
26
+ ChangeText = self.next_id
27
+ Delete = self.next_id
28
+ DeleteText = self.next_id
29
+ DeleteSel = self.next_id
30
+ Listbox = self.next_id
31
+ EnsureVisible = self.next_id
32
+ EnsureVisibleText = self.next_id
33
+ ContainerTests = self.next_id
34
+ GetTopItem = self.next_id
35
+ GetCountPerPage = self.next_id
36
+ MoveUp = self.next_id
37
+ MoveDown = self.next_id
38
+
39
+ # the selection mode
40
+ LboxSel_Single = 0
41
+ LboxSel_Extended = 1
42
+ LboxSel_Multiple = 2
43
+
44
+ # the list type
45
+ LboxType_ListBox = 0
46
+ LboxType_CheckListBox = 1
47
+ LboxType_RearrangeList = 2
48
+ end
49
+
50
+ Info = Widgets::PageInfo.new(self, 'Listbox',
51
+ NATIVE_CTRLS |
52
+ WITH_ITEMS_CTRLS)
53
+
54
+ def initialize(book, images)
55
+ super(book, images, :listbox)
56
+
57
+ # init everything
58
+ @radioSelMode = nil
59
+ @radioListType = nil
60
+
61
+ @chkVScroll =
62
+ @chkHScroll =
63
+ @chkSort =
64
+ @chkOwnerDraw = nil
65
+
66
+ @lbox = nil
67
+ @sizerLbox = nil
68
+ end
69
+
70
+ def get_widget
71
+ @lbox
72
+ end
73
+
74
+ def get_container
75
+ @lbox
76
+ end
77
+
78
+ def recreate_widget
79
+ create_lbox
80
+ end
81
+
82
+ # lazy creation of the content
83
+ def create_content
84
+ # What we create here is a frame having 3 panes: style pane is the
85
+ # leftmost one, in the middle the pane with buttons allowing to perform
86
+ # miscellaneous listbox operations and the pane containing the listbox
87
+ # itself to the right
88
+ sizerTop = Wx::HBoxSizer.new
89
+
90
+ # left pane
91
+ sizerLeft = Wx::StaticBoxSizer.new(Wx::VERTICAL, self, '&Set listbox parameters')
92
+ sizerLeftBox = sizerLeft.get_static_box
93
+
94
+ @chkVScroll = create_check_box_and_add_to_sizer(sizerLeft,
95
+ 'Always show &vertical scrollbar',
96
+ Wx::ID_ANY, sizerLeftBox)
97
+ @chkHScroll = create_check_box_and_add_to_sizer(sizerLeft,
98
+ 'Show &horizontal scrollbar',
99
+ Wx::ID_ANY, sizerLeftBox)
100
+ @chkSort = create_check_box_and_add_to_sizer(sizerLeft,'&Sort items', Wx::ID_ANY, sizerLeftBox)
101
+ @chkOwnerDraw = create_check_box_and_add_to_sizer(sizerLeft,'&Owner drawn', Wx::ID_ANY, sizerLeftBox)
102
+
103
+ modes = %w[single extended multiple]
104
+ @radioSelMode = Wx::RadioBox.new(sizerLeftBox, Wx::ID_ANY, 'Selection &mode:',
105
+ choices: modes,
106
+ major_dimension: 1,
107
+ style: Wx::RA_SPECIFY_COLS)
108
+
109
+ listTypes = ['list box']
110
+ listTypes << 'check list box' if Wx.has_feature?(:USE_CHECKLISTBOX)
111
+ listTypes << 'rearrange list' if Wx.has_feature?(:USE_REARRANGECTRL)
112
+ @radioListType = Wx::RadioBox.new(sizerLeftBox, Wx::ID_ANY, '&List type:',
113
+ choices: listTypes,
114
+ major_dimension: 1,
115
+ style: Wx::RA_SPECIFY_COLS)
116
+
117
+ sizerLeft.add(5, 5, 0, Wx::GROW | Wx::ALL, 5) # spacer
118
+ sizerLeft.add(@radioSelMode, 0, Wx::GROW | Wx::ALL, 5)
119
+
120
+ sizerLeft.add(5, 5, 0, Wx::GROW | Wx::ALL, 5) # spacer
121
+ sizerLeft.add(@radioListType, 0, Wx::GROW | Wx::ALL, 5)
122
+
123
+ btn = Wx::Button.new(sizerLeftBox, ID::Reset, '&Reset')
124
+ sizerLeft.add(btn, 0, Wx::ALIGN_CENTRE_HORIZONTAL | Wx::ALL, 15)
125
+
126
+ # middle pane
127
+ sizerMiddle = Wx::StaticBoxSizer.new(Wx::VERTICAL, self, '&Change listbox contents')
128
+ sizerMiddleBox = sizerMiddle.get_static_box
129
+
130
+ sizerRow = Wx::HBoxSizer.new
131
+ btn = Wx::Button.new(sizerMiddleBox, ID::Add, '&Add this string')
132
+ @textAdd = Wx::TextCtrl.new(sizerMiddleBox, ID::AddText, "test item \t0")
133
+ sizerRow.add(btn, 0, Wx::RIGHT, 5)
134
+ sizerRow.add(@textAdd, 1, Wx::LEFT, 5)
135
+ sizerMiddle.add(sizerRow, 0, Wx::ALL | Wx::GROW, 5)
136
+
137
+ btn = Wx::Button.new(sizerMiddleBox, ID::AddSeveral, '&Insert a few strings')
138
+ sizerMiddle.add(btn, 0, Wx::ALL | Wx::GROW, 5)
139
+
140
+ btn = Wx::Button.new(sizerMiddleBox, ID::AddMany, 'Add &many strings')
141
+ sizerMiddle.add(btn, 0, Wx::ALL | Wx::GROW, 5)
142
+
143
+ sizerRow = Wx::HBoxSizer.new
144
+ btn = Wx::Button.new(sizerMiddleBox, ID::Change, 'C&hange current')
145
+ @textChange = Wx::TextCtrl.new(sizerMiddleBox, ID::ChangeText, '')
146
+ sizerRow.add(btn, 0, Wx::RIGHT, 5)
147
+ sizerRow.add(@textChange, 1, Wx::LEFT, 5)
148
+ sizerMiddle.add(sizerRow, 0, Wx::ALL | Wx::GROW, 5)
149
+
150
+ sizerRow = Wx::HBoxSizer.new
151
+ btn = Wx::Button.new(sizerMiddleBox, ID::EnsureVisible, 'Make item &visible')
152
+ @textEnsureVisible = Wx::TextCtrl.new(sizerMiddleBox, ID::EnsureVisibleText, '')
153
+ sizerRow.add(btn, 0, Wx::RIGHT, 5)
154
+ sizerRow.add(@textEnsureVisible, 1, Wx::LEFT, 5)
155
+ sizerMiddle.add(sizerRow, 0, Wx::ALL | Wx::GROW, 5)
156
+
157
+ sizerRow = Wx::HBoxSizer.new
158
+ btn = Wx::Button.new(sizerMiddleBox, ID::Delete, '&Delete this item')
159
+ @textDelete = Wx::TextCtrl.new(sizerMiddleBox, ID::DeleteText, '')
160
+ sizerRow.add(btn, 0, Wx::RIGHT, 5)
161
+ sizerRow.add(@textDelete, 1, Wx::LEFT, 5)
162
+ sizerMiddle.add(sizerRow, 0, Wx::ALL | Wx::GROW, 5)
163
+
164
+ btn = Wx::Button.new(sizerMiddleBox, ID::DeleteSel, 'Delete &selection')
165
+ sizerMiddle.add(btn, 0, Wx::ALL | Wx::GROW, 5)
166
+
167
+ btn = Wx::Button.new(sizerMiddleBox, ID::Clear, '&Clear')
168
+ sizerMiddle.add(btn, 0, Wx::ALL | Wx::GROW, 5)
169
+
170
+ btn = Wx::Button.new(sizerMiddleBox, ID::MoveUp, 'Move item &up')
171
+ sizerMiddle.add(btn, 0, Wx::ALL | Wx::GROW, 5)
172
+
173
+ btn = Wx::Button.new(sizerMiddleBox, ID::MoveDown, 'Move item &down')
174
+ sizerMiddle.add(btn, 0, Wx::ALL | Wx::GROW, 5)
175
+
176
+ btn = Wx::Button.new(sizerMiddleBox, ID::GetTopItem, 'Get top item')
177
+ sizerMiddle.add(btn, 0, Wx::ALL | Wx::GROW, 5)
178
+
179
+ btn = Wx::Button.new(sizerMiddleBox, ID::GetCountPerPage, 'Get count per page')
180
+ sizerMiddle.add(btn, 0, Wx::ALL | Wx::GROW, 5)
181
+
182
+ btn = Wx::Button.new(sizerMiddleBox, ID::ContainerTests, 'Run &tests')
183
+ sizerMiddle.add(btn, 0, Wx::ALL | Wx::GROW, 5)
184
+
185
+ # right pane
186
+ sizerRight = Wx::VBoxSizer.new
187
+ @lbox = Wx::ListBox.new(self, ID::Listbox,
188
+ choices: [],
189
+ style: Wx::LB_HSCROLL)
190
+ sizerRight.add(@lbox, 1, Wx::GROW | Wx::ALL, 5)
191
+ sizerRight.set_min_size(150, 0)
192
+ @sizerLbox = sizerRight # save it to modify it later
193
+
194
+ # the 3 panes panes compose the window
195
+ sizerTop.add(sizerLeft, 0, Wx::GROW | (Wx::ALL & ~Wx::LEFT), 10)
196
+ sizerTop.add(sizerMiddle, 1, Wx::GROW | Wx::ALL, 10)
197
+ sizerTop.add(sizerRight, 1, Wx::GROW | (Wx::ALL & ~Wx::RIGHT), 10)
198
+
199
+ # final initializations
200
+ reset
201
+
202
+ set_sizer(sizerTop)
203
+
204
+ # connect event handlers
205
+ evt_button(ID::Reset, :on_button_reset)
206
+ evt_button(ID::Change, :on_button_change)
207
+ evt_button(ID::Delete, :on_button_delete)
208
+ evt_button(ID::DeleteSel, :on_button_delete_sel)
209
+ evt_button(ID::EnsureVisible, :on_button_ensure_visible)
210
+ evt_button(ID::Clear, :on_button_clear)
211
+ evt_button(ID::Add, :on_button_add)
212
+ evt_button(ID::AddSeveral, :on_button_add_several)
213
+ evt_button(ID::AddMany, :on_button_add_many)
214
+ evt_button(ID::ContainerTests, :on_button_test_item_container)
215
+ evt_button(ID::GetTopItem, :on_button_top_item)
216
+ evt_button(ID::GetCountPerPage, :on_button_page_count)
217
+ evt_button(ID::MoveUp, :on_button_move_up)
218
+ evt_button(ID::MoveDown, :on_button_move_down)
219
+
220
+ evt_text_enter(ID::AddText, :on_button_add)
221
+ evt_text_enter(ID::DeleteText, :on_button_delete)
222
+ evt_text_enter(ID::EnsureVisibleText, :on_button_ensure_visible)
223
+
224
+ evt_update_ui(ID::Reset, :on_update_ui_reset_button)
225
+ evt_update_ui(ID::AddSeveral, :on_update_ui_add_several)
226
+ evt_update_ui(ID::Clear, :on_update_ui_clear_button)
227
+ evt_update_ui(ID::DeleteText, :on_update_ui_clear_button)
228
+ evt_update_ui(ID::Delete, :on_update_ui_delete_button)
229
+ evt_update_ui(ID::Change, :on_update_ui_delete_sel_button)
230
+ evt_update_ui(ID::ChangeText, :on_update_ui_delete_sel_button)
231
+ evt_update_ui(ID::DeleteSel, :on_update_ui_delete_sel_button)
232
+ evt_update_ui(ID::EnsureVisible, :on_update_ui_ensure_visible_button)
233
+ evt_update_ui_range(ID::MoveUp, ID::MoveDown, :on_update_ui_move_buttons)
234
+
235
+ evt_listbox(ID::Listbox, :on_listbox)
236
+ evt_listbox_dclick(ID::Listbox, :on_listbox_d_click)
237
+ evt_checklistbox(ID::Listbox, :on_check_listbox)
238
+
239
+ evt_checkbox(Wx::ID_ANY, :on_check_or_radio_box)
240
+ evt_radiobox(Wx::ID_ANY, :on_check_or_radio_box)
241
+ end
242
+
243
+ protected
244
+
245
+ # event handlers
246
+ def on_button_reset(_event)
247
+ reset
248
+
249
+ create_lbox
250
+ end
251
+
252
+ def on_button_change(_event)
253
+ selections = @lbox.get_selections
254
+ s = @textChange.value
255
+ selections.each { |sel| @lbox.set_string(sel, s) }
256
+ end
257
+
258
+ def on_button_ensure_visible(_event)
259
+ return unless (n = get_valid_index_from_text(@textEnsureVisible))
260
+ @lbox.ensure_visible(n)
261
+ end
262
+
263
+ def on_button_delete(_event)
264
+ return unless (n = get_valid_index_from_text(@textDelete))
265
+ @lbox.delete(n)
266
+ end
267
+
268
+ def on_button_delete_sel(_event)
269
+ selections = @lbox.get_selections
270
+ selections.reverse.each { |sel| @lbox.delete(sel) }
271
+ end
272
+
273
+ def on_button_clear(_event)
274
+ @lbox.clear
275
+ end
276
+
277
+ class << self
278
+ def s_item(v=nil)
279
+ @s_item = v unless v.nil?
280
+ @s_item ||= 0
281
+ end
282
+ end
283
+
284
+ def on_button_add(_event)
285
+ s = @textAdd.value
286
+ unless @textAdd.is_modified
287
+ # update the default string
288
+ i = self.class.s_item(self.class.s_item+1)
289
+ @textAdd.set_value("test item #{i}")
290
+ end
291
+
292
+ @lbox.append(s)
293
+ end
294
+
295
+ def on_button_add_several(event)
296
+ items = [
297
+ 'First',
298
+ 'another one',
299
+ 'and the last (very very very very very very very very very very long) one'
300
+ ]
301
+ @lbox.insert(items, 0)
302
+ end
303
+
304
+ def on_button_add_many(event)
305
+ # "many" means 1000 here
306
+ 1000.times { |n| @lbox.append("item ##{n}") }
307
+ end
308
+
309
+ def on_button_top_item(_event)
310
+ item = @lbox.get_top_item
311
+ Wx.log_message("Topmost visible item is: #{item}")
312
+ end
313
+
314
+ def on_button_page_count(_event)
315
+ count = @lbox.get_count_per_page
316
+ Wx.log_message("#{count} items fit into this listbox.")
317
+ end
318
+
319
+ def on_button_move_up(_evt)
320
+ if Wx.has_feature?(:USE_REARRANGECTRL)
321
+ @lbox.move_current_up
322
+ end # wxUSE_REARRANGECTRL
323
+ end
324
+
325
+ def on_button_move_down(_evt)
326
+ if Wx.has_feature?(:USE_REARRANGECTRL)
327
+ @lbox.move_current_down
328
+ end # wxUSE_REARRANGECTRL
329
+ end
330
+
331
+ def on_listbox(event)
332
+ sel = event.selection
333
+ @textDelete.set_value(sel.to_s)
334
+
335
+ if event.is_selection
336
+ Wx.log_message("Listbox item #{sel} selected")
337
+ else
338
+ Wx.log_message("Listbox item #{sel} deselected")
339
+ end
340
+ end
341
+
342
+ def on_listbox_d_click(event)
343
+ Wx.log_message('Listbox item %d double clicked', event.int)
344
+ end
345
+
346
+ def on_check_listbox(event)
347
+ Wx.log_message('Listbox item %d toggled', event.int)
348
+ end
349
+
350
+ def on_check_or_radio_box(event)
351
+ create_lbox
352
+ end
353
+
354
+ def on_update_ui_add_several(event)
355
+ event.enable(@lbox.get_window_style.nobits?(Wx::LB_SORT))
356
+ end
357
+
358
+ def on_update_ui_clear_button(event)
359
+ event.enable(@lbox.count != 0)
360
+ end
361
+
362
+ def on_update_ui_ensure_visible_button(event)
363
+ event.enable(!!get_valid_index_from_text(@textEnsureVisible))
364
+ end
365
+
366
+ def on_update_ui_delete_button(event)
367
+ event.enable(!!get_valid_index_from_text(@textDelete))
368
+ end
369
+
370
+ def on_update_ui_delete_sel_button(event)
371
+ event.enable(!@lbox.get_selections.empty?)
372
+ end
373
+
374
+ def on_update_ui_reset_button(event)
375
+ event.enable((@radioSelMode.selection != ID::LboxSel_Single) ||
376
+ @chkSort.value ||
377
+ @chkOwnerDraw.value ||
378
+ !@chkHScroll.value ||
379
+ @chkVScroll.value)
380
+ end
381
+
382
+ def on_update_ui_move_buttons(evt)
383
+ evt.enable(@radioListType.selection == ID::LboxType_RearrangeList)
384
+ end
385
+
386
+ # reset the listbox parameters
387
+ def reset
388
+ @radioSelMode.set_selection(ID::LboxSel_Single)
389
+ @radioListType.set_selection(ID::LboxType_ListBox)
390
+ @chkVScroll.set_value(false)
391
+ @chkHScroll.set_value(true)
392
+ @chkSort.set_value(false)
393
+ @chkOwnerDraw.set_value(false)
394
+ end
395
+
396
+ # (re)create the listbox
397
+ def create_lbox
398
+ flags = get_attrs.default_flags
399
+ case @radioSelMode.selection
400
+ when ID::LboxSel_Single
401
+ flags |= Wx::LB_SINGLE
402
+ when ID::LboxSel_Extended
403
+ flags |= Wx::LB_EXTENDED
404
+ when ID::LboxSel_Multiple
405
+ flags |= Wx::LB_MULTIPLE
406
+ else
407
+ ::Kernel.raise RuntimeError, 'unexpected radio box selection'
408
+ end
409
+
410
+ flags |= Wx::LB_ALWAYS_SB if @chkVScroll.value
411
+ flags |= Wx::LB_HSCROLL if @chkHScroll.value
412
+ flags |= Wx::LB_SORT if @chkSort.value
413
+ flags |= Wx::LB_OWNERDRAW if @chkOwnerDraw.value
414
+
415
+ items = []
416
+ order = []
417
+ if @lbox
418
+ items = @lbox.each_string.to_a
419
+
420
+ # order.reserve(count)
421
+ if Wx.has_feature?(:USE_CHECKLISTBOX) && @lbox.is_a?(Wx::CheckListBox)
422
+ items.size.times { |n| order << (@lbox.is_checked(n) ? n : ~n) }
423
+ else
424
+ items.size.times { |n| order << ~n }
425
+ end
426
+
427
+ @sizerLbox.detach(@lbox)
428
+ @lbox.destroy
429
+ end
430
+
431
+ case @radioListType.selection
432
+ when ID::LboxType_CheckListBox, ID::LboxType_RearrangeList
433
+ if Wx.has_feature?(:USE_CHECKLISTBOX) && @radioListType.selection == ID::LboxType_CheckListBox
434
+ @lbox = Wx::CheckListBox.new(self, ID::Listbox,
435
+ choices: items,
436
+ style: flags)
437
+ order.each_with_index { |o, n| @lbox.check(n, o >= 0) }
438
+ elsif Wx.has_feature?(:USE_REARRANGECTRL)
439
+ @lbox = Wx::RearrangeList.new(self, ID::Listbox,
440
+ order: order,
441
+ items: items,
442
+ style: flags)
443
+ end # wxUSE_REARRANGECTRL
444
+ #when ID::LboxType_ListBox
445
+ else
446
+ @lbox = Wx::ListBox.new(self, ID::Listbox,
447
+ choices: items,
448
+ style: flags)
449
+ end
450
+
451
+ @sizerLbox.add(@lbox, 1, Wx::GROW | Wx::ALL, 5)
452
+ @sizerLbox.layout
453
+ end
454
+
455
+ # read the value of a listbox item index from the given control, return
456
+ # nil if it's invalid
457
+ def get_valid_index_from_text(text)
458
+ return nil if text.value.empty?
459
+ idx = Integer(text.value) rescue -1
460
+ if idx < 0 || idx >= @lbox.count
461
+ Wx.log_warning("Invalid index \"#{text.value}\"")
462
+
463
+ return nil
464
+ end
465
+
466
+ idx
467
+ end
468
+
469
+ end
470
+
471
+ end
472
+
473
+ end