| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333 |
- #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));
- }
- }
- }
|