#include "wx/platinfo.h"
#include "wx/private/window.h"
-#ifdef __WXMSW__
+#ifdef __WINDOWS__
#include "wx/msw/wrapwin.h"
#endif
// 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.
wxWindow *win = node->GetData();
if ( !win->IsTopLevel() && win->IsShown()
#if wxUSE_SCROLLBAR
- && !win->IsKindOf(CLASSINFO(wxScrollBar))
+ && !wxDynamicCast(win, wxScrollBar)
#endif
)
realChildCount ++;
// 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());
+
+ // Finally cache result and return.
+ CacheBestSize(size);
+ return size;
+}
+
+int wxWindowBase::GetBestHeight(int width) const
+{
+ const int height = DoGetBestClientHeight(width);
+
+ return height == wxDefaultCoord
+ ? GetBestSize().y
+ : height + DoGetBorderSize().y;
+}
+
+int wxWindowBase::GetBestWidth(int height) const
+{
+ const int width = DoGetBestClientWidth(height);
- return DoGetBestSize();
+ return width == wxDefaultCoord
+ ? GetBestSize().x
+ : width + DoGetBorderSize().x;
}
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)
}
// ----------------------------------------------------------------------------
-// reparenting the window
+// Dealing with parents and children.
// ----------------------------------------------------------------------------
+bool wxWindowBase::IsDescendant(wxWindowBase* win) const
+{
+ // Iterate until we find this window in the parent chain or exhaust it.
+ while ( win )
+ {
+ if ( win == this )
+ return true;
+
+ // Stop iterating on reaching the top level window boundary.
+ if ( win->IsTopLevel() )
+ break;
+
+ win = win->GetParent();
+ }
+
+ return false;
+}
+
void wxWindowBase::AddChild(wxWindowBase *child)
{
wxCHECK_RET( child, wxT("can't add a NULL child") );
"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);
// dialog oriented functions
// ----------------------------------------------------------------------------
+#if WXWIN_COMPATIBILITY_2_8
void wxWindowBase::MakeModal(bool modal)
{
// Disable all other windows
}
}
}
+#endif // WXWIN_COMPATIBILITY_2_8
bool wxWindowBase::Validate()
{
void wxWindowBase::AdjustForParentClientOrigin(int& x, int& y, int sizeFlags) const
{
- // don't do it for the dialogs/frames - they float independently of their
- // parent
- if ( !IsTopLevel() )
+ wxWindow *parent = GetParent();
+ if ( !(sizeFlags & wxSIZE_NO_ADJUSTMENTS) && parent )
{
- wxWindow *parent = GetParent();
- if ( !(sizeFlags & wxSIZE_NO_ADJUSTMENTS) && parent )
- {
- wxPoint pt(parent->GetClientAreaOrigin());
- x += pt.x;
- y += pt.y;
- }
+ wxPoint pt(parent->GetClientAreaOrigin());
+ x += pt.x;
+ y += pt.y;
}
}
{
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
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;
}
// 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
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
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