/*
 * Xailer source code:
 *
 * BrwRecSel.prg
 * Clase TBrwRecSel()
 *
 * Copyright 2003, 2007 Ignacio Ortiz de Zúñiga
 * Copyright 2003, 2007 Xailer.com
 * All rights reserved
 *
 */

#include "Xailer.ch"

#define COL_EXTRAWIDTH   6
#define ROW_EXTRAHEIGHT  4


//--------------------------------------------------------------------------

CLASS XBrwRecSel FROM TComponent

PUBLISHED:
   PROPERTY oFont          READ GetFont   WRITE SetFont  EDITOR PE_Font AS TFont

   PROPERTY nClrText       INIT clBlack   WRITE METHOD SetClrText    EDITOR PE_Color
   PROPERTY nClrPane       INIT clBtnFace WRITE METHOD SetClrPane    EDITOR PE_Color
   PROPERTY nAlignment     INIT taLEFT    WRITE METHOD SetAlignment  VALUES taLEFT, taRIGHT, taCENTER
   PROPERTY nBmpAlignment  INIT taLEFT VALUES taLEFT, taRIGHT
   PROPERTY nWidth         INIT 24   READ METHOD GetWidth WRITE METHOD SetWidth
   PROPERTY nBmpMargin     INIT 10
   PROPERTY lRecordPointer INIT .T. WRITE METHOD SetRecordPointer
   PROPERTY lParentFont    INIT .T. WRITE INLINE ::SetFont( Nil, Value )

   EVENT OnClick( oSender, nFlags, nPosX, nPosY ) // --> Nil
   EVENT OnRClick( oSender, nFlags, nPosX, nPosY ) // --> Nil
   EVENT OnDblClick( oSender, nFlags, nPosX, nPosY ) // --> Nil
   EVENT OnGetData( oSender, @cText, @nImage, lSelected ) // --> Nil | cString

PUBLIC:
   PROPERTY nHeight        INIT 0   READ METHOD GetHeight
   PROPERTY oForm          READONLY READ INLINE ::oParent:oForm

   METHOD Create( oParent ) CONSTRUCTOR
   METHOD Free()

PUBLIC: //(TBrwowse friend methods)

   METHOD Adjust() // --> Nil
   METHOD Paint( hDC, nRow, nHeight, lSelected ) // --> Nil
   METHOD Erase( hDC, nRow, nHeight ) // --> Nil

RESERVED:
   METHOD XAClick() VIRTUAL

PROTECTED:
   DATA oImgListRow
   DATA hClrText
   DATA hClrPane
   DATA nDrawTextStyle
   DATA Handle INIT 0

   METHOD GetWidth()
   METHOD SetWidth( nValue )
   METHOD GetHeight()
   METHOD SetClrText( Value )
   METHOD SetClrPane( Value )
   METHOD SetAlignment( nValue )
   METHOD DefStyle()
   METHOD SetRecordPointer( Value )
   METHOD GetFont() EXTERN XControl_GetFont()
   METHOD SetFont() EXTERN XControl_SetFont()

ENDCLASS

//--------------------------------------------------------------------------

METHOD Create( oParent ) CLASS XBrwRecSel

   ::Super:Create( oParent )

   IF ::oParent != Nil
      ::oParent:oRecSel := Self
   ENDIF

RETURN Self

//--------------------------------------------------------------------------

METHOD Adjust() CLASS XBrwRecSel

   LOCAL hBmp

   ::GetWidth()

   IF ::oImgListRow == Nil
      ::oImgListRow := TImageList():Create( ::oParent, 15, 15 )
      ::oImgListRow:Add( OBM_MNARROW )
      hBmp := BmpNewRecord()
      ::oImgListRow:Add( hBmp )
      DeleteObject( hBmp )
   ENDIF

   ::SetClrText( ::FnClrText, .F. )
   ::SetClrPane( ::FnClrPane, .F. )
   ::SetAlignment( ::FnAlignment, .F. )

RETURN Nil

//--------------------------------------------------------------------------

METHOD Free() CLASS XBrwRecSel

   IF ::hClrText != Nil
      DeleteObject( ::hClrText )
      ::hClrText := Nil
   ENDIF

   IF ::hClrPane != Nil
      DeleteObject( ::hClrPane )
      ::hClrPane := Nil
   ENDIF

   IF ::oImgListRow != Nil
      ::oImgListRow:Destroy()
      ::oImgListRow := Nil
   ENDIF

RETURN Nil

//--------------------------------------------------------------------------

METHOD GetWidth() CLASS XBrwRecSel

   LOCAL cText, cLine
   LOCAL nWidth, nImage
   LOCAL xRet

   IF Empty( ::FnWidth )

      nWidth := 0
      cText  := ""
      nImage := 0

      xRet := ::OnGetData( @cText, @nImage, .F. )

      IF xRet != Nil
         cText := xRet
      ENDIF

      IF ! Empty( cText )
         nWidth := ::GetFont():GetTextWidth( cText, ::oParent )
      ENDIF

      IF ! Empty( nImage )
         nWidth += ( ::oParent:oImageList:nWidth + ::nBmpMargin )
      ENDIF

      IF ! Empty( nWidth )
         nWidth += COL_EXTRAWIDTH
      ELSE
         nWidth := ::oParent:nHeaderHeight
      ENDIF

      ::FnWidth := nWidth

   ENDIF

RETURN ::FnWidth

//--------------------------------------------------------------------------

METHOD SetWidth( nValue, lRefresh ) CLASS XBrwRecSel

   DEFAULT lRefresh TO .T.

   nValue := Max( nValue, 10  )

   ::FnWidth := nValue

   IF lRefresh .AND. ! Empty( ::oParent:Handle ) .AND. ::oParent:lRedraw
      ::oParent:GetDisplayCols()
      ::oParent:Refresh()
   ENDIF

RETURN Nil

//--------------------------------------------------------------------------

METHOD GetHeight() CLASS XBrwRecSel

   LOCAL cText, xRet
   LOCAL nHeight, nImage

   cText   := ""
   nHeight := 0
   nImage  := 0

   xRet := ::OnGetData( @cText, @nImage, .F. )

   IF xRet != Nil
      cText := xRet
   ENDIF

   IF ! Empty( cText )
      nHeight := ::GetFont():GetTextHeight( "B", ::oParent )
   ENDIF

   IF ! Empty( nImage )
      nHeight := Max( nHeight, ::oParent:oImageList:nHeight )
   ENDIF

RETURN nHeight

//--------------------------------------------------------------------------

METHOD Paint( hDC, nRow, nHeight, lSelected ) CLASS XBrwRecSel

   LOCAL cText, xRet
   LOCAL nWidth, nCol, nImage, nTemp
   LOCAL nBmpWidth, nBmpHeight, nBmpCol, nBmpRow
   LOCAL hOldFont
   LOCAL nOldClr, nOldBk

   ::Erase( hDC, nRow, nHeight )

   DEFAULT lSelected TO .F.

   cText  := ""
   nImage := 0
   nWidth := ::nWidth - 4
   nCol   := 0

   IF ::lRecordPointer
      nWidth -= 12
   ENDIF

   nCol    += Int( COL_EXTRAWIDTH / 2 )
   nWidth  -= COL_EXTRAWIDTH
   nRow    += Int( ROW_EXTRAHEIGHT / 2 )
   nHeight -= ROW_EXTRAHEIGHT

   xRet := ::OnGetData( @cText, @nImage, lSelected )

   IF xRet != Nil
      cText := xRet
   ENDIF

   WITH OBJECT ::oParent

      IF nImage > 0 .AND. :oImageList != Nil
         nBmpWidth  := :oImageList:nWidth
         nBmpHeight := :oImageList:nHeight
         nWidth     -= nBmpWidth
         IF Empty( cText )
            nBmpCol := nCol + Max( ( nWidth - nBmpWidth ) / 2, 0 )
         ELSEIF ::nBmpAlignment == taLEFT
            nBmpCol := nCol
            nCol    += nBmpWidth + ::nBmpMargin
         ELSE
            nBmpCol := nCol + nWidth
         ENDIF
         nWidth  -= ::nBmpMargin
         IF nWidth < 0
            nBmpWidth := ::nWidth - COL_EXTRAWIDTH
         ENDIF
         nBmpRow := nRow + Max( ( nHeight - nBmpHeight ) / 2, 0 )
         XBrowse_DrawBmp( :oImageList:Handle, nImage, hDC, ;
                          nBmpCol, nBmpRow, nBmpWidth, ;
                          nBmpHeight, ::nClrPane )
      ENDIF

      IF ! Empty( cText )
         hOldFont := SelectObject( hDC, ::GetFont():Handle )
         nOldClr := SetTextColor( hDC, ::nClrText )
         nOldBk := SetBkColor( hDC, ::nClrPane )
         DrawText( hDC, cText, ;
                   { nCol, nRow, nCol + nWidth, nRow + nHeight }, ;
                   ::nDrawTextStyle )
         SelectObject( hDC, hOldFont )
         SetTextColor( hDC, nOldClr )
         SetBkColor( hDC, nOldBk )
      ENDIF

   END WITH

   IF ::lRecordPointer .AND. lSelected
      nTemp := nRow + ( nHeight / 2 ) - 8
      nImage := IIf( ::oParent:nEditMode >= beAPPEND, 2, 1 )
      XBrowse_DrawBmp( ::oImgListRow:Handle, nImage, hDC, ::FnWidth - 17, nTemp, 12, 12, ::nClrPane )
   ENDIF

RETURN Nil

//--------------------------------------------------------------------------

METHOD Erase( hDC, nRow, nHeight, lComplete ) CLASS XBrwRecSel

   LOCAL nTemp := 0

   DEFAULT lComplete TO .F.

   IF nHeight <= ::oParent:nIntRowHeight .AND. ! lComplete
      WITH OBJECT ::oParent
         IF :nRowDividerStyle > blNOLINES
            nHeight -= 2
            nTemp += 2
         ENDIF
      END WITH
   ENDIF

   FillRect( hDC, { 0, nRow, ::nWidth - 2, nRow + nHeight  }, ::hClrPane )

   IF nTemp > 0
      FillRect( hDC, { 0, nRow + nHeight, 2, nRow + nHeight + nTemp }, ::hClrPane )
      FillRect( hDC, { ::nWidth - 4, nRow + nHeight, ::nWidth-2, nRow + nHeight + nTemp }, ::hClrPane )
   ENDIF

RETURN Nil

//--------------------------------------------------------------------------

METHOD SetClrText( Value, lRefresh ) CLASS XBrwRecSel

   DEFAULT lRefresh TO .T.

   IF ::hClrText != Nil
      DeleteObject( ::hClrText )
   ENDIF

   ::FnClrText := Value
   ::hClrText  := CreateSolidBrush( ::FnClrText )

   IF lRefresh .AND. !Empty( ::oParent:Handle ) .AND. ::oParent:lRedraw
      ::oParent:Refresh()
   ENDIF

RETURN Nil

//--------------------------------------------------------------------------

METHOD SetClrPane( Value, lRefresh ) CLASS XBrwRecSel

   DEFAULT lRefresh TO .T.

   IF ::hClrPane != Nil
      DeleteObject( ::hClrPane )
   ENDIF

   ::FnClrPane := Value
   ::hClrPane  := CreateSolidBrush( ::FnClrPane )

   IF lRefresh .AND. ! Empty( ::oParent:Handle ) .AND. ::oParent:lRedraw
      ::oParent:Refresh()
   ENDIF

RETURN Nil

//--------------------------------------------------------------------------

METHOD DefStyle() CLASS XBrwRecSel

   LOCAL nStyle, nAlign

   nAlign := ::FnAlignment
   nStyle := nOr( DT_EDITCONTROL, DT_SINGLELINE, DT_VCENTER )

   DO CASE
      CASE nAlign == taLEFT
         nStyle  := nOr( nStyle, DT_LEFT )
      CASE nAlign == taRIGHT
         nStyle  := nOr( nStyle, DT_RIGHT )
      CASE nAlign == taCENTER
         nStyle  := nOr( nStyle, DT_CENTER )
   ENDCASE

   ::nDrawTextStyle := nStyle

RETURN nStyle

//--------------------------------------------------------------------------

METHOD SetAlignment( nValue, lRefresh ) CLASS XBrwRecSel

   DEFAULT lRefresh TO .T.

   ::FnAlignment := nValue

   ::DefStyle()

   IF lRefresh .AND. ! Empty( ::oParent:Handle ) .AND. ::oParent:lRedraw
      ::oParent:Refresh()
   ENDIF

RETURN ::FnAlignment

//--------------------------------------------------------------------------

METHOD SetRecordPointer( Value, lRefresh ) CLASS XBrwRecSel

   DEFAULT lRefresh TO .T.

   ::FlRecordPointer := Value

   IF lRefresh .AND. ! Empty( ::oParent:Handle ) .AND. ::oParent:lRedraw
      ::oParent:Refresh()
   ENDIF

RETURN ::FlRecordPointer

//--------------------------------------------------------------------------

#pragma BEGINDUMP

#include "Windows.h"
#include "Xailer.h"

static unsigned char BmpNewRecord[224] = {
	0x28, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00,
	0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00,
	0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0xFF, 0x00,
	0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00,
	0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xD0,
	0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xD0, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xD0,
	0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xD0, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xD0,
	0xDD, 0xDD, 0xD7, 0x0D, 0x07, 0xDD, 0xDD, 0xD0, 0xDD, 0xDD, 0xDD, 0x70, 0x7D, 0xDD, 0xDD, 0xD0,
	0xDD, 0xDD, 0x70, 0x00, 0x00, 0x7D, 0xDD, 0xD0, 0xDD, 0xDD, 0xDD, 0x70, 0x7D, 0xDD, 0xDD, 0xD0,
	0xDD, 0xDD, 0xD7, 0x0D, 0x07, 0xDD, 0xDD, 0xD0, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xD0,
	0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xD0, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xD0,
	0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xD0, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xD0
};

HB_FUNC_STATIC( BMPNEWRECORD )
{
   hb_retnl( (long) CreateBitmapFromData( BmpNewRecord ) );
}

#pragma ENDDUMP

//------------------------------------------------------------------------------
