|
|
//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1999 - 1999
//
// File: docksite.h
//
//--------------------------------------------------------------------------
#ifndef __DOCKSITE_H__
#define __DOCKSITE_H__
#include "controls.h"
// DockSite.h : header file
//
/////////////////////////////////////////////////////////////////////////////
// CDockSite window
// Forward references
class CDockWindow; class CDockSite; class CReBar;
template <class T> class CDockManager { // Construction
public: CDockManager(); ~CDockManager();
//Operations
public: // Add a site
BOOL Attach(T* pSite); BOOL Detach(T* pSite); void RemoveAll(); virtual void BeginLayout(int nWindows = 5); virtual void EndLayout(); virtual void RenderDockSites(HWND hView, CRect& clientRect);
protected: CList<T*, T*>* m_pManagedSites; // Array of View's that have docksite
HDWP m_hDWP; // Handle for BeginDeferWindowPos
};
template <class T> CDockManager<T>::CDockManager() { m_pManagedSites = new CList<T*, T*>; m_hDWP = 0; }
template <class T> CDockManager<T>::~CDockManager() { delete m_pManagedSites; }
template <class T> BOOL CDockManager<T>::Attach(T* pView) { ASSERT(pView != NULL); return (m_pManagedSites->AddTail(pView) != NULL); }
template <class T> BOOL CDockManager<T>::Detach(T* pView) { ASSERT(pView != NULL); POSITION pos = m_pManagedSites->Find(pView);
if (pos == NULL) return FALSE;
return m_pManagedSites->RemoveAt(pos); }
template <class T> void CDockManager<T>::RemoveAll() { m_pManagedSites->RemoveAll(); }
template <class T> void CDockManager<T>::BeginLayout(int nWindows) { m_hDWP = ::BeginDeferWindowPos(nWindows); }
template <class T> void CDockManager<T>::EndLayout() { ::EndDeferWindowPos(m_hDWP); m_hDWP = 0; }
template <class T> void CDockManager<T>::RenderDockSites(HWND hView, CRect& clientRect) { ASSERT(m_hDWP != 0);
T* pDockSite; POSITION pos = m_pManagedSites->GetHeadPosition();
// No sites in to manage
if (pos == NULL) return ;
// Save a copy of the full client rect
CRect savedClient; CRect totalSite(0,0,0,0); CPoint point(0, 0); int yTop = 0; int yBottom = clientRect.bottom;
savedClient.CopyRect(&clientRect);
while (pos) { pDockSite = m_pManagedSites->GetNext(pos);
ASSERT(pDockSite != NULL);
// Set the y coordinate for the site layout logic
if (pDockSite->GetStyle() == CDockSite::DSS_TOP) point.y = yTop; else point.y = yBottom;
pDockSite->RenderLayout(m_hDWP, clientRect, point);
// totalSite = saveRect - clientRect
totalSite = savedClient; totalSite -= clientRect;
// Adjust the y coordinate for the next site in the list
if (pDockSite->GetStyle() == CDockSite::DSS_TOP) yTop += totalSite.Height(); else yBottom -= totalSite.Height();
// client rect before the site adjusts it
savedClient = clientRect; }
// Position the view window
::DeferWindowPos(m_hDWP, hView, NULL, savedClient.left, // x
savedClient.top+yTop, //y
savedClient.Width(), savedClient.Height(), SWP_NOZORDER|SWP_NOACTIVATE); }
class CDockSite { // Construction
public:
enum DSS_STYLE { DSS_TOP = 0, // Locate site at the window top
DSS_BOTTOM, // Locate site at the window bottom
DSS_LEFT, // Locate site at the window left-side
DSS__RIGHT, //
};
public: CDockSite();
// Create this site for the parent window pParent and allocate room for 10 CDockWindows.
BOOL Create(DSS_STYLE style=DSS_TOP);
// Operations
public:
public: // Add a window to be docked to this site
BOOL Attach(CDockWindow* pWnd);
// Remove a window from the site
BOOL Detach(CDockWindow* pWnd);
// Compute all the regions sizes for layout
bool IsVisible(); void Toggle(); DSS_STYLE GetStyle();
virtual void RenderLayout(HDWP& hdwp, CRect& clientRect, CPoint& xyLocation); virtual void Show(BOOL bState = TRUE);
// Attributes
private: CList<CDockWindow*, CDockWindow*>* m_pManagedWindows; // Array of CDockWindow
CWnd* m_pParentWnd; // Window that contains the docksite
DSS_STYLE m_style; // Style of the site
CRect m_rect; // Rectangle for the docksite size
BOOL m_bVisible; // Docksite visible or hidded
// Implementation
public: virtual ~CDockSite(); };
/////////////////////////////////////////////////////////////////////////////
inline CDockSite::DSS_STYLE CDockSite::GetStyle() { return m_style; }
inline bool CDockSite::IsVisible() { return (m_bVisible != FALSE); }
inline void CDockSite::Toggle() { Show(!m_bVisible); }
/////////////////////////////////////////////////////////////////////////////
// CDockWindow window
class CDockWindow : public CWnd { DECLARE_DYNAMIC (CDockWindow)
enum DWS_STYLE { DWS_HORIZONTAL, // Place window horizontally within the site
DWS_VERTICAL, // Place window vetically within the site
};
// Construction
public: CDockWindow();
// Attributes
public:
// Operations
public: // Given the maxRect, determine the toolwindow size and calculate size
virtual CRect CalculateSize(CRect maxRect) = 0;
// Top level create to initialize the CDockWindow and control
virtual BOOL Create(CWnd* pParentWnd, DWORD dwStyle, UINT nID) = 0;
// Make visible/hidden
virtual void Show(BOOL bState); bool IsVisible(); void SetVisible(BOOL bState);
private: BOOL m_bVisible;
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CDockWindow)
protected: virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam); //}}AFX_VIRTUAL
// Implementation
public: virtual ~CDockWindow();
// Generated message map functions
protected: //{{AFX_MSG(CDockWindow)
afx_msg void OnShowWindow(BOOL bShow, UINT nStatus); //}}AFX_MSG
DECLARE_MESSAGE_MAP() };
inline bool CDockWindow::IsVisible() { return (m_bVisible != FALSE); };
inline void CDockWindow::SetVisible(BOOL bState) { m_bVisible = bState & 0x1; };
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// CStatBar window
struct STATUSBARPANE { // default to sunken text with stretchy width
STATUSBARPANE() { m_style = 0; m_width = -1; }
int m_width; UINT m_style; CString m_paneText; };
class CStatBar : public CDockWindow { DECLARE_DYNAMIC(CStatBar)
// Construction
public: CStatBar();
// Attributes
public:
private: int m_nCount; // number of panes
STATUSBARPANE* m_pPaneInfo; // array of pane structures, default is 10, no realloc implemented
// Operations
public: BOOL Create(CWnd* pParentWnd, DWORD dwStyle, UINT nID); CRect CalculateSize(CRect maxRect);
void GetItemRect(int nIndex, LPRECT lpRect); void SetPaneStyle(int nIndex, UINT nStyle);
BOOL CreatePanes(UINT* pIndicatorArray=NULL, int nCount=10); void SetPaneText(int nIndex, LPCTSTR lpszText, BOOL bUpdate = TRUE); void UpdateAllPanes(int clientWidth);
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CStatBar)
//}}AFX_VIRTUAL
// Implementation
public: virtual ~CStatBar();
// Generated message map functions
protected: //{{AFX_MSG(CStatBar)
afx_msg void OnSize(UINT nType, int cx, int cy); //}}AFX_MSG
DECLARE_MESSAGE_MAP()
private: };
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// CRebarDockWindow window
#define SIZEABLEREBAR_GUTTER 6
#define SIZEABLEREBAR_WINDOW _T("SizeableRebar")
class CRebarDockWindow : public CDockWindow { // Construction
public: CRebarDockWindow();
// Attributes
public:
private: enum { ID_REBAR = 0x1000 };
CRebarWnd m_wndRebar; bool m_bTracking;
// Operations
public: BOOL Create(CWnd* pParentWnd, DWORD dwStyle, UINT nID); CRect CalculateSize(CRect maxRect); void UpdateWindowSize(void); BOOL InsertBand(LPREBARBANDINFO lprbbi); LRESULT SetBandInfo(UINT uBand, LPREBARBANDINFO lprbbi);
CRebarWnd* GetRebar () { return &m_wndRebar; }
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CRebarDockWindow)
protected: virtual BOOL PreCreateWindow(CREATESTRUCT& cs); //}}AFX_VIRTUAL
// Implementation
public: virtual ~CRebarDockWindow();
// Generated message map functions
protected: //{{AFX_MSG(CRebarDockWindow)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); afx_msg void OnLButtonDown(UINT nFlags, CPoint point); afx_msg void OnLButtonUp(UINT nFlags, CPoint point); afx_msg void OnMouseMove(UINT nFlags, CPoint point); afx_msg void OnSize(UINT nType, int cx, int cy); //}}AFX_MSG
DECLARE_MESSAGE_MAP() };
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio will insert additional declarations immediately before the previous line.
#endif // __DOCKSITE_H__
|