/*
 * DBDateEditMod.prg
 * Clase TDBDateEditMod()
 *
 * Copyright 2020 Ignacio Ortiz de Zúñiga
 * Copyright 2020 https://Xailer.com
 * All rights reserved
 *
 */

#include "Xailer.ch"


//--------------------------------------------------------------------------

CLASS XDBDateEditMod FROM TDateEditMod

PUBLISHED:
   PROPERTY oDataSet    WRITE SetDataSet     EDITOR PE_Component AS TDataSet
   PROPERTY oDataField  WRITE SetFieldObject EDITOR PE_DataField AS TDataField
   PROPERTY lEditable   INIT .T.
   PROPERTY lAutoSave   INIT .T.

PUBLIC:
   PROPERTY Value
   PROPERTY lReadOnly   INIT .T. WRITE METHOD SetReadOnly

   METHOD Refresh( lValue )  // --> lResult
   METHOD Change() // --> Nil
   METHOD DbLinked()        INLINE ( ValType( ::oDataField  ) == "O" )

RESERVED:
   METHOD SetDataSet( Value )        EXTERN DC_SetDataSet  // --> Nil
   METHOD DCSetFieldObject( oField ) EXTERN DC_SetFieldObject // --> Nil
   METHOD ResetDataField()           EXTERN DC_ResetDataField // --> Nil
   METHOD SetData()                  EXTERN DC_SetData // --> Nil
   METHOD GetData()                  EXTERN DC_GetData // --> Nil

   METHOD SetFieldObject( oField ) // --> Nil
   METHOD SetReadOnly( Value ) // --> Nil
   METHOD Lock()   INLINE ::lReadOnly := .T. // --> Nil
   METHOD UnLock() INLINE ::lReadOnly := ! ::lEditable // --> lResult
   METHOD Free()   INLINE ( ::SetDataSet( , .T. ), ::Super:Free() ) // --> Nil

   METHOD WMKeyDown( nKey, nFlags, hWnd, nMsg ) ;
      INLINE ::oForm:SendMsg( WM_CHANGEUISTATE, MakeLong( UIS_CLEAR, UISF_HIDEFOCUS ) ), ;
             IIf( ! ::lReadOnly, ::Super:WMKeyDown( nKey, nFlags, hWnd, nMsg ), 0 )

   METHOD WMLButtonDown( nWParam, nLParam, hWnd, nMsg ) ;
      INLINE IIf( ! ::lReadOnly, ::Super:WMLButtonDown( nWParam, nLParam, hWnd, nMsg ), ( ::SetFocus(), 0 ) )

   METHOD WMLButtonDblClk( nWParam, nLParam, hWnd, nMsg ) ;
      INLINE IIf( ! ::lReadOnly, ::Super:WMLButtonDblClk( nWParam, nLParam, hWnd, nMsg ), ( ::SetFocus(), 0 ) )

ENDCLASS

//--------------------------------------------------------------------------

METHOD Refresh( lValue ) CLASS XDBDateEditMod

   IF Valtype( ::oDataField ) == "O" .AND. ::oDataSet != Nil .AND. ! ::oDataSet:lOnEdit()
      ::Value := ::oDataField:Value
   ENDIF

RETURN ::Super:Refresh( lValue )

//--------------------------------------------------------------------------

METHOD SetFieldObject( xField ) CLASS XDBDateEditMod

   ::DCSetFieldObject( xField )

   IF Valtype( ::FoDataField ) == "O"
      ::nMaxLength := ::FoDataField:nLen
   ENDIF

RETURN Nil

//--------------------------------------------------------------------------

METHOD SetReadOnly( Value ) CLASS XDBDateEditMod

   IF ::oDataSet == Nil .OR. ( ::oDataSet != Nil .AND. ! ::oDataSet:lOnEdit() )
      Value := .T.
   ENDIF

RETURN ::Super:SetReadOnly( Value )

//--------------------------------------------------------------------------

METHOD Change() CLASS XDBDateEditMod

   ::Super:Change()

   IF  ::oDataSet != Nil .AND. ::oDataSet:lOnEdit() .AND. Valtype( ::oDataField ) == "O"
      ::oDataField:SetValue( ::Value, .T. )
   ENDIF

RETURN Nil

//--------------------------------------------------------------------------
