#include "stdafx.h" #include "PropertyGridInplaceEdit.h" #include "PropertyGridInplaceButton.h" #include "PropertyGridInplaceList.h" #include "PropertyGridItem.h" #include "PropertyGridExtItemDegree.h" #include "PropertyGrid.h" ///////////////////////////////////////////////////////////////////////////// // CInplaceDegreeEdit ///////////////////////////////////////////////////////////////////////////// CInplaceDegreeEdit::CInplaceDegreeEdit(int nSecondPrecision) : CDegreeEdit(nSecondPrecision) , m_pItem(0) , m_pGrid(0) { } CInplaceDegreeEdit::~CInplaceDegreeEdit() { } BEGIN_MESSAGE_MAP(CInplaceDegreeEdit, CDegreeEdit) //{{AFX_MSG_MAP(CInplaceDegreeEdit) ON_WM_CTLCOLOR_REFLECT() ON_CONTROL_REFLECT(EN_KILLFOCUS, OnEnKillfocus) ON_CONTROL_REFLECT(EN_SETFOCUS, OnEnSetfocus) ON_WM_LBUTTONDBLCLK() ON_WM_GETDLGCODE() ON_WM_KEYDOWN() ON_WM_CHAR() //}}AFX_MSG_MAP END_MESSAGE_MAP() void CInplaceDegreeEdit::SetValue(CString strValue) { m_strValue = strValue; } void CInplaceDegreeEdit::Create(CPropertyGridExtItemDegree* pItem, CRect rect) { ASSERT(pItem && pItem->GetGrid()); m_pGrid = pItem->GetGrid(); m_pItem = pItem; if (!m_hWnd) { CDegreeEdit::Create(WS_CHILD|ES_AUTOHSCROLL, rect, m_pGrid, 0); } SetWindowText(m_strValue); SetWindowPos(0, rect.left, rect.top, rect.Width(), rect.Height(), SWP_NOZORDER|SWP_SHOWWINDOW); } HBRUSH CInplaceDegreeEdit::CtlColor(CDC* pDC, UINT /*nCtlColor*/) { pDC->SetTextColor(GetStyle() & ES_READONLY ? GetSysColor(COLOR_GRAYTEXT): ((CPropertyGridView*)m_pGrid)->m_clrFore); COLORREF clr = ((CPropertyGridView*)m_pGrid)->m_clrBack; if (clr != m_clrBack || !m_brBack.GetSafeHandle()) { m_brBack.DeleteObject(); m_brBack.CreateSolidBrush(clr); m_clrBack = clr; } pDC->SetBkColor(m_clrBack); return m_brBack; } void CInplaceDegreeEdit::OnEnSetfocus() { ASSERT(m_pItem && m_pGrid); m_pGrid->Invalidate(FALSE); } void CInplaceDegreeEdit::OnEnKillfocus() { if (m_pItem) { m_pItem->OnValidateEdit(); m_pGrid->Invalidate(FALSE); } } UINT CInplaceDegreeEdit::OnGetDlgCode() { return DLGC_WANTALLKEYS; } void CInplaceDegreeEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) { if (nChar == VK_TAB) return; if (nChar == VK_ESCAPE || nChar == VK_RETURN) { m_pGrid->SetFocus(); return; } CDegreeEdit::OnChar(nChar, nRepCnt, nFlags); } void CInplaceDegreeEdit::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { if (nChar == VK_TAB) { CWnd* pParent = m_pGrid->GetParent(); if (!pParent || !pParent->GetParent()) { ASSERT(FALSE); return; } CWnd* pWndNext = pParent->GetParent()->GetNextDlgTabItem( pParent, ::GetKeyState(VK_SHIFT) < 0 ); if (pWndNext != NULL) { pWndNext->SetFocus(); } return; } else if (nChar == VK_ESCAPE) { SetWindowText(m_strValue); return; } else if (nChar == VK_RETURN) { return; } else if (nChar == VK_DOWN || nChar == VK_UP) { if (SelectConstraint(nChar == VK_DOWN? +1: -1, FALSE)) { MaskSelectAll(); return; } } CDegreeEdit::OnKeyDown(nChar, nRepCnt, nFlags); } BOOL CInplaceDegreeEdit::SelectConstraint(int nDirection, BOOL bCircle) { CPGItemConstraints* pList = m_pItem->GetConstraints(); if (pList->IsEmpty()) return FALSE; CString str; GetWindowText(str); int nIndex = pList->FindConstraint( str ); nIndex+= nDirection; if (nIndex >= pList->GetCount()) nIndex = bCircle ? 0 : (ULONG)pList->GetCount() - 1; if (nIndex < 0) nIndex = bCircle ? (ULONG)pList->GetCount() - 1 : 0; POSITION pos = pList->FindIndex(nIndex); SetWindowText( pList->GetAt(pos) ); return TRUE; } void CInplaceDegreeEdit::OnLButtonDblClk(UINT nFlags, CPoint point) { if (m_pItem != NULL && !m_pItem->GetReadOnly() && SelectConstraint(+1, TRUE)) { m_pGrid->SetFocus(); return; } CDegreeEdit::OnLButtonDblClk(nFlags, point); } void CInplaceDegreeEdit::DestroyItem() { // reset variables to defaults. m_pItem = NULL; m_pGrid = NULL; m_strValue.Empty(); m_brBack.DeleteObject(); // destroy the window. DestroyWindow( ); } ///////////////////////////////////////////////////////////////////////////// // CPropertyGridExtItemDegree ///////////////////////////////////////////////////////////////////////////// CPropertyGridExtItemDegree::CPropertyGridExtItemDegree(CString strCaption, double fDegree, int nSecondPrecision) : CPropertyGridItem(strCaption) , m_wndDegreeEdit(nSecondPrecision) { m_wndDegreeEdit.m_pItem = this; m_pBindDegree = NULL; m_nFlags = pgitemHasEdit; m_nSecondPrecision = nSecondPrecision; SetDegree(fDegree); } CPropertyGridExtItemDegree::CPropertyGridExtItemDegree(UINT nID, double fDegree, int nSecondPrecision) : CPropertyGridItem(nID) , m_wndDegreeEdit(nSecondPrecision) { m_wndDegreeEdit.m_pItem = this; m_pBindDegree = NULL; m_nFlags = pgitemHasEdit; m_nSecondPrecision = nSecondPrecision; SetDegree(fDegree); } CPropertyGridExtItemDegree::~CPropertyGridExtItemDegree() { m_wndDegreeEdit.DestroyItem(); } void CPropertyGridExtItemDegree::SetDegree(double fDegree) { m_fDegree = fDegree; CPropertyGridItem::SetValue( CDegreeEdit::DegreeToString(m_fDegree, m_nSecondPrecision) ); if (m_pBindDegree) *m_pBindDegree = m_fDegree; } double CPropertyGridExtItemDegree::GetDegree() { return m_fDegree; } void CPropertyGridExtItemDegree::SetValue(CString strValue) { SetDegree(CDegreeEdit::StringToDegree(strValue)); } void CPropertyGridExtItemDegree::OnValidateEdit() { if (m_wndDegreeEdit.GetSafeHwnd()) { m_wndDegreeEdit.ShowWindow(SW_HIDE); CString strValue; m_wndDegreeEdit.GetWindowText(strValue); if (m_strValue != strValue) { OnValueChanged(strValue); m_pGrid->Invalidate(FALSE); } } } void CPropertyGridExtItemDegree::SetEditText(CString str) { if (!m_pGrid) return; if (m_wndDegreeEdit.GetSafeHwnd()) m_wndDegreeEdit.SetWindowText(str); } void CPropertyGridExtItemDegree::OnSelect() { ASSERT(m_bVisible); if (!m_bReadOnly && (m_nFlags & (pgitemHasComboButton | pgitemHasExpandButton))) { GetInplaceButton().Create(this, GetItemRect()); } if (m_nFlags & pgitemHasEdit) { m_wndDegreeEdit.SetValue(m_strValue); m_wndDegreeEdit.Create(this, GetValueRect()); m_wndDegreeEdit.SetReadOnly(m_bReadOnly); m_wndDegreeEdit.SetFont(GetGrid()->GetFont()); m_wndDegreeEdit.SetMargins(3, 0); } } BOOL CPropertyGridExtItemDegree::OnChar(UINT nChar) { if (m_nFlags & pgitemHasEdit) { OnSelect(); m_wndDegreeEdit.SetFocus(); m_wndDegreeEdit.MaskSelectAll(); if (nChar != VK_TAB) m_wndDegreeEdit.SendMessage(WM_CHAR, nChar); return TRUE; } return FALSE; } void CPropertyGridExtItemDegree::OnLButtonDblClk() { if (HasChilds()) { if(m_bExpanded) Collapse(); else Expand(); } else { OnSelect(); if (m_nFlags & pgitemHasEdit) { if (!GetReadOnly() && m_wndDegreeEdit.SelectConstraint(+1, TRUE)) { OnValidateEdit(); } else { m_wndDegreeEdit.SetFocus(); m_wndDegreeEdit.MaskSelectAll(); } } else if (!GetReadOnly()) { CPGItemConstraints* pList = GetConstraints(); if (pList->IsEmpty()) return ; int nIndex = pList->FindConstraint(m_strValue); nIndex += +1; if (nIndex >= pList->GetCount()) nIndex = 0; POSITION pos = pList->FindIndex(nIndex); OnValueChanged(pList->GetAt(pos)); } } } void CPropertyGridExtItemDegree::BindToDegree(double* pBindDegree) { m_pBindDegree = pBindDegree; if (m_pBindDegree) SetDegree(*m_pBindDegree); }