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

对话框与窗口

开发平台:

Visual C++

  1. // XTPTaskPanelItems.cpp : implementation of the CXTPTaskPanelItems class.
  2. //
  3. // This file is a part of the XTREME TASKPANEL 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 "XTPTaskPanelItems.h"
  23. #include "XTPTaskPanelItem.h"
  24. #include "XTPTaskPanelGroup.h"
  25. #include "XTPTaskPanelGroupItem.h"
  26. #include "XTPTaskPanel.h"
  27. #ifdef _DEBUG
  28. #define new DEBUG_NEW
  29. #undef THIS_FILE
  30. static char THIS_FILE[] = __FILE__;
  31. #endif
  32. /////////////////////////////////////////////////////////////////////////////
  33. // CXTPTaskPanelItems
  34. IMPLEMENT_DYNCREATE(CXTPTaskPanelItems, CCmdTarget)
  35. CXTPTaskPanelItems::CXTPTaskPanelItems(CXTPTaskPanel* pPanel)
  36. {
  37. m_pPanel = pPanel;
  38. m_pOwner = NULL;
  39. EnableAutomation();
  40. }
  41. CXTPTaskPanelItems::~CXTPTaskPanelItems()
  42. {
  43. Clear(FALSE);
  44. }
  45. CXTPTaskPanelItem* CXTPTaskPanelItems::Add(CXTPTaskPanelItem* pItem, UINT nID)
  46. {
  47. pItem->SetID(nID);
  48. m_arrItems.Add(pItem);
  49. pItem->m_pItems = this;
  50. pItem->m_pPanel = m_pPanel;
  51. m_pPanel->Reposition();
  52. return pItem;
  53. }
  54. CXTPTaskPanelItem* CXTPTaskPanelItems::InsertAt(int nIndex, CXTPTaskPanelItem* pItem)
  55. {
  56. if (nIndex < 0 || nIndex > GetCount())
  57. nIndex = GetCount();
  58. m_arrItems.InsertAt(nIndex, pItem);
  59. pItem->m_pItems = this;
  60. pItem->m_pPanel = m_pPanel;
  61. m_pPanel->Reposition();
  62. return pItem;
  63. }
  64. CXTPTaskPanelItem* CXTPTaskPanelItems::Find(UINT nID) const
  65. {
  66. for (int i = 0; i < m_arrItems.GetSize(); i++)
  67. {
  68. if (m_arrItems[i]->GetID() == nID)
  69. return m_arrItems[i];
  70. }
  71. return NULL;
  72. }
  73. int CXTPTaskPanelItems::GetIndex(const CXTPTaskPanelItem* pItem) const
  74. {
  75. for (int i = 0; i < m_arrItems.GetSize(); i++)
  76. {
  77. if (m_arrItems[i] == pItem)
  78. return i;
  79. }
  80. return -1;
  81. }
  82. void CXTPTaskPanelItems::Move(CXTPTaskPanelItem* pItem, int nIndex)
  83. {
  84. ASSERT(pItem->m_pItems == this);
  85. int nItemIndex = GetIndex(pItem);
  86. if ((nItemIndex == -1) || nItemIndex == nIndex)
  87. return;
  88. m_arrItems.RemoveAt(nItemIndex);
  89. m_arrItems.InsertAt(nIndex, pItem);
  90. m_pPanel->Reposition(FALSE);
  91. }
  92. void CXTPTaskPanelItems::Clear(BOOL bReposition)
  93. {
  94. for (int i = 0; i < m_arrItems.GetSize(); i++)
  95. {
  96. CXTPTaskPanelItem* pItem = m_arrItems[i];
  97. SAFE_CALLPTR(m_pPanel, OnItemRemoved(pItem));
  98. pItem->OnRemoved();
  99. pItem->InternalRelease();
  100. }
  101. m_arrItems.RemoveAll();
  102. if (bReposition && m_pPanel)
  103. {
  104. m_pPanel->Reposition();
  105. }
  106. }
  107. void CXTPTaskPanelItems::Remove(CXTPTaskPanelItem* pItem)
  108. {
  109. int nIndex = GetIndex(pItem);
  110. if (nIndex != -1)
  111. {
  112. RemoveAt(nIndex);
  113. }
  114. }
  115. void CXTPTaskPanelItems::RemoveAt(int nIndex)
  116. {
  117. if (nIndex < 0 || nIndex >= m_arrItems.GetSize())
  118. return;
  119. CXTPTaskPanelItem* pItem = m_arrItems[nIndex];
  120. m_pPanel->OnItemRemoved(pItem);
  121. pItem->OnRemoved();
  122. pItem->InternalRelease();
  123. m_arrItems.RemoveAt(nIndex);
  124. m_pPanel->Reposition();
  125. }
  126. CXTPTaskPanelItem* CXTPTaskPanelItems::GetFirstVisibleItem() const
  127. {
  128. return GetAt(GetNextVisibleIndex(-1, +1));
  129. }
  130. CXTPTaskPanelItem* CXTPTaskPanelItems::GetLastVisibleItem() const
  131. {
  132. return GetAt(GetNextVisibleIndex(GetCount(), -1));
  133. }
  134. int CXTPTaskPanelItems::GetNextVisibleIndex(int nIndex, int nDirection) const
  135. {
  136. CXTPTaskPanelItem* pItem = NULL;
  137. do
  138. {
  139. nIndex += nDirection;
  140. pItem = GetAt(nIndex);
  141. if (!pItem)
  142. return -1;
  143. if (pItem->IsVisible())
  144. return nIndex;
  145. }
  146. while (pItem);
  147. return -1;
  148. }
  149. void CXTPTaskPanelItems::DoPropExchange(CXTPPropExchange* pPX)
  150. {
  151. m_pPanel->SetLockRedraw(TRUE);
  152. try
  153. {
  154. pPX->m_dwData = (DWORD_PTR)m_pPanel;
  155. CXTPPropExchangeEnumeratorPtr pEnumerator(pPX->GetEnumerator(_T("Item")));
  156. POSITION pos = pEnumerator->GetPosition(GetCount());
  157. if (pPX->IsStoring())
  158. {
  159. for (int i = 0; i < GetCount(); i++)
  160. {
  161. CXTPTaskPanelItem* pItem = GetAt(i);
  162. CXTPPropExchangeSection sec(pEnumerator->GetNext(pos));
  163. PX_Object(&sec, pItem, GetDefaultItemClass());
  164. }
  165. }
  166. else
  167. {
  168. Clear(FALSE);
  169. while (pos)
  170. {
  171. CXTPTaskPanelItem* pItem = NULL;
  172. CXTPPropExchangeSection sec(pEnumerator->GetNext(pos));
  173. PX_Object(&sec, pItem, GetDefaultItemClass());
  174. if (!pItem)
  175. AfxThrowArchiveException(CArchiveException::badClass);
  176. pItem->m_pItems = this;
  177. m_arrItems.Add(pItem);
  178. }
  179. }
  180. }
  181. catch (COleException* pEx)
  182. {
  183. TRACE(_T("CXTPTaskPanelItems::Serialize. OLE exception: %xrn"),
  184. pEx->m_sc);
  185. pEx->Delete ();
  186. }
  187. catch (CArchiveException* pEx)
  188. {
  189. TRACE(_T("CXTPTaskPanelItems::Serialize. Archive exceptionrn"));
  190. pEx->Delete ();
  191. }
  192. m_pPanel->SetLockRedraw(FALSE);
  193. }
  194. CRuntimeClass* CXTPTaskPanelItems::GetDefaultItemClass() const
  195. {
  196. return RUNTIME_CLASS(CXTPTaskPanelItem);
  197. }
  198. //////////////////////////////////////////////////////////////////////////
  199. // CXTPTaskPanelGroups
  200. CXTPTaskPanelGroups::CXTPTaskPanelGroups(CXTPTaskPanel* pPanel)
  201. : CXTPTaskPanelItems(pPanel)
  202. {
  203. EnableAutomation();
  204. }
  205. CRuntimeClass* CXTPTaskPanelGroups::GetDefaultItemClass() const
  206. {
  207. return RUNTIME_CLASS(CXTPTaskPanelGroup);
  208. }
  209. //////////////////////////////////////////////////////////////////////////
  210. // CXTPTaskPanelGroupItems
  211. CXTPTaskPanelGroupItems::CXTPTaskPanelGroupItems(CXTPTaskPanel* pPanel)
  212. : CXTPTaskPanelItems(pPanel)
  213. {
  214. EnableAutomation();
  215. }
  216. CRuntimeClass* CXTPTaskPanelGroupItems::GetDefaultItemClass() const
  217. {
  218. return RUNTIME_CLASS(CXTPTaskPanelGroupItem);
  219. }