Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

332 lines
9.7 KiB

/////////////////////////////////////////////////////////////////////////////
//
// 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<CTreeItemContext *, CTreeItemContext *> 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<CTreeItem *, CTreeItem *>
{
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
/////////////////////////////////////////////////////////////////////////////
template<>
void AFXAPI DestructElements(CTreeItem ** pElements, INT_PTR 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<CTreeItem *,CTreeItem *>::AddHead(newElement);
if (pos != NULL)
newElement->AddRef();
return pos;
} //*** CTreeItemList::AddHead()
inline POSITION CTreeItemList::AddTail(CTreeItem * newElement)
{
ASSERT_VALID(newElement);
POSITION pos = CList<CTreeItem *,CTreeItem *>::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<CTreeItem *,CTreeItem *>::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<CTreeItem *,CTreeItem *>::InsertAfter(position, newElement);
if (pos != NULL)
newElement->AddRef();
return pos;
} //*** CTreeItemList::InsertAfter()
/////////////////////////////////////////////////////////////////////////////
#endif // _TREEITEM_H_