// headers
// ----------------------------------------------------------------------------
-#ifdef __VMS
-#define XtDisplay XTDISPLAY
-#endif
-
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#pragma hdrstop
#endif
+#ifdef __VMS
+#define XtDisplay XTDISPLAY
+#endif
+
#include "wx/scrolwin.h"
#ifndef WX_PRECOMP
#include "wx/sizer.h"
#endif
+#ifdef __WXMAC__
+#include "wx/scrolbar.h"
+#endif
+
#include "wx/recguard.h"
#ifdef __WXMSW__
}
}
- // reset the skipped flag to false as it might have been set to true in
- // ProcessEvent() above
- event.Skip(false);
-
if ( evType == wxEVT_PAINT )
{
m_scrollHelper->HandleOnPaint((wxPaintEvent &)event);
return true;
}
+ // reset the skipped flag (which might have been set to true in
+ // ProcessEvent() above) to be able to test it below
+ bool wasSkipped = event.GetSkipped();
+ if ( wasSkipped )
+ event.Skip(false);
+
if ( evType == wxEVT_SCROLLWIN_TOP ||
evType == wxEVT_SCROLLWIN_BOTTOM ||
evType == wxEVT_SCROLLWIN_LINEUP ||
evType == wxEVT_SCROLLWIN_THUMBTRACK ||
evType == wxEVT_SCROLLWIN_THUMBRELEASE )
{
- m_scrollHelper->HandleOnScroll((wxScrollWinEvent &)event);
- return !event.GetSkipped();
+ m_scrollHelper->HandleOnScroll((wxScrollWinEvent &)event);
+ if ( !event.GetSkipped() )
+ {
+ // it makes sense to indicate that we processed the message as we
+ // did scroll the window (and also notice that wxAutoScrollTimer
+ // relies on our return value to stop scrolling when we are at top
+ // or bottom already)
+ processed = true;
+ wasSkipped = false;
+ }
}
if ( evType == wxEVT_ENTER_WINDOW )
m_scrollHelper->HandleOnMouseLeave((wxMouseEvent &)event);
}
#if wxUSE_MOUSEWHEEL
+ // Use GTK's own scroll wheel handling in GtkScrolledWindow
+#ifndef __WXGTK20__
else if ( evType == wxEVT_MOUSEWHEEL )
{
m_scrollHelper->HandleOnMouseWheel((wxMouseEvent &)event);
+ return true;
}
+#endif
#endif // wxUSE_MOUSEWHEEL
else if ( evType == wxEVT_CHAR )
{
m_scrollHelper->HandleOnChar((wxKeyEvent &)event);
- return !event.GetSkipped();
+ if ( !event.GetSkipped() )
+ {
+ processed = true;
+ wasSkipped = false;
+ }
}
- return false;
+ if ( processed )
+ event.Skip(wasSkipped);
+
+ return processed;
}
// ----------------------------------------------------------------------------
// flush all pending repaints before we change m_{x,y}ScrollPosition, as
// otherwise invalidated area could be updated incorrectly later when
// ScrollWindow() makes sure they're repainted before scrolling them
+#ifdef __WXMAC__
+ // wxWindowMac is taking care of making sure the update area is correctly
+ // set up, while not forcing an immediate redraw
+#else
m_targetWindow->Update();
+#endif
}
if (orient == wxHORIZONTAL)
if (orient == wxHORIZONTAL)
{
- if (m_xScrollPixelsPerLine > 0)
+ if ( m_xScrollPosition + nScrollInc < 0 )
{
- if ( m_xScrollPosition + nScrollInc < 0 )
- {
- // As -ve as we can go
- nScrollInc = -m_xScrollPosition;
- }
- else // check for the other bound
+ // As -ve as we can go
+ nScrollInc = -m_xScrollPosition;
+ }
+ else // check for the other bound
+ {
+ const int posMax = m_xScrollLines - m_xScrollLinesPerPage;
+ if ( m_xScrollPosition + nScrollInc > posMax )
{
- const int posMax = m_xScrollLines - m_xScrollLinesPerPage;
- if ( m_xScrollPosition + nScrollInc > posMax )
- {
- // As +ve as we can go
- nScrollInc = posMax - m_xScrollPosition;
- }
+ // As +ve as we can go
+ nScrollInc = posMax - m_xScrollPosition;
}
}
- else
- m_targetWindow->Refresh(true, GetScrollRect());
}
- else
+ else // wxVERTICAL
{
- if ( m_yScrollPixelsPerLine > 0 )
+ if ( m_yScrollPosition + nScrollInc < 0 )
{
- if ( m_yScrollPosition + nScrollInc < 0 )
- {
- // As -ve as we can go
- nScrollInc = -m_yScrollPosition;
- }
- else // check for the other bound
- {
- const int posMax = m_yScrollLines - m_yScrollLinesPerPage;
- if ( m_yScrollPosition + nScrollInc > posMax )
- {
- // As +ve as we can go
- nScrollInc = posMax - m_yScrollPosition;
- }
- }
+ // As -ve as we can go
+ nScrollInc = -m_yScrollPosition;
}
- else
+ else // check for the other bound
{
- // VZ: why do we do this? (FIXME)
- m_targetWindow->Refresh(true, GetScrollRect());
+ const int posMax = m_yScrollLines - m_yScrollLinesPerPage;
+ if ( m_yScrollPosition + nScrollInc > posMax )
+ {
+ // As +ve as we can go
+ nScrollInc = posMax - m_yScrollPosition;
+ }
}
}
if ( m_xScrollPosition != xScrollOld )
{
- wxScrollWinEvent event(wxEVT_SCROLLWIN_THUMBTRACK, m_xScrollPosition,
+ wxScrollWinEvent evt(wxEVT_SCROLLWIN_THUMBTRACK, m_xScrollPosition,
wxHORIZONTAL);
- event.SetEventObject(m_win);
- m_win->GetEventHandler()->ProcessEvent(event);
+ evt.SetEventObject(m_win);
+ m_win->GetEventHandler()->ProcessEvent(evt);
}
if ( m_yScrollPosition != yScrollOld )
{
- wxScrollWinEvent event(wxEVT_SCROLLWIN_THUMBTRACK, m_yScrollPosition,
+ wxScrollWinEvent evt(wxEVT_SCROLLWIN_THUMBTRACK, m_yScrollPosition,
wxVERTICAL);
- event.SetEventObject(m_win);
- m_win->GetEventHandler()->ProcessEvent(event);
+ evt.SetEventObject(m_win);
+ m_win->GetEventHandler()->ProcessEvent(evt);
}
}
wxScrollWinEvent newEvent;
newEvent.SetPosition(0);
- newEvent.SetOrientation(wxVERTICAL);
+ newEvent.SetOrientation( event.GetWheelAxis() == 0 ? wxVERTICAL : wxHORIZONTAL);
newEvent.SetEventObject(m_win);
if (event.IsPageScroll())
MacSetClipChildren( true ) ;
#endif
- bool ok = wxPanel::Create(parent, id, pos, size, style|wxHSCROLL|wxVSCROLL, name);
+ // by default, we're scrollable in both directions (but if one of the
+ // styles is specified explicitly, we shouldn't add the other one
+ // automatically)
+ if ( !(style & (wxHSCROLL | wxVSCROLL)) )
+ style |= wxHSCROLL | wxVSCROLL;
+
+ bool ok = wxPanel::Create(parent, id, pos, size, style, name);
return ok;
}