|
|
/**********************************************************************/ /** Microsoft Windows/NT **/ /** Copyright(c) Microsoft Corporation, 1997 - 1999 **/ /**********************************************************************/
/*
node.cpp Root node information (the root node is not displayed in the MMC framework but contains information such as all of the subnodes in this snapin). FILE HISTORY: */
#include "stdafx.h"
#include "basehand.h"
#include "util.h"
DEBUG_DECLARE_INSTANCE_COUNTER(CBaseHandler);
/*!--------------------------------------------------------------------------
CBaseHandler::CBaseHandler - Author: KennT ---------------------------------------------------------------------------*/ CBaseHandler::CBaseHandler(ITFSComponentData *pTFSCompData) : m_cRef(1) { DEBUG_INCREMENT_INSTANCE_COUNTER(CBaseHandler);
m_spTFSCompData.Set(pTFSCompData); pTFSCompData->GetNodeMgr(&m_spNodeMgr); }
CBaseHandler::~CBaseHandler() { DEBUG_DECREMENT_INSTANCE_COUNTER(CBaseHandler); }
IMPLEMENT_ADDREF_RELEASE(CBaseHandler)
STDMETHODIMP CBaseHandler::QueryInterface(REFIID riid, LPVOID *ppv) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); // Is the pointer bad?
if (ppv == NULL) return E_INVALIDARG;
// Place NULL in *ppv in case of failure
*ppv = NULL;
// This is the non-delegating IUnknown implementation
if (riid == IID_IUnknown) *ppv = (LPVOID) this; else if (riid == IID_ITFSNodeHandler) *ppv = (ITFSNodeHandler *) this;
// If we're going to return an interface, AddRef it first
if (*ppv) { ((LPUNKNOWN) *ppv)->AddRef(); return hrOK; } else return E_NOINTERFACE; }
STDMETHODIMP CBaseHandler::DestroyHandler(ITFSNode *pNode) { return hrOK; }
/*!--------------------------------------------------------------------------
CBaseHandler::Notify Implementation of ITFSNodeHandler::Notify Author: KennT ---------------------------------------------------------------------------*/ STDMETHODIMP CBaseHandler::Notify(ITFSNode *pNode, IDataObject *pDataObject, DWORD dwType, MMC_NOTIFY_TYPE event, LPARAM arg, LPARAM lParam) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); HRESULT hr = hrOK; switch (event) { case MMCN_PROPERTY_CHANGE: hr = OnPropertyChange(pNode, pDataObject, dwType, arg, lParam); break; case MMCN_EXPAND: { // when MMC calls us to expand the root node, it
// hands us the scopeID. We need to save it off here.
SPITFSNode spRootNode; m_spNodeMgr->GetRootNode(&spRootNode); if (pNode == spRootNode) pNode->SetData(TFS_DATA_SCOPEID, lParam);
// now walk the list of children for this node and
// show them (they may have been added to the internal tree,
// but not the UI before this node was expanded
SPITFSNodeEnum spNodeEnum; ITFSNode * pCurrentNode; ULONG nNumReturned = 0;
pNode->GetEnum(&spNodeEnum);
spNodeEnum->Next(1, &pCurrentNode, &nNumReturned); while (nNumReturned) { if (pCurrentNode->IsVisible() && !pCurrentNode->IsInUI()) pCurrentNode->Show();
pCurrentNode->Release(); spNodeEnum->Next(1, &pCurrentNode, &nNumReturned); }
// Now call the notification handler for specific functionality
hr = OnExpand(pNode, pDataObject, dwType, arg, lParam); } break; case MMCN_DELETE: hr = OnDelete(pNode, arg, lParam); break;
case MMCN_RENAME: hr = OnRename(pNode, arg, lParam); break;
/* case MMCN_CONTEXTMENU:
hr = OnContextMenu(pNode, arg, lParam); break; */ case MMCN_REMOVE_CHILDREN: hr = OnRemoveChildren(pNode, pDataObject, arg, lParam); break;
case MMCN_EXPANDSYNC: hr = OnExpandSync(pNode, pDataObject, arg, lParam); break;
case MMCN_BTN_CLICK: switch (lParam) { case MMC_VERB_COPY: hr = OnVerbCopy(pNode, arg, lParam); break; case MMC_VERB_PASTE: hr = OnVerbPaste(pNode, arg, lParam); break; case MMC_VERB_DELETE: hr = OnVerbDelete(pNode, arg, lParam); break; case MMC_VERB_PROPERTIES: hr = OnVerbProperties(pNode, arg, lParam); break; case MMC_VERB_RENAME: hr = OnVerbRename(pNode, arg, lParam); break; case MMC_VERB_REFRESH: hr = OnVerbRefresh(pNode, arg, lParam); break; case MMC_VERB_PRINT: hr = OnVerbPrint(pNode, arg, lParam); break; }; break;
case MMCN_RESTORE_VIEW: hr = OnRestoreView(pNode, arg, lParam); break;
default: Panic1("Uknown event in CBaseHandler::Notify! 0x%x", event); // Handle new messages
hr = S_FALSE; break;
} return hr; }
/*!--------------------------------------------------------------------------
CBaseHandler::CreatePropertyPages Implementation of ITFSNodeHandler::CreatePropertyPages Author: KennT ---------------------------------------------------------------------------*/ STDMETHODIMP CBaseHandler::CreatePropertyPages(ITFSNode *pNode, LPPROPERTYSHEETCALLBACK lpProvider, LPDATAOBJECT pDataObject, LONG_PTR handle, DWORD dwType) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); HRESULT hr = hrOK;
if (dwType & TFS_COMPDATA_CREATE) { // This is the case where we are asked to bring up property
// pages when the user is adding a new snapin. These calls
// are forwarded to the root node to handle.
SPITFSNode spRootNode; SPITFSNodeHandler spHandler; // get the root node
m_spNodeMgr->GetRootNode(&spRootNode); spRootNode->GetHandler(&spHandler); spHandler->CreatePropertyPages(spRootNode, lpProvider, pDataObject, handle, dwType); } return hr; }
/*!--------------------------------------------------------------------------
CBaseHandler::HasPropertyPages Implementation of ITFSNodeHandler::HasPropertyPages Author: KennT ---------------------------------------------------------------------------*/ STDMETHODIMP CBaseHandler::HasPropertyPages(ITFSNode *pNode, LPDATAOBJECT pDataObject, DATA_OBJECT_TYPES type, DWORD dwType) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); HRESULT hr = hrOK; if (dwType & TFS_COMPDATA_CREATE) { // This is the case where we are asked to bring up property
// pages when the user is adding a new snapin. These calls
// are forwarded to the root node to handle.
SPITFSNode spRootNode; SPITFSNodeHandler spHandler; // get the root node
m_spNodeMgr->GetRootNode(&spRootNode); spRootNode->GetHandler(&spHandler); hr = spHandler->HasPropertyPages(spRootNode, pDataObject, type, dwType); } else { // we have no property pages in the normal case
hr = S_FALSE; } return hr; }
/*!--------------------------------------------------------------------------
CBaseHandler::OnAddMenuItems Implementation of ITFSNodeHandler::OnAddMenuItems Author: KennT ---------------------------------------------------------------------------*/ STDMETHODIMP CBaseHandler::OnAddMenuItems(ITFSNode *pNode, LPCONTEXTMENUCALLBACK pContextMenuCallback, LPDATAOBJECT lpDataObject, DATA_OBJECT_TYPES type, DWORD dwType, long *pInsertionAllowed) { return S_FALSE; }
/*!--------------------------------------------------------------------------
CBaseHandler::OnCommand Implementation of ITFSNodeHandler::OnCommand Author: KennT ---------------------------------------------------------------------------*/ STDMETHODIMP CBaseHandler::OnCommand(ITFSNode *pNode, long nCommandId, DATA_OBJECT_TYPES type, LPDATAOBJECT pDataObject, DWORD dwType) { return S_FALSE; }
/*!--------------------------------------------------------------------------
CBaseHandler::GetString Implementation of ITFSNodeHandler::GetString Author: KennT ---------------------------------------------------------------------------*/ STDMETHODIMP_(LPCTSTR)CBaseHandler::GetString(ITFSNode *pNode, int nCol) { return _T("Foo"); }
/*!--------------------------------------------------------------------------
CBaseHandler::UserNotify Implememntation of ITFSNodeHandler::UserNotify Author: KennT ---------------------------------------------------------------------------*/ STDMETHODIMP CBaseHandler::UserNotify(ITFSNode *pNode, LPARAM dwParam1, LPARAM dwParam2) { return S_FALSE; }
/*!--------------------------------------------------------------------------
CBaseHandler::OnCreateDataObject Implementation of ITFSNodeHandler::OnCreateDataObject Author: KennT ---------------------------------------------------------------------------*/ STDMETHODIMP CBaseHandler::OnCreateDataObject(MMC_COOKIE cookie, DATA_OBJECT_TYPES type, IDataObject **ppDataObject) { // this relies on the ComponentData to do this work
return S_FALSE; }
/*!--------------------------------------------------------------------------
CBaseHandler::CreateNodeId2 Implementation of ITFSNodeHandler::CreateNodeId2 Author: KennT ---------------------------------------------------------------------------*/ STDMETHODIMP CBaseHandler::CreateNodeId2(ITFSNode * pNode, BSTR * pbstrId, DWORD * pdwFlags) { HRESULT hr = S_FALSE; CString strId;
COM_PROTECT_TRY { if (pbstrId == NULL) return hr;
// call the handler function to get the data
hr = OnCreateNodeId2(pNode, strId, pdwFlags); if (SUCCEEDED(hr) && hr != S_FALSE) { *pbstrId = ::SysAllocString((LPOLESTR) (LPCTSTR) strId); } } COM_PROTECT_CATCH
return hr; }
/*---------------------------------------------------------------------------
CBaseHandler Notifications ---------------------------------------------------------------------------*/
HRESULT CBaseHandler::OnPropertyChange(ITFSNode *pNode, LPDATAOBJECT pDataobject, DWORD dwType, LPARAM arg, LPARAM lParam) { Trace0("IComponentData::Notify(MMCN_PROPERTY_CHANGE) received\n"); return S_FALSE; }
HRESULT CBaseHandler::OnDelete(ITFSNode *pNode, LPARAM arg, LPARAM lParam) { Trace0("IComponentData::Notify(MMCN_DELETE) received\n"); return S_FALSE; }
HRESULT CBaseHandler::OnRename(ITFSNode *pNode, LPARAM arg, LPARAM lParam) { Trace0("IComponentData::Notify(MMCN_RENAME) received\n"); return S_FALSE; }
HRESULT CBaseHandler::OnExpand(ITFSNode *pNode, LPDATAOBJECT pDataObject, DWORD dwType, LPARAM arg, LPARAM lParam) { Trace0("IComponentData::Notify(MMCN_EXPAND) received\n"); return hrOK; }
HRESULT CBaseHandler::OnRemoveChildren(ITFSNode *pNode, LPDATAOBJECT pDataObject, LPARAM arg, LPARAM lParam) { Trace0("IComponentData::Notify(MMCN_REMOVECHILDREN) received\n"); return S_FALSE; }
HRESULT CBaseHandler::OnExpandSync(ITFSNode *pNode, LPDATAOBJECT pDataObject, LPARAM arg, LPARAM lParam) { Trace0("IComponentData::Notify(MMCN_EXPANDSYNC) received\n"); return S_FALSE; }
HRESULT CBaseHandler::OnContextMenu(ITFSNode *pNode, LPARAM arg, LPARAM lParam) { Trace0("IComponentData::Notify(MMCN_CONTEXTMENU) received\n"); return S_FALSE; }
HRESULT CBaseHandler::OnVerbCopy(ITFSNode *pNode, LPARAM arg, LPARAM lParam) { Trace0("IComponentData::Notify(MMCN_VERB_COPY) received\n"); return S_FALSE; }
HRESULT CBaseHandler::OnVerbPaste(ITFSNode *pNode, LPARAM arg, LPARAM lParam) { Trace0("IComponentData::Notify(MMCN_VERB_PASTE) received\n"); return S_FALSE; }
HRESULT CBaseHandler::OnVerbDelete(ITFSNode *pNode, LPARAM arg, LPARAM lParam) { Trace0("IComponentData::Notify(MMCN_VERB_DELETE) received\n"); return S_FALSE; }
HRESULT CBaseHandler::OnVerbProperties(ITFSNode *pNode, LPARAM arg, LPARAM lParam) { Trace0("IComponentData::Notify(MMCN_VERB_PROPERTIES) received\n"); return S_FALSE; }
HRESULT CBaseHandler::OnVerbRename(ITFSNode *pNode, LPARAM arg, LPARAM lParam) { Trace0("IComponentData::Notify(MMCN_VERB_RENAME) received\n"); return S_FALSE; }
HRESULT CBaseHandler::OnVerbRefresh(ITFSNode *pNode, LPARAM arg, LPARAM lParam) { Trace0("IComponentData::Notify(MMCN_VERB_REFRESH) received\n"); return S_FALSE; }
HRESULT CBaseHandler::OnVerbPrint(ITFSNode *pNode, LPARAM arg, LPARAM lParam) { Trace0("IComponentData::Notify(MMCN_VERB_PRINT) received\n"); return S_FALSE; }
HRESULT CBaseHandler::OnRestoreView(ITFSNode *pNode, LPARAM arg, LPARAM lParam) { Trace0("IComponentData::Notify(MMCN_RESTORE_VIEW) received\n"); return S_FALSE; }
HRESULT CBaseHandler::OnCreateNodeId2(ITFSNode * pNode, CString & strId, DWORD * pdwFlags) { return S_FALSE; }
DEBUG_DECLARE_INSTANCE_COUNTER(CBaseResultHandler);
/*---------------------------------------------------------------------------
CBaseResultHandler implementation ---------------------------------------------------------------------------*/ CBaseResultHandler::CBaseResultHandler(ITFSComponentData *pTFSCompData) : m_cRef(1) { DEBUG_INCREMENT_INSTANCE_COUNTER(CBaseResultHandler);
m_spTFSComponentData.Set(pTFSCompData); pTFSCompData->GetNodeMgr(&m_spResultNodeMgr);
m_nColumnFormat = LVCFMT_LEFT; // default column alignment
m_pColumnStringIDs = NULL; m_pColumnWidths = NULL;
m_fMessageView = FALSE; }
CBaseResultHandler::~CBaseResultHandler() { DEBUG_DECREMENT_INSTANCE_COUNTER(CBaseResultHandler); }
IMPLEMENT_ADDREF_RELEASE(CBaseResultHandler)
STDMETHODIMP CBaseResultHandler::QueryInterface(REFIID riid, LPVOID *ppv) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); // Is the pointer bad?
if (ppv == NULL) return E_INVALIDARG;
// Place NULL in *ppv in case of failure
*ppv = NULL;
// This is the non-delegating IUnknown implementation
if (riid == IID_IUnknown) *ppv = (LPVOID) this; else if (riid == IID_ITFSResultHandler) *ppv = (ITFSResultHandler *) this;
// If we're going to return an interface, AddRef it first
if (*ppv) { ((LPUNKNOWN) *ppv)->AddRef(); return hrOK; } else return E_NOINTERFACE; }
STDMETHODIMP CBaseResultHandler::DestroyResultHandler(MMC_COOKIE cookie) { return hrOK; }
/*!--------------------------------------------------------------------------
CBaseResultHandler::Notify Implementation of ITFSResultHandler::Notify Author: KennT ---------------------------------------------------------------------------*/ STDMETHODIMP CBaseResultHandler::Notify ( ITFSComponent * pComponent, MMC_COOKIE cookie, LPDATAOBJECT pDataObject, MMC_NOTIFY_TYPE event, LPARAM arg, LPARAM param ) { AFX_MANAGE_STATE(AfxGetStaticModuleState());
HRESULT hr = S_OK;
pComponent->SetCurrentDataObject(pDataObject);
COM_PROTECT_TRY { switch(event) { case MMCN_PROPERTY_CHANGE: hr = OnResultPropertyChange(pComponent, pDataObject, cookie, arg, param); break;
case MMCN_ACTIVATE: hr = OnResultActivate(pComponent, cookie, arg, param); break;
case MMCN_CLICK: hr = OnResultItemClkOrDblClk(pComponent, cookie, arg, param, FALSE); break;
case MMCN_COLUMN_CLICK: hr = OnResultColumnClick(pComponent, arg, (BOOL)param); break; case MMCN_COLUMNS_CHANGED: hr = OnResultColumnsChanged(pComponent, pDataObject, (MMC_VISIBLE_COLUMNS *) param); break;
case MMCN_DBLCLICK: hr = OnResultItemClkOrDblClk(pComponent, cookie, arg, param, TRUE); break; case MMCN_SHOW: { CWaitCursor wait; hr = OnResultShow(pComponent, cookie, arg, param); } break;
case MMCN_SELECT: hr = OnResultSelect(pComponent, pDataObject, cookie, arg, param); break;
case MMCN_INITOCX: hr = OnResultInitOcx(pComponent, pDataObject, cookie, arg, param); break;
case MMCN_MINIMIZED: hr = OnResultMinimize(pComponent, cookie, arg, param); break;
case MMCN_DELETE: hr = OnResultDelete(pComponent, pDataObject, cookie, arg, param); break;
case MMCN_RENAME: hr = OnResultRename(pComponent, pDataObject, cookie, arg, param); break;
case MMCN_REFRESH: hr = OnResultRefresh(pComponent, pDataObject, cookie, arg, param); break;
case MMCN_CONTEXTHELP: hr = OnResultContextHelp(pComponent, pDataObject, cookie, arg, param); break;
case MMCN_QUERY_PASTE: hr = OnResultQueryPaste(pComponent, pDataObject, cookie, arg, param); break;
case MMCN_BTN_CLICK: switch (param) { case MMC_VERB_COPY: OnResultVerbCopy(pComponent, cookie, arg, param); break;
case MMC_VERB_PASTE: OnResultVerbPaste(pComponent, cookie, arg, param); break;
case MMC_VERB_DELETE: OnResultVerbDelete(pComponent, cookie, arg, param); break;
case MMC_VERB_PROPERTIES: OnResultVerbProperties(pComponent, cookie, arg, param); break;
case MMC_VERB_RENAME: OnResultVerbRename(pComponent, cookie, arg, param); break;
case MMC_VERB_REFRESH: OnResultVerbRefresh(pComponent, cookie, arg, param); break; case MMC_VERB_PRINT: OnResultVerbPrint(pComponent, cookie, arg, param); break;
default: break; } break;
case MMCN_RESTORE_VIEW: hr = OnResultRestoreView(pComponent, cookie, arg, param); break;
// Note - Future expansion of notify types possible
default: Panic1("Uknown event in CBaseResultHandler::Notify! 0x%x", event); // Handle new messages
hr = S_FALSE; break; } } COM_PROTECT_CATCH pComponent->SetCurrentDataObject(NULL);
return hr; }
/*!--------------------------------------------------------------------------
CBaseResultHandler::OnUpdateView Implementation of ITFSResultHandler::UpdateView Author: KennT ---------------------------------------------------------------------------*/ STDMETHODIMP CBaseResultHandler::UpdateView ( ITFSComponent * pComponent, LPDATAOBJECT pDataObject, LPARAM data, LPARAM hint ) { return OnResultUpdateView(pComponent, pDataObject, data, hint); }
/*!--------------------------------------------------------------------------
CBaseResultHandler::GetString Implementation of ITFSResultHandler::GetString Author: KennT ---------------------------------------------------------------------------*/ STDMETHODIMP_(LPCTSTR) CBaseResultHandler::GetString ( ITFSComponent * pComponent, MMC_COOKIE cookie, int nCol ) { return NULL; }
/*!--------------------------------------------------------------------------
CBaseResultHandler::CompareItems Implementation of ITFSResultHandler::CompareItems Author: KennT ---------------------------------------------------------------------------*/ STDMETHODIMP_(int) CBaseResultHandler::CompareItems ( ITFSComponent * pComponent, MMC_COOKIE cookieA, MMC_COOKIE cookieB, int nCol ) { return S_FALSE; }
/*!--------------------------------------------------------------------------
CBaseResultHandler::FindItem called when the Virutal listbox needs to find an item. Author: EricDav ---------------------------------------------------------------------------*/ STDMETHODIMP CBaseResultHandler::FindItem ( LPRESULTFINDINFO pFindInfo, int * pnFoundIndex ) { return S_FALSE; }
/*!--------------------------------------------------------------------------
CBaseResultHandler::CacheHint called when the virtual listbox has hint information that we can pre-load. The hint is not a guaruntee that the items will be used or that items outside this range will be used. Author: EricDav ---------------------------------------------------------------------------*/ STDMETHODIMP CBaseResultHandler::CacheHint ( int nStartIndex, int nEndIndex ) { return S_FALSE; }
/*!--------------------------------------------------------------------------
CBaseResultHandler::SortItems called when the Virutal listbox data needs to be sorted Author: EricDav ---------------------------------------------------------------------------*/ STDMETHODIMP CBaseResultHandler::SortItems ( int nColumn, DWORD dwSortOptions, LPARAM lUserParam ) { return S_FALSE; }
// task pad functions
/*!--------------------------------------------------------------------------
CBaseResultHandler::TaskPadNotify - Author: EricDav ---------------------------------------------------------------------------*/ STDMETHODIMP CBaseResultHandler::TaskPadNotify ( ITFSComponent * pComponent, MMC_COOKIE cookie, LPDATAOBJECT pDataObject, VARIANT * arg, VARIANT * param ) { return S_FALSE; }
/*!--------------------------------------------------------------------------
CBaseResultHandler::EnumTasks - Author: EricDav ---------------------------------------------------------------------------*/ STDMETHODIMP CBaseResultHandler::EnumTasks ( ITFSComponent * pComponent, MMC_COOKIE cookie, LPDATAOBJECT pDataObject, LPOLESTR pszTaskGroup, IEnumTASK ** ppEnumTask ) { return S_FALSE; }
/*!--------------------------------------------------------------------------
CBaseResultHandler::TaskPadGetTitle - Author: EricDav ---------------------------------------------------------------------------*/ STDMETHODIMP CBaseResultHandler::TaskPadGetTitle ( ITFSComponent * pComponent, MMC_COOKIE cookie, LPOLESTR pszGroup, LPOLESTR * ppszTitle ) { return S_FALSE; }
/*!--------------------------------------------------------------------------
CBaseResultHandler::TaskPadGetBackground - Author: EricDav ---------------------------------------------------------------------------*/ STDMETHODIMP CBaseResultHandler::TaskPadGetBackground ( ITFSComponent * pComponent, MMC_COOKIE cookie, LPOLESTR pszGroup, MMC_TASK_DISPLAY_OBJECT * pTDO ) { return S_FALSE; }
/*!--------------------------------------------------------------------------
CBaseResultHandler::TaskPadGetDescriptiveText - Author: EricDav ---------------------------------------------------------------------------*/ STDMETHODIMP CBaseResultHandler::TaskPadGetDescriptiveText ( ITFSComponent * pComponent, MMC_COOKIE cookie, LPOLESTR pszGroup, LPOLESTR * pszDescriptiveText ) { return S_FALSE; }
/*!--------------------------------------------------------------------------
CBaseResultHandler::HasPropertyPages Implementation of ITFSResultHandler::HasPropertyPages Author: KennT ---------------------------------------------------------------------------*/ STDMETHODIMP CBaseResultHandler::HasPropertyPages ( ITFSComponent * pComponent, MMC_COOKIE cookie, LPDATAOBJECT pDataObject ) { return S_FALSE; }
/*!--------------------------------------------------------------------------
CBaseResultHandler::CreatePropertyPages Implementation of ITFSResultHandler::CreatePropertyPages Author: KennT ---------------------------------------------------------------------------*/ STDMETHODIMP CBaseResultHandler::CreatePropertyPages ( ITFSComponent * pComponent, MMC_COOKIE cookie, LPPROPERTYSHEETCALLBACK lpProvider, LPDATAOBJECT pDataObject, LONG_PTR handle ) { return S_FALSE; }
/*!--------------------------------------------------------------------------
CBaseResultHandler::AddMenuItems Implementation of ITFSResultHandler::AddMenuItems Author: KennT ---------------------------------------------------------------------------*/ STDMETHODIMP CBaseResultHandler::AddMenuItems ( ITFSComponent * pComponent, MMC_COOKIE cookie, LPDATAOBJECT pDataObject, LPCONTEXTMENUCALLBACK pContextMenuCallback, long * pInsertionAllowed ) { return S_FALSE; }
/*!--------------------------------------------------------------------------
CBaseResultHandler::Command Implementation of ITFSResultHandler::Command Author: KennT ---------------------------------------------------------------------------*/ STDMETHODIMP CBaseResultHandler::Command ( ITFSComponent * pComponent, MMC_COOKIE cookie, int nCommandID, LPDATAOBJECT pDataObject ) { return S_FALSE; }
/*!--------------------------------------------------------------------------
CBaseResultHandler::OnCreateControlbars Implementation of ITFSResultHandler::OnCreateControlbars Author: KennT ---------------------------------------------------------------------------*/ STDMETHODIMP CBaseResultHandler::OnCreateControlbars ( ITFSComponent * pComponent, LPCONTROLBAR pControlBar ) { return S_FALSE; }
/*!--------------------------------------------------------------------------
CBaseResultHandler::ControlbarNotify Implementation of ITFSResultHandler::ControlbarNotify Author: KennT ---------------------------------------------------------------------------*/ STDMETHODIMP CBaseResultHandler::ControlbarNotify ( ITFSComponent * pComponent, MMC_NOTIFY_TYPE event, LPARAM arg, LPARAM param ) { return S_FALSE; }
/*!--------------------------------------------------------------------------
CBaseResultHandler::UserResultNotify Implememntation of ITFSNodeHandler::UserResultNotify Author: KennT ---------------------------------------------------------------------------*/ STDMETHODIMP CBaseResultHandler::UserResultNotify ( ITFSNode * pNode, LPARAM dwParam1, LPARAM dwParam2 ) { return S_FALSE; }
/*!--------------------------------------------------------------------------
CBaseResultHandler::OnCreateDataObject - Author: KennT ---------------------------------------------------------------------------*/ STDMETHODIMP CBaseResultHandler::OnCreateDataObject(ITFSComponent *pComponent, MMC_COOKIE cookie, DATA_OBJECT_TYPES type, IDataObject **ppDataObject) { // this relies on the ComponentData to do this work
return S_FALSE; }
/*---------------------------------------------------------------------------
CBaseResultHandler Notifications ---------------------------------------------------------------------------*/ HRESULT CBaseResultHandler::OnResultPropertyChange(ITFSComponent *pComponent, LPDATAOBJECT pDataObject, MMC_COOKIE cookie, LPARAM arg, LPARAM param) { Trace0("IComponent::Notify(MMCN_PROPERTY_CHANGE) received\n"); return S_FALSE; }
/*!--------------------------------------------------------------------------
CBaseResultHandler::OnResultUpdateView Implementation of ITFSResultHandler::OnResultUpdateView Author: EricDav ---------------------------------------------------------------------------*/ HRESULT CBaseResultHandler::OnResultUpdateView ( ITFSComponent *pComponent, LPDATAOBJECT pDataObject, LPARAM data, LPARAM hint ) { SPITFSNode spSelectedNode; pComponent->GetSelectedNode(&spSelectedNode);
if (hint == RESULT_PANE_DELETE_ALL) { if (spSelectedNode == NULL) return S_OK; // no selection for our IComponentData
//
// data contains the container whose result pane has to be refreshed
//
ITFSNode * pNode = reinterpret_cast<ITFSNode *>(data); Assert(pNode != NULL); //
// do it only if selected, if not, reselecting will do a delete/enumeration
//
if (spSelectedNode == pNode && !m_fMessageView) { SPIResultData spResultData; pComponent->GetResultData(&spResultData);
Assert(spResultData != NULL); spResultData->DeleteAllRsltItems(); } } else if (hint == RESULT_PANE_ADD_ALL) { if (spSelectedNode == NULL) return S_OK; // no selection for our IComponentData
//
// data contains the container whose result pane has to be refreshed
//
ITFSNode * pNode = reinterpret_cast<ITFSNode *>(data); Assert(pNode != NULL); //
// do it only if selected, if not, reselecting will do a delete/enumeration
//
if (spSelectedNode == pNode) { SPIResultData spResultData; pComponent->GetResultData(&spResultData);
Assert(spResultData != NULL);
//
// update all the nodes in the result pane
//
SPITFSNodeEnum spNodeEnum; ITFSNode * pCurrentNode; ULONG nNumReturned = 0;
pNode->GetEnum(&spNodeEnum);
spNodeEnum->Next(1, &pCurrentNode, &nNumReturned); while (nNumReturned) { // All containers go into the scope pane and automatically get
// put into the result pane for us by the MMC
//
if (!pCurrentNode->IsContainer()) { AddResultPaneItem(pComponent, pCurrentNode); } pCurrentNode->Release(); spNodeEnum->Next(1, &pCurrentNode, &nNumReturned); } } } else if (hint == RESULT_PANE_REPAINT) { if (spSelectedNode == NULL) return S_OK; // no selection for our IComponentData
//
// data contains the container whose result pane has to be refreshed
//
ITFSNode * pNode = reinterpret_cast<ITFSNode *>(data); //if (pNode == NULL)
// pContainer = m_pSelectedNode; // passing NULL means apply to the current selection
//
// update all the nodes in the result pane
//
SPITFSNodeEnum spNodeEnum; ITFSNode * pCurrentNode; ULONG nNumReturned = 0;
pNode->GetEnum(&spNodeEnum);
spNodeEnum->Next(1, &pCurrentNode, &nNumReturned); while (nNumReturned) { // All containers go into the scope pane and automatically get
// put into the result pane for us by the MMC
//
if (!pCurrentNode->IsContainer()) { ChangeResultPaneItem(pComponent, pCurrentNode, RESULT_PANE_CHANGE_ITEM); }
pCurrentNode->Release(); spNodeEnum->Next(1, &pCurrentNode, &nNumReturned); } } else if ( (hint == RESULT_PANE_ADD_ITEM) || (hint == RESULT_PANE_DELETE_ITEM) || (hint & RESULT_PANE_CHANGE_ITEM)) { ITFSNode * pNode = reinterpret_cast<ITFSNode *>(data); Assert(pNode != NULL); //
// consider only if the parent is selected, otherwise will enumerate later when selected
//
SPITFSNode spParentNode; pNode->GetParent(&spParentNode); if (spSelectedNode == spParentNode) { if (hint & RESULT_PANE_CHANGE_ITEM) { ChangeResultPaneItem(pComponent, pNode, hint); } else if ( hint == RESULT_PANE_ADD_ITEM) { AddResultPaneItem(pComponent, pNode); } else if ( hint == RESULT_PANE_DELETE_ITEM) { DeleteResultPaneItem(pComponent, pNode); } } } else if ( hint == RESULT_PANE_SET_VIRTUAL_LB_SIZE ) { SPINTERNAL spInternal = ExtractInternalFormat(pDataObject); ITFSNode * pNode = reinterpret_cast<ITFSNode *>(spInternal->m_cookie);
if (pNode == spSelectedNode) { SetVirtualLbSize(pComponent, data); } } else if ( hint == RESULT_PANE_CLEAR_VIRTUAL_LB ) { SPINTERNAL spInternal = ExtractInternalFormat(pDataObject); ITFSNode * pNode = reinterpret_cast<ITFSNode *>(spInternal->m_cookie);
if (pNode == spSelectedNode) { ClearVirtualLb(pComponent, data); } } else if ( hint == RESULT_PANE_EXPAND ) { SPINTERNAL spInternal = ExtractInternalFormat(pDataObject); ITFSNode * pNode = reinterpret_cast<ITFSNode *>(spInternal->m_cookie); SPIConsole spConsole;
pComponent->GetConsole(&spConsole); spConsole->Expand(pNode->GetData(TFS_DATA_SCOPEID), (BOOL)data);
} else if (hint == RESULT_PANE_SHOW_MESSAGE) { SPINTERNAL spInternal = ExtractInternalFormat(pDataObject); ITFSNode * pNode = reinterpret_cast<ITFSNode *>(spInternal->m_cookie);
BOOL fOldMessageView = (BOOL) data;
//
// do it only if selected
//
if (spSelectedNode == pNode) { if (!fOldMessageView) { SPIConsole spConsole;
pComponent->GetConsole(&spConsole); spConsole->SelectScopeItem(pNode->GetData(TFS_DATA_SCOPEID)); } else { ShowResultMessage(pComponent, spInternal->m_cookie, NULL, NULL); } } } else if (hint == RESULT_PANE_CLEAR_MESSAGE) { SPINTERNAL spInternal = ExtractInternalFormat(pDataObject); ITFSNode * pNode = reinterpret_cast<ITFSNode *>(spInternal->m_cookie);
BOOL fOldMessageView = (BOOL) data;
//
// do it only if selected
//
if (spSelectedNode == pNode) { if (fOldMessageView) { SPIConsole spConsole;
pComponent->GetConsole(&spConsole); spConsole->SelectScopeItem(pNode->GetData(TFS_DATA_SCOPEID)); } } }
// else if
return hrOK; }
/*!--------------------------------------------------------------------------
CBaseResultHandler::ChangeResultPaneItem Implementation of ChangeResultPaneItem Author: EricDav ---------------------------------------------------------------------------*/ HRESULT CBaseResultHandler::ChangeResultPaneItem ( ITFSComponent * pComponent, ITFSNode * pNode, LPARAM changeMask ) { Assert(changeMask & RESULT_PANE_CHANGE_ITEM); Assert(pNode != NULL); HRESULTITEM itemID; HRESULT hr = hrOK; SPIResultData pResultData;
CORg ( pComponent->GetResultData(&pResultData) );
CORg ( pResultData->FindItemByLParam(static_cast<LPARAM>(pNode->GetData(TFS_DATA_COOKIE)), &itemID) );
RESULTDATAITEM resultItem; ZeroMemory(&resultItem, sizeof(RESULTDATAITEM)); resultItem.itemID = itemID; if (changeMask & RESULT_PANE_CHANGE_ITEM_DATA) { resultItem.mask |= RDI_STR; resultItem.str = MMC_CALLBACK; } if (changeMask & RESULT_PANE_CHANGE_ITEM_ICON) { resultItem.mask |= RDI_IMAGE; resultItem.nImage = (int)pNode->GetData(TFS_DATA_IMAGEINDEX); } CORg ( pResultData->SetItem(&resultItem) ); CORg ( pResultData->UpdateItem(itemID) );
Error: return hr; }
/*!--------------------------------------------------------------------------
CBaseResultHandler::AddResultPaneItem Implementation of AddResultPaneItem Author: EricDav ---------------------------------------------------------------------------*/ HRESULT CBaseResultHandler::AddResultPaneItem ( ITFSComponent * pComponent, ITFSNode * pNode ) { Assert(pNode != NULL);
RESULTDATAITEM dataitemResult; HRESULT hr = hrOK;
SPIResultData pResultData;
CORg ( pComponent->GetResultData(&pResultData) );
ZeroMemory(&dataitemResult, sizeof(dataitemResult)); dataitemResult.mask = RDI_STR | RDI_IMAGE | RDI_PARAM; dataitemResult.str = MMC_CALLBACK; dataitemResult.mask |= SDI_IMAGE; dataitemResult.nImage = (int)pNode->GetData(TFS_DATA_IMAGEINDEX);
dataitemResult.lParam = static_cast<LPARAM>(pNode->GetData(TFS_DATA_COOKIE));
CORg ( pResultData->InsertItem(&dataitemResult) );
Error: return hr; }
/*!--------------------------------------------------------------------------
CBaseResultHandler::DeleteResultPaneItem Implementation of DeleteResultPaneItem Author: EricDav ---------------------------------------------------------------------------*/ HRESULT CBaseResultHandler::DeleteResultPaneItem ( ITFSComponent * pComponent, ITFSNode * pNode ) { Assert(pNode != NULL);
HRESULT hr = hrOK; HRESULTITEM itemID; SPIResultData pResultData;
CORg ( pComponent->GetResultData(&pResultData) );
CORg ( pResultData->FindItemByLParam(static_cast<LPARAM>(pNode->GetData(TFS_DATA_COOKIE)), &itemID) );
CORg ( pResultData->DeleteItem(itemID, 0 /* all cols */) );
Error: return hr; }
/*!--------------------------------------------------------------------------
CBaseResultHandler::SetVirtualLbSize Sets the virtual listbox count. Over-ride this if you need to specify and options. Author: EricDav ---------------------------------------------------------------------------*/ HRESULT CBaseResultHandler::SetVirtualLbSize ( ITFSComponent * pComponent, LONG_PTR data ) { HRESULT hr = hrOK; SPIResultData spResultData;
CORg (pComponent->GetResultData(&spResultData));
CORg (spResultData->SetItemCount((int) data, MMCLV_UPDATE_NOINVALIDATEALL));
Error: return hr; }
/*!--------------------------------------------------------------------------
CBaseResultHandler::ClearVirtualLb Sets the virtual listbox count. Over-ride this if you need to specify and options. Author: EricDav ---------------------------------------------------------------------------*/ HRESULT CBaseResultHandler::ClearVirtualLb ( ITFSComponent * pComponent, LONG_PTR data ) { HRESULT hr = hrOK; SPIResultData spResultData;
CORg (pComponent->GetResultData(&spResultData));
CORg (spResultData->SetItemCount((int) data, 0));
Error: return hr; }
/*!--------------------------------------------------------------------------
CBaseResultHandler::OnResultActivate - Author: KennT ---------------------------------------------------------------------------*/ HRESULT CBaseResultHandler::OnResultActivate(ITFSComponent *pComponent, MMC_COOKIE cookie, LPARAM arg, LPARAM param) { Trace0("IComponent::Notify(MMCN_ACTIVATE) received\n"); return S_FALSE; }
/*!--------------------------------------------------------------------------
CBaseResultHandler::OnResultItemClkOrDblClk - Author: KennT ---------------------------------------------------------------------------*/ HRESULT CBaseResultHandler::OnResultItemClkOrDblClk(ITFSComponent *pComponent, MMC_COOKIE cookie, LPARAM arg, LPARAM param, BOOL bDoubleClick) { if (!bDoubleClick) Trace0("IComponent::Notify(MMCN_CLK) received\n"); else Trace0("IComponent::Notify(MMCN_DBLCLK) received\n");
// return false so that MMC does the default behavior (open the node);
return S_FALSE; }
/*!--------------------------------------------------------------------------
CBaseResultHandler::OnResultShow - Author: KennT ---------------------------------------------------------------------------*/ HRESULT CBaseResultHandler::OnResultShow(ITFSComponent * pComponent, MMC_COOKIE cookie, LPARAM arg, LPARAM lParam) { // Note - arg is TRUE when it is time to enumerate
if (arg == TRUE) { // show the result view message if there is one
ShowResultMessage(pComponent, cookie, arg, lParam);
// Show the headers for this nodetype
LoadColumns(pComponent, cookie, arg, lParam); EnumerateResultPane(pComponent, cookie, arg, lParam);
SortColumns(pComponent); SPITFSNode spNode; m_spResultNodeMgr->FindNode(cookie, &spNode); pComponent->SetSelectedNode(spNode); } else { SaveColumns(pComponent, cookie, arg, lParam); pComponent->SetSelectedNode(NULL); // Free data associated with the result pane items, because
// your node is no longer being displayed.
// Note: The console will remove the items from the result pane
}
return hrOK; }
/*!--------------------------------------------------------------------------
CBaseResultHandler::OnResultColumnClick - Author: KennT ---------------------------------------------------------------------------*/ HRESULT CBaseResultHandler::OnResultColumnClick(ITFSComponent *pComponent, LPARAM iColumn, BOOL fAscending) { return S_FALSE; }
/*!--------------------------------------------------------------------------
CBaseResultHandler::OnResultColumnsChanged - Author: KennT ---------------------------------------------------------------------------*/ HRESULT CBaseResultHandler::OnResultColumnsChanged(ITFSComponent *, LPDATAOBJECT, MMC_VISIBLE_COLUMNS *) { return S_FALSE; }
/*!--------------------------------------------------------------------------
CBaseResultHandler::ShowResultMessage - Author: EricDav ---------------------------------------------------------------------------*/ HRESULT CBaseResultHandler::ShowResultMessage(ITFSComponent * pComponent, MMC_COOKIE cookie, LPARAM arg, LPARAM lParam) { HRESULT hr = hrOK; SPIMessageView spMessageView; SPIUnknown spUnknown; SPIConsole spConsole; LPOLESTR pText = NULL;
// put up our message text
if (m_fMessageView) { if (pComponent) { CORg ( pComponent->GetConsole(&spConsole) );
CORg ( spConsole->QueryResultView(&spUnknown) );
CORg ( spMessageView.HrQuery(spUnknown) ); }
// set the title text
pText = (LPOLESTR)CoTaskMemAlloc (sizeof(OLECHAR) * (m_strMessageTitle.GetLength() + 1)); if (pText) { lstrcpy (pText, m_strMessageTitle); CORg(spMessageView->SetTitleText(pText)); // bugid:148215 vivekk
CoTaskMemFree(pText); }
// set the body text
pText = (LPOLESTR)CoTaskMemAlloc (sizeof(OLECHAR) * (m_strMessageBody.GetLength() + 1)); if (pText) { lstrcpy (pText, m_strMessageBody); CORg(spMessageView->SetBodyText(pText)); // bugid:148215 vivekk
CoTaskMemFree(pText); }
// set the icon
CORg(spMessageView->SetIcon(m_lMessageIcon));
COM_PROTECT_ERROR_LABEL; }
return hr; }
/*!--------------------------------------------------------------------------
CBaseResultHandler::ShowMessage - Author: EricDav ---------------------------------------------------------------------------*/ HRESULT CBaseResultHandler::ShowMessage(ITFSNode * pNode, LPCTSTR pszTitle, LPCTSTR pszBody, IconIdentifier lIcon) { HRESULT hr = hrOK; SPIComponentData spCompData; SPIConsole spConsole; SPIDataObject spDataObject; IDataObject * pDataObject; BOOL fOldMessageView; m_strMessageTitle = pszTitle; m_strMessageBody = pszBody; m_lMessageIcon = lIcon;
fOldMessageView = m_fMessageView; m_fMessageView = TRUE;
// tell the views to update themselves here
m_spResultNodeMgr->GetComponentData(&spCompData);
CORg ( spCompData->QueryDataObject((MMC_COOKIE) pNode, CCT_SCOPE, &pDataObject) ); spDataObject = pDataObject;
CORg ( m_spResultNodeMgr->GetConsole(&spConsole) ); CORg ( spConsole->UpdateAllViews(pDataObject, (LPARAM) fOldMessageView, RESULT_PANE_SHOW_MESSAGE) );
COM_PROTECT_ERROR_LABEL; return hr; }
/*!--------------------------------------------------------------------------
CBaseResultHandler::ClearMessage - Author: EricDav ---------------------------------------------------------------------------*/ HRESULT CBaseResultHandler::ClearMessage(ITFSNode * pNode) { HRESULT hr = hrOK; SPIComponentData spCompData; SPIConsole spConsole; SPIDataObject spDataObject; IDataObject * pDataObject; BOOL fOldMessageView;
fOldMessageView = m_fMessageView; m_fMessageView = FALSE;
// tell the views to update themselves here
m_spResultNodeMgr->GetComponentData(&spCompData);
CORg ( spCompData->QueryDataObject((MMC_COOKIE) pNode, CCT_SCOPE, &pDataObject) ); spDataObject = pDataObject;
CORg ( m_spResultNodeMgr->GetConsole(&spConsole) ); CORg ( spConsole->UpdateAllViews(pDataObject, (LPARAM) fOldMessageView, RESULT_PANE_CLEAR_MESSAGE) );
COM_PROTECT_ERROR_LABEL; return hr; }
/*!--------------------------------------------------------------------------
CBaseResultHandler::LoadColumns - Author: EricDav ---------------------------------------------------------------------------*/ HRESULT CBaseResultHandler::LoadColumns(ITFSComponent * pComponent, MMC_COOKIE cookie, LPARAM arg, LPARAM lParam) { AFX_MANAGE_STATE(AfxGetStaticModuleState());
SPIHeaderCtrl spHeaderCtrl; pComponent->GetHeaderCtrl(&spHeaderCtrl);
CString str; int i = 0;
if (!m_pColumnStringIDs) return hrOK;
if (!m_fMessageView) { while (TRUE) { int nColumnWidth = AUTO_WIDTH;
if ( 0 == m_pColumnStringIDs[i] ) break; str.LoadString(m_pColumnStringIDs[i]); if (m_pColumnWidths) nColumnWidth = m_pColumnWidths[i];
spHeaderCtrl->InsertColumn(i, const_cast<LPTSTR>((LPCWSTR)str), m_nColumnFormat, nColumnWidth); i++; } }
return hrOK; }
/*!--------------------------------------------------------------------------
CBaseResultHandler::SaveColumns - Author: KennT ---------------------------------------------------------------------------*/ HRESULT CBaseResultHandler::SaveColumns(ITFSComponent * pComponent, MMC_COOKIE cookie, LPARAM arg, LPARAM lParam) { return S_FALSE; }
/*!--------------------------------------------------------------------------
CBaseResultHandler::SortColumns - Author: KennT ---------------------------------------------------------------------------*/ HRESULT CBaseResultHandler::SortColumns(ITFSComponent *pComponent) { return S_FALSE; }
/*!--------------------------------------------------------------------------
CBaseResultHandler::EnumerateResultPane - Author: EricDav ---------------------------------------------------------------------------*/ HRESULT CBaseResultHandler::EnumerateResultPane(ITFSComponent * pComponent, MMC_COOKIE cookie, LPARAM arg, LPARAM lParam) { AFX_MANAGE_STATE(AfxGetStaticModuleState());
SPITFSNode spContainer; m_spResultNodeMgr->FindNode(cookie, &spContainer);
//
// Walk the list of children to see if there's anything
// to put in the result pane
//
SPITFSNodeEnum spNodeEnum; ITFSNode * pCurrentNode; ULONG nNumReturned = 0;
spContainer->GetEnum(&spNodeEnum);
spNodeEnum->Next(1, &pCurrentNode, &nNumReturned); while (nNumReturned) { //
// All containers go into the scope pane and automatically get
// put into the result pane for us by the MMC
//
if (!pCurrentNode->IsContainer() && pCurrentNode->IsVisible()) { AddResultPaneItem(pComponent, pCurrentNode); }
pCurrentNode->Release(); spNodeEnum->Next(1, &pCurrentNode, &nNumReturned); }
return hrOK; } /*!--------------------------------------------------------------------------
CBaseResultHandler::OnResultSelect - Author: EricDav ---------------------------------------------------------------------------*/ HRESULT CBaseResultHandler::OnResultSelect(ITFSComponent *pComponent, LPDATAOBJECT pDataObject, MMC_COOKIE cookie, LPARAM arg, LPARAM lParam) { HRESULT hr = hrOK; SPIConsoleVerb spConsoleVerb; CORg (pComponent->GetConsoleVerb(&spConsoleVerb));
// Default is to turn everything off
spConsoleVerb->SetVerbState(MMC_VERB_OPEN, HIDDEN, TRUE); spConsoleVerb->SetVerbState(MMC_VERB_COPY, HIDDEN, TRUE); spConsoleVerb->SetVerbState(MMC_VERB_PASTE, HIDDEN, TRUE); spConsoleVerb->SetVerbState(MMC_VERB_DELETE, HIDDEN, TRUE); spConsoleVerb->SetVerbState(MMC_VERB_PROPERTIES, HIDDEN, TRUE); spConsoleVerb->SetVerbState(MMC_VERB_RENAME, HIDDEN, TRUE); spConsoleVerb->SetVerbState(MMC_VERB_REFRESH, ENABLED, TRUE); spConsoleVerb->SetVerbState(MMC_VERB_PRINT, HIDDEN, TRUE);
Error: return hr; }
/*!--------------------------------------------------------------------------
CBaseResultHandler::OnResultInitOcx - Author: EricDav ---------------------------------------------------------------------------*/ HRESULT CBaseResultHandler::OnResultInitOcx(ITFSComponent *pComponent, LPDATAOBJECT pDataObject, MMC_COOKIE cookie, LPARAM arg, LPARAM lParam) { // arg - not used
// param - contains IUnknown to the OCX
return S_FALSE; }
/*!--------------------------------------------------------------------------
CBaseResultHandler::FIsTaskpadPreferred - Author: EricDav ---------------------------------------------------------------------------*/ HRESULT CBaseResultHandler::FIsTaskpadPreferred(ITFSComponent *pComponent) { HRESULT hr = hrOK; SPIConsole spConsole;
pComponent->GetConsole(&spConsole); hr = spConsole->IsTaskpadViewPreferred();
//Error:
return hr; }
/*!--------------------------------------------------------------------------
CBaseResultHandler::DoTaskpadResultSelect Handlers with taskpads should override the OnResultSelect and call this to handle setting of the selected node. Author: EricDav ---------------------------------------------------------------------------*/ HRESULT CBaseResultHandler::DoTaskpadResultSelect(ITFSComponent *pComponent, LPDATAOBJECT pDataObject, MMC_COOKIE cookie, LPARAM arg, LPARAM lParam, BOOL bTaskPadView) { AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
SPITFSNode spNode, spSelectedNode; HRESULT hr = hrOK;
// if this node is being selected then set the selected node.
// this node with a taskpad gets the MMCN_SHOW when the node is
// de-selected, so that will set the selected node to NULL.
if ( (HIWORD(arg) == TRUE) && bTaskPadView ) { m_spResultNodeMgr->FindNode(cookie, &spNode); pComponent->GetSelectedNode(&spSelectedNode);
// in the normal case MMC will call whichever node is selected to
// notify that is being de-selected. In this case our handler will
// set the selected node to NULL. If the selected node is not null then
// we are just being notified of something like a selection for a context
// menu...
if (!spSelectedNode) pComponent->SetSelectedNode(spNode); }
// call the base class to handle anything else
return hr; }
/*!--------------------------------------------------------------------------
CBaseResultHandler::OnGetResultViewType MMC calls this to get the result view information Author: EricDav ---------------------------------------------------------------------------*/ HRESULT CBaseResultHandler::OnGetResultViewType ( ITFSComponent * pComponent, MMC_COOKIE cookie, LPOLESTR * ppViewType, long * pViewOptions ) { HRESULT hr = S_FALSE;
//
// use the MMC default result view if no message is specified.
// Multiple selection, or virtual listbox, override this function.
// See MMC sample code for example. The Message view uses an OCX...
//
if (m_fMessageView) { // create the message view thingie
*pViewOptions = MMC_VIEW_OPTIONS_NOLISTVIEWS;
LPOLESTR psz = NULL; StringFromCLSID(CLSID_MessageView, &psz);
USES_CONVERSION;
if (psz != NULL) { *ppViewType = psz; hr = S_OK; } }
return hr; }
/*!--------------------------------------------------------------------------
CBaseResultHandler::GetVirtualString called when the virtual listbox needs information on an index Author: EricDav ---------------------------------------------------------------------------*/ LPCWSTR CBaseResultHandler::GetVirtualString ( int nIndex, int nCol ) { return NULL; }
/*!--------------------------------------------------------------------------
CBaseResultHandler::GetVirtualImage called when the virtual listbox needs an image index for an item Author: EricDav ---------------------------------------------------------------------------*/ int CBaseResultHandler::GetVirtualImage ( int nIndex ) { return 0; }
HRESULT CBaseResultHandler::OnResultMinimize(ITFSComponent *pComponent, MMC_COOKIE cookie, LPARAM arg, LPARAM lParam) { Trace0("IComponent::Notify(MMCN_MINIMIZE) received\n"); return S_FALSE; }
HRESULT CBaseResultHandler::OnResultDelete(ITFSComponent * pComponent, LPDATAOBJECT pDataObject, MMC_COOKIE cookie, LPARAM arg, LPARAM lParam) { Trace0("IComponent::Notify(MMCN_DELETE) received\n"); return S_FALSE; }
HRESULT CBaseResultHandler::OnResultRename(ITFSComponent * pComponent, LPDATAOBJECT pDataObject, MMC_COOKIE cookie, LPARAM arg, LPARAM lParam) { Trace0("IComponent::Notify(MMCN_RENAME) received\n"); return S_FALSE; }
HRESULT CBaseResultHandler::OnResultRefresh(ITFSComponent * pComponent, LPDATAOBJECT pDataObject, MMC_COOKIE cookie, LPARAM arg, LPARAM lParam) { Trace0("IComponent::Notify(MMCN_REFRESH) received\n"); return S_FALSE; }
HRESULT CBaseResultHandler::OnResultContextHelp(ITFSComponent * pComponent, LPDATAOBJECT pDataObject, MMC_COOKIE cookie, LPARAM arg, LPARAM lParam) { Trace0("IComponent::Notify(MMCN_CONTEXTHELP) received\n"); return S_FALSE; }
HRESULT CBaseResultHandler::OnResultQueryPaste(ITFSComponent * pComponent, LPDATAOBJECT pDataObject, MMC_COOKIE cookie, LPARAM arg, LPARAM lParam) { Trace0("IComponent::Notify(MMCN_QUERY_PASTE) received\n"); return S_FALSE; }
HRESULT CBaseResultHandler::OnResultVerbCopy(ITFSComponent *pComponent, MMC_COOKIE cookie, LPARAM arg, LPARAM lParam) { Trace0("IComponent::Notify(MMCN_VERB_COPY) received\n"); return S_FALSE; }
HRESULT CBaseResultHandler::OnResultVerbPaste(ITFSComponent *pComponent, MMC_COOKIE cookie, LPARAM arg, LPARAM lParam) { Trace0("IComponent::Notify(MMCN_VERB_PASTE) received\n"); return S_FALSE; }
HRESULT CBaseResultHandler::OnResultVerbDelete(ITFSComponent *pComponent, MMC_COOKIE cookie, LPARAM arg, LPARAM lParam) { Trace0("IComponent::Notify(MMCN_VERB_DELETE) received\n"); return S_FALSE; }
HRESULT CBaseResultHandler::OnResultVerbProperties(ITFSComponent *pComponent, MMC_COOKIE cookie, LPARAM arg, LPARAM lParam) { Trace0("IComponent::Notify(MMCN_VERB_PROPERTIES) received\n"); return S_FALSE; }
HRESULT CBaseResultHandler::OnResultVerbRename(ITFSComponent *pComponent, MMC_COOKIE cookie, LPARAM arg, LPARAM lParam) { Trace0("IComponent::Notify(MMCN_VERB_RENAME) received\n"); return S_FALSE; }
HRESULT CBaseResultHandler::OnResultVerbRefresh(ITFSComponent *pComponent, MMC_COOKIE cookie, LPARAM arg, LPARAM lParam) { Trace0("IComponent::Notify(MMCN_VERB_REFRESH) received\n"); return S_FALSE; }
HRESULT CBaseResultHandler::OnResultVerbPrint(ITFSComponent *pComponent, MMC_COOKIE cookie, LPARAM arg, LPARAM lParam) { Trace0("IComponent::Notify(MMCN_VERB_PRINT) received\n"); return S_FALSE; }
HRESULT CBaseResultHandler::OnResultRestoreView(ITFSComponent *pComponent, MMC_COOKIE cookie, LPARAM arg, LPARAM lParam) { Trace0("IComponent::Notify(MMCN_RESTORE_VIEW) received\n"); return S_FALSE; }
|