/*
 * CircularImage.prg
 * Control de imagen circular
 *
 * Copyright 2020 Ignacio Ortiz de Zúñiga
 * Copyright 2020 https://Xailer.com
 * All rights reserved
 *
 */

#include "Xailer.ch"

CLASS XCircularImage FROM TStdControl

PUBLISHED:
   PROPERTY oPicture       AS TPicture ;
                           WRITE METHOD SetBitmap ;
                           EDITOR PE_Picture
   PROPERTY nWidth         INIT 120
   PROPERTY nHeight        INIT 120
   PROPERTY nClrPane       INIT clBtnFace ;
                           WRITE INLINE ( ::FnClrPane := Value, ::Refresh() ) ;
                           EDITOR PE_Color
   PROPERTY nClrPen        INIT clActiveBorder ;
                           WRITE INLINE ( ::FnClrPen := Value, ::Refresh() ) ;
                           EDITOR PE_Color
   PROPERTY nPenSize       INIT 4
   PROPERTY lTransparent   INIT .T.

   EVENT OnClick( oSender )  // --> Nil

PROTECTED:
   PROPERTY nClrText
   PROPERTY oFont
   PROPERTY nBorderStyle   INIT  bvnone //bvWIN10
   PROPERTY cText
   PROPERTY lBorder     INIT .F.
   PROPERTY l3D
   PROPERTY lParentFont
   PROPERTY oBrush
   DATA nCtlStyle       INIT nOr( WS_CHILD, WS_CLIPCHILDREN, WS_CLIPSIBLINGS )
   DATA lIsHot          INIT .F.
   DATA lPushed         INIT .F.

RESERVED:

   METHOD SetBitmap( oBitmap )

   METHOD WMPaint()
   METHOD WMPrintClient() EXTERN XCircularImage_WMPaint()
   METHOD WMEraseBkgnd() INLINE 1
   METHOD WMMouseMove( nWParam, nLParam, hWnd )
   METHOD WMMouseLeave()
   METHOD WMLButtonDown( nWParam, nLParam )
   METHOD WMLButtonUp( nWParam, nLParam )
   METHOD WMKillFocus( hCtl ) INLINE ( ::Super:WMKillFocus( hCtl ), ::Refresh( .F. ) )
   METHOD WMSetFocus( hCtl )     INLINE ( ::Super:WMSetFocus( hCtl ),  ::Refresh( .F. ) )
   METHOD XAClick() VIRTUAL

ENDCLASS

//------------------------------------------------------------------------------

METHOD SetBitmap( oPicture ) CLASS XCircularImage

   IF ::FoPicture != Nil
      ::FoPicture:Destroy()
      ::FoPicture := Nil
   ENDIF

   IF oPicture != Nil
      IF ValType( oPicture ) != "O"
         oPicture := TPicture():Load( oPicture, .t. )
      ENDIF
      ::FoPicture := oPicture
   ENDIF

RETURN Nil

//------------------------------------------------------------------------------

METHOD WMMouseMove( nWParam, nLParam, hWnd ) CLASS XCircularImage

   IF !::lIsHot
      ::lIsHot  := .T.
      ::lPushed := lGetKeyState( VK_LBUTTON )
      TrackMouseEvent( ::Handle, TME_LEAVE )
      ::Refresh( .F. )
   ENDIF

RETURN ::Super:WMMouseMove( nWParam, nLParam, hWnd )

//------------------------------------------------------------------------------

METHOD WMMouseLeave()  CLASS XCircularImage

   ::lIsHot  := .F.
   ::lPushed := .F.
   ::Refresh()

RETURN nil

//------------------------------------------------------------------------------

METHOD WMLButtonDown( nWParam, nLParam )  CLASS XCircularImage

   ::lPushed := .T.
   ::Refresh()

RETURN nil

//------------------------------------------------------------------------------

METHOD WMLButtonUp( nWParam, nLParam ) CLASS XCircularImage

   IF ::lIsHot .and. ::lPushed
      ::OnClick()
   ENDIF

   ::lPushed := .F.
   ::Refresh()

RETURN nil
