wxruby3 1.2.1 → 1.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/ext/wxruby3/swig/custom/director.swg +16 -22
  3. data/ext/wxruby3/swig/custom/rubyapi.swg +15 -1
  4. data/lib/wx/aui/auimanager.rb +61 -14
  5. data/lib/wx/core/animation.rb +35 -14
  6. data/lib/wx/core/array_ext.rb +1 -0
  7. data/lib/wx/core/brush.rb +8 -0
  8. data/lib/wx/core/choicedlg.rb +7 -10
  9. data/lib/wx/core/colour.rb +10 -0
  10. data/lib/wx/core/defs.rb +49 -0
  11. data/lib/wx/core/dialog.rb +2 -2
  12. data/lib/wx/core/enum.rb +16 -3
  13. data/lib/wx/core/event.rb +7 -0
  14. data/lib/wx/core/file_dialog.rb +25 -0
  15. data/lib/wx/core/font.rb +14 -0
  16. data/lib/wx/core/gdi_object.rb +24 -0
  17. data/lib/wx/core/hboxsizer.rb +24 -4
  18. data/lib/wx/core/object.rb +26 -11
  19. data/lib/wx/core/pen.rb +20 -0
  20. data/lib/wx/core/real_point.rb +1 -0
  21. data/lib/wx/core/sizer.rb +166 -39
  22. data/lib/wx/core/variant.rb +108 -51
  23. data/lib/wx/core/vboxsizer.rb +24 -4
  24. data/lib/wx/doc/array_ext.rb +1 -0
  25. data/lib/wx/doc/aui/auimanager.rb +2 -0
  26. data/lib/wx/doc/colour.rb +12 -0
  27. data/lib/wx/doc/enum.rb +26 -0
  28. data/lib/wx/doc/evthandler.rb +6 -0
  29. data/lib/wx/doc/functions.rb +35 -3
  30. data/lib/wx/doc/gdi_common.rb +1 -0
  31. data/lib/wx/doc/gdi_object.rb +22 -0
  32. data/lib/wx/doc/object.rb +24 -0
  33. data/lib/wx/doc/variant.rb +8 -0
  34. data/lib/wx/helpers.rb +2 -3
  35. data/lib/wx/keyword_defs.rb +7 -0
  36. data/lib/wx/version.rb +1 -1
  37. data/rakelib/lib/config.rb +1 -1
  38. data/rakelib/lib/core/include/funcall.inc +9 -24
  39. data/rakelib/lib/core/include/swigdirector.inc +29 -11
  40. data/rakelib/lib/core/include/swigrubyrun.inc +2 -2
  41. data/rakelib/lib/director/animation_ctrl.rb +6 -0
  42. data/rakelib/lib/director/aui_manager.rb +118 -3
  43. data/rakelib/lib/director/defs.rb +3 -0
  44. data/rakelib/lib/director/dialog.rb +17 -7
  45. data/rakelib/lib/director/file_dialog_customize_hook.rb +77 -1
  46. data/rakelib/lib/director/functions.rb +0 -12
  47. data/rakelib/lib/director/pgproperties.rb +2 -2
  48. data/rakelib/lib/director/property_grid_interface.rb +4 -3
  49. data/rakelib/lib/director/textctrl.rb +7 -0
  50. data/rakelib/lib/director/validator.rb +7 -42
  51. data/rakelib/lib/director/variant.rb +2 -2
  52. data/rakelib/lib/extractor/function.rb +5 -0
  53. data/rakelib/lib/generate/doc/credential_entry_dialog.yaml +10 -0
  54. data/rakelib/lib/generate/doc/generic_about_dialog.yaml +46 -0
  55. data/rakelib/lib/specs/interfaces.rb +2 -0
  56. data/rakelib/lib/swig_runner.rb +6 -3
  57. data/rakelib/lib/typemap/common.rb +2 -2
  58. data/rakelib/lib/util/string.rb +7 -6
  59. data/samples/animate/anitest.rb +13 -9
  60. data/samples/dialogs/dialogs.rb +1 -1
  61. data/tests/lib/leaked_overload_exception_test.rb +25 -0
  62. data/tests/lib/leaked_process_event_exception_test.rb +33 -0
  63. data/tests/lib/leaked_queued_event_exception_test.rb +34 -0
  64. data/tests/lib/overload_type_exception_test.rb +25 -0
  65. data/tests/test_exceptions.rb +24 -24
  66. metadata +13 -3
@@ -14,36 +14,20 @@ typedef VALUE (*RUBY_INVOKE_FUNC) (VALUE);
14
14
  VALUE rb_exc_set_backtrace(VALUE, VALUE);
15
15
  VALUE rb_get_backtrace(VALUE);
16
16
 
17
- namespace Swig
18
- {
19
- class WXRB_EXPORT_FLAG DirectorRubyException : public DirectorException
20
- {
21
- public:
22
- DirectorRubyException(VALUE error, VALUE rcvr, ID fn_id)
23
- : DirectorException(Qnil)
24
- {
25
- VALUE msg = rb_sprintf("Caught exception in SWIG director method for %s#%s : ", rb_class2name(CLASS_OF(rcvr)), rb_id2name(fn_id));
26
- rb_str_append(msg, rb_funcall(error, rb_intern("message"), 0));
27
- this->swig_msg = StringValuePtr(msg);
28
- swig_error = rb_exc_new_str(rb_eRuntimeError, msg);
29
- VALUE bt = rb_funcall(error, rb_intern("backtrace"), 0);
30
- rb_funcall(swig_error, rb_intern("set_backtrace"), 1, bt);
31
- }
32
- };
33
- }
17
+ WXRB_EXPORT_FLAG void wxRuby_PrintException(VALUE err);
34
18
 
35
19
  class WXRuby_RBFuncall
36
20
  {
37
21
  public:
38
- WXRuby_RBFuncall (ID fnid, bool throw_on_ex=true)
22
+ WXRuby_RBFuncall (ID fnid, bool exit_on_ex=true)
39
23
  : fn_id_ (fnid),
40
- throw_on_ex_ (throw_on_ex),
24
+ exit_on_ex_ (exit_on_ex),
41
25
  ex_caught_ (false)
42
26
  {
43
27
  }
44
- WXRuby_RBFuncall (const char* fn, bool throw_on_ex=true)
28
+ WXRuby_RBFuncall (const char* fn, bool exit_on_ex=true)
45
29
  : fn_id_ (rb_intern (fn)),
46
- throw_on_ex_ (throw_on_ex),
30
+ exit_on_ex_ (exit_on_ex),
47
31
  ex_caught_ (false)
48
32
  {
49
33
  }
@@ -89,11 +73,12 @@ protected:
89
73
  &invoke_state);
90
74
  if (invoke_state)
91
75
  {
92
- if (this->throw_on_ex_)
76
+ if (this->exit_on_ex_)
93
77
  {
94
78
  // handle exception
95
79
  VALUE rexc = this->get_exception ();
96
- throw Swig::DirectorRubyException(rexc, fa.receiver_, this->fn_id_);
80
+ wxRuby_PrintException(rexc);
81
+ ::exit(255);
97
82
  }
98
83
  else
99
84
  {
@@ -158,7 +143,7 @@ protected:
158
143
 
159
144
  private:
160
145
  ID fn_id_;
161
- bool throw_on_ex_;
146
+ bool exit_on_ex_;
162
147
  bool ex_caught_;
163
148
  };
164
149
 
@@ -188,23 +188,23 @@ namespace Swig
188
188
 
189
189
  DirectorTypeMismatchException(VALUE self, const char *method, VALUE error, const char *msg="");
190
190
 
191
- static inline void raise(VALUE error, const char *msg)
192
- {
193
- throw DirectorTypeMismatchException(error, msg);
194
- }
191
+ static void raise(VALUE error, const char *msg);
195
192
 
196
- static inline void raise(const char *msg)
197
- {
198
- throw DirectorTypeMismatchException(msg);
199
- }
193
+ static void raise(const char *msg);
200
194
 
201
- static inline void raise(VALUE self, const char* method, VALUE error, const char *msg)
195
+ static void raise(VALUE self, const char* method, VALUE error, const char *msg);
196
+
197
+ private:
198
+ static void print(const DirectorTypeMismatchException& ex)
202
199
  {
203
- throw DirectorTypeMismatchException(self, method, error, msg);
200
+ VALUE bt = rb_eval_string("caller");
201
+ bt = rb_funcall(bt, rb_intern("join"), 1, rb_str_new2("\n\tfrom "));
202
+ std::cerr << std::endl
203
+ << ' ' << ex.getMessage() << '(' << rb_class2name(ex.getType()) << ')' << std::endl
204
+ << "\tfrom " << StringValuePtr(bt) << std::endl << std::endl;
204
205
  }
205
206
  };
206
207
 
207
-
208
208
  DirectorTypeMismatchException::DirectorTypeMismatchException(VALUE self, const char *method, VALUE error, const char *msg)
209
209
  : DirectorException(Qnil)
210
210
  {
@@ -217,6 +217,24 @@ namespace Swig
217
217
  this->setup_error(rb_eTypeError);
218
218
  }
219
219
 
220
+ void DirectorTypeMismatchException::raise(VALUE error, const char *msg)
221
+ {
222
+ print(DirectorTypeMismatchException(error, msg));
223
+ ::exit(254);
224
+ }
225
+
226
+ void DirectorTypeMismatchException::raise(const char *msg)
227
+ {
228
+ print(DirectorTypeMismatchException(msg));
229
+ ::exit(254);
230
+ }
231
+
232
+ void DirectorTypeMismatchException::raise(VALUE self, const char* method, VALUE error, const char *msg)
233
+ {
234
+ print(DirectorTypeMismatchException(self, method, error, msg));
235
+ ::exit(254);
236
+ }
237
+
220
238
  /* Any Ruby exception that occurs during a director method call */
221
239
  class WXRB_EXPORT_FLAG DirectorMethodException : public DirectorException
222
240
  {
@@ -59,9 +59,9 @@ extern "C" {
59
59
  #endif
60
60
 
61
61
  WXRB_EXPORT_FLAG VALUE
62
- SWIG_Ruby_AppendOutput(VALUE target, VALUE o)
62
+ SWIG_wxRuby_AppendOutput(VALUE target, VALUE o, int is_void)
63
63
  {
64
- if (NIL_P(target))
64
+ if (NIL_P(target) && is_void != 0)
65
65
  {
66
66
  target = o;
67
67
  }
@@ -40,7 +40,13 @@ module WXRuby3
40
40
  spec.map 'const std::vector<wxAnimation>&' => 'Array<Wx::Animation>', swig: false do
41
41
  map_out code: ''
42
42
  end
43
+ # adjust documentation for #set_animation argument
44
+ spec.map 'const wxAnimationBundle &animations', as: 'Wx::AnimationBundle,Wx::Animation', swig: false do
45
+ map_in code: ''
46
+ end
43
47
  end
48
+ # replace method signature by one that provides a default argument to correctly provide
49
+ # the two overloads the Ruby way
44
50
  spec.ignore 'wxGenericAnimationCtrl::Play'
45
51
  spec.extend_interface 'wxGenericAnimationCtrl', 'bool Play(bool looped=true)'
46
52
  spec.do_not_generate :variables, :enums, :defines, :functions
@@ -16,7 +16,98 @@ module WXRuby3
16
16
 
17
17
  def setup
18
18
  super
19
- spec.gc_as_object
19
+ spec.gc_as_object 'wxAuiManager'
20
+ if Config.instance.wx_version >= '3.3.0'
21
+ spec.items << 'wxAuiSerializer' << 'wxAuiDockInfo' << 'wxAuiDeserializer'
22
+ spec.gc_as_untracked 'wxAuiSerializer', 'wxAuiDockInfo'
23
+ spec.regard 'wxAuiDockInfo::rect',
24
+ 'wxAuiDockInfo::dock_direction',
25
+ 'wxAuiDockInfo::dock_layer',
26
+ 'wxAuiDockInfo::dock_row',
27
+ 'wxAuiDockInfo::size',
28
+ 'wxAuiDockInfo::min_size',
29
+ 'wxAuiDockInfo::resizable',
30
+ 'wxAuiDockInfo::toolbar',
31
+ 'wxAuiDockInfo::fixed',
32
+ 'wxAuiDockInfo::reserved1'
33
+ spec.make_readonly 'wxAuiDockInfo::rect',
34
+ 'wxAuiDockInfo::dock_direction',
35
+ 'wxAuiDockInfo::dock_layer',
36
+ 'wxAuiDockInfo::dock_row',
37
+ 'wxAuiDockInfo::size',
38
+ 'wxAuiDockInfo::min_size',
39
+ 'wxAuiDockInfo::resizable',
40
+ 'wxAuiDockInfo::toolbar',
41
+ 'wxAuiDockInfo::fixed',
42
+ 'wxAuiDockInfo::reserved1'
43
+ spec.add_extend_code 'wxAuiDockInfo', <<~__HEREDOC
44
+ VALUE each_pane()
45
+ {
46
+ wxAuiPaneInfoPtrArray panes = self->panes;
47
+ VALUE rc = Qnil;
48
+ for (wxAuiPaneInfo* pane : panes)
49
+ {
50
+ VALUE r_pane = SWIG_NewPointerObj(pane, SWIGTYPE_p_wxAuiPaneInfo, 0);
51
+ rc = rb_yield(r_pane);
52
+ }
53
+ return rc;
54
+ }
55
+ __HEREDOC
56
+ spec.map 'std::vector<wxAuiPaneInfo>' => 'Array<Wx::AuiPaneInfo>' do
57
+ map_out code: <<~__CODE
58
+ $result = rb_ary_new();
59
+ std::vector<wxAuiPaneInfo>& panes = (std::vector<wxAuiPaneInfo>&)$1;
60
+ for (const wxAuiPaneInfo& pane : panes)
61
+ {
62
+ VALUE r_pane = SWIG_NewPointerObj(new wxAuiPaneInfo(pane), SWIGTYPE_p_wxAuiPaneInfo, SWIG_POINTER_OWN);
63
+ rb_ary_push($result, r_pane);
64
+ }
65
+ __CODE
66
+ map_directorout code: <<~__CODE
67
+ if (TYPE($input) == T_ARRAY)
68
+ {
69
+ for (int i = 0; i < RARRAY_LEN($input); i++)
70
+ {
71
+ void *ptr;
72
+ VALUE r_pane = rb_ary_entry($input, i);
73
+ int res = SWIG_ConvertPtr(r_pane, &ptr, SWIGTYPE_p_wxAuiPaneInfo, 0);
74
+ if (!SWIG_IsOK(res) || !ptr) {
75
+ Swig::DirectorTypeMismatchException::raise(swig_get_self(), "load_panes", rb_eTypeError, "in return value. Expected Array of Wx::AuiPaneInfo");
76
+ }
77
+ wxAuiPaneInfo *pane = reinterpret_cast< wxAuiPaneInfo * >(ptr);
78
+ $result.push_back(*pane);
79
+ }
80
+ }
81
+ __CODE
82
+ end
83
+ spec.map 'std::vector<wxAuiDockInfo>' => 'Array<Wx::AuiDockInfo>' do
84
+ map_out code: <<~__CODE
85
+ $result = rb_ary_new();
86
+ std::vector<wxAuiDockInfo>& docks = (std::vector<wxAuiDockInfo>&)$1;
87
+ for (const wxAuiDockInfo& dock : docks)
88
+ {
89
+ VALUE r_dock = SWIG_NewPointerObj(new wxAuiDockInfo(dock), SWIGTYPE_p_wxAuiDockInfo, SWIG_POINTER_OWN);
90
+ rb_ary_push($result, r_dock);
91
+ }
92
+ __CODE
93
+ map_directorout code: <<~__CODE
94
+ if (TYPE($input) == T_ARRAY)
95
+ {
96
+ for (int i = 0; i < RARRAY_LEN($input); i++)
97
+ {
98
+ void *ptr;
99
+ VALUE r_dock = rb_ary_entry($input, i);
100
+ int res = SWIG_ConvertPtr(r_dock, &ptr, SWIGTYPE_p_wxAuiDockInfo, 0);
101
+ if (!SWIG_IsOK(res) || !ptr) {
102
+ Swig::DirectorTypeMismatchException::raise(swig_get_self(), "load_docks", rb_eTypeError, "in return value. Expected Array of Wx::AuiDockInfo");
103
+ }
104
+ wxAuiDockInfo *dock = reinterpret_cast< wxAuiDockInfo * >(ptr);
105
+ $result.push_back(*dock);
106
+ }
107
+ }
108
+ __CODE
109
+ end
110
+ end
20
111
  # need a custom implementation to handle (event handler proc) cleanup
21
112
  spec.add_header_code <<~__HEREDOC
22
113
  #include "wx/aui/aui.h"
@@ -80,7 +171,7 @@ module WXRuby3
80
171
  rb_gc_mark( rb_art_prov );
81
172
  }
82
173
  }
83
- __HEREDOC
174
+ __HEREDOC
84
175
  spec.add_swig_code '%markfunc wxAuiManager "GC_mark_wxAuiManager";'
85
176
  # provide pure Ruby implementation based on use custom alternative provided below
86
177
  spec.ignore('wxAuiManager::GetAllPanes')
@@ -110,12 +201,36 @@ module WXRuby3
110
201
  WXRubyAuiManager* aui_mng = dynamic_cast<WXRubyAuiManager*> (self);
111
202
  managedWnd->Bind(wxEVT_CLOSE_WINDOW, &WXRubyAuiManager::OnManagedWindowClose, aui_mng);
112
203
  }
113
- __HEREDOC
204
+ __HEREDOC
114
205
  spec.suppress_warning(473, 'wxAuiManager::CreateFloatingFrame')
115
206
  spec.do_not_generate(:variables, :defines, :enums, :functions) # with AuiPaneInfo
116
207
  end
208
+
209
+ def doc_generator
210
+ AuiManagerDocGenerator.new(self)
211
+ end
117
212
  end # class AuiManager
118
213
 
214
+ class AuiManagerDocGenerator < DocGenerator
215
+
216
+ def gen_class_doc_members(fdoc, clsdef, cls_members, alias_methods)
217
+ super
218
+ if Config.instance.wx_version >= '3.3.0' && clsdef.name == 'wxAuiDockInfo'
219
+ fdoc.doc.puts 'Yield each pane to the given block.'
220
+ fdoc.doc.puts 'If no block passed returns an Enumerator.'
221
+ fdoc.doc.puts '@yieldparam [Wx::AUI::AuiPaneInfo] pane the Aui pane info yielded'
222
+ fdoc.doc.puts '@return [::Object, ::Enumerator] result of last block execution or enumerator'
223
+ fdoc.puts 'def each_pane; end'
224
+ fdoc.puts
225
+ fdoc.doc.puts 'Returns an array of Wx::AuiPaneInfo for all panes managed by the frame manager.'
226
+ fdoc.doc.puts '@return [Array<Wx::AUI::AuiPaneInfo>] info for all managed panes'
227
+ fdoc.puts 'def get_panes; end'
228
+ fdoc.puts 'alias_method :panes, :get_panes'
229
+ end
230
+ end
231
+
232
+ end
233
+
119
234
  end # class Director
120
235
 
121
236
  end # module WXRuby3
@@ -32,6 +32,9 @@ module WXRuby3
32
32
  wxDELETEA
33
33
  wxSwap
34
34
  }
35
+ if Config.instance.wx_version >= '3.3.0'
36
+ spec.ignore %w[wxWARN_UNUSED]
37
+ end
35
38
  spec.ignore 'wxOVERRIDE'
36
39
  super
37
40
  end
@@ -144,13 +144,6 @@ module WXRuby3
144
144
  when 'wxMultiChoiceDialog'
145
145
  # unnneeded and unwanted for Ruby
146
146
  spec.ignore 'wxMultiChoiceDialog::wxMultiChoiceDialog(wxWindow *,const wxString &,const wxString &,int,const wxString *,long,const wxPoint &)'
147
- # Wx's MultiChoiceDialog offers the possibility of attaching client
148
- # data to each choice. However this would need memory management, and a
149
- # pure ruby implementation is trivial and likely to be more convenient
150
- # on a per-case basis so just ignore this argument for Ruby.
151
- spec.map 'char** clientData' do
152
- map_in ignore: true, code: '$1 = (char **)NULL;'
153
- end
154
147
  spec.do_not_generate(:functions, :enums, :defines)
155
148
  when 'wxDirDialog'
156
149
  when 'wxProgressDialog'
@@ -227,6 +220,23 @@ module WXRuby3
227
220
  'wxWizard::GetCurrentPage',
228
221
  'wxWizard::GetPageAreaSizer')
229
222
  spec.do_not_generate(:variables, :enums, :defines, :functions)
223
+ when 'wxCredentialEntryDialog'
224
+ spec.items << 'wxWebCredentials'
225
+ spec.do_not_generate(:functions, :enums, :defines)
226
+ when 'wxGenericAboutDialog'
227
+ # inheritance chain missing from wxw docs
228
+ spec.override_inheritance_chain(spec.module_name, %w[wxDialog wxTopLevelWindow wxNonOwnedWindow wxWindow wxEvtHandler wxObject])
229
+ spec.gc_as_dialog(spec.module_name)
230
+ # regard protected methods
231
+ spec.regard 'wxGenericAboutDialog::DoAddCustomControls',
232
+ 'wxGenericAboutDialog::AddControl',
233
+ 'wxGenericAboutDialog::AddText'
234
+ if Config.instance.wx_version >= '3.3.0'
235
+ spec.regard 'wxGenericAboutDialog::GetCustomControlParent'
236
+ end
237
+ if Config.instance.features_set?('USE_COLLPANE')
238
+ spec.regard 'wxGenericAboutDialog::AddCollapsiblePane'
239
+ end
230
240
  end
231
241
  end
232
242
 
@@ -17,9 +17,85 @@ module WXRuby3
17
17
  def setup
18
18
  super
19
19
  spec.items << 'wxFileDialogCustomize'
20
- spec.gc_as_marked 'wxFileDialogCustomizeHook' # not tracked but cached in Ruby
20
+ spec.gc_as_object 'wxFileDialogCustomizeHook'
21
21
  spec.gc_as_untracked 'wxFileDialogCustomize'
22
22
  spec.make_abstract 'wxFileDialogCustomize'
23
+ spec.map_apply 'int n, const wxString* choices' => 'size_t n, const wxString *strings'
24
+ # make Ruby director and wrappers use custom implementation
25
+ spec.use_class_implementation('wxFileDialogCustomizeHook', 'wxRubyFileDialogCustomizeHook')
26
+ spec.make_concrete('wxFileDialogCustomizeHook')
27
+ # prevent director overload; custom impl handles this
28
+ spec.no_proxy 'wxFileDialogCustomizeHook::AddCustomControls',
29
+ 'wxFileDialogCustomizeHook::UpdateCustomControls',
30
+ 'wxFileDialogCustomizeHook::TransferDataFromCustomControls'
31
+ # do not wrap these
32
+ spec.ignore 'wxFileDialogCustomizeHook::AddCustomControls',
33
+ 'wxFileDialogCustomizeHook::UpdateCustomControls',
34
+ 'wxFileDialogCustomizeHook::TransferDataFromCustomControls',
35
+ ignore_doc: false
36
+ spec.add_header_code <<~__HEREDOC
37
+ class wxRubyFileDialogCustomizeHook : public wxFileDialogCustomizeHook
38
+ {
39
+ public:
40
+ wxRubyFileDialogCustomizeHook() : wxFileDialogCustomizeHook() {}
41
+ ~wxRubyFileDialogCustomizeHook() {};
42
+
43
+ // from virtual void wxFileDialogCustomizeHook::AddCustomControls
44
+ virtual void AddCustomControls(wxFileDialogCustomize &customizer) override
45
+ {
46
+ VALUE obj0 = Qnil ;
47
+ VALUE SWIGUNUSED result;
48
+
49
+ obj0 = SWIG_NewPointerObj(SWIG_as_voidptr(&customizer), SWIGTYPE_p_wxFileDialogCustomize, 0 );
50
+ VALUE self = SWIG_RubyInstanceFor(this);
51
+ bool ex = false;
52
+ result = wxRuby_Funcall(ex, self, rb_intern("add_custom_controls"), 1,obj0);
53
+ if (ex)
54
+ {
55
+ wxRuby_PrintException(result);
56
+ }
57
+ }
58
+
59
+ // from virtual void wxFileDialogCustomizeHook::UpdateCustomControls
60
+ virtual void UpdateCustomControls() override
61
+ {
62
+ VALUE SWIGUNUSED result;
63
+
64
+ if (!this->finished_)
65
+ {
66
+ VALUE self = SWIG_RubyInstanceFor(this);
67
+ bool ex = false;
68
+ result = wxRuby_Funcall(ex, self, rb_intern("update_custom_controls"), 0, NULL);
69
+ if (ex)
70
+ {
71
+ wxRuby_PrintException(result);
72
+ }
73
+ }
74
+ }
75
+
76
+ // from virtual void wxFileDialogCustomizeHook::TransferDataFromCustomControls
77
+ virtual void TransferDataFromCustomControls() override
78
+ {
79
+ VALUE SWIGUNUSED result;
80
+
81
+
82
+ if (!this->finished_)
83
+ {
84
+ this->finished_ = true;
85
+ VALUE self = SWIG_RubyInstanceFor(this);
86
+ bool ex = false;
87
+ result = wxRuby_Funcall(ex, self, rb_intern("transfer_data_from_custom_controls"), 0, NULL);
88
+ if (ex)
89
+ {
90
+ wxRuby_PrintException(result);
91
+ }
92
+ }
93
+ }
94
+
95
+ private:
96
+ bool finished_ {};
97
+ };
98
+ __HEREDOC
23
99
  end
24
100
  end # class FileDialogCustomizeHook
25
101
 
@@ -208,18 +208,6 @@ module WXRuby3
208
208
  wxWindow * wxGetActiveWindow();
209
209
 
210
210
  // Dialog shortcuts
211
- VOID_INT wxGetSelectedChoices(wxArrayInt& selections,
212
- const wxString& message,
213
- const wxString& caption,
214
- int n, const wxString *choices,
215
- wxWindow *parent = NULL,
216
- int x = wxDefaultCoord,
217
- int y = wxDefaultCoord,
218
- bool centre = true,
219
- int width = wxCHOICE_WIDTH,
220
- int height = wxCHOICE_HEIGHT);
221
-
222
-
223
211
  wxString wxFileSelector (const wxString &message,
224
212
  const wxString &default_path=wxEmptyString,
225
213
  const wxString &default_filename=wxEmptyString,
@@ -141,7 +141,7 @@ module WXRuby3
141
141
  spec.map_apply 'int * OUTPUT' => 'int* pIndex'
142
142
  end
143
143
  # for UIntProperty and IntProperty
144
- if Config.instance.features_set?('USE_LONGLONG')
144
+ if Config.instance.features_set?('USE_LONGLONG') || Config.instance.wx_version >= '3.3.0'
145
145
  # wxLongLong mapping to be considered before considering 'long' (see typecheck precedence)
146
146
  spec.map 'const wxLongLong&' => 'Integer' do
147
147
  map_in temp: 'wxLongLong tmp', code: <<~__CODE
@@ -162,7 +162,7 @@ module WXRuby3
162
162
  end
163
163
  else
164
164
  spec.ignore 'wxUIntProperty::wxUIntProperty(const wxString &, const wxString &, const wxULongLong &)',
165
- 'wxIntProperty::wxUIntProperty(const wxString &, const wxString &, const wxLongLong &)'
165
+ 'wxIntProperty::wxIntProperty(const wxString &, const wxString &, const wxLongLong &)'
166
166
  end
167
167
  spec.new_object 'wxArrayStringProperty::CreateEditorDialog'
168
168
  spec.suppress_warning(473, 'wxArrayStringProperty::CreateEditorDialog')
@@ -39,9 +39,10 @@ module WXRuby3
39
39
  spec.extend_interface 'wxPropertyGridInterface',
40
40
  'void SetPropertyValues(const wxVariant &list, const wxPGPropArgCls& defaultCategory = 0)'
41
41
  # optionals
42
- spec.ignore_unless 'USE_LONGLONG',
43
- 'wxPropertyGridInterface::GetPropertyValueAsLongLong',
44
- 'wxPropertyGridInterface::GetPropertyValueAsULongLong'
42
+ unless Config.instance.features_set?('USE_LONGLONG') || Config.instance.wx_version >= '3.3.0'
43
+ spec.ignore_unless 'wxPropertyGridInterface::GetPropertyValueAsLongLong',
44
+ 'wxPropertyGridInterface::GetPropertyValueAsULongLong'
45
+ end
45
46
  spec.ignore_unless 'USE_DATETIME', 'wxPropertyGridInterface::GetPropertyValueAsDateTime'
46
47
  spec.ignore_unless 'USE_VALIDATORS', 'wxPropertyGridInterface::GetPropertyValidator'
47
48
  # fix incorrect XML documentation
@@ -24,6 +24,13 @@ module WXRuby3
24
24
  spec.ignore 'wxTextCtrl::GTKGetTextBuffer',
25
25
  'wxTextCtrl::GTKGetEditable'
26
26
  end
27
+ if Config.instance.wx_version >= '3.3.0' && Config.instance.wx_port == :wxmsw
28
+ spec.items << 'wxTextSearch' << 'wxTextSearchResult'
29
+ spec.regard 'wxTextSearchResult::m_start', 'wxTextSearchResult::m_end'
30
+ spec.make_readonly 'wxTextSearchResult::m_start', 'wxTextSearchResult::m_end'
31
+ spec.rename_for_ruby 'start' => 'wxTextSearchResult::m_start',
32
+ 'end' => 'wxTextSearchResult::m_end'
33
+ end
27
34
  if Config.instance.wx_port == :wxqt
28
35
  # not implemented
29
36
  spec.ignore 'wxTextCtrl::OnDropFiles'
@@ -42,13 +42,8 @@ module WXRuby3
42
42
 
43
43
  wxObject* wxRubyValidator::Clone() const
44
44
  {
45
- bool ex_caught = false;
46
45
  VALUE self = const_cast<wxRubyValidator*> (this)->get_self();
47
- VALUE rc = wxRuby_Funcall(ex_caught, self, clone_id(), 0);
48
- if (ex_caught)
49
- {
50
- throw Swig::DirectorRubyException(rc, self, clone_id());
51
- }
46
+ VALUE rc = wxRuby_Funcall(self, clone_id(), 0);
52
47
  void *ptr;
53
48
  int res = SWIG_ConvertPtr(rc, &ptr, SWIGTYPE_p_wxValidator, 0);
54
49
  if (!SWIG_IsOK(res))
@@ -77,22 +72,12 @@ module WXRuby3
77
72
 
78
73
  VALUE wxRubyValidator::DoTransferFromWindow()
79
74
  {
80
- bool ex_caught = false;
81
- VALUE rc = wxRuby_Funcall(ex_caught, this->get_self(), do_transfer_from_window_id(), 0);
82
- if (ex_caught)
83
- {
84
- throw Swig::DirectorRubyException(rc, this->get_self(), do_transfer_from_window_id());
85
- }
75
+ VALUE rc = wxRuby_Funcall(this->get_self(), do_transfer_from_window_id(), 0);
86
76
  return rc;
87
77
  }
88
78
  bool wxRubyValidator::DoTransferToWindow(VALUE data)
89
79
  {
90
- bool ex_caught = false;
91
- VALUE rc = wxRuby_Funcall(ex_caught, this->get_self(), do_transfer_to_window_id(), 1, data);
92
- if (ex_caught)
93
- {
94
- throw Swig::DirectorRubyException(rc, this->get_self(), do_transfer_to_window_id());
95
- }
80
+ VALUE rc = wxRuby_Funcall(this->get_self(), do_transfer_to_window_id(), 1, data);
96
81
  return (rc == Qtrue);
97
82
  }
98
83
 
@@ -111,22 +96,12 @@ module WXRuby3
111
96
 
112
97
  bool wxRubyValidatorBinding::DoOnTransferFromWindow(VALUE data)
113
98
  {
114
- bool ex_caught = false;
115
- VALUE rc = wxRuby_Funcall(ex_caught, this->get_self(), do_on_transfer_from_window_id(), 1, data);
116
- if (ex_caught)
117
- {
118
- throw Swig::DirectorRubyException(rc, this->get_self(), do_on_transfer_from_window_id());
119
- }
99
+ VALUE rc = wxRuby_Funcall(this->get_self(), do_on_transfer_from_window_id(), 1, data);
120
100
  return (rc == Qtrue);
121
101
  }
122
102
  VALUE wxRubyValidatorBinding::DoOnTransferToWindow()
123
103
  {
124
- bool ex_caught = false;
125
- VALUE rc = wxRuby_Funcall(ex_caught, this->get_self(), do_on_transfer_to_window_id(), 0);
126
- if (ex_caught)
127
- {
128
- throw Swig::DirectorRubyException(rc, this->get_self(), do_on_transfer_to_window_id());
129
- }
104
+ VALUE rc = wxRuby_Funcall(this->get_self(), do_on_transfer_to_window_id(), 0);
130
105
  return rc;
131
106
  }
132
107
 
@@ -134,12 +109,7 @@ module WXRuby3
134
109
  {
135
110
  if (!NIL_P(this->on_transfer_from_win_proc_))
136
111
  {
137
- bool ex_caught = false;
138
- VALUE rc = wxRuby_Funcall(ex_caught, this->on_transfer_from_win_proc_, call_id(), 1, data);
139
- if (ex_caught)
140
- {
141
- throw Swig::DirectorRubyException(rc, this->on_transfer_from_win_proc_, call_id());
142
- }
112
+ wxRuby_Funcall(this->on_transfer_from_win_proc_, call_id(), 1, data);
143
113
  }
144
114
  return true;
145
115
  }
@@ -147,12 +117,7 @@ module WXRuby3
147
117
  {
148
118
  if (!NIL_P(this->on_transfer_to_win_proc_))
149
119
  {
150
- bool ex_caught = false;
151
- VALUE rc = wxRuby_Funcall(ex_caught, this->on_transfer_to_win_proc_, call_id(), 0);
152
- if (ex_caught)
153
- {
154
- throw Swig::DirectorRubyException(rc, this->on_transfer_to_win_proc_, call_id());
155
- }
120
+ VALUE rc = wxRuby_Funcall(this->on_transfer_to_win_proc_, call_id(), 0);
156
121
  return rc;
157
122
  }
158
123
  return Qnil;
@@ -142,7 +142,7 @@ module WXRuby3
142
142
  {
143
143
  return wxVariant(TYPE(rbval) == T_TRUE);
144
144
  }
145
- #ifdef wxUSE_LONGLONG
145
+ #if !defined(wxUSE_LONGLONG) || (wxUSE_LONGLONG == 1)
146
146
  if ((sizeof(long) < 8) && (TYPE(rbval) == T_BIGNUM) && (rb_big_sign(rbval) == 0))
147
147
  {
148
148
  wxLongLong_t ll = rb_big2ll(rbval);
@@ -227,7 +227,7 @@ module WXRuby3
227
227
  $1 = rb_obj_is_kind_of($input, rb_const_get(mWxPG, var_ColourPropertyValue_id()));
228
228
  __CODE
229
229
  end
230
- if Config.instance.features_set?('USE_LONGLONG')
230
+ if Config.instance.features_set?('USE_LONGLONG') || Config.instance.wx_version >= '3.3.0'
231
231
  # wxLongLong mapping to be considered before considering 'long' (see typecheck precedence)
232
232
  spec.map 'wxLongLong' => 'Integer' do
233
233
  map_in code: <<~__CODE
@@ -49,6 +49,9 @@ module WXRuby3
49
49
  @template_params << txt
50
50
  end
51
51
  @args_string = element.at_xpath('argsstring').text
52
+ # transform unified initializers to ctor form (SWIG does not like unified initializers)
53
+ # (also see ParamDef#extract)
54
+ @args_string.gsub!(/(\w+(::\w+)*)\s*{([^}]*)}/) { |_| "#{$1}(#{$3})"}
52
55
  check_deprecated
53
56
  element.xpath('param').each do |node|
54
57
  p = ParamDef.new(node)
@@ -370,6 +373,8 @@ module WXRuby3
370
373
  end
371
374
  if element.at_xpath('defval')
372
375
  @default = BaseDef.flatten_node(element.at_xpath('defval'))
376
+ # transform unified initializers to ctor form (SWIG does not like unified initializers)
377
+ @default.sub!(/(\w+(::\w+)*)\s*{([^}]*)}/) { |_| "#{$1}(#{$3})"}
373
378
  end
374
379
  end
375
380
  rescue Exception
@@ -0,0 +1,10 @@
1
+ ---
2
+ :wxCredentialEntryDialog:
3
+ :detail:
4
+ :pre:
5
+ :programlisting:
6
+ - :pattern: !ruby/regexp /.*/
7
+ :replace: ''
8
+ :para:
9
+ - :pattern: !ruby/regexp /Simple\s+example/
10
+ :replace: ''