/*
 * Xailer source code:
 *
 * ListViewColumn.prg
 * Clase para manejo de las columnas de un control TListView
 *
 * Copyright 2003, 2009 Ignacio Ortiz de Zúñiga
 * Copyright 2003, 2009 Xailer.com
 * All rights reserved
 *
 */

#include "Xailer.ch"
#include "CommCtrl.api"

//------------------------------------------------------------------------------

CLASS XListViewColumn FROM TComponent

PUBLISHED:
   PROPERTY cText      INIT ""     WRITE METHOD SetText
   PROPERTY nAlignment INIT taLEFT WRITE METHOD SetAlignment  VALUES taLEFT, taCENTER, taRIGHT
   PROPERTY nWidth     INIT 100    WRITE METHOD SetWidth READ METHOD GetWidth
   PROPERTY nImage     INIT 0      WRITE METHOD SetImage EDITOR PE_ImageIndex

PUBLIC:
   PROPERTY nIndex

   METHOD New( oParent, nPos ) CONSTRUCTOR
   METHOD Create( oParent )    CONSTRUCTOR
   METHOD Free()               INLINE ::oParent := Nil

RESERVED:
   METHOD InsertInList()

PROTECTED:
   METHOD SetText( Value )
   METHOD SetAlignment( Value )
   METHOD SetWidth( Value )
   METHOD GetWidth( Value )
   METHOD SetImage( Value )

ENDCLASS

//------------------------------------------------------------------------------

METHOD New( oParent, nPos ) CLASS XListViewColumn

   ::Super:New( oParent )

   IF PCount() == 2
      ::FnIndex := nPos
   ENDIF

RETURN Self

//------------------------------------------------------------------------------

METHOD Create( oParent ) CLASS XListViewColumn

   ::Super:Create( oParent )

   IF ::FnIndex == Nil
      ::FnIndex := Len( ::oParent:aColumns ) + 1
   ENDIF

   IF ::oParent:lCreated
      ::InsertInList()
   ENDIF

RETURN Self

//------------------------------------------------------------------------------

#pragma BEGINDUMP

#define HB_OS_WIN_32_USED
#define _WIN32_IE 0x0560

#include <windows.h>
#include <commctrl.h>
#include <Xailer.h>
#include <constants.ch>

//------------------------------------------------------------------------------

HB_FUNC_STATIC( XLISTVIEWCOLUMN_INSERTINLIST )
{
   PHB_ITEM Self = hb_stackSelfItem();
   HWND hWnd     = GetHandleOf( XA_ObjGetItem( Self, "oParent" ) );
   int nIndex    = XA_ObjGetNL( Self, "FnIndex" ) - 1;
   int nImage    = XA_ObjGetNL( Self, "FnImage" ) - 1;
   int nAlign    = XA_ObjGetNL( Self, "FnAlignment" );
   int nWidth    = XA_ObjGetNL( Self, "FnWidth" );
   char * cText  = XA_ObjGetC( Self, "FcText" );
   LVCOLUMN lvc;

   memset( &lvc, 0, sizeof( lvc ) );

   lvc.mask = LVCF_ORDER | LVCF_SUBITEM | LVCF_WIDTH | LVCF_FMT;
   lvc.fmt  = LVCFMT_JUSTIFYMASK;
   lvc.cx = nWidth;
   lvc.iSubItem = nIndex;
   lvc.iOrder = nIndex;

   switch( nAlign )
      {
      case taLEFT:   lvc.fmt = LVCFMT_LEFT; break;
      case taCENTER: lvc.fmt = LVCFMT_CENTER; break;
      case taRIGHT:  lvc.fmt = LVCFMT_RIGHT; break;
      }

   if( cText )
      {
      lvc.mask |= LVCF_TEXT;
      lvc.pszText = cText;
      lvc.cchTextMax = strlen( cText );
      }

   if( nImage > -1 )
      {
      lvc.mask |= LVCF_IMAGE;
      lvc.iImage = nImage;
      }

   nIndex = SendMessage( hWnd, LVM_INSERTCOLUMN, nIndex, (LPARAM) &lvc );
   hb_retni( nIndex );
}

//------------------------------------------------------------------------------

HB_FUNC_STATIC( XLISTVIEWCOLUMN_SETTEXT )
{
   PHB_ITEM Self = hb_stackSelfItem();
   BOOL lCreated = XA_ObjGetL( Self, "lCreated" );
   char * cText  = (LPSTR) hb_parc( 1 );

   if( lCreated )
      {
      HWND hWnd  = GetHandleOf( XA_ObjGetItem( Self, "oParent" ) );
      int nIndex = XA_ObjGetNL( Self, "FnIndex" ) - 1;
      LVCOLUMN lvc;

      memset( &lvc, 0, sizeof( lvc ) );

      lvc.mask = LVCF_TEXT;
      lvc.pszText = cText;
      lvc.cchTextMax = strlen( cText );

      SendMessage( hWnd, LVM_SETCOLUMN, nIndex, (LPARAM) &lvc );
      }

   XA_ObjSendC( Self, "_FcText", cText );
   hb_retc( cText );
}

//------------------------------------------------------------------------------

HB_FUNC_STATIC( XLISTVIEWCOLUMN_SETALIGNMENT )
{
   PHB_ITEM Self    = hb_stackSelfItem();
   BOOL lCreated = XA_ObjGetL( Self, "lCreated" );
   int nAlign       = hb_parni( 1 );

   if( lCreated )
      {
      HWND hWnd     = GetHandleOf( XA_ObjGetItem( Self, "oParent" ) );
      int nIndex    = XA_ObjGetNL( Self, "FnIndex" ) - 1;
      int nImage    = XA_ObjGetNL( Self, "nImage" ) - 1;
      LVCOLUMN lvc;

      memset( &lvc, 0, sizeof( lvc ) );
      lvc.mask = LVCF_FMT | LVCF_IMAGE;
      lvc.fmt = LVCFMT_IMAGE;
      lvc.iImage = nImage;

      switch( nAlign )
         {
         case taLEFT:   lvc.fmt |= LVCFMT_LEFT; break;
         case taCENTER: lvc.fmt |= LVCFMT_CENTER; break;
         case taRIGHT:  lvc.fmt |= LVCFMT_RIGHT; break;
         }

      SendMessage( hWnd, LVM_SETCOLUMN, nIndex, (LPARAM) &lvc );
      }

   XA_ObjSendNL( Self, "_FnAlignment", nAlign );
   hb_retni( nAlign );
}

//------------------------------------------------------------------------------

HB_FUNC_STATIC( XLISTVIEWCOLUMN_SETWIDTH )
{
   PHB_ITEM Self    = hb_stackSelfItem();
   BOOL lCreated = XA_ObjGetL( Self, "lCreated" );
   int nWidth       = hb_parni( 1 );

   if( lCreated )
      {
      HWND hWnd  = GetHandleOf( XA_ObjGetItem( Self, "oParent" ) );
      int nIndex = XA_ObjGetNL( Self, "FnIndex" ) - 1;
      SendMessage( hWnd, LVM_SETCOLUMNWIDTH, nIndex, (LPARAM) nWidth );
      }

   XA_ObjSendNL( Self, "_FnWidth", nWidth );
   hb_retni( nWidth );
}

//------------------------------------------------------------------------------

HB_FUNC_STATIC( XLISTVIEWCOLUMN_GETWIDTH )
{
   PHB_ITEM Self    = hb_stackSelfItem();
   BOOL lCreated = XA_ObjGetL( Self, "lCreated" );
   int nWidth       = XA_ObjGetNL( Self, "FnWidth" );

   if( lCreated )
      {
      HWND hWnd  = GetHandleOf( XA_ObjGetItem( Self, "oParent" ) );
      int nIndex = XA_ObjGetNL( Self, "FnIndex" ) - 1;
      nWidth = ListView_GetColumnWidth( hWnd, nIndex );
      XA_ObjSendNL( Self, "_FnWidth", nWidth );
      }

   hb_retni( nWidth );
}

//------------------------------------------------------------------------------

HB_FUNC_STATIC( XLISTVIEWCOLUMN_SETIMAGE )
{
   PHB_ITEM Self    = hb_stackSelfItem();
   BOOL lCreated = XA_ObjGetL( Self, "lCreated" );
   int nImage       = hb_parni( 1 ) - 1;

   if( lCreated )
      {
      HWND hWnd     = GetHandleOf( XA_ObjGetItem( Self, "oParent" ) );
      int nIndex    = XA_ObjGetNL( Self, "FnIndex" ) - 1;
      LVCOLUMN lvc;

      memset( &lvc, 0, sizeof( lvc ) );
      lvc.mask   = LVCF_IMAGE;
      lvc.iImage = nImage;
      SendMessage( hWnd, LVM_SETCOLUMN, nIndex, (LPARAM) &lvc );
      }

   XA_ObjSendNL( Self, "_FnImage", nImage + 1 );
   hb_retni( nImage + 1 );
}

//------------------------------------------------------------------------------

#pragma ENDDUMP
