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

对话框与窗口

开发平台:

Visual C++

  1. // XTPReportRecord.cpp : implementation of the CXTPReportRecord 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 "XTPReportRecordItem.h"
  22. #include "XTPReportRecordItemText.h"
  23. #include "XTPReportColumn.h"
  24. #include "XTPReportInplaceControls.h"
  25. #include "XTPReportRecord.h"
  26. #include "XTPReportRecords.h"
  27. #include "Common/XTPPropExchange.h"
  28. #ifdef _DEBUG
  29. #define new DEBUG_NEW
  30. #undef THIS_FILE
  31. static char THIS_FILE[] = __FILE__;
  32. #endif
  33. IMPLEMENT_SERIAL(CXTPReportRecord, CCmdTarget, VERSIONABLE_SCHEMA | _XTP_SCHEMA_CURRENT)
  34. CXTPReportRecord::CXTPReportRecord()
  35. : m_bVisible(TRUE), m_bLocked(FALSE), m_pPreviewItem(NULL)
  36. {
  37. m_pChildren = NULL;
  38. m_bExpanded = FALSE;
  39. m_bEditable = TRUE;
  40. m_nIndex = -1;
  41. m_pRecords = NULL;
  42. }
  43. CXTPReportRecord::~CXTPReportRecord()
  44. {
  45. RemoveAll();
  46. if (m_pChildren)
  47. {
  48. m_pChildren->InternalRelease();
  49. }
  50. }
  51. void CXTPReportRecord::RemoveAll()
  52. {
  53. for (int nItem = GetItemCount() - 1; nItem >= 0; nItem--)
  54. {
  55. CXTPReportRecordItem* pItem = m_arrItems.GetAt(nItem);
  56. pItem->InternalRelease();
  57. }
  58. m_arrItems.RemoveAll();
  59. CMDTARGET_RELEASE(m_pPreviewItem);
  60. }
  61. void CXTPReportRecord::Delete()
  62. {
  63. ASSERT(m_pRecords);
  64. if (m_pRecords) m_pRecords->RemoveAt(m_nIndex);
  65. }
  66. BOOL CXTPReportRecord::HasChildren() const
  67. {
  68. return m_pChildren && (m_pChildren->GetCount() > 0);
  69. }
  70. CXTPReportRecords* CXTPReportRecord::GetChilds()
  71. {
  72. if (m_pChildren == 0)
  73. {
  74. m_pChildren = new CXTPReportRecords(this);
  75. }
  76. return m_pChildren;
  77. }
  78. CXTPReportRecordItem* CXTPReportRecord::GetItem(CXTPReportColumn* pColumn) const
  79. {
  80. if (this == NULL)
  81. return NULL;
  82. return GetItem(pColumn->GetItemIndex());
  83. }
  84. int CXTPReportRecord::IndexOf(const CXTPReportRecordItem* pItem) const
  85. {
  86. for (int nItem = 0; nItem < GetItemCount(); nItem++)
  87. {
  88. if (GetItem(nItem) == pItem)
  89. return nItem;
  90. }
  91. return -1;
  92. }
  93. CXTPReportRecordItem* CXTPReportRecord::AddItem(CXTPReportRecordItem* pItem)
  94. {
  95. m_arrItems.Add(pItem);
  96. pItem->m_pRecord = this;
  97. return pItem;
  98. }
  99. CXTPReportRecordItemPreview* CXTPReportRecord::GetItemPreview() const
  100. {
  101. return m_pPreviewItem;
  102. }
  103. void CXTPReportRecord::SetEditable(BOOL bEditable)
  104. {
  105. m_bEditable = bEditable;
  106. }
  107. void CXTPReportRecord::SetPreviewItem(CXTPReportRecordItemPreview* pItemPreview)
  108. {
  109. if (m_pPreviewItem != NULL)
  110. m_pPreviewItem->InternalRelease();
  111. m_pPreviewItem = pItemPreview;
  112. m_pPreviewItem->m_pRecord = this;
  113. }
  114. BOOL CXTPReportRecord::IsFiltered() const
  115. {
  116. return FALSE;
  117. }
  118. int CXTPReportRecord::GetIndex() const
  119. {
  120. return m_nIndex;
  121. }
  122. void CXTPReportRecord::DoPropExchange(CXTPPropExchange* pPX)
  123. {
  124. PX_Bool(pPX, _T("Locked"), m_bLocked);
  125. PX_Bool(pPX, _T("Editable"), m_bEditable);
  126. BOOL bPreview = m_pPreviewItem != NULL;
  127. PX_Bool(pPX, _T("Preview"), bPreview);
  128. int nCount = GetItemCount();
  129. CXTPPropExchangeEnumeratorPtr pEnumItems(pPX->GetEnumerator(_T("Item")));
  130. if (pPX->IsStoring())
  131. {
  132. POSITION posItem = pEnumItems->GetPosition((DWORD)nCount);
  133. for (int i = 0; i < nCount; i++)
  134. {
  135. CXTPReportRecordItem* pItem = GetItem(i);
  136. ASSERT(pItem);
  137. if (!pItem)
  138. AfxThrowArchiveException(CArchiveException::badClass);
  139. CXTPPropExchangeSection secItem(pEnumItems->GetNext(posItem));
  140. PX_Object(&secItem, pItem, RUNTIME_CLASS(CXTPReportRecordItem));
  141. }
  142. }
  143. else
  144. {
  145. RemoveAll();
  146. POSITION posItem = pEnumItems->GetPosition();
  147. while (posItem)
  148. {
  149. CXTPReportRecordItem* pItem = NULL;
  150. CXTPPropExchangeSection sec(pEnumItems->GetNext(posItem));
  151. PX_Object(&sec, pItem, RUNTIME_CLASS(CXTPReportRecordItem));
  152. if (!pItem)
  153. AfxThrowArchiveException(CArchiveException::badClass);
  154. AddItem(pItem);
  155. }
  156. }
  157. //------------------------------------------------------------
  158. if (bPreview)
  159. {
  160. CXTPPropExchangeSection secPreviewItem(pPX->GetSection(_T("PreviewItem")));
  161. if (pPX->IsLoading())
  162. {
  163. CMDTARGET_RELEASE(m_pPreviewItem);
  164. }
  165. PX_Object(&secPreviewItem, m_pPreviewItem, RUNTIME_CLASS(CXTPReportRecordItemPreview));
  166. if (m_pPreviewItem && pPX->IsLoading())
  167. {
  168. m_pPreviewItem->m_pRecord = this;
  169. }
  170. }
  171. //------------------------------------------------------------
  172. if (pPX->GetSchema() > _XTP_SCHEMA_1041)
  173. {
  174. BOOL bHasChildren = HasChildren();
  175. PX_Bool(pPX, _T("HasChildren"), bHasChildren, FALSE);
  176. if (bHasChildren)
  177. {
  178. CXTPPropExchangeSection secChildren(pPX->GetSection(_T("Children")));
  179. GetChilds()->_DoPropExchange(&secChildren);
  180. }
  181. else if (m_pChildren)
  182. {
  183. m_pChildren->RemoveAll();
  184. }
  185. }
  186. }
  187. void CXTPReportRecord::TreeAddRef()
  188. {
  189. InternalAddRef();
  190. if (HasChildren())
  191. {
  192. for (int nChild = 0; nChild < GetChilds()->GetCount(); nChild++)
  193. {
  194. GetChilds()->GetAt(nChild)->TreeAddRef();
  195. }
  196. }
  197. }
  198. void CXTPReportRecord::TreeRelease()
  199. {
  200. if (HasChildren())
  201. {
  202. for (int nChild = 0; nChild < GetChilds()->GetCount(); nChild++)
  203. {
  204. GetChilds()->GetAt(nChild)->TreeRelease();
  205. }
  206. }
  207. InternalRelease();
  208. }