]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/wincmn.cpp
wxToggleButton on wxMac has these methods now
[wxWidgets.git] / src / common / wincmn.cpp
index 25a98cc3d20e274ac4c6c61c8f8c087c93a83a05..6b6b35ab28ef78aa878c10b1df26ecef889a161d 100644 (file)
@@ -115,6 +115,8 @@ wxWindowBase::wxWindowBase()
     m_parent = (wxWindow *)NULL;
     m_windowId = wxID_ANY;
 
+    m_initialSize = wxDefaultSize;
+    
     // no constraints on the minimal window size
     m_minWidth =
     m_minHeight =
@@ -193,7 +195,7 @@ wxWindowBase::wxWindowBase()
 bool wxWindowBase::CreateBase(wxWindowBase *parent,
                               wxWindowID id,
                               const wxPoint& WXUNUSED(pos),
-                              const wxSize& WXUNUSED(size),
+                              const wxSize& size,
                               long style,
                               const wxValidator& wxVALIDATOR_PARAM(validator),
                               const wxString& name)
@@ -222,6 +224,10 @@ bool wxWindowBase::CreateBase(wxWindowBase *parent,
     SetWindowStyleFlag(style);
     SetParent(parent);
 
+    // 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);
 #endif // wxUSE_VALIDATORS
@@ -536,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;
 
@@ -547,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
@@ -583,11 +589,14 @@ wxSize wxWindowBase::DoGetBestSize() const
 
         return wxSize(maxX, maxY);
     }
-    else
+    else // ! has children
     {
-        // for a generic window there is no natural best size - just use the
-        // current one
-        return GetSize();
+        // for a generic window there is no natural best size - just use either the
+        // minimum size if there is one, or the current size
+        if ( GetMinSize().IsFullySpecified() )
+            return GetMinSize();
+        else
+            return GetSize();
     }
 }
 
@@ -870,6 +879,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))
 {
@@ -1594,6 +1628,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()