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

对话框与窗口

开发平台:

Visual C++

  1. // XTPReportRecords.cpp : implementation of the CXTPReportRecords class.
  2. //
  3. // This file is a part of the XTREME REPORTCONTROL 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 TOOLKIT PRO 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 "Resource.h"
  22. #include "Common/XTPPropExchange.h"
  23. #include "Common/XTPMarkupRender.h"
  24. #include "XTPReportRecordItem.h"
  25. #include "XTPReportRecord.h"
  26. #include "XTPReportRecords.h"
  27. #include "XTPReportInplaceControls.h"
  28. #ifdef _DEBUG
  29. #define new DEBUG_NEW
  30. #undef THIS_FILE
  31. static char THIS_FILE[] = __FILE__;
  32. #endif
  33. IMPLEMENT_DYNAMIC(CXTPReportRecords, CCmdTarget)
  34. CXTPReportRecords::CXTPReportRecords(BOOL bArray /*= FALSE*/)
  35. {
  36. m_pOwnerRecord = NULL;
  37. m_pVirtualRecord = NULL;
  38. m_nVirtualRecordsCount = 0;
  39. m_bArray = bArray;
  40. m_bCaseSensitive = TRUE;
  41. m_pMarkupContext = NULL;
  42. }
  43. CXTPReportRecords::CXTPReportRecords(CXTPReportRecord* pOwnerRecord)
  44. {
  45. m_pOwnerRecord = pOwnerRecord;
  46. m_pVirtualRecord = NULL;
  47. m_nVirtualRecordsCount = 0;
  48. m_bArray = FALSE;
  49. m_bCaseSensitive = TRUE;
  50. m_pMarkupContext = NULL;
  51. }
  52. void CXTPReportRecords::SetVirtualMode(CXTPReportRecord* pVirtualRecord, int nCount)
  53. {
  54. // release old virtual record
  55. if (m_pVirtualRecord)
  56. {
  57. m_pVirtualRecord->InternalRelease();
  58. }
  59. // reset virtual mode
  60. if (!pVirtualRecord || nCount <= 0)
  61. {
  62. if (pVirtualRecord)
  63. {
  64. pVirtualRecord->InternalRelease();
  65. }
  66. m_pVirtualRecord = NULL;
  67. m_nVirtualRecordsCount = 0;
  68. }
  69. else // set new virtual record
  70. {
  71. m_pVirtualRecord = pVirtualRecord;
  72. m_nVirtualRecordsCount = nCount;
  73. if (m_pVirtualRecord)
  74. {
  75. m_pVirtualRecord->m_pRecords = this;
  76. }
  77. }
  78. }
  79. CXTPReportRecords::~CXTPReportRecords()
  80. {
  81. RemoveAll();
  82. if (m_pVirtualRecord)
  83. {
  84. m_pVirtualRecord->InternalRelease();
  85. }
  86. XTPMarkupReleaseContext(m_pMarkupContext);
  87. }
  88. void CXTPReportRecords::RemoveAll()
  89. {
  90. if (!m_bArray)
  91. {
  92. // array cleanup
  93. for (int nRecord = (int)m_arrRecords.GetSize() - 1; nRecord >= 0; nRecord--)
  94. {
  95. CXTPReportRecord* pRecord = m_arrRecords.GetAt(nRecord);
  96. pRecord->InternalRelease();
  97. }
  98. }
  99. m_arrRecords.RemoveAll();
  100. }
  101. void CXTPReportRecords::UpdateIndexes(int nStart /*= 0*/)
  102. {
  103. for (int i = nStart; i < GetCount(); i++)
  104. GetAt(i)->m_nIndex = i;
  105. }
  106. CXTPReportRecord* CXTPReportRecords::Add(CXTPReportRecord* pRecord)
  107. {
  108. int nIndex = (int)m_arrRecords.Add(pRecord);
  109. if (m_bArray)
  110. {
  111. ASSERT(pRecord->m_pRecords);
  112. }
  113. else
  114. {
  115. pRecord->m_nIndex = nIndex;
  116. pRecord->m_pRecords = this;
  117. }
  118. return pRecord;
  119. }
  120. void CXTPReportRecords::RemoveAt(int nIndex)
  121. {
  122. ASSERT(!m_bArray);
  123. if (nIndex < (int)m_arrRecords.GetSize())
  124. {
  125. m_arrRecords[nIndex]->InternalRelease();
  126. m_arrRecords.RemoveAt(nIndex);
  127. UpdateIndexes(nIndex);
  128. }
  129. }
  130. int CXTPReportRecords::RemoveRecord(CXTPReportRecord* pRecord)
  131. {
  132. ASSERT(!m_bArray);
  133. for (int i = 0; i < (int)m_arrRecords.GetSize(); i++)
  134. {
  135. CXTPReportRecord* pRec = m_arrRecords.GetAt(i);
  136. if (pRec == pRecord)
  137. {
  138. pRecord->InternalRelease();
  139. m_arrRecords.RemoveAt(i);
  140. UpdateIndexes(i);
  141. return i;
  142. }
  143. }
  144. return - 1;
  145. }
  146. void CXTPReportRecords::InsertAt(int nIndex, CXTPReportRecord* pRecord)
  147. {
  148. ASSERT(!m_bArray);
  149. m_arrRecords.InsertAt(nIndex, pRecord);
  150. pRecord->m_pRecords = this;
  151. UpdateIndexes(nIndex);
  152. }
  153. int CXTPReportRecords::GetCount() const
  154. {
  155. if (m_pVirtualRecord != NULL)
  156. return m_nVirtualRecordsCount;
  157. return (int)m_arrRecords.GetSize();
  158. }
  159. CXTPReportRecord* CXTPReportRecords::GetAt(int nIndex) const
  160. {
  161. if (m_pVirtualRecord)
  162. {
  163. m_pVirtualRecord->m_nIndex = nIndex;
  164. return m_pVirtualRecord;
  165. }
  166. return nIndex >= 0 && nIndex < GetCount() ? m_arrRecords.GetAt(nIndex) : NULL;
  167. }
  168. void CXTPReportRecords::DoPropExchange(CXTPPropExchange* pPX)
  169. {
  170. pPX->ExchangeSchemaSafe();
  171. _DoPropExchange(pPX);
  172. }
  173. void CXTPReportRecords::_DoPropExchange(CXTPPropExchange* pPX)
  174. {
  175. CXTPPropExchangeEnumeratorPtr pEnumRecords(pPX->GetEnumerator(_T("Record")));
  176. if (pPX->IsStoring())
  177. {
  178. int nCount = (int)GetCount();
  179. POSITION pos = pEnumRecords->GetPosition((DWORD)nCount);
  180. for (int i = 0; i < nCount; i++)
  181. {
  182. CXTPReportRecord* pRecord = GetAt(i);
  183. ASSERT(pRecord);
  184. CXTPPropExchangeSection sec(pEnumRecords->GetNext(pos));
  185. PX_Object(&sec, pRecord, RUNTIME_CLASS(CXTPReportRecord));
  186. }
  187. }
  188. else
  189. {
  190. RemoveAll();
  191. POSITION pos = pEnumRecords->GetPosition();
  192. while (pos)
  193. {
  194. CXTPReportRecord* pRecord = NULL;
  195. CXTPPropExchangeSection sec(pEnumRecords->GetNext(pos));
  196. PX_Object(&sec, pRecord, RUNTIME_CLASS(CXTPReportRecord));
  197. if (!pRecord)
  198. AfxThrowArchiveException(CArchiveException::badClass);
  199. Add(pRecord);
  200. }
  201. }
  202. }
  203. void CXTPReportRecords::Move(int nIndex, CXTPReportRecords* pRecords)
  204. {
  205. ASSERT(pRecords->m_bArray == TRUE);
  206. if (nIndex > GetCount())
  207. nIndex = GetCount();
  208. int nRecordsCount = (int)pRecords->GetCount(), i;
  209. for (i = 0; i < nRecordsCount; i++)
  210. {
  211. CXTPReportRecord* pRecord = pRecords->GetAt(i);
  212. int nRecordIndex = pRecord->GetIndex();
  213. if (pRecord->m_pRecords != this)
  214. continue;
  215. ASSERT(pRecord && GetAt(nRecordIndex) == pRecord);
  216. m_arrRecords.RemoveAt(nRecordIndex);
  217. if (nRecordIndex < nIndex)
  218. {
  219. nIndex--;
  220. }
  221. for (int j = i + 1; j < nRecordsCount; j++)
  222. {
  223. pRecord = pRecords->GetAt(j);
  224. if (pRecord->m_pRecords != this)
  225. continue;
  226. if (pRecord->GetIndex() > nRecordIndex)
  227. {
  228. pRecord->m_nIndex--;
  229. }
  230. }
  231. }
  232. for (i = 0; i < nRecordsCount; i++)
  233. {
  234. CXTPReportRecord* pRecord = pRecords->GetAt(i);
  235. if (pRecord->m_pRecords != this)
  236. continue;
  237. m_arrRecords.InsertAt(nIndex, pRecord);
  238. nIndex++;
  239. }
  240. UpdateIndexes();
  241. }
  242. int CXTPReportRecords::Compare(const CString& str1, const CString& str2) const
  243. {
  244. if (!IsCaseSensitive())
  245. return str1.CompareNoCase(str2);
  246. return str1.Compare(str2);
  247. }
  248. void CXTPReportRecords::SetSize(INT_PTR nNewSize, INT_PTR nGrowBy)
  249. {
  250. int nSize = GetCount();
  251. if (!m_bArray && nNewSize < nSize)
  252. {
  253. for (int i = (int)nNewSize; i < nSize; i++)
  254. {
  255. CXTPReportRecord* pRecord = GetAt(i);
  256. if (pRecord)
  257. pRecord->InternalRelease();
  258. }
  259. }
  260. m_arrRecords.SetSize(nNewSize, nGrowBy);
  261. }
  262. void CXTPReportRecords::SetAt(INT_PTR nIndex, CXTPReportRecord* pRecord)
  263. {
  264. ASSERT(pRecord);
  265. ASSERT(nIndex >= 0 && nIndex < GetCount());
  266. if (!pRecord || nIndex < 0 || nIndex >= GetCount())
  267. return;
  268. if (!m_bArray)
  269. {
  270. CXTPReportRecord* pRecord_prev = GetAt((int)nIndex);
  271. if (pRecord_prev)
  272. pRecord_prev->InternalRelease();
  273. pRecord->m_nIndex = (int)nIndex;
  274. pRecord->m_pRecords = this;
  275. }
  276. m_arrRecords.SetAt(nIndex, pRecord);
  277. }
  278. void CXTPReportRecords::EnableMarkup(BOOL bEnable)
  279. {
  280. BOOL bOldEnable = GetMarkupContext() != NULL;
  281. if (bOldEnable == bEnable)
  282. return;
  283. XTPMarkupReleaseContext(m_pMarkupContext);
  284. if (bEnable)
  285. {
  286. m_pMarkupContext = XTPMarkupCreateContext(0);
  287. }
  288. }