X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/dabbc6a5a1795d169f26ce95927f3e4f1a5e7b7e..8ef9a526cea6ecc3853f327a76da14561b36f82a:/src/xrc/xh_sizer.cpp diff --git a/src/xrc/xh_sizer.cpp b/src/xrc/xh_sizer.cpp index ba6c799f25..f5e2dcc466 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 @@ -8,10 +8,6 @@ // 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,37 @@ #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" + #include "wx/frame.h" + #include "wx/dialog.h" + #include "wx/button.h" + #include "wx/scrolwin.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) + :wxXmlResourceHandler(), + m_isInside(false), + m_isGBS(false), + m_parentSizer(NULL) { XRC_ADD_STYLE(wxHORIZONTAL); XRC_ADD_STYLE(wxVERTICAL); @@ -70,8 +77,8 @@ wxSizerXmlHandler::wxSizerXmlHandler() XRC_ADD_STYLE(wxALIGN_CENTER_VERTICAL); XRC_ADD_STYLE(wxALIGN_CENTRE_VERTICAL); - XRC_ADD_STYLE(wxADJUST_MINSIZE); XRC_ADD_STYLE(wxFIXED_MINSIZE); + XRC_ADD_STYLE(wxRESERVE_SPACE_EVEN_IF_HIDDEN); } @@ -139,9 +146,9 @@ wxObject* wxSizerXmlHandler::Handle_sizeritem() wxWindow *wnd = wxDynamicCast(item, wxWindow); if (sizer) - sitem->SetSizer(sizer); + sitem->AssignSizer(sizer); else if (wnd) - sitem->SetWindow(wnd); + sitem->AssignWindow(wnd); else wxLogError(wxT("Error in resource.")); @@ -165,7 +172,7 @@ wxObject* wxSizerXmlHandler::Handle_spacer() wxSizerItem* sitem = MakeSizerItem(); SetSizerItemAttributes(sitem); - sitem->SetSpacer(GetSize()); + sitem->AssignSpacer(GetSize()); AddSizerItem(sitem); return NULL; } @@ -179,18 +186,16 @@ wxObject* wxSizerXmlHandler::Handle_sizer() wxCHECK_MSG(m_parentSizer != NULL || (parentNode && parentNode->GetType() == wxXML_ELEMENT_NODE && - m_parentAsWindow != NULL && - (m_parentAsWindow->IsKindOf(CLASSINFO(wxPanel)) || - m_parentAsWindow->IsKindOf(CLASSINFO(wxFrame)) || - m_parentAsWindow->IsKindOf(CLASSINFO(wxDialog))) - ), NULL, - wxT("Incorrect use of sizer: parent is not 'wxDialog', 'wxFrame' or 'wxPanel'.")); + m_parentAsWindow), NULL, + wxT("Sizer must have a window parent node")); if (m_class == wxT("wxBoxSizer")) sizer = Handle_wxBoxSizer(); +#if wxUSE_STATBOX else if (m_class == wxT("wxStaticBoxSizer")) sizer = Handle_wxStaticBoxSizer(); +#endif else if (m_class == wxT("wxGridSizer")) sizer = Handle_wxGridSizer(); @@ -201,6 +206,11 @@ wxObject* wxSizerXmlHandler::Handle_sizer() 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)) @@ -228,11 +238,22 @@ wxObject* wxSizerXmlHandler::Handle_sizer() wxXmlNode *nd = m_node; m_node = parentNode; if (GetSize() == wxDefaultSize) - sizer->Fit(m_parentAsWindow); + { + if ( wxDynamicCast(m_parentAsWindow, wxScrolledWindow) != NULL ) + { + sizer->FitInside(m_parentAsWindow); + } + else + { + sizer->Fit(m_parentAsWindow); + } + } m_node = nd; - if (m_parentAsWindow->GetWindowStyle() & (wxRESIZE_BOX | wxRESIZE_BORDER)) + if (m_parentAsWindow->IsTopLevel()) + { sizer->SetSizeHints(m_parentAsWindow); + } } return sizer; @@ -244,6 +265,7 @@ wxSizer* wxSizerXmlHandler::Handle_wxBoxSizer() return new wxBoxSizer(GetStyle(wxT("orient"), wxHORIZONTAL)); } +#if wxUSE_STATBOX wxSizer* wxSizerXmlHandler::Handle_wxStaticBoxSizer() { return new wxStaticBoxSizer( @@ -255,6 +277,7 @@ wxSizer* wxSizerXmlHandler::Handle_wxStaticBoxSizer() GetName()), GetStyle(wxT("orient"), wxHORIZONTAL)); } +#endif // wxUSE_STATBOX wxSizer* wxSizerXmlHandler::Handle_wxGridSizer() { @@ -351,6 +374,9 @@ void wxSizerXmlHandler::SetSizerItemAttributes(wxSizerItem* sitem) gbsitem->SetPos(GetGBPos(wxT("cellpos"))); gbsitem->SetSpan(GetGBSpan(wxT("cellspan"))); } + + // record the id of the item, if any, for use by XRCSIZERITEM() + sitem->SetId(GetID()); } void wxSizerXmlHandler::AddSizerItem(wxSizerItem* sitem) @@ -363,10 +389,71 @@ void wxSizerXmlHandler::AddSizerItem(wxSizerItem* sitem) +//----------------------------------------------------------------------------- +// wxStdDialogButtonSizerXmlHandler +//----------------------------------------------------------------------------- +#if wxUSE_BUTTON +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_BUTTON +#endif // wxUSE_XRC