/********************************************
** 工作室:S&P工作室
** 作者 :张东斌
** 日期 :2007年6月
*********************************************/
#if !defined(__SPPROPERTYGRIDITEM_H__)
#define __SPPROPERTYGRIDITEM_H__
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// class forwards.
class CSPPropertyGridView;
class CSPPropertyGridItem;
//-----------------------------------------------------------------------
// Summary:
// This constant is used to determine the "gutter" width of the property
// grid. This is the area on the left of the grid that the
// expand buttons are drawn in.
// Remarks:
// This is useful when drawing owner drawn controls such as buttons
// and drop-down menus.
// Example:
// The following example illustrates using SP_PGI_EXPAND_BORDER:
//
// void CDelphiGridPage::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
// {
// // code snip ...
//
// CRect rcText(rc);
// rcText.left = max(1, pItem->GetIndent()) * SP_PGI_EXPAND_BORDER + 3;
// rcText.right = rcCaption.right - 1;
// rcText.bottom -= 1;
// dc.DrawText( pItem->GetCaption(), rcText, DT_SINGLELINE|DT_VCENTER);
// }
//
//-----------------------------------------------------------------------
const int SP_PGI_EXPAND_BORDER = 14;
//-----------------------------------------------------------------------
// Summary:
// Flags that indicate what styles to set for the grid item.
// Example:
// pItem->SetFlags(SPGridItemHasEdit|SPGridItemHasComboButton);
// See Also: CSPPropertyGridItem::SetFlags, OnInplaceButtonDown
//
//
//-----------------------------------------------------------------------
enum SPPropertyGridItemFlags
{
SPGridItemHasEdit = 1, // Item has an edit control.
SPGridItemHasExpandButton = 2, // Item has an expand button.
SPGridItemHasComboButton = 4 // Item has a combo button.
};
//===========================================================================
// Summary:
// CSPPropertyGridItems is a CList derived class. It represents the items
// collection with some internal functionality.
//===========================================================================
class CSPPropertyGridItems : public CCmdTarget
{
public:
//-----------------------------------------------------------------------
// Summary:
// Call this member function to find an item.
// Parameters:
// strCaption - Caption for the item to find.
// nID - Identifier for the item to find.
// Returns:
// A pointer to a CSPPropertyGridItem object.
//-----------------------------------------------------------------------
CSPPropertyGridItem* FindItem(UINT nID);
CSPPropertyGridItem* FindItem(CString strCaption); //
//-----------------------------------------------------------------------
// Summary:
// Call this member to determine the index of a CSPPropertyGridItem.
// Parameters:
// pItem - Pointer to the CSPPropertyGridItem you want to know
// the index of.
// Returns:
// The index of the item within the collection of items, -1 if
// the item is not found.
//-----------------------------------------------------------------------
int Find(CSPPropertyGridItem* pItem);
//-----------------------------------------------------------------------
// Summary:
// Call this member to clear all the items in a list.
//-----------------------------------------------------------------------
void Clear();
//-----------------------------------------------------------------------
// Summary:
// Call this member to get count of the items in a list.
// Returns:
// Count of the items in a list.
//-----------------------------------------------------------------------
long GetCount();
//-----------------------------------------------------------------------
// Summary:
// Call this member to determine if any items have been added
// to the property grid.
// Returns:
// TRUE if there are no items in the grid, FALSE if at least
// one item has been added to the grid.
//-----------------------------------------------------------------------
BOOL IsEmpty();
//-----------------------------------------------------------------------
// Summary:
// Call this member to get an item by its index.
// Parameters:
// nIndex - Item's index.
// Returns:
// A pointer to a CSPPropertyGridItem object.
//-----------------------------------------------------------------------
CSPPropertyGridItem* GetAt(int nIndex);
//-----------------------------------------------------------------------
// Summary:
// Call this member to remove an item by its index.
// Parameters:
// nIndex - Item's index.
//-----------------------------------------------------------------------
void RemoveAt (int nIndex);
protected:
//-------------------------------------------------------------------------
// Summary:
// Constructs a CSPPropertyGridItems object.
//-------------------------------------------------------------------------
CSPPropertyGridItems();
//-----------------------------------------------------------------------
// Summary:
// This member adds a new item to the end (tail) of the
// Property Grid's collection of items. The collection can be empty
// before the operation.
// Parameters:
// pItem - Pointer to the CSPPropertyGridItem to add to the collection.
//-----------------------------------------------------------------------
void AddTail(CSPPropertyGridItem* pItem);
//-----------------------------------------------------------------------
// Summary:
// This member is called to insert a CSPPropertyGridItem object
// into the collections of items at a specific location specified
// by nIndex.
// Parameters:
// nIndex - Position in the collection of items to insert pItem.
// pItem - Pointer to the CSPPropertyGridItem to add to the collection.
//-----------------------------------------------------------------------
void InsertAt(int nIndex, CSPPropertyGridItem* pItem);
//-----------------------------------------------------------------------
// Summary:
// This member adds a collection of items to the end (tail) of the
// Property Grid's collection of items. The collection can be empty
// before the operation.
// Parameters:
// pItems - Pointer to the collection of CSPPropertyGridItems to
// add to the collection.
//-----------------------------------------------------------------------
void AddTail(CSPPropertyGridItems* pItems);
//-------------------------------------------------------------------------
// Summary:
// This member sorts the collection of items in alphabetical order.
// Remarks:
// This method uses Visual C++ run-time library (MSVCRT)
// implementation of the quick-sort function, qsort, for sorting
// stored CSPPropertyGridItem objects.
//-------------------------------------------------------------------------
void Sort();
private:
static int _cdecl CompareFunc(const CSPPropertyGridItem** ppItem1, const CSPPropertyGridItem** ppItem2);
private:
CArray m_arrItems;
CSPPropertyGridView* m_pGrid;
friend class CSPPropertyGridItem;
friend class CSPPropertyGridView;
};
class CSPPropertyGridItemConstraint : public CCmdTarget
{
public:
CSPPropertyGridItemConstraint();
int GetIndex();
public:
CString m_strConstraint; // Caption text of constraint. This is the
// text displayed for this constraint.
DWORD_PTR m_dwData; // The 32-bit value associated with the item.
protected:
int m_nIndex; // Index of constraint.
friend class CSPPropertyGridItemConstraints;
};
class CSPPropertyGridItemConstraints : public CCmdTarget
{
protected:
CSPPropertyGridItemConstraints(CSPPropertyGridItem* pItem);
~CSPPropertyGridItemConstraints();
public:
CSPPropertyGridItemConstraint* AddConstraint(CString str, DWORD dwData = 0);
int GetCount();
BOOL IsEmpty();
void RemoveAll();
void RemoveAt (int nIndex);
void SetCurrent(int nIndex);
int GetCurrent();
int FindConstraint(CString str);
int FindConstraint(DWORD dwData); //
CString GetAt(int nIndex);
CSPPropertyGridItemConstraint* GetConstraintAt(int nIndex);
void Sort();
private:
static int _cdecl CompareFunc(const CSPPropertyGridItemConstraint** ppConstraint1, const CSPPropertyGridItemConstraint** ppConstraint2);
private:
CArray m_arrConstraints;
int m_nCurrent;
CSPPropertyGridItem* m_pItem;
friend class CSPPropertyGridItem;
};
class CSPPropertyGridItem : public CCmdTarget
{
public:
CSPPropertyGridItem(CString strCaption, LPCTSTR strValue = NULL, CString* pBindString = NULL);
CSPPropertyGridItem(UINT nID, LPCTSTR strValue = NULL, CString* pBindString = NULL); //
virtual ~CSPPropertyGridItem();
public:
void SetCaption(CString strCaption);
void SetPrompt(CString strCaption);
void SetDescription(LPCTSTR lpszDescription);
void SetReadOnly(BOOL bReadOnly);
void SetID(UINT nID);
void SetFlags(UINT nFlags);
CString GetCaption() const;
CString GetDescription();
BOOL GetReadOnly();
UINT GetID();
CString GetValue();
UINT GetFlags();
BOOL IsCategory();
CSPPropertyGridItem* AddChildItem(CSPPropertyGridItem* pItem);
CSPPropertyGridItem* InsertChildItem(int nIndex, CSPPropertyGridItem* pItem);
BOOL HasChilds();
CSPPropertyGridItems* GetChilds();
BOOL HasParent(CSPPropertyGridItem* pParent);
CSPPropertyGridItemConstraints* GetConstraints();
void SetConstraintEdit(BOOL bConstraintEdit);
BOOL GetConstraintEdit();
void Expand();
void Collapse();
void Select();
CRect GetItemRect();
virtual CRect GetValueRect();
virtual void SetValue(CString strValue);
virtual void OnValueChanged(CString strValue);
CSPPropertyGridView* GetGrid();
BOOL IsVisible() const;
BOOL IsExpanded() const;
CSPPropertyGridItem* GetParentItem();
int GetIndent();
virtual BOOL OnDrawItemValue(CDC& dc, CRect rcValue);
virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);
BOOL IsSelected();
void BindToString(CString* pBindString);
void Remove();
void SetMask(LPCTSTR strMask, LPCTSTR strLiteral, TCHAR chPrompt = _T('_'));
void SetPasswordMask(TCHAR chMask = _T('*'));
CString GetMaskedText();
void SetMaskedText(LPCTSTR lpszMaskedText);
virtual CString GetViewValue();
void SetItemData(DWORD_PTR dwData);
DWORD_PTR GetItemData();
virtual CSPPropertyGridInplaceEdit& GetInplaceEdit();
protected:
virtual void SetVisible(BOOL bVisible);
virtual void OnSelect();
virtual void OnDeselect();
virtual BOOL OnChar(UINT nChar);
virtual void OnLButtonDblClk();
virtual void OnRButtonDown();
virtual BOOL OnLButtonDown(UINT nFlags, CPoint point);
virtual void OnAddChildItem();
virtual void OnInplaceButtonDown();
virtual CSPPropertyGridInplaceButton& GetInplaceButton();
virtual CSPPropertyGridInplaceList& GetInplaceList();
virtual void OnValidateEdit();
virtual void SetEditText(CString str);
virtual void OnBeforeInsert();
virtual void OnConstraintsChanged();
protected:
BOOL m_bConstraintEdit; // TRUE to constraint edit.
int m_nIndex; // Index of the item.
int m_nIndent; // Indent of the item.
UINT m_nID; // Identifier of the item.
UINT m_nFlags; // Item's flags.
BOOL m_bReadOnly; // TRUE to disable item's edition.
BOOL m_bVisible; // Visibility of the item.
BOOL m_bCategory; // TRUE if the item is category.
BOOL m_bExpanded; // TRUE if item is expanded.
CString m_strValue; // Value of the item.
CString m_strCaption; // Caption of the item.
CString m_strDescription; // Description of the item.
CSPPropertyGridItem* m_pParent; // Parent item.
CSPPropertyGridView* m_pGrid; // Parent grid class.
CSPPropertyGridItems* m_pChilds; // Child items.
CSPPropertyGridItemConstraints* m_pConstraints; // Item's constraints.
CString* m_pBindString; // Binded string.
CString m_strFormat; // Format of the double value.
CString m_strMask; // String to use as edit mask.
CString m_strLiteral; // String to use as literal. This is the same as the edit mask, but all mask characters are replaced with m_chPrompt.
TCHAR m_chPrompt; // Character used as a space holder for a character. This is used in m_strLiteral.
bool m_bUseMask; // TRUE to use and edit mask to display item data.
BOOL m_bPassword; // TRUE to use a password mask. If TRUE, then each character will be replaced with an asterisk (*).
DWORD_PTR m_dwData; // The 32-bit value associated with the item
private:
void Init();
void Refresh(BOOL bInvalidate = TRUE);
friend class CSPPropertyGridItems;
friend class CSPPropertyGridView;
friend class CSPPropertyGridInplaceEdit;
friend class CSPPropertyGridInplaceButton;
DECLARE_DYNAMIC(CSPPropertyGridItem)
friend class CSPPropertyGridItemConstraints;
friend class CSPPropertyGrid;
};
class CSPPropertyGridItemCategory : public CSPPropertyGridItem
{
public:
CSPPropertyGridItemCategory(CString strCaption);
CSPPropertyGridItemCategory(UINT nID); //
};
//////////////////////////////////////////////////////////////////////
AFX_INLINE long CSPPropertyGridItems::GetCount() {
return (long)m_arrItems.GetSize();
}
AFX_INLINE BOOL CSPPropertyGridItems::IsEmpty() {
return GetCount() == 0;
}
AFX_INLINE void CSPPropertyGridItems::AddTail(CSPPropertyGridItem* pItem) {
m_arrItems.Add(pItem);
}
AFX_INLINE void CSPPropertyGridItems::InsertAt(int nIndex, CSPPropertyGridItem* pItem) {
m_arrItems.InsertAt(nIndex, pItem);
}
AFX_INLINE BOOL CSPPropertyGridItem::HasChilds() {
return !m_pChilds->IsEmpty();
}
AFX_INLINE void CSPPropertyGridItem::SetCaption(CString strCaption) {
m_strCaption = strCaption;
}
AFX_INLINE CString CSPPropertyGridItem::GetCaption() const {
return m_strCaption;
}
AFX_INLINE CString CSPPropertyGridItem::GetDescription() {
return m_strDescription;
}
AFX_INLINE BOOL CSPPropertyGridItem::GetReadOnly() {
return m_bReadOnly;
}
AFX_INLINE void CSPPropertyGridItem::SetID(UINT nID) {
m_nID = nID;
}
AFX_INLINE UINT CSPPropertyGridItem::GetID() {
return m_nID;
}
AFX_INLINE CString CSPPropertyGridItem::GetValue() {
return m_strValue;
}
AFX_INLINE BOOL CSPPropertyGridItem::IsCategory() {
return m_bCategory;
}
AFX_INLINE CSPPropertyGridView* CSPPropertyGridItem::GetGrid() {
return m_pGrid;
}
AFX_INLINE BOOL CSPPropertyGridItem::OnDrawItemValue(CDC&, CRect) {
return FALSE;
}
AFX_INLINE void CSPPropertyGridItem::OnAddChildItem() {
}
AFX_INLINE void CSPPropertyGridItem::SetFlags(UINT nFlags) {
ASSERT(!m_bCategory);
ASSERT((nFlags & (SPGridItemHasComboButton | SPGridItemHasExpandButton)) != (SPGridItemHasComboButton | SPGridItemHasExpandButton));
m_nFlags = nFlags;
}
AFX_INLINE UINT CSPPropertyGridItem::GetFlags() {
return m_nFlags;
}
AFX_INLINE BOOL CSPPropertyGridItem::IsVisible() const {
return m_bVisible;
}
AFX_INLINE BOOL CSPPropertyGridItem::IsExpanded() const {
return m_bExpanded;
}
AFX_INLINE CSPPropertyGridItem* CSPPropertyGridItem::GetParentItem() {
return m_pParent;
}
AFX_INLINE CSPPropertyGridItems* CSPPropertyGridItem::GetChilds() {
return m_pChilds;
}
AFX_INLINE int CSPPropertyGridItem::GetIndent() {
return m_nIndent;
}
AFX_INLINE void CSPPropertyGridItem::SetConstraintEdit(BOOL bConstraintEdit) {
m_bConstraintEdit = bConstraintEdit;
}
AFX_INLINE BOOL CSPPropertyGridItem::GetConstraintEdit() {
return m_bConstraintEdit;
}
AFX_INLINE void CSPPropertyGridItem::SetPasswordMask(TCHAR chMask ) {
m_bPassword = TRUE;
m_chPrompt = chMask;
}
AFX_INLINE void CSPPropertyGridItem::OnRButtonDown() {
}
AFX_INLINE void CSPPropertyGridItem::OnConstraintsChanged() {
}
AFX_INLINE void CSPPropertyGridItem::MeasureItem(LPMEASUREITEMSTRUCT /*lpMeasureItemStruct*/) {
}
AFX_INLINE void CSPPropertyGridItem::SetItemData(DWORD_PTR dwData) {
m_dwData = dwData;
}
AFX_INLINE DWORD_PTR CSPPropertyGridItem::GetItemData() {
return m_dwData;
}
AFX_INLINE void CSPPropertyGridItem::SetVisible(BOOL bVisible) {
m_bVisible = bVisible;
}
AFX_INLINE CSPPropertyGridItemConstraints* CSPPropertyGridItem::GetConstraints(){
return m_pConstraints;
}
AFX_INLINE int CSPPropertyGridItemConstraints::GetCount() {
return (int)m_arrConstraints.GetSize();
}
AFX_INLINE BOOL CSPPropertyGridItemConstraints::IsEmpty() {
return GetCount() == 0;
}
AFX_INLINE void CSPPropertyGridItemConstraints::SetCurrent(int nIndex){
m_nCurrent = nIndex;
}
AFX_INLINE int CSPPropertyGridItemConstraints::GetCurrent(){
return m_nCurrent;
}
AFX_INLINE int CSPPropertyGridItemConstraint::GetIndex() {
return m_nIndex;
}
#endif