void PropertyTree::OnPaint() 
{
    CPaintDC dc(this);

    ClearVisibleList();

    // get client rect
    CRect rc;
    GetClientRect( rc );

    // draw control background
    CMemDC memdc( &dc );
    memdc.FillSolidRect( rc, Globals::Preferences->GetBtnFaceColor() );

    PropertyTreeItem* pItem;
    LONG nTotal = 0;

    ASSERT(GetRootItem()!=NULL);

    // create clip region
    HRGN hRgn = CreateRectRgn( rc.left, rc.top, rc.right, rc.bottom );
    SelectClipRgn( memdc.m_hDC, hRgn );

    // build a list of visible items prior to drawing. if
    // we decide to later implement trees with more than
    // one level, we will need a recursive function call
    // to do this.

    pItem = GetRootItem()->GetChild();
    while ( pItem )
    {
        m_pVisibleList.push_back( pItem );
        if ( pItem->IsExpanded() && pItem->GetChild() )
        {
            PropertyTreeItem* pNext = pItem->GetChild();
            while ( pNext )
            {
                m_pVisibleList.push_back( pNext );
                pNext = pNext->GetNext();
            }
        }
        pItem = pItem->GetNext();
    }

    // determine if the scrollbar is visible
    CheckScrollVisible();

    // actually draw the items
    for ( size_t i = 0; i < m_pVisibleList.size(); i++ )
    {
        LONG nHeight = m_pVisibleList.at( i )->DrawItem(&memdc, rc, 0, nTotal);
        nTotal += nHeight;
    }

    // remove clip region
    SelectClipRgn(memdc.m_hDC, NULL);
    DeleteObject(hRgn);
}
Exemple #2
0
void CPropTree::Delete(CPropTreeItem* pItem)
{
	if (pItem && pItem!=&m_Root && SendNotify(PTN_DELETEITEM, pItem))
		return;

	// passing in a NULL item is the same as calling DeleteAllItems
	if (!pItem)
		pItem = &m_Root;

	// Clear the visible list before anything gets deleted
	ClearVisibleList();

	// delete children

	CPropTreeItem* pIter;
	CPropTreeItem* pNext;

	pIter = pItem->GetChild();
	while (pIter)
	{
		pNext = pIter->GetSibling();
		DeleteItem(pIter);
		pIter = pNext;
	}

	// unlink from tree
	if (pItem->GetParent())
	{
		if (pItem->GetParent()->GetChild()==pItem)
			pItem->GetParent()->SetChild(pItem->GetSibling());
		else
		{
			pIter = pItem->GetParent()->GetChild();
			while (pIter->GetSibling() && pIter->GetSibling()!=pItem)
				pIter = pIter->GetSibling();

			if (pIter->GetSibling())
				pIter->SetSibling(pItem->GetSibling());
		}
	}

	if (pItem!=&m_Root)
	{
		if (pItem==GetFocusedItem())
			SetFocusedItem(NULL);
		delete pItem;
	}
}
Exemple #3
0
void COptionTree::Delete(COptionTreeItem *otiItem)
{
	// Declare variables
	COptionTreeItem* otiIter;
	COptionTreeItem* otiNext;

	// Clear visible list
	ClearVisibleList();

	// Send notify to user
	SendNotify(OT_NOTIFY_DELETEITEM, otiItem);

	// Passing in a NULL deletes frm root
	if (otiItem == NULL)
	{
		otiItem = &m_otiRoot;
	}

	// Delete children
	otiIter = otiItem->GetChild();
	while (otiIter != NULL)
	{
		// -- Get sibling
		otiNext = otiIter->GetSibling();
		
		// -- Delete
		DeleteItem(otiIter);

		// -- Get next
		otiIter = otiNext;
	}

	// Unlink from tree
	if (otiItem->GetParent() != NULL)
	{
		if (otiItem->GetParent()->GetChild() == otiItem)
		{
			otiItem->GetParent()->SetChild(otiItem->GetSibling());
		}
		else
		{
			otiIter = otiItem->GetParent()->GetChild();

			while (otiIter->GetSibling() && otiIter->GetSibling() != otiItem)
			{
				otiIter = otiIter->GetSibling();
			}

			if (otiIter->GetSibling())
			{
				otiIter->SetSibling(otiItem->GetSibling());
			}
		}
	}

	// Delete item
	if (otiItem != &m_otiRoot)
	{
		if (otiItem == GetFocusedItem())
		{
			SetFocusedItem(NULL);
		}

		otiItem->CleanDestroyWindow();

		delete otiItem;
	}
}