/*
 * Xailer source code:
 *
 * RebarBand.prg
 * Clase TRebarBand()
 *
 * Copyright 2003, 2007 Jose F. Gimenez
 * Copyright 2003, 2007 Xailer.com
 * All rights reserved
 *
 */

#include "Xailer.ch"
#include "CommCtrl.api"


//--------------------------------------------------------------------------

CLASS XRebarBand FROM TComponent

PUBLISHED:
   PROPERTY cText       INIT ""     WRITE METHOD SetInfo
   PROPERTY nImage      INIT 0      WRITE INLINE ::SetInfo( ,Value ) EDITOR PE_ImageIndex
   PROPERTY lBreak      INIT .F.    WRITE INLINE ::SetInfo( ,,Value )
   PROPERTY lChildEdge  INIT .F.    WRITE INLINE ::SetInfo( ,,,Value )
   PROPERTY lFixedBmp   INIT .F.    WRITE INLINE ::SetInfo( ,,,,Value )
   PROPERTY lFixedSize  INIT .F.    WRITE INLINE ::SetInfo( ,,,,,Value )
   PROPERTY lGripper    INIT rgDEFAULT VALUES rgDEFAULT, rgALWAYS, rgNEVER WRITE INLINE ::SetInfo( ,,,,,,Value )

   PROPERTY oBkgnd      AS TPicture WRITE METHOD SetBkgnd   EDITOR PE_Picture
   PROPERTY lVisible    INIT .T.    WRITE INLINE IIF( Value, ::Show(), ::Hide() )

PROTECTED:
   METHOD AddItem()

PUBLIC:
   PROPERTY oControl    AS TControl WRITE METHOD SetControl EDITOR PE_Control
   DATA nIndex READONLY

   METHOD Create( oParent, cText, nImage, oBkgnd, lBreak, lChildEdge, lFixedBmp, lFixedSize, lGripper, lVisible ) CONSTRUCTOR

   METHOD Free() INLINE ::FoControl := Nil, IIf( Empty( ::FoBkGnd ),, ::FoBkGnd:End() ), ::Super:Free()

   METHOD Delete()   // --> Nil

RESERVED:
   METHOD SetBkgnd( oBkgnd )

   METHOD Show()
   METHOD Hide()

   METHOD SetInfo( cText, nImage, lBreak, lChildEdge, lFixedBmp, lFixedSize, lGripper )
   METHOD SetControl( oControl, nMinWidth, nIdealWidth, nMinHeight, nMaxHeight )

ENDCLASS

//--------------------------------------------------------------------------

METHOD Create( oParent, cText, nImage, oBkgnd, lBreak, lChildEdge, lFixedBmp, lFixedSize, lGripper, lVisible ) CLASS XRebarBand

   LOCAL nItems

   UPDATE ::FlGripper   TO lGripper
   UPDATE ::oBkgnd      TO oBkgnd

   ::SetInfo( cText, nImage, lBreak, lChildEdge, lFixedBmp, lFixedSize, ::lGripper )

   ::Super:Create( oParent )

   IF Empty( ::nIndex )
      IF ( nItems := Len( ::oParent:aItems ) ) == 0
         ::nIndex := 1
      ELSE
         ::nIndex := ::oParent:aItems[ nItems ]:nIndex + 1
      ENDIF
      AAdd( ::oParent:aItems, Self )
   ENDIF

   ::AddItem()

   UPDATE ::lVisible TO lVisible

RETURN Self

//--------------------------------------------------------------------------

METHOD Delete() CLASS XRebarBand

   LOCAL nItem := AScan( ::oParent:aItems, {| oItem | oItem == Self } )

   IF nItem > 0
      ::oParent:SendMsg( RB_DELETEBAND, ::oParent:SendMsg( RB_IDTOINDEX, ::nIndex ) )
      ADel( ::oParent:aItems, nItem )
      ASize( ::oParent:aItems, Len( ::oParent:aItems ) - 1 )
      ::End()
   ENDIF

RETURN Nil

//--------------------------------------------------------------------------

METHOD SetBkgnd( oBkgnd ) CLASS XRebarBand

   IF ::FoBkgnd != Nil
      ::FoBkgnd:Destroy()
   ENDIF

   IF oBkgnd != Nil
      IF ValType( oBkgnd ) != "O"
         oBkgnd := TPicture():Create( oBkgnd )
      ENDIF
   ENDIF
   ::FoBkgnd := oBkgnd

   ::SetInfo()

RETURN Nil

//--------------------------------------------------------------------------

METHOD Show() CLASS XRebarBand

   ::FlVisible := .T.
   ::oParent:SendMsg( RB_SHOWBAND, ::oParent:SendMsg( RB_IDTOINDEX, ::nIndex ), .T. )

RETURN ::FlVisible

//--------------------------------------------------------------------------

METHOD Hide() CLASS XRebarBand

   ::FlVisible := .F.
   ::oParent:SendMsg( RB_SHOWBAND, ::oParent:SendMsg( RB_IDTOINDEX, ::nIndex ), .F. )

RETURN ::FlVisible

//--------------------------------------------------------------------------

#pragma BEGINDUMP

#define _WIN32_IE 0x0400

#include <windows.h>
#include <commctrl.h>
#include <xailer.h>
#include <constants.ch>

//--------------------------------------------------------------------------

HB_FUNC_STATIC( XREBARBAND_ADDITEM )
{
   PHB_ITEM Self   = hb_stackSelfItem();
   PHB_ITEM oRebar = XA_ObjGetItemCopy( Self, "oParent" );
   HWND hRebar     = GetHandleOf( oRebar );
   HWND hControl   = GetHandleOf( XA_ObjGetItem( Self, "oControl" ) );
   REBARBANDINFO rbi;
   RECT rect;

   rbi.cbSize     = sizeof( REBARBANDINFO );
   rbi.fMask      = RBBIM_STYLE | RBBIM_COLORS | RBBIM_TEXT | RBBIM_ID | RBBIM_IMAGE | RBBIM_BACKGROUND;
   rbi.fStyle     = RBBS_VARIABLEHEIGHT;
   rbi.fStyle    |= ( XA_ObjGetL( Self, "lBreak" ) ? RBBS_BREAK : 0 );
   rbi.fStyle    |= ( XA_ObjGetL( Self, "lChildEdge" ) ? RBBS_CHILDEDGE : 0 );
   rbi.fStyle    |= ( XA_ObjGetL( Self, "lFixedBmp" ) ? RBBS_FIXEDBMP : 0 );
   rbi.fStyle    |= ( XA_ObjGetL( Self, "lFixedSize" ) ? RBBS_FIXEDSIZE : 0 );
   XA_ObjGetItem( Self, "lGripper" );
   if( HB_ISLOG( -1 ) )
      rbi.fStyle |= ( hb_parl( -1 ) ? RBBS_GRIPPERALWAYS : RBBS_NOGRIPPER );

   rbi.clrFore    = XA_ObjGetNL( oRebar, "nClrText" );
   rbi.clrBack    = XA_ObjGetNL( oRebar, "nClrPane" );
   rbi.lpText     = XA_ObjGetCBuf( Self, "cText" );
   rbi.cch        = hb_parclen( -1 ) + 1;
   rbi.wID        = XA_ObjGetNL( Self, "nIndex" );
   rbi.iImage     = XA_ObjGetNL( Self, "nImage" ) - 1;
   rbi.hbmBack    = (HANDLE) GetHandleOf( XA_ObjGetItem( Self, "oBkgnd" ) );

   rbi.hwndChild  = hControl;
   if ( hControl )
      {
      BOOL lVertical = ( GetWindowLong( hRebar, GWL_STYLE ) & CCS_VERT );

      rbi.fMask |= RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_SIZE | RBBIM_IDEALSIZE;
      GetWindowRect( hControl, &rect );
      rbi.cx         = ( lVertical ? rect.bottom - rect.top : rect.right - rect.left );
      rbi.cxMinChild = rbi.cx;
      rbi.cxIdeal    = rbi.cx;
      rbi.cyChild    = ( lVertical ? rect.right - rect.left : rect.bottom - rect.top );
      rbi.cyMinChild = rbi.cyChild;
      rbi.cyMaxChild = rbi.cyChild;
      rbi.cyIntegral = 0;
      }

   SendMessage( hRebar, RB_INSERTBAND, -1, (LPARAM) &rbi );

   if ( hControl )
      SetParent( hControl, hRebar );

   PostMessage( hRebar, RB_MAXIMIZEBAND, SendMessage( hRebar, RB_GETBANDCOUNT, 0, 0 ), 0 );

   XA_FreeCBuf( rbi.lpText );
   hb_itemRelease( oRebar );
   hb_ret();
}

//--------------------------------------------------------------------------

HB_FUNC_STATIC( XREBARBAND_SETINFO )
{
   PHB_ITEM Self = hb_stackSelfItem();

   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, "_FlBreak", hb_parl( 3 ) );
   if( HB_ISLOG( 4 ) )
      XA_ObjSendL( Self, "_FlChildEdge", hb_parl( 4 ) );
   if( HB_ISLOG( 5 ) )
      XA_ObjSendL( Self, "_FlFixedBmp", hb_parl( 5 ) );
   if( HB_ISLOG( 6 ) )
      XA_ObjSendL( Self, "_FlFixedSize", hb_parl( 6 ) );
   if( HB_ISLOG( 7 ) )
      XA_ObjSendL( Self, "_FlGripper", hb_parl( 7 ) );
   else if( hb_pcount() == 7 )
      XA_ObjSendNil( Self, "_FlGripper" );

   if( XA_ObjGetL( Self, "lCreated" ) )
      {
      HWND hRebar = GetHandleOf( XA_ObjGetItem( Self, "oParent" ) );
      int nItem = SendMessage( hRebar, RB_IDTOINDEX, XA_ObjGetNL( Self, "nIndex" ), 0 );
      REBARBANDINFO rbi;

      rbi.cbSize  = sizeof( REBARBANDINFO );
      rbi.fMask   = RBBIM_TEXT | RBBIM_IMAGE | RBBIM_STYLE | RBBIM_BACKGROUND;
      rbi.lpText  = XA_ObjGetCBuf( Self, "cText" );
      rbi.iImage  = XA_ObjGetNL( Self, "nImage" ) - 1;
      rbi.fStyle  = ( XA_ObjGetL( Self, "lBreak" ) ? RBBS_BREAK : 0 );
      rbi.fStyle |= ( XA_ObjGetL( Self, "lChildEdge" ) ? RBBS_CHILDEDGE : 0 );
      rbi.fStyle |= ( XA_ObjGetL( Self, "lFixedBmp" ) ? RBBS_FIXEDBMP : 0 );
      rbi.fStyle |= ( XA_ObjGetL( Self, "lFixedSize" ) ? RBBS_FIXEDSIZE : 0 );
      XA_ObjSend( Self, "lGripper" );
      if( HB_ISLOG( -1 ) )
         rbi.fStyle |= ( hb_parl( -1 ) ? RBBS_GRIPPERALWAYS : RBBS_NOGRIPPER );
      rbi.hbmBack = (HANDLE) GetHandleOf( XA_ObjGetItem( Self, "oBkgnd" ) );

      SendMessage( hRebar, RB_SETBANDINFO, nItem, (LPARAM) &rbi );
      XA_FreeCBuf( rbi.lpText );
      }

   hb_ret();
}

//--------------------------------------------------------------------------

HB_FUNC_STATIC( XREBARBAND_SETCONTROL )
{
   PHB_ITEM Self = hb_stackSelfItem();
   HWND hRebar = GetHandleOf( XA_ObjGetItem( Self, "oParent" ) );
   int nItem = SendMessage( hRebar, RB_IDTOINDEX, XA_ObjGetNL( Self, "nIndex" ), 0 );
   REBARBANDINFO rbi;
   RECT rect;
   PHB_ITEM oControl = hb_param( 1, HB_IT_ANY );

   XA_ObjSendItem( Self, "_FoControl", oControl);

   if( hRebar && HB_IS_OBJECT( oControl ) && XA_ObjGetL( Self, "lCreated" ) )
      {
      HWND hControl = GetHandleOf( oControl );
      BOOL lVertical = ( GetWindowLong( hRebar, GWL_STYLE ) & CCS_VERT );

      GetWindowRect( hControl, &rect );
      rbi.cbSize     = sizeof( REBARBANDINFO );
      rbi.fMask      = RBBIM_CHILDSIZE | RBBIM_SIZE | RBBIM_IDEALSIZE | RBBIM_CHILD;
      rbi.hwndChild  = hControl;
      rbi.cx         = HB_ISNUM( 2 ) ? hb_parnl( 2 ) : ( lVertical ? rect.bottom - rect.top : rect.right - rect.left );
      rbi.cxMinChild = rbi.cx;
      rbi.cxIdeal    = HB_ISNUM( 3 ) ? hb_parnl( 3 ) : (int) rbi.cx;
      rbi.cyChild    = HB_ISNUM( 4 ) ? hb_parnl( 4 ) : ( lVertical ? rect.right - rect.left : rect.bottom - rect.top );
      rbi.cyMinChild = HB_ISNUM( 5 ) ? hb_parnl( 5 ) : (int) rbi.cyChild;
      rbi.cyMaxChild = rbi.cyChild;
      rbi.cyIntegral = 0;

      SendMessage( hRebar, RB_SETBANDINFO, nItem, (LPARAM) &rbi );
      SetParent( hControl, hRebar );
      }

   hb_ret();
}

#pragma ENDDUMP

//--------------------------------------------------------------------------
