/*
 * Xailer source code:
 *
 * Label.prg
 * Clase TLabel()
 *
 * Copyright 2003, 2007 Jose F. Gimenez
 * Copyright 2003, 2007 Xailer.com
 * All rights reserved
 *
 */

#include "Xailer.ch"


//--------------------------------------------------------------------------

CLASS XLabel FROM TControl

PUBLISHED:
   PROPERTY cText       WRITE METHOD SetText
   PROPERTY nWidth      INIT 90
   PROPERTY nHeight     INIT 18

   PROPERTY nAlignment   INIT taLEFT   WRITE INLINE ( ::Refresh(), ::FnAlignment := Value )  VALUES taLEFT, taRIGHT, taCENTER
   PROPERTY nVAlignment  INIT vaTOP    WRITE INLINE ( ::Refresh(), ::FnVAlignment := Value ) VALUES vaTOP, vaBOTTOM, vaCENTER
   PROPERTY nBorderStyle INIT bvNONE
   PROPERTY nBorderSides
   PROPERTY lTransparent INIT .T.
   PROPERTY nOpacity     INIT 0
   PROPERTY lAutoSize    INIT .T. WRITE INLINE ::FlAutoSize := Value, IIf( Value, ::Adjust(), )
   PROPERTY lMultiLine   INIT .F. WRITE INLINE ::FlMultiLine := Value, ::Adjust()
   PROPERTY lPathStyle   INIT .F. WRITE INLINE ::FlPathStyle := Value, ::Adjust()

PROTECTED:
   DATA nClassStyle INIT CS_DBLCLKS

PUBLIC:
   PROPERTY lEnabled

   METHOD Create( oParent ) CONSTRUCTOR

   METHOD Adjust() INLINE IIf( ::FlAutoSize .AND. ! Empty( ::Handle ), ::CalcBounds(), ) // --> Nil

RESERVED:
	METHOD SetText( cText )
   METHOD CalcBounds()
   METHOD WMEraseBkgnd()   INLINE 1
   METHOD WMPaint()

ENDCLASS

//--------------------------------------------------------------------------

METHOD Create( oParent ) CLASS XLabel

   ::Super:Create( oParent )
   ::Adjust()

RETURN Self

//--------------------------------------------------------------------------

METHOD SetText( cText ) CLASS XLabel

   ::Super:SetText( cText )
   IF ! Empty( ::Handle )
      IF ! ::FlMultiLine
         ::FlMultiLine := ! Empty( cText ) .AND. At( CRLF, cText ) > 0
      ENDIF
      ::Adjust()
      ::Refresh()
   ENDIF

RETURN cText

//--------------------------------------------------------------------------

#pragma BEGINDUMP

#include "windows.h"
#include "xailer.h"
#include "constants.ch"

//--------------------------------------------------------------------------

HB_FUNC_STATIC( XLABEL_CALCBOUNDS )
{
   PHB_ITEM Self = hb_stackSelfItem();
   HWND hWnd = GetHandleOf( Self );
   char * cText;
   UINT nTextLen, nFormat = 0, nMargin = 0;
   HDC hdc = (HDC) GetDC( hWnd );
   RECT rect;

   cText = XA_ObjGetCLen( Self, "cText", &nTextLen );
   if ( nTextLen )
      {
      GetClientRect( hWnd, &rect );

      switch ( XA_ObjGetNL( Self, "nBorderStyle" ) )
         {
         case bvFLAT:
         case bvHALFRAISED:
         case bvHALFSUNKEN: nMargin = 1; break;
         case bvRAISED:
         case bvSUNKEN:
         case bvBUMP:
         case bvETCHED:
         case bvWIN10: nMargin = 2; break;
         }

      rect.top += nMargin;
      rect.left += nMargin;
      rect.right -= nMargin + 1;
      rect.bottom -= nMargin + 1;

      SelectObject( hdc, (HFONT) GetHandleOf( XA_ObjGetItem( Self, "oFont" ) ) );

      if( XA_ObjGetL( Self, "lMultiline" ) )
         nFormat |= DT_WORDBREAK;

      switch ( XA_ObjGetNL( Self, "nAlignment" ) )
         {
         case taRIGHT:  nFormat |= DT_RIGHT; break;
         case taCENTER: nFormat |= DT_CENTER; break;
         }

      DrawText( hdc, cText, nTextLen, &rect, nFormat | DT_CALCRECT );

      hb_vmPushDynSym( hb_dynsymFindName( "SetBounds" ) );
      hb_vmPush( Self );
      hb_vmPushNil();
      hb_vmPushNil();
      hb_vmPushLong( rect.right + nMargin + 1 );
      hb_vmPushLong( rect.bottom + nMargin + 1 );
      hb_vmPushLogical( TRUE );
      hb_vmSend( 5 );
      }

   ReleaseDC( hWnd, hdc );
   hb_ret();
}

//--------------------------------------------------------------------------

HB_FUNC_STATIC( XLABEL_WMPAINT )
{
   PHB_ITEM Self = hb_stackSelfItem();
   HWND hWnd = GetHandleOf( Self );
   CONTROLPAINT cp;
   RECT rect;

   if ( XA_ControlBeginPaint( Self, hWnd, &cp, (HDC) hb_parnl( 1 ) ) )
      {
      GetClientRect( hWnd, &rect );
      XA_DrawControlBackground( Self, cp.hDC, &rect );
      XA_DrawControlText( Self, cp.hDC, &rect, XA_ObjGetL( Self, "lMultiline" ) ? DT_WORDBREAK : ( XA_ObjGetL( Self, "lAutoSize" ) ? 0 : ( XA_ObjGetL( Self, "lPathStyle" ) ? DT_PATH_ELLIPSIS : DT_END_ELLIPSIS ) ) );
      }
   XA_ControlEndPaint( Self, hWnd, &cp );

   hb_retnl( 0 );
}

//--------------------------------------------------------------------------

#pragma ENDDUMP
