/*
 * Xailer source code:
 *
 * Pen.prg
 * Clase TPen()
 *
 * Copyright 2003, 2007 Ignacio Ortiz de Zuņiga
 * Copyright 2003, 2007 Xailer.com
 * All rights reserved
 *
 */

#include "Xailer.ch"


//--------------------------------------------------------------------------

CLASS XPen FROM TWinObject

PUBLIC:
   DATA oDevice READONLY

PUBLISHED:
   PROPERTY nStyle  INIT PS_SOLID   WRITE INLINE ::FnStyle := Value, ::ReCreate()
   PROPERTY nColor  INIT clBlack    WRITE INLINE ::FnColor := Value, ::ReCreate()
   PROPERTY nWidth  INIT 1          WRITE INLINE ::FnWidth := Value, ::ReCreate()

PROTECTED:
   METHOD ReCreate() INLINE IIf( ! Empty( ::Handle ), ::Create(), )

PUBLIC:
   METHOD New( nStyle, nWidth, nColor, oDevice ) CONSTRUCTOR
   METHOD Create( nStyle, nWidth, nColor, oDevice ) CONSTRUCTOR
   METHOD Destroy() // --> Nil
   METHOD Clone( oDevice ) // --> oPen

ENDCLASS

//--------------------------------------------------------------------------

METHOD New( nStyle, nWidth, nColor, oDevice ) CLASS XPen
RETURN ::Create( nStyle, nWidth, nColor, oDevice )

//--------------------------------------------------------------------------

METHOD Create( nStyle, nWidth, nColor, oDevice ) CLASS XPen

   UPDATE ::FnStyle  TO nStyle
   UPDATE ::FnWidth  TO nWidth
   UPDATE ::FnColor  TO nColor
   UPDATE ::oDevice  TO oDevice

   ::Destroy()

   IF ::oDevice != Nil
      nWidth := ::oDevice:Resolution()[ 1 ] * ::FnWidth / Screen:nPixelsPerInch
   ELSE
      nWidth := ::FnWidth
   ENDIF

   ::Handle := CreatePen( ::FnStyle, nWidth, ::FnColor )

RETURN Self

//--------------------------------------------------------------------------

METHOD Destroy() CLASS XPen

   IF ! Empty( ::Handle )
      DeleteObject( ::Handle )
      ::Handle := Nil
   ENDIF

RETURN Nil

//--------------------------------------------------------------------------

METHOD Clone( oDevice ) CLASS XPen

   LOCAL oPen

   IF oDevice != Nil
      oPen :=  TPen():Create( ::nStyle, ::nWidth, ::nColor, oDevice )
   ELSE
      oPen :=  TPen():Create( ::nStyle, ::nWidth, ::nColor, ::oDevice )
   ENDIF

RETURN oPen

//--------------------------------------------------------------------------

#pragma BEGINDUMP

#include <windows.h>
#include <xailer.h>

//--------------------------------------------------------------------------

XA_FUNC( CREATEPEN ) // CreatePen( <nStyle>, <nWidth>, <nColor> ) --> hPen
{
   hb_retnl( (LONG) CreatePen( hb_parni( 1 ), hb_parni( 2 ), (COLORREF) hb_parnl( 3 ) ) );
}

//--------------------------------------------------------------------------

XA_FUNC( CREATEPENINDIRECT )  // CreatePenIndirect( <nStyle>, <nWidth>, <nColor> ) --> hPen
{
   LOGPEN logpen;

   logpen.lopnStyle = hb_parnl( 1 );
   logpen.lopnWidth.x = hb_parnl( 2 );
   //logpen.lopnWidth.y = hb_parnl( 3 ); Segun la MSDN se ignora [jlalin]
   logpen.lopnColor = (COLORREF) hb_parnl( 3 );

   hb_retnl( (LONG) CreatePenIndirect( &logpen ) );
}

//--------------------------------------------------------------------------

XA_FUNC( SETBLACKPEN )  // SetBlackPen( <hDC> ) --> nOldPen
{
   hb_retnl( (LONG) SelectObject( (HDC) hb_parnl( 1 ),
                                  GetStockObject( BLACK_PEN ) ) );
}

//--------------------------------------------------------------------------

XA_FUNC( SETWHITEPEN )  // SetWhitePen( <hDC> ) --> nOldPen
{
   hb_retnl( (LONG) SelectObject( (HDC) hb_parnl( 1 ),
                                  GetStockObject( WHITE_PEN ) ) );
}

#pragma ENDDUMP

//--------------------------------------------------------------------------
