]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/wincmn.cpp
best size handling fix
[wxWidgets.git] / src / common / wincmn.cpp
index 7d18937df353e0401f7c2bf55cbfeb9ef3abaa42..7c4c0ce62c6c2917c6ef8718c6819f27efe16a7d 100644 (file)
@@ -5,7 +5,7 @@
 // Modified by:
 // Created:     13/07/98
 // RCS-ID:      $Id$
-// Copyright:   (c) wxWindows team
+// Copyright:   (c) wxWidgets team
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
@@ -125,6 +125,9 @@ wxWindowBase::wxWindowBase()
     m_minHeight =
     m_maxHeight = wxDefaultSize.y;
 
+    // invalidiated cache value
+    m_bestSizeCache = wxDefaultSize;
+
     // window are created enabled and visible by default
     m_isShown =
     m_isEnabled = true;
@@ -215,7 +218,7 @@ bool wxWindowBase::CreateBase(wxWindowBase *parent,
 
     // ids are limited to 16 bits under MSW so if you care about portability,
     // it's not a good idea to use ids out of this range (and negative ids are
-    // reserved for wxWindows own usage)
+    // reserved for wxWidgets own usage)
     wxASSERT_MSG( id == wxID_ANY || (id >= 0 && id < 32767),
                   _T("invalid id value") );
 
@@ -482,7 +485,7 @@ void wxWindowBase::Fit()
 {
     if ( GetChildren().GetCount() > 0 )
     {
-        SetClientSize(DoGetBestSize());
+        SetClientSize(GetBestSize());
     }
     //else: do nothing if we have no children
 }
@@ -620,32 +623,36 @@ wxSize wxWindowBase::DoGetBestSize() const
     }
 }
 
-void wxWindowBase::SetBestSize(const wxSize& size)
+
+wxSize wxWindowBase::GetBestFittingSize() const
 {
-    // If the given size is incomplete then merge with the best size.
-    wxSize sizeBest;
-    if ( size.x == wxDefaultSize.x || size.y == wxDefaultSize.y )
+    // merge the best size with the min size, giving priority to the min size
+    wxSize min = GetMinSize();
+    if (min.x == wxDefaultCoord || min.y == wxDefaultCoord)
     {
-        sizeBest = DoGetBestSize();
-        if ( size.x != wxDefaultSize.x )
-            sizeBest.x = size.x;
-        if ( size.y != wxDefaultSize.y )
-            sizeBest.y = size.y;
-    }
-    else // have complete explicit size
-    {
-        sizeBest = size;
+        wxSize best = GetBestSize();
+        if (min.x == wxDefaultCoord) min.x =  best.x;
+        if (min.y == wxDefaultCoord) min.y =  best.y;
     }
+    return min;
+}
 
-    // Change the size if needed
-    if (GetSize() != sizeBest)
-        SetSize(sizeBest);
 
-    // don't shrink the control below its best size
-    m_minWidth = sizeBest.x;
-    m_minHeight = sizeBest.y;
+void wxWindowBase::SetBestFittingSize(const wxSize& size)
+{
+    // Set the min size to the size passed in.  This will usually either be
+    // wxDefaultSize or the size passed to this window's ctor/Create function.
+    SetMinSize(size);
+
+    // Merge the size with the best size if needed
+    wxSize best = GetBestFittingSize();
+    
+    // If the current size doesn't match then change it
+    if (GetSize() != best)
+        SetSize(best);
 }
 
+
 // by default the origin is not shifted
 wxPoint wxWindowBase::GetClientAreaOrigin() const
 {
@@ -974,17 +981,16 @@ wxColour wxWindowBase::GetBackgroundColour() const
 
         // we must return some valid colour to avoid redoing this every time
         // and also to avoid surprizing the applications written for older
-        // wxWindows versions where GetBackgroundColour() always returned
+        // wxWidgets versions where GetBackgroundColour() always returned
         // something -- so give them something even if it doesn't make sense
         // for this window (e.g. it has a themed background)
         if ( !colBg.Ok() )
             colBg = GetClassDefaultAttributes().colBg;
 
-        // cache it for the next call
-        wxConstCast(this, wxWindowBase)->m_backgroundColour = colBg;
+        return colBg;
     }
-
-    return m_backgroundColour;
+    else
+        return m_backgroundColour;
 }
 
 wxColour wxWindowBase::GetForegroundColour() const
@@ -999,33 +1005,31 @@ wxColour wxWindowBase::GetForegroundColour() const
         if ( !colFg.Ok() )
             colFg = GetClassDefaultAttributes().colFg;
 
-        wxConstCast(this, wxWindowBase)->m_foregroundColour = colFg;
+        return colFg;
     }
-
-    return m_foregroundColour;
+    else
+        return m_foregroundColour;
 }
 
 bool wxWindowBase::SetBackgroundColour( const wxColour &colour )
 {
-    if ( !colour.Ok() || (colour == m_backgroundColour) )
+    if ( colour == m_backgroundColour ) 
         return false;
 
+    m_hasBgCol = colour.Ok();
     m_backgroundColour = colour;
-
-    m_hasBgCol = true;
-
+    SetThemeEnabled( !m_hasBgCol && !m_foregroundColour.Ok() );
     return true;
 }
 
 bool wxWindowBase::SetForegroundColour( const wxColour &colour )
 {
-    if ( !colour.Ok() || (colour == m_foregroundColour) )
+    if (colour == m_foregroundColour )
         return false;
 
+    m_hasFgCol = colour.Ok();
     m_foregroundColour = colour;
-
-    m_hasFgCol = true;
-
+    SetThemeEnabled( !m_hasFgCol && !m_backgroundColour.Ok() );
     return true;
 }
 
@@ -1044,7 +1048,7 @@ bool wxWindowBase::SetCursor(const wxCursor& cursor)
     return true;
 }
 
-wxFont& wxWindowBase::DoGetFont() const
+wxFont wxWindowBase::GetFont() const
 {
     // logic is the same as in GetBackgroundColour()
     if ( !m_font.Ok() )
@@ -1055,18 +1059,14 @@ wxFont& wxWindowBase::DoGetFont() const
         if ( !font.Ok() )
             font = GetClassDefaultAttributes().font;
 
-        wxConstCast(this, wxWindowBase)->m_font = font;
+        return font;
     }
-
-    // cast is here for non-const GetFont() convenience
-    return wxConstCast(this, wxWindowBase)->m_font;
+    else
+        return m_font;
 }
 
 bool wxWindowBase::SetFont(const wxFont& font)
 {
-    if ( !font.Ok() )
-        return false;
-
     if ( font == m_font )
     {
         // no change
@@ -1074,8 +1074,7 @@ bool wxWindowBase::SetFont(const wxFont& font)
     }
 
     m_font = font;
-
-    m_hasFont = true;
+    m_hasFont = font.Ok();
 
     return true;
 }
@@ -2114,6 +2113,8 @@ void wxWindowBase::OnSysColourChanged(wxSysColourChangedEvent& event)
 
         node = node->GetNext();
     }
+
+    Refresh();
 }
 
 // the default action is to populate dialog with data when it's created,
@@ -2167,7 +2168,7 @@ void wxWindowBase::OnMiddleClick( wxMouseEvent& event )
 
         wxMessageBox(wxString::Format(
                                       _T(
-                                        "       wxWindows Library (%s port)\nVersion %u.%u.%u%s, compiled at %s %s\n   Copyright (c) 1995-2002 wxWindows team"
+                                        "       wxWidgets Library (%s port)\nVersion %u.%u.%u%s, compiled at %s %s\n   Copyright (c) 1995-2002 wxWidgets team"
                                         ),
                                       port.c_str(),
                                       wxMAJOR_VERSION,
@@ -2181,7 +2182,7 @@ void wxWindowBase::OnMiddleClick( wxMouseEvent& event )
                                       __TDATE__,
                                       __TTIME__
                                      ),
-                     _T("wxWindows information"),
+                     _T("wxWidgets information"),
                      wxICON_INFORMATION | wxOK,
                      (wxWindow *)this);
     }
@@ -2400,6 +2401,23 @@ bool wxWindowBase::TryParent(wxEvent& event)
     return wxEvtHandler::TryParent(event);
 }
 
+// ----------------------------------------------------------------------------
+// navigation
+// ----------------------------------------------------------------------------
+
+// Navigates in the specified direction.
+bool wxWindowBase::Navigate(int flags)
+{
+    wxNavigationKeyEvent eventNav;
+    eventNav.SetFlags(flags);
+    eventNav.SetEventObject(this);
+    if ( GetParent()->GetEventHandler()->ProcessEvent(eventNav) )
+    {
+        return true;
+    }
+    return false;
+}
+
 // ----------------------------------------------------------------------------
 // global functions
 // ----------------------------------------------------------------------------
@@ -2562,17 +2580,19 @@ wxAccStatus wxWindowAccessible::GetName(int childId, wxString* name)
 
     wxString title;
 
-    // If a child, leave wxWindows to call the function on the actual
+    // If a child, leave wxWidgets to call the function on the actual
     // child object.
     if (childId > 0)
         return wxACC_NOT_IMPLEMENTED;
 
     // This will eventually be replaced by specialised
-    // accessible classes, one for each kind of wxWindows
+    // accessible classes, one for each kind of wxWidgets
     // control or window.
+#if wxUSE_BUTTON
     if (GetWindow()->IsKindOf(CLASSINFO(wxButton)))
         title = ((wxButton*) GetWindow())->GetLabel();
     else
+#endif
         title = GetWindow()->GetName();
 
     if (!title.IsEmpty())
@@ -2723,7 +2743,7 @@ wxAccStatus wxWindowAccessible::GetRole(int childId, wxAccRole* role)
     if (!GetWindow())
         return wxACC_FAIL;
 
-    // If a child, leave wxWindows to call the function on the actual
+    // If a child, leave wxWidgets to call the function on the actual
     // child object.
     if (childId > 0)
         return wxACC_NOT_IMPLEMENTED;
@@ -2755,7 +2775,7 @@ wxAccStatus wxWindowAccessible::GetState(int childId, long* state)
     if (!GetWindow())
         return wxACC_FAIL;
 
-    // If a child, leave wxWindows to call the function on the actual
+    // If a child, leave wxWidgets to call the function on the actual
     // child object.
     if (childId > 0)
         return wxACC_NOT_IMPLEMENTED;