WindowsXP-SP1/admin/hmonitor/snapin/splitpaneresultsview.cpp
2020-09-30 16:53:49 +02:00

628 lines
16 KiB
C++

// SplitPaneResultsView.cpp: implementation of the CSplitPaneResultsView class.
//
//////////////////////////////////////////////////////////////////////
// Copyright (c) 2000 Microsoft Corporation
//
// 04/06/00 v-marfin 62935 : Show "OK" Instead of "Reset" in the upper pane only
#include "stdafx.h"
#include "snapin.h"
#include "SplitPaneResultsView.h"
#include "HealthmonResultsPane.h"
#include "HMListViewColumn.h"
#include "HMResultsPaneItem.h"
#include "HMScopeItem.h"
#include "HealthmonScopePane.h"
#include "HMObject.h"
#include "EventManager.h"
#include "HMGraphView.h"
#include "DataElement.h"
#include "Rule.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
IMPLEMENT_DYNCREATE(CSplitPaneResultsView,CResultsPaneView)
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CSplitPaneResultsView::CSplitPaneResultsView()
{
}
CSplitPaneResultsView::~CSplitPaneResultsView()
{
Destroy();
}
//////////////////////////////////////////////////////////////////////
// Create/Destroy
//////////////////////////////////////////////////////////////////////
bool CSplitPaneResultsView::Create(CScopePaneItem* pOwnerItem)
{
TRACEX(_T("CSplitPaneResultsView::Create\n"));
TRACEARGn(pOwnerItem);
if( ! CResultsPaneView::Create(pOwnerItem) )
{
TRACE(_T("FAILED : CResultsPaneView::Create failed.\n"));
return false;
}
return true;
}
//////////////////////////////////////////////////////////////////////
// Results Pane Item Members
//////////////////////////////////////////////////////////////////////
void CSplitPaneResultsView::RemoveItem(int iIndex)
{
TRACEX(_T("CSplitPaneResultsView::RemoveItem\n"));
TRACEARGn(iIndex);
if( iIndex >= m_ResultItems.GetSize() || iIndex < 0 )
{
TRACE(_T("FAILED : iIndex is out of array bounds.\n"));
return;
}
CResultsPaneItem* pItem = m_ResultItems[iIndex];
if( ! GfxCheckObjPtr(pItem,CResultsPaneItem) )
{
TRACE(_T("FAILED : pItem is not a valid results pane item pointer.\n"));
return;
}
// for each pane showing this results view, delete the item from it
for( int i=0; i < m_ResultsPanes.GetSize(); i++ )
{
if( GfxCheckObjPtr(m_ResultsPanes[i],CResultsPane) )
{
pItem->RemoveItem(m_ResultsPanes[i]);
}
}
delete pItem;
m_ResultItems.RemoveAt(iIndex);
}
//////////////////////////////////////////////////////////////////////
// MMC Notify Handlers
//////////////////////////////////////////////////////////////////////
HRESULT CSplitPaneResultsView::OnGetResultViewType(CString& sViewType,long& lViewOptions)
{
TRACEX(_T("CSplitPaneResultsView::OnGetResultViewType\n"));
TRACEARGs(sViewType);
TRACEARGn(lViewOptions);
sViewType = _T("{668E5408-8E05-11D2-8ADA-0000F87A3912}");
lViewOptions = MMC_VIEW_OPTIONS_NOLISTVIEWS;
return S_OK;
}
HRESULT CSplitPaneResultsView::OnShow(CResultsPane* pPane, BOOL bSelecting, HSCOPEITEM hScopeItem)
{
TRACEX(_T("CSplitPaneResultsView::OnShow\n"));
TRACEARGn(pPane);
TRACEARGn(bSelecting);
TRACEARGn(hScopeItem);
if( ! GfxCheckObjPtr(pPane,CHealthmonResultsPane) )
{
TRACE(_T("FAILED : pPane is not a valid pointer.\n"));
return E_FAIL;
}
CHealthmonResultsPane* pHMRP = (CHealthmonResultsPane*)pPane;
// set the description bar text
LPRESULTDATA pIResultData = pHMRP->GetResultDataPtr();
if( pIResultData )
{
CString sDescription;
sDescription.LoadString(IDS_STRING_HEALTHMON_RESULTSPANE);
pIResultData->SetDescBarText((LPTSTR)(LPCTSTR)sDescription);
pIResultData->Release();
}
HRESULT hr = S_OK;
_DHMListView* pUpperList = NULL;
// get upper list control
pUpperList = pHMRP->GetUpperListCtrl();
if( ! pUpperList )
{
TRACE(_T("FAILED : CHealthmonResultsPane::GetUpperListCtrl returned a NULL pointer.\n"));
return E_FAIL;
}
_DHMListView* pLowerList = NULL;
// get lower list control
pLowerList = pHMRP->GetLowerListCtrl();
if( ! pLowerList )
{
TRACE(_T("FAILED : CHealthmonResultsPane::GetLowerListCtrl returned a NULL pointer.\n"));
return E_FAIL;
}
_DHMListView* pStatsList = NULL;
// get stats list control
pStatsList = pHMRP->GetStatsListCtrl();
if( ! pLowerList )
{
TRACE(_T("FAILED : CHealthmonResultsPane::GetLowerListCtrl returned a NULL pointer.\n"));
return E_FAIL;
}
for( int i = 0; i < m_ResultItems.GetSize(); i++ )
{
delete m_ResultItems[i];
}
m_ResultItems.RemoveAll();
pUpperList->DeleteAllItems();
pLowerList->DeleteAllItems();
pStatsList->DeleteAllItems();
CScopePaneItem* pOwnerScopeItem = GetOwnerScopeItem();
if( ! pOwnerScopeItem || ! GfxCheckObjPtr(pOwnerScopeItem,CHMScopeItem) )
{
TRACE(_T("FAILED : CResultsPaneView::GetOwnerScopeItem returns NULL pointer.\n"));
return E_FAIL;
}
CHMObject* pObject = ((CHMScopeItem*)(pOwnerScopeItem))->GetObjectPtr();
if( ! pObject )
{
return E_FAIL;
}
if( bSelecting )
{
CString sText;
sText.Format(IDS_STRING_CHILDREN_OF_FORMAT,pOwnerScopeItem->GetDisplayName());
pUpperList->SetTitle(sText);
// v-marfin 62935 : Show "OK" Instead of "Reset" in the upper pane only
CString sOK;
sOK.LoadString(IDS_STRING_OK);
CString sReset;
sReset.LoadString(IDS_STRING_RESET);
// add the children of the selected scope item to the upper pane
for( int i = 0; i < pOwnerScopeItem->GetChildCount(); i++ )
{
CScopePaneItem* pChildScopeItem = pOwnerScopeItem->GetChild(i);
CHMResultsPaneItem* pItem = new CHMResultsPaneItem;
CStringArray saNames;
saNames.Copy(pChildScopeItem->GetDisplayNames());
// v-marfin 62935 : Show "OK" Instead of "Reset" in the upper pane only
if (saNames.GetSize() > 1)
{
CString sTest = saNames.GetAt(1);
if (saNames.GetAt(1)==sReset)
{
saNames.SetAt(1,sOK);
}
}
CUIntArray iaIconIds;
iaIconIds.Copy(pChildScopeItem->GetIconIds());
if( ! pItem->Create(this,saNames,iaIconIds,pChildScopeItem->GetIconIndex()) )
{
TRACE(_T("FAILED : CHMResultsPaneItem::Create failed.\n"));
return false;
}
pItem->SetToUpperPane();
m_ResultItems.Add(pItem);
}
sText.Format(IDS_STRING_COUNT_OF_FORMAT,pOwnerScopeItem->GetChildCount());
pUpperList->SetDescription(sText);
hr = AddEvents(pHMRP);
if( ! CHECKHRESULT(hr) )
{
TRACE(_T("FAILED : CResultsPaneView::OnShow failed.\n"));
}
hr = CResultsPaneView::OnShow(pPane,bSelecting,hScopeItem);
if( ! CHECKHRESULT(hr) )
{
TRACE(_T("FAILED : CResultsPaneView::OnShow failed.\n"));
}
hr = AddStatistics(pHMRP);
if( ! CHECKHRESULT(hr) )
{
TRACE(_T("FAILED : CResultsPaneView::OnShow failed.\n"));
}
USES_CONVERSION;
CString sOrder = AfxGetApp()->GetProfileString(A2T(pObject->GetRuntimeClass()->m_lpszClassName),_T("UpperColumnOrder"));
if( ! sOrder.IsEmpty() && sOrder != pUpperList->GetColumnOrder() )
{
pUpperList->SetColumnOrder(sOrder);
}
sOrder = AfxGetApp()->GetProfileString(A2T(pObject->GetRuntimeClass()->m_lpszClassName),_T("LowerColumnOrder"));
if( ! sOrder.IsEmpty() && sOrder != pLowerList->GetColumnOrder() )
{
pLowerList->SetColumnOrder(sOrder);
}
}
else
{
hr = CResultsPaneView::OnShow(pPane,bSelecting,hScopeItem);
int iUpperColCount = 0;
int iLowerColCount = 0;
for( int i=0; i < GetColumnCount(); i++ )
{
CHMListViewColumn* pColumn = (CHMListViewColumn*)GetColumn(i);
if( pColumn )
{
if( pColumn->IsUpperPane() )
{
pColumn->SaveWidth(pPane,iUpperColCount++);
}
if( pColumn->IsLowerPane() )
{
pColumn->SaveWidth(pPane,iLowerColCount++);
}
}
}
USES_CONVERSION;
CString sOrder = pUpperList->GetColumnOrder();
AfxGetApp()->WriteProfileString(A2T(pObject->GetRuntimeClass()->m_lpszClassName),_T("UpperColumnOrder"),sOrder);
sOrder.Empty();
sOrder = pLowerList->GetColumnOrder();
AfxGetApp()->WriteProfileString(A2T(pObject->GetRuntimeClass()->m_lpszClassName),_T("LowerColumnOrder"),sOrder);
sOrder.Empty();
for( i = 0; i < GetColumnCount(); i++ )
{
CHMListViewColumn* pColumn = (CHMListViewColumn*)GetColumn(i);
if( pColumn->IsUpperPane() )
{
pUpperList->DeleteColumn(0);
}
if( pColumn->IsLowerPane() )
{
pLowerList->DeleteColumn(0);
}
if( pColumn->IsStatsPane() )
{
pStatsList->DeleteColumn(0);
}
}
// clean up lower list control
pLowerList->DeleteAllItems();
// clean up stats list control
pStatsList->DeleteAllItems();
RemoveStatistics(pHMRP);
}
return S_OK;
}
void CSplitPaneResultsView::AddStatistic(CEventContainer* pContainer, CStatistics* pStatistic, bool bUpdateGraph /*=true*/)
{
TRACEX(_T("CSplitPaneResultsView::AddStatistic\n"));
TRACEARGn(pContainer);
TRACEARGn(pStatistic);
// insert item at top of stats list for this statistic
AddItem(pStatistic->CreateResultsPaneItem(this));
if( bUpdateGraph )
{
CHMScopeItem* pHMItem = (CHMScopeItem*)GetOwnerScopeItem();
if( ! GfxCheckObjPtr(pHMItem,CHMScopeItem) )
{
TRACE(_T("FAILED : pPane is not a valid pointer.\n"));
return;
}
CHMObject* pObject = pHMItem->GetObjectPtr();
if( !pObject || ! GfxCheckObjPtr(pObject,CHMObject) )
{
return;
}
for( int i = 0; i < GetResultsPanesCount(); i++ )
{
CHealthmonResultsPane* pPane = (CHealthmonResultsPane*)GetResultsPane(i);
if( pPane )
{
_DHMGraphView* pGraphView = pPane->GetGraphViewCtrl();
if( pGraphView )
{
pPane->GetGraphViewSink()->SetResultsViewPtr(this);
long lCurrentStyle = pGraphView->GetStyle();
pGraphView->Clear();
if( lCurrentStyle & HMGVS_CURRENT )
{
pGraphView->SetStyle(HMGVS_CURRENT|HMGVS_GROUP);
}
if( lCurrentStyle & HMGVS_HISTORIC )
{
pGraphView->SetStyle(HMGVS_HISTORIC|HMGVS_GROUP);
}
pGraphView->SetName(pObject->GetName());
}
CEventContainer* pContainer = NULL;
EvtGetEventManager()->GetEventContainer(pObject->GetSystemName(),pObject->GetGuid(),pContainer);
if( pContainer )
{
for(int i = 0; i < pContainer->GetStatisticsCount(); i++ )
{
if( i > pContainer->GetStatisticsCount()-10 )
{
CStatistics* pStat = pContainer->GetStatistic(i);
if( pStat )
{
pStat->UpdateGraph(pGraphView);
}
}
}
}
}
}
}
}
inline HRESULT CSplitPaneResultsView::AddEvents(CHealthmonResultsPane* pPane)
{
TRACEX(_T("CSplitPaneResultsView::AddEvents\n"));
CScopePaneItem* pSPI = GetOwnerScopeItem();
if( ! pSPI->IsKindOf(RUNTIME_CLASS(CHMScopeItem)) )
{
return S_FALSE;
}
CHMScopeItem* pHMItem = (CHMScopeItem*)pSPI;
if( ! GfxCheckObjPtr(pPane,CHealthmonResultsPane) )
{
TRACE(_T("FAILED : pPane is not a valid pointer.\n"));
return E_FAIL;
}
CString sText;
sText.Format(IDS_STRING_EVENTS_OF_FORMAT,pSPI->GetDisplayName());
pPane->GetLowerListCtrl()->SetTitle(sText);
CHMObject* pObject = pHMItem->GetObjectPtr();
if( !pObject || ! GfxCheckObjPtr(pObject,CHMObject) )
{
return E_FAIL;
}
CEventContainer* pContainer = NULL;
EvtGetEventManager()->GetEventContainer(pObject->GetSystemName(),pObject->GetGuid(),pContainer);
if( pContainer )
{
for(int i = 0; i < pContainer->GetEventCount(); i++ )
{
CEvent* pEvent = pContainer->GetEvent(i);
if( pEvent )
{
CHMEventResultsPaneItem* pEventItem = pEvent->CreateResultsPaneItem(this);
m_ResultItems.Add(pEventItem);
}
}
}
sText.Format(IDS_STRING_COUNT_OF_FORMAT,pContainer->GetEventCount());
pPane->GetLowerListCtrl()->SetDescription(sText);
return S_OK;
}
inline HRESULT CSplitPaneResultsView::AddStatistics(CHealthmonResultsPane* pPane)
{
TRACEX(_T("CSplitPaneResultsView::AddStatistics\n"));
CScopePaneItem* pSPI = GetOwnerScopeItem();
if( ! pSPI->IsKindOf(RUNTIME_CLASS(CHMScopeItem)) )
{
return S_FALSE;
}
CHMScopeItem* pHMItem = (CHMScopeItem*)pSPI;
if( ! GfxCheckObjPtr(pPane,CHealthmonResultsPane) )
{
TRACE(_T("FAILED : pPane is not a valid pointer.\n"));
return E_FAIL;
}
CString sText;
sText.Format(IDS_STRING_STATISTICS_FOR,pSPI->GetDisplayName());
pPane->GetStatsListCtrl()->SetTitle(sText);
CHMObject* pObject = pHMItem->GetObjectPtr();
if( !pObject || ! GfxCheckObjPtr(pObject,CHMObject) )
{
return E_FAIL;
}
_DHMGraphView* pGraphView = pPane->GetGraphViewCtrl();
if( pGraphView )
{
pPane->GetGraphViewSink()->SetResultsViewPtr(this);
long lCurrentStyle = pGraphView->GetStyle();
pGraphView->Clear();
if( lCurrentStyle & HMGVS_CURRENT )
{
pGraphView->SetStyle(HMGVS_CURRENT|HMGVS_GROUP);
}
if( lCurrentStyle & HMGVS_HISTORIC )
{
pGraphView->SetStyle(HMGVS_HISTORIC|HMGVS_GROUP);
}
pGraphView->SetName(pObject->GetName());
}
CEventContainer* pContainer = NULL;
EvtGetEventManager()->GetEventContainer(pObject->GetSystemName(),pObject->GetGuid(),pContainer);
if( pContainer )
{
for(int i = 0; i < pContainer->GetStatisticsCount(); i++ )
{
if( i > pContainer->GetStatisticsCount()-10 )
{
CStatistics* pStat = pContainer->GetStatistic(i);
if( pStat )
{
AddStatistic(pContainer,pStat,i==pContainer->GetStatisticsCount()-1);
}
}
}
}
sText.Format(IDS_STRING_COUNT_OF_FORMAT,pContainer->GetStatisticsCount());
pPane->GetStatsListCtrl()->SetDescription(sText);
return S_OK;
}
inline HRESULT CSplitPaneResultsView::RemoveStatistics(CHealthmonResultsPane* pPane)
{
TRACEX(_T("CSplitPaneResultsView::RemoveStatistics\n"));
CScopePaneItem* pSPI = GetOwnerScopeItem();
if( ! pSPI->IsKindOf(RUNTIME_CLASS(CHMScopeItem)) )
{
return S_FALSE;
}
CHMScopeItem* pHMItem = (CHMScopeItem*)pSPI;
if( ! GfxCheckObjPtr(pPane,CHealthmonResultsPane) )
{
TRACE(_T("FAILED : pPane is not a valid pointer.\n"));
return E_FAIL;
}
CHMObject* pObject = pHMItem->GetObjectPtr();
if( !pObject || ! GfxCheckObjPtr(pObject,CHMObject) )
{
return E_FAIL;
}
pPane->GetGraphViewSink()->SetResultsViewPtr(NULL);
if(pPane->GetGraphViewCtrl())
{
pPane->GetGraphViewCtrl()->Clear();
}
CString sWaiting;
sWaiting.LoadString(IDS_STRING_WAITING);
pPane->GetStatsListCtrl()->SetTitle(sWaiting);
return S_OK;
}
//////////////////////////////////////////////////////////////////////
// GraphView Events Members
//////////////////////////////////////////////////////////////////////
void CSplitPaneResultsView::OnGraphViewStyleChange(_DHMGraphView* pGraphView)
{
if( ! pGraphView )
{
ASSERT(FALSE);
return;
}
CScopePaneItem* pSPI = GetOwnerScopeItem();
if( ! pSPI->IsKindOf(RUNTIME_CLASS(CHMScopeItem)) )
{
return;
}
CHMScopeItem* pHMItem = (CHMScopeItem*)pSPI;
CHMObject* pObject = pHMItem->GetObjectPtr();
if( !pObject || ! GfxCheckObjPtr(pObject,CHMObject) )
{
return;
}
pGraphView->SetName(pObject->GetName());
CEventContainer* pContainer = NULL;
EvtGetEventManager()->GetEventContainer(pObject->GetSystemName(),pObject->GetGuid(),pContainer);
if( pContainer )
{
for(int i = 0; i < pContainer->GetStatisticsCount(); i++ )
{
if( i > pContainer->GetStatisticsCount()-10 )
{
CStatistics* pStat = pContainer->GetStatistic(i);
if( pStat )
{
AddStatistic(pContainer,pStat);
}
}
}
}
}