// 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 =
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);
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;
node = node->GetNext() )
{
wxWindow *win = node->GetData();
- if ( win->IsTopLevel()
+ if ( win->IsTopLevel() || ( ! win->IsShown() )
#if wxUSE_STATUSBAR
|| wxDynamicCast(win, wxStatusBar)
#endif // wxUSE_STATUSBAR
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();
}
}
// 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))
{
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()