📄 treecolumn.cpp
字号:
ASSERT( aucLevel > 0);
ASSERT( m_iColumnWithTree >= 0);
ASSERT( aiIndex >= 0 );
ASSERT( aiNbrElements > 0);
ASSERT( m_pGrid != NULL);
ASSERT( aiIndex + aiNbrElements <= m_iRowCount - m_iFixedRowCount );
int i1;
if( aucLevel >= 0x80)
{
for( i1=0; i1 < aiNbrElements; i1++)
{
int iCellRow = m_iFixedRowCount + aiIndex + i1;
CGridTreeCell* pGridTreeCell = (CGridTreeCell*)m_pGrid->GetCell( iCellRow, m_iColumnWithTree);
if( pGridTreeCell == NULL)
return;
pGridTreeCell->SetViewable( TRUE);
}
}
else
{
for( i1=0; i1 < aiNbrElements; i1++)
{
int iCellRow = m_iFixedRowCount + aiIndex + i1;
CGridTreeCell* pGridTreeCell = (CGridTreeCell*)m_pGrid->GetCell( iCellRow, m_iColumnWithTree);
if( pGridTreeCell == NULL)
return;
if( pGridTreeCell->GetLevel() <= aucLevel)
pGridTreeCell->SetViewable( TRUE);
else
pGridTreeCell->SetViewable( FALSE);
}
}
}
/*****************************************************************************
Like MS-Word's outline feature. Can show 1st level of outline all the
way up to 126 levels or all
*****************************************************************************/
void CTreeColumn::TreeDisplayOutline( unsigned char aucLevel ) // level to display >= 0x80 displays all
{
ASSERT( aucLevel > 0);
ASSERT( m_pGrid != NULL);
ASSERT( m_iColumnWithTree >= 0);
if( m_iColumnWithTree < 0)
return;
TreeDataPrepOutline(aucLevel, // level to display >= 0x80 displays all
0, // Index to tree display data to modify
m_iRowCount - m_iFixedRowCount); // nbr of elements in tree display data
TreeRefreshRows();
}
/*****************************************************************************
Expands a branch 1 and only 1 level -- like when a user clicks on "+" box
in windows explorer tree. Note that it doesn't check whether adjacent nodes
are properply represented, it just does the expand
*****************************************************************************/
void CTreeColumn::TreeDataExpandOneLevel( int aiGridRow)
{
ASSERT( m_iColumnWithTree >= 0);
ASSERT( m_pGrid != NULL);
ASSERT( aiGridRow >= m_iFixedRowCount
&& aiGridRow < m_iRowCount);
// display desired node and save its level and make visible
CGridTreeCell* pGridTreeCell = (CGridTreeCell*)m_pGrid->GetCell( aiGridRow, m_iColumnWithTree);
if( pGridTreeCell == NULL)
return;
unsigned char ucLevelCurrent = pGridTreeCell->GetLevel();
if( ucLevelCurrent <= 0)
return; // don't expand or collapse items not part of the tree
pGridTreeCell->SetViewable( TRUE);
unsigned char ucLevel;
int i1;
for( i1 = aiGridRow + 1; i1 < m_iRowCount; i1++)
{
CGridTreeCell* pGridTreeCell = (CGridTreeCell*)m_pGrid->GetCell( i1, m_iColumnWithTree);
if( pGridTreeCell == NULL)
return;
ucLevel = pGridTreeCell->GetLevel();
if( ucLevel <= ucLevelCurrent)
break;
if( ucLevel == ucLevelCurrent + 1)
pGridTreeCell->SetViewable( TRUE);
else
pGridTreeCell->SetViewable( FALSE);
}
}
/*****************************************************************************
Collapses all levels of a branch -- not just 1 level. Using this in
conjunction with TreeDataExpandOneLevel will get a tree grid that performs like
VC++ watch window. Windows explorer tree differs: it "remembers" last
expansion.
Note that it doesn't check whether adjacent nodes are properply represented, it
just does the collapse.
*****************************************************************************/
void CTreeColumn::TreeDataCollapseAllSubLevels( int aiGridRow)
{
ASSERT( m_iColumnWithTree >= 0);
ASSERT( m_pGrid != NULL);
ASSERT( aiGridRow >= m_iFixedRowCount
&& aiGridRow < m_iRowCount);
// display desired node and save its level and make visible
CGridTreeCell* pGridTreeCell = (CGridTreeCell*)m_pGrid->GetCell( aiGridRow, m_iColumnWithTree);
if( pGridTreeCell == NULL)
return;
unsigned char ucLevelCurrent = pGridTreeCell->GetLevel();
if( ucLevelCurrent <= 0)
return; // don't expand or collapse items not part of the tree
pGridTreeCell->SetViewable( TRUE);
unsigned char ucLevel;
int i1;
for( i1 = aiGridRow + 1; i1 < m_iRowCount; i1++)
{
CGridTreeCell* pGridTreeCell = (CGridTreeCell*)m_pGrid->GetCell( i1, m_iColumnWithTree);
if( pGridTreeCell == NULL)
return;
ucLevel = pGridTreeCell->GetLevel();
if( ucLevel <= ucLevelCurrent)
break;
pGridTreeCell->SetViewable( FALSE);
}
}
/*****************************************************************************
Toggles tree expansion and collapsing. Intended to be connected to a user
event
*****************************************************************************/
void CTreeColumn::TreeExpandCollapseToggle( int aiGridRow) // Grid row of node to toggle
{
ASSERT( m_pGrid != NULL);
ASSERT( aiGridRow >= m_iFixedRowCount
&& aiGridRow < m_iRowCount);
ASSERT( m_bAllowDraw);
ASSERT( m_iColumnWithTree >= 0);
if( m_iColumnWithTree < 0)
return;
// if last element, forget it
if( aiGridRow + 1 >= m_iRowCount)
return;
// see if it needs to be expanded by looking at hide/show state of first neighbor.
// If first neighbor is hidden, should expand
CGridTreeCell* pGridTreeCell = (CGridTreeCell*)m_pGrid->GetCell( aiGridRow + 1, m_iColumnWithTree);
if( pGridTreeCell == NULL)
return;
if( pGridTreeCell->IsViewable() )
{
TreeDataCollapseAllSubLevels( aiGridRow);
}
else
{
TreeDataExpandOneLevel( aiGridRow);
}
TreeRefreshRows();
}
/*****************************************************************************
Should the cell identified by the row have a "+" or "-" graphic?
*****************************************************************************/
BOOL CTreeColumn::TreeCellHasPlusMinus( int aiRow, // row of Cell to check
BOOL* apbIsPlus, // returns: T=Is a plus
BOOL* apbIsMinus, // returns: T=Is a minus
BOOL* apbIsLastLeaf)// returns: T=Is Last Leaf
// returns: T=cell has a plus or minus; F=not
{
ASSERT( m_pGrid != NULL);
ASSERT( aiRow >= m_iFixedRowCount
&& aiRow < m_iRowCount);
ASSERT( m_iColumnWithTree >= 0);
ASSERT( apbIsPlus != NULL);
ASSERT( apbIsMinus != NULL);
ASSERT( apbIsLastLeaf != NULL);
*apbIsPlus = FALSE;
*apbIsMinus = FALSE;
*apbIsLastLeaf = FALSE;
int iStartPt = aiRow + 1;
int i1;
// get current level
CGridTreeCell* pGridTreeCell = (CGridTreeCell*)m_pGrid->GetCell( aiRow, m_iColumnWithTree);
if( pGridTreeCell == NULL)
return FALSE;
unsigned char ucLevelCurrent = pGridTreeCell->GetLevel();
if( ucLevelCurrent <= 0)
return FALSE; // no tree
BOOL bIsNextShowing = FALSE;
unsigned char ucLevelNext = 0;
for( i1=iStartPt; i1 < m_iRowCount; i1++)
{
pGridTreeCell = (CGridTreeCell*)m_pGrid->GetCell( i1, m_iColumnWithTree);
if( pGridTreeCell == NULL)
return FALSE;
bIsNextShowing = pGridTreeCell->IsViewable();
ucLevelNext = pGridTreeCell->GetLevel();
if( ucLevelCurrent >= ucLevelNext )
{
break;
}
if( !bIsNextShowing
&& ucLevelNext == ucLevelCurrent + 1)
{
*apbIsPlus = TRUE;
}
}
// final attribute setting now that enough data has been examined
if( i1 > iStartPt
&& !*apbIsPlus)
{
*apbIsMinus = TRUE;
}
if( !bIsNextShowing
|| ucLevelCurrent > ucLevelNext
|| i1 >= m_iRowCount ) // hit last element
*apbIsLastLeaf = TRUE;
return *apbIsMinus || *apbIsPlus;
}
BOOL CTreeColumn::GetTreeUsesNbrImages() const
{
return CGridTreeCellBase::TREE_IMAGE_FENCE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -