HistoryCombo.cpp
上传用户:liguizhu
上传日期:2015-11-01
资源大小:2422k
文件大小:7k
源码类别:

P2P编程

开发平台:

Visual C++

  1. /*
  2.  *  Openmysee
  3.  *
  4.  *  This program is free software; you can redistribute it and/or modify
  5.  *  it under the terms of the GNU General Public License as published by
  6.  *  the Free Software Foundation; either version 2 of the License, or
  7.  *  (at your option) any later version.
  8.  *
  9.  *  This program is distributed in the hope that it will be useful,
  10.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  *  GNU General Public License for more details.
  13.  *
  14.  *  You should have received a copy of the GNU General Public License
  15.  *  along with this program; if not, write to the Free Software
  16.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  17.  *
  18.  */
  19. ////////////////////////////////////////////////////////////////////////////
  20. ////////////////////////////////////
  21. #include "stdafx.h"
  22. #include "HistoryCombo.h"
  23. #ifdef _DEBUG
  24. #define new DEBUG_NEW
  25. #undef THIS_FILE
  26. static char THIS_FILE[] = __FILE__;
  27. #endif
  28. #define MAX_HISTORY_ITEMS 50
  29. /////////////////////////////////////////////////////////////////////////////
  30. // CHistoryCombo
  31. CHistoryCombo::CHistoryCombo(BOOL bAllowSortStyle/*=FALSE*/)
  32. {
  33.   m_nMaxHistoryItems = MAX_HISTORY_ITEMS;
  34.   m_bSaveRestoreLastCurrent = TRUE;
  35.   m_bAllowSortStyle = bAllowSortStyle;
  36. }
  37. CHistoryCombo::~CHistoryCombo()
  38. {
  39. }
  40. BOOL CHistoryCombo::PreCreateWindow(CREATESTRUCT& cs) 
  41. {
  42.   if (! m_bAllowSortStyle)  // turn off CBS_SORT style
  43.     cs.style &= ~CBS_SORT;
  44.   return CComboBox::PreCreateWindow(cs);
  45. }
  46. void CHistoryCombo::PreSubclassWindow() 
  47. {
  48.   // warn if creating with CBS_SORT style
  49.   // (unfortunately we can't turn it off)
  50.   if (! m_bAllowSortStyle && GetStyle() & CBS_SORT)
  51.     TRACE(_T("WARNING: Creating History combo with CBS_SORT stylen"));
  52.   CComboBox::PreSubclassWindow();
  53. }
  54. BEGIN_MESSAGE_MAP(CHistoryCombo, CComboBox)
  55. //{{AFX_MSG_MAP(CHistoryCombo)
  56. // NOTE - the ClassWizard will add and remove mapping macros here.
  57. //}}AFX_MSG_MAP
  58. END_MESSAGE_MAP()
  59. /////////////////////////////////////////////////////////////////////////////
  60.  
  61. int CHistoryCombo::AddString(LPCTSTR lpszString)
  62. {
  63.  
  64.   if (m_sSection.IsEmpty() || m_sKeyPrefix.IsEmpty())
  65.     return CComboBox::AddString(lpszString);
  66.   int nRet = -1;
  67.   
  68.   CString sString(lpszString);
  69.   sString.TrimLeft(_T(" "));
  70.   sString.TrimRight(_T(" "));
  71.   nRet = CComboBox::InsertString(0, sString);
  72.   int nIndex = FindStringExact(0, sString);
  73.   if (nIndex != -1 && nIndex != 0)
  74.     DeleteString(nIndex);
  75.   
  76.   int nNumItems = GetCount();
  77.   for (int n = m_nMaxHistoryItems; n < nNumItems; n++)
  78.     DeleteString(m_nMaxHistoryItems);
  79.   SetCurSel(nRet);
  80.   return nRet;
  81. }
  82. CString CHistoryCombo::LoadHistory(CRecentFileList* pListMRU, BOOL bSelectMostRecent/*=TRUE*/)
  83. {
  84.   if (pListMRU == NULL)
  85.     return "";
  86.   int nNumItems = pListMRU->GetSize();
  87.   for (int n = 0; n < nNumItems; n++)
  88.     CComboBox::AddString((*pListMRU)[n]);
  89.   if (bSelectMostRecent)
  90.     SetCurSel(0);
  91.   CString sText;
  92.   GetWindowText(sText);
  93.   return sText;
  94. }
  95. CString CHistoryCombo::LoadHistory(LPCTSTR lpszSection, LPCTSTR lpszKeyPrefix, 
  96.    BOOL bSaveRestoreLastCurrent/*=TRUE*/, 
  97.    LPCTSTR lpszKeyCurItem/*=NULL*/)
  98. {
  99.   if (lpszSection == NULL || lpszKeyPrefix == NULL || *lpszSection == '')
  100.     return "";
  101.   m_sSection = lpszSection;
  102.   m_sKeyPrefix = lpszKeyPrefix;
  103.   m_sKeyCurItem = lpszKeyCurItem == NULL ? _T("") : lpszKeyCurItem;
  104.   m_bSaveRestoreLastCurrent = bSaveRestoreLastCurrent;
  105.   CWinApp* pApp = AfxGetApp();
  106.   int n = 0;
  107.   CString sText;
  108.   do
  109.   {
  110.     CString sKey;
  111.     sKey.Format(_T("%s%d"), m_sKeyPrefix, n++);
  112.     sText = pApp->GetProfileString(m_sSection, sKey);
  113.     if (!sText.IsEmpty())
  114.       CComboBox::AddString(sText);
  115.   }while (!sText.IsEmpty() && n < m_nMaxHistoryItems);
  116.   if (m_bSaveRestoreLastCurrent)
  117.   {
  118.     CString sKey;
  119.     if (!m_sKeyCurItem.IsEmpty())
  120.       sKey = m_sKeyCurItem;
  121.     else if (m_sKeyPrefix.IsEmpty())
  122.       sKey = "Last";
  123.     else
  124.       sKey = m_sKeyPrefix;
  125.     sText = pApp->GetProfileString(m_sSection, sKey);
  126.     if (!sText.IsEmpty())
  127.     {
  128.       int nIndex = FindStringExact(-1, sText);
  129.       if (nIndex != -1)
  130. SetCurSel(nIndex);
  131.       else if (GetStyle() & CBS_DROPDOWN)
  132. SetWindowText(sText);
  133.     }
  134.   }
  135.   return sText;
  136. }
  137. void CHistoryCombo::SaveHistory(BOOL bAddCurrentItemToHistory/*=TRUE*/)
  138. {
  139.   if (m_sSection.IsEmpty())
  140.     return;
  141.   CWinApp* pApp = AfxGetApp();
  142.   ASSERT(pApp);
  143.   if (bAddCurrentItemToHistory)
  144.   {
  145.     CString sCurItem;
  146.     GetWindowText(sCurItem);
  147.     // trim it, so we items which differ only by a leading/trailing space
  148.     sCurItem.TrimLeft();
  149.     sCurItem.TrimRight();
  150.     if (! sCurItem.IsEmpty())
  151.       AddString(sCurItem);
  152.   }
  153.   // save history to info cached earlier
  154.   int nMax = min(GetCount(), m_nMaxHistoryItems + 1);
  155.   for (int n = 0; n < nMax; n++)
  156.   {
  157.     CString sKey;
  158.     sKey.Format(_T("%s%d"), m_sKeyPrefix, n);
  159.     CString sText;
  160.     GetLBText(n, sText);
  161.     pApp->WriteProfileString(m_sSection, sKey, sText);
  162.   }
  163.   for (n = nMax; n < 1000/* prevent runaway*/; n++)
  164.   {
  165.     CString sKey;
  166.     sKey.Format(_T("%s%d"), m_sKeyPrefix, n);
  167.     CString sText = pApp->GetProfileString(m_sSection, sKey);
  168.     if (sText.IsEmpty())
  169.       break;
  170.     pApp->WriteProfileString(m_sSection, sKey, NULL); // remove entry
  171.   }
  172.   if (m_bSaveRestoreLastCurrent)
  173.   {
  174.     CString sText;
  175.     GetWindowText(sText);
  176.     CString sKey;
  177.     if (!m_sKeyCurItem.IsEmpty())
  178.       sKey = m_sKeyCurItem;
  179.     else if (m_sKeyPrefix.IsEmpty())
  180.       sKey = "Last";
  181.     else
  182.       sKey = m_sKeyPrefix;
  183.     pApp->WriteProfileString(m_sSection, sKey, sText);
  184.   }
  185. }
  186. void CHistoryCombo::ClearHistory(BOOL bDeleteRegistryEntries/*=TRUE*/)
  187. {
  188.   ResetContent();
  189.   if (! m_sSection.IsEmpty() && bDeleteRegistryEntries)
  190.   {
  191.     // remove profile entries
  192.     CWinApp* pApp = AfxGetApp();
  193.     ASSERT(pApp);
  194.     CString sKey;
  195.     for (int n = 0; n < 1000/* prevent runaway*/; n++)
  196.     {
  197.       sKey.Format(_T("%s%d"), m_sKeyPrefix, n);
  198.       CString sText = pApp->GetProfileString(m_sSection, sKey);
  199.       if (sText.IsEmpty())
  200. break;
  201.       pApp->WriteProfileString(m_sSection, sKey, NULL); // remove entry
  202.     }
  203.     if (! m_sKeyCurItem.IsEmpty())
  204.       sKey = m_sKeyCurItem;
  205.     else if (m_sKeyPrefix.IsEmpty())
  206.       sKey = "Last";
  207.     else
  208.       sKey = m_sKeyPrefix;
  209.     pApp->WriteProfileString(m_sSection, sKey, NULL);
  210.   }
  211. }
  212. void CHistoryCombo::SetMaxHistoryItems(int nMaxItems)
  213. {
  214.   m_nMaxHistoryItems = nMaxItems;
  215.   int nNumItems = GetCount();
  216.   for (int n = m_nMaxHistoryItems; n < nNumItems; n++)
  217.     DeleteString(m_nMaxHistoryItems);
  218. }
  219. void CHistoryCombo::StoreValue(BOOL bIgnoreIfEmpty/*=TRUE*/)
  220. {
  221.   
  222.   CString sValue;
  223.   GetWindowText(sValue);
  224.   if (bIgnoreIfEmpty && sValue.IsEmpty())
  225.     return;
  226.   AddString(sValue);
  227. }