}
}
-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 sizeMax = GetMaxWindowSize(window);
+ wxSize size = GetMinClientSize(window);
+ wxSize sizeMax;
wxTopLevelWindow *tlw = wxDynamicCast(window, wxTopLevelWindow);
if ( tlw )
// hack for small screen devices where TLWs are always full screen
if ( tlw->IsAlwaysMaximized() )
{
- size = tlw->GetSize();
+ return tlw->GetClientSize();
}
- else // normal situation
- {
- // 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();
+ // 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();
+
+ // space for decorations and toolbars etc.
+ sizeMax = tlw->WindowToClientSize(sizeMax);
+ }
+ else
+ {
+ sizeMax = GetMaxClientSize(window);
}
if ( sizeMax.x != wxDefaultCoord && size.x > sizeMax.x )
- size.x = sizeMax.x;
+ size.x = sizeMax.x;
if ( sizeMax.y != wxDefaultCoord && size.y > sizeMax.y )
- size.y = sizeMax.y;
+ size.y = sizeMax.y;
+ return size;
+}
- window->SetSize( size );
+wxSize wxSizer::ComputeFittingWindowSize(wxWindow *window)
+{
+ wxCHECK_MSG( window, wxDefaultSize, "window can't be NULL" );
- return size;
+ 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 )
// 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
void wxSizer::SetVirtualSizeHints( wxWindow *window )
{
- // Preserve the window's max size hints, but set the
- // lower bound according to the sizer calculations.
-
FitInside( window );
- wxSize size( window->GetVirtualSize() );
- window->SetVirtualSizeHints( size.x,
- size.y,
- window->GetMaxWidth(),
- window->GetMaxHeight() );
-}
-
-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 );
}
+#endif // WXWIN_COMPATIBILITY_2_8
// 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) )