/******************************************** ** 工作室: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