mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
836 lines
26 KiB
836 lines
26 KiB
//+-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1999
|
|
//
|
|
// File: viewpers.cpp
|
|
//
|
|
// Contents: View Persistence data structures.
|
|
//
|
|
// History: 04-Apr-99 AnandhaG Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
|
|
#include "stdafx.h"
|
|
#include "viewpers.h"
|
|
#include "macros.h"
|
|
#include "comdbg.h"
|
|
|
|
#define MAX_VIEWITEMS_PERSISTED 50
|
|
|
|
|
|
//------------------------------------------------------------------
|
|
// class CViewSettingsPersistor
|
|
//------------------------------------------------------------------
|
|
CViewSettingsPersistor::CViewSettingsPersistor() :
|
|
m_dwMaxItems(MAX_VIEWITEMS_PERSISTED), m_bDirty(false)
|
|
{
|
|
// Now read the registry to see if m_dwMaxItems is specified.
|
|
// Check if the settings key exists.
|
|
CRegKeyEx rSettingsKey;
|
|
if (rSettingsKey.ScOpen (HKEY_LOCAL_MACHINE, SETTINGS_KEY, KEY_READ).IsError())
|
|
return;
|
|
|
|
// Read the values for MaxColDataPersisted.
|
|
if (rSettingsKey.IsValuePresent(g_szMaxViewItemsPersisted))
|
|
{
|
|
DWORD dwType = REG_DWORD;
|
|
DWORD dwSize = sizeof(DWORD);
|
|
|
|
SC sc = rSettingsKey.ScQueryValue (g_szMaxViewItemsPersisted, &dwType,
|
|
&m_dwMaxItems, &dwSize);
|
|
|
|
if (sc)
|
|
sc.TraceAndClear();
|
|
}
|
|
}
|
|
|
|
|
|
//+-------------------------------------------------------------------
|
|
//
|
|
// Member: ScGetViewSettings
|
|
//
|
|
// Synopsis: Given the CViewSettingsID return the CViewSettings object.
|
|
//
|
|
// Arguments: [viewSettingsID] - [in]
|
|
// [viewSettings] - [out]
|
|
//
|
|
// Returns: SC, S_FALSE if none found.
|
|
//
|
|
//--------------------------------------------------------------------
|
|
SC CViewSettingsPersistor::ScGetViewSettings(const CViewSettingsID& viewSettingsID,
|
|
CViewSettings& viewSettings)
|
|
{
|
|
DECLARE_SC(sc, TEXT("CViewSettingsPersistor::ScGetViewSettings"));
|
|
|
|
// 1. Look in the map if there is persisted data for given id.
|
|
CViewSettingsIDToViewSettingsMap::iterator itViewSettingsDataMap;
|
|
itViewSettingsDataMap = m_mapViewSettingsIDToViewSettings.find(viewSettingsID);
|
|
if (itViewSettingsDataMap == m_mapViewSettingsIDToViewSettings.end())
|
|
return (sc = S_FALSE);
|
|
|
|
// Found the data.
|
|
IteratorToViewSettingsList itViewSettings = itViewSettingsDataMap->second;
|
|
|
|
// 2. Copy the data.
|
|
viewSettings = *itViewSettings;
|
|
|
|
// 3. Move this item to the front of the queue.
|
|
m_listViewSettings.erase(itViewSettings);
|
|
itViewSettings = m_listViewSettings.insert(m_listViewSettings.begin(), viewSettings);
|
|
itViewSettingsDataMap->second = itViewSettings;
|
|
|
|
return sc;
|
|
}
|
|
|
|
|
|
//+-------------------------------------------------------------------
|
|
//
|
|
// Member: ScSetViewSettings
|
|
//
|
|
// Synopsis: Modify the persisted view information
|
|
// for given view and bookmark (node).
|
|
//
|
|
// Arguments: [nViewID] - Snapin Guid
|
|
// [pBookmark] - Column Set Identifier.
|
|
// [viewDataSet] - View ID.
|
|
//
|
|
// Returns: TRUE - Loaded successfully.
|
|
//
|
|
// History: 04-26-1999 AnandhaG Created
|
|
//
|
|
//--------------------------------------------------------------------
|
|
SC CViewSettingsPersistor::ScSetViewSettings(const CViewSettingsID& viewSettingsID,
|
|
const CViewSettings& viewSettings,
|
|
bool bSetViewDirty)
|
|
{
|
|
DECLARE_SC(sc, TEXT("CViewSettingsPersistor::ScSetViewSettings"));
|
|
|
|
// 1. Garbage collect if the number of items in the list are 40% more than pre-set limit.
|
|
if (m_listViewSettings.size() >= (m_dwMaxItems * (1 + VIEWSETTINGS_MAXLIMIT)) )
|
|
{
|
|
sc = ScGarbageCollectItems();
|
|
if (sc)
|
|
sc.TraceAndClear();
|
|
}
|
|
|
|
// 2. Insert the item into the front of the queue.
|
|
IteratorToViewSettingsList itViewSettings;
|
|
itViewSettings = m_listViewSettings.insert(m_listViewSettings.begin(), viewSettings);
|
|
|
|
// 3. See if there is data persisted for this id.
|
|
CViewSettingsIDToViewSettingsMap::iterator itViewSettingsDataMap;
|
|
itViewSettingsDataMap = m_mapViewSettingsIDToViewSettings.find(viewSettingsID);
|
|
|
|
if (itViewSettingsDataMap == m_mapViewSettingsIDToViewSettings.end()) // not found so insert data.
|
|
{
|
|
m_mapViewSettingsIDToViewSettings.insert(
|
|
CViewSettingsIDToViewSettingsMap::value_type(viewSettingsID, itViewSettings) );
|
|
}
|
|
else
|
|
{
|
|
// found, so replace old settings.
|
|
m_listViewSettings.erase(itViewSettingsDataMap->second);
|
|
itViewSettingsDataMap->second = itViewSettings;
|
|
}
|
|
|
|
// dirty flag accumulates.
|
|
m_bDirty = (m_bDirty || bSetViewDirty);
|
|
|
|
return sc;
|
|
}
|
|
|
|
|
|
//+-------------------------------------------------------------------
|
|
//
|
|
// Member: CViewSettingsPersistor::ScGetTaskpadID
|
|
//
|
|
// Synopsis: Given the nodetype & viewid get the taskpad id (this
|
|
// is for taskpads persisted per nodetype).
|
|
//
|
|
// Arguments: [nViewID] - [in]
|
|
// [guidNodeType] - [in]
|
|
// [guidTaskpad] - [out]
|
|
//
|
|
// Returns: SC, S_FALSE if none found.
|
|
//
|
|
//--------------------------------------------------------------------
|
|
SC CViewSettingsPersistor::ScGetTaskpadID (int nViewID, const GUID& guidNodeType ,GUID& guidTaskpad)
|
|
{
|
|
DECLARE_SC(sc, _T("CViewSettingsPersistor::ScGetTaskpadID"));
|
|
|
|
// 1. Init out param.
|
|
guidTaskpad = GUID_NULL;
|
|
|
|
// 2. Construct a CViewSettingsID object with given nodetype & viewid.
|
|
CViewSettingsID viewSettingsID(nViewID, guidNodeType);
|
|
|
|
// 3. Get the viewsettings
|
|
CViewSettings viewSettings;
|
|
sc = ScGetViewSettings(viewSettingsID, viewSettings);
|
|
|
|
// If none exists return
|
|
if (sc != S_OK)
|
|
return sc;
|
|
|
|
// 4. CViewSettings exists, see if there is valid taskpad-id stored.
|
|
sc = viewSettings.ScGetTaskpadID(guidTaskpad);
|
|
|
|
if (sc) // taskpad-id is not valid.
|
|
return (sc = S_FALSE);
|
|
|
|
return (sc);
|
|
}
|
|
|
|
//+-------------------------------------------------------------------
|
|
//
|
|
// Member: CViewSettingsPersistor::ScSetTaskpadID
|
|
//
|
|
// Synopsis: Given the nodetype & viewid set the taskpad id (this
|
|
// is for taskpads persisted per nodetype).
|
|
//
|
|
// NOTE: NUKE ANY NODE-SPECIFIC TASKPAD-ID THAT IS STORED.
|
|
//
|
|
// Arguments: [nViewID] - [in]
|
|
// [guidNodeType] - [in]
|
|
// [bookmark] - [in]
|
|
// [guidTaskpad] - [in]
|
|
// [bSetDirty] - [in] set the console file dirty
|
|
//
|
|
// Returns: SC
|
|
//
|
|
//--------------------------------------------------------------------
|
|
SC CViewSettingsPersistor::ScSetTaskpadID (int nViewID, const GUID& guidNodeType,
|
|
const CBookmark& bookmark, const GUID& guidTaskpad,
|
|
bool bSetDirty)
|
|
{
|
|
DECLARE_SC(sc, _T("CViewSettingsPersistor::ScSetTaskpadID"));
|
|
|
|
// 1. First nuke the the old node specific taskpad-id settings (if any).
|
|
|
|
// 1.a) Construct a CViewSettingsID object with given nodetype & viewid.
|
|
CViewSettingsID viewSettingsIDNodeSpecific(nViewID, bookmark);
|
|
|
|
// 1.b) Get the viewsettings.
|
|
CViewSettings viewSettingsNodeSpecific;
|
|
sc = ScGetViewSettings(viewSettingsIDNodeSpecific, viewSettingsNodeSpecific);
|
|
if (sc)
|
|
return sc;
|
|
|
|
// data available
|
|
if ( (sc == S_OK) &&
|
|
(viewSettingsNodeSpecific.IsTaskpadIDValid()) )
|
|
{
|
|
// 1.c) Set taskpad id invalid.
|
|
viewSettingsNodeSpecific.SetTaskpadIDValid(false);
|
|
if (sc)
|
|
return sc;
|
|
|
|
// 1.d) Save the data.
|
|
sc = ScSetViewSettings(viewSettingsIDNodeSpecific, viewSettingsNodeSpecific, bSetDirty);
|
|
}
|
|
|
|
// 2. Now save the taskpad id for nodetype specific.
|
|
// 2.a) Construct a CViewSettingsID object with given nodetype & viewid.
|
|
CViewSettingsID viewSettingsID(nViewID, guidNodeType);
|
|
|
|
// 2.b) The CResultViewType & view-mode data are not stored when CViewSettings is stored
|
|
// per nodetype. So just set the taskpad id.
|
|
CViewSettings viewSettings;
|
|
sc = viewSettings.ScSetTaskpadID(guidTaskpad);
|
|
if (sc)
|
|
return sc;
|
|
|
|
// 2.c) Save the viewsettings into the map.
|
|
sc = ScSetViewSettings(viewSettingsID, viewSettings, bSetDirty);
|
|
if (sc)
|
|
return sc;
|
|
|
|
return (sc);
|
|
}
|
|
|
|
|
|
//+-------------------------------------------------------------------
|
|
//
|
|
// Member: CViewSettingsPersistor::ScGetTaskpadID
|
|
//
|
|
// Synopsis: Given the bookmark & viewid get the taskpad id (this
|
|
// is for taskpads persisted per node).
|
|
//
|
|
// Arguments: [nViewID] - [in]
|
|
// [bookmark] - [in]
|
|
// [guidTaskpad] - [out]
|
|
//
|
|
// Returns: SC, S_FALSE if none found.
|
|
//
|
|
//--------------------------------------------------------------------
|
|
SC CViewSettingsPersistor::ScGetTaskpadID (int nViewID, const CBookmark& bookmark,GUID& guidTaskpad)
|
|
{
|
|
DECLARE_SC(sc, _T("CViewSettingsPersistor::ScGetTaskpadID"));
|
|
|
|
// 1. Init out param.
|
|
guidTaskpad = GUID_NULL;
|
|
|
|
// 2. Construct a CViewSettingsID object with given bookmark & viewid.
|
|
CViewSettingsID viewSettingsID(nViewID, bookmark);
|
|
|
|
// 3. Get the viewsettings
|
|
CViewSettings viewSettings;
|
|
sc = ScGetViewSettings(viewSettingsID, viewSettings);
|
|
|
|
// If none exists return
|
|
if (sc != S_OK)
|
|
return sc;
|
|
|
|
// 4. CViewSettings exists, see if there is valid taskpad-id stored.
|
|
sc = viewSettings.ScGetTaskpadID(guidTaskpad);
|
|
|
|
if (sc) // taskpad-id is not valid.
|
|
return (sc = S_FALSE);
|
|
|
|
return (sc);
|
|
}
|
|
|
|
//+-------------------------------------------------------------------
|
|
//
|
|
// Member: CViewSettingsPersistor::ScSetTaskpadID
|
|
//
|
|
// Synopsis: Given the bookmark & viewid get the taskpad id (this
|
|
// is for taskpads persisted per nodetype).
|
|
//
|
|
// Arguments: [nViewID] - [in]
|
|
// [bookmark] - [in]
|
|
// [guidTaskpad] - [in]
|
|
// [bSetDirty] - [in] set the console file dirty
|
|
//
|
|
// Returns: SC
|
|
//
|
|
//--------------------------------------------------------------------
|
|
SC CViewSettingsPersistor::ScSetTaskpadID (int nViewID, const CBookmark& bookmark,
|
|
const GUID& guidTaskpad, bool bSetDirty)
|
|
{
|
|
DECLARE_SC(sc, _T("CViewSettingsPersistor::ScSetTaskpadID"));
|
|
|
|
// 1. Construct a CViewSettingsID object with given bookmark & viewid.
|
|
CViewSettingsID viewSettingsID(nViewID, bookmark);
|
|
|
|
// 2. First get the old settings (if any) and just modify taskpad-id.
|
|
CViewSettings viewSettings;
|
|
sc = ScGetViewSettings(viewSettingsID, viewSettings);
|
|
if (sc)
|
|
return sc;
|
|
|
|
// 3. If persisted data does not exist dont worry (as CResultViewType and
|
|
// view mode are invalid), just set taskpad-id.
|
|
sc = viewSettings.ScSetTaskpadID(guidTaskpad);
|
|
if (sc)
|
|
return sc;
|
|
|
|
// 4. Save the viewsettings into the map.
|
|
sc = ScSetViewSettings(viewSettingsID, viewSettings, bSetDirty);
|
|
if (sc)
|
|
return sc;
|
|
|
|
return (sc);
|
|
}
|
|
|
|
//+-------------------------------------------------------------------
|
|
//
|
|
// Member: CViewSettingsPersistor::ScGetViewMode
|
|
//
|
|
// Synopsis: Given the viewid & bookmark (can identify a node), return
|
|
// the view mode if any persisted.
|
|
//
|
|
// Arguments: [nViewID] - [in]
|
|
// [bookmark] - [in]
|
|
// [ulViewMode] - [out]
|
|
//
|
|
// Returns: SC, S_FALSE if none.
|
|
//
|
|
//--------------------------------------------------------------------
|
|
SC CViewSettingsPersistor::ScGetViewMode (int nViewID, const CBookmark& bookmark, ULONG& ulViewMode)
|
|
{
|
|
DECLARE_SC(sc, _T("CViewSettingsPersistor::ScGetViewMode"));
|
|
|
|
// 1. Construct the viewsettings-id.
|
|
CViewSettingsID viewSettingsID(nViewID, bookmark);
|
|
|
|
// 2. see if ViewSettings exist.
|
|
CViewSettings viewSettings;
|
|
sc = ScGetViewSettings(viewSettingsID, viewSettings);
|
|
if (sc != S_OK)
|
|
return sc;
|
|
|
|
sc = viewSettings.ScGetViewMode(ulViewMode);
|
|
if (sc)
|
|
return (sc = S_FALSE);
|
|
|
|
return (sc);
|
|
}
|
|
|
|
|
|
//+-------------------------------------------------------------------
|
|
//
|
|
// Member: CViewSettingsPersistor::ScSetViewMode
|
|
//
|
|
// Synopsis: Given view-id & bookmark, set the viewmode in a node
|
|
// specific viewsettings.
|
|
//
|
|
// Arguments: [nViewID] - [in]
|
|
// [bookmark] - [in]
|
|
// [ulViewMode] - [in]
|
|
//
|
|
// Returns: SC
|
|
//
|
|
//--------------------------------------------------------------------
|
|
SC CViewSettingsPersistor::ScSetViewMode (int nViewID, const CBookmark& bookmark, ULONG ulViewMode)
|
|
{
|
|
DECLARE_SC(sc, _T("CViewSettingsPersistor::ScSetViewMode"));
|
|
|
|
// 1. Construct the viewsettings-id.
|
|
CViewSettingsID viewSettingsID(nViewID, bookmark);
|
|
|
|
// 2. First get the old settings (if any) and just modify viewmode.
|
|
CViewSettings viewSettings;
|
|
sc = ScGetViewSettings(viewSettingsID, viewSettings);
|
|
if (sc)
|
|
return sc;
|
|
|
|
// 3. If persisted data does not exist dont worry (as CResultViewType and
|
|
// taskpad-id are invalid), just set viewmode.
|
|
sc = viewSettings.ScSetViewMode(ulViewMode);
|
|
if (sc)
|
|
return sc;
|
|
|
|
// 4. Save the viewsettings into the map.
|
|
sc = ScSetViewSettings(viewSettingsID, viewSettings, /*bSetDirty*/ true);
|
|
if (sc)
|
|
return sc;
|
|
|
|
return (sc);
|
|
}
|
|
|
|
|
|
//+-------------------------------------------------------------------
|
|
//
|
|
// Member: CViewSettingsPersistor::ScGetResultViewType
|
|
//
|
|
// Synopsis: Given the viewid & bookmark (can identify a node), return
|
|
// the CResultViewType if persisted.
|
|
//
|
|
// Arguments: [nViewID] - [in]
|
|
// [bookmark] - [in]
|
|
// [rvt] - [out]
|
|
//
|
|
// Returns: SC, S_FALSE if none.
|
|
//
|
|
//--------------------------------------------------------------------
|
|
SC CViewSettingsPersistor::ScGetResultViewType (int nViewID, const CBookmark& bookmark, CResultViewType& rvt)
|
|
{
|
|
DECLARE_SC(sc, _T("CViewSettingsPersistor::ScGetResultViewType"));
|
|
|
|
// 1. Construct the viewsettings-id.
|
|
CViewSettingsID viewSettingsID(nViewID, bookmark);
|
|
|
|
// 2. see if ViewSettings exist.
|
|
CViewSettings viewSettings;
|
|
sc = ScGetViewSettings(viewSettingsID, viewSettings);
|
|
if (sc != S_OK)
|
|
return sc;
|
|
|
|
sc = viewSettings.ScGetResultViewType(rvt);
|
|
if (sc)
|
|
return (sc = S_FALSE);
|
|
|
|
return (sc);
|
|
}
|
|
|
|
|
|
//+-------------------------------------------------------------------
|
|
//
|
|
// Member: CViewSettingsPersistor::ScSetResultViewType
|
|
//
|
|
// Synopsis: Given view-id & bookmark, set the resultviewtype in a node
|
|
// specific viewsettings.
|
|
//
|
|
// Arguments: [nViewID] - [in]
|
|
// [bookmark] - [in]
|
|
// [nViewMode] - [in]
|
|
//
|
|
// Returns: SC
|
|
//
|
|
//--------------------------------------------------------------------
|
|
SC CViewSettingsPersistor::ScSetResultViewType (int nViewID, const CBookmark& bookmark, const CResultViewType& rvt)
|
|
{
|
|
DECLARE_SC(sc, _T("CViewSettingsPersistor::ScSetResultViewType"));
|
|
|
|
// 1. Construct the viewsettings-id.
|
|
CViewSettingsID viewSettingsID(nViewID, bookmark);
|
|
|
|
// 2. First get the old settings (if any) and just modify resultviewtype.
|
|
CViewSettings viewSettings;
|
|
sc = ScGetViewSettings(viewSettingsID, viewSettings);
|
|
if (sc)
|
|
return sc;
|
|
|
|
// 3. If persisted data does not exist dont worry (as view-mode and
|
|
// taskpad-id are invalid), just set resultviewtype.
|
|
sc = viewSettings.ScSetResultViewType(rvt);
|
|
if (sc)
|
|
return sc;
|
|
|
|
// 4. Save the viewsettings into the map.
|
|
sc = ScSetViewSettings(viewSettingsID, viewSettings, /*bSetDirty*/ true);
|
|
if (sc)
|
|
return sc;
|
|
|
|
return (sc);
|
|
}
|
|
|
|
|
|
//+-------------------------------------------------------------------
|
|
//
|
|
// Member: CViewSettingsPersistor::ScSetFavoriteViewSettings
|
|
//
|
|
// Synopsis: A favorite is selected and it sets viewsettings
|
|
// before re-selecting the node so that after re-selection
|
|
// the new settings are set for the view. So dont set the
|
|
// console file dirty.
|
|
//
|
|
// Arguments: [nViewID] -
|
|
// [bookmark] -
|
|
// [viewSettings] -
|
|
//
|
|
// Returns: SC
|
|
//
|
|
//--------------------------------------------------------------------
|
|
SC CViewSettingsPersistor::ScSetFavoriteViewSettings (int nViewID, const CBookmark& bookmark,
|
|
const CViewSettings& viewSettings)
|
|
{
|
|
DECLARE_SC(sc, _T("CViewSettingsPersistor::ScSetFavoriteViewSettings"));
|
|
|
|
// 1. Construct the viewsettings-id.
|
|
CViewSettingsID viewSettingsID(nViewID, bookmark);
|
|
|
|
// 2. Save the viewsettings into the map.
|
|
sc = ScSetViewSettings(viewSettingsID, viewSettings, /*bSetDirty*/ false);
|
|
if (sc)
|
|
return sc;
|
|
|
|
return (sc);
|
|
}
|
|
|
|
|
|
//+-------------------------------------------------------------------
|
|
//
|
|
// Member: ScDeleteDataOfView
|
|
//
|
|
// Synopsis: Delete the data of given view.
|
|
//
|
|
// Arguments: [nViewID] - View ID.
|
|
//
|
|
// Returns: SC
|
|
//
|
|
//--------------------------------------------------------------------
|
|
SC CViewSettingsPersistor::ScDeleteDataOfView( int nViewID)
|
|
{
|
|
DECLARE_SC(sc, TEXT("CViewSettingsPersistor::ScDeleteDataOfView"));
|
|
|
|
// Find the data for the view.
|
|
CViewSettingsIDToViewSettingsMap::iterator itViewSettingsDataMap;
|
|
|
|
for (itViewSettingsDataMap = m_mapViewSettingsIDToViewSettings.begin();
|
|
itViewSettingsDataMap != m_mapViewSettingsIDToViewSettings.end();
|
|
++itViewSettingsDataMap)
|
|
{
|
|
const CViewSettingsID& viewSettingsID = itViewSettingsDataMap->first;
|
|
if (viewSettingsID.get_ViewID() == nViewID)
|
|
{
|
|
// Delete the item;
|
|
IteratorToViewSettingsList itViewSettings = itViewSettingsDataMap->second;
|
|
itViewSettings->SetObjInvalid(TRUE);
|
|
}
|
|
}
|
|
|
|
// Delete the invalid items.
|
|
sc = ScDeleteMarkedItems();
|
|
if (sc)
|
|
return sc;
|
|
|
|
return sc;
|
|
}
|
|
|
|
|
|
|
|
//+-------------------------------------------------------------------
|
|
//
|
|
// Member: ScGarbageCollectItems
|
|
//
|
|
// Synopsis: Free least used data.
|
|
//
|
|
// Arguments: None.
|
|
//
|
|
// History: 04-26-1999 AnandhaG Created
|
|
//
|
|
//--------------------------------------------------------------------
|
|
SC CViewSettingsPersistor::ScGarbageCollectItems()
|
|
{
|
|
DECLARE_SC(sc, TEXT("CViewSettingsPersistor::ScGarbageCollectItems"));
|
|
|
|
INT nItemsToBeRemoved = VIEWSETTINGS_MAXLIMIT * m_dwMaxItems;
|
|
|
|
// Go thro' the list and set the nItemsToBeRemoved that was least recently
|
|
// accessed to be invalid.
|
|
INT nIndex = 0;
|
|
IteratorToViewSettingsList itViewSettings;
|
|
|
|
// Skip first m_dwMaxItems.
|
|
for (itViewSettings = m_listViewSettings.begin();
|
|
( (itViewSettings != m_listViewSettings.end()) && (nIndex <= m_dwMaxItems) );
|
|
++itViewSettings, nIndex++)
|
|
{
|
|
nIndex++;
|
|
}
|
|
|
|
// Mark rest of the items to be garbage.
|
|
while (itViewSettings != m_listViewSettings.end())
|
|
{
|
|
itViewSettings->SetObjInvalid(TRUE);
|
|
++itViewSettings;
|
|
}
|
|
|
|
// Delete the invalid items.
|
|
sc = ScDeleteMarkedItems();
|
|
if (sc)
|
|
return sc;
|
|
|
|
return sc;
|
|
}
|
|
|
|
|
|
//+-------------------------------------------------------------------
|
|
//
|
|
// Member: ScDeleteMarkedItems
|
|
//
|
|
// Synopsis: Delete invalidated items. This involves iterating thro
|
|
// the maps to find the invalid items. Then deleting the
|
|
// items. If the map becomes empty then delete the map.
|
|
//
|
|
// History: 04-26-1999 AnandhaG Created
|
|
//
|
|
//--------------------------------------------------------------------
|
|
SC CViewSettingsPersistor::ScDeleteMarkedItems()
|
|
{
|
|
DECLARE_SC(sc, TEXT("CViewSettingsPersistor::ScDeleteMarkedItems"));
|
|
|
|
CViewSettingsIDToViewSettingsMap::iterator itViewSettingsDataMap = m_mapViewSettingsIDToViewSettings.begin();
|
|
|
|
// Iterate through the map to see if there are
|
|
// invalidated items.
|
|
while (m_mapViewSettingsIDToViewSettings.end() != itViewSettingsDataMap)
|
|
{
|
|
IteratorToViewSettingsList itViewSettings = itViewSettingsDataMap->second;
|
|
if (itViewSettings->IsObjInvalid())
|
|
{
|
|
// Delete the item ref from the map.
|
|
// Erase returns iterator to next item.
|
|
itViewSettingsDataMap = m_mapViewSettingsIDToViewSettings.erase(itViewSettingsDataMap);
|
|
|
|
// Delete the item from the list.
|
|
m_listViewSettings.erase(itViewSettings);
|
|
}
|
|
else
|
|
++itViewSettingsDataMap; // Item is valid so get next item.
|
|
}
|
|
|
|
return sc;
|
|
}
|
|
|
|
//+-------------------------------------------------------------------
|
|
//
|
|
// Member: Load
|
|
//
|
|
// Synopsis: Load the persisted view information.
|
|
//
|
|
// Arguments: [pStream]- IStream from which view data will be loaded.
|
|
//
|
|
// Returns: S_OK - Loaded successfully.
|
|
//
|
|
// History: 04-26-1999 AnandhaG Created
|
|
//
|
|
//--------------------------------------------------------------------
|
|
HRESULT CViewSettingsPersistor::Load (IStream* pStream)
|
|
{
|
|
HRESULT hr = E_FAIL;
|
|
|
|
// read the column width information.
|
|
try
|
|
{
|
|
do
|
|
{
|
|
// Read the version. If it did not match return
|
|
INT nVersion = 0;
|
|
*pStream >> nVersion;
|
|
if (ViewSettingPersistenceVersion != nVersion)
|
|
return S_FALSE;
|
|
|
|
// Read the # of Snapins
|
|
DWORD dwNumItems = 0;
|
|
*pStream >> dwNumItems;
|
|
|
|
m_listViewSettings.clear();
|
|
m_mapViewSettingsIDToViewSettings.clear();
|
|
|
|
for (int i = 0; i < dwNumItems; i++)
|
|
{
|
|
// Read the ID.
|
|
CViewSettingsID viewSettingsID;
|
|
*pStream >> viewSettingsID;
|
|
|
|
// Read the data.
|
|
CViewSettings viewSettings;
|
|
viewSettings.Read(*pStream);
|
|
|
|
// Insert the data into the list.
|
|
IteratorToViewSettingsList itViewSettings;
|
|
itViewSettings = m_listViewSettings.insert(m_listViewSettings.begin(),
|
|
viewSettings);
|
|
|
|
// Insert the data into the map.
|
|
m_mapViewSettingsIDToViewSettings.insert(
|
|
CViewSettingsIDToViewSettingsMap::value_type(viewSettingsID, itViewSettings) );
|
|
}
|
|
|
|
m_listViewSettings.sort();
|
|
|
|
} while (FALSE);
|
|
}
|
|
catch (_com_error& err)
|
|
{
|
|
hr = err.Error();
|
|
}
|
|
catch (...)
|
|
{
|
|
ASSERT (0 && "Unexpected exception");
|
|
throw;
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
//+-------------------------------------------------------------------
|
|
//
|
|
// Member: Save
|
|
//
|
|
// Synopsis: Persist the view information.
|
|
//
|
|
// Arguments: [pStream]- IStream in which data is persisted.
|
|
//
|
|
// Returns: S_OK - Saved successfully.
|
|
//
|
|
// History: 04-26-1999 AnandhaG Created
|
|
//
|
|
//--------------------------------------------------------------------
|
|
HRESULT CViewSettingsPersistor::Save (IStream* pStream, BOOL bClearDirty)
|
|
{
|
|
// absolete method.
|
|
// this method is left here since we use IPersistStream to export
|
|
// persistence to CONUI side and need to implement it.
|
|
// But this interface will never be called to save data
|
|
// [we will use CPersistor-based XML saving instead]
|
|
// so the method will always fail.
|
|
ASSERT(FALSE && "Should never come here");
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
//+-------------------------------------------------------------------
|
|
//
|
|
// Member: Persist
|
|
//
|
|
// Synopsis: Persist the view information.
|
|
//
|
|
// Arguments: [CPersistor]- Persistor in/from which data is persisted.
|
|
//
|
|
// Returns: void
|
|
//
|
|
// History: 11-08-1999 AudriusZ Created
|
|
//
|
|
//--------------------------------------------------------------------
|
|
void CViewSettingsPersistor::Persist(CPersistor &persistor)
|
|
{
|
|
DECLARE_SC(sc, TEXT("CViewSettingsPersistor::Persist"));
|
|
|
|
if (persistor.IsStoring())
|
|
{
|
|
// Give ranking to each CViewSettings instance.
|
|
IteratorToViewSettingsList itViewSettings;
|
|
DWORD dwRank = 0;
|
|
for (itViewSettings = m_listViewSettings.begin();
|
|
itViewSettings != m_listViewSettings.end();
|
|
++itViewSettings)
|
|
{
|
|
dwRank++;
|
|
itViewSettings->SetUsageRank(dwRank);
|
|
}
|
|
|
|
CViewSettingsIDToViewSettingsMap::iterator itViewSettingsDataMap;
|
|
for (itViewSettingsDataMap = m_mapViewSettingsIDToViewSettings.begin();
|
|
itViewSettingsDataMap != m_mapViewSettingsIDToViewSettings.end();
|
|
++itViewSettingsDataMap)
|
|
{
|
|
// Write the ID.
|
|
persistor.Persist(*const_cast<CViewSettingsID *>(&itViewSettingsDataMap->first));
|
|
// Write the data.
|
|
persistor.Persist(*itViewSettingsDataMap->second);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// let the base class do the job
|
|
// it will call OnNewElement for every element found
|
|
XMLMapCollectionBase::Persist(persistor);
|
|
// some extra loading actions
|
|
m_listViewSettings.sort();
|
|
}
|
|
|
|
// either way we are the same as the file copy
|
|
m_bDirty = false;
|
|
}
|
|
|
|
//+-------------------------------------------------------------------
|
|
//
|
|
// Member: OnNewElement
|
|
//
|
|
// Synopsis: Called for each new data pair read.
|
|
//
|
|
// Arguments: [persistKey]- Persistor from which key is to be loaded
|
|
// [persistVal]- Persistor from which value is to be loaded
|
|
//
|
|
// Returns: void
|
|
//
|
|
// History: 11-08-1999 AudriusZ Created
|
|
//
|
|
//--------------------------------------------------------------------
|
|
void CViewSettingsPersistor::OnNewElement(CPersistor& persistKey,CPersistor& persistVal)
|
|
{
|
|
DECLARE_SC(sc, TEXT("CViewSettingsPersistor::OnNewElement"));
|
|
|
|
// Read the ID.
|
|
CViewSettingsID viewSettingsID;
|
|
persistKey.Persist(viewSettingsID);
|
|
|
|
// Read the data.
|
|
CViewSettings viewSettings;
|
|
persistVal.Persist(viewSettings);
|
|
|
|
// Insert the data into the list.
|
|
IteratorToViewSettingsList itViewSettings;
|
|
itViewSettings = m_listViewSettings.insert(m_listViewSettings.begin(),
|
|
viewSettings);
|
|
|
|
// Insert the data into the map.
|
|
m_mapViewSettingsIDToViewSettings.insert(
|
|
CViewSettingsIDToViewSettingsMap::value_type(viewSettingsID, itViewSettings) );
|
|
}
|