www.pudn.com > ÍøÂç¶Ë¿Ú¼àÊÓ.rar > BCGPBaseTabbedBar.cpp


// BCGPBaseTabbedBar.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "bcgcbpro.h" 
#include "BCGPBaseTabWnd.h" 
#include "BCGPBaseTabbedBar.h" 
#include "BCGPMiniFrameWnd.h" 
#include "BCGPMultiMiniFrameWnd.h" 
#include "BCGPDockingCBWrapper.h" 
#include "BCGPAutoHideToolBar.h" 
#include "BCGPDockBar.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
IMPLEMENT_DYNAMIC(CBCGPBaseTabbedBar, CBCGPDockingControlBar) 
 
///////////////////////////////////////////////////////////////////////////// 
// CBCGPBaseTabbedBar 
 
CBCGPBaseTabbedBar::CBCGPBaseTabbedBar (BOOL bAutoDestroy) 
{ 
	m_bAutoDestroy = bAutoDestroy; 
	m_pTabWnd = NULL; 
	m_bEnableIDChecking = FALSE; 
	m_bSetCaptionTextToTabName = TRUE; 
 
	EnableDocking (CBRS_ALIGN_ANY); 
} 
//*********************************************************************************** 
CBCGPBaseTabbedBar::~CBCGPBaseTabbedBar() 
{ 
} 
 
BEGIN_MESSAGE_MAP(CBCGPBaseTabbedBar, CBCGPDockingControlBar) 
	//{{AFX_MSG_MAP(CBCGPBaseTabbedBar) 
	ON_WM_SIZE() 
	ON_WM_NCDESTROY() 
	ON_WM_ERASEBKGND() 
	ON_WM_SETFOCUS() 
	//}}AFX_MSG_MAP 
	ON_REGISTERED_MESSAGE(BCGM_CHANGE_ACTIVE_TAB, OnChangeActiveTab) 
END_MESSAGE_MAP() 
 
 
///////////////////////////////////////////////////////////////////////////// 
// CBCGPBaseTabbedBar message handlers 
 
void CBCGPBaseTabbedBar::OnSize(UINT nType, int cx, int cy)  
{ 
	CBCGPDockingControlBar::OnSize(nType, cx, cy); 
	 
	CWnd* pUnderlinedWnd = GetUnderlinedWindow (); 
 
	if (pUnderlinedWnd != NULL && IsWindow (pUnderlinedWnd->GetSafeHwnd ())) 
	{ 
		CRect rectClient; 
		GetClientRect (rectClient); 
		 
		pUnderlinedWnd->SetWindowPos (NULL, 0, 0, rectClient.Width (), rectClient.Height (),  
								SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOREDRAW); 
	} 
} 
//*********************************************************************************** 
void CBCGPBaseTabbedBar::OnNcDestroy()  
{ 
	if (m_pTabWnd != NULL) 
	{ 
		delete m_pTabWnd; 
		m_pTabWnd = NULL; 
	} 
 
	CBCGPDockingControlBar::OnNcDestroy(); 
	 
	if (m_bAutoDestroy) 
	{ 
		delete this; 
	} 
} 
//*********************************************************************************** 
BOOL CBCGPBaseTabbedBar::OnEraseBkgnd(CDC* pDC)  
{ 
	return TRUE;  
} 
//*********************************************************************************** 
BOOL CBCGPBaseTabbedBar::AddTab (CWnd* pNewBar, BOOL bVisible, BOOL bSetActive,  
								 BOOL bDetachable) 
{ 
	ASSERT_VALID (this); 
	ASSERT_VALID (m_pTabWnd); 
	ASSERT_VALID (pNewBar); 
 
	if (pNewBar->IsKindOf (RUNTIME_CLASS (CBCGPBaseTabbedBar))) 
	{ 
		CBCGPBaseTabbedBar* pTabbedControlBar =  
			DYNAMIC_DOWNCAST (CBCGPBaseTabbedBar, pNewBar); 
 
		// it's false when the tabbed bar is added from miniframe to docksite 
		BOOL bSetInfoForSlider = (GetParentMiniFrame () != NULL); 
 
		ASSERT_VALID (pTabbedControlBar); 
 
		CBCGPBaseTabWnd* pWndTab = pTabbedControlBar->GetUnderlinedWindow (); 
		 
		ASSERT_VALID (pWndTab); 
 
		int nTabsNum = pWndTab->GetTabsNum (); 
		ASSERT (nTabsNum > 0); 
 
		for (int i = 0; i < nTabsNum; i++) 
		{ 
			CBCGPBaseControlBar* pWnd =  
				DYNAMIC_DOWNCAST (CBCGPBaseControlBar, pWndTab->GetTabWnd (i)); 
			ASSERT_VALID (pWnd); 
 
			BOOL bVisible = pWndTab->IsTabVisible (i); 
			BOOL bDetachable = pWndTab->IsTabDetachable (i); 
 
			pWnd->EnableGripper (FALSE); 
 
			if (!AddTab (pWnd, bVisible, bVisible, bDetachable)) 
			{ 
				ASSERT (FALSE); 
			} 
 
			CBCGPDockingControlBar* pDockingBar =  
				DYNAMIC_DOWNCAST (CBCGPDockingControlBar, pWnd); 
			if (pWnd != NULL) 
			{ 
				pDockingBar->m_recentDockInfo.SetInfo (bSetInfoForSlider,  
														pTabbedControlBar->m_recentDockInfo); 
			} 
		} 
 
		pWndTab->RemoveAllTabs (); 
		pNewBar->DestroyWindow (); 
 
		// stop processing - this function will be called  
		// from AttachToTabWnd 
 
		return FALSE; 
	} 
	else 
	{ 
		if (pNewBar->IsKindOf (RUNTIME_CLASS (CBCGPControlBar))) 
		{ 
			CBCGPControlBar* pNewControlBar =  
				DYNAMIC_DOWNCAST (CBCGPControlBar, pNewBar); 
			ASSERT_VALID (pNewControlBar); 
 
			CWnd* pOldParent = pNewControlBar->GetParent (); 
			pNewControlBar->OnBeforeChangeParent (m_pTabWnd, TRUE); 
			pNewControlBar->SetParent (m_pTabWnd); 
			pNewControlBar->OnAfterChangeParent (pOldParent); 
 
			if (pNewControlBar->IsKindOf (RUNTIME_CLASS (CBCGPDockingControlBar))) 
			{ 
				((CBCGPDockingControlBar*) pNewControlBar)->EnableGripper (FALSE); 
			} 
		} 
 
		CString strText;  
		pNewBar->GetWindowText (strText); 
 
		m_pTabWnd->AddTab (pNewBar, strText, bSetActive, bDetachable); 
 
		int iTab = m_pTabWnd->GetTabsNum () - 1; 
		m_pTabWnd->SetTabHicon (iTab, pNewBar->GetIcon (FALSE)); 
		m_pTabWnd->EnableTabDetach (iTab, bDetachable); 
 
		if (bVisible) 
		{ 
			if (bSetActive) 
			{ 
				m_pTabWnd->SetActiveTab (iTab); 
			} 
		} 
		else 
		{ 
			ASSERT (!bSetActive); 
			m_pTabWnd->ShowTab (iTab, FALSE); 
		} 
	} 
	return TRUE; 
} 
 
//************************************************************************************** 
CWnd* CBCGPBaseTabbedBar::FindBarByID (UINT uBarID) 
{ 
	ASSERT_VALID (this); 
	ASSERT_VALID (m_pTabWnd); 
 
	for (int i = 0; i < m_pTabWnd->GetTabsNum (); i++) 
	{ 
		CWnd* pBar = m_pTabWnd->GetTabWnd (i); 
		ASSERT_VALID (pBar); 
 
		if ((UINT) pBar->GetDlgCtrlID () == uBarID) 
		{ 
			return pBar; 
		} 
	} 
 
	return NULL; 
} 
//************************************************************************************** 
CWnd* CBCGPBaseTabbedBar::FindBarByTabNumber (int nTabNum, BOOL bGetWrappedBar) 
{ 
	ASSERT_VALID (this); 
	ASSERT_VALID (m_pTabWnd); 
 
	if (nTabNum < 0 || nTabNum >= m_pTabWnd->GetTabsNum ()) 
	{ 
		return NULL; 
	} 
 
	CWnd* pWnd = m_pTabWnd->GetTabWnd (nTabNum); 
	ASSERT_VALID (pWnd); 
 
	if (bGetWrappedBar && pWnd->IsKindOf (RUNTIME_CLASS (CBCGPDockingCBWrapper))) 
	{ 
		CBCGPDockingCBWrapper* pWrapper =  
			DYNAMIC_DOWNCAST (CBCGPDockingCBWrapper, pWnd); 
		pWnd = pWrapper->GetWrappedWnd (); 
		ASSERT_VALID (pWnd); 
	} 
 
	return pWnd; 
} 
//******************************************************************************* 
BOOL CBCGPBaseTabbedBar::DetachControlBar (CWnd* pBar, BOOL bHide) 
{ 
	ASSERT_VALID (this); 
	ASSERT_VALID (pBar); 
	ASSERT_VALID (m_pTabWnd); 
 
	int nTabNumber = m_pTabWnd->GetTabFromHwnd (pBar->GetSafeHwnd ()); 
 
	if (nTabNumber < 0) 
	{ 
		return FALSE; 
	} 
 
	m_pTabWnd->DetachTab (DM_UNKNOWN, nTabNumber, bHide); 
	return TRUE; 
} 
//******************************************************************************* 
BOOL CBCGPBaseTabbedBar::RemoveControlBar (CWnd* pBar) 
{ 
	ASSERT_VALID (this); 
	ASSERT_VALID (pBar); 
	ASSERT_VALID (m_pTabWnd); 
 
	int nTabNumber = m_pTabWnd->GetTabFromHwnd (pBar->GetSafeHwnd ()); 
 
	if (nTabNumber < 0 || nTabNumber >= m_pTabWnd->GetTabsNum ()) 
	{ 
		return FALSE; 
	} 
 
	m_pTabWnd->RemoveTab (nTabNumber); 
 
	if (m_pTabWnd->GetTabsNum () == 0) 
	{ 
		if (AllowDestroyEmptyTabbedBar ()) 
		{ 
			if (IsDocked ()) 
			{ 
				UnDockControlBar (); 
			} 
			else 
			{ 
				CBCGPMiniFrameWnd* pMiniFrame = GetParentMiniFrame (); 
				pMiniFrame->RemoveControlBar (this); 
			} 
 
			DestroyWindow (); 
			return FALSE; 
		} 
		else  
		{ 
			m_pTabWnd->ShowWindow (SW_HIDE); 
		} 
	} 
 
	return TRUE; 
} 
//******************************************************************************* 
BOOL CBCGPBaseTabbedBar::ShowTab (CWnd* pBar, BOOL bShow, BOOL bDelay, BOOL bActivate) 
{ 
	ASSERT_VALID (this); 
	ASSERT_VALID (pBar); 
	ASSERT_VALID (m_pTabWnd); 
	 
	int nTabNum = m_pTabWnd->GetTabFromHwnd (pBar->GetSafeHwnd ()); 
 
	BOOL bResult = m_pTabWnd->ShowTab (nTabNum, bShow, !bDelay, bActivate); 
 
	BOOL bNowVisible = m_pTabWnd->GetVisibleTabsNum () > 0; 
 
	CBCGPDockingControlBar::ShowControlBar (bNowVisible, bDelay, bActivate); 
	return bResult; 
} 
//******************************************************************************* 
BOOL CBCGPBaseTabbedBar::FloatTab (CWnd* pBar, int nTabID,  
									  BCGP_DOCK_METHOD dockMethod,  
									  BOOL bHide) 
{ 
	ASSERT_VALID (this); 
	ASSERT_VALID (pBar); 
	ASSERT_VALID (m_pTabWnd); 
 
	CString strWndText; 
	pBar->GetWindowText (strWndText); 
 
	if (strWndText.IsEmpty ()) 
	{ 
		if (m_pTabWnd->GetTabLabel (nTabID, strWndText)) 
		{ 
			pBar->SetWindowText (strWndText); 
		} 
	} 
 
	m_pTabWnd->RemoveTab (nTabID); 
	 
	if (dockMethod == DM_MOUSE) 
	{ 
		m_pTabWnd->SendMessage (WM_LBUTTONUP, 0, 0); 
	} 
 
	CBCGPDockingControlBar* pDockingBar =  
			DYNAMIC_DOWNCAST (CBCGPDockingControlBar, pBar); 
 
	if (pDockingBar != NULL) 
	{ 
		pDockingBar->StoreRecentTabRelatedInfo (); 
	} 
 
	if (dockMethod == DM_DBL_CLICK && pDockingBar != NULL) 
	{ 
		CBCGPMultiMiniFrameWnd* pParentMiniFrame =  
				DYNAMIC_DOWNCAST (CBCGPMultiMiniFrameWnd, GetParentMiniFrame ()); 
 
		if (pParentMiniFrame != NULL) 
		{ 
			pParentMiniFrame->DockRecentControlBarToMainFrame (pDockingBar); 
			return TRUE; 
		} 
		else if (m_hDefaultSlider != NULL && IsWindow (m_hDefaultSlider)) 
		{ 
			CBCGPMultiMiniFrameWnd* pRecentMiniFrame =  
				DYNAMIC_DOWNCAST (CBCGPMultiMiniFrameWnd, 
					CWnd::FromHandlePermanent (pDockingBar->m_recentDockInfo.m_hRecentMiniFrame)); 
			if (pRecentMiniFrame != NULL &&  
				pRecentMiniFrame->AddRecentControlBar (pDockingBar)) 
			{ 
				return TRUE; 
			} 
		} 
	} 
 
	if (pBar->IsKindOf (RUNTIME_CLASS (CBCGPControlBar))) 
	{ 
		CBCGPControlBar* pControlBar =  
			DYNAMIC_DOWNCAST (CBCGPControlBar, pBar); 
		ASSERT_VALID (pControlBar); 
		pControlBar->FloatControlBar (pControlBar->m_recentDockInfo.m_rectRecentFloatingRect,  
									  dockMethod, !bHide); 
		return TRUE; 
	} 
	return FALSE; 
} 
//************************************************************************************** 
void CBCGPBaseTabbedBar::StoreRecentDockInfo () 
{ 
	int nTabsNum = m_pTabWnd->GetTabsNum (); 
	for (int i = 0; i < nTabsNum; i++) 
	{ 
		CBCGPDockingControlBar* pBar =  
			DYNAMIC_DOWNCAST (CBCGPDockingControlBar, m_pTabWnd->GetTabWnd (i)); 
		if (pBar != NULL) 
		{ 
			pBar->StoreRecentTabRelatedInfo (); 
		} 
	} 
 
	CBCGPDockingControlBar::StoreRecentDockInfo (); 
} 
//************************************************************************************** 
BOOL CBCGPBaseTabbedBar::FloatControlBar (CRect rectFloat,  
											 BCGP_DOCK_METHOD dockMethod, 
											 bool bShow) 
{ 
	ASSERT_VALID (this); 
	ASSERT_VALID (m_pTabWnd); 
 
	if (!CBCGPDockingControlBar::FloatControlBar (rectFloat, dockMethod, bShow)) 
	{ 
		return FALSE; 
	} 
 
	CBCGPMiniFrameWnd* pParentFrame = GetParentMiniFrame (); 
	if (pParentFrame != NULL) 
	{ 
		pParentFrame->SetIcon (m_pTabWnd->GetTabHicon (m_pTabWnd->GetActiveTab ()), FALSE); 
	} 
 
	return TRUE; 
} 
//************************************************************************************** 
void CBCGPBaseTabbedBar::Serialize (CArchive& ar) 
{ 
	CBCGPDockingControlBar::Serialize (ar); 
	if (ar.IsLoading ()) 
	{ 
		ar >> m_bAutoDestroy; 
	} 
	else 
	{ 
		ar << m_bAutoDestroy; 
	} 
} 
//************************************************************************************** 
void CBCGPBaseTabbedBar::SerializeTabWindow (CArchive& ar) 
{ 
	if (m_pTabWnd != NULL) 
	{ 
		m_pTabWnd->Serialize (ar); 
	} 
} 
//************************************************************************************** 
void CBCGPBaseTabbedBar::LoadSiblingBarIDs (CArchive& ar, CList& lstBarIDs) 
{ 
	ASSERT (ar.IsLoading ()); 
	if (ar.IsLoading ()) 
	{ 
		int nTabsNum = 0; 
		ar >> nTabsNum; 
		for (int i = 0; i < nTabsNum; i++) 
		{ 
			int nBarID = -1; 
			ar >> nBarID; 
			ASSERT (nBarID != -1); 
			lstBarIDs.AddTail (nBarID); 
		} 
	} 
} 
//************************************************************************************** 
void CBCGPBaseTabbedBar::SaveSiblingBarIDs (CArchive& ar) 
{ 
	ASSERT_VALID (this); 
	ASSERT (ar.IsStoring ()); 
	ASSERT_VALID (m_pTabWnd); 
 
	if (ar.IsStoring () && m_pTabWnd != NULL) 
	{ 
		int nTabsNum = m_pTabWnd->GetTabsNum (); 
		// DO NOT SAVE empty tabbed bars 
		if (nTabsNum > 0) 
		{ 
			ar << nTabsNum; 
			for (int i = 0; i < nTabsNum; i++) 
			{ 
				CBCGPBaseControlBar* pWnd =  
					DYNAMIC_DOWNCAST (CBCGPBaseControlBar, m_pTabWnd->GetTabWnd (i)); 
				ASSERT_VALID (pWnd); 
 
				ar << pWnd->GetDlgCtrlID (); 
			} 
		} 
	} 
} 
//************************************************************************************** 
BOOL CBCGPBaseTabbedBar::LoadState (LPCTSTR lpszProfileName, int nIndex, UINT uiID) 
{ 
	ASSERT_VALID (this); 
	ASSERT_VALID (m_pTabWnd); 
 
	// if initially tabbed bars were detached by user and exist only as regular 
	// docking control bars we need to give them a chance to load their state  
	// from the registry 
 
	CBCGPDockingControlBar::LoadState (lpszProfileName, nIndex, uiID); 
 
	int nTabsNum = m_pTabWnd->GetTabsNum (); 
	for (int i = 0; i < nTabsNum; i++) 
	{ 
		CBCGPBaseControlBar* pWnd =  
			DYNAMIC_DOWNCAST (CBCGPBaseControlBar, m_pTabWnd->GetTabWnd (i)); 
 
		if (pWnd != NULL) 
		{ 
			ASSERT_VALID (pWnd); 
			pWnd->LoadState (lpszProfileName, nIndex, uiID); 
		} 
	} 
 
	return TRUE; 
} 
 
//************************************************************************************** 
BOOL CBCGPBaseTabbedBar::SaveState (LPCTSTR lpszProfileName, int nIndex, UINT uiID) 
{ 
	ASSERT_VALID (this); 
	ASSERT_VALID (m_pTabWnd); 
 
	CBCGPDockingControlBar::SaveState (lpszProfileName, nIndex, uiID); 
 
	int nTabsNum = m_pTabWnd->GetTabsNum (); 
	for (int i = 0; i < nTabsNum; i++) 
	{ 
		CBCGPBaseControlBar* pWnd =  
			DYNAMIC_DOWNCAST (CBCGPBaseControlBar, m_pTabWnd->GetTabWnd (i)); 
 
		if (pWnd != NULL) 
		{ 
			ASSERT_VALID (pWnd); 
			if (!pWnd->SaveState (lpszProfileName, nIndex, uiID)) 
			{ 
				return FALSE; 
			} 
		} 
	} 
 
	return TRUE; 
} 
 
//************************************************************************************** 
void CBCGPBaseTabbedBar::ApplyRestoredTabInfo () 
{ 
	ASSERT_VALID (this); 
 
	if (m_pTabWnd != NULL) 
	{ 
		m_pTabWnd->ApplyRestoredTabInfo (); 
	} 
} 
//************************************************************************************** 
void CBCGPBaseTabbedBar::RecalcLayout () 
{ 
	ASSERT_VALID (this); 
 
	CBCGPDockingControlBar::RecalcLayout (); 
 
	if (m_pTabWnd != NULL) 
	{ 
		m_pTabWnd->RecalcLayout (); 
	} 
} 
//************************************************************************************** 
BOOL CBCGPBaseTabbedBar::CanFloat () const 
{ 
	ASSERT_VALID (this); 
 
	return CBCGPDockingControlBar::CanFloat (); 
} 
//************************************************************************************** 
void CBCGPBaseTabbedBar::OnSetFocus(CWnd* pOldWnd)  
{ 
	CBCGPDockingControlBar::OnSetFocus(pOldWnd); 
 
	// Pass the focus to the tab window 
	CWnd*	pWndChild	= GetUnderlinedWindow(); 
	if (pWndChild != NULL) 
		pWndChild->SetFocus(); 
} 
//************************************************************************************** 
CBCGPAutoHideToolBar* CBCGPBaseTabbedBar::SetAutoHideMode (BOOL bMode, DWORD dwAlignment,  
												CBCGPAutoHideToolBar* pCurrAutoHideBar,  
												BOOL bUseTimer) 
{ 
	CBCGPAutoHideToolBar* pAutoHideBar = pCurrAutoHideBar; 
	CBCGPDockingControlBar* pActiveBar = NULL; 
 
	int nActiveTab = m_pTabWnd->GetActiveTab (); 
	int nTabsNum = m_pTabWnd->GetTabsNum (); 
	 
	CObList lstTmp; 
 
	ShowControlBar (FALSE, TRUE, FALSE); 
 
	int nNonDetachedCount = 0; 
	for (int nNextTab = nTabsNum - 1; nNextTab >= 0; nNextTab--) 
	{ 
		CBCGPDockingControlBar* pBar = DYNAMIC_DOWNCAST (CBCGPDockingControlBar,  
													m_pTabWnd->GetTabWnd (nNextTab)); 
		ASSERT_VALID (pBar); 
 
		BOOL bIsVisible = m_pTabWnd->IsTabVisible (nNextTab); 
		BOOL bDetachable = m_pTabWnd->IsTabDetachable (nNextTab); 
	 
		if (pBar != NULL && bIsVisible && bDetachable) 
		{ 
			m_pTabWnd->RemoveTab (nNextTab, FALSE); 
			pBar->EnableGripper (TRUE); 
 
			pBar->StoreRecentTabRelatedInfo (); 
 
			CWnd* pOldParent = pBar->GetParent (); 
			pBar->OnBeforeChangeParent (m_pDockSite); 
			pBar->SetParent (m_pDockSite); 
			pBar->SetOwner (m_pDockSite); 
			pBar->OnAfterChangeParent (pOldParent); 
 
			lstTmp.AddHead (pBar); 
			 
			if (nNextTab == nActiveTab) 
			{ 
				pActiveBar = pBar; 
			} 
		} 
		else 
		{ 
			nNonDetachedCount++; 
		} 
	} 
 
	BOOL bActiveSet = FALSE; 
	CBCGPControlBar* pNewAHBar = NULL; 
 
	for (POSITION pos = lstTmp.GetHeadPosition (); pos != NULL;) 
	{ 
		CBCGPDockingControlBar* pBar = DYNAMIC_DOWNCAST (CBCGPDockingControlBar,  
													lstTmp.GetNext (pos)); 
		BOOL bUseTimerForActiveBar = (pBar == pActiveBar) && bUseTimer; 
		pNewAHBar = pBar->SetAutoHideMode (TRUE, dwAlignment, NULL, bUseTimerForActiveBar); 
 
		if (pNewAHBar != NULL) 
		{ 
			pNewAHBar->m_bFirstInGroup = (lstTmp.GetHead () == pBar); 
			pNewAHBar->m_bLastInGroup = (lstTmp.GetTail () == pBar); 
			pNewAHBar->m_bActiveInGroup = (pBar == pActiveBar); 
 
			if (!bActiveSet && pNewAHBar->m_bActiveInGroup) 
			{ 
				bActiveSet = TRUE; 
			} 
		} 
	} 
 
	if (pNewAHBar != NULL) 
	{ 
		if (!bActiveSet) 
		{ 
			pNewAHBar->m_bActiveInGroup = TRUE; 
		} 
		CRect rect (0, 0, 0, 0); 
		pNewAHBar->GetParentDockBar ()->RepositionBars (rect); 
	} 
 
	if (nNonDetachedCount > 0) 
	{ 
		if (m_pTabWnd->GetVisibleTabsNum () == 0) 
		{ 
			ShowControlBar (FALSE, TRUE, FALSE); 
		} 
		else 
		{ 
			if (m_pTabWnd->GetActiveTab () == -1) 
			{	 
				int nVisibleTab = -1; 
				GetFirstVisibleTab (nVisibleTab); 
				m_pTabWnd->SetActiveTab (nVisibleTab); 
			} 
			m_pTabWnd->RecalcLayout (); 
			ShowControlBar (TRUE, TRUE, FALSE); 
			pAutoHideBar = CBCGPDockingControlBar::SetAutoHideMode (bMode, dwAlignment, pCurrAutoHideBar, bUseTimer); 
		} 
	} 
	 
	if (pAutoHideBar != NULL) 
	{ 
		pAutoHideBar->UpdateVisibleState(); 
	} 
 
	return pAutoHideBar; 
} 
//************************************************************************************** 
CWnd* CBCGPBaseTabbedBar::GetFirstVisibleTab (int& iTabNum) 
{ 
	iTabNum = -1; 
	if (m_pTabWnd == NULL) 
	{ 
		return NULL; 
	} 
 
	return m_pTabWnd->GetFirstVisibleTab (iTabNum); 
} 
//************************************************************************************** 
HICON CBCGPBaseTabbedBar::GetBarIcon (BOOL bBigIcon) 
{ 
	HICON hIcon = GetIcon (bBigIcon); 
 
	if (hIcon == NULL && m_pTabWnd != NULL) 
	{ 
		CWnd* pWnd = m_pTabWnd->GetActiveWnd (); 
		if (pWnd != NULL) 
		{ 
			hIcon = pWnd->GetIcon (bBigIcon); 
		} 
	} 
 
	return hIcon; 
} 
//************************************************************************************** 
LRESULT CBCGPBaseTabbedBar::OnChangeActiveTab (WPARAM wp, LPARAM) 
{ 
	int iTabNum = (int) wp; 
 
	CString strLabel; 
	if (m_pTabWnd != NULL && m_pTabWnd->GetTabLabel (iTabNum, strLabel) && 
		m_bSetCaptionTextToTabName) 
	{ 
		SetWindowText (strLabel); 
	} 
 
	OnActivateTab (iTabNum); 
	return 0; 
} 
//************************************************************************************** 
BOOL CBCGPBaseTabbedBar::Dock (CBCGPBaseControlBar* pTargetBar, LPCRECT lpRect,  
							   BCGP_DOCK_METHOD dockMethod) 
{ 
	if (dockMethod != DM_DBL_CLICK) 
	{ 
		return CBCGPDockingControlBar::Dock (pTargetBar, lpRect, dockMethod); 
	} 
	 
	BOOL bFloating = (GetParentMiniFrame () != NULL); 
	if (bFloating && m_recentDockInfo.GetRecentContainer (TRUE) != NULL || 
		!bFloating && m_recentDockInfo.GetRecentContainer (FALSE) != NULL) 
	{ 
		return CBCGPDockingControlBar::Dock (pTargetBar, lpRect, dockMethod); 
	} 
	 
	int nTabsNum = m_pTabWnd->GetTabsNum (); 
 
	ShowControlBar (FALSE, TRUE, FALSE); 
 
	int nNonDetachedCount = 0; 
	for (int nNextTab = nTabsNum - 1; nNextTab >= 0; nNextTab--) 
	{ 
		CBCGPDockingControlBar* pBar = DYNAMIC_DOWNCAST (CBCGPDockingControlBar,  
													m_pTabWnd->GetTabWnd (nNextTab)); 
		ASSERT_VALID (pBar); 
 
		BOOL bIsVisible = m_pTabWnd->IsTabVisible (nNextTab); 
		BOOL bDetachable = m_pTabWnd->IsTabDetachable (nNextTab); 
	 
		if (pBar != NULL && bIsVisible && bDetachable) 
		{ 
			m_pTabWnd->RemoveTab (nNextTab, FALSE); 
			pBar->EnableGripper (TRUE); 
 
			pBar->StoreRecentTabRelatedInfo (); 
 
			pBar->DockControlBar (pBar, lpRect, dockMethod);			 
		} 
		else 
		{ 
			nNonDetachedCount++; 
		} 
	} 
 
	if (nNonDetachedCount > 0) 
	{ 
		if (m_pTabWnd->GetVisibleTabsNum () == 0) 
		{ 
			ShowControlBar (FALSE, TRUE, FALSE); 
		} 
		else 
		{ 
			if (m_pTabWnd->GetActiveTab () == -1) 
			{	 
				int nVisibleTab = -1; 
				GetFirstVisibleTab (nVisibleTab); 
				m_pTabWnd->SetActiveTab (nVisibleTab); 
			} 
			m_pTabWnd->RecalcLayout (); 
			ShowControlBar (TRUE, TRUE, FALSE); 
			return CBCGPDockingControlBar::Dock (pTargetBar, lpRect, dockMethod); 
			 
		} 
	} 
	else 
	{ 
		DestroyWindow (); 
		return FALSE; 
	} 
 
	return TRUE; 
}