// XTPDockingPaneContext.h : interface for the CXTPDockingPaneContext class.
//
// This file is a part of the XTREME DOCKINGPANE MFC class library.
// (c)1998-2012 Codejock Software, All Rights Reserved.
//
// THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
// RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
// CONSENT OF CODEJOCK SOFTWARE.
//
// THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
// IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
// YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
// SINGLE COMPUTER.
//
// CONTACT INFORMATION:
// support@codejock.com
// http://www.codejock.com
//
/////////////////////////////////////////////////////////////////////////////

//{{AFX_CODEJOCK_PRIVATE
#if !defined(__XTPDOCKINGPANECONTEXT_H__)
#define __XTPDOCKINGPANECONTEXT_H__
//}}AFX_CODEJOCK_PRIVATE

#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000


class CXTPDockingPane;
class CXTPDockingPaneManager;
class CXTPDockingPaneContext;

//-----------------------------------------------------------------------
// Summary:
//     XTPDockingPaneStickerType is an enumeration that is used to indicate
//     which docking stickers are to be drawn on the screen when a
//     docking pane is dragged.
// Remarks:
//     m_bUseAlphaContext must be TRUE to display docking stickers.
// See Also:
//     CXTPDockingPaneContext::CreateNewSticker,
//     CXTPDockingPaneContextStickerWnd::m_typeSticker, CXTPDockingPaneContextStickerWnd::m_selectedSticker
//
// <KEYWORDS xtpPaneStickerNone, xtpPaneStickerLeft, xtpPaneStickerRight, xtpPaneStickerTop, xtpPaneStickerBottom, xtpPaneStickerCenter, xtpPaneStickerClient, xtpPaneStickerPane>
//-----------------------------------------------------------------------
enum XTPDockingPaneStickerType
{
	xtpPaneStickerNone = 0,         // No docking stickers are displayed
	xtpPaneStickerLeft = 1,         // Display the docking sticker indicating the pane can be docked to the left.
	xtpPaneStickerRight = 2,        // Display the docking sticker indicating the pane can be docked to the right.
	xtpPaneStickerTop = 4,          // Display the docking sticker indicating the pane can be docked on the top.
	xtpPaneStickerBottom = 8,       // Display the docking sticker indicating the pane can be docked on the bottom.
	xtpPaneStickerCenter = 16,      // Display the docking sticker indicating the pane can be docked in the center.
	xtpPaneStickerClient = 32       // Display the left, top, bottom, and right docking stickers on the client frame.
};

//===========================================================================
// Summary:
//     CXTPDockingPaneContextAlphaWnd is CWnd derived class represents alpha context helper window
//===========================================================================
class _XTP_EXT_CLASS CXTPDockingPaneContextAlphaWnd : public CWnd
{
public:
	//-----------------------------------------------------------------------
	// Summary:
	//     Constructs a CXTPDockingPaneContextAlphaWnd object.
	//-----------------------------------------------------------------------
	CXTPDockingPaneContextAlphaWnd();

	//-----------------------------------------------------------------------
	// Summary:
	//     Destroys a CXTPDockingPaneContextAlphaWnd object, handles cleanup and deallocation.
	//-----------------------------------------------------------------------
	virtual ~CXTPDockingPaneContextAlphaWnd();

protected:
//{{AFX_CODEJOCK_PRIVATE
	DECLARE_MESSAGE_MAP()
	//{{AFX_MSG(CXTPDockingPaneContextAlphaWnd)
	afx_msg BOOL OnEraseBkgnd(CDC* pDC);
	afx_msg void OnPaint();
	//}}AFX_MSG
//}}AFX_CODEJOCK_PRIVATE

	friend class CXTPDockingPaneContext;
};

//===========================================================================
// Summary:
//     CXTPDockingPaneContextStickerWnd is CWnd derived class represents sticker window.
//===========================================================================
class _XTP_EXT_CLASS CXTPDockingPaneContextStickerWnd : public CWnd
{
public:
	//-----------------------------------------------------------------------
	// Summary:
	//     Constructs a CXTPDockingPaneContextStickerWnd object.
	// Parameters:
	//     pContext - Parent context object.
	//-----------------------------------------------------------------------
	CXTPDockingPaneContextStickerWnd(CXTPDockingPaneContext* pContext);

	//-----------------------------------------------------------------------
	// Summary:
	//     Destroys a CXTPDockingPaneContextStickerWnd object, handles cleanup and deallocation.
	//-----------------------------------------------------------------------
	virtual ~CXTPDockingPaneContextStickerWnd();

public:
	//-----------------------------------------------------------------------
	// Summary:
	//     This method is called to draw sticker
	// Parameters:
	//     pDC - Device context pointer
	//-----------------------------------------------------------------------
	void OnDraw(CDC* pDC);


//{{AFX_CODEJOCK_PRIVATE
public:
	XTPDockingPaneStickerType HitTest(CPoint pt);
	struct SPRITEINFO;

protected:
	void DrawSprite(CDC* pDC, UINT nID, SPRITEINFO* pSpriteInfo, BOOL bClientBitmap = TRUE);
	void DrawTransparent(CDC* pDC , const CPoint& ptDest, const CSize& sz, CBitmap* pBitmap);

protected:
	DECLARE_MESSAGE_MAP()

	//{{AFX_MSG(CXTPDockingPaneContextStickerWnd)
	afx_msg BOOL OnEraseBkgnd(CDC* pDC);
	afx_msg void OnPaint();
	//}}AFX_MSG
//}}AFX_CODEJOCK_PRIVATE

public:
	XTPDockingPaneStickerType m_typeSticker;      // Type of the sticker.
	XTPDockingPaneStickerType m_selectedSticker;  // Selected sticker part.
	CXTPDockingPaneContext* m_pContext;           // Pointer to docking pane context.

	friend class CXTPDockingPaneContext;

};

//===========================================================================
// Summary:
//     CXTPDockingPaneContext is a stand alone class. It is used internally
//     for docking and sizing panes.
//===========================================================================
class _XTP_EXT_CLASS CXTPDockingPaneContext
{
public:
	//-----------------------------------------------------------------------
	// Summary:
	//     Constructs a CXTPDockingPaneContext object
	//-----------------------------------------------------------------------
	CXTPDockingPaneContext();

	//-----------------------------------------------------------------------
	// Summary:
	//     Destroys a CXTPDockingPaneContext object, handles cleanup and deallocation.
	//-----------------------------------------------------------------------
	virtual ~CXTPDockingPaneContext();

public:
	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to drag a pane.
	// Parameters:
	//     pPane - Points to a CXTPDockingPaneBase object
	//     point - Initial mouse position.
	//-----------------------------------------------------------------------
	virtual void Drag(CXTPDockingPaneBase* pPane, CPoint point);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to drag a pane.
	// Parameters:
	//     pPane - Points to a CXTPDockingPaneBase object
	//     point - Initial mouse position.
	//     rcPane - Size of pane.
	//-----------------------------------------------------------------------
	void Drag(CXTPDockingPaneBase* pPane, CPoint point, CRect rcPane);

	//-----------------------------------------------------------------------
	// Summary:
	//      This method is called inside WM_SIZING handler of mini frames to update sticky position of frame
	// Parameters:
	//      pWnd - Mini frame pointer
	//      nSide - Side was dragged by user
	//      lpRect - Rectangle of frame
	//-----------------------------------------------------------------------
	virtual void OnSizingFloatingFrame(CXTPDockingPaneMiniWnd* pWnd, UINT nSide, LPRECT lpRect);

protected:
	//-----------------------------------------------------------------------
	// Summary:
	//     This method is called to track the size of the pane.
	//-----------------------------------------------------------------------
	virtual void Track();

	//-----------------------------------------------------------------------
	// Summary:
	//     This method is called then user move mouse cursor in track mode.
	// Parameters:
	//     pt - New mouse cursor position
	//-----------------------------------------------------------------------
	virtual void Move(CPoint pt);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member function to initialize a loop.
	//-----------------------------------------------------------------------
	virtual void InitLoop();

	//-----------------------------------------------------------------------
	// Summary:
	//     This member function is called when a loop is canceled.
	//-----------------------------------------------------------------------
	virtual void CancelLoop();

	//-----------------------------------------------------------------------
	// Summary:
	//     This member function is called to draw the focus rectangle.
	// Parameters:
	//     bRemoveRect - TRUE to delete focus rect.
	//-----------------------------------------------------------------------
	virtual void DrawFocusRect(BOOL bRemoveRect = FALSE);

protected:

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to adjust the rectangle.
	// Parameters:
	//     rect - Rectangle to be changed.
	//     pt   - Position of the rectangle to be changed.
	//-----------------------------------------------------------------------
	static void AFX_CDECL AdjustRectangle(CRect& rect, CPoint pt);

	//-----------------------------------------------------------------------
	// Summary:
	//     Moves cursor to available work area
	// Parameters:
	//     pt - Pointer to mouse cursor
	//-----------------------------------------------------------------------
	static void AFX_CDECL AdjustCursor(CPoint& pt);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member function to create a context menu.
	// Parameters:
	//     pWnd - A pointer to a CXTPDockingPaneContextAlphaWnd object.
	//-----------------------------------------------------------------------
	void CreateContextWindow(CXTPDockingPaneContextAlphaWnd* pWnd);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member function to refresh the docking stickers.
	//-----------------------------------------------------------------------
	void UpdateDockingStickers();

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to remove the docking stickers.
	//-----------------------------------------------------------------------
	void DestroyDockingStickers();

	//-----------------------------------------------------------------------
	// Summary:
	//     Creates new sticker window
	// Parameters:
	//     rc          - Boundary rectangle of the sticker
	//     typeSticker - Type of the sticker to create
	// Returns:
	//     New Sticker window
	//-----------------------------------------------------------------------
	CXTPDockingPaneContextStickerWnd* CreateNewSticker(CRect rc, XTPDockingPaneStickerType typeSticker);

//{{AFX_CODEJOCK_PRIVATE
public:
	CSize GetStickerSize(XTPDockingPaneStickerType type) const;
	XTPDockingContextStickerStyle GetStickerStyle() const;
	static void AFX_CDECL EnsureVisible(CRect& rectDragFrame);

protected:
	void _CreateRectangleRgn(CRgn& rgnResult, CRect rc);
	void _CreateRgn(CRgn& rgnResult, CRect rc, BOOL bTabbedRgn, BOOL bRemove = FALSE);
	virtual void FindContainer(CPoint pt);
	BOOL CanDock(CRect rc, CPoint pt, CXTPDockingPaneBase* pPane, BOOL bInside = TRUE);
	BOOL CanSideDock(CXTPDockingPaneBase* pPane, CRect rcFrame);

	void RegionFromBitmap(CRgn* pRgn, CDC* pDC, CRect rc);
	BOOL IsAllowDockingTo(CXTPDockingPaneBase* pPane, XTPDockingPaneDirection direction);
	BOOL IsAllowAttachTo(CXTPDockingPaneBase* pPane);
	virtual void UpdateStickyFrame(CRect& rectDragFrame);
	void UpdateStickyFrame(CRect& rectDragFrame, CWnd* pHost);
	void UpdateSizingStickyFrame(UINT nSide, CRect& rectDragFrame, CWnd* pWnd);

	BOOL IsBehind(CXTPDockingPaneBase* pPane, CXTPDockingPaneBase* pPaneRef);
//}}AFX_CODEJOCK_PRIVATE

private:
	void IncludeRgnPart(CRgn* pRgn, int x1, int y, int x2);

protected:

	CXTPDockingPaneContextAlphaWnd m_wndContext;        // Alpha context control.
	CXTPDockingPaneContextAlphaWnd m_wndAttachedTab;    // Attached tab control.

	PVOID m_pfnSetLayeredWindowAttributes;              // Pointer to SetLayeredWindowAttributes method.

	BOOL m_bUseDockingStickers;                         // TRUE to use docking stickers.
	BOOL m_bUseAlphaContext;                            // TRUE to use alpha context.

	CRect m_rectStickerPane;                            // Area occupied by the sticker pane.
	CXTPDockingPaneBase* m_pStickerPane;                // Sticker Pane.
	CXTPDockingPaneBase* m_pLastStickerPane;            // Last Sticker Pane.

	CList<CXTPDockingPaneContextStickerWnd*, CXTPDockingPaneContextStickerWnd*> m_lstStickers;  //List of the stickers
	CPoint m_ptLast;                                    // Holds the last selection point.
	CPoint m_ptSticky;                                  // Position of the sticky control.
	CRect m_rectDragFrame;                              // Area occupied by the drag frame.
	CRect m_rectDragFrameScreen;                        // Screen drag frame
	CXTPDockingPaneManager* m_pManager;                 // Parent pane manager.
	CXTPDockingPaneBase* m_pPane;                       // Pointer to the associated pane.
	BOOL m_bDragKeyboard;                               // TRUE if keyboard used to drag pane

protected:
//{{AFX_CODEJOCK_PRIVATE
	BOOL m_bResetDC;
	CXTPDockingPaneBase* m_pContainer;
	CRect m_rectContainer;
	BOOL  m_bAttachLast;
	BOOL  m_bAttach;
	BOOL  m_bSideDock;
	BOOL  m_bFloatable;
	BOOL  m_bDockable;
	CRect m_rectLast;
	CSize m_sizeLast;
	BOOL  m_bDitherLast;
	CMap<UINT, UINT,  CRgn*, CRgn*> m_rgnStickers;
	XTPDockingPaneDirection m_containDirection;
	CDC* m_pDC;
//}}AFX_CODEJOCK_PRIVATE

private:
	friend class CXTPDockingPaneManager;
	friend class CXTPDockingPaneContextAlphaWnd;
};

#endif // #if !defined(__XTPDOCKINGPANECONTEXT_H__)