wxruby3 0.9.2 → 0.9.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/INSTALL.md +35 -29
- data/README.md +24 -15
- data/ext/wxruby3/include/wxruby-ClientData.h +48 -0
- data/ext/wxruby3/include/wxruby-Config.h +23 -5
- data/ext/wxruby3/include/wxruby-Persistence.h +79 -0
- data/ext/wxruby3/include/wxruby-Validator.h +39 -0
- data/ext/wxruby3/include/wxruby-ValidatorBinding.h +64 -0
- data/ext/wxruby3/swig/custom/director.swg +8 -0
- data/ext/wxruby3/swig/mark_free_impl.i +0 -33
- data/ext/wxruby3/swig/memory_management.i +6 -0
- data/lib/wx/core/bitmap_combobox.rb +17 -21
- data/lib/wx/core/book_ctrl_base.rb +16 -0
- data/lib/wx/core/combobox.rb +13 -3
- data/lib/wx/core/config.rb +454 -83
- data/lib/wx/core/controlwithitems.rb +40 -130
- data/lib/wx/core/enum.rb +17 -1
- data/lib/wx/core/event.rb +6 -1
- data/lib/wx/core/evthandler.rb +8 -2
- data/lib/wx/core/generic_validator.rb +312 -0
- data/lib/wx/core/listbox.rb +2 -2
- data/lib/wx/core/log.rb +1 -1
- data/lib/wx/core/notebook.rb +10 -8
- data/lib/wx/core/owner_drawn_combobox.rb +45 -0
- data/lib/wx/core/peristent_object.rb +15 -0
- data/lib/wx/core/persistence_manager.rb +39 -0
- data/lib/wx/core/persistent_window.rb +16 -0
- data/lib/wx/core/size.rb +4 -0
- data/lib/wx/core/sizer.rb +1 -2
- data/lib/wx/core/standard_paths.rb +22 -0
- data/lib/wx/core/text_entry.rb +4 -1
- data/lib/wx/core/top_level_window.rb +16 -0
- data/lib/wx/core/treebook.rb +18 -0
- data/lib/wx/core/validator.rb +70 -5
- data/lib/wx/core/window.rb +3 -7
- data/lib/wx/core.rb +4 -0
- data/lib/wx/doc/art_locator.rb +1 -0
- data/lib/wx/doc/book_ctrl_base.rb +19 -0
- data/lib/wx/doc/comboctrl.rb +18 -0
- data/lib/wx/doc/config.rb +101 -41
- data/lib/wx/doc/controlwithitems.rb +16 -0
- data/lib/wx/doc/date_picker_ctrl.rb +23 -0
- data/lib/wx/doc/editable_listbox.rb +44 -0
- data/lib/wx/doc/enum.rb +15 -0
- data/lib/wx/doc/event.rb +12 -0
- data/lib/wx/doc/extra/12_client_data.md +89 -0
- data/lib/wx/doc/extra/13_validators.md +139 -0
- data/lib/wx/doc/extra/14_config.md +101 -0
- data/lib/wx/doc/extra/15_persistence.md +148 -0
- data/lib/wx/doc/gdi_common.rb +4 -0
- data/lib/wx/doc/generic_validator.rb +95 -0
- data/lib/wx/doc/html/simple_html_listbox.rb +22 -0
- data/lib/wx/doc/num_validator.rb +387 -0
- data/lib/wx/doc/owner_drawn_combobox.rb +96 -0
- data/lib/wx/doc/persistence_manager.rb +36 -0
- data/lib/wx/doc/persistent_object.rb +27 -0
- data/lib/wx/doc/pg/numeric_property_validator.rb +33 -0
- data/lib/wx/doc/static_bitmap.rb +25 -0
- data/lib/wx/doc/text_validator.rb +10 -0
- data/lib/wx/doc/top_level_window.rb +19 -0
- data/lib/wx/doc/treebook.rb +6 -1
- data/lib/wx/doc/validator.rb +113 -0
- data/lib/wx/doc/window.rb +30 -0
- data/lib/wx/html/simple_html_listbox.rb +24 -91
- data/lib/wx/keyword_defs.rb +34 -2
- data/lib/wx/rbn/ribbon_gallery.rb +0 -21
- data/lib/wx/version.rb +1 -1
- data/rakelib/build.rb +1 -1
- data/rakelib/lib/config/mingw.rb +12 -0
- data/rakelib/lib/core/include/client_data.inc +65 -0
- data/rakelib/lib/core/include/funcall.inc +1 -1
- data/rakelib/lib/core/package.rb +39 -3
- data/rakelib/lib/core/parameter.rb +1 -1
- data/rakelib/lib/core/spec.rb +10 -0
- data/rakelib/lib/core/spec_helper.rb +8 -2
- data/rakelib/lib/director/app.rb +18 -0
- data/rakelib/lib/director/app_traits.rb +3 -1
- data/rakelib/lib/director/bitmap_combobox.rb +2 -2
- data/rakelib/lib/director/combobox.rb +22 -0
- data/rakelib/lib/director/comboctrl.rb +1 -55
- data/rakelib/lib/director/config_base.rb +490 -19
- data/rakelib/lib/director/ctrl_with_items.rb +88 -21
- data/rakelib/lib/director/date_picker_ctrl.rb +8 -6
- data/rakelib/lib/director/editable_listbox.rb +30 -0
- data/rakelib/lib/director/event.rb +102 -12
- data/rakelib/lib/director/event_filter.rb +1 -1
- data/rakelib/lib/director/event_handler.rb +3 -2
- data/rakelib/lib/director/event_loop.rb +1 -1
- data/rakelib/lib/director/file_dialog_customize_hook.rb +2 -2
- data/rakelib/lib/director/functions.rb +4 -2
- data/rakelib/lib/director/generic_dirctrl.rb +17 -0
- data/rakelib/lib/director/grid_cell_attr.rb +1 -3
- data/rakelib/lib/director/grid_cell_editor.rb +1 -3
- data/rakelib/lib/director/grid_cell_renderer.rb +1 -3
- data/rakelib/lib/director/header_ctrl.rb +9 -1
- data/rakelib/lib/director/html_listbox.rb +97 -22
- data/rakelib/lib/director/num_validator.rb +495 -0
- data/rakelib/lib/director/numeric_property_validator.rb +131 -6
- data/rakelib/lib/director/owner_drawn_combobox.rb +192 -0
- data/rakelib/lib/director/persistence_manager.rb +410 -0
- data/rakelib/lib/director/persistent_object.rb +70 -0
- data/rakelib/lib/director/persistent_window.rb +73 -0
- data/rakelib/lib/director/pgproperty.rb +3 -29
- data/rakelib/lib/director/ribbon_button_bar.rb +3 -3
- data/rakelib/lib/director/ribbon_gallery.rb +3 -5
- data/rakelib/lib/director/sizer.rb +15 -4
- data/rakelib/lib/director/sizer_item.rb +13 -0
- data/rakelib/lib/director/static_bitmap.rb +32 -0
- data/rakelib/lib/director/text_entry.rb +5 -1
- data/rakelib/lib/director/text_validator.rb +124 -13
- data/rakelib/lib/director/toggle_button.rb +1 -0
- data/rakelib/lib/director/top_level_window.rb +0 -2
- data/rakelib/lib/director/tree_ctrl.rb +35 -0
- data/rakelib/lib/director/utils.rb +16 -2
- data/rakelib/lib/director/validator.rb +196 -21
- data/rakelib/lib/director/window.rb +16 -2
- data/rakelib/lib/extractor/function.rb +2 -1
- data/rakelib/lib/generate/analyzer.rb +44 -44
- data/rakelib/lib/generate/doc.rb +11 -5
- data/rakelib/lib/specs/interfaces.rb +5 -0
- data/rakelib/lib/swig_runner.rb +55 -9
- data/rakelib/lib/typemap/client_data.rb +67 -0
- data/rakelib/lib/typemap/common.rb +3 -3
- data/rakelib/lib/typemap/config.rb +8 -0
- data/rakelib/lib/typemap/datetime.rb +1 -1
- data/rakelib/lib/typemap/tree_itemid.rb +2 -2
- data/samples/aui/aui.rb +1237 -1233
- data/samples/calendar/calendar.rb +293 -289
- data/samples/controls/get_item_sample.rb +83 -79
- data/samples/controls/htlbox.rb +331 -327
- data/samples/dialogs/dialogs.rb +682 -694
- data/samples/dialogs/wizard.rb +52 -55
- data/samples/dragdrop/dragdrop.rb +146 -142
- data/samples/drawing/bitmap.rb +29 -26
- data/samples/drawing/bitmap_image.rb +84 -80
- data/samples/drawing/graphics_drawing.rb +209 -205
- data/samples/drawing/image_prt.rb +344 -340
- data/samples/drawing/maths_images.rb +18 -1
- data/samples/drawing/rmagic_bitmap_image.rb +88 -84
- data/samples/etc/caret.rb +306 -0
- data/samples/etc/miniframe.rb +65 -60
- data/samples/etc/sash.rb +109 -105
- data/samples/etc/scrollwin.rb +86 -80
- data/samples/etc/system_settings.rb +216 -209
- data/samples/event/activation.rb +72 -67
- data/samples/event/event.rb +160 -153
- data/samples/event/threaded.rb +8 -1
- data/samples/event/update_ui_event.rb +67 -60
- data/samples/grid/grid.rb +188 -181
- data/samples/grid/gridtablebase.rb +136 -129
- data/samples/html/html.rb +208 -204
- data/samples/mdi/mdi.rb +59 -54
- data/samples/minimal/minimal.rb +54 -51
- data/samples/minimal/nothing.rb +1 -0
- data/samples/printing/printing.rb +367 -377
- data/samples/printing/printing2.rb +203 -198
- data/samples/propgrid/propgrid.rb +2312 -2308
- data/samples/propgrid/propgrid_minimal.rb +57 -50
- data/samples/ribbon/ribbon.rb +780 -774
- data/samples/sampler/ext.rb +0 -33
- data/samples/sampler/sample.rb +4 -9
- data/samples/sampler.rb +1 -1
- data/samples/splash/splash.rb +118 -116
- data/samples/text/rich_textctrl.rb +207 -201
- data/samples/text/richtext.rb +1409 -1405
- data/samples/text/scintilla.rb +137 -128
- data/samples/text/textctrl.rb +89 -83
- data/samples/text/unicode.rb +175 -168
- data/samples/treectrl/treectrl.rb +1430 -1426
- data/samples/widgets/activityindicator.rb +95 -0
- data/samples/widgets/art/widgets/activityindicator.xpm +278 -0
- data/samples/widgets/art/widgets/bmpbtn.xpm +37 -0
- data/samples/widgets/art/widgets/bmpcombobox.xpm +54 -0
- data/samples/widgets/art/widgets/button.xpm +54 -0
- data/samples/widgets/art/widgets/checkbox.xpm +54 -0
- data/samples/{bigdemo/icons → widgets/art/widgets}/choice.xpm +1 -1
- data/samples/widgets/art/widgets/choicebk.xpm +54 -0
- data/samples/widgets/art/widgets/clrpicker.xpm +193 -0
- data/samples/widgets/art/widgets/combobox.xpm +54 -0
- data/samples/widgets/art/widgets/datepick.xpm +200 -0
- data/samples/widgets/art/widgets/dirctrl.xpm +54 -0
- data/samples/widgets/art/widgets/dirpicker.xpm +213 -0
- data/samples/widgets/art/widgets/filepicker.xpm +214 -0
- data/samples/widgets/art/widgets/fontpicker.xpm +185 -0
- data/samples/widgets/art/widgets/gauge.xpm +54 -0
- data/samples/widgets/art/widgets/header.xpm +54 -0
- data/samples/widgets/art/widgets/hyperlnk.xpm +54 -0
- data/samples/widgets/art/widgets/listbook.xpm +54 -0
- data/samples/widgets/art/widgets/listbox.xpm +54 -0
- data/samples/widgets/art/widgets/native.xpm +81 -0
- data/samples/widgets/art/widgets/notebook.xpm +54 -0
- data/samples/widgets/art/widgets/odcombobox.xpm +54 -0
- data/samples/widgets/art/widgets/radiobox.xpm +54 -0
- data/samples/widgets/art/widgets/scrolbar.xpm +54 -0
- data/samples/widgets/art/widgets/slider.xpm +54 -0
- data/samples/widgets/art/widgets/spinbtn.xpm +40 -0
- data/samples/widgets/art/widgets/statbmp.xpm +40 -0
- data/samples/widgets/art/widgets/statbox.xpm +54 -0
- data/samples/widgets/art/widgets/stattext.xpm +54 -0
- data/samples/widgets/art/widgets/text.xpm +54 -0
- data/samples/widgets/art/widgets/timepick.xpm +207 -0
- data/samples/widgets/art/widgets/toggle.xpm +54 -0
- data/samples/widgets/art/widgets/toucan.png +0 -0
- data/samples/widgets/bmpcombobox.rb +651 -0
- data/samples/widgets/button.rb +462 -0
- data/samples/widgets/checkbox.rb +211 -0
- data/samples/widgets/choice.rb +287 -0
- data/samples/widgets/clrpicker.rb +156 -0
- data/samples/widgets/combobox.rb +516 -0
- data/samples/widgets/datepick.rb +215 -0
- data/samples/widgets/dirctrl.rb +265 -0
- data/samples/widgets/dirpicker.rb +158 -0
- data/samples/widgets/editlbox.rb +122 -0
- data/samples/widgets/filectrl.rb +216 -0
- data/samples/widgets/filepicker.rb +214 -0
- data/samples/widgets/fontpicker.rb +135 -0
- data/samples/widgets/gauge.rb +311 -0
- data/samples/widgets/headerctrl.rb +236 -0
- data/samples/widgets/hyperlink.rb +203 -0
- data/samples/widgets/itemcontainer.rb +185 -0
- data/samples/widgets/listbox.rb +473 -0
- data/samples/widgets/notebook.rb +488 -0
- data/samples/widgets/odcombobox.rb +608 -0
- data/samples/widgets/radiobox.rb +328 -0
- data/samples/widgets/searchctrl.rb +159 -0
- data/samples/widgets/slider.rb +594 -0
- data/samples/widgets/spinbtn.rb +443 -0
- data/samples/widgets/statbmp.rb +130 -0
- data/samples/widgets/static.rb +436 -0
- data/samples/widgets/textctrl.rb +700 -0
- data/samples/widgets/timepick.rb +148 -0
- data/samples/widgets/tn_widgets.png +0 -0
- data/samples/widgets/toggle.rb +385 -0
- data/samples/widgets/widgets.rb +1229 -0
- data/samples/xrc/custom_xrc_sample.rb +47 -41
- data/samples/xrc/xrc_sample.rb +53 -47
- data/tests/test_config.rb +207 -42
- data/tests/test_event_handling.rb +52 -34
- data/tests/test_events.rb +7 -0
- data/tests/test_item_data.rb +24 -0
- data/tests/test_persistence.rb +142 -0
- data/tests/test_sizer.rb +44 -1
- data/tests/test_validators.rb +805 -0
- metadata +109 -138
- data/lib/wx/core/choice.rb +0 -14
- data/lib/wx/core/combo_ctrl.rb +0 -110
- data/rakelib/lib/typemap/grid_client_data.rb +0 -58
- data/samples/bigdemo/About.rbw +0 -39
- data/samples/bigdemo/ColorPanel.rbw +0 -23
- data/samples/bigdemo/GridSimple.rbw +0 -78
- data/samples/bigdemo/MDIDemo.rbw +0 -57
- data/samples/bigdemo/PopupMenu.rbw +0 -146
- data/samples/bigdemo/ShapedWindow.rbw +0 -128
- data/samples/bigdemo/Sizers.rbw +0 -541
- data/samples/bigdemo/bigdemo.rb +0 -817
- data/samples/bigdemo/demoTemplate.rbw +0 -33
- data/samples/bigdemo/helpfile.htb +0 -0
- data/samples/bigdemo/icons/Test 015.jpg +0 -0
- data/samples/bigdemo/icons/Test 015.png +0 -0
- data/samples/bigdemo/icons/choice.bmp +0 -0
- data/samples/bigdemo/icons/combo.bmp +0 -0
- data/samples/bigdemo/icons/combo.xpm +0 -27
- data/samples/bigdemo/icons/copy.xpm +0 -25
- data/samples/bigdemo/icons/cut.xpm +0 -24
- data/samples/bigdemo/icons/gauge.bmp +0 -0
- data/samples/bigdemo/icons/gauge.xpm +0 -27
- data/samples/bigdemo/icons/help.xpm +0 -25
- data/samples/bigdemo/icons/list.bmp +0 -0
- data/samples/bigdemo/icons/list.xpm +0 -27
- data/samples/bigdemo/icons/mondrian.ico +0 -0
- data/samples/bigdemo/icons/mondrian.xpm +0 -44
- data/samples/bigdemo/icons/new.xpm +0 -24
- data/samples/bigdemo/icons/ogl.ico +0 -0
- data/samples/bigdemo/icons/ogl.xpm +0 -45
- data/samples/bigdemo/icons/open.xpm +0 -26
- data/samples/bigdemo/icons/paste.bmp +0 -0
- data/samples/bigdemo/icons/paste.xpm +0 -38
- data/samples/bigdemo/icons/pointy.png +0 -0
- data/samples/bigdemo/icons/preview.xpm +0 -26
- data/samples/bigdemo/icons/print.xpm +0 -26
- data/samples/bigdemo/icons/radio.bmp +0 -0
- data/samples/bigdemo/icons/radio.xpm +0 -27
- data/samples/bigdemo/icons/robert.xpm +0 -415
- data/samples/bigdemo/icons/sashtest.ico +0 -0
- data/samples/bigdemo/icons/save.xpm +0 -25
- data/samples/bigdemo/icons/smiles.bmp +0 -0
- data/samples/bigdemo/icons/smiles.xpm +0 -39
- data/samples/bigdemo/icons/smiley.ico +0 -0
- data/samples/bigdemo/icons/smiley.xpm +0 -42
- data/samples/bigdemo/icons/stattext.xpm +0 -24
- data/samples/bigdemo/icons/test2.bmp +0 -0
- data/samples/bigdemo/icons/test2.png +0 -0
- data/samples/bigdemo/icons/test2.xpm +0 -79
- data/samples/bigdemo/icons/text.bmp +0 -0
- data/samples/bigdemo/icons/text.xpm +0 -27
- data/samples/bigdemo/icons/tog1.bmp +0 -0
- data/samples/bigdemo/icons/tog1.xpm +0 -38
- data/samples/bigdemo/icons/tog2.bmp +0 -0
- data/samples/bigdemo/icons/tog2.xpm +0 -38
- data/samples/bigdemo/icons/wxruby-128x128.png +0 -0
- data/samples/bigdemo/icons/wxwin.ico +0 -0
- data/samples/bigdemo/icons/wxwin16x16.png +0 -0
- data/samples/bigdemo/icons/wxwin16x16.xpm +0 -25
- data/samples/bigdemo/icons/wxwin32x32.png +0 -0
- data/samples/bigdemo/icons/wxwin48x48.png +0 -0
- data/samples/bigdemo/run.rb +0 -98
- data/samples/bigdemo/tips.txt +0 -7
- data/samples/bigdemo/utils.rb +0 -20
- data/samples/bigdemo/wxArtProvider.rbw +0 -282
- data/samples/bigdemo/wxBitmapButton.rbw +0 -65
- data/samples/bigdemo/wxButton.rbw +0 -64
- data/samples/bigdemo/wxCalendarCtrl.rbw +0 -59
- data/samples/bigdemo/wxCheckBox.rbw +0 -50
- data/samples/bigdemo/wxCheckListBox.rbw +0 -65
- data/samples/bigdemo/wxChoice.rbw +0 -47
- data/samples/bigdemo/wxChoicebook.rbw +0 -78
- data/samples/bigdemo/wxColourDialog.rbw +0 -33
- data/samples/bigdemo/wxComboBox.rbw +0 -77
- data/samples/bigdemo/wxCursor.rbw +0 -136
- data/samples/bigdemo/wxDialog.rbw +0 -74
- data/samples/bigdemo/wxDirDialog.rbw +0 -29
- data/samples/bigdemo/wxDragImage.rbw +0 -70
- data/samples/bigdemo/wxFileDialog.rbw +0 -37
- data/samples/bigdemo/wxFileDialog_Save.rbw +0 -35
- data/samples/bigdemo/wxFindReplaceDialog.rbw +0 -82
- data/samples/bigdemo/wxFontDialog.rbw +0 -200
- data/samples/bigdemo/wxFrame.rbw +0 -53
- data/samples/bigdemo/wxGauge.rbw +0 -65
- data/samples/bigdemo/wxGenericDirCtrl.rbw +0 -74
- data/samples/bigdemo/wxGrid.rbw +0 -66
- data/samples/bigdemo/wxHtmlHelpController.rbw +0 -52
- data/samples/bigdemo/wxListBox.rbw +0 -140
- data/samples/bigdemo/wxListCtrl_virtual.rbw +0 -112
- data/samples/bigdemo/wxMDIWindows.rbw +0 -50
- data/samples/bigdemo/wxMenu.rbw +0 -247
- data/samples/bigdemo/wxMessageDialog.rbw +0 -27
- data/samples/bigdemo/wxMiniFrame.rbw +0 -70
- data/samples/bigdemo/wxMultipleChoiceDialog.rbw +0 -29
- data/samples/bigdemo/wxNotebook.rbw +0 -136
- data/samples/bigdemo/wxProgressDialog.rbw +0 -43
- data/samples/bigdemo/wxRadioBox.rbw +0 -72
- data/samples/bigdemo/wxRadioButton.rbw +0 -125
- data/samples/bigdemo/wxSashWindow.rbw +0 -141
- data/samples/bigdemo/wxScrolledMessageDialog.rbw +0 -57
- data/samples/bigdemo/wxScrolledWindow.rbw +0 -199
- data/samples/bigdemo/wxSingleChoiceDialog.rbw +0 -33
- data/samples/bigdemo/wxSlider.rbw +0 -42
- data/samples/bigdemo/wxSpinButton.rbw +0 -50
- data/samples/bigdemo/wxSpinCtrl.rbw +0 -51
- data/samples/bigdemo/wxSplitterWindow.rbw +0 -63
- data/samples/bigdemo/wxStaticBitmap.rbw +0 -47
- data/samples/bigdemo/wxStaticText.rbw +0 -55
- data/samples/bigdemo/wxStatusBar.rbw +0 -126
- data/samples/bigdemo/wxTextCtrl.rbw +0 -149
- data/samples/bigdemo/wxTextEntryDialog.rbw +0 -31
- data/samples/bigdemo/wxToggleButton.rbw +0 -49
- data/samples/bigdemo/wxToolBar.rbw +0 -131
- data/samples/bigdemo/wxTreeCtrl.rbw +0 -191
- data/samples/caret/caret.rb +0 -298
- data/samples/caret/mondrian.xpm +0 -44
- data/samples/controls/books.rb +0 -189
- data/samples/controls/choice.xpm +0 -27
- data/samples/controls/combo.xpm +0 -27
- data/samples/controls/controls.rb +0 -1099
- data/samples/controls/gauge.xpm +0 -27
- data/samples/controls/list.xpm +0 -27
- data/samples/controls/mondrian.ico +0 -0
- data/samples/controls/mondrian.xpm +0 -44
- data/samples/controls/radio.xpm +0 -27
- data/samples/controls/stattext.xpm +0 -24
- data/samples/controls/test2.bmp +0 -0
- data/samples/controls/text.xpm +0 -27
- data/samples/controls/tn_books.png +0 -0
- data/samples/controls/tn_controls.png +0 -0
- data/samples/etc/choice.rb +0 -87
- data/samples/etc/tn_choice.png +0 -0
- data/samples/text/mondrian.ico +0 -0
- data/samples/text/mondrian.xpm +0 -44
- /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
|