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

对话框与窗口

开发平台:

Visual C++

  1. // XTPReportSubListControl.cpp : implementation of the CXTPReportSubListControl 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/XTPDrawHelpers.h"
  22. #include "XTPReportControl.h"
  23. #include "XTPReportColumn.h"
  24. #include "XTPReportColumns.h"
  25. #include "XTPReportDefines.h"
  26. #include "XTPReportDragDrop.h"
  27. #include "XTPReportSubListControl.h"
  28. #include "XTPReportHeader.h"
  29. #ifdef _DEBUG
  30. #define new DEBUG_NEW
  31. #undef THIS_FILE
  32. static char THIS_FILE[] = __FILE__;
  33. #endif
  34. IMPLEMENT_DYNAMIC(CXTPReportSubListControl, CListBox)
  35. /////////////////////////////////////////////////////////////////////////////
  36. // CXTPReportSubListControl
  37. CXTPReportSubListControl::CXTPReportSubListControl()
  38. {
  39. m_pReportCtrl = NULL;
  40. m_pDragWnd = NULL;
  41. m_bSortAscending = FALSE;
  42. m_nDropIndex = 0;
  43. }
  44. CXTPReportSubListControl::~CXTPReportSubListControl()
  45. {
  46. }
  47. BEGIN_MESSAGE_MAP(CXTPReportSubListControl, CListBox)
  48. //{{AFX_MSG_MAP(CXTPReportSubListControl)
  49. ON_WM_ERASEBKGND()
  50. ON_WM_LBUTTONDOWN()
  51. ON_WM_PAINT()
  52. ON_MESSAGE(WM_PRINTCLIENT, OnPrintClient)
  53. //}}AFX_MSG_MAP
  54. END_MESSAGE_MAP()
  55. /////////////////////////////////////////////////////////////////////////////
  56. // CXTPReportSubListControl attributes
  57. BOOL CXTPReportSubListControl::SetReportCtrl(CXTPReportControl* pReportCtrl)
  58. {
  59. if (pReportCtrl == NULL)
  60. return FALSE;
  61. ASSERT_KINDOF(CXTPReportControl, pReportCtrl);
  62. if (m_pReportCtrl != pReportCtrl)
  63. {
  64. ResetContent();
  65. m_pReportCtrl = pReportCtrl;
  66. }
  67. UpdateList();
  68. return TRUE;
  69. }
  70. CXTPReportControl* CXTPReportSubListControl::GetReportCtrl()
  71. {
  72. return m_pReportCtrl;
  73. }
  74. /////////////////////////////////////////////////////////////////////////////
  75. // CXTPReportSubListControl operations
  76. void CXTPReportSubListControl::SortAscending(BOOL bSort)
  77. {
  78. m_bSortAscending = bSort;
  79. if (GetSafeHwnd()) ResetContent();
  80. UpdateList();
  81. }
  82. BOOL CXTPReportSubListControl::UpdateList()
  83. {
  84. if (m_pReportCtrl == NULL)
  85. return FALSE;
  86. if (GetSafeHwnd() == NULL)
  87. return FALSE;
  88. CClientDC dc(this);
  89. CXTPFontDC fnt(&dc, &m_pReportCtrl->GetPaintManager()->m_fontCaption);
  90. int nHeight = dc.GetTextExtent(_T(" "), 1).cy + 5;
  91. if (GetItemHeight(0) != nHeight) SetItemHeight(0, nHeight);
  92. CXTPReportColumns* pColumns = m_pReportCtrl->GetColumns();
  93. int nColumnCount = pColumns->GetCount();
  94. BOOL bChanged = FALSE;
  95. // delete all visible items from the list
  96. for (int i = GetCount() - 1; i >= 0; i--)
  97. {
  98. int nItemIndex = (int)GetItemData(i);
  99. CXTPReportColumn* pColumn = pColumns->Find(nItemIndex);
  100. if (!pColumn || pColumn->IsVisible() || !pColumn->IsShowInFieldChooser())
  101. {
  102. DeleteString(i);
  103. bChanged = TRUE;
  104. }
  105. }
  106. // add the rest of invisible items
  107. for (int nColumn = 0; nColumn < nColumnCount; nColumn++)
  108. {
  109. CXTPReportColumn* pColumn = pColumns->GetAt(nColumn);
  110. if (pColumn && !pColumn->IsVisible() && pColumn->IsShowInFieldChooser())
  111. {
  112. int nListItem = FindItemData(pColumn->GetItemIndex());
  113. if (nListItem < 0)
  114. {
  115. int nItem = -1;
  116. if (m_bSortAscending)
  117. {
  118. for (nItem = 0; nItem < GetCount(); nItem++)
  119. {
  120. CString str = GetItemCaption(nItem);
  121. if (str > pColumn->GetCaption())
  122. break;
  123. }
  124. nItem = InsertString(nItem, pColumn->GetCaption());
  125. }
  126. else
  127. {
  128. nItem = AddString(pColumn->GetCaption());
  129. }
  130. if (nItem >= 0)
  131. {
  132. SetItemData(nItem, pColumn->GetItemIndex());
  133. bChanged = TRUE;
  134. }
  135. }
  136. }
  137. }
  138. EnableWindow(GetCount() > 0);
  139. if (bChanged)
  140. Invalidate();
  141. return TRUE;
  142. }
  143. CXTPReportColumn* CXTPReportSubListControl::GetItemColumn(int nIndex)
  144. {
  145. if (!m_pReportCtrl || GetSafeHwnd() == 0)
  146. return NULL;
  147. int nItemData = (int)GetItemData(nIndex);
  148. if (nItemData == -1)
  149. return NULL;
  150. CXTPReportColumn* pColumn = m_pReportCtrl->GetColumns()->Find(nItemData);
  151. return pColumn;
  152. }
  153. CString CXTPReportSubListControl::GetItemCaption(int nIndex)
  154. {
  155. if (!m_pReportCtrl || GetSafeHwnd() == 0)
  156. return _T("");
  157. if (GetStyle() & LBS_HASSTRINGS)
  158. {
  159. CString str;
  160. GetText(nIndex, str);
  161. return str;
  162. }
  163. int nItemData = (int)GetItemData(nIndex);
  164. if (nItemData == -1)
  165. return _T("");
  166. CXTPReportColumn* pColumn = m_pReportCtrl->GetColumns()->Find(nItemData);
  167. if (pColumn == NULL)
  168. return _T("");
  169. return pColumn->GetCaption();
  170. }
  171. int CXTPReportSubListControl::FindItemData(int nItemData)
  172. {
  173. for (int i = GetCount() - 1; i >= 0; i--)
  174. {
  175. int nItemIndex = (int)GetItemData(i);
  176. if (nItemData == nItemIndex)
  177. return i;
  178. }
  179. return -1;
  180. }
  181. BOOL CXTPReportSubListControl::Include(int /*iSubItem*/)
  182. {
  183. return TRUE;
  184. }
  185. BOOL CXTPReportSubListControl::Disable(int /*iSubItem*/)
  186. {
  187. return FALSE;
  188. }
  189. /////////////////////////////////////////////////////////////////////////////
  190. // CXTPReportSubListControl message handlers
  191. void CXTPReportSubListControl::PreSubclassWindow()
  192. {
  193. CListBox::PreSubclassWindow();
  194. }
  195. void CXTPReportSubListControl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
  196. {
  197. CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
  198. CRect rcItem(lpDrawItemStruct->rcItem);
  199. CXTPReportPaintManager* pPaintManager = m_pReportCtrl ? m_pReportCtrl->GetPaintManager() : NULL;
  200. COLORREF clrBack = pPaintManager ? pPaintManager->m_clrControlBack : ::GetXtremeColor(COLOR_WINDOW);
  201. if (GetCount() > 0 && m_pReportCtrl && pPaintManager)
  202. {
  203. BOOL bDisable = Disable((int)lpDrawItemStruct->itemData);
  204. CXTPFontDC fnt(pDC, &pPaintManager->m_fontCaption);
  205. if (GetExStyle() & WS_EX_STATICEDGE)
  206. {
  207. pDC->Draw3dRect(rcItem, pPaintManager->m_clrHighlightText, pPaintManager->m_clrControlDark);
  208. rcItem.DeflateRect(1, 1);
  209. pDC->FillSolidRect(rcItem, pPaintManager->m_clrControlBack);
  210. rcItem.DeflateRect(1, 1);
  211. }
  212. else
  213. {
  214. pDC->FillSolidRect(rcItem, pPaintManager->m_clrHeaderControl);
  215. pDC->Draw3dRect(rcItem, pPaintManager->m_clrBtnFace, GetXtremeColor(COLOR_3DDKSHADOW));
  216. rcItem.DeflateRect(1, 1);
  217. pDC->Draw3dRect(rcItem, pPaintManager->m_clrControlBack, pPaintManager->m_clrControlDark);
  218. rcItem.DeflateRect(1, 1);
  219. }
  220. pDC->SetBkMode(TRANSPARENT);
  221. if (lpDrawItemStruct->itemState&ODS_SELECTED)
  222. {
  223. pDC->FillSolidRect(rcItem, GetXtremeColor(COLOR_3DFACE));
  224. pDC->InvertRect(rcItem);
  225. pDC->SetTextColor(bDisable ? ::GetXtremeColor(COLOR_BTNFACE) : ::GetXtremeColor(COLOR_3DHIGHLIGHT));
  226. }
  227. else
  228. {
  229. if (bDisable)
  230. {
  231. pDC->SetTextColor(::GetXtremeColor(COLOR_3DHIGHLIGHT));
  232. CRect rect = rcItem;
  233. rect.OffsetRect(1, 1);
  234. pDC->DrawText(GetItemCaption((int)lpDrawItemStruct->itemID), rect,
  235. DT_SINGLELINE | DT_NOPREFIX | DT_NOCLIP | DT_VCENTER | DT_END_ELLIPSIS | DT_LEFT);
  236. pDC->SetTextColor(::GetXtremeColor(COLOR_3DSHADOW));
  237. }
  238. else
  239. pDC->SetTextColor(pPaintManager->m_clrCaptionText);
  240. }
  241. pDC->DrawText(GetItemCaption((int)lpDrawItemStruct->itemID), rcItem,
  242. DT_SINGLELINE | DT_NOPREFIX | DT_NOCLIP | DT_VCENTER | DT_END_ELLIPSIS | DT_LEFT);
  243. }
  244. else
  245. pDC->FillSolidRect(rcItem, clrBack);
  246. }
  247. BOOL CXTPReportSubListControl::BeginDrag(int nItem)
  248. {
  249. if (GetCount() <= 0)
  250. return FALSE;
  251. int nSubItem = (int)GetItemData(nItem);
  252. if (Disable(nSubItem))
  253. {
  254. return FALSE;
  255. }
  256. GetClientRect(m_rcDragWnd);
  257. m_rcDragWnd.bottom = m_rcDragWnd.top + GetItemHeight(0);
  258. CXTPReportHeader* pHeader = m_pReportCtrl->GetReportHeader();
  259. CXTPReportColumn* pColumn = m_pReportCtrl->GetColumns()->Find(nSubItem);
  260. pHeader->StartDragging(pColumn);
  261. pHeader->m_bDragGroupBox = FALSE;
  262. //pHeader->m_nDragIndex = m_nSubItem;
  263. m_pDragWnd = new CXTPReportHeaderDragWnd;
  264. if (m_pDragWnd)
  265. m_pDragWnd->Create(m_rcDragWnd, pHeader, m_pReportCtrl->GetPaintManager(), pColumn);
  266. m_pReportCtrl->SetMouseMode(xtpReportMouseDraggingColumn);
  267. GetWindowRect(m_rcDropTarget1);
  268. m_rcDropTarget2 = m_pReportCtrl->m_rcHeaderArea;
  269. if (pColumn->IsGroupable())
  270. m_rcDropTarget2.UnionRect(&m_rcDropTarget2, &m_pReportCtrl->m_rcGroupByArea);
  271. m_pReportCtrl->ClientToScreen(m_rcDropTarget2);
  272. m_nDropIndex = -1;
  273. return TRUE;
  274. }
  275. UINT CXTPReportSubListControl::Dragging(CPoint pt)
  276. {
  277. CPoint point = pt;
  278. point.Offset(-(m_rcDragWnd.Width() >> 1), -(m_rcDragWnd.Height() >> 1));
  279. if (m_pDragWnd != NULL)
  280. {
  281. m_pDragWnd->SetWindowPos(&wndTop,
  282. point.x, point.y, 0, 0,
  283. SWP_NOSIZE | SWP_SHOWWINDOW | SWP_NOACTIVATE);
  284. }
  285. if (m_pReportCtrl)
  286. {
  287. CPoint pointCtrl(pt);
  288. m_pReportCtrl->ScreenToClient(&pointCtrl);
  289. m_pReportCtrl->OnMouseMove(0, pointCtrl);
  290. }
  291. if (m_rcDropTarget1.PtInRect(pt))
  292. return DL_MOVECURSOR;
  293. if (m_rcDropTarget2.PtInRect(pt))
  294. return DL_MOVECURSOR;
  295. return DL_STOPCURSOR;
  296. }
  297. void CXTPReportSubListControl::CancelDrag()
  298. {
  299. if (m_pDragWnd != NULL)
  300. {
  301. m_pDragWnd->DestroyWindow();
  302. m_pDragWnd = NULL;
  303. }
  304. CXTPReportHeader* pHeader = m_pReportCtrl->GetReportHeader();
  305. pHeader->SetHotDivider(-1);
  306. m_pReportCtrl->SetMouseMode(xtpReportMouseNothing);
  307. }
  308. void CXTPReportSubListControl::Dropped(CPoint pt)
  309. {
  310. if (m_pDragWnd != NULL)
  311. {
  312. m_pDragWnd->DestroyWindow();
  313. m_pDragWnd = NULL;
  314. }
  315. if (m_pReportCtrl)
  316. {
  317. m_pReportCtrl->ScreenToClient(&pt);
  318. m_pReportCtrl->OnLButtonUp(0, pt);
  319. }
  320. }
  321. void CXTPReportSubListControl::OnPaint()
  322. {
  323. CPaintDC dcPaint(this);
  324. CRect rc;
  325. GetClientRect(rc);
  326. CXTPBufferDC dc(dcPaint, rc);
  327. CXTPReportPaintManager* pPaintManager = m_pReportCtrl ? m_pReportCtrl->GetPaintManager() : NULL;
  328. COLORREF clrBack = pPaintManager ? pPaintManager->m_clrControlBack : GetXtremeColor(COLOR_WINDOW);
  329. dc.FillSolidRect(rc, IsWindowEnabled() ? clrBack : GetXtremeColor(COLOR_BTNFACE));
  330. if (GetCount() > 0 || !pPaintManager)
  331. CWnd::DefWindowProc(WM_PAINT, (WPARAM)dc.m_hDC, 0);
  332. else
  333. {
  334. dc.SetTextColor(GetXtremeColor(COLOR_3DSHADOW));
  335. dc.SetBkMode(TRANSPARENT);
  336. CXTPFontDC fnt(&dc, &pPaintManager->m_fontCaption);
  337. dc.DrawText(pPaintManager->m_strNoFieldsAvailable, rc, DT_SINGLELINE | DT_CENTER | DT_VCENTER | DT_NOPREFIX);
  338. }
  339. }
  340. LRESULT CXTPReportSubListControl::OnPrintClient(WPARAM wParam, LPARAM lParam)
  341. {
  342. CListBox::DefWindowProc(WM_ERASEBKGND, wParam, 0);
  343. return CListBox::DefWindowProc(WM_PRINTCLIENT, wParam, lParam);
  344. }
  345. BOOL CXTPReportSubListControl::OnEraseBkgnd(CDC* /*pDC*/)
  346. {
  347. return TRUE;
  348. }
  349. void CXTPReportSubListControl::OnLButtonDown(UINT nFlags, CPoint point)
  350. {
  351. SetFocus();
  352. BOOL bOutside = TRUE;
  353. int nItem = ItemFromPoint(point, bOutside);
  354. if (nItem == LB_ERR)
  355. {
  356. CWnd::OnLButtonDown(nFlags, point);
  357. return;
  358. }
  359. SetCurSel(nItem);
  360. ParentNotify_SelChangd();
  361. BOOL bAccept = FALSE;
  362. BOOL bStartDrag = FALSE;
  363. HCURSOR hCursorNo = AfxGetApp()->LoadStandardCursor(IDC_NO), hCursorArrow = AfxGetApp()->LoadStandardCursor(IDC_ARROW);
  364. SetCapture();
  365. while (CWnd::GetCapture() == this)
  366. {
  367. MSG msg;
  368. if (!GetMessage(&msg, NULL, 0, 0))
  369. break;
  370. if (msg.message == WM_MOUSEMOVE)
  371. {
  372. CPoint pt(msg.lParam);
  373. if (point != pt)
  374. {
  375. if (!bStartDrag && abs(point.x - pt.x) + abs(point.y - pt.y) < 3)
  376. continue;
  377. point = pt;
  378. if (!bStartDrag)
  379. {
  380. BeginDrag(nItem);
  381. bStartDrag = TRUE;
  382. }
  383. if (bStartDrag)
  384. {
  385. ClientToScreen(&pt);
  386. UINT nCursor = Dragging(pt);
  387. ::SetCursor(nCursor == DL_STOPCURSOR ? hCursorNo : hCursorArrow);
  388. }
  389. }
  390. }
  391. else if (msg.message == WM_KEYDOWN && msg.wParam == VK_ESCAPE) break;
  392. else if (msg.message == WM_LBUTTONUP)
  393. {
  394. bAccept = TRUE;
  395. break;
  396. }
  397. else  ::DispatchMessage(&msg);
  398. }
  399. if (GetCapture() == this)
  400. {
  401. ReleaseCapture();
  402. }
  403. if (bStartDrag)
  404. {
  405. if (bAccept)
  406. {
  407. ClientToScreen(&point);
  408. Dropped(point);
  409. ParentNotify_SelChangd();
  410. }
  411. else
  412. {
  413. CancelDrag();
  414. }
  415. }
  416. }
  417. void CXTPReportSubListControl::ParentNotify_SelChangd()
  418. {
  419. if (GetParent() && (GetStyle() & LBS_NOTIFY))
  420. GetParent()->SendMessage(WM_COMMAND, MAKEWPARAM(GetDlgCtrlID(), LBN_SELCHANGE), (LPARAM)m_hWnd);
  421. }