X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ea0d8ca6e89a677871a214f5e4e8c50422a0cfb8..21d6b09b108dd8f4710cf260ee9f344b6bbad704:/src/xrc/xh_sizer.cpp?ds=sidebyside diff --git a/src/xrc/xh_sizer.cpp b/src/xrc/xh_sizer.cpp index 5022ffb8f4..46f6a191c1 100644 --- a/src/xrc/xh_sizer.cpp +++ b/src/xrc/xh_sizer.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: xh_sizer.cpp +// Name: src/xrc/xh_sizer.cpp // Purpose: XRC resource for wxBoxSizer // Author: Vaclav Slavik // Created: 2000/03/21 @@ -7,10 +7,6 @@ // Copyright: (c) 2000 Vaclav Slavik // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// - -#ifdef __GNUG__ -#pragma implementation "xh_sizer.h" -#endif // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -19,26 +15,33 @@ #pragma hdrstop #endif +#if wxUSE_XRC + #include "wx/xrc/xh_sizer.h" -#include "wx/sizer.h" + +#ifndef WX_PRECOMP + #include "wx/log.h" + #include "wx/panel.h" + #include "wx/statbox.h" + #include "wx/sizer.h" +#endif + #include "wx/gbsizer.h" -#include "wx/log.h" -#include "wx/statbox.h" #include "wx/notebook.h" -#include "wx/panel.h" #include "wx/tokenzr.h" +//----------------------------------------------------------------------------- +// wxSizerXmlHandler +//----------------------------------------------------------------------------- IMPLEMENT_DYNAMIC_CLASS(wxSizerXmlHandler, wxXmlResourceHandler) - - -wxSizerXmlHandler::wxSizerXmlHandler() - : wxXmlResourceHandler(), - m_isInside(FALSE), - m_isGBS(FALSE), - m_parentSizer(NULL) +wxSizerXmlHandler::wxSizerXmlHandler() + :wxXmlResourceHandler(), + m_isInside(false), + m_isGBS(false), + m_parentSizer(NULL) { XRC_ADD_STYLE(wxHORIZONTAL); XRC_ADD_STYLE(wxVERTICAL); @@ -69,8 +72,9 @@ wxSizerXmlHandler::wxSizerXmlHandler() XRC_ADD_STYLE(wxALIGN_CENTRE_HORIZONTAL); XRC_ADD_STYLE(wxALIGN_CENTER_VERTICAL); XRC_ADD_STYLE(wxALIGN_CENTRE_VERTICAL); - + XRC_ADD_STYLE(wxADJUST_MINSIZE); + XRC_ADD_STYLE(wxFIXED_MINSIZE); } @@ -79,16 +83,16 @@ bool wxSizerXmlHandler::CanHandle(wxXmlNode *node) { return ( (!m_isInside && IsSizerNode(node)) || (m_isInside && IsOfClass(node, wxT("sizeritem"))) || - (m_isInside && IsOfClass(node, wxT("spacer"))) + (m_isInside && IsOfClass(node, wxT("spacer"))) ); } - + wxObject* wxSizerXmlHandler::DoCreateResource() -{ +{ if (m_class == wxT("sizeritem")) return Handle_sizeritem(); - + else if (m_class == wxT("spacer")) return Handle_spacer(); @@ -121,14 +125,13 @@ wxObject* wxSizerXmlHandler::Handle_sizeritem() { // create a sizer item for it wxSizerItem* sitem = MakeSizerItem(); - SetSizerItemAttributes(sitem); - + // now fetch the item to be managed bool old_gbs = m_isGBS; bool old_ins = m_isInside; wxSizer *old_par = m_parentSizer; - m_isInside = FALSE; - if (!IsSizerNode(n)) m_parentSizer = NULL; + m_isInside = false; + if (!IsSizerNode(n)) m_parentSizer = NULL; wxObject *item = CreateResFromNode(n, m_parent, NULL); m_isInside = old_ins; m_parentSizer = old_par; @@ -137,14 +140,17 @@ wxObject* wxSizerXmlHandler::Handle_sizeritem() // and figure out what type it is wxSizer *sizer = wxDynamicCast(item, wxSizer); wxWindow *wnd = wxDynamicCast(item, wxWindow); - + if (sizer) sitem->SetSizer(sizer); else if (wnd) sitem->SetWindow(wnd); - else + else wxLogError(wxT("Error in resource.")); + // finally, set other wxSizerItem attributes + SetSizerItemAttributes(sitem); + AddSizerItem(sitem); return item; } @@ -163,7 +169,7 @@ wxObject* wxSizerXmlHandler::Handle_spacer() wxSizerItem* sitem = MakeSizerItem(); SetSizerItemAttributes(sitem); sitem->SetSpacer(GetSize()); - AddSizerItem(sitem); + AddSizerItem(sitem); return NULL; } @@ -171,11 +177,11 @@ wxObject* wxSizerXmlHandler::Handle_spacer() wxObject* wxSizerXmlHandler::Handle_sizer() { wxSizer *sizer = NULL; - + wxXmlNode *parentNode = m_node->GetParent(); wxCHECK_MSG(m_parentSizer != NULL || - (parentNode->GetType() == wxXML_ELEMENT_NODE && + (parentNode && parentNode->GetType() == wxXML_ELEMENT_NODE && m_parentAsWindow != NULL && (m_parentAsWindow->IsKindOf(CLASSINFO(wxPanel)) || m_parentAsWindow->IsKindOf(CLASSINFO(wxFrame)) || @@ -188,17 +194,22 @@ wxObject* wxSizerXmlHandler::Handle_sizer() else if (m_class == wxT("wxStaticBoxSizer")) sizer = Handle_wxStaticBoxSizer(); - + else if (m_class == wxT("wxGridSizer")) sizer = Handle_wxGridSizer(); - + else if (m_class == wxT("wxFlexGridSizer")) sizer = Handle_wxFlexGridSizer(); else if (m_class == wxT("wxGridBagSizer")) sizer = Handle_wxGridBagSizer(); - + if ( !sizer ) + { + wxLogError(_T("Failed to create size of class \"%s\""), m_class.c_str()); + return NULL; + } + wxSize minsize = GetSize(wxT("minsize")); if (!(minsize == wxDefaultSize)) sizer->SetMinSize(minsize); @@ -206,23 +217,20 @@ wxObject* wxSizerXmlHandler::Handle_sizer() // save state wxSizer *old_par = m_parentSizer; bool old_ins = m_isInside; - bool old_gbs = m_isGBS; // set new state m_parentSizer = sizer; - m_isInside = TRUE; + m_isInside = true; m_isGBS = (m_class == wxT("wxGridBagSizer")); - - CreateChildren(m_parent, TRUE/*only this handler*/); + + CreateChildren(m_parent, true/*only this handler*/); // restore state - old_gbs = m_isGBS; m_isInside = old_ins; m_parentSizer = old_par; if (m_parentSizer == NULL) // setup window: { - m_parentAsWindow->SetAutoLayout(TRUE); m_parentAsWindow->SetSizer(sizer); wxXmlNode *nd = m_node; @@ -231,10 +239,10 @@ wxObject* wxSizerXmlHandler::Handle_sizer() sizer->Fit(m_parentAsWindow); m_node = nd; - if (m_parentAsWindow->GetWindowStyle() & (wxRESIZE_BOX | wxRESIZE_BORDER)) + if (m_parentAsWindow->GetWindowStyle() & (wxMAXIMIZE_BOX | wxRESIZE_BORDER)) sizer->SetSizeHints(m_parentAsWindow); } - + return sizer; } @@ -242,8 +250,8 @@ wxObject* wxSizerXmlHandler::Handle_sizer() wxSizer* wxSizerXmlHandler::Handle_wxBoxSizer() { return new wxBoxSizer(GetStyle(wxT("orient"), wxHORIZONTAL)); -} - +} + wxSizer* wxSizerXmlHandler::Handle_wxStaticBoxSizer() { return new wxStaticBoxSizer( @@ -255,7 +263,7 @@ wxSizer* wxSizerXmlHandler::Handle_wxStaticBoxSizer() GetName()), GetStyle(wxT("orient"), wxHORIZONTAL)); } - + wxSizer* wxSizerXmlHandler::Handle_wxGridSizer() { return new wxGridSizer(GetLong(wxT("rows")), GetLong(wxT("cols")), @@ -265,7 +273,7 @@ wxSizer* wxSizerXmlHandler::Handle_wxGridSizer() wxSizer* wxSizerXmlHandler::Handle_wxFlexGridSizer() { - wxFlexGridSizer *sizer = + wxFlexGridSizer *sizer = new wxFlexGridSizer(GetLong(wxT("rows")), GetLong(wxT("cols")), GetDimension(wxT("vgap")), GetDimension(wxT("hgap"))); SetGrowables(sizer, wxT("growablerows"), true); @@ -276,7 +284,7 @@ wxSizer* wxSizerXmlHandler::Handle_wxFlexGridSizer() wxSizer* wxSizerXmlHandler::Handle_wxGridBagSizer() { - wxGridBagSizer *sizer = + wxGridBagSizer *sizer = new wxGridBagSizer(GetDimension(wxT("vgap")), GetDimension(wxT("hgap"))); SetGrowables(sizer, wxT("growablerows"), true); SetGrowables(sizer, wxT("growablecols"), false); @@ -340,17 +348,17 @@ void wxSizerXmlHandler::SetSizerItemAttributes(wxSizerItem* sitem) sitem->SetBorder(GetDimension(wxT("border"))); wxSize sz = GetSize(wxT("minsize")); if (!(sz == wxDefaultSize)) - sitem->SetInitSize(sz.x, sz.y); + sitem->SetMinSize(sz); sz = GetSize(wxT("ratio")); if (!(sz == wxDefaultSize)) sitem->SetRatio(sz); - + if (m_isGBS) { wxGBSizerItem* gbsitem = (wxGBSizerItem*)sitem; gbsitem->SetPos(GetGBPos(wxT("cellpos"))); gbsitem->SetSpan(GetGBSpan(wxT("cellspan"))); - } + } } void wxSizerXmlHandler::AddSizerItem(wxSizerItem* sitem) @@ -360,13 +368,72 @@ void wxSizerXmlHandler::AddSizerItem(wxSizerItem* sitem) else 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