185 lines
5 KiB
C
185 lines
5 KiB
C
|
// ScopeMap.h - Create a map of Scope items.
|
||
|
//
|
||
|
// History: a-jsari 10/7/97 Initial version
|
||
|
//
|
||
|
// Copyright (c) 1998-1999 Microsoft Corporation
|
||
|
|
||
|
#pragma once
|
||
|
|
||
|
#include <afxtempl.h>
|
||
|
#include "DataSrc.h"
|
||
|
#include "ViewObj.h"
|
||
|
#include "Consts.h"
|
||
|
|
||
|
// This hack is required because we may be building in an environment
|
||
|
// which doesn't have a late enough version of rpcndr.h
|
||
|
#if __RPCNDR_H_VERSION__ < 440
|
||
|
#define __RPCNDR_H_VERSION__ 440
|
||
|
#define MIDL_INTERFACE(x) interface
|
||
|
#endif
|
||
|
|
||
|
#ifndef __mmc_h__
|
||
|
#include <mmc.h>
|
||
|
#endif // __mmc_h__
|
||
|
|
||
|
/*
|
||
|
* CScopeItem - an object which can be inserted in a CMapStringToOb which contains
|
||
|
* an HSCOPEITEM
|
||
|
*
|
||
|
* History: a-jsari 12/16/97 Initial version.
|
||
|
*/
|
||
|
class CScopeItem : public CObject {
|
||
|
public:
|
||
|
CScopeItem() {}
|
||
|
CScopeItem(HSCOPEITEM hsiNew) :m_hsiValue(hsiNew) { }
|
||
|
CScopeItem(const CScopeItem &siCopy) :m_hsiValue(siCopy.m_hsiValue) { }
|
||
|
|
||
|
~CScopeItem() {}
|
||
|
|
||
|
const CScopeItem &operator=(const CScopeItem &siCopy)
|
||
|
{
|
||
|
if (&siCopy != this)
|
||
|
SetValue(siCopy.GetValue());
|
||
|
return *this;
|
||
|
}
|
||
|
void SetValue(HSCOPEITEM hsiSet) { m_hsiValue = hsiSet; }
|
||
|
HSCOPEITEM GetValue() const { return m_hsiValue; }
|
||
|
private:
|
||
|
HSCOPEITEM m_hsiValue;
|
||
|
};
|
||
|
|
||
|
/*
|
||
|
* CScopeItemMap - Wrapper function for two cross-mappings of HSCOPEITEM and
|
||
|
* CViewObject pairs.
|
||
|
*
|
||
|
* History: a-jsari 10/7/97 Initial version.
|
||
|
*/
|
||
|
class CScopeItemMap {
|
||
|
public:
|
||
|
CScopeItemMap() :m_mapScopeToView(MapIncrement), m_mapViewToScope(MapIncrement)
|
||
|
{ m_mapScopeToView.InitHashTable(HashSize); m_mapViewToScope.InitHashTable(HashSize); }
|
||
|
~CScopeItemMap() { Clear(); }
|
||
|
|
||
|
CFolder *CategoryFromScope(HSCOPEITEM hsiNode) const;
|
||
|
void InsertRoot(CViewObject *pvoRootData, HSCOPEITEM hsiNode);
|
||
|
void Insert(CViewObject *pvoData, HSCOPEITEM hsiNode);
|
||
|
BOOL ScopeFromView(CViewObject *pvoNode, HSCOPEITEM &hsiNode) const;
|
||
|
BOOL ScopeFromName(const CString &strName, HSCOPEITEM &hsiNode) const;
|
||
|
void Clear();
|
||
|
private:
|
||
|
static const int MapIncrement;
|
||
|
static const int HashSize;
|
||
|
|
||
|
CMap<HSCOPEITEM, HSCOPEITEM &, CViewObject *, CViewObject * &> m_mapScopeToView;
|
||
|
CMap<CViewObject *, CViewObject * &, HSCOPEITEM, HSCOPEITEM &> m_mapViewToScope;
|
||
|
CMapStringToOb m_mapNameToScope;
|
||
|
};
|
||
|
|
||
|
/*
|
||
|
* CategoryFromScope - Return the CDataCategory pointer, given the hsiNode.
|
||
|
* Note: Do not free the resultant pointer.
|
||
|
*
|
||
|
* History: a-jsari 10/7/97
|
||
|
*/
|
||
|
inline CFolder *CScopeItemMap::CategoryFromScope(HSCOPEITEM hsiNode) const
|
||
|
{
|
||
|
CViewObject *pvoData;
|
||
|
if (m_mapScopeToView.Lookup(hsiNode, pvoData) == 0) return NULL;
|
||
|
// Root category.
|
||
|
return pvoData->Category();
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Insert - Inserts the pvoData <-> hsiNode pairing into the maps.
|
||
|
*
|
||
|
* History: a-jsari 10/8/97
|
||
|
*/
|
||
|
inline void CScopeItemMap::Insert(CViewObject *pvoData, HSCOPEITEM hsiNode)
|
||
|
{
|
||
|
CString strName;
|
||
|
|
||
|
m_mapScopeToView.SetAt(hsiNode, pvoData);
|
||
|
m_mapViewToScope.SetAt(pvoData, hsiNode);
|
||
|
pvoData->Category()->InternalName(strName);
|
||
|
m_mapNameToScope.SetAt(strName, new CScopeItem(hsiNode));
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* InsertRoot - Special case insertion for the ROOT node (which always has
|
||
|
* a Cookie of Zero), but which we want to have a legitamate object for
|
||
|
* the Node.
|
||
|
*
|
||
|
* History: a-jsari 10/10/97
|
||
|
*/
|
||
|
inline void CScopeItemMap::InsertRoot(CViewObject *pvoData, HSCOPEITEM hsiNode)
|
||
|
{
|
||
|
CString strValue = cszRootName;
|
||
|
|
||
|
CViewObject *pvoNullCookie = NULL;
|
||
|
m_mapScopeToView.SetAt(hsiNode, pvoData);
|
||
|
// Insert the NULL cookie as the index for the HSCOPEITEM
|
||
|
m_mapViewToScope.SetAt(pvoNullCookie, hsiNode);
|
||
|
m_mapNameToScope.SetAt(strValue, new CScopeItem(hsiNode));
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* ScopeFromView - Return the HSCOPEITEM pvoNode maps to, in hsiNode.
|
||
|
*
|
||
|
* Return Codes:
|
||
|
* TRUE - Successful completion
|
||
|
* FALSE - pvoNode could not be found in the map.
|
||
|
*
|
||
|
* History: a-jsari 10/8/97
|
||
|
*/
|
||
|
inline BOOL CScopeItemMap::ScopeFromView(CViewObject *pvoNode, HSCOPEITEM &hsiNode) const
|
||
|
{
|
||
|
return m_mapViewToScope.Lookup(pvoNode, hsiNode);
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* ScopeFromName - Return the scope item
|
||
|
*
|
||
|
* History: a-jsari 12/11/97
|
||
|
*/
|
||
|
inline BOOL CScopeItemMap::ScopeFromName(const CString &strName, HSCOPEITEM &hsiNode) const
|
||
|
{
|
||
|
BOOL fReturn;
|
||
|
CScopeItem *psiNode;
|
||
|
fReturn = m_mapNameToScope.Lookup(strName, (CObject * &)psiNode);
|
||
|
if (fReturn) hsiNode = psiNode->GetValue();
|
||
|
return fReturn;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* clear - Remove all map items and free the CViewObject pointers
|
||
|
*
|
||
|
* History: a-jsari 10/7/97
|
||
|
*/
|
||
|
inline void CScopeItemMap::Clear()
|
||
|
{
|
||
|
if (m_mapScopeToView.IsEmpty()) {
|
||
|
ASSERT(m_mapViewToScope.IsEmpty());
|
||
|
return;
|
||
|
}
|
||
|
CViewObject *pvoIterator;
|
||
|
CString strIterator;
|
||
|
CScopeItem *psiIterator;
|
||
|
HSCOPEITEM hsiIterator;
|
||
|
POSITION posCurrent;
|
||
|
|
||
|
posCurrent = m_mapScopeToView.GetStartPosition();
|
||
|
while (posCurrent != NULL) {
|
||
|
m_mapScopeToView.GetNextAssoc(posCurrent, hsiIterator, pvoIterator);
|
||
|
VERIFY(m_mapScopeToView.RemoveKey(hsiIterator));
|
||
|
delete pvoIterator;
|
||
|
}
|
||
|
posCurrent = m_mapNameToScope.GetStartPosition();
|
||
|
while (posCurrent != NULL) {
|
||
|
m_mapNameToScope.GetNextAssoc(posCurrent, strIterator, (CObject * &)psiIterator);
|
||
|
VERIFY(m_mapNameToScope.RemoveKey(strIterator));
|
||
|
delete psiIterator;
|
||
|
}
|
||
|
ASSERT(m_mapScopeToView.IsEmpty());
|
||
|
m_mapViewToScope.RemoveAll();
|
||
|
}
|