X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d119983947975b98ad4ca1295be46ae9d7ffe805..64ea838d8f4d1853b7d850db93ee565e901d099a:/src/common/wincmn.cpp diff --git a/src/common/wincmn.cpp b/src/common/wincmn.cpp index ce2bb0a237..13370f51c6 100644 --- a/src/common/wincmn.cpp +++ b/src/common/wincmn.cpp @@ -620,20 +620,13 @@ void wxWindowBase::DoCentre(int dir) // fits the window around the children void wxWindowBase::Fit() { - if ( !GetChildren().empty() ) - { - SetSize(GetBestSize()); - } - //else: do nothing if we have no children + SetSize(GetBestSize()); } // fits virtual size (ie. scrolled area etc.) around children void wxWindowBase::FitInside() { - if ( GetChildren().GetCount() > 0 ) - { - SetVirtualSize( GetBestVirtualSize() ); - } + SetVirtualSize( GetBestVirtualSize() ); } // On Mac, scrollbars are explicitly children. @@ -649,7 +642,7 @@ static bool wxHasRealChildren(const wxWindowBase* win) wxWindow *win = node->GetData(); if ( !win->IsTopLevel() && win->IsShown() #if wxUSE_SCROLLBAR - && !win->IsKindOf(CLASSINFO(wxScrollBar)) + && !wxDynamicCast(win, wxScrollBar) #endif ) realChildCount ++; @@ -906,14 +899,19 @@ wxSize wxWindowBase::GetBestSize() const // it to be used wxSize size = DoGetBestClientSize(); if ( size != wxDefaultSize ) - { size += DoGetBorderSize(); + else + size = DoGetBestSize(); - CacheBestSize(size); - return size; - } + // Ensure that the best size is at least as large as min size. + size.IncTo(GetMinSize()); + + // And not larger than max size. + size.DecToIfSpecified(GetMaxSize()); - return DoGetBestSize(); + // Finally cache result and return. + CacheBestSize(size); + return size; } int wxWindowBase::GetBestHeight(int width) const @@ -938,12 +936,16 @@ void wxWindowBase::SetMinSize(const wxSize& minSize) { m_minWidth = minSize.x; m_minHeight = minSize.y; + + InvalidateBestSize(); } void wxWindowBase::SetMaxSize(const wxSize& maxSize) { m_maxWidth = maxSize.x; m_maxHeight = maxSize.y; + + InvalidateBestSize(); } void wxWindowBase::SetInitialSize(const wxSize& size) @@ -1268,15 +1270,14 @@ bool wxWindowBase::IsDescendant(wxWindowBase* win) const // Iterate until we find this window in the parent chain or exhaust it. while ( win ) { - wxWindow* const parent = win->GetParent(); - if ( parent == this ) + if ( win == this ) return true; // Stop iterating on reaching the top level window boundary. - if ( parent->IsTopLevel() ) + if ( win->IsTopLevel() ) break; - win = parent; + win = win->GetParent(); } return false; @@ -1439,7 +1440,11 @@ wxEvtHandler *wxWindowBase::PopEventHandler(bool deleteHandler) "the first handler of the wxWindow stack should have non-NULL next handler" ); firstHandler->SetNextHandler(NULL); - secondHandler->SetPreviousHandler(NULL); + + // It is harmless but useless to unset the previous handler of the window + // itself as it's always NULL anyhow, so don't do this. + if ( secondHandler != this ) + secondHandler->SetPreviousHandler(NULL); // now firstHandler is completely unlinked; set secondHandler as the new window event handler SetEventHandler(secondHandler); @@ -2744,6 +2749,8 @@ wxSize wxWindowBase::GetDlgUnitBase() const { const wxWindowBase * const parent = wxGetTopLevelParent((wxWindow*)this); + wxCHECK_MSG( parent, wxDefaultSize, wxS("Must have TLW parent") ); + if ( !parent->m_font.IsOk() ) { // Default GUI font is used. This is the most common case, so @@ -3507,7 +3514,7 @@ wxAccStatus wxWindowAccessible::GetLocation(wxRect& rect, int elementId) if (win) { rect = win->GetRect(); - if (win->GetParent() && !win->IsKindOf(CLASSINFO(wxTopLevelWindow))) + if (win->GetParent() && !wxDynamicCast(win, wxTopLevelWindow)) rect.SetPosition(win->GetParent()->ClientToScreen(rect.GetPosition())); return wxACC_OK; } @@ -3626,7 +3633,7 @@ wxAccStatus wxWindowAccessible::GetName(int childId, wxString* name) // accessible classes, one for each kind of wxWidgets // control or window. #if wxUSE_BUTTON - if (GetWindow()->IsKindOf(CLASSINFO(wxButton))) + if (wxDynamicCast(GetWindow(), wxButton)) title = ((wxButton*) GetWindow())->GetLabel(); else #endif @@ -3785,14 +3792,14 @@ wxAccStatus wxWindowAccessible::GetRole(int childId, wxAccRole* role) if (childId > 0) return wxACC_NOT_IMPLEMENTED; - if (GetWindow()->IsKindOf(CLASSINFO(wxControl))) + if (wxDynamicCast(GetWindow(), wxControl)) return wxACC_NOT_IMPLEMENTED; #if wxUSE_STATUSBAR - if (GetWindow()->IsKindOf(CLASSINFO(wxStatusBar))) + if (wxDynamicCast(GetWindow(), wxStatusBar)) return wxACC_NOT_IMPLEMENTED; #endif #if wxUSE_TOOLBAR - if (GetWindow()->IsKindOf(CLASSINFO(wxToolBar))) + if (wxDynamicCast(GetWindow(), wxToolBar)) return wxACC_NOT_IMPLEMENTED; #endif @@ -3817,15 +3824,15 @@ wxAccStatus wxWindowAccessible::GetState(int childId, long* state) if (childId > 0) return wxACC_NOT_IMPLEMENTED; - if (GetWindow()->IsKindOf(CLASSINFO(wxControl))) + if (wxDynamicCast(GetWindow(), wxControl)) return wxACC_NOT_IMPLEMENTED; #if wxUSE_STATUSBAR - if (GetWindow()->IsKindOf(CLASSINFO(wxStatusBar))) + if (wxDynamicCast(GetWindow(), wxStatusBar)) return wxACC_NOT_IMPLEMENTED; #endif #if wxUSE_TOOLBAR - if (GetWindow()->IsKindOf(CLASSINFO(wxToolBar))) + if (wxDynamicCast(GetWindow(), wxToolBar)) return wxACC_NOT_IMPLEMENTED; #endif