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