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

对话框与窗口

开发平台:

Visual C++

  1. // XTPReportColumn.cpp : implementation of the CXTPReportColumn 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 "Common/XTPDrawHelpers.h"
  23. #include "XTPReportColumn.h"
  24. #include "XTPReportColumns.h"
  25. #include "XTPReportSubListControl.h"
  26. #include "XTPReportRecord.h"
  27. #include "XTPReportRecordItem.h"
  28. #include "XTPReportControl.h"
  29. #include "XTPReportInplaceControls.h"
  30. #include "XTPReportHeader.h"
  31. #ifdef _DEBUG
  32. #define new DEBUG_NEW
  33. #undef THIS_FILE
  34. static char THIS_FILE[] = __FILE__;
  35. #endif
  36. //////////////////////////////////////////////////////////////////////////
  37. // CXTPReportColumn
  38. CXTPReportColumn::CXTPReportColumn(int nItemIndex, LPCTSTR strDisplayName, int nWidth,
  39. BOOL bAutoSize, int nIconID, BOOL bSortable, BOOL bVisible)
  40. {
  41. _initData(nItemIndex, strDisplayName, _T(""), nWidth, bAutoSize,
  42.   nIconID, bSortable, bVisible);
  43. }
  44. CXTPReportColumn::CXTPReportColumn(int nItemIndex, LPCTSTR strDisplayName, LPCTSTR strInternalName, int nWidth, BOOL bAutoSize, int nIconID, BOOL bSortable, BOOL bVisible)
  45. {
  46. _initData(nItemIndex, strDisplayName, strInternalName, nWidth, bAutoSize,
  47.   nIconID, bSortable, bVisible);
  48. }
  49. void CXTPReportColumn::_initData(int nItemIndex, LPCTSTR strDisplayName, LPCTSTR strInternalName, int nWidth, BOOL bAutoSize, int nIconID, BOOL bSortable, BOOL bVisible)
  50. {
  51. m_nItemIndex = nItemIndex;
  52. m_strInternalName = strInternalName;
  53. m_strName = strDisplayName;
  54. m_nIconID = nIconID;
  55. m_nMinWidth = 10;
  56. m_bVisible = bVisible;
  57. m_bSortable = bSortable;
  58. m_bGroupable = TRUE;
  59. m_bAutoSortWhenGrouped = TRUE;
  60. m_bFiltrable = TRUE;
  61. m_bIsResizable = bAutoSize;
  62. m_rcColumn.SetRectEmpty();
  63. m_pColumns = NULL;
  64. m_bSortIncreasing = TRUE;
  65. m_bAllowRemove = TRUE;
  66. m_bAllowDrag = TRUE;
  67. m_nMaxItemWidth = 0;
  68. m_nAlignment = DT_LEFT;
  69. m_nHeaderAlignment = -1;
  70. m_nFooterAlignment = -1;
  71. m_bDrawFooterDivider = TRUE;
  72. m_bDrawHeaderDivider = TRUE;
  73. m_bAutoSize = bAutoSize;
  74. m_nColumnStaticWidth = m_nColumnAutoWidth = nWidth;
  75. m_bShowInFieldChooser = TRUE;
  76. m_bEditable = TRUE;
  77. m_bDrawHeaderRowsVGrid = TRUE;
  78. m_bDrawFooterRowsVGrid = TRUE;
  79. m_nBestFitMode = xtpColumnBestFitModeVisibleData;
  80. m_pEditOptions = new CXTPReportRecordItemEditOptions();
  81. }
  82. CXTPReportColumn::~CXTPReportColumn()
  83. {
  84. if (m_pEditOptions)
  85. {
  86. m_pEditOptions->InternalRelease();
  87. }
  88. }
  89. void CXTPReportColumn::SetCaption(LPCTSTR strCaption)
  90. {
  91. m_strName = strCaption;
  92. m_pColumns->GetReportHeader()->OnColumnsChanged();
  93. }
  94. void CXTPReportColumn::SetFooterText(LPCTSTR strFooter)
  95. {
  96. m_strFooterText = strFooter;
  97. m_pColumns->GetReportHeader()->GetControl()->AdjustLayout();
  98. m_pColumns->GetReportHeader()->GetControl()->AdjustScrollBars();
  99. }
  100. void CXTPReportColumn::SetFooterFont(CFont* pFont)
  101. {
  102. m_fontFooter.DeleteObject(); // set default
  103. CFont* pFontDefault = &m_pColumns->GetReportHeader()->GetControl()->GetPaintManager()->m_fontCaption;
  104. if (pFont && pFont->m_hObject && pFont->m_hObject != pFontDefault->m_hObject)
  105. {
  106. LOGFONT lfFooter;
  107. pFont->GetLogFont(&lfFooter);
  108. VERIFY(m_fontFooter.CreateFontIndirect(&lfFooter));
  109. }
  110. m_pColumns->GetReportHeader()->GetControl()->AdjustLayout();
  111. m_pColumns->GetReportHeader()->GetControl()->AdjustScrollBars();
  112. }
  113. void CXTPReportColumn::SetDrawFooterDivider(BOOL bSet)
  114. {
  115. m_bDrawFooterDivider = bSet;
  116. m_pColumns->GetReportHeader()->GetControl()->RedrawControl();
  117. }
  118. void CXTPReportColumn::SetDrawHeaderDivider(BOOL bSet)
  119. {
  120. m_bDrawHeaderDivider = bSet;
  121. m_pColumns->GetReportHeader()->GetControl()->RedrawControl();
  122. }
  123. CFont* CXTPReportColumn::GetFooterFont()
  124. {
  125. if (m_fontFooter.m_hObject != NULL)
  126. return &m_fontFooter;
  127. return &m_pColumns->GetReportHeader()->GetControl()->GetPaintManager()->m_fontCaption;
  128. }
  129. int CXTPReportColumn::GetNormAlignment(int nAlignment) const
  130. {
  131. if (!GetColumns()->GetReportHeader()->GetPaintManager()->m_bRevertAlignment)
  132. return nAlignment;
  133. return nAlignment & DT_RIGHT ? (nAlignment - DT_RIGHT) : (nAlignment + DT_RIGHT);
  134. }
  135. int CXTPReportColumn::GetAlignment() const
  136. {
  137. return GetNormAlignment(m_nAlignment);
  138. }
  139. int CXTPReportColumn::GetHeaderAlignment() const
  140. {
  141. if (m_nHeaderAlignment != -1)
  142. return m_nHeaderAlignment;
  143. if (GetColumns()->GetReportHeader()->GetPaintManager()->m_bUseColumnTextAlignment)
  144. return GetAlignment();
  145. return GetNormAlignment(DT_LEFT);
  146. }
  147. int CXTPReportColumn::GetFooterAlignment() const
  148. {
  149. if (m_nFooterAlignment != -1)
  150. return m_nFooterAlignment;
  151. if (GetColumns()->GetReportHeader()->GetPaintManager()->m_bUseColumnTextAlignment)
  152. return GetAlignment();
  153. return GetNormAlignment(DT_LEFT);
  154. }
  155. void CXTPReportColumn::SetFooterAlignment(int nAlignment)
  156. {
  157. m_nFooterAlignment = nAlignment;
  158. m_pColumns->GetReportHeader()->GetControl()->AdjustLayout();
  159. m_pColumns->GetReportHeader()->GetControl()->AdjustScrollBars();
  160. }
  161. int CXTPReportColumn::GetWidth() const
  162. {
  163. return m_nColumnStaticWidth + (!m_bIsResizable ? GetIndent() : 0);
  164. }
  165. CRect CXTPReportColumn::GetRect() const
  166. {
  167. return m_rcColumn;
  168. }
  169. int CXTPReportColumn::SetWidth(int nNewWidth)
  170. {
  171. int nOldWidth = m_nColumnStaticWidth;
  172. m_nColumnStaticWidth = m_nColumnAutoWidth = nNewWidth;
  173. m_pColumns->GetReportHeader()->OnColumnsChanged();
  174. return nOldWidth;
  175. }
  176. BOOL CXTPReportColumn::IsSortedIncreasing() const
  177. {
  178. return m_bSortIncreasing;
  179. }
  180. BOOL CXTPReportColumn::IsSortedDecreasing() const
  181. {
  182. return !m_bSortIncreasing;
  183. }
  184. BOOL CXTPReportColumn::IsSorted() const
  185. {
  186. return (m_pColumns->GetSortOrder()->IndexOf(this) != -1);
  187. }
  188. void CXTPReportColumn::SetTreeColumn(BOOL bIsTreeColumn)
  189. {
  190. if (bIsTreeColumn)
  191. {
  192. m_pColumns->m_pTreeColumn = this;
  193. }
  194. else if (IsTreeColumn())
  195. {
  196. m_pColumns->m_pTreeColumn = NULL;
  197. }
  198. }
  199. BOOL CXTPReportColumn::IsTreeColumn() const
  200. {
  201. return m_pColumns->m_pTreeColumn == this;
  202. }
  203. BOOL CXTPReportColumn::IsVisible() const
  204. {
  205. return m_bVisible;
  206. }
  207. void CXTPReportColumn::DoPropExchange(CXTPPropExchange* pPX)
  208. {
  209. PX_Bool(pPX, _T("SortIncreasing"), m_bSortIncreasing, TRUE);
  210. PX_Bool(pPX, _T("Visible"), m_bVisible, TRUE);
  211. PX_Int(pPX, _T("Alignment"), m_nAlignment, DT_LEFT);
  212. PX_Int(pPX, _T("StaticWidth"), m_nColumnStaticWidth, 0);
  213. PX_Int(pPX, _T("AutoWidth"), m_nColumnAutoWidth, 0);
  214. if (pPX->GetSchema() > _XTP_SCHEMA_1041)
  215. {
  216. PX_Int(pPX, _T("HeaderAlignment"), m_nHeaderAlignment, -1);
  217. PX_Int(pPX, _T("FooterAlignment"), m_nFooterAlignment, -1);
  218. }
  219. }
  220. BOOL CXTPReportColumn::HasSortTriangle() const
  221. {
  222. if (m_pColumns->GetSortOrder()->IndexOf(this) != -1)
  223. return TRUE;
  224. if (m_pColumns->GetGroupsOrder()->IndexOf(this) != -1 && m_bAutoSortWhenGrouped)
  225. return TRUE;
  226. return FALSE;
  227. }
  228. int CXTPReportColumn::GetCaptionWidth(CDC* pDC) const
  229. {
  230. return pDC->GetTextExtent(m_strName).cx;
  231. }
  232. BOOL CXTPReportColumn::IsDragging() const
  233. {
  234. return m_pColumns && m_pColumns->GetReportHeader() && m_pColumns->GetReportHeader()->m_pDragColumn == this;
  235. }
  236. int CXTPReportColumn::GetIndent() const
  237. {
  238. if (!m_pColumns->GetReportHeader())
  239. return 0;
  240. if (m_pColumns->GetVisibleAt(0) == this)
  241. return GetControl()->GetHeaderIndent();
  242. return 0;
  243. }
  244. int CXTPReportColumn::GetMinWidth() const
  245. {
  246. return (m_bIsResizable || m_bAutoSize ? m_nMinWidth : m_nColumnStaticWidth) + GetIndent();
  247. }
  248. void CXTPReportColumn::SetVisible(BOOL bVisible)
  249. {
  250. if (bVisible != m_bVisible)
  251. {
  252. m_bVisible = bVisible;
  253. m_pColumns->GetReportHeader()->OnColumnsChanged();
  254. }
  255. }
  256. int CXTPReportColumn::GetItemIndex() const
  257. {
  258. return m_nItemIndex;
  259. }
  260. int CXTPReportColumn::GetIndex() const
  261. {
  262. return m_pColumns->IndexOf(this);
  263. }
  264. CXTPReportControl* CXTPReportColumn::GetControl() const
  265. {
  266. return m_pColumns->GetReportHeader()->GetControl();
  267. }
  268. void CXTPReportColumn::SetShowInFieldChooser(BOOL bShow)
  269. {
  270. if (bShow != m_bShowInFieldChooser)
  271. {
  272. m_bShowInFieldChooser = bShow;
  273. CXTPReportSubListControl* pSubList = m_pColumns->GetReportHeader()->GetSubListCtrl();
  274. if (pSubList)
  275. {
  276. pSubList->UpdateList();
  277. }
  278. }
  279. }
  280. BOOL CXTPReportColumn::IsHotTracking() const
  281. {
  282. return m_pColumns->GetReportHeader()->GetHotTrackingColumn() == this;
  283. }
  284. BOOL CXTPReportColumn::IsShowInFieldChooser() const
  285. {
  286. return m_bShowInFieldChooser;
  287. }
  288. int CXTPReportColumn::GetPrintWidth(int nTotalWidth) const
  289. {
  290. CXTPReportColumns* pColumns = m_pColumns;
  291. int nColumnsWidth = 0;
  292. CXTPReportColumn* pLastAutoColumn = NULL;
  293. for (int nColumn = 0; nColumn < pColumns->GetCount(); nColumn++)
  294. {
  295. CXTPReportColumn* pColumn = pColumns->GetAt(nColumn);
  296. if (!pColumn->IsVisible())
  297. continue;
  298. if (pColumn->IsAutoSize())
  299. {
  300. pLastAutoColumn = pColumn;
  301. nColumnsWidth += pColumn->GetWidth();
  302. }
  303. else
  304. {
  305. nTotalWidth -= pColumn->GetWidth();
  306. }
  307. }
  308. for (int i = 0; i < pColumns->GetCount(); i++)
  309. {
  310. CXTPReportColumn* pColumn = pColumns->GetAt(i);
  311. if (!pColumn->IsVisible())
  312. continue;
  313. int nWidth = pColumn->GetWidth();
  314. if (pColumn->IsAutoSize())
  315. {
  316. if (pColumn == pLastAutoColumn)
  317. {
  318. nWidth = max(nTotalWidth, pColumn->GetMinWidth());
  319. }
  320. else
  321. {
  322. nColumnsWidth = max(1, nColumnsWidth);
  323. nWidth =
  324. max(int(pColumn->GetWidth() * nTotalWidth / nColumnsWidth), pColumn->GetMinWidth());
  325. nTotalWidth -= nWidth;
  326. nColumnsWidth -= pColumn->GetWidth();
  327. }
  328. }
  329. if (pColumn == this)
  330. return nWidth;
  331. }
  332. return 0;
  333. }
  334. int CXTPReportColumn::GetBestFitWidth()
  335. {
  336. CXTPReportControl* pControl = GetControl();
  337. CXTPReportPaintManager* pPaintManager = pControl->GetPaintManager();
  338. int nBestColumnWidth = 0;
  339. CClientDC dc(pControl);
  340. CXTPFontDC font(&dc, &pPaintManager->m_fontCaption);
  341. nBestColumnWidth = 6 + GetCaptionWidth(&dc);
  342. if (GetIconID() != XTP_REPORT_NOICON)
  343. {
  344. nBestColumnWidth += pPaintManager->DrawBitmap(NULL, pControl, GetRect(), nBestColumnWidth) + 2;
  345. }
  346. if (HasSortTriangle())
  347. {
  348. nBestColumnWidth += 27;
  349. }
  350. int nDataWidth = pControl->OnGetColumnDataBestFitWidth(this);
  351. nBestColumnWidth = max(nBestColumnWidth, nDataWidth);
  352. nBestColumnWidth = max(nBestColumnWidth, m_nMaxItemWidth);
  353. return nBestColumnWidth;
  354. }
  355. void CXTPReportColumn::EnsureVisible()
  356. {
  357. CXTPReportControl* pControl = GetControl();
  358. pControl->EnsureVisible(this);
  359. }