You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
297 lines
8.3 KiB
297 lines
8.3 KiB
// ListRow.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "certmap.h"
|
|
#include "ListRow.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
|
|
#define SZ_RES_COLOR_PREFS "Control Panel\\Colors"
|
|
#define SZ_RES_COLOR_HILITE "Hilight"
|
|
#define SZ_RES_COLOR_HILITETEXT "HilightText"
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CListSelRowCtrl
|
|
//-----------------------------------------------------------------------------------
|
|
CListSelRowCtrl::CListSelRowCtrl():
|
|
m_StartDrawingCol( 0 )
|
|
{
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------------
|
|
CListSelRowCtrl::~CListSelRowCtrl()
|
|
{
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------------
|
|
BEGIN_MESSAGE_MAP(CListSelRowCtrl, CListCtrl)
|
|
//{{AFX_MSG_MAP(CListSelRowCtrl)
|
|
ON_WM_LBUTTONDOWN()
|
|
ON_WM_LBUTTONDBLCLK()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
//-----------------------------------------------------------------------------------
|
|
void CListSelRowCtrl::GetHiliteColors()
|
|
{
|
|
// get the hilite color
|
|
m_colorHilite = GetSysColor( COLOR_HIGHLIGHT );
|
|
|
|
// get the hilited text color
|
|
m_colorHiliteText = GetSysColor( COLOR_HIGHLIGHTTEXT );
|
|
}
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CListSelRowCtrl message handlers
|
|
|
|
//-----------------------------------------------------------------------------------
|
|
void CListSelRowCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
|
|
{
|
|
CRect rcItem = lpDrawItemStruct->rcItem;
|
|
CRect rcSection;
|
|
UINT itemID = lpDrawItemStruct->itemID;
|
|
UINT cpLeft = rcItem.left;
|
|
CString sz;
|
|
LV_COLUMN colData;
|
|
COLORREF colorTextOld;
|
|
COLORREF colorBackOld;
|
|
|
|
// setup the CDC object
|
|
CDC cdc;
|
|
cdc.Attach( lpDrawItemStruct->hDC );
|
|
|
|
#ifdef _DEBUG
|
|
if ( m_StartDrawingCol == 0 )
|
|
sz.Empty();
|
|
#endif
|
|
|
|
// clear the columnd buffer
|
|
ZeroMemory( &colData, sizeof(colData) );
|
|
colData.mask = LVCF_WIDTH;
|
|
|
|
// if this is the selected item, prepare the background and the text color
|
|
BOOL fSelected = lpDrawItemStruct->itemState & ODS_SELECTED;
|
|
if ( fSelected )
|
|
{
|
|
GetHiliteColors();
|
|
colorTextOld = cdc.SetTextColor( m_colorHiliteText );
|
|
colorBackOld = cdc.SetBkColor( m_colorHilite );
|
|
}
|
|
|
|
// starting with the m_StartDrawingCol column, draw the columns
|
|
// do it in a loop, just skipping until we hit m_StartDrawingCol
|
|
DWORD iCol = 0;
|
|
while ( GetColumn(iCol, &colData) )
|
|
{
|
|
// see if we are ready yet
|
|
if ( iCol < m_StartDrawingCol )
|
|
{
|
|
// set the new left.
|
|
cpLeft += colData.cx;
|
|
// increment the column counter
|
|
iCol++;
|
|
continue;
|
|
}
|
|
|
|
// prepare the background but once
|
|
if ( iCol == m_StartDrawingCol )
|
|
{
|
|
// prepare the background
|
|
rcSection = rcItem;
|
|
rcSection.left = cpLeft;
|
|
rcSection.right--;
|
|
CBrush brush;
|
|
if ( lpDrawItemStruct->itemState & ODS_SELECTED )
|
|
brush.CreateSolidBrush( m_colorHilite );
|
|
else
|
|
brush.CreateSolidBrush( GetSysColor( COLOR_WINDOW ) );
|
|
cdc.FillRect( &rcSection, &brush );
|
|
}
|
|
|
|
|
|
// display the name
|
|
sz = GetItemText( itemID, iCol );
|
|
if ( !sz.IsEmpty() )
|
|
{
|
|
// figure out the sectional rect
|
|
rcSection = rcItem;
|
|
rcSection.left = cpLeft + 2;
|
|
rcSection.right = cpLeft + colData.cx - 1;
|
|
|
|
// fit the string into the required space
|
|
FitString( sz, rcSection.right - rcSection.left, &cdc );
|
|
|
|
//draw the string
|
|
cdc.DrawText( sz, &rcSection, DT_SINGLELINE|DT_LEFT|DT_BOTTOM|DT_NOPREFIX );
|
|
}
|
|
|
|
// set the new left.
|
|
cpLeft += colData.cx;
|
|
// increment the column counter
|
|
iCol++;
|
|
}
|
|
|
|
// if this is the selected item, restore the colors
|
|
if ( fSelected )
|
|
{
|
|
cdc.SetTextColor( colorTextOld );
|
|
cdc.SetBkColor( colorBackOld );
|
|
}
|
|
|
|
// cleanup the CDC object
|
|
cdc.Detach();
|
|
}
|
|
|
|
|
|
//------------------------------------------------------------------------
|
|
void CListSelRowCtrl::FitString( CString &sz, int cpWidth, CDC* pcdc )
|
|
{
|
|
CSize size;
|
|
UINT cch;
|
|
CString szEllipsis;
|
|
|
|
// start by testing the existing width
|
|
size = pcdc->GetTextExtent( sz );
|
|
if ( size.cx <= cpWidth ) return;
|
|
|
|
// initialize szTrunc and szEllipsis
|
|
cch = sz.GetLength();
|
|
|
|
szEllipsis.LoadString(IDS_ELLIPSIS);
|
|
|
|
// while we are too big, truncate one letter and add an ellipsis
|
|
while( (size.cx > cpWidth) && (cch > 1) )
|
|
{
|
|
// chop off the last letter of the string - not counting the ...
|
|
cch--;
|
|
sz = sz.Left( cch );
|
|
|
|
// add the elipsis (spelling?)
|
|
sz += szEllipsis;
|
|
|
|
// get the length
|
|
size = pcdc->GetTextExtent( sz );
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------
|
|
void CListSelRowCtrl::HiliteSelectedCells()
|
|
{
|
|
int iList = -1;
|
|
while( (iList = GetNextItem( iList, LVNI_SELECTED )) >= 0 )
|
|
HiliteSelectedCell( iList );
|
|
}
|
|
|
|
//------------------------------------------------------------------------
|
|
void CListSelRowCtrl::HiliteSelectedCell( int iCell, BOOL fHilite )
|
|
{
|
|
// if there is no selected cell, do nothing
|
|
if ( iCell < 0 )
|
|
return;
|
|
|
|
// get the rect to draw
|
|
CRect rect;
|
|
if ( !FGetCellRect(iCell, -1, &rect) )
|
|
{
|
|
ASSERT(FALSE);
|
|
return;
|
|
}
|
|
|
|
// get the client rect
|
|
CRect rectClient;
|
|
GetClientRect( rectClient );
|
|
|
|
// make sure it fits ok (problems can occur here when scrolled)
|
|
// don't want it to draw in the column titles
|
|
if ( rect.top < (rect.bottom - rect.top) )
|
|
return;
|
|
|
|
// now prepare to draw
|
|
CDC *pdc = GetDC();
|
|
|
|
// clip to the client area
|
|
pdc->IntersectClipRect( rectClient );
|
|
|
|
// set up the brush
|
|
CBrush cbrush;
|
|
if ( fHilite )
|
|
cbrush.CreateSolidBrush( RGB(192,192,192) );
|
|
else
|
|
cbrush.CreateSolidBrush( RGB(0xFF,0xFF,0xFF) );
|
|
|
|
// draw the hilite rect
|
|
pdc->FrameRect( rect, &cbrush );
|
|
|
|
// cleanup
|
|
ReleaseDC( pdc );
|
|
}
|
|
|
|
//------------------------------------------------------------------------
|
|
BOOL CListSelRowCtrl::FGetCellRect( LONG iRow, LONG iCol, CRect *pcrect )
|
|
{
|
|
// first, get the rect that the list thinks is appropriate
|
|
if ( !GetItemRect(iRow, pcrect, LVIR_BOUNDS) )
|
|
return FALSE;
|
|
|
|
// if iCol < 0, then return the total size of the row
|
|
if ( iCol < 0 )
|
|
return TRUE;
|
|
|
|
// trim the horizontal dimension to the correct column positioning
|
|
LONG cpLeft;
|
|
LONG cpRight = 0;
|
|
for ( WORD i = 0; i <= iCol; i++ )
|
|
{
|
|
// set the left side
|
|
cpLeft = cpRight;
|
|
|
|
// get the right
|
|
LONG cpWidth = GetColumnWidth(i);
|
|
if ( cpWidth < 0 ) return FALSE;
|
|
cpRight += cpWidth;
|
|
}
|
|
|
|
// well, now trim it seeing as we have the right values
|
|
pcrect->left = cpLeft;
|
|
pcrect->right = cpRight;
|
|
|
|
// success!
|
|
return TRUE;
|
|
}
|
|
|
|
#define MAKE_LPARAM(x,y) ( ((unsigned long)(y)<<16) | ((unsigned long)(x)) )
|
|
|
|
//------------------------------------------------------------------------
|
|
void CListSelRowCtrl::OnLButtonDblClk(UINT nFlags, CPoint point)
|
|
{
|
|
// force the point to be in the right place
|
|
point.x = 6;
|
|
LPARAM lp = MAKE_LPARAM(point.x, point.y);
|
|
// DefWindowProc(WM_LBUTTONDBLCLK, nFlags, lp );
|
|
CListCtrl::OnLButtonDblClk( nFlags, point);
|
|
}
|
|
|
|
//------------------------------------------------------------------------
|
|
void CListSelRowCtrl::OnLButtonDown(UINT nFlags, CPoint point)
|
|
{
|
|
point.x = 6;
|
|
LPARAM lp = MAKE_LPARAM(point.x, point.y);
|
|
// DefWindowProc(WM_LBUTTONDOWN, nFlags, lp );
|
|
CListCtrl::OnLButtonDown( nFlags, point);
|
|
}
|