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

对话框与窗口

开发平台:

Visual C++

  1. // XTPTaskPanelItem.cpp : implementation of the CXTPTaskPanelItem 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/XTPImageManager.h"
  22. #include "Common/XTPPropExchange.h"
  23. #include "Common/XTPDrawHelpers.h"
  24. #include "Common/XTPMarkupRender.h"
  25. #include "XTPTaskPanelItem.h"
  26. #include "XTPTaskPanel.h"
  27. #include "XTPTaskPanelItems.h"
  28. #include "XTPTaskPanelPaintManager.h"
  29. #ifdef _DEBUG
  30. #define new DEBUG_NEW
  31. #undef THIS_FILE
  32. static char THIS_FILE[] = __FILE__;
  33. #endif
  34. /////////////////////////////////////////////////////////////////////////////
  35. // CXTPTaskPanelItem
  36. IMPLEMENT_DYNCREATE(CXTPTaskPanelItem, CCmdTarget)
  37. CXTPTaskPanelItem::CXTPTaskPanelItem()
  38. {
  39. m_pPanel = NULL;
  40. m_pItems = NULL;
  41. m_nIconIndex = -1;
  42. m_nID = 0;
  43. m_bEnabled = TRUE;
  44. m_typeItem = xtpTaskItemTypeLink;
  45. m_bAllowDrop = TRUE;
  46. m_nAllowDrag = xtpTaskItemAllowDragDefault;
  47. m_rcText.SetRectEmpty();
  48. m_nTextFormat = 0;
  49. m_bVisible = TRUE;
  50. m_dwData = 0;
  51. m_rcIconPadding = CXTPTaskPanelPaintManager::rectDefault;
  52. m_pMarkupUIElement = NULL;
  53. EnableAutomation();
  54. }
  55. CXTPTaskPanelItem::~CXTPTaskPanelItem()
  56. {
  57. XTPMarkupReleaseElement(m_pMarkupUIElement);
  58. }
  59. BOOL CXTPTaskPanelItem::IsItemHot() const
  60. {
  61. return m_bEnabled && m_pPanel && m_pPanel->GetHotItem() == this;
  62. }
  63. BOOL CXTPTaskPanelItem::IsItemPressed() const
  64. {
  65. return m_pPanel && m_pPanel->m_pItemPressed == this;
  66. }
  67. BOOL CXTPTaskPanelItem::IsItemDragging() const
  68. {
  69. return m_pPanel && m_pPanel->m_pItemDragging == this;
  70. }
  71. BOOL CXTPTaskPanelItem::IsItemDragOver() const
  72. {
  73. return m_pPanel && m_pPanel->m_pItemDragOver == this;
  74. }
  75. BOOL CXTPTaskPanelItem::IsItemFocused() const
  76. {
  77. return m_pPanel && m_bEnabled && m_pPanel->GetFocusedItem() == this;
  78. }
  79. BOOL CXTPTaskPanelItem::IsAcceptFocus() const
  80. {
  81. return (GetType() != xtpTaskItemTypeText) && m_bEnabled && m_bVisible;
  82. }
  83. void  CXTPTaskPanelItem::SetEnabled(BOOL bEnabled)
  84. {
  85. if (m_bEnabled != bEnabled)
  86. {
  87. m_bEnabled = bEnabled;
  88. RedrawPanel();
  89. }
  90. }
  91. BOOL CXTPTaskPanelItem::GetEnabled() const
  92. {
  93. return m_bEnabled;
  94. }
  95. UINT CXTPTaskPanelItem::GetID() const
  96. {
  97. return m_nID;
  98. }
  99. XTPTaskPanelItemType CXTPTaskPanelItem::GetType() const
  100. {
  101. return m_typeItem;
  102. }
  103. int CXTPTaskPanelItem::GetIconIndex() const
  104. {
  105. return m_nIconIndex;
  106. }
  107. void CXTPTaskPanelItem::SetID(UINT nID)
  108. {
  109. m_nID = nID;
  110. CString strPrompt;
  111. if (strPrompt.LoadString(nID))
  112. {
  113. if (strPrompt.Find('n') != -1)
  114. {
  115. AfxExtractSubString(m_strTooltip, strPrompt, 1);
  116. AfxExtractSubString(m_strCaption, strPrompt, 0);
  117. }
  118. else
  119. {
  120. m_strCaption = strPrompt;
  121. }
  122. }
  123. }
  124. void CXTPTaskPanelItem::SetCaption(LPCTSTR lpszCaption)
  125. {
  126. if (m_strCaption != lpszCaption)
  127. {
  128. m_strCaption = lpszCaption;
  129. XTPMarkupReleaseElement(m_pMarkupUIElement);
  130. CXTPTaskPanel* pTaskPanel = GetTaskPanel();
  131. if (pTaskPanel && pTaskPanel->GetMarkupContext())
  132. {
  133. m_pMarkupUIElement = XTPMarkupParseText(pTaskPanel->GetMarkupContext(), lpszCaption);
  134. }
  135. RepositionPanel();
  136. }
  137. }
  138. void CXTPTaskPanelItem::SetTooltip(LPCTSTR lpstrTooltip)
  139. {
  140. m_strTooltip = lpstrTooltip;
  141. }
  142. void CXTPTaskPanelItem::SetType(XTPTaskPanelItemType typeItem)
  143. {
  144. m_typeItem = typeItem;
  145. RepositionPanel();
  146. }
  147. void CXTPTaskPanelItem::SetIconIndex(int nIndex)
  148. {
  149. if (m_nIconIndex != nIndex)
  150. {
  151. m_nIconIndex = nIndex;
  152. RepositionPanel();
  153. }
  154. }
  155. CXTPTaskPanelPaintManager* CXTPTaskPanelItem::GetPaintManager() const
  156. {
  157. ASSERT(m_pPanel);
  158. return m_pPanel ? m_pPanel->GetPaintManager() : NULL;
  159. }
  160. void CXTPTaskPanelItem::EnsureVisible()
  161. {
  162. SAFE_CALLPTR(m_pPanel, EnsureVisible(this));
  163. }
  164. void CXTPTaskPanelItem::SetVisible(BOOL bVisible)
  165. {
  166. if (m_bVisible != bVisible)
  167. {
  168. m_bVisible = bVisible;
  169. RepositionPanel();
  170. }
  171. }
  172. BOOL CXTPTaskPanelItem::IsVisible() const
  173. {
  174. return this != NULL && m_bVisible;
  175. }
  176. void CXTPTaskPanelItem::RedrawPanel(BOOL bAnimate) const
  177. {
  178. if (m_pPanel && m_pPanel->GetSafeHwnd())
  179. m_pPanel->Redraw(GetInvalidateRect(), bAnimate);
  180. }
  181. void CXTPTaskPanelItem::RepositionPanel() const
  182. {
  183. if (m_pPanel) m_pPanel->Reposition();
  184. }
  185. CXTPImageManagerIcon* CXTPTaskPanelItem::GetImage(int nWidth) const
  186. {
  187. return m_pPanel->GetImageManager()->GetImage(GetIconIndex(), nWidth);
  188. }
  189. void CXTPTaskPanelItem::DoPropExchange(CXTPPropExchange* pPX)
  190. {
  191. if (pPX->IsLoading())
  192. m_pPanel = (CXTPTaskPanel*)pPX->m_dwData;
  193. PX_String(pPX, _T("Caption"), m_strCaption, _T(""));
  194. PX_String(pPX, _T("Tooltip"), m_strTooltip, _T(""));
  195. PX_Long(pPX, _T("Id"), (long&)m_nID, 0);
  196. PX_Enum(pPX, _T("Type"), m_typeItem, xtpTaskItemTypeLink);
  197. PX_Int(pPX, _T("IconIndex"), m_nIconIndex, -1);
  198. PX_Bool(pPX, _T("Enabled"), m_bEnabled, TRUE);
  199. PX_Long(pPX, _T("AllowDrag"), m_nAllowDrag, xtpTaskItemAllowDragDefault);
  200. PX_Bool(pPX, _T("AllowDrop"), m_bAllowDrop, TRUE);
  201. if (pPX->GetSchema() > _XTP_SCHEMA_95)
  202. {
  203. PX_Bool(pPX, _T("Visible"), m_bVisible, TRUE);
  204. PX_Rect(pPX, _T("IconPadding"), m_rcIconPadding, CXTPTaskPanelPaintManager::rectDefault);
  205. }
  206. if (pPX->GetSchema() > _XTP_SCHEMA_100)
  207. {
  208. PX_DWord(pPX, _T("Data"), (DWORD&)m_dwData, 0);
  209. }
  210. }
  211. HGLOBAL CXTPTaskPanelItem::CacheGlobalData()
  212. {
  213. try
  214. {
  215. CSharedFile sharedFile;
  216. CArchive ar (&sharedFile, CArchive::store);
  217. CRuntimeClass* pClass = GetRuntimeClass ();
  218. ASSERT (pClass != NULL);
  219. ar.WriteClass (pClass);
  220. CXTPPropExchangeArchive px(ar);
  221. DoPropExchange(&px);
  222. ar.Close();
  223. return sharedFile.Detach();
  224. }
  225. catch (COleException* pEx)
  226. {
  227. TRACE(_T("CXTPTaskPanelItem::PrepareDrag. OLE exception: %xrn"),
  228. pEx->m_sc);
  229. pEx->Delete ();
  230. }
  231. catch (CArchiveException* pEx)
  232. {
  233. TRACE(_T("CXTPTaskPanelItem::PrepareDrag. Archive exceptionrn"));
  234. pEx->Delete ();
  235. }
  236. return NULL;
  237. }
  238. CXTPTaskPanelItem* CXTPTaskPanelItem::CreateFromOleData(COleDataObject* pDataObject)
  239. {
  240. ASSERT (pDataObject != NULL);
  241. if (!pDataObject)
  242. return NULL;
  243. CFile* pFile = pDataObject->GetFileData(CXTPTaskPanel::GetClipboardFormat());
  244. if (!pFile)
  245. return NULL;
  246. CXTPTaskPanelItem* pItem = CreateFromOleFile(pFile);
  247. delete pFile;
  248. return pItem;
  249. }
  250. CXTPTaskPanelItem* CXTPTaskPanelItem::CreateFromOleFile(CFile* pFile)
  251. {
  252. ASSERT (pFile != NULL);
  253. CXTPTaskPanelItem* pItem = NULL;
  254. try
  255. {
  256. CArchive ar (pFile, CArchive::load);
  257. CRuntimeClass* pClass = ar.ReadClass ();
  258. if (pClass != NULL)
  259. {
  260. pItem = (CXTPTaskPanelItem*) pClass->CreateObject();
  261. if (pItem != NULL)
  262. {
  263. CXTPPropExchangeArchive px(ar);
  264. pItem->DoPropExchange(&px);
  265. }
  266. }
  267. ar.Close ();
  268. return pItem;
  269. }
  270. catch (COleException* pEx)
  271. {
  272. TRACE(_T("CXTPTaskPanelItem::CreateFromOleData. OLE exception: %xrn"),
  273. pEx->m_sc);
  274. pEx->Delete ();
  275. }
  276. catch (CArchiveException* pEx)
  277. {
  278. TRACE(_T("CXTPTaskPanelItem::CreateFromOleData. Archive exceptionrn"));
  279. pEx->Delete ();
  280. }
  281. catch (CNotSupportedException *pEx)
  282. {
  283. TRACE(_T("CXTPTaskPanelItem::CreateFromOleData. "Not Supported" exceptionrn"));
  284. pEx->Delete ();
  285. }
  286. if (pItem != NULL)
  287. {
  288. delete pItem;
  289. }
  290. return NULL;
  291. }
  292. void CXTPTaskPanelItem::CopyToClipboard()
  293. {
  294. if (!m_pPanel->OpenClipboard())
  295. return;
  296. if (!::EmptyClipboard())
  297. {
  298. ::CloseClipboard ();
  299. return;
  300. }
  301. HGLOBAL hGlobal = CacheGlobalData();
  302. if (hGlobal)
  303. {
  304. SetClipboardData(CXTPTaskPanel::GetClipboardFormat(), hGlobal);
  305. }
  306. ::CloseClipboard ();
  307. }
  308. CXTPTaskPanelItem* CXTPTaskPanelItem::PasteFromClipboard()
  309. {
  310. COleDataObject data;
  311. if (!data.AttachClipboard ())
  312. {
  313. return 0;
  314. }
  315. if (!data.IsDataAvailable (CXTPTaskPanel::GetClipboardFormat()))
  316. return 0;
  317. return CXTPTaskPanelItem::CreateFromOleData(&data);
  318. }
  319. void CXTPTaskPanelItem::Remove()
  320. {
  321. m_pItems->Remove(this);
  322. }
  323. int CXTPTaskPanelItem::GetIndex() const
  324. {
  325. return this == NULL ? -1 : m_pItems->GetIndex(this);
  326. }
  327. BOOL CXTPTaskPanelItem::IsAllowDrop() const
  328. {
  329. return m_bAllowDrop && ((CXTPTaskPanelItem*)GetItemGroup())->m_bAllowDrop &&
  330. m_pPanel && m_pPanel->m_bAllowDrop;
  331. }
  332. void CXTPTaskPanelItem::AllowDrop(BOOL bAllowDrop)
  333. {
  334. m_bAllowDrop = bAllowDrop;
  335. }
  336. long CXTPTaskPanelItem::IsAllowDrag() const
  337. {
  338. if (m_nAllowDrag != xtpTaskItemAllowDragDefault)
  339. return m_nAllowDrag;
  340. CXTPTaskPanelItem* pGroup = (CXTPTaskPanelItem*)GetItemGroup();
  341. if (pGroup && pGroup->m_nAllowDrag != xtpTaskItemAllowDragDefault)
  342. return pGroup->m_nAllowDrag;
  343. return !m_pPanel || (m_pPanel->m_nAllowDrag == xtpTaskItemAllowDragDefault) ? xtpTaskItemAllowDrag :
  344. m_pPanel->m_nAllowDrag;
  345. }
  346. void CXTPTaskPanelItem::AllowDrag(long nAllowDrag /* = xtpTaskItemAllowDragDefault */)
  347. {
  348. m_nAllowDrag = nAllowDrag;
  349. }
  350. CFont* CXTPTaskPanelItem::GetItemFont() const
  351. {
  352. return m_pPanel->GetPaintManager()->GetItemFont((CXTPTaskPanelItem*)this);
  353. }
  354. void CXTPTaskPanelItem::SetItemFont(LOGFONT* pLogFont)
  355. {
  356. m_fntItem.DeleteObject();
  357. if (pLogFont) m_fntItem.CreateFontIndirect(pLogFont);
  358. }
  359. void CXTPTaskPanelItem::DrawCaptionText(CDC* pDC, CRect rc, UINT nFormat)
  360. {
  361. if (m_pMarkupUIElement)
  362. {
  363. XTPMarkupSetDefaultFont(GetTaskPanel()->GetMarkupContext(),
  364. (HFONT)::GetCurrentObject(pDC->GetSafeHdc(), OBJ_FONT), pDC->GetTextColor());
  365. XTPMarkupRenderElement(m_pMarkupUIElement, pDC->GetSafeHdc(), rc);
  366. }
  367. else
  368. {
  369. pDC->DrawText(GetCaption(), rc, nFormat);
  370. }
  371. }
  372. CSize CXTPTaskPanelItem::GetCaptionTextSize(CDC* pDC, CRect rc, UINT nFormat)
  373. {
  374. if (m_pMarkupUIElement)
  375. {
  376. XTPMarkupSetDefaultFont(GetTaskPanel()->GetMarkupContext(),
  377. (HFONT)::GetCurrentObject(pDC->GetSafeHdc(), OBJ_FONT), COLORREF_NULL);
  378. return XTPMarkupMeasureElement(m_pMarkupUIElement, rc.Width(), INT_MAX);
  379. }
  380. CRect rcText(rc.left, 0, rc.right, 0);
  381. CString strCaption = GetCaption();
  382. pDC->DrawText(strCaption.IsEmpty() ? _T(" ") : strCaption, rcText, (nFormat | DT_CALCRECT));
  383. return strCaption.IsEmpty() ? CSize(0, rcText.Height()) : rcText.Size();
  384. }
  385. void CXTPTaskPanelItem::SetTextRect(CDC* pDC, CRect rc, UINT nFormat)
  386. {
  387. CSize szText = GetCaptionTextSize(pDC, rc, nFormat & (~(DT_END_ELLIPSIS | DT_VCENTER)));
  388. int nDelta = rc.Height() - szText.cy;
  389. int nOffset = nFormat & DT_VCENTER ? nDelta/2 : 0;
  390. rc.DeflateRect(0, nOffset, 0, nDelta - nOffset);
  391. m_nTextFormat = nFormat;
  392. m_rcText = rc;
  393. }
  394. CRect CXTPTaskPanelItem::GetTextRect(UINT* pFormat) const
  395. {
  396. if (pFormat)
  397. *pFormat = m_nTextFormat;
  398. return m_rcText;
  399. }
  400. CRect CXTPTaskPanelItem::GetHitTestRect() const
  401. {
  402. return CRect(0, 0, 0, 0);
  403. }
  404. CRect CXTPTaskPanelItem::GetInvalidateRect() const
  405. {
  406. return GetHitTestRect();
  407. }
  408. BOOL CXTPTaskPanelItem::IsGroup() const
  409. {
  410. return GetType() == xtpTaskItemTypeGroup;
  411. }
  412. CXTPTaskPanelGroup* CXTPTaskPanelItem::GetItemGroup() const
  413. {
  414. return (CXTPTaskPanelGroup*)this;
  415. }
  416. CCmdTarget* CXTPTaskPanelItem::GetAccessible()
  417. {
  418. return this;
  419. }
  420. HRESULT CXTPTaskPanelItem::GetAccessibleParent(IDispatch* FAR* ppdispParent)
  421. {
  422. SAFE_MANAGE_STATE(m_pModuleState);
  423. *ppdispParent = NULL;
  424. return GetTaskPanel()->InternalQueryInterface(&IID_IAccessible, (void**)ppdispParent);
  425. }
  426. HRESULT CXTPTaskPanelItem::GetAccessibleName(VARIANT varChild, BSTR* pszName)
  427. {
  428. if (GetChildIndex(&varChild) != CHILDID_SELF)
  429. return E_INVALIDARG;
  430. CString strCaption = GetCaption();
  431. *pszName = strCaption.AllocSysString();
  432. return S_OK;
  433. }
  434. HRESULT CXTPTaskPanelItem::GetAccessibleDescription(VARIANT varChild, BSTR* pszDescription)
  435. {
  436. if (GetChildIndex(&varChild) != CHILDID_SELF)
  437. return E_INVALIDARG;
  438. *pszDescription = GetTooltip().AllocSysString();
  439. return S_OK;
  440. }
  441. HRESULT CXTPTaskPanelItem::GetAccessibleRole(VARIANT varChild, VARIANT* pvarRole)
  442. {
  443. pvarRole->vt = VT_EMPTY;
  444. if (GetChildIndex(&varChild) == CHILDID_SELF)
  445. {
  446. pvarRole->vt = VT_I4;
  447. pvarRole->lVal = ROLE_SYSTEM_LISTITEM;
  448. return S_OK;
  449. }
  450. return E_INVALIDARG;
  451. }
  452. HRESULT CXTPTaskPanelItem::GetAccessibleState(VARIANT varChild, VARIANT* pvarState)
  453. {
  454. if (GetChildIndex(&varChild) != CHILDID_SELF)
  455. return E_INVALIDARG;
  456. pvarState->vt = VT_I4;
  457. pvarState->lVal = STATE_SYSTEM_FOCUSABLE |
  458. (IsItemFocused() ? STATE_SYSTEM_FOCUSED : 0);
  459. if (!IsVisible())
  460. pvarState->lVal |= STATE_SYSTEM_INVISIBLE;
  461. if (!GetEnabled())
  462. pvarState->lVal |= STATE_SYSTEM_UNAVAILABLE;
  463. return S_OK;
  464. }
  465. HRESULT CXTPTaskPanelItem::AccessibleLocation(long* pxLeft, long* pyTop, long* pcxWidth, long* pcyHeight, VARIANT varChild)
  466. {
  467. *pxLeft = *pyTop = *pcxWidth = *pcyHeight = 0;
  468. if (GetChildIndex(&varChild) != CHILDID_SELF)
  469. return E_INVALIDARG;
  470. if (!GetTaskPanel()->GetSafeHwnd())
  471. return S_OK;
  472. CRect rcItem = GetHitTestRect();
  473. GetTaskPanel()->ClientToScreen(&rcItem);
  474. *pxLeft = rcItem.left;
  475. *pyTop = rcItem.top;
  476. *pcxWidth = rcItem.Width();
  477. *pcyHeight = rcItem.Height();
  478. return S_OK;
  479. }
  480. HRESULT CXTPTaskPanelItem::AccessibleHitTest(long xLeft, long yTop, VARIANT* pvarID)
  481. {
  482. if (pvarID == NULL)
  483. return E_INVALIDARG;
  484. pvarID->vt = VT_EMPTY;
  485. if (!GetTaskPanel()->GetSafeHwnd())
  486. return S_FALSE;
  487. if (!CXTPWindowRect(GetTaskPanel()).PtInRect(CPoint(xLeft, yTop)))
  488. return S_FALSE;
  489. pvarID->vt = VT_I4;
  490. pvarID->lVal = 0;
  491. CPoint pt(xLeft, yTop);
  492. GetTaskPanel()->ScreenToClient(&pt);
  493. if (!GetHitTestRect().PtInRect(pt))
  494. return S_FALSE;
  495. return S_OK;
  496. }
  497. HRESULT CXTPTaskPanelItem::AccessibleSelect(long flagsSelect, VARIANT varChild)
  498. {
  499. if (GetChildIndex(&varChild) != CHILDID_SELF)
  500. return E_INVALIDARG;
  501. if (flagsSelect == SELFLAG_TAKEFOCUS)
  502. {
  503. GetTaskPanel()->SetFocusedItem(this);
  504. }
  505. return S_OK;
  506. }
  507. BEGIN_INTERFACE_MAP(CXTPTaskPanelItem, CCmdTarget)
  508. INTERFACE_PART(CXTPTaskPanelItem, IID_IAccessible, ExternalAccessible)
  509. END_INTERFACE_MAP()