]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/sizer.cpp
fix some links
[wxWidgets.git] / src / common / sizer.cpp
index 9a0cb0fcf750c943cfedc97c8c92d428914633d2..cc81970cb5cd30cd72b5fad11b4ea495f24d368a 100644 (file)
@@ -834,10 +834,13 @@ void wxSizer::DeleteWindows()
     }
 }
 
-wxSize wxSizer::Fit( wxWindow *window )
+wxSize wxSizer::ComputeFittingClientSize(wxWindow *window)
 {
+    wxCHECK_MSG( window, wxDefaultSize, "window can't be NULL" );
+
     // take the min size by default and limit it by max size
-    wxSize size = GetMinWindowSize(window);
+    wxSize size = GetMinClientSize(window);
+    wxSize sizeMax;
 
     wxTopLevelWindow *tlw = wxDynamicCast(window, wxTopLevelWindow);
     if ( tlw )
@@ -845,10 +848,9 @@ wxSize wxSizer::Fit( wxWindow *window )
         // hack for small screen devices where TLWs are always full screen
         if ( tlw->IsAlwaysMaximized() )
         {
-            // do nothing
-            return tlw->GetSize();
+            return tlw->GetClientSize();
         }
-        
+
         // limit the window to the size of the display it is on
         int disp = wxDisplay::GetFromWindow(window);
         if ( disp == wxNOT_FOUND )
@@ -857,40 +859,40 @@ wxSize wxSizer::Fit( wxWindow *window )
             disp = 0;
         }
 
-        wxSize sizeMax = wxDisplay(disp).GetClientArea().GetSize();
-        
+        sizeMax = wxDisplay(disp).GetClientArea().GetSize();
+
         // space for decorations and toolbars etc.
-        wxSize tlw_client_size = tlw->GetClientSize();
-        wxSize tlw_size = tlw->GetSize();
-        sizeMax.x -= tlw_size.x - tlw_client_size.x;
-        sizeMax.y -= tlw_size.y - tlw_client_size.y;
-        
-        if ( sizeMax.x != wxDefaultCoord && size.x > sizeMax.x )
-                size.x = sizeMax.x;
-        if ( sizeMax.y != wxDefaultCoord && size.y > sizeMax.y )
-                size.y = sizeMax.y;
-
-        // set client size
-        tlw->SetClientSize( size );
-        
-        // return entire size
-        return tlw->GetSize();
+        sizeMax = tlw->WindowToClientSize(sizeMax);
     }
     else
     {
-        wxSize sizeMax = GetMaxWindowSize(window);
-        
-        if ( sizeMax.x != wxDefaultCoord && size.x > sizeMax.x )
-                size.x = sizeMax.x;
-        if ( sizeMax.y != wxDefaultCoord && size.y > sizeMax.y )
-                size.y = sizeMax.y;
+        sizeMax = GetMaxClientSize(window);
+    }
 
-        // set client size
-        window->SetClientSize( size );
+    if ( sizeMax.x != wxDefaultCoord && size.x > sizeMax.x )
+            size.x = sizeMax.x;
+    if ( sizeMax.y != wxDefaultCoord && size.y > sizeMax.y )
+            size.y = sizeMax.y;
 
-        // return entire size
-        return window->GetSize();
-    }
+    return size;
+}
+
+wxSize wxSizer::ComputeFittingWindowSize(wxWindow *window)
+{
+    wxCHECK_MSG( window, wxDefaultSize, "window can't be NULL" );
+
+    return window->ClientToWindowSize(ComputeFittingClientSize(window));
+}
+
+wxSize wxSizer::Fit( wxWindow *window )
+{
+    wxCHECK_MSG( window, wxDefaultSize, "window can't be NULL" );
+
+    // set client size
+    window->SetClientSize(ComputeFittingClientSize(window));
+
+    // return entire size
+    return window->GetSize();
 }
 
 void wxSizer::FitInside( wxWindow *window )
@@ -919,12 +921,16 @@ void wxSizer::SetSizeHints( wxWindow *window )
     // Preserve the window's max size hints, but set the
     // lower bound according to the sizer calculations.
 
-    wxSize size = Fit( window );
+    // This is equivalent to calling Fit(), except that we need to set
+    // the size hints _in between_ the two steps performed by Fit
+    // (1. ComputeFittingClientSize, 2. SetClientSize). That's because
+    // otherwise SetClientSize() could have no effect if there already are
+    // size hints in effect that forbid requested client size.
 
-    window->SetSizeHints( size.x,
-                          size.y,
-                          window->GetMaxWidth(),
-                          window->GetMaxHeight() );
+    const wxSize clientSize = ComputeFittingClientSize(window);
+
+    window->SetMinClientSize(clientSize);
+    window->SetClientSize(clientSize);
 }
 
 #if WXWIN_COMPATIBILITY_2_8
@@ -934,38 +940,12 @@ void wxSizer::SetVirtualSizeHints( wxWindow *window )
 }
 #endif // WXWIN_COMPATIBILITY_2_8
 
-wxSize wxSizer::GetMaxWindowSize( wxWindow *window ) const
-{
-    return window->GetMaxSize();
-}
-
-wxSize wxSizer::GetMinWindowSize( wxWindow *window )
-{
-    wxSize      minSize( GetMinSize() );
-    wxSize      size( window->GetSize() );
-    wxSize      client_size( window->GetClientSize() );
-
-    return wxSize( minSize.x+size.x-client_size.x,
-                   minSize.y+size.y-client_size.y );
-}
-
 // TODO on mac we need a function that determines how much free space this
 // min size contains, in order to make sure that we have 20 pixels of free
 // space around the controls
 wxSize wxSizer::GetMaxClientSize( wxWindow *window ) const
 {
-    wxSize maxSize( window->GetMaxSize() );
-
-    if ( maxSize != wxDefaultSize )
-    {
-        wxSize size( window->GetSize() );
-        wxSize client_size( window->GetClientSize() );
-
-        return wxSize( maxSize.x + client_size.x - size.x,
-                       maxSize.y + client_size.y - size.y );
-    }
-    else
-        return wxDefaultSize;
+    return window->WindowToClientSize(window->GetMaxSize());
 }
 
 wxSize wxSizer::GetMinClientSize( wxWindow *WXUNUSED(window) )