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

对话框与窗口

开发平台:

Visual C++

  1. // XTPTaskPanelGroupItem.cpp : implementation of the CXTPTaskPanelGroupItem 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/XTPVC80Helpers.h"
  22. #include "Common/XTPDrawHelpers.h"
  23. #include "Common/XTPPropExchange.h"
  24. #include "XTPTaskPanelGroupItem.h"
  25. #include "XTPTaskPanelItems.h"
  26. #include "XTPTaskPanelPaintManager.h"
  27. #include "XTPTaskPanel.h"
  28. #include "XTPTaskPanelGroup.h"
  29. #ifdef _DEBUG
  30. #define new DEBUG_NEW
  31. #undef THIS_FILE
  32. static char THIS_FILE[] = __FILE__;
  33. #endif
  34. /////////////////////////////////////////////////////////////////////////////
  35. // CXTPTaskPanelGroupItem
  36. IMPLEMENT_SERIAL(CXTPTaskPanelGroupItem, CXTPTaskPanelItem, VERSIONABLE_SCHEMA | _XTP_SCHEMA_CURRENT)
  37. CXTPTaskPanelGroupItem::CXTPTaskPanelGroupItem()
  38. {
  39. m_typeItem = xtpTaskItemTypeText;
  40. m_rcMargins = CXTPTaskPanelPaintManager::rectDefault;
  41. m_bBold = FALSE;
  42. m_hWnd = 0;
  43. m_szItem = CSize(0, 0);
  44. m_bSelected = FALSE;
  45. m_bAutoHeight = FALSE;
  46. m_rcItem.SetRectEmpty();
  47. m_szPreview = CSize(0, 0);
  48. m_clrText = COLORREF_NULL;
  49. EnableAutomation();
  50. }
  51. CXTPTaskPanelGroupItem::~CXTPTaskPanelGroupItem()
  52. {
  53. if (m_typeItem == xtpTaskItemTypeControl && m_hWnd && ::IsWindow(m_hWnd))
  54. {
  55. ::ShowWindow(m_hWnd, SW_HIDE);
  56. }
  57. }
  58. CRect CXTPTaskPanelGroupItem::OnReposition(CRect rc)
  59. {
  60. if (GetItemGroup()->GetItemLayout() == xtpTaskItemLayoutImages)
  61. {
  62. return m_rcItem = rc;
  63. }
  64. CXTPTaskPanelPaintManager* pPaintManager = GetPaintManager();
  65. CRect rcMargins = pPaintManager->GetItemOuterMargins(this);
  66. rc.DeflateRect(rcMargins);
  67. if ((m_szItem == CSize(0)) && (m_typeItem != xtpTaskItemTypeControl))
  68. {
  69. CClientDC dc((CWnd*)m_pPanel);
  70. m_rcItem = GetPaintManager()->DrawGroupItem(&dc, this, rc, FALSE);
  71. }
  72. else
  73. {
  74. m_rcItem.SetRect(rc.left, rc.top, rc.left + m_szItem.cx, rc.top + m_szItem.cy);
  75. }
  76. return m_rcItem;
  77. }
  78. void CXTPTaskPanelGroupItem::OnDrawItem(CDC* pDC, CRect rc)
  79. {
  80. if ((m_typeItem != xtpTaskItemTypeControl) || (GetItemGroup()->GetItemLayout() == xtpTaskItemLayoutImages))
  81. GetPaintManager()->DrawGroupItem(pDC, this, rc, TRUE);
  82. else
  83. {
  84. if (!IsWindowVisible(m_hWnd) && m_bmpPreview.GetSafeHandle())
  85. {
  86. pDC->DrawState(rc.TopLeft(), rc.Size(), &m_bmpPreview, DST_BITMAP);
  87. }
  88. }
  89. }
  90. CXTPTaskPanelGroup* CXTPTaskPanelGroupItem::GetItemGroup() const
  91. {
  92. return m_pItems ? (CXTPTaskPanelGroup*) m_pItems->GetOwner() : NULL;
  93. }
  94. void CXTPTaskPanelGroupItem::SetBold(BOOL bBold)
  95. {
  96. m_bBold = bBold;
  97. RepositionPanel();
  98. }
  99. BOOL CXTPTaskPanelGroupItem::IsBold() const
  100. {
  101. return m_bBold;
  102. }
  103. void CXTPTaskPanelGroupItem::SetControlHandle(HWND hWnd)
  104. {
  105. m_hWnd = hWnd;
  106. CRect rc;
  107. ::GetWindowRect(hWnd, rc);
  108. m_szItem.cy = rc.Height();
  109. SetType(xtpTaskItemTypeControl);
  110. }
  111. HWND CXTPTaskPanelGroupItem::GetControlHandle() const
  112. {
  113. return m_hWnd;
  114. }
  115. void CXTPTaskPanelGroupItem::GetPreviewBitmap(CWnd* pWnd, CBitmap& bmp)
  116. {
  117. bmp.DeleteObject();
  118. if (!pWnd || !::IsWindow(pWnd->m_hWnd))
  119. return;
  120. {
  121. CXTPWindowRect rectWindow(pWnd);
  122. CClientDC dc(pWnd);
  123. CBitmap bitmapNonClient;
  124. VERIFY(bmp.CreateCompatibleBitmap(&dc, rectWindow.Width(), rectWindow.Height()));
  125. VERIFY(bitmapNonClient.CreateCompatibleBitmap(&dc, rectWindow.Width(), rectWindow.Height()));
  126. CXTPCompatibleDC dcMemDestination(&dc, &bmp);
  127. CXTPCompatibleDC dcMemSourceNonClient(&dc, &bitmapNonClient);
  128. dcMemSourceNonClient.FillSolidRect(0, 0, rectWindow.Width(), rectWindow.Height(), GetBackColor());
  129. pWnd->Print(&dcMemSourceNonClient, PRF_NONCLIENT);
  130. dcMemDestination.BitBlt(0, 0, rectWindow.Width(), rectWindow.Height(), &dcMemSourceNonClient, 0, 0, SRCCOPY);
  131. CPoint pLT(0, 0);
  132. pWnd->ClientToScreen(&pLT);
  133. dcMemDestination.SetViewportOrg(pLT.x - rectWindow.left, pLT.y - rectWindow.top);
  134. pWnd->Print(&dcMemDestination, PRF_CHILDREN | PRF_CLIENT | PRF_ERASEBKGND);
  135. }
  136. }
  137. void CXTPTaskPanelGroupItem::OnAnimate(int /*nStep*/)
  138. {
  139. if (!(m_typeItem == xtpTaskItemTypeControl && m_hWnd && ::IsWindow(m_hWnd)))
  140. return;
  141. CXTPTaskPanelGroup* pGroup = GetItemGroup();
  142. if (!pGroup) return;
  143. CRect rc = pGroup->GetClientRect();
  144. rc.OffsetRect(m_rcItem.left - rc.left, m_rcItem.top - m_pPanel->GetScrollOffset() - pGroup->GetScrollOffsetPos());
  145. CRect rcMargins = GetPaintManager()->GetItemOuterMargins(this);
  146. CRect rcGroupMargin = GetPaintManager()->GetGroupInnerMargins(pGroup);
  147. int nWidth = rc.Width() - rcGroupMargin.left - rcGroupMargin.right -
  148. rcMargins.right - rcMargins.left;
  149. if (m_szItem.cx != 0) nWidth = min(m_szItem.cx, nWidth);
  150. if (!IsVisible() || !pGroup->IsVisible() || (pGroup->GetItemLayout() == xtpTaskItemLayoutImages))
  151. {
  152. m_bmpPreview.DeleteObject();
  153. ::ShowWindow(m_hWnd, SW_HIDE);
  154. return;
  155. }
  156. if (pGroup->IsExpanding() || !pGroup->IsExpanded()
  157. || (pGroup->GetClientRect().Height() != pGroup->GetTargetClientRect().Height())
  158. )
  159. {
  160. if (IsWindowVisible(m_hWnd) || m_bmpPreview.GetSafeHandle() == 0 || m_szPreview != m_rcItem.Size())
  161. {
  162. m_bmpPreview.DeleteObject();
  163. if (m_rcItem.Height() > 0)
  164. {
  165. SetWindowPos(m_hWnd, 0, rc.left, -m_rcItem.Height(), nWidth, m_rcItem.Height(), SWP_NOZORDER | SWP_SHOWWINDOW | SWP_NOACTIVATE);
  166. GetPreviewBitmap(CWnd::FromHandle(m_hWnd), m_bmpPreview);
  167. m_szPreview = m_rcItem.Size();
  168. }
  169. ::ShowWindow(m_hWnd, SW_HIDE);
  170. }
  171. }
  172. else
  173. {
  174. BOOL bVisible = pGroup->IsItemVisible(this, FALSE);
  175. if (!bVisible)
  176. {
  177. ::ShowWindow(m_hWnd, SW_HIDE);
  178. }
  179. else
  180. {
  181. SetWindowPos(m_hWnd, 0, rc.left, rc.top, nWidth, m_rcItem.Height(), SWP_NOZORDER | SWP_SHOWWINDOW | SWP_NOACTIVATE);
  182. }
  183. m_bmpPreview.DeleteObject();
  184. }
  185. }
  186. void CXTPTaskPanelGroupItem::SetSize(CSize szItem, BOOL bAutoHeight)
  187. {
  188. m_bAutoHeight = bAutoHeight;
  189. m_szItem = szItem;
  190. RepositionPanel();
  191. }
  192. COLORREF CXTPTaskPanelGroupItem::GetBackColor() const
  193. {
  194. XTP_TASKPANEL_GROUPCOLORS* pColors = GetPaintManager()->GetGroupColors(GetItemGroup()->IsSpecialGroup());
  195. return pColors->clrClient;
  196. }
  197. BOOL CXTPTaskPanelGroupItem::IsItemSelected() const
  198. {
  199. if (m_pPanel && m_pPanel->IsSingleSelection())
  200. return m_pPanel->GetFocusedItem() == (CXTPTaskPanelItem*)this;
  201. return m_bSelected;
  202. }
  203. void CXTPTaskPanelGroupItem::SetItemSelected(BOOL bSelected)
  204. {
  205. if (m_pPanel && m_pPanel->IsSingleSelection())
  206. {
  207. if (bSelected) m_pPanel->SetFocusedItem(this, FALSE, FALSE);
  208. return;
  209. }
  210. if (bSelected != m_bSelected)
  211. {
  212. m_bSelected = bSelected;
  213. RedrawPanel(!m_bSelected);
  214. }
  215. }
  216. CRect CXTPTaskPanelGroupItem::GetHitTestRect() const
  217. {
  218. if (!IsVisible() || !m_pPanel)
  219. return CRect(0, 0, 0, 0);
  220. CXTPTaskPanelGroup* pGroup = GetItemGroup();
  221. if (!pGroup)
  222. return CRect(0, 0, 0, 0);
  223. CRect rcCaption = pGroup->GetCaptionRect();
  224. CRect rcItem = GetItemRect();
  225. int nOffset = m_pPanel->GetScrollOffset() - rcCaption.bottom + pGroup->GetScrollOffsetPos();
  226. rcItem.OffsetRect(0, -nOffset);
  227. return rcItem;
  228. }
  229. void CXTPTaskPanelGroupItem::DoPropExchange(CXTPPropExchange* pPX)
  230. {
  231. CXTPTaskPanelItem::DoPropExchange(pPX);
  232. BOOL bSelected = IsItemSelected();
  233. PX_Rect(pPX, _T("Margins"), m_rcMargins, CXTPTaskPanelPaintManager::rectDefault);
  234. PX_Bool(pPX, _T("Bold"), m_bBold, FALSE);
  235. PX_Size(pPX, _T("ItemSize"), m_szItem, CSize(0, 0));
  236. PX_Bool(pPX, _T("Selected"), bSelected, FALSE);
  237. if (pPX->GetSchema() > _XTP_SCHEMA_95)
  238. {
  239. PX_Bool(pPX, _T("AutoHeight"), m_bAutoHeight, FALSE);
  240. }
  241. if (pPX->GetSchema() > _XTP_SCHEMA_97)
  242. {
  243. PX_String(pPX, _T("DragText"), m_strDragText, _T(""));
  244. }
  245. if (pPX->GetSchema() > _XTP_SCHEMA_100)
  246. {
  247. PX_DWord(pPX, _T("TextColor"), m_clrText, COLORREF_NULL);
  248. }
  249. if (pPX->IsLoading())
  250. {
  251. SetItemSelected(bSelected);
  252. }
  253. }
  254. CString CXTPTaskPanelGroupItem::GetDragText() const
  255. {
  256. return m_strDragText;
  257. }
  258. void CXTPTaskPanelGroupItem::SetDragText(LPCTSTR lpszDragText)
  259. {
  260. m_strDragText = lpszDragText;
  261. }
  262. BOOL CXTPTaskPanelGroupItem::PrepareDrag (COleDataSource& srcItem, BOOL bCacheTextData)
  263. {
  264. HGLOBAL hGlobal = CacheGlobalData();
  265. if (!hGlobal)
  266. return FALSE;
  267. srcItem.CacheGlobalData (CXTPTaskPanel::GetClipboardFormat(), hGlobal);
  268. if (!bCacheTextData)
  269. return TRUE;
  270. CString strText = GetDragText();
  271. if (!strText.IsEmpty())
  272. {
  273. HGLOBAL hGlobalBuff = ::GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, strText.GetLength() + 1);
  274. if (!hGlobalBuff)
  275. return FALSE;
  276. CHAR* szBuffer = (CHAR*)::GlobalLock(hGlobalBuff);
  277. if (!szBuffer)
  278. return FALSE;
  279. WCSTOMBS_S(szBuffer, strText, strText.GetLength() + 1);
  280. ::GlobalUnlock(hGlobalBuff);
  281. srcItem.CacheGlobalData (CF_TEXT, hGlobalBuff);
  282. }
  283. return TRUE;
  284. }
  285. HRESULT CXTPTaskPanelGroupItem::GetAccessibleState(VARIANT varChild, VARIANT* pvarState)
  286. {
  287. if (GetChildIndex(&varChild) != CHILDID_SELF)
  288. return E_INVALIDARG;
  289. CXTPTaskPanelItem::GetAccessibleState(varChild, pvarState);
  290. pvarState->lVal |= STATE_SYSTEM_SELECTABLE;
  291. if (!GetItemGroup()->IsItemVisible(this, TRUE))
  292. pvarState->lVal |= STATE_SYSTEM_INVISIBLE;
  293. if (IsItemSelected())
  294. pvarState->lVal |= STATE_SYSTEM_SELECTED;
  295. return S_OK;
  296. }
  297. HRESULT CXTPTaskPanelGroupItem::AccessibleSelect(long flagsSelect, VARIANT varChild)
  298. {
  299. if (GetChildIndex(&varChild) != CHILDID_SELF)
  300. return E_INVALIDARG;
  301. if (flagsSelect == SELFLAG_TAKEFOCUS)
  302. {
  303. GetTaskPanel()->SetFocusedItem(this);
  304. }
  305. if (flagsSelect == SELFLAG_TAKESELECTION)
  306. {
  307. SetItemSelected(TRUE);
  308. }
  309. return S_OK;
  310. }
  311. HRESULT CXTPTaskPanelGroupItem::GetAccessibleDefaultAction(VARIANT varChild, BSTR* pszDefaultAction)
  312. {
  313. if (GetChildIndex(&varChild) != CHILDID_SELF)
  314. return E_INVALIDARG;
  315. *pszDefaultAction = SysAllocString(L"Click");
  316. return S_OK;
  317. }
  318. HRESULT CXTPTaskPanelGroupItem::AccessibleDoDefaultAction(VARIANT varChild)
  319. {
  320. SAFE_MANAGE_STATE(m_pModuleState);
  321. if (GetChildIndex(&varChild) != CHILDID_SELF)
  322. return E_INVALIDARG;
  323. if (IsAcceptFocus())
  324. {
  325. GetTaskPanel()->SetFocusedItem(this);
  326. }
  327. GetTaskPanel()->OnClick(this);
  328. return S_OK;
  329. }