#pragma hdrstop
#endif
+#include "wx/display.h"
#include "wx/sizer.h"
#ifndef WX_PRECOMP
#include "wx/settings.h"
#include "wx/button.h"
#include "wx/statbox.h"
+ #include "wx/toplevel.h"
#endif // WX_PRECOMP
#include "wx/listimpl.cpp"
-#if WXWIN_COMPATIBILITY_2_4
- #include "wx/notebook.h"
-#endif
//---------------------------------------------------------------------------
{
// Since the size of the window may change during runtime, we
// should use the current minimal/best size.
- m_minSize = m_window->GetBestFittingSize();
+ m_minSize = m_window->GetEffectiveMinSize();
}
return GetMinSizeWithBorder();
size.y -= m_border;
}
+ if (size.x < 0)
+ size.x = 0;
+ if (size.y < 0)
+ size.y = 0;
+
m_rect = wxRect(pos, size);
switch ( m_kind )
// shown, so are we (this arbitrariness is the reason for
// deprecating this function)
{
+ // Some apps (such as dialog editors) depend on an empty sizer still
+ // being laid out correctly and reporting the correct size and position.
+ if (m_sizer->GetChildren().GetCount() == 0)
+ return true;
+
for ( wxSizerItemList::compatibility_iterator
node = m_sizer->GetChildren().GetFirst();
node;
wxSize wxSizer::Fit( wxWindow *window )
{
- wxSize size(window->IsTopLevel() ? FitSize(window)
- : GetMinWindowSize(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 )
+ {
+ // hack for small screen devices where TLWs are always full screen
+ if ( tlw->IsAlwaysMaximized() )
+ {
+ size = 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 )
+ {
+ // or, if we don't know which one it is, of the main one
+ disp = 0;
+ }
+
+ sizeMax = wxDisplay(disp).GetClientArea().GetSize();
+ }
+ }
+
+ 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 );
// 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
-
-// Return a window size that will fit within the screens dimensions
-wxSize wxSizer::FitSize( wxWindow *window )
-{
- if ( window->IsTopLevel() )
- {
- wxTopLevelWindow *tlw = wxDynamicCast(window, wxTopLevelWindow);
- if ( tlw && tlw->IsAlwaysMaximized() )
- {
- return tlw->GetClientSize();
- }
- }
-
- wxSize size = GetMinWindowSize( window );
- wxSize sizeMax = GetMaxWindowSize( 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::GetMaxClientSize( wxWindow *window ) const
{
wxSize maxSize( window->GetMaxSize() );
}
#endif // wxUSE_BUTTON
-
-#if WXWIN_COMPATIBILITY_2_4
-
-// ----------------------------------------------------------------------------
-// wxNotebookSizer
-// ----------------------------------------------------------------------------
-
-#if wxUSE_BOOKCTRL
-IMPLEMENT_CLASS(wxBookCtrlSizer, wxSizer)
-#if wxUSE_NOTEBOOK
-IMPLEMENT_CLASS(wxNotebookSizer, wxBookCtrlSizer)
-#endif // wxUSE_NOTEBOOK
-#endif // wxUSE_BOOKCTRL
-
-#if wxUSE_BOOKCTRL
-
-#if WXWIN_COMPATIBILITY_2_6
-
-wxBookCtrlSizer::wxBookCtrlSizer(wxBookCtrlBase *bookctrl)
- : m_bookctrl(bookctrl)
-{
- wxASSERT_MSG( bookctrl, wxT("wxBookCtrlSizer needs a control") );
-}
-
-#endif // WXWIN_COMPATIBILITY_2_6
-
-void wxBookCtrlSizer::RecalcSizes()
-{
- m_bookctrl->SetSize( m_position.x, m_position.y, m_size.x, m_size.y );
-}
-
-wxSize wxBookCtrlSizer::CalcMin()
-{
- wxSize sizeBorder = m_bookctrl->CalcSizeFromPage(wxSize(0,0));
-
- sizeBorder.x += 5;
- sizeBorder.y += 5;
-
- if ( m_bookctrl->GetPageCount() == 0 )
- {
- return wxSize(sizeBorder.x + 10, sizeBorder.y + 10);
- }
-
- int maxX = 0;
- int maxY = 0;
-
- wxWindowList::compatibility_iterator
- node = m_bookctrl->GetChildren().GetFirst();
- while (node)
- {
- wxWindow *item = node->GetData();
- wxSizer *itemsizer = item->GetSizer();
-
- if (itemsizer)
- {
- wxSize subsize( itemsizer->CalcMin() );
-
- if (subsize.x > maxX)
- maxX = subsize.x;
- if (subsize.y > maxY)
- maxY = subsize.y;
- }
-
- node = node->GetNext();
- }
-
- return wxSize( maxX, maxY ) + sizeBorder;
-}
-
-#if wxUSE_NOTEBOOK
-
-#if WXWIN_COMPATIBILITY_2_6
-
-wxNotebookSizer::wxNotebookSizer(wxNotebook *nb)
-{
- wxASSERT_MSG( nb, wxT("wxNotebookSizer needs a control") );
- m_bookctrl = nb;
-}
-
-#endif // WXWIN_COMPATIBILITY_2_6
-
-#endif // wxUSE_NOTEBOOOK
-#endif // wxUSE_BOOKCTRL
-
-#endif // WXWIN_COMPATIBILITY_2_4