X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8907154c1a8a6882c6797d1f16393ddfb23e7f3a..ec080ef1873995bcd9b20b0fc1a6d208a78540d3:/src/common/timercmn.cpp diff --git a/src/common/timercmn.cpp b/src/common/timercmn.cpp index 90623b23eb..e38a50629c 100644 --- a/src/common/timercmn.cpp +++ b/src/common/timercmn.cpp @@ -28,60 +28,111 @@ #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) +wxDEFINE_EVENT(wxEVT_TIMER, wxTimerEvent); + // ============================================================================ // wxTimerBase implementation // ============================================================================ -wxTimerBase::~wxTimerBase() +wxTimer::~wxTimer() +{ + Stop(); + + delete m_impl; +} + +void wxTimer::Init() +{ + wxAppTraits * const traits = wxTheApp ? wxTheApp->GetTraits() : NULL; + m_impl = traits ? traits->CreateTimerImpl(this) : NULL; + if ( !m_impl ) + { + wxFAIL_MSG( wxT("No timer implementation for this platform") ); + + } +} + +// ============================================================================ +// rest of wxTimer implementation forwarded to wxTimerImpl +// ============================================================================ + +void wxTimer::SetOwner(wxEvtHandler *owner, int timerid) +{ + wxCHECK_RET( m_impl, wxT("uninitialized timer") ); + + m_impl->SetOwner(owner, timerid); +} + +wxEvtHandler *wxTimer::GetOwner() const +{ + wxCHECK_MSG( m_impl, NULL, wxT("uninitialized timer") ); + + return m_impl->GetOwner(); +} + +bool wxTimer::Start(int milliseconds, bool oneShot) { - // this destructor is required for Darwin + wxCHECK_MSG( m_impl, false, wxT("uninitialized timer") ); + + return m_impl->Start(milliseconds, oneShot); } -void wxTimerBase::Notify() +void wxTimer::Stop() +{ + wxCHECK_RET( m_impl, wxT("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(), wxT("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, wxT("uninitialized timer") ); - if ( milliseconds != -1 ) - { - m_milli = milliseconds; - } + return m_impl->IsRunning(); +} + +int wxTimer::GetId() const +{ + wxCHECK_MSG( m_impl, wxID_ANY, wxT("uninitialized timer") ); + + return m_impl->GetId(); +} - m_oneShot = oneShot; +int wxTimer::GetInterval() const +{ + wxCHECK_MSG( m_impl, -1, wxT("uninitialized timer") ); + + return m_impl->GetInterval(); +} + +bool wxTimer::IsOneShot() const +{ + wxCHECK_MSG( m_impl, false, wxT("uninitialized timer") ); - return true; + return m_impl->IsOneShot(); } #endif // wxUSE_TIMER