X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/6811c2f3e3e8afc1872280dfd1464565a3ddb306..a3a363f61b022d8c4a748635ee5cfeb3497f5435:/src/common/wincmn.cpp diff --git a/src/common/wincmn.cpp b/src/common/wincmn.cpp index 465635a87c..0c419c0476 100644 --- a/src/common/wincmn.cpp +++ b/src/common/wincmn.cpp @@ -110,12 +110,13 @@ END_EVENT_TABLE() // the default initialization wxWindowBase::wxWindowBase() -: m_bestSize(wxDefaultSize) { // no window yet, no parent nor children m_parent = (wxWindow *)NULL; m_windowId = wxID_ANY; + m_initialSize = wxDefaultSize; + // no constraints on the minimal window size m_minWidth = m_minHeight = @@ -223,13 +224,9 @@ bool wxWindowBase::CreateBase(wxWindowBase *parent, SetWindowStyleFlag(style); SetParent(parent); - // Set the minsize to be the size passed to the ctor (if any) for - // non-TLWs. This is so items used in a sizer will use this explicitly - // set size for layout, instead of falling back the (probably smaller) - // bestsize. - if (! IsTopLevel()) - SetSizeHints(size); - + // Save the size passed to the ctor (if any.) This will be used later as + // the minimal size if the window is added to a sizer. + m_initialSize = size; #if wxUSE_VALIDATORS SetValidator(validator); @@ -545,9 +542,9 @@ wxSize wxWindowBase::DoGetBestSize() const return wxSize(maxX, maxY); } #endif // wxUSE_CONSTRAINTS - else if ( GetChildren().GetCount() > 0 ) + else if ( !GetChildren().empty() ) { - // our minimal acceptable size is such that all our windows fit inside + // our minimal acceptable size is such that all our visible child windows fit inside int maxX = 0, maxY = 0; @@ -556,7 +553,7 @@ wxSize wxWindowBase::DoGetBestSize() const node = node->GetNext() ) { wxWindow *win = node->GetData(); - if ( win->IsTopLevel() + if ( win->IsTopLevel() || ( ! win->IsShown() ) #if wxUSE_STATUSBAR || wxDynamicCast(win, wxStatusBar) #endif // wxUSE_STATUSBAR @@ -592,20 +589,11 @@ wxSize wxWindowBase::DoGetBestSize() const return wxSize(maxX, maxY); } - else + else // has children { - // Windows which don't implement DoGetBestSize and aren't parents. - // This emulates the behavior of a wxSizer without wxADJUST_MINSIZE - - // If you get the following message you should do one of two things - // 1. Do what it says (best) - // 2. m_bestSize = GetSize() at end of Create() (hack) - if(m_bestSize == wxDefaultSize) - { - wxLogDebug(wxT("Class %s (or superclass) should implement DoGetBestSize()"),GetClassInfo()->GetClassName()); - wxConstCast(this,wxWindowBase)->m_bestSize = GetSize(); - } - return m_bestSize; + // for a generic window there is no natural best size - just use the + // current size + return GetSize(); } } @@ -888,6 +876,31 @@ bool wxWindowBase::RemoveEventHandler(wxEvtHandler *handler) // colours, fonts &c // ---------------------------------------------------------------------------- +void wxWindowBase::InheritAttributes() +{ + const wxWindowBase * const parent = GetParent(); + if ( !parent ) + return; + + // we only inherit attributes which had been explicitly set for the parent + // which ensures that this only happens if the user really wants it and + // not by default which wouldn't make any sense in modern GUIs where the + // controls don't all use the same fonts (nor colours) + if ( parent->m_hasFont && !m_hasFont ) + SetFont(parent->GetFont()); + + // in addition, there is a possibility to explicitly forbid inheriting + // colours at each class level by overriding ShouldInheritColours() + if ( ShouldInheritColours() ) + { + if ( parent->m_hasFgCol && !m_hasFgCol ) + SetForegroundColour(parent->GetForegroundColour()); + + if ( parent->m_hasBgCol && !m_hasBgCol ) + SetBackgroundColour(parent->GetBackgroundColour()); + } +} + /* static */ wxVisualAttributes wxWindowBase::GetClassDefaultAttributes(wxWindowVariant WXUNUSED(variant)) { @@ -1612,6 +1625,26 @@ void wxWindowBase::SetSizerAndFit(wxSizer *sizer, bool deleteOld) sizer->SetSizeHints( (wxWindow*) this ); } + +void wxWindowBase::SetContainingSizer(wxSizer* sizer) +{ + // adding a window to a sizer twice is going to result in fatal and + // hard to debug problems later because when deleting the second + // associated wxSizerItem we're going to dereference a dangling + // pointer; so try to detect this as early as possible + wxASSERT_MSG( !sizer || m_containingSizer != sizer, + _T("Adding a window to the same sizer twice?") ); + + m_containingSizer = sizer; + + // If there was an initial size for this window, and if a minsize has not + // been set, then set the initial size as the minsize. This helps with + // sizer layout when a larger than GetBestSize size is needed for + // controls. + if (m_initialSize != wxDefaultSize && GetMinSize() == wxDefaultSize) + SetSizeHints(m_initialSize); +} + #if wxUSE_CONSTRAINTS void wxWindowBase::SatisfyConstraints()