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

对话框与窗口

开发平台:

Visual C++

  1. // XTPReportColumns.cpp : implementation of the CXTPReportColumns 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 "Common/XTPPropExchange.h"
  22. #include "XTPReportControl.h"
  23. #include "XTPReportHeader.h"
  24. #include "XTPReportColumn.h"
  25. #include "XTPReportColumns.h"
  26. #ifdef _DEBUG
  27. #define new DEBUG_NEW
  28. #undef THIS_FILE
  29. static char THIS_FILE[] = __FILE__;
  30. #endif
  31. /////////////////////////////////////////////////////////////////////////////
  32. // CXTPReportColumns
  33. CXTPReportColumns::CXTPReportColumns(CXTPReportControl* pControl)
  34. : m_pControl(pControl)
  35. {
  36. m_pGroupsOrder = new CXTPReportColumnOrder(this);
  37. m_pSortOrder = new CXTPReportColumnOrder(this);
  38. m_pTreeColumn = NULL;
  39. }
  40. CXTPReportColumns::~CXTPReportColumns()
  41. {
  42. Clear();
  43. if (m_pGroupsOrder)
  44. m_pGroupsOrder->InternalRelease();
  45. if (m_pSortOrder)
  46. m_pSortOrder->InternalRelease();
  47. }
  48. void CXTPReportColumns::Clear()
  49. {
  50. // array cleanup
  51. for (int nColumn = GetCount() - 1; nColumn >= 0; nColumn--)
  52. {
  53. CXTPReportColumn* pColumn = m_arrColumns.GetAt(nColumn);
  54. pColumn->InternalRelease();
  55. }
  56. m_arrColumns.RemoveAll();
  57. m_pSortOrder->Clear();
  58. m_pGroupsOrder->Clear();
  59. // clear variables which could be references to those values
  60. if (m_pControl && (m_pControl->GetColumns() == this))
  61. {
  62. m_pControl->SetFocusedColumn(NULL);
  63. }
  64. }
  65. int CXTPReportColumnOrder::GetCount() const
  66. {
  67. return (int)m_arrColumns.GetSize();
  68. }
  69. void CXTPReportColumns::Add(CXTPReportColumn* pColumn)
  70. {
  71. pColumn->m_pColumns = this;
  72. m_arrColumns.Add(pColumn);
  73. GetReportHeader()->OnColumnsChanged();
  74. }
  75. CXTPReportHeader* CXTPReportColumns::GetReportHeader() const
  76. {
  77. return m_pControl->GetReportHeader();
  78. }
  79. void CXTPReportColumns::Remove(CXTPReportColumn* pColumn)
  80. {
  81. m_pGroupsOrder->Remove(pColumn);
  82. m_pSortOrder->Remove(pColumn);
  83. int nIndex = IndexOf(pColumn);
  84. if (nIndex != -1)
  85. {
  86. m_arrColumns.RemoveAt(nIndex);
  87. pColumn->InternalRelease();
  88. GetReportHeader()->OnColumnsChanged();
  89. }
  90. }
  91. int CXTPReportColumns::IndexOf(const CXTPReportColumn* pColumn) const
  92. {
  93. // array cleanup
  94. for (int nColumn = GetCount() - 1; nColumn >= 0; nColumn--)
  95. {
  96. if (m_arrColumns.GetAt(nColumn) == pColumn)
  97. return nColumn;
  98. }
  99. return -1;
  100. }
  101. void CXTPReportColumns::ResetSortOrder()
  102. {
  103. m_pSortOrder->Clear();
  104. }
  105. void CXTPReportColumns::SetSortColumn(CXTPReportColumn* pColumn, BOOL bIncreasing)
  106. {
  107. ResetSortOrder();
  108. m_pSortOrder->Add(pColumn, bIncreasing);
  109. }
  110. int CXTPReportColumns::ChangeColumnOrder(int nNewOrder, int nItemIndex)
  111. {
  112. if (nNewOrder < 0 || nItemIndex < 0)
  113. return -1;
  114. CXTPReportColumn* pColumn = GetAt(nItemIndex);
  115. if (pColumn)
  116. {
  117. if (nNewOrder == nItemIndex)
  118. return nNewOrder;
  119. if (nNewOrder > nItemIndex)
  120. nNewOrder--;
  121. m_arrColumns.RemoveAt(nItemIndex);
  122. m_arrColumns.InsertAt(nNewOrder, pColumn);
  123. }
  124. return nNewOrder;
  125. }
  126. int CXTPReportColumns::GetVisibleColumnsCount() const
  127. {
  128. int nVisibleCount = 0;
  129. int nCount = GetCount();
  130. for (int nColumn = 0; nColumn < nCount; nColumn++)
  131. {
  132. CXTPReportColumn* pColumn = GetAt(nColumn);
  133. if (pColumn && pColumn->IsVisible())
  134. nVisibleCount++;
  135. }
  136. return nVisibleCount;
  137. }
  138. void CXTPReportColumns::GetVisibleColumns(CXTPReportColumns& arrColumns) const
  139. {
  140. int nCount = GetCount();
  141. for (int nColumn = 0; nColumn < nCount; nColumn++)
  142. {
  143. CXTPReportColumn* pColumn = GetAt(nColumn);
  144. if (pColumn && pColumn->IsVisible())
  145. {
  146. arrColumns.m_arrColumns.Add(pColumn);
  147. pColumn->InternalAddRef();
  148. }
  149. }
  150. }
  151. CXTPReportColumn* CXTPReportColumns::Find(int nItemIndex) const
  152. {
  153. for (int nColumn = 0; nColumn < GetCount(); nColumn++)
  154. {
  155. CXTPReportColumn* pColumn = GetAt(nColumn);
  156. if (pColumn->GetItemIndex() == nItemIndex)
  157. return pColumn;
  158. }
  159. return NULL;
  160. }
  161. CXTPReportColumn* CXTPReportColumns::Find(const CString& strInternalName) const
  162. {
  163. for (int nColumn = 0; nColumn < GetCount(); nColumn++)
  164. {
  165. CXTPReportColumn* pColumn = GetAt(nColumn);
  166. if (pColumn->GetInternalName() == strInternalName)
  167. return pColumn;
  168. }
  169. return NULL;
  170. }
  171. void CXTPReportColumns::InsertSortColumn(CXTPReportColumn* pColumn)
  172. {
  173. if (m_pSortOrder->IndexOf(pColumn) == -1)
  174. m_pSortOrder->Add(pColumn);
  175. }
  176. CXTPReportColumn* CXTPReportColumns::GetVisibleAt(int nIndex) const
  177. {
  178. for (int nColumn = 0; nColumn < GetCount(); nColumn++)
  179. {
  180. CXTPReportColumn* pColumn = GetAt(nColumn);
  181. if (!pColumn->IsVisible())
  182. continue;
  183. if (nIndex == 0)
  184. return pColumn;
  185. nIndex--;
  186. }
  187. return NULL;
  188. }
  189. CXTPReportColumn* CXTPReportColumns::GetFirstVisibleColumn() const
  190. {
  191. for (int nColumn = 0; nColumn < GetCount(); nColumn++)
  192. {
  193. CXTPReportColumn* pColumn = GetAt(nColumn);
  194. if (pColumn->IsVisible())
  195. return pColumn;
  196. }
  197. return NULL;
  198. }
  199. CXTPReportColumn* CXTPReportColumns::GetLastVisibleColumn() const
  200. {
  201. for (int nColumn = GetCount() - 1; nColumn >= 0; nColumn--)
  202. {
  203. CXTPReportColumn* pColumn = GetAt(nColumn);
  204. if (pColumn->IsVisible())
  205. return pColumn;
  206. }
  207. return NULL;
  208. }
  209. void CXTPReportColumns::DoPropExchange(CXTPPropExchange* pPX)
  210. {
  211. int nItemIndex;
  212. CString strInternalName;
  213. if (pPX->IsStoring())
  214. {
  215. int nCount = GetCount();
  216. CXTPPropExchangeEnumeratorPtr pEnumerator(pPX->GetEnumerator(_T("Column")));
  217. POSITION pos = pEnumerator->GetPosition(nCount, FALSE);
  218. for (int nColumn = 0; nColumn < nCount; nColumn++)
  219. {
  220. CXTPReportColumn* pColumn = GetAt(nColumn);
  221. CXTPPropExchangeSection secColumn(pEnumerator->GetNext(pos));
  222. nItemIndex = pColumn->GetItemIndex();
  223. strInternalName = pColumn->GetInternalName();
  224. PX_Int(&secColumn, _T("ItemIndex"), nItemIndex);
  225. PX_String(&secColumn, _T("InternalName"), strInternalName);
  226. pColumn->DoPropExchange(&secColumn);
  227. }
  228. }
  229. else
  230. {
  231. CXTPPropExchangeEnumeratorPtr pEnumerator(pPX->GetEnumerator(_T("Column")));
  232. POSITION pos = pEnumerator->GetPosition(0, FALSE);
  233. CXTPReportColumn tmpColumn(0, _T(""), 0);
  234. int i = 0;
  235. while (pos)
  236. {
  237. CXTPPropExchangeSection secColumn(pEnumerator->GetNext(pos));
  238. CXTPReportColumn* pColumn = NULL;
  239. PX_Int(&secColumn, _T("ItemIndex"), nItemIndex, -1);
  240. if (pPX->GetSchema() > _XTP_SCHEMA_110)
  241. {
  242. PX_String(&secColumn, _T("InternalName"), strInternalName);
  243. if (!strInternalName.IsEmpty())
  244. {
  245. pColumn = Find(strInternalName);
  246. // column data is exists but column is not in the collection.
  247. if (!pColumn)
  248. {
  249. // just read data to skeep (to be safe for array serialization)
  250. tmpColumn.DoPropExchange(&secColumn);
  251. continue;
  252. }
  253. }
  254. }
  255. if (!pColumn)
  256. pColumn = Find(nItemIndex);
  257. if (!pColumn)
  258. AfxThrowArchiveException(CArchiveException::badIndex);
  259. pColumn->DoPropExchange(&secColumn);
  260. ChangeColumnOrder(i, IndexOf(pColumn));
  261. i++;
  262. }
  263. }
  264. CXTPPropExchangeSection secGroupsOrder(pPX->GetSection(_T("GroupsOrder")));
  265. m_pGroupsOrder->DoPropExchange(&secGroupsOrder);
  266. CXTPPropExchangeSection secSortOrder(pPX->GetSection(_T("SortOrder")));
  267. m_pSortOrder->DoPropExchange(&secSortOrder);
  268. }
  269. /////////////////////////////////////////////////////////////////////////////
  270. // CXTPReportColumnOrder
  271. CXTPReportColumnOrder::CXTPReportColumnOrder(CXTPReportColumns* pColumns) :
  272. m_pColumns(pColumns)
  273. {
  274. }
  275. CXTPReportColumn* CXTPReportColumnOrder::GetAt(int nIndex)
  276. {
  277. if (nIndex >= 0 && nIndex < GetCount())
  278. return m_arrColumns.GetAt(nIndex);
  279. else
  280. return NULL;
  281. }
  282. int CXTPReportColumnOrder::InsertAt(int nIndex, CXTPReportColumn* pColumn)
  283. {
  284. if (nIndex < 0)
  285. return -1;
  286. if (nIndex >= GetCount())
  287. nIndex = GetCount();
  288. int nPrevIndex = IndexOf(pColumn);
  289. if (nPrevIndex != -1)
  290. {
  291. if (nPrevIndex == nIndex)
  292. return nIndex;
  293. if (nIndex > nPrevIndex)
  294. nIndex--;
  295. if (nIndex == nPrevIndex)
  296. return nIndex;
  297. // change order
  298. m_arrColumns.RemoveAt(nPrevIndex);
  299. }
  300. m_arrColumns.InsertAt(nIndex, pColumn);
  301. return nIndex;
  302. }
  303. int CXTPReportColumnOrder::Add(CXTPReportColumn* pColumn, BOOL bSortIncreasing)
  304. {
  305. pColumn->m_bSortIncreasing = bSortIncreasing;
  306. return (int)m_arrColumns.Add(pColumn);
  307. }
  308. int CXTPReportColumnOrder::Add(CXTPReportColumn* pColumn)
  309. {
  310. return (int)m_arrColumns.Add(pColumn);
  311. }
  312. void CXTPReportColumnOrder::Clear()
  313. {
  314. m_arrColumns.RemoveAll();
  315. }
  316. int CXTPReportColumnOrder::IndexOf(const CXTPReportColumn* pColumn)
  317. {
  318. int nCount = GetCount();
  319. for (int i = 0; i < nCount; i++)
  320. {
  321. if (GetAt(i) == pColumn)
  322. return i;
  323. }
  324. return -1;
  325. }
  326. void CXTPReportColumnOrder::RemoveAt(int nIndex)
  327. {
  328. if (nIndex >= 0 && nIndex < GetCount())
  329. {
  330. m_arrColumns.RemoveAt(nIndex);
  331. }
  332. }
  333. void CXTPReportColumnOrder::Remove(CXTPReportColumn* pColumn)
  334. {
  335. int nCount = GetCount();
  336. for (int i = 0; i < nCount; i++)
  337. {
  338. if (GetAt(i) == pColumn)
  339. {
  340. m_arrColumns.RemoveAt(i);
  341. break;
  342. }
  343. }
  344. }
  345. void CXTPReportColumnOrder::DoPropExchange(CXTPPropExchange* pPX)
  346. {
  347. if (pPX->IsStoring())
  348. {
  349. int nCount = GetCount();
  350. PX_Int(pPX, _T("Count"), nCount, 0);
  351. for (int i = 0; i < nCount; i++)
  352. {
  353. CXTPReportColumn* pColumn = GetAt(i);
  354. if (pColumn)
  355. {
  356. int nItemIndex = pColumn->GetItemIndex();
  357. CString strInternalName = pColumn->GetInternalName();
  358. CString strParamName;
  359. strParamName.Format(_T("Column%i"), i);
  360. PX_Int(pPX, strParamName, nItemIndex, 0);
  361. strParamName.Format(_T("InternalName%i"), i);
  362. PX_String(pPX, strParamName, strInternalName);
  363. }
  364. }
  365. }
  366. else
  367. {
  368. Clear();
  369. int nCount = 0;
  370. PX_Int(pPX, _T("Count"), nCount, 0);
  371. for (int i = 0; i < nCount; i++)
  372. {
  373. int nItemIndex = 0;
  374. CString strParamName;
  375. strParamName.Format(_T("Column%i"), i);
  376. PX_Int(pPX, strParamName, nItemIndex, 0);
  377. CXTPReportColumn* pColumn = NULL;
  378. if (pPX->GetSchema() > _XTP_SCHEMA_110)
  379. {
  380. strParamName.Format(_T("InternalName%i"), i);
  381. CString strInternalName;
  382. PX_String(pPX, strParamName, strInternalName);
  383. if (!strInternalName.IsEmpty())
  384. pColumn = m_pColumns->Find(strInternalName);
  385. }
  386. if (!pColumn)
  387. pColumn = m_pColumns->Find(nItemIndex);
  388. if (pColumn)
  389. Add(pColumn);
  390. }
  391. }
  392. }