www.pudn.com > ÍøÂç¶Ë¿Ú¼àÊÓ.rar > BCGPBaseControlBar.cpp
//*******************************************************************************
// COPYRIGHT NOTES
// ---------------
// This is a part of the BCGControlBar Library
// Copyright (C) 1998-2000 BCGSoft Ltd.
// All rights reserved.
//
// This source code can be used, distributed or modified
// only under terms and conditions
// of the accompanying license agreement.
//*******************************************************************************
// BCGPBaseControlBar.cpp : implementation file
//
#include "stdafx.h"
#include "BCGPFrameWnd.h"
#include "BCGPMiniFrameWnd.h"
#include "BCGPMultiMiniFrameWnd.h"
#include "BCGPSlider.h"
#include "BCGPFrameWnd.h"
#include "BCGPMDIFrameWnd.h"
#include "BCGPOleIPFrameWnd.h"
#include "BCGPOleDocIPFrameWnd.h"
#include "BCGPMDIChildWnd.h"
#include "BCGPOleCntrFrameWnd.h"
#include "BCGPDockBar.h"
#include "BCGPDockBarRow.h"
#include "BCGPBaseTabWnd.h"
#include "BCGPBaseControlBar.h"
#include "BCGPBaseTabbedBar.h"
#include "BCGPDockingCBWrapper.h"
#include "RegPath.h"
#include "BCGPRegistry.h"
#include "BCGPGlobalUtils.h"
#include "BCGPDockManager.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
static const CString strBaseControlBarProfile = _T ("BCGPBaseControlBars");
BOOL CBCGPBaseControlBar::m_bSetTooltipTopmost = TRUE;
#define REG_SECTION_FMT _T("%sBCGPBaseControlBar-%d")
#define REG_SECTION_FMT_EX _T("%sBCGPBaseControlBar-%d%x")
BOOL CBCGPBaseControlBar::m_bMultiThreaded = FALSE;
CCriticalSection CBCGPBaseControlBar::g_cs;
IMPLEMENT_DYNAMIC (CBCGPBaseControlBar, CWnd)
/////////////////////////////////////////////////////////////////////////////
// CBCGPBaseControlBar
CBCGPBaseControlBar::CBCGPBaseControlBar()
{
m_dwEnabledAlignment = 0;
m_dwStyle = 0;
m_pParentDockBar = NULL;
m_pDockBarRow = NULL;
m_pDockSite = NULL;
m_bRecentVisibleState = FALSE;
m_bIsRestoredFromRegistry = FALSE;
m_dwBCGStyle = 0;
m_bVisible = FALSE;
m_dockMode = DT_UNDEFINED;
m_bEnableIDChecking = TRUE;
m_lpszBarTemplateName = NULL;
m_sizeDialog = CSize (0, 0);
m_rectBar.SetRectEmpty ();
m_bIsDlgControl = FALSE;
}
CBCGPBaseControlBar::~CBCGPBaseControlBar()
{
}
BEGIN_MESSAGE_MAP(CBCGPBaseControlBar, CWnd)
//{{AFX_MSG_MAP(CBCGPBaseControlBar)
ON_WM_PAINT()
ON_WM_ERASEBKGND()
ON_WM_SIZE()
//}}AFX_MSG_MAP
ON_MESSAGE(WM_IDLEUPDATECMDUI, OnIdleUpdateCmdUI)
ON_MESSAGE(WM_HELPHITTEST, OnHelpHitTest)
ON_MESSAGE(WM_INITDIALOG, HandleInitDialog)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CBCGPBaseControlBar message handlers
//*******************************************************************************
BOOL CBCGPBaseControlBar::CreateEx(DWORD dwStyleEx, LPCTSTR lpszClassName,
LPCTSTR lpszWindowName,
DWORD dwStyle, const RECT& rect,
CWnd* pParentWnd, UINT nID,
DWORD dwBCGStyle,
CCreateContext* pContext)
{
ASSERT_VALID (pParentWnd);
if (m_bEnableIDChecking)
{
CBCGPDockManager* pDockManager = globalUtils.GetDockManager (pParentWnd);
if (pDockManager == NULL)
{
pDockManager = globalUtils.GetDockManager (BCGPGetParentFrame (pParentWnd));
if (pDockManager != NULL)
{
if (pDockManager->FindBarByID (nID, TRUE) != NULL)
{
TRACE0("Control bar must be created with unique ID!\n");
}
}
}
}
m_bVisible = m_bVisible & WS_VISIBLE;
SetBarStyle (dwStyle | GetBarStyle ());
m_dwBCGStyle = dwBCGStyle;
BOOL bResult = FALSE;
if (m_lpszBarTemplateName != NULL)
{
CREATESTRUCT cs;
memset(&cs, 0, sizeof(cs));
cs.lpszClass = lpszClassName;//AFX_WNDCONTROLBAR;
cs.lpszName = lpszWindowName;
cs.style = dwStyle | WS_CHILD;
cs.hMenu = (HMENU)nID;
cs.hInstance = AfxGetInstanceHandle();
cs.hwndParent = pParentWnd->GetSafeHwnd();
if (!PreCreateWindow(cs))
{
return FALSE;
}
//----------------------------
// initialize common controls
//----------------------------
//VERIFY(AfxDeferRegisterClass(AFX_WNDCOMMCTLS_REG));
//AfxDeferRegisterClass(AFX_WNDCOMMCTLSNEW_REG);
//--------------------------
// create a modeless dialog
//--------------------------
if (!CreateDlg (m_lpszBarTemplateName, pParentWnd))
{
TRACE(_T("Can't create dialog: %s\n"), m_lpszBarTemplateName);
return FALSE;
}
SetClassLong(m_hWnd, GCL_HBRBACKGROUND, (LPARAM)::GetSysColorBrush(COLOR_BTNFACE));
SetDlgCtrlID(nID);
CRect rect;
GetWindowRect(&rect);
m_sizeDialog = rect.Size ();
bResult = TRUE;
}
else
{
bResult = CWnd::CreateEx (dwStyleEx, lpszClassName, lpszWindowName,
dwStyle, rect, pParentWnd, nID, pContext);
}
if (bResult)
{
if (pParentWnd->IsKindOf (RUNTIME_CLASS (CFrameWnd)))
{
m_pDockSite = DYNAMIC_DOWNCAST (CFrameWnd, pParentWnd);
}
else
{
// case of miniframe or smth. else
m_pDockSite = DYNAMIC_DOWNCAST (CFrameWnd, BCGPGetParentFrame (pParentWnd));
}
m_bIsDlgControl = pParentWnd->IsKindOf (RUNTIME_CLASS (CDialog));
}
return bResult;
}
//*******************************************************************************
BOOL CBCGPBaseControlBar::OnEraseBkgnd(CDC* /*pDC*/)
{
return TRUE;
}
//*******************************************************************************
void CBCGPBaseControlBar::DoPaint(CDC* pDC)
{
CRect rectClip;
pDC->GetClipBox (rectClip);
CRect rect;
GetClientRect(rect);
CBCGPVisualManager::GetInstance ()->OnFillBarBackground (pDC, this,
rect, rectClip);
}
//*******************************************************************************
BOOL CBCGPBaseControlBar::IsDocked () const
{
// return TRUE if its parent is not miniframe or the bar is floating
// in the miniframe with another control bar
CBCGPMiniFrameWnd* pParentMiniFrame = GetParentMiniFrame ();
if (pParentMiniFrame != NULL)
{
ASSERT_VALID (pParentMiniFrame);
if (pParentMiniFrame->GetControlBarCount () == 1)
{
return FALSE;
}
}
return TRUE;
}
//*******************************************************************************
BOOL CBCGPBaseControlBar::IsTabbed () const
{
ASSERT_VALID (this);
CWnd* pParent = GetParent ();
ASSERT_VALID (pParent);
return pParent->IsKindOf (RUNTIME_CLASS (CBCGPBaseTabWnd));
}
//*******************************************************************************
BOOL CBCGPBaseControlBar::IsVisible () const
{
ASSERT_VALID (this);
if (!IsTabbed ())
{
if (CBCGPDockManager::m_bRestoringDockState)
{
return GetRecentVisibleState ();
}
return ((GetStyle () & WS_VISIBLE) != 0);
}
HWND hWndTab = NULL;
CBCGPBaseTabWnd* pParent = GetParentTabWnd (hWndTab);
ASSERT_VALID (pParent);
if (!pParent->IsWindowVisible ())
{
return FALSE;
}
int iTabNum = pParent->GetTabFromHwnd (hWndTab);
ASSERT (iTabNum >= 0 && iTabNum < pParent->GetTabsNum ());
return pParent->IsTabVisible (iTabNum);
}
//***********************************************************************************//
CBCGPMiniFrameWnd* CBCGPBaseControlBar::GetParentMiniFrame (BOOL bNoAssert) const
{
ASSERT_VALID (this);
CBCGPMiniFrameWnd* pMiniFrame = NULL;
CWnd* pParent = GetParent ();
while (pParent != NULL)
{
if (!bNoAssert)
{
ASSERT_VALID (pParent);
}
if (pParent != NULL && pParent->IsKindOf (RUNTIME_CLASS (CBCGPMiniFrameWnd)))
{
pMiniFrame = DYNAMIC_DOWNCAST (CBCGPMiniFrameWnd, pParent);
break;
}
pParent = pParent->GetParent ();
}
return pMiniFrame;
}
//***********************************************************************************
void CBCGPBaseControlBar::OnPaint()
{
if (m_bMultiThreaded)
{
g_cs.Lock ();
}
CPaintDC dc(this);
// erase background now
if (GetStyle() & WS_VISIBLE)
DoPaint(&dc);
if (m_bMultiThreaded)
{
g_cs.Unlock ();
}
}
//*************************************************************************************
HDWP CBCGPBaseControlBar::MoveWindow (CRect& rect, BOOL bRepaint, HDWP hdwp)
{
CRect rectOld;
GetWindowRect (rectOld);
if (IsFloating ())
{
CBCGPMiniFrameWnd* pMiniFrame = GetParentMiniFrame ();
ASSERT_VALID (pMiniFrame);
pMiniFrame->ScreenToClient (rectOld);
}
else if (m_pDockSite != NULL)
{
m_pDockSite->ScreenToClient (rectOld);
}
if (rectOld == rect)
{
return hdwp;
}
if (hdwp != NULL)
{
UINT uFlags = SWP_NOZORDER | SWP_NOACTIVATE;
return DeferWindowPos (hdwp, GetSafeHwnd (), NULL, rect.left, rect.top, rect.Width (),
rect.Height (), uFlags);
}
CWnd::MoveWindow (&rect, bRepaint);
return NULL;
}
//****************************************************************************************
HDWP CBCGPBaseControlBar::SetWindowPos (const CWnd* pWndInsertAfter, int x, int y,
int cx, int cy, UINT nFlags, HDWP hdwp)
{
if (hdwp == NULL)
{
CWnd::SetWindowPos (pWndInsertAfter, x, y, cx, cy, nFlags);
return NULL;
}
HDWP hdwpNew = DeferWindowPos (hdwp, GetSafeHwnd (), NULL, x, y, cx, cy, nFlags);
if (hdwpNew == NULL)
{
DWORD dwLastError = GetLastError ();
TRACE1 ("DeferWindowPos failded, error code %d\n", dwLastError);
SetWindowPos (NULL, x, y, cx, cy, nFlags);
return hdwp;
}
return hdwpNew;
}
//*******************************************************************************
// frame mapping functions
//*******************************************************************************
void CBCGPBaseControlBar::AddControlBar (CBCGPBaseControlBar* pBar)
{
CWnd* pParentFrame = GetDockSite ();
if (pParentFrame == NULL && globalUtils.m_bDialogApp)
{
return;
}
ASSERT_VALID (pParentFrame);
if (pParentFrame->IsKindOf (RUNTIME_CLASS (CBCGPFrameWnd)))
{
((CBCGPFrameWnd*) pParentFrame)->AddControlBar (pBar);
}
else if (pParentFrame->IsKindOf (RUNTIME_CLASS (CBCGPMDIFrameWnd)))
{
((CBCGPMDIFrameWnd*) pParentFrame)->AddControlBar (pBar);
}
else if (pParentFrame->IsKindOf (RUNTIME_CLASS (CBCGPOleIPFrameWnd)))
{
((CBCGPOleIPFrameWnd*) pParentFrame)->AddControlBar (pBar);
}
else if (pParentFrame->IsKindOf (RUNTIME_CLASS (CBCGPOleDocIPFrameWnd)))
{
((CBCGPOleDocIPFrameWnd*) pParentFrame)->AddControlBar (pBar);
}
else if (pParentFrame->IsKindOf (RUNTIME_CLASS (CBCGPMDIChildWnd)))
{
((CBCGPMDIChildWnd*) pParentFrame)->AddControlBar (pBar);
}
else if (pParentFrame->IsKindOf (RUNTIME_CLASS (CBCGPOleCntrFrameWnd)))
{
((CBCGPOleCntrFrameWnd*) pParentFrame)->AddControlBar (pBar);
}
else
{
ASSERT (FALSE);
}
}
//*******************************************************************************
void CBCGPBaseControlBar::RemoveControlBarFromDockManager (CBCGPBaseControlBar* pBar,
BOOL bDestroy, BOOL bAdjustLayout,
BOOL bAutoHide)
{
CWnd* pParentFrame = GetDockSite ();
if (pParentFrame == NULL && globalUtils.m_bDialogApp)
{
return;
}
ASSERT_VALID (pParentFrame);
if (pParentFrame->IsKindOf (RUNTIME_CLASS (CBCGPFrameWnd)))
{
((CBCGPFrameWnd*) pParentFrame)->RemoveControlBarFromDockManager (pBar, bDestroy, bAdjustLayout, bAutoHide);
}
else if (pParentFrame->IsKindOf (RUNTIME_CLASS (CBCGPMDIFrameWnd)))
{
((CBCGPMDIFrameWnd*) pParentFrame)->RemoveControlBarFromDockManager (pBar, bDestroy, bAdjustLayout, bAutoHide);
}
else if (pParentFrame->IsKindOf (RUNTIME_CLASS (CBCGPOleIPFrameWnd)))
{
((CBCGPOleIPFrameWnd*) pParentFrame)->RemoveControlBarFromDockManager (pBar, bDestroy, bAdjustLayout, bAutoHide);
}
else if (pParentFrame->IsKindOf (RUNTIME_CLASS (CBCGPOleDocIPFrameWnd)))
{
((CBCGPOleDocIPFrameWnd*) pParentFrame)->RemoveControlBarFromDockManager (pBar, bDestroy, bAdjustLayout, bAutoHide);
}
else if (pParentFrame->IsKindOf (RUNTIME_CLASS (CBCGPMDIChildWnd)))
{
((CBCGPMDIChildWnd*) pParentFrame)->RemoveControlBarFromDockManager (pBar, bDestroy, bAdjustLayout, bAutoHide);
}
else if (pParentFrame->IsKindOf (RUNTIME_CLASS (CBCGPOleCntrFrameWnd)))
{
((CBCGPOleCntrFrameWnd*) pParentFrame)->RemoveControlBarFromDockManager (pBar, bDestroy, bAdjustLayout, bAutoHide);
}
else
{
ASSERT (FALSE);
}
}
//*******************************************************************************
BOOL CBCGPBaseControlBar::IsPointNearDockBar (CPoint point, DWORD& dwBarAlignment,
BOOL& bOuterEdge) const
{
CWnd* pParentFrame = GetDockSite ();
if (pParentFrame == NULL && globalUtils.m_bDialogApp)
{
return TRUE;
}
ASSERT_VALID (pParentFrame);
if (pParentFrame->IsKindOf (RUNTIME_CLASS (CBCGPFrameWnd)))
{
return ((CBCGPFrameWnd*) pParentFrame)->
IsPointNearDockBar (point, dwBarAlignment, bOuterEdge);
}
else if (pParentFrame->IsKindOf (RUNTIME_CLASS (CBCGPMDIFrameWnd)))
{
return ((CBCGPMDIFrameWnd*) pParentFrame)->
IsPointNearDockBar (point, dwBarAlignment, bOuterEdge);
}
else if (pParentFrame->IsKindOf (RUNTIME_CLASS (CBCGPOleIPFrameWnd)))
{
return ((CBCGPOleIPFrameWnd*) pParentFrame)->
IsPointNearDockBar (point, dwBarAlignment, bOuterEdge);
}
else if (pParentFrame->IsKindOf (RUNTIME_CLASS (CBCGPOleDocIPFrameWnd)))
{
return ((CBCGPOleDocIPFrameWnd*) pParentFrame)->
IsPointNearDockBar (point, dwBarAlignment, bOuterEdge);
}
else if (pParentFrame->IsKindOf (RUNTIME_CLASS (CBCGPMDIChildWnd)))
{
return ((CBCGPMDIChildWnd*) pParentFrame)->
IsPointNearDockBar (point, dwBarAlignment, bOuterEdge);
}
else if (pParentFrame->IsKindOf (RUNTIME_CLASS (CBCGPOleCntrFrameWnd)))
{
return ((CBCGPOleCntrFrameWnd*) pParentFrame)->
IsPointNearDockBar (point, dwBarAlignment, bOuterEdge);
}
else
{
ASSERT (FALSE);
}
return FALSE;
}
//*******************************************************************************
CBCGPBaseControlBar* CBCGPBaseControlBar::ControlBarFromPoint (CPoint point,
int nSensitivity, bool bExactBar, CRuntimeClass* pRTCBarType) const
{
CWnd* pParentFrame = GetDockSite ();
if (pParentFrame == NULL && globalUtils.m_bDialogApp)
{
return NULL;
}
ASSERT_VALID (pParentFrame);
if (pParentFrame->IsKindOf (RUNTIME_CLASS (CBCGPFrameWnd)))
{
return ((CBCGPFrameWnd*) pParentFrame)->
ControlBarFromPoint (point, nSensitivity, bExactBar, pRTCBarType);
}
else if (pParentFrame->IsKindOf (RUNTIME_CLASS (CBCGPMDIFrameWnd)))
{
return ((CBCGPMDIFrameWnd*) pParentFrame)->
ControlBarFromPoint (point, nSensitivity, bExactBar, pRTCBarType);
}
else if (pParentFrame->IsKindOf (RUNTIME_CLASS (CBCGPOleIPFrameWnd)))
{
return ((CBCGPOleIPFrameWnd*) pParentFrame)->
ControlBarFromPoint (point, nSensitivity, bExactBar, pRTCBarType);
}
else if (pParentFrame->IsKindOf (RUNTIME_CLASS (CBCGPOleDocIPFrameWnd)))
{
return ((CBCGPOleDocIPFrameWnd*) pParentFrame)->
ControlBarFromPoint (point, nSensitivity, bExactBar, pRTCBarType);
}
else if (pParentFrame->IsKindOf (RUNTIME_CLASS (CBCGPMDIChildWnd)))
{
return ((CBCGPMDIChildWnd*) pParentFrame)->
ControlBarFromPoint (point, nSensitivity, bExactBar, pRTCBarType);
}
else if (pParentFrame->IsKindOf (RUNTIME_CLASS (CBCGPOleCntrFrameWnd)))
{
return ((CBCGPOleCntrFrameWnd*) pParentFrame)->
ControlBarFromPoint (point, nSensitivity, bExactBar, pRTCBarType);
}
else
{
ASSERT (FALSE);
}
return FALSE;
}
//*******************************************************************************
BOOL CBCGPBaseControlBar::InsertControlBar (CBCGPBaseControlBar* pControlBar,
CBCGPBaseControlBar* pTarget, BOOL bAfter)
{
CBCGPMultiMiniFrameWnd* pParentMiniFrame =
DYNAMIC_DOWNCAST (CBCGPMultiMiniFrameWnd, GetParentMiniFrame ());
if (pParentMiniFrame != NULL)
{
return pParentMiniFrame->InsertControlBar (pControlBar, pTarget, bAfter);
}
CWnd* pParentFrame = GetDockSite ();
if (pParentFrame == NULL && globalUtils.m_bDialogApp)
{
return TRUE;
}
ASSERT_VALID (pParentFrame);
if (pParentFrame->IsKindOf (RUNTIME_CLASS (CBCGPFrameWnd)))
{
return ((CBCGPFrameWnd*) pParentFrame)->
InsertControlBar (pControlBar, pTarget, bAfter);
}
else if (pParentFrame->IsKindOf (RUNTIME_CLASS (CBCGPMDIFrameWnd)))
{
return ((CBCGPMDIFrameWnd*) pParentFrame)->
InsertControlBar (pControlBar, pTarget, bAfter);
}
else if (pParentFrame->IsKindOf (RUNTIME_CLASS (CBCGPOleIPFrameWnd)))
{
return ((CBCGPOleIPFrameWnd*) pParentFrame)->
InsertControlBar (pControlBar, pTarget, bAfter);
}
else if (pParentFrame->IsKindOf (RUNTIME_CLASS (CBCGPOleDocIPFrameWnd)))
{
return ((CBCGPOleDocIPFrameWnd*) pParentFrame)->
InsertControlBar (pControlBar, pTarget, bAfter);
}
else if (pParentFrame->IsKindOf (RUNTIME_CLASS (CBCGPMDIChildWnd)))
{
return ((CBCGPMDIChildWnd*) pParentFrame)->
InsertControlBar (pControlBar, pTarget, bAfter);
}
else if (pParentFrame->IsKindOf (RUNTIME_CLASS (CBCGPOleCntrFrameWnd)))
{
return ((CBCGPOleCntrFrameWnd*) pParentFrame)->
InsertControlBar (pControlBar, pTarget, bAfter);
}
else
{
ASSERT (FALSE);
}
return FALSE;
}
//*******************************************************************************
void CBCGPBaseControlBar::AdjustDockingLayout (HDWP hdwp)
{
CBCGPMiniFrameWnd* pParentMiniFrame = GetParentMiniFrame ();
if (pParentMiniFrame != NULL)
{
pParentMiniFrame->OnBarRecalcLayout ();
return;
}
CWnd* pParentFrame = GetDockSite ();
if (globalUtils.m_bDialogApp && pParentFrame == NULL)
{
return;
}
ASSERT_VALID (pParentFrame);
if (pParentFrame->IsKindOf (RUNTIME_CLASS (CBCGPFrameWnd)))
{
((CBCGPFrameWnd*) pParentFrame)->AdjustDockingLayout (hdwp);
}
else if (pParentFrame->IsKindOf (RUNTIME_CLASS (CBCGPMDIFrameWnd)))
{
((CBCGPMDIFrameWnd*) pParentFrame)->AdjustDockingLayout (hdwp);
}
else if (pParentFrame->IsKindOf (RUNTIME_CLASS (CBCGPOleIPFrameWnd)))
{
((CBCGPOleIPFrameWnd*) pParentFrame)->AdjustDockingLayout (hdwp);
}
else if (pParentFrame->IsKindOf (RUNTIME_CLASS (CBCGPOleDocIPFrameWnd)))
{
((CBCGPOleDocIPFrameWnd*) pParentFrame)->AdjustDockingLayout (hdwp);
}
else if (pParentFrame->IsKindOf (RUNTIME_CLASS (CBCGPMDIChildWnd)))
{
((CBCGPMDIChildWnd*) pParentFrame)->AdjustDockingLayout (hdwp);
}
else if (pParentFrame->IsKindOf (RUNTIME_CLASS (CBCGPOleCntrFrameWnd)))
{
((CBCGPOleCntrFrameWnd*) pParentFrame)->AdjustDockingLayout (hdwp);
}
else
{
ASSERT (FALSE);
}
}
//*******************************************************************************
void CBCGPBaseControlBar::DockControlBarMap (BOOL bUseDocSite)
{
CWnd* pParentFrame = bUseDocSite ? m_pDockSite : (CWnd*) BCGPGetParentFrame (this);
if (pParentFrame == NULL && globalUtils.m_bDialogApp)
{
return;
}
ASSERT_VALID (pParentFrame);
if (pParentFrame->IsKindOf (RUNTIME_CLASS (CBCGPFrameWnd)))
{
((CBCGPFrameWnd*) pParentFrame)->DockControlBar (this);
}
else if (pParentFrame->IsKindOf (RUNTIME_CLASS (CBCGPMDIFrameWnd)))
{
((CBCGPMDIFrameWnd*) pParentFrame)->DockControlBar (this);
}
else if (pParentFrame->IsKindOf (RUNTIME_CLASS (CBCGPOleIPFrameWnd)))
{
((CBCGPOleIPFrameWnd*) pParentFrame)->DockControlBar (this);
}
else if (pParentFrame->IsKindOf (RUNTIME_CLASS (CBCGPOleDocIPFrameWnd)))
{
((CBCGPOleDocIPFrameWnd*) pParentFrame)->DockControlBar (this);
}
else if (pParentFrame->IsKindOf (RUNTIME_CLASS (CBCGPMDIChildWnd)))
{
((CBCGPMDIChildWnd*) pParentFrame)->DockControlBar (this);
}
else if (pParentFrame->IsKindOf (RUNTIME_CLASS (CBCGPOleCntrFrameWnd)))
{
((CBCGPOleCntrFrameWnd*) pParentFrame)->DockControlBar (this);
}
else
{
ASSERT (FALSE);
}
}
//*******************************************************************************
void CBCGPBaseControlBar::ShowControlBar (BOOL bShow, BOOL bDelay, BOOL bActivate)
{
int nShowCmd = bShow ? SW_SHOWNOACTIVATE : SW_HIDE;
if (IsFloating () && !IsTabbed ())
{
ShowWindow (nShowCmd);
CWnd* pParent = GetParent ();
ASSERT_VALID (pParent);
pParent->ShowWindow (nShowCmd);
}
else if (m_pParentDockBar != NULL)
{
m_pParentDockBar->ShowControlBar (this, bShow, bDelay, bActivate);
}
else if (IsTabbed ())
{
HWND hWndTab = NULL;
CBCGPBaseTabWnd* pTabParent = GetParentTabWnd (hWndTab);
ASSERT_VALID (pTabParent);
CBCGPBaseTabbedBar* pTabbedControlBar =
DYNAMIC_DOWNCAST (CBCGPBaseTabbedBar, pTabParent->GetParent ());
if (pTabbedControlBar != NULL && !pTabbedControlBar->IsBarVisible () &&
pTabbedControlBar->GetTabsNum () > 1 && bShow)
{
pTabbedControlBar->ShowTab (this, TRUE, bDelay, bActivate);
return;
}
if (pTabbedControlBar != NULL)
{
ASSERT_VALID (pTabbedControlBar);
pTabbedControlBar->ShowTab (this, bShow, bDelay, bActivate);
if (pTabParent->GetVisibleTabsNum () == 0)
{
pTabbedControlBar->ShowControlBar (bShow, bDelay, bActivate);
}
}
else
{
int iTab = pTabParent->GetTabFromHwnd (GetSafeHwnd ());
pTabParent->ShowTab (iTab, bShow, !bDelay);
}
}
else
{
ShowWindow (nShowCmd);
if (!bDelay)
{
AdjustDockingLayout ();
}
}
if (GetDockRow () != NULL)
{
GetDockRow ()->FixupVirtualRects (false);
}
}
//************************************************************************************
LRESULT CBCGPBaseControlBar::OnIdleUpdateCmdUI(WPARAM wParam, LPARAM)
{
// the style must be visible and if it is docked
// the dockbar style must also be visible
if ((GetStyle() & WS_VISIBLE) &&
(m_pParentDockBar == NULL || (m_pParentDockBar->GetStyle() & WS_VISIBLE)))
{
CFrameWnd* pTarget = (CFrameWnd*)GetOwner();
if (pTarget == NULL || !pTarget->IsFrameWnd())
pTarget = BCGPGetParentFrame(this);
if (pTarget != NULL)
OnUpdateCmdUI(pTarget, (BOOL)wParam);
}
return 0L;
}
//*************************************************************************************
void CBCGPBaseControlBar::OnSize(UINT nType, int cx, int cy)
{
CWnd::OnSize(nType, cx, cy);
if (m_pDockBarRow != NULL)
{
m_pDockBarRow->OnResizeControlBar (this);
}
}
//*************************************************************************************
void CBCGPBaseControlBar::Serialize (CArchive& ar)
{
CWnd::Serialize (ar);
if (ar.IsLoading ())
{
DWORD dwAlign = 0;
ar >> dwAlign;
m_dwStyle |= dwAlign;
ar >> m_bRecentVisibleState;
}
else
{
ar << (m_dwStyle & CBRS_ALIGN_ANY);
ar << IsVisible ();
}
}
//*************************************************************************************
BOOL CBCGPBaseControlBar::LoadState (LPCTSTR lpszProfileName, int nIndex, UINT uiID)
{
CString strProfileName = ::BCGPGetRegPath (strBaseControlBarProfile, lpszProfileName);
if (nIndex == -1)
{
nIndex = GetDlgCtrlID ();
}
CString strSection;
if (uiID == (UINT) -1)
{
strSection.Format (REG_SECTION_FMT, strProfileName, nIndex);
}
else
{
strSection.Format (REG_SECTION_FMT_EX, strProfileName, nIndex, uiID);
}
CBCGPRegistrySP regSP;
CBCGPRegistry& reg = regSP.Create (FALSE, TRUE);
if (!reg.Open (strSection))
{
return FALSE;
}
reg.Read (_T ("IsVisible"), m_bRecentVisibleState);
m_bIsRestoredFromRegistry = TRUE;
return TRUE;
}
//*************************************************************************************
BOOL CBCGPBaseControlBar::SaveState (LPCTSTR lpszProfileName, int nIndex, UINT uiID)
{
CString strProfileName = ::BCGPGetRegPath (strBaseControlBarProfile, lpszProfileName);
if (nIndex == -1)
{
nIndex = GetDlgCtrlID ();
}
CString strSection;
if (uiID == (UINT) -1)
{
strSection.Format (REG_SECTION_FMT, strProfileName, nIndex);
}
else
{
strSection.Format (REG_SECTION_FMT_EX, strProfileName, nIndex, uiID);
}
CBCGPRegistrySP regSP;
CBCGPRegistry& reg = regSP.Create (FALSE, FALSE);
if (reg.CreateKey (strSection))
{
BOOL bIsVisible = IsVisible ();
reg.Write (_T ("IsVisible"), bIsVisible);
}
return TRUE;
}
//*************************************************************************************
CWnd* CBCGPBaseControlBar::GetDockSite () const
{
if (m_pDockSite == NULL && GetParent ()->IsKindOf (RUNTIME_CLASS (CDialog)))
{
globalUtils.m_bDialogApp = TRUE;
}
return m_pDockSite;
}
//*************************************************************************************
BCGP_DOCK_TYPE CBCGPBaseControlBar::GetDockMode () const
{
if (m_dockMode != DT_UNDEFINED)
{
return m_dockMode;
}
return CBCGPDockManager::m_dockModeGlobal;
}
//*************************************************************************************
BOOL CBCGPBaseControlBar::CanFloat () const
{
if (!IsTabbed ())
{
return m_dwBCGStyle & CBRS_BCGP_FLOAT;
}
HWND hWndTab = NULL;
CBCGPBaseTabWnd* pParentTabWnd = GetParentTabWnd (hWndTab);
if (pParentTabWnd == NULL)
{
return m_dwBCGStyle & CBRS_BCGP_FLOAT;
}
int nTabNum = pParentTabWnd->GetTabFromHwnd (hWndTab);
if (nTabNum == -1)
{
return m_dwBCGStyle & CBRS_BCGP_FLOAT;
}
return pParentTabWnd->IsTabDetachable (nTabNum);
}
//***************************************************************************************
CBCGPBaseTabWnd* CBCGPBaseControlBar::GetParentTabWnd (HWND& hWndTab) const
{
ASSERT_VALID (this);
const CWnd* pWndToCheck = this;
CBCGPDockingCBWrapper* pWrapper = DYNAMIC_DOWNCAST (CBCGPDockingCBWrapper, GetParent ());
if (pWrapper != NULL)
{
pWndToCheck = pWrapper;
hWndTab = pWrapper->GetSafeHwnd ();
}
else
{
hWndTab = GetSafeHwnd ();
}
CBCGPBaseTabWnd* pParentTabWnd = DYNAMIC_DOWNCAST (CBCGPBaseTabWnd, pWndToCheck->GetParent ());
if (pParentTabWnd == NULL)
{
CBCGPBaseTabbedBar* pParentTabBar = DYNAMIC_DOWNCAST (CBCGPBaseTabbedBar, pWndToCheck->GetParent ());
if (pParentTabBar != NULL)
{
return pParentTabBar->GetUnderlinedWindow ();
}
}
return pParentTabWnd;
}
//***************************************************************************************
CBCGPBaseTabbedBar* CBCGPBaseControlBar::GetParentTabbedBar () const
{
HWND hWndTab = NULL;
if (!IsTabbed ())
{
return NULL;
}
CBCGPBaseTabWnd* pTabWnd = GetParentTabWnd (hWndTab);
if (hWndTab == NULL || pTabWnd == NULL)
{
return NULL;
}
ASSERT_VALID (pTabWnd);
return DYNAMIC_DOWNCAST (CBCGPBaseTabbedBar, pTabWnd->GetParent ());
}
//***************************************************************************************
LRESULT CBCGPBaseControlBar::OnHelpHitTest(WPARAM, LPARAM lParam)
{
ASSERT_VALID(this);
int nID = OnToolHitTest((DWORD)lParam, NULL);
if (nID != -1)
return HID_BASE_COMMAND+nID;
nID = _AfxGetDlgCtrlID(m_hWnd);
return nID != 0 ? HID_BASE_CONTROL+nID : 0;
}
//***************************************************************************************
LRESULT CBCGPBaseControlBar::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
ASSERT_VALID(this);
LRESULT lResult;
switch (message)
{
case WM_NOTIFY:
case WM_COMMAND:
case WM_DRAWITEM:
case WM_MEASUREITEM:
case WM_DELETEITEM:
case WM_COMPAREITEM:
case WM_VKEYTOITEM:
case WM_CHARTOITEM:
// send these messages to the owner if not handled
if (OnWndMsg(message, wParam, lParam, &lResult))
return lResult;
else
{
// try owner next
lResult = GetOwner()->SendMessage(message, wParam, lParam);
// special case for TTN_NEEDTEXTA and TTN_NEEDTEXTW
if(message == WM_NOTIFY)
{
NMHDR* pNMHDR = (NMHDR*)lParam;
if (pNMHDR->code == TTN_NEEDTEXTA || pNMHDR->code == TTN_NEEDTEXTW)
{
TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR;
TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR;
if (pNMHDR->code == TTN_NEEDTEXTA)
{
if (pTTTA->hinst == 0 && (!pTTTA->lpszText || !*pTTTA->lpszText))
{
// not handled by owner, so let bar itself handle it
lResult = CWnd::WindowProc(message, wParam, lParam);
}
} else if (pNMHDR->code == TTN_NEEDTEXTW)
{
if (pTTTW->hinst == 0 && (!pTTTW->lpszText || !*pTTTW->lpszText))
{
// not handled by owner, so let bar itself handle it
lResult = CWnd::WindowProc(message, wParam, lParam);
}
}
}
}
return lResult;
}
}
// otherwise, just handle in default way
lResult = CWnd::WindowProc(message, wParam, lParam);
return lResult;
}
//***************************************************************************************
BOOL CBCGPBaseControlBar::PreTranslateMessage(MSG* pMsg)
{
ASSERT_VALID(this);
ASSERT(m_hWnd != NULL);
if (CWnd::PreTranslateMessage(pMsg))
return TRUE;
CWnd* pOwner = GetOwner();
// don't translate dialog messages when in Shift+F1 help mode
CFrameWnd* pFrameWnd = GetTopLevelFrame();
if (pFrameWnd != NULL && pFrameWnd->m_bHelpMode)
return FALSE;
// since 'IsDialogMessage' will eat frame window accelerators,
// we call all frame windows' PreTranslateMessage first
while (pOwner != NULL)
{
// allow owner & frames to translate before IsDialogMessage does
if (pOwner->PreTranslateMessage(pMsg))
return TRUE;
// try parent frames until there are no parent frames
pOwner = pOwner->GetParentFrame();
}
// filter both messages to dialog and from children
return PreTranslateInput(pMsg);
}
//***************************************************************************************
LRESULT CBCGPBaseControlBar::HandleInitDialog(WPARAM, LPARAM)
{
if (m_lpszBarTemplateName != NULL)
{
if (!ExecuteDlgInit(m_lpszBarTemplateName))
{
return FALSE;
}
}
if (!UpdateData(FALSE))
{
return FALSE;
}
return TRUE;
}