-    int old_x = m_xScrollPixelsPerLine * m_xScrollPosition;
-    int old_y = m_yScrollPixelsPerLine * m_yScrollPosition;
-
-    m_xScrollPixelsPerLine = xstep;
-    m_yScrollPixelsPerLine = ystep;
-
-    int new_x = m_xScrollPixelsPerLine * m_xScrollPosition;
-    int new_y = m_yScrollPixelsPerLine * m_yScrollPosition;
-
-    m_targetWindow->ScrollWindow( old_x - new_x, old_y - new_y );
-
-    AdjustScrollbars();
-}
-
-void wxScrolledWindow::GetScrollPixelsPerUnit (int *x_unit, int *y_unit) const
-{
-    if ( x_unit )
-        *x_unit = m_xScrollPixelsPerLine;
-    if ( y_unit )
-        *y_unit = m_yScrollPixelsPerLine;
-}
-
-int wxScrolledWindow::GetScrollPageSize(int orient) const
-{
-    if ( orient == wxHORIZONTAL )
-        return m_xScrollLinesPerPage;
-    else
-        return m_yScrollLinesPerPage;
-}
-
-void wxScrolledWindow::SetScrollPageSize(int orient, int pageSize)
-{
-    if ( orient == wxHORIZONTAL )
-        m_xScrollLinesPerPage = pageSize;
-    else
-        m_yScrollLinesPerPage = pageSize;
-}
-
-void wxScrolledWindow::OnScroll(wxScrollWinEvent& event)
-{
-    int orient = event.GetOrientation();
-
-    int nScrollInc = CalcScrollInc(event);
-    if (nScrollInc == 0) return;
-
-    if (orient == wxHORIZONTAL)
-    {
-        int newPos = m_xScrollPosition + nScrollInc;
-        SetScrollPos(wxHORIZONTAL, newPos, TRUE );
-    }
-    else
-    {
-        int newPos = m_yScrollPosition + nScrollInc;
-        SetScrollPos(wxVERTICAL, newPos, TRUE );
-    }
-
-    if (orient == wxHORIZONTAL)
-    {
-        m_xScrollPosition += nScrollInc;
-    }
-    else
-    {
-        m_yScrollPosition += nScrollInc;
-    }
-
-    if (orient == wxHORIZONTAL)
-    {
-       if (m_xScrollingEnabled)
-            m_targetWindow->ScrollWindow(-m_xScrollPixelsPerLine * nScrollInc, 0, (const wxRect *) NULL);
-       else
-            m_targetWindow->Refresh();
-    }
-    else
-    {
-        if (m_yScrollingEnabled)
-            m_targetWindow->ScrollWindow(0, -m_yScrollPixelsPerLine * nScrollInc, (const wxRect *) NULL);
-        else
-            m_targetWindow->Refresh();
-    }
-}
-
-void wxScrolledWindow::Scroll( int x_pos, int y_pos )
-{
-    wxASSERT_MSG( m_targetWindow != 0, _T("No target window") );
-
-    if (((x_pos == -1) || (x_pos == m_xScrollPosition)) &&
-        ((y_pos == -1) || (y_pos == m_yScrollPosition))) return;
-
-    if ((x_pos != -1) && (m_xScrollPixelsPerLine))
-    {
-        int max = (int)(m_hAdjust->upper - m_hAdjust->page_size + 0.5);
-        if (max < 0) max = 0;
-        if (x_pos > max) x_pos = max;
-        if (x_pos < 0) x_pos = 0;
-
-        int old_x = m_xScrollPosition;
-        m_xScrollPosition = x_pos;
-        m_hAdjust->value = x_pos;
-
-        m_targetWindow->ScrollWindow( (old_x-m_xScrollPosition)*m_xScrollPixelsPerLine, 0 );
-
-        // Just update the scrollbar, don't send any wxWidgets event
-        GtkHDisconnectEvent();
-        gtk_signal_emit_by_name( GTK_OBJECT(m_hAdjust), "value_changed" );
-        GtkHConnectEvent();
-    }
-
-    if ((y_pos != -1) && (m_yScrollPixelsPerLine))
-    {
-        int max = (int)(m_vAdjust->upper - m_vAdjust->page_size + 0.5);
-        if (max < 0) max = 0;
-        if (y_pos > max) y_pos = max;
-        if (y_pos < 0) y_pos = 0;
-
-        int old_y = m_yScrollPosition;
-        m_yScrollPosition = y_pos;
-        m_vAdjust->value = y_pos;
-
-        m_targetWindow->ScrollWindow( 0, (old_y-m_yScrollPosition)*m_yScrollPixelsPerLine );
-
-        // Just update the scrollbar, don't send any wxWidgets event
-        GtkVDisconnectEvent();
-        gtk_signal_emit_by_name( GTK_OBJECT(m_vAdjust), "value_changed" );
-        GtkVConnectEvent();
-    }
-}
-
-// TODO: [VH]Scroll functions should be combined
-
-void wxScrolledWindow::GtkVScroll( float value, unsigned int scroll_type )
-{
-    wxASSERT_MSG( m_targetWindow != 0, _T("No target window") );
-
-    if (m_yScrollPixelsPerLine == 0)
-        return;
-
-    int y_pos = (int)(value+0.5);
-
-    if (y_pos == m_yScrollPosition)
-        return;
-
-    wxEventType command = GtkScrollWinTypeToWx(scroll_type);
-
-    wxScrollWinEvent event( command, y_pos, wxVERTICAL );
-    event.SetEventObject( this );
-    GetEventHandler()->ProcessEvent( event );
-}
-
-void wxScrolledWindow::GtkHScroll( float value, unsigned int scroll_type )
-{
-    wxASSERT_MSG( m_targetWindow != 0, _T("No target window") );
-
-    if (m_xScrollPixelsPerLine == 0)
-        return;
-
-    int x_pos = (int)(value+0.5);
-
-    if (x_pos == m_xScrollPosition)
-        return;
-
-    wxEventType command = GtkScrollWinTypeToWx(scroll_type);
-
-    wxScrollWinEvent event( command, x_pos, wxHORIZONTAL );
-    event.SetEventObject( this );
-    GetEventHandler()->ProcessEvent( event );
-}
-
-void wxScrolledWindow::EnableScrolling (bool x_scroll, bool y_scroll)
-{
-    m_xScrollingEnabled = x_scroll;
-    m_yScrollingEnabled = y_scroll;
-}
-
-// Where the current view starts from
-void wxScrolledWindow::GetViewStart (int *x, int *y) const
-{
-    if ( x )
-        *x = m_xScrollPosition;
-    if ( y )
-        *y = m_yScrollPosition;
-}
-
-void wxScrolledWindow::DoCalcScrolledPosition(int x, int y, int *xx, int *yy) const
-{
-    int xs, ys;
-    GetViewStart (& xs, & ys);
-
-    if ( xx )
-        *xx = x - xs * m_xScrollPixelsPerLine;
-    if ( yy )
-        *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 + xs * m_xScrollPixelsPerLine;
-    if ( yy )
-        *yy = y + ys * m_yScrollPixelsPerLine;
-}
-
-int wxScrolledWindow::CalcScrollInc(wxScrollWinEvent& event)
-{
-    int pos = event.GetPosition();
-    int orient = event.GetOrientation();
-
-    int nScrollInc = 0;
-    if (event.GetEventType() == wxEVT_SCROLLWIN_TOP)
-    {
-            if (orient == wxHORIZONTAL)
-                nScrollInc = - m_xScrollPosition;
-            else
-                nScrollInc = - m_yScrollPosition;
-    } else
-    if (event.GetEventType() == wxEVT_SCROLLWIN_BOTTOM)
-    {
-            if (orient == wxHORIZONTAL)
-                nScrollInc = GetVirtualSize().GetWidth() / m_xScrollPixelsPerLine - m_xScrollPosition;
-            else
-                nScrollInc = GetVirtualSize().GetHeight() / m_yScrollPixelsPerLine - m_yScrollPosition;
-    } else
-    if (event.GetEventType() == wxEVT_SCROLLWIN_LINEUP)
-    {
-            nScrollInc = -1;
-    } else
-    if (event.GetEventType() == wxEVT_SCROLLWIN_LINEDOWN)
-    {
-            nScrollInc = 1;
-    } else
-    if (event.GetEventType() == wxEVT_SCROLLWIN_PAGEUP)
-    {
-            if (orient == wxHORIZONTAL)
-                nScrollInc = -GetScrollPageSize(wxHORIZONTAL);
-            else
-                nScrollInc = -GetScrollPageSize(wxVERTICAL);
-    } else
-    if (event.GetEventType() == wxEVT_SCROLLWIN_PAGEDOWN)
-    {
-            if (orient == wxHORIZONTAL)
-                nScrollInc = GetScrollPageSize(wxHORIZONTAL);
-            else
-                nScrollInc = GetScrollPageSize(wxVERTICAL);
-    } else
-    if ((event.GetEventType() == wxEVT_SCROLLWIN_THUMBTRACK) ||
-        (event.GetEventType() == wxEVT_SCROLLWIN_THUMBRELEASE))
-    {
-            if (orient == wxHORIZONTAL)
-                nScrollInc = pos - m_xScrollPosition;
-            else
-                nScrollInc = pos - m_yScrollPosition;
-    }
-
-    if (orient == wxHORIZONTAL)
-    {
-        if (m_xScrollPixelsPerLine > 0)
-        {
-            int max = (int)(m_hAdjust->upper - m_hAdjust->page_size + 0.5);
-            if (max < 0) max = 0;
-
-            if ( (m_xScrollPosition + nScrollInc) < 0 )
-                nScrollInc = -m_xScrollPosition; // As -ve as we can go
-            else if ( (m_xScrollPosition + nScrollInc) > max )
-                nScrollInc = max - m_xScrollPosition; // As +ve as we can go
-        }
-        else
-            m_targetWindow->Refresh();
-    }
-    else
-    {
-        if (m_yScrollPixelsPerLine > 0)
-        {
-            int max = (int)(m_vAdjust->upper - m_vAdjust->page_size + 0.5);
-            if (max < 0) max = 0;
-
-            if ( (m_yScrollPosition + nScrollInc) < 0 )
-                nScrollInc = -m_yScrollPosition; // As -ve as we can go
-            else if ( (m_yScrollPosition + nScrollInc) > max )
-                nScrollInc = max - m_yScrollPosition; // As +ve as we can go
-        }
-        else
-            m_targetWindow->Refresh();
-    }
-
-    return nScrollInc;
-}
-
-void wxScrolledWindow::SetScrollPos( int orient, int pos, bool refresh )
-{
-    wxCHECK_RET( m_widget != NULL, wxT("invalid window") );
-
-    wxCHECK_RET( m_wxwindow != NULL, wxT("window needs client area for scrolling") );
-
-    if (orient == wxHORIZONTAL)
-    {
-        int max = (int)(m_hAdjust->upper - m_hAdjust->page_size + 0.5);
-        if (max < 0) max = 0;
-
-        if (pos > max) pos = 0;
-        if (pos < 0) pos = 0;
-
-        if (pos == (int)(m_hAdjust->value+0.5)) return;
-        m_hAdjust->value = pos;
-    }
-    else
-    {
-        int max = (int)(m_vAdjust->upper - m_vAdjust->page_size + 0.5);
-        if (max < 0) max = 0;
-
-        if (pos > max) pos = 0;
-        if (pos < 0) pos = 0;
-
-        if (pos == (int)(m_vAdjust->value+0.5)) return;
-        m_vAdjust->value = pos;
-    }
-
-    if (m_wxwindow->window)
-    {
-        if (orient == wxHORIZONTAL)
-        {
-            // 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 wxWidgets event
-            GtkVDisconnectEvent();
-            gtk_signal_emit_by_name( GTK_OBJECT(m_vAdjust), "value_changed" );
-            GtkVConnectEvent();
-        }
-    }
-}
-
-void wxScrolledWindow::GtkVConnectEvent()
-{
-    gtk_signal_connect( GTK_OBJECT(m_vAdjust), "value_changed",
-          (GtkSignalFunc) gtk_scrolled_window_vscroll_callback, (gpointer) this );
-}
-
-void wxScrolledWindow::GtkHConnectEvent()
-{
-    gtk_signal_connect( GTK_OBJECT(m_hAdjust), "value_changed",
-          (GtkSignalFunc) gtk_scrolled_window_hscroll_callback, (gpointer) this );
-}