X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/6c9a19aabab3a878b565e6c2a5f2a3824277c4dc..d109c5849ed117966311a44875c97ae3d77b44e5:/src/gtk/scrolwin.cpp?ds=sidebyside diff --git a/src/gtk/scrolwin.cpp b/src/gtk/scrolwin.cpp index efdafd7d07..4d82bb3209 100644 --- a/src/gtk/scrolwin.cpp +++ b/src/gtk/scrolwin.cpp @@ -1,11 +1,11 @@ ///////////////////////////////////////////////////////////////////////////// // Name: gtk/scrolwin.cpp // Purpose: wxScrolledWindow implementation -// Author: Julian Smart +// Author: Robert Roebling // Modified by: Ron Lee // Created: 01/02/97 // RCS-ID: $Id$ -// Copyright: (c) Julian Smart +// Copyright: (c) Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -17,7 +17,7 @@ // headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "scrolwin.h" #endif @@ -83,7 +83,7 @@ static void gtk_scrolled_window_vscroll_callback( GtkAdjustment *adjust, if (g_blockEventsOnDrag) return; if (!win->m_hasVMT) return; - + win->GtkVScroll( adjust->value, GET_SCROLL_TYPE(GTK_SCROLLED_WINDOW(win->m_widget)->vscrollbar) ); } @@ -288,7 +288,7 @@ bool wxScrolledWindow::Create(wxWindow *parent, GtkHConnectEvent(); // these handlers block mouse events to any window during scrolling such as - // motion events and prevent GTK and wxWindows from fighting over where the + // motion events and prevent GTK and wxWidgets from fighting over where the // slider should be gtk_signal_connect( GTK_OBJECT(scrolledWindow->vscrollbar), "button_press_event", @@ -340,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; @@ -375,12 +378,14 @@ void wxScrolledWindow::AdjustScrollbars() if (m_xScrollPixelsPerLine == 0) { m_hAdjust->upper = 1.0; + m_hAdjust->page_increment = 1.0; m_hAdjust->page_size = 1.0; } else { m_hAdjust->upper = vw / m_xScrollPixelsPerLine; - m_hAdjust->page_size = (w / m_xScrollPixelsPerLine); + m_hAdjust->page_increment = (w / m_xScrollPixelsPerLine); + m_hAdjust->page_size = m_hAdjust->page_increment; // If the scrollbar hits the right side, move the window // right to keep it from over extending. @@ -401,12 +406,14 @@ void wxScrolledWindow::AdjustScrollbars() if (m_yScrollPixelsPerLine == 0) { m_vAdjust->upper = 1.0; + m_vAdjust->page_increment = 1.0; m_vAdjust->page_size = 1.0; } else { m_vAdjust->upper = vh / m_yScrollPixelsPerLine; - m_vAdjust->page_size = (h / m_yScrollPixelsPerLine); + m_vAdjust->page_increment = (h / m_yScrollPixelsPerLine); + m_vAdjust->page_size = m_vAdjust->page_increment; if ((m_vAdjust->value != 0.0) && (m_vAdjust->value + m_vAdjust->page_size > m_vAdjust->upper)) { @@ -421,8 +428,8 @@ void wxScrolledWindow::AdjustScrollbars() } } - m_xScrollLinesPerPage = (int)(m_hAdjust->page_size + 0.5); - m_yScrollLinesPerPage = (int)(m_vAdjust->page_size + 0.5); + m_xScrollLinesPerPage = (int)(m_hAdjust->page_increment + 0.5); + m_yScrollLinesPerPage = (int)(m_vAdjust->page_increment + 0.5); gtk_signal_emit_by_name( GTK_OBJECT(m_vAdjust), "changed" ); gtk_signal_emit_by_name( GTK_OBJECT(m_hAdjust), "changed" ); @@ -439,14 +446,14 @@ void wxScrolledWindow::SetTargetWindow( wxWindow *target, bool WXUNUSED(pushEven m_targetWindow = target; } -wxWindow *wxScrolledWindow::GetTargetWindow() +wxWindow *wxScrolledWindow::GetTargetWindow() const { return m_targetWindow; } // Override this function if you don't want to have wxScrolledWindow // automatically change the origin according to the scroll position. -void wxScrolledWindow::PrepareDC(wxDC& dc) +void wxScrolledWindow::DoPrepareDC(wxDC& dc) { dc.SetDeviceOrigin( -m_xScrollPosition * m_xScrollPixelsPerLine, -m_yScrollPosition * m_yScrollPixelsPerLine ); @@ -555,7 +562,7 @@ void wxScrolledWindow::Scroll( int x_pos, int y_pos ) m_targetWindow->ScrollWindow( (old_x-m_xScrollPosition)*m_xScrollPixelsPerLine, 0 ); - // Just update the scrollbar, don't send any wxWindows event + // Just update the scrollbar, don't send any wxWidgets event GtkHDisconnectEvent(); gtk_signal_emit_by_name( GTK_OBJECT(m_hAdjust), "value_changed" ); GtkHConnectEvent(); @@ -574,7 +581,7 @@ void wxScrolledWindow::Scroll( int x_pos, int y_pos ) m_targetWindow->ScrollWindow( 0, (old_y-m_yScrollPosition)*m_yScrollPixelsPerLine ); - // Just update the scrollbar, don't send any wxWindows event + // Just update the scrollbar, don't send any wxWidgets event GtkVDisconnectEvent(); gtk_signal_emit_by_name( GTK_OBJECT(m_vAdjust), "value_changed" ); GtkVConnectEvent(); @@ -638,18 +645,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) @@ -770,14 +783,14 @@ void wxScrolledWindow::SetScrollPos( int orient, int pos, bool refresh ) { if (orient == wxHORIZONTAL) { - // Just update the scrollbar, don't send any wxWindows event + // Just update the scrollbar, don't send any wxWidgets event GtkHDisconnectEvent(); gtk_signal_emit_by_name( GTK_OBJECT(m_hAdjust), "value_changed" ); GtkHConnectEvent(); } else { - // Just update the scrollbar, don't send any wxWindows event + // Just update the scrollbar, don't send any wxWidgets event GtkVDisconnectEvent(); gtk_signal_emit_by_name( GTK_OBJECT(m_vAdjust), "value_changed" ); GtkVConnectEvent();