BCGPPropList.cpp
上传用户:cnlanbo1
上传日期:2009-08-06
资源大小:19862k
文件大小:136k
- //*******************************************************************************
- // COPYRIGHT NOTES
- // ---------------
- // This is a part of the BCGControlBar Library
- // Copyright (C) 1998-2008 BCGSoft Ltd.
- // All rights reserved.
- //
- // This source code can be used, distributed or modified
- // only under terms and conditions
- // of the accompanying license agreement.
- //*******************************************************************************
- //
- // BCGPPropList.cpp : implementation file
- //
- #include "stdafx.h"
- #include "bcgcbpro.h"
- #include "BCGPPropList.h"
- #ifndef BCGP_EXCLUDE_PROP_LIST
- #ifndef _BCGPGRID_STANDALONE
- #include "BCGPColorBar.h"
- #include "BCGPWorkspace.h"
- #include "BCGPShellManager.h"
- #include "MenuImages.h"
- #include "BCGPVisualManager.h"
- #include "BCGPToolbarComboBoxButton.h"
- #include "BCGPPopupMenu.h"
- #else
- #include "BCGPGridVisualManager.h"
- #endif
- #include "BCGPDrawManager.h"
- #include "BCGPMaskEdit.h"
- #include "BCGPSpinButtonCtrl.h"
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
- #define ID_HEADER 1
- #define ID_SCROLL_VERT 2
- #define STRETCH_DELTA 2
- #define TEXT_MARGIN 4
- #define UM_UPDATESPIN (WM_USER + 101)
- #ifndef _BCGPGRID_STANDALONE
- extern CBCGPWorkspace* g_pWorkspace;
- #define visualManager CBCGPVisualManager::GetInstance ()
- #else
- #define visualManager CBCGPGridVisualManager::GetInstance ()
- #endif
- /////////////////////////////////////////////////////////////////////////////
- // CBCGPProp
- IMPLEMENT_DYNAMIC(CBCGPProp, CObject)
- #define PROP_HAS_LIST 0x0001
- #define PROP_HAS_BUTTON 0x0002
- #define PROP_HAS_SPIN 0x0004
- CString CBCGPProp::m_strFormatChar = _T("%c");
- CString CBCGPProp::m_strFormatShort = _T("%d");
- CString CBCGPProp::m_strFormatLong = _T("%ld");
- CString CBCGPProp::m_strFormatUShort = _T("%u");
- CString CBCGPProp::m_strFormatULong = _T("%u");
- CString CBCGPProp::m_strFormatFloat = _T("%f");
- CString CBCGPProp::m_strFormatDouble = _T("%lf");
- CBCGPProp::CBCGPProp(const CString& strName, const _variant_t& varValue,
- LPCTSTR lpszDescr, DWORD_PTR dwData, LPCTSTR lpszEditMask,
- LPCTSTR lpszEditTemplate, LPCTSTR lpszValidChars) :
- m_strName (strName),
- m_varValue (varValue),
- m_varValueOrig (varValue),
- m_strDescr (lpszDescr == NULL ? _T("") : lpszDescr),
- m_strEditMask (lpszEditMask == NULL ? _T("") : lpszEditMask),
- m_strEditTempl (lpszEditTemplate == NULL ? _T("") : lpszEditTemplate),
- m_strValidChars (lpszValidChars == NULL ? _T("") : lpszValidChars),
- m_dwData (dwData)
- {
- m_bGroup = FALSE;
- m_bIsValueList = FALSE;
- Init ();
- SetFlags ();
- if (m_varValue.vt == VT_BOOL)
- {
- m_bAllowEdit = FALSE;
- }
- }
- //******************************************************************************************
- CBCGPProp::CBCGPProp(const CString& strGroupName, DWORD_PTR dwData,
- BOOL bIsValueList) :
- m_strName (strGroupName),
- m_dwData (dwData),
- m_bIsValueList (bIsValueList)
- {
- m_bGroup = TRUE;
- Init ();
- SetFlags ();
- }
- //****************************************************************************************
- void CBCGPProp::SetFlags ()
- {
- m_dwFlags = 0;
- switch (m_varValue.vt)
- {
- case VT_BSTR:
- case VT_R4:
- case VT_R8:
- case VT_UI1:
- case VT_I2:
- case VT_I4:
- case VT_INT:
- case VT_UINT:
- case VT_UI2:
- case VT_UI4:
- break;
- case VT_DATE:
- break;
- case VT_BOOL:
- m_dwFlags = PROP_HAS_LIST;
- break;
- default:
- break;
- }
- }
- //******************************************************************************************
- void CBCGPProp::Init ()
- {
- m_pWndList = NULL;
- m_bExpanded = !m_bIsValueList;
- m_bEnabled = TRUE;
- m_pParent = NULL;
- m_pWndInPlace = NULL;
- m_pWndCombo = NULL;
- m_pWndSpin = NULL;
- m_bInPlaceEdit = FALSE;
- m_bButtonIsFocused = FALSE;
- m_bButtonIsDown = FALSE;
- m_bAllowEdit = TRUE;
- m_bNameIsTrancated = FALSE;
- m_bValueIsTrancated = FALSE;
- m_Rect.SetRectEmpty ();
- m_rectButton.SetRectEmpty ();
- m_nMinValue = 0;
- m_nMaxValue = 0;
- m_bIsModified = FALSE;
- m_bIsVisible = TRUE;
- }
- //*******************************************************************************************
- CBCGPProp::~CBCGPProp()
- {
- while (!m_lstSubItems.IsEmpty ())
- {
- delete m_lstSubItems.RemoveHead ();
- }
- OnDestroyWindow ();
- }
- //******************************************************************************************
- void CBCGPProp::OnDestroyWindow ()
- {
- if (m_pWndCombo != NULL)
- {
- m_pWndCombo->DestroyWindow ();
- delete m_pWndCombo;
- m_pWndCombo = NULL;
- }
- if (m_pWndInPlace != NULL)
- {
- m_pWndInPlace->DestroyWindow ();
- delete m_pWndInPlace;
- m_pWndInPlace = NULL;
- }
- if (m_pWndSpin != NULL)
- {
- m_pWndSpin->DestroyWindow ();
- delete m_pWndSpin;
- m_pWndSpin = NULL;
- }
- if (m_varValue.vt == VT_BOOL)
- {
- m_lstOptions.RemoveAll ();
- }
- }
- //****************************************************************************************
- BOOL CBCGPProp::HasButton () const
- {
- return (m_dwFlags & PROP_HAS_LIST) ||
- (m_dwFlags & PROP_HAS_BUTTON);
- }
- //****************************************************************************************
- BOOL CBCGPProp::AddSubItem (CBCGPProp* pProp)
- {
- ASSERT_VALID (this);
- ASSERT_VALID (pProp);
- if (!IsGroup ())
- {
- ASSERT(FALSE);
- return FALSE;
- }
- if (pProp->m_pWndList != NULL)
- {
- for (POSITION pos = pProp->m_pWndList->m_lstProps.GetHeadPosition (); pos != NULL;)
- {
- CBCGPProp* pListProp = pProp->m_pWndList->m_lstProps.GetNext (pos);
- ASSERT_VALID (pListProp);
- if (pListProp == pProp || pListProp->IsSubItem (pProp))
- {
- // Can't ad the same property twice
- ASSERT (FALSE);
- return FALSE;
- }
- }
- }
- pProp->m_pParent = this;
- m_lstSubItems.AddTail (pProp);
- pProp->m_pWndList = m_pWndList;
- return TRUE;
- }
- //*******************************************************************************************
- BOOL CBCGPProp::RemoveSubItem (CBCGPProp*& pProp, BOOL bDelete/* = TRUE*/)
- {
- ASSERT_VALID (this);
- ASSERT_VALID (pProp);
- for (POSITION pos = m_lstSubItems.GetHeadPosition (); pos != NULL;)
- {
- POSITION posSaved = pos;
- CBCGPProp* pListProp = m_lstSubItems.GetNext (pos);
- ASSERT_VALID (pListProp);
- if (pListProp == pProp)
- {
- m_lstSubItems.RemoveAt (posSaved);
- if (m_pWndList != NULL && m_pWndList->m_pSel == pProp)
- {
- m_pWndList->m_pSel = NULL;
- }
- if (bDelete)
- {
- delete pProp;
- pProp = NULL;
- }
- return TRUE;
- }
- if (pListProp->RemoveSubItem (pProp, bDelete))
- {
- return TRUE;
- }
- }
- return FALSE;
- }
- //*******************************************************************************************
- BOOL CBCGPProp::AddOption (LPCTSTR lpszOption, BOOL bInsertUnique/* = TRUE*/)
- {
- ASSERT_VALID (this);
- ASSERT (lpszOption != NULL);
- if (bInsertUnique)
- {
- if (m_lstOptions.Find (lpszOption) != NULL)
- {
- return FALSE;
- }
- }
- m_lstOptions.AddTail (lpszOption);
- m_dwFlags = PROP_HAS_LIST;
- return TRUE;
- }
- //****************************************************************************************
- BOOL CBCGPPropList::DeleteProperty (CBCGPProp*& pProp, BOOL bRedraw, BOOL bAdjustLayout)
- {
- ASSERT_VALID (this);
- ASSERT_VALID (pProp);
- BOOL bFound = FALSE;
- for (POSITION pos = m_lstProps.GetHeadPosition (); pos != NULL;)
- {
- POSITION posSaved = pos;
- CBCGPProp* pListProp = m_lstProps.GetNext (pos);
- ASSERT_VALID (pListProp);
- if (pListProp == pProp) // Top level property
- {
- bFound = TRUE;
- m_lstProps.RemoveAt (posSaved);
- break;
- }
- if (pListProp->RemoveSubItem (pProp, FALSE))
- {
- bFound = TRUE;
- break;
- }
- }
- if (!bFound)
- {
- return FALSE;
- }
- if (m_pSel == pProp)
- {
- m_pSel = NULL;
- }
- delete pProp;
- pProp = NULL;
- if (bAdjustLayout)
- {
- AdjustLayout ();
- if (bRedraw && GetSafeHwnd () != NULL)
- {
- RedrawWindow ();
- }
- }
- return TRUE;
- }
- //*****************************************************************************************
- void CBCGPProp::RemoveAllOptions ()
- {
- ASSERT_VALID (this);
- m_lstOptions.RemoveAll ();
- m_dwFlags = 0;
- }
- //****************************************************************************************
- int CBCGPProp::GetOptionCount () const
- {
- ASSERT_VALID (this);
- return (int) m_lstOptions.GetCount ();
- }
- //****************************************************************************************
- LPCTSTR CBCGPProp::GetOption (int nIndex) const
- {
- ASSERT_VALID (this);
- if (nIndex < 0 || nIndex >= m_lstOptions.GetCount ())
- {
- ASSERT (FALSE);
- return NULL;
- }
- POSITION pos = m_lstOptions.FindIndex (nIndex);
- if (pos == NULL)
- {
- ASSERT (FALSE);
- return NULL;
- }
- return m_lstOptions.GetAt (pos);
- }
- //*****************************************************************************************
- int CBCGPProp::GetExpandedSubItems (BOOL bIncludeHidden) const
- {
- ASSERT_VALID (this);
- if (!m_bExpanded)
- {
- return 0;
- }
- int nCount = 0;
- for (POSITION pos = m_lstSubItems.GetHeadPosition (); pos != NULL;)
- {
- CBCGPProp* pProp = m_lstSubItems.GetNext (pos);
- ASSERT_VALID (pProp);
- if (bIncludeHidden || pProp->IsVisible ())
- {
- nCount += pProp->GetExpandedSubItems (bIncludeHidden) + 1;
- }
- }
- return nCount;
- }
- //*******************************************************************************************
- CBCGPProp* CBCGPProp::HitTest (CPoint point, ClickArea* pnArea)
- {
- ASSERT_VALID (this);
- ASSERT_VALID (m_pWndList);
- if (m_Rect.PtInRect (point))
- {
- if (pnArea != NULL)
- {
- if (IsGroup () && point.x < m_Rect.left + m_Rect.Height ())
- {
- *pnArea = ClickExpandBox;
- }
- else if (HasValueField () &&
- point.x > m_pWndList->m_rectList.left + m_pWndList->m_nLeftColumnWidth)
- {
- *pnArea = ClickValue;
- }
- else
- {
- *pnArea = ClickName;
- }
- }
- return this;
- }
- for (POSITION pos = m_lstSubItems.GetHeadPosition (); pos != NULL;)
- {
- CBCGPProp* pProp = m_lstSubItems.GetNext (pos);
- ASSERT_VALID (pProp);
- CBCGPProp* pHit = pProp->HitTest (point, pnArea);
- if (pHit != NULL)
- {
- return pHit;
- }
- }
- return NULL;
- }
- //*******************************************************************************************
- void CBCGPProp::Expand (BOOL bExpand)
- {
- ASSERT_VALID (this);
- ASSERT (IsGroup ());
- if (m_bExpanded == bExpand ||
- m_lstSubItems.IsEmpty ())
- {
- return;
- }
- m_bExpanded = bExpand;
- if (m_pWndList != NULL && m_pWndList->GetSafeHwnd () != NULL)
- {
- ASSERT_VALID (m_pWndList);
- m_pWndList->AdjustLayout ();
- CRect rectRedraw = m_pWndList->m_rectList;
- rectRedraw.top = m_Rect.top;
- m_pWndList->RedrawWindow (rectRedraw);
- }
- }
- //*******************************************************************************************
- void CBCGPProp::ExpandDeep (BOOL bExpand)
- {
- ASSERT_VALID (this);
- m_bExpanded = bExpand;
- for (POSITION pos = m_lstSubItems.GetHeadPosition (); pos != NULL;)
- {
- CBCGPProp* pProp = m_lstSubItems.GetNext (pos);
- ASSERT_VALID (pProp);
- pProp->ExpandDeep (bExpand);
- }
- }
- //*******************************************************************************************
- void CBCGPProp::ResetOriginalValue ()
- {
- ASSERT_VALID (this);
- m_bIsModified = FALSE;
- SetValue (m_varValueOrig);
- for (POSITION pos = m_lstSubItems.GetHeadPosition (); pos != NULL;)
- {
- CBCGPProp* pProp = m_lstSubItems.GetNext (pos);
- ASSERT_VALID (pProp);
- pProp->ResetOriginalValue ();
- }
- }
- //*******************************************************************************************
- void CBCGPProp::CommitModifiedValue ()
- {
- ASSERT_VALID (this);
- m_bIsModified = FALSE;
- SetOriginalValue (m_varValue);
- for (POSITION pos = m_lstSubItems.GetHeadPosition (); pos != NULL;)
- {
- CBCGPProp* pProp = m_lstSubItems.GetNext (pos);
- ASSERT_VALID (pProp);
- pProp->CommitModifiedValue ();
- }
- }
- //*******************************************************************************************
- void CBCGPProp::Redraw ()
- {
- ASSERT_VALID (this);
- if (m_pWndList != NULL)
- {
- ASSERT_VALID (m_pWndList);
- m_pWndList->InvalidateRect (m_Rect);
- if (m_pParent != NULL && m_pParent->m_bIsValueList)
- {
- m_pWndList->InvalidateRect (m_pParent->m_Rect);
- }
- if (m_bIsValueList)
- {
- for (POSITION pos = m_lstSubItems.GetHeadPosition (); pos != NULL;)
- {
- CBCGPProp* pProp = m_lstSubItems.GetNext (pos);
- ASSERT_VALID (pProp);
- m_pWndList->InvalidateRect (pProp->m_Rect);
- }
- }
- m_pWndList->UpdateWindow ();
- }
- }
- //*******************************************************************************************
- void CBCGPProp::EnableSpinControl (BOOL bEnable, int nMin, int nMax)
- {
- ASSERT_VALID (this);
- switch (m_varValue.vt)
- {
- case VT_INT:
- case VT_UINT:
- case VT_I2:
- case VT_I4:
- case VT_UI2:
- case VT_UI4:
- break;
- default:
- ASSERT (FALSE);
- return;
- }
- m_nMinValue = nMin;
- m_nMaxValue = nMax;
- if (bEnable)
- {
- m_dwFlags |= PROP_HAS_SPIN;
- }
- else
- {
- m_dwFlags &= ~PROP_HAS_SPIN;
- }
- }
- //*******************************************************************************************
- BOOL CBCGPProp::IsSelected () const
- {
- ASSERT_VALID (this);
- ASSERT_VALID (m_pWndList);
- return m_pWndList->m_pSel == this;
- }
- //******************************************************************************************
- void CBCGPProp::SetName (LPCTSTR lpszName, BOOL bRedraw)
- {
- ASSERT_VALID (this);
- if (lpszName == NULL)
- {
- ASSERT (FALSE);
- return;
- }
- m_strName = lpszName;
- if (bRedraw)
- {
- Redraw ();
- }
- }
- //******************************************************************************************
- void CBCGPProp::SetValue (const _variant_t& varValue)
- {
- ASSERT_VALID (this);
- if (m_varValue.vt != VT_EMPTY && m_varValue.vt != varValue.vt)
- {
- ASSERT (FALSE);
- return;
- }
- BOOL bInPlaceEdit = m_bInPlaceEdit;
- if (bInPlaceEdit)
- {
- OnEndEdit ();
- }
- m_varValue = varValue;
- Redraw ();
- if (bInPlaceEdit)
- {
- ASSERT_VALID (m_pWndList);
- m_pWndList->EditItem (this);
- }
- }
- //*****************************************************************************************
- void CBCGPProp::SetOriginalValue (const _variant_t& varValue)
- {
- ASSERT_VALID (this);
- if (m_varValueOrig.vt != VT_EMPTY && m_varValueOrig.vt != varValue.vt)
- {
- ASSERT (FALSE);
- return;
- }
- m_varValueOrig = varValue;
- }
- //*****************************************************************************************
- BOOL CBCGPProp::IsParentExpanded () const
- {
- ASSERT_VALID (this);
- for (CBCGPProp* pProp = m_pParent; pProp != NULL;)
- {
- ASSERT_VALID (pProp);
- if (!pProp->IsExpanded ())
- {
- return FALSE;
- }
- pProp = pProp->m_pParent;
- }
- return TRUE;
- }
- //******************************************************************************************
- int CBCGPProp::GetHierarchyLevel () const
- {
- ASSERT_VALID (this);
- int nLevel = 0;
- for (CBCGPProp* pParent = m_pParent; pParent != NULL;
- pParent = pParent->m_pParent)
- {
- nLevel++;
- }
- return nLevel;
- }
- //*******************************************************************************************
- CBCGPProp* CBCGPProp::GetSubItem (int nIndex) const
- {
- ASSERT_VALID (this);
- if (nIndex < 0 || nIndex >= m_lstSubItems.GetCount ())
- {
- ASSERT (FALSE);
- return NULL;
- }
- return m_lstSubItems.GetAt (m_lstSubItems.FindIndex (nIndex));
- }
- //*******************************************************************************************
- void CBCGPProp::Enable (BOOL bEnable/* = TRUE*/)
- {
- ASSERT_VALID (this);
- if (m_bEnabled != bEnable)
- {
- m_bEnabled = bEnable;
- if (m_pWndList->GetSafeHwnd () != NULL)
- {
- ASSERT_VALID (m_pWndList);
- m_pWndList->InvalidateRect (m_Rect);
- }
- }
- }
- //*******************************************************************************************
- void CBCGPProp::SetOwnerList (CBCGPPropList* pWndList)
- {
- ASSERT_VALID (this);
- ASSERT_VALID (pWndList);
- m_pWndList = pWndList;
- for (POSITION pos = m_lstSubItems.GetHeadPosition (); pos != NULL;)
- {
- CBCGPProp* pProp = m_lstSubItems.GetNext (pos);
- ASSERT_VALID (pProp);
- pProp->SetOwnerList (m_pWndList);
- }
- }
- //*******************************************************************************************
- void CBCGPProp::Repos (int& y)
- {
- ASSERT_VALID (this);
- ASSERT_VALID (m_pWndList);
- CRect rectOld = m_Rect;
-
- BOOL bShowProperty = m_bIsVisible && (IsParentExpanded () || m_pWndList->m_bAlphabeticMode);
- if (m_pWndList->m_bAlphabeticMode && m_pParent != NULL &&
- m_pParent->m_bIsValueList && !IsParentExpanded ())
- {
- bShowProperty = FALSE;
- }
- if (bShowProperty)
- {
- int dx = m_pWndList->m_bAlphabeticMode ?
- m_pWndList->m_nRowHeight :
- GetHierarchyLevel () * m_pWndList->m_nRowHeight;
- if (m_pWndList->m_bAlphabeticMode && m_bIsValueList)
- {
- dx = 0;
- }
- m_Rect = CRect (
- m_pWndList->m_rectList.left + dx,
- y,
- m_pWndList->m_rectList.right,
- y + m_pWndList->m_nRowHeight);
- if (!m_rectButton.IsRectEmpty ())
- {
- m_rectButton.top = m_Rect.top + 1;
- m_rectButton.bottom = m_Rect.bottom;
- }
- y += m_pWndList->m_nRowHeight;
- CRect rectName = m_Rect;
- rectName.right = m_pWndList->m_rectList.left + m_pWndList->m_nLeftColumnWidth;
- if (IsWindow (m_pWndList->m_ToolTip.GetSafeHwnd ()))
- {
- m_pWndList->m_ToolTip.AddTool (m_pWndList, LPSTR_TEXTCALLBACK, rectName, m_pWndList->m_nTooltipsCount + 1);
- m_pWndList->m_nTooltipsCount ++;
- if (!IsGroup ())
- {
- CRect rectValue = m_Rect;
- rectValue.left = rectName.right + 1;
- m_pWndList->m_ToolTip.AddTool (m_pWndList, LPSTR_TEXTCALLBACK, rectValue, m_pWndList->m_nTooltipsCount + 1);
- m_pWndList->m_nTooltipsCount ++;
- }
- }
- }
- else
- {
- m_Rect.SetRectEmpty ();
- m_rectButton.SetRectEmpty ();
- }
- for (POSITION pos = m_lstSubItems.GetHeadPosition (); pos != NULL;)
- {
- CBCGPProp* pProp = m_lstSubItems.GetNext (pos);
- ASSERT_VALID (pProp);
- pProp->Repos (y);
- }
- OnPosSizeChanged (rectOld);
- }
- //******************************************************************************************
- void CBCGPProp::AddTerminalProp (CList<CBCGPProp*, CBCGPProp*>& lstProps)
- {
- ASSERT_VALID (this);
- if (!m_bGroup || m_bIsValueList)
- {
- // Insert sorted:
- BOOL bInserted = FALSE;
- for (POSITION pos = lstProps.GetHeadPosition (); !bInserted && pos != NULL;)
- {
- POSITION posSave = pos;
- CBCGPProp* pProp = lstProps.GetNext (pos);
- if (m_pWndList->CompareProps (pProp, this) > 0)
- {
- lstProps.InsertBefore (posSave, this);
- bInserted = TRUE;
- }
- }
- if (!bInserted)
- {
- lstProps.AddTail (this);
- }
- return;
- }
- m_Rect.SetRectEmpty ();
- for (POSITION pos = m_lstSubItems.GetHeadPosition (); pos != NULL;)
- {
- CBCGPProp* pProp = m_lstSubItems.GetNext (pos);
- ASSERT_VALID (pProp);
- pProp->AddTerminalProp (lstProps);
- }
- }
- //****************************************************************************************
- BOOL CBCGPProp::IsSubItem (CBCGPProp* pSubProp) const
- {
- ASSERT_VALID (this);
- ASSERT_VALID (pSubProp);
- for (POSITION pos = m_lstSubItems.GetHeadPosition (); pos != NULL;)
- {
- CBCGPProp* pProp = m_lstSubItems.GetNext (pos);
- ASSERT_VALID (pProp);
- if (pSubProp == pProp || pProp->IsSubItem (pSubProp))
- {
- return TRUE;
- }
- }
- return FALSE;
- }
- //******************************************************************************************
- CBCGPProp* CBCGPProp::FindSubItemByData (DWORD_PTR dwData) const
- {
- ASSERT_VALID (this);
-
- for (POSITION pos = m_lstSubItems.GetHeadPosition (); pos != NULL;)
- {
- CBCGPProp* pProp = m_lstSubItems.GetNext (pos);
- ASSERT_VALID (pProp);
-
- if (pProp->m_dwData == dwData)
- {
- return pProp;
- }
-
- pProp = pProp->FindSubItemByData (dwData);
-
- if (pProp != NULL)
- {
- return pProp;
- }
- }
-
- return NULL;
- }
- //*****************************************************************************************
- CString CBCGPProp::FormatProperty ()
- {
- ASSERT_VALID (this);
- ASSERT_VALID (m_pWndList);
- _variant_t& var = m_varValue;
- CString strVal;
- if (m_bIsValueList)
- {
- for (POSITION pos = m_lstSubItems.GetHeadPosition (); pos != NULL;)
- {
- CBCGPProp* pProp = m_lstSubItems.GetNext (pos);
- ASSERT_VALID (pProp);
- strVal += pProp->FormatProperty ();
- if (pos != NULL)
- {
- strVal += m_pWndList->m_cListDelimeter;
- strVal += _T(' ');
- }
- }
-
- return strVal;
- }
- switch (var.vt)
- {
- case VT_BSTR:
- strVal = (LPCTSTR)(_bstr_t)var;
- break;
- case VT_I2:
- strVal.Format (m_strFormatShort, (short) var);
- break;
- case VT_I4:
- case VT_INT:
- strVal.Format (m_strFormatLong, (long) var);
- break;
- case VT_UI1:
- if ((BYTE) var != 0)
- {
- strVal.Format (m_strFormatChar, (TCHAR)(BYTE) var);
- }
- break;
- case VT_UI2:
- strVal.Format( m_strFormatUShort, var.uiVal);
- break;
- case VT_UINT:
- case VT_UI4:
- strVal.Format (m_strFormatULong, var.ulVal);
- break;
- case VT_R4:
- strVal.Format (m_strFormatFloat, (float) var);
- break;
- case VT_R8:
- strVal.Format (m_strFormatDouble, (double) var);
- break;
- case VT_BOOL:
- {
- bool bVal = (bool) var;
- strVal = bVal ? m_pWndList->m_strTrue : m_pWndList->m_strFalse;
- }
- break;
- default:
- // Unsupported type
- strVal = _T("*** error ***");
- }
- return strVal;
- }
- //****************************************************************************************
- void CBCGPProp::OnDrawName (CDC* pDC, CRect rect)
- {
- ASSERT_VALID (this);
- ASSERT_VALID (pDC);
- ASSERT_VALID (m_pWndList);
- COLORREF clrTextOld = (COLORREF)-1;
- if (IsSelected () && (!m_pWndList->m_bVSDotNetLook || !IsGroup () || m_bIsValueList))
- {
- CRect rectFill = rect;
- rectFill.top++;
- if (!m_pWndList->m_bFocused)
- {
- clrTextOld = pDC->SetTextColor (globalData.clrBtnText);
- pDC->FillRect (rectFill,
- m_pWndList->DrawControlBarColors () ? &globalData.brBarFace : &globalData.brBtnFace);
- }
- else
- {
- clrTextOld = pDC->SetTextColor (globalData.clrTextHilite);
- pDC->FillRect (rectFill, &globalData.brHilite);
- }
- }
- if (m_pWndList->m_bVSDotNetLook && IsGroup () && !m_bIsValueList)
- {
- if (m_pWndList->m_clrGroupText != (COLORREF)-1)
- {
- clrTextOld = pDC->SetTextColor (m_pWndList->m_clrGroupText);
- }
- else
- {
- clrTextOld = pDC->SetTextColor (visualManager->GetPropListGroupTextColor (m_pWndList));
- }
- }
- if (m_pParent != NULL && m_pParent->m_bIsValueList)
- {
- rect.left += rect.Height ();
- }
- rect.DeflateRect (TEXT_MARGIN, 0);
- int nTextHeight = pDC->DrawText (m_strName, rect,
- DT_LEFT | DT_SINGLELINE | DT_VCENTER | DT_NOPREFIX | DT_END_ELLIPSIS);
- m_bNameIsTrancated = pDC->GetTextExtent (m_strName).cx > rect.Width ();
- if (IsSelected () && m_pWndList->m_bVSDotNetLook && IsGroup () && !m_bIsValueList)
- {
- CRect rectFocus = rect;
- rectFocus.top = rectFocus.CenterPoint ().y - nTextHeight / 2;
- rectFocus.bottom = rectFocus.top + nTextHeight;
- rectFocus.right =
- min (rect.right, rectFocus.left + pDC->GetTextExtent (m_strName).cx);
- rectFocus.InflateRect (2, 0);
- COLORREF clrShadow = m_pWndList->DrawControlBarColors () ?
- globalData.clrBarShadow : globalData.clrBtnShadow;
- pDC->Draw3dRect (rectFocus, clrShadow, clrShadow);
- }
- if (clrTextOld != (COLORREF)-1)
- {
- pDC->SetTextColor (clrTextOld);
- }
- }
- //******************************************************************************************
- void CBCGPProp::OnDrawValue (CDC* pDC, CRect rect)
- {
- ASSERT_VALID (this);
- ASSERT_VALID (pDC);
- ASSERT_VALID (m_pWndList);
- if ((IsGroup () && !m_bIsValueList) || !HasValueField ())
- {
- return;
- }
- CFont* pOldFont = NULL;
- if (IsModified () && m_pWndList->m_bMarkModifiedProperties)
- {
- pOldFont = pDC->SelectObject (&m_pWndList->m_fontBold);
- }
- CString strVal = FormatProperty ();
- rect.DeflateRect (TEXT_MARGIN, 0);
- pDC->DrawText (strVal, rect,
- DT_LEFT | DT_SINGLELINE | DT_VCENTER | DT_NOPREFIX | DT_END_ELLIPSIS);
- m_bValueIsTrancated = pDC->GetTextExtent (strVal).cx > rect.Width ();
- if (pOldFont != NULL)
- {
- pDC->SelectObject (pOldFont);
- }
- }
- //******************************************************************************************
- void CBCGPProp::OnDrawButton (CDC* pDC, CRect rect)
- {
- ASSERT_VALID (this);
- ASSERT_VALID (pDC);
- ASSERT_VALID (m_pWndList);
- CBCGPToolbarComboBoxButton button;
- pDC->FillRect (rect, m_pWndList->DrawControlBarColors () ?
- &globalData.brBarFace : &globalData.brBtnFace);
- if (m_dwFlags & PROP_HAS_LIST)
- {
- visualManager->OnDrawComboDropButton (pDC,
- rect, !m_bEnabled, m_bButtonIsDown, m_bButtonIsDown, &button);
- return;
- }
- CString str = _T("...");
- pDC->DrawText (str, rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
- #ifndef _BCGPGRID_STANDALONE
- CBCGPVisualManager::BCGBUTTON_STATE state =
- m_bButtonIsDown ?
- CBCGPVisualManager::ButtonsIsPressed :
- CBCGPVisualManager::ButtonsIsRegular;
- visualManager->OnDrawButtonBorder (pDC, &button, rect, state);
- #else
- COLORREF colorBorder = globalData.IsHighContastMode () ?
- globalData.clrBtnDkShadow : globalData.clrHilite;
- pDC->Draw3dRect (rect, colorBorder, colorBorder);
- #endif
- if (m_bButtonIsFocused)
- {
- CRect rectFocus = rect;
- rectFocus.DeflateRect (2, 2);
- pDC->DrawFocusRect (rectFocus);
- }
- }
- //****************************************************************************************
- void CBCGPProp::OnDrawExpandBox (CDC* pDC, CRect rect)
- {
- ASSERT_VALID (this);
- ASSERT_VALID (pDC);
- ASSERT_VALID (m_pWndList);
- ASSERT (IsGroup ());
- CPoint ptCenter = rect.CenterPoint ();
- int nBoxSize = min (9, rect.Width ());
- rect = CRect (ptCenter, CSize (1, 1));
- rect.InflateRect (nBoxSize / 2, nBoxSize / 2);
- if (m_bIsValueList)
- {
- if (m_pWndList->m_brBackground.GetSafeHandle () != NULL)
- {
- pDC->FillRect (rect, &m_pWndList->m_brBackground);
- }
- else
- {
- pDC->FillRect (rect, &globalData.brWindow);
- }
- }
- COLORREF clrShadow = m_pWndList->DrawControlBarColors () ?
- globalData.clrBarShadow : globalData.clrBtnShadow;
- COLORREF clrText = m_pWndList->DrawControlBarColors () ?
- globalData.clrBarText : globalData.clrBtnText;
- visualManager->OnDrawExpandingBox (pDC, rect,
- m_bExpanded && !m_lstSubItems.IsEmpty (),
- m_pWndList->m_bVSDotNetLook ? clrText : clrShadow);
- }
- //******************************************************************************************
- void CBCGPProp::OnDrawDescription (CDC* pDC, CRect rect)
- {
- ASSERT_VALID (this);
- ASSERT_VALID (pDC);
- ASSERT_VALID (m_pWndList);
- HFONT hOldFont = (HFONT) ::SelectObject (pDC->GetSafeHdc (), m_pWndList->m_fontBold.GetSafeHandle ());
- int nHeight = pDC->DrawText (m_strName, rect, DT_SINGLELINE | DT_NOPREFIX);
- ::SelectObject (pDC->GetSafeHdc (), hOldFont);
- rect.top += nHeight + 2;
- pDC->DrawText (m_strDescr, rect, DT_WORDBREAK | DT_NOPREFIX | DT_END_ELLIPSIS);
- }
- //******************************************************************************************
- BOOL CBCGPProp::OnUpdateValue ()
- {
- ASSERT_VALID (this);
- ASSERT_VALID (m_pWndInPlace);
- ASSERT_VALID (m_pWndList);
- ASSERT (::IsWindow (m_pWndInPlace->GetSafeHwnd ()));
- CString strText;
- m_pWndInPlace->GetWindowText (strText);
- BOOL bRes = FALSE;
- BOOL bIsChanged = FormatProperty () != strText;
- if (m_bIsValueList)
- {
- CString strDelimeter = m_pWndList->m_cListDelimeter;
- for (int i = 0; !strText.IsEmpty () && i < GetSubItemsCount (); i++)
- {
- CString strItem = strText.SpanExcluding (strDelimeter);
- if (strItem.GetLength () + 1 > strText.GetLength ())
- {
- strText.Empty ();
- }
- else
- {
- strText = strText.Mid (strItem.GetLength () + 1);
- }
- strItem.TrimLeft ();
- strItem.TrimRight ();
- CBCGPProp* pSubItem = GetSubItem (i);
- ASSERT_VALID (pSubItem);
- pSubItem->TextToVar (strItem);
- }
- bRes = TRUE;
- }
- else
- {
- bRes = TextToVar (strText);
- }
- if (bRes && bIsChanged)
- {
- m_pWndList->OnPropertyChanged (this);
- }
- return bRes;
- }
- //******************************************************************************************
- BOOL CBCGPProp::TextToVar (const CString& strText)
- {
- CString strVal = strText;
- switch (m_varValue.vt)
- {
- case VT_BSTR:
- m_varValue = (LPCTSTR) strVal;
- return TRUE;
- case VT_UI1:
- m_varValue = strVal.IsEmpty () ? (BYTE) 0 : (BYTE) strVal[0];
- return TRUE;
- case VT_I2:
- m_varValue = (short) _ttoi (strVal);
- return TRUE;
- case VT_I4:
- m_varValue = _ttol (strVal);
- return TRUE;
- case VT_INT:
- m_varValue.intVal = _ttoi (strVal);
- return TRUE;
- case VT_UI2:
- m_varValue.uiVal = unsigned short (_ttoi (strVal));
- return TRUE;
- case VT_UINT:
- case VT_UI4:
- m_varValue.ulVal = unsigned long (_ttol (strVal));
- return TRUE;
- case VT_R4:
- {
- float fVal = 0.;
-
- strVal.TrimLeft ();
- strVal.TrimRight ();
- if (!strVal.IsEmpty ())
- {
- #if _MSC_VER < 1400
- _stscanf (strVal, m_strFormatFloat, &fVal);
- #else
- _stscanf_s (strVal, m_strFormatFloat, &fVal);
- #endif
- }
- m_varValue = fVal;
- }
- return TRUE;
- case VT_R8:
- {
- double dblVal = 0.;
- strVal.TrimLeft ();
- strVal.TrimRight ();
- if (!strVal.IsEmpty ())
- {
- #if _MSC_VER < 1400
- _stscanf (strVal, m_strFormatDouble, &dblVal);
- #else
- _stscanf_s (strVal, m_strFormatDouble, &dblVal);
- #endif
- }
- m_varValue = dblVal;
- }
- return TRUE;
- case VT_BOOL:
- strVal.TrimRight ();
- m_varValue = (bool) (strVal == m_pWndList->m_strTrue);
- return TRUE;
- }
- return FALSE;
- }
- //*****************************************************************************
- BOOL CBCGPProp::IsValueChanged () const
- {
- ASSERT_VALID (this);
- if (m_varValueOrig.vt != m_varValue.vt)
- {
- return FALSE;
- }
- const _variant_t& var = m_varValue;
- const _variant_t& var1 = m_varValueOrig;
- switch (m_varValue.vt)
- {
- case VT_BSTR:
- {
- CString str1 = (LPCTSTR)(_bstr_t)var;
- CString str2 = (LPCTSTR)(_bstr_t)var1;
- return str1 != str2;
- }
- break;
- case VT_I2:
- return (short) var != (short) var1;
- case VT_I4:
- case VT_INT:
- return (long) var != (long) var1;
- case VT_UI1:
- return (BYTE) var != (BYTE) var1;
- case VT_UI2:
- return var.uiVal != var1.uiVal;
- case VT_UINT:
- case VT_UI4:
- return var.ulVal != var1.ulVal;
- case VT_R4:
- return (float) var != (float) var1;
- case VT_R8:
- return (double) var != (double) var1;
- case VT_BOOL:
- return (bool) var != (bool) var1;
- }
- return FALSE;
- }
- //*****************************************************************************
- BOOL CBCGPProp::OnEdit (LPPOINT /*lptClick*/)
- {
- ASSERT_VALID (this);
- ASSERT_VALID (m_pWndList);
- if (!HasValueField ())
- {
- return FALSE;
- }
- m_pWndInPlace = NULL;
- CRect rectEdit;
- CRect rectSpin;
- AdjustInPlaceEditRect (rectEdit, rectSpin);
- BOOL bDefaultFormat = FALSE;
- m_pWndInPlace = CreateInPlaceEdit (rectEdit, bDefaultFormat);
- if (m_pWndInPlace != NULL)
- {
- if (bDefaultFormat)
- {
- m_pWndInPlace->SetWindowText (FormatProperty ());
- }
- if (m_dwFlags & PROP_HAS_LIST)
- {
- CRect rectCombo = m_Rect;
- rectCombo.left = rectEdit.left - 4;
- m_pWndCombo = CreateCombo (m_pWndList, rectCombo);
- ASSERT_VALID (m_pWndCombo);
- m_pWndCombo->SetFont (m_pWndList->GetFont ());
- //-----------------------------------------------------------------------
- // Synchronize bottom edge of the combobox with the property bottom edge:
- //-----------------------------------------------------------------------
- m_pWndCombo->GetWindowRect (rectCombo);
- m_pWndList->ScreenToClient (&rectCombo);
- int dy = rectCombo.Height () - m_Rect.Height ();
- m_pWndCombo->SetWindowPos (NULL, rectCombo.left,
- rectCombo.top - dy + 1, -1, -1, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);
- if (m_varValue.vt == VT_BOOL)
- {
- m_lstOptions.AddTail (m_pWndList->m_strTrue);
- m_lstOptions.AddTail (m_pWndList->m_strFalse);
- }
- for (POSITION pos = m_lstOptions.GetHeadPosition (); pos != NULL;)
- {
- m_pWndCombo->AddString (m_lstOptions.GetNext (pos));
- }
- }
- if (m_dwFlags & PROP_HAS_SPIN)
- {
- m_pWndSpin = CreateSpinControl (rectSpin);
- }
- m_pWndInPlace->SetFont (
- IsModified () && m_pWndList->m_bMarkModifiedProperties ?
- &m_pWndList->m_fontBold : m_pWndList->GetFont ());
- m_pWndInPlace->SetFocus ();
-
- if (!m_bAllowEdit)
- {
- m_pWndInPlace->HideCaret ();
- }
- m_bInPlaceEdit = TRUE;
- return TRUE;
- }
- return FALSE;
- }
- //******************************************************************************************
- void CBCGPProp::AdjustButtonRect ()
- {
- ASSERT_VALID (this);
- m_rectButton = m_Rect;
- m_rectButton.left = m_rectButton.right - m_rectButton.Height () + 3;
- m_rectButton.top ++;
- }
- //******************************************************************************************
- void CBCGPProp::AdjustInPlaceEditRect (CRect& rectEdit, CRect& rectSpin)
- {
- ASSERT_VALID (this);
- ASSERT_VALID (m_pWndList);
- rectEdit = m_Rect;
- rectEdit.DeflateRect (0, 2);
- int nMargin = m_pWndList->m_bMarkModifiedProperties && m_bIsModified ?
- m_pWndList->m_nBoldEditLeftMargin : m_pWndList->m_nEditLeftMargin;
- rectEdit.left = m_pWndList->m_rectList.left + m_pWndList->m_nLeftColumnWidth
- + TEXT_MARGIN - nMargin + 1;
- if (HasButton ())
- {
- AdjustButtonRect ();
- rectEdit.right = m_rectButton.left;
- }
- if (m_dwFlags & PROP_HAS_SPIN)
- {
- rectSpin = m_Rect;
- rectSpin.right = rectEdit.right;
- rectSpin.left = rectSpin.right - rectSpin.Height ();
- rectSpin.top ++;
- rectEdit.right = rectSpin.left;
- }
- else
- {
- rectSpin.SetRectEmpty ();
- }
- }
- //******************************************************************************************
- CWnd* CBCGPProp::CreateInPlaceEdit (CRect rectEdit, BOOL& bDefaultFormat)
- {
- switch (m_varValue.vt)
- {
- case VT_BSTR:
- case VT_R4:
- case VT_R8:
- case VT_UI1:
- case VT_I2:
- case VT_INT:
- case VT_UINT:
- case VT_I4:
- case VT_UI2:
- case VT_UI4:
- case VT_BOOL:
- break;
- default:
- if (!m_bIsValueList)
- {
- return NULL;
- }
- }
- CEdit* pWndEdit = NULL;
- if (!m_strEditMask.IsEmpty () || !m_strEditTempl.IsEmpty () ||
- !m_strValidChars.IsEmpty ())
- {
- CBCGPMaskEdit* pWndEditMask = new CBCGPMaskEdit;
- if (!m_strEditMask.IsEmpty () && !m_strEditTempl.IsEmpty ())
- {
- pWndEditMask->EnableMask (m_strEditMask, m_strEditTempl, _T(' '));
- }
- if (!m_strValidChars.IsEmpty ())
- {
- pWndEditMask->SetValidChars (m_strValidChars);
- }
- pWndEdit = pWndEditMask;
- }
- else
- {
- pWndEdit = new CEdit;
- }
- DWORD dwStyle = WS_VISIBLE | WS_CHILD | ES_AUTOHSCROLL;
- if (!m_bEnabled || !m_bAllowEdit)
- {
- dwStyle |= ES_READONLY;
- }
- pWndEdit->Create (dwStyle, rectEdit, m_pWndList, BCGPROPLIST_ID_INPLACE);
- bDefaultFormat = TRUE;
- return pWndEdit;
- }
- //*****************************************************************************
- CSpinButtonCtrl* CBCGPProp::CreateSpinControl (CRect rectSpin)
- {
- ASSERT_VALID (this);
- ASSERT_VALID (m_pWndList);
- CSpinButtonCtrl* pWndSpin = new CBCGPSpinButtonCtrl;
- if (!pWndSpin->Create (
- WS_CHILD | WS_VISIBLE | UDS_ARROWKEYS | UDS_SETBUDDYINT | UDS_NOTHOUSANDS,
- rectSpin, m_pWndList, BCGPROPLIST_ID_INPLACE))
- {
- return NULL;
- }
- pWndSpin->SetBuddy (m_pWndInPlace);
- if (m_nMinValue != 0 || m_nMaxValue != 0)
- {
- pWndSpin->SetRange32 (m_nMinValue, m_nMaxValue);
- }
- return pWndSpin;
- }
- //*****************************************************************************
- BOOL CBCGPProp::OnEndEdit ()
- {
- ASSERT_VALID (this);
- m_bInPlaceEdit = FALSE;
- m_bButtonIsFocused = FALSE;
- OnDestroyWindow ();
- return TRUE;
- }
- //*****************************************************************************************
- CComboBox* CBCGPProp::CreateCombo (CWnd* pWndParent, CRect rect)
- {
- ASSERT_VALID (this);
- rect.bottom = rect.top + 400;
- CComboBox* pWndCombo = new CComboBox;
- if (!pWndCombo->Create (WS_CHILD | CBS_NOINTEGRALHEIGHT | CBS_DROPDOWNLIST | WS_VSCROLL,
- rect, pWndParent, BCGPROPLIST_ID_INPLACE))
- {
- delete pWndCombo;
- return NULL;
- }
- return pWndCombo;
- }
- //****************************************************************************************
- void CBCGPProp::OnClickButton (CPoint /*point*/)
- {
- ASSERT_VALID (this);
- ASSERT_VALID (m_pWndList);
- if (m_pWndCombo != NULL)
- {
- m_bButtonIsDown = TRUE;
- Redraw ();
- CString str;
- m_pWndInPlace->GetWindowText (str);
- m_pWndCombo->SetCurSel (m_pWndCombo->FindStringExact (-1, str));
- m_pWndCombo->SetFocus ();
- m_pWndCombo->ShowDropDown ();
- }
- }
- //****************************************************************************************
- BOOL CBCGPProp::OnClickValue (UINT uiMsg, CPoint point)
- {
- ASSERT_VALID (this);
- ASSERT_VALID (m_pWndList);
- if (m_pWndInPlace == NULL)
- {
- return FALSE;
- }
- ASSERT_VALID (m_pWndInPlace);
- if (m_pWndSpin != NULL)
- {
- ASSERT_VALID (m_pWndSpin);
- ASSERT (m_pWndSpin->GetSafeHwnd () != NULL);
- CRect rectSpin;
- m_pWndSpin->GetClientRect (rectSpin);
- m_pWndSpin->MapWindowPoints (m_pWndList, rectSpin);
- if (rectSpin.PtInRect (point))
- {
- m_pWndList->MapWindowPoints (m_pWndSpin, &point, 1);
- m_pWndSpin->SendMessage (uiMsg, 0, MAKELPARAM (point.x, point.y));
- return TRUE;
- }
- }
- CPoint ptEdit = point;
- ::MapWindowPoints ( m_pWndList->GetSafeHwnd (),
- m_pWndInPlace->GetSafeHwnd (), &ptEdit, 1);
- m_pWndInPlace->SendMessage (uiMsg, 0, MAKELPARAM (ptEdit.x, ptEdit.y));
- return TRUE;
- }
- //****************************************************************************************
- BOOL CBCGPProp::OnDblClick (CPoint /*point*/)
- {
- ASSERT_VALID (this);
- ASSERT_VALID (m_pWndList);
- if (m_pWndInPlace == NULL)
- {
- return FALSE;
- }
- ASSERT (::IsWindow (m_pWndInPlace->GetSafeHwnd ()));
- if (m_lstOptions.GetCount () > 1)
- {
- CString strText;
- m_pWndInPlace->GetWindowText (strText);
- POSITION pos = m_lstOptions.Find (strText);
- if (pos == NULL)
- {
- return FALSE;
- }
- m_lstOptions.GetNext (pos);
- if (pos == NULL)
- {
- pos = m_lstOptions.GetHeadPosition ();
- }
- ASSERT (pos != NULL);
- strText = m_lstOptions.GetAt (pos);
- m_pWndInPlace->SetWindowText (strText);
- OnUpdateValue ();
- return TRUE;
- }
- if (m_dwFlags & PROP_HAS_BUTTON)
- {
- CWaitCursor wait;
- CString strPrevVal = FormatProperty ();
- OnClickButton (CPoint (-1, -1));
- if (strPrevVal != FormatProperty ())
- {
- m_pWndList->OnPropertyChanged (this);
- }
- return TRUE;
- }
- return FALSE;
- }
- //*****************************************************************************************
- void CBCGPProp::OnSelectCombo ()
- {
- ASSERT_VALID (this);
- ASSERT_VALID (m_pWndCombo);
- ASSERT_VALID (m_pWndInPlace);
- int iSelIndex = m_pWndCombo->GetCurSel ();
- if (iSelIndex >= 0)
- {
- CString str;
- m_pWndCombo->GetLBText (iSelIndex, str);
- m_pWndInPlace->SetWindowText (str);
- OnUpdateValue ();
- }
- }
- //****************************************************************************************
- void CBCGPProp::OnCloseCombo ()
- {
- ASSERT_VALID (this);
- m_bButtonIsDown = FALSE;
- Redraw ();
- ASSERT_VALID (m_pWndInPlace);
- m_pWndInPlace->SetFocus ();
- }
- //****************************************************************************************
- BOOL CBCGPProp::OnSetCursor () const
- {
- if (m_bInPlaceEdit)
- {
- return FALSE;
- }
- if (m_bIsValueList)
- {
- SetCursor (AfxGetApp ()->LoadStandardCursor (IDC_IBEAM));
- return TRUE;
- }
- switch (m_varValue.vt)
- {
- case VT_BSTR:
- case VT_R4:
- case VT_R8:
- case VT_UI1:
- case VT_I2:
- case VT_INT:
- case VT_UINT:
- case VT_I4:
- case VT_UI2:
- case VT_UI4:
- SetCursor (AfxGetApp ()->LoadStandardCursor (IDC_IBEAM));
- return TRUE;
- }
- return FALSE;
- }
- //*******************************************************************************************
- BOOL CBCGPProp::PushChar (UINT nChar)
- {
- ASSERT_VALID (this);
- ASSERT_VALID (m_pWndList);
- ASSERT (m_pWndList->m_pSel == this);
- ASSERT_VALID (m_pWndInPlace);
- if (m_bIsValueList)
- {
- if (m_bEnabled && m_bAllowEdit &&
- nChar != _T('+') && nChar != _T('-'))
- {
- m_pWndInPlace->SetWindowText (_T(""));
- m_pWndInPlace->SendMessage (WM_CHAR, (WPARAM) nChar);
- return TRUE;
- }
- }
- switch (m_varValue.vt)
- {
- case VT_BSTR:
- case VT_R4:
- case VT_R8:
- case VT_UI1:
- case VT_I2:
- case VT_INT:
- case VT_UINT:
- case VT_I4:
- case VT_UI2:
- case VT_UI4:
- if (m_bEnabled && m_bAllowEdit)
- {
- m_pWndInPlace->SetWindowText (_T(""));
- m_pWndInPlace->SendMessage (WM_CHAR, (WPARAM) nChar);
- return TRUE;
- }
- }
- if (!m_bAllowEdit)
- {
- if (nChar == VK_SPACE)
- {
- OnDblClick (CPoint (-1, -1));
- }
- else if (m_lstOptions.GetCount () > 1)
- {
- CString strText;
- m_pWndInPlace->GetWindowText (strText);
- POSITION pos = m_lstOptions.Find (strText);
- if (pos == NULL)
- {
- return FALSE;
- }
- POSITION posSave = pos;
- CString strChar = (TCHAR) nChar;
- strChar.MakeUpper ();
- m_lstOptions.GetNext (pos);
- while (pos != posSave)
- {
- if (pos == NULL)
- {
- pos = m_lstOptions.GetHeadPosition ();
- }
- if (pos == posSave)
- {
- break;
- }
- strText = m_lstOptions.GetAt (pos);
-
- CString strUpper = strText;
- strUpper.MakeUpper ();
- if (strUpper.Left (1) == strChar)
- {
- m_pWndInPlace->SetWindowText (strText);
- OnUpdateValue ();
- break;
- }
- m_lstOptions.GetNext (pos);
- }
- }
- }
- OnEndEdit ();
- if (::GetCapture () == m_pWndList->GetSafeHwnd ())
- {
- ReleaseCapture ();
- }
- return FALSE;
- }
- //*******************************************************************************************
- CString CBCGPProp::GetNameTooltip ()
- {
- ASSERT_VALID (this);
- return _T("");
- }
- //*******************************************************************************************
- CString CBCGPProp::GetValueTooltip ()
- {
- ASSERT_VALID (this);
- return _T("");
- }
- //*******************************************************************************************
- HBRUSH CBCGPProp::OnCtlColor(CDC* pDC, UINT /*nCtlColor*/)
- {
- ASSERT_VALID (this);
- ASSERT_VALID (m_pWndList);
- if (m_pWndList->m_clrText != (COLORREF)-1)
- {
- pDC->SetTextColor (m_pWndList->m_clrText);
- }
- if (m_pWndList->m_brBackground.GetSafeHandle () != NULL)
- {
- if (m_pWndList->m_clrBackground != -1)
- {
- pDC->SetBkColor (m_pWndList->m_clrBackground);
- }
- return (HBRUSH) m_pWndList->m_brBackground.GetSafeHandle ();
- }
- switch (m_varValue.vt)
- {
- case VT_BSTR:
- case VT_R4:
- case VT_R8:
- case VT_UI1:
- case VT_I2:
- case VT_I4:
- case VT_INT:
- case VT_UINT:
- case VT_UI2:
- case VT_UI4:
- case VT_BOOL:
- if (!m_bEnabled || !m_bAllowEdit)
- {
- pDC->SetBkColor (globalData.clrWindow);
- return (HBRUSH) globalData.brWindow.GetSafeHandle ();
- }
- }
- return NULL;
- }
- //***************************************************************************************
- void CBCGPProp::SetModifiedFlag ()
- {
- ASSERT_VALID (m_pWndList);
- BOOL bIsModified = IsValueChanged ();
- if (m_bIsModified == bIsModified && !m_bIsValueList)
- {
- return;
- }
- m_bIsModified = bIsModified;
- if (m_pParent != NULL && m_pParent->m_bIsValueList)
- {
- if (bIsModified)
- {
- m_pParent->m_bIsModified = TRUE;
- }
- else
- {
- m_pParent->m_bIsModified = FALSE;
- for (POSITION pos = m_pParent->m_lstSubItems.GetHeadPosition (); pos != NULL;)
- {
- CBCGPProp* pSubItem = (CBCGPProp*) m_pParent->m_lstSubItems.GetNext (pos);
- ASSERT_VALID (pSubItem);
- if (pSubItem->m_bIsModified)
- {
- m_pParent->m_bIsModified = TRUE;
- break;
- }
- }
- }
- }
- for (POSITION pos = m_lstSubItems.GetHeadPosition (); pos != NULL;)
- {
- CBCGPProp* pSubItem = (CBCGPProp*) m_lstSubItems.GetNext (pos);
- ASSERT_VALID (pSubItem);
- pSubItem->SetModifiedFlag ();
- }
- if (m_pWndList->m_bMarkModifiedProperties)
- {
- OnPosSizeChanged (m_Rect);
- if (m_pWndInPlace->GetSafeHwnd () != NULL)
- {
- if (m_bIsModified)
- {
- m_pWndInPlace->SetFont (&m_pWndList->m_fontBold);
- }
- else
- {
- m_pWndInPlace->SetFont (m_pWndList->GetFont ());
- }
- CRect rectInPlace;
- m_pWndInPlace->GetWindowRect (&rectInPlace);
- m_pWndList->ScreenToClient (&rectInPlace);
- int nXOffset =
- m_pWndList->m_nBoldEditLeftMargin - m_pWndList->m_nEditLeftMargin;
- if (m_bIsModified)
- {
- nXOffset = -nXOffset;
- }
- if (HasButton ())
- {
- AdjustButtonRect ();
- rectInPlace.right = m_rectButton.left;
- }
- m_pWndInPlace->SetWindowPos (NULL,
- rectInPlace.left + nXOffset, rectInPlace.top,
- rectInPlace.Width () - nXOffset, rectInPlace.Height (),
- SWP_NOZORDER | SWP_NOACTIVATE);
- }
- Redraw ();
- }
- }
- //*******************************************************************************************
- void CBCGPProp::Show (BOOL bShow/* = TRUE*/, BOOL bAdjustLayout/* = TRUE*/)
- {
- ASSERT_VALID (this);
- if (m_bIsVisible == bShow)
- {
- return;
- }
- m_bIsVisible = bShow;
- for (POSITION pos = m_lstSubItems.GetHeadPosition (); pos != NULL;)
- {
- CBCGPProp* pProp = m_lstSubItems.GetNext (pos);
- ASSERT_VALID (pProp);
- pProp->Show (bShow, FALSE);
- }
- if (bAdjustLayout && m_pWndList != NULL && m_pWndList->GetSafeHwnd () != NULL)
- {
- ASSERT_VALID (m_pWndList);
- m_pWndList->AdjustLayout ();
- }
- }
- //*******************************************************************************************
- BOOL CBCGPProp::OnActivateByTab ()
- {
- ASSERT_VALID (this);
- ASSERT_VALID (m_pWndList);
- if (m_bInPlaceEdit && (m_dwFlags & PROP_HAS_BUTTON))
- {
- m_bButtonIsFocused = !m_bButtonIsFocused;
- m_pWndList->RedrawWindow (m_rectButton);
- return TRUE;
- }
- if (!m_bInPlaceEdit && m_bEnabled && m_pWndList->EditItem (this))
- {
- CEdit* pEdit = DYNAMIC_DOWNCAST (CEdit, m_pWndInPlace);
- if (::IsWindow (pEdit->GetSafeHwnd ()))
- {
- pEdit->SetSel (0, -1);
- }
- return TRUE;
- }
- return FALSE;
- }
- //*******************************************************************************************
- BOOL CBCGPProp::OnRotateListValue (BOOL bForward)
- {
- if (m_pWndInPlace == NULL)
- {
- return FALSE;
- }
- CString strText;
- m_pWndInPlace->GetWindowText (strText);
- POSITION pos = m_lstOptions.Find (strText);
- if (pos == NULL)
- {
- return FALSE;
- }
- if (bForward)
- {
- m_lstOptions.GetNext (pos);
- if (pos == NULL)
- {
- pos = m_lstOptions.GetHeadPosition ();
- }
- }
- else
- {
- m_lstOptions.GetPrev (pos);
- if (pos == NULL)
- {
- pos = m_lstOptions.GetTailPosition ();
- }
- }
- if (pos == NULL)
- {
- return FALSE;
- }
- strText = m_lstOptions.GetAt (pos);
- m_pWndInPlace->SetWindowText (strText);
- OnUpdateValue ();
- CEdit* pEdit = DYNAMIC_DOWNCAST (CEdit, m_pWndInPlace);
- if (::IsWindow (pEdit->GetSafeHwnd ()))
- {
- pEdit->SetSel (0, -1);
- }
- return TRUE;
- }
- //**********************************************************************************
- BOOL CBCGPProp::SetACCData (CWnd* pParent, CBCGPAccessibilityData& data)
- {
- ASSERT_VALID (this);
- ASSERT_VALID (pParent);
- data.Clear ();
- data.m_strAccName = GetName ();
- data.m_strAccDefAction = _T("Press");
- data.m_strDescription = GetName ();
- BOOL bGroup = (IsGroup () && !m_bIsValueList);
- if (!bGroup)
- {
- data.m_strAccValue = FormatProperty ();
- }
-
- data.m_nAccHit = 1;
- data.m_nAccRole = ROLE_SYSTEM_ROW;
- data.m_bAccState = STATE_SYSTEM_FOCUSABLE|STATE_SYSTEM_SELECTABLE;
- if (IsSelected ())
- {
- data.m_bAccState |= STATE_SYSTEM_FOCUSED;
- data.m_bAccState |= STATE_SYSTEM_SELECTED;
- }
- if (!IsEnabled () || bGroup)
- {
- data.m_bAccState |= STATE_SYSTEM_READONLY;
- }
-
- data.m_rectAccLocation = m_Rect;
- pParent->ClientToScreen (&data.m_rectAccLocation);
- return TRUE;
- }
- #ifndef _BCGPGRID_STANDALONE
- /////////////////////////////////////////////////////////////////////////////
- // CBCGPColorProp object
- IMPLEMENT_DYNAMIC(CBCGPColorProp, CBCGPProp)
- CBCGPColorProp::CBCGPColorProp(const CString& strName, const COLORREF& color,
- CPalette* pPalette, LPCTSTR lpszDescr, DWORD_PTR dwData) :
- CBCGPProp (strName, _variant_t(), lpszDescr, dwData),
- m_Color (color),
- m_ColorOrig (color)
- {
- CBCGPColorBar::InitColors (pPalette, m_Colors);
- m_varValue = (LONG) color;
- m_varValueOrig = (LONG) color;
- m_dwFlags = PROP_HAS_LIST;
- m_pPopup = NULL;
- m_bStdColorDlg = FALSE;
- m_ColorAutomatic = RGB (0, 0, 0);
- m_nColumnsNumber = 5;
- }
- //*****************************************************************************************
- CBCGPColorProp::~CBCGPColorProp()
- {
- }
- //*******************************************************************************************
- void CBCGPColorProp::OnDrawValue (CDC* pDC, CRect rect)
- {
- CRect rectColor = rect;
- rect.left += rect.Height ();
- CBCGPProp::OnDrawValue (pDC, rect);
- rectColor.right = rectColor.left + rectColor.Height ();
- rectColor.DeflateRect (1, 1);
- rectColor.top++;
- rectColor.left++;
- CBrush br (m_Color == (COLORREF)-1 ? m_ColorAutomatic : m_Color);
- pDC->FillRect (rectColor, &br);
- pDC->Draw3dRect (rectColor, 0, 0);
- }
- //****************************************************************************************
- void CBCGPColorProp::OnClickButton (CPoint /*point*/)
- {
- ASSERT_VALID (this);
- ASSERT_VALID (m_pWndList);
- m_bButtonIsDown = TRUE;
- Redraw ();
- CList<COLORREF,COLORREF> lstDocColors;
- m_pPopup = new CColorPopup (NULL, m_Colors, m_Color,
- NULL, NULL, NULL, lstDocColors,
- m_nColumnsNumber, m_ColorAutomatic);
- m_pPopup->SetPropList (m_pWndList);
- if (!m_strOtherColor.IsEmpty ()) // Other color button
- {
- m_pPopup->m_wndColorBar.EnableOtherButton (m_strOtherColor, !m_bStdColorDlg);
- }
- if (!m_strAutoColor.IsEmpty ()) // Automatic color button
- {
- m_pPopup->m_wndColorBar.EnableAutomaticButton (m_strAutoColor, m_ColorAutomatic);
- }
- CPoint pt (
- m_pWndList->m_rectList.left + m_pWndList->m_nLeftColumnWidth + 1,
- m_rectButton.bottom + 1);
- m_pWndList->ClientToScreen (&pt);
- if (!m_pPopup->Create (m_pWndList, pt.x, pt.y, NULL, FALSE))
- {
- ASSERT (FALSE);
- m_pPopup = NULL;
- }
- else
- {
- m_pPopup->GetMenuBar()->SetFocus ();
- }
- }
- //******************************************************************************************
- BOOL CBCGPColorProp::OnEdit (LPPOINT /*lptClick*/)
- {
- ASSERT_VALID (this);
- ASSERT_VALID (m_pWndList);
- m_pWndInPlace = NULL;
- CRect rectEdit;
- CRect rectSpin;
- AdjustInPlaceEditRect (rectEdit, rectSpin);
- CBCGPMaskEdit* pWndEdit = new CBCGPMaskEdit;
- DWORD dwStyle = WS_VISIBLE | WS_CHILD;
- if (!m_bEnabled)
- {
- dwStyle |= ES_READONLY;
- }
- pWndEdit->SetValidChars(_T("01234567890ABCDEFabcdef"));
- pWndEdit->Create (dwStyle, rectEdit, m_pWndList, BCGPROPLIST_ID_INPLACE);
- m_pWndInPlace = pWndEdit;
- m_pWndInPlace->SetWindowText (FormatProperty ());
- m_pWndInPlace->SetFont (
- IsModified () && m_pWndList->m_bMarkModifiedProperties ?
- &m_pWndList->m_fontBold : m_pWndList->GetFont ());
- m_pWndInPlace->SetFocus ();
- m_bInPlaceEdit = TRUE;
- return TRUE;
- }
- //****************************************************************************************
- void CBCGPColorProp::AdjustInPlaceEditRect (CRect& rectEdit, CRect& rectSpin)
- {
- ASSERT_VALID (this);
- ASSERT_VALID (m_pWndList);
- rectSpin.SetRectEmpty ();
- rectEdit = m_Rect;
- rectEdit.DeflateRect (0, 2);
- int nMargin = m_pWndList->m_bMarkModifiedProperties && m_bIsModified ?
- m_pWndList->m_nBoldEditLeftMargin : m_pWndList->m_nEditLeftMargin;
- rectEdit.left = m_pWndList->m_rectList.left + m_pWndList->m_nLeftColumnWidth +
- m_Rect.Height () + TEXT_MARGIN - nMargin + 1;
- AdjustButtonRect ();
- rectEdit.right = m_rectButton.left;
- }
- //****************************************************************************************
- void CBCGPColorProp::ResetOriginalValue ()
- {
- CBCGPProp::ResetOriginalValue ();
- m_Color = m_ColorOrig;
- }
- //****************************************************************************************
- void CBCGPColorProp::CommitModifiedValue ()
- {
- CBCGPProp::CommitModifiedValue ();
- m_ColorOrig = m_Color;
- }
- //****************************************************************************************
- CString CBCGPColorProp::FormatProperty ()
- {
- ASSERT_VALID (this);
- CString str;
- str.Format (_T("%02x%02x%02x"),
- GetRValue (m_Color), GetGValue (m_Color), GetBValue (m_Color));
- return str;
- }
- //******************************************************************************************
- void CBCGPColorProp::SetColor (COLORREF color)
- {
- ASSERT_VALID (this);
- m_Color = color;
- m_varValue = (LONG) color;
- if (::IsWindow (m_pWndList->GetSafeHwnd()))
- {
- CRect rect = m_Rect;
- rect.DeflateRect (0, 1);
- m_pWndList->InvalidateRect (rect);
- m_pWndList->UpdateWindow ();
- }
- if (m_pWndInPlace != NULL)
- {
- ASSERT_VALID (m_pWndInPlace);
- m_pWndInPlace->SetWindowText (FormatProperty ());
- }
- }
- //********************************************************************************
- void CBCGPColorProp::SetColumnsNumber (int nColumnsNumber)
- {
- ASSERT_VALID (this);
- ASSERT (nColumnsNumber > 0);
- m_nColumnsNumber = nColumnsNumber;
- }
- //*************************************************************************************
- void CBCGPColorProp::EnableAutomaticButton (LPCTSTR lpszLabel, COLORREF colorAutomatic, BOOL bEnable)
- {
- ASSERT_VALID (this);
- m_ColorAutomatic = colorAutomatic;
- m_strAutoColor = (!bEnable || lpszLabel == NULL) ? _T("") : lpszLabel;
- }
- //*************************************************************************************
- void CBCGPColorProp::EnableOtherButton (LPCTSTR lpszLabel, BOOL bAltColorDlg, BOOL bEnable)
- {
- ASSERT_VALID (this);
- m_bStdColorDlg = !bAltColorDlg;
- m_strOtherColor = (!bEnable || lpszLabel == NULL) ? _T("") : lpszLabel;
- }
- //*****************************************************************************************
- BOOL CBCGPColorProp::OnUpdateValue ()
- {
- ASSERT_VALID (this);
- if (m_pWndInPlace == NULL)
- {
- return FALSE;
- }
- ASSERT_VALID (m_pWndInPlace);
- ASSERT (::IsWindow (m_pWndInPlace->GetSafeHwnd ()));
- CString strText;
- m_pWndInPlace->GetWindowText (strText);
- COLORREF colorCurr = m_Color;
- int nR = 0, nG = 0, nB = 0;
- #if _MSC_VER < 1400
- _stscanf (strText, _T("%2x%2x%2x"), &nR, &nG, &nB);
- #else
- _stscanf_s (strText, _T("%2x%2x%2x"), &nR, &nG, &nB);
- #endif
- m_Color = RGB (nR, nG, nB);
- if (colorCurr != m_Color)
- {
- m_pWndList->OnPropertyChanged (this);
- }
- return TRUE;
- }
- #endif // _BCGPGRID_STANDALONE
- /////////////////////////////////////////////////////////////////////////////
- // CBCGPFileProp object
- IMPLEMENT_DYNAMIC(CBCGPFileProp, CBCGPProp)
- #ifndef _BCGPGRID_STANDALONE
- CBCGPFileProp::CBCGPFileProp(const CString& strName, const CString& strFolderName, DWORD_PTR dwData, LPCTSTR lpszDescr) :
- CBCGPProp (strName, _variant_t((LPCTSTR)strFolderName), lpszDescr, dwData),
- m_bIsFolder (TRUE)
- {
- m_dwFlags = PROP_HAS_BUTTON;
- }
- #endif
- CBCGPFileProp::CBCGPFileProp ( const CString& strName,
- BOOL bOpenFileDialog,
- const CString& strFileName,
- LPCTSTR lpszDefExt,
- DWORD dwFileFlags,
- LPCTSTR lpszFilter,
- LPCTSTR lpszDescr,
- DWORD_PTR dwData) :
- CBCGPProp (strName, _variant_t((LPCTSTR)strFileName), lpszDescr, dwData),
- m_bOpenFileDialog (bOpenFileDialog),
- m_dwFileOpenFlags (dwFileFlags)
- {
- m_dwFlags = PROP_HAS_BUTTON;
- m_strDefExt = lpszDefExt == NULL ? _T("") : lpszDefExt;
- m_strFilter = lpszFilter == NULL ? _T("") : lpszFilter;
- #ifndef _BCGPGRID_STANDALONE
- m_bIsFolder = FALSE;
- #endif
- }
- //*****************************************************************************************
- CBCGPFileProp::~CBCGPFileProp()
- {
- }
- //****************************************************************************************
- void CBCGPFileProp::OnClickButton (CPoint /*point*/)
- {
- ASSERT_VALID (this);
- ASSERT_VALID (m_pWndList);
- ASSERT_VALID (m_pWndInPlace);
- ASSERT (::IsWindow (m_pWndInPlace->GetSafeHwnd ()));
- m_bButtonIsDown = TRUE;
- Redraw ();
- CString strPath = (LPCTSTR)(_bstr_t)m_varValue;
- BOOL bUpdate = FALSE;
- #ifndef _BCGPGRID_STANDALONE
- if (m_bIsFolder)
- {
- if (g_pShellManager == NULL)
- {
- if (g_pWorkspace != NULL)
- {
- g_pWorkspace->InitShellManager ();
- }
- }
- if (g_pShellManager == NULL)
- {
- ASSERT (FALSE);
- }
- else
- {
- bUpdate = g_pShellManager->BrowseForFolder (strPath, m_pWndList, strPath);
- }
- }
- else
- #endif
- {
- CFileDialog dlg (m_bOpenFileDialog, m_strDefExt, strPath, m_dwFileOpenFlags, m_strFilter,
- m_pWndList);
- if (dlg.DoModal () == IDOK)
- {
- bUpdate = TRUE;
- strPath = dlg.GetPathName ();
- }
- }
- if (bUpdate)
- {
- if (m_pWndInPlace != NULL)
- {
- m_pWndInPlace->SetWindowText (strPath);
- }
- m_varValue = (LPCTSTR) strPath;
- }
- m_bButtonIsDown = FALSE;
- Redraw ();
- if (m_pWndInPlace != NULL)
- {
- m_pWndInPlace->SetFocus ();
- }
- else
- {
- m_pWndList->SetFocus ();
- }
- }
- #ifndef _BCGPGRID_STANDALONE
- /////////////////////////////////////////////////////////////////////////////
- // CBCGPDateTimeProp object
- IMPLEMENT_DYNAMIC(CBCGPDateTimeProp, CBCGPProp)
- CBCGPDateTimeProp::CBCGPDateTimeProp(const CString& strName, const COleDateTime& date,
- LPCTSTR lpszDescr/* = NULL*/, DWORD_PTR dwData/* = 0*/,
- UINT nFlags/* = CBCGPDateTimeCtrl::DTM_DATE | CBCGPDateTimeCtrl::DTM_TIME | CBCGPDateTimeCtrl::DTM_DROPCALENDAR*/) :
- CBCGPProp (strName, _variant_t(date, VT_DATE), lpszDescr, dwData)
- {
- m_nFlags = nFlags;
- }
- //*****************************************************************************************
- CBCGPDateTimeProp::~CBCGPDateTimeProp()
- {
- }
- //****************************************************************************************
- void CBCGPDateTimeProp::OnDrawValue (CDC* pDC, CRect rect)
- {
- ASSERT_VALID (m_pWndList);
- rect.DeflateRect (0, 2);
- rect.left = m_pWndList->GetListRect ().left +
- m_pWndList->GetPropertyColumnWidth () + TEXT_MARGIN + 1;
- DRAWITEMSTRUCT dis;
- memset (&dis, 0, sizeof (DRAWITEMSTRUCT));
- dis.CtlType = ODT_BUTTON;
- dis.hDC = pDC->GetSafeHdc ();
- dis.rcItem = rect;
- m_wndDateTime.m_bDrawDateTimeOnly = !IsSelected () || !m_bEnabled;
-
- COLORREF clrTextOld = pDC->GetTextColor ();
- m_wndDateTime.SetTextColor (m_bEnabled ?
- m_pWndList->GetTextColor () : globalData.clrGrayedText, FALSE);
- m_wndDateTime.SetBackgroundColor (m_pWndList->m_clrBackground, FALSE);
- m_wndDateTime.SetFont (
- IsModified () && m_pWndList->m_bMarkModifiedProperties ?
- &m_pWndList->m_fontBold : m_pWndList->GetFont ());
-
- m_wndDateTime.DrawItem (&dis);
- pDC->SetTextColor (clrTextOld);
- }
- //*****************************************************************************
- CWnd* CBCGPDateTimeProp::CreateInPlaceEdit (CRect rectEdit, BOOL& bDefaultFormat)
- {
- ASSERT_VALID (m_pWndList);
- CBCGPDateTimeCtrl* pDateTime = new CBCGPDateTimeCtrl;
- ASSERT_VALID (pDateTime);
- pDateTime->SetAutoResize (FALSE);
- CRect rectSpin;
- AdjustInPlaceEditRect (rectEdit, rectSpin);
- pDateTime->Create (_T(""), WS_CHILD | WS_VISIBLE, rectEdit,
- m_pWndList, BCGPROPLIST_ID_INPLACE);
- pDateTime->SetFont (
- IsModified () && m_pWndList->m_bMarkModifiedProperties ?
- &m_pWndList->m_fontBold : m_pWndList->GetFont ());
- SetState (*pDateTime);
- pDateTime->SetDate (GetDate ());
- pDateTime->SetTextColor (m_pWndList->GetTextColor (), FALSE);
- pDateTime->SetBackgroundColor (m_pWndList->m_clrBackground, FALSE);
- bDefaultFormat = FALSE;
- return pDateTime;
- }
- //*******************************************************************************
- void CBCGPDateTimeProp::OnPosSizeChanged (CRect /*rectOld*/)
- {
- ASSERT_VALID (m_pWndList);
- CRect rectEdit;
- CRect rectSpin;
- AdjustInPlaceEditRect (rectEdit, rectSpin);
- if (m_wndDateTime.GetSafeHwnd () == NULL)
- {
- m_wndDateTime.SetAutoResize (FALSE);
- m_wndDateTime.Create (_T(""), WS_CHILD, rectEdit,
- m_pWndList, (UINT)-1);
- m_wndDateTime.SetFont (
- IsModified () && m_pWndList->m_bMarkModifiedProperties ?
- &m_pWndList->m_fontBold : m_pWndList->GetFont ());
- SetState (m_wndDateTime);
- m_wndDateTime.SetDate (GetDate ());
- }
- else
- {
- m_wndDateTime.SetFont (
- IsModified () && m_pWndList->m_bMarkModifiedProperties ?
- &m_pWndList->m_fontBold : m_pWndList->GetFont (), FALSE);
- m_wndDateTime.SetWindowPos (NULL, rectEdit.left, rectEdit.top,
- rectEdit.Width (), rectEdit.Height (),
- SWP_NOZORDER | SWP_NOACTIVATE);
- }
- m_wndDateTime.AdjustControl (rectEdit);
- }
- //******************************************************************************************
- BOOL CBCGPDateTimeProp::OnUpdateValue ()
- {
- ASSERT_VALID (this);
- ASSERT_VALID (m_pWndInPlace);
- ASSERT_VALID (m_pWndList);
- ASSERT (::IsWindow (m_pWndInPlace->GetSafeHwnd ()));
- CBCGPDateTimeCtrl* pDateTime = DYNAMIC_DOWNCAST (CBCGPDateTimeCtrl, m_pWndInPlace);
- ASSERT_VALID (pDateTime);
- COleDateTime dateOld = GetDate ();
- COleDateTime dateNew = pDateTime->GetDate ();
- m_varValue = _variant_t (dateNew, VT_DATE);
- m_wndDateTime.SetDate (dateNew);
- if (dateOld != dateNew)
- {
- m_pWndList->OnPropertyChanged (this);
- }
- return TRUE;
- }
- //********************************************************************************
- void CBCGPDateTimeProp::SetDate (COleDateTime date)
- {
- ASSERT_VALID (this);
- SetValue (_variant_t (date, VT_DATE));
- if (m_wndDateTime.GetSafeHwnd () != NULL)
- {
- m_wndDateTime.SetDate (date);
- }
- }
- //*********************************************************************************
- void CBCGPDateTimeProp::SetState (CBCGPDateTimeCtrl& wnd)
- {
- ASSERT (wnd.GetSafeHwnd () != NULL);
- UINT stateFlags = 0;
- if (m_nFlags & (CBCGPDateTimeCtrl::DTM_DATE))
- {
- stateFlags |= (CBCGPDateTimeCtrl::DTM_DATE | CBCGPDateTimeCtrl::DTM_DROPCALENDAR);
- }
-
- if (m_nFlags & (CBCGPDateTimeCtrl::DTM_TIME))
- {
- stateFlags |= (CBCGPDateTimeCtrl::DTM_TIME | CBCGPDateTimeCtrl::DTM_TIME24HBYLOCALE);
- }
- const UINT stateMask =
- CBCGPDateTimeCtrl::DTM_SPIN |
- CBCGPDateTimeCtrl::DTM_DROPCALENDAR |
- CBCGPDateTimeCtrl::DTM_DATE |
- CBCGPDateTimeCtrl::DTM_TIME24H |
- CBCGPDateTimeCtrl::DTM_CHECKBOX |
- CBCGPDateTimeCtrl::DTM_TIME |
- CBCGPDateTimeCtrl::DTM_TIME24HBYLOCALE;
- wnd.SetState (stateFlags, stateMask);
- }
- //********************************************************************************
- void CBCGPDateTimeProp::OnSetSelection (CBCGPProp* /*pOldSel*/)
- {
- Redraw ();
- }
- //********************************************************************************
- void CBCGPDateTimeProp::OnKillSelection (CBCGPProp* /*pNewSel*/)
- {
- Redraw ();
- }
- //********************************************************************************
- BOOL CBCGPDateTimeProp::PushChar (UINT nChar)
- {
- ASSERT_VALID (this);
- ASSERT_VALID (m_pWndList);
- ASSERT (m_pWndList->GetCurSel () == this);
- ASSERT_VALID (m_pWndInPlace);
- if (m_bEnabled && m_bAllowEdit)
- {
- CString str = (TCHAR) nChar;
- str.MakeUpper ();
- m_pWndInPlace->SendMessage (WM_KEYDOWN, (WPARAM) str [0]);
- return TRUE;
- }
- OnEndEdit ();
- if (::GetCapture () == m_pWndList->GetSafeHwnd ())
- {
- ReleaseCapture ();
- }
- return FALSE;
- }
- //********************************************************************************
- CString CBCGPDateTimeProp::FormatProperty ()
- {
- COleDateTime date = GetDate ();
- CString strTextDate;
- if ((m_nFlags & (CBCGPDateTimeCtrl::DTM_DATE)) &&
- (m_nFlags & (CBCGPDateTimeCtrl::DTM_TIME)))
- {
- strTextDate = date.Format ();
- }
- else if (m_nFlags & (CBCGPDateTimeCtrl::DTM_DATE))
- {
- strTextDate = date.Format (VAR_DATEVALUEONLY);
- }
- else
- {
- strTextDate = date.Format (VAR_TIMEVALUEONLY);
- }
- return strTextDate;
- }
- //********************************************************************************
- BOOL CBCGPDateTimeProp::IsValueChanged () const
- {
- COleDateTime date = (DATE) m_varValue;
- COleDateTime date1 = (DATE) m_varValueOrig;
- if ((m_nFlags & (CBCGPDateTimeCtrl::DTM_DATE)) &&
- (m_nFlags & (CBCGPDateTimeCtrl::DTM_TIME)))
- {
- return date != date1;
- }
- else if (m_nFlags & (CBCGPDateTimeCtrl::DTM_DATE))
- {
- return date.GetYear () != date1.GetYear () ||
- date.GetMonth () != date1.GetMonth () ||
- date.GetDay () != date1.GetDay ();
- }
- return date.GetHour () != date1.GetHour () ||
- date.GetMinute () != date1.GetMinute ();
- }
- //********************************************************************************
- void CBCGPDateTimeProp::AdjustInPlaceEditRect (CRect& rectEdit, CRect& rectSpin)
- {
- rectSpin.SetRectEmpty ();
- rectEdit = m_Rect;
- rectEdit.DeflateRect (0, 2);
- const int nMargin =
- m_bIsModified && m_pWndList->m_bMarkModifiedProperties ? 4 : 5;
- rectEdit.left = m_pWndList->GetListRect ().left +
- m_pWndList->GetPropertyColumnWidth () +
- nMargin;
- rectEdit.bottom++;
- }
- //********************************************************************************
- BOOL CBCGPDateTimeProp::OnCommand (WPARAM /*wParam*/)
- {
- OnUpdateValue ();
- return FALSE;
- }
- //****************************************************************************************
- void CBCGPDateTimeProp::ResetOriginalValue ()
- {
- CBCGPProp::ResetOriginalValue ();
- if (m_wndDateTime.GetSafeHwnd () != NULL)
- {
- m_wndDateTime.SetDate ((DATE) m_varValue);
- }
- }
- #endif // _BCGPGRID_STANDALONE
- /////////////////////////////////////////////////////////////////////////////
- // CBCGPFontProp object
- IMPLEMENT_DYNAMIC(CBCGPFontProp, CBCGPProp)
- CBCGPFontProp::CBCGPFontProp(const CString& strName, LOGFONT& lf, DWORD dwFontDialogFlags, LPCTSTR lpszDescr, DWORD_PTR dwData, COLORREF color) :
- CBCGPProp (strName, _variant_t((LPCTSTR)lf.lfFaceName), lpszDescr, dwData),
- m_dwFontDialogFlags (dwFontDialogFlags)
- {
- m_dwFlags = PROP_HAS_BUTTON;
- m_lf = lf;
- m_lfOrig = lf;
- m_bAllowEdit = FALSE;
- m_Color = color;
- }
- //*****************************************************************************************
- CBCGPFontProp::~CBCGPFontProp()
- {
- }
- //****************************************************************************************
- void CBCGPFontProp::OnClickButton (CPoint /*point*/)
- {
- ASSERT_VALID (this);
- ASSERT_VALID (m_pWndList);
- ASSERT_VALID (m_pWndInPlace);
- ASSERT (::IsWindow (m_pWndInPlace->GetSafeHwnd ()));
- LOGFONT lfPrev = m_lf;
- COLORREF nColorPrev = m_Color;
- m_bButtonIsDown = TRUE;
- Redraw ();
- #pragma warning (disable : 4244)
- CFontDialog dlg (&m_lf, m_dwFontDialogFlags, NULL, m_pWndList);
- #pragma warning (default : 4244)
- if (m_Color != (COLORREF)-1)
- {
- dlg.m_cf.rgbColors = m_Color;
- }
- if (dlg.DoModal () == IDOK)
- {
- dlg.GetCurrentFont (&m_lf);
- m_Color = dlg.GetColor ();
- if (memcmp (&lfPrev, &m_lf, sizeof (lfPrev) - sizeof (lfPrev.lfFaceName)) ||
- _tcscmp( lfPrev.lfFaceName, m_lf.lfFaceName) ||
- nColorPrev != m_Color)
- {
- m_pWndList->OnPropertyChanged (this);
- }
- if (m_pWndInPlace != NULL)
- {
- m_pWndInPlace->SetWindowText (FormatProperty ());
- }
- else
- {
- m_varValue = (LPCTSTR) FormatProperty ();
- }
- }
- if (m_pWndInPlace != NULL)
- {
- m_pWndInPlace->SetFocus ();
- }
- else
- {
- m_pWndList->SetFocus ();
- }
- m_bButtonIsDown = FALSE;
- Redraw ();
- }
- //*****************************************************************************
- CString CBCGPFontProp::FormatProperty ()
- {
- CString str;
- CWindowDC dc (m_pWndList);
- int nLogY = dc.GetDeviceCaps (LOGPIXELSY);
- if (nLogY != 0)
- {
- str.Format( _T("%s(%i)"), m_lf.lfFaceName,
- MulDiv (72, -m_lf.lfHeight, nLogY));
- }
- else
- {
- str = m_lf.lfFaceName;
- }
- return str;
- }
- //****************************************************************************************
- void CBCGPFontProp::ResetOriginalValue ()
- {
- CBCGPProp::ResetOriginalValue ();
- m_lf = m_lfOrig;
- }
- //****************************************************************************************
- void CBCGPFontProp::CommitModifiedValue ()
- {
- CBCGPProp::CommitModifiedValue ();
- m_lfOrig = m_lf;
- }
- /////////////////////////////////////////////////////////////////////////////
- // CBCGPPropList
- IMPLEMENT_DYNAMIC(CBCGPPropList, CWnd)
- /////////////////////////////////////////////////////////////////////////////
- // CBCGPPropList notification messages:
- UINT BCGM_PROPERTY_CHANGED = ::RegisterWindowMessage (_T("BCGM_PROPERTYCHANGED"));
- CBCGPPropList::CBCGPPropList()
- {
- m_hFont = NULL;
- m_nEditLeftMargin = 0;
- m_nBoldEditLeftMargin = 0;
- m_bHeaderCtrl = TRUE;
- m_bDescriptionArea = FALSE;
- m_nDescrHeight = -1;
- m_nDescrRows = 3;
- m_bAlphabeticMode = FALSE;
- m_bVSDotNetLook = FALSE;
- m_rectList.SetRectEmpty ();
- m_nLeftColumnWidth = 0;
- m_rectTrackHeader.SetRectEmpty ();
- m_rectTrackDescr.SetRectEmpty ();
- m_nRowHeight = 0;
- m_nHeaderHeight = 0;
- m_nVertScrollOffset = 0;
- m_nVertScrollTotal = 0;
- m_nVertScrollPage = 0;
- m_pSel = NULL;
- m_bFocused = FALSE;
- m_nTooltipsCount = 0;
- m_bAlwaysShowUserTT = TRUE;
- m_bTracking = FALSE;
- m_bTrackingDescr = FALSE;
- m_strTrue = _T("True");
- m_strFalse = _T("False");
- m_cListDelimeter = _T(',');
- m_bControlBarColors = FALSE;
- m_bGroupNameFullWidth = TRUE;
- m_bShowDragContext = TRUE;
- m_clrBackground = (COLORREF)-1;
- m_clrText = (COLORREF)-1;
- m_clrGroupBackground = (COLORREF)-1;
- m_clrGroupText = (COLORREF)-1;
- m_clrDescriptionBackground = (COLORREF)-1;
- m_clrDescriptionText = (COLORREF)-1;
- m_clrLine = (COLORREF)-1;
- m_bMarkModifiedProperties = FALSE;