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.
 
 
 
 
 
 

442 lines
15 KiB

//////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2002 Microsoft Corporation. All rights reserved.
// Copyright (c) 2002 OSR Open Systems Resources, Inc.
//
// ListCtrlEx.cpp : implementation file
//////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include <tchar.h>
#include <wmistr.h>
#include <initguid.h>
extern "C" {
#include <evntrace.h>
}
#include <traceprt.h>
#include "TraceView.h"
#include "LogSession.h"
#include "DisplayDlg.h"
#include "ListCtrlEx.h"
#include "LogSessionDlg.h"
// CListCtrlEx
IMPLEMENT_DYNAMIC(CListCtrlEx, CListCtrl)
CListCtrlEx::CListCtrlEx()
: CListCtrl()
{
//
// Initialize flag for suspending list control updates
// See SuspendUpdates() function
//
m_bSuspendUpdates = FALSE;
}
CListCtrlEx::~CListCtrlEx()
{
}
void CListCtrlEx::DoDataExchange(CDataExchange* pDX)
{
CListCtrl::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CListCtrlEx, CListCtrl)
//{{AFX_MSG_MAP(CLogSessionDlg)
ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CListCtrlEx::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
{
CLogSession *pLogSession = NULL;
CLogSessionDlg *pDialog = NULL;
CDisplayDlg *pDisplayDlg = NULL;
LVITEM item;
//
// the structure is actually a NMLVCUSTOMDRAW that
// specifies what the custom draw action is attempting
// to do. We need to cast the generic pNMHDR pointer.
//
LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)pNMHDR;
int iCol = lplvcd->iSubItem;
int iRow = (int)lplvcd->nmcd.dwItemSpec;
switch(lplvcd->nmcd.dwDrawStage) {
case CDDS_PREPAINT:
//
// ask for subitem notifications.
//
*pResult = CDRF_NOTIFYSUBITEMDRAW;
break;
case CDDS_ITEMPREPAINT:
//
// ask for subitem notifications.
//
*pResult = CDRF_NOTIFYSUBITEMDRAW;
break;
case CDDS_ITEMPREPAINT|CDDS_SUBITEM:
//
// recd when CDRF_NOTIFYSUBITEMDRAW is returned in
// response to CDDS_ITEMPREPAINT.
//
*pResult = CDRF_NEWFONT;
//
// Default text is black on white background
//
lplvcd->clrTextBk = RGB(255, 255, 255);
lplvcd->clrText = RGB(0, 0, 0);
if((iCol == 0) && (iRow < GetItemCount())) {
item.iItem = iRow;
item.state = LVIF_PARAM;
item.mask = LVIF_PARAM;
CListCtrl::GetItem(&item);
pLogSession = (CLogSession *)item.lParam;
//
// Go with the default if no session found
//
if(NULL == pLogSession) {
return;
}
//
// Set the text color
//
lplvcd->clrText = pLogSession->m_titleTextColor;
lplvcd->clrTextBk = pLogSession->m_titleBackgroundColor;
return;
} else if(iRow < GetItemCount()) {
item.iItem = iRow;
item.state = LVIF_PARAM;
item.mask = LVIF_PARAM;
CListCtrl::GetItem(&item);
pLogSession = (CLogSession *)item.lParam;
//
// Go with the default if no session found
//
if(NULL == pLogSession) {
return;
}
//
// These fields are always grayed out as they cannot be
// altered directly by the user
//
pDialog = (CLogSessionDlg *)GetParent();
if(pDialog == NULL) {
return;
}
if(State == pDialog->m_retrievalArray[iCol]) {
lplvcd->clrTextBk = RGB(255, 255, 255);
lplvcd->clrText = RGB(145, 145, 145);
//
// Update the state text whenever we get here
//
if(pLogSession->m_logSessionValues[pDialog->m_retrievalArray[iCol]].Compare(CListCtrl::GetItemText(iRow, iCol))) {
CListCtrl::SetItemText(iRow, iCol, pLogSession->m_logSessionValues[pDialog->m_retrievalArray[iCol]]);
}
return;
}
if(EventCount == pDialog->m_retrievalArray[iCol]) {
lplvcd->clrTextBk = RGB(255, 255, 255);
lplvcd->clrText = RGB(145, 145, 145);
pDisplayDlg = pLogSession->GetDisplayWnd();
if(NULL == pDisplayDlg) {
return;
}
//
// Update the event count text whenever we get here
//
pLogSession->m_logSessionValues[EventCount].Format(_T("%d"), pDisplayDlg->m_totalEventCount);
if(pLogSession->m_logSessionValues[EventCount].Compare(CListCtrl::GetItemText(iRow, iCol))) {
CListCtrl::SetItemText(iRow, iCol, pLogSession->m_logSessionValues[EventCount]);
}
return;
}
if(LostEvents == pDialog->m_retrievalArray[iCol]) {
lplvcd->clrTextBk = RGB(255, 255, 255);
lplvcd->clrText = RGB(145, 145, 145);
pDisplayDlg = pLogSession->GetDisplayWnd();
if(NULL == pDisplayDlg) {
return;
}
//
// Update the event count text whenever we get here
//
pLogSession->m_logSessionValues[LostEvents].Format(_T("%d"), pDisplayDlg->m_totalEventsLost);
if(pLogSession->m_logSessionValues[LostEvents].Compare(CListCtrl::GetItemText(iRow, iCol))) {
CListCtrl::SetItemText(iRow, iCol, pLogSession->m_logSessionValues[LostEvents]);
}
return;
}
if(BuffersRead == pDialog->m_retrievalArray[iCol]) {
lplvcd->clrTextBk = RGB(255, 255, 255);
lplvcd->clrText = RGB(145, 145, 145);
pDisplayDlg = pLogSession->GetDisplayWnd();
if(NULL == pDisplayDlg) {
return;
}
//
// Update the event count text whenever we get here
//
pLogSession->m_logSessionValues[BuffersRead].Format(_T("%d"), pDisplayDlg->m_totalBuffersRead);
if(pLogSession->m_logSessionValues[BuffersRead].Compare(CListCtrl::GetItemText(iRow, iCol))) {
CListCtrl::SetItemText(iRow, iCol, pLogSession->m_logSessionValues[BuffersRead]);
}
return;
}
//
// Update all log session parameters if necessary
//
//
// Flags
//
if(Flags == pDialog->m_retrievalArray[iCol]) {
if(pLogSession->m_logSessionValues[Flags].Compare(CListCtrl::GetItemText(iRow, iCol))) {
CListCtrl::SetItemText(iRow, iCol, pLogSession->m_logSessionValues[Flags]);
}
}
//
// FlushTime
//
if(FlushTime == pDialog->m_retrievalArray[iCol]) {
if(pLogSession->m_logSessionValues[FlushTime].Compare(CListCtrl::GetItemText(iRow, iCol))) {
CListCtrl::SetItemText(iRow, iCol, pLogSession->m_logSessionValues[FlushTime]);
}
}
//
// MaximumBuffers
//
if(MaximumBuffers == pDialog->m_retrievalArray[iCol]) {
if(pLogSession->m_logSessionValues[MaximumBuffers].Compare(CListCtrl::GetItemText(iRow, iCol))) {
CListCtrl::SetItemText(iRow, iCol, pLogSession->m_logSessionValues[MaximumBuffers]);
}
}
//
// MinimumBuffers
//
if(MinimumBuffers == pDialog->m_retrievalArray[iCol]) {
if(pLogSession->m_logSessionValues[MinimumBuffers].Compare(CListCtrl::GetItemText(iRow, iCol))) {
CListCtrl::SetItemText(iRow, iCol, pLogSession->m_logSessionValues[MinimumBuffers]);
}
}
//
// BufferSize
//
if(BufferSize == pDialog->m_retrievalArray[iCol]) {
if(pLogSession->m_logSessionValues[BufferSize].Compare(CListCtrl::GetItemText(iRow, iCol))) {
CListCtrl::SetItemText(iRow, iCol, pLogSession->m_logSessionValues[BufferSize]);
}
}
//
// DecayTime
//
if(DecayTime == pDialog->m_retrievalArray[iCol]) {
if(pLogSession->m_logSessionValues[DecayTime].Compare(CListCtrl::GetItemText(iRow, iCol))) {
CListCtrl::SetItemText(iRow, iCol, pLogSession->m_logSessionValues[DecayTime]);
}
}
//
// Circular
//
if(Circular == pDialog->m_retrievalArray[iCol]) {
if(pLogSession->m_logSessionValues[Circular].Compare(CListCtrl::GetItemText(iRow, iCol))) {
CListCtrl::SetItemText(iRow, iCol, pLogSession->m_logSessionValues[Circular]);
}
}
//
// Sequential
//
if(Sequential == pDialog->m_retrievalArray[iCol]) {
if(pLogSession->m_logSessionValues[Sequential].Compare(CListCtrl::GetItemText(iRow, iCol))) {
CListCtrl::SetItemText(iRow, iCol, pLogSession->m_logSessionValues[Sequential]);
}
}
//
// NewFile
//
if(NewFile == pDialog->m_retrievalArray[iCol]) {
if(pLogSession->m_logSessionValues[NewFile].Compare(CListCtrl::GetItemText(iRow, iCol))) {
CListCtrl::SetItemText(iRow, iCol, pLogSession->m_logSessionValues[NewFile]);
}
}
//
// GlobalSequence
//
if(GlobalSequence == pDialog->m_retrievalArray[iCol]) {
if(pLogSession->m_logSessionValues[GlobalSequence].Compare(CListCtrl::GetItemText(iRow, iCol))) {
CListCtrl::SetItemText(iRow, iCol, pLogSession->m_logSessionValues[GlobalSequence]);
}
}
//
// LocalSequence
//
if(LocalSequence == pDialog->m_retrievalArray[iCol]) {
if(pLogSession->m_logSessionValues[LocalSequence].Compare(CListCtrl::GetItemText(iRow, iCol))) {
CListCtrl::SetItemText(iRow, iCol, pLogSession->m_logSessionValues[LocalSequence]);
}
}
//
// Level
//
if(Level == pDialog->m_retrievalArray[iCol]) {
if(pLogSession->m_logSessionValues[Level].Compare(CListCtrl::GetItemText(iRow, iCol))) {
CListCtrl::SetItemText(iRow, iCol, pLogSession->m_logSessionValues[Level]);
}
}
//
// If this is a kernel logger session, then gray out
// the flags field
//
if((Flags == pDialog->m_retrievalArray[iCol]) &&
(!_tcscmp(pLogSession->GetDisplayName(), _T("NT Kernel Logger")))) {
lplvcd->clrTextBk = RGB(255, 255, 255);
lplvcd->clrText = RGB(145, 145, 145);
return;
}
//
// If the trace session is not active all fields are
// shown with default
//
if(!pLogSession->m_bTraceActive) {
return;
}
//
// For existing logfile trace sessions we opt
// for default
//
if(pLogSession->m_bDisplayExistingLogFileOnly) {
return;
}
//
// If the trace session is active, we gray out
// any fields that cannot be updated while active.
//
if((Flags != pDialog->m_retrievalArray[iCol]) &&
(MaximumBuffers != pDialog->m_retrievalArray[iCol]) &&
(FlushTime != pDialog->m_retrievalArray[iCol])) {
lplvcd->clrTextBk = RGB(255, 255, 255);
lplvcd->clrText = RGB(145, 145, 145);
return;
}
}
//
// Default text is black on white background
//
lplvcd->clrTextBk = RGB(255, 255, 255);
lplvcd->clrText = RGB(0, 0, 0);
break;
default:
*pResult = CDRF_DODEFAULT;
}
}
int CListCtrlEx::InsertItem(int nItem, LPCTSTR lpszItem, CLogSession *pLogSession)
{
//
// We don't allow NULL item data
//
if(pLogSession == NULL) {
return 0;
}
//
// Insert the item into the list with
// the log session as item data
//
return CListCtrl::InsertItem(LVIF_TEXT | LVIF_PARAM,
nItem,
lpszItem,
LVIF_TEXT | LVIF_PARAM,
0,
0,
(LPARAM)pLogSession);
}
BOOL CListCtrlEx::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
LPNMHDR pNH = (LPNMHDR) lParam;
//
// wParam is zero for Header ctrl
//
if(wParam == 0 && pNH->code == NM_RCLICK) {
NMLISTVIEW NMListView;
NMListView.hdr.code = HDN_ITEMRCLICK;
NMListView.hdr.hwndFrom = m_hWnd;
NMListView.hdr.idFrom = GetDlgCtrlID();
CWnd* pWnd = GetParent();
pWnd->SendMessage(WM_NOTIFY,
GetDlgCtrlID(),
(LPARAM)&NMListView);
return TRUE;
}
return CListCtrl::OnNotify(wParam, lParam, pResult);
}
BOOL CListCtrlEx::RedrawItems(int nFirst, int nLast)
{
if(!m_bSuspendUpdates) {
return CListCtrl::RedrawItems(nFirst, nLast);
}
return FALSE;
}
void CListCtrlEx::UpdateWindow()
{
if(!m_bSuspendUpdates) {
CListCtrl::UpdateWindow();
}
}