}
// ----------------------------------------------------------------------------
-// target window handling
+// [target] window handling
// ----------------------------------------------------------------------------
void wxScrollHelper::DeleteEvtHandler()
{
- // FIXME: we should search for m_handler in the handler list
- if ( m_targetWindow )
+ // search for m_handler in the handler list
+ if ( m_win && m_handler )
{
- m_targetWindow->PopEventHandler(TRUE /* Delete old event handler*/);
+ wxEvtHandler *handlerPrev = NULL,
+ *handler = m_win->GetEventHandler();
+ while ( handler )
+ {
+ if ( handler == m_handler )
+ {
+ wxEvtHandler *handlerNext = handler->GetNextHandler();
+ if ( handlerPrev )
+ {
+ handlerPrev->SetNextHandler(handlerNext);
+ }
+ else
+ {
+ m_win->SetEventHandler(handlerNext);
+ }
+
+ handler->SetNextHandler(NULL);
+ delete handler;
+ m_handler = NULL;
+
+ return;
+ }
+
+ handlerPrev = handler;
+ handler = handler->GetNextHandler();
+ }
+
+ wxFAIL_MSG( _T("where has our event handler gone?") );
}
}
m_win = win;
- DoSetTargetWindow(win, TRUE);
+ // by default, the associated window is also the target window
+ DoSetTargetWindow(win);
}
-void wxScrollHelper::DoSetTargetWindow(wxWindow *target, bool pushEventHandler)
+void wxScrollHelper::DoSetTargetWindow(wxWindow *target)
{
m_targetWindow = target;
// install the event handler which will intercept the events we're
- // interested in
- if (pushEventHandler)
+ // interested in (but only do it for our real window, not the target window
+ // which we scroll - we don't need to hijack its events)
+ if ( m_targetWindow == m_win )
{
+ // if we already have a handler, delete it first
+ DeleteEvtHandler();
+
m_handler = new wxScrollHelperEvtHandler(this);
m_targetWindow->PushEventHandler(m_handler);
}
}
-void wxScrollHelper::SetTargetWindow( wxWindow *target, bool pushEventHandler )
+void wxScrollHelper::SetTargetWindow(wxWindow *target)
{
wxCHECK_RET( target, wxT("target window must not be NULL") );
if ( target == m_targetWindow )
return;
- if (pushEventHandler)
- DeleteEvtHandler();
-
- DoSetTargetWindow(target, pushEventHandler);
+ DoSetTargetWindow(target);
}
wxWindow *wxScrollHelper::GetTargetWindow() const
if (orient == wxHORIZONTAL)
{
m_xScrollPosition += nScrollInc;
- m_targetWindow->SetScrollPos(wxHORIZONTAL, m_xScrollPosition);
+ m_win->SetScrollPos(wxHORIZONTAL, m_xScrollPosition);
}
else
{
m_yScrollPosition += nScrollInc;
- m_targetWindow->SetScrollPos(wxVERTICAL, m_yScrollPosition);
+ m_win->SetScrollPos(wxVERTICAL, m_yScrollPosition);
}
bool needsRefresh = FALSE;
m_xScrollPosition = wxMin( m_xScrollLines-noPagePositions, m_xScrollPosition);
m_xScrollPosition = wxMax( 0, m_xScrollPosition );
- m_targetWindow->SetScrollbar(wxHORIZONTAL, m_xScrollPosition, noPagePositions, m_xScrollLines);
+ m_win->SetScrollbar(wxHORIZONTAL, m_xScrollPosition, noPagePositions, m_xScrollLines);
// The amount by which we scroll when paging
SetScrollPageSize(wxHORIZONTAL, noPagePositions);
}
else
{
m_xScrollPosition = 0;
- m_targetWindow->SetScrollbar (wxHORIZONTAL, 0, 0, 0, FALSE);
+ m_win->SetScrollbar (wxHORIZONTAL, 0, 0, 0, FALSE);
}
if (m_yScrollLines > 0)
m_yScrollPosition = wxMin( m_yScrollLines-noPagePositions, m_yScrollPosition );
m_yScrollPosition = wxMax( 0, m_yScrollPosition );
- m_targetWindow->SetScrollbar(wxVERTICAL, m_yScrollPosition, noPagePositions, m_yScrollLines);
+ m_win->SetScrollbar(wxVERTICAL, m_yScrollPosition, noPagePositions, m_yScrollLines);
// The amount by which we scroll when paging
SetScrollPageSize(wxVERTICAL, noPagePositions);
}
else
{
m_yScrollPosition = 0;
- m_targetWindow->SetScrollbar (wxVERTICAL, 0, 0, 0, FALSE);
+ m_win->SetScrollbar (wxVERTICAL, 0, 0, 0, FALSE);
}
if (oldXScroll != m_xScrollPosition)
m_xScrollPosition = wxMax( 0, m_xScrollPosition );
if (old_x != m_xScrollPosition) {
- m_targetWindow->SetScrollPos( wxHORIZONTAL, m_xScrollPosition );
+ m_win->SetScrollPos( wxHORIZONTAL, m_xScrollPosition );
m_targetWindow->ScrollWindow( (old_x-m_xScrollPosition)*m_xScrollPixelsPerLine, 0,
GetRect() );
}
m_yScrollPosition = wxMax( 0, m_yScrollPosition );
if (old_y != m_yScrollPosition) {
- m_targetWindow->SetScrollPos( wxVERTICAL, m_yScrollPosition );
+ m_win->SetScrollPos( wxVERTICAL, m_yScrollPosition );
m_targetWindow->ScrollWindow( 0, (old_y-m_yScrollPosition)*m_yScrollPixelsPerLine,
GetRect() );
}
void wxScrollHelper::HandleOnSize(wxSizeEvent& WXUNUSED(event))
{
#if wxUSE_CONSTRAINTS
- if ( m_targetWindow->GetAutoLayout() )
- m_targetWindow->Layout();
+ if ( m_win->GetAutoLayout() )
+ m_win->Layout();
#endif
AdjustScrollbars();
// scroll position
void wxScrollHelper::HandleOnPaint(wxPaintEvent& WXUNUSED(event))
{
- wxPaintDC dc(m_targetWindow);
+ // don't use m_targetWindow here, this is always called for ourselves
+ wxPaintDC dc(m_win);
DoPrepareDC(dc);
OnDraw(dc);