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