321 lines
11 KiB
C
321 lines
11 KiB
C
|
//+-------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
// Copyright (C) Microsoft Corporation, 1994 - 1999
|
||
|
//
|
||
|
// File: viewpers.h
|
||
|
//
|
||
|
// Contents: Classes related to view setting persistence.
|
||
|
//
|
||
|
// Classes: CViewSettingsID and CViewSettingPersistor.
|
||
|
//
|
||
|
// History: 04-Apr-99 AnandhaG Created
|
||
|
//
|
||
|
//--------------------------------------------------------------------
|
||
|
|
||
|
#ifndef __VIEWPERS_H__
|
||
|
#define __VIEWPERS_H__
|
||
|
#pragma once
|
||
|
#include "bookmark.h"
|
||
|
|
||
|
#pragma warning(disable: 4503) // Disable long name limit warnings
|
||
|
|
||
|
using namespace std;
|
||
|
|
||
|
class CViewSettings;
|
||
|
class CBookmark;
|
||
|
|
||
|
/*************************************************************************
|
||
|
*
|
||
|
* How CViewSettingsPersistor is used:
|
||
|
* There is only one CViewSettingsPersistor object per document.
|
||
|
*
|
||
|
* The object stored as static variable inside CNode as CNode needs
|
||
|
* to access this object frequently.
|
||
|
*
|
||
|
* The Document needs to initialize/save the object by loading/savind
|
||
|
* from/to console file. It calls below ScQueryViewSettingsPersistor.
|
||
|
*
|
||
|
* The object is created with first call to ScQueryViewSettingsPersistor.
|
||
|
* The object is destroyed when DocumentClosed event is received.
|
||
|
*
|
||
|
*************************************************************************/
|
||
|
|
||
|
|
||
|
//+-------------------------------------------------------------------
|
||
|
// View Setting Persistence Versioning
|
||
|
// This version info is used for MMC1.2 IPersist* interfaces.
|
||
|
// In MMC2.0, XML maintains versioning using the tags, so this
|
||
|
// constant is not used. Look at CViewPersistInfo members Load/Save
|
||
|
// to see how this version information is used.
|
||
|
static const INT ViewSettingPersistenceVersion = 2;
|
||
|
|
||
|
// We allow the list to grow VIEWSETTINGS_MAXLIMIT times more,
|
||
|
// then we do garbage collection.
|
||
|
#define VIEWSETTINGS_MAXLIMIT 0.4
|
||
|
|
||
|
|
||
|
|
||
|
//+-------------------------------------------------------------------
|
||
|
//
|
||
|
// Class: CViewSettingsID
|
||
|
//
|
||
|
// Purpose: To identify the result-view-setting-data. The identifier
|
||
|
// consists of the triplet [ViewID, NodeTypeGUID, Node-Bookmark]
|
||
|
//
|
||
|
// We need to persist some result-view-setting-data per node and
|
||
|
// some per node-type basis.
|
||
|
//
|
||
|
// The [ViewID + Node-Bookmark] identifies a node. In this case
|
||
|
// NodeTypeGUID will be GUID_NULL.
|
||
|
//
|
||
|
// The [ViewID + NodeTypeGUID] identifies a nodetype. In this case
|
||
|
// Node-Bookmark will be invalid object (see CBookmark for invalid obj).
|
||
|
//
|
||
|
// History: 06-22-2000 AnandhaG Created
|
||
|
//
|
||
|
//--------------------------------------------------------------------
|
||
|
class CViewSettingsID : public CXMLObject
|
||
|
{
|
||
|
public:
|
||
|
friend class CViewPersistInfo;
|
||
|
|
||
|
friend IStream& operator>> (IStream& stm, CViewSettingsID& viewSettingsID);
|
||
|
|
||
|
public:
|
||
|
CViewSettingsID() : m_dwViewID(-1), m_nodeTypeGUID(GUID_NULL)
|
||
|
{
|
||
|
// m_bookmark is initialized as not valid by default constructor
|
||
|
}
|
||
|
|
||
|
// Synopsis: Given the view-id & bookmark (not nodetypeguid) construct
|
||
|
// a CViewSettingsID object (with GUID_NULL as nodetypeguid).
|
||
|
CViewSettingsID(INT nViewID, const CBookmark& bookmark)
|
||
|
{
|
||
|
m_dwViewID = nViewID;
|
||
|
m_bookmark = bookmark;
|
||
|
m_nodeTypeGUID = GUID_NULL;
|
||
|
}
|
||
|
|
||
|
// Synopsis: Given the view-id & nodetype guid (not bookmark) construct
|
||
|
// a CViewSettingsID object (with invalid bookmark).
|
||
|
CViewSettingsID(INT nViewID, const GUID& guidNodeType)
|
||
|
{
|
||
|
m_dwViewID = nViewID;
|
||
|
m_nodeTypeGUID = guidNodeType;
|
||
|
// m_bookmark is initialized as not valid by default constructor
|
||
|
}
|
||
|
/*
|
||
|
CViewSettingsID(const CViewSettingsID& viewSettingsID)
|
||
|
{
|
||
|
m_dwViewID = viewSettingsID.m_dwViewID;
|
||
|
m_bookmark = viewSettingsID.m_bookmark;
|
||
|
m_nodeTypeGUID = viewSettingsID.m_nodeTypeGUID;
|
||
|
}
|
||
|
|
||
|
CViewSettingsID& operator=(const CViewSettingsID& viewSettingsID)
|
||
|
{
|
||
|
if (this != &viewSettingsID)
|
||
|
{
|
||
|
m_dwViewID = viewSettingsID.m_dwViewID;
|
||
|
m_bookmark = viewSettingsID.m_bookmark;
|
||
|
m_nodeTypeGUID = viewSettingsID.m_nodeTypeGUID;
|
||
|
}
|
||
|
|
||
|
return (*this);
|
||
|
}
|
||
|
|
||
|
bool operator==(const CViewSettingsID& viewSettingsID) const
|
||
|
{
|
||
|
return ((m_dwViewID == viewSettingsID.m_dwViewID) &&
|
||
|
(m_bookmark == viewSettingsID.m_bookmark) &&
|
||
|
(m_nodeTypeGUID == viewSettingsID.m_nodeTypeGUID) );
|
||
|
}
|
||
|
*/
|
||
|
/*
|
||
|
Compare view id first, then guid and then bookmark.
|
||
|
*/
|
||
|
bool operator<(const CViewSettingsID& viewSettingsID) const
|
||
|
{
|
||
|
// First compare view-ids (low cost).
|
||
|
if (m_dwViewID < viewSettingsID.m_dwViewID)
|
||
|
return true;
|
||
|
|
||
|
if (m_dwViewID > viewSettingsID.m_dwViewID)
|
||
|
return false;
|
||
|
|
||
|
// The view-ids match so now compare GUIDs.
|
||
|
if (m_nodeTypeGUID < viewSettingsID.m_nodeTypeGUID)
|
||
|
return true;
|
||
|
|
||
|
if (m_nodeTypeGUID > viewSettingsID.m_nodeTypeGUID)
|
||
|
return false;
|
||
|
|
||
|
// The view-ids as well as guids match so compare bookmarks.
|
||
|
if (m_bookmark < viewSettingsID.m_bookmark)
|
||
|
return true;
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
DWORD get_ViewID() const { return m_dwViewID;}
|
||
|
|
||
|
virtual void Persist(CPersistor &persistor)
|
||
|
{
|
||
|
persistor.PersistAttribute(XML_ATTR_VIEW_SETTINGS_ID_VIEW, m_dwViewID);
|
||
|
persistor.PersistAttribute(XML_ATTR_NODETYPE_GUID, m_nodeTypeGUID, attr_optional); // optional
|
||
|
|
||
|
/*
|
||
|
* Storing: save book mark only if it is valid.
|
||
|
* Loading: See if bookmark is present for this element before reading.
|
||
|
*/
|
||
|
if ( ( persistor.IsStoring() && m_bookmark.IsValid() ) ||
|
||
|
( persistor.IsLoading() && persistor.HasElement(m_bookmark.GetXMLType(), NULL) ))
|
||
|
persistor.Persist(m_bookmark);
|
||
|
|
||
|
}
|
||
|
DEFINE_XML_TYPE(XML_TAG_VIEW_SETTINGS_ID);
|
||
|
protected:
|
||
|
CBookmark m_bookmark;
|
||
|
GUID m_nodeTypeGUID;
|
||
|
DWORD m_dwViewID;
|
||
|
};
|
||
|
|
||
|
|
||
|
//+-------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: operator>>
|
||
|
//
|
||
|
// Synopsis: Reads CViewSettingsID data from the stream.
|
||
|
//
|
||
|
// Arguments: [stm] - The input stream.
|
||
|
// [viewSettingsID] - CViewSettingsID object.
|
||
|
//
|
||
|
// The format is :
|
||
|
// DWORD viewID
|
||
|
// CBookmark*
|
||
|
//
|
||
|
//--------------------------------------------------------------------
|
||
|
inline IStream& operator>> (IStream& stm, CViewSettingsID& rvsd)
|
||
|
{
|
||
|
ASSERT(rvsd.m_nodeTypeGUID == GUID_NULL);
|
||
|
|
||
|
rvsd.m_nodeTypeGUID = GUID_NULL;
|
||
|
return (stm >> rvsd.m_dwViewID >> rvsd.m_bookmark);
|
||
|
}
|
||
|
|
||
|
|
||
|
//+-------------------------------------------------------------------
|
||
|
//
|
||
|
// Data structures used to persist view information:
|
||
|
//
|
||
|
// View information is persisted as follows:
|
||
|
// Internally, the following data structure is used. View information
|
||
|
// is recorded per view.
|
||
|
// map
|
||
|
// [View ID, NodeTypeGUID, Bookmark]------> iterator to a list containing CViewSettings.
|
||
|
//
|
||
|
// The list contains CViewSettings to all the views, and is ordered
|
||
|
// in with most recently used data in the front of the list.
|
||
|
// This is useful for garbage collection.
|
||
|
//
|
||
|
// Persistence: The information is serialized as follows:
|
||
|
//
|
||
|
// 1) Stream version
|
||
|
// 2) Number of viewSettings
|
||
|
// 3) For each viewSettings
|
||
|
// i) CViewSettingsID (the identifier).
|
||
|
// ii) CViewSettings(the data).
|
||
|
//
|
||
|
//--------------------------------------------------------------------
|
||
|
|
||
|
typedef list<CViewSettings> CViewSettingsList;
|
||
|
typedef CViewSettingsList::iterator IteratorToViewSettingsList;
|
||
|
|
||
|
// A one to one map from CViewSettings to pointer to CViewSettings.
|
||
|
typedef map<CViewSettingsID, IteratorToViewSettingsList> CViewSettingsIDToViewSettingsMap;
|
||
|
|
||
|
//+-------------------------------------------------------------------
|
||
|
//
|
||
|
// Class: CViewSettingsPersistor
|
||
|
//
|
||
|
// Purpose: This class has persisted settings information for nodes & nodetypes
|
||
|
// in all views (therefore one per instance of mmc).
|
||
|
// It knows to load/save the info from streams.
|
||
|
//
|
||
|
// History: 04-23-1999 AnandhaG Created
|
||
|
//
|
||
|
// Data structures used to persist view information:
|
||
|
// A map from the CViewSettingsID to pointer to CViewSettings class.
|
||
|
//
|
||
|
//--------------------------------------------------------------------
|
||
|
class CViewSettingsPersistor : public IPersistStream,
|
||
|
public CComObjectRoot,
|
||
|
public XMLMapCollectionBase
|
||
|
{
|
||
|
private:
|
||
|
CViewSettingsList m_listViewSettings;
|
||
|
CViewSettingsIDToViewSettingsMap m_mapViewSettingsIDToViewSettings;
|
||
|
|
||
|
bool m_bDirty;
|
||
|
|
||
|
// This is the max number of items specified by user???
|
||
|
// We go 40% more so that we dont do garbage collection often.
|
||
|
DWORD m_dwMaxItems;
|
||
|
|
||
|
public:
|
||
|
/*
|
||
|
* ATL COM map
|
||
|
*/
|
||
|
BEGIN_COM_MAP (CViewSettingsPersistor)
|
||
|
COM_INTERFACE_ENTRY (IPersistStream)
|
||
|
END_COM_MAP ()
|
||
|
|
||
|
CViewSettingsPersistor();
|
||
|
|
||
|
SC ScDeleteDataOfView( int nViewID);
|
||
|
|
||
|
// IPersistStream methods
|
||
|
STDMETHOD(IsDirty)(void) { return ( m_bDirty ? S_OK : S_FALSE); }
|
||
|
STDMETHOD(GetSizeMax)(ULARGE_INTEGER *pcbSize) { ASSERT(FALSE); return E_NOTIMPL;}
|
||
|
STDMETHOD(GetClassID)(LPCLSID lpClsid) { ASSERT(FALSE); return E_NOTIMPL; }
|
||
|
STDMETHOD(Load)(IStream *pStm);
|
||
|
STDMETHOD(Save)(IStream *pStm, BOOL fClearDirty);
|
||
|
|
||
|
// XML persistence helpers
|
||
|
virtual void Persist(CPersistor &persistor);
|
||
|
virtual void OnNewElement(CPersistor& persistKey,CPersistor& persistVal);
|
||
|
DEFINE_XML_TYPE(XML_TAG_VIEW_PERSIST_INFO)
|
||
|
|
||
|
// Members to access viewsettings data.
|
||
|
|
||
|
// 1. Taskpad IDs.
|
||
|
// 1.a) Per NodeTypeGUID
|
||
|
SC ScGetTaskpadID(int nViewID, const GUID& guidNodeType ,GUID& guidTaskpad);
|
||
|
SC ScSetTaskpadID(int nViewID, const GUID& guidNodeType ,const CBookmark& bookmark,
|
||
|
const GUID& guidTaskpad, bool bSetDirty);
|
||
|
|
||
|
// 1.b) Per node
|
||
|
SC ScGetTaskpadID(int nViewID, const CBookmark& bookmark,GUID& guidTaskpad);
|
||
|
SC ScSetTaskpadID(int nViewID, const CBookmark& bookmark,const GUID& guidTaskpad, bool bSetDirty);
|
||
|
|
||
|
// 2. View mode.
|
||
|
SC ScGetViewMode (int nViewID, const CBookmark& bookmark, ULONG& ulViewMode);
|
||
|
SC ScSetViewMode (int nViewID, const CBookmark& bookmark, ULONG ulViewMode);
|
||
|
|
||
|
// 3. ResultViewTypeInfo.
|
||
|
SC ScGetResultViewType (int nViewID, const CBookmark& bookmark, CResultViewType& rvt);
|
||
|
SC ScSetResultViewType (int nViewID, const CBookmark& bookmark, const CResultViewType& rvt);
|
||
|
|
||
|
SC ScSetFavoriteViewSettings (int nViewID, const CBookmark& bookmark, const CViewSettings& viewSettings);
|
||
|
|
||
|
private:
|
||
|
SC ScGetViewSettings( const CViewSettingsID& viewSettingsID, CViewSettings& viewSettings);
|
||
|
SC ScSetViewSettings( const CViewSettingsID& viewSettingsID, const CViewSettings& viewSettings, bool bSetViewDirty);
|
||
|
|
||
|
SC ScGarbageCollectItems();
|
||
|
SC ScDeleteMarkedItems();
|
||
|
};
|
||
|
|
||
|
#endif /* __VIEWPERS_H__ */
|