WindowsXP-SP1/admin/activec/nodemgr/viewdata.cpp
2020-09-30 16:53:49 +02:00

593 lines
17 KiB
C++

//____________________________________________________________________________
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1997 - 1999
//
// File: ViewData.cpp
//
// Contents:
//
// Classes:
//
// Functions:
//
// History: 5/18/1997 RaviR Created
//____________________________________________________________________________
//
#include "stdafx.h"
#pragma hdrstop
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#include "menubtn.h"
#include "viewdata.h"
#include "multisel.h"
#include "colwidth.h"
#include "conview.h" // for CConsoleView
#include "conframe.h"
void CViewData::CreateControlbarsCache()
{
ASSERT(m_spControlbarsCache == NULL);
CComObject<CControlbarsCache>* pObj;
HRESULT hr = CComObject<CControlbarsCache>::CreateInstance(&pObj);
ASSERT(SUCCEEDED(hr));
pObj->SetViewData(this);
if (SUCCEEDED(hr))
m_spControlbarsCache = pObj;
}
STDMETHODIMP CNodeInitObject::InitViewData(LONG_PTR lViewData)
{
MMC_TRY
if (lViewData == NULL)
return E_INVALIDARG;
SViewData* pVD = reinterpret_cast<SViewData*>(lViewData);
ASSERT(pVD != NULL);
ASSERT(pVD->m_spVerbSet == NULL);
CViewData* pCVD = reinterpret_cast<CViewData*>(lViewData);
ASSERT(pCVD != NULL);
if (pVD->m_spVerbSet == NULL)
{
CComObject<CVerbSet>* pVerb;
HRESULT hr = CComObject<CVerbSet>::CreateInstance(&pVerb);
if (FAILED(hr))
return hr;
ASSERT(pVerb != NULL);
pVD->m_spVerbSet = pVerb;
ASSERT(pVD->m_spVerbSet != NULL);
if (pVD->m_spVerbSet == NULL)
return E_NOINTERFACE;
}
// See if the Column Persistence Object was created,
// else create one.
if ( pCVD && (pCVD->IsColumnPersistObjectInitialized() == false) )
{
// Create the column persistence object
CComObject<CColumnPersistInfo>* pColData;
HRESULT hr = CComObject<CColumnPersistInfo>::CreateInstance (&pColData);
ASSERT(SUCCEEDED(hr) && pColData != NULL);
if (FAILED(hr))
{
CStr strMsg;
strMsg.LoadString(GetStringModule(), IDS_ColumnsCouldNotBePersisted);
::MessageBox(NULL, strMsg, NULL, MB_OK|MB_SYSTEMMODAL);
}
// Save a pointer to Column persistence object in CViewData.
pCVD->InitializeColumnPersistObject(pColData, pColData);
}
return S_OK;
MMC_CATCH
}
STDMETHODIMP CNodeInitObject::CleanupViewData(LONG_PTR lViewData)
{
SViewData* pVD = reinterpret_cast<SViewData*>(lViewData);
if (pVD->m_pMultiSelection != NULL)
{
pVD->m_pMultiSelection->Release();
pVD->m_pMultiSelection = NULL;
}
return S_OK;
}
// Buttons
//
void CViewData::ShowStdButtons(bool bShow)
{
DECLARE_SC(sc, _T("CViewData::ShowStdButtons"));
CStdVerbButtons* pStdToolbar = GetStdVerbButtons();
if (NULL == pStdToolbar)
{
sc = E_UNEXPECTED;
return;
}
sc = pStdToolbar->ScShow(bShow);
}
void CViewData::ShowSnapinButtons(bool bShow)
{
DECLARE_SC(sc, _T("CViewData::ShowSnapinButtons"));
IControlbarsCache* pICBC = GetControlbarsCache();
if (pICBC == NULL)
{
sc = E_UNEXPECTED;
return;
}
CControlbarsCache* pCBC = dynamic_cast<CControlbarsCache*>(pICBC);
if (pCBC == NULL)
{
sc = E_UNEXPECTED;
return;
}
sc = pCBC->ScShowToolbars(bShow);
}
bool IsFlagEnabled(DWORD cache, DWORD flag)
{
return ((cache & flag) == flag) ? true : false;
}
void CViewData::UpdateToolbars(DWORD dwTBNew)
{
ShowStdButtons(IsFlagEnabled(dwTBNew, STD_BUTTONS));
ShowSnapinButtons(IsFlagEnabled(dwTBNew, SNAPIN_BUTTONS));
SetToolbarsDisplayed(dwTBNew);
}
void CViewData::ToggleToolbar(long lMenuID)
{
DWORD dwTBOld = GetToolbarsDisplayed();
DWORD dwTBNew = 0;
DECLARE_SC(sc, _T("CViewData::ToggleToolbar"));
switch (lMenuID)
{
case MID_STD_MENUS:
{
dwTBNew = dwTBOld ^ STD_MENUS;
SetToolbarsDisplayed(dwTBNew);
CConsoleFrame* pFrame = GetConsoleFrame();
sc = ScCheckPointers(pFrame, E_UNEXPECTED);
if (sc)
return;
sc = pFrame->ScShowMMCMenus(IsStandardMenusAllowed());
if (sc)
return;
}
break;
case MID_STD_BUTTONS:
dwTBNew = dwTBOld ^ STD_BUTTONS;
ShowStdButtons(bool(dwTBNew & STD_BUTTONS));
break;
case MID_SNAPIN_MENUS:
{
dwTBNew = dwTBOld ^ SNAPIN_MENUS;
SetToolbarsDisplayed(dwTBNew);
CMenuButtonsMgr* pMenuButtonsMgr = GetMenuButtonsMgr();
if (NULL != pMenuButtonsMgr)
{
sc = pMenuButtonsMgr->ScToggleMenuButton(IsSnapinMenusAllowed());
}
}
break;
case MID_SNAPIN_BUTTONS:
dwTBNew = dwTBOld ^ SNAPIN_BUTTONS;
ShowSnapinButtons(bool(dwTBNew & SNAPIN_BUTTONS));
break;
default:
ASSERT(0 && "Unexpected");
return;
}
SetToolbarsDisplayed(dwTBNew);
}
BOOL CViewData::RetrieveColumnData( const CLSID& refSnapinCLSID,
const SColumnSetID& colID,
CColumnSetData& columnSetData)
{
CColumnPersistInfo* pColPersInfo = NULL;
if ( (NULL != m_pConsoleData) && (NULL != m_pConsoleData->m_spPersistStreamColumnData) )
{
pColPersInfo = dynamic_cast<CColumnPersistInfo*>(
static_cast<IPersistStream*>(m_pConsoleData->m_spPersistStreamColumnData));
if (pColPersInfo)
return pColPersInfo->RetrieveColumnData( refSnapinCLSID, colID,
GetViewID(), columnSetData);
}
return FALSE;
}
BOOL CViewData::SaveColumnData( const CLSID& refSnapinCLSID,
const SColumnSetID& colID,
CColumnSetData& columnSetData)
{
CColumnPersistInfo* pColPersInfo = NULL;
if ( (NULL != m_pConsoleData) && (NULL != m_pConsoleData->m_spPersistStreamColumnData) )
{
pColPersInfo = dynamic_cast<CColumnPersistInfo*>(
static_cast<IPersistStream*>(m_pConsoleData->m_spPersistStreamColumnData));
if (pColPersInfo)
return pColPersInfo->SaveColumnData( refSnapinCLSID, colID,
GetViewID(), columnSetData);
}
return FALSE;
}
//+-------------------------------------------------------------------
//
// Member: CViewData::ScSaveColumnInfoList
//
// Synopsis: Save the CColumnInfoList for given snapin/col-id.
//
// Arguments: [refSnapinCLSID] - snapin GUID
// [colID] - column-set-id
// [colInfoList] - data for columns in a view.
//
// Returns: SC
//
//--------------------------------------------------------------------
SC CViewData::ScSaveColumnInfoList(const CLSID& refSnapinCLSID, const SColumnSetID& colID,
const CColumnInfoList& colInfoList)
{
DECLARE_SC(sc, _T("CViewData::ScSaveColumnInfoList"));
sc = ScCheckPointers(m_pConsoleData, E_UNEXPECTED);
if (sc)
return sc;
sc = ScCheckPointers(m_pConsoleData->m_spPersistStreamColumnData, E_UNEXPECTED);
if (sc)
return sc;
CColumnPersistInfo* pColPersInfo = dynamic_cast<CColumnPersistInfo*>(
static_cast<IPersistStream*>(m_pConsoleData->m_spPersistStreamColumnData));
sc = ScCheckPointers(pColPersInfo, E_UNEXPECTED);
if (sc)
return sc;
CColumnSetData colSetData;
// Dont care if below succeeds or not, just merge sort & column data.
pColPersInfo->RetrieveColumnData(refSnapinCLSID, colID, GetViewID(), colSetData);
colSetData.set_ColumnInfoList(colInfoList);
sc = pColPersInfo->SaveColumnData(refSnapinCLSID, colID, GetViewID(), colSetData) ? S_OK : E_FAIL;
if (sc)
return sc;
return (sc);
}
//+-------------------------------------------------------------------
//
// Member: CViewData::ScSaveColumnSortData
//
// Synopsis: Save the given sort data for persistence into CColumnSetData.
//
// Arguments: [refSnapinCLSID] - snapin GUID
// [colID] - column-set-id
// [colSortInfo] - sort-data.
//
// Returns: SC
//
//--------------------------------------------------------------------
SC CViewData::ScSaveColumnSortData(const CLSID& refSnapinCLSID, const SColumnSetID& colID,
const CColumnSortInfo& colSortInfo)
{
DECLARE_SC(sc, _T("CViewData::ScSaveColumnSortData"));
sc = ScCheckPointers(m_pConsoleData, E_UNEXPECTED);
if (sc)
return sc;
sc = ScCheckPointers(m_pConsoleData->m_spPersistStreamColumnData, E_UNEXPECTED);
if (sc)
return sc;
CColumnPersistInfo* pColPersInfo = dynamic_cast<CColumnPersistInfo*>(
static_cast<IPersistStream*>(m_pConsoleData->m_spPersistStreamColumnData));
sc = ScCheckPointers(pColPersInfo, E_UNEXPECTED);
if (sc)
return sc;
CColumnSetData colSetData;
// Dont care if below succeeds or not, just merge sort & column data.
pColPersInfo->RetrieveColumnData(refSnapinCLSID, colID, GetViewID(), colSetData);
CColumnSortList *pColSortList = colSetData.get_ColumnSortList();
sc = ScCheckPointers(pColSortList, E_UNEXPECTED);
if (sc)
return sc;
pColSortList->clear();
pColSortList->push_back(colSortInfo);
sc = pColPersInfo->SaveColumnData(refSnapinCLSID, colID, GetViewID(), colSetData) ? S_OK : E_FAIL;
if (sc)
return sc;
return (sc);
}
VOID CViewData::DeleteColumnData( const CLSID& refSnapinCLSID,
const SColumnSetID& colID)
{
CColumnPersistInfo* pColPersInfo = NULL;
if ( (NULL != m_pConsoleData) && (NULL != m_pConsoleData->m_spPersistStreamColumnData) )
{
pColPersInfo = dynamic_cast<CColumnPersistInfo*>(
static_cast<IPersistStream*>(m_pConsoleData->m_spPersistStreamColumnData));
if (pColPersInfo)
pColPersInfo->DeleteColumnData( refSnapinCLSID, colID, GetViewID());
}
return;
}
/*+-------------------------------------------------------------------------*
* CViewSettings::GetSelectedNode
*
* Returns a pointer to the selected node in the view.
*--------------------------------------------------------------------------*/
CNode* CViewData::GetSelectedNode () const
{
CConsoleView* pConsoleView = GetConsoleView();
if (pConsoleView == NULL)
return (NULL);
HNODE hNode = pConsoleView->GetSelectedNode();
return (CNode::FromHandle(hNode));
}
//+-------------------------------------------------------------------
//
// Member: ScUpdateStdbarVerbs
//
// Synopsis: Update all the std-toolbar buttons with
// current verb state, this is just a wrapper
// around CStdVerbButtons::ScUpdateStdbarVerbs.
//
// Arguments: None
//
// Returns: SC
//
//--------------------------------------------------------------------
SC CViewData::ScUpdateStdbarVerbs()
{
DECLARE_SC (sc, _T("CViewData::ScUpdateStdbarVerbs"));
CStdVerbButtons* pStdVerbButtons = GetStdVerbButtons();
if (NULL == pStdVerbButtons)
{
sc = E_UNEXPECTED;
return sc;
}
// Update the std-verb tool-buttons.
sc = pStdVerbButtons->ScUpdateStdbarVerbs(GetVerbSet());
return sc;
}
//+-------------------------------------------------------------------
//
// Member: ScUpdateStdbarVerb
//
// Synopsis: Update given verb's tool-button, this is just
// a wrapper around CStdVerbButtons::ScUpdateStdbarVerb.
//
// Arguments: [cVerb] - the verb whose button to be updated.
//
// Returns: SC
//
//--------------------------------------------------------------------
SC CViewData::ScUpdateStdbarVerb (MMC_CONSOLE_VERB cVerb)
{
DECLARE_SC (sc, _T("CViewData::ScUpdateStdbarVerb"));
CStdVerbButtons* pStdVerbButtons = GetStdVerbButtons();
if (NULL == pStdVerbButtons)
{
sc = E_UNEXPECTED;
return sc;
}
// Update the std-verb tool-buttons.
sc = pStdVerbButtons->ScUpdateStdbarVerb(cVerb, GetVerbSet());
return sc;
}
//+-------------------------------------------------------------------
//
// Member: ScUpdateStdbarVerb
//
// Synopsis: Update given verb's tool-button, this is just
// a wrapper around CStdVerbButtons::ScUpdateStdbarVerb.
//
// Arguments: [cVerb] - the verb whose button to be updated.
// [byState] - State of the button to be updated.
// [bFlag] - State.
//
// Returns: SC
//
//--------------------------------------------------------------------
SC CViewData::ScUpdateStdbarVerb (MMC_CONSOLE_VERB cVerb, BYTE byState, BOOL bFlag)
{
DECLARE_SC (sc, _T("CViewData::ScUpdateStdbarVerb"));
CStdVerbButtons* pStdVerbButtons = GetStdVerbButtons();
if (NULL == pStdVerbButtons)
{
sc = E_UNEXPECTED;
return sc;
}
// Update the std-verb tool-buttons.
sc = pStdVerbButtons->ScUpdateStdbarVerb(cVerb, byState, bFlag);
return sc;
}
//+-------------------------------------------------------------------
//
// Member: CViewData::ScIsVerbSetContextForMultiSelect
//
// Synopsis: Get the selection context data stored in verb-set.
//
// Arguments: [bMultiSelection] - [out] Is the verb context for multiseleciton?
//
// Returns: SC,
//
//--------------------------------------------------------------------
SC CViewData::ScIsVerbSetContextForMultiSelect(bool& bMultiSelection)
{
DECLARE_SC(sc, _T("CNode::ScIsVerbSetContextForMultiSelect"));
bMultiSelection = false;
// 1. Get the verb set.
CVerbSet* pVerbSet = dynamic_cast<CVerbSet*>(GetVerbSet() );
sc = ScCheckPointers( pVerbSet, E_UNEXPECTED );
if (sc)
return sc;
// 2. Get context information from permanent verb-set.
CNode *pNode = NULL;
LPARAM lCookie = NULL;
bool bScopePane;
bool bSelected;
SC scNoTrace = pVerbSet->ScGetVerbSetContext(pNode, bScopePane, lCookie, bSelected);
if (scNoTrace)
return sc; // ignore the error.
if (LVDATA_MULTISELECT == lCookie)
{
bMultiSelection = true;
return sc;
}
return sc;
}
//+-------------------------------------------------------------------
//
// Member: CViewData::ScGetVerbSetData
//
// Synopsis: Get the selection context data stored in verb-set.
//
// Arguments: [ppDataObject] - [out] dataobject of item in the verb-set context.
// This is the item for which last non-temporary MMCN_SELECT
// was sent last time.
// [ppComponent] - [out] the above item's component
// [bScope] - [out] Is the above item scope or result?
// [bSelected] - [out] Is the above item selected or not?
// [ppszNodeName] - [out] If bScope is true the node name else the name of the node
// that owns result pane. This is for debug purposes only.
//
// Returns: SC
//
//--------------------------------------------------------------------
SC CViewData::ScGetVerbSetData(IDataObject **ppDataObject, CComponent **ppComponent,
bool& bScopeItem, bool& bSelected
#ifdef DBG
, LPCTSTR *ppszNodeName
#endif
)
{
DECLARE_SC(sc, _T("CNode::ScGetVerbSetData"));
sc = ScCheckPointers(ppDataObject, ppComponent);
if (sc)
return sc;
*ppDataObject = NULL;
*ppComponent = NULL;
// 1. Get the verb set.
CVerbSet* pVerbSet = dynamic_cast<CVerbSet*>(GetVerbSet() );
sc = ScCheckPointers( pVerbSet, E_UNEXPECTED );
if (sc)
return sc;
// 2. Get context information from permanent verb-set.
CNode *pNode = NULL;
LPARAM lCookie = NULL;
bool bScopePane;
SC scNoTrace = pVerbSet->ScGetVerbSetContext(pNode, bScopePane, lCookie, bSelected);
if (scNoTrace)
return scNoTrace;
sc = ScCheckPointers(pNode, E_UNEXPECTED);
if (sc)
return sc;
// 3. Get the dataobject from context information.
sc = pNode->ScGetDataObject(bScopePane, lCookie, bScopeItem, ppDataObject, ppComponent);
if (sc)
return sc;
#ifdef DBG
if (! ppszNodeName)
return (sc = E_INVALIDARG);
*ppszNodeName = pNode->GetDisplayName().data();
#endif
return (sc);
}