// headers
// ----------------------------------------------------------------------------
-#ifdef __GNUG__
- #pragma implementation "univscrarrow.h"
-#endif
-
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#endif
#ifndef WX_PRECOMP
+ #include "wx/window.h"
#endif
#include "wx/univ/scrtimer.h"
m_arrowPressed = wxScrollArrows::Arrow_None;
m_window = NULL;
m_btnCapture = -1;
+#if wxUSE_TIMER
m_timerScroll = NULL;
+#endif // wxUSE_TIMER
}
~wxScrollArrowCaptureData()
if ( m_window )
m_window->ReleaseMouse();
+#if wxUSE_TIMER
delete m_timerScroll;
+#endif // wxUSE_TIMER
}
// the arrow being held pressed (may be Arrow_None)
// the window which has captured the mouse
wxWindow *m_window;
+#if wxUSE_TIMER
// the timer for generating the scroll events
wxScrollTimer *m_timerScroll;
+#endif
};
// ----------------------------------------------------------------------------
// wxScrollArrowTimer: a wxScrollTimer which calls OnArrow()
// ----------------------------------------------------------------------------
+#if wxUSE_TIMER
+
class wxScrollArrowTimer : public wxScrollTimer
{
public:
wxScrollArrows::Arrow m_arrow;
};
+#endif // wxUSE_TIMER
+
// ============================================================================
// implementation of wxScrollArrows
// ============================================================================
wxScrollArrows::~wxScrollArrows()
{
// it should have been destroyed
- wxASSERT_MSG( !m_captureData, _T("memory leak in wxScrollArrows") );
+ wxASSERT_MSG( !m_captureData, wxT("memory leak in wxScrollArrows") );
}
// ----------------------------------------------------------------------------
{ wxUP, wxDOWN }
};
- void (wxRenderer::*pfn)(wxDC&, wxDirection, const wxRect&, int) =
- scrollbarLike ? &wxRenderer::DrawScrollbarArrow
- : &wxRenderer::DrawArrow;
-
- (m_control->GetRenderer()->*pfn)
- (
- dc,
- arrowDirs[m_control->IsVertical()][arrow],
- rect,
- m_control->GetArrowState(arrow)
- );
+ if ( scrollbarLike )
+ m_control->GetRenderer()->DrawScrollbarArrow(
+ dc,
+ arrowDirs[m_control->IsVertical()][arrow],
+ rect,
+ m_control->GetArrowState(arrow));
+ else
+ m_control->GetRenderer()->DrawArrow(
+ dc,
+ arrowDirs[m_control->IsVertical()][arrow],
+ rect,
+ m_control->GetArrowState(arrow));
}
// ----------------------------------------------------------------------------
}
else // Moving() or Entering(), treat them the same here
{
- arrow = m_control->HitTest(event.GetPosition());
+ arrow = m_control->HitTestArrow(event.GetPosition());
}
- if ( m_captureData )
+#if wxUSE_TIMER
+ if ( m_captureData && m_captureData->m_timerScroll)
{
// the mouse is captured, we may want to pause scrolling if it goes
// outside the arrow or to resume it if we had paused it before
if ( arrow == m_captureData->m_arrowPressed )
{
// resume now
- m_control->SetArrowFlag(arrow, wxCONTROL_PRESSED, TRUE);
+ m_control->SetArrowFlag(arrow, wxCONTROL_PRESSED, true);
timer->Start();
- return TRUE;
+ return true;
}
}
- else if ( 1 ) //FIXME: m_control->ShouldPauseScrolling() )
+ else // if ( 1 ) FIXME: m_control->ShouldPauseScrolling() )
{
// we may want to stop it
if ( arrow != m_captureData->m_arrowPressed )
{
// stop as the mouse left the arrow
m_control->SetArrowFlag(m_captureData->m_arrowPressed,
- wxCONTROL_PRESSED, FALSE);
+ wxCONTROL_PRESSED, false);
timer->Stop();
- return TRUE;
+ return true;
}
}
- return FALSE;
+ return false;
}
+#endif // wxUSE_TIMER
// reset the wxCONTROL_CURRENT flag for the arrows which don't have the
// mouse and set it for the one which has
UpdateCurrentFlag(Arrow_First, arrow);
UpdateCurrentFlag(Arrow_Second, arrow);
- // return TRUE if it was really an event for an arrow
+ // return true if it was really an event for an arrow
return !event.Leaving() && arrow != Arrow_None;
}
if ( btn == -1 )
{
// we only care about button press/release events
- return FALSE;
+ return false;
}
if ( event.ButtonDown() || event.ButtonDClick() )
{
if ( !m_captureData )
{
- Arrow arrow = m_control->HitTest(event.GetPosition());
+ Arrow arrow = m_control->HitTestArrow(event.GetPosition());
if ( arrow == Arrow_None )
{
// mouse pressed over something else
- return FALSE;
+ return false;
}
if ( m_control->GetArrowState(arrow) & wxCONTROL_DISABLED )
{
// don't allow to press disabled arrows
- return TRUE;
+ return true;
}
wxConstCast(this, wxScrollArrows)->m_captureData =
m_captureData->m_window = m_control->GetWindow();
m_captureData->m_window->CaptureMouse();
+#if wxUSE_TIMER
// start scrolling
- m_captureData->m_timerScroll =
+ wxScrollArrowTimer *tmpTimerScroll =
new wxScrollArrowTimer(m_control, arrow);
+#endif // wxUSE_TIMER
- m_control->SetArrowFlag(arrow, wxCONTROL_PRESSED, TRUE);
+ // Because in some cases wxScrollArrowTimer can cause
+ // m_captureData to be destructed we need to test if it
+ // is still valid before using.
+ if (m_captureData)
+ {
+#if wxUSE_TIMER
+ m_captureData->m_timerScroll = tmpTimerScroll;
+#endif // wxUSE_TIMER
+
+ m_control->SetArrowFlag(arrow, wxCONTROL_PRESSED, true);
+ }
+ else
+ {
+#if wxUSE_TIMER
+ delete tmpTimerScroll;
+#endif // wxUSE_TIMER
+ }
}
//else: mouse already captured, nothing to do
}
delete m_captureData;
wxConstCast(this, wxScrollArrows)->m_captureData = NULL;
- m_control->SetArrowFlag(arrow, wxCONTROL_PRESSED, FALSE);
+ m_control->SetArrowFlag(arrow, wxCONTROL_PRESSED, false);
}
else
{
// we don't process this
- return FALSE;
+ return false;
}
- return TRUE;
+ return true;
}
-