/*
 * Xailer source code:
 *
 * ProgressBar.prg
 * Control barra de progreso
 *
 * Copyright 2003, 2007 Jose Lalin
 * Copyright 2003, 2007 Xailer.com
 * All rights reserved
 *
 */

#include "Xailer.ch"
#include "CommCtrl.api"

//--------------------------------------------------------------------------

CLASS XProgressBar FROM TControl

PUBLISHED:
   PROPERTY nWidth         INIT 120
   PROPERTY nHeight        INIT 25

   PROPERTY nValue         INIT   0 WRITE SetPos
   PROPERTY nStep          INIT  10 WRITE SetStep

   PROPERTY nClrText       INIT clHighlight  WRITE INLINE ::SetBarColor( Value )
   PROPERTY nClrPane       INIT clBtnFace    WRITE INLINE ::SetBkColor( Value )

   PROPERTY nMin           INIT   0 WRITE INLINE ::SetRange( Value, ::nMax )
   PROPERTY nMax           INIT 100 WRITE INLINE ::SetRange( ::nMin, Value )

   PROPERTY nOrientation   INIT orHORIZONTAL VALUES orHORIZONTAL, orVERTICAL
   PROPERTY lSmooth        INIT .F.
   PROPERTY lMarquee       INIT .F. WRITE INLINE ::SetMarquee( Value )
   PROPERTY nMarqueeSpeed  INIT 100 WRITE INLINE ::SetMarquee( , Value )

   EVENT OnChange( oSender, nPos )  // --> Nil

PUBLIC:
   PROPERTY cText

PROTECTED:
   DATA cWinClassName   INIT PROGRESS_CLASS
   PROPERTY cTheme      INIT "Progress"

PUBLIC:
   METHOD Create( oParent ) CONSTRUCTOR

   METHOD SetBarColor( nColor )  INLINE ( ::FnClrText := nColor, ; // --> Nil
                                          ::SendMsg( PBM_SETBARCOLOR, 0, nColor ) )

   METHOD SetBkColor( nColor ) INLINE ( ::FnClrPane := nColor, ::SendMsg( PBM_SETBKCOLOR, 0, nColor ) ) // --> Nil

RESERVED:
   METHOD SetPos( nPos, lEvents )
   METHOD GetPos()            INLINE ::FnValue := ::SendMsg( PBM_GETPOS, 0, 0 )
   METHOD DeltaPos( nPos )    INLINE ::FnValue += nPos, ::SendMsg( PBM_DELTAPOS, nPos, 0 )

   METHOD SetStep( nStep )    INLINE ::FnStep := nStep, ::SendMsg( PBM_SETSTEP, nStep, 0 )
   METHOD StepIt()

   METHOD SetRange( nMin, nMax ) INLINE ::FnMin := nMin, ::FnMax := nMax, ;
                                        ::SendMsg( PBM_SETRANGE32, nMin, nMax )
   METHOD GetRange()

   METHOD SetMarquee( lOn, nSpeed )

ENDCLASS

//--------------------------------------------------------------------------

METHOD Create( oParent ) CLASS XProgressBar

   InitCommonControls( ICC_PROGRESS_CLASS )

   ::ChangeCtlStyle( PBS_VERTICAL, ::nOrientation == orVERTICAL )
   ::ChangeCtlStyle( PBS_SMOOTH, ::lSmooth )
   ::ChangeCtlStyle( PBS_MARQUEE, ::lMarquee )

   ::Super:Create( oParent )

   ::SetRange( ::FnMin, ::FnMax )
   ::SetPos( ::FnValue )
   ::SetStep( ::FnStep )
   ::SetBarColor( ::FnClrText )
   ::SetBkColor( ::FnClrPane )
   ::SetMarquee( ::FlMarquee )

RETURN Self

//--------------------------------------------------------------------------

METHOD SetPos( nPos, lEvents ) CLASS XProgressBar

   DEFAULT lEvents TO .T.

   ::FnValue := nPos
   ::SendMsg( PBM_SETPOS, nPos, 0 )

   IF XA_IsVistaOrHigher()
      IF nPos < ::FnMax
         ::SendMsg( PBM_SETPOS, nPos + 1, 0 )
         ::SendMsg( PBM_SETPOS, nPos, 0 )
      ELSE
         ::SendMsg( PBM_SETRANGE32, ::FnMin, ::FnMax + 1 )
         ::SendMsg( PBM_SETPOS, nPos + 1, 0 )
         ::SendMsg( PBM_SETRANGE32, ::FnMin, ::FnMax )
         ::SendMsg( PBM_SETPOS, nPos, 0 )
      ENDIF
   ENDIF

   IF lEvents
      ::OnChange( nPos )
   ENDIF

RETURN nPos

//--------------------------------------------------------------------------

METHOD StepIt() CLASS XProgressBar

   IF XA_IsVistaOrHigher()
      ::SetPos( ::FnValue + ::FnStep )
   ELSE
      ::FnValue += ::FnStep
      ::SendMsg( PBM_STEPIT, 0, 0 )
   ENDIF

RETURN Nil

//--------------------------------------------------------------------------

METHOD SetMarquee( lOn, nSpeed ) CLASS XProgressBar

   IF lOn != Nil
      ::ChangeCtlStyle( PBS_MARQUEE, lOn )
      ::FlMarquee := lOn
   ENDIF

   IF nSpeed != Nil
      ::FnMarqueeSpeed := nSpeed
   ENDIF

   ::SendMsg( PBM_SETMARQUEE, ::FlMarquee, ::FnMarqueeSpeed )

RETURN IIf( nSpeed == Nil, ::FlMarquee, ::FnMarqueeSpeed )

//--------------------------------------------------------------------------

#pragma BEGINDUMP

#include <windows.h>
#include <commctrl.h>
#include <xailer.h>

//--------------------------------------------------------------------------

HB_FUNC_STATIC( XPROGRESSBAR_GETRANGE )
{
   PHB_ITEM Self = hb_stackSelfItem();
   HWND hwnd = GetHandleOf( Self );
   PBRANGE range;

   SendMessage( hwnd, PBM_GETRANGE, 0, (LPARAM) &range );

   hb_reta( 2 );
   hb_storvnl( range.iLow,  -1, 1 );
   hb_storvnl( range.iHigh, -1, 2 );
}

#pragma ENDDUMP

//--------------------------------------------------------------------------
