// 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
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 )
{
return m_targetWindow;
}
-#ifdef __WXMAC__
-static bool wxScrolledWindowHasChildren(wxWindow* win)
-{
- wxWindowList::compatibility_iterator node = win->GetChildren().GetFirst();
- while ( node )
- {
- wxWindow* child = node->GetData();
- if ( !child->IsKindOf(CLASSINFO(wxScrollBar)) )
- return true;
-
- node = node->GetNext();
- }
- return false;
-}
-#endif
-
// ----------------------------------------------------------------------------
// scrolling implementation itself
// ----------------------------------------------------------------------------
}
bool needsRefresh = false;
-#ifdef __WXMAC__
- // OS X blocks on immediate redraws, so make this a refresh
- if (!wxScrolledWindowHasChildren(m_targetWindow))
- needsRefresh = true;
-#endif
int dx = 0,
dy = 0;
int orient = event.GetOrientation();
// 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);
}
}
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;
}