/*
 * Xailer source code:
 *
 * ToolButton.prg
 * Clase TToolButton()
 *
 * Copyright 2003, 2007 Jose F. Gimenez
 * Copyright 2003, 2007 Xailer.com
 * All rights reserved
 *
 */

#include "Xailer.ch"
#include "CommCtrl.api"


//--------------------------------------------------------------------------

CLASS XToolButton FROM TComponent

PUBLISHED:
   PROPERTY cText       INIT ""  WRITE METHOD SetInfo
   PROPERTY nImage      INIT 0   WRITE INLINE ::SetInfo( , Value ) EDITOR PE_ImageIndex
   PROPERTY lSeparator  INIT .F. WRITE INLINE ::SetInfo( ,, Value )
   PROPERTY lAutoSize   INIT .F. WRITE INLINE ::SetInfo( ,,, Value )
   PROPERTY lGroup      INIT .F. WRITE INLINE ::SetInfo( ,,,, Value )
   PROPERTY cTooltip    INIT ""  EDITOR PE_StringOrNil
   PROPERTY oMenu       AS TPopupMenu  EDITOR PE_Component

   PROPERTY lEnabled    INIT .T. WRITE INLINE IIf( Value, ::Enable(), ::Disable() )
   PROPERTY lVisible    INIT .T. WRITE INLINE IIf( Value, ::Show(), ::Hide() )
   PROPERTY lChecked    INIT .F. WRITE INLINE IIf( Value, ::Check(), ::Uncheck() )

   EVENT OnClick( oSender )   // --> Nil

PUBLIC:
   PROPERTY nIndex   INIT 0   READONLY

   METHOD Create( oParent, nPos, lSeparator, cText, nImage, cToolTip, lAutoSize, lGroup, lChecked, lEnabled, lVisible, oMenu ) CONSTRUCTOR
   METHOD Delete() // --> Nil
   METHOD Click()   INLINE IIF( ::lEnabled, ::OnClick(), ) // --> Nil

RESERVED:
   METHOD Enable()  INLINE ::FlEnabled := .T., ::oParent:SendMsg( TB_ENABLEBUTTON, ::nIndex + TB_ID_FIRST, -1 )
   METHOD Disable() INLINE ::FlEnabled := .F., ::oParent:SendMsg( TB_ENABLEBUTTON, ::nIndex + TB_ID_FIRST,  0 )
   METHOD Show()    INLINE ::FlVisible := .T., ::oParent:SendMsg( TB_HIDEBUTTON,   ::nIndex + TB_ID_FIRST,  0 )
   METHOD Hide()    INLINE ::FlVisible := .F., ::oParent:SendMsg( TB_HIDEBUTTON,   ::nIndex + TB_ID_FIRST, -1 )
   METHOD Check()   INLINE ::FlChecked := .T., ::oParent:SendMsg( TB_CHECKBUTTON,  ::nIndex + TB_ID_FIRST, -1 )
   METHOD Uncheck() INLINE ::FlChecked := .F., ::oParent:SendMsg( TB_CHECKBUTTON,  ::nIndex + TB_ID_FIRST,  0 )
   METHOD SetInfo( cText, nImage )
   METHOD XAClick() VIRTUAL

ENDCLASS

//--------------------------------------------------------------------------

METHOD Create( oParent, nPos, lSeparator, cText, nImage, cToolTip, lAutoSize, lGroup, lChecked, lEnabled, lVisible, oMenu ) CLASS XToolButton

   UPDATE ::FlSeparator TO lSeparator
   UPDATE ::FcText      TO cText
   UPDATE ::FnImage     TO nImage   // NOTA: Si es un separador, nImage es la anchura
   UPDATE ::FcTooltip   TO cTooltip
   UPDATE ::FlAutoSize  TO lAutoSize
   UPDATE ::FlGroup     TO lGroup
   UPDATE ::FlChecked   TO lChecked
   UPDATE ::FlEnabled   TO lEnabled
   UPDATE ::FlVisible   TO lVisible
   UPDATE ::FoMenu      TO oMenu

   ::Super:Create( oParent )

   IF nPos <= 0 .OR. nPos > Len( ::oParent:aItems )
      nPos := Len( ::oParent:aItems ) + 1
   ENDIF
   AAdd( ::oParent:aItems, Nil )
   AIns( ::oParent:aItems, nPos )
   ::oParent:aItems[ nPos ] := Self
   IF ! Empty( ::oParent:Handle )
      ::oParent:ResetButtons()
      ::oParent:SetShortCuts()
      ::oParent:Adjust()
   ENDIF

RETURN Self

//--------------------------------------------------------------------------

METHOD Delete() CLASS XToolButton

   LOCAL nItem := AScan( ::oParent:aItems, {| oItem | oItem == Self } )

   ::oParent:DeleteItem( nItem )

RETURN Nil

//--------------------------------------------------------------------------

#pragma BEGINDUMP

#define _WIN32_IE 0x0501

#include <windows.h>
#include <commctrl.h>
#include <xailer.h>
#include <constants.ch>

//--------------------------------------------------------------------------

HB_FUNC_STATIC( XTOOLBUTTON_SETINFO )
{
   PHB_ITEM Self = hb_stackSelfItem();
   PHB_ITEM oParent = XA_ObjGetItemCopy( Self, "oParent" );
   HWND hWnd = GetHandleOf( oParent );
   int nIndex = XA_ObjGetNL( Self, "nIndex" ) ;
   TBBUTTONINFO tbi;

   if( HB_ISCHAR( 1 ) )
      XA_ObjSendC( Self, "_FcText", hb_parc( 1 ) );
   if( HB_ISNUM( 2 ) )
      XA_ObjSendNL( Self, "_FnImage", hb_parnl( 2 ) );
   if( HB_ISLOG( 3 ) )
      XA_ObjSendL( Self, "_FlSeparator", hb_parl( 3 ) );
   if( HB_ISLOG( 4 ) )
      XA_ObjSendL( Self, "_FlAutoSize", hb_parl( 4 ) );
   if( HB_ISLOG( 5 ) )
      XA_ObjSendL( Self, "_FlGroup", hb_parl( 5 ) );

   if( hWnd )
      {
      tbi.cbSize   = sizeof( TBBUTTONINFO );
      tbi.dwMask   = TBIF_TEXT | TBIF_IMAGE | TBIF_STYLE;
      tbi.pszText  = XA_ObjGetCBuf( Self, "cText" );
      tbi.iImage   = XA_ObjGetNL( Self, "nImage" ) - 1;
      if( tbi.iImage < 0 )
         tbi.iImage   = I_IMAGENONE;
      if( XA_ObjGetL( Self, "lSeparator" ) )
         tbi.fsStyle  = BTNS_SEP;
      else
         {
         tbi.fsStyle  = BTNS_BUTTON | ( tbi.pszText ? BTNS_SHOWTEXT : 0 );
         tbi.fsStyle |= ( XA_ObjGetL( Self, "lAutoSize" ) ? BTNS_AUTOSIZE : 0 );
         if( ( XA_ObjGetNL( oParent, "nBtnWidth" ) == 0 ) || ( XA_ObjGetNL( oParent, "nBtnHeight" ) == 0 ) || XA_ObjGetL( oParent, "lList" ) )
            tbi.fsStyle |= BTNS_AUTOSIZE;
         tbi.fsStyle |= ( XA_ObjGetL( Self, "lGroup" ) ? BTNS_GROUP | BTNS_CHECK: 0 );
         if( XA_ObjGetItem( Self, "oMenu" ) )
            tbi.fsStyle  |= ( XA_EventAssigned( Self, "OnClick" ) ? BTNS_DROPDOWN : BTNS_WHOLEDROPDOWN );
         }
      SendMessage( hWnd, TB_SETBUTTONINFO, nIndex + TB_ID_FIRST, (LPARAM) &tbi );
      XA_FreeCBuf( tbi.pszText );
      }

   hb_itemRelease( oParent );
   hb_ret();
}

#pragma ENDDUMP

//--------------------------------------------------------------------------
