preferencesbase.cpp

来自「管理项目进度工具的原代码」· C++ 代码 · 共 436 行

CPP
436
字号
// PreferencesPageBase.cpp : implementation file
//

#include "stdafx.h"
#include "PreferencesBase.h"
#include "misc.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CPreferencesStorage


CPreferencesStorage::CPreferencesStorage() : m_bDirty(FALSE), m_bIni(FALSE)
{
   // figure out whether we're using an ini file or the registry
   m_bIni = (AfxGetApp()->m_pszRegistryKey == NULL);

   if (m_bIni)
   {
      // read the ini file
      CStdioFile file;
	  DWORD dwTick = GetTickCount();

      if (file.Open(AfxGetApp()->m_pszProfileName, CFile::modeRead))
      {
         CString sLine;
         INISECTION* pCurSection = NULL;

         while (file.ReadString(sLine))
         {
            sLine.TrimLeft();
            sLine.TrimRight();

            if (sLine.IsEmpty())
               continue;

            // is it a section ?
            else if (sLine[0] == '[')
            {
               CString sSection = sLine.Mid(1, sLine.GetLength() - 2);

               pCurSection = GetSection(m_aIni, sSection, TRUE);
               ASSERT (pCurSection != NULL);
            }
            // else an entry
            else if (pCurSection)
            {
               int nEquals = sLine.Find('=');

               if (nEquals != -1)
               {
                  CString sEntry = sLine.Left(nEquals);
                  sEntry.TrimRight();

                  CString sValue = sLine.Mid(nEquals + 1);
                  sValue.TrimLeft();

                  // remove quotes
                  sValue.Replace("\"", "");

                  if (!sEntry.IsEmpty())
                     SetEntryValue(*pCurSection, sEntry, sValue);
               }
            }
         }
      }

	  TRACE ("CPreferencesStorage(Load Ini = %dms)\n", GetTickCount() - dwTick);
   }
}

CPreferencesStorage::~CPreferencesStorage()
{
   // save ini?
   if (m_bIni)
   {
	   if (m_bDirty)
	   {
		  CStdioFile file;
		  DWORD dwTick = GetTickCount();

		  if (file.Open(AfxGetApp()->m_pszProfileName, CFile::modeWrite | CFile::modeCreate))
		  {
			 for (int nSection = 0; nSection < m_aIni.GetSize(); nSection++)
			 {
				// write section line
				INISECTION* pSection = m_aIni[nSection];

				CString sLine;
				sLine.Format("[%s]\n", pSection->sSection);

				file.WriteString(sLine);

				// write entries
				POSITION pos = pSection->aEntries.GetStartPosition();

				while (pos)
				{
				   CString sDummy;
				   INIENTRY ie;

				   pSection->aEntries.GetNextAssoc(pos, sDummy, ie);

				   sLine.Format("%s=%s\n", ie.sName, ie.sValue);
				   file.WriteString(sLine);
				}
			 }
		  }

		  TRACE ("CPreferencesStorage(Save Ini = %dms)\n", GetTickCount() - dwTick);
	   }

	   // cleanup
	   int nSection = m_aIni.GetSize();

	   while (nSection--)
		  delete m_aIni[nSection];
   }
}

UINT CPreferencesStorage::GetProfileInt(LPCTSTR lpszSection, LPCTSTR lpszEntry, int nDefault) const
{
   if (m_bIni)
   {
      CString sValue = GetProfileString(lpszSection, lpszEntry);

      if (sValue.IsEmpty())
         return nDefault;
      else
         return atol(sValue);
   }
   else
      return AfxGetApp()->GetProfileInt(lpszSection, lpszEntry, nDefault);
}

BOOL CPreferencesStorage::WriteProfileInt(LPCTSTR lpszSection, LPCTSTR lpszEntry, int nValue)
{
   if (m_bIni)
   {
      CString sValue;
      sValue.Format("%ld", nValue);

      return WriteProfileString(lpszSection, lpszEntry, sValue);
   }
   else
      return AfxGetApp()->WriteProfileInt(lpszSection, lpszEntry, nValue);
}

CString CPreferencesStorage::GetProfileString(LPCTSTR lpszSection, LPCTSTR lpszEntry, LPCTSTR lpszDefault) const
{
   if (m_bIni)
   {
      INISECTION* pSection = GetSection(m_aIni, lpszSection, FALSE);

      if (pSection)
         return GetEntryValue(*pSection, lpszEntry, lpszDefault);
      else
         return lpszDefault;
   }
   else
      return AfxGetApp()->GetProfileString(lpszSection, lpszEntry, lpszDefault);
}

BOOL CPreferencesStorage::WriteProfileString(LPCTSTR lpszSection, LPCTSTR lpszEntry, LPCTSTR lpszValue)
{
   if (m_bIni)
   {
      INISECTION* pSection = GetSection(m_aIni, lpszSection, TRUE);
      ASSERT(pSection);

      if (pSection)
      {
         m_bDirty = TRUE;

         SetEntryValue(*pSection, lpszEntry, lpszValue);
         return TRUE;
      }

      // else
      return FALSE;
   }
   else
      return AfxGetApp()->WriteProfileString(lpszSection, lpszEntry, lpszValue);
}

double CPreferencesStorage::GetProfileDouble(LPCTSTR lpszSection, LPCTSTR lpszEntry, double dDefault) const
{
	CString sValue = GetProfileString(lpszSection, lpszEntry);

	if (sValue.IsEmpty())
		return dDefault;
	else
		return Misc::Atof(sValue);
}

BOOL CPreferencesStorage::WriteProfileDouble(LPCTSTR lpszSection, LPCTSTR lpszEntry, double dValue)
{
	CString sValue;
	sValue.Format("%lf", dValue);
	
	return WriteProfileString(lpszSection, lpszEntry, sValue);
}

int CPreferencesStorage::GetArrayItems(LPCTSTR szRegKey, CStringArray& aItems) const
{
	aItems.RemoveAll();
	int nCount = GetProfileInt(szRegKey, "ItemCount", 0);

	// items
	for (int nItem = 0; nItem < nCount; nItem++)
	{
		CString sItemKey, sItem;
		sItemKey.Format("Item%d", nItem);
		sItem = GetProfileString(szRegKey, sItemKey);

		if (!sItem.IsEmpty())
			aItems.Add(sItem);
	}

	return aItems.GetSize();
}

void CPreferencesStorage::WriteArrayItems(const CStringArray& aItems, LPCTSTR szRegKey)
{
	int nCount = aItems.GetSize();

	// items
	for (int nItem = 0; nItem < nCount; nItem++)
	{
		CString sItemKey;
		sItemKey.Format("Item%d", nItem);
		WriteProfileString(szRegKey, sItemKey, aItems[nItem]);
	}

	// item count
	WriteProfileInt(szRegKey, "ItemCount", nCount);
}

CString CPreferencesStorage::GetEntryValue(INISECTION& section, LPCTSTR lpszEntry, LPCTSTR lpszDefault)
{
   CString sKey(lpszEntry);
   sKey.MakeUpper();

   INIENTRY ie;
   
   if (section.aEntries.Lookup(sKey, ie) && !ie.sValue.IsEmpty())
      return ie.sValue;

   return lpszDefault;
}

void CPreferencesStorage::SetEntryValue(INISECTION& section, LPCTSTR lpszEntry, LPCTSTR szValue)
{
   CString sKey(lpszEntry);
   sKey.MakeUpper();

   section.aEntries[sKey] = INIENTRY(lpszEntry, szValue);
}

INISECTION* CPreferencesStorage::GetSection(CIniSectionArray& ini, LPCTSTR lpszSection, BOOL bCreateNotExist)
{
   int nSection = ini.GetSize();

   while (nSection--)
   {
      if (ini[nSection]->sSection.CompareNoCase(lpszSection) == 0)
         return ini[nSection];
   }

   // add a new section
   if (bCreateNotExist)
   {
      INISECTION* pSection = new INISECTION(lpszSection);

      ini.Add(pSection);
      return pSection;
   }

   // else
   return NULL;
}
/////////////////////////////////////////////////////////////////////////////
// CPreferencesPageBase property page

IMPLEMENT_DYNCREATE(CPreferencesPageBase, CPropertyPage)

CPreferencesPageBase::CPreferencesPageBase(UINT nID) : CPropertyPage(nID)
{
}

CPreferencesPageBase::~CPreferencesPageBase()
{
}

/////////////////////////////////////////////////////////////////////////////
// CPreferencesDlgBase dialog


CPreferencesDlgBase::CPreferencesDlgBase(UINT nID, CWnd* pParent) : CDialog(nID, pParent)
{
//   LoadPreferences();
}

BEGIN_MESSAGE_MAP(CPreferencesDlgBase, CDialog)
	//{{AFX_MSG_MAP(CPreferencesDlg)
	ON_WM_DESTROY()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

void CPreferencesDlgBase::OnOK()
{
	CDialog::OnOK();

   m_pphost.OnOK();
   SavePreferences();
}

int CPreferencesDlgBase::DoModal(int nInitPage)
{
	m_nInitPage = nInitPage;

	return CDialog::DoModal();
}

BOOL CPreferencesDlgBase::OnInitDialog() 
{
	CDialog::OnInitDialog();

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

BOOL CPreferencesDlgBase::CreatePPHost(UINT nHostID)
{
   if (GetDlgItem(nHostID))
   {
	   CRect rPPHost;
	   GetDlgItem(nHostID)->GetWindowRect(rPPHost);
	   ScreenToClient(rPPHost);

      return CreatePPHost(rPPHost);
   }

   // else
   return FALSE;
}

BOOL CPreferencesDlgBase::CreatePPHost(LPRECT pRect)
{
	if (m_pphost.Create(pRect, this))
	{
		if (m_nInitPage < 0 || m_nInitPage >= m_pphost.GetPageCount())
			m_nInitPage = AfxGetApp()->GetProfileInt("Preferences", "StartPage", 0);

		return SetActivePage(m_nInitPage);
	}

   // else
   return FALSE;
}

BOOL CPreferencesDlgBase::SetActivePage(int nPage)
{
	CPropertyPage* pPage = m_pphost.GetPage(nPage);
	ASSERT (pPage);

	return m_pphost.SetActivePage(pPage);
}

BOOL CPreferencesDlgBase::SetActivePage(CPreferencesPageBase* pPage)
{
   if (pPage->IsKindOf(RUNTIME_CLASS(CPreferencesPageBase)))
      return m_pphost.SetActivePage(pPage);

   // else
   return FALSE;
}

BOOL CPreferencesDlgBase::AddPage(CPreferencesPageBase* pPage)
{
   if (pPage->IsKindOf(RUNTIME_CLASS(CPreferencesPageBase)))
      return m_pphost.AddPage(pPage);

   // else
   return FALSE;
}

void CPreferencesDlgBase::OnDestroy() 
{
	CDialog::OnDestroy();
	
	AfxGetApp()->WriteProfileInt("Preferences", "StartPage", m_pphost.GetActiveIndex());
}

void CPreferencesDlgBase::LoadPreferences()
{
   // new storage object
   CPreferencesStorage ps;

   // cycle the page loading the preferences for each one
   int nPage = m_pphost.GetPageCount();

   while (nPage--)
   {
      CPreferencesPageBase* pPage = (CPreferencesPageBase*)m_pphost.GetPage(nPage);
 
      if (pPage->IsKindOf(RUNTIME_CLASS(CPreferencesPageBase)))
         pPage->LoadPreferences(ps);
   }
}

void CPreferencesDlgBase::SavePreferences()
{
   // new storage object
   CPreferencesStorage ps;

   // cycle the page saving the preferences for each one
   int nPage = m_pphost.GetPageCount();

   while (nPage--)
   {
      CPreferencesPageBase* pPage = (CPreferencesPageBase*)m_pphost.GetPage(nPage);
 
      if (pPage->IsKindOf(RUNTIME_CLASS(CPreferencesPageBase)))
         pPage->SavePreferences(ps);
   }
}


/////////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?