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

对话框与窗口

开发平台:

Visual C++

  1. // XTColorSelectorCtrl.cpp : implementation file
  2. //
  3. // This file is a part of the XTREME CONTROLS 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 "Resource.h"
  22. #include "Common/Resource.h"
  23. #include "Common/XTPVC50Helpers.h"
  24. #include "Common/XTPVC80Helpers.h"
  25. #include "Common/XTPResourceManager.h"
  26. #include "Common/XTPColorManager.h"
  27. #include "Common/XTPDrawHelpers.h"
  28. #include "XTDefines.h"
  29. #include "XTGlobal.h"
  30. #include "XTColorDialog.h"
  31. #include "XTColorSelectorCtrl.h"
  32. #include "XTFunctions.h"
  33. #ifdef _DEBUG
  34. #define new DEBUG_NEW
  35. #undef THIS_FILE
  36. static char THIS_FILE[] = __FILE__;
  37. #endif
  38. CUIntArray CXTColorSelectorCtrl::m_arUserDefColors;
  39. IMPLEMENT_THEME_HOST(CXTColorSelectorCtrl)
  40. IMPLEMENT_THEME_REFRESH(CXTColorSelectorCtrl, CWnd)
  41. /////////////////////////////////////////////////////////////////////////////
  42. // CXTColorSelectorCtrl
  43. CXTColorSelectorCtrl::CXTColorSelectorCtrl()
  44. : CXTThemeManagerStyleHost(GetThemeFactoryClass())
  45. {
  46. m_pColorDlg = NULL;
  47. m_point = CPoint(0, 0);
  48. m_nCols = 8;
  49. m_nCurSel = -1;
  50. m_sizeButton = CSize(18, 18);
  51. m_dwPopup = NULL;
  52. m_pParentWnd = NULL;
  53. m_clrColor = CLR_DEFAULT;
  54. m_clrDefault = CLR_DEFAULT;
  55. m_nPressed = -1;
  56. m_rcBorders = CRect(0, 0, 0, 0);
  57. m_pExtendedColors = NULL;
  58. m_nExtendedColors = 0;
  59. }
  60. CXTColorSelectorCtrl::~CXTColorSelectorCtrl()
  61. {
  62. // Free memory allocated to create color cells.
  63. while (!m_arCells.IsEmpty())
  64. {
  65. COLOR_CELL* pColorCell = m_arCells.RemoveHead();
  66. SAFE_DELETE (pColorCell);
  67. }
  68. }
  69. BEGIN_MESSAGE_MAP(CXTColorSelectorCtrl, CWnd)
  70. //{{AFX_MSG_MAP(CXTColorSelectorCtrl)
  71. ON_WM_CREATE()
  72. ON_WM_PAINT()
  73. ON_WM_MOUSEMOVE()
  74. ON_WM_LBUTTONDOWN()
  75. ON_WM_LBUTTONUP()
  76. ON_WM_KEYDOWN()
  77. ON_WM_ERASEBKGND()
  78. ON_WM_NCHITTEST_EX()
  79. ON_WM_SETFOCUS()
  80. ON_WM_MOUSEACTIVATE()
  81. //}}AFX_MSG_MAP
  82. ON_MESSAGE_VOID(WM_MOUSELEAVE, OnMouseLeave)
  83. END_MESSAGE_MAP()
  84. static XTP_PICK_BUTTON standardColors[] =
  85. {
  86. {   RGB(0x00, 0x00, 0x00), XTP_IDS_CLR_BLACK            },
  87. {   RGB(0x80, 0x80, 0x80), XTP_IDS_CLR_GRAY             },
  88. {   RGB(0x80, 0x00, 0x00), XTP_IDS_CLR_MAROON           },
  89. {   RGB(0x80, 0x80, 0x00), XTP_IDS_CLR_OLIVE            },
  90. {   RGB(0x00, 0x80, 0x00), XTP_IDS_CLR_GREEN            },
  91. {   RGB(0x00, 0x80, 0x80), XTP_IDS_CLR_TEAL             },
  92. {   RGB(0x00, 0x00, 0x80), XTP_IDS_CLR_NAVY             },
  93. {   RGB(0x80, 0x00, 0x80), XTP_IDS_CLR_PURPLE           },
  94. {   RGB(0xFF, 0xFF, 0xFF), XTP_IDS_CLR_WHITE            },
  95. {   RGB(0xC0, 0xC0, 0xC0), XTP_IDS_CLR_SILVER           },
  96. {   RGB(0xFF, 0x00, 0x00), XTP_IDS_CLR_RED              },
  97. {   RGB(0xFF, 0xFF, 0x00), XTP_IDS_CLR_YELLOW           },
  98. {   RGB(0x00, 0xFF, 0x00), XTP_IDS_CLR_LIME             },
  99. {   RGB(0x00, 0xFF, 0xFF), XTP_IDS_CLR_AQUA             },
  100. {   RGB(0x00, 0x00, 0xFF), XTP_IDS_CLR_BLUE             },
  101. {   RGB(0xFF, 0x00, 0xFF), XTP_IDS_CLR_FUCHSIA          },
  102. };
  103. static XTP_PICK_BUTTON extendedColors[] =
  104. {
  105. {   RGB(0x00, 0x00, 0x00), XTP_IDS_CLR_BLACK            },
  106. {   RGB(0x99, 0x33, 0x00), XTP_IDS_CLR_BROWN            },
  107. {   RGB(0x33, 0x33, 0x00), XTP_IDS_CLR_OLIVE_GREEN      },
  108. {   RGB(0x00, 0x33, 0x00), XTP_IDS_CLR_DARK_GREEN       },
  109. {   RGB(0x00, 0x33, 0x66), XTP_IDS_CLR_DARK_TEAL        },
  110. {   RGB(0x00, 0x00, 0x80), XTP_IDS_CLR_DARK_BLUE        },
  111. {   RGB(0x33, 0x33, 0x99), XTP_IDS_CLR_INDIGO           },
  112. {   RGB(0x33, 0x33, 0x33), XTP_IDS_CLR_GRAY80           },
  113. {   RGB(0x80, 0x00, 0x00), XTP_IDS_CLR_DARK_RED         },
  114. {   RGB(0xFF, 0x66, 0x00), XTP_IDS_CLR_ORANGE           },
  115. {   RGB(0x80, 0x80, 0x00), XTP_IDS_CLR_DARK_YELLOW      },
  116. {   RGB(0x00, 0x80, 0x00), XTP_IDS_CLR_GREEN            },
  117. {   RGB(0x00, 0x80, 0x80), XTP_IDS_CLR_TEAL             },
  118. {   RGB(0x00, 0x00, 0xFF), XTP_IDS_CLR_BLUE             },
  119. {   RGB(0x66, 0x66, 0x99), XTP_IDS_CLR_BLUEGRAY         },
  120. {   RGB(0x80, 0x80, 0x80), XTP_IDS_CLR_GRAY50           },
  121. {   RGB(0xFF, 0x00, 0x00), XTP_IDS_CLR_RED              },
  122. {   RGB(0xFF, 0x99, 0x00), XTP_IDS_CLR_LIGHTORANGE      },
  123. {   RGB(0x99, 0xCC, 0x00), XTP_IDS_CLR_LIME             },
  124. {   RGB(0x33, 0x99, 0x66), XTP_IDS_CLR_SEA_GREEN        },
  125. {   RGB(0x33, 0xCC, 0xCC), XTP_IDS_CLR_AQUA             },
  126. {   RGB(0x33, 0x66, 0xFF), XTP_IDS_CLR_LIGHT_BLUE       },
  127. {   RGB(0x80, 0x00, 0x80), XTP_IDS_CLR_VIOLET           },
  128. {   RGB(0x99, 0x99, 0x99), XTP_IDS_CLR_GRAY40           },
  129. {   RGB(0xFF, 0x00, 0xFF), XTP_IDS_CLR_PINK             },
  130. {   RGB(0xFF, 0xCC, 0x00), XTP_IDS_CLR_GOLD             },
  131. {   RGB(0xFF, 0xFF, 0x00), XTP_IDS_CLR_YELLOW           },
  132. {   RGB(0x00, 0xFF, 0x00), XTP_IDS_CLR_BRIGHT_GREEN     },
  133. {   RGB(0x00, 0xFF, 0xFF), XTP_IDS_CLR_TURQUOISE        },
  134. {   RGB(0x00, 0xCC, 0xFF), XTP_IDS_CLR_SKY_BLUE         },
  135. {   RGB(0x99, 0x33, 0x66), XTP_IDS_CLR_PLUM             },
  136. {   RGB(0xC0, 0xC0, 0xC0), XTP_IDS_CLR_GRAY25           },
  137. {   RGB(0xFF, 0x99, 0xCC), XTP_IDS_CLR_ROSE             },
  138. {   RGB(0xFF, 0xCC, 0x99), XTP_IDS_CLR_TAN              },
  139. {   RGB(0xFF, 0xFF, 0x99), XTP_IDS_CLR_LIGHT_YELLOW     },
  140. {   RGB(0xCC, 0xFF, 0xCC), XTP_IDS_CLR_LIGHT_GREEN      },
  141. {   RGB(0xCC, 0xFF, 0xFF), XTP_IDS_CLR_LIGHT_TURQUOISE  },
  142. {   RGB(0x99, 0xCC, 0xFF), XTP_IDS_CLR_PALE_BLUE        },
  143. {   RGB(0xCC, 0x99, 0xFF), XTP_IDS_CLR_LAVENDER         },
  144. {   RGB(0xFF, 0xFF, 0xFF), XTP_IDS_CLR_WHITE            },
  145. };
  146. /////////////////////////////////////////////////////////////////////////////
  147. // CXTColorSelectorCtrl message handlers
  148. CSize CXTColorSelectorCtrl::CalcSize()
  149. {
  150. CSize sz;
  151. sz.cx = (m_sizeButton.cx * m_nCols + m_rcBorders.left + m_rcBorders.right);
  152. sz.cy = m_rcBorders.top + m_rcBorders.bottom;
  153. if ((m_dwPopup & CPS_XT_NOAUTOMATIC) == 0)
  154. {
  155. sz.cy += 27;
  156. }
  157. if (m_pExtendedColors)
  158. {
  159. m_dwPopup |= CPS_XT_EXTENDED;
  160. ASSERT(m_nExtendedColors > 0);
  161. }
  162. if (m_dwPopup & CPS_XT_EXTENDED)
  163. {
  164. int nColors = m_pExtendedColors == NULL ? _countof(extendedColors) : m_nExtendedColors;
  165. sz.cy += ((nColors + m_nCols - 1) / m_nCols) * m_sizeButton.cy;
  166. }
  167. else
  168. {
  169. sz.cy += 22 + 2 * m_sizeButton.cy;
  170. }
  171. if ((m_dwPopup & CPS_XT_MORECOLORS) != 0)
  172. {
  173. sz.cy += 27;
  174. if (m_arUserDefColors.GetSize() > 0)
  175. {
  176. sz.cy += 4 + m_sizeButton.cy;
  177. }
  178. }
  179. return sz;
  180. }
  181. BOOL CXTColorSelectorCtrl::Create(CRect rect, CWnd* pParentWnd, DWORD dwPopup, COLORREF clrColor,
  182. COLORREF clrDefault/*= CLR_DEFAULT*/)
  183. {
  184. m_pParentWnd = pParentWnd;
  185. ASSERT(m_pParentWnd != NULL); // must be valid.
  186. if (!m_pParentWnd)
  187. return FALSE;
  188. AddListener(m_pParentWnd->m_hWnd);
  189. m_dwPopup = dwPopup;
  190. m_clrColor = clrColor;
  191. m_clrDefault = clrDefault;
  192. m_rcWnd = rect;
  193. CSize sz = CalcSize();
  194. if (dwPopup & WS_POPUP)
  195. {
  196. if (m_dwPopup & CPS_XT_RIGHTALIGN)
  197. {
  198. m_rcWnd.left = m_rcWnd.right - sz.cx;
  199. }
  200. else
  201. {
  202. m_rcWnd.right = m_rcWnd.left + sz.cx;
  203. }
  204. m_rcWnd.top = rect.bottom;
  205. m_rcWnd.bottom = m_rcWnd.top + sz.cy;
  206. }
  207. else
  208. {
  209. rect.right = rect.left + sz.cx;
  210. rect.bottom = rect.top + sz.cy;
  211. }
  212. // register the wnd class.
  213. CString wndClass = ::AfxRegisterWndClass(0, AfxGetApp()->LoadStandardCursor(IDC_ARROW));
  214. // call the base class for creation.
  215. if (!CWnd::CreateEx(NULL, wndClass, _T(""), WS_CHILD,
  216. m_rcWnd, m_pParentWnd, 0, NULL))
  217. {
  218. TRACE0("Failed to create color popup window.n");
  219. return FALSE;
  220. }
  221. // Set the font and control ID.
  222. SetFont(&XTAuxData().font);
  223. if ((dwPopup & WS_VISIBLE) && ((m_dwPopup & WS_POPUP) == 0))
  224. {
  225. ShowWindow(SW_SHOWNA);
  226. }
  227. return TRUE;
  228. }
  229. int CXTColorSelectorCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
  230. {
  231. if (CWnd::OnCreate(lpCreateStruct) == -1)
  232. return -1;
  233. int nIndex = -1;
  234. bool bChecked = false;
  235. // Create the ToolTip control.
  236. m_tooltip.Create(this);
  237. m_tooltip.Activate(TRUE);
  238. int nLeft = m_rcBorders.left;
  239. int nTop = m_rcBorders.top;
  240. int nRight = lpCreateStruct->cx - m_rcBorders.right;
  241. int nResID;
  242. COLOR_CELL* pColorCell;
  243. CString strText, strColorToolTip;
  244. if ((m_dwPopup & CPS_XT_NOAUTOMATIC) == 0)
  245. {
  246. nResID = m_dwPopup & CPS_XT_NOFILL ? XTP_IDS_CLR_NOFILL : XTP_IDS_CLR_AUTOMATIC;
  247. VERIFY(XTPResourceManager()->LoadString(&strText, nResID));
  248. int nTipIndex = FIND_S(strText, _T('n'), 0);
  249. if (nTipIndex > 0)
  250. {
  251. strColorToolTip = strText.Mid(nTipIndex + 1);
  252. strText.ReleaseBuffer(nTipIndex);
  253. }
  254. else
  255. {
  256. strColorToolTip = strText;
  257. }
  258. nIndex++;
  259. // Create the automatic color button.
  260. pColorCell = new COLOR_CELL;
  261. STRCPY_S(pColorCell->szText, 256, strText);
  262. pColorCell->nID = nResID;
  263. pColorCell->rect = CRect(nLeft, nTop, nRight, nTop + 23);
  264. pColorCell->nIndex = nIndex;
  265. pColorCell->bChecked = false;
  266. pColorCell->dwStyle = m_dwPopup;
  267. pColorCell->clr = m_clrDefault;
  268. m_arCells.AddTail(pColorCell);
  269. m_tooltip.AddTool(this, strColorToolTip, pColorCell->rect, nResID);
  270. if (!(m_dwPopup & CPS_XT_NOFILL))
  271. {
  272. if (m_clrColor == m_clrDefault)
  273. {
  274. bChecked = true;
  275. pColorCell->bChecked = true;
  276. }
  277. }
  278. else if (m_clrColor == m_clrDefault && m_clrDefault == COLORREF_NULL)
  279. {
  280. bChecked = true;
  281. pColorCell->bChecked = true;
  282. }
  283. nTop += 27;
  284. }
  285. // Create the color pick buttons.
  286. XTP_PICK_BUTTON* pickBtn = (m_dwPopup & CPS_XT_EXTENDED) ? (m_pExtendedColors ? m_pExtendedColors : extendedColors) : standardColors;
  287. int nColors = (m_dwPopup & CPS_XT_EXTENDED) ? (m_pExtendedColors ? m_nExtendedColors : _countof(extendedColors)) : _countof(standardColors);
  288. nTop += ((m_dwPopup & CPS_XT_EXTENDED) ? 0 : 22);
  289. CRect rect(nLeft, nTop, nLeft + m_sizeButton.cx, nTop + m_sizeButton.cy);
  290. int x;
  291. for (x = 0; x < nColors; x++)
  292. {
  293. if (x > 0 && ((x % m_nCols) == 0))
  294. {
  295. nTop += m_sizeButton.cy;
  296. rect = CRect(nLeft, nTop, nLeft + m_sizeButton.cy, nTop + m_sizeButton.cy);
  297. }
  298. nIndex++;
  299. nResID = pickBtn[x].toolTipID;
  300. COLORREF clrColor = pickBtn[x].clrButton;
  301. pColorCell = new COLOR_CELL;
  302. pColorCell->szText[0] = 0;
  303. pColorCell->nID = nResID;
  304. pColorCell->rect = rect;
  305. pColorCell->nIndex = nIndex;
  306. pColorCell->bChecked = false;
  307. pColorCell->dwStyle = CPS_XT_PICKBOX;
  308. pColorCell->clr = clrColor;
  309. m_arCells.AddTail(pColorCell);
  310. VERIFY(XTPResourceManager()->LoadString(&strColorToolTip, nResID));
  311. m_tooltip.AddTool(this, strColorToolTip, pColorCell->rect, nResID);
  312. if ((m_clrColor == clrColor) && !bChecked)
  313. {
  314. bChecked = true;
  315. pColorCell->bChecked = true;
  316. m_nCurSel = pColorCell->nIndex;
  317. }
  318. // offset to next column.
  319. rect.OffsetRect(m_sizeButton.cx, 0);
  320. }
  321. nTop += m_sizeButton.cy;
  322. rect = CRect(nLeft, nTop, nLeft + m_sizeButton.cy, nTop + m_sizeButton.cy);
  323. if (m_dwPopup & CPS_XT_MORECOLORS)
  324. {
  325. // TSF NEU 18.01.02 - user defined colors
  326. if (m_arUserDefColors.GetSize() > 0)
  327. {
  328. rect.OffsetRect(0, 4);
  329. for (x = 0; x < min(m_arUserDefColors.GetSize(), m_nCols); x++)
  330. {
  331. nIndex++;
  332. COLORREF clrColor = m_arUserDefColors.GetAt(x);
  333. pColorCell = new COLOR_CELL;
  334. pColorCell->szText[0] = 0;
  335. pColorCell->nID = 0;
  336. pColorCell->rect = rect;
  337. pColorCell->nIndex = nIndex;
  338. pColorCell->bChecked = false;
  339. pColorCell->dwStyle = CPS_XT_PICKBOX;
  340. pColorCell->clr = clrColor;
  341. m_arCells.AddTail(pColorCell);
  342. m_tooltip.AddTool(this, CXTColorDialog::RGBtoHex(clrColor), pColorCell->rect, 1);
  343. if (m_clrColor == clrColor)
  344. {
  345. bChecked = TRUE;
  346. pColorCell->bChecked = true;
  347. if (!bChecked)
  348. m_nCurSel = pColorCell->nIndex;
  349. }
  350. // offset to next column.
  351. rect.OffsetRect(m_sizeButton.cx, 0);
  352. }
  353. nTop += rect.Height() + 4;
  354. }
  355. nTop += 4;
  356. VERIFY(XTPResourceManager()->LoadString(&strText, XTP_IDS_CLR_MORE));
  357. nIndex++;
  358. pColorCell = new COLOR_CELL;
  359. STRCPY_S(pColorCell->szText, 256, strText);
  360. pColorCell->nID = XTP_IDS_CLR_MORE;
  361. pColorCell->rect = CRect(nLeft, nTop, nRight, nTop + 23);
  362. pColorCell->nIndex = nIndex;
  363. pColorCell->bChecked = false;
  364. pColorCell->dwStyle = CPS_XT_MORECOLORS;
  365. pColorCell->clr = m_clrColor;
  366. CString strMoreColorToolTip = strText;
  367. m_arCells.AddTail(pColorCell);
  368. m_tooltip.AddTool(this, strMoreColorToolTip, pColorCell->rect, 1);
  369. if (m_clrColor != (COLORREF)-1)
  370. {
  371. if (bChecked == false)
  372. {
  373. bChecked = true;
  374. pColorCell->bChecked = true;
  375. }
  376. }
  377. }
  378. m_nCurSel = -1;
  379. return 0;
  380. }
  381. ////////////////////////////////////////////////////////////////////////////////
  382. // CXTColorSelectorCtrl Drawing
  383. BOOL CXTColorSelectorCtrl::IsColorStatic(CDC* pDC) const
  384. {
  385. if ((GetStyle() & WS_CHILD) != 0)
  386. {
  387. CWnd* pWndParent = GetParent();
  388. if (::IsWindow(pWndParent->GetSafeHwnd()))
  389. {
  390. HBRUSH hBrush = (HBRUSH)pWndParent->SendMessage(WM_CTLCOLORSTATIC,
  391. (WPARAM)pDC->GetSafeHdc(), (LPARAM)m_hWnd);
  392. return (hBrush != NULL);
  393. }
  394. }
  395. return FALSE;
  396. }
  397. void CXTColorSelectorCtrl::OnPaint()
  398. {
  399. CPaintDC dc(this); // device context for painting
  400. CXTPClientRect rc(this);
  401. CXTPBufferDC memDC(dc);
  402. GetTheme()->FillBackground(&memDC, rc, this);
  403. DrawColorSelector(&memDC);
  404. }
  405. void CXTColorSelectorCtrl::DrawColorSelector(CDC* pDC)
  406. {
  407. pDC->SetBkMode(TRANSPARENT);
  408. CFont* pOldFont = pDC->SelectObject(&XTAuxData().font);
  409. if ((m_dwPopup & CPS_XT_EXTENDED) == 0)
  410. {
  411. CString strText;
  412. VERIFY(XTPResourceManager()->LoadString(&strText, XT_IDS_STD_COLORS));
  413. int nTop = ((m_dwPopup & CPS_XT_NOAUTOMATIC) == 0) ? 27 : 0;
  414. pDC->TextOut(6, nTop + 4, strText);
  415. }
  416. POSITION pos;
  417. int nIndex = 0;
  418. for (pos = m_arCells.GetHeadPosition(); pos; m_arCells.GetNext(pos))
  419. {
  420. COLOR_CELL* pColorCell = m_arCells.GetAt(pos);
  421. ASSERT(pColorCell != NULL);
  422. BOOL bHighlighted = (((nIndex == m_nCurSel) && (m_nPressed == -1)) || (nIndex == m_nPressed));
  423. BOOL bPressed = ((nIndex == m_nPressed) && (nIndex == m_nCurSel));
  424. GetTheme()->DrawColorCell(pColorCell, pDC, bHighlighted, bPressed);
  425. nIndex++;
  426. }
  427. pDC->SelectObject(pOldFont);
  428. }
  429. ////////////////////////////////////////////////////////////////////////////////
  430. CXTColorSelectorCtrl::COLOR_CELL* CXTColorSelectorCtrl::GetCellFromIndex(int iIndex)
  431. {
  432. POSITION pos = m_arCells.FindIndex(iIndex);
  433. if (pos != NULL)
  434. return m_arCells.GetAt(pos);
  435. return NULL;
  436. }
  437. int CXTColorSelectorCtrl::OnMouseActivate(CWnd* /*pDesktopWnd*/, UINT /*nHitTest*/, UINT /*message*/)
  438. {
  439. return GetStyle() & WS_POPUP ? MA_NOACTIVATE : (int)Default();
  440. }
  441. void CXTColorSelectorCtrl::OnMouseMove(UINT nFlags, CPoint point)
  442. {
  443. if (!IsColorDlgVisible())
  444. {
  445. if (m_point != point)
  446. {
  447. m_point = point;
  448. POSITION pos;
  449. for (pos = m_arCells.GetHeadPosition(); pos; m_arCells.GetNext(pos))
  450. {
  451. COLOR_CELL* pColorCell = m_arCells.GetAt(pos);
  452. ASSERT(pColorCell != NULL);
  453. if (!pColorCell)
  454. continue;
  455. CRect rcItem = pColorCell->rect;
  456. if (rcItem.PtInRect(point))
  457. {
  458. SelectColorCell(pColorCell);
  459. TRACKMOUSEEVENT tme =
  460. {
  461. sizeof(TRACKMOUSEEVENT), TME_LEAVE, m_hWnd
  462. };
  463. _TrackMouseEvent(&tme);
  464. return;
  465. }
  466. }
  467. SelectColorCell(NULL);
  468. }
  469. CWnd::OnMouseMove(nFlags, point);
  470. }
  471. }
  472. void CXTColorSelectorCtrl::OnMouseLeave()
  473. {
  474. if (!IsColorDlgVisible())
  475. {
  476. m_nPressed = m_nCurSel = -1;
  477. Invalidate(FALSE);
  478. }
  479. }
  480. void CXTColorSelectorCtrl::SelectColorCell(COLOR_CELL* pColorCell)
  481. {
  482. m_nCurSel = pColorCell == NULL ? -1 : (int)pColorCell->nIndex;
  483. Invalidate(FALSE);
  484. }
  485. // Adds a window to send color picker notifications to.
  486. void CXTColorSelectorCtrl::AddListener(HWND hwndListener)
  487. {
  488. m_listeners.Add(hwndListener);
  489. }
  490. void CXTColorSelectorCtrl::RemoveListener(HWND hwndListener)
  491. {
  492. int i;
  493. for (i = (int)m_listeners.GetSize() - 1; i >= 0 ; i--)
  494. {
  495. if (m_listeners[i] == hwndListener)
  496. m_listeners.RemoveAt(i);
  497. }
  498. }
  499. void CXTColorSelectorCtrl::OnLButtonDown(UINT nFlags, CPoint point)
  500. {
  501. if (!IsColorDlgVisible())
  502. {
  503. CWnd::OnLButtonDown(nFlags, point);
  504. CRect rc;
  505. GetClientRect(&rc);
  506. if (rc.PtInRect(point))
  507. {
  508. m_nPressed = m_nCurSel;
  509. Invalidate(FALSE);
  510. }
  511. }
  512. }
  513. void CXTColorSelectorCtrl::OnLButtonUp(UINT nFlags, CPoint point)
  514. {
  515. if (!IsColorDlgVisible())
  516. {
  517. CWnd::OnLButtonUp(nFlags, point);
  518. if (m_nPressed == m_nCurSel && m_nCurSel != -1)
  519. {
  520. EndSelection(m_nCurSel);
  521. }
  522. m_nCurSel = m_nPressed = -1;
  523. Invalidate(FALSE);
  524. }
  525. }
  526. void CXTColorSelectorCtrl::SetCurSel(int nIndex)
  527. {
  528. if (nIndex < 0) nIndex = ((m_dwPopup & CPS_XT_NOAUTOMATIC) == 0) ? 0 : (int)m_arCells.GetCount() - 1;
  529. if (nIndex >= m_arCells.GetCount()) nIndex = (int)m_arCells.GetCount() - 1;
  530. POSITION pos = m_arCells.FindIndex(nIndex);
  531. if (pos == NULL)
  532. return;
  533. COLOR_CELL* pColorCell = m_arCells.GetAt(pos);
  534. SelectColorCell(pColorCell);
  535. }
  536. void CXTColorSelectorCtrl::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
  537. {
  538. if (IsColorDlgVisible())
  539. return;
  540. int nLastIndex = (int)m_arCells.GetCount() - 1;
  541. //          0
  542. //
  543. //  1  1  2  3  4  5  6  7  8
  544. //  2  9 10 11 12 13 14 15 16
  545. //  3 17 18 19 20 21 22 23 24
  546. //  4 25 26 27 28 29 30 31 32
  547. //
  548. //         33
  549. //
  550. //          0
  551. //
  552. //  1  1  2  3  4  5  6  7  8
  553. //  2  9 10 11 12 13 14 15 16
  554. //  3 17 18 19 20 21 22 23 24
  555. //  4 25 26 27 28 29 30 31 32
  556. //  5 33
  557. //
  558. //         34
  559. switch (nChar)
  560. {
  561. case VK_DOWN:
  562. {
  563. // Check for no current cursor yet
  564. if (m_nCurSel == -1)
  565. {
  566. m_nCurSel = 0 ;
  567. }
  568. // top button to first color cell
  569. else if (m_nCurSel == 0 && ((m_dwPopup & CPS_XT_NOAUTOMATIC) == 0))
  570. {
  571. m_nCurSel = 1 ;
  572. }
  573. // bottom button to top bottom
  574. else if (m_nCurSel == nLastIndex)
  575. {
  576. m_nCurSel = 0 ;
  577. }
  578. // a color square to the next color square below it
  579. else
  580. {
  581. m_nCurSel += m_nCols;
  582. }
  583. SetCurSel(m_nCurSel);
  584. break;
  585. }
  586. case VK_UP:
  587. {
  588. // Check for no current cursor yet
  589. if (m_nCurSel == -1)
  590. {
  591. m_nCurSel = nLastIndex ;
  592. }
  593. // top button to last button
  594. else if (m_nCurSel == 0)
  595. {
  596. m_nCurSel = nLastIndex ;
  597. }
  598. // bottom button to first color square in the last row
  599. else if (m_nCurSel == nLastIndex)
  600. {
  601. m_nCurSel = (m_dwPopup & CPS_XT_MORECOLORS) ? m_nCurSel - 1 : m_nCurSel - m_nCols;
  602. }
  603. // a color square to another color square just above it
  604. else
  605. {
  606. m_nCurSel -= m_nCols;
  607. }
  608. SetCurSel(m_nCurSel);
  609. break;
  610. }
  611. case VK_RIGHT:
  612. {
  613. // Check for no current cursor yet
  614. if (m_nCurSel == -1)
  615. {
  616. m_nCurSel = 0 ;
  617. }
  618. else
  619. {
  620. ++m_nCurSel;
  621. if (m_nCurSel > nLastIndex)
  622. {
  623. m_nCurSel = 0;
  624. }
  625. }
  626. SetCurSel(m_nCurSel);
  627. break;
  628. }
  629. case VK_LEFT:
  630. {
  631. // Check for no current cursor yet
  632. if (m_nCurSel == -1)
  633. {
  634. m_nCurSel = nLastIndex ;
  635. }
  636. else
  637. {
  638. --m_nCurSel;
  639. if (m_nCurSel < 0)
  640. {
  641. m_nCurSel = nLastIndex;
  642. }
  643. }
  644. SetCurSel(m_nCurSel);
  645. break;
  646. }
  647. case VK_ESCAPE:
  648. {
  649. EndSelection(-1);
  650. return;
  651. }
  652. case VK_RETURN:
  653. case VK_SPACE:
  654. {
  655. EndSelection(m_nCurSel);
  656. return;
  657. }
  658. }
  659. CWnd::OnKeyDown(nChar, nRepCnt, nFlags);
  660. }
  661. BOOL CXTColorSelectorCtrl::PreTranslateMessage(MSG* pMsg)
  662. {
  663. if (m_tooltip.GetSafeHwnd()) m_tooltip.RelayEvent(pMsg);
  664. return CWnd::PreTranslateMessage(pMsg);
  665. }
  666. int CXTColorSelectorCtrl::GetCurSel(COLOR_CELL* pColorCell)
  667. {
  668. pColorCell = GetCellFromIndex(m_nCurSel);
  669. ASSERT(pColorCell != NULL);
  670. return m_nCurSel;
  671. }
  672. void CXTColorSelectorCtrl::EndSelection(int nCurSel)
  673. {
  674. OnEndSelection(nCurSel, 0);
  675. }
  676. void CXTColorSelectorCtrl::OnSetFocus(CWnd* pOldWnd)
  677. {
  678. if (IsColorDlgVisible())
  679. {
  680. m_pColorDlg->SetFocus();
  681. pOldWnd = this;
  682. }
  683. CWnd::OnSetFocus(pOldWnd);
  684. }
  685. BOOL CXTColorSelectorCtrl::LookUpColor(const COLORREF crFind)
  686. {
  687. // if the color was already added, return TRUE.
  688. int i;
  689. for (i = 0; i < m_arUserDefColors.GetSize(); ++i)
  690. {
  691. if (crFind == m_arUserDefColors.GetAt(i))
  692. return TRUE;
  693. }
  694. // if the color is already displayed as a default selection return TRUE.
  695. if (m_dwPopup & CPS_XT_EXTENDED)
  696. {
  697. for (i = 0; i < _countof(extendedColors); ++i)
  698. {
  699. if (crFind == extendedColors[i].clrButton)
  700. return TRUE;
  701. }
  702. }
  703. else
  704. {
  705. for (i = 0; i < _countof(standardColors); ++i)
  706. {
  707. if (crFind == standardColors[i].clrButton)
  708. return TRUE;
  709. }
  710. }
  711. return FALSE;
  712. }
  713. void CXTColorSelectorCtrl::OnEndSelection(int nCurSel, LPARAM callerParam)
  714. {
  715. int nMessage = 0;
  716. // copy off the listeners
  717. CArray<HWND, HWND> listeners;
  718. listeners.Append(m_listeners);
  719. // copy other relevant data
  720. COLORREF clrColor = m_clrColor;
  721. DWORD dwPopup = m_dwPopup;
  722. if (nCurSel == (int)m_arCells.GetCount() - 1 && (m_dwPopup & CPS_XT_MORECOLORS))
  723. {
  724. // display dialog and send proper notifications
  725. m_pColorDlg = new CXTColorDialog(clrColor, clrColor,
  726. (dwPopup & (CPS_XT_SHOWHEXVALUE | CPS_XT_SHOW3DSELECTION)), GetParent());
  727. if (m_pColorDlg->DoModal() == IDOK)
  728. {
  729. COLORREF clrDlgColor = m_pColorDlg->GetColor();
  730. if (clrColor == clrDlgColor)
  731. {
  732. nMessage = CPN_XT_SELCHANGE;
  733. }
  734. else
  735. {
  736. nMessage = CPN_XT_SELENDOK;
  737. clrColor = clrDlgColor;
  738. }
  739. // TSF NEU 18.01.02 - user defined colors
  740. if (m_arUserDefColors.GetSize() >= m_nCols)
  741. m_arUserDefColors.RemoveAt(0);
  742. if (!LookUpColor(clrColor))
  743. m_arUserDefColors.Add(clrColor);
  744. // TSF NEU 18.01.02 - user defined colors
  745. }
  746. else
  747. {
  748. nMessage = CPN_XT_SELENDCANCEL;
  749. }
  750. SAFE_DELETE(m_pColorDlg);
  751. }
  752. else if (nCurSel == 0)
  753. {
  754. if (m_dwPopup & CPS_XT_NOFILL)
  755. {
  756. nMessage = CPN_XT_SELNOFILL;
  757. clrColor = (ULONG)-1;
  758. }
  759. else if (m_clrColor == m_clrDefault)
  760. {
  761. nMessage = CPN_XT_SELCHANGE;
  762. }
  763. else
  764. {
  765. nMessage = CPN_XT_SELENDOK;
  766. clrColor = m_clrDefault;
  767. }
  768. }
  769. else if (nCurSel == -1)
  770. {
  771. nMessage = CPN_XT_SELENDCANCEL;
  772. }
  773. else
  774. {
  775. COLOR_CELL* pColorCell = GetCellFromIndex(nCurSel);
  776. ASSERT(pColorCell != NULL);
  777. if (!pColorCell)
  778. return;
  779. COLORREF clrCellColor = pColorCell->clr;
  780. if (clrColor == clrCellColor)
  781. {
  782. nMessage = CPN_XT_SELCHANGE;
  783. }
  784. else
  785. {
  786. nMessage = CPN_XT_SELENDOK;
  787. clrColor = clrCellColor;
  788. }
  789. }
  790. // Pass this message to the registered listeners
  791. int i;
  792. for (i = 0; i < listeners.GetSize(); i++)
  793. {
  794. if (::IsWindow(listeners[i]))
  795. {
  796. ::SendMessage(listeners[i], nMessage,
  797. (WPARAM)clrColor, callerParam);
  798. }
  799. }
  800. }
  801. BOOL CXTColorSelectorCtrl::OnEraseBkgnd(CDC* /*pDC*/)
  802. {
  803. return TRUE;
  804. }
  805. void CXTColorSelectorCtrl::SelectColor(COLORREF clr)
  806. {
  807. POSITION pos;
  808. for (pos = m_arCells.GetHeadPosition(); pos; m_arCells.GetNext(pos))
  809. {
  810. COLOR_CELL* pColorCell = m_arCells.GetAt(pos);
  811. ASSERT(pColorCell != NULL);
  812. if (!pColorCell)
  813. continue;
  814. if (pColorCell->dwStyle & CPS_XT_PICKBOX)
  815. pColorCell->bChecked = clr == pColorCell->clr;
  816. }
  817. m_clrColor = clr;
  818. Invalidate(FALSE);
  819. }
  820. LRESULT CXTColorSelectorCtrl::OnNcHitTest(CPoint point)
  821. {
  822. // If we have a valid tooltip pointer, bring the tooltip control
  823. // to the top of the Z-order.
  824. if (m_tooltip.GetSafeHwnd() && !IsColorDlgVisible())
  825. {
  826. m_tooltip.SetWindowPos(&wndTop, 0, 0, 0, 0,
  827. SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE);
  828. }
  829. return (LRESULT)CWnd::OnNcHitTest(point);
  830. }
  831. bool CXTColorSelectorCtrl::IsColorDlgVisible()
  832. {
  833. return (m_pColorDlg && ::IsWindow(m_pColorDlg->m_hWnd));
  834. }
  835. void CXTColorSelectorCtrl::SetUserColors(const CUIntArray& arUserDefColors)
  836. {
  837. m_arUserDefColors.RemoveAll();
  838. m_arUserDefColors.Copy(arUserDefColors);
  839. }
  840. CUIntArray& CXTColorSelectorCtrl::GetUserColors()
  841. {
  842. return m_arUserDefColors;
  843. }
  844. //////////////////////////////////////////////////////////////////////////
  845. // CXTColorSelectorCtrlTheme
  846. //////////////////////////////////////////////////////////////////////
  847. // CXTColorSelectorCtrlTheme
  848. IMPLEMENT_THEME_FACTORY(CXTColorSelectorCtrlTheme)
  849. CXTColorSelectorCtrlTheme::CXTColorSelectorCtrlTheme()
  850. : m_crBorderHilight(COLORREF_NULL)
  851. , m_crBorderShadow(COLORREF_NULL)
  852. , m_crBack(COLORREF_NULL)
  853. , m_crPressed(COLORREF_NULL)
  854. , m_crHilight(COLORREF_NULL)
  855. , m_crChecked(COLORREF_NULL)
  856. {
  857. }
  858. void CXTColorSelectorCtrlTheme::RefreshMetrics()
  859. {
  860. CXTThemeManagerStyle::RefreshMetrics();
  861. m_crBack = GetXtremeColor(COLOR_3DFACE);
  862. m_crBorderHilight = GetXtremeColor(COLOR_3DHILIGHT);
  863. m_crBorderShadow = GetXtremeColor(COLOR_3DSHADOW);
  864. m_crText = GetXtremeColor(COLOR_BTNTEXT);
  865. }
  866. void CXTColorSelectorCtrlTheme::FillBackground(CDC* pDC, const CRect& rect, CXTColorSelectorCtrl* /*pOwner*/)
  867. {
  868. pDC->FillSolidRect(&rect, m_crBack);
  869. }
  870. void CXTColorSelectorCtrlTheme::DrawColorCell(CXTColorSelectorCtrl::COLOR_CELL* pColorCell, CDC* pDC, BOOL bHilite, BOOL bPressed)
  871. {
  872. pDC->SetBkMode(TRANSPARENT);
  873. CFont* pOldFont = pDC->SelectObject(&XTAuxData().font);
  874. CRect rcItem = pColorCell->rect;
  875. bool bChecked = pColorCell->bChecked;
  876. if (bChecked || bHilite || bPressed)
  877. {
  878. if (bPressed)
  879. {
  880. if (m_crPressed != COLORREF_NULL)
  881. {
  882. pDC->FillSolidRect(&rcItem, m_crPressed);
  883. }
  884. }
  885. else if (bHilite)
  886. {
  887. if (m_crHilight != COLORREF_NULL)
  888. {
  889. pDC->FillSolidRect(&rcItem, m_crHilight);
  890. }
  891. }
  892. else if (bChecked)
  893. {
  894. if (m_crChecked != COLORREF_NULL)
  895. {
  896. pDC->FillSolidRect(&rcItem, m_crChecked);
  897. }
  898. else
  899. {
  900. XTFuncDrawShadedRect(pDC, rcItem);
  901. }
  902. }
  903. pDC->Draw3dRect(rcItem, (bPressed || bChecked) ? m_crBorderShadow : m_crBorderHilight,
  904. (bPressed || bChecked) ? m_crBorderHilight : m_crBorderShadow);
  905. }
  906. int nLen = (int)_tcslen(pColorCell->szText);
  907. if (nLen)
  908. {
  909. pDC->SetTextColor(m_crText);
  910. pDC->DrawText(pColorCell->szText, nLen, rcItem, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
  911. }
  912. if (pColorCell->dwStyle != CPS_XT_MORECOLORS)
  913. {
  914. rcItem.DeflateRect(3, 3);
  915. if ((pColorCell->dwStyle & CPS_XT_PICKBOX) == 0)
  916. {
  917. if ((pColorCell->dwStyle & CPS_XT_NOFILL) == 0)
  918. {
  919. rcItem.DeflateRect(3, 3);
  920. rcItem.right = rcItem.left + 12;
  921. rcItem.bottom = rcItem.top + 11;
  922. rcItem.OffsetRect(1, 0);
  923. pDC->Draw3dRect(rcItem, m_crBorderShadow, m_crBorderShadow);
  924. rcItem.DeflateRect(1, 1);
  925. pDC->FillSolidRect(rcItem, pColorCell->clr);
  926. }
  927. }
  928. else
  929. {
  930. pDC->Draw3dRect(rcItem, m_crBorderShadow, m_crBorderShadow);
  931. rcItem.DeflateRect(1, 1);
  932. pDC->FillSolidRect(rcItem, pColorCell->clr);
  933. }
  934. }
  935. else
  936. {
  937. if (pColorCell->bChecked)
  938. {
  939. rcItem = pColorCell->rect;
  940. rcItem.DeflateRect(5, 6);
  941. rcItem.left = rcItem.right - 12;
  942. pDC->Draw3dRect(rcItem, m_crBorderShadow, m_crBorderShadow);
  943. rcItem.DeflateRect(1, 1);
  944. pDC->FillSolidRect(rcItem, pColorCell->clr);
  945. }
  946. }
  947. pDC->SelectObject(pOldFont);
  948. }
  949. //////////////////////////////////////////////////////////////////////
  950. // CXTColorSelectorCtrlThemeOfficeXP
  951. CXTColorSelectorCtrlThemeOfficeXP::CXTColorSelectorCtrlThemeOfficeXP()
  952. {
  953. }
  954. void CXTColorSelectorCtrlThemeOfficeXP::RefreshMetrics()
  955. {
  956. CXTColorSelectorCtrlTheme::RefreshMetrics();
  957. m_crBorderHilight = GetXtremeColor(XPCOLOR_HIGHLIGHT_BORDER);
  958. m_crBorderShadow = GetXtremeColor(XPCOLOR_HIGHLIGHT_BORDER);
  959. m_crBack = GetXtremeColor(XPCOLOR_MENUBAR_FACE);
  960. m_crPressed = GetXtremeColor(XPCOLOR_HIGHLIGHT_PUSHED);
  961. m_crHilight = GetXtremeColor(XPCOLOR_HIGHLIGHT);
  962. m_crChecked = GetXtremeColor(XPCOLOR_HIGHLIGHT_CHECKED);
  963. }
  964. //////////////////////////////////////////////////////////////////////
  965. // CXTColorSelectorCtrlThemeOffice2003
  966. CXTColorSelectorCtrlThemeOffice2003::CXTColorSelectorCtrlThemeOffice2003()
  967. {
  968. }
  969. void CXTColorSelectorCtrlThemeOffice2003::RefreshMetrics()
  970. {
  971. CXTColorSelectorCtrlThemeOfficeXP::RefreshMetrics();
  972. m_crBorderHilight = GetMSO2003Color(XPCOLOR_HIGHLIGHT_BORDER);
  973. m_crBorderShadow = GetMSO2003Color(XPCOLOR_HIGHLIGHT_BORDER);
  974. m_crBack = GetMSO2003Color(XPCOLOR_MENUBAR_FACE);
  975. m_crPressed = GetMSO2003Color(XPCOLOR_HIGHLIGHT_PUSHED);
  976. m_crHilight = GetMSO2003Color(XPCOLOR_HIGHLIGHT);
  977. m_crChecked = GetMSO2003Color(XPCOLOR_HIGHLIGHT_CHECKED);
  978. }