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

对话框与窗口

开发平台:

Visual C++

  1. // XTPControlGallery.cpp : implementation file.
  2. //
  3. // This file is a part of the XTREME COMMANDBARS 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 "Resource.h"
  23. #include "Common/XTPImageManager.h"
  24. #include "Common/XTPPropExchange.h"
  25. #include "Common/XTPToolTipContext.h"
  26. #include "XTPControls.h"
  27. #include "XTPCommandBar.h"
  28. #include "XTPControlGallery.h"
  29. #include "XTPPaintManager.h"
  30. #include "XTPMouseManager.h"
  31. #include "XTPCommandBars.h"
  32. #define IDSYS_ANIMATE 23346
  33. #ifdef _DEBUG
  34. #define new DEBUG_NEW
  35. #undef THIS_FILE
  36. static char THIS_FILE[] = __FILE__;
  37. #endif
  38. //////////////////////////////////////////////////////////////////////////
  39. // CXTPControlGalleryItem
  40. CXTPControlGalleryItem::CXTPControlGalleryItem()
  41. {
  42. m_pItems = NULL;
  43. m_nId = 0;
  44. m_nIndex = -1;
  45. m_nImage = -1;
  46. m_dwData = 0;
  47. m_bLabel = FALSE;
  48. m_szItem = CSize(0, 0);
  49. }
  50. int CXTPControlGalleryItem::GetIndex() const
  51. {
  52. return m_nIndex;
  53. }
  54. CSize CXTPControlGalleryItem::GetSize()
  55. {
  56. return CSize(m_szItem.cx == 0 ? m_pItems->m_szItem.cx : m_szItem.cx,
  57. m_szItem.cy == 0 ? m_pItems->m_szItem.cy : m_szItem.cy);
  58. }
  59. void CXTPControlGalleryItem::SetSize(CSize szItem)
  60. {
  61. m_szItem = szItem;
  62. }
  63. void CXTPControlGalleryItem::Draw(CDC* pDC, CXTPControlGallery* pGallery, CRect rcItem, BOOL bEnabled, BOOL bSelected, BOOL bPressed, BOOL bChecked)
  64. {
  65. if (IsLabel())
  66. {
  67. pGallery->GetGalleryPaintManager()->
  68. DrawLabel(pDC, this, rcItem);
  69. return;
  70. }
  71. CXTPPaintManager* pPaintManager = pGallery->GetPaintManager();
  72. CXTPImageManagerIcon* pImage = GetImage();
  73. BOOL bDrawImgeAndText = (pImage != NULL && !m_strCaption.IsEmpty()) &&
  74. (pGallery->GetStyle() == xtpButtonIconAndCaption || pGallery->GetStyle() == xtpButtonCaptionAndDescription);
  75. if (bDrawImgeAndText)
  76. {
  77. pPaintManager->DrawRectangle(pDC, rcItem, bSelected, FALSE, bEnabled, FALSE, FALSE, xtpBarTypePopup, xtpBarPopup);
  78. CSize szImage(pImage->GetWidth(), pImage->GetHeight());
  79. int nImageBoxWidth  = max(rcItem.Height() - 4, szImage.cx);
  80. if (bChecked)
  81. {
  82. CRect rcCheckBox(rcItem.left + 2, rcItem.top + 2, rcItem.left + 2 + nImageBoxWidth, rcItem.bottom - 2);
  83. pPaintManager->DrawRectangle(pDC, rcCheckBox, FALSE, FALSE, bEnabled, TRUE, FALSE, xtpBarTypePopup, xtpBarPopup);
  84. }
  85. CPoint pt(rcItem.left + 2 + (nImageBoxWidth - szImage.cx) / 2, (rcItem.top + rcItem.bottom - szImage.cy) / 2);
  86. pImage->Draw(pDC, pt, pImage->GetIcon(bEnabled ? xtpImageNormal : xtpImageDisabled), szImage);
  87. COLORREF clrTextColor = pPaintManager->GetRectangleTextColor(bSelected, FALSE, bEnabled, FALSE, FALSE, xtpBarTypePopup, xtpBarPopup);
  88. pDC->SetTextColor(clrTextColor);
  89. CRect rcText(rcItem);
  90. rcText.left += 2 + nImageBoxWidth + szImage.cx / 3;
  91. if (pGallery->GetStyle() == xtpButtonCaptionAndDescription)
  92. {
  93. CXTPFontDC font(pDC, pPaintManager->GetRegularBoldFont());
  94. pDC->DrawText(m_strCaption, rcText, DT_END_ELLIPSIS | DT_SINGLELINE | DT_TOP | DT_NOPREFIX);
  95. rcText.top += pDC->GetTextExtent(_T("XXX"), 3).cy;
  96. font.SetFont(pPaintManager->GetRegularFont());
  97. pDC->DrawText(m_strDescriptionText, rcText, DT_WORDBREAK | DT_TOP | DT_NOPREFIX);
  98. }
  99. else
  100. {
  101. CXTPFontDC font(pDC, pPaintManager->GetRegularFont());
  102. pDC->DrawText(m_strCaption, rcText, DT_END_ELLIPSIS | DT_SINGLELINE | DT_VCENTER | DT_NOPREFIX);
  103. }
  104. }
  105. else if (pImage)
  106. {
  107. pPaintManager->DrawRectangle(pDC, rcItem, bSelected, bPressed, bEnabled, bChecked, FALSE, xtpBarTypeNormal, xtpBarPopup);
  108. CSize szImage(pImage->GetWidth(), pImage->GetHeight());
  109. CPoint pt((rcItem.left + rcItem.right - szImage.cx) / 2, (rcItem.top + rcItem.bottom - szImage.cy) / 2);
  110. pImage->Draw(pDC, pt, pImage->GetIcon(bEnabled ? xtpImageNormal : xtpImageDisabled), szImage);
  111. }
  112. else
  113. {
  114. pPaintManager->DrawRectangle(pDC, rcItem, bSelected, FALSE, bEnabled, bChecked, FALSE, xtpBarTypePopup, xtpBarPopup);
  115. COLORREF clrTextColor = pPaintManager->GetRectangleTextColor(bSelected, FALSE, bEnabled, bChecked, FALSE, xtpBarTypePopup, xtpBarPopup);
  116. pDC->SetTextColor(clrTextColor);
  117. CXTPFontDC font(pDC, pPaintManager->GetRegularFont());
  118. CRect rcText(rcItem);
  119. rcText.left += 3;
  120. pDC->DrawText(m_strCaption, rcText, DT_END_ELLIPSIS | DT_SINGLELINE | DT_VCENTER | DT_NOPREFIX);
  121. }
  122. }
  123. CXTPImageManagerIcon* CXTPControlGalleryItem::GetImage()
  124. {
  125. if (!m_pItems)
  126. return NULL;
  127. return m_pItems->GetImageManager()->GetImage(m_nImage >= 0 ? m_nImage : m_nId, 0);
  128. }
  129. //////////////////////////////////////////////////////////////////////////
  130. // CXTPControlGalleryItems
  131. IMPLEMENT_DYNAMIC(CXTPControlGalleryItems, CCmdTarget)
  132. CXTPControlGalleryItems::CXTPControlGalleryItems(CXTPControlAction* pAction)
  133. : m_pAction(pAction)
  134. {
  135. m_szItem = CSize(20, 20);
  136. m_pImageManager = new CXTPImageManager();
  137. m_pImageManager->DrawReverted(2);
  138. m_bClipItems = TRUE;
  139. }
  140. CXTPControlGalleryItems::~CXTPControlGalleryItems()
  141. {
  142. m_pAction = NULL;
  143. RemoveAll();
  144. CMDTARGET_RELEASE(m_pImageManager);
  145. }
  146. void CXTPControlGalleryItems::RemoveAll()
  147. {
  148. for (int i = 0; i < m_arrItems.GetSize(); i++)
  149. {
  150. m_arrItems[i]->InternalRelease();
  151. }
  152. m_arrItems.RemoveAll();
  153. OnItemsChanged();
  154. }
  155. void CXTPControlGalleryItems::Remove(int nIndex)
  156. {
  157. CXTPControlGalleryItem* pItem = GetItem(nIndex);
  158. if (!pItem)
  159. return;
  160. m_arrItems.RemoveAt(nIndex);
  161. pItem->InternalRelease();
  162. UpdateIndexes(nIndex);
  163. OnItemsChanged();
  164. }
  165. void CXTPControlGalleryItems::UpdateIndexes(int nStart /*= 0*/)
  166. {
  167. for (int i = nStart; i < GetItemCount(); i++)
  168. GetItem(i)->m_nIndex = i;
  169. }
  170. CXTPControlGalleryItem* CXTPControlGalleryItems::InsertItem(int nIndex, CXTPControlGalleryItem* pItem, int nId, int nImage)
  171. {
  172. if (!pItem)
  173. return NULL;
  174. if (nIndex < 0 || nIndex > GetItemCount())
  175. nIndex = GetItemCount();
  176. m_arrItems.InsertAt(nIndex, pItem);
  177. UpdateIndexes(nIndex);
  178. pItem->m_pItems = this;
  179. pItem->m_nImage = nImage;
  180. if (nId != -1)
  181. {
  182. pItem->m_nId = nId;
  183. CString strCaption;
  184. if (nId > 0 && strCaption.LoadString(nId))
  185. {
  186. pItem->m_strCaption = pItem->m_strToolTip = strCaption;
  187. }
  188. }
  189. OnItemsChanged();
  190. return pItem;
  191. }
  192. void CXTPControlGalleryItems::OnItemsChanged()
  193. {
  194. if (!m_pAction)
  195. return;
  196. for (int i = 0; i < m_pAction->GetCount(); i++)
  197. {
  198. CXTPControlGallery* pGallery = DYNAMIC_DOWNCAST(CXTPControlGallery, m_pAction->GetControl(i));
  199. if (pGallery)
  200. {
  201. pGallery->m_nSelected = -1;
  202. pGallery->m_nScrollPos = 0;
  203. pGallery->Reposition();
  204. if (pGallery->m_bPreview)
  205. {
  206. pGallery->m_bPreview = FALSE;
  207. pGallery->NotifySite(XTP_GN_PREVIEWCANCEL);
  208. }
  209. }
  210. }
  211. }
  212. CXTPControlGalleryItem* CXTPControlGalleryItems::AddItem(CXTPControlGalleryItem* pItem, int nId, int nImage)
  213. {
  214. return InsertItem(GetItemCount(), pItem, nId, nImage);
  215. }
  216. CXTPControlGalleryItem* CXTPControlGalleryItems::AddItem(int nId, int nImage)
  217. {
  218. return AddItem(new CXTPControlGalleryItem(), nId, nImage);
  219. }
  220. CXTPControlGalleryItem* CXTPControlGalleryItems::AddItem(LPCTSTR lpszCaption, int nImage)
  221. {
  222. CXTPControlGalleryItem* pItem = AddItem(new CXTPControlGalleryItem(), -1, nImage);
  223. pItem->SetCaption(lpszCaption);
  224. return pItem;
  225. }
  226. CXTPControlGalleryItem* CXTPControlGalleryItems::AddItem(LPCTSTR lpszCaption, int nId, int nImage)
  227. {
  228. CXTPControlGalleryItem* pItem = AddItem(nId, nImage);
  229. pItem->SetCaption(lpszCaption);
  230. return pItem;
  231. }
  232. CXTPControlGalleryItem* CXTPControlGalleryItems::AddLabel(int nId)
  233. {
  234. CXTPControlGalleryItem* pItem = AddItem(new CXTPControlGalleryItem(), nId);
  235. pItem->m_bLabel = TRUE;
  236. return pItem;
  237. }
  238. CXTPControlGalleryItem* CXTPControlGalleryItems::AddLabel(LPCTSTR lpszCaption)
  239. {
  240. CXTPControlGalleryItem* pItem = AddItem(new CXTPControlGalleryItem());
  241. pItem->SetCaption(lpszCaption);
  242. pItem->m_bLabel = TRUE;
  243. return pItem;
  244. }
  245. int CXTPControlGalleryItems::GetItemCount() const
  246. {
  247. return (int)m_arrItems.GetSize();
  248. }
  249. CXTPControlGalleryItem* CXTPControlGalleryItems::GetItem(int nIndex) const
  250. {
  251. return nIndex >= 0 && nIndex < GetItemCount() ? m_arrItems.GetAt(nIndex) : NULL;
  252. }
  253. void CXTPControlGalleryItems::SetImageManager(CXTPImageManager* pImageManager)
  254. {
  255. CMDTARGET_RELEASE(m_pImageManager);
  256. m_pImageManager = pImageManager;
  257. }
  258. BOOL CXTPControlGalleryItems::PreDrawItem(CDC* pDC, CXTPControlGallery* pGallery, CXTPControlGalleryItem* pItem, CRect rcItem,
  259. BOOL bEnabled, BOOL bSelected, BOOL bPressed, BOOL bChecked)
  260. {
  261. UNREFERENCED_PARAMETER(pDC);
  262. UNREFERENCED_PARAMETER(pGallery);
  263. UNREFERENCED_PARAMETER(pItem);
  264. UNREFERENCED_PARAMETER(rcItem);
  265. UNREFERENCED_PARAMETER(bEnabled);
  266. UNREFERENCED_PARAMETER(bSelected);
  267. UNREFERENCED_PARAMETER(bPressed);
  268. UNREFERENCED_PARAMETER(bChecked);
  269. return FALSE;
  270. }
  271. //////////////////////////////////////////////////////////////////////////
  272. // CXTPControlGallery
  273. IMPLEMENT_XTP_CONTROL(CXTPControlGallery, CXTPControlPopup)
  274. CXTPControlGallery::CXTPControlGallery()
  275. {
  276. m_nChecked = -1;
  277. m_nSelected = -1;
  278. m_bPressed = FALSE;
  279. m_bKeyboardSelected = FALSE;
  280. m_bHideSelection = FALSE;
  281. m_nScrollPos = 0;
  282. m_nTotalHeight = 0;
  283. m_bShowLabels = TRUE;
  284. m_nWidth = 120;
  285. m_nHeight = 60;
  286. m_rcMargin.SetRectEmpty();
  287. m_ptPressed = CPoint(0, 0);
  288. m_bShowScrollBar = TRUE;
  289. m_bShowBorders = FALSE;
  290. m_bShowShadow = FALSE;
  291. m_bPreview = FALSE;
  292. m_nResizable = 0;
  293. m_controlType = xtpControlGallery;
  294. m_bAnimation = FALSE;
  295. m_nScrollPosTarget = 0;
  296. m_dAnimationStep = 0;
  297. SetFlags(xtpFlagShowPopupBarTip);
  298. }
  299. CXTPControlGalleryItems* CXTPControlGalleryItems::CreateItems(CXTPCommandBars* pCommandBars, int nId)
  300. {
  301. CXTPControlAction* pAction = pCommandBars->CreateAction(nId);
  302. if (pAction->m_pTarget == NULL)
  303. {
  304. pAction->m_pTarget = new CXTPControlGalleryItems(pAction);
  305. }
  306. ASSERT_KINDOF(CXTPControlGalleryItems, pAction->m_pTarget);
  307. return (CXTPControlGalleryItems*)pAction->m_pTarget;
  308. }
  309. CXTPControlGalleryItems* CXTPControlGallery::GetItems() const
  310. {
  311. CXTPControlAction* pAction = GetAction();
  312. if (!pAction)
  313. return NULL;
  314. return (CXTPControlGalleryItems*)pAction->m_pTarget;
  315. }
  316. CXTPControlGallery::~CXTPControlGallery()
  317. {
  318. }
  319. int CXTPControlGallery::GetCustomizeMinWidth() const
  320. {
  321. if (!m_pParent || !GetItems())
  322. return 0;
  323. if (DYNAMIC_DOWNCAST(CXTPPopupBar, m_pParent))
  324. {
  325. CXTPControl* pParentControl = ((CXTPPopupBar*)m_pParent)->GetControlPopup();
  326. if (pParentControl && pParentControl->GetType() == xtpControlGallery)
  327. return pParentControl->GetRect().Width();
  328. }
  329. CRect rcBorders(GetBorders());
  330. return max(16, GetItems()->m_szItem.cx) + rcBorders.left + rcBorders.right;
  331. }
  332. int CXTPControlGallery::GetCustomizeMinHeight() const
  333. {
  334. if (!m_pParent || !GetItems())
  335. return 0;
  336. CRect rcBorders(GetBorders());
  337. int nHeight = GetItems()->m_szItem.cy + rcBorders.top + rcBorders.bottom;
  338. return max(nHeight, 32);
  339. }
  340. void CXTPControlGallery::SetAction(CXTPControlAction* pAction)
  341. {
  342. CXTPControlPopup::SetAction(pAction);
  343. Reposition();
  344. }
  345. BOOL CXTPControlGallery::IsShowAsButton() const
  346. {
  347. return GetStyle() == xtpButtonIconAndCaptionBelow || GetStyle() == xtpButtonIcon;
  348. }
  349. void CXTPControlGallery::SetItems(CXTPControlGalleryItems* pItems)
  350. {
  351. if (pItems)
  352. {
  353. SetAction(pItems->m_pAction);
  354. }
  355. }
  356. void CXTPControlGallery::Reposition()
  357. {
  358. if (GetParent() == NULL)
  359. return;
  360. if (IsShowAsButton())
  361. return;
  362. CRect rcItems = GetItemsRect();
  363. int x = rcItems.left;
  364. int y = rcItems.top;
  365. BOOL bFirstItem = TRUE;
  366. int nCount = GetItemCount();
  367. m_arrRects.SetSize(nCount);
  368. int nRowHeight = 0;
  369. for (int i = 0 ; i < nCount; i++)
  370. {
  371. CXTPControlGalleryItem* pItem = GetItem(i);
  372. m_arrRects[i].pItem = pItem;
  373. m_arrRects[i].bBeginRow = FALSE;
  374. if (pItem->IsLabel())
  375. {
  376. if (!m_bShowLabels)
  377. {
  378. m_arrRects[i].rcItem = CRect(0, 0, 0, 0);
  379. continue;
  380. }
  381. if (!bFirstItem)
  382. {
  383. y += nRowHeight;
  384. }
  385. CRect rcItem(rcItems.left, y, rcItems.right, y + 19);
  386. m_arrRects[i].rcItem = rcItem;
  387. m_arrRects[i].bBeginRow = TRUE;
  388. y += 20;
  389. nRowHeight = 0;
  390. x = rcItems.left;
  391. bFirstItem = TRUE;
  392. }
  393. else
  394. {
  395. CSize szItem = pItem->GetSize();
  396. if (szItem.cx == 0)
  397. szItem.cx = rcItems.Width();
  398. if (bFirstItem)
  399. {
  400. m_arrRects[i].bBeginRow = TRUE;
  401. }
  402. if (!bFirstItem && x + szItem.cx > rcItems.right)
  403. {
  404. y += nRowHeight;
  405. x = rcItems.left;
  406. m_arrRects[i].bBeginRow = TRUE;
  407. nRowHeight = 0;
  408. }
  409. CRect rcItem(x, y, x + szItem.cx, y + szItem.cy);
  410. m_arrRects[i].rcItem = rcItem;
  411. nRowHeight = max(nRowHeight, szItem.cy);
  412. bFirstItem = FALSE;
  413. x += szItem.cx;
  414. }
  415. }
  416. if (!bFirstItem)
  417. y += nRowHeight;
  418. m_nTotalHeight = y - rcItems.top;
  419. if (m_nScrollPos > m_nTotalHeight - rcItems.Height())
  420. m_nScrollPos = max(0, m_nTotalHeight - rcItems.Height());
  421. SetupScrollInfo();
  422. }
  423. void CXTPControlGallery::SetCheckedItem(int nId)
  424. {
  425. if (m_nChecked != nId)
  426. {
  427. m_nChecked = nId;
  428. InvalidateItems();
  429. }
  430. }
  431. int CXTPControlGallery::GetCheckedItem() const
  432. {
  433. return m_nChecked;
  434. }
  435. int CXTPControlGallery::GetSelectedItem() const
  436. {
  437. return m_nSelected;
  438. }
  439. int CXTPControlGallery::GetItemCount() const
  440. {
  441. CXTPControlGalleryItems* pItems = GetItems();
  442. return pItems ? pItems->GetItemCount() : 0;
  443. }
  444. CXTPControlGalleryItem* CXTPControlGallery::GetItem(int nIndex) const
  445. {
  446. CXTPControlGalleryItems* pItems = GetItems();
  447. return pItems ? pItems->GetItem(nIndex) : NULL;
  448. }
  449. void CXTPControlGallery::DrawItems(CDC* pDC)
  450. {
  451. CXTPControlGalleryItems* pItems = GetItems();
  452. if (!pItems)
  453. return;
  454. ASSERT(m_arrRects.GetSize() == pItems->GetItemCount());
  455. CRect rcItems = GetItemsRect();
  456. CRgn rgn;
  457. CPoint point = pDC->GetViewportOrg();
  458. CRect rcClipBox(rcItems);
  459. rcClipBox.OffsetRect(point);
  460. rgn.CreateRectRgnIndirect(rcClipBox);
  461. pDC->SelectClipRgn(&rgn);
  462. int nSelected = m_bHideSelection ? -1 : m_nSelected;
  463. for (int i = 0; i < m_arrRects.GetSize(); i++)
  464. {
  465. const GALLERYITEM_POSITION& pos = m_arrRects[i];
  466. CRect rcItem = pos.rcItem;
  467. rcItem.OffsetRect(0, -m_nScrollPos);
  468. if (rcItem.bottom < rcItems.top)
  469. continue;
  470. if (!rcItem.IsRectEmpty())
  471. {
  472. if (!pItems->PreDrawItem(pDC, this, pos.pItem, rcItem, GetEnabled(), nSelected == i, nSelected == i && m_bPressed, m_nChecked == pos.pItem->GetID()))
  473. {
  474. pos.pItem->Draw(pDC, this, rcItem, GetEnabled(), nSelected == i, nSelected == i && m_bPressed, m_nChecked == pos.pItem->GetID());
  475. }
  476. }
  477. if (rcItem.top > rcItems.bottom)
  478. break;
  479. }
  480. pDC->SelectClipRgn(NULL);
  481. }
  482. int CXTPControlGallery::HitTestItem(CPoint point, LPRECT lpRect) const
  483. {
  484. if (!GetEnabled())
  485. return -1;
  486. if (IsShowAsButton())
  487. return -1;
  488. ASSERT(m_arrRects.GetSize() == GetItemCount());
  489. CRect rcItems = GetItemsRect();
  490. for (int i = 0; i < m_arrRects.GetSize(); i++)
  491. {
  492. const GALLERYITEM_POSITION& pos = m_arrRects[i];
  493. CRect rcItem = pos.rcItem;
  494. rcItem.OffsetRect(0, -m_nScrollPos);
  495. if (rcItem.top >= rcItems.bottom)
  496. break;
  497. if (rcItem.PtInRect(point))
  498. {
  499. if (lpRect)
  500. {
  501. *lpRect = rcItem;
  502. }
  503. return pos.pItem->IsLabel() ? -1 : i;
  504. }
  505. }
  506. return -1;
  507. }
  508. void CXTPControlGallery::InvalidateItems(LPCRECT lpRect, BOOL bAnimate)
  509. {
  510. GetParent()->Redraw(lpRect ? lpRect : GetRect(), bAnimate);
  511. }
  512. void CXTPControlGallery::OnExecute()
  513. {
  514. if (m_bPreview)
  515. {
  516. NotifySite(XTP_GN_PREVIEWAPPLY);
  517. m_bPreview = FALSE;
  518. }
  519. CXTPControlPopup::OnExecute();
  520. }
  521. BOOL CXTPControlGallery::OnSetPopup(BOOL bPopup)
  522. {
  523. if (m_bPreview)
  524. {
  525. NotifySite(XTP_GN_PREVIEWCANCEL);
  526. m_bPreview = FALSE;
  527. }
  528. return CXTPControlPopup::OnSetPopup(bPopup);
  529. }
  530. void CXTPControlGallery::OnMouseHover()
  531. {
  532. if (IsItemSelected() && !m_bPreview && GetSelected())
  533. {
  534. m_bPreview = TRUE;
  535. NotifySite(XTP_GN_PREVIEWSTART);
  536. NotifySite(XTP_GN_PREVIEWCHANGE);
  537. }
  538. if (!m_pParent->m_bTrackOnHover)
  539. return;
  540. CXTPControlPopup::OnMouseHover();
  541. }
  542. void CXTPControlGallery::PerformMouseMove(CPoint point)
  543. {
  544. int nItem = HitTestItem(point);
  545. if (nItem == -1 && m_bKeyboardSelected)
  546. return;
  547. if (nItem == -1 && point == CPoint(-1, -1) && m_nSelected != -1)
  548. {
  549. HideSelection();
  550. return;
  551. }
  552. int nSelected = m_nSelected;
  553. if (nItem != m_nSelected || m_bHideSelection || m_bKeyboardSelected)
  554. {
  555. m_nSelected = nItem;
  556. m_bHideSelection = FALSE;
  557. m_bKeyboardSelected = FALSE;
  558. m_bPressed = FALSE;
  559. CXTPControlGalleryItems* pItems = GetItems();
  560. if (pItems && pItems->m_bClipItems)
  561. {
  562. if (nSelected != -1)
  563. {
  564. InvalidateItems(GetItemDrawRect(nSelected), TRUE);
  565. }
  566. if (m_nSelected != -1)
  567. {
  568. InvalidateItems(GetItemDrawRect(m_nSelected), FALSE);
  569. }
  570. }
  571. else
  572. {
  573. InvalidateItems();
  574. }
  575. if (!m_bPreview && m_nSelected != -1)
  576. {
  577. m_pParent->SetTimer(XTP_TID_HOVER, 200, NULL);
  578. }
  579. if (m_bPreview)
  580. {
  581. NotifySite(XTP_GN_PREVIEWCHANGE);
  582. }
  583. if (m_nSelected == -1 && m_bPreview)
  584. {
  585. m_bPreview = FALSE;
  586. NotifySite(XTP_GN_PREVIEWCANCEL);
  587. }
  588. OnSelectedItemChanged();
  589. }
  590. if (m_bPressed && (m_ptPressed != CPoint(0, 0)) && (m_nSelected != -1) &&
  591. (abs(m_ptPressed.x - point.x) > 4 || abs(m_ptPressed.y - point.y) > 4))
  592. {
  593. m_ptPressed = CPoint(0, 0);
  594. NotifySite(XTP_GN_STARTDRAG);
  595. }
  596. }
  597. void CXTPControlGallery::PerformMouseDown(CPoint point)
  598. {
  599. if (m_nSelected != -1 && !m_bKeyboardSelected)
  600. {
  601. m_bPressed = TRUE;
  602. m_ptPressed = point;
  603. InvalidateItems();
  604. }
  605. }
  606. void CXTPControlGallery::PerformMouseUp(CPoint /*point*/)
  607. {
  608. if (m_bPressed || (GetParent()->GetPosition() == xtpBarPopup && IsItemSelected()))
  609. {
  610. m_bPressed = FALSE;
  611. InvalidateItems();
  612. OnExecute();
  613. }
  614. }
  615. BOOL CXTPControlGallery::HasBottomSeparator() const
  616. {
  617. if (GetParent()->GetType() != xtpBarTypePopup)
  618. return FALSE;
  619. if (m_bShowBorders)
  620. return FALSE;
  621. int nIndex = GetIndex();
  622. int nNextIndex = GetParent()->GetControls()->GetNext(nIndex, +1, TRUE);
  623. return nNextIndex > nIndex;
  624. }
  625. CRect CXTPControlGallery::GetItemDrawRect(int nIndex)
  626. {
  627. if (nIndex < 0 || nIndex >= m_arrRects.GetSize())
  628. return CRect(0, 0, 0, 0);
  629. CRect rc(m_arrRects[nIndex].rcItem);
  630. rc.OffsetRect(0, -m_nScrollPos);
  631. rc.IntersectRect(rc, GetItemsRect());
  632. return rc;
  633. }
  634. CRect CXTPControlGallery::GetBorders() const
  635. {
  636. CRect rcBorders(0, 0, 0, 0);
  637. if (m_bShowBorders)
  638. {
  639. rcBorders.SetRect(1, 1, 1, 1);
  640. }
  641. if (m_pParent && m_bShowScrollBar)
  642. {
  643. rcBorders.right += (GetCommandBar() ? GetGalleryPaintManager()->m_cxPopup : GetGalleryPaintManager()->m_cxVScroll);
  644. }
  645. if (m_pParent && HasBottomSeparator())
  646. {
  647. rcBorders.bottom = 2;
  648. }
  649. rcBorders.DeflateRect(m_rcMargin.left, m_rcMargin.top, -m_rcMargin.right, -m_rcMargin.bottom);
  650. return rcBorders;
  651. }
  652. CXTPControlGalleryPaintManager* CXTPControlGallery::GetGalleryPaintManager() const
  653. {
  654. return GetPaintManager()->GetGalleryPaintManager();
  655. }
  656. CXTPScrollBarPaintManager* CXTPControlGallery::GetScrollBarPaintManager() const
  657. {
  658. return GetPaintManager()->GetGalleryPaintManager();
  659. }
  660. void CXTPControlGallery::SetResizable(BOOL bResizeWidth, BOOL bResizeHeight)
  661. {
  662. m_nResizable = (bResizeWidth ? 1 : 0) +  (bResizeHeight ? 2 : 0);
  663. }
  664. CRect CXTPControlGallery::GetItemsRect() const
  665. {
  666. CRect rc = GetRect();
  667. rc.DeflateRect(GetBorders());
  668. return rc;
  669. }
  670. void CXTPControlGallery::FillControl(CDC* pDC, CRect rcControl)
  671. {
  672. GetGalleryPaintManager()->FillControl(pDC, this, rcControl);
  673. }
  674. void CXTPControlGallery::DoAnimate()
  675. {
  676. if (abs(m_nScrollPos - m_nScrollPosTarget) > fabs(m_dAnimationStep))
  677. {
  678. m_nScrollPos = int((double)m_nScrollPos + m_dAnimationStep);
  679. }
  680. else
  681. {
  682. m_bAnimation = FALSE;
  683. m_nScrollPos = m_nScrollPosTarget;
  684. ::KillTimer(GetParent()->GetSafeHwnd(), IDSYS_ANIMATE);
  685. }
  686. Reposition();
  687. OnScrollChanged();
  688. InvalidateItems(NULL, FALSE);
  689. GetParent()->UpdateWindow();
  690. }
  691. void CXTPControlGallery::StartAnimation(int nScrollPos)
  692. {
  693. CRect rcItems = GetItemsRect();
  694. if (nScrollPos > m_nTotalHeight - rcItems.Height())
  695. nScrollPos = m_nTotalHeight - rcItems.Height();
  696. if (nScrollPos < 0)
  697. nScrollPos = 0;
  698. if (m_bAnimation && m_nScrollPosTarget == nScrollPos)
  699. return;
  700. if (!m_bAnimation && m_nScrollPos == nScrollPos)
  701. return;
  702. m_bAnimation = TRUE;
  703. m_nScrollPosTarget = nScrollPos;
  704. m_dAnimationStep = double(m_nScrollPosTarget - m_nScrollPos) / (m_nTimerElapse > 200 ? 8.0 : 3.0);
  705. if (m_dAnimationStep > 0 && m_dAnimationStep < 1) m_dAnimationStep = 1;
  706. if (m_dAnimationStep < 0 && m_dAnimationStep > -1) m_dAnimationStep = -1;
  707. UINT nms = 40;
  708. SetTimer(GetParent()->GetSafeHwnd(), IDSYS_ANIMATE, nms, NULL);
  709. DoAnimate();
  710. }
  711. void CXTPControlGallery::SetScrollPos(int nScrollPos)
  712. {
  713. CRect rcItems = GetItemsRect();
  714. if (nScrollPos > m_nTotalHeight - rcItems.Height())
  715. nScrollPos = m_nTotalHeight - rcItems.Height();
  716. if (nScrollPos < 0)
  717. nScrollPos = 0;
  718. if (m_bAnimation)
  719. {
  720. m_bAnimation = FALSE;
  721. ::KillTimer(GetParent()->GetSafeHwnd(), IDSYS_ANIMATE);
  722. m_nScrollPos = -1;
  723. }
  724. if (m_nScrollPos == nScrollPos)
  725. return;
  726. m_nScrollPos = nScrollPos;
  727. Reposition();
  728. OnScrollChanged();
  729. InvalidateItems(NULL, FALSE);
  730. }
  731. void CXTPControlGallery::EnsureVisible(int nIndex)
  732. {
  733. if (!GetParent()->GetSafeHwnd())
  734. return;
  735. if (GetItemCount() == 0 || nIndex == -1 || nIndex >= GetItemCount() || nIndex >= (int)m_arrRects.GetSize())
  736. return;
  737. const GALLERYITEM_POSITION& pos = m_arrRects[nIndex];
  738. CRect rcItem = pos.rcItem;
  739. rcItem.OffsetRect(0, -m_nScrollPos);
  740. CRect rcItems = GetItemsRect();
  741. if (rcItem.top < rcItems.top)
  742. {
  743. int nScrollPos = pos.rcItem.top - rcItems.top;
  744. if (m_bShowLabels)
  745. {
  746. for (int i = nIndex - 1; i >= 0; i--)
  747. {
  748. const GALLERYITEM_POSITION& posLabel = m_arrRects[i];
  749. if (posLabel.pItem->IsLabel() && pos.rcItem.top - posLabel.rcItem.top <= rcItems.Height() - rcItem.Height())
  750. {
  751. nScrollPos = posLabel.rcItem.top - rcItems.top;
  752. break;
  753. }
  754. if (pos.rcItem.top - posLabel.rcItem.top > rcItems.Height()  - rcItem.Height())
  755. break;
  756. }
  757. }
  758. SetScrollPos(nScrollPos);
  759. }
  760. else if (rcItem.bottom > rcItems.bottom)
  761. {
  762. SetScrollPos(pos.rcItem.bottom - rcItems.bottom);
  763. }
  764. }
  765. long CXTPControlGallery::GetNextInRow(long nIndex, int nDirection) const
  766. {
  767. if (GetItemCount() == 0 || nIndex == -1 || nIndex >= GetItemCount())
  768. return -1;
  769. CRect rcItems = GetItemsRect();
  770. CSize szItem = GetItems()->GetItemSize();
  771. if (szItem.cx * 2 > rcItems.Width() || szItem.cx == 0)
  772. return nIndex;
  773. int i;
  774. if (nDirection < 0)
  775. {
  776. if (!m_arrRects[nIndex].bBeginRow)
  777. {
  778. for (i = nIndex - 1; i >= 0; i--)
  779. {
  780. const GALLERYITEM_POSITION& pos = m_arrRects[i];
  781. if (!IsRectEmpty(&pos.rcItem))
  782. {
  783. return i;
  784. }
  785. }
  786. }
  787. for (i = nIndex + 1; i < m_arrRects.GetSize(); i++)
  788. {
  789. const GALLERYITEM_POSITION& pos = m_arrRects[i];
  790. if (pos.bBeginRow)
  791. {
  792. return nIndex;
  793. }
  794. if (!IsRectEmpty(&pos.rcItem))
  795. {
  796. nIndex = i;
  797. }
  798. }
  799. return nIndex;
  800. }
  801. else
  802. {
  803. for (i = nIndex + 1; i < GetItemCount(); i++)
  804. {
  805. const GALLERYITEM_POSITION& pos = m_arrRects[i];
  806. if (!IsRectEmpty(&pos.rcItem) && !pos.bBeginRow)
  807. {
  808. return i;
  809. }
  810. if (pos.bBeginRow)
  811. break;
  812. }
  813. for (i = nIndex; i >= 0; i--)
  814. {
  815. const GALLERYITEM_POSITION& pos = m_arrRects[i];
  816. if (pos.bBeginRow)
  817. {
  818. return i;
  819. }
  820. }
  821. }
  822. return nIndex;
  823. }
  824. long CXTPControlGallery::GetNextInPage(long nIndex, int nDirection) const
  825. {
  826. if (GetItemCount() == 0)
  827. return -1;
  828. if (nIndex == -1 || nIndex >= GetItemCount())
  829. nIndex = GetNext(-1, nDirection);
  830. int i;
  831. RECT rcItem = m_arrRects[nIndex].rcItem;
  832. CRect rcItems = GetItemsRect();
  833. if (nDirection < 0)
  834. {
  835. for (i = nIndex - 1; i >= 0; i--)
  836. {
  837. const GALLERYITEM_POSITION& pos = m_arrRects[i];
  838. if (!pos.pItem->IsLabel() &&
  839. rcItem.top - pos.rcItem.top< rcItems.Height())
  840. {
  841. nIndex = i;
  842. }
  843. if (rcItem.top - pos.rcItem.top> rcItems.Height())
  844. return nIndex;
  845. }
  846. }
  847. else
  848. {
  849. for (i = nIndex + 1; i < GetItemCount(); i++)
  850. {
  851. const GALLERYITEM_POSITION& pos = m_arrRects[i];
  852. if (!pos.pItem->IsLabel() &&
  853. pos.rcItem.bottom - rcItem.bottom < rcItems.Height())
  854. {
  855. nIndex = i;
  856. }
  857. if (pos.rcItem.bottom - rcItem.bottom > rcItems.Height())
  858. return nIndex;
  859. }
  860. }
  861. return nIndex;
  862. }
  863. long CXTPControlGallery::GetNextInColumn(long nIndex, int nDirection) const
  864. {
  865. if (GetItemCount() == 0)
  866. return -1;
  867. if (nIndex == -1 || nIndex >= GetItemCount())
  868. return GetNext(-1, nDirection);
  869. int i;
  870. RECT rcItem = m_arrRects[nIndex].rcItem;
  871. if (nDirection < 0)
  872. {
  873. for (i = nIndex - 1; i >= 0; i--)
  874. {
  875. const GALLERYITEM_POSITION& pos = m_arrRects[i];
  876. if (!pos.pItem->IsLabel() && pos.rcItem.left == rcItem.left)
  877. {
  878. return i;
  879. }
  880. }
  881. }
  882. else
  883. {
  884. for (i = nIndex + 1; i < GetItemCount(); i++)
  885. {
  886. const GALLERYITEM_POSITION& pos = m_arrRects[i];
  887. if (!pos.pItem->IsLabel() && pos.rcItem.left == rcItem.left)
  888. {
  889. return i;
  890. }
  891. }
  892. }
  893. return -1;
  894. }
  895. long CXTPControlGallery::GetNext(long nIndex, int nDirection) const
  896. {
  897. ASSERT(nDirection == +1 || nDirection == -1);
  898. if (GetItemCount() == 0) return -1;
  899. long nNext = nIndex + nDirection;
  900. if (nDirection == -1 && nIndex == -1)
  901. {
  902. nNext = GetItemCount() - 1;
  903. }
  904. BOOL bCircle = FALSE;
  905. while (nNext != nIndex)
  906. {
  907. if (nNext >= GetItemCount())
  908. {
  909. if ((nIndex == -1 && nDirection == +1) || bCircle) return -1;
  910. nNext = 0;
  911. bCircle = TRUE;
  912. }
  913. if (nNext < 0)
  914. {
  915. if ((nIndex == -1 && nDirection == -1) || bCircle) return -1;
  916. nNext = GetItemCount() - 1;
  917. bCircle = TRUE;
  918. }
  919. if (!GetItem(nNext)->IsLabel())
  920. {
  921. return nNext;
  922. }
  923. nNext += nDirection;
  924. }
  925. return nNext;
  926. }
  927. void CXTPControlGallery::SetSelectedItem(int nItem)
  928. {
  929. int nSelected = m_nSelected;
  930. m_bHideSelection = FALSE;
  931. m_nSelected = nItem;
  932. m_bPressed = FALSE;
  933. m_bKeyboardSelected = TRUE;
  934. CXTPControlGalleryItems* pItems = GetItems();
  935. if (pItems && pItems->m_bClipItems && nSelected != -1)
  936. {
  937. InvalidateItems(GetItemDrawRect(nSelected), TRUE);
  938. }
  939. EnsureVisible(m_nSelected);
  940. if (pItems && pItems->m_bClipItems && m_nSelected != -1)
  941. {
  942. InvalidateItems(GetItemDrawRect(m_nSelected), FALSE);
  943. }
  944. if (!pItems || !pItems->m_bClipItems)
  945. {
  946. InvalidateItems();
  947. }
  948. if (m_nSelected != -1)
  949. {
  950. AccessibleNotifyWinEvent(EVENT_OBJECT_FOCUS , GetParent()->GetSafeHwnd(), GetID(), m_nSelected + 1);
  951. }
  952. if (m_nSelected != -1 && !m_bPreview)
  953. {
  954. m_bPreview = TRUE;
  955. NotifySite(XTP_GN_PREVIEWSTART);
  956. }
  957. if (m_bPreview)
  958. {
  959. NotifySite(XTP_GN_PREVIEWCHANGE);
  960. }
  961. if (m_nSelected == -1 && m_bPreview)
  962. {
  963. m_bPreview = FALSE;
  964. NotifySite(XTP_GN_PREVIEWCANCEL);
  965. }
  966. OnSelectedItemChanged();
  967. }
  968. int CXTPControlGallery::FindItem(int nStartAfter, LPCTSTR lpszItem, BOOL bExact) const
  969. {
  970. if (GetItemCount() == 0)
  971. return -1;
  972. UINT len1 = lpszItem ? (UINT)_tcslen(lpszItem) : 0;
  973. if (len1 < 1)
  974. return -1;
  975. int nItem = nStartAfter + 1;
  976. if (nItem >= GetItemCount())
  977. nItem = 0;
  978. if (nItem < 0)
  979. nItem = 0;
  980. int nStop = nItem;
  981. do
  982. {
  983. CXTPControlGalleryItem* pItem = GetItem(nItem);
  984. if (bExact )
  985. {
  986. if (pItem->GetCaption().CompareNoCase(lpszItem) == 0)
  987. return nItem;
  988. }
  989. else
  990. {
  991. UINT len2 = pItem->GetCaption().GetLength();
  992. int nResult = CompareString(LOCALE_SYSTEM_DEFAULT, NORM_IGNORECASE, lpszItem, min(len1,len2),
  993. pItem->GetCaption(), min(len1,len2));
  994. if (nResult == CSTR_EQUAL)
  995. {
  996. if (len1 <= len2)
  997. {
  998. return nItem;
  999. }
  1000. }
  1001. }
  1002. if (++nItem == GetItemCount())
  1003. nItem = 0;
  1004. } while (nItem != nStop);
  1005. return -1;
  1006. }
  1007. int CXTPControlGallery::GetScrollPos() const
  1008. {
  1009. return m_nScrollPos;
  1010. }
  1011. int CXTPControlGallery::SetTopIndex(int nIndex)
  1012. {
  1013. if (nIndex == -1 || nIndex > m_arrRects.GetSize())
  1014. return -1;
  1015. SetScrollPos(m_arrRects[nIndex].rcItem.top);
  1016. return 0;
  1017. }
  1018. CString CXTPControlGallery::GetItemCaption(int nIndex)
  1019. {
  1020. CXTPControlGalleryItem* pItem = GetItem(nIndex);
  1021. if (pItem)
  1022. return pItem->GetCaption();
  1023. return _T("");
  1024. }
  1025. void CXTPControlGallery::DoScroll(int cmd, int pos)
  1026. {
  1027. int y = m_bAnimation ? m_nScrollPosTarget : m_nScrollPos;
  1028. CRect rcItems = GetItemsRect();
  1029. CXTPControlGalleryItems* pItems = GetItems();
  1030. if (!pItems)
  1031. return;
  1032. switch (cmd)
  1033. {
  1034. case SB_TOP:
  1035. y = 0;
  1036. break;
  1037. case SB_BOTTOM:
  1038. y = m_nTotalHeight;
  1039. break;
  1040. case SB_LINEUP:
  1041. y -= pItems->GetItemSize().cy;
  1042. break;
  1043. case SB_LINEDOWN:
  1044. y += pItems->GetItemSize().cy;
  1045. break;
  1046. case SB_PAGEUP:
  1047. y -= rcItems.Height();
  1048. break;
  1049. case SB_PAGEDOWN:
  1050. y += rcItems.Height();
  1051. break;
  1052. case SB_THUMBTRACK:
  1053. y = pos;
  1054. break;
  1055. }
  1056. if (GetCommandBar() && (cmd == SB_LINEUP || cmd == SB_LINEDOWN || cmd == SB_ENDSCROLL))
  1057. {
  1058. StartAnimation(y);
  1059. }
  1060. else
  1061. {
  1062. SetScrollPos(y);
  1063. }
  1064. }
  1065. void CXTPControlGallery::GetScrollInfo(SCROLLINFO* pSI)
  1066. {
  1067. CRect rcItems = GetItemsRect();
  1068. pSI->nMin = 0;
  1069. pSI->nMax = max(0, m_nTotalHeight - 1);
  1070. pSI->nPos = m_nScrollPos;
  1071. pSI->nPage = rcItems.Height();
  1072. }
  1073. //////////////////////////////////////////////////////////////////////////
  1074. CSize CXTPControlGallery::GetSize(CDC* pDC)
  1075. {
  1076. if (IsShowAsButton())
  1077. {
  1078. int nWidth = m_nWidth, nHeight = m_nHeight;
  1079. m_nWidth = m_nHeight = 0;
  1080. CSize sz = CXTPControlPopup::GetSize(pDC);
  1081. m_nWidth = nWidth; m_nHeight = nHeight;
  1082. return sz;
  1083. }
  1084. return CSize(max(IsResizable() ? GetCustomizeMinWidth() : 0, m_nWidth), m_nHeight);
  1085. }
  1086. void CXTPControlGallery::RedrawScrollBar()
  1087. {
  1088. InvalidateItems(NULL, FALSE);
  1089. }
  1090. void CXTPControlGallery::DrawScrollBar(CDC* pDC)
  1091. {
  1092. if (GetCommandBar())
  1093. GetGalleryPaintManager()->DrawPopupScrollBar(pDC, this);
  1094. else
  1095. GetGalleryPaintManager()->DrawScrollBar(pDC, this);
  1096. }
  1097. void CXTPControlGallery::Draw(CDC* pDC)
  1098. {
  1099. if (IsShowAsButton())
  1100. {
  1101. CXTPControlPopup::Draw(pDC);
  1102. return;
  1103. }
  1104. FillControl(pDC, m_rcControl);
  1105. DrawItems(pDC);
  1106. if (m_bShowScrollBar)
  1107. {
  1108. DrawScrollBar(pDC);
  1109. }
  1110. }
  1111. void CXTPControlGallery::OnMouseMove(CPoint point)
  1112. {
  1113. if (IsShowAsButton())
  1114. {
  1115. CXTPControlPopup::OnMouseMove(point);
  1116. return;
  1117. }
  1118. PerformMouseMove(point);
  1119. int ht = HitTestScrollBar(point);
  1120. if (ht != m_spi.ht)
  1121. {
  1122. m_spi.ht = ht;
  1123. RedrawParent();
  1124. }
  1125. }
  1126. void CXTPControlGallery::HideSelection()
  1127. {
  1128. m_bHideSelection = TRUE;
  1129. m_bKeyboardSelected = FALSE;
  1130. if (m_nSelected != -1)
  1131. {
  1132. CXTPControlGalleryItems* pItems = GetItems();
  1133. if (pItems && pItems->m_bClipItems)
  1134. {
  1135. InvalidateItems(GetItemDrawRect(m_nSelected), FALSE);
  1136. }
  1137. else
  1138. {
  1139. InvalidateItems();
  1140. }
  1141. }
  1142. if (m_bPreview && m_nSelected != -1)
  1143. {
  1144. NotifySite(XTP_GN_PREVIEWCHANGE);
  1145. }
  1146. if (m_bPreview)
  1147. {
  1148. m_bPreview = FALSE;
  1149. NotifySite(XTP_GN_PREVIEWCANCEL);
  1150. }
  1151. OnSelectedItemChanged();
  1152. }
  1153. void CXTPControlGallery::OnSelectedItemChanged()
  1154. {
  1155. NotifySite(XTP_GN_SELCHANGE);
  1156. }
  1157. BOOL CXTPControlGallery::OnSetSelected(int bSelected)
  1158. {
  1159. if (IsShowAsButton())
  1160. {
  1161. return CXTPControlPopup::OnSetSelected(bSelected);
  1162. }
  1163. if (!bSelected)
  1164. {
  1165. m_bPressed = FALSE;
  1166. m_spi.ht = HTNOWHERE;
  1167. HideSelection();
  1168. }
  1169. if (IsKeyboardSelected(bSelected) && !IsItemSelected())
  1170. {
  1171. if (GetCommandBar() == NULL)
  1172. {
  1173. SetSelectedItem(GetNext(-1, bSelected == TRUE_KEYBOARD_PREV ? -1 : +1));
  1174. }
  1175. else
  1176. {
  1177. SetSelectedItem(-1);
  1178. }
  1179. }
  1180. return CXTPControl::OnSetSelected(bSelected);
  1181. }
  1182. BOOL CXTPControlGallery::IsFocused() const
  1183. {
  1184. return IsShowAsButton() ? FALSE : GetSelected();
  1185. }
  1186. BOOL CXTPControlGallery::OnHookKeyDown(UINT nChar, LPARAM /*lParam*/)
  1187. {
  1188. ASSERT(IsFocused());
  1189. if (!IsFocused())
  1190. return FALSE;
  1191. if (m_nSelected == -1 && GetCommandBar() != NULL)
  1192. {
  1193. if (nChar == VK_RETURN || nChar == VK_SPACE)
  1194. {
  1195. GetParent()->SetPopuped(m_nIndex);
  1196. return TRUE;
  1197. }
  1198. return FALSE;
  1199. }
  1200. int nSelected;
  1201. CXTPDrawHelpers::KeyToLayout(CXTPControl::GetParent(), nChar);
  1202. switch (nChar)
  1203. {
  1204. case VK_HOME:
  1205. SetSelectedItem(GetNext(-1, +1));
  1206. return TRUE;
  1207. case VK_END:
  1208. SetSelectedItem(GetNext(-1, -1));
  1209. return TRUE;
  1210. case VK_LEFT:
  1211. SetSelectedItem(GetNextInRow(m_nSelected, -1));
  1212. return TRUE;
  1213. case VK_RIGHT:
  1214. SetSelectedItem(GetNextInRow(m_nSelected, +1));
  1215. return TRUE;
  1216. case VK_UP:
  1217. nSelected = GetNextInColumn(m_nSelected, -1);
  1218. if (nSelected == -1 && GetControls()->GetNext(m_nIndex, -1) == m_nIndex)
  1219. {
  1220. nSelected = GetNext(-1, -1);
  1221. }
  1222. if (nSelected != -1)
  1223. {
  1224. SetSelectedItem(nSelected);
  1225. return TRUE;
  1226. }
  1227. return FALSE;
  1228. case VK_PRIOR:
  1229. SetSelectedItem(GetNextInPage(m_nSelected, -1));
  1230. return TRUE;
  1231. case VK_NEXT:
  1232. SetSelectedItem(GetNextInPage(m_nSelected, +1));
  1233. return TRUE;
  1234. case VK_DOWN:
  1235. nSelected = GetNextInColumn(m_nSelected, +1);
  1236. if (nSelected == -1 && GetControls()->GetNext(m_nIndex, +1) == m_nIndex)
  1237. {
  1238. nSelected = GetNext(-1, +1);
  1239. }
  1240. if (nSelected != -1)
  1241. {
  1242. SetSelectedItem(nSelected);
  1243. return TRUE;
  1244. }
  1245. return FALSE;
  1246. case VK_TAB:
  1247. if (GetKeyState(VK_SHIFT) >= 0)
  1248. {
  1249. nSelected = GetNext(m_nSelected, +1);
  1250. if (nSelected > m_nSelected)
  1251. {
  1252. SetSelectedItem(nSelected);
  1253. return TRUE;
  1254. }
  1255. }
  1256. else
  1257. {
  1258. nSelected = GetNext(m_nSelected, -1);
  1259. if (nSelected < m_nSelected)
  1260. {
  1261. SetSelectedItem(nSelected);
  1262. return TRUE;
  1263. }
  1264. }
  1265. return FALSE;
  1266. case VK_RETURN:
  1267. OnExecute();
  1268. break;
  1269. }
  1270. return FALSE;
  1271. }
  1272. BOOL CXTPControlGallery::OnHookMouseWheel(UINT /*nFlags*/, short zDelta, CPoint /*pt*/)
  1273. {
  1274. CXTPControlGalleryItems* pItems = GetItems();
  1275. if (!pItems)
  1276. return FALSE;
  1277. SetScrollPos(m_nScrollPos + (zDelta < 0 ? 3 * pItems->GetItemSize().cy : -3 * pItems->GetItemSize().cy));
  1278. return TRUE;
  1279. }
  1280. void CXTPControlGallery::OnScrollChanged()
  1281. {
  1282. SetupScrollInfo();
  1283. }
  1284. void CXTPControlGallery::OnClick(BOOL bKeyboard /*= FALSE*/, CPoint point /*= CPoint(0, 0)*/)
  1285. {
  1286. if (IsShowAsButton())
  1287. {
  1288. CXTPControlPopup::OnClick(bKeyboard, point);
  1289. return;
  1290. }
  1291. if (IsCustomizeMode())
  1292. {
  1293. m_pParent->SetPopuped(-1);
  1294. m_pParent->SetSelected(-1);
  1295. CustomizeStartDrag(point);
  1296. return;
  1297. }
  1298. if (!GetEnabled())
  1299. return;
  1300. if (!bKeyboard)
  1301. {
  1302. OnMouseMove(point);
  1303. if (m_spi.ht == XTP_HTSCROLLPOPUP)
  1304. {
  1305. m_pParent->SetPopuped(m_nIndex);
  1306. }
  1307. else if (m_spi.ht != HTNOWHERE)
  1308. {
  1309. PerformTrackInit(CXTPControl::GetParent()->GetSafeHwnd(), point, &m_spi, (GetKeyState(VK_SHIFT) < 0) ? TRUE : FALSE);
  1310. }
  1311. else
  1312. {
  1313. m_pParent->SetPopuped(-1);
  1314. PerformMouseDown(point);
  1315. }
  1316. }
  1317. else
  1318. {
  1319. }
  1320. }
  1321. void CXTPControlGallery::OnLButtonUp(CPoint point)
  1322. {
  1323. if (IsShowAsButton())
  1324. {
  1325. CXTPControlPopup::OnLButtonUp(point);
  1326. }
  1327. else
  1328. {
  1329. PerformMouseUp(point);
  1330. }
  1331. }
  1332. CRect CXTPControlGallery::GetScrollBarRect()
  1333. {
  1334. if (!m_bShowScrollBar)
  1335. return CRect(0, 0, 0, 0);
  1336. CRect rc(m_rcControl);
  1337. rc.left = rc.right - (GetCommandBar() ? GetGalleryPaintManager()->m_cxPopup :
  1338. GetGalleryPaintManager()->m_cxVScroll);
  1339. if (m_bShowBorders)
  1340. {
  1341. rc.top++;
  1342. rc.bottom--;
  1343. rc.right--;
  1344. rc.left--;
  1345. }
  1346. if (HasBottomSeparator())
  1347. rc.bottom -= 2;
  1348. return rc;
  1349. }
  1350. void CXTPControlGallery::CalcScrollBarInfo(LPRECT lprc, SCROLLBARPOSINFO* pSBInfo, SCROLLINFO* pSI)
  1351. {
  1352. if (GetCommandBar())
  1353. {
  1354. pSBInfo->rc = *lprc;
  1355. pSBInfo->pxTop = lprc->top;
  1356. pSBInfo->pxBottom = lprc->bottom;
  1357. pSBInfo->pxLeft = lprc->left;
  1358. pSBInfo->pxRight = lprc->right;
  1359. pSBInfo->pos = pSI->nPos;
  1360. pSBInfo->page = pSI->nPage;
  1361. pSBInfo->posMin = pSI->nMin;
  1362. pSBInfo->posMax = pSI->nMax;
  1363. pSBInfo->pxDownArrow = pSBInfo->pxUpArrow  = pSBInfo->pxTop + GetGalleryPaintManager()->m_cyPopupUp;
  1364. pSBInfo->pxPopup = pSBInfo->pxDownArrow + GetGalleryPaintManager()->m_cyPopupDown;
  1365. }
  1366. else
  1367. {
  1368. CXTPScrollBase::CalcScrollBarInfo(lprc, pSBInfo, pSI);
  1369. }
  1370. }
  1371. CWnd* CXTPControlGallery::GetParentWindow() const
  1372. {
  1373. return CXTPControl::GetParent();
  1374. }
  1375. void CXTPControlGallery::SetRect(CRect rcControl)
  1376. {
  1377. if (m_rcControl == rcControl)
  1378. return;
  1379. CXTPControl::SetRect(rcControl);
  1380. Reposition();
  1381. }
  1382. void CXTPControlGallery::Copy(CXTPControl* pControl, BOOL bRecursive)
  1383. {
  1384. ASSERT(DYNAMIC_DOWNCAST(CXTPControlGallery, pControl));
  1385. CXTPControlPopup::Copy(pControl, bRecursive);
  1386. CXTPControlGallery* pGallery = (CXTPControlGallery*)pControl;
  1387. m_bShowLabels = pGallery->m_bShowLabels;
  1388. m_bShowBorders = pGallery->m_bShowBorders;
  1389. m_bShowScrollBar = pGallery->m_bShowScrollBar;
  1390. m_rcMargin = pGallery->m_rcMargin;
  1391. m_nResizable = pGallery->m_nResizable;
  1392. }
  1393. void CXTPControlGallery::DoPropExchange(CXTPPropExchange* pPX)
  1394. {
  1395. CXTPControlPopup::DoPropExchange(pPX);
  1396. PX_Bool(pPX, _T("ShowLabels"), m_bShowLabels, TRUE);
  1397. PX_Bool(pPX, _T("ShowBorders"), m_bShowBorders, TRUE);
  1398. PX_Bool(pPX, _T("ShowScrollBar"), m_bShowScrollBar, TRUE);
  1399. PX_Rect(pPX, _T("GalleryMargin"), m_rcMargin, CRect(0, 0, 0, 0));
  1400. if (pPX->GetSchema() > _XTP_SCHEMA_110)
  1401. {
  1402. PX_Int(pPX, _T("Resizable"), m_nResizable, 0);
  1403. }
  1404. }
  1405. INT_PTR CXTPControlGallery::OnToolHitTest(CPoint point, TOOLINFO* pTI) const
  1406. {
  1407. if (IsShowAsButton() || GetItems() == NULL)
  1408. {
  1409. return -1;
  1410. }
  1411. RECT rcItem;
  1412. int nIndex = HitTestItem(point, &rcItem);
  1413. if (nIndex != -1)
  1414. {
  1415. CXTPControlGalleryItem* pItem = GetItem(nIndex);
  1416. INT_PTR nHit = pItem->m_nImage >= 0 ? pItem->m_nImage : pItem->m_nId;
  1417. CXTPToolTipContext::FillInToolInfo(pTI, GetParent()->GetSafeHwnd(), rcItem, nHit,
  1418. pItem->GetToolTip(), pItem->GetToolTip(), pItem->GetDescription(), GetItems()->GetImageManager());
  1419. return nHit;
  1420. }
  1421. return 0;
  1422. }
  1423. BOOL CXTPControlGallery::IsScrollBarEnabled() const
  1424. {
  1425. return GetEnabled();
  1426. }
  1427. BOOL CXTPControlGallery::IsScrollButtonEnabled(int ht)
  1428. {
  1429. if (!GetEnabled())
  1430. return FALSE;
  1431. if (!GetCommandBar())
  1432. return TRUE;
  1433. if (ht == XTP_HTSCROLLUP)
  1434. {
  1435. return m_nScrollPos > 0;
  1436. }
  1437. else if (ht == XTP_HTSCROLLDOWN)
  1438. {
  1439. CRect rcItems = GetItemsRect();
  1440. return m_nScrollPos < m_nTotalHeight - rcItems.Height();
  1441. }
  1442. else
  1443. {
  1444. ASSERT(FALSE);
  1445. }
  1446. return TRUE;
  1447. }
  1448. void CXTPControlGallery::SetItemsMargin(int nLeft, int nTop, int nRight, int nBottom)
  1449. {
  1450. m_rcMargin.SetRect(nLeft, nTop, nRight, nBottom);
  1451. }
  1452. void CXTPControlGallery::AdjustExcludeRect(CRect& rc, BOOL bVertical)
  1453. {
  1454. if (IsShowAsButton())
  1455. {
  1456. CXTPControlPopup::AdjustExcludeRect(rc, bVertical);
  1457. }
  1458. else
  1459. {
  1460. rc.SetRect(m_rcControl.left - 1, m_rcControl.top, m_rcControl.left - 1, m_rcControl.top);
  1461. }
  1462. }
  1463. HRESULT CXTPControlGallery::GetAccessibleChildCount(long FAR* pChildCount)
  1464. {
  1465. if (pChildCount == 0)
  1466. return E_INVALIDARG;
  1467. *pChildCount = GetItemCount();
  1468. return S_OK;
  1469. }
  1470. HRESULT CXTPControlGallery::GetAccessibleChild(VARIANT /*varChild*/, IDispatch* FAR* ppdispChild)
  1471. {
  1472. SAFE_MANAGE_STATE(m_pModuleState);
  1473. *ppdispChild = NULL;
  1474. return S_FALSE;
  1475. }
  1476. HRESULT CXTPControlGallery::GetAccessibleName(VARIANT varChild, BSTR* pszName)
  1477. {
  1478. SAFE_MANAGE_STATE(m_pModuleState);
  1479. int nIndex = GetChildIndex(&varChild);
  1480. if (nIndex == CHILDID_SELF)
  1481. return CXTPControl::GetAccessibleName(varChild, pszName);
  1482. CXTPControlGalleryItem* pItem = GetItem(nIndex - 1);
  1483. if (!pItem)
  1484. return E_INVALIDARG;
  1485. CString strCaption = pItem->GetCaption();
  1486. CXTPDrawHelpers::StripMnemonics(strCaption);
  1487. if (strCaption.IsEmpty())
  1488. {
  1489. strCaption = pItem->GetToolTip();
  1490. }
  1491. *pszName = strCaption.AllocSysString();
  1492. return S_OK;
  1493. }
  1494. HRESULT CXTPControlGallery::GetAccessibleRole(VARIANT varChild, VARIANT* pvarRole)
  1495. {
  1496. pvarRole->vt = VT_I4;
  1497. pvarRole->lVal = GetChildIndex(&varChild) == CHILDID_SELF ? ROLE_SYSTEM_LISTITEM : ROLE_SYSTEM_LIST;
  1498. return S_OK;
  1499. }
  1500. HRESULT CXTPControlGallery::AccessibleSelect(long flagsSelect, VARIANT varChild)
  1501. {
  1502. SAFE_MANAGE_STATE(m_pModuleState);
  1503. int nIndex = GetChildIndex(&varChild);
  1504. if (nIndex == CHILDID_SELF)
  1505. return CXTPControl::AccessibleSelect(flagsSelect, varChild);
  1506. SetSelectedItem(nIndex - 1);
  1507. return S_OK;
  1508. }
  1509. HRESULT CXTPControlGallery::GetAccessibleState(VARIANT varChild, VARIANT* pvarState)
  1510. {
  1511. int nIndex = GetChildIndex(&varChild);
  1512. if (nIndex == CHILDID_SELF)
  1513. return CXTPControl::GetAccessibleState(varChild, pvarState);
  1514. CXTPControlGalleryItem* pItem = GetItem(nIndex - 1);
  1515. if (!pItem)
  1516. return E_INVALIDARG;
  1517. pvarState->vt = VT_I4;
  1518. pvarState->lVal = STATE_SYSTEM_FOCUSABLE | STATE_SYSTEM_SELECTABLE;
  1519. if (m_nSelected == pItem->GetIndex())
  1520. pvarState->lVal |= STATE_SYSTEM_FOCUSED;
  1521. if (m_nChecked == pItem->GetID())
  1522. pvarState->lVal |= STATE_SYSTEM_SELECTED;
  1523. return S_OK;
  1524. }
  1525. HRESULT CXTPControlGallery::GetAccessibleDefaultAction(VARIANT varChild, BSTR* pszDefaultAction)
  1526. {
  1527. if (GetChildIndex(&varChild) == CHILDID_SELF)
  1528. return CXTPControl::GetAccessibleDefaultAction(varChild, pszDefaultAction);
  1529. *pszDefaultAction = SysAllocString(L"Click");
  1530. return S_OK;
  1531. }
  1532. HRESULT CXTPControlGallery::AccessibleDoDefaultAction(VARIANT varChild)
  1533. {
  1534. SAFE_MANAGE_STATE(m_pModuleState);
  1535. int nIndex = GetChildIndex(&varChild);
  1536. if (nIndex == CHILDID_SELF)
  1537. return CXTPControl::AccessibleDoDefaultAction(varChild);
  1538. CXTPControlGalleryItem* pItem = GetItem(nIndex - 1);
  1539. if (!pItem)
  1540. return E_INVALIDARG;
  1541. SetSelectedItem(nIndex - 1);
  1542. return S_OK;
  1543. }
  1544. HRESULT CXTPControlGallery::AccessibleLocation(long* pxLeft, long* pyTop, long* pcxWidth, long* pcyHeight, VARIANT varChild)
  1545. {
  1546. *pxLeft = *pyTop = *pcxWidth = *pcyHeight = 0;
  1547. int nIndex = GetChildIndex(&varChild);
  1548. if (!m_pParent->GetSafeHwnd())
  1549. return S_OK;
  1550. if (!IsVisible())
  1551. return S_OK;
  1552. CRect rcControl = GetRect();
  1553. if (nIndex != CHILDID_SELF)
  1554. {
  1555. rcControl = GetItemDrawRect(nIndex - 1);
  1556. }
  1557. m_pParent->ClientToScreen(&rcControl);
  1558. *pxLeft = rcControl.left;
  1559. *pyTop = rcControl.top;
  1560. *pcxWidth = rcControl.Width();
  1561. *pcyHeight = rcControl.Height();
  1562. return S_OK;
  1563. }
  1564. HRESULT CXTPControlGallery::AccessibleHitTest(long xLeft, long yTop, VARIANT* pvarID)
  1565. {
  1566. if (pvarID == NULL)
  1567. return E_INVALIDARG;
  1568. pvarID->vt = VT_EMPTY;
  1569. if (!m_pParent->GetSafeHwnd())
  1570. return S_FALSE;
  1571. if (!CXTPWindowRect(m_pParent).PtInRect(CPoint(xLeft, yTop)))
  1572. return S_FALSE;
  1573. pvarID->vt = VT_I4;
  1574. pvarID->lVal = CHILDID_SELF;
  1575. CPoint pt(xLeft, yTop);
  1576. m_pParent->ScreenToClient(&pt);
  1577. if (!GetRect().PtInRect(pt))
  1578. return S_FALSE;
  1579. int nIndex = HitTestItem(pt);
  1580. if (nIndex != -1)
  1581. {
  1582. pvarID->lVal = nIndex + 1;
  1583. }
  1584. return S_OK;
  1585. }
  1586. //////////////////////////////////////////////////////////////////////////
  1587. // CXTPControlComboBoxGalleryPopupBar
  1588. IMPLEMENT_XTP_COMMANDBAR(CXTPControlComboBoxGalleryPopupBar, CXTPControlComboBoxPopupBar)
  1589. CXTPControlComboBoxGalleryPopupBar::CXTPControlComboBoxGalleryPopupBar()
  1590. {
  1591. }
  1592. CXTPControlComboBoxGalleryPopupBar* AFX_CDECL CXTPControlComboBoxGalleryPopupBar::CreateComboBoxGalleryPopupBar(CXTPCommandBars* pCommandBars)
  1593. {
  1594. CXTPControlComboBoxGalleryPopupBar* pPopupBar = new CXTPControlComboBoxGalleryPopupBar();
  1595. pPopupBar->SetCommandBars(pCommandBars);
  1596. return pPopupBar;
  1597. }
  1598. BEGIN_MESSAGE_MAP(CXTPControlComboBoxGalleryPopupBar, CXTPControlComboBoxPopupBar)
  1599. ON_WM_LBUTTONUP()
  1600. END_MESSAGE_MAP()
  1601. CXTPControlGallery* CXTPControlComboBoxGalleryPopupBar::GetGalleryItem() const
  1602. {
  1603. CXTPControl* pItem = GetControl(0);
  1604. ASSERT_KINDOF(CXTPControlGallery, pItem);
  1605. return (CXTPControlGallery*)pItem;
  1606. }
  1607. void CXTPControlComboBoxGalleryPopupBar::OnLButtonUp(UINT nFlags, CPoint point)
  1608. {
  1609. if (GetControls()->HitTest(point) == GetGalleryItem())
  1610. {
  1611. CXTPControlComboBox* pComboBox = (CXTPControlComboBox*)m_pControlPopup;
  1612. pComboBox->OnSelChanged();
  1613. pComboBox->OnExecute();
  1614. return;
  1615. }
  1616. CXTPPopupBar::OnLButtonUp(nFlags, point);
  1617. }
  1618. BOOL CXTPControlComboBoxGalleryPopupBar::SetTrackingMode(int bMode, BOOL bSelectFirst, BOOL bKeyboard)
  1619. {
  1620. CXTPControlComboBox* pComboBox = ((CXTPControlComboBox*)m_pControlPopup);
  1621. if (!CXTPPopupBar::SetTrackingMode(bMode, bSelectFirst, bKeyboard))
  1622. return FALSE;
  1623. if (!bMode)
  1624. {
  1625. pComboBox->NotifySite(CBN_CLOSEUP);
  1626. }
  1627. else
  1628. {
  1629. SetSelected(0, TRUE);
  1630. pComboBox->UpdatePopupSelection();
  1631. pComboBox->NotifySite(CBN_DROPDOWN);
  1632. }
  1633. return TRUE;
  1634. }
  1635. BOOL CXTPControlComboBoxGalleryPopupBar::OnHookKeyDown(UINT nChar, LPARAM lParam)
  1636. {
  1637. ASSERT(m_pControlPopup);
  1638. CXTPControlComboBox* pComboBox = ((CXTPControlComboBox*)m_pControlPopup);
  1639. if (!pComboBox)
  1640. return CXTPCommandBar::OnHookKeyDown(nChar, lParam);
  1641. if (nChar == VK_ESCAPE)
  1642. {
  1643. if (pComboBox->IsFocused())
  1644. return FALSE;
  1645. return CXTPCommandBar::OnHookKeyDown(nChar, lParam);
  1646. }
  1647. if (nChar == VK_TAB) return FALSE;
  1648. if (nChar == VK_RETURN)
  1649. {
  1650. if (GetControl(m_nSelected) == GetGalleryItem())
  1651. {
  1652. m_pControlPopup->OnExecute();
  1653. return TRUE;
  1654. }
  1655. }
  1656. return ProcessHookKeyDown(pComboBox, nChar, lParam);
  1657. }
  1658. //////////////////////////////////////////////////////////////////////////
  1659. // CXTPControlGalleryPaintManager
  1660. CXTPControlGalleryPaintManager::CXTPControlGalleryPaintManager(CXTPPaintManager* pPaintManager)
  1661. : CXTPScrollBarPaintManager(pPaintManager)
  1662. {
  1663. m_cyPopupUp = m_cyPopupDown = 19;
  1664. m_cxPopup = 16;
  1665. }
  1666. void CXTPControlGalleryPaintManager::DrawLabel(CDC* pDC, CXTPControlGalleryItem* pLabel, CRect rcItem)
  1667. {
  1668. CXTPPaintManager* pPaintManager = m_pPaintManager;
  1669. pDC->FillSolidRect(rcItem, pPaintManager->GetXtremeColor(XPCOLOR_LABEL));
  1670. pDC->FillSolidRect(rcItem.left, rcItem.bottom - 1, rcItem.Width(), 1, pPaintManager->GetXtremeColor(XPCOLOR_3DSHADOW));
  1671. CXTPFontDC fnt(pDC, pPaintManager->GetRegularBoldFont());
  1672. CRect rcText(rcItem);
  1673. rcText.DeflateRect(10, 0);
  1674. pDC->SetTextColor(pPaintManager->GetXtremeColor(XPCOLOR_MENUBAR_TEXT));
  1675. pDC->DrawText(pLabel->GetCaption(), rcText, DT_SINGLELINE | DT_VCENTER | DT_END_ELLIPSIS);
  1676. }
  1677. void CXTPControlGalleryPaintManager::FillControl(CDC* pDC, CXTPControlGallery* pGallery, CRect rcControl)
  1678. {
  1679. pDC->FillSolidRect(rcControl, m_pPaintManager->GetXtremeColor(XPCOLOR_MENUBAR_FACE));
  1680. if (pGallery->IsShowBorders())
  1681. {
  1682. pDC->Draw3dRect(rcControl, m_pPaintManager->GetXtremeColor(XPCOLOR_3DSHADOW),
  1683. m_pPaintManager->GetXtremeColor(XPCOLOR_3DSHADOW));
  1684. }
  1685. if (pGallery->HasBottomSeparator())
  1686. {
  1687. pDC->FillSolidRect(rcControl.left, rcControl.bottom - 2, rcControl.Width(), 1, m_pPaintManager->GetXtremeColor(XPCOLOR_SEPARATOR));
  1688. }
  1689. }
  1690. void CXTPControlGalleryPaintManager::RefreshMetrics()
  1691. {
  1692. CXTPScrollBarPaintManager::RefreshMetrics();
  1693. m_cyPopupUp = m_cyPopupDown = 19;
  1694. m_cxPopup = 16;
  1695. }
  1696. void CXTPControlGalleryPaintManager::DrawScrollBar(CDC* pDC, CXTPScrollBase* pGallery)
  1697. {
  1698. CXTPScrollBarPaintManager::DrawScrollBar(pDC, pGallery);
  1699. }
  1700. void CXTPControlGalleryPaintManager::DrawPopupScrollBar(CDC* pDC, CXTPControlGallery* pGallery)
  1701. {
  1702. #define GETPARTSTATE3(ht, bEnabled) 
  1703. (!bEnabled ? 4 : nPressetHt == ht ? 3 : nHotHt == ht ? 2 : 0)
  1704. CXTPControlGallery::SCROLLBARTRACKINFO* pSBTrack = pGallery->GetScrollBarTrackInfo();
  1705. CXTPControlGallery::SCROLLBARPOSINFO* pSBInfo = pGallery->GetScrollBarPosInfo();
  1706. CRect rcScroll = pSBInfo->rc;
  1707. pDC->FillSolidRect(rcScroll, m_pPaintManager->GetXtremeColor(XPCOLOR_TOOLBAR_FACE));
  1708. CRect rcScrollUp(rcScroll.left, rcScroll.top, rcScroll.right, rcScroll.top + m_cyPopupUp);
  1709. CRect rcScrollDown(rcScroll.left, rcScrollUp.bottom, rcScroll.right, rcScrollUp.bottom + m_cyPopupDown);
  1710. CRect rcScrollPopup(rcScroll.left, rcScrollDown.bottom, rcScroll.right, rcScroll.bottom);
  1711. BOOL bControlEnabled = pGallery->GetEnabled();
  1712. BOOL nPressetHt = pSBTrack ? pSBInfo->ht : -1;
  1713. BOOL nHotHt = pSBTrack ? -1 : pSBInfo->ht;
  1714. int nState = GETPARTSTATE3(XTP_HTSCROLLUP, (bControlEnabled && pGallery->IsScrollButtonEnabled(XTP_HTSCROLLUP)));
  1715. m_pPaintManager->DrawRectangle(pDC, rcScrollUp, nState == 3 || nState == 2, nState == 3, nState != 4, FALSE, FALSE, xtpBarTypeNormal, xtpBarPopup);
  1716. COLORREF clr = m_pPaintManager->GetRectangleTextColor(nState == 2, nState == 3, nState != 4, FALSE, FALSE, xtpBarTypeNormal, xtpBarPopup);
  1717. CPoint pt = rcScrollUp.CenterPoint();
  1718. m_pPaintManager->Triangle(pDC, CPoint(pt.x - 4 , pt.y + 2), CPoint(pt.x + 4, pt.y + 2), CPoint (pt.x, pt.y - 2), clr);
  1719. nState = GETPARTSTATE3(XTP_HTSCROLLDOWN, (bControlEnabled && pGallery->IsScrollButtonEnabled(XTP_HTSCROLLDOWN)));
  1720. m_pPaintManager->DrawRectangle(pDC, rcScrollDown, nState == 3 || nState == 2, nState == 3, nState != 4, FALSE, FALSE, xtpBarTypeNormal, xtpBarPopup);
  1721. clr = m_pPaintManager->GetRectangleTextColor(nState == 2, nState == 3, nState != 4, FALSE, FALSE, xtpBarTypeNormal, xtpBarPopup);
  1722. pt = rcScrollDown.CenterPoint();
  1723. m_pPaintManager->Triangle(pDC, CPoint(pt.x - 4 , pt.y - 2), CPoint(pt.x + 4, pt.y - 2), CPoint (pt.x, pt.y + 2), clr);
  1724. nState = GETPARTSTATE3(XTP_HTSCROLLPOPUP, bControlEnabled);
  1725. m_pPaintManager->DrawRectangle(pDC, rcScrollPopup, nState == 3 || nState == 2, nState == 3, nState != 4, FALSE, FALSE, xtpBarTypeNormal, xtpBarPopup);
  1726. clr = m_pPaintManager->GetRectangleTextColor(nState == 2, nState == 3, nState != 4, FALSE, FALSE, xtpBarTypeNormal, xtpBarPopup);
  1727. pt = rcScrollPopup.CenterPoint();
  1728. m_pPaintManager->Triangle(pDC, CPoint(pt.x - 4 , pt.y - 1), CPoint(pt.x + 4, pt.y - 1), CPoint (pt.x, pt.y + 3), clr);
  1729. pDC->FillSolidRect(pt.x - 4, pt.y - 4, 9, 2, clr);
  1730. }