/*
 * Xailer source code:
 *
 * SysAnimate.prg
 * Control animacion
 *
 * Copyright 2003, 2007 Jose Lalin
 * Copyright 2003, 2007 Xailer.com
 * All rights reserved
 *
 */

#include "Xailer.ch"
#include "CommCtrl.api"


//--------------------------------------------------------------------------

CLASS XSysAnimate FROM TControl

PUBLISHED:
   PROPERTY nWidth         INIT 50
   PROPERTY nHeight        INIT 50

   PROPERTY cName          INIT "" WRITE METHOD Load  EDITOR PE_BrowseFile

   PROPERTY nCommonAvi     INIT aviNONE WRITE INLINE ::FnCommonAvi := ::LoadCommon( Value ) ;
                           VALUES   aviNONE, aviFIND, aviFINDFILES, ;
                                    aviFINDCOMPUTER, aviCOPYFILES, ;
                                    aviCOPYFILE, aviRECYCLEFILE, ;
                                    aviDELETEFILE, aviXPINTERNETSEARCH, ;
                                    aviXPDOWNLOADFILE

   PROPERTY lActive        INIT .F. WRITE INLINE ( ::FlActive := Value, IIf( ! Value, ::Stop(), ::Play() ) )

   PROPERTY lAutoPlay      INIT .F.
   PROPERTY lCentered      INIT .F.
   PROPERTY lTransparent   INIT .T.
   PROPERTY lUseTimer      INIT .F.

   PROPERTY nFirstFrame    INIT 1
   PROPERTY nLastFrame     INIT -1
   PROPERTY nRepeat        INIT -1

   EVENT OnStart( oSender ) // --> Nil
   EVENT OnStop( oSender ) // --> Nil
   EVENT OnOpen( oSender ) // --> Nil
   EVENT OnClose( oSender ) // --> Nil

PROTECTED:
   DATA cWinClassName   INIT ANIMATE_CLASS
   PROPERTY cText
   PROPERTY lParentFont
   PROPERTY oFont

PUBLIC:
   METHOD Create( cName ) CONSTRUCTOR
   METHOD Destroy()     INLINE ::Close(), ::Super:Destroy()

   METHOD Load( cName ) // --> lSuccess
   METHOD LoadFromFile( cName ) // --> lSuccess
   METHOD LoadFromResource( cName ) // --> lSuccess
   METHOD LoadCommon( nID ) // --> lSuccess

   METHOD Close() // --> lSuccess

   METHOD Play() // --> lSuccess
   METHOD Stop() // --> lSuccess
   METHOD Seek( nFrame ) // --> lSuccess

RESERVED:
   METHOD Command( nCommand )
   METHOD GetCtlColor( hDC )

ENDCLASS

//--------------------------------------------------------------------------

METHOD Create( cName ) CLASS XSysAnimate

   DEFAULT ::FcName TO cName

   InitCommonControls( ICC_ANIMATE_CLASS )

   ::ChangeCtlStyle( ACS_CENTER, ::lCentered )
   ::ChangeCtlStyle( ACS_TRANSPARENT, ::lTransparent )
   ::ChangeCtlStyle( ACS_AUTOPLAY, ::lAutoPlay )
   ::ChangeCtlStyle( ACS_TIMER, ::lUseTimer )

   ::Super:Create()

   IF ! Empty( ::cName )
      ::Load( ::cName )
   ELSE
      ::LoadCommon( ::nCommonAvi )
   ENDIF

RETURN Self

//--------------------------------------------------------------------------

METHOD Load( cName ) CLASS XSysAnimate

   LOCAL lOk := FALSE

   UPDATE ::FcName TO cName

   IF Valtype( ::cName ) == "N" .OR. At( ".", ::cName ) == 0
      lOk := ::LoadFromResource( ::cName )
   ELSE
      lOk := ::LoadFromFile( ::cName )
   ENDIF

RETURN lOK

//--------------------------------------------------------------------------

METHOD GetCtlColor( hDC ) CLASS XSysAnimate

   SetBkColor( hDC, ::oParent:nClrPane )
   SetTextColor( hDC, ::oParent:nClrText )

RETURN ::oParent:oBrush:Handle

//--------------------------------------------------------------------------

#pragma BEGINDUMP

#include <windows.h>
#include <commctrl.h>
#include <xailer.h>

//--------------------------------------------------------------------------

HB_FUNC_STATIC( XSYSANIMATE_LOADFROMFILE )
{
   PHB_ITEM Self = hb_stackSelfItem();
   HWND hwnd = GetHandleOf( Self );

   XA_ObjSend( Self, "OnOpen" );
   hb_retl( Animate_Open( hwnd, hb_parc( 1 ) ) );
}

//--------------------------------------------------------------------------

HB_FUNC_STATIC( XSYSANIMATE_LOADFROMRESOURCE )
{
   PHB_ITEM Self = hb_stackSelfItem();
   HWND hwnd = GetHandleOf( Self );
   BOOL lOk;
   HINSTANCE hInstance;
   int n = XA_ResourceSearchOrder( 0 ) - 1;

   XA_ObjSend( Self, "OnOpen" );
   while( ( hInstance = GetInstance( n++ ) ) != NULL )
      if( ( lOk = Animate_OpenEx( hwnd, hInstance, hb_parc( 1 ) ) ) != 0 )
         break;

   hb_retl( lOk );
}

//--------------------------------------------------------------------------

HB_FUNC_STATIC( XSYSANIMATE_LOADCOMMON )
{
   PHB_ITEM Self = hb_stackSelfItem();
   HWND hwnd = GetHandleOf( Self );
   INT iAnim = hb_parnl( 1 );

   if( iAnim )
   {
      XA_ObjSend( Self, "OnOpen" );
      Animate_OpenEx( hwnd, GetModuleHandle( "Shell32.dll" ), MAKEINTRESOURCE( iAnim ) );
   }
   else
   {
      Animate_Close( hwnd );
      InvalidateRect( hwnd, NULL, TRUE );
   }

   hb_retnl( iAnim );
}

//--------------------------------------------------------------------------

HB_FUNC_STATIC( XSYSANIMATE_CLOSE )
{
   PHB_ITEM Self = hb_stackSelfItem();
   HWND hwnd = GetHandleOf( Self );

   XA_ObjSend( Self, "OnClose" );
   XA_ObjSendL( Self, "_FlActive", FALSE );
   hb_retl( Animate_Close( hwnd ) );
}

//--------------------------------------------------------------------------

HB_FUNC_STATIC( XSYSANIMATE_PLAY )
{
   PHB_ITEM Self = hb_stackSelfItem();
   HWND hwnd = GetHandleOf( Self );
   BOOL bSuccess;

   bSuccess = Animate_Play( hwnd, XA_ObjGetNL( Self, "nFirstFrame" ),
                                  XA_ObjGetNL( Self, "nLastFrame" ),
                                  XA_ObjGetNL( Self, "nRepeat" ) );

   XA_ObjSendL( Self, "_FlActive", bSuccess );
   hb_retl( bSuccess );
}

//--------------------------------------------------------------------------

HB_FUNC_STATIC( XSYSANIMATE_STOP )
{
   PHB_ITEM Self = hb_stackSelfItem();
   HWND hwnd = GetHandleOf( Self );
   BOOL bSuccess;

   bSuccess = Animate_Stop( hwnd );
   XA_ObjSendL( Self, "_FlActive", FALSE );
   hb_retl( bSuccess );
}

//--------------------------------------------------------------------------

HB_FUNC_STATIC( XSYSANIMATE_SEEK )  // nFrame
{
   PHB_ITEM Self = hb_stackSelfItem();
   HWND hwnd = GetHandleOf( Self );
   UINT uiFrame = HB_ISNUM( 1 ) ? hb_parnl( 1 ) : XA_ObjGetNL( Self, "nFirstFrame" );

   hb_retl( Animate_Seek( hwnd, uiFrame - 1 ) );
}

//--------------------------------------------------------------------------

HB_FUNC_STATIC( XSYSANIMATE_COMMAND )
{
   PHB_ITEM Self = hb_stackSelfItem();
   WPARAM wAction = hb_parnl( 1 );

   switch( wAction )
   {
      case ACN_START:
         {
            XA_ObjSend( Self, "OnStart" );
            hb_retl( TRUE );
         }
         break;
      case ACN_STOP:
         {
            XA_ObjSend( Self, "OnStop" );
            hb_retl( TRUE );
         }
         break;
   }

   hb_retl( FALSE );
}

#pragma ENDDUMP

//--------------------------------------------------------------------------
