wxruby3 0.9.0.pre.beta.14 → 0.9.0.pre.rc.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (214) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -0
  3. data/INSTALL.md +51 -22
  4. data/README.md +81 -6
  5. data/assets/hello_button-macos.png +0 -0
  6. data/assets/hello_button-msw.png +0 -0
  7. data/assets/hello_button.png +0 -0
  8. data/assets/hello_button_clicked-macos.png +0 -0
  9. data/assets/hello_button_clicked-msw.png +0 -0
  10. data/assets/hello_button_clicked.png +0 -0
  11. data/assets/hello_button_clicked_combi.png +0 -0
  12. data/assets/hello_world-macos.png +0 -0
  13. data/assets/hello_world-msw.png +0 -0
  14. data/assets/hello_world.png +0 -0
  15. data/assets/hello_world_combi.png +0 -0
  16. data/assets/repo-social-preview.png +0 -0
  17. data/ext/wxruby3/include/wxruby-runtime.h +1 -0
  18. data/ext/wxruby3/swig/memory_management.i +6 -10
  19. data/ext/wxruby3/swig/wx.i +17 -6
  20. data/lib/wx/core/art_locator.rb +2 -2
  21. data/lib/wx/core/artprovider.rb +2 -2
  22. data/lib/wx/core/bitmap.rb +6 -5
  23. data/lib/wx/core/bitmap_combobox.rb +34 -0
  24. data/lib/wx/core/brush.rb +6 -0
  25. data/lib/wx/core/controlwithitems.rb +52 -14
  26. data/lib/wx/core/cursor.rb +1 -1
  27. data/lib/wx/core/dc.rb +0 -20
  28. data/lib/wx/core/event_blocker.rb +14 -0
  29. data/lib/wx/core/evthandler.rb +48 -2
  30. data/lib/wx/core/find_replace_dialog.rb +24 -0
  31. data/lib/wx/core/font.rb +22 -14
  32. data/lib/wx/core/helpprovider.rb +2 -2
  33. data/lib/wx/core/icon.rb +1 -1
  34. data/lib/wx/core/image.rb +1 -1
  35. data/lib/wx/core/menu.rb +5 -0
  36. data/lib/wx/core/paintdc.rb +8 -0
  37. data/lib/wx/core/pen.rb +6 -0
  38. data/lib/wx/core/text_entry.rb +15 -0
  39. data/lib/wx/core/v_list_box.rb +13 -0
  40. data/lib/wx/core/window.rb +29 -2
  41. data/lib/wx/doc/app.rb +40 -0
  42. data/lib/wx/doc/brush.rb +17 -0
  43. data/lib/wx/doc/busy_info.rb +21 -0
  44. data/lib/wx/doc/client_dc.rb +28 -0
  45. data/lib/wx/doc/controlwithitems.rb +11 -0
  46. data/lib/wx/doc/dc.rb +0 -14
  47. data/lib/wx/doc/event_blocker.rb +27 -0
  48. data/lib/wx/doc/evthandler.rb +4 -0
  49. data/lib/wx/doc/extra/02_lifecycles.md +49 -0
  50. data/lib/wx/doc/extra/10_art.md +1 -1
  51. data/lib/wx/doc/extra/11_drawing_and_dc.md +62 -0
  52. data/lib/wx/doc/font.rb +27 -0
  53. data/lib/wx/doc/memory_dc.rb +75 -0
  54. data/lib/wx/doc/mirror_dc.rb +16 -0
  55. data/lib/wx/doc/pen.rb +17 -0
  56. data/lib/wx/doc/prt/printer_dc.rb +26 -0
  57. data/lib/wx/doc/radio_box.rb +20 -0
  58. data/lib/wx/doc/screen_dc.rb +10 -6
  59. data/lib/wx/doc/svg_file_dc.rb +20 -0
  60. data/lib/wx/doc/v_list_box.rb +9 -0
  61. data/lib/wx/doc/window.rb +27 -0
  62. data/lib/wx/doc/window_disabler.rb +10 -0
  63. data/lib/wx/html/keyword_defs.rb +6 -7
  64. data/lib/wx/html/require.rb +1 -0
  65. data/lib/wx/html/simple_html_listbox.rb +105 -0
  66. data/lib/wx/keyword_defs.rb +83 -75
  67. data/lib/wx/prt/keyword_defs.rb +5 -1
  68. data/lib/wx/version.rb +1 -1
  69. data/lib/wx/wxruby/cmd/test.rb +1 -1
  70. data/rakelib/install.rb +20 -7
  71. data/rakelib/lib/config/linux.rb +4 -2
  72. data/rakelib/lib/config/macosx.rb +120 -1
  73. data/rakelib/lib/config/mingw.rb +6 -1
  74. data/rakelib/lib/config/unixish.rb +26 -11
  75. data/rakelib/lib/config.rb +15 -6
  76. data/rakelib/lib/core/mapping.rb +5 -5
  77. data/rakelib/lib/core/package.rb +1 -1
  78. data/rakelib/lib/core/spec.rb +9 -5
  79. data/rakelib/lib/core/spec_helper.rb +9 -1
  80. data/rakelib/lib/director/accelerator.rb +1 -1
  81. data/rakelib/lib/director/app.rb +55 -4
  82. data/rakelib/lib/director/art_provider.rb +5 -1
  83. data/rakelib/lib/director/aui_pane_info.rb +1 -1
  84. data/rakelib/lib/director/aui_tab_ctrl.rb +1 -1
  85. data/rakelib/lib/director/aui_toolbar.rb +41 -0
  86. data/rakelib/lib/director/bitmap.rb +2 -1
  87. data/rakelib/lib/director/bitmap_combobox.rb +32 -0
  88. data/rakelib/lib/director/brush.rb +11 -1
  89. data/rakelib/lib/director/busy_info.rb +1 -1
  90. data/rakelib/lib/director/choice.rb +1 -0
  91. data/rakelib/lib/director/clipboard.rb +1 -1
  92. data/rakelib/lib/director/colour.rb +1 -0
  93. data/rakelib/lib/director/colour_picker_ctrl.rb +1 -1
  94. data/rakelib/lib/director/combobox.rb +2 -3
  95. data/rakelib/lib/director/context_help_button.rb +23 -0
  96. data/rakelib/lib/director/ctrl_with_items.rb +3 -0
  97. data/rakelib/lib/director/cursor.rb +1 -0
  98. data/rakelib/lib/director/data_object.rb +5 -7
  99. data/rakelib/lib/director/dc.rb +5 -1
  100. data/rakelib/lib/director/defs.rb +3 -0
  101. data/rakelib/lib/director/derived_dc.rb +278 -27
  102. data/rakelib/lib/director/dialog.rb +12 -3
  103. data/rakelib/lib/director/dir_picker_ctrl.rb +1 -1
  104. data/rakelib/lib/director/event.rb +3 -3
  105. data/rakelib/lib/director/event_blocker.rb +41 -0
  106. data/rakelib/lib/director/event_filter.rb +20 -0
  107. data/rakelib/lib/director/event_handler.rb +29 -2
  108. data/rakelib/lib/director/file_picker_ctrl.rb +1 -1
  109. data/rakelib/lib/director/find_replace_data.rb +1 -0
  110. data/rakelib/lib/director/font.rb +14 -4
  111. data/rakelib/lib/director/font_data.rb +1 -0
  112. data/rakelib/lib/director/font_picker_ctrl.rb +1 -1
  113. data/rakelib/lib/director/gdi_object.rb +1 -0
  114. data/rakelib/lib/director/graphics_context.rb +6 -6
  115. data/rakelib/lib/director/grid_table_message.rb +1 -1
  116. data/rakelib/lib/director/help_provider.rb +8 -10
  117. data/rakelib/lib/director/html_cell.rb +1 -1
  118. data/rakelib/lib/director/html_data_object.rb +5 -7
  119. data/rakelib/lib/director/html_listbox.rb +65 -1
  120. data/rakelib/lib/director/hyperlink_event.rb +22 -0
  121. data/rakelib/lib/director/icon.rb +2 -0
  122. data/rakelib/lib/director/listbox.rb +1 -0
  123. data/rakelib/lib/director/locale.rb +2 -1
  124. data/rakelib/lib/director/menu.rb +0 -3
  125. data/rakelib/lib/director/menu_bar.rb +3 -0
  126. data/rakelib/lib/director/palette.rb +1 -0
  127. data/rakelib/lib/director/pen.rb +12 -2
  128. data/rakelib/lib/director/pgproperties.rb +1 -1
  129. data/rakelib/lib/director/pgproperty.rb +1 -1
  130. data/rakelib/lib/director/pgvalidation_info.rb +1 -1
  131. data/rakelib/lib/director/platform_info.rb +1 -1
  132. data/rakelib/lib/director/popup_window.rb +18 -0
  133. data/rakelib/lib/director/print_data.rb +1 -1
  134. data/rakelib/lib/director/property_grid_interface.rb +1 -1
  135. data/rakelib/lib/director/property_grid_page_state.rb +1 -1
  136. data/rakelib/lib/director/radio_box.rb +15 -4
  137. data/rakelib/lib/director/region.rb +1 -0
  138. data/rakelib/lib/director/ribbon_art_provider.rb +1 -1
  139. data/rakelib/lib/director/richtext_buffer_data_object.rb +5 -7
  140. data/rakelib/lib/director/richtext_header_footer_data.rb +1 -1
  141. data/rakelib/lib/director/searchctrl.rb +25 -0
  142. data/rakelib/lib/director/sizer.rb +2 -2
  143. data/rakelib/lib/director/static_box.rb +1 -1
  144. data/rakelib/lib/director/styled_text_ctrl.rb +2 -0
  145. data/rakelib/lib/director/text_entry.rb +7 -2
  146. data/rakelib/lib/director/textctrl.rb +1 -1
  147. data/rakelib/lib/director/tree_ctrl.rb +6 -3
  148. data/rakelib/lib/director/uiaction_simulator.rb +20 -0
  149. data/rakelib/lib/director/variant.rb +1 -1
  150. data/rakelib/lib/director/vlistbox.rb +25 -0
  151. data/rakelib/lib/director/window.rb +37 -7
  152. data/rakelib/lib/director/with_images.rb +1 -1
  153. data/rakelib/lib/director/xml_node.rb +1 -1
  154. data/rakelib/lib/extractor/function.rb +5 -3
  155. data/rakelib/lib/generate/doc/about_dialog_info.yaml +46 -0
  156. data/rakelib/lib/generate/doc/accelerator.yaml +21 -0
  157. data/rakelib/lib/generate/doc/art_provider.yaml +35 -0
  158. data/rakelib/lib/generate/doc/bitmap.yaml +37 -0
  159. data/rakelib/lib/generate/doc/box_sizer.yaml +15 -0
  160. data/rakelib/lib/generate/doc/busy_info.yaml +74 -0
  161. data/rakelib/lib/generate/doc/client_dc.yaml +19 -0
  162. data/rakelib/lib/generate/doc/clipboard.yaml +43 -0
  163. data/rakelib/lib/generate/doc/collapsible_pane.yaml +21 -0
  164. data/rakelib/lib/generate/doc/colour_dialog.yaml +32 -0
  165. data/rakelib/lib/generate/doc/context_help_button.yaml +16 -0
  166. data/rakelib/lib/generate/doc/control.yaml +46 -0
  167. data/rakelib/lib/generate/doc/cursor.yaml +40 -0
  168. data/rakelib/lib/generate/doc/data_object.yaml +55 -0
  169. data/rakelib/lib/generate/doc/dc.yaml +14 -0
  170. data/rakelib/lib/generate/doc/dialog.yaml +36 -0
  171. data/rakelib/lib/generate/doc/dir_dialog.yaml +25 -0
  172. data/rakelib/lib/generate/doc/event_blocker.yaml +27 -0
  173. data/rakelib/lib/generate/doc/event_filter.yaml +47 -0
  174. data/rakelib/lib/generate/doc/events.yaml +152 -0
  175. data/rakelib/lib/generate/doc/evt_handler.yaml +63 -0
  176. data/rakelib/lib/generate/doc/file_dialog.yaml +68 -0
  177. data/rakelib/lib/generate/doc.rb +77 -14
  178. data/rakelib/lib/generate/interface.rb +22 -10
  179. data/rakelib/lib/specs/interfaces.rb +9 -5
  180. data/rakelib/lib/swig_runner.rb +3 -3
  181. data/rakelib/lib/typemap/common.rb +15 -3
  182. data/rakelib/lib/util/string.rb +1 -0
  183. data/rakelib/yard/yard/relative_markdown_links.rb +5 -1
  184. data/samples/aui/aui.rb +432 -363
  185. data/samples/bigdemo/wxArtProvider.rbw +5 -4
  186. data/samples/controls/controls.rb +2 -2
  187. data/samples/controls/htlbox.rb +411 -0
  188. data/samples/controls/tn_htlbox.png +0 -0
  189. data/samples/drawing/graphics_drawing.rb +1 -2
  190. data/samples/drawing/{svgtest.rb → image_prt.rb} +49 -18
  191. data/samples/drawing/tn_image_prt.png +0 -0
  192. data/samples/propgrid/propgrid.rb +26 -21
  193. data/samples/ribbon/ribbon.rb +47 -46
  194. data/samples/sampler/editor.rb +33 -25
  195. data/samples/sampler/sample.rb +2 -2
  196. data/samples/sampler/stc_editor.rb +4 -2
  197. data/tests/lib/item_container_tests.rb +82 -0
  198. data/tests/lib/text_entry_tests.rb +80 -0
  199. data/tests/lib/wxapp_runner.rb +15 -3
  200. data/tests/lib/wxframe_runner.rb +144 -0
  201. data/tests/test_app_event_filter.rb +74 -0
  202. data/tests/test_art_provider.rb +52 -0
  203. data/tests/test_clipboard.rb +2 -1
  204. data/tests/test_event_handling.rb +199 -16
  205. data/tests/test_events.rb +4 -11
  206. data/tests/test_ext_controls.rb +28 -0
  207. data/tests/test_font.rb +239 -0
  208. data/tests/test_gdi_object.rb +161 -0
  209. data/tests/test_intl.rb +16 -15
  210. data/tests/test_item_data.rb +33 -1
  211. data/tests/test_std_controls.rb +373 -0
  212. data/tests/test_window.rb +340 -0
  213. metadata +82 -4
  214. data/samples/drawing/tn_svgtest.png +0 -0
@@ -153,9 +153,7 @@ class MyFrame < Wx::Frame
153
153
  sizer_panelsizer_h.add(sizer_panelsizer_v, 0)
154
154
  sizer_panel.set_sizer(sizer_panelsizer_h)
155
155
 
156
- label_font = Wx::Font.new(Wx::FontInfo.new(8).light)
157
- @bitmap_creation_dc = Wx::MemoryDC.new
158
- @bitmap_creation_dc.set_font(label_font)
156
+ @label_font = Wx::Font.new(Wx::FontInfo.new(8).light)
159
157
 
160
158
  scheme = Wx::RBN::RibbonPage.new(@ribbon, Wx::ID_ANY, "Appearance", bitmap_(:eye_xpm))
161
159
  @default_primary = Wx::Colour.new
@@ -507,9 +505,10 @@ class MyFrame < Wx::Frame
507
505
 
508
506
  # Colour not in gallery - add it
509
507
  unless item
510
- item = add_colour_to_gallery(gallery,
511
- clr.get_as_string(Wx::C2S_HTML_SYNTAX), @bitmap_creation_dc,
512
- clr)
508
+ Wx::MemoryDC.draw_on do |dc|
509
+ item = add_colour_to_gallery(gallery,
510
+ clr.get_as_string(Wx::C2S_HTML_SYNTAX), dc, clr)
511
+ end
513
512
  gallery.realise
514
513
  end
515
514
 
@@ -738,46 +737,47 @@ class MyFrame < Wx::Frame
738
737
  else
739
738
  gallery = Wx::RBN::RibbonGallery.new(panel, gallery_id)
740
739
  end
741
- dc = @bitmap_creation_dc
742
- def_item = add_colour_to_gallery(gallery, "Default", dc, defclr)
743
- gallery.set_selection(def_item)
744
- add_colour_to_gallery(gallery, "BLUE", dc)
745
- add_colour_to_gallery(gallery, "BLUE VIOLET", dc)
746
- add_colour_to_gallery(gallery, "BROWN", dc)
747
- add_colour_to_gallery(gallery, "CADET BLUE", dc)
748
- add_colour_to_gallery(gallery, "CORAL", dc)
749
- add_colour_to_gallery(gallery, "CYAN", dc)
750
- add_colour_to_gallery(gallery, "DARK GREEN", dc)
751
- add_colour_to_gallery(gallery, "DARK ORCHID", dc)
752
- add_colour_to_gallery(gallery, "FIREBRICK", dc)
753
- add_colour_to_gallery(gallery, "GOLD", dc)
754
- add_colour_to_gallery(gallery, "GOLDENROD", dc)
755
- add_colour_to_gallery(gallery, "GREEN", dc)
756
- add_colour_to_gallery(gallery, "INDIAN RED", dc)
757
- add_colour_to_gallery(gallery, "KHAKI", dc)
758
- add_colour_to_gallery(gallery, "LIGHT BLUE", dc)
759
- add_colour_to_gallery(gallery, "LIME GREEN", dc)
760
- add_colour_to_gallery(gallery, "MAGENTA", dc)
761
- add_colour_to_gallery(gallery, "MAROON", dc)
762
- add_colour_to_gallery(gallery, "NAVY", dc)
763
- add_colour_to_gallery(gallery, "ORANGE", dc)
764
- add_colour_to_gallery(gallery, "ORCHID", dc)
765
- add_colour_to_gallery(gallery, "PINK", dc)
766
- add_colour_to_gallery(gallery, "PLUM", dc)
767
- add_colour_to_gallery(gallery, "PURPLE", dc)
768
- add_colour_to_gallery(gallery, "RED", dc)
769
- add_colour_to_gallery(gallery, "SALMON", dc)
770
- add_colour_to_gallery(gallery, "SEA GREEN", dc)
771
- add_colour_to_gallery(gallery, "SIENNA", dc)
772
- add_colour_to_gallery(gallery, "SKY BLUE", dc)
773
- add_colour_to_gallery(gallery, "TAN", dc)
774
- add_colour_to_gallery(gallery, "THISTLE", dc)
775
- add_colour_to_gallery(gallery, "TURQUOISE", dc)
776
- add_colour_to_gallery(gallery, "VIOLET", dc)
777
- add_colour_to_gallery(gallery, "VIOLET RED", dc)
778
- add_colour_to_gallery(gallery, "WHEAT", dc)
779
- add_colour_to_gallery(gallery, "WHITE", dc)
780
- add_colour_to_gallery(gallery, "YELLOW", dc)
740
+ Wx::MemoryDC.draw_on do |dc|
741
+ def_item = add_colour_to_gallery(gallery, "Default", dc, defclr)
742
+ gallery.set_selection(def_item)
743
+ add_colour_to_gallery(gallery, "BLUE", dc)
744
+ add_colour_to_gallery(gallery, "BLUE VIOLET", dc)
745
+ add_colour_to_gallery(gallery, "BROWN", dc)
746
+ add_colour_to_gallery(gallery, "CADET BLUE", dc)
747
+ add_colour_to_gallery(gallery, "CORAL", dc)
748
+ add_colour_to_gallery(gallery, "CYAN", dc)
749
+ add_colour_to_gallery(gallery, "DARK GREEN", dc)
750
+ add_colour_to_gallery(gallery, "DARK ORCHID", dc)
751
+ add_colour_to_gallery(gallery, "FIREBRICK", dc)
752
+ add_colour_to_gallery(gallery, "GOLD", dc)
753
+ add_colour_to_gallery(gallery, "GOLDENROD", dc)
754
+ add_colour_to_gallery(gallery, "GREEN", dc)
755
+ add_colour_to_gallery(gallery, "INDIAN RED", dc)
756
+ add_colour_to_gallery(gallery, "KHAKI", dc)
757
+ add_colour_to_gallery(gallery, "LIGHT BLUE", dc)
758
+ add_colour_to_gallery(gallery, "LIME GREEN", dc)
759
+ add_colour_to_gallery(gallery, "MAGENTA", dc)
760
+ add_colour_to_gallery(gallery, "MAROON", dc)
761
+ add_colour_to_gallery(gallery, "NAVY", dc)
762
+ add_colour_to_gallery(gallery, "ORANGE", dc)
763
+ add_colour_to_gallery(gallery, "ORCHID", dc)
764
+ add_colour_to_gallery(gallery, "PINK", dc)
765
+ add_colour_to_gallery(gallery, "PLUM", dc)
766
+ add_colour_to_gallery(gallery, "PURPLE", dc)
767
+ add_colour_to_gallery(gallery, "RED", dc)
768
+ add_colour_to_gallery(gallery, "SALMON", dc)
769
+ add_colour_to_gallery(gallery, "SEA GREEN", dc)
770
+ add_colour_to_gallery(gallery, "SIENNA", dc)
771
+ add_colour_to_gallery(gallery, "SKY BLUE", dc)
772
+ add_colour_to_gallery(gallery, "TAN", dc)
773
+ add_colour_to_gallery(gallery, "THISTLE", dc)
774
+ add_colour_to_gallery(gallery, "TURQUOISE", dc)
775
+ add_colour_to_gallery(gallery, "VIOLET", dc)
776
+ add_colour_to_gallery(gallery, "VIOLET RED", dc)
777
+ add_colour_to_gallery(gallery, "WHEAT", dc)
778
+ add_colour_to_gallery(gallery, "WHITE", dc)
779
+ add_colour_to_gallery(gallery, "YELLOW", dc)
780
+ end
781
781
 
782
782
  gallery
783
783
  end
@@ -802,6 +802,7 @@ class MyFrame < Wx::Frame
802
802
 
803
803
  bitmap = Wx::Bitmap.new(iWidth, iHeight)
804
804
  dc.select_object(bitmap)
805
+ dc.set_font(@label_font)
805
806
  b = Wx::Brush.new (c)
806
807
  dc.set_pen(Wx::BLACK_PEN)
807
808
  dc.set_brush(b)
@@ -34,8 +34,8 @@ module WxRuby
34
34
  end
35
35
 
36
36
  class SampleEditPanel
37
- def initialize(parent, sample)
38
- @frame = parent
37
+ def initialize(frame, parent, sample)
38
+ @frame = frame
39
39
  @sample = sample
40
40
  @splitter = Wx::SplitterWindow.new(parent, Wx::ID_ANY)
41
41
 
@@ -67,6 +67,8 @@ module WxRuby
67
67
  @edt_book.set_selection(0)
68
68
  end
69
69
 
70
+ attr_reader :splitter
71
+
70
72
  def add_editor_page(filename, pgnr)
71
73
  panel = Wx::Panel.new(@edt_book, Wx::ID_ANY)
72
74
  edt_sizer = Wx::HBoxSizer.new
@@ -306,30 +308,36 @@ module WxRuby
306
308
  menuBar.append(menuHelp, "&Help")
307
309
  set_menu_bar(menuBar)
308
310
 
309
- tb = create_tool_bar(Wx::TB_HORIZONTAL | Wx::NO_BORDER | Wx::TB_FLAT)
310
- tb.tool_bitmap_size = [ 16, 16 ]
311
- tb.add_tool(ID::SAVE, 'Save', bitmap(:filesave), 'Save the sample to a local folder')
312
- tb.add_tool(ID::RUN, 'Run', bitmap(:play), 'Run the (changed) sample')
313
- tb.add_separator
314
- tb.add_tool(ID::UNDO, 'Undo', bitmap(:undo), 'Undo change')
315
- tb.add_tool(ID::REDO, 'Redo', bitmap(:redo), 'Redo change')
316
- tb.add_separator
317
- tb.add_tool(ID::COPY, 'Copy', bitmap(:copy), 'Copy selection')
318
- tb.add_tool(ID::CUT, 'Cut', bitmap(:cut), 'Cut selection')
319
- tb.add_tool(ID::PASTE, 'Paste', bitmap(:paste), 'Paste selection')
320
- tb.add_separator
321
- tb.add_tool(ID::FIND, 'Find', bitmap(:find), 'Show Find Dialog')
322
- tb.add_tool(ID::FIND_NEXT, 'FindNext', bitmap(:forward), 'Find next occurrence of the search phrase')
323
- tb.add_tool(ID::FIND_PREV, 'FindPrev', bitmap(:back), 'Find previous occurrence of the search phrase')
324
- tb.add_tool(ID::REPLACE, 'Replace', bitmap(:findrepl), 'Show Replace Dialog')
325
- tb.realize
311
+ panel = Wx::Panel.new(self)
312
+ panel_szr = Wx::VBoxSizer.new
313
+ @tbar = Wx::ToolBar.new(panel, style: Wx::TB_HORIZONTAL | Wx::NO_BORDER | Wx::TB_FLAT)
314
+ @tbar.tool_bitmap_size = [ 16, 16 ]
315
+ @tbar.add_tool(ID::SAVE, 'Save', bitmap(:filesave), 'Save the sample to a local folder')
316
+ @tbar.add_tool(ID::RUN, 'Run', bitmap(:play), 'Run the (changed) sample')
317
+ @tbar.add_separator
318
+ @tbar.add_tool(ID::UNDO, 'Undo', bitmap(:undo), 'Undo change')
319
+ @tbar.add_tool(ID::REDO, 'Redo', bitmap(:redo), 'Redo change')
320
+ @tbar.add_separator
321
+ @tbar.add_tool(ID::COPY, 'Copy', bitmap(:copy), 'Copy selection')
322
+ @tbar.add_tool(ID::CUT, 'Cut', bitmap(:cut), 'Cut selection')
323
+ @tbar.add_tool(ID::PASTE, 'Paste', bitmap(:paste), 'Paste selection')
324
+ @tbar.add_separator
325
+ @tbar.add_tool(ID::FIND, 'Find', bitmap(:find), 'Show Find Dialog')
326
+ @tbar.add_tool(ID::FIND_NEXT, 'FindNext', bitmap(:forward), 'Find next occurrence of the search phrase')
327
+ @tbar.add_tool(ID::FIND_PREV, 'FindPrev', bitmap(:back), 'Find previous occurrence of the search phrase')
328
+ @tbar.add_tool(ID::REPLACE, 'Replace', bitmap(:findrepl), 'Show Replace Dialog')
329
+ @tbar.realize
330
+ panel_szr.add(@tbar)
331
+
332
+ # Create the editor panel
333
+ @editors = SampleEditPanel.new(self, panel, @sample)
334
+ panel_szr.add(@editors.splitter, 1, Wx::GROW, 0)
335
+
336
+ panel.set_sizer(panel_szr)
326
337
 
327
338
  create_status_bar(1)
328
339
  set_status_text("Welcome to wxRuby Sample editor.")
329
340
 
330
- # Create the editor panel
331
- @editors = SampleEditPanel.new(self, @sample)
332
-
333
341
  evt_idle(:on_idle)
334
342
 
335
343
  evt_update_editor_ui(:on_update_editor_ui)
@@ -382,15 +390,15 @@ module WxRuby
382
390
  def update_undo_redo(f_undo, f_redo)
383
391
  @m_undo.enable(f_undo)
384
392
  @m_redo.enable(f_redo)
385
- self.tool_bar.enable_tool(ID::UNDO, f_undo)
386
- self.tool_bar.enable_tool(ID::REDO, f_redo)
393
+ @tbar.enable_tool(ID::UNDO, f_undo)
394
+ @tbar.enable_tool(ID::REDO, f_redo)
387
395
  set_status_text('')
388
396
  end
389
397
  private :update_undo_redo
390
398
 
391
399
  def update_paste(f_paste)
392
400
  @m_paste.enable(f_paste)
393
- self.tool_bar.enable_tool(ID::PASTE, f_paste)
401
+ @tbar.enable_tool(ID::PASTE, f_paste)
394
402
  set_status_text('')
395
403
  end
396
404
 
@@ -293,7 +293,7 @@ module WxRuby
293
293
  category.modulize!
294
294
  Dir[File.join(entry, '*.rb')].each do |rb|
295
295
  # only if this is a file (paranoia check) and contains 'include WxRuby::Sample'
296
- if File.file?(rb) && (sample_lns = File.readlines(rb)).any? { |ln| /\s+include\s+WxRuby::Sample/ =~ ln }
296
+ if File.file?(rb) && (sample_lns = File.readlines(rb, encoding: 'utf-8')).any? { |ln| /\s+include\s+WxRuby::Sample/ =~ ln }
297
297
  # register currently required files
298
298
  cur_loaded = ::Set.new($LOADED_FEATURES)
299
299
  @loading_sample = rb
@@ -302,7 +302,7 @@ module WxRuby
302
302
  # in the class/module scope in which the dialog class is defined working from the dialog class name;
303
303
  # this will fail for anonymous modules as these cannot be identified by name)
304
304
  sample_mod = Sample.const_set("SampleLoader_#{File.basename(rb, '.*').modulize!}", Module.new)
305
- sample_mod.module_eval File.read(rb), rb, 1
305
+ sample_mod.module_eval File.read(rb, encoding: 'utf-8'), rb, 1
306
306
  # determine additionally required files
307
307
  new_loaded = ::Set.new($LOADED_FEATURES) - cur_loaded
308
308
  sample_captures.each do |mod|
@@ -114,8 +114,9 @@ module WxRuby
114
114
 
115
115
  def default_theme
116
116
  c_maroon = Wx::Colour.new('Maroon')
117
- style_set_foreground(Wx::STC::STC_STYLE_DEFAULT, Wx::BLACK);
118
- style_set_background(Wx::STC::STC_STYLE_DEFAULT, Wx::WHITE);
117
+ style_set_foreground(Wx::STC::STC_STYLE_DEFAULT, Wx::BLACK)
118
+ style_set_background(Wx::STC::STC_STYLE_DEFAULT, Wx::WHITE)
119
+ set_caret_foreground(Wx::BLACK)
119
120
  style_clear_all
120
121
  style_set_foreground(Wx::STC::STC_STYLE_LINENUMBER, Wx::Colour.new('Dark Grey'))
121
122
  style_set_background(Wx::STC::STC_STYLE_LINENUMBER, Wx::WHITE);
@@ -160,6 +161,7 @@ module WxRuby
160
161
  c_str = Wx::Colour.new('Lime Green')
161
162
  style_set_background(Wx::STC::STC_STYLE_DEFAULT, bg)
162
163
  style_set_foreground(Wx::STC::STC_STYLE_DEFAULT, Wx::WHITE)
164
+ set_caret_foreground(Wx::WHITE)
163
165
  style_clear_all
164
166
  style_set_background(Wx::STC::STC_STYLE_LINENUMBER, bg)
165
167
  style_set_foreground(Wx::STC::STC_STYLE_LINENUMBER, Wx::WHITE)
@@ -0,0 +1,82 @@
1
+
2
+ module ItemContainerTests
3
+
4
+ def test_ic_append
5
+ container.append("item 0")
6
+
7
+ assert_equal("item 0", container.get_string(0))
8
+
9
+ container.append(['item 1', 'item 2'])
10
+
11
+ assert_equal("item 1", container.get_string(1))
12
+ assert_equal("item 2", container.get_string(2))
13
+
14
+ container.append(['item 3', 'item 4'])
15
+
16
+ assert_equal("item 3", container.get_string(3))
17
+ assert_equal("item 4", container.get_string(4))
18
+ end
19
+
20
+ def test_ic_insert
21
+ assert_equal(0, container.insert("item 0", 0))
22
+ assert_equal("item 0", container.get_string(0))
23
+
24
+ assert_equal(1, container.insert(['item 1', 'item 2'], 0))
25
+
26
+ assert_equal("item 1", container.get_string(0))
27
+ assert_equal("item 2", container.get_string(1))
28
+
29
+ assert_equal(2, container.insert(['item 3', 'item 4'], 1))
30
+ assert_equal("item 3", container.get_string(1))
31
+ assert_equal("item 4", container.get_string(2))
32
+ end
33
+
34
+ def test_ic_count
35
+ assert(container.empty?)
36
+ assert_with_assertion_failure { container.get_string(0) }
37
+
38
+ container.append(['item 0', 'item 1', 'item 2', 'item 3'])
39
+
40
+ assert(!container.empty?)
41
+ assert_equal(4, container.count)
42
+
43
+ container.delete(0)
44
+
45
+ assert_equal(3, container.count)
46
+
47
+ container.delete(0)
48
+ container.delete(0)
49
+
50
+ assert_equal(1, container.count)
51
+
52
+ container.insert(['item 0', 'item 1', 'item 2', 'item 3'], 1)
53
+
54
+ assert_equal(5, container.count)
55
+ assert_with_assertion_failure { container.get_string(10) }
56
+ end
57
+
58
+ def test_ic_item_selection
59
+ container.append(['item 0', 'item 1', 'item 2', 'ITEM 2'])
60
+
61
+ container.set_selection(Wx::NOT_FOUND)
62
+ assert_equal(Wx::NOT_FOUND, container.get_selection)
63
+ assert_equal("", container.get_string_selection)
64
+
65
+ container.set_selection(1)
66
+ assert_equal(1, container.get_selection)
67
+ assert_equal("item 1", container.get_string_selection)
68
+
69
+ assert(container.set_string_selection("item 2"))
70
+ assert_equal(2, container.get_selection)
71
+ assert_equal("item 2", container.get_string_selection)
72
+
73
+ # Check that selecting a non-existent item fails.
74
+ assert(!container.set_string_selection("bloordyblop"))
75
+
76
+ # Check that SetStringSelection() is case-insensitive.
77
+ assert(container.set_string_selection("ITEM 2"))
78
+ assert_equal(2, container.get_selection)
79
+ assert_equal("item 2", container.get_string_selection)
80
+ end
81
+
82
+ end
@@ -0,0 +1,80 @@
1
+
2
+ module TextEntryTests
3
+
4
+ def test_te_set_value
5
+ text_entry.set_focus # removes the 'Hint' test which in GTK2 causes problems
6
+ assert(text_entry.empty?)
7
+
8
+ text_entry.value = 'foo'
9
+ assert_equal('foo', text_entry.value)
10
+
11
+ text_entry.value = ''
12
+ assert(text_entry.empty?)
13
+
14
+ text_entry.value = 'hi'
15
+ assert_equal('hi', text_entry.value)
16
+
17
+ text_entry.value = 'bye'
18
+ assert_equal('bye', text_entry.value)
19
+ end
20
+
21
+ def test_te_text_change_events
22
+ updates = count_events(text_entry, :evt_text) do |c_upd|
23
+
24
+ # WXQT only sends event when text changes
25
+ unless Wx::PLATFORM == 'WXQT'
26
+ text_entry.value = ''
27
+ assert_equal(1, c_upd.count)
28
+ c_upd.count = 0
29
+ end
30
+
31
+ text_entry.value = 'foo'
32
+ assert_equal(1, c_upd.count)
33
+ c_upd.count = 0
34
+
35
+ # WXQT only sends event when text changes
36
+ unless Wx::PLATFORM == 'WXQT'
37
+ text_entry.value = 'foo'
38
+ assert_equal(1, c_upd.count)
39
+ c_upd.count = 0
40
+ end
41
+
42
+ text_entry.value = ''
43
+ assert_equal(1, c_upd.count)
44
+ c_upd.count = 0
45
+
46
+ text_entry.change_value('bar')
47
+ assert_equal(0, c_upd.count)
48
+
49
+ text_entry.append_text('bar')
50
+ assert_equal(1, c_upd.count)
51
+ c_upd.count = 0
52
+
53
+ text_entry.replace(3, 6, 'baz')
54
+ assert_equal(1, c_upd.count)
55
+ c_upd.count = 0
56
+
57
+ text_entry.remove(0, 3)
58
+ assert_equal(1, c_upd.count)
59
+ c_upd.count = 0
60
+
61
+ text_entry.write_text('foo')
62
+ assert_equal(1, c_upd.count)
63
+ c_upd.count = 0
64
+
65
+ text_entry.clear
66
+ assert_equal(1, c_upd.count)
67
+ c_upd.count = 0
68
+
69
+ text_entry.change_value('')
70
+ assert_equal(0, c_upd.count)
71
+
72
+ text_entry.change_value('non-empty')
73
+ assert_equal(0, c_upd.count)
74
+
75
+ text_entry.change_value('')
76
+ assert_equal(0, c_upd.count)
77
+ end
78
+ end
79
+
80
+ end
@@ -3,7 +3,7 @@ require 'test/unit'
3
3
  require 'test/unit/ui/console/testrunner'
4
4
  require 'wx'
5
5
 
6
- module Wx::SF
6
+ module WxRuby
7
7
 
8
8
  module Test
9
9
 
@@ -33,7 +33,7 @@ module Wx::SF
33
33
 
34
34
  org_start_mtd = instance_method :start
35
35
  define_method :start do
36
- (app = Wx::SF::Test::App.new(self, org_start_mtd)).run
36
+ (app = WxRuby::Test::App.new(self, org_start_mtd)).run
37
37
  app.result
38
38
  end
39
39
 
@@ -46,7 +46,7 @@ end
46
46
  module Test
47
47
  module Unit
48
48
  AutoRunner.register_runner(:wxapp) do |auto_runner|
49
- Wx::SF::Test::Runner
49
+ WxRuby::Test::Runner
50
50
  end
51
51
  AutoRunner.default_runner = :wxapp
52
52
  if defined? ::IntelliJ
@@ -60,5 +60,17 @@ module Test
60
60
  end
61
61
  end
62
62
  end
63
+
64
+ class TestCase
65
+
66
+ def self.is_ci_build?
67
+ !!ENV['GITHUB_ACTION']
68
+ end
69
+
70
+ def is_ci_build?
71
+ TestCase.is_ci_build?
72
+ end
73
+
74
+ end
63
75
  end
64
76
  end
@@ -0,0 +1,144 @@
1
+
2
+ require_relative './wxapp_runner'
3
+
4
+ module WxRuby
5
+
6
+ module Test
7
+
8
+ class App < Wx::App
9
+
10
+ Assert = Struct.new(:file, :line, :func, :condition, :message)
11
+
12
+ class AssertFailureSink
13
+ def initialize
14
+ @asserts = []
15
+ end
16
+
17
+ attr_reader :asserts
18
+
19
+ def asserts?
20
+ !@asserts.empty?
21
+ end
22
+
23
+ def <<(assert)
24
+ @asserts << assert
25
+ end
26
+ end
27
+
28
+ def on_init
29
+ @assert_sink = nil
30
+ @tests_have_run = false
31
+ evt_idle :on_idle
32
+ @frame = Wx::Frame.new(nil, size: [600,400])
33
+ @frame.show
34
+ end
35
+
36
+ def on_idle(_evt)
37
+ done = @tests_have_run
38
+ @tests_have_run = true
39
+ @result = @start_mtd.bind(@test_runner).call unless done
40
+ self.exit_main_loop
41
+ end
42
+
43
+ attr_reader :frame
44
+
45
+ def open_assert_sink
46
+ @assert_sink = AssertFailureSink.new
47
+ end
48
+
49
+ def close_assert_sink
50
+ @assert_sink = nil
51
+ end
52
+
53
+ def asserts
54
+ @assert_sink.asserts
55
+ end
56
+
57
+ def asserts?
58
+ @assert_sink.asserts?
59
+ end
60
+
61
+ def on_assert_failure(file, line, func, condition, message)
62
+ if @assert_sink
63
+ @assert_sink << Assert.new(file, line, func, condition, message)
64
+ else
65
+ super
66
+ end
67
+ end
68
+ end
69
+
70
+ class GUITests < ::Test::Unit::TestCase
71
+
72
+ def test_frame
73
+ Wx.get_app.frame
74
+ end
75
+
76
+ class EventCounter
77
+ def initialize
78
+ @count = 0
79
+ end
80
+ attr_accessor :count
81
+
82
+ def inc
83
+ @count +=1
84
+ end
85
+
86
+ def wait_event(msec)
87
+ start = Time.now
88
+ msec /= 1000.0
89
+ while (Time.now - start) < msec
90
+ Wx.get_app.yield
91
+ if @count > 0
92
+ raise StandardError.new("Too many events. Expected a single one.") unless @count == 1
93
+ @count = 0
94
+ return true
95
+ end
96
+ sleep(50.0/1000.0)
97
+ end
98
+ false
99
+ end
100
+ end
101
+
102
+ def self.has_ui_simulator?
103
+ Wx.has_feature?(:USE_UIACTIONSIMULATOR) && (Wx::PLATFORM != 'WXOSX' || Wx::WXWIDGETS_VERSION >= '3.3')
104
+ end
105
+
106
+ def has_ui_simulator?
107
+ GUITests.has_ui_simulator?
108
+ end
109
+
110
+ def count_events(win, evt, id1=Wx::ID_ANY, id2=nil)
111
+ return 0 unless block_given?
112
+ evt_count = EventCounter.new
113
+ if Wx::EvtHandler.event_type_arity(evt) == 0
114
+ win.event_handler.send(evt.to_sym, ->(evt){ evt_count.inc; evt.skip if !evt.command_event? })
115
+ elsif id2.nil?
116
+ win.event_handler.send(evt.to_sym, id1, ->(evt){ evt_count.inc; evt.skip if !evt.command_event? })
117
+ else
118
+ win.event_handler.send(evt.to_sym, id1, id2, ->(evt){ evt_count.inc; evt.skip if !evt.command_event? })
119
+ end
120
+ begin
121
+ yield evt_count
122
+ ensure
123
+ win.event_handler.disconnect(id1, id2 || Wx::ID_ANY, evt.to_sym)
124
+ end
125
+ evt_count.count
126
+ end
127
+
128
+ def assert_with_assertion_failure(max_asserts: nil, func: nil, &block)
129
+ Wx.get_app.open_assert_sink
130
+ begin
131
+ block.call
132
+ raise StandardError.new('No Wx assertion failure captured!') unless Wx.get_app.asserts?
133
+ raise StandardError.new("Too many assertion failures captures! Expected max #{max_asserts}, captured #{Wx.get_app.asserts.size}") if max_asserts && max_asserts < Wx.get_app.asserts.size
134
+ raise StandardError.new("Unexpected assertions failures. Expected assertion failure from #{func} but captured assertions from #{Wx.get_app.asserts.collect {|a| a.func } }") if func && !Wx.get_app.asserts.any? { |a| a.func == func }
135
+ ensure
136
+ Wx.get_app.close_assert_sink
137
+ end
138
+ end
139
+
140
+ end
141
+
142
+ end
143
+
144
+ end
@@ -0,0 +1,74 @@
1
+
2
+ require_relative './lib/wxapp_runner'
3
+
4
+ class AppEventFilterTests < Test::Unit::TestCase
5
+
6
+ class TestEvent < Wx::Event
7
+ EVT_TEST_EVENT = Wx::EvtHandler.register_class(self, nil, 'evt_test_event', 0)
8
+ def initialize(id=0)
9
+ super(EVT_TEST_EVENT, id)
10
+ end
11
+ end
12
+
13
+ class TestCmdEvent < Wx::CommandEvent
14
+ EVT_TEST_CMD_EVENT = Wx::EvtHandler.register_class(self, nil, 'evt_test_cmd_event', 0)
15
+ def initialize(id=0)
16
+ super(EVT_TEST_CMD_EVENT, id)
17
+ end
18
+ end
19
+
20
+ class TestFrame < Wx::Frame
21
+ def initialize
22
+ super(nil, size: [300,300])
23
+ @test_event = false
24
+ @test_cmd_event = false
25
+
26
+ evt_test_event { |evt| @test_event = true }
27
+ evt_test_cmd_event { |evt| @test_cmd_event = true }
28
+ end
29
+
30
+ attr_reader :test_event, :test_cmd_event
31
+
32
+ def reset
33
+ @test_event = false
34
+ @test_cmd_event = false
35
+ end
36
+ end
37
+
38
+ module ::WxRuby
39
+ module Test
40
+ class App < Wx::App
41
+ def filter_event(event)
42
+ @filtered = true if event.is_a?(TestEvent)
43
+ super
44
+ end
45
+
46
+ def filtered
47
+ @filtered
48
+ end
49
+
50
+ def filtered=(f)
51
+ @filtered = f
52
+ end
53
+ end
54
+ end
55
+ end
56
+
57
+ def test_app_event_filter
58
+ GC.start
59
+ win = TestFrame.new
60
+ win.event_handler.process_event(TestEvent.new)
61
+ GC.start
62
+ assert(Wx.get_app.filtered)
63
+ Wx.get_app.filtered = false
64
+ win.event_handler.process_event(TestCmdEvent.new)
65
+ GC.start
66
+ assert(!Wx.get_app.filtered)
67
+ assert_nothing_raised { Wx::EvtHandler.clear_filters }
68
+ GC.start
69
+ win.event_handler.process_event(TestEvent.new)
70
+ assert(Wx.get_app.filtered)
71
+ GC.start
72
+ end
73
+
74
+ end