///////////////////////////////////////////////////////////////////////////// // // Copyright (c) 1996 Microsoft Corporation // // Module Name: // TreeItem.h // // Abstract: // Definition of the CTreeItem class. // // Implementation File: // TreeItem.cpp // // Author: // David Potter (davidp) May 3, 1996 // // Revision History: // // Notes: // ///////////////////////////////////////////////////////////////////////////// #ifndef _TREEITEM_H_ #define _TREEITEM_H_ #ifndef __AFXTEMPL_H__ #include "afxtempl.h" // for CList #endif ///////////////////////////////////////////////////////////////////////////// // Forward Class Declarations ///////////////////////////////////////////////////////////////////////////// class CTreeItemList; class CTreeItemContext; class CTreeItem; ///////////////////////////////////////////////////////////////////////////// // External Class Declarations ///////////////////////////////////////////////////////////////////////////// class CClusterItem; class CSplitterFrame; class CClusterListView; class CClusterTreeView; ///////////////////////////////////////////////////////////////////////////// // Type Definitions ///////////////////////////////////////////////////////////////////////////// typedef CList CTreeItemContextList; ///////////////////////////////////////////////////////////////////////////// // Include Files ///////////////////////////////////////////////////////////////////////////// #ifndef _BASECMDT_H_ #include "BaseCmdT.h" // for CBaseCmdTarget #endif #ifndef _COLITEM_H_ #include "ColItem.h" // for CColumnItem #endif #ifndef _LISTITEM_H_ #include "ListItem.h" // for CListItemList #endif ///////////////////////////////////////////////////////////////////////////// // CTreeItemList ///////////////////////////////////////////////////////////////////////////// class CTreeItemList : public CList { public: CTreeItem * PtiFromPci( IN const CClusterItem * pci, OUT POSITION * ppos = NULL ) const; // add before head or after tail POSITION AddHead(CTreeItem * newElement); POSITION AddTail(CTreeItem * newElement); // inserting before or after a given position POSITION InsertBefore(POSITION position, CTreeItem * newElement); POSITION InsertAfter(POSITION position, CTreeItem * newElement); }; //*** class CTreeItemList ///////////////////////////////////////////////////////////////////////////// // CTreeItemContext ///////////////////////////////////////////////////////////////////////////// class CTreeItemContext : public CObject { DECLARE_DYNCREATE(CTreeItemContext) public: CSplitterFrame * m_pframe; CTreeItem * m_pti; HTREEITEM m_hti; BOOL m_bExpanded; DWORD * m_prgnColumnInfo; CTreeItemContext(void) { CommonConstruct(); }; CTreeItemContext( CSplitterFrame * pframe, CTreeItem * pti, HTREEITEM hti, BOOL bExpanded ) { CommonConstruct(); m_pframe = pframe; m_pti = pti; m_hti = hti; m_bExpanded = bExpanded; } ~CTreeItemContext(void) { SaveProfileInfo(); delete [] m_prgnColumnInfo; m_prgnColumnInfo = NULL; } void CommonConstruct(void) { m_pframe = NULL; m_pti = NULL; m_hti = NULL; m_bExpanded = FALSE; m_prgnColumnInfo = NULL; } void Init(void); void SaveProfileInfo(void); DWORD * PrgnColumnInfo(void); BOOL BIsExpanded(void) const; }; //*** class CTreeItemContext ///////////////////////////////////////////////////////////////////////////// // CTreeItem command target ///////////////////////////////////////////////////////////////////////////// class CTreeItem : public CBaseCmdTarget { friend class CClusterTreeView; DECLARE_DYNCREATE(CTreeItem) CTreeItem(void); // protected constructor used by dynamic creation CTreeItem(IN OUT CTreeItem * ptiParent, IN OUT CClusterItem * pci, IN BOOL m_fTakeOwnership = FALSE); void Init(void); // Attributes protected: CTreeItem * m_ptiParent; CClusterItem * m_pci; BOOL m_bWeOwnPci; CString m_strProfileSection; CColumnItemList m_lpcoli; CTreeItemList m_lptiChildren; CListItemList m_lpliChildren; CTreeItemContextList m_lptic; const CTreeItemContextList & Lptic(void) const { return m_lptic; } public: CTreeItem * PtiParent(void) const { return m_ptiParent; } CClusterItem * Pci(void) const { return m_pci; } const CString & StrProfileSection(void); const CColumnItemList & Lpcoli(void) const { return m_lpcoli; } const CTreeItemList & LptiChildren(void) const { return m_lptiChildren; } const CListItemList & LpliChildren(void) const { return m_lpliChildren; } const CString & StrName(void) const; DWORD * PrgnColumnInfo(IN const CClusterListView * pclv) { CTreeItemContext * ptic; ptic = PticFromView(pclv); ASSERT_VALID(ptic); return ptic->PrgnColumnInfo(); } //*** CTreeItem::PrgnColumnInfo() // Operations public: HTREEITEM HtiInsertInTree(IN OUT CClusterTreeView * pctv); void RemoveFromAllLists(void); void PreRemoveFromFrame(IN OUT CSplitterFrame * pframe); void PreRemoveFromFrameWithChildren(IN OUT CSplitterFrame * pframe); CColumnItem * PcoliAddColumn( IN const CString & rstrText, IN IDS idsColumnID, IN int nDefaultWidth = -1, IN int nWidth = -1 ); CColumnItem * PcoliAddColumn(IN IDS idsText, IN int nDefaultWidth = -1, IN int nWidth = -1); void DeleteAllColumns(void) { m_lpcoli.RemoveAll(); } void UpdateState(void); void UpdateAllStatesInTree(void); void UpdateUIState(void); void Select(IN OUT CClusterTreeView * pctv, IN BOOL bSelectInTree); // void Unselect(CClusterTreeView * pctv); CTreeItem * PtiAddChildBefore( IN const CClusterItem * pciOld, OUT CClusterItem * pciNew, IN BOOL bTakeOwnership = FALSE ); void InsertChildInAllTrees(IN OUT CTreeItem * ptiNewChild); CTreeItem * PtiAddChild(IN OUT CClusterItem * pci, IN BOOL bTakeOwnership = FALSE); CTreeItem * PtiAddChild(IN const CString & rstrName); CTreeItem * PtiAddChild(IN IDS idsName); CListItem * PliAddChild(IN OUT CClusterItem * pci); CTreeItem * PtiChildFromName(IN const CString & rstrName, OUT POSITION * ppos = NULL) const; CTreeItem * PtiChildFromName(IN IDS idsName, OUT POSITION * ppos = NULL) const; CTreeItem * PtiChildFromPci(IN const CClusterItem * pci) const; CListItem * PliChildFromPci(IN const CClusterItem * pci) const; void RemoveItem(void); void RemoveChild(IN OUT CClusterItem * pci); CMenu * PmenuPopup(void); BOOL BSelectItem(IN OUT CClusterTreeView * pctv); BOOL BExpand(IN OUT CClusterTreeView * pctv, IN UINT nCode); void SelectInAllViews(void); void ExpandInAllViews(IN UINT nCode); void SetExpandedState(IN const CClusterTreeView * pctv, IN BOOL bExpanded); BOOL BShouldBeExpanded(IN const CClusterTreeView * pctv) const; void OpenChild(IN OUT CTreeItem * pti, IN OUT CSplitterFrame * pframe); void EditLabel(IN OUT CClusterTreeView * pctv); void Delete(void); protected: void Cleanup(void); // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CTreeItem) public: virtual BOOL OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo); //}}AFX_VIRTUAL // Implementation public: virtual ~CTreeItem(void); protected: CTreeItemContext * PticFromFrame(IN const CSplitterFrame * pframe) const; CTreeItemContext * PticFromView(IN const CClusterTreeView * pctv) const; CTreeItemContext * PticFromView(IN const CClusterListView * pclv) const; HTREEITEM HtiFromView(IN const CClusterTreeView * pctv) const; // Generated message map functions //{{AFX_MSG(CTreeItem) //}}AFX_MSG DECLARE_MESSAGE_MAP() }; //*** class CTreeItem ///////////////////////////////////////////////////////////////////////////// // Global Functions ///////////////////////////////////////////////////////////////////////////// void AFXAPI DestructElements(CTreeItem ** pElements, int nCount); void DeleteAllItemData(IN OUT CTreeItemList & rlp); void DeleteAllItemData(IN OUT CTreeItemContextList & rlp); ///////////////////////////////////////////////////////////////////////////// // Inline Functions ///////////////////////////////////////////////////////////////////////////// inline POSITION CTreeItemList::AddHead(CTreeItem * newElement) { ASSERT_VALID(newElement); POSITION pos = CList::AddHead(newElement); if (pos != NULL) newElement->AddRef(); return pos; } //*** CTreeItemList::AddHead() inline POSITION CTreeItemList::AddTail(CTreeItem * newElement) { ASSERT_VALID(newElement); POSITION pos = CList::AddTail(newElement); if (pos != NULL) newElement->AddRef(); return pos; } //*** CTreeItemList::AddTail() inline POSITION CTreeItemList::InsertBefore(POSITION position, CTreeItem * newElement) { ASSERT_VALID(newElement); POSITION pos = CList::InsertBefore(position, newElement); if (pos != NULL) newElement->AddRef(); return pos; } //*** CTreeItemList::InsertBefore() inline POSITION CTreeItemList::InsertAfter(POSITION position, CTreeItem * newElement) { ASSERT_VALID(newElement); POSITION pos = CList::InsertAfter(position, newElement); if (pos != NULL) newElement->AddRef(); return pos; } //*** CTreeItemList::InsertAfter() ///////////////////////////////////////////////////////////////////////////// #endif // _TREEITEM_H_