HistoryComboEx.cpp
上传用户:lds876
上传日期:2013-05-25
资源大小:567k
文件大小:9k
源码类别:

P2P编程

开发平台:

Visual C++

  1. /*********************************************************************************************/
  2. // File: HistoryComboEx.h
  3. // Version: 1.0
  4. // Created: 22. 10. 2001
  5. //
  6. // This class is based of CHistoryCombo from Paul S. Vicherky and it enables you to load and 
  7. // save the items of an ComboBoxEx.
  8. //
  9. // The modifications are maded by: Nabil Hussein
  10. // E-mail:    unc@index.com.jo
  11. /*********************************************************************************************/
  12. ////////////////////////////////////////////////////////////////////////////
  13. // File: HistoryCombo.cpp
  14. // Version: 1.0.0.0
  15. // Created: 12-Apr-2001
  16. //
  17. // Author: Paul S. Vickery
  18. // E-mail: paul@vickeryhome.freeserve.co.uk
  19. //
  20. // Implementation of CHistoryCombo which incorporates functionality to help
  21. // with Loading and Saving of history in a combo box
  22. //
  23. // You are free to use or modify this code, with no restrictions, other than
  24. // you continue to acknowledge me as the original author in this source code,
  25. // or any code derived from it.
  26. //
  27. // If you use this code, or use it as a base for your own code, it would be 
  28. // nice to hear from you simply so I know it's not been a waste of time!
  29. //
  30. // Copyright (c) 2001 Paul S. Vickery
  31. //
  32. // PLEASE LEAVE THIS HEADER INTACT
  33. ////////////////////////////////////////////////////////////////////////////
  34. // HistoryComboEx.cpp : implementation file
  35. //
  36. #include "stdafx.h"
  37. #include "HistoryComboEx.h"
  38. #ifdef _DEBUG
  39. #define new DEBUG_NEW
  40. #undef THIS_FILE
  41. static char THIS_FILE[] = __FILE__;
  42. #endif
  43. #define MAX_HISTORY_ITEMS 10
  44. #include <atlbase.h>  // required for CRegKey
  45. /////////////////////////////////////////////////////////////////////////////
  46. // CHistoryComboEx
  47. CHistoryComboEx::CHistoryComboEx()
  48. {
  49. m_nMaxHistoryItems = MAX_HISTORY_ITEMS;
  50. m_bSaveRestoreLastCurrent = TRUE;
  51. }
  52. CHistoryComboEx::~CHistoryComboEx()
  53. {
  54. }
  55. BOOL CHistoryComboEx::PreCreateWindow(CREATESTRUCT& cs) 
  56. {
  57. // warn if creating with CBS_SORT style
  58. // (unfortunately we can't turn it off)
  59. if (cs.style & CBS_SORT)
  60. TRACE("WARNING: Creating History combo with CBS_SORT stylen");
  61. return CComboBox::PreCreateWindow(cs);
  62. }
  63. BEGIN_MESSAGE_MAP(CHistoryComboEx, CComboBox)
  64. //{{AFX_MSG_MAP(CHistoryComboEx)
  65. // NOTE - the ClassWizard will add and remove mapping macros here.
  66. //}}AFX_MSG_MAP
  67. END_MESSAGE_MAP()
  68. /////////////////////////////////////////////////////////////////////////////
  69. // CHistoryComboEx message handlers
  70. // this version of InsertItem adds a string only if it doesn't already exist
  71. // in the list, and in any case, makes sure that the string is the first
  72. // in the list (ie most recent in history)
  73. // also makes sure number of items in the list doesn't exceed the maximum allowed
  74. int CHistoryComboEx::InsertItem(const COMBOBOXEXITEM *pCBItem)
  75. {
  76. assert(false);
  77. /*
  78. // if it's not set up as a history combo then call base class
  79. if (m_sSection.IsEmpty() || m_sKeyPrefix.IsEmpty())
  80. return CComboBoxEx::InsertItem(pCBItem);
  81. int nRet = -1;
  82. // don't add it already there
  83. COMBOBOXEXITEM cbiTemp;
  84. cbiTemp = *pCBItem;
  85. CString str = (CString) cbiTemp.pszText;
  86. str.TrimLeft(" ");
  87. str.TrimRight(" ");
  88. cbiTemp.pszText = (LPTSTR)(LPCTSTR) str;
  89. cbiTemp.iItem = 0;
  90. nRet = CComboBoxEx::InsertItem(&cbiTemp);
  91. int nIndex = FindStringExact(0, cbiTemp.pszText);
  92. if (nIndex != -1 && nIndex != 0)
  93. DeleteString(nIndex);
  94. SetCurSel(nRet);
  95. return nRet;
  96. //*/
  97. return 0;
  98. }
  99. // This version enables you to send a CString value only.
  100. int CHistoryComboEx::InsertItem(CString strItem)
  101. {
  102. /*
  103. COMBOBOXEXITEM pCBItem;
  104. pCBItem.mask = CBEIF_TEXT;
  105. pCBItem.iItem = 0;
  106. pCBItem.pszText = (LPTSTR)(LPCTSTR)strItem;
  107. // return InsertItem (&pCBItem);
  108. //*/
  109. CString str = (CString)strItem;
  110. str.TrimLeft(" ");
  111. str.TrimRight(" ");
  112. int nRet = InsertString(0, str);
  113. int nIndex = FindStringExact(0, str);
  114. if (nIndex != -1 && nIndex != 0)
  115. DeleteString(nIndex);
  116. SetCurSel(nRet);
  117. return 0;
  118. }
  119. // loads the history from the specified profile area, and returns the 
  120. // text selected
  121. // the profile area is kept so that in doesn't need to specified again
  122. // when saving the history
  123. CString CHistoryComboEx::LoadHistory(LPCTSTR lpszSection, LPCTSTR lpszKeyPrefix, BOOL bSaveRestoreLastCurrent, LPCTSTR lpszKeyCurItem)
  124. {
  125. if (lpszSection == NULL || lpszKeyPrefix == NULL || *lpszSection == '')
  126. return "";
  127. COMBOBOXEXITEM cbiItem;
  128. cbiItem.mask = CBEIF_TEXT;
  129. cbiItem.iItem = 0;
  130. m_sSection = lpszSection;
  131. m_sKeyPrefix = lpszKeyPrefix;
  132. m_sKeyCurItem = lpszKeyCurItem == NULL ? "" : lpszKeyCurItem;
  133. m_bSaveRestoreLastCurrent = bSaveRestoreLastCurrent;
  134. CWinApp* pApp = AfxGetApp();
  135. int n = 0;
  136. CString sText;
  137. do
  138. {
  139. CString sKey;
  140. sKey.Format("%s%d", m_sKeyPrefix, n++);
  141. sText = pApp->GetProfileString(m_sSection, sKey);
  142. cbiItem.pszText = (LPSTR) (LPCSTR) sText;
  143. if (!sText.IsEmpty())
  144. InsertItem(sText);
  145. /*
  146. if (!sText.IsEmpty())
  147. CComboBoxEx::InsertItem(&cbiItem);
  148. //*/
  149. } while (!sText.IsEmpty());
  150.   
  151. if (m_bSaveRestoreLastCurrent)
  152. {
  153. CString sKey;
  154. if (!m_sKeyCurItem.IsEmpty())
  155. sKey = m_sKeyCurItem;
  156. else if (m_sKeyPrefix.IsEmpty())
  157. sKey = "Last";
  158. else
  159. sKey = m_sKeyPrefix;
  160.     
  161. sText = pApp->GetProfileString(m_sSection, sKey);
  162.     
  163. if (!sText.IsEmpty())
  164. {
  165. int nIndex = FindStringExact(-1, sText);
  166. if (nIndex != -1)
  167. SetCurSel(nIndex);
  168.        else if (GetStyle() & CBS_DROPDOWN)
  169. SetWindowText(sText);
  170. }
  171. }
  172.   
  173. return sText;
  174. }
  175. // loads the history from the specified MRU list, and populates the combo list
  176. // if bSelectMostRecent is TRUE, selects the most recent into the edit control
  177. // returns the selected text
  178. // if using this overload of LoadHistory then SaveHistory will not function
  179. // but you should simply save the MRU in the normal way instead
  180. // note that the MRU should have already been read from the profile before
  181. // being passed to this function, as this function will not call MRU->ReadList()
  182. /*
  183. CString CHistoryComboEx::LoadHistory(CRecentFileList *pListMRU, BOOL bSelectMostRecent)
  184. {
  185. if (pListMRU == NULL)
  186. return "";
  187. int nNumItems = pListMRU->GetSize();
  188. COMBOBOXEXITEM cbiItem;
  189. cbiItem.mask = CBEIF_TEXT;
  190. cbiItem.iItem = 0;
  191. for (int n = 0; n < nNumItems; n++)
  192. {
  193. cbiItem.pszText = (LPSTR) (LPCTSTR) (*pListMRU)[n];
  194. CComboBoxEx::InsertItem(&cbiItem);
  195. }
  196. if (bSelectMostRecent)
  197. SetCurSel(0);
  198.   
  199. CString sText;
  200.    GetWindowText(sText);
  201.   
  202. return sText;
  203. }
  204. //*/
  205. // saves the history to the profile specified when calling LoadHistory
  206. // if no profile information (ie LoadHistory() wasn't called with it) then
  207. // this function does nothing
  208. void CHistoryComboEx::SaveHistory(BOOL bAddCurrentItemtoHistory)
  209. {
  210. COMBOBOXEXITEM cbiItem;
  211. cbiItem.mask = CBEIF_TEXT;
  212. cbiItem.iItem = 0;
  213. if (m_sSection.IsEmpty())
  214. return;
  215. CWinApp* pApp = AfxGetApp();
  216.   
  217. if (bAddCurrentItemtoHistory)
  218. {
  219. CString sCurItem;
  220. GetWindowText(sCurItem);
  221. // trim it, so we items which differ only by a leading/trailing space
  222. sCurItem.TrimLeft();
  223. sCurItem.TrimRight();
  224. if (!sCurItem.IsEmpty())
  225. {
  226. cbiItem.pszText = (LPSTR) (LPCSTR) (sCurItem);
  227. // InsertItem(&cbiItem);
  228. InsertItem(sCurItem);
  229. }
  230. }
  231. // save history to info cached earlier
  232. int nMax = min(GetCount(), m_nMaxHistoryItems + 1);
  233. for (int n = 0; n < nMax; n++)
  234. {
  235. CString sKey;
  236. sKey.Format("%s%d", m_sKeyPrefix, n);
  237. CString sText;
  238. GetLBText(n, sText);
  239. pApp->WriteProfileString(m_sSection, sKey, sText);
  240. }
  241. if (m_bSaveRestoreLastCurrent)
  242. {
  243. CString sText;
  244. GetWindowText(sText);
  245. CString sKey;
  246. if (!m_sKeyCurItem.IsEmpty())
  247. sKey = m_sKeyCurItem;
  248. else if (m_sKeyPrefix.IsEmpty())
  249. sKey = "Last";
  250. else
  251. sKey = m_sKeyPrefix;
  252.     
  253. pApp->WriteProfileString(m_sSection, sKey, sText);
  254. }
  255. }
  256. // removes all the items from the history list, and optionally deletes
  257. // the registry items. Note that if the history list is generated from
  258. // a CRecentFileList, then registry entries will not be deleted
  259. void CHistoryComboEx::ClearHistory(BOOL bDeleteRegistryEntries)
  260. {
  261. ResetContent();
  262. if (! m_sSection.IsEmpty() && bDeleteRegistryEntries)
  263. {
  264. // get the actual reg key used
  265. CWinApp* pApp = AfxGetApp();
  266. CRegKey rk;
  267. CString sKey = "SOFTWARE\";
  268.     
  269. if (pApp->m_pszRegistryKey == NULL || pApp->m_pszAppName == NULL)
  270. return;
  271.     
  272. sKey += pApp->m_pszRegistryKey + CString("\");    
  273. sKey += pApp->m_pszAppName + CString("\");
  274. sKey += m_sSection;
  275. if (rk.Open(HKEY_CURRENT_USER, sKey) != ERROR_SUCCESS)
  276. return;
  277.     
  278. // delete actual values
  279. int nMax = m_nMaxHistoryItems + 1;
  280.     
  281. for (int n = 0; n < nMax; n++)
  282. {
  283. sKey.Format("%s%d", m_sKeyPrefix, n);
  284. rk.DeleteValue(sKey);
  285. }
  286.     
  287. if (!m_sKeyCurItem.IsEmpty())
  288. sKey = m_sKeyCurItem;
  289. else if (m_sKeyPrefix.IsEmpty())
  290. sKey = "Last";
  291. else
  292. sKey = m_sKeyPrefix;
  293. rk.DeleteValue(sKey);
  294. }
  295. }