// XTPFlowGraphPaintManager.h: interface for the CXTPFlowGraphPaintManager class.
//
// This file is a part of the XTREME TOOLKIT PRO MFC class library.
// (c)1998-2011 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(__XTPFLOWGRAPHPAINTMANAGER_H__)
#define __XTPFLOWGRAPHPAINTMANAGER_H__
//}}AFX_CODEJOCK_PRIVATE

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

class CXTPFlowGraphControl;
class CXTPFlowGraphDrawContext;
class CXTPFlowGraphNode;
class CXTPFlowGraphConnectionPoint;
class CXTPFlowGraphConnection;
class CXTPFlowGraphNodeGroup;
class CXTPFlowGraphElement;

//}}AFX_CODEJOCK_PRIVATE
namespace Gdiplus
{
	class Font;
};
//}}AFX_CODEJOCK_PRIVATE

// ------------------------------------------------------------------
// Summary:
//     Node connector styles.
// Remarks:
//     The xtpFlowGraphConnectorType specifies the style of the lines
//     that "connect" the connections of a node.
// See Also:
//     CXTPFlowGraphPaintManager::m_nConnectorType
// ------------------------------------------------------------------
enum XTPFlowGraphConnectorType
{
	xtpFlowGraphConnectorStraight, // Straight line connector.
	xtpFlowGraphConnectorCurved // Curved line connector.
};


// -------------------------------------------------------------
//
// Summary:
//     Handles most of the drawing activities of the Flow Graph.
// -------------------------------------------------------------
class _XTP_EXT_CLASS CXTPFlowGraphPaintManager : public CXTPCmdTarget
{
public:
	// --------------------------------------------------
	// Summary:
	//     Constructs a CXTPFlowGraphPaintManager object.
	// --------------------------------------------------
	CXTPFlowGraphPaintManager();
	// --------------------------------------------------------------------
	// Summary:
	//     Destroys a CXTPFlowGraphPaintManager object, handles cleanup and
	//     deallocation.
	// --------------------------------------------------------------------
	virtual ~CXTPFlowGraphPaintManager();

public:
	// ----------------------------------------------------
	// Summary:
	//     Draws the background for the flow graph control.
	// Parameters:
	//     pDC :       Pointer to a valid device context.
	//     pControl :  Pointer to the flow graph control.
	// ----------------------------------------------------
	virtual void DrawControlBackground(CXTPFlowGraphDrawContext* pDC, CXTPFlowGraphControl* pControl);

	// -------------------------------------------------------------------
	// Summary:
	//     This method is called to refresh the visual metrics of the flow
	//     graph.
	// -------------------------------------------------------------------
	virtual void RefreshMetrics();


	// ----------------------------------------------------------------------
	// Summary:
	//     Recalculates the layout of the Node.
	// Remarks:
	//     Call this functions to correctly reposition the connections within
	//     the node. This also will readjust the layout when the size or
	//     caption has changed. It will also handle any color or font
	//     changes.
	// ----------------------------------------------------------------------
	virtual void RecalcNodeLayout(CXTPFlowGraphDrawContext* pDC, CXTPFlowGraphNode* pNode);

	// ----------------------------------------------------------------------
	// Summary:
	//     Recalculates the layout of the connection.
	// Remarks:
	//     Call this functions to correctly reposition the connection within
	//     the node. This will also update any colors, etc that have changed.
	// ----------------------------------------------------------------------
	virtual void RecalcConnectionLayout(CXTPFlowGraphDrawContext* pDC, CXTPFlowGraphConnection* pConnection);


	// -----------------------------------------------------------------
	// Summary:
	//     This method is called to draw a single Node in the flow graph
	//     control.
	// Parameters:
	//     pDC :    Pointer to a valid device context.
	//     pNode :  Points to a CXTPFlowGraphNode object to draw.
	// -----------------------------------------------------------------
	virtual void DrawNode(CXTPFlowGraphDrawContext* pDC, CXTPFlowGraphNode* pNode);
	// ----------------------------------------------------------------------
	// Summary:
	//     This method is called to draw a single connection in the flow
	//     graph control.
	// Parameters:
	//     pDC :          Pointer to a valid device context.
	//     pConnection :  Points to a CXTPFlowGraphConnection object to draw.
	// ----------------------------------------------------------------------
	virtual void DrawConnection(CXTPFlowGraphDrawContext* pDC, CXTPFlowGraphConnection* pConnection);

	// ------------------------------------------------------------------
	// Summary:
	//     Gets the bounding rectangle for the specified node.
	// Parameters:
	//     pNode :  Reference to the node to get it's bounding rectangle.
	// Returns:
	//     The bounding rectangle for the specified node.
	// ------------------------------------------------------------------
	virtual CRect GetNodeBoundingRectangle(CXTPFlowGraphNode* pNode);

	// --------------------------------------------------------------------
	// Summary:
	//     This method is called to draw a single node group in the flow
	//     graph control.
	// Parameters:
	//     pDC :         Pointer to a valid device context.
	//     pNodeGroup :  Points to a CXTPFlowGraphNodeGroup object to draw.
	// --------------------------------------------------------------------
	virtual void DrawNodeGroup(CXTPFlowGraphDrawContext* pDC, CXTPFlowGraphNodeGroup* pNodeGroup);

	// --------------------------------------------------------------------
	// Summary:
	//     Determines if the specified point is within the connection area.
	// Parameters:
	//     pPoint :  CXTPFlowGraphConnectionPoint to test.
	//     point :   Point in flow graph to test.
	// Returns:
	//     True if the point is located within the connection area, False
	//     \otherwise.
	// --------------------------------------------------------------------
	virtual BOOL HitTestConnectionArea(const CXTPFlowGraphConnectionPoint* pPoint, CPoint point);

	// ------------------------------------------------------------------------
	// Summary:
	//     Gets the bounding rectangle for the caption of the specified node.
	// Parameters:
	//     pNode :  Reference to the element to retrieve the bounding rectangle
	//              for the caption.
	// Returns:
	//     The bounding rectangle for the caption of the specified node.
	// ------------------------------------------------------------------------
	virtual CRect GetCaptionRect(CXTPFlowGraphElement* pNode);

	// --------------------------------------------------------------------
	// Summary:
	//     Cleans up allocated resources used by the paintmanager that have
	//     been allocated during draw routines.
	// --------------------------------------------------------------------
	virtual void Cleanup();

protected:
	// ------------------------------------------------------------------
	// Summary:
	//     Creates and returns a darker color of the specified color.
	// Parameters:
	//     clrBackground :  Color to make darker.
	// Remarks:
	//     This will take the specified color and make it darker. For
	//     \example, it will take blue and make "dark blue". This is also
	//     used internally to make the node and group frame colors.
	// Returns:
	//     \Returns a darker color of the specified color.
	// ------------------------------------------------------------------
	COLORREF GetDarkColor(COLORREF clrBackground);

public:
	COLORREF m_clrBackground; // Specifies the background "canvas" color for the flow graph.
	COLORREF m_clrSelection; // Specifies the color used for selected nodes.
	COLORREF m_clrTextColor;  // Specifies the color used for text.
	COLORREF m_clrGridColor; //Specifies the color used for grid lines.

	COLORREF m_clrNodeBackground; // Gets\sets the background color used for Nodes.

	LOGFONT m_lfText; // Gets\sets the font used for connection captions.
	LOGFONT m_lfCaption; // Gets\sets the font used for Node captions.

	int m_nNodeFrameSize; // Gets\sets the size of the border-frame of a node.
	int m_nPointTextMargin; // Specifies the margin to place between a connection's caption text and the connection's connection point (if a connection point is present).
	COLORREF m_clrConnection; // Specifies the color of the connection lines that connect two connection points.
	BOOL m_bDrawArrow; // Specifies whether to draw arrows for connections.
	int m_nEllipseSize; // Specifies the size of Connection Points.
	BOOL m_bShowGrid; // Specifies whether to show the grid for the flow graph.

	BOOL m_bShowNodeGroupsAlways; // Specifies whether to always show node groups, even if a non-groupped node is selected (or no nodes are selected).

	XTPFlowGraphConnectorType m_nConnectorType;  // Node connector style.

	double m_dMinZoomLevelBackground;   // Specifies the minimum zoom level to stop drawing the background of the flow graph.  Default is 20%.  Can be used to optimize drawing when a lot of objects are on screen.
	double m_dMinZoomLevelConnectionPoints; // Specifies the minimum zoom level to stop drawing connection points in the flow graph.  Default is 30%.  Can be used to optimize drawing when a lot of objects are on screen.
	double m_dMinZoomLevelConnections; // Specifies the minimum zoom level to stop drawing connections in the flow graph.  Default is 5%.  Can be used to optimize drawing when a lot of objects are on screen.
	double m_dMinZoomLevelGDIQuality; // Specifies the minimum zoom level to stop using GDI quality when drawing elements in the flow graph.  Default is 40%.  Can be used to optimize drawing when a lot of objects are on screen.

protected:


};

#endif //#if !defined(__XTPFLOWGRAPHPAINTMANAGER_H__)
