BOOL COXSplitterWnd::SwapPanes(CWnd* pFirstWnd, CWnd* pSecondWnd)
{
	ASSERT(pFirstWnd && pSecondWnd);
	
	int nCol1, nCol2, nRow1, nRow2;

	if (!IsChildPane(pFirstWnd, &nRow1, &nCol1) || 
		!IsChildPane(pSecondWnd, &nRow2, &nCol2))
	{
		return FALSE;
	}

	int nID1=IdFromRowCol(nRow1,nCol1);
	int nID2=IdFromRowCol(nRow2,nCol2);
	pSecondWnd->SetDlgCtrlID(nID1);
	pFirstWnd->SetDlgCtrlID(nID2);

	//exchange by row info
	CSplitterWnd::CRowColInfo info;
	CSplitterWnd::CRowColInfo* pInfo1=m_pRowInfo;
	CSplitterWnd::CRowColInfo* pInfo2=m_pRowInfo;
	pInfo1+=nID1 - (AFX_IDW_PANE_FIRST + nRow1 * 16 + nCol1);
	pInfo2+=nID2 - (AFX_IDW_PANE_FIRST + nRow2 * 16 + nCol2);
	memcpy(&info, pInfo1, sizeof(CSplitterWnd::CRowColInfo));
	memcpy(pInfo1, pInfo2, sizeof(CSplitterWnd::CRowColInfo));
	memcpy(pInfo2, &info, sizeof(CSplitterWnd::CRowColInfo));

	RecalcLayout();
	RedrawWindow();
	return TRUE;
}
BOOL COXSplitterWnd::RemoveRow(int nDelRow)
{
	ASSERT(GetRowCount()>1);
	if(GetRowCount()<=1)
	{
		return FALSE;
	}
	ASSERT(nDelRow>=0 && nDelRow<GetRowCount());
	ASSERT(::IsWindow(GetSafeHwnd()));

	// delete all views in specified row
	for(int nCol=0; nCol<m_nMaxCols; nCol++)
	{
		CWnd* pView=GetDlgItem(IdFromRowCol(nDelRow,nCol));
		if(pView!=NULL)
		{
			DeleteView(nDelRow,nCol);
		}
	}

	// create new array of row info
	CRowColInfo* pRowInfo=new CRowColInfo[m_nMaxRows-1];
	int nRow=0;
	for(nRow=0; nRow<m_nMaxRows-1; nRow++)
	{
		int nExistingRow=(nRow<nDelRow ? nRow : nRow+1);
		if(nExistingRow!=nDelRow)
		{
			// copy existing row data
			pRowInfo[nRow].nMinSize=m_pRowInfo[nExistingRow].nMinSize;
			pRowInfo[nRow].nIdealSize=m_pRowInfo[nExistingRow].nIdealSize;
			pRowInfo[nRow].nCurSize=m_pRowInfo[nExistingRow].nCurSize;
		}
	}
	// delete old array
	delete[] m_pRowInfo;
	// save new one
	m_pRowInfo=pRowInfo;

	// reset pane IDs (in forward direction)
	for(nRow=nDelRow+1; nRow<m_nMaxRows; nRow++)
	{
		for(int nCol=0; nCol<m_nMaxCols; nCol++)
		{
			CWnd* pView=GetDlgItem(IdFromRowCol(nRow,nCol));
			ASSERT(pView!=NULL);
			pView->SetDlgCtrlID(IdFromRowCol(nRow-1,nCol));
		}
	}

	// set new number of rows
	m_nMaxRows--;
	m_nRows=m_nMaxRows;

	return TRUE;
}
BOOL COXSplitterWnd::RemoveColumn(int nDelCol)
{
	ASSERT(GetColumnCount()>1);
	if(GetColumnCount()<=1)
	{
		return FALSE;
	}
	ASSERT(nDelCol>=0 && nDelCol<GetColumnCount());
	ASSERT(::IsWindow(GetSafeHwnd()));

	// delete all views in specified column
	for(int nRow=0; nRow<m_nMaxRows; nRow++)
	{
		CWnd* pView=GetDlgItem(IdFromRowCol(nRow,nDelCol));
		if(pView!=NULL)
		{
			DeleteView(nRow,nDelCol);
		}
	}

	// create new array of column info
	CRowColInfo* pColInfo=new CRowColInfo[m_nMaxCols-1];
	int nCol=0;
	for(nCol=0; nCol<m_nMaxCols-1; nCol++)
	{
		int nExistingCol=(nCol<nDelCol ? nCol : nCol+1);
		if(nExistingCol!=nDelCol)
		{
			// copy existing column data
			pColInfo[nCol].nMinSize=m_pColInfo[nExistingCol].nMinSize;
			pColInfo[nCol].nIdealSize=m_pColInfo[nExistingCol].nIdealSize;
			pColInfo[nCol].nCurSize=m_pColInfo[nExistingCol].nCurSize;
		}
	}
	// delete old array
	delete[] m_pColInfo;
	// save new one
	m_pColInfo=pColInfo;

	// reset pane IDs (in forward direction)
	for(nCol=nDelCol+1; nCol<m_nMaxCols; nCol++)
	{
		for(int nRow=0; nRow<m_nMaxRows; nRow++)
		{
			CWnd* pView=GetDlgItem(IdFromRowCol(nRow,nCol));
			ASSERT(pView!=NULL);
			pView->SetDlgCtrlID(IdFromRowCol(nRow,nCol-1));
		}
	}

	// set new number of columns
	m_nMaxCols--;
	m_nCols=m_nMaxCols;

	return TRUE;
}
BOOL COXSplitterWnd::InsertColumn(int nInsertBefore, int nWidth)
{
	ASSERT(nInsertBefore>=0 && nInsertBefore<=GetColumnCount());
	ASSERT(::IsWindow(GetSafeHwnd()));

	// create new array of column info
	CRowColInfo* pColInfo=new CRowColInfo[m_nMaxCols+1];
	int nCol=0;
	for(nCol=0; nCol<m_nMaxCols+1; nCol++)
	{
		int nExistingCol=(nCol<nInsertBefore ? nCol : nCol-1);
		if(nCol==nInsertBefore)
		{
			// set data for inserted column
			pColInfo[nCol].nMinSize=0;
			pColInfo[nCol].nIdealSize=nWidth;
			pColInfo[nCol].nCurSize=-1;
		}
		else
		{
			// copy existing column data
			pColInfo[nCol].nMinSize=m_pColInfo[nExistingCol].nMinSize;
			pColInfo[nCol].nIdealSize=m_pColInfo[nExistingCol].nIdealSize;
			pColInfo[nCol].nCurSize=m_pColInfo[nExistingCol].nCurSize;
		}
	}
	// delete old array
	delete[] m_pColInfo;
	// save new one
	m_pColInfo=pColInfo;

	// set new number of columns
	m_nMaxCols++;
	m_nCols=m_nMaxCols;

	// reset pane IDs (do that in backward direction)
	for(nCol=m_nMaxCols-2; nCol>=nInsertBefore; nCol--)
	{
		for(int nRow=m_nMaxRows-1; nRow>=0; nRow--)
		{
			CWnd* pView=GetDlgItem(IdFromRowCol(nRow,nCol));
			ASSERT(pView!=NULL);
			pView->SetDlgCtrlID(IdFromRowCol(nRow,nCol+1));
		}
	}

	return TRUE;
}
BOOL COXSplitterWnd::InsertRow(int nInsertBefore, int nHeight)
{
	ASSERT(nInsertBefore>=0 && nInsertBefore<=GetRowCount());
	ASSERT(::IsWindow(GetSafeHwnd()));

	// create new array of row info
	CRowColInfo* pRowInfo=new CRowColInfo[m_nMaxRows+1];
	int nRow=0;
	for(nRow=0; nRow<m_nMaxRows+1; nRow++)
	{
		int nExistingRow=(nRow<nInsertBefore ? nRow : nRow-1);
		if(nRow==nInsertBefore)
		{
			// set data for inserted row
			pRowInfo[nRow].nMinSize=0;
			pRowInfo[nRow].nIdealSize=nHeight;
			pRowInfo[nRow].nCurSize=-1;
		}
		else
		{
			// copy existing row data
			pRowInfo[nRow].nMinSize=m_pRowInfo[nExistingRow].nMinSize;
			pRowInfo[nRow].nIdealSize=m_pRowInfo[nExistingRow].nIdealSize;
			pRowInfo[nRow].nCurSize=m_pRowInfo[nExistingRow].nCurSize;
		}
	}
	// delete old array
	delete[] m_pRowInfo;
	// save new one
	m_pRowInfo=pRowInfo;

	// set new number of rows
	m_nMaxRows++;
	m_nRows=m_nMaxRows;

	// reset pane IDs (do that in backward direction)
	for(nRow=m_nMaxRows-2; nRow>=nInsertBefore; nRow--)
	{
		for(int nCol=m_nMaxCols-1; nCol>=0; nCol--)
		{
			CWnd* pView=GetDlgItem(IdFromRowCol(nRow,nCol));
			ASSERT(pView!=NULL);
			pView->SetDlgCtrlID(IdFromRowCol(nRow+1,nCol));
		}
	}

	return TRUE;
}
void CCustInfoSplitterWnd ::ShowColumn()
{
    ASSERT_VALID( this );
    ASSERT( m_nCols < m_nMaxCols );
    ASSERT( m_nHiddenCol != -1 );

    int nShowCol = m_nHiddenCol;
    m_nHiddenCol = -1;

    int cxNew = m_pColInfo[m_nCols].nCurSize;
    m_nCols++;  // add a column
    
    ASSERT( m_nCols == m_nMaxCols );
    
    int nCol;

    // Show the hidden column
    for( int nRow = 0; nRow < m_nRows; ++nRow )
    {
        CWnd* pPaneShow = GetDlgItem( AFX_IDW_PANE_FIRST+nRow +16*m_nCols );
        ASSERT( pPaneShow != NULL );
        pPaneShow->ShowWindow( SW_SHOWNA );

        for( nCol = m_nCols - 2; nCol >= nShowCol; --nCol )
        {
            CWnd* pPane = GetPane( nRow, nCol );
            ASSERT( pPane != NULL );
            pPane->SetDlgCtrlID( IdFromRowCol( nRow, nCol + 1 ));
        }

        pPaneShow->SetDlgCtrlID( IdFromRowCol( nRow, nShowCol ));
    }

    // new panes have been created -- recalculate layout
    for( nCol = nShowCol+1; nCol < m_nCols; nCol++ )
        m_pColInfo[nCol].nIdealSize = m_pColInfo[nCol - 1].nCurSize;

   /*  m_pColInfo[nShowCol].nIdealSize = cxNew;*/
    RecalcLayout();
}
void AW_CMultiViewSplitter::SetCurrentView(int nRow, int nCol, int nViewID)
{
	long paneID = MAKELONG(nRow,nCol);

	map<long, int>::iterator itCur;
	itCur = m_mapCurrentViews.find(paneID);
	if (itCur != m_mapCurrentViews.end())
		(*itCur).second = nViewID;
	else
		m_mapCurrentViews.insert(map<long,int>::value_type(paneID,nViewID));

	CWnd * pView = GetView(nViewID);
	pView->SetDlgCtrlID(IdFromRowCol(nRow, nCol));
	pView->ShowWindow(SW_SHOW);
}
HBRUSH CMySplitterWnd::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
   HBRUSH hbr = CSplitterWnd::OnCtlColor(pDC, pWnd, nCtlColor);
   
   if(nCtlColor == CTLCOLOR_LISTBOX && 
      pWnd->GetDlgCtrlID() == IdFromRowCol(1,0))
   {
      // Pane 1,0 is a list box. Set the color of the text to be blue.
      pDC->SetBkColor(m_BkColor);
      pDC->SetTextColor(RGB(0,0,255));
      return (HBRUSH)m_hbrListBoxBkgnd.GetSafeHandle();
   }
   // TODO: Return a different brush if the default is not desired
   return hbr;
}
void CBCGPSplitterWnd::RecalcLayout()
{
	for (int col = 0; col < m_nCols; col++)
	{
		for (int row = 0; row < m_nRows; row++)
		{
			if (GetDlgItem(IdFromRowCol(row, col)) == NULL)
			{
				// Not created yet, do nothing
				return;
			}
		}
	}

	CSplitterWnd::RecalcLayout();
}
Beispiel #10
0
void CCustInfoSplitterWnd ::HideColumn(int nColHide)
{
    ASSERT_VALID( this );
    ASSERT( m_nCols > 1 );
    ASSERT( nColHide < m_nCols );
    ASSERT( m_nHiddenCol == -1 );
    m_nHiddenCol = nColHide;
    
    // if the column has an active window -- change it
    int nActiveRow, nActiveCol;
    if( GetActivePane( &nActiveRow, &nActiveCol ) != NULL )
    {
        if( nActiveCol == nColHide )
        {
            if( ++nActiveCol >= m_nCols )
                nActiveCol = 0;
            SetActivePane( nActiveRow, nActiveCol );
        }
    }

    // hide all column panes
    for( int nRow = 0; nRow < m_nRows; nRow++)
    {
        CWnd* pPaneHide = GetPane(nRow, nColHide);
        ASSERT( pPaneHide != NULL );

        pPaneHide->ShowWindow(SW_HIDE);
        pPaneHide->SetDlgCtrlID( AFX_IDW_PANE_FIRST+nRow +16*m_nCols );
        
        for( int nCol = nColHide + 1; nCol < m_nCols; nCol++ )
        {
            CWnd* pPane = GetPane( nRow, nCol );
            ASSERT( pPane != NULL );

            pPane->SetDlgCtrlID( IdFromRowCol( nRow, nCol - 1 ));
        }
    }

    m_nCols--;
    m_pColInfo[m_nCols].nCurSize = m_pColInfo[nColHide].nCurSize;
	RecalcLayout();
}