From: Václav Slavík Date: Sun, 27 Mar 2005 21:28:27 +0000 (+0000) Subject: added XRC handler for wxStdDialogButtonSizer X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/172541f64be8fcddb08f1c121da256d08c24a70b added XRC handler for wxStdDialogButtonSizer git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@33108 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/xrc/xh_sizer.h b/include/wx/xrc/xh_sizer.h index c3329e572f..2647b5b8ce 100644 --- a/include/wx/xrc/xh_sizer.h +++ b/include/wx/xrc/xh_sizer.h @@ -56,4 +56,20 @@ private: }; -#endif // _WX_XH_BOXSIZER_H_ +class WXDLLIMPEXP_XRC wxStdDialogButtonSizerXmlHandler + : public wxXmlResourceHandler +{ +public: + wxStdDialogButtonSizerXmlHandler(); + virtual wxObject *DoCreateResource(); + virtual bool CanHandle(wxXmlNode *node); + +private: + bool m_isInside; + wxStdDialogButtonSizer *m_parentSizer; + + DECLARE_DYNAMIC_CLASS(wxStdDialogButtonSizerXmlHandler) +}; + + +#endif // _WX_XH_SIZER_H_ diff --git a/samples/xrc/rc/basicdlg.xrc b/samples/xrc/rc/basicdlg.xrc index 95e211a53b..ae632f6e10 100644 --- a/samples/xrc/rc/basicdlg.xrc +++ b/samples/xrc/rc/basicdlg.xrc @@ -5,7 +5,8 @@ Non-Derived Dialog Example 1 - + + wxVERTICAL 1 0 0 @@ -22,20 +23,15 @@ - wxALIGN_CENTRE|wxALL + wxEXPAND|wxALL 5 - - wxHORIZONTAL - - wxALIGN_CENTRE|wxALL - 5 + + - - wxALIGN_CENTRE|wxALL - 5 + diff --git a/src/xrc/xh_sizer.cpp b/src/xrc/xh_sizer.cpp index 248b7f2fad..78cade22a8 100644 --- a/src/xrc/xh_sizer.cpp +++ b/src/xrc/xh_sizer.cpp @@ -31,11 +31,12 @@ #include "wx/tokenzr.h" +//----------------------------------------------------------------------------- +// wxSizerXmlHandler +//----------------------------------------------------------------------------- IMPLEMENT_DYNAMIC_CLASS(wxSizerXmlHandler, wxXmlResourceHandler) - - wxSizerXmlHandler::wxSizerXmlHandler() : wxXmlResourceHandler(), m_isInside(false), @@ -363,4 +364,71 @@ void wxSizerXmlHandler::AddSizerItem(wxSizerItem* sitem) m_parentSizer->Add(sitem); } + + +//----------------------------------------------------------------------------- +// wxStdDialogButtonSizerXmlHandler +//----------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxStdDialogButtonSizerXmlHandler, wxXmlResourceHandler) + +wxStdDialogButtonSizerXmlHandler::wxStdDialogButtonSizerXmlHandler() + : m_isInside(false), m_parentSizer(NULL) +{ +} + +wxObject *wxStdDialogButtonSizerXmlHandler::DoCreateResource() +{ + if (m_class == wxT("wxStdDialogButtonSizer")) + { + wxASSERT( !m_parentSizer ); + + wxSizer *s = m_parentSizer = new wxStdDialogButtonSizer; + m_isInside = true; + + CreateChildren(m_parent, true/*only this handler*/); + + m_parentSizer->Realize(); + + m_isInside = false; + m_parentSizer = NULL; + + return s; + } + else // m_class == "button" + { + wxASSERT( m_parentSizer ); + + // find the item to be managed by this sizeritem + wxXmlNode *n = GetParamNode(wxT("object")); + if ( !n ) + n = GetParamNode(wxT("object_ref")); + + // did we find one? + if (n) + { + wxObject *item = CreateResFromNode(n, m_parent, NULL); + wxButton *button = wxDynamicCast(item, wxButton); + + if (button) + m_parentSizer->AddButton(button); + else + wxLogError(wxT("Error in resource - expected button.")); + + return item; + } + else /*n == NULL*/ + { + wxLogError(wxT("Error in resource: no button within wxStdDialogButtonSizer.")); + return NULL; + } + } +} + +bool wxStdDialogButtonSizerXmlHandler::CanHandle(wxXmlNode *node) +{ + return (!m_isInside && IsOfClass(node, wxT("wxStdDialogButtonSizer"))) || + (m_isInside && IsOfClass(node, wxT("button"))); +} + #endif // wxUSE_XRC diff --git a/src/xrc/xmlrsall.cpp b/src/xrc/xmlrsall.cpp index f8465e58f7..d1474daa70 100644 --- a/src/xrc/xmlrsall.cpp +++ b/src/xrc/xmlrsall.cpp @@ -34,6 +34,7 @@ void wxXmlResource::InitAllHandlers() AddHandler(new wxDialogXmlHandler); AddHandler(new wxPanelXmlHandler); AddHandler(new wxSizerXmlHandler); + AddHandler(new wxStdDialogButtonSizerXmlHandler); AddHandler(new wxButtonXmlHandler); AddHandler(new wxBitmapButtonXmlHandler); AddHandler(new wxStaticTextXmlHandler);