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

对话框与窗口

开发平台:

Visual C++

  1. // XTPReportRecordItemText.cpp : implementation of the CXTPReportRecordItemText 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 <math.h>
  22. #include "Common/XTPDrawHelpers.h"
  23. #include "Common/XTPPropExchange.h"
  24. #include "Common/XTPVc50Helpers.h"
  25. #include "Common/XTPMarkupRender.h"
  26. #include "XTPReportRecordItem.h"
  27. #include "XTPReportControl.h"
  28. #include "XTPReportPaintManager.h"
  29. #include "XTPReportRecordItemText.h"
  30. #include "XTPReportInplaceControls.h"
  31. #include "XTPReportRow.h"
  32. #include "XTPReportRecord.h"
  33. #include "XTPReportRecords.h"
  34. #include "XTPReportColumn.h"
  35. #ifdef _DEBUG
  36. #define new DEBUG_NEW
  37. #undef THIS_FILE
  38. static char THIS_FILE[] = __FILE__;
  39. #endif
  40. //////////////////////////////////////////////////////////////////////////
  41. // CXTPReportRecordItemText
  42. IMPLEMENT_SERIAL(CXTPReportRecordItemText, CXTPReportRecordItem, VERSIONABLE_SCHEMA | _XTP_SCHEMA_CURRENT)
  43. CXTPReportRecordItemText::CXTPReportRecordItemText(LPCTSTR szText)
  44. : CXTPReportRecordItem(), m_strText(szText)
  45. {
  46. }
  47. CString CXTPReportRecordItemText::GetCaption(CXTPReportColumn* /*pColumn*/)
  48. {
  49. if (!m_strCaption.IsEmpty())
  50. return m_strCaption;
  51. if (m_strFormatString == _T("%s"))
  52. return m_strText;
  53. CString strCaption;
  54. strCaption.Format(m_strFormatString, (LPCTSTR)m_strText);
  55. return strCaption;
  56. }
  57. void CXTPReportRecordItemText::OnEditChanged(XTP_REPORTRECORDITEM_ARGS* /*pItemArgs*/, LPCTSTR szText)
  58. {
  59. SetValue(szText);
  60. }
  61. void CXTPReportRecordItemText::DoPropExchange(CXTPPropExchange* pPX)
  62. {
  63. CXTPReportRecordItem::DoPropExchange(pPX);
  64. PX_String(pPX, _T("Text"), m_strText, _T(""));
  65. }
  66. //////////////////////////////////////////////////////////////////////////
  67. // CXTPReportRecordItemNumber
  68. IMPLEMENT_SERIAL(CXTPReportRecordItemNumber, CXTPReportRecordItem, VERSIONABLE_SCHEMA | _XTP_SCHEMA_CURRENT)
  69. CXTPReportRecordItemNumber::CXTPReportRecordItemNumber(double dValue)
  70. : CXTPReportRecordItem(), m_dValue(dValue)
  71. {
  72. static const CString cstrNumberFormatDefault(_T("%0.f")); // to avoid new string data allocation for each record
  73. m_strFormatString = cstrNumberFormatDefault;
  74. }
  75. CXTPReportRecordItemNumber::CXTPReportRecordItemNumber(double dValue, LPCTSTR strFormat)
  76. : CXTPReportRecordItem(), m_dValue(dValue)
  77. {
  78. m_strFormatString = strFormat;
  79. }
  80. CString CXTPReportRecordItemNumber::GetCaption(CXTPReportColumn* /*pColumn*/)
  81. {
  82. if (!m_strCaption.IsEmpty())
  83. return m_strCaption;
  84. CString strCaption;
  85. strCaption.Format(m_strFormatString, m_dValue);
  86. return strCaption;
  87. }
  88. int CXTPReportRecordItemNumber::Compare(CXTPReportColumn*, CXTPReportRecordItem* pItem)
  89. {
  90. CXTPReportRecordItemNumber* pItemNumber = DYNAMIC_DOWNCAST(CXTPReportRecordItemNumber, pItem);
  91. if (!pItemNumber)
  92. return 0;
  93. if (m_dValue == pItemNumber->m_dValue)
  94. return 0;
  95. else if (m_dValue > pItemNumber->m_dValue)
  96. return 1;
  97. else
  98. return -1;
  99. }
  100. void CXTPReportRecordItemNumber::OnEditChanged(XTP_REPORTRECORDITEM_ARGS* /*pItemArgs*/, LPCTSTR szText)
  101. {
  102. #ifdef _UNICODE
  103. char astring[20];
  104. WideCharToMultiByte (CP_ACP, 0, szText, -1, astring, 20, NULL, NULL);
  105. SetValue((double)atof(astring));
  106. #else
  107. SetValue((double)atof(szText));
  108. #endif
  109. }
  110. void CXTPReportRecordItemNumber::DoPropExchange(CXTPPropExchange* pPX)
  111. {
  112. CXTPReportRecordItem::DoPropExchange(pPX);
  113. PX_Double(pPX, _T("Value"), m_dValue);
  114. }
  115. //////////////////////////////////////////////////////////////////////////
  116. // CXTPReportRecordItemDateTime
  117. IMPLEMENT_SERIAL(CXTPReportRecordItemDateTime, CXTPReportRecordItem, VERSIONABLE_SCHEMA | _XTP_SCHEMA_CURRENT)
  118. CXTPReportRecordItemDateTime::CXTPReportRecordItemDateTime(COleDateTime odtValue)
  119. : CXTPReportRecordItem(), m_odtValue(odtValue)
  120. {
  121. static const CString cstrDateFormatDefault(_T("%a %b/%d/%Y %I:%M %p")); // to avoid new string data allocation for each record
  122. m_strFormatString = cstrDateFormatDefault;
  123. }
  124. CString CXTPReportRecordItemDateTime::GetCaption(CXTPReportColumn* /*pColumn*/)
  125. {
  126. if (!m_strCaption.IsEmpty())
  127. return m_strCaption;
  128. //return m_odtValue.Format(m_strFormatString);
  129. return CXTPReportControlLocale::FormatDateTime(m_odtValue, m_strFormatString);
  130. }
  131. int CXTPReportRecordItemDateTime::Compare(CXTPReportColumn*, CXTPReportRecordItem* pItem)
  132. {
  133. CXTPReportRecordItemDateTime* pItemDateTime = DYNAMIC_DOWNCAST(CXTPReportRecordItemDateTime, pItem);
  134. if (!pItemDateTime)
  135. return 0;
  136. if (m_odtValue == pItemDateTime->m_odtValue)
  137. return 0;
  138. if (m_odtValue.GetStatus() != COleDateTime::valid || pItemDateTime->m_odtValue.GetStatus() != COleDateTime::valid)
  139. return int(m_odtValue.m_dt - pItemDateTime->m_odtValue.m_dt);
  140. if (m_odtValue > pItemDateTime->m_odtValue)
  141. return 1;
  142. return -1;
  143. }
  144. void CXTPReportRecordItemDateTime::OnEditChanged(XTP_REPORTRECORDITEM_ARGS* /*pItemArgs*/, LPCTSTR szText)
  145. {
  146. m_odtValue.ParseDateTime(szText);
  147. }
  148. void CXTPReportRecordItemDateTime::DoPropExchange(CXTPPropExchange* pPX)
  149. {
  150. CXTPReportRecordItem::DoPropExchange(pPX);
  151. PX_DateTime(pPX, _T("Value"), m_odtValue);
  152. }
  153. //////////////////////////////////////////////////////////////////////////
  154. // CXTPReportRecordItemPreview
  155. IMPLEMENT_SERIAL(CXTPReportRecordItemPreview, CXTPReportRecordItem, VERSIONABLE_SCHEMA | _XTP_SCHEMA_CURRENT)
  156. CXTPReportRecordItemPreview::CXTPReportRecordItemPreview(LPCTSTR szPreviewText)
  157. : CXTPReportRecordItem()
  158. {
  159. SetPreviewText(szPreviewText);
  160. }
  161. void CXTPReportRecordItemPreview::SetPreviewText(LPCTSTR strPreviewText)
  162. {
  163. m_strPreviewText = strPreviewText;
  164. XTPMarkupReleaseElement(m_pMarkupUIElement);
  165. if (m_pRecord && m_pRecord->GetRecords() && m_pRecord->GetRecords()->GetMarkupContext())
  166. {
  167. m_pMarkupUIElement = XTPMarkupParseText(m_pRecord->GetRecords()->GetMarkupContext(), m_strPreviewText);
  168. }
  169. }
  170. void CXTPReportRecordItemPreview::SetCaption(LPCTSTR strCaption)
  171. {
  172. SetPreviewText(strCaption);
  173. }
  174. CString CXTPReportRecordItemPreview::GetCaption(CXTPReportColumn* /*pColumn*/)
  175. {
  176. return GetPreviewText();
  177. }
  178. void CXTPReportRecordItemPreview::GetItemMetrics(XTP_REPORTRECORDITEM_DRAWARGS* pDrawArgs, XTP_REPORTRECORDITEM_METRICS* pItemMetrics)
  179. {
  180. pItemMetrics->clrForeground = pDrawArgs->pControl->GetPaintManager()->m_clrPreviewText;
  181. pItemMetrics->pFont = &pDrawArgs->pControl->GetPaintManager()->m_fontPreview;
  182. }
  183. void CXTPReportRecordItemPreview::OnEditChanged(XTP_REPORTRECORDITEM_ARGS* /*pItemArgs*/, LPCTSTR szText)
  184. {
  185. m_strPreviewText = szText;
  186. }
  187. void CXTPReportRecordItemPreview::DoPropExchange(CXTPPropExchange* pPX)
  188. {
  189. CXTPReportRecordItem::DoPropExchange(pPX);
  190. PX_String(pPX, _T("PreviewText"), m_strPreviewText);
  191. if (pPX->IsLoading())
  192. {
  193. XTPMarkupReleaseElement(m_pMarkupUIElement);
  194. if (m_pRecord && m_pRecord->GetRecords() && m_pRecord->GetRecords()->GetMarkupContext())
  195. {
  196. m_pMarkupUIElement = XTPMarkupParseText(m_pRecord->GetRecords()->GetMarkupContext(), m_strPreviewText);
  197. }
  198. }
  199. }
  200. int CXTPReportRecordItemPreview::GetPreviewHeight(CDC* pDC, CXTPReportRow* pRow, int nWidth)
  201. {
  202. int nHeight = 0;
  203. XTP_REPORTRECORDITEM_METRICS* pMetrics = new XTP_REPORTRECORDITEM_METRICS;
  204. pMetrics->strText = GetPreviewText();
  205. pRow->FillMetrics(NULL, this, pMetrics);
  206. CString strPreviewText = pMetrics->strText;
  207. if (strPreviewText.IsEmpty())
  208. {
  209. pMetrics->InternalRelease();
  210. return 0;
  211. }
  212. CXTPReportControl* pControl = pRow->GetControl();
  213. int nIndentWidth = pControl->GetHeaderIndent();
  214. CRect& rcIndent = pControl->GetPaintManager()->m_rcPreviewIndent;
  215. CRect rcPreviewItem(nIndentWidth + rcIndent.left, 0, nWidth - rcIndent.right, 0);
  216. if (m_pMarkupUIElement)
  217. {
  218. // Calculate Markup item height
  219. XTPMarkupSetDefaultFont(m_pRecord->GetRecords()->GetMarkupContext(), (HFONT)pMetrics->pFont->GetSafeHandle(), pMetrics->clrForeground);
  220. CSize szMarkup = XTPMarkupMeasureElement(m_pMarkupUIElement, rcPreviewItem.Width(), INT_MAX);
  221. nHeight = szMarkup.cy + rcIndent.top + rcIndent.bottom;
  222. }
  223. else
  224. {
  225. // Calculate height of a usual text
  226. CXTPFontDC font(pDC, pMetrics->pFont);
  227. int nMaxPreviewLines = pControl->GetPaintManager()->GetPreviewLinesCount(pDC, rcPreviewItem, strPreviewText);
  228. int nFontHeight = pDC->GetTextExtent(_T(" "), 1).cy;
  229. nHeight = nFontHeight * nMaxPreviewLines + rcIndent.top + rcIndent.bottom;
  230. }
  231. // Cleanup
  232. pMetrics->InternalRelease();
  233. return nHeight;
  234. }
  235. void CXTPReportRecordItemPreview::GetCaptionRect(XTP_REPORTRECORDITEM_ARGS* pDrawArgs, CRect& rcItem)
  236. {
  237. ASSERT(pDrawArgs->pControl);
  238. if (!pDrawArgs->pControl)
  239. return;
  240. CRect& rcIndent = pDrawArgs->pControl->GetPaintManager()->m_rcPreviewIndent;
  241. rcItem.DeflateRect(rcIndent.left - 2, -1, rcIndent.right, -rcIndent.bottom);
  242. }
  243. void CXTPReportRecordItemPreview::OnDrawCaption(XTP_REPORTRECORDITEM_DRAWARGS* pDrawArgs, XTP_REPORTRECORDITEM_METRICS* pMetrics)
  244. {
  245. ASSERT(pDrawArgs->pControl);
  246. if (!pDrawArgs->pControl)
  247. return;
  248. if(!pDrawArgs->pControl->GetPaintManager()->OnDrawAction(pDrawArgs))
  249. return;
  250. CString strText = pMetrics->strText;
  251. // draw item text
  252. if (!strText.IsEmpty())
  253. {
  254. CRect rcItem(pDrawArgs->rcItem);
  255. CRect& rcIndent = pDrawArgs->pControl->GetPaintManager()->m_rcPreviewIndent;
  256. rcItem.DeflateRect(rcIndent.left, rcIndent.top, rcIndent.right, rcIndent.bottom);
  257. if (m_pMarkupUIElement)
  258. {
  259. XTPMarkupSetDefaultFont(m_pRecord->GetRecords()->GetMarkupContext(), (HFONT)pMetrics->pFont->GetSafeHandle(), pMetrics->clrForeground);
  260. XTPMarkupMeasureElement(m_pMarkupUIElement, rcItem.Width(), INT_MAX);
  261. XTPMarkupRenderElement(m_pMarkupUIElement, pDrawArgs->pDC->GetSafeHdc(), &rcItem);
  262. }
  263. else
  264. {
  265. pDrawArgs->pDC->DrawText(strText, rcItem, DT_WORDBREAK | DT_LEFT | DT_NOPREFIX);
  266. }
  267. }
  268. }
  269. int CXTPReportRecordItemVariant::m_nSortLocale = LOCALE_USER_DEFAULT;
  270. //////////////////////////////////////////////////////////////////////////
  271. // CXTPReportRecordItemVariant
  272. IMPLEMENT_SERIAL(CXTPReportRecordItemVariant, CXTPReportRecordItem, VERSIONABLE_SCHEMA | _XTP_SCHEMA_CURRENT)
  273. CXTPReportRecordItemVariant::CXTPReportRecordItemVariant(const VARIANT& lpValue)
  274. {
  275. m_oleValue = lpValue;
  276. m_oleValue.ChangeType((VARTYPE)(m_oleValue.vt & ~VT_BYREF));
  277. }
  278. void CXTPReportRecordItemVariant::SetValue(COleVariant& var)
  279. {
  280. m_oleValue = var;
  281. }
  282. CString CXTPReportRecordItemVariant::GetCaption(CXTPReportColumn* pColumn)
  283. {
  284. if (!m_strCaption.IsEmpty())
  285. return m_strCaption;
  286. COleVariant var(m_oleValue);
  287. CXTPReportRecordItemEditOptions* pEditOptions = m_pEditOptions ? m_pEditOptions :
  288. pColumn ? pColumn->GetEditOptions() : NULL;
  289. BOOL bConstraintEdit = pEditOptions ? pEditOptions->m_bConstraintEdit : FALSE;
  290. TRY
  291. {
  292. if (var.vt == VT_DATE && !bConstraintEdit && m_strFormatString != _T("%s"))
  293. {
  294. COleDateTime dt(var);
  295. //return dt.Format(m_strFormatString);
  296. return CXTPReportControlLocale::FormatDateTime(dt, m_strFormatString);
  297. }
  298. if (var.vt == VT_NULL)
  299. {
  300. var.vt = VT_I4;
  301. var.lVal = 0;
  302. }
  303. else
  304. {
  305. //var.ChangeType((VARTYPE) (bConstraintEdit ? VT_I4 : VT_BSTR));
  306. CXTPReportControlLocale::VariantChangeTypeEx(var, (VARTYPE) (bConstraintEdit ? VT_I4 : VT_BSTR));
  307. }
  308. }
  309. CATCH_ALL(e)
  310. {
  311. }
  312. END_CATCH_ALL
  313. if (bConstraintEdit)
  314. {
  315. CXTPReportRecordItemConstraint* pConstraint = pEditOptions ? pEditOptions->FindConstraint(var.lVal) : NULL;
  316. return pConstraint ? pConstraint->m_strConstraint : _T("");
  317. }
  318. if (var.vt != VT_BSTR)
  319. return _T("");
  320. CString strVariant(var.bstrVal);
  321. if (m_strFormatString == _T("%s"))
  322. return strVariant;
  323. CString strCaption;
  324. strCaption.Format(m_strFormatString, (LPCTSTR)strVariant);
  325. return strCaption;
  326. }
  327. int CXTPReportRecordItemVariant::Compare(CXTPReportColumn*, CXTPReportRecordItem* pItem)
  328. {
  329. if (GetSortPriority() != -1 || pItem->GetSortPriority() != -1)
  330. return GetSortPriority() - pItem->GetSortPriority();
  331. CXTPReportRecordItemVariant* pItemVariant = DYNAMIC_DOWNCAST(CXTPReportRecordItemVariant, pItem);
  332. if (!pItemVariant)
  333. return 0;
  334. ULONG dwFlags = m_pRecord->GetRecords()->IsCaseSensitive() ? 0 : NORM_IGNORECASE;
  335. LCID lcidnSortLocale = m_nSortLocale;
  336. if (lcidnSortLocale == LOCALE_USER_DEFAULT)
  337. {
  338. lcidnSortLocale = CXTPReportControlLocale::GetActiveLCID();
  339. }
  340. return VARCMP_S(m_oleValue, pItemVariant->m_oleValue, lcidnSortLocale, dwFlags) - VARCMP_EQ;
  341. }
  342. BOOL CXTPReportRecordItemVariant::OnValueChanging(XTP_REPORTRECORDITEM_ARGS* pItemArgs, LPVARIANT lpNewValue)
  343. {
  344. UNREFERENCED_PARAMETER(pItemArgs);
  345. UNREFERENCED_PARAMETER(lpNewValue);
  346. return TRUE;
  347. }
  348. BOOL CXTPReportRecordItemVariant::OnEditChanging(XTP_REPORTRECORDITEM_ARGS* pItemArgs, CString& rstrNewText)
  349. {
  350. UNREFERENCED_PARAMETER(pItemArgs);
  351. UNREFERENCED_PARAMETER(rstrNewText);
  352. return TRUE;
  353. }
  354. void CXTPReportRecordItemVariant::OnEditChanged(XTP_REPORTRECORDITEM_ARGS* pItemArgs,
  355. LPCTSTR szText)
  356. {
  357. COleVariant var(szText);
  358. if (OnValueChanging(pItemArgs, &var))
  359. {
  360. TRY
  361. {
  362. CXTPReportControlLocale::VariantChangeTypeEx(var, m_oleValue.vt);
  363. }
  364. CATCH_ALL(e)
  365. {
  366. return;
  367. }
  368. END_CATCH_ALL
  369. m_oleValue = var;
  370. }
  371. }
  372. void CXTPReportRecordItemVariant::DoPropExchange(CXTPPropExchange* pPX)
  373. {
  374. CXTPReportRecordItem::DoPropExchange(pPX);
  375. COleVariant varDefault(_T(""));
  376. PX_Variant(pPX, _T("Value"), m_oleValue, varDefault);
  377. }
  378. void CXTPReportRecordItemVariant::OnConstraintChanged(XTP_REPORTRECORDITEM_ARGS* pItemArgs, CXTPReportRecordItemConstraint* pConstraint)
  379. {
  380. if (GetEditOptions(pItemArgs->pColumn)->m_bConstraintEdit)
  381. {
  382. COleVariant var((long)pConstraint->m_dwData);
  383. //var.ChangeType(m_oleValue.vt);
  384. BOOL bChanged = CXTPReportControlLocale::VariantChangeTypeEx(var, m_oleValue.vt, FALSE);
  385. if (bChanged && OnValueChanging(pItemArgs, &var))
  386. {
  387. m_oleValue = var;
  388. }
  389. }
  390. else
  391. {
  392. OnEditChanged(pItemArgs, pConstraint->m_strConstraint);
  393. }
  394. }
  395. DWORD CXTPReportRecordItemVariant::GetSelectedConstraintData(XTP_REPORTRECORDITEM_ARGS* pItemArgs)
  396. {
  397. if (GetEditOptions(pItemArgs->pColumn)->m_bConstraintEdit)
  398. {
  399. COleVariant var(m_oleValue);
  400. TRY
  401. {
  402. //var.ChangeType(VT_I4);
  403. CXTPReportControlLocale::VariantChangeTypeEx(var, VT_I4);
  404. }
  405. CATCH_ALL(e)
  406. {
  407. return (DWORD)-1;
  408. }
  409. END_CATCH_ALL
  410. return var.lVal;
  411. }
  412. else
  413. {
  414. return (DWORD)-1;
  415. }
  416. }