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.
352 lines
7.4 KiB
352 lines
7.4 KiB
// File: MruList.cpp
|
|
|
|
#include "precomp.h"
|
|
|
|
#include "MRUList.h"
|
|
#include "ConfUtil.h"
|
|
|
|
CMRUList::CMRUList() :
|
|
m_nValidEntries (0),
|
|
m_pszRegKey (NULL),
|
|
m_fDirty (FALSE)
|
|
{
|
|
DebugEntry(CMRUList::CMRUList);
|
|
|
|
// Clear out information
|
|
for (int i = 0; i < MRU_MAX_ENTRIES; i++)
|
|
{
|
|
m_szNames[i][0] = _T('\0');
|
|
}
|
|
|
|
DebugExitVOID(CMRUList::CMRUList);
|
|
}
|
|
|
|
CMRUList::~CMRUList()
|
|
{
|
|
DebugEntry(CMRUList::~CMRUList);
|
|
|
|
if (m_fDirty)
|
|
{
|
|
Save();
|
|
}
|
|
delete m_pszRegKey;
|
|
|
|
DebugExitVOID(CMRUList::~CMRUList);
|
|
}
|
|
|
|
BOOL CMRUList::ShiftEntries(int nSrc, int nDest, int cEntries)
|
|
{
|
|
DebugEntry(CMRUList::ShiftEntries);
|
|
|
|
BOOL bRet = TRUE;
|
|
|
|
ASSERT(m_nValidEntries > 0);
|
|
ASSERT(nSrc >= 0 && nSrc < MRU_MAX_ENTRIES);
|
|
ASSERT(nDest >= 0 && nDest < MRU_MAX_ENTRIES);
|
|
ASSERT(nSrc != nDest);
|
|
|
|
if ((0 == cEntries) || (cEntries > (MRU_MAX_ENTRIES - nSrc)))
|
|
{
|
|
TRACE_OUT(( "CMRUList::ShiftEntries: Adjusting cEntries from %d to %d",
|
|
cEntries,
|
|
(MRU_MAX_ENTRIES - nSrc)));
|
|
cEntries = (MRU_MAX_ENTRIES - nSrc);
|
|
}
|
|
|
|
if (nSrc > nDest)
|
|
{
|
|
// Copy forwards (first to last)
|
|
|
|
for (int i = 0; i < cEntries; i++)
|
|
{
|
|
lstrcpy(m_szNames[nDest + i], m_szNames[nSrc + i]);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Copy backwards (last to first)
|
|
|
|
for (int i = (cEntries - 1); i >= 0; i--)
|
|
{
|
|
lstrcpy(m_szNames[nDest + i], m_szNames[nSrc + i]);
|
|
}
|
|
}
|
|
|
|
DebugExitBOOL(CMRUList::ShiftEntries, bRet);
|
|
|
|
return bRet;
|
|
}
|
|
|
|
BOOL CMRUList::Load(LPCTSTR pcszRegKey)
|
|
{
|
|
DebugEntry(CMRUList::Load);
|
|
BOOL bRet = TRUE;
|
|
|
|
ASSERT(pcszRegKey);
|
|
delete m_pszRegKey;
|
|
m_pszRegKey = PszAlloc(pcszRegKey);
|
|
|
|
RegEntry reMRU(pcszRegKey, HKEY_CURRENT_USER);
|
|
int nCount = 0;
|
|
|
|
if (ERROR_SUCCESS == reMRU.GetError())
|
|
{
|
|
// Determine how many entries has been saved in the registry:
|
|
nCount = reMRU.GetNumber(REGVAL_MRU_COUNT, 0);
|
|
}
|
|
|
|
ASSERT(nCount <= MRU_MAX_ENTRIES);
|
|
|
|
for (int i = 0; i < nCount; i++)
|
|
{
|
|
TCHAR szRegName[MAX_PATH];
|
|
LPSTR pStr;
|
|
|
|
// Retrieve the name from the registry:
|
|
wsprintf(szRegName, "%s%d", REGVAL_NAME_MRU_PREFIX, i);
|
|
pStr = reMRU.GetString(szRegName);
|
|
if( NULL == pStr )
|
|
*m_szNames[i] = '\0';
|
|
else
|
|
lstrcpyn(m_szNames[i], pStr, MRU_MAX_STRING);
|
|
}
|
|
|
|
// Set the valid entries member variable:
|
|
m_nValidEntries = nCount;
|
|
|
|
// Clear the dirty flag since we have just loaded:
|
|
m_fDirty = FALSE;
|
|
|
|
DebugExitBOOL(CMRUList::Load, bRet);
|
|
|
|
return bRet;
|
|
}
|
|
|
|
BOOL CMRUList::Save()
|
|
{
|
|
DebugEntry(CMRUList::Save);
|
|
|
|
BOOL bRet = FALSE;
|
|
|
|
if (NULL != m_pszRegKey)
|
|
{
|
|
RegEntry reMRU(m_pszRegKey, HKEY_CURRENT_USER);
|
|
|
|
if (ERROR_SUCCESS == reMRU.GetError())
|
|
{
|
|
// Save the number of entries to the registry:
|
|
reMRU.SetValue(REGVAL_MRU_COUNT, m_nValidEntries);
|
|
|
|
for (int i = 0; i < m_nValidEntries; i++)
|
|
{
|
|
TCHAR szRegName[MAX_PATH];
|
|
|
|
// Set the name in the registry:
|
|
wsprintf(szRegName, "%s%d", REGVAL_NAME_MRU_PREFIX, i);
|
|
reMRU.SetValue(szRegName, m_szNames[i]);
|
|
}
|
|
|
|
reMRU.FlushKey();
|
|
|
|
if (ERROR_SUCCESS == reMRU.GetError())
|
|
{
|
|
// Clear the dirty flag since we have just saved:
|
|
m_fDirty = FALSE;
|
|
bRet = TRUE;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
ERROR_OUT(("Can't save MRU info - no reg key stored!"));
|
|
}
|
|
|
|
DebugExitBOOL(CMRUList::Save, bRet);
|
|
|
|
return bRet;
|
|
}
|
|
|
|
BOOL CMRUList::MoveEntryToTop(int nIndex)
|
|
{
|
|
DebugEntry(CMRUList::MoveEntryToTop);
|
|
|
|
BOOL bRet = TRUE;
|
|
|
|
ASSERT(nIndex >= 0 && nIndex < m_nValidEntries);
|
|
|
|
if (nIndex < (m_nValidEntries - 1))
|
|
{
|
|
TCHAR szTempName[MRU_MAX_STRING];
|
|
lstrcpy(szTempName, m_szNames[nIndex]);
|
|
|
|
// Move everything down by 1:
|
|
ShiftEntries(nIndex + 1, nIndex, m_nValidEntries - nIndex);
|
|
|
|
lstrcpy(m_szNames[m_nValidEntries - 1], szTempName);
|
|
}
|
|
|
|
// Set the dirty flag:
|
|
m_fDirty = TRUE;
|
|
|
|
DebugExitBOOL(CMRUList::MoveEntryToTop, bRet);
|
|
|
|
return bRet;
|
|
}
|
|
|
|
|
|
/* A D D N E W E N T R Y */
|
|
/*-------------------------------------------------------------------------
|
|
%%Function: AddNewEntry
|
|
|
|
Return TRUE if the entry is NEW.
|
|
-------------------------------------------------------------------------*/
|
|
BOOL CMRUList::AddNewEntry(LPCTSTR pcszName)
|
|
{
|
|
DebugEntry(CMRUList::AddNewEntry);
|
|
|
|
int nExistingEntry = FindEntry(pcszName);
|
|
BOOL bRet = (-1 == nExistingEntry); // bRet = TRUE if this is NEW
|
|
if (!bRet)
|
|
{
|
|
// This entry already exists, move it to the top:
|
|
MoveEntryToTop(nExistingEntry);
|
|
}
|
|
else
|
|
{
|
|
// This entry doesn't exist already, so add it:
|
|
if (MRU_MAX_ENTRIES == m_nValidEntries)
|
|
{
|
|
ShiftEntries(1, 0);
|
|
|
|
m_nValidEntries--;
|
|
}
|
|
|
|
ASSERT(m_nValidEntries < MRU_MAX_ENTRIES);
|
|
|
|
// Set the index to be one past the last current entry:
|
|
int nCopyIndex = m_nValidEntries;
|
|
|
|
lstrcpyn(m_szNames[nCopyIndex], pcszName, MRU_MAX_STRING - 1);
|
|
|
|
// Increment the number of valid entries:
|
|
m_nValidEntries++;
|
|
|
|
// Set the dirty flag:
|
|
m_fDirty = TRUE;
|
|
}
|
|
|
|
DebugExitBOOL(CMRUList::AddNewEntry, bRet);
|
|
|
|
return bRet;
|
|
}
|
|
|
|
|
|
/* F I N D E N T R Y */
|
|
/*-------------------------------------------------------------------------
|
|
%%Function: FindEntry
|
|
|
|
Performs a case-insensitive search for the string
|
|
-------------------------------------------------------------------------*/
|
|
int CMRUList::FindEntry(LPCTSTR pcszName)
|
|
{
|
|
for (int i = 0; i < m_nValidEntries; i++)
|
|
{
|
|
if (0 == lstrcmpi(m_szNames[i], pcszName))
|
|
{
|
|
return i;
|
|
}
|
|
}
|
|
|
|
return -1; // not found
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------//
|
|
// CMRUList::DeleteEntry. //
|
|
//--------------------------------------------------------------------------//
|
|
bool
|
|
CMRUList::DeleteEntry
|
|
(
|
|
const TCHAR * const entry
|
|
){
|
|
int entryIndex = FindEntry( entry );
|
|
bool deleted = (entryIndex != -1);
|
|
|
|
if( deleted )
|
|
{
|
|
ShiftEntries( entryIndex + 1, entryIndex );
|
|
|
|
m_nValidEntries--;
|
|
|
|
m_fDirty = TRUE;
|
|
}
|
|
|
|
return( deleted );
|
|
|
|
} // End of CMRUList::DeleteEntry.
|
|
|
|
|
|
//--------------------------------------------------------------------------//
|
|
// CMRUList::ReplaceEntry. //
|
|
//--------------------------------------------------------------------------//
|
|
bool
|
|
CMRUList::ReplaceEntry
|
|
(
|
|
const TCHAR * const oldEntry,
|
|
const TCHAR * const newEntry
|
|
){
|
|
int entryIndex = FindEntry( oldEntry );
|
|
bool replaced = (entryIndex != -1);
|
|
|
|
if( replaced )
|
|
{
|
|
lstrcpyn( m_szNames[ entryIndex ], newEntry, MRU_MAX_STRING - 1 );
|
|
|
|
m_fDirty = TRUE;
|
|
}
|
|
|
|
return( replaced );
|
|
|
|
} // End of CMRUList::ReplaceEntry.
|
|
|
|
|
|
//--------------------------------------------------------------------------//
|
|
// CMRUList::AppendEntry. //
|
|
//--------------------------------------------------------------------------//
|
|
bool
|
|
CMRUList::AppendEntry
|
|
(
|
|
const TCHAR * const entry
|
|
){
|
|
DebugEntry( CMRUList::AppendEntry );
|
|
|
|
bool result;
|
|
|
|
if( (result = (FindEntry( entry ) == -1)) != false )
|
|
{
|
|
// This entry doesn't already exist so we'll append it on...
|
|
if( m_nValidEntries == MRU_MAX_ENTRIES )
|
|
{
|
|
// The list is full so we'll replace the last one...
|
|
lstrcpyn( m_szNames[ 0 ], entry, MRU_MAX_STRING - 1 );
|
|
}
|
|
else
|
|
{
|
|
if( m_nValidEntries > 0 )
|
|
{
|
|
ShiftEntries( 0, 1 );
|
|
}
|
|
|
|
lstrcpyn( m_szNames[ 0 ], entry, MRU_MAX_STRING - 1 );
|
|
m_nValidEntries++;
|
|
}
|
|
|
|
// Set the dirty flag...
|
|
m_fDirty = TRUE;
|
|
}
|
|
|
|
DebugExitBOOL( CMRUList::AppendEntry, result );
|
|
|
|
return( result );
|
|
|
|
} // End of CMRUList::AppendEntry.
|