diff --git a/src/common/sizer.cpp b/src/common/sizer.cpp index a0ee65773c..dfe492531d 100644 --- a/src/common/sizer.cpp +++ b/src/common/sizer.cpp @@ -1114,16 +1114,29 @@ void wxFlexGridSizer::RecalcSizes() wxSize wxFlexGridSizer::CalcMin() { - int nrows, ncols; + int nrows, + ncols; + size_t i, s; + if ( !CalcRowsCols(nrows, ncols) ) return wxSize(10, 10); + // We have to clear the old sizes out if any item has wxADJUST_MINSIZE + // set on it. Its probably quicker to just always do it than test for + // that though. At least do it before resizing the arrays, SetCount will + // initialise new elements to zero. + for( s = m_rowHeights.GetCount(), i = 0; i < s; ++i ) + m_rowHeights[ i ] = 0; + + for( s = m_colWidths.GetCount(), i = 0; i < s; ++i ) + m_colWidths[ i ] = 0; + m_rowHeights.SetCount(nrows); m_colWidths.SetCount(ncols); - int i = 0; wxSizerItemList::Node *node = m_children.GetFirst(); + i = 0; while (node) { wxSizerItem *item = node->GetData(); diff --git a/src/common/wincmn.cpp b/src/common/wincmn.cpp index aa805541da..65d02ccc85 100644 --- a/src/common/wincmn.cpp +++ b/src/common/wincmn.cpp @@ -634,12 +634,8 @@ wxSize wxWindowBase::DoGetVirtualSize() const { wxSize s( GetClientSize() ); - if( m_virtualSize.GetWidth() != -1 ) - s.SetWidth( m_virtualSize.GetWidth() ); - if( m_virtualSize.GetHeight() != -1 ) - s.SetHeight( m_virtualSize.GetHeight() ); - - return s; + return wxSize( wxMax( m_virtualSize.GetWidth(), s.GetWidth() ), + wxMax( m_virtualSize.GetHeight(), s.GetHeight() ) ); } // ---------------------------------------------------------------------------- diff --git a/src/generic/scrlwing.cpp b/src/generic/scrlwing.cpp index f516a8552d..944ff42b1e 100644 --- a/src/generic/scrlwing.cpp +++ b/src/generic/scrlwing.cpp @@ -344,23 +344,18 @@ void wxScrollHelper::SetScrollbars(int pixelsPerUnitX, m_xScrollPosition = xPos; m_yScrollPosition = yPos; + int w = noUnitsX * pixelsPerUnitX; + int h = noUnitsY * pixelsPerUnitY; + // For better backward compatibility we set persisting limits // here not just the size. It makes SetScrollbars 'sticky' // emulating the old non-autoscroll behaviour. - wxSize sz = m_targetWindow->GetClientSize(); -#if 1 - int x = wxMax(noUnitsX * pixelsPerUnitX, sz.x); - int y = wxMax(noUnitsY * pixelsPerUnitY, sz.y); -#else - int x = noUnitsX * pixelsPerUnitX; - int y = noUnitsY * pixelsPerUnitY; -#endif - m_targetWindow->SetVirtualSizeHints( x, y ); + m_targetWindow->SetVirtualSizeHints( w, h ); // The above should arguably be deprecated, this however we still need. - m_targetWindow->SetVirtualSize( x, y ); + m_targetWindow->SetVirtualSize( w, h ); if (do_refresh && !noRefresh) m_targetWindow->Refresh(TRUE, GetRect()); @@ -891,16 +886,19 @@ void wxScrollHelper::DoCalcUnscrolledPosition(int x, int y, int *xx, int *yy) co // Default OnSize resets scrollbars, if any void wxScrollHelper::HandleOnSize(wxSizeEvent& WXUNUSED(event)) { - if( m_win->GetAutoLayout() ) + if( m_win->GetAutoLayout() || m_targetWindow->GetAutoLayout() ) { if ( m_targetWindow != m_win ) m_targetWindow->FitInside(); m_win->FitInside(); -#if wxUSE_CONSTRAINTS - m_win->Layout(); -#endif + // FIXME: Something is really weird here... This should be + // called by FitInside above (and apparently is), yet the + // scrollsub sample will get the scrollbar wrong if resized + // quickly. This masks the bug, but is surely not the right + // answer at all. + AdjustScrollbars(); } else AdjustScrollbars(); diff --git a/src/gtk/scrolwin.cpp b/src/gtk/scrolwin.cpp index ff1c2da0a0..9a792a679e 100644 --- a/src/gtk/scrolwin.cpp +++ b/src/gtk/scrolwin.cpp @@ -833,12 +833,19 @@ bool wxScrolledWindow::Layout() // Default OnSize resets scrollbars, if any void wxScrolledWindow::OnSize(wxSizeEvent& WXUNUSED(event)) { - if( GetAutoLayout() ) + if( GetAutoLayout() || m_targetWindow->GetAutoLayout() ) { if( m_targetWindow != this ) m_targetWindow->FitInside(); FitInside(); + + // FIXME: Something is really weird here... This should be + // called by FitInside above (and apparently is), yet the + // scrollsub sample will get the scrollbar wrong if resized + // quickly. This masks the bug, but is surely not the right + // answer at all. + AdjustScrollbars(); } else { diff --git a/src/gtk1/scrolwin.cpp b/src/gtk1/scrolwin.cpp index ff1c2da0a0..9a792a679e 100644 --- a/src/gtk1/scrolwin.cpp +++ b/src/gtk1/scrolwin.cpp @@ -833,12 +833,19 @@ bool wxScrolledWindow::Layout() // Default OnSize resets scrollbars, if any void wxScrolledWindow::OnSize(wxSizeEvent& WXUNUSED(event)) { - if( GetAutoLayout() ) + if( GetAutoLayout() || m_targetWindow->GetAutoLayout() ) { if( m_targetWindow != this ) m_targetWindow->FitInside(); FitInside(); + + // FIXME: Something is really weird here... This should be + // called by FitInside above (and apparently is), yet the + // scrollsub sample will get the scrollbar wrong if resized + // quickly. This masks the bug, but is surely not the right + // answer at all. + AdjustScrollbars(); } else {