Mercurial > ecos
diff host/tools/configtool/common/win32/SplitterWndEx.cpp @ 76:435cced73e2f ecos-v1_3_1-release
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
| author | jlarmour |
|---|---|
| date | Tue, 28 Mar 2000 14:10:45 +0000 |
| parents | |
| children | 74dbf4c3f2e1 |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/host/tools/configtool/common/win32/SplitterWndEx.cpp @@ -0,0 +1,187 @@ +//####COPYRIGHTBEGIN#### +// +// ---------------------------------------------------------------------------- +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// +// This program is part of the eCos host tools. +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 of the License, or (at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +// more details. +// +// You should have received a copy of the GNU General Public License along with +// this program; if not, write to the Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// +// ---------------------------------------------------------------------------- +// +//####COPYRIGHTEND#### +// +//=========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): sdf +// Contact(s): sdf +// Date: 1998/08/11 +// Version: 0.01 +// Purpose: +// Description: This is the implementation of the extended splitter window class. +// Requires: +// Provides: +// See also: +// Known bugs: +// Usage: +// +//####DESCRIPTIONEND#### +// +//=========================================================================== +#include "stdafx.h" +#include "SplitterWndEx.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +//////////////////////////////////////////////////////////////////////////// +// +// CSplitterWndEx + +CSplitterWndEx::CSplitterWndEx(): + m_fRowColumnRatio(0.0) +{ + m_bParentHide=FALSE; + m_pwnd1=m_pwnd2=NULL; +} + +BEGIN_MESSAGE_MAP(CSplitterWndEx, CSplitterWnd) +//{{AFX_MSG_MAP(CSplitterWndEx) + ON_WM_MOUSEWHEEL() + ON_WM_SIZE() + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + +void CSplitterWndEx::ShowPane(CWnd * pWnd,BOOL bShow) +{ + if(m_pwnd1==NULL){ + m_pwnd1=GetPane(0,0); + m_pwnd2=GetPane(!IsHorizontal(),IsHorizontal()); + } + + ASSERT(pWnd==m_pwnd1 || pWnd==m_pwnd2); + + int &nRowCols=IsHorizontal()?m_nCols:m_nRows; + + if(bShow){ + if(!pWnd->IsWindowVisible()){ + if(m_bParentHide){ + ((CSplitterWndEx *)GetParent())->ShowPane(this,TRUE); + // Ensure the correct pane reappears + if(GetPane(0,0)!=pWnd){ + // Need to swap the entries + SwapRowColInfo(); + } + m_bParentHide=FALSE; + } else { // maybe nothing to do + nRowCols++; + if(pWnd==m_pwnd1){ + // Need to swap the entries + SwapRowColInfo(); + } + } + + pWnd->ShowWindow(SW_SHOW); + } + if(pWnd==m_pwnd1){ + m_pwnd1->SetDlgCtrlID(AFX_IDW_PANE_FIRST); + m_pwnd2->SetDlgCtrlID(AFX_IDW_PANE_FIRST+(IsHorizontal()?1:16)); + } + } else { + if(pWnd->IsWindowVisible()){ + + pWnd->ShowWindow(SW_HIDE); + if(nRowCols == 1) { + m_bParentHide=TRUE; + ((CSplitterWndEx *)GetParent())->ShowPane(this,FALSE); + } else { + // Both panes currently active + int rowActive, colActive; + if (GetActivePane(&rowActive, &colActive) != NULL && pWnd==GetPane(rowActive, colActive)){ + int bHorz=IsHorizontal(); + SetActivePane((!bHorz)&(rowActive^1), (bHorz)&(colActive^1)); + } + if(pWnd==m_pwnd1){ + SwapRowColInfo(); + m_pwnd2->SetDlgCtrlID(AFX_IDW_PANE_FIRST); + m_pwnd1->SetDlgCtrlID(AFX_IDW_PANE_FIRST+1); + } + nRowCols--; + } + } + } + RecalcLayout(); +} + +void CSplitterWndEx::SwapRowColInfo() +{ + CRowColInfo*& pRowColInfo=IsHorizontal()?m_pColInfo:m_pRowInfo; + + // Need to swap the entries + CRowColInfo save; + memcpy(&save,&pRowColInfo[0],sizeof CRowColInfo); + memcpy(&pRowColInfo[0],&pRowColInfo[1],sizeof CRowColInfo); + memcpy(&pRowColInfo[1],&save,sizeof CRowColInfo); +} + + +// We do this because the CSplitterWnd implementation assumes both children are derived +// from CScrollView - so here we just let the children handle the message themselves. +BOOL CSplitterWndEx::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) +{ + return TRUE; + UNUSED_ALWAYS(nFlags); + UNUSED_ALWAYS(zDelta); + UNUSED_ALWAYS(pt); +} + +void CSplitterWndEx::OnSize(UINT nType, int cx, int cy) +{ + int &nRowCols=IsHorizontal()?m_nCols:m_nRows; + CRowColInfo *&RowColInfo=IsHorizontal()?m_pColInfo:m_pRowInfo; + if(nRowCols>1 && (cx|cy) && m_fRowColumnRatio!=0.0){ + RowColInfo[0].nIdealSize=int(0.5 + m_fRowColumnRatio * double(IsHorizontal()?cx:cy)); + } + CSplitterWnd::OnSize( nType, cx, cy ); +} + +void CSplitterWndEx::RecalcLayout() +{ + CSplitterWnd::RecalcLayout(); + CRowColInfo *&RowColInfo=IsHorizontal()?m_pColInfo:m_pRowInfo; + int &nRowCols=IsHorizontal()?m_nCols:m_nRows; + if (nRowCols==2 && RowColInfo[0].nCurSize && RowColInfo[1].nCurSize){ + CRect rect; + GetClientRect(rect); + m_fRowColumnRatio=double(RowColInfo[0].nCurSize)/double(IsHorizontal()?rect.Width():rect.Height()); + } +} + +double CSplitterWndEx::GetSplitPoint() +{ + return m_fRowColumnRatio; +} + +void CSplitterWndEx::SetSplitPoint(double fSplit) +{ + m_fRowColumnRatio=fSplit; + CRect rc; + GetClientRect(rc); + OnSize(SIZE_RESTORED,rc.Width(),rc.Height()); +}
