www.pudn.com > mu_explorer.rar > CJStatusBar.cpp


// CJStatusBar.cpp : implementation file 
// 
// Copyright © 1999 Pierre MELLINAND 
// 
///////////////////////////////////////////////////////////////////////////// 
/**************************************************************************** 
 * 
 * $Date: 10/30/99 1:58p $ 
 * $Revision: 2 $ 
 * $Archive: /CodeJock/CJLibrary/CJStatusBar.cpp $ 
 * 
 * $History: CJStatusBar.cpp $ 
 *  
 * *****************  Version 2  ***************** 
 * User: Kirk Stowell Date: 10/30/99   Time: 1:58p 
 * Updated in $/CodeJock/CJLibrary 
 * Minor fix for UNICODE builds. 
 *  
 * *****************  Version 1  ***************** 
 * User: Kirk Stowell Date: 10/26/99   Time: 11:08p 
 * Created in $/CodeJock/CJLibrary 
 *  
 ***************************************************************************/ 
///////////////////////////////////////////////////////////////////////////// 
 
#include "StdAfx.h" 
#include "CJStatusBar.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CCJStatusBarPaneControlInfo 
 
CCJStatusBarPaneControlInfo::CCJStatusBarPaneControlInfo() 
{ 
	m_pWnd		  = NULL; 
	m_bAutodelete = TRUE; 
	m_nPaneID	  = 0; 
} 
 
CCJStatusBarPaneControlInfo::~CCJStatusBarPaneControlInfo() 
{ 
	// TODO: add destruction code here. 
} 
 
IMPLEMENT_DYNCREATE(CCJStatusBarPaneControlInfo, CObject) 
 
///////////////////////////////////////////////////////////////////////////// 
// CCJStatusBarPane 
 
CCJStatusBarPane::CCJStatusBarPane() 
{ 
	// TODO: add construction code here. 
} 
 
CCJStatusBarPane::CCJStatusBarPane(CCJStatusBarPane& rPane) 
{ 
	m_nID	  = rPane.m_nID; 
	m_cxText  = rPane.m_cxText; 
	m_nStyle  = rPane.m_nStyle; 
	m_nFlags  = rPane.m_nFlags; 
	m_strText = rPane.m_strText; 
} 
 
CCJStatusBarPane::~CCJStatusBarPane() 
{ 
	// TODO: add destruction code here. 
} 
 
CCJStatusBarPane& CCJStatusBarPane::operator=(CCJStatusBarPane& rPane) 
{ 
	m_nID	  = rPane.m_nID; 
	m_cxText  = rPane.m_cxText; 
	m_nStyle  = rPane.m_nStyle; 
	m_nFlags  = rPane.m_nFlags; 
	m_strText = rPane.m_strText; 
	return *this; 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CCJStatusBar 
 
CCJStatusBar::CCJStatusBar() 
{ 
	// TODO: add construction code here. 
} 
 
CCJStatusBar::~CCJStatusBar() 
{ 
	for( int i = 0; i < m_aPans.GetSize(); i++ ) 
	{ 
		if( m_aPans[i]->m_pWnd && ::IsWindow(m_aPans[i]->m_pWnd->m_hWnd) ) 
			m_aPans[i]->m_pWnd->CloseWindow(); 
		if( m_aPans[i]->m_bAutodelete ) 
		{ 
			delete m_aPans[i]->m_pWnd; 
		} 
		delete m_aPans[i]; 
	} 
} 
 
IMPLEMENT_DYNCREATE(CCJStatusBar, CStatusBar) 
 
BEGIN_MESSAGE_MAP(CCJStatusBar, CStatusBar) 
	//{{AFX_MSG_MAP(CCJStatusBar) 
	ON_WM_SIZE() 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CCJStatusBar message handlers 
 
void CCJStatusBar::OnSize(UINT nType, int cx, int cy)  
{ 
	CStatusBar::OnSize(nType, cx, cy); 
	PositionControls(); 
} 
 
void CCJStatusBar::PositionControls() 
{ 
	int h,v,s; 
	GetStatusBarCtrl( ).GetBorders( h, v, s ) ; 
	 
	 
	for(int i = 0; i < m_aPans.GetSize(); i++ ) 
	{ 
		CRect rect; 
		 
		int index = CommandToIndex( m_aPans[i]->m_nPaneID ); 
		GetItemRect(index,rect); 
		if( GetPaneStyle(index) & SBPS_NOBORDERS == SBPS_NOBORDERS) 
			m_aPans[i]->m_pWnd->MoveWindow(rect); 
		else 
		{ 
			rect.top+=v; 
			rect.bottom-=v; 
			rect.left+=h+s; 
			rect.right-=(h+s); 
			m_aPans[i]->m_pWnd->MoveWindow(rect); 
		} 
		 
	} 
} 
 
CCJStatusBarPaneControlInfo * CCJStatusBar::GetPanControl(int nPaneID) 
{ 
	for(int i = 0; i < m_aPans.GetSize(); i++ ) 
	{ 
		if( m_aPans[i]->m_nPaneID == nPaneID ) 
			return m_aPans[i]; 
	} 
	return NULL; 
} 
 
BOOL CCJStatusBar::AddControl(CWnd * pWnd, int paneID, BOOL bAutodeleteControl) 
{ 
	 
	CCJStatusBarPaneControlInfo * pPanInfo = GetPanControl(paneID); 
	if( pPanInfo ) 
		return FALSE; 
	 
	int idx = CommandToIndex( paneID ) ; 
	if( idx == -1 ) 
		return FALSE; 
	 
	CCJStatusBarPaneControlInfo * pPan = new CCJStatusBarPaneControlInfo; 
	pPan->m_nPaneID =  paneID; 
	pPan->m_pWnd    =  pWnd; 
	pPan->m_bAutodelete = bAutodeleteControl; 
	 
	m_aPans.Add(pPan); 
	PositionControls(); 
	Invalidate(TRUE); 
	return TRUE; 
} 
 
void CCJStatusBar::SetPaneWidth(int index, int cxWidth) 
{ 
	UINT nID,nStyle; 
	int width; 
	GetPaneInfo(index,nID,nStyle,width); 
	SetPaneInfo(index,nID,nStyle,cxWidth); 
} 
 
BOOL CCJStatusBar::GetStatusPane(int nIndex, CCJStatusBarPane & rPane) 
{ 
	if( nIndex < m_nCount  && nIndex >= 0 ) 
	{ 
		GetPaneInfo( nIndex,  rPane.m_nID, rPane.m_nStyle, rPane.m_cxText ) ; 
		GetPaneText( nIndex , rPane.m_strText ); 
		return TRUE; 
	} 
	return FALSE; 
} 
 
BOOL CCJStatusBar::AddIndicator( int position, UINT paneID ) 
{ 
	CArray arPanes; 
	 
	CCJStatusBarPane statusPane; 
	int i; 
	 
	i = 0; 
	while( GetStatusPane(i,statusPane) ) 
	{ 
		arPanes.Add( statusPane ); 
		i++; 
	} 
	if( position < 0 ) 
		position = 0; 
	if( position > arPanes.GetSize() ) 
		position = arPanes.GetSize()-1; 
	 
	for(i = 0; i < arPanes.GetSize(); i ++ ) 
	{ 
		if( paneID == arPanes[i].m_nID ) 
		{ 
			TRACE0( "CCJStatusBar::AddIndicator(): Pane ID already exists \n" ); 
			return FALSE; 
		} 
	} 
	 
	CCJStatusBarPane new_statusPane; 
	new_statusPane.m_nID = paneID; 
	if( arPanes.GetSize() ) 
		arPanes.InsertAt(position,new_statusPane); 
	else 
		arPanes.Add(new_statusPane); 
	 
	UINT * pIndicators = new UINT[arPanes.GetSize()]; 
	for(i=0;im_nPaneID == nPaneID ) 
		{ 
			if( m_aPans[i]->m_bAutodelete ) 
				pwnd = m_aPans[i]->m_pWnd; 
			delete m_aPans[i]; 
			m_aPans.RemoveAt(i); 
			break; 
		} 
	} 
	if( pwnd ) 
	{ 
		pwnd->DestroyWindow(); 
		delete pwnd; 
	} 
	 
	CArray arPanes; 
	CCJStatusBarPane statusPane; 
	i = 0; 
	while( GetStatusPane(i,statusPane) ) 
	{ 
		if( statusPane.m_nID != (UINT)nPaneID ) 
			arPanes.Add( statusPane ); 
		i++; 
	} 
	// Now remove the indicator 
	UINT * pIndicators = new UINT[arPanes.GetSize()]; 
	for(i=0;i