X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8907154c1a8a6882c6797d1f16393ddfb23e7f3a..55339e8cb8aeccc3fd958dad4001d954a57a5f0d:/src/common/timercmn.cpp diff --git a/src/common/timercmn.cpp b/src/common/timercmn.cpp index 90623b23eb..8cfe29d113 100644 --- a/src/common/timercmn.cpp +++ b/src/common/timercmn.cpp @@ -28,60 +28,109 @@ #if wxUSE_TIMER #ifndef WX_PRECOMP - #include "wx/timer.h" + #include "wx/app.h" #endif +#include "wx/timer.h" +#include "wx/apptrait.h" +#include "wx/private/timer.h" + // ---------------------------------------------------------------------------- // wxWin macros // ---------------------------------------------------------------------------- -IMPLEMENT_DYNAMIC_CLASS(wxTimerEvent, wxEvent) +IMPLEMENT_ABSTRACT_CLASS(wxTimerEvent, wxEvent) // ============================================================================ // wxTimerBase implementation // ============================================================================ -wxTimerBase::~wxTimerBase() +wxTimer::~wxTimer() { - // this destructor is required for Darwin + Stop(); + + delete m_impl; } -void wxTimerBase::Notify() +void wxTimer::Init() +{ + wxAppTraits * const traits = wxTheApp ? wxTheApp->GetTraits() : NULL; + m_impl = traits ? traits->CreateTimerImpl(this) : NULL; + if ( !m_impl ) + { + wxFAIL_MSG( _T("No timer implementation for this platform") ); + + } +} + +// ============================================================================ +// rest of wxTimer implementation forwarded to wxTimerImpl +// ============================================================================ + +void wxTimer::SetOwner(wxEvtHandler *owner, int timerid) +{ + wxCHECK_RET( m_impl, _T("uninitialized timer") ); + + m_impl->SetOwner(owner, timerid); +} + +wxEvtHandler *wxTimer::GetOwner() const +{ + wxCHECK_MSG( m_impl, NULL, _T("uninitialized timer") ); + + return m_impl->GetOwner(); +} + +bool wxTimer::Start(int milliseconds, bool oneShot) +{ + wxCHECK_MSG( m_impl, false, _T("uninitialized timer") ); + + return m_impl->Start(milliseconds, oneShot); +} + +void wxTimer::Stop() +{ + wxCHECK_RET( m_impl, _T("uninitialized timer") ); + + if ( m_impl->IsRunning() ) + m_impl->Stop(); +} + +void wxTimer::Notify() { // the base class version generates an event if it has owner - which it // should because otherwise nobody can process timer events - wxCHECK_RET( m_owner, _T("wxTimer::Notify() should be overridden.") ); + wxCHECK_RET( GetOwner(), _T("wxTimer::Notify() should be overridden.") ); - wxTimerEvent event(m_idTimer, m_milli); - event.SetEventObject(this); - (void)m_owner->ProcessEvent(event); + m_impl->SendEvent(); } -bool wxTimerBase::Start(int milliseconds, bool oneShot) +bool wxTimer::IsRunning() const { - // under MSW timers only work when they're started from the main thread so - // let the caller know about it -#if wxUSE_THREADS - wxASSERT_MSG( wxThread::IsMain(), - _T("timer can only be started from the main thread") ); -#endif // wxUSE_THREADS - - if ( IsRunning() ) - { - // not stopping the already running timer might work for some - // platforms (no problems under MSW) but leads to mysterious crashes - // on the others (GTK), so to be on the safe side do it here - Stop(); - } + wxCHECK_MSG( m_impl, false, _T("uninitialized timer") ); - if ( milliseconds != -1 ) - { - m_milli = milliseconds; - } + return m_impl->IsRunning(); +} + +int wxTimer::GetId() const +{ + wxCHECK_MSG( m_impl, wxID_ANY, _T("uninitialized timer") ); + + return m_impl->GetId(); +} - m_oneShot = oneShot; +int wxTimer::GetInterval() const +{ + wxCHECK_MSG( m_impl, -1, _T("uninitialized timer") ); + + return m_impl->GetInterval(); +} + +bool wxTimer::IsOneShot() const +{ + wxCHECK_MSG( m_impl, false, _T("uninitialized timer") ); - return true; + return m_impl->IsOneShot(); } #endif // wxUSE_TIMER