X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/47366662dedbeeedc92e165075b638e810b608f5..363f7de02bf781db135d920408f0b8354386e45a:/src/gtk/scrolwin.cpp diff --git a/src/gtk/scrolwin.cpp b/src/gtk/scrolwin.cpp index 257c6f9f22..9232d1e543 100644 --- a/src/gtk/scrolwin.cpp +++ b/src/gtk/scrolwin.cpp @@ -5,8 +5,8 @@ // Modified by: Ron Lee // Created: 01/02/97 // RCS-ID: $Id$ -// Copyright: (c) Julian Smart and Markus Holzem -// Licence: wxWindows license +// Copyright: (c) Julian Smart +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// // ============================================================================ @@ -17,7 +17,7 @@ // headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "scrolwin.h" #endif @@ -313,7 +313,7 @@ bool wxScrolledWindow::Create(wxWindow *parent, PostCreation(); Show( TRUE ); - + return TRUE; } @@ -325,6 +325,11 @@ void wxScrolledWindow::DoSetVirtualSize( int x, int y ) { wxPanel::DoSetVirtualSize( x, y ); AdjustScrollbars(); + +#if wxUSE_CONSTRAINTS + if (GetAutoLayout()) + Layout(); +#endif } /* @@ -335,8 +340,11 @@ void wxScrolledWindow::SetScrollbars( int pixelsPerUnitX, int pixelsPerUnitY, int noUnitsX, int noUnitsY, int xPos, int yPos, bool noRefresh ) { - int old_x = m_xScrollPixelsPerLine * m_xScrollPosition; - int old_y = m_yScrollPixelsPerLine * m_yScrollPosition; + int xs, ys; + GetViewStart (& xs, & ys); + + int old_x = m_xScrollPixelsPerLine * xs; + int old_y = m_yScrollPixelsPerLine * ys; m_xScrollPixelsPerLine = pixelsPerUnitX; m_yScrollPixelsPerLine = pixelsPerUnitY; @@ -344,8 +352,12 @@ void wxScrolledWindow::SetScrollbars( int pixelsPerUnitX, int pixelsPerUnitY, m_hAdjust->value = m_xScrollPosition = xPos; m_vAdjust->value = m_yScrollPosition = yPos; + // Setting hints here should arguably be deprecated, but without it + // a sizer might override this manual scrollbar setting in old code. m_targetWindow->SetVirtualSizeHints( noUnitsX * pixelsPerUnitX, noUnitsY * pixelsPerUnitY ); + m_targetWindow->SetVirtualSize( noUnitsX * pixelsPerUnitX, noUnitsY * pixelsPerUnitY ); + if (!noRefresh) { int new_x = m_xScrollPixelsPerLine * m_xScrollPosition; @@ -376,11 +388,16 @@ void wxScrolledWindow::AdjustScrollbars() // If the scrollbar hits the right side, move the window // right to keep it from over extending. - if( m_hAdjust->value + m_hAdjust->page_size > m_hAdjust->upper ) + if ((m_hAdjust->value != 0.0) && (m_hAdjust->value + m_hAdjust->page_size > m_hAdjust->upper)) { m_hAdjust->value = m_hAdjust->upper - m_hAdjust->page_size; - m_targetWindow->ScrollWindow( (int) (m_xScrollPosition - m_hAdjust->value) * m_xScrollPixelsPerLine, 0 ); - m_xScrollPosition = (int)m_hAdjust->value; + if (m_hAdjust->value < 0.0) + m_hAdjust->value = 0.0; + + if (GetChildren().GetCount() == 0) + m_xScrollPosition = (int)m_hAdjust->value; // This is enough without child windows + else + gtk_signal_emit_by_name( GTK_OBJECT(m_hAdjust), "value_changed" ); // Actually scroll window } } @@ -394,11 +411,16 @@ void wxScrolledWindow::AdjustScrollbars() m_vAdjust->upper = vh / m_yScrollPixelsPerLine; m_vAdjust->page_size = (h / m_yScrollPixelsPerLine); - if( m_vAdjust->value + m_vAdjust->page_size > m_vAdjust->upper ) + if ((m_vAdjust->value != 0.0) && (m_vAdjust->value + m_vAdjust->page_size > m_vAdjust->upper)) { m_vAdjust->value = m_vAdjust->upper - m_vAdjust->page_size; - m_targetWindow->ScrollWindow( 0, (int) (m_yScrollPosition - m_vAdjust->value) * m_yScrollPixelsPerLine ); - m_yScrollPosition = (int)m_vAdjust->value; + if (m_vAdjust->value < 0.0) + m_vAdjust->value = 0.0; + + if (GetChildren().GetCount() == 0) + m_yScrollPosition = (int)m_vAdjust->value; + else + gtk_signal_emit_by_name( GTK_OBJECT(m_vAdjust), "value_changed" ); } } @@ -619,18 +641,24 @@ void wxScrolledWindow::GetViewStart (int *x, int *y) const void wxScrolledWindow::DoCalcScrolledPosition(int x, int y, int *xx, int *yy) const { + int xs, ys; + GetViewStart (& xs, & ys); + if ( xx ) - *xx = x - m_xScrollPosition * m_xScrollPixelsPerLine; + *xx = x - xs * m_xScrollPixelsPerLine; if ( yy ) - *yy = y - m_yScrollPosition * m_yScrollPixelsPerLine; + *yy = y - ys * m_yScrollPixelsPerLine; } void wxScrolledWindow::DoCalcUnscrolledPosition(int x, int y, int *xx, int *yy) const { + int xs, ys; + GetViewStart (& xs, & ys); + if ( xx ) - *xx = x + m_xScrollPosition * m_xScrollPixelsPerLine; + *xx = x + xs * m_xScrollPixelsPerLine; if ( yy ) - *yy = y + m_yScrollPosition * m_yScrollPixelsPerLine; + *yy = y + ys * m_yScrollPixelsPerLine; } int wxScrolledWindow::CalcScrollInc(wxScrollWinEvent& event) @@ -814,15 +842,24 @@ bool wxScrolledWindow::Layout() // Default OnSize resets scrollbars, if any void wxScrolledWindow::OnSize(wxSizeEvent& WXUNUSED(event)) { - if( m_targetWindow != this ) - m_targetWindow->SetVirtualSize( m_targetWindow->GetClientSize() ); + if( GetAutoLayout() || m_targetWindow->GetAutoLayout() ) + { + if( m_targetWindow != this ) + m_targetWindow->FitInside(); - SetVirtualSize( GetClientSize() ); + FitInside(); -#if wxUSE_CONSTRAINTS - if (GetAutoLayout()) - 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(); + } } // This calls OnDraw, having adjusted the origin according to the current @@ -845,7 +882,7 @@ void wxScrolledWindow::OnChar(wxKeyEvent& event) szx, szy, // view size (total) clix, cliy; // view size (on screen) - ViewStart(&stx, &sty); + GetViewStart(&stx, &sty); GetClientSize(&clix, &cliy); GetVirtualSize(&szx, &szy); @@ -874,7 +911,7 @@ void wxScrolledWindow::OnChar(wxKeyEvent& event) yScrollOld = GetScrollPos(wxVERTICAL); int dsty; - switch ( event.KeyCode() ) + switch ( event.GetKeyCode() ) { case WXK_PAGEUP: case WXK_PRIOR: