+ // hack for small screen devices where TLWs are always full screen
+ if ( tlw->IsAlwaysMaximized() )
+ {
+ return tlw->GetClientSize();
+ }
+
+ // 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;
+ if ( sizeMax.y != wxDefaultCoord && size.y > sizeMax.y )
+ size.y = sizeMax.y;
+
+ 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 )
+{
+ wxSize size;
+ if (window->IsTopLevel())
+ size = VirtualFitSize( window );
+ else
+ size = GetMinClientSize( window );
+
+ window->SetVirtualSize( size );
+}
+
+void wxSizer::Layout()
+{
+ // (re)calculates minimums needed for each item and other preparations
+ // for layout
+ CalcMin();
+
+ // Applies the layout and repositions/resizes the items
+ RecalcSizes();
+}
+
+void wxSizer::SetSizeHints( wxWindow *window )
+{
+ // Preserve the window's max size hints, but set the
+ // lower bound according to the sizer calculations.
+
+ // 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.
+
+ const wxSize clientSize = ComputeFittingClientSize(window);
+
+ window->SetMinClientSize(clientSize);
+ window->SetClientSize(clientSize);
+}
+
+#if WXWIN_COMPATIBILITY_2_8
+void wxSizer::SetVirtualSizeHints( wxWindow *window )
+{
+ FitInside( window );
+}
+#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
+{
+ return window->WindowToClientSize(window->GetMaxSize());
+}
+
+wxSize wxSizer::GetMinClientSize( wxWindow *WXUNUSED(window) )
+{
+ return GetMinSize(); // Already returns client size.
+}
+
+wxSize wxSizer::VirtualFitSize( wxWindow *window )
+{
+ wxSize size = GetMinClientSize( window );
+ wxSize sizeMax = GetMaxClientSize( window );
+
+ // Limit the size if sizeMax != wxDefaultSize
+
+ if ( size.x > sizeMax.x && sizeMax.x != wxDefaultCoord )
+ size.x = sizeMax.x;
+ if ( size.y > sizeMax.y && sizeMax.y != wxDefaultCoord )
+ size.y = sizeMax.y;
+
+ return size;
+}
+
+wxSize wxSizer::GetMinSize()
+{
+ wxSize ret( CalcMin() );
+ if (ret.x < m_minSize.x) ret.x = m_minSize.x;
+ if (ret.y < m_minSize.y) ret.y = m_minSize.y;
+ return ret;
+}
+
+void wxSizer::DoSetMinSize( int width, int height )
+{
+ m_minSize.x = width;
+ m_minSize.y = height;
+}
+
+bool wxSizer::DoSetItemMinSize( wxWindow *window, int width, int height )
+{
+ wxASSERT_MSG( window, _T("SetMinSize for NULL window") );
+
+ // Is it our immediate child?
+
+ wxSizerItemList::compatibility_iterator node = m_children.GetFirst();
+ while (node)
+ {
+ wxSizerItem *item = node->GetData();
+
+ if (item->GetWindow() == window)
+ {
+ item->SetMinSize( width, height );
+ return true;
+ }
+ node = node->GetNext();
+ }
+
+ // No? Search any subsizers we own then
+
+ node = m_children.GetFirst();
+ while (node)
+ {
+ wxSizerItem *item = node->GetData();
+
+ if ( item->GetSizer() &&
+ item->GetSizer()->DoSetItemMinSize( window, width, height ) )
+ {
+ // A child sizer found the requested windw, exit.
+ return true;
+ }
+ node = node->GetNext();
+ }
+
+ return false;
+}
+
+bool wxSizer::DoSetItemMinSize( wxSizer *sizer, int width, int height )
+{
+ wxASSERT_MSG( sizer, _T("SetMinSize for NULL sizer") );
+
+ // Is it our immediate child?
+
+ wxSizerItemList::compatibility_iterator node = m_children.GetFirst();
+ while (node)
+ {
+ wxSizerItem *item = node->GetData();
+
+ if (item->GetSizer() == sizer)
+ {
+ item->GetSizer()->DoSetMinSize( width, height );
+ return true;
+ }
+ node = node->GetNext();
+ }
+
+ // No? Search any subsizers we own then
+
+ node = m_children.GetFirst();
+ while (node)
+ {
+ wxSizerItem *item = node->GetData();
+
+ if ( item->GetSizer() &&
+ item->GetSizer()->DoSetItemMinSize( sizer, width, height ) )
+ {
+ // A child found the requested sizer, exit.
+ return true;
+ }
+ node = node->GetNext();
+ }
+
+ return false;
+}
+
+bool wxSizer::DoSetItemMinSize( size_t index, int width, int height )
+{
+ wxSizerItemList::compatibility_iterator node = m_children.Item( index );
+
+ wxCHECK_MSG( node, false, _T("Failed to find child node") );
+
+ wxSizerItem *item = node->GetData();
+
+ if (item->GetSizer())
+ {
+ // Sizers contains the minimal size in them, if not calculated ...
+ item->GetSizer()->DoSetMinSize( width, height );