529 lines
10 KiB
C++
529 lines
10 KiB
C++
// HMScopeItem.cpp: implementation of the CHMScopeItem class.
|
|
//
|
|
//////////////////////////////////////////////////////////////////////
|
|
//
|
|
// 04/07/00 v-marfin 62985 : do not allow paste into yourself
|
|
//
|
|
//
|
|
//
|
|
//
|
|
//
|
|
//
|
|
#include "stdafx.h"
|
|
#include "snapin.h"
|
|
#include "HMScopeItem.h"
|
|
#include "HMObject.h"
|
|
#include "ScopePane.h"
|
|
#include "SplitPaneResultsView.h"
|
|
#include "HMResultsPaneItem.h"
|
|
|
|
#ifdef _DEBUG
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[]=__FILE__;
|
|
#define new DEBUG_NEW
|
|
#endif
|
|
|
|
IMPLEMENT_DYNCREATE(CHMScopeItem,CScopePaneItem)
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// Construction/Destruction
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
CHMScopeItem::CHMScopeItem()
|
|
{
|
|
m_pObject = NULL;
|
|
m_sHelpTopic = _T("HMon21.chm::/ostart.htm");
|
|
}
|
|
|
|
CHMScopeItem::~CHMScopeItem()
|
|
{
|
|
CHMObject* pObject = GetObjectPtr();
|
|
if( pObject )
|
|
{
|
|
for( int i = 0; i < pObject->GetScopeItemCount(); i++ )
|
|
{
|
|
if( pObject->GetScopeItem(i) == this )
|
|
{
|
|
pObject->RemoveScopeItem(i);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
Destroy();
|
|
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// State Management
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
int CHMScopeItem::OnChangeChildState(int iNewState)
|
|
{
|
|
TRACEX(_T("CHMScopeItem::OnChangeChildState\n"));
|
|
TRACEARGn(iNewState);
|
|
|
|
// walk the list of children and determine the final state we should assume
|
|
for( int i = 0; i < m_Children.GetSize(); i++ )
|
|
{
|
|
CHMScopeItem* pItem = (CHMScopeItem*)(m_Children[i]);
|
|
int iItemState = pItem->GetIconIndex();
|
|
if( iItemState > iNewState )
|
|
{
|
|
if( iItemState == GetIconIndex() )
|
|
{
|
|
return iItemState;
|
|
}
|
|
else
|
|
{
|
|
iNewState = iItemState;
|
|
}
|
|
}
|
|
}
|
|
|
|
SetIconIndex(iNewState);
|
|
SetOpenIconIndex(iNewState);
|
|
SetItem();
|
|
|
|
// if the parent is an HMScopeItem, inform it of the state change
|
|
CHMScopeItem* pParentItem = (CHMScopeItem*)GetParent();
|
|
if( pParentItem && GfxCheckObjPtr(pParentItem,CHMScopeItem) )
|
|
{
|
|
pParentItem->OnChangeChildState(iNewState);
|
|
}
|
|
|
|
return iNewState;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// MMC-Related Item Members
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
bool CHMScopeItem::InsertItem( int iIndex )
|
|
{
|
|
TRACEX(_T("CHMScopeItem::InsertItem\n"));
|
|
|
|
bool bResult = CScopePaneItem::InsertItem(iIndex);
|
|
|
|
// if the parent is the current selected scope item
|
|
// and the parent's results view is of type CSplitPaneResultsView
|
|
// and there is no results item for this scope item in the split pane
|
|
// then add a new CHMResultsPaneItem to the results view for this scope item
|
|
|
|
CScopePane* pPane = GetScopePane();
|
|
|
|
if( pPane == NULL )
|
|
{
|
|
ASSERT(FALSE);
|
|
return bResult;
|
|
}
|
|
|
|
if( !pPane->GetSelectedScopeItem() || !GetParent() || pPane->GetSelectedScopeItem() != GetParent() )
|
|
{
|
|
return bResult;
|
|
}
|
|
|
|
CResultsPaneView* pView = GetParent()->GetResultsPaneView();
|
|
if( ! pView || ! pView->IsKindOf(RUNTIME_CLASS(CSplitPaneResultsView)) )
|
|
{
|
|
return bResult;
|
|
}
|
|
|
|
for( int i = 0; i < pView->GetItemCount(); i++ )
|
|
{
|
|
if( pView->GetItem(i)->GetDisplayName() == GetDisplayName() )
|
|
{
|
|
return bResult;
|
|
}
|
|
}
|
|
|
|
CHMResultsPaneItem* pHMRPI = new CHMResultsPaneItem;
|
|
CStringArray saNames;
|
|
saNames.Copy(GetDisplayNames());
|
|
CUIntArray iaIconIds;
|
|
iaIconIds.Copy(GetIconIds());
|
|
pHMRPI->Create(pView,saNames,iaIconIds,GetIconIndex());
|
|
pHMRPI->SetToUpperPane();
|
|
pView->AddItem(pHMRPI);
|
|
return bResult;
|
|
}
|
|
|
|
bool CHMScopeItem::DeleteItem()
|
|
{
|
|
TRACEX(_T("CHMScopeItem::DeleteItem\n"));
|
|
|
|
bool bResult = CScopePaneItem::DeleteItem();
|
|
|
|
return bResult;
|
|
}
|
|
|
|
bool CHMScopeItem::SetItem()
|
|
{
|
|
TRACEX(_T("CHMScopeItem::SetItem\n"));
|
|
|
|
bool bResult = CScopePaneItem::SetItem();
|
|
|
|
CScopePane* pPane = GetScopePane();
|
|
|
|
if( pPane == NULL )
|
|
{
|
|
ASSERT(FALSE);
|
|
return bResult;
|
|
}
|
|
|
|
if( !pPane->GetSelectedScopeItem() || !GetParent() || pPane->GetSelectedScopeItem() != GetParent() )
|
|
{
|
|
return bResult;
|
|
}
|
|
|
|
CResultsPaneView* pView = GetParent()->GetResultsPaneView();
|
|
if( ! pView || ! pView->IsKindOf(RUNTIME_CLASS(CSplitPaneResultsView)) )
|
|
{
|
|
return bResult;
|
|
}
|
|
|
|
for( int i = 0; i < pView->GetItemCount(); i++ )
|
|
{
|
|
if( pView->GetItem(i)->GetDisplayName() == GetDisplayName() )
|
|
{
|
|
CStringArray saNames;
|
|
saNames.Copy(GetDisplayNames());
|
|
CUIntArray iaIconIds;
|
|
iaIconIds.Copy(GetIconIds());
|
|
pView->GetItem(i)->SetDisplayNames(saNames);
|
|
pView->GetItem(i)->SetIconIds(iaIconIds);
|
|
pView->GetItem(i)->SetIconIndex(GetIconIndex());
|
|
return pView->UpdateItem(pView->GetItem(i)) && bResult;
|
|
}
|
|
}
|
|
|
|
return bResult;
|
|
}
|
|
|
|
HRESULT CHMScopeItem::WriteExtensionData(LPSTREAM pStream)
|
|
{
|
|
TRACEX(_T("CHMScopeItem::WriteExtensionData\n"));
|
|
TRACEARGn(pStream);
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
ULONG ulSize = GetObjectPtr()->GetSystemName().GetLength() + 1;
|
|
ulSize *= sizeof(TCHAR);
|
|
if( ! CHECKHRESULT(hr = pStream->Write(GetObjectPtr()->GetSystemName(), ulSize, NULL)) )
|
|
{
|
|
return hr;
|
|
}
|
|
|
|
ulSize = GetObjectPtr()->GetObjectPath().GetLength() + 1;
|
|
ulSize *= sizeof(TCHAR);
|
|
if( ! CHECKHRESULT(hr = pStream->Write(GetObjectPtr()->GetObjectPath(), ulSize, NULL)) )
|
|
{
|
|
return hr;
|
|
}
|
|
|
|
ulSize = GetObjectPtr()->GetGuid().GetLength() + 1;
|
|
ulSize *= sizeof(TCHAR);
|
|
if( ! CHECKHRESULT(hr = pStream->Write(GetObjectPtr()->GetGuid(), ulSize, NULL)) )
|
|
{
|
|
return hr;
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// MMC Notify Handlers
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
HRESULT CHMScopeItem::OnCutOrMove()
|
|
{
|
|
TRACEX(_T("CHMScopeItem::OnCutOrMove\n"));
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
/*if( ! CHECKHRESULT(hr = CHMScopeItem::OnCutOrMove()) )
|
|
{
|
|
return hr;
|
|
}*/
|
|
|
|
return hr;
|
|
}
|
|
|
|
HRESULT CHMScopeItem::OnCommand(long lCommandID)
|
|
{
|
|
TRACEX(_T("CHMScopeItem::OnCutOrMove\n"));
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
CHMObject* pObject = GetObjectPtr();
|
|
if( ! pObject )
|
|
{
|
|
return E_FAIL;
|
|
}
|
|
|
|
switch( lCommandID )
|
|
{
|
|
case IDM_CLEAR_EVENTS:
|
|
{
|
|
if( AfxMessageBox(IDS_STRING_WARN_CLEAR_EVENTS,MB_YESNO) == IDYES )
|
|
{
|
|
pObject->ClearEvents();
|
|
SelectItem();
|
|
}
|
|
}
|
|
break;
|
|
|
|
case IDM_RESET_STATUS:
|
|
{
|
|
pObject->ResetStatus();
|
|
}
|
|
break;
|
|
|
|
case IDM_RESET_STATISTICS:
|
|
{
|
|
pObject->ResetStatistics();
|
|
}
|
|
break;
|
|
|
|
case IDM_DISABLE_MONITORING:
|
|
{
|
|
if( pObject->IsEnabled() )
|
|
{
|
|
pObject->Disable();
|
|
}
|
|
else
|
|
{
|
|
pObject->Enable();
|
|
}
|
|
}
|
|
break;
|
|
|
|
case IDM_CHECK_NOW:
|
|
{
|
|
pObject->CheckNow();
|
|
}
|
|
break;
|
|
|
|
case IDM_ICON_LEGEND:
|
|
{
|
|
CScopePane* pPane = GetScopePane();
|
|
if( pPane )
|
|
{
|
|
hr = pPane->ShowTopic(_T("HMon21.chm::/cicons.htm"));
|
|
}
|
|
}
|
|
break;
|
|
|
|
default:
|
|
{
|
|
hr = CScopePaneItem::OnCommand(lCommandID);
|
|
}
|
|
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
HRESULT CHMScopeItem::OnDelete(BOOL bConfirm) // v-marfin 60298
|
|
{
|
|
TRACEX(_T("CHMScopeItem::OnDelete\n"));
|
|
|
|
HRESULT hr = CScopePaneItem::OnDelete();
|
|
if( ! CHECKHRESULT(hr) )
|
|
{
|
|
return hr;
|
|
}
|
|
|
|
CHMObject* pObject = GetObjectPtr();
|
|
|
|
if( ! pObject )
|
|
{
|
|
return E_FAIL;
|
|
}
|
|
|
|
CString sMsg;
|
|
sMsg.Format(IDS_STRING_WARN_DELETE,pObject->GetUITypeName(),pObject->GetUITypeName());
|
|
|
|
if ((bConfirm) && ( AfxMessageBox(sMsg,MB_YESNO) != IDYES ))
|
|
{
|
|
return S_FALSE;
|
|
}
|
|
|
|
// first query all the scope items and see if any have open property sheets
|
|
for( int i = 0; i < pObject->GetScopeItemCount(); i++ )
|
|
{
|
|
if( pObject->GetScopeItem(i)->IsPropertySheetOpen(true) )
|
|
{
|
|
AfxMessageBox(IDS_STRING_WARN_PROPPAGE_OPEN);
|
|
return S_OK;
|
|
}
|
|
}
|
|
|
|
for( i = pObject->GetScopeItemCount()-1; i >= 0 ; i-- )
|
|
{
|
|
CHMScopeItem* pParentItem = (CHMScopeItem*)pObject->GetScopeItem(i)->GetParent();
|
|
if( pParentItem && GfxCheckObjPtr(pParentItem,CHMScopeItem) )
|
|
{
|
|
pParentItem->DestroyChild(pObject->GetScopeItem(i));
|
|
pParentItem->OnChangeChildState(HMS_NORMAL);
|
|
|
|
if( i == 0 )
|
|
{
|
|
CHMObject* pParentObject = pParentItem->GetObjectPtr();
|
|
pParentObject->RemoveChild(pObject);
|
|
}
|
|
}
|
|
}
|
|
|
|
pObject->Destroy(true);
|
|
|
|
delete pObject;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT CHMScopeItem::OnExpand(BOOL bExpand)
|
|
{
|
|
TRACEX(_T("CHMScopeItem::OnExpand\n"));
|
|
TRACEARGn(bExpand);
|
|
|
|
if( ! GetObjectPtr() )
|
|
{
|
|
return E_FAIL;
|
|
}
|
|
|
|
if( GetChildCount() == 0 )
|
|
{
|
|
m_pObject->EnumerateChildren();
|
|
}
|
|
|
|
return CScopePaneItem::OnExpand(bExpand);;
|
|
}
|
|
|
|
HRESULT CHMScopeItem::OnPaste(LPDATAOBJECT pSelectedItems, LPDATAOBJECT* ppCopiedItems)
|
|
{
|
|
TRACEX(_T("CHMScopeItem::OnPaste\n"));
|
|
TRACEARGn(pSelectedItems);
|
|
TRACEARGn(ppCopiedItems);
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
if( ! CHECKHRESULT(hr = CScopePaneItem::OnPaste(pSelectedItems, ppCopiedItems)) )
|
|
{
|
|
return hr;
|
|
}
|
|
|
|
CSnapinDataObject* psdo = CSnapinDataObject::GetSnapinDataObject(pSelectedItems);
|
|
|
|
if( ! CHECKOBJPTR(psdo,RUNTIME_CLASS(CSnapinDataObject),sizeof(CSnapinDataObject)) )
|
|
{
|
|
return E_FAIL;
|
|
}
|
|
|
|
if( psdo->GetItemType() != CCT_SCOPE )
|
|
{
|
|
return E_FAIL;
|
|
}
|
|
|
|
CScopePaneItem* pItem = NULL;
|
|
if( ! psdo->GetItem(pItem) )
|
|
{
|
|
return E_FAIL;
|
|
}
|
|
|
|
ASSERT(pItem);
|
|
|
|
if( ! GetObjectPtr()->Paste(((CHMScopeItem*)pItem)->GetObjectPtr(),ppCopiedItems == NULL) )
|
|
{
|
|
return E_FAIL;
|
|
}
|
|
|
|
|
|
return hr;
|
|
}
|
|
|
|
HRESULT CHMScopeItem::OnQueryPaste(LPDATAOBJECT pDataObject)
|
|
{
|
|
TRACEX(_T("CHMScopeItem::OnQueryPaste\n"));
|
|
TRACEARGn(pDataObject);
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
if( ! CHECKHRESULT(hr = CScopePaneItem::OnQueryPaste(pDataObject)) )
|
|
{
|
|
return hr;
|
|
}
|
|
|
|
CSnapinDataObject* psdo = CSnapinDataObject::GetSnapinDataObject(pDataObject);
|
|
|
|
if( psdo == NULL || ! CHECKOBJPTR(psdo,RUNTIME_CLASS(CSnapinDataObject),sizeof(CSnapinDataObject)) )
|
|
{
|
|
return E_FAIL;
|
|
}
|
|
|
|
if( psdo->GetItemType() != CCT_SCOPE )
|
|
{
|
|
return E_FAIL;
|
|
}
|
|
|
|
CScopePaneItem* pItem = NULL;
|
|
if( ! psdo->GetItem(pItem) )
|
|
{
|
|
return E_FAIL;
|
|
}
|
|
|
|
ASSERT(pItem);
|
|
|
|
// 62985 : do not allow paste into yourself
|
|
if (this == pItem)
|
|
{
|
|
return E_FAIL;
|
|
}
|
|
|
|
if( ! GetObjectPtr()->QueryPaste(((CHMScopeItem*)pItem)->GetObjectPtr()) )
|
|
{
|
|
return S_FALSE;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
HRESULT CHMScopeItem::OnRefresh()
|
|
{
|
|
TRACEX(_T("CHMScopeItem::OnRefresh\n"));
|
|
|
|
CHMObject* pObject = GetObjectPtr();
|
|
|
|
if( ! pObject )
|
|
{
|
|
return E_FAIL;
|
|
}
|
|
|
|
if( IsPropertySheetOpen(true) )
|
|
{
|
|
AfxMessageBox(IDS_STRING_WARN_PROPPAGE_OPEN);
|
|
return S_FALSE;
|
|
}
|
|
|
|
if( ! pObject->Refresh() )
|
|
{
|
|
return E_FAIL;
|
|
}
|
|
|
|
SelectItem();
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT CHMScopeItem::OnRename(const CString& sNewName)
|
|
{
|
|
TRACEX(_T("CHMScopeItem::OnRename\n"));
|
|
|
|
if( ! m_pObject->Rename(sNewName) )
|
|
{
|
|
return S_FALSE;
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|