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.
Files changed (656) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/ext/mkrf_conf_srcgem.rb +4 -1
  4. data/ext/wxruby3/include/wxruby-Config.h +953 -0
  5. data/ext/wxruby3/include/wxruby-ScaledDC.h +4 -1
  6. data/ext/wxruby3/include/wxruby-runtime.h +10 -1
  7. data/ext/wxruby3/swig/RubyStockObjects.i +5 -3
  8. data/ext/wxruby3/swig/common.i +8 -3
  9. data/ext/wxruby3/swig/mark_free_impl.i +6 -4
  10. data/ext/wxruby3/swig/memory_management.i +5 -3
  11. data/ext/wxruby3/swig/typedefs.i +5 -3
  12. data/ext/wxruby3/swig/wx.i +5 -0
  13. data/ext/wxruby3/swig/wx.rc +4 -2
  14. data/lib/wx/accessors.rb +10 -2
  15. data/lib/wx/aui/auifloatframe.rb +20 -0
  16. data/lib/wx/aui/auimanager.rb +3 -0
  17. data/lib/wx/aui/auinotebook.rb +17 -0
  18. data/lib/wx/aui/require.rb +5 -1
  19. data/lib/wx/aui.rb +4 -1
  20. data/lib/wx/core/acceleratortable.rb +8 -0
  21. data/lib/wx/core/animation.rb +8 -0
  22. data/lib/wx/core/app.rb +8 -0
  23. data/lib/wx/core/array_ext.rb +7 -0
  24. data/lib/wx/core/art_locator.rb +7 -0
  25. data/lib/wx/core/artprovider.rb +9 -0
  26. data/lib/wx/core/bitmap.rb +16 -4
  27. data/lib/wx/core/bitmap_combobox.rb +7 -0
  28. data/lib/wx/core/brush.rb +7 -0
  29. data/lib/wx/core/busycursor.rb +9 -0
  30. data/lib/wx/core/choice.rb +7 -0
  31. data/lib/wx/core/choicedlg.rb +7 -0
  32. data/lib/wx/core/clientdc.rb +9 -0
  33. data/lib/wx/core/clipboard.rb +8 -0
  34. data/lib/wx/core/collapsible_pane.rb +8 -1
  35. data/lib/wx/core/colour.rb +8 -0
  36. data/lib/wx/core/combo_ctrl.rb +110 -0
  37. data/lib/wx/core/combobox.rb +7 -0
  38. data/lib/wx/core/config.rb +303 -0
  39. data/lib/wx/core/controlwithitems.rb +12 -1
  40. data/lib/wx/core/cursor.rb +14 -4
  41. data/lib/wx/core/data_object.rb +7 -0
  42. data/lib/wx/core/dataformat.rb +9 -0
  43. data/lib/wx/core/datetime.rb +14 -0
  44. data/lib/wx/core/dc.rb +7 -0
  45. data/lib/wx/core/dialog.rb +18 -1
  46. data/lib/wx/core/enum.rb +7 -0
  47. data/lib/wx/core/event.rb +7 -0
  48. data/lib/wx/core/event_blocker.rb +7 -0
  49. data/lib/wx/core/event_loop.rb +7 -0
  50. data/lib/wx/core/evthandler.rb +8 -0
  51. data/lib/wx/core/ext.rb +7 -0
  52. data/lib/wx/core/file_dialog.rb +23 -0
  53. data/lib/wx/core/find_replace_dialog.rb +7 -0
  54. data/lib/wx/core/functions.rb +8 -0
  55. data/lib/wx/core/gauge.rb +10 -1
  56. data/lib/wx/core/genericdirctrl.rb +9 -0
  57. data/lib/wx/core/hboxsizer.rb +16 -0
  58. data/lib/wx/core/helpcontroller.rb +8 -0
  59. data/lib/wx/core/helpcontrollerhelpprovider.rb +9 -0
  60. data/lib/wx/core/helpprovider.rb +10 -1
  61. data/lib/wx/core/icon.rb +17 -6
  62. data/lib/wx/core/id_helper.rb +7 -0
  63. data/lib/wx/core/image.rb +16 -4
  64. data/lib/wx/core/imagelist.rb +8 -1
  65. data/lib/wx/core/listbox.rb +7 -0
  66. data/lib/wx/core/listctrl.rb +9 -0
  67. data/lib/wx/core/locale.rb +8 -0
  68. data/lib/wx/core/log.rb +24 -0
  69. data/lib/wx/core/menu.rb +9 -0
  70. data/lib/wx/core/menu_bar.rb +7 -0
  71. data/lib/wx/core/menuitem.rb +9 -0
  72. data/lib/wx/core/notebook.rb +9 -0
  73. data/lib/wx/core/object.rb +9 -0
  74. data/lib/wx/core/paintdc.rb +7 -0
  75. data/lib/wx/core/pen.rb +7 -0
  76. data/lib/wx/core/pen_info.rb +7 -0
  77. data/lib/wx/core/platform_info.rb +7 -0
  78. data/lib/wx/core/point.rb +8 -0
  79. data/lib/wx/core/real_point.rb +8 -0
  80. data/lib/wx/core/rect.rb +9 -0
  81. data/lib/wx/core/region_iterator.rb +7 -0
  82. data/lib/wx/core/simplehelpprovider.rb +9 -0
  83. data/lib/wx/core/size.rb +8 -0
  84. data/lib/wx/core/sizer.rb +9 -0
  85. data/lib/wx/core/splash_screen.rb +22 -2
  86. data/lib/wx/core/text_entry.rb +7 -0
  87. data/lib/wx/core/textctrl.rb +86 -5
  88. data/lib/wx/core/timer.rb +9 -0
  89. data/lib/wx/core/toolbar.rb +9 -0
  90. data/lib/wx/core/toolbartool.rb +8 -0
  91. data/lib/wx/core/treectrl.rb +9 -0
  92. data/lib/wx/core/v_list_box.rb +7 -0
  93. data/lib/wx/core/validator.rb +7 -0
  94. data/lib/wx/core/variant.rb +7 -0
  95. data/lib/wx/core/vboxsizer.rb +16 -0
  96. data/lib/wx/core/window.rb +8 -0
  97. data/lib/wx/core/window_update_locker.rb +9 -0
  98. data/lib/wx/core/xmlresource.rb +8 -0
  99. data/lib/wx/core.rb +4 -1
  100. data/lib/wx/doc/app.rb +7 -1
  101. data/lib/wx/doc/array_ext.rb +6 -0
  102. data/lib/wx/doc/art_locator.rb +7 -0
  103. data/lib/wx/doc/aui/auimanager.rb +6 -0
  104. data/lib/wx/doc/aui/auinotebook.rb +6 -0
  105. data/lib/wx/doc/bitmap.rb +12 -4
  106. data/lib/wx/doc/brush.rb +6 -0
  107. data/lib/wx/doc/busy_info.rb +6 -0
  108. data/lib/wx/doc/client_dc.rb +6 -0
  109. data/lib/wx/doc/clipboard.rb +6 -0
  110. data/lib/wx/doc/colour_dialog.rb +6 -0
  111. data/lib/wx/doc/config.rb +190 -0
  112. data/lib/wx/doc/const.rb +7 -0
  113. data/lib/wx/doc/controlwithitems.rb +6 -0
  114. data/lib/wx/doc/core.rb +6 -0
  115. data/lib/wx/doc/cursor.rb +13 -5
  116. data/lib/wx/doc/data_object.rb +6 -0
  117. data/lib/wx/doc/datetime.rb +16 -0
  118. data/lib/wx/doc/dc.rb +6 -0
  119. data/lib/wx/doc/enum.rb +8 -1
  120. data/lib/wx/doc/event.rb +12 -0
  121. data/lib/wx/doc/event_blocker.rb +6 -0
  122. data/lib/wx/doc/event_loop.rb +6 -0
  123. data/lib/wx/doc/events.rb +6 -0
  124. data/lib/wx/doc/evthandler.rb +8 -0
  125. data/lib/wx/doc/extra/01_packages.md +52 -51
  126. data/lib/wx/doc/extra/05_event-handling.md +37 -12
  127. data/lib/wx/doc/extra/06_geometry.md +5 -5
  128. data/lib/wx/doc/extra/07_colour_and_font.md +2 -2
  129. data/lib/wx/doc/extra/09_exceptions.md +1 -1
  130. data/lib/wx/doc/extra/10_art.md +18 -12
  131. data/lib/wx/doc/extra/11_drawing_and_dc.md +4 -4
  132. data/lib/wx/doc/font.rb +6 -0
  133. data/lib/wx/doc/font_data.rb +16 -0
  134. data/lib/wx/doc/functions.rb +9 -1
  135. data/lib/wx/doc/gc_dc.rb +6 -0
  136. data/lib/wx/doc/gdi_common.rb +8 -1
  137. data/lib/wx/doc/graphics_context.rb +59 -39
  138. data/lib/wx/doc/grid/grid.rb +16 -1
  139. data/lib/wx/doc/hboxsizer.rb +33 -0
  140. data/lib/wx/doc/help_controller.rb +6 -0
  141. data/lib/wx/doc/html/html_help_controller.rb +6 -0
  142. data/lib/wx/doc/icon.rb +13 -5
  143. data/lib/wx/doc/id_helper.rb +6 -0
  144. data/lib/wx/doc/image.rb +12 -4
  145. data/lib/wx/doc/list_ctrl.rb +6 -0
  146. data/lib/wx/doc/log.rb +17 -0
  147. data/lib/wx/doc/memory_dc.rb +6 -0
  148. data/lib/wx/doc/mirror_dc.rb +6 -0
  149. data/lib/wx/doc/pen.rb +6 -0
  150. data/lib/wx/doc/pg/events.rb +6 -0
  151. data/lib/wx/doc/pg/pg_property.rb +17 -0
  152. data/lib/wx/doc/pg/pgeditor.rb +6 -0
  153. data/lib/wx/doc/pg/property_grid.rb +6 -0
  154. data/lib/wx/doc/pg/property_grid_interface.rb +6 -0
  155. data/lib/wx/doc/progress_dialog.rb +6 -0
  156. data/lib/wx/doc/prt/page_setup_dialog.rb +6 -0
  157. data/lib/wx/doc/prt/print_data.rb +6 -0
  158. data/lib/wx/doc/prt/print_dialog.rb +6 -0
  159. data/lib/wx/doc/prt/printer.rb +6 -0
  160. data/lib/wx/doc/prt/printer_dc.rb +6 -0
  161. data/lib/wx/doc/radio_box.rb +6 -0
  162. data/lib/wx/doc/rbn/ribbon_bar.rb +6 -0
  163. data/lib/wx/doc/rbn/ribbon_button_bar.rb +6 -0
  164. data/lib/wx/doc/rbn/ribbon_gallery.rb +6 -0
  165. data/lib/wx/doc/rbn/ribbon_tool_bar.rb +6 -0
  166. data/lib/wx/doc/region_iterator.rb +6 -0
  167. data/lib/wx/doc/rtc/richtext_buffer.rb +28 -0
  168. data/lib/wx/doc/rtc/richtext_formatting_dialog.rb +68 -0
  169. data/lib/wx/doc/rtc/richtext_printing.rb +6 -0
  170. data/lib/wx/doc/rtc/richtext_style_sheet.rb +20 -0
  171. data/lib/wx/doc/scaled_dc.rb +6 -0
  172. data/lib/wx/doc/screen_dc.rb +6 -0
  173. data/lib/wx/doc/stock_objects.rb +6 -0
  174. data/lib/wx/doc/stream.rb +6 -0
  175. data/lib/wx/doc/svg_file_dc.rb +6 -0
  176. data/lib/wx/doc/system_settings.rb +6 -0
  177. data/lib/wx/doc/text_validator.rb +6 -0
  178. data/lib/wx/doc/textctrl.rb +89 -0
  179. data/lib/wx/doc/tree_event.rb +20 -0
  180. data/lib/wx/doc/treebook.rb +6 -0
  181. data/lib/wx/doc/v_list_box.rb +6 -0
  182. data/lib/wx/doc/variant.rb +6 -0
  183. data/lib/wx/doc/vboxsizer.rb +33 -0
  184. data/lib/wx/doc/window.rb +6 -0
  185. data/lib/wx/doc/window_disabler.rb +6 -0
  186. data/lib/wx/doc/xml_resource.rb +8 -0
  187. data/lib/wx/global_const.rb +4 -1
  188. data/lib/wx/grid/grid.rb +23 -3
  189. data/lib/wx/grid/keyword_defs.rb +8 -1
  190. data/lib/wx/grid/require.rb +4 -1
  191. data/lib/wx/grid.rb +4 -1
  192. data/lib/wx/helpers.rb +8 -1
  193. data/lib/wx/html/htmlhelpcontroller.rb +29 -3
  194. data/lib/wx/html/htmlwindow.rb +23 -12
  195. data/lib/wx/html/keyword_defs.rb +8 -1
  196. data/lib/wx/html/require.rb +4 -1
  197. data/lib/wx/html/simple_html_listbox.rb +3 -0
  198. data/lib/wx/html.rb +4 -1
  199. data/lib/wx/keyword_ctors.rb +22 -3
  200. data/lib/wx/keyword_defs.rb +55 -3
  201. data/lib/wx/pg/events.rb +4 -1
  202. data/lib/wx/pg/keyword_defs.rb +8 -1
  203. data/lib/wx/pg/pg_editor.rb +3 -0
  204. data/lib/wx/pg/pg_properties.rb +4 -1
  205. data/lib/wx/pg/pg_property.rb +18 -5
  206. data/lib/wx/pg/property_grid.rb +4 -1
  207. data/lib/wx/pg/property_grid_interface.rb +3 -0
  208. data/lib/wx/pg/require.rb +4 -1
  209. data/lib/wx/pg.rb +4 -1
  210. data/lib/wx/prt/keyword_defs.rb +8 -1
  211. data/lib/wx/prt/page_setup_dialog.rb +3 -0
  212. data/lib/wx/prt/previewframe.rb +5 -0
  213. data/lib/wx/prt/require.rb +4 -1
  214. data/lib/wx/prt.rb +4 -1
  215. data/lib/wx/rbn/events.rb +4 -1
  216. data/lib/wx/rbn/keyword_defs.rb +8 -1
  217. data/lib/wx/rbn/require.rb +5 -1
  218. data/lib/wx/rbn/ribbon_art_provider.rb +3 -1
  219. data/lib/wx/rbn/ribbon_bar.rb +3 -0
  220. data/lib/wx/rbn/ribbon_button_bar.rb +3 -0
  221. data/lib/wx/rbn/ribbon_control.rb +3 -0
  222. data/lib/wx/rbn/ribbon_gallery.rb +10 -0
  223. data/lib/wx/rbn/ribbon_page.rb +3 -0
  224. data/lib/wx/rbn/ribbon_panel.rb +3 -0
  225. data/lib/wx/rbn/ribbon_tool_bar.rb +3 -0
  226. data/lib/wx/rbn.rb +4 -1
  227. data/lib/wx/rtc/ext.rb +4 -1
  228. data/lib/wx/rtc/keyword_defs.rb +18 -7
  229. data/lib/wx/rtc/require.rb +8 -1
  230. data/lib/wx/rtc/richtext_buffer.rb +36 -0
  231. data/lib/wx/rtc/richtext_formatting_dialog.rb +88 -0
  232. data/lib/wx/rtc/richtext_style_organiser_dialog.rb +46 -0
  233. data/lib/wx/rtc/symbol_picker_dialog.rb +47 -0
  234. data/lib/wx/rtc.rb +5 -1
  235. data/lib/wx/stc/keyword_defs.rb +8 -1
  236. data/lib/wx/stc/require.rb +4 -1
  237. data/lib/wx/stc.rb +4 -1
  238. data/lib/wx/version.rb +5 -1
  239. data/lib/wx/wxruby/base.rb +4 -1
  240. data/lib/wx/wxruby/cmd/sampler.rb +4 -1
  241. data/lib/wx/wxruby/cmd/test.rb +4 -1
  242. data/lib/wx.rb +4 -1
  243. data/rakelib/build.rake +4 -1
  244. data/rakelib/build.rb +4 -1
  245. data/rakelib/config.rake +4 -1
  246. data/rakelib/configure.rb +4 -1
  247. data/rakelib/doc.rake +4 -1
  248. data/rakelib/doc.rb +5 -1
  249. data/rakelib/install.rake +4 -1
  250. data/rakelib/install.rb +4 -1
  251. data/rakelib/lib/config/cygwin.rb +4 -1
  252. data/rakelib/lib/config/linux.rb +4 -1
  253. data/rakelib/lib/config/macosx.rb +5 -2
  254. data/rakelib/lib/config/mingw.rb +4 -1
  255. data/rakelib/lib/config/netbsd.rb +4 -1
  256. data/rakelib/lib/config/unixish.rb +10 -7
  257. data/rakelib/lib/config.rb +7 -2
  258. data/rakelib/lib/core/include/enum.inc +4 -1
  259. data/rakelib/lib/core/include/funcall.inc +10 -64
  260. data/rakelib/lib/core/include/init.inc +3 -0
  261. data/rakelib/lib/core/mapping.rb +26 -46
  262. data/rakelib/lib/core/package.rb +17 -3
  263. data/rakelib/lib/core/parameter.rb +4 -1
  264. data/rakelib/lib/core/spec.rb +14 -8
  265. data/rakelib/lib/core/spec_helper.rb +32 -9
  266. data/rakelib/lib/director/about_dialog_info.rb +4 -1
  267. data/rakelib/lib/director/accelerator.rb +7 -2
  268. data/rakelib/lib/director/animation.rb +4 -1
  269. data/rakelib/lib/director/animation_ctrl.rb +4 -1
  270. data/rakelib/lib/director/any_button.rb +5 -2
  271. data/rakelib/lib/director/app.rb +16 -2
  272. data/rakelib/lib/director/app_traits.rb +71 -0
  273. data/rakelib/lib/director/art_provider.rb +4 -1
  274. data/rakelib/lib/director/aui_dock_art.rb +4 -1
  275. data/rakelib/lib/director/aui_floating_frame.rb +4 -1
  276. data/rakelib/lib/director/aui_manager.rb +12 -5
  277. data/rakelib/lib/director/aui_manager_event.rb +4 -1
  278. data/rakelib/lib/director/aui_mdi_child_frame.rb +25 -1
  279. data/rakelib/lib/director/aui_mdi_client_window.rb +4 -1
  280. data/rakelib/lib/director/aui_mdi_parent_frame.rb +4 -1
  281. data/rakelib/lib/director/aui_notebook.rb +12 -1
  282. data/rakelib/lib/director/aui_notebook_event.rb +4 -1
  283. data/rakelib/lib/director/aui_pane_info.rb +4 -1
  284. data/rakelib/lib/director/aui_tab_art.rb +52 -1
  285. data/rakelib/lib/director/aui_tab_ctrl.rb +14 -1
  286. data/rakelib/lib/director/aui_toolbar.rb +6 -3
  287. data/rakelib/lib/director/aui_toolbar_art.rb +52 -1
  288. data/rakelib/lib/director/aui_toolbar_event.rb +4 -1
  289. data/rakelib/lib/director/aui_toolbar_item.rb +4 -1
  290. data/rakelib/lib/director/banner_window.rb +26 -0
  291. data/rakelib/lib/director/bitmap.rb +11 -2
  292. data/rakelib/lib/director/bitmap_combobox.rb +5 -1
  293. data/rakelib/lib/director/book_ctrls.rb +13 -3
  294. data/rakelib/lib/director/brush.rb +4 -1
  295. data/rakelib/lib/director/busy_info.rb +4 -1
  296. data/rakelib/lib/director/button.rb +4 -1
  297. data/rakelib/lib/director/calendar_ctrl.rb +4 -1
  298. data/rakelib/lib/director/calendar_date_attr.rb +4 -1
  299. data/rakelib/lib/director/caret.rb +4 -1
  300. data/rakelib/lib/director/check_listbox.rb +4 -1
  301. data/rakelib/lib/director/choice.rb +4 -1
  302. data/rakelib/lib/director/clipboard.rb +4 -1
  303. data/rakelib/lib/director/collapsible_pane.rb +4 -1
  304. data/rakelib/lib/director/collapsible_pane_event.rb +4 -1
  305. data/rakelib/lib/director/colour.rb +9 -1
  306. data/rakelib/lib/director/colour_picker_ctrl.rb +4 -1
  307. data/rakelib/lib/director/combobox.rb +4 -1
  308. data/rakelib/lib/director/comboctrl.rb +94 -0
  309. data/rakelib/lib/director/config_base.rb +135 -0
  310. data/rakelib/lib/director/context_help_button.rb +4 -1
  311. data/rakelib/lib/director/control.rb +4 -1
  312. data/rakelib/lib/director/ctrl_with_items.rb +5 -1
  313. data/rakelib/lib/director/cursor.rb +6 -2
  314. data/rakelib/lib/director/data_format.rb +4 -1
  315. data/rakelib/lib/director/data_object.rb +4 -1
  316. data/rakelib/lib/director/data_object_simple_base.rb +4 -1
  317. data/rakelib/lib/director/date_event.rb +9 -2
  318. data/rakelib/lib/director/date_picker_ctrl.rb +4 -1
  319. data/rakelib/lib/director/dc.rb +19 -1
  320. data/rakelib/lib/director/defs.rb +4 -1
  321. data/rakelib/lib/director/derived_dc.rb +27 -20
  322. data/rakelib/lib/director/dialog.rb +24 -3
  323. data/rakelib/lib/director/dir_filterlist_ctrl.rb +4 -1
  324. data/rakelib/lib/director/dir_picker_ctrl.rb +4 -1
  325. data/rakelib/lib/director/drag_image.rb +9 -2
  326. data/rakelib/lib/director/dragdrop.rb +4 -1
  327. data/rakelib/lib/director/editable_listbox.rb +4 -1
  328. data/rakelib/lib/director/event.rb +11 -3
  329. data/rakelib/lib/director/event_blocker.rb +4 -1
  330. data/rakelib/lib/director/event_filter.rb +4 -1
  331. data/rakelib/lib/director/event_handler.rb +28 -11
  332. data/rakelib/lib/director/event_loop.rb +4 -1
  333. data/rakelib/lib/director/events.rb +5 -2
  334. data/rakelib/lib/director/file_dialog_custom_control.rb +28 -0
  335. data/rakelib/lib/director/file_dialog_customize_hook.rb +28 -0
  336. data/rakelib/lib/director/file_picker_ctrl.rb +4 -1
  337. data/rakelib/lib/director/file_system.rb +45 -0
  338. data/rakelib/lib/director/find_dialog_event.rb +4 -1
  339. data/rakelib/lib/director/find_replace_data.rb +4 -1
  340. data/rakelib/lib/director/font.rb +7 -3
  341. data/rakelib/lib/director/font_data.rb +9 -1
  342. data/rakelib/lib/director/font_picker_ctrl.rb +4 -1
  343. data/rakelib/lib/director/frame.rb +45 -33
  344. data/rakelib/lib/director/fs_file.rb +52 -1
  345. data/rakelib/lib/director/functions.rb +11 -5
  346. data/rakelib/lib/director/gdi_object.rb +4 -1
  347. data/rakelib/lib/director/gdicommon.rb +14 -9
  348. data/rakelib/lib/director/generic_dirctrl.rb +4 -1
  349. data/rakelib/lib/director/graphics_context.rb +113 -18
  350. data/rakelib/lib/director/graphics_object.rb +13 -2
  351. data/rakelib/lib/director/grid_cell_attr.rb +28 -4
  352. data/rakelib/lib/director/grid_cell_editor.rb +22 -5
  353. data/rakelib/lib/director/grid_cell_renderer.rb +16 -3
  354. data/rakelib/lib/director/grid_ctrl.rb +146 -5
  355. data/rakelib/lib/director/grid_range_select_event.rb +4 -1
  356. data/rakelib/lib/director/grid_table_base.rb +6 -1
  357. data/rakelib/lib/director/grid_table_message.rb +4 -1
  358. data/rakelib/lib/director/header_ctrl.rb +37 -0
  359. data/rakelib/lib/director/help_controller.rb +13 -6
  360. data/rakelib/lib/director/help_provider.rb +4 -1
  361. data/rakelib/lib/director/html_cell.rb +10 -3
  362. data/rakelib/lib/director/html_data_object.rb +4 -1
  363. data/rakelib/lib/director/html_easy_printing.rb +4 -1
  364. data/rakelib/lib/director/html_event.rb +4 -1
  365. data/rakelib/lib/director/html_help_data.rb +4 -1
  366. data/rakelib/lib/director/html_help_window.rb +30 -0
  367. data/rakelib/lib/director/html_listbox.rb +4 -1
  368. data/rakelib/lib/director/html_printout.rb +6 -1
  369. data/rakelib/lib/director/html_window.rb +10 -8
  370. data/rakelib/lib/director/hyperlink_ctrl.rb +32 -0
  371. data/rakelib/lib/director/hyperlink_event.rb +4 -1
  372. data/rakelib/lib/director/icon.rb +4 -1
  373. data/rakelib/lib/director/image.rb +26 -3
  374. data/rakelib/lib/director/image_list.rb +5 -1
  375. data/rakelib/lib/director/info_bar.rb +26 -0
  376. data/rakelib/lib/director/list_ctrl.rb +39 -7
  377. data/rakelib/lib/director/listbox.rb +4 -1
  378. data/rakelib/lib/director/locale.rb +7 -4
  379. data/rakelib/lib/director/log.rb +51 -6
  380. data/rakelib/lib/director/mdi_frame.rb +4 -1
  381. data/rakelib/lib/director/media_ctrl.rb +4 -1
  382. data/rakelib/lib/director/menu.rb +16 -3
  383. data/rakelib/lib/director/menu_bar.rb +13 -2
  384. data/rakelib/lib/director/menu_item.rb +6 -6
  385. data/rakelib/lib/director/mouse_state.rb +5 -2
  386. data/rakelib/lib/director/numeric_property_validator.rb +4 -1
  387. data/rakelib/lib/director/object.rb +5 -2
  388. data/rakelib/lib/director/page_setup_dialog.rb +4 -1
  389. data/rakelib/lib/director/palette.rb +54 -2
  390. data/rakelib/lib/director/panel.rb +4 -1
  391. data/rakelib/lib/director/pen.rb +5 -2
  392. data/rakelib/lib/director/pgarray_editor_dialog.rb +4 -1
  393. data/rakelib/lib/director/pgcell.rb +4 -1
  394. data/rakelib/lib/director/pgeditor.rb +4 -1
  395. data/rakelib/lib/director/pgmulti_button.rb +4 -1
  396. data/rakelib/lib/director/pgproperties.rb +4 -1
  397. data/rakelib/lib/director/pgproperty.rb +42 -3
  398. data/rakelib/lib/director/pgvalidation_info.rb +9 -1
  399. data/rakelib/lib/director/pickerbase.rb +4 -1
  400. data/rakelib/lib/director/platform_info.rb +9 -1
  401. data/rakelib/lib/director/popup_window.rb +14 -1
  402. data/rakelib/lib/director/preview_frame.rb +5 -2
  403. data/rakelib/lib/director/print_data.rb +4 -1
  404. data/rakelib/lib/director/print_dialog.rb +4 -1
  405. data/rakelib/lib/director/printer.rb +14 -6
  406. data/rakelib/lib/director/property_grid.rb +30 -1
  407. data/rakelib/lib/director/property_grid_event.rb +11 -1
  408. data/rakelib/lib/director/property_grid_interface.rb +20 -6
  409. data/rakelib/lib/director/property_grid_manager.rb +4 -1
  410. data/rakelib/lib/director/property_grid_page.rb +4 -1
  411. data/rakelib/lib/director/property_grid_page_state.rb +4 -1
  412. data/rakelib/lib/director/radio_box.rb +4 -1
  413. data/rakelib/lib/director/rearrange_list.rb +36 -0
  414. data/rakelib/lib/director/region.rb +5 -1
  415. data/rakelib/lib/director/region_iterator.rb +4 -1
  416. data/rakelib/lib/director/ribbon_art_provider.rb +9 -1
  417. data/rakelib/lib/director/ribbon_bar.rb +4 -1
  418. data/rakelib/lib/director/ribbon_bar_event.rb +4 -1
  419. data/rakelib/lib/director/ribbon_button_bar.rb +4 -1
  420. data/rakelib/lib/director/ribbon_button_bar_event.rb +4 -1
  421. data/rakelib/lib/director/ribbon_ctrl.rb +4 -1
  422. data/rakelib/lib/director/ribbon_gallery.rb +8 -3
  423. data/rakelib/lib/director/ribbon_gallery_event.rb +4 -1
  424. data/rakelib/lib/director/ribbon_page.rb +4 -1
  425. data/rakelib/lib/director/ribbon_panel.rb +4 -1
  426. data/rakelib/lib/director/ribbon_panel_event.rb +4 -1
  427. data/rakelib/lib/director/ribbon_tool_bar.rb +4 -1
  428. data/rakelib/lib/director/ribbon_tool_bar_event.rb +4 -1
  429. data/rakelib/lib/director/richtext_box.rb +61 -0
  430. data/rakelib/lib/director/richtext_buffer.rb +219 -22
  431. data/rakelib/lib/director/richtext_buffer_data_object.rb +4 -1
  432. data/rakelib/lib/director/richtext_composite_object.rb +174 -0
  433. data/rakelib/lib/director/richtext_ctrl.rb +157 -4
  434. data/rakelib/lib/director/richtext_event.rb +4 -1
  435. data/rakelib/lib/director/richtext_file_handler.rb +13 -1
  436. data/rakelib/lib/director/richtext_formatting_dialog.rb +44 -0
  437. data/rakelib/lib/director/richtext_header_footer_data.rb +4 -1
  438. data/rakelib/lib/director/richtext_image.rb +56 -0
  439. data/rakelib/lib/director/richtext_object.rb +272 -0
  440. data/rakelib/lib/director/richtext_paragraph_layout_box.rb +178 -0
  441. data/rakelib/lib/director/richtext_printing.rb +4 -1
  442. data/rakelib/lib/director/richtext_style_listbox.rb +37 -0
  443. data/rakelib/lib/director/richtext_style_organiser_dialog.rb +28 -0
  444. data/rakelib/lib/director/sash_layout_event.rb +4 -1
  445. data/rakelib/lib/director/sash_layout_window.rb +4 -1
  446. data/rakelib/lib/director/sash_window.rb +4 -1
  447. data/rakelib/lib/director/scroll_bar.rb +4 -1
  448. data/rakelib/lib/director/scrolled_t.rb +7 -4
  449. data/rakelib/lib/director/searchctrl.rb +4 -1
  450. data/rakelib/lib/director/sizer.rb +4 -1
  451. data/rakelib/lib/director/sizer_item.rb +9 -3
  452. data/rakelib/lib/director/slider.rb +4 -1
  453. data/rakelib/lib/director/splash_screen.rb +4 -1
  454. data/rakelib/lib/director/splitter_event.rb +4 -1
  455. data/rakelib/lib/director/splitter_window.rb +4 -1
  456. data/rakelib/lib/director/static_bitmap.rb +4 -1
  457. data/rakelib/lib/director/static_box.rb +5 -2
  458. data/rakelib/lib/director/status_bar.rb +5 -1
  459. data/rakelib/lib/director/styled_text_ctrl.rb +14 -2
  460. data/rakelib/lib/director/styled_text_event.rb +4 -1
  461. data/rakelib/lib/director/system_options.rb +4 -1
  462. data/rakelib/lib/director/system_settings.rb +4 -1
  463. data/rakelib/lib/director/task_bar_icon.rb +4 -1
  464. data/rakelib/lib/director/text_attr.rb +5 -2
  465. data/rakelib/lib/director/text_entry.rb +4 -1
  466. data/rakelib/lib/director/text_validator.rb +6 -1
  467. data/rakelib/lib/director/textctrl.rb +32 -3
  468. data/rakelib/lib/director/time_picker_ctrl.rb +4 -1
  469. data/rakelib/lib/director/timer.rb +4 -1
  470. data/rakelib/lib/director/tip_provider.rb +4 -1
  471. data/rakelib/lib/director/toggle_button.rb +4 -1
  472. data/rakelib/lib/director/tool_bar.rb +20 -1
  473. data/rakelib/lib/director/tool_tip.rb +5 -2
  474. data/rakelib/lib/director/top_level_window.rb +58 -51
  475. data/rakelib/lib/director/tree_ctrl.rb +5 -2
  476. data/rakelib/lib/director/tree_event.rb +28 -10
  477. data/rakelib/lib/director/uiaction_simulator.rb +4 -1
  478. data/rakelib/lib/director/utils.rb +9 -1
  479. data/rakelib/lib/director/validator.rb +4 -1
  480. data/rakelib/lib/director/variant.rb +5 -2
  481. data/rakelib/lib/director/vlistbox.rb +4 -1
  482. data/rakelib/lib/director/vscrolled_window.rb +4 -1
  483. data/rakelib/lib/director/window.rb +81 -82
  484. data/rakelib/lib/director/window_disabler.rb +4 -1
  485. data/rakelib/lib/director/with_images.rb +5 -2
  486. data/rakelib/lib/director/wizard_page.rb +4 -1
  487. data/rakelib/lib/director/xml_node.rb +4 -1
  488. data/rakelib/lib/director/xml_resource.rb +4 -1
  489. data/rakelib/lib/director.rb +27 -28
  490. data/rakelib/lib/ext/enum_chain.rb +4 -1
  491. data/rakelib/lib/extractor/class.rb +8 -6
  492. data/rakelib/lib/extractor/enum.rb +15 -2
  493. data/rakelib/lib/extractor/function.rb +12 -4
  494. data/rakelib/lib/extractor/module.rb +4 -1
  495. data/rakelib/lib/extractor/variable.rb +4 -1
  496. data/rakelib/lib/extractor.rb +7 -2
  497. data/rakelib/lib/generate/analyzer.rb +31 -21
  498. data/rakelib/lib/generate/base.rb +4 -1
  499. data/rakelib/lib/generate/doc/grid_cell_attr.yaml +21 -0
  500. data/rakelib/lib/generate/doc/grid_ctrl.yaml +25 -0
  501. data/rakelib/lib/generate/doc/html_cell.yaml +11 -0
  502. data/rakelib/lib/generate/doc/html_help_controller.yaml +23 -0
  503. data/rakelib/lib/generate/doc/html_help_window.yaml +21 -0
  504. data/rakelib/lib/generate/doc/html_window.yaml +47 -0
  505. data/rakelib/lib/generate/doc/pg_editor.yaml +11 -0
  506. data/rakelib/lib/generate/doc/pg_multi_button.yaml +78 -0
  507. data/rakelib/lib/generate/doc/pg_properties.yaml +244 -0
  508. data/rakelib/lib/generate/doc/pg_property.yaml +188 -0
  509. data/rakelib/lib/generate/doc/property_grid.yaml +23 -0
  510. data/rakelib/lib/generate/doc/property_grid_interface.yaml +30 -0
  511. data/rakelib/lib/generate/doc/property_grid_manager.yaml +40 -0
  512. data/rakelib/lib/generate/doc/rich_text_html_handler.yaml +11 -0
  513. data/rakelib/lib/generate/doc/styled_text_ctrl.yaml +18 -0
  514. data/rakelib/lib/generate/doc/symbol_picker_dialog.yaml +40 -0
  515. data/rakelib/lib/generate/doc.rb +19 -3
  516. data/rakelib/lib/generate/interface.rb +79 -110
  517. data/rakelib/lib/generate/rakedep.rb +4 -1
  518. data/rakelib/lib/specs/interfaces.rb +45 -20
  519. data/rakelib/lib/streams.rb +5 -1
  520. data/rakelib/lib/swig_runner.rb +34 -22
  521. data/rakelib/lib/typemap/array_int_selections.rb +4 -1
  522. data/rakelib/lib/typemap/common.rb +57 -2
  523. data/rakelib/lib/typemap/config.rb +55 -0
  524. data/rakelib/lib/typemap/data_format.rb +4 -1
  525. data/rakelib/lib/typemap/data_object_data.rb +4 -1
  526. data/rakelib/lib/typemap/datetime.rb +8 -1
  527. data/rakelib/lib/typemap/grid_client_data.rb +4 -1
  528. data/rakelib/lib/typemap/grid_coords.rb +37 -7
  529. data/rakelib/lib/typemap/html_cell.rb +4 -1
  530. data/rakelib/lib/typemap/io_streams.rb +4 -1
  531. data/rakelib/lib/typemap/pgcell.rb +4 -1
  532. data/rakelib/lib/typemap/pgeditor.rb +4 -1
  533. data/rakelib/lib/typemap/pgprop_arg.rb +4 -1
  534. data/rakelib/lib/typemap/pgproperty.rb +4 -1
  535. data/rakelib/lib/typemap/points_list.rb +4 -1
  536. data/rakelib/lib/typemap/richtext.rb +185 -11
  537. data/rakelib/lib/typemap/tree_itemid.rb +26 -1
  538. data/rakelib/lib/util/string.rb +4 -1
  539. data/rakelib/prepost.rake +4 -1
  540. data/rakelib/prepost.rb +4 -1
  541. data/rakelib/run.rake +4 -1
  542. data/samples/aui/aui.rb +8 -3
  543. data/samples/bigdemo/bigdemo.rb +9 -2
  544. data/samples/bigdemo/run.rb +9 -2
  545. data/samples/bigdemo/utils.rb +9 -1
  546. data/samples/calendar/calendar.rb +9 -4
  547. data/samples/caret/caret.rb +8 -3
  548. data/samples/controls/books.rb +8 -2
  549. data/samples/controls/controls.rb +33 -77
  550. data/samples/controls/get_item_sample.rb +8 -2
  551. data/samples/controls/htlbox.rb +10 -3
  552. data/samples/dialogs/dialogs.rb +9 -4
  553. data/samples/dialogs/wizard.rb +8 -3
  554. data/samples/dragdrop/dragdrop.rb +8 -3
  555. data/samples/drawing/bitmap.rb +8 -3
  556. data/samples/drawing/bitmap_image.rb +8 -3
  557. data/samples/drawing/graphics_drawing.rb +44 -33
  558. data/samples/drawing/image_prt.rb +8 -2
  559. data/samples/drawing/maths_images.rb +8 -3
  560. data/samples/drawing/rmagic_bitmap_image.rb +8 -3
  561. data/samples/etc/choice.rb +8 -3
  562. data/samples/etc/miniframe.rb +8 -3
  563. data/samples/etc/sash.rb +8 -3
  564. data/samples/etc/scrollwin.rb +8 -3
  565. data/samples/etc/system_settings.rb +8 -3
  566. data/samples/event/activation.rb +8 -3
  567. data/samples/event/event.rb +8 -3
  568. data/samples/event/threaded.rb +8 -3
  569. data/samples/event/update_ui_event.rb +8 -3
  570. data/samples/grid/grid.rb +9 -3
  571. data/samples/grid/gridtablebase.rb +8 -3
  572. data/samples/html/html.rb +8 -3
  573. data/samples/mdi/mdi.rb +8 -3
  574. data/samples/minimal/minimal.rb +8 -3
  575. data/samples/minimal/nothing.rb +8 -3
  576. data/samples/printing/printing.rb +8 -3
  577. data/samples/printing/printing2.rb +8 -2
  578. data/samples/propgrid/propgrid.rb +4 -1
  579. data/samples/propgrid/propgrid_minimal.rb +4 -2
  580. data/samples/propgrid/sample_props.rb +4 -1
  581. data/samples/ribbon/ribbon.rb +4 -1
  582. data/samples/sampler/editor.rb +4 -1
  583. data/samples/sampler/ext.rb +4 -1
  584. data/samples/sampler/sample.rb +13 -4
  585. data/samples/sampler/stc_editor.rb +4 -1
  586. data/samples/sampler/txt_editor.rb +4 -1
  587. data/samples/sampler.rb +11 -3
  588. data/samples/splash/splash.rb +4 -2
  589. data/samples/text/art/richtext/alignleft.xpm +24 -0
  590. data/samples/text/art/richtext/alignright.xpm +24 -0
  591. data/samples/text/art/richtext/bold.xpm +24 -0
  592. data/samples/text/art/richtext/centre.xpm +24 -0
  593. data/samples/text/art/richtext/copy.xpm +45 -0
  594. data/samples/text/art/richtext/cut.xpm +47 -0
  595. data/samples/text/art/richtext/font.xpm +25 -0
  596. data/samples/text/art/richtext/idea.xpm +47 -0
  597. data/samples/text/art/richtext/indentless.xpm +25 -0
  598. data/samples/text/art/richtext/indentmore.xpm +25 -0
  599. data/samples/text/art/richtext/italic.xpm +25 -0
  600. data/samples/text/art/richtext/open.xpm +58 -0
  601. data/samples/text/art/richtext/paste.xpm +47 -0
  602. data/samples/text/art/richtext/redo.xpm +59 -0
  603. data/samples/text/art/richtext/save.xpm +43 -0
  604. data/samples/text/art/richtext/smiley.xpm +42 -0
  605. data/samples/text/art/richtext/underline.xpm +25 -0
  606. data/samples/text/art/richtext/undo.xpm +59 -0
  607. data/samples/text/art/richtext/zebra.xpm +409 -0
  608. data/samples/text/rich_textctrl.rb +8 -3
  609. data/samples/text/richtext.rb +1824 -0
  610. data/samples/text/scintilla.rb +8 -3
  611. data/samples/text/textctrl.rb +21 -4
  612. data/samples/text/tn_richtext.png +0 -0
  613. data/samples/text/unicode.rb +9 -4
  614. data/samples/treectrl/treectrl.rb +10 -5
  615. data/samples/xrc/custom_xrc_sample.rb +8 -3
  616. data/samples/xrc/xrc_sample.rb +8 -3
  617. data/tests/art/test_art/bitmap/wxruby-128x128.png +0 -0
  618. data/tests/art/test_art/bitmap/wxruby-256x256.png +0 -0
  619. data/tests/art/test_art/bitmap/wxruby-64x64.png +0 -0
  620. data/tests/lib/item_container_tests.rb +3 -0
  621. data/tests/lib/text_entry_tests.rb +3 -0
  622. data/tests/lib/wxapp_runner.rb +3 -0
  623. data/tests/lib/wxframe_runner.rb +81 -3
  624. data/tests/test_app_event_filter.rb +3 -0
  625. data/tests/test_app_traits.rb +33 -0
  626. data/tests/test_art.rb +22 -0
  627. data/tests/test_art_provider.rb +3 -0
  628. data/tests/test_aui.rb +65 -0
  629. data/tests/test_basic.rb +5 -1
  630. data/tests/test_box_sizer.rb +5 -2
  631. data/tests/test_clipboard.rb +3 -0
  632. data/tests/test_config.rb +150 -0
  633. data/tests/test_dc.rb +3 -0
  634. data/tests/test_dialog.rb +3 -0
  635. data/tests/test_event_handling.rb +3 -0
  636. data/tests/test_events.rb +3 -0
  637. data/tests/test_ext_controls.rb +286 -3
  638. data/tests/test_file_dialog.rb +55 -0
  639. data/tests/test_font.rb +8 -5
  640. data/tests/test_gdi_object.rb +3 -0
  641. data/tests/test_geometry.rb +4 -0
  642. data/tests/test_grid_sizer.rb +7 -4
  643. data/tests/test_intl.rb +3 -0
  644. data/tests/test_item_data.rb +3 -0
  645. data/tests/test_list_ctrl.rb +4 -1
  646. data/tests/test_log.rb +63 -0
  647. data/tests/test_proof_check.rb +52 -0
  648. data/tests/test_richtext.rb +204 -0
  649. data/tests/test_std_controls.rb +45 -35
  650. data/tests/test_timer.rb +3 -0
  651. data/tests/test_variant.rb +3 -0
  652. data/tests/test_window.rb +10 -8
  653. data/tests/testapp.rb +4 -0
  654. data/tests/testapp_noframe.rb +4 -0
  655. metadata +89 -3
  656. 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