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

对话框与窗口

开发平台:

Visual C++

  1. // XTPReportRecordItemControls.cpp
  2. //
  3. // This file is a part of the XTREME REPORTCONTROL MFC class library.
  4. // (c)1998-2007 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 "XTPReportRecordItem.h"
  24. #include "XTPReportRecordItemControls.h"
  25. #ifdef _DEBUG
  26. #define new DEBUG_NEW
  27. #undef THIS_FILE
  28. static char THIS_FILE[] = __FILE__;
  29. #endif
  30. //////////////////////////////////////////////////////////////////////////
  31. // CXTPReportRecordItemControl
  32. IMPLEMENT_SERIAL(CXTPReportRecordItemControl, CXTPCmdTarget, VERSIONABLE_SCHEMA | _XTP_SCHEMA_CURRENT)
  33. IMPLEMENT_SERIAL(CXTPReportRecordItemButton, CXTPReportRecordItemControl, VERSIONABLE_SCHEMA | _XTP_SCHEMA_CURRENT)
  34. IMPLEMENT_DYNAMIC(CXTPReportRecordItemControls, CCmdTarget)
  35. //////////////////////////////////////////////////////////////////////////
  36. CXTPReportRecordItemControl::CXTPReportRecordItemControl(LPCTSTR szCaption)
  37. : m_strCaption(szCaption)
  38. {
  39. m_nType = 0;
  40. m_nIndex = 0;
  41. LOGFONT lfIcon;
  42. VERIFY(::SystemParametersInfo(SPI_GETICONTITLELOGFONT, sizeof(lfIcon), &lfIcon, 0));
  43. VERIFY(m_fontCaption.CreateFontIndirect(&lfIcon));
  44. m_clrCaption = GetXtremeColor(COLOR_BTNTEXT);
  45. m_sizeControl = CSize(0, 0);
  46. m_rcControl = CRect(0, 0, 0, 0);
  47. m_unFlags = 0;
  48. m_Alignment = xtpItemControlUnknown;
  49. m_bEnabled = TRUE;
  50. m_nState = 0;
  51. m_bThemed = FALSE;
  52. }
  53. CXTPReportRecordItemControl::~CXTPReportRecordItemControl()
  54. {
  55. m_mapIcon.RemoveAll();
  56. }
  57. void CXTPReportRecordItemControl::DoPropExchange(CXTPPropExchange* pPX)
  58. {
  59. PX_Int(pPX, _T("Type"), m_nType);
  60. PX_String(pPX, _T("Caption"), m_strCaption);
  61. PX_ULong(pPX, _T("CaptionColor"), (ULONG&)m_clrCaption);
  62. PX_Size(pPX, _T("Size"), m_sizeControl, CSize(-1, -1));
  63. PX_ULong(pPX, _T("Flags"), (ULONG&)m_unFlags);
  64. PX_Int(pPX, _T("Alignment"), (int&)m_Alignment);
  65. PX_Bool(pPX, _T("Enable"), m_bEnabled);
  66. PX_Bool(pPX, _T("Themed"), m_bThemed);
  67. CXTPPropExchangeEnumeratorPtr pEnumItems(pPX->GetEnumerator(_T("StateIcons")));
  68. if (pPX->IsStoring())
  69. {
  70. DWORD dwCount = (DWORD)m_mapIcon.GetCount();
  71. POSITION posItem = pEnumItems->GetPosition(dwCount);
  72. POSITION posData = m_mapIcon.GetStartPosition();
  73. while(posData)
  74. {
  75. int nKey = 0, nValue = 0;
  76. m_mapIcon.GetNextAssoc(posData, nKey, nValue);
  77. CXTPPropExchangeSection secItem(pEnumItems->GetNext(posItem));
  78. PX_Int(&secItem, _T("State"), nKey);
  79. PX_Int(&secItem, _T("Icon"), nValue);
  80. }
  81. }
  82. else
  83. {
  84. m_mapIcon.RemoveAll();
  85. POSITION posItem = pEnumItems->GetPosition();
  86. while (posItem)
  87. {
  88. CXTPPropExchangeSection secItem(pEnumItems->GetNext(posItem));
  89. int nKey = 0, nValue = 0;
  90. PX_Int(&secItem, _T("State"), nKey, 0);
  91. PX_Int(&secItem, _T("Icon"), nValue, 0);
  92. m_mapIcon[nKey] = nValue;
  93. }
  94. }
  95. }
  96. void CXTPReportRecordItemControl::SetFont(CFont* pFont)
  97. {
  98. m_fontCaption.DeleteObject();
  99. LOGFONT lf;
  100. pFont->GetLogFont(&lf);
  101. m_fontCaption.CreateFontIndirect(&lf);
  102. }
  103. int CXTPReportRecordItemControl::GetIconIndex(int nState)
  104. {
  105. int nIconIndex = XTP_REPORT_NOICON;
  106. if(m_mapIcon.Lookup(nState, nIconIndex))
  107. return nIconIndex;
  108. m_mapIcon.Lookup(0, nIconIndex);
  109. return nIconIndex;
  110. }
  111. //////////////////////////////////////////////////////////////////////////
  112. // CXTPReportRecordItemButton
  113. CXTPReportRecordItemButton::CXTPReportRecordItemButton(LPCTSTR szCaption)
  114. : CXTPReportRecordItemControl(szCaption)
  115. {
  116. m_nState = m_nSavedState = PBS_NORMAL;
  117. }
  118. void CXTPReportRecordItemButton::DoPropExchange(CXTPPropExchange* pPX)
  119. {
  120. CXTPReportRecordItemControl::DoPropExchange(pPX);
  121. }
  122. void CXTPReportRecordItemButton::OnLButtonDown(XTP_REPORTRECORDITEM_CLICKARGS* pClickArgs)
  123. {
  124. UNREFERENCED_PARAMETER(pClickArgs);
  125. if(GetEnable())
  126. m_nState = PBS_PRESSED;
  127. }
  128. void CXTPReportRecordItemButton::OnLButtonUp(XTP_REPORTRECORDITEM_CLICKARGS* pClickArgs)
  129. {
  130. UNREFERENCED_PARAMETER(pClickArgs);
  131. m_nState = GetEnable() ? PBS_NORMAL : PBS_DISABLED;
  132. if(m_rcControl.PtInRect(pClickArgs->ptClient) && pClickArgs->pControl)
  133. {
  134. XTP_NM_REPORTITEMCONTROL nm;
  135. ::ZeroMemory(&nm, sizeof(nm));
  136. nm.pItem = pClickArgs->pItem;
  137. nm.pRow = pClickArgs->pRow;
  138. nm.pColumn = pClickArgs->pColumn;
  139. nm.pt = pClickArgs->ptClient;
  140. nm.pItemControl = this;
  141. pClickArgs->pControl->SendNotifyMessage(XTP_NM_REPORT_ITEMBUTTONCLICK, (NMHDR*)&nm);
  142. }
  143. }
  144. void CXTPReportRecordItemButton::OnMouseEnter(UINT nFlags, CPoint point)
  145. {
  146. UNREFERENCED_PARAMETER(point);
  147. if(m_nSavedState == PBS_PRESSED && (nFlags & MK_LBUTTON))
  148. m_nState = m_nSavedState;
  149. }
  150. void CXTPReportRecordItemButton::OnMouseLeave(UINT nFlags, CPoint point)
  151. {
  152. UNREFERENCED_PARAMETER(nFlags);
  153. UNREFERENCED_PARAMETER(point);
  154. m_nSavedState = m_nState;
  155. m_nState = GetEnable() ? PBS_NORMAL : PBS_DISABLED;
  156. }
  157. void CXTPReportRecordItemButton::OnMouseMove(UINT nFlags, CPoint point)
  158. {
  159. if(m_rcControl.PtInRect(point) && m_nSavedState == PBS_PRESSED && (nFlags & MK_LBUTTON))
  160. m_nState = m_nSavedState;
  161. }
  162. //////////////////////////////////////////////////////////////////////////
  163. // CXTPReportRecordItemControls
  164. CXTPReportRecordItemControls::CXTPReportRecordItemControls()
  165. {
  166. m_pRecordItem = NULL;
  167. }
  168. CXTPReportRecordItemControls::CXTPReportRecordItemControls(CXTPReportRecordItem* pRecordItem)
  169. : m_pRecordItem(pRecordItem)
  170. {
  171. }
  172. CXTPReportRecordItemControls::~CXTPReportRecordItemControls()
  173. {
  174. RemoveAll();
  175. }
  176. void CXTPReportRecordItemControls::DoPropExchange(CXTPPropExchange* pPX)
  177. {
  178. int nCount = (int)GetSize();
  179. CXTPPropExchangeEnumeratorPtr pEnumItems(pPX->GetEnumerator(_T("RecordItemControl")));
  180. if (pPX->IsStoring())
  181. {
  182. POSITION posItem = pEnumItems->GetPosition((DWORD)nCount);
  183. for (int i = 0; i < nCount; i++)
  184. {
  185. CXTPReportRecordItemControl* pItemControl = GetAt(i);
  186. ASSERT(pItemControl);
  187. if (!pItemControl)
  188. AfxThrowArchiveException(CArchiveException::badClass);
  189. CXTPPropExchangeSection secItem(pEnumItems->GetNext(posItem));
  190. PX_Object(&secItem, pItemControl, RUNTIME_CLASS(CXTPReportRecordItemControl));
  191. }
  192. }
  193. else
  194. {
  195. RemoveAll();
  196. POSITION posItem = pEnumItems->GetPosition();
  197. while (posItem)
  198. {
  199. CXTPReportRecordItemControl* pItemControl = NULL;
  200. CXTPPropExchangeSection secItem(pEnumItems->GetNext(posItem));
  201. PX_Object(&secItem, pItemControl, RUNTIME_CLASS(CXTPReportRecordItemControl));
  202. if (!pItemControl)
  203. AfxThrowArchiveException(CArchiveException::badClass);
  204. AddControl(pItemControl);
  205. }
  206. }
  207. }
  208. void CXTPReportRecordItemControls::RemoveAll()
  209. {
  210. for (int nItem = (int)GetSize() - 1; nItem >= 0; nItem--)
  211. {
  212. CXTPReportRecordItemControl* pItem = GetAt(nItem);
  213. if (pItem)
  214. pItem->InternalRelease();
  215. }
  216. TBase::RemoveAll();
  217. }
  218. void CXTPReportRecordItemControls::RemoveAt(int nIndex)
  219. {
  220. if (nIndex < 0 || nIndex >= (int)GetSize())
  221. {
  222. ASSERT(FALSE);
  223. return;
  224. }
  225. CXTPReportRecordItemControl* pItem = GetAt(nIndex);
  226. if (pItem)
  227. pItem->InternalRelease();
  228. TBase::RemoveAt(nIndex);
  229. RefreshIndexes(nIndex);
  230. }
  231. void CXTPReportRecordItemControls::RefreshIndexes(int nStartFrom)
  232. {
  233. for(int i = nStartFrom; i < GetSize(); i++)
  234. {
  235. CXTPReportRecordItemControl* pItem = GetAt(i);
  236. if (pItem)
  237. pItem->m_nIndex = i;
  238. }
  239. }
  240. CXTPReportRecordItemControl* CXTPReportRecordItemControls::AddControl(int nType, int nIndex)
  241. {
  242. CXTPReportRecordItemControl* pControl = NULL;
  243. switch(nType)
  244. {
  245. case xtpItemControlTypeButton :
  246. pControl = (CXTPReportRecordItemControl*) new CXTPReportRecordItemButton;
  247. break;
  248. default:
  249. ASSERT(FALSE);
  250. }
  251. if(pControl)
  252. pControl->m_nType = nType;
  253. return AddControl(pControl, nIndex);
  254. }
  255. CXTPReportRecordItemControl* CXTPReportRecordItemControls::AddControl(CXTPReportRecordItemControl* pControl, int nIndex)
  256. {
  257. if(!pControl)
  258. return NULL;
  259. if(nIndex < 0 || nIndex >= GetSize())
  260. nIndex = Add(pControl);
  261. else
  262. InsertAt(nIndex, pControl);
  263. pControl->m_nIndex = nIndex;
  264. RefreshIndexes(nIndex + 1);
  265. return pControl;
  266. }
  267. void CXTPReportRecordItemControls::CopyFrom(CXTPReportRecordItemControls* pSrc)
  268. {
  269. if (pSrc == this)
  270. return;
  271. RemoveAll();
  272. if (!pSrc)
  273. return;
  274. int nCount = pSrc->GetSize();
  275. for (int i = 0; i < nCount; i++)
  276. {
  277. CXTPReportRecordItemControl* pItem = pSrc->GetAt(i);
  278. if (pItem)
  279. {
  280. pItem->InternalAddRef();
  281. Add(pItem);
  282. }
  283. }
  284. }
  285. //////////////////////////////////////////////////////////////////////////
  286. BEGIN_MESSAGE_MAP(CXTPReportRecordItemControlHookWnd, CWnd)
  287. //{{AFX_MSG_MAP(CXTPReportRecordItemControlHookWnd)
  288. ON_WM_LBUTTONDOWN()
  289. ON_WM_LBUTTONUP()
  290. ON_WM_MOUSEMOVE()
  291. //}}AFX_MSG_MAP
  292. END_MESSAGE_MAP()
  293. void CXTPReportRecordItemControlHookWnd::OnLButtonDown(UINT nFlags, CPoint point)
  294. {
  295. UNREFERENCED_PARAMETER(nFlags);
  296. m_ClickArgs.ptClient = point;
  297. ClientToScreen(&m_ClickArgs.ptClient);
  298. m_ClickArgs.pItem->OnLButtonDown(&m_ClickArgs);
  299. }
  300. void CXTPReportRecordItemControlHookWnd::OnLButtonUp(UINT nFlags, CPoint point)
  301. {
  302. UNREFERENCED_PARAMETER(nFlags);
  303. m_ClickArgs.ptClient = point;
  304. ClientToScreen(&m_ClickArgs.ptClient);
  305. m_ClickArgs.pItem->OnLButtonUp(&m_ClickArgs);
  306. }
  307. void CXTPReportRecordItemControlHookWnd::OnMouseMove(UINT nFlags, CPoint point)
  308. {
  309. ClientToScreen(&point);
  310. m_ClickArgs.pItem->OnMouseMove(nFlags, point, m_ClickArgs.pControl);
  311. }