XTPSyntaxEditSectionManager.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:7k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // XTPSyntaxEditSectionManager.cpp: implementation of the CXTPSyntaxEditSectionManager class.
  2. //
  3. // This file is a part of the XTREME TOOLKIT PRO MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME SYNTAX EDIT LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. //////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. #include "XTPSyntaxEditSectionManager.h"
  22. //-----------------------------------------------------------------------
  23. // struct: XTP_EDIT_SCHEMAFILEINFO
  24. //-----------------------------------------------------------------------
  25. XTP_EDIT_SCHEMAFILEINFO::XTP_EDIT_SCHEMAFILEINFO()
  26. : uValue((UINT)-1)
  27. {
  28. }
  29. XTP_EDIT_SCHEMAFILEINFO::XTP_EDIT_SCHEMAFILEINFO(const XTP_EDIT_SCHEMAFILEINFO& info)
  30. : csName(info.csName)
  31. , csValue(info.csValue)
  32. , csDesc(info.csDesc)
  33. , uValue(info.uValue)
  34. {
  35. }
  36. XTP_EDIT_SCHEMAFILEINFO::XTP_EDIT_SCHEMAFILEINFO(const CString& srcName, const CString& srcValue)
  37. : csName(srcName)
  38. , csValue(srcValue)
  39. , uValue((UINT)-1)
  40. {
  41. if (csValue.Find(_T(';')) != -1)
  42. {
  43. CXTPSyntaxEditSectionManager().SplitString(
  44. csValue, csDesc, srcValue, _T(';'));
  45. }
  46. }
  47. const XTP_EDIT_SCHEMAFILEINFO& XTP_EDIT_SCHEMAFILEINFO::operator=(const XTP_EDIT_SCHEMAFILEINFO& info)
  48. {
  49. csName  = info.csName;
  50. csValue = info.csValue;
  51. csDesc  = info.csDesc;
  52. uValue  = info.uValue;
  53. return *this;
  54. }
  55. BOOL XTP_EDIT_SCHEMAFILEINFO::operator==(const XTP_EDIT_SCHEMAFILEINFO& info) const
  56. {
  57. if (&info == this)
  58. return TRUE;
  59. if (csName  != info.csName)
  60. return FALSE;
  61. if (csValue != info.csValue)
  62. return FALSE;
  63. if (csDesc  != info.csDesc)
  64. return FALSE;
  65. if (uValue  != info.uValue)
  66. return FALSE;
  67. return FALSE;
  68. }
  69. //-----------------------------------------------------------------------
  70. // class: CXTPSyntaxEditSchemaFileInfoList
  71. //-----------------------------------------------------------------------
  72. POSITION CXTPSyntaxEditSchemaFileInfoList::LookupName(const CString& csName, XTP_EDIT_SCHEMAFILEINFO& info)
  73. {
  74. for (POSITION pos = GetHeadPosition(); pos;)
  75. {
  76. POSITION posCurr = pos;
  77. info = GetNext(pos);
  78. if (csName.CompareNoCase(info.csName) == 0)
  79. {
  80. return posCurr;
  81. }
  82. }
  83. return NULL;
  84. }
  85. POSITION CXTPSyntaxEditSchemaFileInfoList::LookupValue(const CString& csValue, XTP_EDIT_SCHEMAFILEINFO& info)
  86. {
  87. for (POSITION pos = GetHeadPosition(); pos;)
  88. {
  89. POSITION posCurr = pos;
  90. info = GetNext(pos);
  91. if (csValue.CompareNoCase(info.csValue) == 0)
  92. {
  93. return posCurr;
  94. }
  95. }
  96. return NULL;
  97. }
  98. POSITION CXTPSyntaxEditSchemaFileInfoList::LookupDesc(const CString& csDesc, XTP_EDIT_SCHEMAFILEINFO& info)
  99. {
  100. for (POSITION pos = GetHeadPosition(); pos;)
  101. {
  102. POSITION posCurr = pos;
  103. info = GetNext(pos);
  104. if (csDesc.CompareNoCase(info.csDesc) == 0)
  105. {
  106. return posCurr;
  107. }
  108. }
  109. return NULL;
  110. }
  111. POSITION CXTPSyntaxEditSchemaFileInfoList::LookupValue(const UINT& uValue, XTP_EDIT_SCHEMAFILEINFO& info)
  112. {
  113. for (POSITION pos = GetHeadPosition(); pos;)
  114. {
  115. POSITION posCurr = pos;
  116. info = GetNext(pos);
  117. if (uValue == info.uValue)
  118. {
  119. return posCurr;
  120. }
  121. }
  122. return NULL;
  123. }
  124. //-----------------------------------------------------------------------
  125. // singleton: CXTPSyntaxEditSectionManager
  126. //-----------------------------------------------------------------------
  127. CXTPSyntaxEditSectionManager::CXTPSyntaxEditSectionManager()
  128. {
  129. }
  130. CXTPSyntaxEditSectionManager::~CXTPSyntaxEditSectionManager()
  131. {
  132. }
  133. int CXTPSyntaxEditSectionManager::GetSectionNames(CStringArray& arSections, LPCTSTR lpszFilePath)
  134. {
  135. TCHAR* pszBuffer = NULL;
  136. int nMaxSize = 1024;
  137. for (;;)
  138. {
  139. pszBuffer = new TCHAR[nMaxSize];
  140. long lSize = ::GetPrivateProfileSectionNames(pszBuffer, nMaxSize, lpszFilePath);
  141. if ((lSize > 0) && (lSize == (nMaxSize - 2)))
  142. {
  143. nMaxSize *= 2;
  144. SAFE_DELETE_AR(pszBuffer);
  145. }
  146. else
  147. {
  148. nMaxSize = lSize;
  149. break;
  150. }
  151. }
  152. CString csBuffer;
  153. for (int i = 0; i < nMaxSize; i++)
  154. {
  155. if (pszBuffer[i] != '')
  156. {
  157. csBuffer += pszBuffer[i];
  158. }
  159. else
  160. {
  161. if (!csBuffer.IsEmpty())
  162. {
  163. arSections.Add(csBuffer);
  164. csBuffer.Empty();
  165. }
  166. }
  167. }
  168. SAFE_DELETE_AR(pszBuffer);
  169. return (int)arSections.GetSize();
  170. }
  171. BOOL CXTPSyntaxEditSectionManager::SplitString(CString& csLeft, CString& csRight, const CString& csBuffer, TCHAR chSep)
  172. {
  173. if (!AfxExtractSubString(csLeft, csBuffer, 0, chSep))
  174. return FALSE;
  175. // trim whitespace from string.
  176. csLeft.TrimLeft();
  177. csLeft.TrimRight();
  178. if (!AfxExtractSubString(csRight, csBuffer, 1, chSep))
  179. return FALSE;
  180. // trim whitespace from string.
  181. csRight.TrimLeft();
  182. csRight.TrimRight();
  183. return TRUE;
  184. }
  185. BOOL CXTPSyntaxEditSectionManager::ParseSectionKey(XTP_EDIT_SCHEMAFILEINFO& info, const CString& csBuffer)
  186. {
  187. // extract the name and value pair from the string.
  188. if (!SplitString(info.csName, info.csValue, csBuffer, _T('=')))
  189. return FALSE;
  190. // check to see if there is a description associated with the info, if not
  191. // return success.
  192. if (info.csValue.Find(_T(';')) == -1)
  193. return TRUE;
  194. // extract the value and description pair from the string.
  195. CString csValue = info.csValue;
  196. if (!SplitString(info.csValue, info.csDesc, csValue, _T(';')))
  197. return FALSE;
  198. return TRUE;
  199. }
  200. int CXTPSyntaxEditSectionManager::GetSectionKeyList(CXTPSyntaxEditSchemaFileInfoList& infoList, LPCTSTR lpszFilePath, LPCTSTR lpszSectionName)
  201. {
  202. TCHAR* pszBuffer = NULL;
  203. int nMaxSize = 1024;
  204. for (;;)
  205. {
  206. pszBuffer = new TCHAR[nMaxSize];
  207. long lSize = ::GetPrivateProfileSection(lpszSectionName, pszBuffer, nMaxSize, lpszFilePath);
  208. if ((lSize > 0) && (lSize == (nMaxSize - 2)))
  209. {
  210. nMaxSize *= 2;
  211. SAFE_DELETE_AR(pszBuffer);
  212. }
  213. else
  214. {
  215. nMaxSize = lSize;
  216. break;
  217. }
  218. }
  219. CString csBuffer;
  220. for (int i = 0; i < nMaxSize; i++)
  221. {
  222. if (pszBuffer[i] != '')
  223. {
  224. csBuffer += pszBuffer[i];
  225. }
  226. else
  227. {
  228. if (!csBuffer.IsEmpty())
  229. {
  230. XTP_EDIT_SCHEMAFILEINFO info;
  231. ParseSectionKey(info, csBuffer);
  232. infoList.AddHead(info);
  233. csBuffer.Empty();
  234. }
  235. }
  236. }
  237. SAFE_DELETE_AR(pszBuffer);
  238. return (int)infoList.GetCount();
  239. }