Click here to Skip to main content
15,885,760 members
Articles / Desktop Programming / MFC

CodePlotter 1.6 - Add and edit diagrams in your code with this 'Visio-like' tool

Rate me:
Please Sign up or sign in to vote.
4.91/5 (160 votes)
27 Sep 200310 min read 363.8K   3.8K   171  
A Visual Studio addin for creating and editing ASCII diagrams in source files
// TextDiagram.h: interface for the CTextDiagram class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_TEXTDIAGRAM_H__F278ECE0_2D7D_49BC_8177_332A79991F34__INCLUDED_)
#define AFX_TEXTDIAGRAM_H__F278ECE0_2D7D_49BC_8177_332A79991F34__INCLUDED_

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

#include <afxtempl.h>

class CTDRect : public CRect
{
public:
	CTDRect(const CRect& rect, LPCTSTR szText = NULL);
	CTDRect(const CTDRect& rect) { *this = rect; }
	CTDRect();
	virtual ~CTDRect();

	const CTDRect& operator=(const CTDRect& rect);

	int GetSide(CPoint point);

	inline void SetText(LPCTSTR szText) { m_sText = szText; }
	inline const CString& GetText() const { return m_sText; }
	inline int GetTextLen() const { return m_sText.GetLength(); }

protected:
	CString m_sText;
};

enum { TDCS_LEFT, TDCS_TOP, TDCS_RIGHT, TDCS_BOTTOM };

class CTDConnection
{
public:
	CTDConnection(int nRectFrom, int nRectTo, int nSideFrom);
	CTDConnection(const CTDConnection& conn) { *this = conn; }
	CTDConnection();
	virtual ~CTDConnection();

	const CTDConnection& operator=(const CTDConnection& conn);

	inline int RectFrom() const { return m_nRectFrom; }
	inline int RectTo() const { return m_nRectTo; }
	inline int SideFrom() const { return m_nSideFrom; }

	void SetRectFrom(int nRect) { m_nRectFrom = nRect; }
	void SetRectTo(int nRect) { m_nRectTo = nRect; }

	void SetStartPos(CPoint ptStart) { m_ptFrom = ptStart; }
	inline CPoint GetStartPos()  const { return m_ptFrom; }
	CPoint GetEndPos(int nNextSegment = 0) const;
	int GetEndDirection(int nNextSegment = 0) const;
	int GetStartDirection() const;
	BOOL PtInConn(CPoint point, BOOL bHorz) const;

	CRect GetBoundingRect() const;
	int GetLength() const;

	void AddSegment(int nSegment);
	void IncrementLastSegment();
	void ResetSegments() { m_aSegments.RemoveAll(); }
	inline int NumSegments() const { return m_aSegments.GetSize(); }
	inline int Segment(int nSegment) const { return (nSegment >= 0 && nSegment < NumSegments()) ? m_aSegments[nSegment] : 0; }
	CPoint GetSegmentPos(int nSegment) const;

	static void Increment(int& nSegment);
	static void Decrement(int& nSegment);

protected:
	int m_nRectFrom, m_nRectTo;
	int m_nSideFrom;
	CPoint m_ptFrom;
	CArray<int, int&> m_aSegments;

};

typedef enum // pos
{
	NONE = -1,

	RECT_LEFT,
	RECT_TOP,
	RECT_RIGHT,
	RECT_BOTTOM,

	CONN_START,
	CONN_END,
	CONN_UP,
	CONN_DOWN,
	CONN_LEFT,
	CONN_RIGHT,

} TDPOS;

class CTextDiagram  
{
public:
	CTextDiagram(LPCTSTR szDiagram = NULL);
	CTextDiagram(const CTextDiagram& diagram) { SetDiagram(diagram); }
	virtual ~CTextDiagram();

	virtual void SetDiagram(const CTextDiagram& diagram);
	void SetDiagram(LPCTSTR szDiagram);
	void SetDiagram(const CStringArray& diagram);
	BOOL GetDiagram(CString& sDiagram, BOOL bVerify = TRUE) const;
	BOOL GetDiagram(CStringArray& diagram, BOOL bVerify = TRUE) const;

	void ResetDiagram();
	BOOL IsEmpty() { return (GetRectCount() == 0); } 

	BOOL IsModified() { return m_bModified; }
	void SetModified(BOOL bModified = TRUE) { m_bModified = bModified; }

	const CString& GetTitle() { return m_sTitle; }
	void SetTitle(LPCTSTR szTitle) { m_sTitle = szTitle; SetModified(); }

	inline int GetRectCount() const { return m_aRects.GetSize(); }
	virtual int AddRect(LPCRECT pRect = NULL, LPCTSTR szText = NULL);
	virtual BOOL DeleteRect(int nRect);
	virtual BOOL SetRect(int nRect, const CTDRect& rect);
	BOOL GetRect(int nRect, CTDRect& rect) const;
	inline BOOL IsValidRect(int nRect) const { return nRect >= 0 && nRect < GetRectCount(); }

	virtual BOOL SetText(int nRect, LPCTSTR szText);
	virtual BOOL GetText(int nRect, CString& sText);

	inline int GetConnectionCount() const { return m_aConns.GetSize(); }
	virtual int AddConnection(int nRectFrom, int nRectTo, int nSideFrom);
	virtual BOOL DeleteConnection(int nConn);
	virtual BOOL SetConnection(int nConn, const CTDConnection& conn);
	BOOL GetConnection(int nConn, CTDConnection& conn) const;
	int FindConnection(int nRectFrom, int nRectTo) const;
	inline BOOL IsValidConnection(int nConn) const { return nConn >= 0 && nConn < GetConnectionCount(); }

	BOOL VerifyDiagram() const;

	static int ConvertDiagram(LPCTSTR szDiagram, CStringArray& aDiagram); // returns number of lines

protected:
	CString m_sTitle;
	CArray<CTDRect, CTDRect&> m_aRects;
	CArray<CTDConnection, CTDConnection&> m_aConns;
	CSize m_size;
	BOOL m_bModified;

protected:
	BOOL operator==(const CTextDiagram& diagram) const;
	const CTextDiagram& operator=(const CTextDiagram& diagram);

	void ProcessDiagram(const CStringArray& diagram);
	void BuildDiagram(CStringArray& diagram) const;

	void AddRect(const CStringArray& diagram, int nX, int nY);
	TDPOS RectGetNextChar(const CStringArray& diagram, TDPOS nCurPos, int& nX, int& nY) const;
	TDPOS RectStartChar(const CStringArray& diagram, int nX, int nY) const;
	void DrawRect(CStringArray& diagram, const CTDRect& rect) const;
	BOOL GetRect(int nRect, CRect& rect) const;
	CRect NewRect(); 

	void AddConn(const CStringArray& diagram, int nX, int nY);
	TDPOS ConnStartChar(const CStringArray& diagram, int nX, int nY) const;
	TDPOS ConnGetNextChar(const CStringArray& diagram, TDPOS nCurPos, int& nX, int& nY) const;
	void DrawConn(CStringArray& diagram, const CTDConnection& conn) const;

	static void GetRelationship(const CRect& rFrom, const CRect& rTo, int& nHorz, int& nVert);
	static void GetRelationship(CPoint ptFrom, const CRect& rTo, int& nHorz, int& nVert);
	static void GetRelationship(CPoint ptFrom, CPoint ptTo, int& nHorz, int& nVert);

	BOOL PtInRect(int nX, int nY) const;
	BOOL PtInConn(int nX, int nY, BOOL bHorz) const;
	BOOL IntersectRect(const CRect& rect, int nIgnoreRect = -1) const;
	BOOL IntersectConn(const CRect& rect) const;
	int IntersectConn(CPoint point, BOOL bHorz) const;
	int IntersectRect(int nX, int nY) const;
	int IntersectRect(CPoint point) const { return IntersectRect(point.x, point.y); }

	void DrawLine(CStringArray& diagram, CPoint ptFrom, CPoint ptTo, const CTDConnection* pConn = NULL) const;
	int PickStartPoint(const CTDConnection& conn, int nIncrement, CPoint& ptStart, int nIgnoreConn = -1) const;
	void RecalcSize();
	BOOL CanAddConnection(const CTDRect& rect, int nSide);
	virtual BOOL RebuildConnections();
	virtual int BuildPath(CTDConnection& conn, int nIgnoreConn);
	void AddTitle(CStringArray& diagram) const;
	void CleanupBacktracks(CTDConnection& conn);

	static int LineLength(const CStringArray& diagram, int nY);
	static BOOL TestChar(const CStringArray& diagram, int nX, int nY, char cTest1, char cTest2 = 0, char cTest3 = 0, char cTest4 = 0);
	static void ExpandTabs(CString& sLine, int nTabSize = 4);
	static char GetChar(const CStringArray& diagram, int nX, int nY);
	static BOOL SetChar(CStringArray& diagram, int nX, int nY, char c);

	// debugging aids
	void TraceDiagram() const;
	static void TraceDiagram(const CStringArray& diagram);

	// to help verification
	int FindRect(LPCRECT pRect) const;
	int FindConn(LPCRECT pFrom, LPCRECT pTo) const;

};

#endif // !defined(AFX_TEXTDIAGRAM_H__F278ECE0_2D7D_49BC_8177_332A79991F34__INCLUDED_)

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Software Developer Maptek
Australia Australia
.dan.g. is a naturalised Australian and has been developing commercial windows software since 1998.

Comments and Discussions