wxruby3 0.9.0.pre.rc.3 → 0.9.0
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.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/ext/mkrf_conf_srcgem.rb +4 -1
- data/ext/wxruby3/include/wxruby-Config.h +953 -0
- data/ext/wxruby3/include/wxruby-ScaledDC.h +4 -1
- data/ext/wxruby3/include/wxruby-runtime.h +10 -1
- data/ext/wxruby3/swig/RubyStockObjects.i +5 -3
- data/ext/wxruby3/swig/common.i +8 -3
- data/ext/wxruby3/swig/mark_free_impl.i +6 -4
- data/ext/wxruby3/swig/memory_management.i +5 -3
- data/ext/wxruby3/swig/typedefs.i +5 -3
- data/ext/wxruby3/swig/wx.i +5 -0
- data/ext/wxruby3/swig/wx.rc +4 -2
- data/lib/wx/accessors.rb +10 -2
- data/lib/wx/aui/auifloatframe.rb +20 -0
- data/lib/wx/aui/auimanager.rb +3 -0
- data/lib/wx/aui/auinotebook.rb +17 -0
- data/lib/wx/aui/require.rb +5 -1
- data/lib/wx/aui.rb +4 -1
- data/lib/wx/core/acceleratortable.rb +8 -0
- data/lib/wx/core/animation.rb +8 -0
- data/lib/wx/core/app.rb +8 -0
- data/lib/wx/core/array_ext.rb +7 -0
- data/lib/wx/core/art_locator.rb +7 -0
- data/lib/wx/core/artprovider.rb +9 -0
- data/lib/wx/core/bitmap.rb +16 -4
- data/lib/wx/core/bitmap_combobox.rb +7 -0
- data/lib/wx/core/brush.rb +7 -0
- data/lib/wx/core/busycursor.rb +9 -0
- data/lib/wx/core/choice.rb +7 -0
- data/lib/wx/core/choicedlg.rb +7 -0
- data/lib/wx/core/clientdc.rb +9 -0
- data/lib/wx/core/clipboard.rb +8 -0
- data/lib/wx/core/collapsible_pane.rb +8 -1
- data/lib/wx/core/colour.rb +8 -0
- data/lib/wx/core/combo_ctrl.rb +110 -0
- data/lib/wx/core/combobox.rb +7 -0
- data/lib/wx/core/config.rb +303 -0
- data/lib/wx/core/controlwithitems.rb +12 -1
- data/lib/wx/core/cursor.rb +14 -4
- data/lib/wx/core/data_object.rb +7 -0
- data/lib/wx/core/dataformat.rb +9 -0
- data/lib/wx/core/datetime.rb +14 -0
- data/lib/wx/core/dc.rb +7 -0
- data/lib/wx/core/dialog.rb +18 -1
- data/lib/wx/core/enum.rb +7 -0
- data/lib/wx/core/event.rb +7 -0
- data/lib/wx/core/event_blocker.rb +7 -0
- data/lib/wx/core/event_loop.rb +7 -0
- data/lib/wx/core/evthandler.rb +8 -0
- data/lib/wx/core/ext.rb +7 -0
- data/lib/wx/core/file_dialog.rb +23 -0
- data/lib/wx/core/find_replace_dialog.rb +7 -0
- data/lib/wx/core/functions.rb +8 -0
- data/lib/wx/core/gauge.rb +10 -1
- data/lib/wx/core/genericdirctrl.rb +9 -0
- data/lib/wx/core/hboxsizer.rb +16 -0
- data/lib/wx/core/helpcontroller.rb +8 -0
- data/lib/wx/core/helpcontrollerhelpprovider.rb +9 -0
- data/lib/wx/core/helpprovider.rb +10 -1
- data/lib/wx/core/icon.rb +17 -6
- data/lib/wx/core/id_helper.rb +7 -0
- data/lib/wx/core/image.rb +16 -4
- data/lib/wx/core/imagelist.rb +8 -1
- data/lib/wx/core/listbox.rb +7 -0
- data/lib/wx/core/listctrl.rb +9 -0
- data/lib/wx/core/locale.rb +8 -0
- data/lib/wx/core/log.rb +24 -0
- data/lib/wx/core/menu.rb +9 -0
- data/lib/wx/core/menu_bar.rb +7 -0
- data/lib/wx/core/menuitem.rb +9 -0
- data/lib/wx/core/notebook.rb +9 -0
- data/lib/wx/core/object.rb +9 -0
- data/lib/wx/core/paintdc.rb +7 -0
- data/lib/wx/core/pen.rb +7 -0
- data/lib/wx/core/pen_info.rb +7 -0
- data/lib/wx/core/platform_info.rb +7 -0
- data/lib/wx/core/point.rb +8 -0
- data/lib/wx/core/real_point.rb +8 -0
- data/lib/wx/core/rect.rb +9 -0
- data/lib/wx/core/region_iterator.rb +7 -0
- data/lib/wx/core/simplehelpprovider.rb +9 -0
- data/lib/wx/core/size.rb +8 -0
- data/lib/wx/core/sizer.rb +9 -0
- data/lib/wx/core/splash_screen.rb +22 -2
- data/lib/wx/core/text_entry.rb +7 -0
- data/lib/wx/core/textctrl.rb +86 -5
- data/lib/wx/core/timer.rb +9 -0
- data/lib/wx/core/toolbar.rb +9 -0
- data/lib/wx/core/toolbartool.rb +8 -0
- data/lib/wx/core/treectrl.rb +9 -0
- data/lib/wx/core/v_list_box.rb +7 -0
- data/lib/wx/core/validator.rb +7 -0
- data/lib/wx/core/variant.rb +7 -0
- data/lib/wx/core/vboxsizer.rb +16 -0
- data/lib/wx/core/window.rb +8 -0
- data/lib/wx/core/window_update_locker.rb +9 -0
- data/lib/wx/core/xmlresource.rb +8 -0
- data/lib/wx/core.rb +4 -1
- data/lib/wx/doc/app.rb +7 -1
- data/lib/wx/doc/array_ext.rb +6 -0
- data/lib/wx/doc/art_locator.rb +7 -0
- data/lib/wx/doc/aui/auimanager.rb +6 -0
- data/lib/wx/doc/aui/auinotebook.rb +6 -0
- data/lib/wx/doc/bitmap.rb +12 -4
- data/lib/wx/doc/brush.rb +6 -0
- data/lib/wx/doc/busy_info.rb +6 -0
- data/lib/wx/doc/client_dc.rb +6 -0
- data/lib/wx/doc/clipboard.rb +6 -0
- data/lib/wx/doc/colour_dialog.rb +6 -0
- data/lib/wx/doc/config.rb +190 -0
- data/lib/wx/doc/const.rb +7 -0
- data/lib/wx/doc/controlwithitems.rb +6 -0
- data/lib/wx/doc/core.rb +6 -0
- data/lib/wx/doc/cursor.rb +13 -5
- data/lib/wx/doc/data_object.rb +6 -0
- data/lib/wx/doc/datetime.rb +16 -0
- data/lib/wx/doc/dc.rb +6 -0
- data/lib/wx/doc/enum.rb +8 -1
- data/lib/wx/doc/event.rb +12 -0
- data/lib/wx/doc/event_blocker.rb +6 -0
- data/lib/wx/doc/event_loop.rb +6 -0
- data/lib/wx/doc/events.rb +6 -0
- data/lib/wx/doc/evthandler.rb +8 -0
- data/lib/wx/doc/extra/01_packages.md +52 -51
- data/lib/wx/doc/extra/05_event-handling.md +37 -12
- data/lib/wx/doc/extra/06_geometry.md +5 -5
- data/lib/wx/doc/extra/07_colour_and_font.md +2 -2
- data/lib/wx/doc/extra/09_exceptions.md +1 -1
- data/lib/wx/doc/extra/10_art.md +18 -12
- data/lib/wx/doc/extra/11_drawing_and_dc.md +4 -4
- data/lib/wx/doc/font.rb +6 -0
- data/lib/wx/doc/font_data.rb +16 -0
- data/lib/wx/doc/functions.rb +9 -1
- data/lib/wx/doc/gc_dc.rb +6 -0
- data/lib/wx/doc/gdi_common.rb +8 -1
- data/lib/wx/doc/graphics_context.rb +59 -39
- data/lib/wx/doc/grid/grid.rb +16 -1
- data/lib/wx/doc/hboxsizer.rb +33 -0
- data/lib/wx/doc/help_controller.rb +6 -0
- data/lib/wx/doc/html/html_help_controller.rb +6 -0
- data/lib/wx/doc/icon.rb +13 -5
- data/lib/wx/doc/id_helper.rb +6 -0
- data/lib/wx/doc/image.rb +12 -4
- data/lib/wx/doc/list_ctrl.rb +6 -0
- data/lib/wx/doc/log.rb +17 -0
- data/lib/wx/doc/memory_dc.rb +6 -0
- data/lib/wx/doc/mirror_dc.rb +6 -0
- data/lib/wx/doc/pen.rb +6 -0
- data/lib/wx/doc/pg/events.rb +6 -0
- data/lib/wx/doc/pg/pg_property.rb +17 -0
- data/lib/wx/doc/pg/pgeditor.rb +6 -0
- data/lib/wx/doc/pg/property_grid.rb +6 -0
- data/lib/wx/doc/pg/property_grid_interface.rb +6 -0
- data/lib/wx/doc/progress_dialog.rb +6 -0
- data/lib/wx/doc/prt/page_setup_dialog.rb +6 -0
- data/lib/wx/doc/prt/print_data.rb +6 -0
- data/lib/wx/doc/prt/print_dialog.rb +6 -0
- data/lib/wx/doc/prt/printer.rb +6 -0
- data/lib/wx/doc/prt/printer_dc.rb +6 -0
- data/lib/wx/doc/radio_box.rb +6 -0
- data/lib/wx/doc/rbn/ribbon_bar.rb +6 -0
- data/lib/wx/doc/rbn/ribbon_button_bar.rb +6 -0
- data/lib/wx/doc/rbn/ribbon_gallery.rb +6 -0
- data/lib/wx/doc/rbn/ribbon_tool_bar.rb +6 -0
- data/lib/wx/doc/region_iterator.rb +6 -0
- data/lib/wx/doc/rtc/richtext_buffer.rb +28 -0
- data/lib/wx/doc/rtc/richtext_formatting_dialog.rb +68 -0
- data/lib/wx/doc/rtc/richtext_printing.rb +6 -0
- data/lib/wx/doc/rtc/richtext_style_sheet.rb +20 -0
- data/lib/wx/doc/scaled_dc.rb +6 -0
- data/lib/wx/doc/screen_dc.rb +6 -0
- data/lib/wx/doc/stock_objects.rb +6 -0
- data/lib/wx/doc/stream.rb +6 -0
- data/lib/wx/doc/svg_file_dc.rb +6 -0
- data/lib/wx/doc/system_settings.rb +6 -0
- data/lib/wx/doc/text_validator.rb +6 -0
- data/lib/wx/doc/textctrl.rb +89 -0
- data/lib/wx/doc/tree_event.rb +20 -0
- data/lib/wx/doc/treebook.rb +6 -0
- data/lib/wx/doc/v_list_box.rb +6 -0
- data/lib/wx/doc/variant.rb +6 -0
- data/lib/wx/doc/vboxsizer.rb +33 -0
- data/lib/wx/doc/window.rb +6 -0
- data/lib/wx/doc/window_disabler.rb +6 -0
- data/lib/wx/doc/xml_resource.rb +8 -0
- data/lib/wx/global_const.rb +4 -1
- data/lib/wx/grid/grid.rb +23 -3
- data/lib/wx/grid/keyword_defs.rb +8 -1
- data/lib/wx/grid/require.rb +4 -1
- data/lib/wx/grid.rb +4 -1
- data/lib/wx/helpers.rb +8 -1
- data/lib/wx/html/htmlhelpcontroller.rb +29 -3
- data/lib/wx/html/htmlwindow.rb +23 -12
- data/lib/wx/html/keyword_defs.rb +8 -1
- data/lib/wx/html/require.rb +4 -1
- data/lib/wx/html/simple_html_listbox.rb +3 -0
- data/lib/wx/html.rb +4 -1
- data/lib/wx/keyword_ctors.rb +22 -3
- data/lib/wx/keyword_defs.rb +55 -3
- data/lib/wx/pg/events.rb +4 -1
- data/lib/wx/pg/keyword_defs.rb +8 -1
- data/lib/wx/pg/pg_editor.rb +3 -0
- data/lib/wx/pg/pg_properties.rb +4 -1
- data/lib/wx/pg/pg_property.rb +18 -5
- data/lib/wx/pg/property_grid.rb +4 -1
- data/lib/wx/pg/property_grid_interface.rb +3 -0
- data/lib/wx/pg/require.rb +4 -1
- data/lib/wx/pg.rb +4 -1
- data/lib/wx/prt/keyword_defs.rb +8 -1
- data/lib/wx/prt/page_setup_dialog.rb +3 -0
- data/lib/wx/prt/previewframe.rb +5 -0
- data/lib/wx/prt/require.rb +4 -1
- data/lib/wx/prt.rb +4 -1
- data/lib/wx/rbn/events.rb +4 -1
- data/lib/wx/rbn/keyword_defs.rb +8 -1
- data/lib/wx/rbn/require.rb +5 -1
- data/lib/wx/rbn/ribbon_art_provider.rb +3 -1
- data/lib/wx/rbn/ribbon_bar.rb +3 -0
- data/lib/wx/rbn/ribbon_button_bar.rb +3 -0
- data/lib/wx/rbn/ribbon_control.rb +3 -0
- data/lib/wx/rbn/ribbon_gallery.rb +10 -0
- data/lib/wx/rbn/ribbon_page.rb +3 -0
- data/lib/wx/rbn/ribbon_panel.rb +3 -0
- data/lib/wx/rbn/ribbon_tool_bar.rb +3 -0
- data/lib/wx/rbn.rb +4 -1
- data/lib/wx/rtc/ext.rb +4 -1
- data/lib/wx/rtc/keyword_defs.rb +18 -7
- data/lib/wx/rtc/require.rb +8 -1
- data/lib/wx/rtc/richtext_buffer.rb +36 -0
- data/lib/wx/rtc/richtext_formatting_dialog.rb +88 -0
- data/lib/wx/rtc/richtext_style_organiser_dialog.rb +46 -0
- data/lib/wx/rtc/symbol_picker_dialog.rb +47 -0
- data/lib/wx/rtc.rb +5 -1
- data/lib/wx/stc/keyword_defs.rb +8 -1
- data/lib/wx/stc/require.rb +4 -1
- data/lib/wx/stc.rb +4 -1
- data/lib/wx/version.rb +5 -1
- data/lib/wx/wxruby/base.rb +4 -1
- data/lib/wx/wxruby/cmd/sampler.rb +4 -1
- data/lib/wx/wxruby/cmd/test.rb +4 -1
- data/lib/wx.rb +4 -1
- data/rakelib/build.rake +4 -1
- data/rakelib/build.rb +4 -1
- data/rakelib/config.rake +4 -1
- data/rakelib/configure.rb +4 -1
- data/rakelib/doc.rake +4 -1
- data/rakelib/doc.rb +5 -1
- data/rakelib/install.rake +4 -1
- data/rakelib/install.rb +4 -1
- data/rakelib/lib/config/cygwin.rb +4 -1
- data/rakelib/lib/config/linux.rb +4 -1
- data/rakelib/lib/config/macosx.rb +5 -2
- data/rakelib/lib/config/mingw.rb +4 -1
- data/rakelib/lib/config/netbsd.rb +4 -1
- data/rakelib/lib/config/unixish.rb +10 -7
- data/rakelib/lib/config.rb +7 -2
- data/rakelib/lib/core/include/enum.inc +4 -1
- data/rakelib/lib/core/include/funcall.inc +10 -64
- data/rakelib/lib/core/include/init.inc +3 -0
- data/rakelib/lib/core/mapping.rb +26 -46
- data/rakelib/lib/core/package.rb +17 -3
- data/rakelib/lib/core/parameter.rb +4 -1
- data/rakelib/lib/core/spec.rb +14 -8
- data/rakelib/lib/core/spec_helper.rb +32 -9
- data/rakelib/lib/director/about_dialog_info.rb +4 -1
- data/rakelib/lib/director/accelerator.rb +7 -2
- data/rakelib/lib/director/animation.rb +4 -1
- data/rakelib/lib/director/animation_ctrl.rb +4 -1
- data/rakelib/lib/director/any_button.rb +5 -2
- data/rakelib/lib/director/app.rb +16 -2
- data/rakelib/lib/director/app_traits.rb +71 -0
- data/rakelib/lib/director/art_provider.rb +4 -1
- data/rakelib/lib/director/aui_dock_art.rb +4 -1
- data/rakelib/lib/director/aui_floating_frame.rb +4 -1
- data/rakelib/lib/director/aui_manager.rb +12 -5
- data/rakelib/lib/director/aui_manager_event.rb +4 -1
- data/rakelib/lib/director/aui_mdi_child_frame.rb +25 -1
- data/rakelib/lib/director/aui_mdi_client_window.rb +4 -1
- data/rakelib/lib/director/aui_mdi_parent_frame.rb +4 -1
- data/rakelib/lib/director/aui_notebook.rb +12 -1
- data/rakelib/lib/director/aui_notebook_event.rb +4 -1
- data/rakelib/lib/director/aui_pane_info.rb +4 -1
- data/rakelib/lib/director/aui_tab_art.rb +52 -1
- data/rakelib/lib/director/aui_tab_ctrl.rb +14 -1
- data/rakelib/lib/director/aui_toolbar.rb +6 -3
- data/rakelib/lib/director/aui_toolbar_art.rb +52 -1
- data/rakelib/lib/director/aui_toolbar_event.rb +4 -1
- data/rakelib/lib/director/aui_toolbar_item.rb +4 -1
- data/rakelib/lib/director/banner_window.rb +26 -0
- data/rakelib/lib/director/bitmap.rb +11 -2
- data/rakelib/lib/director/bitmap_combobox.rb +5 -1
- data/rakelib/lib/director/book_ctrls.rb +13 -3
- data/rakelib/lib/director/brush.rb +4 -1
- data/rakelib/lib/director/busy_info.rb +4 -1
- data/rakelib/lib/director/button.rb +4 -1
- data/rakelib/lib/director/calendar_ctrl.rb +4 -1
- data/rakelib/lib/director/calendar_date_attr.rb +4 -1
- data/rakelib/lib/director/caret.rb +4 -1
- data/rakelib/lib/director/check_listbox.rb +4 -1
- data/rakelib/lib/director/choice.rb +4 -1
- data/rakelib/lib/director/clipboard.rb +4 -1
- data/rakelib/lib/director/collapsible_pane.rb +4 -1
- data/rakelib/lib/director/collapsible_pane_event.rb +4 -1
- data/rakelib/lib/director/colour.rb +9 -1
- data/rakelib/lib/director/colour_picker_ctrl.rb +4 -1
- data/rakelib/lib/director/combobox.rb +4 -1
- data/rakelib/lib/director/comboctrl.rb +94 -0
- data/rakelib/lib/director/config_base.rb +135 -0
- data/rakelib/lib/director/context_help_button.rb +4 -1
- data/rakelib/lib/director/control.rb +4 -1
- data/rakelib/lib/director/ctrl_with_items.rb +5 -1
- data/rakelib/lib/director/cursor.rb +6 -2
- data/rakelib/lib/director/data_format.rb +4 -1
- data/rakelib/lib/director/data_object.rb +4 -1
- data/rakelib/lib/director/data_object_simple_base.rb +4 -1
- data/rakelib/lib/director/date_event.rb +9 -2
- data/rakelib/lib/director/date_picker_ctrl.rb +4 -1
- data/rakelib/lib/director/dc.rb +19 -1
- data/rakelib/lib/director/defs.rb +4 -1
- data/rakelib/lib/director/derived_dc.rb +27 -20
- data/rakelib/lib/director/dialog.rb +24 -3
- data/rakelib/lib/director/dir_filterlist_ctrl.rb +4 -1
- data/rakelib/lib/director/dir_picker_ctrl.rb +4 -1
- data/rakelib/lib/director/drag_image.rb +9 -2
- data/rakelib/lib/director/dragdrop.rb +4 -1
- data/rakelib/lib/director/editable_listbox.rb +4 -1
- data/rakelib/lib/director/event.rb +11 -3
- data/rakelib/lib/director/event_blocker.rb +4 -1
- data/rakelib/lib/director/event_filter.rb +4 -1
- data/rakelib/lib/director/event_handler.rb +28 -11
- data/rakelib/lib/director/event_loop.rb +4 -1
- data/rakelib/lib/director/events.rb +5 -2
- data/rakelib/lib/director/file_dialog_custom_control.rb +28 -0
- data/rakelib/lib/director/file_dialog_customize_hook.rb +28 -0
- data/rakelib/lib/director/file_picker_ctrl.rb +4 -1
- data/rakelib/lib/director/file_system.rb +45 -0
- data/rakelib/lib/director/find_dialog_event.rb +4 -1
- data/rakelib/lib/director/find_replace_data.rb +4 -1
- data/rakelib/lib/director/font.rb +7 -3
- data/rakelib/lib/director/font_data.rb +9 -1
- data/rakelib/lib/director/font_picker_ctrl.rb +4 -1
- data/rakelib/lib/director/frame.rb +45 -33
- data/rakelib/lib/director/fs_file.rb +52 -1
- data/rakelib/lib/director/functions.rb +11 -5
- data/rakelib/lib/director/gdi_object.rb +4 -1
- data/rakelib/lib/director/gdicommon.rb +14 -9
- data/rakelib/lib/director/generic_dirctrl.rb +4 -1
- data/rakelib/lib/director/graphics_context.rb +113 -18
- data/rakelib/lib/director/graphics_object.rb +13 -2
- data/rakelib/lib/director/grid_cell_attr.rb +28 -4
- data/rakelib/lib/director/grid_cell_editor.rb +22 -5
- data/rakelib/lib/director/grid_cell_renderer.rb +16 -3
- data/rakelib/lib/director/grid_ctrl.rb +146 -5
- data/rakelib/lib/director/grid_range_select_event.rb +4 -1
- data/rakelib/lib/director/grid_table_base.rb +6 -1
- data/rakelib/lib/director/grid_table_message.rb +4 -1
- data/rakelib/lib/director/header_ctrl.rb +37 -0
- data/rakelib/lib/director/help_controller.rb +13 -6
- data/rakelib/lib/director/help_provider.rb +4 -1
- data/rakelib/lib/director/html_cell.rb +10 -3
- data/rakelib/lib/director/html_data_object.rb +4 -1
- data/rakelib/lib/director/html_easy_printing.rb +4 -1
- data/rakelib/lib/director/html_event.rb +4 -1
- data/rakelib/lib/director/html_help_data.rb +4 -1
- data/rakelib/lib/director/html_help_window.rb +30 -0
- data/rakelib/lib/director/html_listbox.rb +4 -1
- data/rakelib/lib/director/html_printout.rb +6 -1
- data/rakelib/lib/director/html_window.rb +10 -8
- data/rakelib/lib/director/hyperlink_ctrl.rb +32 -0
- data/rakelib/lib/director/hyperlink_event.rb +4 -1
- data/rakelib/lib/director/icon.rb +4 -1
- data/rakelib/lib/director/image.rb +26 -3
- data/rakelib/lib/director/image_list.rb +5 -1
- data/rakelib/lib/director/info_bar.rb +26 -0
- data/rakelib/lib/director/list_ctrl.rb +39 -7
- data/rakelib/lib/director/listbox.rb +4 -1
- data/rakelib/lib/director/locale.rb +7 -4
- data/rakelib/lib/director/log.rb +51 -6
- data/rakelib/lib/director/mdi_frame.rb +4 -1
- data/rakelib/lib/director/media_ctrl.rb +4 -1
- data/rakelib/lib/director/menu.rb +16 -3
- data/rakelib/lib/director/menu_bar.rb +13 -2
- data/rakelib/lib/director/menu_item.rb +6 -6
- data/rakelib/lib/director/mouse_state.rb +5 -2
- data/rakelib/lib/director/numeric_property_validator.rb +4 -1
- data/rakelib/lib/director/object.rb +5 -2
- data/rakelib/lib/director/page_setup_dialog.rb +4 -1
- data/rakelib/lib/director/palette.rb +54 -2
- data/rakelib/lib/director/panel.rb +4 -1
- data/rakelib/lib/director/pen.rb +5 -2
- data/rakelib/lib/director/pgarray_editor_dialog.rb +4 -1
- data/rakelib/lib/director/pgcell.rb +4 -1
- data/rakelib/lib/director/pgeditor.rb +4 -1
- data/rakelib/lib/director/pgmulti_button.rb +4 -1
- data/rakelib/lib/director/pgproperties.rb +4 -1
- data/rakelib/lib/director/pgproperty.rb +42 -3
- data/rakelib/lib/director/pgvalidation_info.rb +9 -1
- data/rakelib/lib/director/pickerbase.rb +4 -1
- data/rakelib/lib/director/platform_info.rb +9 -1
- data/rakelib/lib/director/popup_window.rb +14 -1
- data/rakelib/lib/director/preview_frame.rb +5 -2
- data/rakelib/lib/director/print_data.rb +4 -1
- data/rakelib/lib/director/print_dialog.rb +4 -1
- data/rakelib/lib/director/printer.rb +14 -6
- data/rakelib/lib/director/property_grid.rb +30 -1
- data/rakelib/lib/director/property_grid_event.rb +11 -1
- data/rakelib/lib/director/property_grid_interface.rb +20 -6
- data/rakelib/lib/director/property_grid_manager.rb +4 -1
- data/rakelib/lib/director/property_grid_page.rb +4 -1
- data/rakelib/lib/director/property_grid_page_state.rb +4 -1
- data/rakelib/lib/director/radio_box.rb +4 -1
- data/rakelib/lib/director/rearrange_list.rb +36 -0
- data/rakelib/lib/director/region.rb +5 -1
- data/rakelib/lib/director/region_iterator.rb +4 -1
- data/rakelib/lib/director/ribbon_art_provider.rb +9 -1
- data/rakelib/lib/director/ribbon_bar.rb +4 -1
- data/rakelib/lib/director/ribbon_bar_event.rb +4 -1
- data/rakelib/lib/director/ribbon_button_bar.rb +4 -1
- data/rakelib/lib/director/ribbon_button_bar_event.rb +4 -1
- data/rakelib/lib/director/ribbon_ctrl.rb +4 -1
- data/rakelib/lib/director/ribbon_gallery.rb +8 -3
- data/rakelib/lib/director/ribbon_gallery_event.rb +4 -1
- data/rakelib/lib/director/ribbon_page.rb +4 -1
- data/rakelib/lib/director/ribbon_panel.rb +4 -1
- data/rakelib/lib/director/ribbon_panel_event.rb +4 -1
- data/rakelib/lib/director/ribbon_tool_bar.rb +4 -1
- data/rakelib/lib/director/ribbon_tool_bar_event.rb +4 -1
- data/rakelib/lib/director/richtext_box.rb +61 -0
- data/rakelib/lib/director/richtext_buffer.rb +219 -22
- data/rakelib/lib/director/richtext_buffer_data_object.rb +4 -1
- data/rakelib/lib/director/richtext_composite_object.rb +174 -0
- data/rakelib/lib/director/richtext_ctrl.rb +157 -4
- data/rakelib/lib/director/richtext_event.rb +4 -1
- data/rakelib/lib/director/richtext_file_handler.rb +13 -1
- data/rakelib/lib/director/richtext_formatting_dialog.rb +44 -0
- data/rakelib/lib/director/richtext_header_footer_data.rb +4 -1
- data/rakelib/lib/director/richtext_image.rb +56 -0
- data/rakelib/lib/director/richtext_object.rb +272 -0
- data/rakelib/lib/director/richtext_paragraph_layout_box.rb +178 -0
- data/rakelib/lib/director/richtext_printing.rb +4 -1
- data/rakelib/lib/director/richtext_style_listbox.rb +37 -0
- data/rakelib/lib/director/richtext_style_organiser_dialog.rb +28 -0
- data/rakelib/lib/director/sash_layout_event.rb +4 -1
- data/rakelib/lib/director/sash_layout_window.rb +4 -1
- data/rakelib/lib/director/sash_window.rb +4 -1
- data/rakelib/lib/director/scroll_bar.rb +4 -1
- data/rakelib/lib/director/scrolled_t.rb +7 -4
- data/rakelib/lib/director/searchctrl.rb +4 -1
- data/rakelib/lib/director/sizer.rb +4 -1
- data/rakelib/lib/director/sizer_item.rb +9 -3
- data/rakelib/lib/director/slider.rb +4 -1
- data/rakelib/lib/director/splash_screen.rb +4 -1
- data/rakelib/lib/director/splitter_event.rb +4 -1
- data/rakelib/lib/director/splitter_window.rb +4 -1
- data/rakelib/lib/director/static_bitmap.rb +4 -1
- data/rakelib/lib/director/static_box.rb +5 -2
- data/rakelib/lib/director/status_bar.rb +5 -1
- data/rakelib/lib/director/styled_text_ctrl.rb +14 -2
- data/rakelib/lib/director/styled_text_event.rb +4 -1
- data/rakelib/lib/director/system_options.rb +4 -1
- data/rakelib/lib/director/system_settings.rb +4 -1
- data/rakelib/lib/director/task_bar_icon.rb +4 -1
- data/rakelib/lib/director/text_attr.rb +5 -2
- data/rakelib/lib/director/text_entry.rb +4 -1
- data/rakelib/lib/director/text_validator.rb +6 -1
- data/rakelib/lib/director/textctrl.rb +32 -3
- data/rakelib/lib/director/time_picker_ctrl.rb +4 -1
- data/rakelib/lib/director/timer.rb +4 -1
- data/rakelib/lib/director/tip_provider.rb +4 -1
- data/rakelib/lib/director/toggle_button.rb +4 -1
- data/rakelib/lib/director/tool_bar.rb +20 -1
- data/rakelib/lib/director/tool_tip.rb +5 -2
- data/rakelib/lib/director/top_level_window.rb +58 -51
- data/rakelib/lib/director/tree_ctrl.rb +5 -2
- data/rakelib/lib/director/tree_event.rb +28 -10
- data/rakelib/lib/director/uiaction_simulator.rb +4 -1
- data/rakelib/lib/director/utils.rb +9 -1
- data/rakelib/lib/director/validator.rb +4 -1
- data/rakelib/lib/director/variant.rb +5 -2
- data/rakelib/lib/director/vlistbox.rb +4 -1
- data/rakelib/lib/director/vscrolled_window.rb +4 -1
- data/rakelib/lib/director/window.rb +81 -82
- data/rakelib/lib/director/window_disabler.rb +4 -1
- data/rakelib/lib/director/with_images.rb +5 -2
- data/rakelib/lib/director/wizard_page.rb +4 -1
- data/rakelib/lib/director/xml_node.rb +4 -1
- data/rakelib/lib/director/xml_resource.rb +4 -1
- data/rakelib/lib/director.rb +27 -28
- data/rakelib/lib/ext/enum_chain.rb +4 -1
- data/rakelib/lib/extractor/class.rb +8 -6
- data/rakelib/lib/extractor/enum.rb +15 -2
- data/rakelib/lib/extractor/function.rb +12 -4
- data/rakelib/lib/extractor/module.rb +4 -1
- data/rakelib/lib/extractor/variable.rb +4 -1
- data/rakelib/lib/extractor.rb +7 -2
- data/rakelib/lib/generate/analyzer.rb +31 -21
- data/rakelib/lib/generate/base.rb +4 -1
- data/rakelib/lib/generate/doc/grid_cell_attr.yaml +21 -0
- data/rakelib/lib/generate/doc/grid_ctrl.yaml +25 -0
- data/rakelib/lib/generate/doc/html_cell.yaml +11 -0
- data/rakelib/lib/generate/doc/html_help_controller.yaml +23 -0
- data/rakelib/lib/generate/doc/html_help_window.yaml +21 -0
- data/rakelib/lib/generate/doc/html_window.yaml +47 -0
- data/rakelib/lib/generate/doc/pg_editor.yaml +11 -0
- data/rakelib/lib/generate/doc/pg_multi_button.yaml +78 -0
- data/rakelib/lib/generate/doc/pg_properties.yaml +244 -0
- data/rakelib/lib/generate/doc/pg_property.yaml +188 -0
- data/rakelib/lib/generate/doc/property_grid.yaml +23 -0
- data/rakelib/lib/generate/doc/property_grid_interface.yaml +30 -0
- data/rakelib/lib/generate/doc/property_grid_manager.yaml +40 -0
- data/rakelib/lib/generate/doc/rich_text_html_handler.yaml +11 -0
- data/rakelib/lib/generate/doc/styled_text_ctrl.yaml +18 -0
- data/rakelib/lib/generate/doc/symbol_picker_dialog.yaml +40 -0
- data/rakelib/lib/generate/doc.rb +19 -3
- data/rakelib/lib/generate/interface.rb +79 -110
- data/rakelib/lib/generate/rakedep.rb +4 -1
- data/rakelib/lib/specs/interfaces.rb +45 -20
- data/rakelib/lib/streams.rb +5 -1
- data/rakelib/lib/swig_runner.rb +34 -22
- data/rakelib/lib/typemap/array_int_selections.rb +4 -1
- data/rakelib/lib/typemap/common.rb +57 -2
- data/rakelib/lib/typemap/config.rb +55 -0
- data/rakelib/lib/typemap/data_format.rb +4 -1
- data/rakelib/lib/typemap/data_object_data.rb +4 -1
- data/rakelib/lib/typemap/datetime.rb +8 -1
- data/rakelib/lib/typemap/grid_client_data.rb +4 -1
- data/rakelib/lib/typemap/grid_coords.rb +37 -7
- data/rakelib/lib/typemap/html_cell.rb +4 -1
- data/rakelib/lib/typemap/io_streams.rb +4 -1
- data/rakelib/lib/typemap/pgcell.rb +4 -1
- data/rakelib/lib/typemap/pgeditor.rb +4 -1
- data/rakelib/lib/typemap/pgprop_arg.rb +4 -1
- data/rakelib/lib/typemap/pgproperty.rb +4 -1
- data/rakelib/lib/typemap/points_list.rb +4 -1
- data/rakelib/lib/typemap/richtext.rb +185 -11
- data/rakelib/lib/typemap/tree_itemid.rb +26 -1
- data/rakelib/lib/util/string.rb +4 -1
- data/rakelib/prepost.rake +4 -1
- data/rakelib/prepost.rb +4 -1
- data/rakelib/run.rake +4 -1
- data/samples/aui/aui.rb +8 -3
- data/samples/bigdemo/bigdemo.rb +9 -2
- data/samples/bigdemo/run.rb +9 -2
- data/samples/bigdemo/utils.rb +9 -1
- data/samples/calendar/calendar.rb +9 -4
- data/samples/caret/caret.rb +8 -3
- data/samples/controls/books.rb +8 -2
- data/samples/controls/controls.rb +33 -77
- data/samples/controls/get_item_sample.rb +8 -2
- data/samples/controls/htlbox.rb +10 -3
- data/samples/dialogs/dialogs.rb +9 -4
- data/samples/dialogs/wizard.rb +8 -3
- data/samples/dragdrop/dragdrop.rb +8 -3
- data/samples/drawing/bitmap.rb +8 -3
- data/samples/drawing/bitmap_image.rb +8 -3
- data/samples/drawing/graphics_drawing.rb +44 -33
- data/samples/drawing/image_prt.rb +8 -2
- data/samples/drawing/maths_images.rb +8 -3
- data/samples/drawing/rmagic_bitmap_image.rb +8 -3
- data/samples/etc/choice.rb +8 -3
- data/samples/etc/miniframe.rb +8 -3
- data/samples/etc/sash.rb +8 -3
- data/samples/etc/scrollwin.rb +8 -3
- data/samples/etc/system_settings.rb +8 -3
- data/samples/event/activation.rb +8 -3
- data/samples/event/event.rb +8 -3
- data/samples/event/threaded.rb +8 -3
- data/samples/event/update_ui_event.rb +8 -3
- data/samples/grid/grid.rb +9 -3
- data/samples/grid/gridtablebase.rb +8 -3
- data/samples/html/html.rb +8 -3
- data/samples/mdi/mdi.rb +8 -3
- data/samples/minimal/minimal.rb +8 -3
- data/samples/minimal/nothing.rb +8 -3
- data/samples/printing/printing.rb +8 -3
- data/samples/printing/printing2.rb +8 -2
- data/samples/propgrid/propgrid.rb +4 -1
- data/samples/propgrid/propgrid_minimal.rb +4 -2
- data/samples/propgrid/sample_props.rb +4 -1
- data/samples/ribbon/ribbon.rb +4 -1
- data/samples/sampler/editor.rb +4 -1
- data/samples/sampler/ext.rb +4 -1
- data/samples/sampler/sample.rb +13 -4
- data/samples/sampler/stc_editor.rb +4 -1
- data/samples/sampler/txt_editor.rb +4 -1
- data/samples/sampler.rb +11 -3
- data/samples/splash/splash.rb +4 -2
- data/samples/text/art/richtext/alignleft.xpm +24 -0
- data/samples/text/art/richtext/alignright.xpm +24 -0
- data/samples/text/art/richtext/bold.xpm +24 -0
- data/samples/text/art/richtext/centre.xpm +24 -0
- data/samples/text/art/richtext/copy.xpm +45 -0
- data/samples/text/art/richtext/cut.xpm +47 -0
- data/samples/text/art/richtext/font.xpm +25 -0
- data/samples/text/art/richtext/idea.xpm +47 -0
- data/samples/text/art/richtext/indentless.xpm +25 -0
- data/samples/text/art/richtext/indentmore.xpm +25 -0
- data/samples/text/art/richtext/italic.xpm +25 -0
- data/samples/text/art/richtext/open.xpm +58 -0
- data/samples/text/art/richtext/paste.xpm +47 -0
- data/samples/text/art/richtext/redo.xpm +59 -0
- data/samples/text/art/richtext/save.xpm +43 -0
- data/samples/text/art/richtext/smiley.xpm +42 -0
- data/samples/text/art/richtext/underline.xpm +25 -0
- data/samples/text/art/richtext/undo.xpm +59 -0
- data/samples/text/art/richtext/zebra.xpm +409 -0
- data/samples/text/rich_textctrl.rb +8 -3
- data/samples/text/richtext.rb +1824 -0
- data/samples/text/scintilla.rb +8 -3
- data/samples/text/textctrl.rb +21 -4
- data/samples/text/tn_richtext.png +0 -0
- data/samples/text/unicode.rb +9 -4
- data/samples/treectrl/treectrl.rb +10 -5
- data/samples/xrc/custom_xrc_sample.rb +8 -3
- data/samples/xrc/xrc_sample.rb +8 -3
- data/tests/art/test_art/bitmap/wxruby-128x128.png +0 -0
- data/tests/art/test_art/bitmap/wxruby-256x256.png +0 -0
- data/tests/art/test_art/bitmap/wxruby-64x64.png +0 -0
- data/tests/lib/item_container_tests.rb +3 -0
- data/tests/lib/text_entry_tests.rb +3 -0
- data/tests/lib/wxapp_runner.rb +3 -0
- data/tests/lib/wxframe_runner.rb +81 -3
- data/tests/test_app_event_filter.rb +3 -0
- data/tests/test_app_traits.rb +33 -0
- data/tests/test_art.rb +22 -0
- data/tests/test_art_provider.rb +3 -0
- data/tests/test_aui.rb +65 -0
- data/tests/test_basic.rb +5 -1
- data/tests/test_box_sizer.rb +5 -2
- data/tests/test_clipboard.rb +3 -0
- data/tests/test_config.rb +150 -0
- data/tests/test_dc.rb +3 -0
- data/tests/test_dialog.rb +3 -0
- data/tests/test_event_handling.rb +3 -0
- data/tests/test_events.rb +3 -0
- data/tests/test_ext_controls.rb +286 -3
- data/tests/test_file_dialog.rb +55 -0
- data/tests/test_font.rb +8 -5
- data/tests/test_gdi_object.rb +3 -0
- data/tests/test_geometry.rb +4 -0
- data/tests/test_grid_sizer.rb +7 -4
- data/tests/test_intl.rb +3 -0
- data/tests/test_item_data.rb +3 -0
- data/tests/test_list_ctrl.rb +4 -1
- data/tests/test_log.rb +63 -0
- data/tests/test_proof_check.rb +52 -0
- data/tests/test_richtext.rb +204 -0
- data/tests/test_std_controls.rb +45 -35
- data/tests/test_timer.rb +3 -0
- data/tests/test_variant.rb +3 -0
- data/tests/test_window.rb +10 -8
- data/tests/testapp.rb +4 -0
- data/tests/testapp_noframe.rb +4 -0
- metadata +89 -3
- data/rakelib/lib/director/html_help_frame.rb +0 -25
|
@@ -0,0 +1,953 @@
|
|
|
1
|
+
// Copyright (c) 2023 M.J.N. Corino, The Netherlands
|
|
2
|
+
//
|
|
3
|
+
// This software is released under the MIT license.
|
|
4
|
+
|
|
5
|
+
/*
|
|
6
|
+
* WxRuby3 wxRbHashConfig class
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
#ifndef _WXRUBY_CONFIG_RB_HASH_H
|
|
10
|
+
#define _WXRUBY_CONFIG_RB_HASH_H
|
|
11
|
+
|
|
12
|
+
#include <wx/config.h>
|
|
13
|
+
#include <ruby/version.h>
|
|
14
|
+
|
|
15
|
+
VALUE rb_hash_delete (VALUE hash, VALUE key);
|
|
16
|
+
|
|
17
|
+
#if RUBY_API_VERSION_MAJOR<3 && RUBY_API_VERSION_MINOR<7
|
|
18
|
+
typedef int (*rb_foreach_func)(ANYARGS);
|
|
19
|
+
#else
|
|
20
|
+
typedef int (*rb_foreach_func)(VALUE, VALUE, VALUE);
|
|
21
|
+
#endif
|
|
22
|
+
#define FOREACH_FUNC(x) reinterpret_cast<rb_foreach_func>((void*)&(x))
|
|
23
|
+
|
|
24
|
+
inline bool rb_hash_includes(VALUE hash, VALUE key)
|
|
25
|
+
{
|
|
26
|
+
return (rb_hash_lookup2(hash, key, Qundef) != Qundef);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
struct RbCfgCounter
|
|
30
|
+
{
|
|
31
|
+
bool groups;
|
|
32
|
+
bool recursive;
|
|
33
|
+
size_t count;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
static int wxrb_CountConfig(VALUE key, VALUE value, VALUE rbCounter)
|
|
37
|
+
{
|
|
38
|
+
RbCfgCounter* counter;
|
|
39
|
+
Data_Get_Struct(rbCounter, RbCfgCounter, counter);
|
|
40
|
+
if (TYPE(value) == T_HASH)
|
|
41
|
+
{
|
|
42
|
+
if (counter->groups)
|
|
43
|
+
++counter->count;
|
|
44
|
+
if (counter->recursive)
|
|
45
|
+
rb_hash_foreach(value, FOREACH_FUNC(wxrb_CountConfig), rbCounter);
|
|
46
|
+
}
|
|
47
|
+
else
|
|
48
|
+
{
|
|
49
|
+
if (!counter->groups)
|
|
50
|
+
++counter->count;
|
|
51
|
+
}
|
|
52
|
+
return ST_CONTINUE;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
static VALUE g_cConfigBase;
|
|
56
|
+
static VALUE g_cConfig;
|
|
57
|
+
|
|
58
|
+
/*
|
|
59
|
+
* Wrapper class for Ruby Config class.
|
|
60
|
+
* CAVEAT: The implementation here is not 100% foolproof specifically for situations
|
|
61
|
+
where in between the moment a current path is set in C++ and the moment(s)
|
|
62
|
+
read/write operations are performed in C++ Ruby code gets executed that
|
|
63
|
+
mutates the underlying Hash.
|
|
64
|
+
This however currently does not happen anywhere in code and normally SHOULD
|
|
65
|
+
never happen.
|
|
66
|
+
*/
|
|
67
|
+
|
|
68
|
+
class wxRbHashConfig : public wxConfigBase
|
|
69
|
+
{
|
|
70
|
+
public:
|
|
71
|
+
static WxRuby_ID split_ID;
|
|
72
|
+
static wxString cfgSepStr;
|
|
73
|
+
static WxRuby_ID keys_ID;
|
|
74
|
+
static WxRuby_ID to_s_ID;
|
|
75
|
+
static WxRuby_ID to_i_ID;
|
|
76
|
+
static WxRuby_ID to_f_ID;
|
|
77
|
+
|
|
78
|
+
// ctor & dtor
|
|
79
|
+
wxRbHashConfig(VALUE cfgInstance, VALUE cfgHash)
|
|
80
|
+
: wxConfigBase(wxTheApp ? wxTheApp->GetAppName() : wxString())
|
|
81
|
+
, m_cfgInstance(cfgInstance)
|
|
82
|
+
, m_cfgHash(cfgHash)
|
|
83
|
+
, m_cfgGroup(cfgHash)
|
|
84
|
+
, m_cfgGroupKeys(Qnil)
|
|
85
|
+
{
|
|
86
|
+
SetRootPath();
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
virtual ~wxRbHashConfig()
|
|
90
|
+
{
|
|
91
|
+
DATA_PTR(m_cfgInstance) = 0; // make sure it never get's deleted twice
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// Get wrapped Ruby ConfigBase instance
|
|
95
|
+
VALUE GetRubyConfig() const { return m_cfgInstance; }
|
|
96
|
+
|
|
97
|
+
// implement inherited pure virtual functions
|
|
98
|
+
virtual void SetPath(const wxString& strPath) override { DoSetPath(strPath, true /* create missing components */); }
|
|
99
|
+
virtual const wxString& GetPath() const override { return m_strPath; }
|
|
100
|
+
|
|
101
|
+
virtual bool GetFirstGroup(wxString& str, long& lIndex) const override
|
|
102
|
+
{
|
|
103
|
+
lIndex = 0;
|
|
104
|
+
return GetNextGroup(str, lIndex);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
virtual bool GetNextGroup (wxString& str, long& lIndex) const override
|
|
108
|
+
{
|
|
109
|
+
if (NIL_P(m_cfgGroupKeys))
|
|
110
|
+
{
|
|
111
|
+
wxRbHashConfig* self = const_cast<wxRbHashConfig*> (this);
|
|
112
|
+
self->m_cfgGroupKeys = rb_funcall(m_cfgGroup, keys_ID(), 0);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
if (lIndex < RARRAY_LEN(m_cfgGroupKeys))
|
|
116
|
+
{
|
|
117
|
+
for (long lix=lIndex; lix < RARRAY_LEN(m_cfgGroupKeys) ;)
|
|
118
|
+
{
|
|
119
|
+
VALUE rbEntry = rb_ary_entry(m_cfgGroupKeys, lix++);
|
|
120
|
+
VALUE rbVal = rb_hash_aref(m_cfgGroup, rbEntry);
|
|
121
|
+
if (TYPE(rbVal) == T_HASH)
|
|
122
|
+
{
|
|
123
|
+
lIndex = lix;
|
|
124
|
+
str = RSTR_TO_WXSTR(rbEntry);
|
|
125
|
+
return true;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
virtual bool GetFirstEntry(wxString& str, long& lIndex) const override
|
|
133
|
+
{
|
|
134
|
+
lIndex = 0;
|
|
135
|
+
return GetNextEntry(str, lIndex);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
virtual bool GetNextEntry (wxString& str, long& lIndex) const override
|
|
139
|
+
{
|
|
140
|
+
if (NIL_P(m_cfgGroupKeys))
|
|
141
|
+
{
|
|
142
|
+
wxRbHashConfig* self = const_cast<wxRbHashConfig*> (this);
|
|
143
|
+
self->m_cfgGroupKeys = rb_funcall(m_cfgGroup, keys_ID(), 0);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
if (lIndex < RARRAY_LEN(m_cfgGroupKeys))
|
|
147
|
+
{
|
|
148
|
+
for (long lix=lIndex; lix < RARRAY_LEN(m_cfgGroupKeys) ;)
|
|
149
|
+
{
|
|
150
|
+
VALUE rbEntry = rb_ary_entry(m_cfgGroupKeys, lix++);
|
|
151
|
+
VALUE rbVal = rb_hash_aref(m_cfgGroup, rbEntry);
|
|
152
|
+
if (TYPE(rbVal) != T_HASH)
|
|
153
|
+
{
|
|
154
|
+
lIndex = lix;
|
|
155
|
+
str = RSTR_TO_WXSTR(rbEntry);
|
|
156
|
+
return true;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return false;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
virtual size_t GetNumberOfEntries(bool bRecursive = false) const override
|
|
164
|
+
{
|
|
165
|
+
RbCfgCounter counter = {false, bRecursive, 0};
|
|
166
|
+
void* ptr = &counter;
|
|
167
|
+
VALUE rbCounter = Data_Wrap_Struct(rb_cObject, 0, 0, ptr);
|
|
168
|
+
rb_hash_foreach(m_cfgGroup, FOREACH_FUNC(wxrb_CountConfig), rbCounter);
|
|
169
|
+
return counter.count;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
virtual size_t GetNumberOfGroups(bool bRecursive = false) const override
|
|
173
|
+
{
|
|
174
|
+
RbCfgCounter counter = {true, bRecursive, 0};
|
|
175
|
+
void* ptr = &counter;
|
|
176
|
+
VALUE rbCounter = Data_Wrap_Struct(rb_cObject, 0, 0, ptr);
|
|
177
|
+
rb_hash_foreach(m_cfgGroup, FOREACH_FUNC(wxrb_CountConfig), rbCounter);
|
|
178
|
+
return counter.count;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
virtual bool HasGroup(const wxString& strName) const override
|
|
182
|
+
{
|
|
183
|
+
// special case: DoSetPath("") does work as it's equivalent to DoSetPath("/")
|
|
184
|
+
// but there is no group with empty name so treat this separately
|
|
185
|
+
if ( strName.empty() )
|
|
186
|
+
return false;
|
|
187
|
+
|
|
188
|
+
const wxString pathOld = GetPath();
|
|
189
|
+
|
|
190
|
+
// path is the part before the last "/"
|
|
191
|
+
wxString path = strName.BeforeLast(wxCONFIG_PATH_SEPARATOR);
|
|
192
|
+
|
|
193
|
+
// except in the special case of "/group" when there is nothing before "/"
|
|
194
|
+
if ( path.empty() && *strName.c_str() == wxCONFIG_PATH_SEPARATOR )
|
|
195
|
+
{
|
|
196
|
+
path = wxCONFIG_PATH_SEPARATOR;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// check if the path exists as well as the group at that path
|
|
200
|
+
wxRbHashConfig *self = const_cast<wxRbHashConfig *>(this);
|
|
201
|
+
const bool rc =
|
|
202
|
+
self->DoSetPath(path, false /* don't create missing components */) &&
|
|
203
|
+
self->hasGroup(strName.AfterLast(wxCONFIG_PATH_SEPARATOR));
|
|
204
|
+
|
|
205
|
+
self->SetPath(pathOld);
|
|
206
|
+
|
|
207
|
+
return rc;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
virtual bool HasEntry(const wxString& entry) const override
|
|
211
|
+
{
|
|
212
|
+
// path is the part before the last "/"
|
|
213
|
+
wxString path = entry.BeforeLast(wxCONFIG_PATH_SEPARATOR);
|
|
214
|
+
|
|
215
|
+
// except in the special case of "/keyname" when there is nothing before "/"
|
|
216
|
+
if ( path.empty() && *entry.c_str() == wxCONFIG_PATH_SEPARATOR )
|
|
217
|
+
{
|
|
218
|
+
path = wxCONFIG_PATH_SEPARATOR;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// change to the path of the entry if necessary and remember the old path
|
|
222
|
+
// to restore it later
|
|
223
|
+
wxString pathOld;
|
|
224
|
+
wxRbHashConfig * const self = const_cast<wxRbHashConfig *>(this);
|
|
225
|
+
if ( !path.empty() )
|
|
226
|
+
{
|
|
227
|
+
pathOld = GetPath();
|
|
228
|
+
if ( pathOld.empty() )
|
|
229
|
+
pathOld = wxCONFIG_PATH_SEPARATOR;
|
|
230
|
+
|
|
231
|
+
if ( !self->DoSetPath(path, false /* don't create if doesn't exist */) )
|
|
232
|
+
{
|
|
233
|
+
return false;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// check if the entry exists in this group
|
|
238
|
+
const bool exists = hasEntry(entry.AfterLast(wxCONFIG_PATH_SEPARATOR));
|
|
239
|
+
|
|
240
|
+
// restore the old path if we changed it above
|
|
241
|
+
if ( !pathOld.empty() )
|
|
242
|
+
{
|
|
243
|
+
self->SetPath(pathOld);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
return exists;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
virtual EntryType GetEntryType(const wxString& entry) const override
|
|
250
|
+
{
|
|
251
|
+
// path is the part before the last "/"
|
|
252
|
+
wxString path = entry.BeforeLast(wxCONFIG_PATH_SEPARATOR);
|
|
253
|
+
|
|
254
|
+
// except in the special case of "/keyname" when there is nothing before "/"
|
|
255
|
+
if ( path.empty() && *entry.c_str() == wxCONFIG_PATH_SEPARATOR )
|
|
256
|
+
{
|
|
257
|
+
path = wxCONFIG_PATH_SEPARATOR;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
// change to the path of the entry if necessary and remember the old path
|
|
261
|
+
// to restore it later
|
|
262
|
+
wxString pathOld;
|
|
263
|
+
wxRbHashConfig * const self = const_cast<wxRbHashConfig *>(this);
|
|
264
|
+
if ( !path.empty() )
|
|
265
|
+
{
|
|
266
|
+
pathOld = GetPath();
|
|
267
|
+
if ( pathOld.empty() )
|
|
268
|
+
pathOld = wxCONFIG_PATH_SEPARATOR;
|
|
269
|
+
|
|
270
|
+
if ( !self->DoSetPath(path, false /* don't create if doesn't exist */) )
|
|
271
|
+
{
|
|
272
|
+
return Type_Unknown;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// check if the entry exists in this group
|
|
277
|
+
VALUE rbValue;
|
|
278
|
+
const bool exists = getEntry(entry.AfterLast(wxCONFIG_PATH_SEPARATOR), rbValue);
|
|
279
|
+
|
|
280
|
+
// restore the old path if we changed it above
|
|
281
|
+
if ( !pathOld.empty() )
|
|
282
|
+
{
|
|
283
|
+
self->SetPath(pathOld);
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
if (exists && TYPE(rbValue) != T_HASH)
|
|
287
|
+
{
|
|
288
|
+
switch(TYPE(rbValue))
|
|
289
|
+
{
|
|
290
|
+
case T_STRING: return Type_String;
|
|
291
|
+
case T_FLOAT: return Type_Float;
|
|
292
|
+
case T_FIXNUM:
|
|
293
|
+
case T_BIGNUM: return Type_Integer;
|
|
294
|
+
case T_TRUE:
|
|
295
|
+
case T_FALSE: return Type_Boolean;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
return Type_Unknown;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
virtual bool Flush(bool bCurrentOnly = false) override { return true; }
|
|
303
|
+
|
|
304
|
+
virtual bool RenameEntry(const wxString& oldName, const wxString& newName) override
|
|
305
|
+
{
|
|
306
|
+
wxASSERT_MSG( oldName.find(wxCONFIG_PATH_SEPARATOR) == wxString::npos,
|
|
307
|
+
wxT("RenameEntry(): paths are not supported") );
|
|
308
|
+
|
|
309
|
+
// check that the entry exists
|
|
310
|
+
VALUE rbEntryValue;
|
|
311
|
+
if ( !getEntry(oldName, rbEntryValue) )
|
|
312
|
+
return false;
|
|
313
|
+
|
|
314
|
+
// check that the new entry doesn't already exist
|
|
315
|
+
if ( hasEntry(newName) )
|
|
316
|
+
return false;
|
|
317
|
+
|
|
318
|
+
// delete the old entry, create the new one
|
|
319
|
+
rb_hash_delete(m_cfgGroup, WXSTR_TO_RSTR(oldName));
|
|
320
|
+
rb_hash_aset(m_cfgGroup, WXSTR_TO_RSTR(newName), rbEntryValue);
|
|
321
|
+
m_cfgGroupKeys = Qnil; // reset
|
|
322
|
+
|
|
323
|
+
return true;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
virtual bool RenameGroup(const wxString& oldName, const wxString& newName) override
|
|
327
|
+
{
|
|
328
|
+
wxASSERT_MSG( oldName.find(wxCONFIG_PATH_SEPARATOR) == wxString::npos,
|
|
329
|
+
wxT("RenameGroup(): paths are not supported") );
|
|
330
|
+
|
|
331
|
+
// check that the group exists
|
|
332
|
+
VALUE rbGroup;
|
|
333
|
+
if ( !getGroup(oldName, rbGroup) )
|
|
334
|
+
return false;
|
|
335
|
+
|
|
336
|
+
// check that the new group doesn't already exist
|
|
337
|
+
if ( hasGroup(newName) )
|
|
338
|
+
return false;
|
|
339
|
+
|
|
340
|
+
// delete the old group entry, create the new one
|
|
341
|
+
rb_hash_delete(m_cfgGroup, WXSTR_TO_RSTR(oldName));
|
|
342
|
+
rb_hash_aset(m_cfgGroup, WXSTR_TO_RSTR(newName), rbGroup);
|
|
343
|
+
m_cfgGroupKeys = Qnil; // reset
|
|
344
|
+
|
|
345
|
+
return true;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
virtual bool DeleteEntry(const wxString& key, bool bGroupIfEmptyAlso = true) override
|
|
349
|
+
{
|
|
350
|
+
bool deleteGroup = false;
|
|
351
|
+
wxString grpPath;
|
|
352
|
+
{
|
|
353
|
+
wxConfigPathChanger path(this, key);
|
|
354
|
+
|
|
355
|
+
VALUE rbEntry = WXSTR_TO_RSTR(path.Name());
|
|
356
|
+
if ( !rb_hash_includes(m_cfgGroup, rbEntry) )
|
|
357
|
+
return false;
|
|
358
|
+
rb_hash_delete(m_cfgGroup, rbEntry);
|
|
359
|
+
|
|
360
|
+
if ( bGroupIfEmptyAlso && RHASH_SIZE(m_cfgGroup) == 0 )
|
|
361
|
+
{
|
|
362
|
+
if ( m_cfgHash != m_cfgGroup )
|
|
363
|
+
{
|
|
364
|
+
deleteGroup = true;
|
|
365
|
+
grpPath = m_strPath;
|
|
366
|
+
}
|
|
367
|
+
//else: never delete the root group
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
// here wxConfigPathChanger has reverted to the original path
|
|
371
|
+
|
|
372
|
+
if (deleteGroup)
|
|
373
|
+
{
|
|
374
|
+
DeleteGroup(grpPath);
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
return true;
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
virtual bool DeleteGroup(const wxString& szKey) override
|
|
381
|
+
{
|
|
382
|
+
wxConfigPathChanger path(this, RemoveTrailingSeparator(szKey));
|
|
383
|
+
|
|
384
|
+
VALUE rbGrpName = WXSTR_TO_RSTR(path.Name());
|
|
385
|
+
if ( !rb_hash_includes(m_cfgGroup, rbGrpName) )
|
|
386
|
+
return false;
|
|
387
|
+
rb_hash_delete(m_cfgGroup, rbGrpName);
|
|
388
|
+
|
|
389
|
+
path.UpdateIfDeleted();
|
|
390
|
+
|
|
391
|
+
return true;
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
virtual bool DeleteAll() override
|
|
395
|
+
{
|
|
396
|
+
rb_hash_clear(m_cfgHash);
|
|
397
|
+
SetRootPath();
|
|
398
|
+
return true;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
protected:
|
|
402
|
+
virtual bool DoReadString(const wxString& key, wxString *pStr) const override
|
|
403
|
+
{
|
|
404
|
+
wxConfigPathChanger path(this, key);
|
|
405
|
+
|
|
406
|
+
VALUE rbKey = WXSTR_TO_RSTR(path.Name());
|
|
407
|
+
if (rb_hash_includes(m_cfgGroup, rbKey) == Qfalse)
|
|
408
|
+
{
|
|
409
|
+
return false;
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
VALUE rbEntry = rb_hash_aref(m_cfgGroup, rbKey);
|
|
413
|
+
|
|
414
|
+
if (TYPE(rbEntry) == T_HASH)
|
|
415
|
+
return false;
|
|
416
|
+
|
|
417
|
+
if (TYPE(rbEntry) == T_STRING)
|
|
418
|
+
*pStr = RSTR_TO_WXSTR(rbEntry);
|
|
419
|
+
else
|
|
420
|
+
{
|
|
421
|
+
VALUE s = rb_funcall(rbEntry, to_s_ID(), 0);
|
|
422
|
+
*pStr = RSTR_TO_WXSTR(s);
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
return true;
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
virtual bool DoReadLong(const wxString& key, long *pl) const override
|
|
429
|
+
{
|
|
430
|
+
wxConfigPathChanger path(this, key);
|
|
431
|
+
|
|
432
|
+
VALUE rbKey = WXSTR_TO_RSTR(path.Name());
|
|
433
|
+
if (rb_hash_includes(m_cfgGroup, rbKey) == Qfalse)
|
|
434
|
+
{
|
|
435
|
+
return false;
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
VALUE rbEntry = rb_hash_aref(m_cfgGroup, rbKey);
|
|
439
|
+
|
|
440
|
+
if (TYPE(rbEntry) == T_HASH)
|
|
441
|
+
return false;
|
|
442
|
+
|
|
443
|
+
if (TYPE(rbEntry) == T_FIXNUM || TYPE(rbEntry) == T_BIGNUM)
|
|
444
|
+
{
|
|
445
|
+
*pl = NUM2LONG(rbEntry);
|
|
446
|
+
return true;
|
|
447
|
+
}
|
|
448
|
+
else
|
|
449
|
+
{
|
|
450
|
+
bool ex = false;
|
|
451
|
+
VALUE rbVal = wxRuby_Funcall(ex, rbEntry, to_i_ID(), 0);
|
|
452
|
+
if (!ex)
|
|
453
|
+
*pl = NUM2LONG(rbVal);
|
|
454
|
+
return !ex;
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
#ifdef wxHAS_LONG_LONG_T_DIFFERENT_FROM_LONG
|
|
459
|
+
virtual bool DoReadLongLong(const wxString& key, wxLongLong_t *pll) const
|
|
460
|
+
{
|
|
461
|
+
wxConfigPathChanger path(this, key);
|
|
462
|
+
|
|
463
|
+
VALUE rbKey = WXSTR_TO_RSTR(path.Name());
|
|
464
|
+
if (rb_hash_includes(m_cfgGroup, rbKey) == Qfalse)
|
|
465
|
+
{
|
|
466
|
+
return false;
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
VALUE rbEntry = rb_hash_aref(m_cfgGroup, rbKey);
|
|
470
|
+
|
|
471
|
+
if (TYPE(rbEntry) == T_HASH)
|
|
472
|
+
return false;
|
|
473
|
+
|
|
474
|
+
if (TYPE(rbEntry) == T_FIXNUM || TYPE(rbEntry) == T_BIGNUM)
|
|
475
|
+
{
|
|
476
|
+
*pll = NUM2LL(rbEntry);
|
|
477
|
+
return true;
|
|
478
|
+
}
|
|
479
|
+
else
|
|
480
|
+
{
|
|
481
|
+
bool ex = false;
|
|
482
|
+
VALUE rbVal = wxRuby_Funcall(ex, rbEntry, to_i_ID(), 0);
|
|
483
|
+
if (!ex)
|
|
484
|
+
*pll = NUM2LL(rbVal);
|
|
485
|
+
return !ex;
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
#endif // wxHAS_LONG_LONG_T_DIFFERENT_FROM_LONG
|
|
489
|
+
|
|
490
|
+
virtual bool DoReadDouble(const wxString& key, double* val) const
|
|
491
|
+
{
|
|
492
|
+
wxConfigPathChanger path(this, key);
|
|
493
|
+
|
|
494
|
+
VALUE rbKey = WXSTR_TO_RSTR(path.Name());
|
|
495
|
+
if (rb_hash_includes(m_cfgGroup, rbKey) == Qfalse)
|
|
496
|
+
{
|
|
497
|
+
return false;
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
VALUE rbEntry = rb_hash_aref(m_cfgGroup, rbKey);
|
|
501
|
+
|
|
502
|
+
if (TYPE(rbEntry) == T_HASH)
|
|
503
|
+
return false;
|
|
504
|
+
|
|
505
|
+
if (TYPE(rbEntry) == T_FLOAT)
|
|
506
|
+
{
|
|
507
|
+
*val = NUM2DBL(rbEntry);
|
|
508
|
+
return true;
|
|
509
|
+
}
|
|
510
|
+
else
|
|
511
|
+
{
|
|
512
|
+
bool ex = false;
|
|
513
|
+
VALUE rbVal = wxRuby_Funcall(ex, rbEntry, to_f_ID(), 0);
|
|
514
|
+
if (!ex)
|
|
515
|
+
*val = NUM2DBL(rbVal);
|
|
516
|
+
return !ex;
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
virtual bool DoReadBool(const wxString& key, bool* val) const
|
|
521
|
+
{
|
|
522
|
+
wxConfigPathChanger path(this, key);
|
|
523
|
+
|
|
524
|
+
VALUE rbKey = WXSTR_TO_RSTR(path.Name());
|
|
525
|
+
if (rb_hash_includes(m_cfgGroup, rbKey) == Qfalse)
|
|
526
|
+
{
|
|
527
|
+
return false;
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
VALUE rbEntry = rb_hash_aref(m_cfgGroup, rbKey);
|
|
531
|
+
|
|
532
|
+
if (TYPE(rbEntry) == T_HASH)
|
|
533
|
+
return false;
|
|
534
|
+
|
|
535
|
+
if (TYPE(rbEntry) == T_TRUE || TYPE(rbEntry) == T_FALSE)
|
|
536
|
+
{
|
|
537
|
+
*val = rbEntry == Qtrue;
|
|
538
|
+
}
|
|
539
|
+
else if (TYPE(rbEntry) == T_FIXNUM || TYPE(rbEntry) == T_BIGNUM)
|
|
540
|
+
{
|
|
541
|
+
*val = NUM2LL(rbEntry) != 0;
|
|
542
|
+
}
|
|
543
|
+
else
|
|
544
|
+
{
|
|
545
|
+
return false;
|
|
546
|
+
}
|
|
547
|
+
return true;
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
#if wxUSE_BASE64
|
|
551
|
+
virtual bool DoReadBinary(const wxString& key, wxMemoryBuffer* buf) const override
|
|
552
|
+
{
|
|
553
|
+
wxCHECK_MSG( buf, false, wxT("null buffer") );
|
|
554
|
+
|
|
555
|
+
wxString str;
|
|
556
|
+
if ( !Read(key, &str) )
|
|
557
|
+
return false;
|
|
558
|
+
|
|
559
|
+
*buf = wxBase64Decode(str);
|
|
560
|
+
return true;
|
|
561
|
+
}
|
|
562
|
+
#endif // wxUSE_BASE64
|
|
563
|
+
|
|
564
|
+
virtual bool DoWriteString(const wxString& key, const wxString& szValue) override
|
|
565
|
+
{
|
|
566
|
+
wxConfigPathChanger path(this, key);
|
|
567
|
+
wxString strName = path.Name();
|
|
568
|
+
|
|
569
|
+
if ( strName.empty() )
|
|
570
|
+
{
|
|
571
|
+
// setting the value of a group is an error
|
|
572
|
+
|
|
573
|
+
wxASSERT_MSG( szValue.empty(), wxT("can't set value of a group!") );
|
|
574
|
+
|
|
575
|
+
// ... except if it's empty in which case it's a way to force it's creation
|
|
576
|
+
}
|
|
577
|
+
else
|
|
578
|
+
{
|
|
579
|
+
// writing an entry check that the name is reasonable
|
|
580
|
+
if ( strName[0u] == wxCONFIG_IMMUTABLE_PREFIX )
|
|
581
|
+
{
|
|
582
|
+
wxLogError( _("Config entry name cannot start with '%c'."),
|
|
583
|
+
wxCONFIG_IMMUTABLE_PREFIX);
|
|
584
|
+
return false;
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
VALUE rbKey = WXSTR_TO_RSTR(strName);
|
|
588
|
+
VALUE rbEntry = rb_hash_aref(m_cfgGroup, rbKey);
|
|
589
|
+
if (TYPE(rbEntry) == T_HASH)
|
|
590
|
+
{
|
|
591
|
+
// do not allow to overwrite existing group entries
|
|
592
|
+
wxLogError( _("Setting value for config entry '%s' would overwrite group."),
|
|
593
|
+
key);
|
|
594
|
+
return false;
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
rb_hash_aset(m_cfgGroup, rbKey, WXSTR_TO_RSTR(szValue));
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
return true;
|
|
601
|
+
}
|
|
602
|
+
virtual bool DoWriteLong(const wxString& key, long lValue) override
|
|
603
|
+
{
|
|
604
|
+
wxConfigPathChanger path(this, key);
|
|
605
|
+
wxString strName = path.Name();
|
|
606
|
+
|
|
607
|
+
if ( strName.empty() )
|
|
608
|
+
{
|
|
609
|
+
// setting the value of a group is an error
|
|
610
|
+
wxLogError( _("can't set value of a group!"));
|
|
611
|
+
return false;
|
|
612
|
+
}
|
|
613
|
+
else
|
|
614
|
+
{
|
|
615
|
+
// writing an entry check that the name is reasonable
|
|
616
|
+
if ( strName[0u] == wxCONFIG_IMMUTABLE_PREFIX )
|
|
617
|
+
{
|
|
618
|
+
wxLogError( _("Config entry name cannot start with '%c'."),
|
|
619
|
+
wxCONFIG_IMMUTABLE_PREFIX);
|
|
620
|
+
return false;
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
VALUE rbKey = WXSTR_TO_RSTR(strName);
|
|
624
|
+
VALUE rbEntry = rb_hash_aref(m_cfgGroup, rbKey);
|
|
625
|
+
if (TYPE(rbEntry) == T_HASH)
|
|
626
|
+
{
|
|
627
|
+
// do not allow to overwrite existing group entries
|
|
628
|
+
wxLogError( _("Setting value for config entry '%s' would overwrite group."),
|
|
629
|
+
key);
|
|
630
|
+
return false;
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
rb_hash_aset(m_cfgGroup, rbKey, LONG2NUM(lValue));
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
return true;
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
#ifdef wxHAS_LONG_LONG_T_DIFFERENT_FROM_LONG
|
|
640
|
+
virtual bool DoWriteLongLong(const wxString& key, wxLongLong_t value)
|
|
641
|
+
{
|
|
642
|
+
wxConfigPathChanger path(this, key);
|
|
643
|
+
wxString strName = path.Name();
|
|
644
|
+
|
|
645
|
+
if ( strName.empty() )
|
|
646
|
+
{
|
|
647
|
+
// setting the value of a group is an error
|
|
648
|
+
wxLogError( _("can't set value of a group!"));
|
|
649
|
+
return false;
|
|
650
|
+
}
|
|
651
|
+
else
|
|
652
|
+
{
|
|
653
|
+
// writing an entry check that the name is reasonable
|
|
654
|
+
if ( strName[0u] == wxCONFIG_IMMUTABLE_PREFIX )
|
|
655
|
+
{
|
|
656
|
+
wxLogError( _("Config entry name cannot start with '%c'."),
|
|
657
|
+
wxCONFIG_IMMUTABLE_PREFIX);
|
|
658
|
+
return false;
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
VALUE rbKey = WXSTR_TO_RSTR(strName);
|
|
662
|
+
VALUE rbEntry = rb_hash_aref(m_cfgGroup, rbKey);
|
|
663
|
+
if (TYPE(rbEntry) == T_HASH)
|
|
664
|
+
{
|
|
665
|
+
// do not allow to overwrite existing group entries
|
|
666
|
+
wxLogError( _("Setting value for config entry '%s' would overwrite group."),
|
|
667
|
+
key);
|
|
668
|
+
return false;
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
rb_hash_aset(m_cfgGroup, rbKey, LL2NUM(value));
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
return true;
|
|
675
|
+
}
|
|
676
|
+
#endif // wxHAS_LONG_LONG_T_DIFFERENT_FROM_LONG
|
|
677
|
+
|
|
678
|
+
virtual bool DoWriteDouble(const wxString& key, double value)
|
|
679
|
+
{
|
|
680
|
+
wxConfigPathChanger path(this, key);
|
|
681
|
+
wxString strName = path.Name();
|
|
682
|
+
|
|
683
|
+
if ( strName.empty() )
|
|
684
|
+
{
|
|
685
|
+
// setting the value of a group is an error
|
|
686
|
+
wxLogError( _("can't set value of a group!"));
|
|
687
|
+
return false;
|
|
688
|
+
}
|
|
689
|
+
else
|
|
690
|
+
{
|
|
691
|
+
// writing an entry check that the name is reasonable
|
|
692
|
+
if ( strName[0u] == wxCONFIG_IMMUTABLE_PREFIX )
|
|
693
|
+
{
|
|
694
|
+
wxLogError( _("Config entry name cannot start with '%c'."),
|
|
695
|
+
wxCONFIG_IMMUTABLE_PREFIX);
|
|
696
|
+
return false;
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
VALUE rbKey = WXSTR_TO_RSTR(strName);
|
|
700
|
+
VALUE rbEntry = rb_hash_aref(m_cfgGroup, rbKey);
|
|
701
|
+
if (TYPE(rbEntry) == T_HASH)
|
|
702
|
+
{
|
|
703
|
+
// do not allow to overwrite existing group entries
|
|
704
|
+
wxLogError( _("Setting value for config entry '%s' would overwrite group."),
|
|
705
|
+
key);
|
|
706
|
+
return false;
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
rb_hash_aset(m_cfgGroup, rbKey, DBL2NUM(value));
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
return true;
|
|
713
|
+
}
|
|
714
|
+
|
|
715
|
+
virtual bool DoWriteBool(const wxString& key, bool value)
|
|
716
|
+
{
|
|
717
|
+
wxConfigPathChanger path(this, key);
|
|
718
|
+
wxString strName = path.Name();
|
|
719
|
+
|
|
720
|
+
if ( strName.empty() )
|
|
721
|
+
{
|
|
722
|
+
// setting the value of a group is an error
|
|
723
|
+
wxLogError( _("can't set value of a group!"));
|
|
724
|
+
return false;
|
|
725
|
+
}
|
|
726
|
+
else
|
|
727
|
+
{
|
|
728
|
+
// writing an entry check that the name is reasonable
|
|
729
|
+
if ( strName[0u] == wxCONFIG_IMMUTABLE_PREFIX )
|
|
730
|
+
{
|
|
731
|
+
wxLogError( _("Config entry name cannot start with '%c'."),
|
|
732
|
+
wxCONFIG_IMMUTABLE_PREFIX);
|
|
733
|
+
return false;
|
|
734
|
+
}
|
|
735
|
+
|
|
736
|
+
VALUE rbKey = WXSTR_TO_RSTR(strName);
|
|
737
|
+
VALUE rbEntry = rb_hash_aref(m_cfgGroup, rbKey);
|
|
738
|
+
if (TYPE(rbEntry) == T_HASH)
|
|
739
|
+
{
|
|
740
|
+
// do not allow to overwrite existing group entries
|
|
741
|
+
wxLogError( _("Setting value for config entry '%s' would overwrite group."),
|
|
742
|
+
key);
|
|
743
|
+
return false;
|
|
744
|
+
}
|
|
745
|
+
|
|
746
|
+
rb_hash_aset(m_cfgGroup, rbKey, value ? Qtrue : Qfalse);
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
return true;
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
#if wxUSE_BASE64
|
|
753
|
+
virtual bool DoWriteBinary(const wxString& key, const wxMemoryBuffer& buf) override
|
|
754
|
+
{
|
|
755
|
+
return Write(key, wxBase64Encode(buf));
|
|
756
|
+
}
|
|
757
|
+
#endif // wxUSE_BASE64
|
|
758
|
+
|
|
759
|
+
private:
|
|
760
|
+
|
|
761
|
+
bool getEntry(const wxString& entry, VALUE& rbValue) const
|
|
762
|
+
{
|
|
763
|
+
if (NIL_P(m_cfgGroup)) return false;
|
|
764
|
+
|
|
765
|
+
VALUE rbEntry = WXSTR_TO_RSTR(entry);
|
|
766
|
+
if (rb_hash_includes(m_cfgGroup, rbEntry))
|
|
767
|
+
{
|
|
768
|
+
VALUE rbVal = rb_hash_aref(m_cfgGroup, rbEntry);
|
|
769
|
+
if (TYPE(rbVal) != T_HASH)
|
|
770
|
+
{
|
|
771
|
+
rbValue = rbVal;
|
|
772
|
+
return true;
|
|
773
|
+
}
|
|
774
|
+
}
|
|
775
|
+
return false;
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
bool hasEntry(const wxString& entry) const
|
|
779
|
+
{
|
|
780
|
+
VALUE dummy;
|
|
781
|
+
return getEntry(entry, dummy);
|
|
782
|
+
}
|
|
783
|
+
|
|
784
|
+
bool getGroup(const wxString& grpName, VALUE& rbGrp) const
|
|
785
|
+
{
|
|
786
|
+
if (NIL_P(m_cfgGroup)) return false;
|
|
787
|
+
|
|
788
|
+
VALUE rbGrpName = WXSTR_TO_RSTR(grpName);
|
|
789
|
+
if (rb_hash_includes(m_cfgGroup, rbGrpName))
|
|
790
|
+
{
|
|
791
|
+
VALUE rbVal = rb_hash_aref(m_cfgGroup, rbGrpName);
|
|
792
|
+
if (TYPE(rbVal) == T_HASH)
|
|
793
|
+
{
|
|
794
|
+
rbGrp = rbVal;
|
|
795
|
+
return true;
|
|
796
|
+
}
|
|
797
|
+
}
|
|
798
|
+
return false;
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
bool hasGroup(const wxString& grpName) const
|
|
802
|
+
{
|
|
803
|
+
VALUE dummy;
|
|
804
|
+
return getGroup(grpName, dummy);
|
|
805
|
+
}
|
|
806
|
+
|
|
807
|
+
void SetRootPath()
|
|
808
|
+
{
|
|
809
|
+
m_strPath.Empty();
|
|
810
|
+
m_cfgGroup = m_cfgHash;
|
|
811
|
+
m_cfgGroupKeys = Qnil;
|
|
812
|
+
}
|
|
813
|
+
|
|
814
|
+
// real SetPath() implementation, returns true if path could be set or false
|
|
815
|
+
// if path doesn't exist and createMissingComponents == false
|
|
816
|
+
bool DoSetPath(const wxString& strPath, bool createMissingComponents)
|
|
817
|
+
{
|
|
818
|
+
if ( strPath.empty() )
|
|
819
|
+
{
|
|
820
|
+
SetRootPath();
|
|
821
|
+
return true;
|
|
822
|
+
}
|
|
823
|
+
|
|
824
|
+
VALUE rbPath;
|
|
825
|
+
if ( strPath[0] == wxCONFIG_PATH_SEPARATOR )
|
|
826
|
+
{
|
|
827
|
+
// absolute path
|
|
828
|
+
rbPath = WXSTR_TO_RSTR(strPath);
|
|
829
|
+
}
|
|
830
|
+
else
|
|
831
|
+
{
|
|
832
|
+
// relative path, combine with current one
|
|
833
|
+
wxString strFullPath = m_strPath;
|
|
834
|
+
strFullPath << wxCONFIG_PATH_SEPARATOR << strPath;
|
|
835
|
+
rbPath = WXSTR_TO_RSTR(strFullPath);
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
// split the path
|
|
839
|
+
VALUE rbSegments = rb_funcall(rbPath, split_ID(), 1, WXSTR_TO_RSTR(cfgSepStr));
|
|
840
|
+
// as the path being split is always absolute the first segment is always empty
|
|
841
|
+
rb_ary_delete_at(rbSegments, 0);
|
|
842
|
+
// prune the segments (remove relative elements)
|
|
843
|
+
for (long i=0; i<RARRAY_LEN(rbSegments) ;)
|
|
844
|
+
{
|
|
845
|
+
VALUE rbSeg = rb_ary_entry(rbSegments, i);
|
|
846
|
+
if (RSTR_TO_WXSTR(rbSeg) == "..")
|
|
847
|
+
{
|
|
848
|
+
// remove the 'prev-dir' indicator
|
|
849
|
+
rb_ary_delete_at(rbSegments, i);
|
|
850
|
+
// remove the prev group level (if any)
|
|
851
|
+
if (i>0)
|
|
852
|
+
{
|
|
853
|
+
rb_ary_delete_at(rbSegments, --i);
|
|
854
|
+
}
|
|
855
|
+
}
|
|
856
|
+
else if (RSTR_TO_WXSTR(rbSeg) == ".")
|
|
857
|
+
{
|
|
858
|
+
// remove the 'cur-dir' indicator
|
|
859
|
+
rb_ary_delete_at(rbSegments, i);
|
|
860
|
+
}
|
|
861
|
+
else
|
|
862
|
+
{
|
|
863
|
+
++i; // next
|
|
864
|
+
}
|
|
865
|
+
}
|
|
866
|
+
// set current group
|
|
867
|
+
VALUE rbCurGrp = m_cfgHash;
|
|
868
|
+
for (VALUE rbSeg=rb_ary_shift(rbSegments); !NIL_P(rbSeg) ;rbSeg=rb_ary_shift(rbSegments))
|
|
869
|
+
{
|
|
870
|
+
VALUE rbEntry = rb_hash_aref(rbCurGrp, rbSeg);
|
|
871
|
+
if (NIL_P(rbEntry) || TYPE(rbEntry) != T_HASH)
|
|
872
|
+
{
|
|
873
|
+
if (!createMissingComponents)
|
|
874
|
+
return false;
|
|
875
|
+
|
|
876
|
+
// NOTE: this will overwrite any value entry with the same name as
|
|
877
|
+
// as the new group
|
|
878
|
+
rbEntry = rb_hash_new();
|
|
879
|
+
rb_hash_aset(rbCurGrp, rbSeg, rbEntry);
|
|
880
|
+
}
|
|
881
|
+
rbCurGrp = rbEntry;
|
|
882
|
+
}
|
|
883
|
+
|
|
884
|
+
// set new current group
|
|
885
|
+
m_cfgGroup = rbCurGrp;
|
|
886
|
+
m_cfgGroupKeys = Qnil; // reset
|
|
887
|
+
// set new current path
|
|
888
|
+
m_strPath = RSTR_TO_WXSTR(rbPath);
|
|
889
|
+
|
|
890
|
+
return true;
|
|
891
|
+
}
|
|
892
|
+
|
|
893
|
+
|
|
894
|
+
// member variables
|
|
895
|
+
// ----------------
|
|
896
|
+
VALUE m_cfgInstance; // Ruby ConfigBase instance
|
|
897
|
+
VALUE m_cfgHash; // Ruby config Hash store
|
|
898
|
+
VALUE m_cfgGroup; // Ruby Current Group Hash store
|
|
899
|
+
VALUE m_cfgGroupKeys; // Ruby Current Group Keys Array
|
|
900
|
+
wxString m_strPath; // current path (not '/' terminated)
|
|
901
|
+
|
|
902
|
+
wxDECLARE_NO_COPY_CLASS(wxRbHashConfig);
|
|
903
|
+
}; // wxRbHashConfig
|
|
904
|
+
|
|
905
|
+
WxRuby_ID wxRbHashConfig::split_ID("split");
|
|
906
|
+
wxString wxRbHashConfig::cfgSepStr(wxCONFIG_PATH_SEPARATOR);
|
|
907
|
+
WxRuby_ID wxRbHashConfig::keys_ID("keys");
|
|
908
|
+
WxRuby_ID wxRbHashConfig::to_s_ID("to_s");
|
|
909
|
+
WxRuby_ID wxRbHashConfig::to_i_ID("to_i");
|
|
910
|
+
WxRuby_ID wxRbHashConfig::to_f_ID("to_f");
|
|
911
|
+
|
|
912
|
+
static const char * __iv_Config_data = "@data";
|
|
913
|
+
|
|
914
|
+
WXRUBY_EXPORT bool wxRuby_IsRubyConfig(VALUE rbConfig)
|
|
915
|
+
{
|
|
916
|
+
return rb_obj_is_kind_of(rbConfig, g_cConfig) == Qtrue;
|
|
917
|
+
}
|
|
918
|
+
|
|
919
|
+
// Wrap a Ruby hash for input type mapping
|
|
920
|
+
WXRUBY_EXPORT wxConfigBase* wxRuby_Ruby2ConfigBase(VALUE rbConfig)
|
|
921
|
+
{
|
|
922
|
+
if (rb_obj_is_kind_of(rbConfig, g_cConfig) == Qtrue)
|
|
923
|
+
{
|
|
924
|
+
// check if this Ruby config instance already has a associated wrapper
|
|
925
|
+
wxRbHashConfig* config;
|
|
926
|
+
Data_Get_Struct(rbConfig, wxRbHashConfig, config);
|
|
927
|
+
if (config == nullptr)
|
|
928
|
+
{
|
|
929
|
+
// if not, create one
|
|
930
|
+
config = new wxRbHashConfig(rbConfig, rb_iv_get(rbConfig, __iv_Config_data));
|
|
931
|
+
DATA_PTR(rbConfig) = config;
|
|
932
|
+
}
|
|
933
|
+
// return wrapper
|
|
934
|
+
return config;
|
|
935
|
+
}
|
|
936
|
+
return nullptr;
|
|
937
|
+
}
|
|
938
|
+
|
|
939
|
+
// Return Ruby hash from wx config (either the wrapped hash or a new converted one)
|
|
940
|
+
WXRUBY_EXPORT VALUE wxRuby_ConfigBase2Ruby(wxConfigBase* config)
|
|
941
|
+
{
|
|
942
|
+
if (config)
|
|
943
|
+
{
|
|
944
|
+
wxRbHashConfig* hsh_config = dynamic_cast<wxRbHashConfig*> (config);
|
|
945
|
+
if (hsh_config)
|
|
946
|
+
{
|
|
947
|
+
return hsh_config->GetRubyConfig();
|
|
948
|
+
}
|
|
949
|
+
}
|
|
950
|
+
return Qnil;
|
|
951
|
+
}
|
|
952
|
+
|
|
953
|
+
#endif
|