/////////////////////////////////////////////////////////////////////////////
-// Name: timercmn.cpp
-// Purpose: Common timer implementation
-// Author: Julian Smart
-// Modified by:
+// Name: common/timercmn.cpp
+// Purpose: wxTimerBase implementation
+// Author: Julian Smart, Guillermo Rodriguez, Vadim Zeitlin
+// Modified by: VZ: extracted all non-wxTimer stuff in stopwatch.cpp (20.06.03)
// Created: 04/01/98
// RCS-ID: $Id$
-// Copyright: (c) Julian Smart and Markus Holzem
-// Licence: wxWindows license
+// Copyright: (c) Julian Smart
+// (c) 1999 Guillermo Rodriguez <guille@iies.es>
+// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
-#ifdef __GNUG__
-//#pragma implementation "timercmn.h"
-#pragma implementation
-#endif
+// ============================================================================
+// declarations
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// wxWin headers
+// ----------------------------------------------------------------------------
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
-#pragma hdrstop
+ #pragma hdrstop
#endif
+#if wxUSE_TIMER
+
#ifndef WX_PRECOMP
-#include "wx/defs.h"
-#include "wx/list.h"
+ #include "wx/app.h"
#endif
#include "wx/timer.h"
+#include "wx/apptrait.h"
+#include "wx/private/timer.h"
-#if defined(__SVR4__) && !defined(__SYSV__)
-#define __SYSV__
-#endif
+// ----------------------------------------------------------------------------
+// wxWin macros
+// ----------------------------------------------------------------------------
-#include <time.h>
+IMPLEMENT_DYNAMIC_CLASS(wxTimerEvent, wxEvent)
-#ifndef __WXMAC__
-#include <sys/types.h>
-#endif
+wxDEFINE_EVENT(wxEVT_TIMER, wxTimerEvent);
-#if (!defined(__SC__) && !defined(__SGI__) && !defined(__GNUWIN32__) && !defined(__MWERKS__)) || defined(__MINGW32__)
-#include <sys/timeb.h>
-#endif
+// ============================================================================
+// wxTimerBase implementation
+// ============================================================================
-#if defined(__linux__) || defined(__SVR4__) || defined(__SYSV__) || defined(__SGI__) || \
- defined(__ALPHA__) || defined(__GNUWIN32__) || defined(__FreeBSD__) || defined(__NetBSD__) || \
- defined(__SALFORDC__) || defined(__EMX__)
-#include <sys/time.h>
-#endif
+wxTimer::~wxTimer()
+{
+ Stop();
-#ifdef __MINGW32__
-#include "windows.h"
-#endif
+ delete m_impl;
+}
-#if defined(__SUN__) || defined(__OSF__) || defined(__FreeBSD__)
-// At least on Sun, ftime is undeclared.
-// Need to be verified on other platforms.
-extern "C" int ftime(struct timeb *tp);
-//extern "C" int gettimeofday(struct timeval *tp, void *);
-// extern "C" time_t time(time_t);
-// #include <sys/timeb.h>
-#if defined(__SVR4__) && !defined(__ALPHA__)
-// ditto for gettimeofday on Solaris 2.x.
-extern "C" int gettimeofday(struct timeval *tp, void *);
-#endif
-#endif
+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") );
-/*
- * Timer functions
- *
- */
+ }
+}
-long wxStartTime = 0;
-void wxStartTimer(void)
+// ============================================================================
+// rest of wxTimer implementation forwarded to wxTimerImpl
+// ============================================================================
+
+void wxTimer::SetOwner(wxEvtHandler *owner, int timerid)
{
-#if defined(__EMX__) || defined(__xlC__) || defined(__AIX__) || defined(__SVR4__) || defined(__SYSV__) || \
- (defined(__GNUWIN32__) && !defined(__MINGW32__)) // || defined(__AIXV3__)
- struct timeval tp;
-#if defined(__EMX__) || defined(__SYSV__) || (defined (__GNUWIN32__) && !defined (__MINGW32__))
- gettimeofday(&tp, (struct timezone *)NULL);
-#else
- gettimeofday(&tp);
-#endif
- wxStartTime = 1000*tp.tv_sec + tp.tv_usec/1000;
-#elif (defined(__SC__) || defined(__SGI__) || defined(___BSDI__) || defined(__ALPHA__) || \
- defined(__MINGW32__) || defined(__MWERKS__) || defined(__FreeBSD__) )
- time_t t0;
- struct tm *tp;
- time(&t0);
- tp = localtime(&t0);
- wxStartTime = 1000*(60*(60*tp->tm_hour+tp->tm_min)+tp->tm_sec);
-#else
- struct timeb tp;
- ftime(&tp);
- wxStartTime = 1000*tp.time + tp.millitm;
-#endif
+ wxCHECK_RET( m_impl, wxT("uninitialized timer") );
+
+ m_impl->SetOwner(owner, timerid);
}
-// Returns elapsed time in milliseconds
-long wxGetElapsedTime(bool resetTimer)
+wxEvtHandler *wxTimer::GetOwner() const
{
-#if defined(__xlC__) || defined(__AIX__) || defined(__SVR4__) || defined(__SYSV__) || \
- (defined(__GNUWIN32__) && !defined(__MINGW32__)) // || defined(__AIXV3__)
- struct timeval tp;
-#if defined(__SYSV__) || (defined (__GNUWIN32__) && !defined (__MINGW32__))
- gettimeofday(&tp, (struct timezone *)NULL);
-#else
- gettimeofday(&tp);
-#endif
- long oldTime = wxStartTime;
- long newTime = 1000*tp.tv_sec + tp.tv_usec / 1000;
- if (resetTimer)
- wxStartTime = newTime;
-#elif (defined(__SC__) || defined(__SGI__) || defined(___BSDI__) || defined(__ALPHA__) || \
- defined(__MINGW32__)|| defined(__MWERKS__) || defined(__FreeBSD__))
- time_t t0;
- struct tm *tp;
- time(&t0);
- tp = localtime(&t0);
- long oldTime = wxStartTime;
- long newTime = 1000*(60*(60*tp->tm_hour+tp->tm_min)+tp->tm_sec);
- if (resetTimer)
- wxStartTime = newTime;
-#else
- struct timeb tp;
- ftime(&tp);
- long oldTime = wxStartTime;
- long newTime = 1000*tp.time + tp.millitm;
- if (resetTimer)
- wxStartTime = newTime;
-#endif
- return newTime - oldTime;
+ wxCHECK_MSG( m_impl, NULL, wxT("uninitialized timer") );
+
+ return m_impl->GetOwner();
}
-// EXPERIMENTAL: comment this out if it doesn't compile.
-#ifndef __VMS__
-bool wxGetLocalTime(long *timeZone, int *dstObserved)
+bool wxTimer::Start(int milliseconds, bool oneShot)
{
-#if defined(__MINGW32__) && defined(__EGCS__)
- time_t t0;
- struct tm *tp;
- time(&t0);
- tp = localtime(&t0);
- *timeZone = _timezone; // tp->tm_gmtoff; // ???
- *dstObserved = tp->tm_isdst;
-#elif defined(__MINGW32__)
- time_t t0;
- struct tm *tp;
- time(&t0);
- tp = localtime(&t0);
- timeb tz;
- ftime(& tz);
- *timeZone = tz._timezone;
- *dstObserved = tp->tm_isdst;
-#else
-
-#if (((defined(__SYSV__) && !defined(__HPUX__)) || defined(__MSDOS__) || defined(__WXMSW__)) \
- && !defined(__GNUWIN32__) && !defined(__MWERKS__) )
-#if defined(__BORLANDC__)
- /* Borland uses underscores */
- *timeZone = _timezone;
- *dstObserved = _daylight;
-#elif defined(__SALFORDC__)
- *timeZone = _timezone;
- *dstObserved = daylight;
-#else
- *timeZone = timezone;
- *dstObserved = daylight;
-#endif
-#elif defined(__xlC__) || defined(__AIX__) || defined(__SVR4__) || defined(__SYSV__) || defined(__MWERKS__) || (defined(__GNUWIN32__) && !defined(__MINGW32__)) // || defined(__AIXV3__)
-#ifndef __MWERKS__ // shouldn't this be one scope below ?
- struct timeval tp;
-#endif
-#if defined(__SYSV__) || (defined(__GNUWIN32__) && !defined(__MINGW32))
- struct timezone tz;
- gettimeofday(&tp, &tz);
- *timeZone = 60*(tz.tz_minuteswest);
- *dstObserved = tz.tz_dsttime;
-#else
- time_t t0;
- struct tm *tp;
- time(&t0);
- tp = localtime(&t0);
-#ifndef __MWERKS__
- *timeZone = tp->tm_gmtoff; // ???
-#else
- *timeZone = 0 ;
-#endif
- *dstObserved = tp->tm_isdst;
-#endif
-#elif defined(__WXSTUBS__)
- return FALSE;
-#else
-// #error wxGetLocalTime not implemented.
- struct timeval tp;
- struct timezone tz;
- gettimeofday(&tp, &tz);
- *timeZone = 60*(tz.tz_minuteswest);
- *dstObserved = tz.tz_dsttime;
-#endif
-#endif
- // __MINGW32__
- return TRUE;
+ wxCHECK_MSG( m_impl, false, wxT("uninitialized timer") );
+
+ return m_impl->Start(milliseconds, oneShot);
}
-#endif
-// Get number of seconds since 00:00:00 GMT, Jan 1st 1970.
-long wxGetCurrentTime(void)
+void wxTimer::Stop()
{
-#if defined(__xlC__) || defined(__AIX__) || defined(__SVR4__) || defined(__SYSV__) // || defined(__AIXV3__)
- struct timeval tp;
-#if defined(__SYSV__) || (defined (__GNUWIN32__) && !defined (__MINGW32__) || defined(__FreeBSD__))
- gettimeofday(&tp, (struct timezone *)NULL);
-#else
- gettimeofday(&tp);
-#endif
- return tp.tv_sec;
-#else // (defined(__SC__) || defined(__SGI__) || defined(___BSDI__) || defined(__ALPHA__))
- return time(0);
-#endif
-/*
-#else
- struct timeb tp;
- ftime(&tp);
- return tp.time;
-#endif
-*/
+ 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( GetOwner(), wxT("wxTimer::Notify() should be overridden.") );
+
+ m_impl->SendEvent();
+}
+
+bool wxTimer::IsRunning() const
+{
+ wxCHECK_MSG( m_impl, false, wxT("uninitialized timer") );
+
+ return m_impl->IsRunning();
}
+int wxTimer::GetId() const
+{
+ wxCHECK_MSG( m_impl, wxID_ANY, wxT("uninitialized timer") );
+
+ return m_impl->GetId();
+}
+
+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 m_impl->IsOneShot();
+}
+
+#endif // wxUSE_TIMER
+