m_handler = NULL;
m_win = win;
+
+ m_win->SetScrollHelper( this );
// by default, the associated window is also the target window
DoSetTargetWindow(win);
void wxScrollHelper::DoPrepareDC(wxDC& dc)
{
wxPoint pt = dc.GetDeviceOrigin();
- dc.SetDeviceOrigin( pt.x - m_xScrollPosition * m_xScrollPixelsPerLine,
- pt.y - m_yScrollPosition * m_yScrollPixelsPerLine );
+#ifdef __WXGTK__
+ // It may actually be correct to always query
+ // the m_sign from the DC here, but I leve the
+ // #ifdef GTK for now.
+ if (m_win->GetLayoutDirection() == wxLayout_RightToLeft)
+ dc.SetDeviceOrigin( pt.x + m_xScrollPosition * m_xScrollPixelsPerLine,
+ pt.y - m_yScrollPosition * m_yScrollPixelsPerLine );
+ else
+#endif
+ dc.SetDeviceOrigin( pt.x - m_xScrollPosition * m_xScrollPixelsPerLine,
+ pt.y - m_yScrollPosition * m_yScrollPixelsPerLine );
dc.SetUserScale( m_scaleX, m_scaleY );
}
*y_unit = m_yScrollPixelsPerLine;
}
+
+int wxScrollHelper::GetScrollLines( int orient ) const
+{
+ if ( orient == wxHORIZONTAL )
+ return m_xScrollLines;
+ else
+ return m_yScrollLines;
+}
+
int wxScrollHelper::GetScrollPageSize(int orient) const
{
if ( orient == wxHORIZONTAL )
// Calculate page size i.e. number of scroll units you get on the
// current client window
- int noPagePositions = (int) ( (w/(double)m_xScrollPixelsPerLine) + 0.5 );
+ int noPagePositions = w/m_xScrollPixelsPerLine;
if (noPagePositions < 1) noPagePositions = 1;
// Correct position if greater than extent of canvas minus
m_xScrollPosition = wxMin( m_xScrollLines-noPagePositions, m_xScrollPosition );
m_xScrollPosition = wxMax( 0, m_xScrollPosition );
- if (old_x != m_xScrollPosition) {
+ if (old_x != m_xScrollPosition)
+ {
m_win->SetScrollPos( wxHORIZONTAL, m_xScrollPosition );
m_targetWindow->ScrollWindow( (old_x-m_xScrollPosition)*m_xScrollPixelsPerLine, 0,
GetScrollRect() );
// Calculate page size i.e. number of scroll units you get on the
// current client window
- int noPagePositions = (int) ( (h/(double)m_yScrollPixelsPerLine) + 0.5 );
+ int noPagePositions = h/m_yScrollPixelsPerLine;
if (noPagePositions < 1) noPagePositions = 1;
// Correct position if greater than extent of canvas minus
m_yScrollPosition = wxMin( m_yScrollLines-noPagePositions, m_yScrollPosition );
m_yScrollPosition = wxMax( 0, m_yScrollPosition );
- if (old_y != m_yScrollPosition) {
+ if (old_y != m_yScrollPosition)
+ {
m_win->SetScrollPos( wxVERTICAL, m_yScrollPosition );
m_targetWindow->ScrollWindow( 0, (old_y-m_yScrollPosition)*m_yScrollPixelsPerLine,
GetScrollRect() );
void wxScrollHelper::DoCalcScrolledPosition(int x, int y, int *xx, int *yy) const
{
if ( xx )
- {
- if ((m_xScrollLines == 0) || (m_xScrollPixelsPerLine == 0))
- {
- // nothing to do
- *xx = x;
- }
- else
- {
-#ifdef __WXGTK__
- if (m_win->GetLayoutDirection() == wxLayout_RightToLeft)
- {
- int w = 0, h = 0;
- GetTargetSize(&w, &h);
-
- // Calculate page size i.e. number of scroll units you get on the
- // current client window
- int noPagePositions = w/m_xScrollPixelsPerLine;
- if (noPagePositions < 1) noPagePositions = 1;
- *xx = x - ((m_xScrollLines - noPagePositions - m_xScrollPosition) * m_xScrollPixelsPerLine);
- }
- else
-#endif
- {
- *xx = x - m_xScrollPosition * m_xScrollPixelsPerLine;
- }
- }
- }
+ *xx = x - m_xScrollPosition * m_xScrollPixelsPerLine;
if ( yy )
*yy = y - m_yScrollPosition * m_yScrollPixelsPerLine;
}
void wxScrollHelper::DoCalcUnscrolledPosition(int x, int y, int *xx, int *yy) const
{
if ( xx )
- {
- if ((m_xScrollLines == 0) || (m_xScrollPixelsPerLine == 0))
- {
- // nothing to do
- *xx = x;
- }
- else
- {
-#ifdef __WXGTK__
- if (m_win->GetLayoutDirection() == wxLayout_RightToLeft)
- {
- int w = 0, h = 0;
- GetTargetSize(&w, &h);
-
- // Calculate page size i.e. number of scroll units you get on the
- // current client window
- int noPagePositions = w/m_xScrollPixelsPerLine;
- if (noPagePositions < 1) noPagePositions = 1;
- *xx = x + ((m_xScrollLines - noPagePositions - m_xScrollPosition) * m_xScrollPixelsPerLine);
- }
- else
-#endif
- {
- *xx = x + m_xScrollPosition * m_xScrollPixelsPerLine;
- }
- }
- }
+ *xx = x + m_xScrollPosition * m_xScrollPixelsPerLine;
if ( yy )
*yy = y + m_yScrollPosition * m_yScrollPixelsPerLine;
}