/*
 * Xailer source code:
 *
 * HotKey.prg
 * Control HotKey
 *
 * Copyright 2003, 2007 Jose Lalin
 * Copyright 2003, 2007 Xailer.com
 * All rights reserved
 *
 */

#include "Xailer.ch"
#include "CommCtrl.api"


//--------------------------------------------------------------------------

CLASS XHotKey FROM TStdControl

PUBLISHED:
   PROPERTY nWidth   INIT 70
   PROPERTY nHeight  INIT 20
   PROPERTY lBorder  INIT .T.
   PROPERTY nClrPane INIT clWindow  EDITOR PE_Color
   PROPERTY nKey     INIT 0   WRITE METHOD SetHotKey

   PROPERTY lAlt     INIT .F. WRITE INLINE ::FlAlt    := Value, ::SetFlag( HOTKEYF_ALT, Value )
   PROPERTY lCtrl    INIT .F. WRITE INLINE ::FlCtrl   := Value, ::SetFlag( HOTKEYF_CONTROL, Value )
   PROPERTY lShift   INIT .F. WRITE INLINE ::FlShift  := Value, ::SetFlag( HOTKEYF_SHIFT, Value )
   PROPERTY lWinKey  INIT .F. WRITE INLINE ::FlWinKey := Value, ::SetFlag( HOTKEYF_EXT, Value )

   EVENT OnChange( oSender ) // --> Nil

PROTECTED:
   DATA cWinClassName   INIT HOTKEY_CLASS
   DATA nCtlStyle       INIT nOr( WS_CHILD, WS_CLIPSIBLINGS )

   DATA nFlags          INIT 0

   METHOD SetFlag( nFlag, Value )

PUBLIC:
   METHOD Create( oParent ) CONSTRUCTOR

RESERVED:
   METHOD SetHotKey( nKey )
   METHOD GetKey()
   METHOD SetRules( nNoValid )
   METHOD GetHotKey()   INLINE ::SendMsg( HKM_GETHOTKEY, 0, 0 )
   METHOD WMKeyDown( nKey, nFlags, hWnd ) INLINE IIf( nKey == VK_TAB, 0, ::Super:WMKeyDown( nKey, nFlags, hWnd ) )
   METHOD Command( nCode )

ENDCLASS

//--------------------------------------------------------------------------

METHOD Create( oParent ) CLASS XHotKey

   InitCommonControls( ICC_HOTKEY_CLASS )

   ::Super:Create( oParent )

   ::SetRules()
   ::SetHotKey()

RETURN Self

//--------------------------------------------------------------------------

METHOD SetHotKey( nKey ) CLASS XHotKey

   UPDATE ::FnKey TO nKey

   IF ! Empty( ::FnKey ) .AND. ::Handle != 0
      ::SendMsg( HKM_SETHOTKEY, MakeWord( ::FnKey, ::nFlags ), 0 )
   ENDIF

RETURN Nil

//--------------------------------------------------------------------------

METHOD GetKey() CLASS XHotKey

   LOCAL nInfo

   IF ::Handle != 0
      nInfo      := ::GetHotKey()
      ::FnKey    := LoByte( nInfo )
      ::nFlags   := HiByte( nInfo )
      ::FlAlt    := lAnd( HOTKEYF_ALT, ::nFlags )
      ::FlCtrl   := lAnd( HOTKEYF_CONTROL, ::nFlags )
      ::FlShift  := lAnd( HOTKEYF_SHIFT, ::nFlags )
      ::FlWinKey := lAnd( HOTKEYF_EXT, ::nFlags )
   ENDIF

RETURN ::FnKey

//--------------------------------------------------------------------------

METHOD SetRules( nNoValid ) CLASS XHotKey

   DEFAULT nNoValid TO HKCOMB_S

   ::SendMsg( HKM_SETRULES, nNoValid, MakeLong( ::nFlags, 0 ) )

RETURN Nil

//--------------------------------------------------------------------------

METHOD SetFlag( nFlag, Value ) CLASS XHotKey

   IF Value
      ::nFlags := nOr( ::nFlags, nFlag )
   ELSE
      ::nFlags := nExclude( ::nFlags, nFlag )
   ENDIF

   ::SetHotKey()

RETURN Value

//--------------------------------------------------------------------------

METHOD Command( nCode ) CLASS XHotKey

   IF nCode == EN_CHANGE
      ::GetKey()
      ::OnChange()
   ENDIF

RETURN Nil

//--------------------------------------------------------------------------

#pragma BEGINDUMP

#include <windows.h>
#include <xailer.h>

//--------------------------------------------------------------------------

XA_FUNC( REGISTERHOTKEY )     // RegisterHotkey( [<hWnd>], [<nId>], <nFlags>, <nVKey> ) --> lSuccess
{
   hb_retl( RegisterHotKey( HB_ISNUM( 1 ) ? (HWND) hb_parnl( 1 ) : NULL, HB_ISNUM( 2 ) ? hb_parnl( 2 ) : 0, hb_parni( 3 ), hb_parnl( 4 ) ) );
}

//-----------------------------------------------------------------------------

XA_FUNC( UNREGISTERHOTKEY )   // UnregisterHotKey( [<hWnd>], <nId> ) --> lSuccess
{
   hb_retl( UnregisterHotKey( HB_ISNUM( 1 ) ? (HWND) hb_parnl( 1 ) : NULL, hb_parnl( 2 ) ) );
}

#pragma ENDDUMP

//--------------------------------------------------------------------------
