/*
 * Xailer source code:
 *
 * Timer.prg
 * Clase TTimer()
 *
 * Copyright 2003, 2007 Jose F. Gimenez
 * Copyright 2003, 2007 Xailer.com
 * All rights reserved
 *
 */

#include "Xailer.ch"


//--------------------------------------------------------------------------

CLASS XTimer FROM TWinObject

PUBLISHED:
   PROPERTY nInterval   INIT 1000 WRITE METHOD SetInterval
   PROPERTY lEnabled    INIT .F.  WRITE INLINE ::FlEnabled := Value, ::SetInterval()

   EVENT OnTimer( oSender )

PUBLIC:
   PROPERTY oParent

   METHOD New( oParent ) CONSTRUCTOR
   METHOD Create( oParent, nInterval, bOnTimer ) CONSTRUCTOR

   METHOD SetInterval( nInterval )  // --> Self
   METHOD Enable()  INLINE ::lEnabled := .T. // --> Nil
   METHOD Disable() INLINE ::lEnabled := .F. // --> Nil
   METHOD Stop()    INLINE KillTimer( ::Handle, 1 ) // --> lSuccess

RESERVED:
   METHOD Link()    EXTERN WndLink()
   METHOD Unlink()  EXTERN WndUnlink()
   METHOD Free()    INLINE ::Stop(), ::Unlink(), DestroyWindow( ::Handle ), ::Super:Free()
   METHOD Destroy( lFree ) INLINE iif( ::oParent != NIL, ::oParent:RemoveComponent( Self ), ), ::Super:Destroy( lFree )

   METHOD WMTimer() INLINE IIf( ::lEnabled, ::OnTimer(), ), 0

ENDCLASS

//--------------------------------------------------------------------------

METHOD New( oParent ) CLASS XTimer

   ::oParent := oParent

RETURN Self

//--------------------------------------------------------------------------

METHOD Create( oParent, nInterval, bOnTimer ) CLASS XTimer

   UPDATE ::oParent   TO oParent
   UPDATE ::nInterval TO nInterval
   UPDATE ::OnTimer   TO bOnTimer

   IF ! GetClassInfo( ::ClassName )
      RegisterClass( ::ClassName )
   ENDIF
   IF ( ::Handle := CreateWindow( ::ClassName, "",,,,,,, -3 ) ) != 0
      ::Link()
   ENDIF

   IF ::oParent != Nil
      ::oParent:InsertComponent( Self )
   ENDIF

   ::SetInterval( ::nInterval )

RETURN Self

//--------------------------------------------------------------------------

METHOD SetInterval( nInterval ) CLASS XTimer

   UPDATE ::FnInterval TO nInterval

   ::Stop()
   IF ::FlEnabled .AND. ! Empty( ::FnInterval ) .AND. ::EventAssigned( "OnTimer" )
      SetTimer( ::Handle, 1, ::FnInterval )
   ENDIF

RETURN Self

//--------------------------------------------------------------------------

#pragma BEGINDUMP

#include <windows.h>
#include <xailer.h>

//--------------------------------------------------------------------------

XA_FUNC( SETTIMER )  // SetTimer( <hWnd>, <nId>, <nMilliseconds> ) --> hTimer
{
   hb_retnl( SetTimer( (HWND) hb_parnl( 1 ), hb_parnl( 2 ), hb_parnl( 3 ), NULL ) );
}

//--------------------------------------------------------------------------

XA_FUNC( KILLTIMER ) // KillTimer( <hWnd>, <hTimer> ) --> lSuccess
{
   hb_retl( KillTimer( (HWND) hb_parnl( 1 ), hb_parnl( 2 ) ) );
}

//--------------------------------------------------------------------------

XA_FUNC( QUERYPERFORMANCECOUNTER )  // QueryPerformanceCounter() --> nCounter
{
   __int64 liCount;

   if( QueryPerformanceCounter( (LARGE_INTEGER *) &liCount ) )
      hb_retnll( liCount );
   else
      hb_retnl( 0 );
}

//--------------------------------------------------------------------------

XA_FUNC( QUERYPERFORMANCEFREQUENCY )   // QueryPerformanceFrequency() --> nFrequency
{
   __int64 liFreq;

   if( QueryPerformanceFrequency( (LARGE_INTEGER *) &liFreq ) )
      hb_retnll( liFreq );
   else
      hb_retnl( 0 );
}

//--------------------------------------------------------------------------

XA_FUNC( SLEEP )  // Sleep( <nMilliseconds> ) --> n/a
{
   Sleep( (DWORD) hb_parnl( 1 ) );
}

//-----------------------------------------------------------------------------

XA_FUNC( GETTICKCOUNT ) // GetTickCount() --> nTicks
{
   hb_retnl( GetTickCount() );
}

#pragma ENDDUMP

//--------------------------------------------------------------------------
