| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745 | 
							- /////////////////////////////////////////////////////////////////////////////
 
- // Name:        xti.cpp
 
- // Purpose:     eXtended RTTI support sample
 
- // Author:      Stefan Csomor, Francesco Montorsi
 
- // Modified by:
 
- // Created:     13/5/2007
 
- // Copyright:   (c) Stefan Csomor, Francesco Montorsi
 
- // Licence:     wxWindows licence
 
- /////////////////////////////////////////////////////////////////////////////
 
- // ============================================================================
 
- // declarations
 
- // ============================================================================
 
- // ----------------------------------------------------------------------------
 
- // headers
 
- // ----------------------------------------------------------------------------
 
- // For compilers that support precompilation, includes "wx/wx.h".
 
- #include "wx/wxprec.h"
 
- #ifdef __BORLANDC__
 
-     #pragma hdrstop
 
- #endif
 
- // for all others, include the necessary headers (this file is usually all you
 
- // need because it includes almost all "standard" wxWidgets headers)
 
- #ifndef WX_PRECOMP
 
-     #include "wx/wx.h"
 
- #endif
 
- #include "wx/wx.h"
 
- #include "wx/variant.h"
 
- #include "wx/xml/xml.h"
 
- #include "wx/frame.h"
 
- #include "wx/notebook.h"
 
- #include "wx/event.h"
 
- #include "wx/spinbutt.h"
 
- #include "wx/spinctrl.h"
 
- #include "wx/xtistrm.h"
 
- #include "wx/xtixml.h"
 
- #include "wx/txtstrm.h"
 
- #include "wx/wfstream.h"
 
- #include "wx/sstream.h"
 
- #include "wx/spinctrl.h"
 
- #include "classlist.h"
 
- #include "codereadercallback.h"
 
- #if !wxUSE_EXTENDED_RTTI
 
-     #error This sample requires XTI (eXtended RTTI) enabled
 
- #endif
 
- // ----------------------------------------------------------------------------
 
- // resources
 
- // ----------------------------------------------------------------------------
 
- #ifndef wxHAS_IMAGES_IN_RESOURCES
 
-     #include "../sample.xpm"
 
- #endif
 
- // ----------------------------------------------------------------------------
 
- // private classes
 
- // ----------------------------------------------------------------------------
 
- // Define a new application type, each program should derive a class from wxApp
 
- class MyApp : public wxApp
 
- {
 
- public:
 
-     virtual bool OnInit();
 
- };
 
- // Define a new frame type: this is going to be our main frame
 
- class MyFrame : public wxFrame
 
- {
 
- public:
 
-     // ctor(s)
 
-     MyFrame(const wxString& title);
 
-     void OnPersist(wxCommandEvent& event);
 
-     void OnDepersist(wxCommandEvent& event);
 
-     void OnGenerateCode(wxCommandEvent& event);
 
-     void OnDumpClasses(wxCommandEvent& event);
 
-     void OnQuit(wxCommandEvent& event);
 
-     void OnAbout(wxCommandEvent& event);
 
- private:
 
-     // any class wishing to process wxWidgets events must use this macro
 
-     wxDECLARE_EVENT_TABLE();
 
- };
 
- // ----------------------------------------------------------------------------
 
- // constants
 
- // ----------------------------------------------------------------------------
 
- // IDs for the controls and the menu commands
 
- enum
 
- {
 
-     // menu items
 
-     Minimal_Persist = wxID_HIGHEST,
 
-     Minimal_Depersist,
 
-     Minimal_GenerateCode,
 
-     Minimal_DumpClasses,
 
-     Minimal_Quit = wxID_EXIT,
 
-     Minimal_About = wxID_ABOUT
 
- };
 
- // ----------------------------------------------------------------------------
 
- // event tables and other macros for wxWidgets
 
- // ----------------------------------------------------------------------------
 
- wxBEGIN_EVENT_TABLE(MyFrame, wxFrame)
 
-     EVT_MENU(Minimal_Persist, MyFrame::OnPersist)
 
-     EVT_MENU(Minimal_Depersist, MyFrame::OnDepersist)
 
-     EVT_MENU(Minimal_GenerateCode, MyFrame::OnGenerateCode)
 
-     EVT_MENU(Minimal_DumpClasses, MyFrame::OnDumpClasses)
 
-     EVT_MENU(Minimal_Quit,  MyFrame::OnQuit)
 
-     EVT_MENU(Minimal_About, MyFrame::OnAbout)
 
- wxEND_EVENT_TABLE()
 
- wxIMPLEMENT_APP(MyApp);
 
- // ============================================================================
 
- // implementation
 
- // ============================================================================
 
- void RegisterFrameRTTI();
 
- // ----------------------------------------------------------------------------
 
- // the application class
 
- // ----------------------------------------------------------------------------
 
- bool MyApp::OnInit()
 
- {
 
-     if ( !wxApp::OnInit() )
 
-         return false;
 
-     RegisterFrameRTTI();
 
-     // create the main application window
 
-     MyFrame *frame = new MyFrame(wxT("Extended RTTI sample"));
 
-     // and show it (the frames, unlike simple controls, are not shown when
 
-     // created initially)
 
-     frame->Show(true);
 
-     // success: wxApp::OnRun() will be called which will enter the main message
 
-     // loop and the application will run. If we returned false here, the
 
-     // application would exit immediately.
 
-     return true;
 
- }
 
- // ----------------------------------------------------------------------------
 
- // main frame
 
- // ----------------------------------------------------------------------------
 
- MyFrame::MyFrame(const wxString& title)
 
-     : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(300, 200))
 
- {
 
-     // set the frame icon
 
-     SetIcon(wxICON(sample));
 
- #if wxUSE_MENUS
 
-     // create a menu bar
 
-     wxMenu *fileMenu = new wxMenu;
 
-     // the "About" item should be in the help menu
 
-     wxMenu *helpMenu = new wxMenu;
 
-     helpMenu->Append(Minimal_About, wxT("&About\tF1"), wxT("Show about dialog"));
 
-     fileMenu->Append(Minimal_Persist, wxT("Persist a wxFrame to XML..."), 
 
-                     wxT("Creates a wxFrame using wxXTI and saves its description as XML"));
 
-     fileMenu->Append(Minimal_Depersist, wxT("Depersist XML file..."), 
 
-                     wxT("Loads the description of wxFrame from XML"));
 
-     fileMenu->Append(Minimal_GenerateCode, wxT("Generate code for a wxFrame saved to XML..."), 
 
-                     wxT("Generates the C++ code which belong to a persisted wxFrame"));
 
-     fileMenu->AppendSeparator();
 
-     fileMenu->Append(Minimal_DumpClasses, wxT("Dump registered classes..."), 
 
-                     wxT("Dumps the description of all wxWidgets classes registered in XTI"));
 
-     fileMenu->AppendSeparator();
 
-     fileMenu->Append(Minimal_Quit, wxT("E&xit\tAlt-X"), wxT("Quit this program"));
 
-     // now append the freshly created menu to the menu bar...
 
-     wxMenuBar *menuBar = new wxMenuBar();
 
-     menuBar->Append(fileMenu, wxT("&File"));
 
-     menuBar->Append(helpMenu, wxT("&Help"));
 
-     // ... and attach this menu bar to the frame
 
-     SetMenuBar(menuBar);
 
- #endif // wxUSE_MENUS
 
- #if wxUSE_STATUSBAR
 
-     // create a status bar just for fun (by default with 1 pane only)
 
-     CreateStatusBar(2);
 
-     SetStatusText(wxT("Welcome to wxWidgets!"));
 
- #endif // wxUSE_STATUSBAR
 
- }
 
- // ----------------------------------------------------------------------------
 
- // XTI sample code
 
- // ----------------------------------------------------------------------------
 
- // this is the kind of source code that would end up being generated by a 
 
- // designer corresponding to the information we are setting up via RTTI 
 
- // in the CreateFrameRTTI function:
 
- //
 
- //  class MyXTIFrame : public wxFrame
 
- //  {
 
- //  public:
 
- //       //   construction
 
- //      MyXTIFrame()
 
- //      {
 
- //          Init();
 
- //          m_button = NULL;
 
- //      }
 
- //
 
- //      bool Create(wxWindow *parent,
 
- //                  wxWindowID id,
 
- //                  const wxString& title,
 
- //                  const wxPoint& pos = wxDefaultPosition,
 
- //                  const wxSize& size = wxDefaultSize,
 
- //                  long style = wxDEFAULT_FRAME_STYLE,
 
- //                  const wxString& name = wxFrameNameStr)
 
- //      {
 
- //          return wxFrame::Create( parent, id, title, pos, size, style, name );
 
- //      }
 
- //
 
- //      void SetButton( wxButton * button ) { m_button = button; }
 
- //      wxButton* GetButton() const { return m_button; }
 
- //
 
- //      void ButtonClickHandler( wxEvent & WXUNUSED(event) )
 
- //      {
 
- //          wxMessageBox( "Button Clicked ", "Hi!", wxOK );
 
- //      }
 
- //
 
- //  protected:
 
- //      wxButton* m_button;
 
- //
 
- //      wxDECLARE_EVENT_TABLE();
 
- //      wxDECLARE_DYNAMIC_CLASS_NO_COPY(MyXTIFrame);
 
- //  };
 
- //
 
- //  IMPLEMENT_DYNAMIC_CLASS_XTI(MyXTIFrame, MyXTIFrame, "x.h")
 
- //
 
- //  WX_BEGIN_PROPERTIES_TABLE(MyXTIFrame)
 
- //      WX_PROPERTY( Button, wxButton*, SetButton, GetButton, )
 
- //  WX_END_PROPERTIES_TABLE()
 
- //
 
- //  WX_BEGIN_HANDLERS_TABLE(MyXTIFrame)
 
- //      WX_HANDLER( ButtonClickHandler, wxCommandEvent )
 
- //  WX_END_HANDLERS_TABLE()
 
- //
 
- //  WX_CONSTRUCTOR_5( MyXTIFrame, wxWindow*, Parent, wxWindowID, Id,
 
- //                    wxString, Title, wxPoint, Position, wxSize, Size )
 
- //
 
- //  wxBEGIN_EVENT_TABLE(MyXTIFrame, wxFrame)
 
- // wxEND_EVENT_TABLE()
 
- // the following class "persists" (i.e. saves) a wxFrame into a wxObjectWriter
 
- class MyDesignerPersister : public wxObjectWriterCallback
 
- {
 
- public:
 
-     MyDesignerPersister( wxDynamicObject * frame)
 
-     {
 
-         m_frame = frame;
 
-     }
 
-     virtual bool BeforeWriteDelegate( wxObjectWriter *WXUNUSED(writer),
 
-                                     const wxObject *object,  
 
-                                     const wxClassInfo* WXUNUSED(classInfo), 
 
-                                     const wxPropertyInfo *propInfo, 
 
-                                     const wxObject *&eventSink, 
 
-                                     const wxHandlerInfo* &handlerInfo )  
 
-     {
 
-         // this approach would be used if the handler would not 
 
-         // be connected really in the designer, so we have to supply 
 
-         // the information
 
-         const wxObject* but = wxAnyGetAsObjectPtr( m_frame->GetProperty(wxT("Button")) );
 
-         if ( object == but && 
 
-              propInfo == wxCLASSINFO( wxButton )->FindPropertyInfo(wxT("OnClick")) )
 
-         {
 
-             eventSink = m_frame;
 
-             handlerInfo = m_frame->GetClassInfo()->
 
-                 FindHandlerInfo(wxT("ButtonClickHandler"));
 
-             return true;
 
-         }
 
-         return false;
 
-     }
 
- private:
 
-     wxDynamicObject *m_frame;
 
- };
 
- // sometimes linkers (at least MSVC and GCC ones) optimize the final EXE 
 
- // even in debug mode pruning the object files which he "thinks" are useless;
 
- // thus the classes defined in those files won't be available in the XTI
 
- // table and the program will fail to allocate them.
 
- // The following macro implements a simple hack to ensure that a given
 
- // class is linked in.
 
- //
 
- // TODO: in wx/link.h there are already similar macros (also more "optimized":
 
- //       don't need the creation of fake object) which however require to use
 
- //       the wxFORCE_LINK_THIS_MODULE() macro inside the source files corresponding
 
- //       to the class being discarded.
 
- //
 
- #define wxENSURE_CLASS_IS_LINKED(x)     { x test; }
 
- void RegisterFrameRTTI()
 
- {
 
-     // set up the RTTI info for a class (MyXTIFrame) which
 
-     // is not defined anywhere in this program
 
-     wxDynamicClassInfo *dyninfo = 
 
-         wx_dynamic_cast( wxDynamicClassInfo *, wxClassInfo::FindClass(wxT("MyXTIFrame")));
 
-     if ( dyninfo == NULL )
 
-     {
 
-         dyninfo = new wxDynamicClassInfo(wxT("myxtiframe.h"),
 
-                             wxT("MyXTIFrame"), 
 
-                             CLASSINFO(wxFrame) );
 
-         // this class has a property named "Button" and the relative handler:
 
-         dyninfo->AddProperty(wxT("Button"), wxGetTypeInfo((wxButton**) NULL));
 
-         dyninfo->AddHandler(wxT("ButtonClickHandler"), 
 
-             NULL /* no instance of the handler method */, CLASSINFO( wxEvent ) );
 
-     }
 
- }
 
- wxDynamicObject* CreateFrameRTTI()
 
- {
 
-     int baseID = 100;
 
-     wxAny Params[10];
 
-     // the class is now part of XTI internal table so that we can
 
-     // get a pointer to it just searching it like any other class:
 
-     wxFrame* frame;
 
-     wxClassInfo *info = wxClassInfo::FindClass(wxT("MyXTIFrame"));
 
-     wxASSERT( info );
 
-     wxDynamicObject* frameWrapper = 
 
-         wx_dynamic_cast(wxDynamicObject*, info->CreateObject() );
 
-     Params[0] = wxAny((wxWindow*)(NULL));
 
-     Params[1] = wxAny(wxWindowID(baseID++));
 
-     Params[2] = wxAny(wxString(wxT("This is a frame created from XTI")));
 
-     Params[3] = wxAny(wxPoint(-1,-1));
 
-     Params[4] = wxAny(wxSize(400,300));
 
-     Params[5] = wxAny((long)wxDEFAULT_FRAME_STYLE);
 
-     wxASSERT( info->Create(frameWrapper, 6, Params ));
 
-     frame = wx_dynamic_cast(wxFrame*, frameWrapper->GetSuperClassInstance());
 
- #if 1
 
-     // now build a notebook inside it:
 
-     wxNotebook* notebook;
 
-     info = wxClassInfo::FindClass("wxNotebook");
 
-     wxASSERT( info );
 
-     notebook = wxDynamicCast( info->CreateObject(), wxNotebook );
 
-     Params[0] = wxAny((wxWindow*)frame);
 
-     Params[1] = wxAny(wxWindowID(baseID++));
 
-     Params[2] = wxAny(wxPoint( 10, 10 ));
 
-     Params[3] = wxAny(wxDefaultSize);
 
-     Params[4] = wxAny((long)0);
 
-     wxASSERT( info->Create(notebook, 5, Params ));
 
-     // button page
 
-     wxPanel* panel;
 
-     info = wxClassInfo::FindClass("wxPanel");
 
-     wxASSERT( info );
 
-     panel = wxDynamicCast( info->CreateObject(), wxPanel );
 
-     Params[0] = wxAny((wxWindow*)(notebook));
 
-     Params[1] = wxAny(wxWindowID(baseID++));
 
-     Params[2] = wxAny(wxPoint(-1,-1));
 
-     Params[3] = wxAny(wxSize(-1,-1));
 
-     Params[4] = wxAny((long)0);
 
-     Params[5] = wxAny(wxString(wxT("Hello")));
 
-     wxASSERT( info->Create(panel, 6, Params ));
 
-     notebook->AddPage( panel, "Buttons" );
 
-     wxButton* button;
 
-     info = wxClassInfo::FindClass("wxButton");
 
-     wxASSERT( info );
 
-     button = wxDynamicCast( info->CreateObject(), wxButton );
 
-     Params[0] = wxAny((wxWindow*)(panel));
 
-     Params[1] = wxAny(wxWindowID(baseID++));
 
-     Params[2] = wxAny(wxString(wxT("Click Me!")));
 
-     Params[3] = wxAny(wxPoint( 10, 10 ));
 
-     Params[4] = wxAny(wxSize(-1,-1));
 
-     Params[5] = wxAny((long)0);
 
-     wxASSERT( info->Create(button, 6, Params ));
 
-     frameWrapper->SetProperty( wxT("Button"), wxAny( button ) );
 
-     // other controls page
 
-     info = wxClassInfo::FindClass("wxPanel");
 
-     wxASSERT( info );
 
-     panel = wxDynamicCast( info->CreateObject(), wxPanel );
 
-     Params[0] = wxAny((wxWindow*)(notebook));
 
-     Params[1] = wxAny(wxWindowID(baseID++));
 
-     Params[2] = wxAny(wxPoint(-1,-1));
 
-     Params[3] = wxAny(wxSize(-1,-1));
 
-     Params[4] = wxAny((long)0);
 
-     Params[5] = wxAny(wxString(wxT("Hello")));
 
-     wxASSERT( info->Create(panel, 6, Params ));
 
-     notebook->AddPage( panel, "Other Standard controls" );
 
-     wxControl* control;
 
-     info = wxClassInfo::FindClass("wxCheckBox");
 
-     wxASSERT( info );
 
-     control = wxDynamicCast( info->CreateObject(), wxControl );
 
-     Params[0] = wxAny((wxWindow*)(panel));
 
-     Params[1] = wxAny(wxWindowID(baseID++));
 
-     Params[2] = wxAny(wxString(wxT("A Checkbox")));
 
-     Params[3] = wxAny(wxPoint( 10, 10 ));
 
-     Params[4] = wxAny(wxSize(-1,-1));
 
-     Params[5] = wxAny((long)0);
 
-     wxASSERT( info->Create(control, 6, Params ));
 
-     info = wxClassInfo::FindClass("wxRadioButton");
 
-     wxASSERT( info );
 
-     control = wxDynamicCast( info->CreateObject(), wxControl );
 
-     Params[0] = wxAny((wxWindow*)(panel));
 
-     Params[1] = wxAny(wxWindowID(baseID++));
 
-     Params[2] = wxAny(wxString(wxT("A Radiobutton")));
 
-     Params[3] = wxAny(wxPoint( 10, 30 ));
 
-     Params[4] = wxAny(wxSize(-1,-1));
 
-     Params[5] = wxAny((long)0);
 
-     wxASSERT( info->Create(control, 6, Params ));
 
-     control = wxDynamicCast( info->CreateObject(), wxControl );
 
-     Params[1] = wxAny(wxWindowID(baseID++));
 
-     Params[2] = wxAny(wxString(wxT("Another One")));
 
-     Params[3] = wxAny(wxPoint( 10, 50 ));
 
-     wxASSERT( info->Create(control, 6, Params ));
 
-     info = wxClassInfo::FindClass("wxStaticText");
 
-     wxASSERT( info );
 
-     control = wxDynamicCast( info->CreateObject(), wxControl );
 
-     Params[0] = wxAny((wxWindow*)(panel));
 
-     Params[1] = wxAny(wxWindowID(baseID++));
 
-     Params[2] = wxAny(wxString(wxT("A Static Text!")));
 
-     Params[3] = wxAny(wxPoint( 10, 70 ));
 
-     Params[4] = wxAny(wxSize(-1,-1));
 
-     Params[5] = wxAny((long)0);
 
-     wxASSERT( info->Create(control, 6, Params ));
 
-     info = wxClassInfo::FindClass("wxStaticBox");
 
-     wxASSERT( info );
 
-     control = wxDynamicCast( info->CreateObject(), wxControl );
 
-     Params[0] = wxAny((wxWindow*)(panel));
 
-     Params[1] = wxAny(wxWindowID(baseID++));
 
-     Params[2] = wxAny(wxString(wxT("A Static Box")));
 
-     Params[3] = wxAny(wxPoint( 10, 90 ));
 
-     Params[4] = wxAny(wxSize(100,80));
 
-     Params[5] = wxAny((long)0);
 
-     wxASSERT( info->Create(control, 6, Params ));
 
-     info = wxClassInfo::FindClass("wxTextCtrl");
 
-     wxASSERT( info );
 
-     control = wxDynamicCast( info->CreateObject(), wxControl );
 
-     Params[0] = wxAny((wxWindow*)(panel));
 
-     Params[1] = wxAny(wxWindowID(baseID++));
 
-     Params[2] = wxAny(wxString(wxT("A Text Control")));
 
-     Params[3] = wxAny(wxPoint( 10, 200 ));
 
-     Params[4] = wxAny(wxSize(-1,-1));
 
-     Params[5] = wxAny((long)0);
 
-     wxASSERT( info->Create(control, 6, Params ));
 
-     // spins and gauges page
 
-     info = wxClassInfo::FindClass("wxPanel");
 
-     wxASSERT( info );
 
-     panel = wxDynamicCast( info->CreateObject(), wxPanel );
 
-     Params[0] = wxAny((wxWindow*)(notebook));
 
-     Params[1] = wxAny(wxWindowID(baseID++));
 
-     Params[2] = wxAny(wxPoint(-1,-1));
 
-     Params[3] = wxAny(wxSize(-1,-1));
 
-     Params[4] = wxAny((long)0);
 
-     Params[5] = wxAny(wxString(wxT("Hello")));
 
-     wxASSERT( info->Create(panel, 6, Params ));
 
-     notebook->AddPage( panel, "Spins and Sliders" );
 
-     wxENSURE_CLASS_IS_LINKED(wxSpinButton);
 
-     info = wxClassInfo::FindClass("wxSpinButton");
 
-     wxASSERT( info );
 
-     control = wxDynamicCast( info->CreateObject(), wxControl );
 
-     Params[0] = wxAny((wxWindow*)(panel));
 
-     Params[1] = wxAny(wxWindowID(baseID++));
 
-     Params[2] = wxAny(wxPoint( 10, 10 ));
 
-     Params[3] = wxAny(wxSize(-1,-1));
 
-     Params[4] = wxAny((long)wxSP_VERTICAL | wxSP_ARROW_KEYS);
 
-     wxASSERT( info->Create(control, 5, Params ));
 
-     wxENSURE_CLASS_IS_LINKED(wxSpinCtrl);
 
-     info = wxClassInfo::FindClass("wxSpinCtrl");
 
-     wxASSERT( info );
 
-     control = wxDynamicCast( info->CreateObject(), wxControl );
 
-     Params[0] = wxAny((wxWindow*)(panel));
 
-     Params[1] = wxAny(wxWindowID(baseID++));
 
-     Params[2] = wxAny(wxString("20"));
 
-     Params[3] = wxAny(wxPoint( 40, 10 ));
 
-     Params[4] = wxAny(wxSize(40,-1));
 
-     Params[5] = wxAny((long) wxSP_ARROW_KEYS);
 
-     wxASSERT( info->Create(control, 6, Params ));
 
-     // MSVC likes to exclude from link wxGauge...
 
-     wxENSURE_CLASS_IS_LINKED(wxGauge)
 
-     wxENSURE_CLASS_IS_LINKED(wxCheckBox)
 
-     wxENSURE_CLASS_IS_LINKED(wxSpinCtrl)
 
-     info = wxClassInfo::FindClass("wxGauge");
 
-     wxASSERT( info );
 
-     control = wxDynamicCast( info->CreateObject(), wxControl );
 
-     Params[0] = wxAny((wxWindow*)(panel));
 
-     Params[1] = wxAny(wxWindowID(baseID++));
 
-     Params[2] = wxAny((int) 100);
 
-     Params[3] = wxAny(wxPoint( 10, 50 ));
 
-     Params[4] = wxAny(wxSize(-1,-1));
 
-     Params[5] = wxAny((long) wxGA_HORIZONTAL);
 
-     wxASSERT( info->Create(control, 6, Params ));
 
-     wx_dynamic_cast(wxGauge*, control)->SetValue(20);
 
- #endif
 
-     return frameWrapper;
 
- }
 
- bool SaveFrameRTTI(const wxString &testFileName, wxDynamicObject *frame)
 
- {
 
-     // setup the XML document
 
-     wxXmlDocument xml;
 
-     wxXmlNode *root = new wxXmlNode(wxXML_ELEMENT_NODE, 
 
-                                     "TestXTI", "This is the content");
 
-     xml.SetRoot(root);
 
-     // setup the XTI writer and persister
 
-     wxObjectXmlWriter writer(root);
 
-     MyDesignerPersister persister(frame);
 
-     // write the given wxObject into the XML document
 
-     wxStringToAnyHashMap empty;
 
-     writer.WriteObject( frame, frame->GetClassInfo(), &persister, 
 
-                         wxString("myTestFrame"), empty );
 
-     return xml.Save(testFileName);
 
- }
 
- wxDynamicObject* LoadFrameRTTI(const wxString &fileName)
 
- {
 
-     // load the XML document
 
-     wxXmlDocument xml;
 
-     if (!xml.Load(fileName))
 
-         return NULL;
 
-     wxXmlNode *root = xml.GetRoot();
 
-     if (root->GetName() != "TestXTI")
 
-         return NULL;
 
-     // now depersist the wxFrame we saved into it using wxObjectRuntimeReaderCallback
 
-     wxObjectRuntimeReaderCallback Callbacks;
 
-     wxObjectXmlReader Reader( root );
 
-     int obj = Reader.ReadObject( wxString("myTestFrame"), &Callbacks );
 
-     return (wxDynamicObject*)Callbacks.GetObject( obj );
 
- }
 
- bool GenerateFrameRTTICode(const wxString &inFileName, const wxString &outFileName)
 
- {
 
-     // is loading the streamed out component from xml and writing code that  
 
-     // will create the same component 
 
-     wxFFileOutputStream fos( outFileName );
 
-     wxTextOutputStream tos( fos );
 
-     if (!fos.IsOk())
 
-         return false;
 
-     wxXmlDocument xml;
 
-     if (!xml.Load(inFileName))
 
-         return false;
 
-     wxXmlNode *root = xml.GetRoot();
 
-     if (root->GetName() != "TestXTI")
 
-         return false;
 
-     // read the XML file using the wxObjectCodeReaderCallback
 
-     
 
-     wxString headerincludes;
 
-     wxString sourcecode;
 
-     wxObjectCodeReaderCallback Callbacks(headerincludes,sourcecode);
 
-     wxObjectXmlReader Reader(root);
 
-     // ReadObject will return the ID of the object read??
 
-     Reader.ReadObject( wxString("myTestFrame"), &Callbacks );
 
-     // header preamble
 
-     tos << 
 
-         "#include \"wx/wxprec.h\" \n#ifdef __BORLANDC__\n#pragma hdrstop\n#endif\n#ifndef WX_PRECOMP\n#include \"wx/wx.h\" \n#endif\n\n";
 
-     // add object includes
 
-     tos.WriteString( headerincludes );
 
-     tos << "\n\nvoid test()\n{";
 
-     tos.WriteString( sourcecode );
 
-     tos << "}";
 
-     return true;
 
- }
 
- // ----------------------------------------------------------------------------
 
- // MyFrame event handlers
 
- // ----------------------------------------------------------------------------
 
- void MyFrame::OnPersist(wxCommandEvent& WXUNUSED(event))
 
- {
 
-     // first create a frame using XTI calls
 
-     wxDynamicObject *frame = CreateFrameRTTI();
 
-     if (!frame)
 
-     {
 
-         wxLogError(wxT("Cannot create the XTI frame!"));
 
-         return;
 
-     }
 
-     // show the frame we're going to save to the user
 
-     wxFrame *trueFrame = wx_dynamic_cast(wxFrame *, frame->GetSuperClassInstance() );
 
-     trueFrame->Show();
 
-     // ask the user where to save it
 
-     wxFileDialog dlg(this, wxT("Where should the frame be saved?"),
 
-                      wxEmptyString, wxT("test.xml"), wxT("XML files (*.xml)|*.xml"), 
 
-                      wxFD_SAVE);
 
-     if (dlg.ShowModal() == wxID_CANCEL)
 
-         return;
 
-     // then save it to a test XML file
 
-     if (!SaveFrameRTTI(dlg.GetPath(), frame))
 
-     {
 
-         wxLogError(wxT("Cannot save the XTI frame into '%s'"), dlg.GetPath());
 
-         return;
 
-     }
 
-     // now simply delete it
 
-     delete frame;
 
- }
 
- void MyFrame::OnDepersist(wxCommandEvent& WXUNUSED(event))
 
- {
 
-     // ask the user which file to load
 
-     wxFileDialog dlg(this, wxT("Which file contains the frame to depersist?"),
 
-                      wxEmptyString, wxT("test.xml"), wxT("XML files (*.xml)|*.xml"), 
 
-                      wxFD_OPEN);
 
-     if (dlg.ShowModal() == wxID_CANCEL)
 
-         return;
 
-     wxObject *frame = LoadFrameRTTI(dlg.GetPath());
 
-     if (!frame)
 
-     {
 
-         wxLogError(wxT("Could not depersist the wxFrame from '%s'"), dlg.GetPath());
 
-         return;
 
-     }
 
-     wxFrame *trueFrame = wx_dynamic_cast(wxFrame*, frame );
 
-     if ( !trueFrame )
 
-     {
 
-         wxDynamicObject* dyno = wx_dynamic_cast(wxDynamicObject*, frame );
 
-         if ( dyno )
 
-             trueFrame = wx_dynamic_cast(wxFrame *, dyno->GetSuperClassInstance() );
 
-     }
 
-     if ( trueFrame )
 
-         trueFrame->Show();
 
-     else
 
-         wxLogError(wxT("Could not show the frame"));
 
- }
 
- void MyFrame::OnGenerateCode(wxCommandEvent& WXUNUSED(event))
 
- {
 
-     // ask the user which file to load
 
-     wxFileDialog dlg(this, wxT("Which file contains the frame to work on?"),
 
-                      wxEmptyString, wxT("test.xml"), wxT("XML files (*.xml)|*.xml"), 
 
-                      wxFD_OPEN);
 
-     if (dlg.ShowModal() == wxID_CANCEL)
 
-         return;
 
-     // ask the user which file to load
 
-     wxFileDialog dlg2(this, wxT("Where should the C++ code be saved?"),
 
-                       wxEmptyString, wxT("test.cpp"), wxT("Source files (*.cpp)|*.cpp"), 
 
-                       wxFD_SAVE);
 
-     if (dlg2.ShowModal() == wxID_CANCEL)
 
-         return;
 
-     // do generate code
 
-     if (!GenerateFrameRTTICode(dlg.GetPath(), dlg2.GetPath()))
 
-     {
 
-         wxLogError(wxT("Could not generate the code for the frame!"));
 
-         return;
 
-     }
 
-     // show the generated code
 
-     {
 
-         wxFileInputStream f(dlg2.GetPath());
 
-         wxStringOutputStream str;
 
-         f.Read(str);
 
-         wxDialog dlg(this, wxID_ANY, wxT("Generated code"), 
 
-                      wxDefaultPosition, wxDefaultSize,
 
-                      wxRESIZE_BORDER|wxDEFAULT_DIALOG_STYLE);
 
-         wxPanel *panel = new wxPanel(&dlg);
 
-         wxSizer *sz = new wxBoxSizer(wxVERTICAL);
 
-         sz->Add(new wxTextCtrl(panel, wxID_ANY, str.GetString(), 
 
-                                wxDefaultPosition, wxDefaultSize, 
 
-                                wxTE_MULTILINE|wxTE_READONLY|wxTE_DONTWRAP),
 
-                 1, wxGROW|wxALL, 5);
 
-         sz->Add(new wxButton(panel, wxID_OK), 0, wxALIGN_RIGHT|wxALL, 5);
 
-         panel->SetSizerAndFit(sz);
 
-         dlg.ShowModal();
 
-     }
 
- }
 
- void MyFrame::OnDumpClasses(wxCommandEvent& WXUNUSED(event))
 
- {
 
-     ClassListDialog dlg(this);
 
-     dlg.ShowModal();
 
- }
 
- void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
 
- {
 
-     // true is to force the frame to close
 
-     Close(true);
 
- }
 
- void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
 
- {
 
-     wxMessageBox(wxString::Format(
 
-                     wxT("Welcome to %s!\n")
 
-                     wxT("\n")
 
-                     wxT("This sample demonstrates wxWidgets eXtended RTTI (XTI) system."),
 
-                     wxVERSION_STRING
 
-                 ),
 
-                 wxT("About wxWidgets XTI sample"),
 
-                 wxOK | wxICON_INFORMATION,
 
-                 this);
 
- }
 
 
  |