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