1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: callback helper class for virtual functions
4 // Author: Mattia Barbon
7 // RCS-ID: $Id: v_cback.h 2533 2009-03-08 19:03:35Z mbarbon $
8 // Copyright: (c) 2000-2007, 2009 Mattia Barbon
9 // Licence: This program is free software; you can redistribute it and/or
10 // modify it under the same terms as Perl itself
11 /////////////////////////////////////////////////////////////////////////////
13 #ifndef _WXPERL_V_CBACK_H
14 #define _WXPERL_V_CBACK_H
21 wxAutoSV( pTHX_ SV* sv )
27 ~wxAutoSV() { SvREFCNT_dec( m_sv ); }
29 operator SV*() { return m_sv; }
30 operator const SV*() const { return m_sv; }
31 operator bool() const { return m_sv != NULL; }
32 bool operator !() const { return m_sv == NULL; }
33 SV* operator->() { return m_sv; }
34 const SV* operator->() const { return m_sv; }
45 #define wxPliFCback wxPliVirtualCallback_FindCallback
46 #define wxPliCCback wxPliVirtualCallback_CallCallback
48 class wxPliVirtualCallback : public wxPliSelfRef
51 wxPliVirtualCallback( const char* package );
53 // these aren't really const functions, but we will need
54 // to declare m_method mutable...
55 bool FindCallback( pTHX_ const char* name ) const;
56 SV* CallCallback( pTHX_ I32 flags, const char* argtypes,
57 va_list& arglist ) const;
58 CV* GetMethod() const { return m_method; }
60 bool IsOk() const { return GetSelf() && m_package; }
62 const char* m_package;
67 inline wxPliVirtualCallback::wxPliVirtualCallback( const char* package )
74 // declare/define callbacks for commonly used signatures
77 #define wxPli_CONST const
80 #define DEC_V_CBACK_BOOL__WXDRAGRESULT( METHOD ) \
81 bool METHOD( wxDragResult )
83 #define DEF_V_CBACK_BOOL__WXDRAGRESULT( CLASS, BASE, METHOD ) \
84 bool CLASS::METHOD( wxDragResult p1 ) \
87 if( wxPliVirtualCallback_FindCallback( aTHX_ &m_callback, #METHOD ) ) \
89 SV* ret = wxPliVirtualCallback_CallCallback( aTHX_ &m_callback, \
92 bool val = SvTRUE( ret ); \
93 SvREFCNT_dec( ret ); \
96 return BASE::METHOD( p1 ); \
99 #define DEC_V_CBACK_WXDRAGRESULT__WXCOORD_WXCOORD_WXDRAGRESULT( METHOD ) \
100 wxDragResult METHOD( wxCoord, wxCoord, wxDragResult )
102 #define DEF_V_CBACK_WXDRAGRESULT__WXCOORD_WXCOORD_WXDRAGRESULT( CLASS, BASE, METHOD ) \
103 wxDragResult CLASS::METHOD( wxCoord p1, wxCoord p2, wxDragResult p3 ) \
106 if( wxPliVirtualCallback_FindCallback( aTHX_ &m_callback, #METHOD ) ) \
108 SV* ret = wxPliVirtualCallback_CallCallback( aTHX_ &m_callback, \
110 "lli", p1, p2, p3 ); \
111 wxDragResult val = (wxDragResult)SvIV( ret ); \
112 SvREFCNT_dec( ret ); \
115 return BASE::METHOD( p1, p2, p3 ); \
118 #define DEF_V_CBACK_WXDRAGRESULT__WXCOORD_WXCOORD_WXDRAGRESULT_pure( CLASS, BASE, METHOD ) \
119 wxDragResult CLASS::METHOD( wxCoord p1, wxCoord p2, \
123 if( wxPliVirtualCallback_FindCallback( aTHX_ &m_callback, #METHOD ) ) \
125 SV* ret = wxPliVirtualCallback_CallCallback( aTHX_ &m_callback, \
127 "lli", p1, p2, p3 ); \
128 wxDragResult val = (wxDragResult)SvIV( ret ); \
129 SvREFCNT_dec( ret ); \
135 #define DEC_V_CBACK_BOOL__WXCOORD_WXCOORD( METHOD ) \
136 bool METHOD( wxCoord, wxCoord )
138 #define DEF_V_CBACK_BOOL__WXCOORD_WXCOORD( CLASS, BASE, METHOD ) \
139 bool CLASS::METHOD( wxCoord p1, wxCoord p2 ) \
142 if( wxPliVirtualCallback_FindCallback( aTHX_ &m_callback, #METHOD ) ) \
144 SV* ret = wxPliVirtualCallback_CallCallback( aTHX_ &m_callback, \
147 bool val = SvTRUE( ret ); \
148 SvREFCNT_dec( ret ); \
151 return BASE::METHOD( p1, p2 ); \
154 #define DEC_V_CBACK_BOOL__WXCOORD_WXCOORD_WXSTRING( METHOD ) \
155 bool METHOD( wxCoord, wxCoord, const wxString& )
157 #define DEF_V_CBACK_BOOL__WXCOORD_WXCOORD_WXSTRING_pure( CLASS, BASE, METHOD ) \
158 bool CLASS::METHOD( wxCoord p1, wxCoord p2, const wxString& p3 )\
161 if( wxPliVirtualCallback_FindCallback( aTHX_ &m_callback, #METHOD ) ) \
163 SV* ret = wxPliVirtualCallback_CallCallback( aTHX_ &m_callback, \
165 "llP", p1, p2, &p3 ); \
166 bool val = SvTRUE( ret ); \
167 SvREFCNT_dec( ret ); \
173 #define DEC_V_CBACK_BOOL__WXCOORD_WXCOORD_WXARRAYSTRING( METHOD ) \
174 bool METHOD( wxCoord, wxCoord, const wxArrayString& )
176 #define DEF_V_CBACK_BOOL__WXCOORD_WXCOORD_WXARRAYSTRING_pure( CLASS, BASE, METHOD )\
177 bool CLASS::METHOD( wxCoord p1, wxCoord p2, const wxArrayString& p3 ) \
180 if( wxPliVirtualCallback_FindCallback( aTHX_ &m_callback, #METHOD ) ) \
183 size_t i, max = p3.GetCount(); \
185 for( i = 0; i < max; ++i ) \
187 SV* sv = newSViv( 0 ); \
188 const wxString& tmp = p3[ i ]; \
189 WXSTRING_OUTPUT( tmp, sv ); \
190 av_store( av, i, sv ); \
192 SV* rv = newRV_noinc( (SV*) av ); \
193 SV* ret = wxPliVirtualCallback_CallCallback( aTHX_ &m_callback, \
195 "lls", p1, p2, rv ); \
196 bool val = SvTRUE( ret ); \
197 SvREFCNT_dec( ret ); \
203 #define DEC_V_CBACK_WXSTRING__WXSTRING_INT( METHOD ) \
204 wxString METHOD( const wxString&, int )
206 #define DEC_V_CBACK_WXFSFILEP__WXFILESYSTEM_WXSTRING( METHOD ) \
207 wxFSFile* METHOD( wxFileSystem&, const wxString& )
209 #define DEC_V_CBACK_VOID__WXLOGLEVEL_CWXCHARP_TIMET( METHOD ) \
210 void METHOD( wxLogLevel, const wxChar*, time_t )
212 #define DEF_V_CBACK_VOID__WXLOGLEVEL_CWXCHARP_TIMET( CLASS, BASE, METHOD )\
213 void CLASS::METHOD( wxLogLevel p1, const wxChar* p2, time_t p3 ) \
216 if( wxPliVirtualCallback_FindCallback( aTHX_ &m_callback, #METHOD ) ) \
218 wxPliVirtualCallback_CallCallback( aTHX_ &m_callback, G_VOID, \
219 "iwl", int(p1), p2, long(p3) ); \
221 BASE::METHOD( p1, p2, p3 ); \
224 #define DEC_V_CBACK_VOID__CWXCHARP_TIMET( METHOD ) \
225 void METHOD( const wxChar*, time_t )
227 #define DEF_V_CBACK_VOID__CWXCHARP_TIMET( CLASS, BASE, METHOD )\
228 void CLASS::METHOD( const wxChar* p1, time_t p2 ) \
231 if( wxPliVirtualCallback_FindCallback( aTHX_ &m_callback, #METHOD ) ) \
233 wxPliVirtualCallback_CallCallback( aTHX_ &m_callback, G_VOID, \
234 "wl", p1, long(p2) ); \
236 BASE::METHOD( p1, p2 ); \
239 // ANY METH(int, int, int)
240 #define DEC_V_CBACK_ANY__INT_INT_INT_( RET, METHOD, CONST ) \
241 RET METHOD( int, int, int ) CONST
243 #define DEF_V_CBACK_ANY__INT_INT_INT_( RET, CVT, CLASS, CALLBASE, METHOD, CONST )\
244 RET CLASS::METHOD( int p1, int p2, int p3 ) CONST \
247 if( wxPliVirtualCallback_FindCallback( aTHX_ &m_callback, #METHOD ) )\
249 wxAutoSV ret( aTHX_ wxPliCCback( aTHX_ &m_callback, G_SCALAR, \
250 "iii", p1, p2, p3 ) ); \
256 // bool METH(int, int, const wxString&)
257 #define DEC_V_CBACK_BOOL__INT_INT_WXSTRING_( METHOD, CONST ) \
258 bool METHOD( int, int, const wxString& ) CONST
260 #define DEF_V_CBACK_BOOL__INT_INT_WXSTRING_( CLASS, CALLBASE, METHOD, CONST )\
261 bool CLASS::METHOD( int p1, int p2, const wxString& p3 ) CONST \
264 if( wxPliFCback( aTHX_ &m_callback, #METHOD ) ) \
266 wxAutoSV ret( aTHX_ wxPliCCback( aTHX_ &m_callback, G_SCALAR, \
267 "iiP", p1, p2, &p3 ) ); \
268 return SvTRUE( ret ); \
273 #define DEC_V_CBACK_BOOL__INT_INT_WXSTRING( METHOD ) \
274 DEC_V_CBACK_BOOL__INT_INT_WXSTRING_( METHOD, wxPli_NOCONST )
276 #define DEF_V_CBACK_BOOL__INT_INT_WXSTRING( CLASS, BASE, METHOD ) \
277 DEF_V_CBACK_BOOL__INT_INT_WXSTRING_( CLASS, return BASE::METHOD(p1, p2, p3), METHOD, wxPli_NOCONST )
279 #define DEF_V_CBACK_BOOL__INT_INT_WXSTRING_pure( CLASS, BASE, METHOD ) \
280 DEF_V_CBACK_BOOL__INT_INT_WXSTRING_( CLASS, return false, METHOD, wxPli_NOCONST )
282 // void METH(const wxString&)
283 #define DEC_V_CBACK_VOID__WXSTRING( METHOD ) \
284 DEC_V_CBACK_ANY__WXSTRING_( void, METHOD, wxPli_NOCONST )
286 #define DEC_V_CBACK_VOID__WXSTRING_const( METHOD ) \
287 DEC_V_CBACK_ANY__WXSTRING_( void, METHOD, wxPli_CONST )
289 #define DEF_V_CBACK_VOID__WXSTRING( CLASS, BASE, METHOD ) \
290 DEF_V_CBACK_ANY__WXSTRING_( void, ;, CLASS, BASE::METHOD(p1), METHOD, wxPli_NOCONST )
292 #define DEF_V_CBACK_VOID__WXSTRING_pure( CLASS, BASE, METHOD ) \
293 DEF_V_CBACK_ANY__WXSTRING_( void, ;, CLASS, return, METHOD, wxPli_NOCONST )
295 #define DEF_V_CBACK_VOID__WXSTRING_const( CLASS, BASE, METHOD ) \
296 DEF_V_CBACK_ANY__WXSTRING_( void, ;, CLASS, BASE::METHOD(p1), METHOD, wxPli_CONST )
298 // bool METH(const wxString&)
299 #define DEC_V_CBACK_BOOL__WXSTRING( METHOD ) \
300 DEC_V_CBACK_ANY__WXSTRING_( bool, METHOD, wxPli_NOCONST )
302 #define DEC_V_CBACK_BOOL__WXSTRING_const( METHOD ) \
303 DEC_V_CBACK_ANY__WXSTRING_( bool, METHOD, wxPli_CONST )
305 #define DEF_V_CBACK_BOOL__WXSTRING( CLASS, BASE, METHOD ) \
306 DEF_V_CBACK_ANY__WXSTRING_( bool, SvTRUE( ret ), CLASS, return BASE::METHOD(p1), METHOD, wxPli_NOCONST )
308 #define DEF_V_CBACK_BOOL__WXSTRING_pure( CLASS, BASE, METHOD ) \
309 DEF_V_CBACK_ANY__WXSTRING_( bool, SvTRUE( ret ), CLASS, return false, METHOD, wxPli_NOCONST )
311 #define DEF_V_CBACK_BOOL__WXSTRING_const( CLASS, BASE, METHOD ) \
312 DEF_V_CBACK_ANY__WXSTRING_( bool, SvTRUE( ret ), CLASS, return BASE::METHOD(p1), METHOD, wxPli_CONST )
314 // bool METH(wxObject*)
315 #define DEF_V_CBACK_BOOL__WXOBJECTs_( T1, CLASS, CALLBASE, METHOD, CONST ) \
316 bool CLASS::METHOD( T1 p1 ) CONST \
319 if( wxPliFCback( aTHX_ &m_callback, #METHOD ) ) \
321 wxAutoSV ret( aTHX_ wxPliCCback( aTHX_ &m_callback, \
322 G_SCALAR, "O", &p1 ) ); \
323 return SvTRUE( ret ); \
328 #define DEF_V_CBACK_BOOL__WXOBJECTsP_( T1, CLASS, CALLBASE, METHOD, CONST ) \
329 bool CLASS::METHOD( T1 p1 ) CONST \
332 if( wxPliFCback( aTHX_ &m_callback, #METHOD ) ) \
334 wxAutoSV ret( aTHX_ wxPliCCback( aTHX_ &m_callback, \
335 G_SCALAR, "O", p1 ) ); \
336 return SvTRUE( ret ); \
341 // bool METH(wxString&)
342 #define DEC_V_CBACK_BOOL__mWXSTRING_( METHOD, CONST ) \
343 bool METHOD(wxString&) CONST
345 #define DEF_V_CBACK_BOOL__mWXSTRING_( CLASS, CALLBASE, METHOD, CONST ) \
346 bool CLASS::METHOD(wxString& p1) CONST \
349 if( wxPliVirtualCallback_FindCallback( aTHX_ &m_callback, \
352 SV* ret = wxPliVirtualCallback_CallCallback( aTHX_ &m_callback, \
357 WXSTRING_INPUT( tmp, const char *, ret ); \
360 bool val = SvTRUE( ret ); \
361 SvREFCNT_dec( ret ); \
368 #define DEC_V_CBACK_BOOL__mWXSTRING( METHOD ) \
369 DEC_V_CBACK_BOOL__mWXSTRING_( METHOD, wxPli_NOCONST )
371 #define DEC_V_CBACK_BOOL__mWXSTRING_const( METHOD ) \
372 DEC_V_CBACK_BOOL__mWXSTRING_( METHOD, wxPli_CONST )
374 #define DEF_V_CBACK_BOOL__mWXSTRING( CLASS, BASE, METHOD ) \
375 DEF_V_CBACK_BOOL__mWXSTRING_( CLASS, return BASE::METHOD(p1), METHOD, wxPli_NOCONST )
377 #define DEF_V_CBACK_BOOL__mWXSTRING_pure( CLASS, BASE, METHOD ) \
378 DEF_V_CBACK_BOOL__mWXSTRING_( CLASS, return false, METHOD, wxPli_NOCONST )
380 #define DEF_V_CBACK_BOOL__mWXSTRING_const( CLASS, BASE, METHOD ) \
381 DEF_V_CBACK_BOOL__mWXSTRING_( CLASS, return BASE::METHOD(p1), METHOD, wxPli_CONST )
384 #define DEC_V_CBACK_ANY__VOID_( RET, METHOD, CONST ) \
387 #define DEF_V_CBACK_ANY__VOID_( RET, CVT, CLASS, CALLBASE, METHOD, CONST ) \
388 RET CLASS::METHOD() CONST \
391 if( wxPliFCback( aTHX_ &m_callback, #METHOD ) ) \
393 wxAutoSV ret( aTHX_ wxPliCCback( aTHX_ &m_callback, G_SCALAR, \
402 #define DEC_V_CBACK_VOID__VOID_( METHOD, CONST ) \
405 #define DEF_V_CBACK_VOID__VOID_( CLASS, CALLBASE, METHOD, CONST ) \
406 void CLASS::METHOD() CONST \
409 if( wxPliVirtualCallback_FindCallback( aTHX_ &m_callback, #METHOD ) ) \
411 wxPliVirtualCallback_CallCallback( aTHX_ &m_callback, \
412 G_SCALAR|G_DISCARD, NULL ); \
417 #define DEC_V_CBACK_VOID__VOID( METHOD ) \
418 DEC_V_CBACK_VOID__VOID_( METHOD, wxPli_NOCONST )
420 #define DEF_V_CBACK_VOID__VOID( CLASS, BASE, METHOD ) \
421 DEF_V_CBACK_VOID__VOID_( CLASS, BASE::METHOD(), METHOD, wxPli_NOCONST )
423 #define DEF_V_CBACK_VOID__VOID_pure( CLASS, BASE, METHOD ) \
424 DEF_V_CBACK_VOID__VOID_( CLASS, return, METHOD, wxPli_NOCONST )
426 // void METH(int, int, bool)
427 #define DEC_V_CBACK_VOID__INT_INT_BOOL_( METHOD, CONST ) \
428 void METHOD( int, int, bool ) CONST
430 #define DEF_V_CBACK_VOID__INT_INT_BOOL_( CLASS, CALLBASE, METHOD, CONST )\
431 void CLASS::METHOD( int p1, int p2, bool p3 ) CONST \
434 if( wxPliFCback( aTHX_ &m_callback, #METHOD ) ) \
436 wxPliCCback( aTHX_ &m_callback, G_SCALAR|G_DISCARD, "iib", \
442 #define DEC_V_CBACK_VOID__INT_INT_BOOL( METHOD ) \
443 DEC_V_CBACK_VOID__INT_INT_BOOL_( METHOD, wxPli_NOCONST )
445 #define DEF_V_CBACK_VOID__INT_INT_BOOL( CLASS, BASE, METHOD ) \
446 DEF_V_CBACK_VOID__INT_INT_BOOL_( CLASS, BASE::METHOD(p1, p2, p3), METHOD, wxPli_NOCONST )
448 #define DEF_V_CBACK_VOID__INT_INT_BOOL_pure( CLASS, BASE, METHOD ) \
449 DEF_V_CBACK_VOID__INT_INT_BOOL_( CLASS, return, METHOD, wxPli_NOCONST )
451 // void METH(int, int, double)
452 #define DEC_V_CBACK_VOID__INT_INT_DOUBLE_( METHOD, CONST ) \
453 void METHOD( int, int, double ) CONST
455 #define DEF_V_CBACK_VOID__INT_INT_DOUBLE_( CLASS, CALLBASE, METHOD, CONST )\
456 void CLASS::METHOD( int p1, int p2, double p3 ) CONST \
459 if( wxPliFCback( aTHX_ &m_callback, #METHOD ) ) \
461 wxPliCCback( aTHX_ &m_callback, G_SCALAR|G_DISCARD, "iid", \
467 #define DEC_V_CBACK_VOID__INT_INT_DOUBLE( METHOD ) \
468 DEC_V_CBACK_VOID__INT_INT_DOUBLE_( METHOD, wxPli_NOCONST )
470 #define DEF_V_CBACK_VOID__INT_INT_DOUBLE( CLASS, BASE, METHOD ) \
471 DEF_V_CBACK_VOID__INT_INT_DOUBLE_( CLASS, BASE::METHOD(p1, p2, p3), METHOD, wxPli_NOCONST )
473 #define DEF_V_CBACK_VOID__INT_INT_DOUBLE_pure( CLASS, BASE, METHOD ) \
474 DEF_V_CBACK_VOID__INT_INT_DOUBLE_( CLASS, return, METHOD, wxPli_NOCONST )
476 // void METH(int, int, wxString)
477 #define DEC_V_CBACK_VOID__INT_INT_WXSTRING_( METHOD, CONST ) \
478 void METHOD( int, int, const wxString& ) CONST
480 #define DEF_V_CBACK_VOID__INT_INT_WXSTRING_( CLASS, CALLBASE, METHOD, CONST )\
481 void CLASS::METHOD( int p1, int p2, const wxString& p3 ) CONST \
484 if( wxPliVirtualCallback_FindCallback( aTHX_ &m_callback, #METHOD ) )\
486 wxPliVirtualCallback_CallCallback( aTHX_ &m_callback, \
487 G_SCALAR|G_DISCARD, "iiP", \
493 #define DEC_V_CBACK_VOID__INT_INT_WXSTRING( METHOD ) \
494 DEC_V_CBACK_VOID__INT_INT_WXSTRING_( METHOD, wxPli_NOCONST )
496 #define DEF_V_CBACK_VOID__INT_INT_WXSTRING( CLASS, BASE, METHOD ) \
497 DEF_V_CBACK_VOID__INT_INT_WXSTRING_( CLASS, BASE::METHOD(p1, p2, p3), METHOD, wxPli_NOCONST )
499 #define DEF_V_CBACK_VOID__INT_INT_WXSTRING_pure( CLASS, BASE, METHOD ) \
500 DEF_V_CBACK_VOID__INT_INT_WXSTRING_( CLASS, return, METHOD, wxPli_NOCONST )
502 // void METH(int, const wxString&)
503 #define DEC_V_CBACK_VOID__INT_WXSTRING_( METHOD, CONST ) \
504 void METHOD( int, const wxString& ) CONST
506 #define DEF_V_CBACK_VOID__INT_WXSTRING_( CLASS, CALLBASE, METHOD, CONST )\
507 void CLASS::METHOD( int p1, const wxString& p2 ) CONST \
510 if( wxPliFCback( aTHX_ &m_callback, #METHOD ) ) \
512 wxPliCCback( aTHX_ &m_callback, G_SCALAR|G_DISCARD, \
518 #define DEC_V_CBACK_VOID__INT_WXSTRING( METHOD ) \
519 DEC_V_CBACK_VOID__INT_WXSTRING_( METHOD, wxPli_NOCONST )
521 #define DEF_V_CBACK_VOID__INT_WXSTRING( CLASS, BASE, METHOD ) \
522 DEF_V_CBACK_VOID__INT_WXSTRING_( CLASS, BASE::METHOD(p1, p2), METHOD, wxPli_NOCONST )
524 #define DEF_V_CBACK_VOID__INT_WXSTRING_pure( CLASS, BASE, METHOD ) \
525 DEF_V_CBACK_VOID__INT_WXSTRING_( CLASS, return, METHOD, wxPli_NOCONST )
527 // void METH(wxGrid*)
528 #define DEC_V_CBACK_VOID__WXGRID_( METHOD, CONST ) \
529 void METHOD( wxGrid* ) CONST
531 #define DEF_V_CBACK_VOID__WXGRID_( CLASS, CALLBASE, METHOD, CONST ) \
532 DEF_V_CBACK_VOID__WXOBJECTsP_( wxGrid*, CLASS, CALLBASE, METHOD, CONST )
534 #define DEC_V_CBACK_VOID__WXGRID( METHOD ) \
535 DEC_V_CBACK_VOID__WXGRID_( METHOD, wxPli_NOCONST )
537 #define DEF_V_CBACK_VOID__WXGRID( CLASS, BASE, METHOD ) \
538 DEF_V_CBACK_VOID__WXOBJECTsP_( wxGrid*, CLASS, BASE::METHOD(p1), METHOD, wxPli_NOCONST )
540 #define DEF_V_CBACK_VOID__WXGRID_pure( CLASS, BASE, METHOD ) \
541 DEF_V_CBACK_VOID__WXOBJECTsP_( wxGrid*, CLASS, return, METHOD, wxPli_NOCONST )
543 // void METH(wxWindow*)
544 #define DEC_V_CBACK_VOID__WXWINDOW_( METHOD, CONST ) \
545 void METHOD( wxWindow* ) CONST
547 #define DEF_V_CBACK_VOID__WXWINDOW_( CLASS, CALLBASE, METHOD, CONST ) \
548 DEF_V_CBACK_VOID__WXOBJECTsP_( wxWindow*, CLASS, CALLBASE, METHOD, CONST )
550 #define DEC_V_CBACK_VOID__WXWINDOW( METHOD ) \
551 DEC_V_CBACK_VOID__WXWINDOW_( METHOD, wxPli_NOCONST )
553 #define DEF_V_CBACK_VOID__WXWINDOW( CLASS, BASE, METHOD ) \
554 DEF_V_CBACK_VOID__WXOBJECTsP_( wxWindow*, CLASS, BASE::METHOD(p1), METHOD, wxPli_NOCONST )
556 #define DEF_V_CBACK_VOID__WXWINDOW_pure( CLASS, BASE, METHOD ) \
557 DEF_V_CBACK_VOID__WXOBJECTsP_( wxWindow*, CLASS, return, METHOD, wxPli_NOCONST )
559 // bool METH(wxWindow*)
560 #define DEC_V_CBACK_BOOL__WXWINDOW_( METHOD, CONST ) \
561 bool METHOD( wxWindow* ) CONST
563 #define DEF_V_CBACK_BOOL__WXWINDOW_( CLASS, CALLBASE, METHOD, CONST ) \
564 DEF_V_CBACK_BOOL__WXOBJECTsP_( wxWindow*, CLASS, CALLBASE, METHOD, CONST )
566 #define DEC_V_CBACK_BOOL__WXWINDOW( METHOD ) \
567 DEC_V_CBACK_BOOL__WXWINDOW_( METHOD, wxPli_NOCONST )
569 #define DEF_V_CBACK_BOOL__WXWINDOW( CLASS, BASE, METHOD ) \
570 DEF_V_CBACK_BOOL__WXOBJECTsP_( wxWindow*, CLASS, BASE::METHOD(p1), METHOD, wxPli_NOCONST )
572 #define DEF_V_CBACK_BOOL__WXWINDOW_pure( CLASS, BASE, METHOD ) \
573 DEF_V_CBACK_BOOL__WXOBJECTsP_( wxWindow*, CLASS, return false, METHOD, wxPli_NOCONST )
575 // void METH(wxObject*)
576 #define DEF_V_CBACK_VOID__WXOBJECTsP_( T1, CLASS, CALLBASE, METHOD, CONST ) \
577 void CLASS::METHOD( T1 p1 ) CONST \
580 if( wxPliFCback( aTHX_ &m_callback, #METHOD ) ) \
582 wxPliCCback( aTHX_ &m_callback, G_SCALAR|G_DISCARD, "O", p1 ); \
588 #define DEC_V_CBACK_WXGRID__VOID_( METHOD, CONST ) \
589 wxGrid* METHOD() CONST
591 #define DEF_V_CBACK_WXGRID__VOID_( CLASS, CALLBASE, METHOD, CONST ) \
592 DEF_V_CBACK_WXOBJECTsP__VOID_( wxGrid*, Wx::Grid, CLASS, CALLBASE, METHOD, CONST )
594 #define DEC_V_CBACK_WXGRID__VOID_const( METHOD ) \
595 DEC_V_CBACK_WXGRID__VOID_( METHOD, wxPli_CONST )
597 #define DEF_V_CBACK_WXGRID__VOID_const( CLASS, BASE, METHOD ) \
598 DEF_V_CBACK_WXGRID__VOID_( CLASS, return BASE::METHOD(), METHOD, wxPli_CONST )
601 #define DEC_V_CBACK_WXWINDOW__VOID_( METHOD, CONST ) \
602 wxWindow* METHOD() CONST
604 #define DEF_V_CBACK_WXWINDOW__VOID_( CLASS, CALLBASE, METHOD, CONST ) \
605 DEF_V_CBACK_WXOBJECTsP__VOID_( wxWindow*, Wx::Window, CLASS, CALLBASE, METHOD, CONST )
607 #define DEC_V_CBACK_WXWINDOW__VOID( METHOD ) \
608 DEC_V_CBACK_WXWINDOW__VOID_( METHOD, wxPli_NOCONST )
610 #define DEC_V_CBACK_WXWINDOW__VOID_const( METHOD ) \
611 DEC_V_CBACK_WXWINDOW__VOID_( METHOD, wxPli_CONST )
613 #define DEF_V_CBACK_WXWINDOW__VOID_const( CLASS, BASE, METHOD ) \
614 DEF_V_CBACK_WXWINDOW__VOID_( CLASS, return BASE::METHOD(), METHOD, wxPli_CONST )
616 #define DEF_V_CBACK_WXWINDOW__VOID_pure( CLASS, BASE, METHOD ) \
617 DEF_V_CBACK_WXWINDOW__VOID_( CLASS, return NULL, METHOD, wxPli_NOCONST )
620 #define DEF_V_CBACK_WXOBJECTsP__VOID_( TR, TRC, CLASS, CALLBASE, METHOD, CONST )\
621 TR CLASS::METHOD() CONST \
624 if( wxPliFCback( aTHX_ &m_callback, #METHOD ) ) \
626 wxAutoSV ret( aTHX_ wxPliCCback( aTHX_ &m_callback, G_SCALAR, \
628 return (TR)wxPli_sv_2_object( aTHX_ ret, #TRC ); \
634 #define DEC_V_CBACK_WXSTRING__VOID_( METHOD, CONST ) \
635 wxString METHOD() CONST
637 #define DEF_V_CBACK_WXSTRING__VOID_( CLASS, CALLBASE, METHOD, CONST ) \
638 wxString CLASS::METHOD() CONST \
641 if( wxPliVirtualCallback_FindCallback( aTHX_ &m_callback, #METHOD ) ) \
643 SV* ret = wxPliVirtualCallback_CallCallback( aTHX_ &m_callback, \
646 WXSTRING_INPUT( val, wxString, ret ); \
647 SvREFCNT_dec( ret ); \
654 #define DEC_V_CBACK_WXSTRING__VOID( METHOD ) \
655 DEC_V_CBACK_WXSTRING__VOID_( METHOD, wxPli_NOCONST )
657 #define DEC_V_CBACK_WXSTRING__VOID_const( METHOD ) \
658 DEC_V_CBACK_WXSTRING__VOID_( METHOD, wxPli_CONST )
660 #define DEF_V_CBACK_WXSTRING__VOID( CLASS, BASE, METHOD ) \
661 DEF_V_CBACK_WXSTRING__VOID_( CLASS, return BASE::METHOD(), METHOD, wxPli_NOCONST )
663 #define DEF_V_CBACK_WXSTRING__VOID_const( CLASS, BASE, METHOD ) \
664 DEF_V_CBACK_WXSTRING__VOID_( CLASS, return BASE::METHOD(), METHOD, wxPli_CONST )
666 #define DEF_V_CBACK_WXSTRING__VOID_pure( CLASS, BASE, METHOD ) \
667 DEF_V_CBACK_WXSTRING__VOID_( CLASS, return wxEmptyString, METHOD, wxPli_NOCONST )
669 #define DEF_V_CBACK_WXSTRING__VOID_const_pure( CLASS, BASE, METHOD ) \
670 DEF_V_CBACK_WXSTRING__VOID_( CLASS, return wxEmptyString, METHOD, wxPli_CONST )
672 // wxString METH(int)
673 #define DEC_V_CBACK_WXSTRING__INT_( METHOD, CONST ) \
674 wxString METHOD( int ) CONST
676 #define DEF_V_CBACK_WXSTRING__INT_( CLASS, CALLBASE, METHOD, CONST ) \
677 wxString CLASS::METHOD( int p1 ) CONST \
680 if( wxPliFCback( aTHX_ &m_callback, #METHOD ) ) \
682 wxAutoSV ret( aTHX_ wxPliCCback( aTHX_ &m_callback, G_SCALAR, \
685 WXSTRING_INPUT( val, wxString, ret ); \
692 #define DEC_V_CBACK_WXSTRING__INT( METHOD ) \
693 DEC_V_CBACK_WXSTRING__INT_( METHOD, wxPli_NOCONST )
695 #define DEF_V_CBACK_WXSTRING__INT( CLASS, BASE, METHOD ) \
696 DEF_V_CBACK_WXSTRING__INT_( CLASS, return BASE::METHOD(p1), METHOD, wxPli_NOCONST )
698 #define DEF_V_CBACK_WXSTRING__INT_pure( CLASS, BASE, METHOD ) \
699 DEF_V_CBACK_WXSTRING__INT_( CLASS, return wxEmptyString, METHOD, wxPli_NOCONST )
701 // wxString METH(int, int)
702 #define DEC_V_CBACK_WXSTRING__INT_INT_( METHOD, CONST ) \
703 wxString METHOD( int, int ) CONST
705 #define DEF_V_CBACK_WXSTRING__INT_INT_( CLASS, CALLBASE, METHOD, CONST ) \
706 wxString CLASS::METHOD( int p1, int p2 ) CONST \
709 if( wxPliVirtualCallback_FindCallback( aTHX_ &m_callback, #METHOD ) )\
711 SV* ret = wxPliVirtualCallback_CallCallback( aTHX_ &m_callback, \
715 WXSTRING_INPUT( val, wxString, ret ); \
716 SvREFCNT_dec( ret ); \
723 #define DEC_V_CBACK_WXSTRING__INT_INT( METHOD ) \
724 DEC_V_CBACK_WXSTRING__INT_INT_( METHOD, wxPli_NOCONST )
726 #define DEF_V_CBACK_WXSTRING__INT_INT( CLASS, BASE, METHOD ) \
727 DEF_V_CBACK_WXSTRING__INT_INT_( CLASS, return BASE::METHOD(p1, p2), METHOD, wxPli_NOCONST )
729 #define DEF_V_CBACK_WXSTRING__INT_INT_pure( CLASS, BASE, METHOD ) \
730 DEF_V_CBACK_WXSTRING__INT_INT_( CLASS, return wxEmptyString, METHOD, wxPli_NOCONST )
732 // ANY METH( wxKeyEvent& )
733 #define DEC_V_CBACK_ANY__WXKEYEVENT_( RET, METHOD, CONST ) \
734 RET METHOD( wxKeyEvent& event ) CONST
736 #define DEF_V_CBACK_ANY__WXKEYEVENT_( RET, CVT, CLASS, CALLBASE, METHOD, CONST )\
737 RET CLASS::METHOD( wxKeyEvent& p1 ) CONST \
740 if( wxPliVirtualCallback_FindCallback( aTHX_ &m_callback, #METHOD ) ) \
742 SV* evt = wxPli_object_2_sv( aTHX_ newSViv( 0 ), &p1 ); \
743 wxAutoSV ret( aTHX_ wxPliCCback( aTHX_ &m_callback, G_SCALAR, \
745 sv_setiv( SvRV( evt ), 0 ); \
746 SvREFCNT_dec( evt ); \
752 #include "cpp/v_cback_def.h"
754 #endif // _WXPERL_V_CBACK_H
756 // Local variables: //