You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

453 lines
17 KiB
C++

// XTPFlowGraphPage.h: interface for the CXTPFlowGraphPage class.
//
// This file is a part of the XTREME TOOLKIT PRO 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(__XTPFLOWGRAPHPAGE_H__)
#define __XTPFLOWGRAPHPAGE_H__
//}}AFX_CODEJOCK_PRIVATE
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class CXTPFlowGraphControl;
class CXTPFlowGraphNodes;
class CXTPFlowGraphNodeGroups;
class CXTPFlowGraphConnections;
class CXTPFlowGraphDrawContext;
class CXTPPropExchange;
class CXTPFlowGraphNode;
class CXTPFlowGraphSelectedElements;
class CXTPFlowGraphConnection;
// ----------------------------------------------------------------------
//
// Summary:
// Represents a page in the flow graph.
//
// Remarks:
// A page is what contains all the elements in the flow graph. The
// flow graph can contain many pages, each of which can contain
// nodes, node groups and connections. A page is the first thing that
// you must add to the flow graph, then you can add elements to the
// pages.
// ----------------------------------------------------------------------
class _XTP_EXT_CLASS CXTPFlowGraphPage : public CXTPCmdTarget
{
DECLARE_SERIAL(CXTPFlowGraphPage);
public:
// ------------------------------------------
// Summary:
// Constructs a CXTPFlowGraphPage object.
// ------------------------------------------
CXTPFlowGraphPage();
protected:
// ------------------------------------------------------------
// Summary:
// Destroys a CXTPFlowGraphPage object, handles cleanup and
// deallocation.
// ------------------------------------------------------------
virtual ~CXTPFlowGraphPage();
public:
// -----------------------------------------------------------------------
// Summary:
// Gets a collection of all nodes that have been added to this page.
// Remarks:
// Nodes are the main objects that are displayed in the flow graph. In
// terms of a database they can be thought of as the tables in the
// database. The nodes contain many connection points, which are like
// the fields in a table. Finally there are connections that are used
// to draw a relationship between the field of two tables.
// Returns:
// A collection of all nodes that have been added to this page.
// -----------------------------------------------------------------------
CXTPFlowGraphNodes* GetNodes() const;
// ----------------------------------------------------------------------
// Summary:
// Gets a collection of all groups that have been added to this page.
// Remarks:
// A group is just a "box" that is used to visually group nodes
// together. By default the group will only be shown when a node in
// the group is selected, but you can choose to always show the
// groups with ShowNodeGroupsAlways.
// Returns:
// A collection of all groups that have been added to this page.
// ----------------------------------------------------------------------
CXTPFlowGraphNodeGroups* GetGroups() const;
// -----------------------------------------------------
// Summary:
// Gets a reference to the parent FlowGraph control.
// Returns:
// A reference to the parent FlowGraph control.
// -----------------------------------------------------
CXTPFlowGraphControl* GetControl() const;
// ----------------------------------------------------------------------
// Summary:
// Gets a collection of all connections that have been added to this
// page.
// Returns:
// A collection of all connections that have been added to this page.
// ----------------------------------------------------------------------
CXTPFlowGraphConnections* GetConnections() const;
public:
// --------------------------------
// Summary:
// Sets the ID for this page.
// Parameters:
// nId : New ID for this page.
// --------------------------------
void SetID(int nId);
// ------------------------------
// Summary:
// Gets the ID for this page.
// Returns:
// The ID for this page.
// ------------------------------
int GetID() const;
// ---------------------------------------------
// Summary:
// Sets the caption of this page.
// Parameters:
// lpszCaption : New caption for this page.
// ---------------------------------------------
void SetCaption(LPCTSTR lpszCaption);
// ----------------------------------
// Summary:
// Gets the caption of this page.
// Returns:
// The caption of this page.
// ----------------------------------
CString GetCaption() const;
public:
// -----------------------------------------------------------------
// Summary:
// This method is called when the flow graph layout has changed.
// Remarks:
// This is called when the page zoom level, page scroll offset,
// window\\node size, window handle, node style, node color, or
// connection style is changed.
// -----------------------------------------------------------------
virtual void OnGraphChanged();
// ------------------------------------------------------------------
// Summary:
// This method is called to contents of the page to their correct
// positions.
// Parameters:
// pDC : Pointer to a valid device context.
// rcPage : Bounding rectangle of the page.
// ------------------------------------------------------------------
virtual void Reposition(CXTPFlowGraphDrawContext* pDC, CRect rcPage);
// -------------------------------------------------
// Summary:
// This method is called when the page is drawn.
// Parameters:
// pDC : Pointer to a valid device context.
// -------------------------------------------------
virtual void OnDraw(CXTPFlowGraphDrawContext* pDC);
// ----------------------------------------------------------------------
// Summary:
// Converts the page coordinates of a given point or rectangle on the
// display to screen coordinates.
// Parameters:
// lpRect : Points to a RECT structure or CRect object that contains
// the page coordinates to be converted.
//
// Remarks:
// The PageToScreen member function uses the page coordinates in the
// POINT or RECT structure or the CPoint or CRect object pointed to
// by lpPoint or lpRect to compute new screen coordinates. It then
// replaces the coordinates in the structure with the new
// coordinates. The new screen coordinates are relative to the
// upper-left corner of the system display.
//
// The PageToScreen member function assumes that the given point or
// rectangle is in page coordinates.
// ----------------------------------------------------------------------
CRect PageToScreen(LPCRECT lpRect) const;
// ---------------------------------------------------------------------
// Summary:
// Converts the screen coordinates of a given x\\y coordinate on the
// display to page coordinates.
// Parameters:
// y : y coordinate that contains the y coordinate to be converted.
// x : x coordinate that contains the x coordinate to be converted.
// Remarks:
// The ScreenToPage member function replaces the screen coordinates
// given in x\\y coorninates. The new
// coordinates are relative to the upper-left corner of the page
// area.
// ---------------------------------------------------------------------
void ScreenToPage(double& x, double& y) const;
// -----------------------------------------------------------------------
// Summary:
// Converts the screen coordinates of a given point or rectangle on
// the display to page coordinates.
// Parameters:
// point : Points to a CPoint object or POINT structure that contains
// the screen coordinates to be converted.
// Remarks:
// The ScreenToPage member function replaces the screen coordinates
// given in lpPoint or lpRect with page coordinates. The new
// coordinates are relative to the upper-left corner of the page
// area.
// -----------------------------------------------------------------------
CPoint ScreenToPage(CPoint point) const;
// --------------------------------------------------------------------
// Summary:
// Converts the screen coordinates of a given point or rectangle on
// the display to page coordinates.
// Parameters:
// lpRect : Points to a CPoint object or POINT structure that
// contains the screen coordinates to be converted.
// Remarks:
// The ScreenToPage member function replaces the screen coordinates
// given in lpPoint or lpRect with page coordinates. The new
// coordinates are relative to the upper-left corner of the page
// area.
//
// --------------------------------------------------------------------
CRect ScreenToPage(LPCRECT lpRect) const;
// -------------------------------------------------------------------
// Summary:
// Call this method to copy all the currently selected elements to
// the flow graphs clipboard.
// -------------------------------------------------------------------
virtual void Copy();
// -------------------------------------------------------------
// Summary:
// Call this method to paste the contents of the flow graphs
// clipboard to the currently active page.
// -------------------------------------------------------------
virtual void Paste();
// ----------------------------------------------------------------------
// Summary:
// Specifies whether the flow control can perform a paste operation.
// Remarks:
// There must be something in the control's clipboard from a previous
// copy\\cut before a paste operation can be performed.
// Returns:
// True if the flow control can perform a paste operation.
// ----------------------------------------------------------------------
virtual BOOL CanPaste();
// -------------------------------------------------------------------
// Summary:
// Call this method to copy all the currently selected elements to
// the flow graphs clipboard and then remove the selected contents
// from the active page.
// -------------------------------------------------------------------
virtual void Cut();
// ------------------------------------------
// Summary:
// Removes this page from the flow graph.
// ------------------------------------------
void Remove();
// ------------------------------------------------------------------
// Summary:
// Auto-Arranges the nodes in this page.
// Remarks:
// This will left-align all nodes in this page, nodes with
// connections will be placed to the right of the connected node.
// ------------------------------------------------------------------
virtual void Arrange();
public:
// ----------------------------------------------------------------------
// Summary:
// Gets a reference to the collection of selected elements in the
// Flow Graph in this page.
// Remarks:
// Selected elements will include Nodes, Connections and Connection
// Points. This collection can be used to add or remove elements
// to\\from the selection. Elements can be selected with the mouse or
// using methods in code.
// Returns:
// A reference to the collection of selected elements in the Flow
// Graph in this page.
// ----------------------------------------------------------------------
CXTPFlowGraphSelectedElements* GetSelection() const;
public:
// ----------------------------------------------
// Summary:
// Gets the bounding rectangle for this page.
// Returns:
// The bounding rectangle for this page.
// ----------------------------------------------
CRect GetPageRect() const;
// ----------------------------------------------------------------------
// Summary:
// Gets the scroll offset (how much the page has been scrolled). This
// \returns the X/Y coordinates - left/right offset.
// Returns:
// The scroll offset (how much the page has been scrolled). This
// \returns a point that contains the X/Y coordinates - left/right
// \offset.
// ----------------------------------------------------------------------
CPoint GetScrollOffset() const;
// ----------------------------------------------------------------------
// Summary:
// Sets the scroll offset (how much the page has been scrolled). This
// \returns the X coordinate - left/right offset.
// Parameters:
// ptScrollOffset : Point to scroll to.
// ----------------------------------------------------------------------
void SetScrollOffset(CPoint ptScrollOffset);
// --------------------------------------------
// Summary:
// Gets the current zoom level of the page.
// Remarks:
// 0.0 is 0 zoom and 1.0 is 100% zoom.
// Returns:
// The current zoom level of the page.
//
//
// --------------------------------------------
double GetZoomLevel() const;
// ------------------------------------------------
// Summary:
// Sets the current zoom level of the page.
// Parameters:
// dZoomLevel : Zoom level to set the page to.
//
// Remarks:
// 0.0 is 0 zoom and 1.0 is 100% zoom.
// ------------------------------------------------
void SetZoomLevel(double dZoomLevel);
protected:
// ---------------------------------------------------
// Summary:
// This method is called when the page is removed.
// ---------------------------------------------------
virtual void OnRemoved();
public:
// ------------------------------------------------------------------------
// Summary:
// Call this member function to Store/Load a page using the specified
// data object.
// Parameters:
// pPX : Source or destination CXTPPropExchange data object reference.
// Remarks:
// This member function is used to store or load page data to or from
// a storage.
// ------------------------------------------------------------------------
virtual void DoPropExchange(CXTPPropExchange* pPX);
private:
//{{AFX_CODEJOCK_PRIVATE
void SetArrangeLevel(int v, CArray<CDWordArray*, CDWordArray*>& graph);
int SetArrangeLocation(int v, int x, int y, int nLevelWidth, CArray<CDWordArray*, CDWordArray*>& graph);
//}}AFX_CODEJOCK_PRIVATE
public:
static CLIPFORMAT m_cfNode; // Clipboard format.
protected:
CXTPFlowGraphControl* m_pControl; // Pointer to the parent flow graph control.
CXTPFlowGraphNodes* m_pNodes; // Collection of nodes that are displayed on this page.
CXTPFlowGraphNodeGroups* m_pGroups; // Collection of groups that are displayed on this page.
CXTPFlowGraphConnections* m_pConnections; // Collection of connections that are used in this page.
CXTPFlowGraphSelectedElements* m_pSelectedElements; // Colleciton of elements that are used in this page.
CXTPFlowGraphNode* m_pFirstVisibleNode; // Pointer to the first visible node in the page.
CXTPFlowGraphConnection* m_pFirstVisibleConnection; // Pointer to the first visible connection in the page.
CRect m_rcPage; // Bounding rectangle for this page.
CRect m_rcWorkRect; // Rectangle for the currently visible portion of the page (it might be zoomed or scrolled).
CPoint m_ptScrollOffset; // The scroll offset (how much the page has been scrolled). This returns the X and Y coordinates - up/down offset.
double m_dZoomLevel; // Current zoom level of the page.
int m_nId; // Id of the page.
CString m_strCaption; // Caption of the page.
friend class CXTPFlowGraphPages;
friend class CXTPFlowGraphControl;
};
AFX_INLINE CXTPFlowGraphSelectedElements* CXTPFlowGraphPage::GetSelection() const {
return m_pSelectedElements;
}
AFX_INLINE CXTPFlowGraphNodes* CXTPFlowGraphPage::GetNodes() const {
return m_pNodes;
}
AFX_INLINE CXTPFlowGraphNodeGroups* CXTPFlowGraphPage::GetGroups() const {
return m_pGroups;
}
AFX_INLINE CXTPFlowGraphConnections* CXTPFlowGraphPage::GetConnections() const {
return m_pConnections;
}
AFX_INLINE CXTPFlowGraphControl* CXTPFlowGraphPage::GetControl() const {
return m_pControl;
}
AFX_INLINE CRect CXTPFlowGraphPage::GetPageRect() const {
return m_rcPage;
}
AFX_INLINE CPoint CXTPFlowGraphPage::GetScrollOffset() const {
return m_ptScrollOffset;
}
AFX_INLINE void CXTPFlowGraphPage::SetScrollOffset(CPoint ptScrollOffset) {
m_ptScrollOffset = ptScrollOffset;
OnGraphChanged();
}
AFX_INLINE void CXTPFlowGraphPage::SetID(int nId) {
m_nId = nId;
}
AFX_INLINE int CXTPFlowGraphPage::GetID() const {
return m_nId;
}
AFX_INLINE CString CXTPFlowGraphPage::GetCaption() const {
return m_strCaption;
}
AFX_INLINE void CXTPFlowGraphPage::SetCaption(LPCTSTR lpszCaption) {
m_strCaption = lpszCaption;
}
AFX_INLINE double CXTPFlowGraphPage::GetZoomLevel() const {
return m_dZoomLevel;
}
AFX_INLINE void CXTPFlowGraphPage::SetZoomLevel(double dZoomLevel) {
m_dZoomLevel = dZoomLevel;
OnGraphChanged();
}
#endif //#if !defined(__XTPFLOWGRAPHPAGE_H__)