// XTPCoreTreePaintManager.cpp: implementation of the CXTPCoreTreePaintManager class. // // This file is a part of the XTREME CONTROLS MFC class library. // (c)1998-2012 Codejock Software, All Rights Reserved. // // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN // CONSENT OF CODEJOCK SOFTWARE. // // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A // SINGLE COMPUTER. // // CONTACT INFORMATION: // support@codejock.com // http://www.codejock.com // ///////////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "Common/XTPWinThemeWrapper.h" #include "Common/XTPDrawHelpers.h" #include "Common/XTPImageManager.h" #include "Common/XTPMarkupRender.h" #include "XTPCoreTreePaintManager.h" #include "XTPCoreTreeControl.h" #include "XTPCoreTreeItem.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CXTPCoreTreePaintManager::CXTPCoreTreePaintManager() { m_nItemHeight = NULL; m_themeButton = new CXTPWinThemeWrapper(); m_themeTree = new CXTPWinThemeWrapper(); m_bShowButtons = TRUE; } CXTPCoreTreePaintManager::~CXTPCoreTreePaintManager() { SAFE_DELETE(m_themeButton); SAFE_DELETE(m_themeTree); } void CXTPCoreTreePaintManager::RefreshMetrics() { m_clrBackground = GetSysColor(COLOR_WINDOW); m_clrText = GetSysColor(COLOR_WINDOWTEXT); m_clrLabelBackground = RGB(240, 242, 245); m_clrLabelText = RGB(59, 59, 59); m_clrSelectedText = GetSysColor(COLOR_HIGHLIGHTTEXT); m_clrSelectedBackground = GetSysColor(COLOR_HIGHLIGHT); m_clrDisabledText = GetSysColor(COLOR_GRAYTEXT); m_themeButton->OpenThemeData(NULL, L"BUTTON"); m_themeTree->OpenThemeData(NULL, L"TREEVIEW"); LOGFONT lfIcon; VERIFY(CXTPDrawHelpers::GetIconLogFont(&lfIcon)); SetFontIndirect(&lfIcon); } void CXTPCoreTreePaintManager::SetFontIndirect(LOGFONT* pLogFont) { m_fntItem.DeleteObject(); m_fntLabel.DeleteObject(); pLogFont->lfWeight = FW_BOLD; m_fntLabel.CreateFontIndirect(pLogFont); pLogFont->lfWeight = FW_NORMAL; m_fntItem.CreateFontIndirect(pLogFont); { CWindowDC dc (NULL); CXTPFontDC font(&dc, &m_fntItem); m_nItemHeight = dc.GetTextExtent(_T(" "), 1).cy + 2; if (m_nItemHeight < 16) m_nItemHeight = 16; } } void CXTPCoreTreePaintManager::FillTreeControl(CDC* pDC, CXTPCoreTreeControl* pTreeControl) { CXTPClientRect rc(pTreeControl); pDC->FillSolidRect(rc, m_clrBackground); } void CXTPCoreTreePaintManager::DrawButton(CDC* pDC, CXTPCoreTreeItem* pItem, CRect rcItem) { rcItem.right = rcItem.left + m_nItemHeight; CPoint pt = rcItem.CenterPoint(); CRect rcSign(pt.x - 4, pt.y - 4, pt.x + 5, pt.y + 5); if (m_themeTree->IsAppThemed()) { m_themeTree->DrawThemeBackground(pDC->GetSafeHdc(), TVP_GLYPH, pItem->IsExpanded() ? GLPS_OPENED : GLPS_CLOSED, &rcSign, 0); } else { pDC->Draw3dRect(rcSign, GetSysColor(COLOR_BTNSHADOW), GetSysColor(COLOR_BTNSHADOW)); pDC->FillSolidRect(pt.x - 2, pt.y, 5, 1, m_clrText); if (!pItem->IsExpanded()) { pDC->FillSolidRect(pt.x, pt.y - 2, 1, 5, m_clrText); } } } void CXTPCoreTreePaintManager::DrawCheckbox(CDC* pDC, CXTPCoreTreeItem* pItem, CRect rcItem) { rcItem.right = rcItem.left + m_nItemHeight; BOOL bChecked = pItem->IsChecked(); BOOL bEnabled = pItem->IsEnabled(); CPoint pt(rcItem.CenterPoint()); CRect rcCheckMark(pt.x - 7, pt.y - 7, pt.x + 6, pt.y + 6); if (m_themeButton->IsAppThemed()) { m_themeButton->DrawThemeBackground(pDC->GetSafeHdc(), BP_CHECKBOX, !bEnabled ? (bChecked ? CBS_CHECKEDDISABLED : CBS_UNCHECKEDDISABLED) : (bChecked ? CBS_CHECKEDNORMAL : CBS_UNCHECKEDNORMAL), rcCheckMark, 0); } else { pDC->DrawFrameControl(rcCheckMark, DFC_BUTTON, DFCS_BUTTONCHECK | (!bEnabled ? DFCS_INACTIVE : 0) | (bChecked ? DFCS_CHECKED : 0)); } } void CXTPCoreTreePaintManager::DrawDropRect(CDC* pDC, CXTPCoreTreeItem* pItem) { CRect rcItem(pItem->GetRect()); CXTPCoreTreeControl* pTreeControl = pItem->GetTreeControl(); if (pTreeControl->GetDropPosition() == xtpCoreTreeDropBefore) { pDC->FillSolidRect(rcItem.left, rcItem.top - 1, rcItem.Width(), 2, 0); } else if (pTreeControl->GetDropPosition() == xtpCoreTreeDropAfter) { pDC->FillSolidRect(rcItem.left, rcItem.bottom - 1, rcItem.Width(), 2, 0); } else if (pTreeControl->GetDropPosition() == xtpCoreTreeDropChild) { int nIndent = GetChildrenIndent(pItem); pDC->FillSolidRect(rcItem.left + nIndent, rcItem.bottom - 1, rcItem.Width() - nIndent, 2, 0); } } void CXTPCoreTreePaintManager::DrawItem(CDC* pDC, CXTPCoreTreeItem* pItem) { if (pItem->IsLabel()) { CXTPFontDC fnt(pDC, &m_fntLabel); CRect rc(pItem->GetRect()); pDC->FillSolidRect(rc, m_clrLabelBackground); pDC->FillSolidRect(rc.left, rc.bottom - 1, rc.Width(), 1, RGB(226, 228, 231)); pDC->SetTextColor(m_clrLabelText); CRect rcText(rc); rcText.left += 2; if (pItem->GetMarkupUIElement()) { XTPMarkupSetDefaultFont(XTPMarkupElementContext(pItem->GetMarkupUIElement()), m_fntLabel, pDC->GetTextColor()); XTPMarkupRenderElement(pItem->GetMarkupUIElement(), pDC->GetSafeHdc(), rcText); } else { pDC->DrawText(pItem->GetCaption(), rcText, DT_SINGLELINE | DT_NOPREFIX | DT_VCENTER); } } else { CXTPFontDC fnt(pDC, &m_fntItem); CRect rcItem(pItem->GetRect()); if (m_bShowButtons) { if (pItem->HasChildren()) { DrawButton(pDC, pItem, rcItem); } rcItem.left += m_nItemHeight; } if (pItem->IsSelected()) { if (::GetFocus() == pItem->GetTreeControl()->GetSafeHwnd()) { pDC->FillSolidRect(rcItem, m_clrSelectedBackground); pDC->SetTextColor(m_clrSelectedText); } else { pDC->FillSolidRect(rcItem, GetSysColor(COLOR_BTNFACE)); pDC->SetTextColor(GetSysColor(COLOR_BTNTEXT)); } } else { pDC->SetTextColor(m_clrText); } if (!pItem->IsEnabled()) { pDC->SetTextColor(m_clrDisabledText); } if (pItem->IsCheckboxVisible()) { DrawCheckbox(pDC, pItem, rcItem); rcItem.left += m_nItemHeight; } if (pItem->GetIconId() != -1) { CRect rcIcon; rcIcon.left = rcItem.left + 2; rcIcon.right = rcIcon.left + 16; rcIcon.top = (rcItem.top + rcItem.bottom - 16) / 2; rcIcon.bottom = rcItem.top + 16; CXTPImageManagerIcon* pIcon = pItem->GetImage(); if (pIcon) { pIcon->Draw(pDC, rcIcon.TopLeft(), pIcon->GetIcon(pItem->IsEnabled() ? xtpImageNormal : xtpImageDisabled), rcIcon.Size()); } rcItem.left += 20; } CRect rcText(rcItem); rcText.left += 2; if (pItem->GetMarkupUIElement()) { XTPMarkupSetDefaultFont(XTPMarkupElementContext(pItem->GetMarkupUIElement()), m_fntItem, pDC->GetTextColor()); XTPMarkupRenderElement(pItem->GetMarkupUIElement(), pDC->GetSafeHdc(), rcText); } else { pDC->DrawText(pItem->GetCaption(), rcText, DT_SINGLELINE | DT_NOPREFIX | DT_VCENTER); } } } int CXTPCoreTreePaintManager::GetChildrenIndent(CXTPCoreTreeItem* pItem) { if (pItem->IsCheckboxVisible()) return 2 * m_nItemHeight; return m_nItemHeight; } BOOL CXTPCoreTreePaintManager::IsAppThemed() const { return m_themeTree->IsAppThemed(); }