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++

// 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;
}