From c30199bfdde4b515c928742ccabd5dc25004227e Mon Sep 17 00:00:00 2001
From: Robert Roebling <robert@roebling.de>
Date: Sun, 13 Jan 2008 13:08:30 +0000
Subject: [PATCH] wxSizer::Fit() now sets client size

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@51197 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---
 docs/latex/wx/sizer.tex |  8 ++----
 src/common/sizer.cpp    | 62 +++++++++++++++++++++++++++--------------
 2 files changed, 44 insertions(+), 26 deletions(-)

diff --git a/docs/latex/wx/sizer.tex b/docs/latex/wx/sizer.tex
index 0c8b32a5b0..8800335c25 100644
--- a/docs/latex/wx/sizer.tex
+++ b/docs/latex/wx/sizer.tex
@@ -222,13 +222,11 @@ Returns true if the child item was found and detached, false otherwise.
 
 \func{wxSize}{Fit}{\param{wxWindow* }{window}}
 
-Tell the sizer to resize the \arg{window} to match the sizer's minimal size. This
-is commonly done in the constructor of the window itself, see sample in the description
+Tell the sizer to resize the \arg{window} so that its client area matchesthe 
+sizer's minimal size. This is commonly done in the constructor of the window
+itself, see sample in the description
 of \helpref{wxBoxSizer}{wxboxsizer}. Returns the new size.
 
-For a top level window this is the total window size, not client size.
-
-
 \membersection{wxSizer::FitInside}\label{wxsizerfitinside}
 
 \func{void}{FitInside}{\param{wxWindow* }{window}}
diff --git a/src/common/sizer.cpp b/src/common/sizer.cpp
index a358717876..9a0cb0fcf7 100644
--- a/src/common/sizer.cpp
+++ b/src/common/sizer.cpp
@@ -838,7 +838,6 @@ wxSize wxSizer::Fit( wxWindow *window )
 {
     // take the min size by default and limit it by max size
     wxSize size = GetMinWindowSize(window);
-    wxSize sizeMax = GetMaxWindowSize(window);
 
     wxTopLevelWindow *tlw = wxDynamicCast(window, wxTopLevelWindow);
     if ( tlw )
@@ -846,31 +845,52 @@ wxSize wxSizer::Fit( wxWindow *window )
         // hack for small screen devices where TLWs are always full screen
         if ( tlw->IsAlwaysMaximized() )
         {
-            size = tlw->GetSize();
+            // do nothing
+            return tlw->GetSize();
         }
-        else // normal situation
+        
+        // limit the window to the size of the display it is on
+        int disp = wxDisplay::GetFromWindow(window);
+        if ( disp == wxNOT_FOUND )
         {
-            // limit the window to the size of the display it is on
-            int disp = wxDisplay::GetFromWindow(window);
-            if ( disp == wxNOT_FOUND )
-            {
-                // or, if we don't know which one it is, of the main one
-                disp = 0;
-            }
-
-            sizeMax = wxDisplay(disp).GetClientArea().GetSize();
-        }
+            // or, if we don't know which one it is, of the main one
+            disp = 0;
+        }
+
+        wxSize 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();
     }
+    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;
 
-    if ( sizeMax.x != wxDefaultCoord && size.x > sizeMax.x )
-        size.x = sizeMax.x;
-    if ( sizeMax.y != wxDefaultCoord && size.y > sizeMax.y )
-        size.y = sizeMax.y;
-
-
-    window->SetSize( size );
+        // set client size
+        window->SetClientSize( size );
 
-    return size;
+        // return entire size
+        return window->GetSize();
+    }
 }
 
 void wxSizer::FitInside( wxWindow *window )
-- 
2.50.0

