Add libwx-perl
[pkg-perl] / deb-src / libwx-perl / libwx-perl-0.96 / blib / lib / Wx / cpp / event.h
diff --git a/deb-src/libwx-perl/libwx-perl-0.96/blib/lib/Wx/cpp/event.h b/deb-src/libwx-perl/libwx-perl-0.96/blib/lib/Wx/cpp/event.h
new file mode 100644 (file)
index 0000000..0003122
--- /dev/null
@@ -0,0 +1,228 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        cpp/event.h
+// Purpose:     C++ helpers for user-defined events
+// Author:      Mattia Barbon
+// Modified by:
+// Created:     30/03/2002
+// RCS-ID:      $Id: event.h 2526 2009-02-07 14:35:21Z mbarbon $
+// Copyright:   (c) 2002-2004, 2006-2007, 2009 Mattia Barbon
+// Licence:     This program is free software; you can redistribute it and/or
+//              modify it under the same terms as Perl itself
+/////////////////////////////////////////////////////////////////////////////
+
+#include <wx/event.h>
+
+#include "cpp/v_cback.h"
+
+class wxPlEvent : public wxEvent
+{
+    WXPLI_DECLARE_DYNAMIC_CLASS_CTOR( wxPlEvent );
+    WXPLI_DECLARE_V_CBACK();
+
+    // only to appease wxWidgets' RTTI
+    wxPlEvent() : m_callback( NULL ) {}
+public:
+    wxPlEvent( const char* package, int id, wxEventType eventType )
+        : wxEvent( id, eventType ),
+          m_callback( "Wx::PlEvent" )
+    {
+        m_callback.SetSelf( wxPli_make_object( this, package ), true );
+    }
+
+    virtual ~wxPlEvent()
+    {
+        m_callback.DeleteSelf( false );
+    }
+
+    virtual wxEvent* Clone() const;
+};
+
+wxEvent* wxPlEvent::Clone() const
+{
+    dTHX;
+    wxPlEvent* self = (wxPlEvent*)this;
+
+    // only to appease wxWidgets' RTTI
+    if( !self->m_callback.IsOk() )
+        return new wxPlEvent();
+
+    if( wxPliVirtualCallback_FindCallback( aTHX_ &self->m_callback, "Clone" ) )
+    {
+        SV* ret = wxPliVirtualCallback_CallCallback
+            ( aTHX_ &self->m_callback, G_SCALAR, NULL );
+        wxPlEvent* clone =
+            (wxPlEvent*)wxPli_sv_2_object( aTHX_ ret, "Wx::PlEvent" );
+        
+        return clone;
+    }
+
+    return 0;
+}
+
+WXPLI_IMPLEMENT_DYNAMIC_CLASS_CTOR( wxPlEvent, wxEvent );
+
+class wxPlCommandEvent : public wxCommandEvent
+{
+    WXPLI_DECLARE_DYNAMIC_CLASS_CTOR( wxPlCommandEvent );
+    WXPLI_DECLARE_V_CBACK();
+
+    // only to appease wxWidgets' RTTI
+    wxPlCommandEvent() : m_callback( NULL ) {}
+public:
+    wxPlCommandEvent( const char* package, int id, wxEventType eventType )
+        : wxCommandEvent( id, eventType ),
+          m_callback( "Wx::PlCommandEvent" )
+    {
+        m_callback.SetSelf( wxPli_make_object( this, package ), true );
+    }
+
+    virtual ~wxPlCommandEvent()
+    {
+        m_callback.DeleteSelf( false );
+    }
+
+    virtual wxEvent* Clone() const;
+};
+
+wxEvent* wxPlCommandEvent::Clone() const
+{
+    dTHX;
+    wxPlCommandEvent* self = (wxPlCommandEvent*)this;
+
+    // only to appease wxWidgets' RTTI
+    if( !self->m_callback.IsOk() )
+        return new wxPlCommandEvent();
+
+    if( wxPliVirtualCallback_FindCallback( aTHX_ &self->m_callback, "Clone" ) )
+    {
+        SV* ret = wxPliVirtualCallback_CallCallback
+            ( aTHX_ &self->m_callback, G_SCALAR, NULL );
+        wxPlCommandEvent* clone = (wxPlCommandEvent*)
+            wxPli_sv_2_object( aTHX_ ret, "Wx::PlCommandEvent" );
+
+        return clone;
+    }
+
+    return 0;
+}
+
+WXPLI_IMPLEMENT_DYNAMIC_CLASS_CTOR( wxPlCommandEvent, wxCommandEvent );
+
+class wxPlThreadEvent : public wxEvent
+{
+    WXPLI_DECLARE_DYNAMIC_CLASS_CTOR( wxPlThreadEvent );
+public:
+    static void SetStash( SV* hv_ref )
+    {
+        m_hv = (HV*)SvRV( hv_ref );
+    }
+    static HV* GetStash() { return m_hv; }
+
+    wxPlThreadEvent() : m_data( 0 ) {}
+    wxPlThreadEvent( pTHX_ const char* package, int id, wxEventType eventType,
+                     SV* data )
+        : wxEvent( id, eventType )
+    {
+        PL_lockhook( aTHX_ (SV*)GetStash() );
+        PL_sharehook( aTHX_ data );
+        int data_id;
+        char buffer[30];
+        size_t length;
+        for(;;)
+        {
+            data_id = rand();
+            length = sprintf( buffer, "%d", data_id );
+            if( !hv_exists( GetStash(), buffer, length ) )
+                break;
+        }
+        SV** dst = hv_fetch( GetStash(), buffer, length, 1 );
+        sv_setsv( *dst, data );
+        mg_set( *dst );
+        m_data = data_id;    
+    }
+
+    wxPlThreadEvent( const wxPlThreadEvent& e )
+        : wxEvent( e ),
+          m_data( e.m_data )
+    { }
+
+    ~wxPlThreadEvent()
+    { 
+        if( !m_data )
+            return;
+
+        dTHX;
+
+        ENTER;
+        SAVETMPS;
+
+        PL_lockhook( aTHX_ (SV*)m_hv );
+
+        char buffer[30];
+        size_t length = sprintf( buffer, "%d", m_data );
+
+        hv_delete( m_hv, buffer, length, G_DISCARD );
+
+        FREETMPS;
+        LEAVE;
+    }
+
+    int _GetData() const { return m_data; }
+
+    SV* GetData() const
+    {
+        dTHX;
+
+        if( !m_data )
+            return &PL_sv_undef;
+
+        PL_lockhook( aTHX_ (SV*)m_hv );
+
+        char buffer[30];
+        size_t length = sprintf( buffer, "%d", m_data );
+
+        SV** value = hv_fetch( m_hv, buffer, length, 0 );
+        if( !value )
+            return NULL;
+        mg_get( *value );
+        SvREFCNT_inc( *value );
+
+        return *value;
+    }
+
+    virtual wxEvent* Clone() const;
+private:
+    int m_data;
+    static HV* m_hv;
+};
+
+wxEvent* wxPlThreadEvent::Clone() const
+{
+    wxEvent* clone = new wxPlThreadEvent( *this );
+    ((wxPlThreadEvent*)this)->m_data = 0;
+
+    return clone;
+}
+
+HV* wxPlThreadEvent::m_hv = NULL;
+
+wxPliSelfRef* wxPliGetSelfForwxPlThreadEvent( wxObject* object ) { return 0; }
+// XXX HACK!
+#if wxUSE_EXTENDED_RTTI
+const wxClassInfo* wxPlThreadEvent::ms_classParents[] =
+    { &wxEvent::ms_classInfo , NULL };
+wxPliClassInfo wxPlThreadEvent::ms_classInfo(
+    ms_classParents, (wxChar*)wxT( "wxPlPlThreadEvent"),
+    (int)sizeof(wxPlThreadEvent), wxPlThreadEvent::wxCreateObject,
+    (wxPliGetCallbackObjectFn) wxPliGetSelfForwxPlThreadEvent );
+#else
+wxPliClassInfo wxPlThreadEvent::ms_classInfo(
+    (wxChar*)wxT( "wxPlPlThreadEvent"), &wxEvent::ms_classInfo,
+    NULL, (int)sizeof(wxPlThreadEvent), wxPlThreadEvent::wxCreateObject,
+    (wxPliGetCallbackObjectFn) wxPliGetSelfForwxPlThreadEvent );
+#endif
+wxObject* wxPlThreadEvent::wxCreateObject() { return new wxPlThreadEvent(); }
+
+// local variables: //
+// mode: c++ //
+// end: //