/*
 * Xailer source code:
 *
 * Cursor.prg
 * Clase TCursor()
 *
 * Copyright 2003, 2007 Jose F. Gimenez
 * Copyright 2003, 2007 Xailer.com
 * All rights reserved
 *
 */

#include "Xailer.ch"


//--------------------------------------------------------------------------

CLASS XCursor FROM TWinObject

PUBLISHED:
   PROPERTY cName    WRITE METHOD Create

PUBLIC:
   METHOD New( cName ) CONSTRUCTOR
   METHOD Create( cName ) CONSTRUCTOR

   METHOD Load( cName ) // --> Self
   METHOD LoadFromResource( cName ) // --> Self
   METHOD LoadFromFile( cName ) // --> Self

   METHOD Destroy() // --> Nil
   METHOD Clone() INLINE TCursor():Create( ::cName ) // --> oCursor

ENDCLASS

//--------------------------------------------------------------------------

METHOD New( cName ) CLASS XCursor
RETURN ::Load( cName )

//--------------------------------------------------------------------------

METHOD Create( cName ) CLASS XCursor
RETURN ::Load( cName )

//--------------------------------------------------------------------------

METHOD Load( cName ) CLASS XCursor

   UPDATE ::FcName TO cName

   ::Destroy()
   IF ! Empty( ::cName )
      IF ValType( ::cName ) == "N" .OR. At( ".", ::cName ) == 0
         ::LoadFromResource( ::cName )
      ELSEIF ! Empty( ::cName )
         ::LoadFromFile( ::cName )
      ENDIF
   ENDIF

RETURN Self

//--------------------------------------------------------------------------

METHOD LoadFromResource( cName ) CLASS XCursor

   ::Destroy()

   UPDATE ::FcName TO cName

   IF ! Empty( ::cName )
      ::Handle := XA_LoadCursor( ::cName )
   ENDIF

   IF Empty( ::Handle ) .AND. IsDebug()
      ErrorLoadResource( "cursor", cName )
   ENDIF

RETURN Self

//--------------------------------------------------------------------------

METHOD LoadFromFile( cName ) CLASS XCursor

   ::Destroy()
   DEFAULT ::FcName TO cName
   IF ! Empty( ::cName )
      ::Handle := LoadCursorFromFile( ::cName )
   ENDIF

   IF Empty( ::Handle ) .AND. IsDebug()
      ErrorLoadResource( "cursor", cName )
   ENDIF

RETURN Self

//--------------------------------------------------------------------------

METHOD Destroy() CLASS XCursor

   IF ! Empty( ::Handle )
      DestroyCursor( ::Handle )
      ::Handle := 0
      ::FcName := Nil
   ENDIF

RETURN Nil

//--------------------------------------------------------------------------

#pragma BEGINDUMP

#include <windows.h>
#include <xailer.h>

static HCURSOR hCursorArrow = NULL;
static HCURSOR hCursorWait = NULL;
static HCURSOR hCursorHand = NULL;
static HCURSOR hCursorNS = NULL;
static HCURSOR hCursorWE = NULL;
static HCURSOR hCursorDragYes = NULL;
static HCURSOR hCursorDragNo = NULL;

//--------------------------------------------------------------------------

XA_EXPORT void CursorArrow()  // CursorArrow() --> void
{
   if( hCursorArrow == NULL )
      hCursorArrow = LoadCursor( NULL, IDC_ARROW );
   SetCursor( hCursorArrow );
}

//--------------------------------------------------------------------------

XA_EXPORT void CursorWait()   // CursorWait() --> void
{
   if( hCursorWait == NULL )
      hCursorWait = LoadCursor( NULL, IDC_WAIT );
   SetCursor( hCursorWait );
}

//--------------------------------------------------------------------------

XA_EXPORT void CursorHand()   // CursorHand() --> void
{
   if( hCursorHand == NULL )
      hCursorHand = LoadCursor( NULL, IDC_HAND );
   SetCursor( hCursorHand );
}

//--------------------------------------------------------------------------

XA_EXPORT void CursorNS()  // // CursorNS() --> void
{
   if( hCursorNS == NULL )
      hCursorNS = LoadCursor( NULL, IDC_SIZENS );
   SetCursor( hCursorNS );
}

//--------------------------------------------------------------------------

XA_EXPORT void CursorWE()  // CursorWE() --> void
{
   if( hCursorWE == NULL )
      hCursorWE = LoadCursor( NULL, IDC_SIZEWE );
   SetCursor( hCursorWE );
}

//--------------------------------------------------------------------------

XA_EXPORT void CursorDragYes()   // CursorDragYes() --> void
{
   if( hCursorDragYes == NULL )
      hCursorDragYes = XA_LoadCursor( "XA_CUR_DRAG" );
   SetCursor( hCursorDragYes );
}

//--------------------------------------------------------------------------

XA_EXPORT void CursorDragNo() // CursorDragNo() --> void
{
   if( hCursorDragNo == NULL )
      hCursorDragNo = LoadCursor( NULL, IDC_NO );
   SetCursor( hCursorDragNo );
}

//--------------------------------------------------------------------------

XA_FUNC( LOADCURSOR )   // LoadCursor( [<hInstance>], <cCursor> | <nCursor> ) --> hCursor
{
   hb_retnl( (LONG) LoadCursor( HB_ISNIL( 1 ) ? NULL : (HINSTANCE) hb_parnl( 1 ),
                    HB_ISCHAR( 2 ) ? hb_parc( 2 ) : MAKEINTRESOURCE( hb_parnl( 2 ) ) ) );
}

//--------------------------------------------------------------------------

XA_FUNC( LOADCURSORFROMFILE ) // LoadCursorFromFile( <cFilename> ) --> hCursor
{
   hb_retnl( (LONG) LoadCursorFromFile( hb_parc( 1 ) ) );
}

//--------------------------------------------------------------------------

XA_FUNC( DESTROYCURSOR )   // DestroyCursor( <hCursor> ) --> lSuccess
{
   hb_retl( DestroyCursor( (HCURSOR) hb_parnl( 1 ) ) );
}

//--------------------------------------------------------------------------

XA_FUNC( CURSORARROW )  // CursorArrow() --> n/a
{
   CursorArrow();
}

//---------------------------------------------------------------------------//

XA_FUNC( CURSORWAIT )   // CursorWait() --> n/a
{
   CursorWait();
}

//---------------------------------------------------------------------------//

XA_FUNC( CURSORHAND )   // CursorHand() --> n/a
{
   CursorHand();
}

//---------------------------------------------------------------------------//

XA_FUNC( CURSORNS )     // CursorNS() --> n/a
{
   CursorNS();
}

//--------------------------------------------------------------------------

XA_FUNC( CURSORWE )     // CursorWE() --> n/a
{
   CursorWE();
}

//--------------------------------------------------------------------------

XA_FUNC( SHOWCURSOR )   // ShowCursor( <lShow> ) --> nCursor
{
   hb_retni( ShowCursor( hb_parl( 1 ) ) );
}

//--------------------------------------------------------------------------

XA_FUNC( SETCURSOR )    // SetCursor( <hCursor> ) --> hOldCursor
{
   hb_retnl( (LONG) SetCursor( (HCURSOR) hb_parnl( 1 ) ) );
}

//--------------------------------------------------------------------------

XA_FUNC( GETCURSORPOS ) // GetCursorPos( @nX, @nY ) --> aPoint
{
   POINT pt;

   GetCursorPos( &pt );

   if( hb_pcount() == 2 )
      {
      hb_storni( pt.x, 1 );
      hb_storni( pt.y, 2 );
      }
   hb_reta( 2 );
   hb_storvni( pt.x, -1, 1 );
   hb_storvni( pt.y, -1, 2 );
}

//--------------------------------------------------------------------------

XA_FUNC( SETCURSORPOS )    // SetCursorPos( <nX>, <nY> ) --> lSuccess
{
   hb_retl( SetCursorPos( hb_parni( 1 ), hb_parni( 2 ) ) );
}

//-----------------------------------------------------------------------------

XA_FUNC( GETCURSOR )       // GetCursor() --> hCursor
{
   hb_retnl( (LONG) GetCursor() );
}

//-----------------------------------------------------------------------------

XA_FUNC( COPYCURSOR )      // CopyCursor( <hCursor> ) --> hCursor
{
   hb_retnl( (LONG) CopyCursor( (HCURSOR) hb_parnl( 1 ) ) );
}

//-----------------------------------------------------------------------------

XA_FUNC( SETSYSTEMCURSOR ) // SetSystemCursor( <hCursor>, <nId> ) --> lSuccess
{
   hb_retl( SetSystemCursor( (HCURSOR) hb_parnl( 1 ), (DWORD) hb_parnl( 2 ) ) );
}

#pragma ENDDUMP

//--------------------------------------------------------------------------
