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

1181 lines
29 KiB
C++

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