/*
 * Xailer source code:
 *
 * Icon.prg
 * Clase TIcon()
 *
 * Copyright 2003, 2007 Jose F. Gimenez
 * Copyright 2003, 2007 Xailer.com
 * All rights reserved
 *
 */

#include "Xailer.ch"


//--------------------------------------------------------------------------

CLASS XIcon FROM TWinObject

PUBLISHED:
   PROPERTY cName    WRITE METHOD Load
   PROPERTY nWidth   INIT 32
   PROPERTY nHeight  INIT 32

PUBLIC:
   METHOD Create( cName, nWidth, nHeight ) CONSTRUCTOR

   METHOD Load( cName ) // --> Self
   METHOD LoadFromResource( cName ) // --> Self
   METHOD LoadFromFile( cName, nIcon ) // --> Self

   METHOD Destroy() // --> Nil
   METHOD Clone() INLINE TIcon():Create( ::cName ) // --> oIcon

   METHOD Paint( hDC, nLeft, nTop, nRight, nBottom ) // --> lSuccess

ENDCLASS

//--------------------------------------------------------------------------

METHOD Create( cName, nWidth, nHeight ) CLASS XIcon

   UPDATE ::FcName   TO cName
   UPDATE ::FnWidth  TO nWidth
   UPDATE ::FnHeight TO nHeight

   IF ! Empty( ::cName )
      ::Load( ::cName )
   ENDIF

RETURN Self

//--------------------------------------------------------------------------

METHOD Load( cName ) CLASS XIcon

   UPDATE ::FcName TO cName

   IF Valtype( ::cName ) == "N" .OR. At( ".", ::cName ) == 0
      ::LoadFromResource( ::cName )
   ELSE
      ::LoadFromFile( ::cName )
   ENDIF

RETURN Self

//--------------------------------------------------------------------------

METHOD LoadFromResource( cName ) CLASS XIcon

   ::Destroy()

   UPDATE ::FcName TO cName

   IF ! Empty( ::cName )
      ::Handle := XA_LoadImage( ::cName, IMAGE_ICON, ::nWidth, ::nHeight, LR_SHARED )
   ENDIF

   IF Empty( ::Handle ) .AND. IsDebug()
      ErrorLoadResource( "icon", cName )
   ENDIF

RETURN Self

//--------------------------------------------------------------------------

METHOD LoadFromFile( cName, nIcon ) CLASS XIcon

   ::Destroy()

   UPDATE ::FcName TO cName
   DEFAULT nIcon TO 0

   IF ! Empty( ::cName )
      ::Handle := ExtractIcon( GetInstance(), ::cName, nIcon )
   ENDIF

   IF Empty( ::Handle ) .AND. IsDebug()
      ErrorLoadResource( "icon", cName + IIF( nIcon == 0, "", "(" + LTrim( Str( nIcon ) ) + ")" ) )
   ENDIF

RETURN Self

//--------------------------------------------------------------------------

METHOD Destroy() CLASS XIcon

   IF ! Empty( ::Handle )
      DestroyIcon( ::Handle )
      ::Handle := Nil
      ::FcName := Nil
   ENDIF

RETURN Nil

//--------------------------------------------------------------------------

METHOD Paint( hDC, nLeft, nTop, nRight, nBottom ) CLASS XIcon

   LOCAL lRet := .F.

   IF ! Empty(::Handle ) .AND. ! Empty( hDC )
      lRet := DrawIconEx( hDC, nLeft, nTop, ::Handle, nRight - nLeft, nBottom - nTop , 0, 0, DI_NORMAL )
   ENDIF

RETURN lRet

//--------------------------------------------------------------------------

#pragma BEGINDUMP

#include <windows.h>
#include <xailer.h>

//--------------------------------------------------------------------------

XA_FUNC( LOADICON )     // LoadIcon( [<hInstance>], <cName> ) --> hIcon
{
   hb_retnl( (LONG) LoadIcon( ( HB_ISNIL( 1 ) ? NULL : (HINSTANCE) hb_parnl( 1 ) ),
      ( HB_ISCHAR( 2 ) ? hb_parc( 2 ) : MAKEINTRESOURCE( (WORD) hb_parni( 2 ) ) ) ) );
}

//--------------------------------------------------------------------------

XA_FUNC( XA_LOADICON )     // XA_LoadIcon( <cName>, <nWidth>, <nHeight>, [ @<nBitsPerPixel> ] ) --> hIcon
{
   int nBitsPixel = 0;

   hb_retnl( (LONG) XA_LoadIcon( ( HB_ISCHAR( 1 ) ? hb_parc( 1 ) : MAKEINTRESOURCE( (WORD) hb_parni( 1 ) ) ), hb_parnl( 2 ), hb_parnl( 3 ), &nBitsPixel ) );
   hb_stornl( 4, nBitsPixel );
}

//--------------------------------------------------------------------------

XA_FUNC( EXTRACTICON )  // ExtractIcon( [<hInstance>], <cName>, <nIndex> ) --> hIcon
{
   hb_retnl( (LONG) ExtractIcon( HB_ISNIL( 1 ) ? GetModuleHandle( NULL ) : (HINSTANCE) hb_parnl( 1 ),
                                 hb_parc( 2 ), hb_parni( 3 ) ) );
}

//--------------------------------------------------------------------------

XA_FUNC( DESTROYICON )  // DestroyIcon( <hIcon> ) --> lSuccess
{
   hb_retl( DestroyIcon( (HICON) hb_parnl( 1 ) ) );
}

//--------------------------------------------------------------------------

XA_FUNC( DRAWICON )     // DrawIcon( <hDC>, <nX>, <nY>, <hIcon> ) --> lSuccess
{
   hb_retl( DrawIcon( (HDC) hb_parnl( 1 ),
                      hb_parni( 2 ), hb_parni( 3 ), (HICON) hb_parnl( 4 ) ) );
}

//--------------------------------------------------------------------------

XA_FUNC( DRAWICONEX )   // DrawIconEx( <hDC>, <nX>, <nY>, <hIcon>, <nWidth>, <nHeight>, <nFrame>, <hBrush>, <nFlags> ) --> lSuccess
{
   hb_retl( DrawIconEx( (HDC) hb_parnl( 1 ), hb_parni( 2 ), hb_parni( 3 ),
                        (HICON) hb_parnl( 4 ), hb_parni( 5 ), hb_parni( 6 ),
                        (UINT) hb_parni( 7 ), (HBRUSH) hb_parnl( 8 ),
                        (UINT) hb_parni( 9 ) ) );
}

//--------------------------------------------------------------------------

XA_FUNC( COPYICON )     // CopyIcon( <hIcon> ) --> hIcon
{
   hb_retnl( (LONG) CopyIcon( (HICON) hb_parnl( 1 ) ) );
}

//--------------------------------------------------------------------------

XA_FUNC( DUPLICATEICON )   // DuplicateIcon( , <hIcon> ) --> hIcon
{
   hb_retnl( (LONG) DuplicateIcon( NULL, (HICON) hb_parnl( 2 ) ) );
}

//--------------------------------------------------------------------------

XA_FUNC( GETICONINFO )     // GetIconInfo( <hIcon> ) --> pIconInfo
{
   ICONINFO ii;

   if ( GetIconInfo( (HANDLE) hb_parnl( 1 ), &ii ) )
      hb_retclen( (LPVOID) &ii, sizeof( ICONINFO ) );
   else
      hb_retc( "" );
}

#pragma ENDDUMP

//--------------------------------------------------------------------------
