You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			365 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			C++
		
	
			
		
		
	
	
			365 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			C++
		
	
| // XTPPropertyGridInplaceButton.cpp : implementation of the CXTPPropertyGridInplaceButton class.
 | |
| //
 | |
| // This file is a part of the XTREME PROPERTYGRID 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/XTPDrawHelpers.h"
 | |
| #include "Common/XTPImageManager.h"
 | |
| #include "Common/XTPSystemHelpers.h"
 | |
| #include "Common/XTPColorManager.h"
 | |
| 
 | |
| #include "XTPPropertyGridDefines.h"
 | |
| #include "XTPPropertyGridPaintManager.h"
 | |
| #include "XTPPropertyGridItem.h"
 | |
| #include "XTPPropertyGridInplaceButton.h"
 | |
| #include "XTPPropertyGridView.h"
 | |
| #include "XTPPropertyGrid.h"
 | |
| 
 | |
| #ifdef _DEBUG
 | |
| #define new DEBUG_NEW
 | |
| #undef THIS_FILE
 | |
| static char THIS_FILE[] = __FILE__;
 | |
| #endif
 | |
| 
 | |
| 
 | |
| /////////////////////////////////////////////////////////////////////////////
 | |
| // CXTPColorPicker
 | |
| 
 | |
| CXTPPropertyGridInplaceButton::CXTPPropertyGridInplaceButton(UINT nID)
 | |
| {
 | |
| 	m_pItem = NULL;
 | |
| 	m_nID = nID;
 | |
| 	m_pGrid = NULL;
 | |
| 	m_rcButton.SetRectEmpty();
 | |
| 	m_nIndex = -1;
 | |
| 	m_bPressed = FALSE;
 | |
| 	m_nWidth = GetSystemMetrics(SM_CXHTHUMB);
 | |
| 	m_nIconIndex = -1;
 | |
| 	m_bEnabled = TRUE;
 | |
| 	m_bHyperlink = FALSE;
 | |
| 	m_bShowAlways = FALSE;
 | |
| 	m_nAlignment = DT_RIGHT;
 | |
| 	m_bTabStop = TRUE;
 | |
| 
 | |
| 
 | |
| }
 | |
| 
 | |
| CXTPPropertyGridInplaceButton::~CXTPPropertyGridInplaceButton()
 | |
| {
 | |
| 
 | |
| }
 | |
| 
 | |
| CXTPImageManagerIcon* CXTPPropertyGridInplaceButton::GetImage() const
 | |
| {
 | |
| 	ASSERT(m_pItem);
 | |
| 
 | |
| 	if (!m_pItem)
 | |
| 		return NULL;
 | |
| 
 | |
| 	if (m_nIconIndex == -1)
 | |
| 		return NULL;
 | |
| 
 | |
| 	return m_pGrid->GetImageManager()->GetImage(m_nIconIndex, 0);
 | |
| }
 | |
| 
 | |
| void CXTPPropertyGridInplaceButton::SetCaption(LPCTSTR lpszCaption)
 | |
| {
 | |
| 	m_strCaption = lpszCaption;
 | |
| 
 | |
| 	CWindowDC dc(NULL);
 | |
| 	CXTPFontDC font(&dc, m_pGrid->GetPaintManager()->GetItemFont(m_pItem, TRUE));
 | |
| 	m_nWidth = dc.GetTextExtent(m_strCaption).cx + 6;
 | |
| }
 | |
| 
 | |
| int CXTPPropertyGridInplaceButton::GetIndex() const
 | |
| {
 | |
| 	return m_nIndex;
 | |
| }
 | |
| 
 | |
| 
 | |
| BOOL CXTPPropertyGridInplaceButton::IsFocused() const
 | |
| {
 | |
| 	return m_pGrid->m_pFocusedButton == this;
 | |
| }
 | |
| 
 | |
| BOOL CXTPPropertyGridInplaceButton::IsHot() const
 | |
| {
 | |
| 	return m_pGrid->m_pHotButton == this && m_bEnabled;
 | |
| }
 | |
| 
 | |
| BOOL CXTPPropertyGridInplaceButton::IsPressed() const
 | |
| {
 | |
| 	return m_bPressed;
 | |
| }
 | |
| 
 | |
| BOOL CXTPPropertyGridInplaceButton::GetEnabled() const
 | |
| {
 | |
| 	return m_bEnabled;
 | |
| }
 | |
| 
 | |
| void CXTPPropertyGridInplaceButton::SetEnabled(BOOL bEnabled)
 | |
| {
 | |
| 	m_bEnabled = bEnabled;
 | |
| 	SAFE_INVALIDATE(m_pGrid);
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| /////////////////////////////////////////////////////////////////////////////
 | |
| // CXTPPropertyGridInplaceButton message handlers
 | |
| 
 | |
| void CXTPPropertyGridInplaceButton::OnDraw(CDC* pDC, CRect rc)
 | |
| {
 | |
| 	m_rcButton = rc;
 | |
| 
 | |
| 	m_pGrid->GetPaintManager()->FillInplaceButton(pDC, this);
 | |
| }
 | |
| 
 | |
| void CXTPPropertyGridInplaceButton::OnLButtonDown(UINT, CPoint)
 | |
| {
 | |
| 	if (!m_bEnabled)
 | |
| 		return;
 | |
| 
 | |
| 	m_bPressed = TRUE;
 | |
| 	m_pGrid->SetFocus();
 | |
| 
 | |
| 	m_pGrid->Invalidate(FALSE);
 | |
| 
 | |
| 	m_pGrid->SetCapture();
 | |
| 	BOOL bClick = TRUE;
 | |
| 
 | |
| 	while (::GetCapture() == m_pGrid->GetSafeHwnd())
 | |
| 	{
 | |
| 		MSG msg;
 | |
| 		VERIFY(::GetMessage(&msg, NULL, 0, 0));
 | |
| 
 | |
| 		if (::GetCapture() != m_pGrid->GetSafeHwnd())
 | |
| 		{
 | |
| 			DispatchMessage (&msg);
 | |
| 			break;
 | |
| 		}
 | |
| 
 | |
| 		if (msg.message == WM_LBUTTONUP)
 | |
| 		{
 | |
| 			bClick = IsHot();
 | |
| 			break;
 | |
| 		}
 | |
| 
 | |
| 		if (msg.message == WM_MOUSEMOVE)
 | |
| 		{
 | |
| 			CPoint pt = CPoint(LOWORD(msg.lParam), HIWORD(msg.lParam));
 | |
| 
 | |
| 			CXTPPropertyGridInplaceButton* pHotButton = m_rcButton.PtInRect(pt) ? this : NULL;
 | |
| 
 | |
| 			if (m_pGrid->m_pHotButton != pHotButton)
 | |
| 			{
 | |
| 				m_pGrid->m_pHotButton = pHotButton;
 | |
| 				m_pGrid->Invalidate(FALSE);
 | |
| 			}
 | |
| 			continue;
 | |
| 		}
 | |
| 
 | |
| 		DispatchMessage (&msg);
 | |
| 	}
 | |
| 
 | |
| 	m_bPressed = FALSE;
 | |
| 
 | |
| 	ReleaseCapture();
 | |
| 	m_pGrid->Invalidate(FALSE);
 | |
| 
 | |
| 	if (bClick)
 | |
| 	{
 | |
| 		m_pItem->OnInplaceButtonDown(this);
 | |
| 	}
 | |
| }
 | |
| 
 | |
| int CXTPPropertyGridInplaceButton::GetWidth()
 | |
| {
 | |
| 	BOOL bItemText = FALSE;
 | |
| 	if (m_pGrid->GetPropertyGrid()->IsHighlightChangedButtonItems() && m_pGrid->GetPropertyGrid()->IsHighlightChangedItems()
 | |
| 		&& GetItem()->IsValueChanged()
 | |
| 		&& !GetCaption().IsEmpty() && GetID() != XTP_ID_PROPERTYGRID_COMBOBUTTON
 | |
| 		&& !GetImage())
 | |
| 		bItemText = TRUE;
 | |
| 
 | |
| 	if ((m_nWidth <= 0 && !m_strCaption.IsEmpty()) || bItemText)
 | |
| 	{
 | |
| 		CWindowDC dc(NULL);
 | |
| 		CXTPFontDC font(&dc, m_pGrid->GetPaintManager()->GetItemFont(m_pItem, TRUE));
 | |
| 		return dc.GetTextExtent(m_strCaption).cx + 6;
 | |
| 	}
 | |
| 
 | |
| 	return m_nWidth;
 | |
| }
 | |
| 
 | |
| void CXTPPropertyGridInplaceButton::SetWidth(int nWidth)
 | |
| {
 | |
| 	m_nWidth = nWidth;
 | |
| }
 | |
| 
 | |
| 
 | |
| void CXTPPropertyGridInplaceButton::OnKeyDown(UINT nChar)
 | |
| {
 | |
| 	if (m_pItem && m_bEnabled && (nChar == VK_SPACE || nChar == VK_DOWN || nChar == VK_RETURN || nChar == VK_F4))
 | |
| 	{
 | |
| 		m_pItem->OnInplaceButtonDown(this);
 | |
| 		return;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| 
 | |
| //////////////////////////////////////////////////////////////////////////
 | |
| // CXTPPropertyGridInplaceButtons
 | |
| 
 | |
| CXTPPropertyGridInplaceButtons::CXTPPropertyGridInplaceButtons(CXTPPropertyGridItem* pItem)
 | |
| {
 | |
| 	m_pItem = pItem;
 | |
| 
 | |
| 
 | |
| }
 | |
| 
 | |
| CXTPPropertyGridInplaceButtons::~CXTPPropertyGridInplaceButtons()
 | |
| {
 | |
| 	RemoveAll();
 | |
| }
 | |
| 
 | |
| void CXTPPropertyGridInplaceButtons::OnButtonRemoved(CXTPPropertyGridInplaceButton* pButton)
 | |
| {
 | |
| 	CXTPPropertyGridView* pGrid = m_pItem ? m_pItem->GetGrid() : NULL;
 | |
| 	if (!pGrid)
 | |
| 		return;
 | |
| 
 | |
| 	if (pGrid->m_pFocusedButton == pButton)
 | |
| 	{
 | |
| 		pGrid->m_pFocusedButton = NULL;
 | |
| 	}
 | |
| 
 | |
| 	if (pGrid->m_pHotButton == pButton)
 | |
| 	{
 | |
| 		pGrid->m_pHotButton = NULL;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| void CXTPPropertyGridInplaceButtons::RemoveAll()
 | |
| {
 | |
| 	for (int i = 0; i < GetCount(); i++)
 | |
| 	{
 | |
| 		CXTPPropertyGridInplaceButton* pButton = m_arrButtons[i];
 | |
| 
 | |
| 		OnButtonRemoved(pButton);
 | |
| 		pButton->InternalRelease();
 | |
| 	}
 | |
| 	m_arrButtons.RemoveAll();
 | |
| }
 | |
| 
 | |
| void CXTPPropertyGridInplaceButtons::UpdateIndexes()
 | |
| {
 | |
| 	for (int i = 0; i < GetCount(); i++)
 | |
| 	{
 | |
| 		m_arrButtons[i]->m_nIndex = i;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| void CXTPPropertyGridInplaceButtons::Remove(CXTPPropertyGridInplaceButton* pButton)
 | |
| {
 | |
| 	if (!pButton)
 | |
| 		return;
 | |
| 
 | |
| 	for (int i = 0; i < GetCount(); i++)
 | |
| 	{
 | |
| 		if (m_arrButtons[i] == pButton)
 | |
| 		{
 | |
| 			RemoveAt(i);
 | |
| 
 | |
| 			OnButtonRemoved(pButton);
 | |
| 			return;
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| void CXTPPropertyGridInplaceButtons::Remove(UINT nID)
 | |
| {
 | |
| 	Remove(Find(nID));
 | |
| }
 | |
| 
 | |
| void CXTPPropertyGridInplaceButtons::RemoveAt(long nIndex)
 | |
| {
 | |
| 	if (nIndex >= 0 && nIndex < GetCount())
 | |
| 	{
 | |
| 		CXTPPropertyGridInplaceButton* pButton = m_arrButtons[nIndex];
 | |
| 		m_arrButtons.RemoveAt(nIndex);
 | |
| 
 | |
| 		OnButtonRemoved(pButton);
 | |
| 		pButton->InternalRelease();
 | |
| 
 | |
| 		UpdateIndexes();
 | |
| 	}
 | |
| }
 | |
| 
 | |
| 
 | |
| CXTPPropertyGridInplaceButton* CXTPPropertyGridInplaceButtons::AddButton(CXTPPropertyGridInplaceButton* pButton)
 | |
| {
 | |
| 	pButton->m_pItem = m_pItem;
 | |
| 	pButton->m_pGrid = m_pItem->GetGrid();
 | |
| 	m_arrButtons.Add(pButton);
 | |
| 	UpdateIndexes();
 | |
| 
 | |
| 	return pButton;
 | |
| }
 | |
| 
 | |
| void CXTPPropertyGridInplaceButtons::AddComboButton()
 | |
| {
 | |
| 	if (Find(XTP_ID_PROPERTYGRID_COMBOBUTTON) == NULL)
 | |
| 	{
 | |
| 		AddButton(new CXTPPropertyGridInplaceButton(XTP_ID_PROPERTYGRID_COMBOBUTTON));
 | |
| 	}
 | |
| }
 | |
| 
 | |
| void CXTPPropertyGridInplaceButtons::AddExpandButton()
 | |
| {
 | |
| 	if (Find(XTP_ID_PROPERTYGRID_EXPANDBUTTON) == NULL)
 | |
| 	{
 | |
| 		AddButton(new CXTPPropertyGridInplaceButton(XTP_ID_PROPERTYGRID_EXPANDBUTTON));
 | |
| 	}
 | |
| }
 | |
| 
 | |
| CXTPPropertyGridInplaceButton* CXTPPropertyGridInplaceButtons::Find(UINT nID) const
 | |
| {
 | |
| 	for (int i = 0; i < GetCount(); i++)
 | |
| 	{
 | |
| 		if (m_arrButtons[i]->GetID() == nID)
 | |
| 			return m_arrButtons[i];
 | |
| 	}
 | |
| 	return NULL;
 | |
| }
 | |
| 
 | |
| CXTPPropertyGridInplaceButton* CXTPPropertyGridInplaceButtons::HitTest(CPoint point) const
 | |
| {
 | |
| 	for (int i = 0; i < GetCount(); i++)
 | |
| 	{
 | |
| 		CXTPPropertyGridInplaceButton* pButton = m_arrButtons[i];
 | |
| 
 | |
| 		if (pButton->GetRect().PtInRect(point) && m_pItem->IsInplaceButtonVisible(pButton))
 | |
| 			return pButton;
 | |
| 	}
 | |
| 	return NULL;
 | |
| }
 | |
| 
 | |
| 
 |