This keyword is not expanded by Git which means it's not replaced with the correct revision value in the releases made using git-based scripts and it's confusing to have lines with unexpanded "$Id$" in the released files. As expanding them with Git is not that simple (it could be done with git archive and export-subst attribute) and there are not many benefits in having them in the first place, just remove all these lines. If nothing else, this will make an eventual transition to Git simpler. Closes #14487. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@74602 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
301 lines
8.5 KiB
C++
301 lines
8.5 KiB
C++
///////////////////////////////////////////////////////////////////////////////
|
|
// Name: src/univ/scrarrow.cpp
|
|
// Purpose: wxScrollArrows class implementation
|
|
// Author: Vadim Zeitlin
|
|
// Modified by:
|
|
// Created: 22.01.01
|
|
// Copyright: (c) 2001 SciTech Software, Inc. (www.scitechsoft.com)
|
|
// Licence: wxWindows licence
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
// ============================================================================
|
|
// declarations
|
|
// ============================================================================
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// headers
|
|
// ----------------------------------------------------------------------------
|
|
|
|
#include "wx/wxprec.h"
|
|
|
|
#ifdef __BORLANDC__
|
|
#pragma hdrstop
|
|
#endif
|
|
|
|
#ifndef WX_PRECOMP
|
|
#include "wx/window.h"
|
|
#endif
|
|
|
|
#include "wx/univ/scrtimer.h"
|
|
#include "wx/univ/scrarrow.h"
|
|
|
|
#include "wx/univ/renderer.h"
|
|
#include "wx/univ/inphand.h"
|
|
#include "wx/univ/theme.h"
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// wxScrollArrowCaptureData: contains the data used while the arrow is being
|
|
// pressed by the user
|
|
// ----------------------------------------------------------------------------
|
|
|
|
struct wxScrollArrowCaptureData
|
|
{
|
|
wxScrollArrowCaptureData()
|
|
{
|
|
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)
|
|
wxScrollArrows::Arrow m_arrowPressed;
|
|
|
|
// the mouse button which started the capture (-1 if none)
|
|
int m_btnCapture;
|
|
|
|
// 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:
|
|
wxScrollArrowTimer(wxControlWithArrows *control,
|
|
wxScrollArrows::Arrow arrow)
|
|
{
|
|
m_control = control;
|
|
m_arrow = arrow;
|
|
|
|
StartAutoScroll();
|
|
}
|
|
|
|
protected:
|
|
virtual bool DoNotify()
|
|
{
|
|
return m_control->OnArrow(m_arrow);
|
|
}
|
|
|
|
wxControlWithArrows *m_control;
|
|
wxScrollArrows::Arrow m_arrow;
|
|
};
|
|
|
|
#endif // wxUSE_TIMER
|
|
|
|
// ============================================================================
|
|
// implementation of wxScrollArrows
|
|
// ============================================================================
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// con/destruction
|
|
// ----------------------------------------------------------------------------
|
|
|
|
wxScrollArrows::wxScrollArrows(wxControlWithArrows *control)
|
|
{
|
|
m_control = control;
|
|
m_captureData = NULL;
|
|
}
|
|
|
|
wxScrollArrows::~wxScrollArrows()
|
|
{
|
|
// it should have been destroyed
|
|
wxASSERT_MSG( !m_captureData, wxT("memory leak in wxScrollArrows") );
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// drawing
|
|
// ----------------------------------------------------------------------------
|
|
|
|
void wxScrollArrows::DrawArrow(Arrow arrow,
|
|
wxDC& dc,
|
|
const wxRect& rect,
|
|
bool scrollbarLike) const
|
|
{
|
|
static const wxDirection arrowDirs[2][Arrow_Max] =
|
|
{
|
|
{ wxLEFT, wxRIGHT },
|
|
{ wxUP, wxDOWN }
|
|
};
|
|
|
|
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));
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// input handling
|
|
// ----------------------------------------------------------------------------
|
|
|
|
void wxScrollArrows::UpdateCurrentFlag(Arrow arrow, Arrow arrowCur) const
|
|
{
|
|
m_control->SetArrowFlag(arrow, wxCONTROL_CURRENT, arrow == arrowCur);
|
|
}
|
|
|
|
bool wxScrollArrows::HandleMouseMove(const wxMouseEvent& event) const
|
|
{
|
|
Arrow arrow;
|
|
if ( event.Leaving() )
|
|
{
|
|
// no arrow has mouse if it left the window completely
|
|
arrow = Arrow_None;
|
|
}
|
|
else // Moving() or Entering(), treat them the same here
|
|
{
|
|
arrow = m_control->HitTestArrow(event.GetPosition());
|
|
}
|
|
|
|
#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
|
|
wxTimer *timer = m_captureData->m_timerScroll;
|
|
if ( !timer->IsRunning() )
|
|
{
|
|
// timer is paused
|
|
if ( arrow == m_captureData->m_arrowPressed )
|
|
{
|
|
// resume now
|
|
m_control->SetArrowFlag(arrow, wxCONTROL_PRESSED, true);
|
|
timer->Start();
|
|
|
|
return true;
|
|
}
|
|
}
|
|
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);
|
|
timer->Stop();
|
|
|
|
return true;
|
|
}
|
|
}
|
|
|
|
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 !event.Leaving() && arrow != Arrow_None;
|
|
}
|
|
|
|
bool wxScrollArrows::HandleMouse(const wxMouseEvent& event) const
|
|
{
|
|
int btn = event.GetButton();
|
|
if ( btn == -1 )
|
|
{
|
|
// we only care about button press/release events
|
|
return false;
|
|
}
|
|
|
|
if ( event.ButtonDown() || event.ButtonDClick() )
|
|
{
|
|
if ( !m_captureData )
|
|
{
|
|
Arrow arrow = m_control->HitTestArrow(event.GetPosition());
|
|
if ( arrow == Arrow_None )
|
|
{
|
|
// mouse pressed over something else
|
|
return false;
|
|
}
|
|
|
|
if ( m_control->GetArrowState(arrow) & wxCONTROL_DISABLED )
|
|
{
|
|
// don't allow to press disabled arrows
|
|
return true;
|
|
}
|
|
|
|
wxConstCast(this, wxScrollArrows)->m_captureData =
|
|
new wxScrollArrowCaptureData;
|
|
m_captureData->m_arrowPressed = arrow;
|
|
m_captureData->m_btnCapture = btn;
|
|
m_captureData->m_window = m_control->GetWindow();
|
|
m_captureData->m_window->CaptureMouse();
|
|
|
|
#if wxUSE_TIMER
|
|
// start scrolling
|
|
wxScrollArrowTimer *tmpTimerScroll =
|
|
new wxScrollArrowTimer(m_control, arrow);
|
|
#endif // wxUSE_TIMER
|
|
|
|
// 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
|
|
}
|
|
// release mouse if the *same* button went up
|
|
else if ( m_captureData && (btn == m_captureData->m_btnCapture) )
|
|
{
|
|
Arrow arrow = m_captureData->m_arrowPressed;
|
|
|
|
delete m_captureData;
|
|
wxConstCast(this, wxScrollArrows)->m_captureData = NULL;
|
|
|
|
m_control->SetArrowFlag(arrow, wxCONTROL_PRESSED, false);
|
|
}
|
|
else
|
|
{
|
|
// we don't process this
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|