545 lines
13 KiB
C++
545 lines
13 KiB
C++
|
// ResultsPaneItem.cpp : implementation file
|
||
|
//
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "ResultsPaneView.h"
|
||
|
#include "ResultsPaneItem.h"
|
||
|
#include "ResultsPane.h"
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
#define new DEBUG_NEW
|
||
|
#undef THIS_FILE
|
||
|
static char THIS_FILE[] = __FILE__;
|
||
|
#endif
|
||
|
|
||
|
// {8A7DC72D-2D81-11d3-BE0E-0000F87A3912}
|
||
|
static GUID GUID_ResultItem =
|
||
|
{ 0x8a7dc72d, 0x2d81, 0x11d3, { 0xbe, 0xe, 0x0, 0x0, 0xf8, 0x7a, 0x39, 0x12 } };
|
||
|
|
||
|
LPGUID CResultsPaneItem::m_lpguidItemType = &GUID_ResultItem;
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CResultsPaneItem
|
||
|
|
||
|
IMPLEMENT_DYNCREATE(CResultsPaneItem, CCmdTarget)
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// Construction/Destruction
|
||
|
|
||
|
CResultsPaneItem::CResultsPaneItem()
|
||
|
{
|
||
|
EnableAutomation();
|
||
|
|
||
|
m_pOwnerResultsView = NULL;
|
||
|
m_hResultItem = NULL;
|
||
|
m_iCurrentIconIndex = -1;
|
||
|
|
||
|
// To keep the application running as long as an OLE automation
|
||
|
// object is active, the constructor calls AfxOleLockApp.
|
||
|
|
||
|
AfxOleLockApp();
|
||
|
}
|
||
|
|
||
|
CResultsPaneItem::~CResultsPaneItem()
|
||
|
{
|
||
|
Destroy();
|
||
|
|
||
|
// To terminate the application when all objects created with
|
||
|
// with OLE automation, the destructor calls AfxOleUnlockApp.
|
||
|
|
||
|
AfxOleUnlockApp();
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// Create/Destroy
|
||
|
|
||
|
bool CResultsPaneItem::Create(CResultsPaneView* pOwnerView, const CStringArray& saNames, CUIntArray& uiaIconResIds, int iIconIndex)
|
||
|
{
|
||
|
TRACEX(_T("CResultsPaneItem::Create\n"));
|
||
|
TRACEARGn(pOwnerView);
|
||
|
TRACEARGn(saNames.GetSize());
|
||
|
TRACEARGn(uiaIconResIds.GetSize());
|
||
|
TRACEARGn(iIconIndex);
|
||
|
|
||
|
if( ! GfxCheckObjPtr(pOwnerView,CResultsPaneView) )
|
||
|
{
|
||
|
TRACE(_T("FAILED : pOwnerView is an invalid pointer.\n"));
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
SetOwnerResultsView(pOwnerView);
|
||
|
|
||
|
if( saNames.GetSize() )
|
||
|
{
|
||
|
SetDisplayNames(saNames);
|
||
|
}
|
||
|
|
||
|
if( uiaIconResIds.GetSize() )
|
||
|
{
|
||
|
SetIconIds(uiaIconResIds);
|
||
|
}
|
||
|
|
||
|
SetIconIndex(iIconIndex);
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
bool CResultsPaneItem::Create(CResultsPaneView* pOwnerView)
|
||
|
{
|
||
|
TRACEX(_T("CResultsPaneItem::Create\n"));
|
||
|
TRACEARGn(pOwnerView);
|
||
|
|
||
|
if( ! GfxCheckObjPtr(pOwnerView,CResultsPaneView) )
|
||
|
{
|
||
|
TRACE(_T("FAILED : pOwnerView is an invalid pointer.\n"));
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
SetOwnerResultsView(pOwnerView);
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
void CResultsPaneItem::Destroy()
|
||
|
{
|
||
|
TRACEX(_T("CResultsPaneItem::Destroy\n"));
|
||
|
|
||
|
m_IconResIds.RemoveAll();
|
||
|
m_saDisplayNames.RemoveAll();
|
||
|
m_iCurrentIconIndex = -1;
|
||
|
m_hResultItem = NULL;
|
||
|
m_pOwnerResultsView = NULL;
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// Owner ResultsView Members
|
||
|
|
||
|
CResultsPaneView* CResultsPaneItem::GetOwnerResultsView()
|
||
|
{
|
||
|
TRACEX(_T("CResultsPaneItem::GetOwnerResultsView\n"));
|
||
|
|
||
|
if( GfxCheckObjPtr(m_pOwnerResultsView,CResultsPaneView) )
|
||
|
return m_pOwnerResultsView;
|
||
|
|
||
|
TRACE(_T("FAILED : m_pOwnerResultsView is not valid.\n"));
|
||
|
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
void CResultsPaneItem::SetOwnerResultsView(CResultsPaneView* pView)
|
||
|
{
|
||
|
TRACEX(_T("CResultsPaneItem::SetOwnerResultsView\n"));
|
||
|
TRACEARGn(pView);
|
||
|
|
||
|
if( ! GfxCheckObjPtr(pView,CResultsPaneView) )
|
||
|
{
|
||
|
TRACE(_T("FAILED : pView is not a valid pointer.\n"));
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
m_pOwnerResultsView = pView;
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// Display Names Members
|
||
|
|
||
|
CString CResultsPaneItem::GetDisplayName(int nIndex /* = 0*/)
|
||
|
{
|
||
|
TRACEX(_T("CResultsPaneItem::GetDisplayName\n"));
|
||
|
TRACEARGn(nIndex);
|
||
|
|
||
|
if( nIndex >= m_saDisplayNames.GetSize() || nIndex < 0 )
|
||
|
{
|
||
|
TRACE(_T("FAILED : nIndex is out of array bounds.\n"));
|
||
|
return _T("");
|
||
|
}
|
||
|
|
||
|
return m_saDisplayNames[nIndex];
|
||
|
}
|
||
|
|
||
|
void CResultsPaneItem::SetDisplayName(int nIndex, const CString& sName)
|
||
|
{
|
||
|
TRACEX(_T("CResultsPaneItem::SetDisplayName\n"));
|
||
|
TRACEARGn(nIndex);
|
||
|
|
||
|
if( nIndex >= m_saDisplayNames.GetSize() || nIndex < 0 )
|
||
|
{
|
||
|
TRACE(_T("FAILED : nIndex is out of array bounds.\n"));
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
m_saDisplayNames.SetAt(nIndex,sName);
|
||
|
}
|
||
|
|
||
|
void CResultsPaneItem::SetDisplayNames(const CStringArray& saNames)
|
||
|
{
|
||
|
TRACEX(_T("CResultsPaneItem::SetDisplayNames\n"));
|
||
|
TRACEARGn(saNames.GetSize());
|
||
|
|
||
|
m_saDisplayNames.Copy(saNames);
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// MMC-Related Members
|
||
|
|
||
|
bool CResultsPaneItem::InsertItem(CResultsPane* pPane, int nIndex, bool bResizeColumns /*= false*/)
|
||
|
{
|
||
|
TRACEX(_T("CResultsPaneItem::InsertItem\n"));
|
||
|
TRACEARGn(pPane);
|
||
|
TRACEARGn(nIndex);
|
||
|
TRACEARGn(bResizeColumns);
|
||
|
|
||
|
if( ! GfxCheckObjPtr(pPane,CResultsPane) )
|
||
|
{
|
||
|
TRACE(_T("FAILED : pPane is not a valid pointer.\n"));
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
HRESULT hr = S_OK;
|
||
|
RESULTDATAITEM rdi;
|
||
|
|
||
|
ZeroMemory(&rdi,sizeof(rdi));
|
||
|
|
||
|
rdi.mask = RDI_STR | // displayname is valid
|
||
|
RDI_IMAGE | // nImage is valid
|
||
|
RDI_INDEX | // nIndex is valid
|
||
|
RDI_PARAM; // lParam is valid
|
||
|
rdi.nIndex = nIndex;
|
||
|
rdi.str = MMC_CALLBACK;
|
||
|
rdi.nImage = pPane->GetIconIndex(GetIconId());
|
||
|
rdi.lParam = (LPARAM)this;
|
||
|
|
||
|
|
||
|
LPRESULTDATA lpResultData = pPane->GetResultDataPtr();
|
||
|
|
||
|
if( ! GfxCheckPtr(lpResultData,IResultData) )
|
||
|
{
|
||
|
TRACE(_T("FAILED : CResultsPane::GetResultDataPtr returns an invalid pointer.\n"));
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
hr = lpResultData->InsertItem( &rdi );
|
||
|
|
||
|
if( ! CHECKHRESULT(hr) )
|
||
|
{
|
||
|
TRACE(_T("FAILED : IResultData::InsertItem failed.\n"));
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
m_hResultItem = rdi.itemID;
|
||
|
|
||
|
ASSERT(m_hResultItem);
|
||
|
|
||
|
if( bResizeColumns )
|
||
|
{
|
||
|
LPHEADERCTRL2 lpHeaderCtrl = pPane->GetHeaderCtrlPtr();
|
||
|
|
||
|
if( GfxCheckPtr(lpHeaderCtrl,IHeaderCtrl2) )
|
||
|
{
|
||
|
CDC dc;
|
||
|
dc.Attach(GetDC(NULL));
|
||
|
int iWidth = 0;
|
||
|
|
||
|
// set the widths of the columns for this item
|
||
|
for( int i = 0; i < m_saDisplayNames.GetSize(); i++ )
|
||
|
{
|
||
|
// get the width in pixels of the item
|
||
|
CSize size = dc.GetTextExtent(m_saDisplayNames[i]);
|
||
|
lpHeaderCtrl->GetColumnWidth(i,&iWidth);
|
||
|
if( size.cx > iWidth )
|
||
|
lpHeaderCtrl->SetColumnWidth(i,size.cx);
|
||
|
}
|
||
|
HDC hDC = dc.Detach();
|
||
|
int iResult = ReleaseDC(NULL,hDC);
|
||
|
ASSERT(iResult == 1);
|
||
|
|
||
|
lpHeaderCtrl->Release();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
lpResultData->Release();
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
bool CResultsPaneItem::SetItem(CResultsPane* pPane)
|
||
|
{
|
||
|
TRACEX(_T("CResultsPaneItem::SetItem\n"));
|
||
|
TRACEARGn(pPane);
|
||
|
|
||
|
if( ! GfxCheckObjPtr(pPane,CResultsPane) )
|
||
|
{
|
||
|
TRACE(_T("FAILED : pPane is an invalid pointer.\n"));
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
RESULTDATAITEM rdi;
|
||
|
|
||
|
ZeroMemory(&rdi,sizeof(rdi));
|
||
|
|
||
|
rdi.mask = RDI_STR | // displayname is valid
|
||
|
RDI_IMAGE; // nImage is valid
|
||
|
rdi.str = MMC_CALLBACK;
|
||
|
rdi.nImage = pPane->GetIconIndex(GetIconId());
|
||
|
|
||
|
LPRESULTDATA lpResultData = pPane->GetResultDataPtr();
|
||
|
|
||
|
if( ! GfxCheckPtr(lpResultData,IResultData) )
|
||
|
{
|
||
|
TRACE(_T("FAILED : lpResultData is an invalid pointer.\n"));
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
hr = lpResultData->FindItemByLParam((LPARAM)this,&rdi.itemID);
|
||
|
if( ! CHECKHRESULT(hr) )
|
||
|
{
|
||
|
TRACE(_T("FAILED : IResultData::FindItemByLParam failed.\n"));
|
||
|
lpResultData->Release();
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
hr = lpResultData->SetItem( &rdi );
|
||
|
if( ! CHECKHRESULT(hr) )
|
||
|
{
|
||
|
TRACE(_T("FAILED : IResultData::SetItem failed.\n"));
|
||
|
lpResultData->Release();
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
lpResultData->Release();
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
int CResultsPaneItem::CompareItem(CResultsPaneItem* pItem, int iColumn /*= 0*/ )
|
||
|
{
|
||
|
TRACEX(_T("CResultsPaneItem::CompareItem\n"));
|
||
|
TRACEARGn(pItem);
|
||
|
TRACEARGn(iColumn);
|
||
|
|
||
|
|
||
|
CString sDisplayName1 = GetDisplayName(iColumn);
|
||
|
CString sDisplayName2 = pItem->GetDisplayName(iColumn);
|
||
|
|
||
|
//---------------------------------------------------------
|
||
|
// v-marfin : 60246 Detect numeric type and compare on that
|
||
|
long dw1=0,dw2=0;
|
||
|
dw1 = _ttol((TCHAR*)(const TCHAR*)sDisplayName1);
|
||
|
dw2 = _ttol((TCHAR*)(const TCHAR*)sDisplayName2);
|
||
|
if ((dw1==0) && (dw2==0))
|
||
|
{
|
||
|
// Could not convert to numeric, so sort as string
|
||
|
return sDisplayName1.CompareNoCase(sDisplayName2);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (dw1 < dw2) return -1;
|
||
|
if (dw1 > dw2) return 1;
|
||
|
return 0;
|
||
|
}
|
||
|
//---------------------------------------------------------
|
||
|
|
||
|
}
|
||
|
|
||
|
bool CResultsPaneItem::RemoveItem(CResultsPane* pPane)
|
||
|
{
|
||
|
TRACEX(_T("CResultsPaneItem::RemoveItem\n"));
|
||
|
TRACEARGn(pPane);
|
||
|
|
||
|
if( ! GfxCheckObjPtr(pPane,CResultsPane) )
|
||
|
{
|
||
|
TRACE(_T("FAILED : pPane is an invalid pointer.\n"));
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
LPRESULTDATA lpResultData = pPane->GetResultDataPtr();
|
||
|
|
||
|
if( ! lpResultData )
|
||
|
{
|
||
|
TRACE(_T("FAILED : CResultsPane::GetResultDataPtr returned NULL.\n"));
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
HRESULTITEM hri = NULL;
|
||
|
|
||
|
if( lpResultData->FindItemByLParam((LPARAM)this,&hri) == S_OK )
|
||
|
{
|
||
|
HRESULT hr = lpResultData->DeleteItem(hri,0);
|
||
|
if( ! CHECKHRESULT(hr) )
|
||
|
{
|
||
|
TRACE(_T("FAILED : IResultData::DeleteItem failed.\n"));
|
||
|
lpResultData->Release();
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
lpResultData->Release();
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
HRESULTITEM CResultsPaneItem::GetItemHandle()
|
||
|
{
|
||
|
TRACEX(_T("CResultsPaneItem::GetItemHandle\n"));
|
||
|
|
||
|
if( m_hResultItem == NULL )
|
||
|
{
|
||
|
TRACE(_T("WARNING : m_hResultItem is NULL.\n"));
|
||
|
}
|
||
|
|
||
|
return m_hResultItem;
|
||
|
}
|
||
|
|
||
|
HRESULT CResultsPaneItem::WriteExtensionData(LPSTREAM pStream)
|
||
|
{
|
||
|
TRACEX(_T("CResultsPaneItem::WriteExtensionData\n"));
|
||
|
TRACEARGn(pStream);
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// Icon Members
|
||
|
|
||
|
void CResultsPaneItem::SetIconIndex(int iIndex)
|
||
|
{
|
||
|
TRACEX(_T("CResultsPaneItem::SetIconIndex\n"));
|
||
|
TRACEARGn(iIndex);
|
||
|
|
||
|
if( iIndex >= m_IconResIds.GetSize() || iIndex < 0 )
|
||
|
{
|
||
|
TRACE(_T("FAILED : iIndex is out of array bounds.\n"));
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
m_iCurrentIconIndex = iIndex;
|
||
|
}
|
||
|
|
||
|
int CResultsPaneItem::GetIconIndex()
|
||
|
{
|
||
|
TRACEX(_T("CResultsPaneItem::GetIconIndex\n"));
|
||
|
|
||
|
if( m_iCurrentIconIndex >= m_IconResIds.GetSize() || m_iCurrentIconIndex < 0 )
|
||
|
{
|
||
|
TRACE(_T("WARNING : m_iCurrentIconIndex is out of array bounds.\n"));
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
return m_iCurrentIconIndex;
|
||
|
}
|
||
|
|
||
|
UINT CResultsPaneItem::GetIconId()
|
||
|
{
|
||
|
TRACEX(_T("CResultsPaneItem::GetIconId\n"));
|
||
|
|
||
|
if( m_iCurrentIconIndex >= m_IconResIds.GetSize() || m_iCurrentIconIndex < 0 )
|
||
|
{
|
||
|
TRACE(_T("FAILED : m_iCurrentIconIndex is out of array bounds.\n"));
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
return m_IconResIds[m_iCurrentIconIndex];
|
||
|
}
|
||
|
|
||
|
void CResultsPaneItem::SetIconIds(CUIntArray& uiaIconResIds)
|
||
|
{
|
||
|
TRACEX(_T("CResultsPaneItem::SetIconIds\n"));
|
||
|
TRACEARGn(uiaIconResIds.GetSize());
|
||
|
|
||
|
m_IconResIds.Copy(uiaIconResIds);
|
||
|
m_iCurrentIconIndex = -1;
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// MMC Notify Handlers
|
||
|
|
||
|
HRESULT CResultsPaneItem::OnAddMenuItems(LPCONTEXTMENUCALLBACK piCallback,long __RPC_FAR *pInsertionAllowed)
|
||
|
{
|
||
|
TRACEX(_T("CResultsPaneItem::OnAddMenuItems\n"));
|
||
|
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
|
||
|
}
|
||
|
|
||
|
// Add Top Menu Items
|
||
|
if( CCM_INSERTIONALLOWED_TOP & *pInsertionAllowed )
|
||
|
{
|
||
|
// TODO: Add any context menu items for the Task Menu here
|
||
|
}
|
||
|
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
HRESULT CResultsPaneItem::OnCommand(CResultsPane* pPane, long lCommandID)
|
||
|
{
|
||
|
TRACEX(_T("CResultsPaneItem::OnCommand\n"));
|
||
|
TRACEARGn(pPane);
|
||
|
TRACEARGn(lCommandID);
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
void CResultsPaneItem::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(CResultsPaneItem, CCmdTarget)
|
||
|
//{{AFX_MSG_MAP(CResultsPaneItem)
|
||
|
// NOTE - the ClassWizard will add and remove mapping macros here.
|
||
|
//}}AFX_MSG_MAP
|
||
|
END_MESSAGE_MAP()
|
||
|
|
||
|
BEGIN_DISPATCH_MAP(CResultsPaneItem, CCmdTarget)
|
||
|
//{{AFX_DISPATCH_MAP(CResultsPaneItem)
|
||
|
// NOTE - the ClassWizard will add and remove mapping macros here.
|
||
|
//}}AFX_DISPATCH_MAP
|
||
|
END_DISPATCH_MAP()
|
||
|
|
||
|
// Note: we add support for IID_IResultsPaneItem to support typesafe binding
|
||
|
// from VBA. This IID must match the GUID that is attached to the
|
||
|
// dispinterface in the .ODL file.
|
||
|
|
||
|
// {7D4A6867-9056-11D2-BD45-0000F87A3912}
|
||
|
static const IID IID_IResultsPaneItem =
|
||
|
{ 0x7d4a6867, 0x9056, 0x11d2, { 0xbd, 0x45, 0x0, 0x0, 0xf8, 0x7a, 0x39, 0x12 } };
|
||
|
|
||
|
BEGIN_INTERFACE_MAP(CResultsPaneItem, CCmdTarget)
|
||
|
INTERFACE_PART(CResultsPaneItem, IID_IResultsPaneItem, Dispatch)
|
||
|
END_INTERFACE_MAP()
|
||
|
|
||
|
// {7D4A6868-9056-11D2-BD45-0000F87A3912}
|
||
|
IMPLEMENT_OLECREATE_EX(CResultsPaneItem, "SnapIn.ResultsPaneItem", 0x7d4a6868, 0x9056, 0x11d2, 0xbd, 0x45, 0x0, 0x0, 0xf8, 0x7a, 0x39, 0x12)
|
||
|
|
||
|
BOOL CResultsPaneItem::CResultsPaneItemFactory::UpdateRegistry(BOOL bRegister)
|
||
|
{
|
||
|
if (bRegister)
|
||
|
return AfxOleRegisterServerClass(m_clsid, m_lpszProgID, m_lpszProgID, m_lpszProgID, OAT_DISPATCH_OBJECT);
|
||
|
else
|
||
|
return AfxOleUnregisterClass(m_clsid, m_lpszProgID);
|
||
|
}
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CResultsPaneItem message handlers
|