// ResultsPaneView.cpp : implementation file // // Copyright (c) 2000 Microsoft Corporation // // 03/30/00 v-marfin 59644 : GetUpperPaneSelectedCount(). Created to get the number of selected items so we can pass it // to the context menu so it knows whether to add the // third party menu item "TroubleShooting" which it should // only add if there is only 1 item selected. // 04/02/00 v-marfin 59643b On creation of new objects, show details page first. // // // #include "stdafx.h" #include "snapin.h" #include "ResultsPaneView.h" #include "ScopePane.h" #include "ResultsPane.h" #include "HealthmonResultsPane.h" #include "HMListView.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CResultsPaneView IMPLEMENT_DYNCREATE(CResultsPaneView, CCmdTarget) CResultsPaneView::CResultsPaneView() { EnableAutomation(); m_pOwnerScopeItem = NULL; } CResultsPaneView::~CResultsPaneView() { Destroy(); } ///////////////////////////////////////////////////////////////////////////// // Create/Destroy bool CResultsPaneView::Create(CScopePaneItem* pOwnerItem) { TRACEX(_T("CResultsPaneView::Create\n")); TRACEARGn(pOwnerItem); if( ! GfxCheckObjPtr(pOwnerItem,CScopePaneItem) ) { TRACE(_T("FAILED : pOwnerItem is not a valid pointer.\n")); return false; } SetOwnerScopeItem(pOwnerItem); return true; } void CResultsPaneView::Destroy() { TRACEX(_T("CResultsPaneView::Destroy\n")); RemoveAllItems(); m_pOwnerScopeItem = NULL; for( int i=0; i < m_Columns.GetSize(); i++ ) { delete m_Columns[i]; } m_Columns.RemoveAll(); m_ResultsPanes.RemoveAll(); } ///////////////////////////////////////////////////////////////////////////// // Owner ScopeItem Members CScopePaneItem* CResultsPaneView::GetOwnerScopeItem() { TRACEX(_T("CResultsPaneView::GetOwnerScopeItem\n")); if( ! GfxCheckObjPtr(m_pOwnerScopeItem,CScopePaneItem) ) { TRACE(_T("FAILED : m_pOwnerScopeItem is not a valid pointer.\n")); return NULL; } return m_pOwnerScopeItem; } void CResultsPaneView::SetOwnerScopeItem(CScopePaneItem* pOwnerItem) { TRACEX(_T("CResultsPaneView::SetOwnerScopeItem\n")); TRACEARGn(pOwnerItem); if( ! GfxCheckObjPtr(pOwnerItem,CScopePaneItem) ) { TRACE(_T("FAILED : pOwnerItem is not a valid pointer.\n")); return; } m_pOwnerScopeItem = pOwnerItem; } ///////////////////////////////////////////////////////////////////////////// // ListView Column Members int CResultsPaneView::GetColumnCount() const { TRACEX(_T("CResultsPaneView::GetColumnCount\n")); return (int)m_Columns.GetSize(); } CListViewColumn* CResultsPaneView::GetColumn(int iIndex) { TRACEX(_T("CResultsPaneView::GetColumn\n")); TRACEARGn(iIndex); if( iIndex >= m_Columns.GetSize() || iIndex < 0 ) { TRACE(_T("FAILED : iIndex is out of array bounds.\n")); return NULL; } return m_Columns[iIndex]; } void CResultsPaneView::SetColumn(int iIndex, CListViewColumn* pColumn) { TRACEX(_T("CResultsPaneView::SetColumn\n")); TRACEARGn(iIndex); TRACEARGn(pColumn); if( iIndex >= m_Columns.GetSize() || iIndex < 0 ) { TRACE(_T("FAILED : iIndex is out of array bounds.\n")); return; } if( ! GfxCheckObjPtr(pColumn,CListViewColumn) ) { TRACE(_T("FAILED : pColumn is not a valid pointer.\n")); return; } m_Columns.SetAt(iIndex,pColumn); } int CResultsPaneView::AddColumn(CListViewColumn* pColumn) { TRACEX(_T("CResultsPaneView::AddColumn\n")); TRACEARGn(pColumn); if( ! GfxCheckObjPtr(pColumn,CListViewColumn) ) { TRACE(_T("FAILED : pColumn is not a valid pointer.\n")); return -1; } return (int)m_Columns.Add(pColumn); } void CResultsPaneView::RemoveColumn(int iIndex) { TRACEX(_T("CResultsPaneView::RemoveColumn\n")); TRACEARGn(iIndex); if( iIndex >= m_Columns.GetSize() || iIndex < 0 ) { TRACE(_T("FAILED : iIndex is out of array bounds.\n")); return; } delete m_Columns[iIndex]; m_Columns.RemoveAt(iIndex); } ///////////////////////////////////////////////////////////////////////////// // Results Pane Item Members int CResultsPaneView::GetItemCount() const { TRACEX(_T("CResultsPaneView::GetItemCount\n")); return (int)m_ResultItems.GetSize(); } CResultsPaneItem* CResultsPaneView::GetItem(int iIndex) { TRACEX(_T("CResultsPaneView::GetItem\n")); TRACEARGn(iIndex); if( iIndex >= m_ResultItems.GetSize() || iIndex < 0 ) { TRACE(_T("FAILED : iIndex is out of array bounds.\n")); return NULL; } if( ! GfxCheckObjPtr(m_ResultItems[iIndex],CResultsPaneItem) ) { TRACE(_T("FAILED : item pointer at iIndex is invalid.\n")); return NULL; } return m_ResultItems[iIndex]; } int CResultsPaneView::AddItem(CResultsPaneItem* pItem, bool bResizeColumn /*= false*/) { TRACEX(_T("CResultsPaneView::AddItem\n")); TRACEARGn(pItem); if( ! GfxCheckObjPtr(pItem,CResultsPaneItem) ) { TRACE(_T("FAILED : pItem is not a valid pointer.\n")); return -1; } int iNewItemIndex = (int)m_ResultItems.Add(pItem); ASSERT(iNewItemIndex != -1); // for all result panes on this view, add the item into each pane for( int i = 0; i < m_ResultsPanes.GetSize(); i++ ) { if( ! pItem->InsertItem(m_ResultsPanes[i],0, bResizeColumn) ) { TRACE(_T("FAILED : CResultsPaneItem::InsertItem failed.\n")); ASSERT(FALSE); } } return iNewItemIndex; } void CResultsPaneView::RemoveItem(int iIndex) { TRACEX(_T("CResultsPaneView::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 // this gets a little ugly...sorry for( int i=0; i < m_ResultsPanes.GetSize(); i++ ) { if( GfxCheckObjPtr(m_ResultsPanes[i],CResultsPane) ) { LPRESULTDATA lpResultData = m_ResultsPanes[i]->GetResultDataPtr(); if( lpResultData ) { HRESULTITEM hri = NULL; if( lpResultData->FindItemByLParam((LPARAM)pItem,&hri) == S_OK ) { HRESULT hr = lpResultData->DeleteItem(hri,0); if( ! CHECKHRESULT(hr) ) { TRACE(_T("FAILED : IResultData::DeleteItem failed.\n")); } } lpResultData->Release(); } } } delete pItem; m_ResultItems.RemoveAt(iIndex); } void CResultsPaneView::RemoveItem(CResultsPaneItem* pItem) { TRACEX(_T("CResultsPaneView::RemoveItem\n")); TRACEARGn(pItem); if( ! GfxCheckObjPtr(pItem,CResultsPaneItem) ) { TRACE(_T("FAILED : pItem is not a valid pointer.\n")); return; } for( int i = 0; i < m_ResultItems.GetSize(); i++ ) { if( pItem == m_ResultItems[i] ) { RemoveItem(i); return; } } } void CResultsPaneView::RemoveItem(const CString& sName) { TRACEX(_T("CResultsPaneView::RemoveItem\n")); if( sName.IsEmpty() ) { TRACE(_T("FAILED : sName is empty.\n")); return; } for( int i = 0; i < m_ResultItems.GetSize(); i++ ) { if( GfxCheckObjPtr(m_ResultItems[i],CResultsPaneItem) ) { if( sName == m_ResultItems[i]->GetDisplayName() ) { RemoveItem(i); return; } } } } int CResultsPaneView::FindItem(RPIFINDPROC pFindProc, LPARAM param) { TRACEX(_T("CResultsPaneView::FindItem\n")); TRACEARGn(pFindProc); TRACEARGn(param); if( ! GfxCheckPtr(pFindProc,RPIFINDPROC) ) { TRACE(_T("FAILED : pFindProc is not a valid function pointer.\n")); return -1; } return pFindProc(m_ResultItems,param); } bool CResultsPaneView::UpdateItem(CResultsPaneItem* pItem) { TRACEX(_T("CResultsPaneView::UpdateItem\n")); TRACEARGn(pItem); if( ! GfxCheckObjPtr(pItem,CResultsPaneItem) ) { TRACE(_T("FAILED : pItem is not a valid pointer.\n")); return false; } HRESULT hr = S_OK; for( int i=0; i < m_ResultsPanes.GetSize(); i++ ) { hr = pItem->SetItem(m_ResultsPanes[i]); if( hr == S_FALSE || ! CHECKHRESULT(hr) ) { TRACE(_T("FAILED : CResultsPaneItem::SetItem failed.\n")); } } return true; } void CResultsPaneView::UpdateAllItems() { TRACEX(_T("CResultsPaneView::UpdateAllItems\n")); for( int i = 0; i < m_ResultItems.GetSize(); i++ ) { if( ! UpdateItem(m_ResultItems[i]) ) { TRACE(_T("FAILED : CResultsPaneView::UpdateItem failed.\n")); } } } void CResultsPaneView::RemoveAllItems() { TRACEX(_T("CResultsPaneView::RemoveAllItems\n")); for( int i = (int)m_ResultItems.GetSize()-1; i >=0 ; i-- ) { RemoveItem(i); } } bool CResultsPaneView::GetSelectedItems(ResultsPaneItemArray& rpiaSelectedItems) { TRACEX(_T("CResultsPaneView::GetSelectedItems\n")); TRACEARGn(rpiaSelectedItems.GetSize()); return true; } int CResultsPaneView::GetUpperPaneSelectedCount() { TRACEX(_T("CResultsPaneView::GetUpperPaneSelectedCount\n")); // v-marfin 59644 : Get the number of selected items so we can pass it // to the context menu so it knows whether to add the // third party menu item "TroubleShooting" which it should // only add if there is only 1 item selected. if (m_ResultsPanes.GetSize() < 1) { TRACE(_T("ERROR: CResultsPaneView::GetUpperPaneSelectedCount(): no results panes defined.\n")); return 0; } CHealthmonResultsPane* pPane = (CHealthmonResultsPane*)m_ResultsPanes[0]; if (!pPane) { TRACE(_T("ERROR: CResultsPaneView::GetUpperPaneSelectedCount() : Could not fetch CHealthmonResultsPane\n")); return 0; } _DHMListView* pList = pPane->GetUpperListCtrl(); if (!pList) { TRACE(_T("ERROR: CResultsPaneView::GetUpperPaneSelectedCount() : Could not fetch upper list control\n")); return 0; } int nSelectedCount = pList->GetSelectedCount(); return nSelectedCount; } ///////////////////////////////////////////////////////////////////////////// // Property Page Members bool CResultsPaneView::IsPropertySheetOpen() { TRACEX(_T("CResultsPaneView::IsPropertySheetOpen\n")); // this function attempts to bring up an open property sheet for each result item // if it succeeds, then the property sheet is brought to the foreground // if it fails, then there are no open property sheets for the results view if( ! GetOwnerScopeItem() || ! GetOwnerScopeItem()->GetScopePane() ) { TRACE(_T("FAILED : Owner scope item is not a valid object.\n")); return false; } LPCONSOLE2 lpConsole = GetOwnerScopeItem()->GetScopePane()->GetConsolePtr(); if( ! GfxCheckPtr(lpConsole,IConsole2) ) { TRACE(_T("FAILED : lpConsole is not a valid pointer.\n")); return false; } // get a reference to the IPropertySheetProvider interface LPPROPERTYSHEETPROVIDER lpProvider = NULL; HRESULT hr = lpConsole->QueryInterface(IID_IPropertySheetProvider,(LPVOID*)&lpProvider); if( ! CHECKHRESULT(hr) ) { TRACE(_T("IConsole2::QueryInterface failed.\n")); lpConsole->Release(); return FALSE; } ASSERT(lpProvider); bool bIsOpenSheet = false; for( int i = 0; i < m_ResultItems.GetSize(); i++ ) { // create an IDataObject for this result item CSnapinDataObject* pdoNew = NULL; pdoNew = new CSnapinDataObject; if( ! GfxCheckObjPtr(pdoNew,CSnapinDataObject) ) { TRACE(_T("FAILED : Out of memory.\n")); lpProvider->Release(); lpConsole->Release(); return false; } LPDATAOBJECT lpDataObject = (LPDATAOBJECT)pdoNew->GetInterface(&IID_IDataObject); ASSERT(lpDataObject); pdoNew->SetItem(m_ResultItems[i]); for( int i = 0; i < GetOwnerScopeItem()->GetScopePane()->GetResultsPaneCount(); i++ ) { CResultsPane* pResultsPane = GetOwnerScopeItem()->GetScopePane()->GetResultsPane(i); if( GfxCheckObjPtr(pResultsPane,CResultsPane) ) { LPCOMPONENT lpComponent = (LPCOMPONENT)pResultsPane->GetInterface(&IID_IComponent); hr = lpProvider->FindPropertySheet(MMC_COOKIE(this),lpComponent,lpDataObject); if( hr == S_OK ) { bIsOpenSheet = true; } } } delete pdoNew; } lpProvider->Release(); lpConsole->Release(); return bIsOpenSheet; } bool CResultsPaneView::InvokePropertySheet(CResultsPaneItem* pItem) { TRACEX(_T("CResultsPaneView::InvokePropertySheet\n")); TRACEARGn(pItem); // first see if a property sheet for this item is open already if( IsPropertySheetOpen() ) { return true; } if( ! GetOwnerScopeItem() || ! GetOwnerScopeItem()->GetScopePane() ) { TRACE(_T("FAILED : Owner scope item is not a valid object.\n")); return false; } LPCONSOLE2 lpConsole = GetOwnerScopeItem()->GetScopePane()->GetConsolePtr(); if( ! GfxCheckPtr(lpConsole,IConsole2) ) { TRACE(_T("FAILED : lpConsole is not a valid pointer.\n")); return false; } // get a reference to the IPropertySheetProvider interface LPPROPERTYSHEETPROVIDER lpProvider = NULL; HRESULT hr = lpConsole->QueryInterface(IID_IPropertySheetProvider,(LPVOID*)&lpProvider); if( ! CHECKHRESULT(hr) ) { TRACE(_T("IConsole2::QueryInterface failed.\n")); lpConsole->Release(); return FALSE; } ASSERT(lpProvider); // create an IDataObject for this result item CSnapinDataObject* pdoNew = NULL; pdoNew = new CSnapinDataObject; if( ! GfxCheckObjPtr(pdoNew,CSnapinDataObject) ) { TRACE(_T("FAILED : Out of memory.\n")); lpProvider->Release(); lpConsole->Release(); return false; } LPDATAOBJECT lpDataObject = (LPDATAOBJECT)pdoNew->GetInterface(&IID_IDataObject); ASSERT(lpDataObject); pdoNew->SetItem(pItem); hr = lpProvider->CreatePropertySheet(pItem->GetDisplayName(),TRUE,MMC_COOKIE(pItem),lpDataObject,MMC_PSO_HASHELP); if( ! CHECKHRESULT(hr) ) { TRACE(_T("FAILED : IPropertySheetProvider::CreatePropertySheet failed.\n")); lpProvider->Release(); lpConsole->Release(); delete pdoNew; return false; } HWND hWndNotification = NULL; HWND hWndMain = NULL; hr = lpConsole->GetMainWindow(&hWndMain); if( ! CHECKHRESULT(hr) ) { // Release data allocated in CreatePropertySheet lpProvider->Show( -1, 0); lpProvider->Release(); lpConsole->Release(); delete pdoNew; return false; } // Try to get the correct window that notifications should be sent to. hWndNotification = FindWindowEx( hWndMain, NULL, _T("MDIClient"), NULL ); hWndNotification = FindWindowEx( hWndNotification, NULL, _T("MMCChildFrm"), NULL ); hWndNotification = FindWindowEx( hWndNotification, NULL, _T("MMCView"), NULL ); if( hWndNotification == NULL ) { // It was a nice try, but it failed, so we should be able to get by by using the main HWND. hWndNotification = hWndMain; } LPCOMPONENTDATA lpComponentData = (LPCOMPONENTDATA)GetOwnerScopeItem()->GetScopePane()->GetInterface(&IID_IComponentData); hr = lpProvider->AddPrimaryPages(lpComponentData,TRUE,hWndNotification,TRUE); if( ! CHECKHRESULT(hr) ) { // Release data allocated in CreatePropertySheet lpProvider->Show(-1,0); lpProvider->Release(); lpConsole->Release(); delete pdoNew; return false; } hr = lpProvider->AddExtensionPages(); if( ! CHECKHRESULT(hr) ) { // ISSUE: Should I care if this fails? // Release data allocated in CreatePropertySheet lpProvider->Show( -1, 0); lpProvider->Release(); lpConsole->Release(); delete pdoNew; return false; } // v-marfin : Show "details" page on creation of a new obejct #ifndef IA64 hr = lpProvider->Show( (long) hWndMain, 1); // 59643b #endif // IA64 if( ! CHECKHRESULT( hr ) ) { // Release data allocated in CreatePropertySheet lpProvider->Show( -1, 0); lpProvider->Release(); lpConsole->Release(); delete pdoNew; return false; } lpProvider->Release(); lpConsole->Release(); delete pdoNew; return true; } ///////////////////////////////////////////////////////////////////////////// // Context Menu Members bool CResultsPaneView::InvokeContextMenu(const CPoint& pt, CResultsPaneItem* pItem, int iSelectedCount) { TRACEX(_T("CResultsPaneView::InvokeContextMenu\n")); TRACEARGn(pt.x); TRACEARGn(pt.y); TRACEARGn(pItem); ASSERT(m_ResultsPanes.GetSize()); CResultsPane* pPane = m_ResultsPanes[0]; if( !pPane || ! GfxCheckObjPtr(pPane,CResultsPane) ) { return false; } LPCONSOLE2 lpConsole = pPane->GetConsolePtr(); // get a reference to the IContextMenuProvider interface LPCONTEXTMENUPROVIDER lpProvider = NULL; HRESULT hr = lpConsole->QueryInterface(IID_IContextMenuProvider,(LPVOID*)&lpProvider); if( ! CHECKHRESULT(hr) ) { TRACE(_T("IConsole2::QueryInterface failed.\n")); lpConsole->Release(); return FALSE; } ASSERT(lpProvider); // just as a precaution hr = lpProvider->EmptyMenuList(); // populate the menu CONTEXTMENUITEM cmi; CString sResString; CString sResString2; ZeroMemory(&cmi,sizeof(CONTEXTMENUITEM)); // add the top insertion point cmi.lCommandID = CCM_INSERTIONPOINTID_PRIMARY_TOP; cmi.lInsertionPointID = CCM_INSERTIONPOINTID_ROOT_MENU; cmi.fSpecialFlags = CCM_SPECIAL_INSERTION_POINT; hr = lpProvider->AddItem(&cmi); // add new menu and insertion point sResString.LoadString(IDS_STRING_NEW); cmi.strName = LPTSTR(LPCTSTR(sResString)); sResString2.LoadString(IDS_STRING_NEW_DESCRIPTION); cmi.strStatusBarText = LPTSTR(LPCTSTR(sResString2)); cmi.lCommandID = CCM_INSERTIONPOINTID_PRIMARY_NEW; cmi.lInsertionPointID = CCM_INSERTIONPOINTID_PRIMARY_TOP; cmi.fFlags = MF_POPUP; cmi.fSpecialFlags = CCM_SPECIAL_SUBMENU; hr = lpProvider->AddItem(&cmi); cmi.lCommandID = CCM_INSERTIONPOINTID_PRIMARY_NEW; cmi.lInsertionPointID = CCM_INSERTIONPOINTID_PRIMARY_TOP; cmi.fSpecialFlags = CCM_SPECIAL_INSERTION_POINT; hr = lpProvider->AddItem(&cmi); // add task menu and insertion point sResString.LoadString(IDS_STRING_TASK); cmi.strName = LPTSTR(LPCTSTR(sResString)); sResString2.LoadString(IDS_STRING_TASK_DESCRIPTION); cmi.strStatusBarText = LPTSTR(LPCTSTR(sResString2)); cmi.lCommandID = CCM_INSERTIONPOINTID_PRIMARY_TASK; cmi.lInsertionPointID = CCM_INSERTIONPOINTID_PRIMARY_TOP; cmi.fFlags = MF_POPUP; cmi.fSpecialFlags = CCM_SPECIAL_SUBMENU; hr = lpProvider->AddItem(&cmi); cmi.lCommandID = CCM_INSERTIONPOINTID_PRIMARY_TASK; cmi.lInsertionPointID = CCM_INSERTIONPOINTID_PRIMARY_TOP; cmi.fSpecialFlags = CCM_SPECIAL_INSERTION_POINT; hr = lpProvider->AddItem(&cmi); // create an IDataObject for this results item CSnapinDataObject* pdoNew = NULL; pdoNew = new CSnapinDataObject; if( ! GfxCheckObjPtr(pdoNew,CSnapinDataObject) ) { TRACE(_T("FAILED : Out of memory.\n")); lpProvider->Release(); lpConsole->Release(); return false; } LPDATAOBJECT lpDataObject = (LPDATAOBJECT)pdoNew->GetInterface(&IID_IDataObject); ASSERT(lpDataObject); pdoNew->SetItem(pItem); LPUNKNOWN lpUnknown = (LPUNKNOWN)pPane->GetInterface(&IID_IExtendContextMenu); hr = lpProvider->AddPrimaryExtensionItems(lpUnknown,lpDataObject); // add third party insertion points only if there is 1 item selected if( iSelectedCount == 1 ) { cmi.lCommandID = CCM_INSERTIONPOINTID_3RDPARTY_NEW; cmi.lInsertionPointID = CCM_INSERTIONPOINTID_PRIMARY_NEW; cmi.fSpecialFlags = CCM_SPECIAL_INSERTION_POINT; hr = lpProvider->AddItem(&cmi); cmi.lCommandID = CCM_INSERTIONPOINTID_3RDPARTY_TASK; cmi.lInsertionPointID = CCM_INSERTIONPOINTID_PRIMARY_TASK; cmi.fSpecialFlags = CCM_SPECIAL_INSERTION_POINT; hr = lpProvider->AddItem(&cmi); hr = lpProvider->AddThirdPartyExtensionItems(lpDataObject); } HWND hWndMain = NULL; hr = lpConsole->GetMainWindow(&hWndMain); // Try to get the correct window that notifications should be sent to. HWND hWndNotification = FindWindowEx( hWndMain, NULL, _T("MDIClient"), NULL ); hWndNotification = FindWindowEx( hWndNotification, NULL, _T("MMCChildFrm"), NULL ); hWndNotification = FindWindowEx( hWndNotification, NULL, _T("AfxFrameOrView42u"), NULL ); if( hWndNotification == NULL ) { // It was a nice try, but it failed, so we should be able to get by by using the main HWND. hWndNotification = hWndMain; } long lSelected = 0L; hr = lpProvider->ShowContextMenu(hWndNotification,pt.x,pt.y,&lSelected); lpProvider->Release(); lpConsole->Release(); lpDataObject->Release(); return true; } ///////////////////////////////////////////////////////////////////////////// // Results Pane Members - tracks each results pane open on a particular results view void CResultsPaneView::AddResultsPane(CResultsPane* pPane) { TRACEX(_T("CResultsPaneView::AddResultsPane\n")); TRACEARGn(pPane); if( ! GfxCheckObjPtr(pPane,CResultsPane) ) { TRACE(_T("FAILED : pPane is not a valid pointer.\n")); return; } m_ResultsPanes.Add(pPane); } void CResultsPaneView::RemoveResultsPane(CResultsPane* pPane) { TRACEX(_T("CResultsPaneView::RemoveResultsPane\n")); TRACEARGn(pPane); if( ! GfxCheckObjPtr(pPane,CResultsPane) ) { TRACE(_T("FAILED : pPane is not a valid pointer.\n")); return; } for( int i = 0; i < m_ResultsPanes.GetSize(); i++ ) { if( m_ResultsPanes[i] == pPane ) { m_ResultsPanes.RemoveAt(i); return; } } } CResultsPane* CResultsPaneView::GetResultsPane(int iIndex) { TRACEX(_T("CResultsPaneView::GetResultsPane\n")); TRACEARGn(iIndex); if( iIndex < 0 ) { TRACE(_T("FAILED : index is out of bounds.\n")); return NULL; } if( iIndex > m_ResultsPanes.GetUpperBound() ) { TRACE(_T("FAILED : index is out of bounds.\n")); return NULL; } return m_ResultsPanes[iIndex]; } int CResultsPaneView::GetResultsPanesCount() { TRACEX(_T("CResultsPaneView::GetResultsPanesCount\n")); return (int)m_ResultsPanes.GetSize(); } ///////////////////////////////////////////////////////////////////////////// // MMC Notify Handlers HRESULT CResultsPaneView::OnActivate(BOOL bActivate) { TRACEX(_T("CResultsPaneView::OnActivate\n")); TRACEARGn(bActivate); return S_OK; } HRESULT CResultsPaneView::OnAddMenuItems(CResultsPaneItem* pItem, LPCONTEXTMENUCALLBACK piCallback,long __RPC_FAR *pInsertionAllowed) { TRACEX(_T("CResultsPaneView::OnAddMenuItems\n")); TRACEARGn(pItem); TRACEARGn(piCallback); TRACEARGn(pInsertionAllowed); // Add New Menu Items if( CCM_INSERTIONALLOWED_NEW & *pInsertionAllowed ) { // TODO: Add any context menu items for the New Menu here } // Add Task Menu Items if( CCM_INSERTIONALLOWED_TASK & *pInsertionAllowed ) { // TODO: Add any context menu items for the Task Menu here } return pItem->OnAddMenuItems(piCallback,pInsertionAllowed); } HRESULT CResultsPaneView::OnBtnClick(CResultsPaneItem* pItem, MMC_CONSOLE_VERB mcvVerb) { TRACEX(_T("CResultsPaneView::OnBtnClick\n")); TRACEARGn(pItem); TRACEARGn(mcvVerb); return S_OK; } HRESULT CResultsPaneView::OnCommand(CResultsPane* pPane, CResultsPaneItem* pItem, long lCommandID) { TRACEX(_T("CResultsPaneView::OnCommand\n")); TRACEARGn(pPane); TRACEARGn(pItem); TRACEARGn(lCommandID); return pItem->OnCommand(pPane,lCommandID); } HRESULT CResultsPaneView::OnContextHelp(CResultsPaneItem* pItem) { TRACEX(_T("CResultsPaneView::OnContextHelp\n")); TRACEARGn(pItem); if( ! GetOwnerScopeItem() ) { return E_FAIL; } return GetOwnerScopeItem()->OnContextHelp(); } HRESULT CResultsPaneView::OnCreatePropertyPages(CResultsPaneItem* pItem, LPPROPERTYSHEETCALLBACK lpProvider, INT_PTR handle) { TRACEX(_T("CResultsPaneView::OnCreatePropertyPages\n")); TRACEARGn(lpProvider); TRACEARGn(handle); TRACEARGn(pItem); return S_FALSE; } HRESULT CResultsPaneView::OnDblClick(CResultsPaneItem* pItem) { TRACEX(_T("CResultsPaneView::OnDblClick\n")); TRACEARGn(pItem); return S_FALSE; } HRESULT CResultsPaneView::OnDelete(CResultsPaneItem* pItem) { TRACEX(_T("CResultsPaneView::OnDelete\n")); TRACEARGn(pItem); RemoveItem(pItem); return S_OK; } HRESULT CResultsPaneView::OnGetResultViewType(CString& sViewType,long& lViewOptions) { TRACEX(_T("CResultsPaneView::OnGetResultViewType\n")); TRACEARGs(sViewType); TRACEARGn(lViewOptions); return S_OK; } HRESULT CResultsPaneView::OnMinimized(BOOL bMinimized) { TRACEX(_T("CResultsPaneView::OnMinimized\n")); TRACEARGn(bMinimized); return S_OK; } HRESULT CResultsPaneView::OnPropertyChange(LPARAM lParam) { TRACEX(_T("CResultsPaneView::OnPropertyChange\n")); TRACEARGn(lParam); return S_OK; } HRESULT CResultsPaneView::OnQueryPagesFor(CResultsPaneItem* pItem) { TRACEX(_T("CResultsPaneView::OnQueryPagesFor\n")); TRACEARGn(pItem); return S_OK; } HRESULT CResultsPaneView::OnRefresh() { TRACEX(_T("CResultsPaneView::OnRefresh\n")); return S_OK; } HRESULT CResultsPaneView::OnRename(CResultsPaneItem* pItem, const CString& sNewName) { TRACEX(_T("CResultsPaneView::OnRename\n")); TRACEARGn(pItem); return S_OK; } HRESULT CResultsPaneView::OnRestoreView(MMC_RESTORE_VIEW* pRestoreView, BOOL* pbHandled) { TRACEX(_T("CResultsPaneView::OnRestoreView\n")); TRACEARGn(pRestoreView); TRACEARGn(pbHandled); return S_OK; } HRESULT CResultsPaneView::OnSelect(CResultsPane* pPane, CResultsPaneItem* pItem, BOOL bSelected) { TRACEX(_T("CResultsPaneView::OnSelect\n")); TRACEARGn(pPane); TRACEARGn(pItem); TRACEARGn(bSelected); return S_OK; } HRESULT CResultsPaneView::OnShow(CResultsPane* pPane, BOOL bSelecting, HSCOPEITEM hScopeItem) { TRACEX(_T("CResultsPaneView::OnShow\n")); TRACEARGn(pPane); TRACEARGn(bSelecting); TRACEARGn(hScopeItem); if( ! GfxCheckObjPtr(pPane,CResultsPane) ) { TRACE(_T("FAILED : pPane is not a valid pointer.\n")); return E_FAIL; } HRESULT hr = S_OK; if( bSelecting ) { // add all the columns to the header control for( int i=0; i < GetColumnCount(); i++ ) { CListViewColumn* pColumn = GetColumn(i); if( pColumn ) { if( ! pColumn->InsertColumn(pPane,i) ) { TRACE(_T("FAILED : CListViewColumn::InsertColumn failed.\n")); } } } // insert all the results pane items for( i=0; i < GetItemCount(); i++ ) { CResultsPaneItem* pItem = GetItem(i); if( pItem ) { if( ! pItem->InsertItem(pPane,i,true) ) { TRACE(_T("FAILED : CResultsPaneItem::InsertItem failed.\n")); } } } } else { /* // remember all the column sizes for( int i=0; i < GetColumnCount(); i++ ) { CListViewColumn* pColumn = GetColumn(i); if( pColumn ) { pColumn->SaveWidth(pPane,i); } } LPRESULTDATA lpResultData = pPane->GetResultDataPtr(); if( ! GfxCheckPtr(lpResultData,IResultData) ) { return E_FAIL; } // remember all the positions of the items for( i = 0; i < GetItemCount(); i++ ) { CResultsPaneItem* pItem = NULL; RESULTDATAITEM rdi; ZeroMemory(&rdi,sizeof(rdi)); rdi.mask = RDI_INDEX | RDI_PARAM; rdi.nIndex = i; hr = lpResultData->GetItem(&rdi); pItem = (CResultsPaneItem*)rdi.lParam; m_ResultItems.SetAt(i,pItem); } lpResultData->Release(); */ } return hr; } HRESULT CResultsPaneView::OnViewChange(CResultsPaneItem* pItem, LONG lArg, LONG lHintParam) { TRACEX(_T("CResultsPaneView::OnViewChange\n")); TRACEARGn(pItem); TRACEARGn(lArg); TRACEARGn(lHintParam); return S_OK; } void CResultsPaneView::OnFinalRelease() { // When the last reference for an automation object is released // OnFinalRelease is called. The base class will automatically // deletes the object. Add additional cleanup required for your // object before calling the base class. CCmdTarget::OnFinalRelease(); } BEGIN_MESSAGE_MAP(CResultsPaneView, CCmdTarget) //{{AFX_MSG_MAP(CResultsPaneView) // NOTE - the ClassWizard will add and remove mapping macros here. //}}AFX_MSG_MAP END_MESSAGE_MAP() BEGIN_DISPATCH_MAP(CResultsPaneView, CCmdTarget) //{{AFX_DISPATCH_MAP(CResultsPaneView) // NOTE - the ClassWizard will add and remove mapping macros here. //}}AFX_DISPATCH_MAP END_DISPATCH_MAP() // Note: we add support for IID_IResultsPaneView to support typesafe binding // from VBA. This IID must match the GUID that is attached to the // dispinterface in the .ODL file. // {7D4A6864-9056-11D2-BD45-0000F87A3912} static const IID IID_IResultsPaneView = { 0x7d4a6864, 0x9056, 0x11d2, { 0xbd, 0x45, 0x0, 0x0, 0xf8, 0x7a, 0x39, 0x12 } }; BEGIN_INTERFACE_MAP(CResultsPaneView, CCmdTarget) INTERFACE_PART(CResultsPaneView, IID_IResultsPaneView, Dispatch) END_INTERFACE_MAP() ///////////////////////////////////////////////////////////////////////////// // CResultsPaneView message handlers