#include "stdafx.h" #include "PropertyGridInplaceEdit.h" #include "PropertyGridInplaceButton.h" #include "PropertyGridInplaceList.h" #include "PropertyGridItem.h" #include "PropertyGridExtItemMaskEdit.h" #include "PropertyGrid.h" ///////////////////////////////////////////////////////////////////////////// // CInplaceMaskEdit ///////////////////////////////////////////////////////////////////////////// CInplaceMaskEdit::CInplaceMaskEdit() : m_pItem(0) , m_pGrid(0) { } CInplaceMaskEdit::~CInplaceMaskEdit() { } BEGIN_MESSAGE_MAP(CInplaceMaskEdit, CMaskEdit) //{{AFX_MSG_MAP(CInplaceMaskEdit) 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 CInplaceMaskEdit::SetValue(CString strValue) { m_strValue = strValue; } void CInplaceMaskEdit::Create(CPropertyGridExtItemMaskEdit* pItem, CRect rect) { ASSERT(pItem && pItem->GetGrid()); m_pGrid = pItem->GetGrid(); m_pItem = pItem; if (!m_hWnd) { CMaskEdit::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 CInplaceMaskEdit::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 CInplaceMaskEdit::OnEnSetfocus() { ASSERT(m_pItem && m_pGrid); m_pGrid->Invalidate(FALSE); } void CInplaceMaskEdit::OnEnKillfocus() { if (m_pItem) { m_pItem->OnValidateEdit(); m_pGrid->Invalidate(FALSE); } } UINT CInplaceMaskEdit::OnGetDlgCode() { return DLGC_WANTALLKEYS; } void CInplaceMaskEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) { if (nChar == VK_TAB) return; if (nChar == VK_ESCAPE || nChar == VK_RETURN) { m_pGrid->SetFocus(); return; } CMaskEdit::OnChar(nChar, nRepCnt, nFlags); } void CInplaceMaskEdit::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; } } CMaskEdit::OnKeyDown(nChar, nRepCnt, nFlags); } BOOL CInplaceMaskEdit::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 CInplaceMaskEdit::OnLButtonDblClk(UINT nFlags, CPoint point) { if (m_pItem != NULL && !m_pItem->GetReadOnly() && SelectConstraint(+1, TRUE)) { m_pGrid->SetFocus(); return; } CMaskEdit::OnLButtonDblClk(nFlags, point); } void CInplaceMaskEdit::DestroyItem() { // reset variables to defaults. m_pItem = NULL; m_pGrid = NULL; m_strValue.Empty(); m_brBack.DeleteObject(); // destroy the window. DestroyWindow( ); } ///////////////////////////////////////////////////////////////////////////// // CPropertyGridExtItemMaskEdit ///////////////////////////////////////////////////////////////////////////// CPropertyGridExtItemMaskEdit::CPropertyGridExtItemMaskEdit(CString strCaption, LPCTSTR lpszMask, LPCTSTR lpszLiteral, LPCTSTR lpszDefault /* = NULL */, TCHAR chPrompt /* = _T('_') */ ) : CPropertyGridItem(strCaption) { m_wndMaskEdit.m_pItem = this; m_nFlags = pgitemHasEdit; m_chPrompt = chPrompt; m_strEditMask = lpszMask; m_strLiteral = lpszLiteral; if (lpszDefault == NULL) { m_strValue = lpszLiteral; m_strDefault = lpszLiteral; } else { m_strValue = lpszDefault; m_strDefault = lpszDefault; } } CPropertyGridExtItemMaskEdit::CPropertyGridExtItemMaskEdit(UINT nID, LPCTSTR lpszMask, LPCTSTR lpszLiteral, LPCTSTR lpszDefault /* = NULL */, TCHAR chPrompt /* = _T('_') */ ) : CPropertyGridItem(nID) { m_wndMaskEdit.m_pItem = this; m_nFlags = pgitemHasEdit; m_chPrompt = chPrompt; m_strEditMask = lpszMask; m_strLiteral = lpszLiteral; if (lpszDefault == NULL) { m_strValue = lpszLiteral; m_strDefault = lpszLiteral; } else { m_strValue = lpszDefault; m_strDefault = lpszDefault; } } CPropertyGridExtItemMaskEdit::~CPropertyGridExtItemMaskEdit() { m_wndMaskEdit.DestroyItem(); } void CPropertyGridExtItemMaskEdit::OnValidateEdit() { if (m_wndMaskEdit.GetSafeHwnd()) { m_wndMaskEdit.ShowWindow(SW_HIDE); CString strValue; m_wndMaskEdit.GetWindowText(strValue); if (m_strValue != strValue) { OnValueChanged(strValue); m_pGrid->Invalidate(FALSE); } } } void CPropertyGridExtItemMaskEdit::SetEditText(CString str) { if (!m_pGrid) return; if (m_wndMaskEdit.GetSafeHwnd()) m_wndMaskEdit.SetWindowText(str); } void CPropertyGridExtItemMaskEdit::OnSelect() { ASSERT(m_bVisible); if (!m_bReadOnly && (m_nFlags & (pgitemHasComboButton | pgitemHasExpandButton))) { GetInplaceButton().Create(this, GetItemRect()); } if (m_nFlags & pgitemHasEdit) { m_wndMaskEdit.SetValue(m_strValue); m_wndMaskEdit.Create(this, GetValueRect()); m_wndMaskEdit.SetReadOnly(m_bReadOnly); m_wndMaskEdit.SetPromptChar( m_chPrompt ); m_wndMaskEdit.SetEditMask( m_strEditMask, m_strLiteral, m_strDefault ); m_wndMaskEdit.SetWindowText( m_strValue ); m_wndMaskEdit.SetFont(GetGrid()->GetFont()); m_wndMaskEdit.SetMargins(3, 0); } } BOOL CPropertyGridExtItemMaskEdit::OnChar(UINT nChar) { if (m_nFlags & pgitemHasEdit) { OnSelect(); m_wndMaskEdit.SetFocus(); m_wndMaskEdit.MaskSelectAll(); if (nChar != VK_TAB) m_wndMaskEdit.SendMessage(WM_CHAR, nChar); return TRUE; } return FALSE; } void CPropertyGridExtItemMaskEdit::OnLButtonDblClk() { if (HasChilds()) { if(m_bExpanded) Collapse(); else Expand(); } else { OnSelect(); if (m_nFlags & pgitemHasEdit) { if (!GetReadOnly() && m_wndMaskEdit.SelectConstraint(+1, TRUE)) { OnValidateEdit(); } else { m_wndMaskEdit.SetFocus(); m_wndMaskEdit.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)); } } }