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

对话框与窗口

开发平台:

Visual C++

  1. // XTPCalendarCustomProperties.cpp: implementation of the
  2. // CXTPCalendarCustomProperties class.
  3. //
  4. // This file is a part of the XTREME CALENDAR MFC class library.
  5. // (c)1998-2008 Codejock Software, All Rights Reserved.
  6. //
  7. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  8. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  9. // CONSENT OF CODEJOCK SOFTWARE.
  10. //
  11. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  12. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  13. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  14. // SINGLE COMPUTER.
  15. //
  16. // CONTACT INFORMATION:
  17. // support@codejock.com
  18. // http://www.codejock.com
  19. //
  20. /////////////////////////////////////////////////////////////////////////////
  21. #include "stdafx.h"
  22. #include "Common/XTPPropExchange.h"
  23. #include "Common/XTPVC50Helpers.h"
  24. #include "Common/XTPResourceManager.h"
  25. #include "XTPCalendarCustomProperties.h"
  26. //#ifndef _tstof
  27. //  #ifdef _UNICODE
  28. //      #include <stdlib.h>
  29. //      #define _tstof _wtof
  30. //  #else
  31. //      #define _tstof atof
  32. //  #endif
  33. //#endif
  34. #define XTP_CUSTOM_PROP_DATA_VER 1
  35. // 37, 53, 79 , 101, 127, 199, 503
  36. #define XTP_CUSTOM_PROP_HASH_TABLE_SIZE 127
  37. IMPLEMENT_DYNAMIC(CXTPCalendarCustomProperties, CCmdTarget)
  38. //////////////////////////////////////////////////////////////////////
  39. // Construction/Destruction
  40. //////////////////////////////////////////////////////////////////////
  41. CXTPCalendarCustomProperties::CXTPCalendarCustomProperties(BOOL bNameIgnoreCase)
  42. {
  43. m_bNameIgnoreCase = bNameIgnoreCase;
  44. m_mapProperties.InitHashTable(XTP_CUSTOM_PROP_HASH_TABLE_SIZE, FALSE);
  45. }
  46. CXTPCalendarCustomProperties::~CXTPCalendarCustomProperties()
  47. {
  48. }
  49. CString CXTPCalendarCustomProperties::PrepareName(LPCTSTR pcszName) const
  50. {
  51. CString strName = pcszName;
  52. if (m_bNameIgnoreCase)
  53. {
  54. strName.MakeLower();
  55. }
  56. return strName;
  57. }
  58. BOOL CXTPCalendarCustomProperties::GetProperty(LPCTSTR pcszName, COleVariant& rVarValue) const
  59. {
  60. return m_mapProperties.Lookup(PrepareName(pcszName), rVarValue);
  61. }
  62. BOOL CXTPCalendarCustomProperties::SetProperty(LPCTSTR pcszName, const COleVariant& varValue)
  63. {
  64. COleVariant varVal = varValue;
  65. m_mapProperties.SetAt(PrepareName(pcszName), varVal);
  66. return TRUE;
  67. }
  68. BOOL CXTPCalendarCustomProperties::RemoveProperty(LPCTSTR pcszName)
  69. {
  70. return m_mapProperties.RemoveKey(PrepareName(pcszName));
  71. }
  72. void CXTPCalendarCustomProperties::RemoveAll()
  73. {
  74. m_mapProperties.RemoveAll();
  75. }
  76. int CXTPCalendarCustomProperties::GetCount()
  77. {
  78. return (int)m_mapProperties.GetCount();
  79. }
  80. POSITION CXTPCalendarCustomProperties::GetStartPosition() const
  81. {
  82. return m_mapProperties.GetStartPosition();
  83. }
  84. void CXTPCalendarCustomProperties::GetNextProperty(POSITION& rPos, CString& rStrName, COleVariant& rVarValue) const
  85. {
  86. m_mapProperties.GetNextAssoc(rPos, rStrName, rVarValue);
  87. }
  88. void CXTPCalendarCustomProperties::DoPropExchange(CXTPPropExchange* pPX)
  89. {
  90. if (!pPX)
  91. {
  92. ASSERT(FALSE);
  93. return;
  94. }
  95. if (pPX->IsLoading())
  96. {
  97. _Load(pPX);
  98. }
  99. else
  100. {
  101. _Save(pPX);
  102. }
  103. }
  104. void CXTPCalendarCustomProperties::_Save(CXTPPropExchange* pPX)
  105. {
  106. if (!pPX || !pPX->IsStoring())
  107. {
  108. ASSERT(FALSE);
  109. return;
  110. }
  111. CXTPPropExchangeSection secProps(pPX->GetSection(_T("CustomProperties")));
  112. secProps->EmptySection();
  113. long nVersion = XTP_CUSTOM_PROP_DATA_VER;
  114. PX_Long(&secProps, _T("Version"), nVersion, XTP_CUSTOM_PROP_DATA_VER);
  115. int nPropsCount = GetCount();
  116. CXTPPropExchangeEnumeratorPtr pEnumerator(secProps->GetEnumerator(_T("CustomProperty")));
  117. POSITION posStorage = pEnumerator->GetPosition(nPropsCount);
  118. int nPropSaved = 0;
  119. POSITION pos = m_mapProperties.GetStartPosition();
  120. while (pos)
  121. {
  122. CString strName;
  123. COleVariant varValue;
  124. m_mapProperties.GetNextAssoc(pos, strName, varValue);
  125. CXTPPropExchangeSection secProp(pEnumerator->GetNext(posStorage));
  126. PX_String(&secProp, _T("Name"), strName);
  127. PX_Variant(&secProp, _T("Value"), varValue, COleVariant((long)0));
  128. long lVt = varValue.vt;
  129. PX_Long(&secProp, _T("VariantType"), lVt);
  130. nPropSaved++;
  131. }
  132. ASSERT(nPropSaved == nPropsCount);
  133. }
  134. void CXTPCalendarCustomProperties::_Load(CXTPPropExchange* pPX)
  135. {
  136. if (!pPX || !pPX->IsLoading())
  137. {
  138. ASSERT(FALSE);
  139. return;
  140. }
  141. m_mapProperties.RemoveAll();
  142. CXTPPropExchangeSection secProps(pPX->GetSection(_T("CustomProperties")));
  143. long nVersion;
  144. PX_Long(&secProps, _T("Version"), nVersion, XTP_CUSTOM_PROP_DATA_VER);
  145. if (nVersion != XTP_CUSTOM_PROP_DATA_VER)
  146. {
  147. TRACE(_T("ERROR! XTPCalendarCustomProperties: Unsupported data file version. (%d) n"), nVersion);
  148. return;
  149. }
  150. CXTPPropExchangeEnumeratorPtr pEnumerator(secProps->GetEnumerator(_T("CustomProperty")));
  151. POSITION posStorage = pEnumerator->GetPosition();
  152. while (posStorage)
  153. {
  154. CString strName;
  155. COleVariant varValue;
  156. CXTPPropExchangeSection secProp(pEnumerator->GetNext(posStorage));
  157. PX_String(&secProp, _T("Name"), strName);
  158. PX_Variant(&secProp, _T("Value"), varValue, COleVariant((long)0));
  159. long lVt;
  160. PX_Long(&secProp, _T("VariantType"), lVt, VT_EMPTY);
  161. if (lVt != VT_EMPTY && varValue.vt != lVt)
  162. {
  163. LCID lcidID = pPX->m_lcidDateTime;
  164. if (lcidID == XTP_LOCALE_ISO8601)
  165. {
  166. lcidID = LOCALE_NEUTRAL;
  167. }
  168. COleVariant varValue2;
  169. HRESULT hr = VariantChangeTypeEx(&varValue2, &varValue,
  170. lcidID, 0, (VARTYPE)lVt);
  171. if (FAILED(hr))
  172. {
  173. hr = VariantChangeType(&varValue2, &varValue, 0, (VARTYPE)lVt);
  174. }
  175. if (FAILED(hr))
  176. {
  177. hr = VariantChangeType(&varValue2, &varValue, VARIANT_NOUSEROVERRIDE, (VARTYPE)lVt);
  178. }
  179. if (SUCCEEDED(hr))
  180. {
  181. varValue = varValue2;
  182. }
  183. else if (varValue.vt == VT_BSTR && (lVt == VT_R4 || lVt == VT_R8 || lVt == VT_DATE))
  184. {
  185. CString strValue = varValue.bstrVal;
  186. REPLACE_S(strValue, _T(','), _T('.'));
  187. double dblVal = atof(XTP_CT2CA(strValue));
  188. if (lVt == VT_R4)
  189. {
  190. varValue = (float)dblVal;
  191. }
  192. else if (lVt == VT_R8)
  193. {
  194. varValue = (double)dblVal;
  195. }
  196. else if (lVt == VT_DATE)
  197. {
  198. varValue = COleDateTime((DATE)dblVal);
  199. }
  200. }
  201. else
  202. {
  203. ASSERT(FALSE);
  204. }
  205. }
  206. SetProperty(strName, varValue);
  207. }
  208. }
  209. ////////////////////////////////////////////////////////////////////////////
  210. void CXTPCalendarCustomProperties::CopyTo(CXTPCalendarCustomProperties* pDest)
  211. {
  212. if (!pDest)
  213. {
  214. ASSERT(FALSE);
  215. return;
  216. }
  217. pDest->RemoveAll();
  218. POSITION pos = GetStartPosition();
  219. while (pos)
  220. {
  221. CString strName;
  222. COleVariant varValue;
  223. GetNextProperty(pos, strName, varValue);
  224. VERIFY(pDest->SetProperty(strName, varValue));
  225. }
  226. }
  227. BOOL CXTPCalendarCustomProperties::LoadFromXML(LPCTSTR pcszXMLData)
  228. {
  229. if (!pcszXMLData)
  230. {
  231. ASSERT(FALSE);
  232. return FALSE;
  233. }
  234. RemoveAll();
  235. if (*pcszXMLData == _T(''))
  236. {
  237. return TRUE;
  238. }
  239. #ifndef _XTP_EXCLUDE_XML
  240. CXTPPropExchangeXMLNode propPX(TRUE, 0, _T("Calendar"));
  241. if (!propPX.LoadFromString(pcszXMLData))
  242. return FALSE;
  243. propPX.ExchangeLocale();
  244. DoPropExchange(&propPX);
  245. return TRUE;
  246. #else
  247. return FALSE;
  248. #endif
  249. }
  250. BOOL CXTPCalendarCustomProperties::SaveToXML(CString& rstrXMLData)
  251. {
  252. #ifndef _XTP_EXCLUDE_XML
  253. CXTPPropExchangeXMLNode propPX(FALSE, 0, _T("Calendar"));
  254. propPX.ExchangeLocale();
  255. DoPropExchange(&propPX);
  256. rstrXMLData = propPX.GetXML();
  257. return TRUE;
  258. #else
  259. return FALSE;
  260. #endif
  261. }
  262. /////////////////////////////////////////////////////////////////////////////