void CVariablesGrid::SaveExpandInfo(bool extraRow) { m_expandInfo.RemoveAll(); // Get the full name. CString fullName; int numRows = GetRowCount(); if (extraRow) numRows--; for (int i = 1; i < numRows; ++i) { CGridTreeCell* treeCell = (CGridTreeCell*)GetCell(i, 0); int level = treeCell->GetLevel(); if (level == 1) { fullName = GetItemText(i, 0); } else { fullName += "." + GetItemText(i, 0); } if (treeCell->IsViewable()) { ExpandInfo info; info.m_fullName = fullName; m_expandInfo.Add(info); } } }
/***************************************************************************** Examines saved array show / hide bit to determine if a row should display. There is a one-for-one mapping of these bits to total rows *****************************************************************************/ void CTreeColumn::TreeRefreshRows() { ASSERT( m_pGrid != NULL); ASSERT( m_iColumnWithTree >= 0); // hide / show each row for( int i1=m_iFixedRowCount; i1 < m_iRowCount; i1++) { CGridTreeCell* pGridTreeCell = (CGridTreeCell*)m_pGrid->GetCell( i1, m_iColumnWithTree); if( pGridTreeCell == NULL) return; if( pGridTreeCell->IsViewable() ) { if( m_pGrid->GetRowHeight( i1) < m_pGrid->GetDefCellHeight() ) m_pGrid->SetRowHeight( i1, m_pGrid->GetDefCellHeight() ); } else { if( m_pGrid->GetRowHeight( i1) > 0 ) m_pGrid->SetRowHeight( i1, 0); } } if (::IsWindow( m_pGrid->m_hWnd) && m_bAllowDraw) { m_pGrid->Invalidate(); } }
BOOL CTreeColumn::IsTreeRowDisplayed( int aiRow) // row // returns: T=tree row is displayed { ASSERT( m_pGrid != NULL); ASSERT( aiRow >= 0 && aiRow < m_iRowCount ); ASSERT( m_iColumnWithTree >= 0); CGridTreeCell* pGridTreeCell = (CGridTreeCell*)m_pGrid->GetCell( aiRow, m_iColumnWithTree); if( pGridTreeCell != NULL) return pGridTreeCell->IsViewable(); return 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); m_pGrid->m_bLMouseButtonDown = FALSE; 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); TreeRefreshRows(); } else { TreeDataExpandOneLevel( aiGridRow); TreeRefreshRows(); // Make sure bottom expanded row is visible (or as many of the expanded rows as possible) CGridTreeCell* pGridTreeCell = (CGridTreeCell*)m_pGrid->GetCell(aiGridRow, m_iColumnWithTree); if( pGridTreeCell == NULL) return; UCHAR lev = pGridTreeCell->GetLevel(); int ii; for (ii = aiGridRow + 1; ii < m_iRowCount; ii++) { pGridTreeCell = (CGridTreeCell*)m_pGrid->GetCell(ii, m_iColumnWithTree); if (pGridTreeCell == NULL || pGridTreeCell->GetLevel() <= lev) break; } m_pGrid->EnsureVisible(ii-1, m_iColumnWithTree); m_pGrid->EnsureVisible(aiGridRow, m_iColumnWithTree); } }
/***************************************************************************** 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; }