Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

225 lines
5.7 KiB

// implements the exported CTreeItem
#include "stdafx.h"
#include "KeyObjs.h"
#include "machine.h"
#include "KeyRing.h"
#include "KRDoc.h"
#include "KRView.h"
IMPLEMENT_DYNCREATE(CTreeItem, CObject);
extern CKeyRingView* g_pTreeView;
//-------------------------------------------------
// constructor. it is NOT added to the parent immediately
//-------------------------------------------------
CTreeItem::CTreeItem():
m_iImage(0),
m_hTreeItem(NULL),
m_fDirty( FALSE )
{
m_szItemName.Empty();
}
//-------------------------------------------------
// remove the item from the ctreectrl
//-------------------------------------------------
BOOL CTreeItem::FRemoveFromTree()
{
CTreeCtrl *pTree = PGetTreeCtrl();
ASSERT(pTree);
ASSERT(m_hTreeItem);
return pTree->DeleteItem( m_hTreeItem );
}
//-------------------------------------------------
// add the item to the ctreectrl
//-------------------------------------------------
BOOL CTreeItem::FAddToTree( CTreeItem* pParent )
{
HTREEITEM hParent = TVI_ROOT;
// this item should NOT have already been added
ASSERT( !m_hTreeItem );
// get the tree control
CTreeCtrl* pTree = PGetTreeCtrl();
ASSERT( pTree );
if ( !pTree ) return FALSE;
// get the parent's htree item
if ( pParent )
{
hParent = pParent->HGetTreeItem();
ASSERT( hParent );
}
// add this item to the tree
HTREEITEM hTreeItem = pTree->InsertItem( m_szItemName, hParent );
ASSERT( hTreeItem );
if ( !hTreeItem ) return FALSE;
// set the item's image to be the correct icon
BOOL f = pTree->SetItemImage( hTreeItem, m_iImage, m_iImage );
// set the item's private data to point back to the host object
f = pTree->SetItemData( hTreeItem, (ULONG)this );
// now set the tree item back into this so we can backtrack later
m_hTreeItem = hTreeItem;
// tell the item to update its caption
UpdateCaption();
// we always expand the parent after adding something to it
// and we also alphabetize it
if ( pParent )
{
pTree->SortChildren( hParent );
pTree->Expand( hParent, TVE_EXPAND );
}
else
{
// this item is at the root level
pTree->SortChildren( TVI_ROOT );
}
// looks successful to me
return TRUE;
}
//-------------------------------------------------
// get the parent item to this tree item
//-------------------------------------------------
CTreeItem* CTreeItem::PGetParent()
{
if ( !m_hTreeItem ) return NULL;
CTreeCtrl *pTree = PGetTreeCtrl();
ASSERT(pTree);
ASSERT(m_hTreeItem);
// get the parent tree item
HTREEITEM hParent = pTree->GetParentItem( m_hTreeItem );
ASSERT( hParent );
if ( !hParent ) return NULL;
// return the parent
return (CTreeItem*)pTree->GetItemData( hParent );
}
//-------------------------------------------------
// access the name shown in the tree view
//-------------------------------------------------
BOOL CTreeItem::FSetCaption( CString& szCaption )
{
CTreeCtrl *pTree = PGetTreeCtrl();
ASSERT( szCaption );
ASSERT( pTree );
if ( m_hTreeItem )
return pTree->SetItemText( m_hTreeItem, szCaption );
else
return FALSE;
}
//-------------------------------------------------
// set the image shown in the tree view
//-------------------------------------------------
BOOL CTreeItem::FSetImage( WORD i )
{
if ( !m_hTreeItem )
return FALSE;
// store away the image index
m_iImage = i;
CTreeCtrl *pTree = PGetTreeCtrl();
ASSERT( i );
ASSERT( pTree );
ASSERT( m_hTreeItem );
return pTree->SetItemImage( m_hTreeItem, m_iImage, m_iImage );
}
//-------------------------------------------------
// get the grandparental ctreectrl object
//-------------------------------------------------
CTreeCtrl* CTreeItem::PGetTreeCtrl( void )
{
return (CTreeCtrl*)g_pTreeView;
}
//-------------------------------------------------
WORD CTreeItem::GetChildCount()
{
WORD cChildren = 0;
// loop through the children and count them
CTreeItem* pChild = GetFirstChild();
while( pChild )
{
// as the great Count Von Count would say.....
cChildren++;
// get the next child
pChild = GetNextChild( pChild );
}
// how many where there?
return cChildren;
}
//-------------------------------------------------
CTreeItem* CTreeItem::GetFirstChild()
{
ASSERT(HGetTreeItem());
if ( !HGetTreeItem() ) return NULL;
// get the tree control
CTreeCtrl* pTree = PGetTreeCtrl();
// get the first child
HTREEITEM hTree = pTree->GetChildItem( HGetTreeItem() );
// if there is no item, don't return anything
if ( !hTree )
return NULL;
// return the object
return (CTreeItem*)pTree->GetItemData( hTree );
}
//-------------------------------------------------
CTreeItem* CTreeItem::GetNextChild( CTreeItem* pKid )
{
ASSERT(pKid->HGetTreeItem());
if ( !pKid->HGetTreeItem() ) return NULL;
// get the tree control
CTreeCtrl* pTree = PGetTreeCtrl();
// get the first child
HTREEITEM hTree = pTree->GetNextSiblingItem( pKid->HGetTreeItem() );
// if there is no item, don't return anything
if ( !hTree )
return NULL;
// return the object
return (CTreeItem*)pTree->GetItemData( hTree );
}
//-------------------------------------------------
void CTreeItem::SetDirty( BOOL fDirty )
{
// get the parent item
CTreeItem* pParent = PGetParent();
// set the parent dirty
if ( pParent && fDirty )
pParent->SetDirty( fDirty );
// set the dirty flag
m_fDirty = fDirty;
}