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