Leaked source code of windows server 2003
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

// 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);
}