/*
 * BtnPanelMod.prg
 * Clase TBtnPanelMod
 *
 * Copyright 2020 Ignacio Ortiz de Zúñiga
 * Copyright 2020 https://Xailer.com
 * All rights reserved
*/

#include "Xailer.ch"

//--------------------------------------------------------------------------

CLASS XBtnPanelMod FROM TWinControl

PUBLISHED:
   PROPERTY nWidth         INIT 100
   PROPERTY nHeight        INIT 100
   PROPERTY nHotOpacity    INIT 25
   PROPERTY nPushedOpacity INIT 50
   PROPERTY nClrPane       INIT clBlack
   PROPERTY nBorderRadius  INIT 0 WRITE INLINE ::FnBorderRadius := Value, ::Refresh()
   PROPERTY lHotBorder     INIT .T.
   PROPERTY lTabStop

RESERVED:
   PROPERTY nOpacity

PROTECTED:
   PROPERTY lTransparent   INIT .t.
   PROPERTY cText
   PROPERTY nBorderStyle   INIT bvNONE
   PROPERTY cMessage
   PROPERTY l3D            INIT .F.
   PROPERTY lBorder        INIT .F.
   PROPERTY lParentFont
   PROPERTY nClrText
   PROPERTY oFont
   DATA nClassStyle INIT nOr( CS_PARENTDC, CS_HREDRAW, CS_VREDRAW )
   DATA lIsHot          INIT .F.
   DATA lPushed         INIT .F.
   DATA lMouseTracked   INIT .F.
   EVENT OnDblClick()

RESERVED:

   METHOD WMEraseBkgnd()   INLINE 1
   METHOD WMPaint()
   METHOD WMPrintClient() EXTERN XBtnPanelMod_WMPaint()
   METHOD Refresh( lValue )
   METHOD InsertControl( oCtrl )

   METHOD WMMouseMove( nWParam, nLParam, hWnd )
   METHOD WMMouseLeave( nWParam, nLParam, hWnd )
   METHOD WMLButtonDown( nWParam, nLParam )  INLINE ::lPushed := .T., ::Refresh()
   METHOD WMLButtonUp( nWParam, nLParam )    INLINE IIF( ::lPushed, ::Click(), ), ::lPushed := .F., ::Refresh()
   METHOD WMKillFocus( hCtl ) INLINE ( ::Super:WMKillFocus( hCtl ), ::Refresh( .F. ) )
   METHOD WMSetFocus( hCtl )     INLINE ( ::Super:WMSetFocus( hCtl ),  ::Refresh( .F. ) )

ENDCLASS

//--------------------------------------------------------------------------

METHOD WMMouseMove( nWParam, nLParam, hWnd ) CLASS XBtnPanelMod

   IF !::lIsHot
      ::lIsHot  := .T.
      ::Refresh( .F. )
   ENDIF

   IF !::lMouseTracked
      ::lMouseTracked := TrackMouseEvent( ::Handle, TME_LEAVE )
   ENDIF

RETURN ::Super:WMMouseMove( nWParam, nLParam, hWnd )

 //--------------------------------------------------------------------------

METHOD WMMouseLeave( nWParam, nLParam, hWnd ) CLASS XBtnPanelMod

   LOCAL x, y

   GetCursorPos( @x, @y )

   IF !PtInRect( GetWindowRect( ::Handle ), {x,y} )
      ::lIsHot := .F.
      ::lPushed := .F.
      ::Refresh()
   ENDIF

   ::lMouseTracked := .F.

RETURN nil

//--------------------------------------------------------------------------

METHOD Refresh( lValue ) CLASS XBtnPanelMod

   LOCAL nOpacity

   IF ::lPushed .AND. ::lIsHot
      nOpacity := ::nPushedOpacity
   ELSEIF ::lIsHot
      nOpacity := ::nHotOpacity
   ELSE
      nOpacity := 0
   ENDIF

   ::nOpacity := nOpacity

   ::Super:Refresh( lValue )

   RefreshChilds( Self )

RETURN NIL

//------------------------------------------------------------------------------

STATIC FUNCTION RefreshChilds( oCtl )

   LOCAL Control

   InvalidateRect( oCtl:Handle, .f. )

   IF oCtl:IsKindOf( "TWinControl" )
      FOR EACH Control IN oCtl:aControls
         RefreshChilds( Control )
      NEXT
   ENDIF

RETURN NIL

//--------------------------------------------------------------------------

#DEFINE _CLASSES_ {"TLabel", "TLabelEx","TGroupBox","TPanel","TBevel","TImage"}

METHOD InsertControl( oCtrl ) CLASS XBtnPanelMod

   LOCAL cClass

   FOR EACH cClass IN _CLASSES_
      IF oCtrl:IsKindOf( cClass )
         IF !oCtrl:EventAssigned( "OnLButtonDown" ) .AND. ;
            !oCtrl:EventAssigned( "OnLButtonUp" )   .AND. ;
            !oCtrl:EventAssigned( "OnClick" )
            oCtrl:OnlButtonDown := {|| ::WMLButtonDown() }
            oCtrl:OnlButtonUp   := {|| ::WMLButtonUp() }
         ENDIF
         EXIT
      ENDIF
   NEXT

RETURN ::Super:InsertControl( oCtrl )