//***********************************************************************************
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 (pDockingBar != 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;
}