亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? flowchartentitycontainer.cpp

?? CFlowchartEditor is an extension of CDiagramEditor. CDiagramEditor is a vector editor, with a CWnd-d
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
/* ==========================================================================
	CFlowchartEntityContainer

	Author :		Johan Rosengren, Abstrakt Mekanik AB

	Date :			2004-04-29

	Purpose :		CFlowchartEntityContainer is a CDiagramEntityContainer-
					derived class, holding the data for a CFlowchartEditor. 
					In addition to CDiagramEntityContainer, this class keeps 
					and manages a list of links. This includes copy/paste 
					and undo-handling.

	Description :	The class uses a derived CDiagramClipboardHandler.

	Usage :			Use as a normal CDiagramEntityContainer class. The 
					editor class exposes functions for command enabling.

   ========================================================================*/
#include "stdafx.h"
#include "FlowchartEntityContainer.h"
#include <math.h>

CFlowchartEntityContainer::CFlowchartEntityContainer()
/* ============================================================
	Function :		CFlowchartEntityContainer::CFlowchartEntityContainer
	Description :	constructor
					
	Return :		void
	Parameters :	none

	Usage :			

   ============================================================*/
{
}

CFlowchartEntityContainer::~CFlowchartEntityContainer()
/* ============================================================
	Function :		CFlowchartEntityContainer::~CFlowchartEntityContainer
	Description :	destructor
					
	Return :		void
	Parameters :	none

	Usage :			

   ============================================================*/
{

	ClearLinks();
	ClearUndo();

}

BOOL CFlowchartEntityContainer::CreateLink( CFlowchartEntity* from, CFlowchartEntity* to, const CString& title )
/* ============================================================
	Function :		CFlowchartEntityContainer::CreateLink
	Description :	Creates a link between from and to and 
					puts it into the link-array.
					
	Return :		BOOL					-	TRUE if ok.
	Parameters :	CFlowchartEntity* from	-	From-object.
					CFlowchartEntity* to	-	To-object.
					const CString& title	-	Title of link.
					
	Usage :			Call to create a link between from and to.

   ============================================================*/
{

	BOOL result = FALSE;
	int	fromtype = 0;
	int	totype = 0;
	CPoint source;
	CPoint target;

	if( FindClosestLink( from, to, fromtype, totype ) )
	{

		CFlowchartLink* link = new CFlowchartLink;

		link->from = from->GetName();
		link->to = to->GetName();
		link->fromtype = fromtype;
		link->totype = totype;
		link->title = title;

		m_links.Add( link );
		result = TRUE;
	}

	return result;

}

BOOL CFlowchartEntityContainer::HasLinks( CFlowchartEntity* obj1, CFlowchartEntity* obj2 )
/* ============================================================
	Function :		CFlowchartEntityContainer::HasLinks
	Description :	Returns TRUE if obj1 and obj2 are linked 
					to each other or another object using the 
					link-point closest between them..
					
	Return :		BOOL					-	TRUE if obj1 and 
												obj2 has a link
	Parameters :	CFlowchartEntity* obj1	-	First object to 
												test
					CFlowchartEntity* obj2	-	Second object 
												to test
					
	Usage :			Call to see if it is possible to link two 
					objects, or they already have one or both 
					link-points attached.

   ============================================================*/
{

	BOOL result = FALSE;
	CString n1 = obj1->GetName();
	CString n2 = obj2->GetName();
	
	int	fromtype = 0;
	int	totype = 0;
	if( FindClosestLink( obj1, obj2, fromtype, totype ) )
	{
		if( fromtype & LINK_ALL && totype & LINK_ALL )
		{
			// Box-objects
			int max = m_links.GetSize();
			for( int t = 0; t < max ; t++ )
			{
				CFlowchartLink* link = static_cast< CFlowchartLink* >( m_links.GetAt( t ) );
				if( ( link->fromtype == fromtype && link->from == n1 ) || ( link->totype == totype && link->to == n2 ) )
					result = TRUE;
			}
		}
		else
		{
			// Line-objects
			int max = m_links.GetSize();
			for( int t = 0; t < max ; t++ )
			{
				CFlowchartLink* link = static_cast< CFlowchartLink* >( m_links.GetAt( t ) );
				if( ( ( link->fromtype == fromtype && link->from == n1 ) && ( link->totype == totype && link->to == n2 ) ) ||
					( ( link->fromtype == totype && link->to == n1 ) && ( link->totype == fromtype && link->from == n2 ) ) )
					result = TRUE;
			}
		}
	}

	return result;

}

BOOL CFlowchartEntityContainer::FindClosestLink( CFlowchartEntity* obj1, CFlowchartEntity* obj2, int& fromtype, int& totype )
/* ============================================================
	Function :		CFlowchartEntityContainer::FindClosestLink
	Description :	Finds the closet link types between two 
					objects.
					
	Return :		BOOL					-	TRUE if the 
												objects can be 
												linked.
	Parameters :	CFlowchartEntity* obj1	-	First object 
												to link
					CFlowchartEntity* obj2	-	Second object 
												to link
					int& fromtype			-	Type of link for the first object
					int& totype				-	Type of link for the second object.
					
	Usage :			The link types can be:
					LINK_TOP		Top of the object.
					LINK_BOTTOM		Bottom of the object.
					LINK_LEFT		To the left of the object.
					LINK_RIGHT		To the right of the object.
					LINK_START		To the start of the line (normally 
									the top-left corner of 
									the non-normalized bounding 
									rect).
					LINK_END		To the end of the line 
									(normally the bottom-right 
									corner of the non-normalized 
									bounding rect).

   ============================================================*/
{

	BOOL result = TRUE;
	CPoint start;
	CPoint end;
	double diff2 = 0;
	double diff1 = 0x7FFFFFFF;

	// We go through all the allowed links for obj1, and get the 
	// distance between the inspected link point and the allowed 
	// link points of obj2. Shortest distance wins!

	if( ( obj1->AllowLink() & LINK_LEFT ) )
	{
		start = obj1->GetLinkPosition( LINK_LEFT );
		if( ( obj2->AllowLink() & LINK_START ) && ( obj2->AllowLink() & LINK_END ))
		{
			end = obj2->GetLinkPosition( LINK_START );
			diff2 = Dist( start, end );
			if( diff2 <= diff1 && start.x > end.x )
			{
				fromtype = LINK_LEFT;
				totype = LINK_START;
				diff1 = diff2;
			}

			end = obj2->GetLinkPosition( LINK_END );
			diff2 = Dist( start, end );
			if( diff2 <= diff1 && start.x > end.x )
			{
				fromtype = LINK_LEFT;
				totype = LINK_END;
				diff1 = diff2;
			}
		}
		else
		{
			end = obj2->GetLinkPosition( LINK_RIGHT );
			diff2 = Dist( start, end );
			if( diff2 <= diff1 && start.x > end.x )
			{
				fromtype = LINK_LEFT;
				totype = LINK_RIGHT;
				diff1 = diff2;
			}
		}
	}

	if( ( obj1->AllowLink() & LINK_RIGHT ) )
	{
		start = obj1->GetLinkPosition( LINK_RIGHT );
		if( ( obj2->AllowLink() & LINK_START ) && ( obj2->AllowLink() & LINK_END ))
		{
			end = obj2->GetLinkPosition( LINK_START );
			diff2 = Dist( start, end );
			if( diff2 <= diff1 && end.x > start.x )
			{
				fromtype = LINK_RIGHT;
				totype = LINK_START;
				diff1 = diff2;
			}

			end = obj2->GetLinkPosition( LINK_END );
			diff2 = Dist( start, end );
			if( diff2 <= diff1 && end.x > start.x )
			{
				fromtype = LINK_RIGHT;
				totype = LINK_END;
				diff1 = diff2;
			}
		}
		else
		{
			end = obj2->GetLinkPosition( LINK_LEFT );
			diff2 = Dist( start, end );
			if( diff2 <= diff1 && end.x > start.x )
			{
				fromtype = LINK_RIGHT;
				totype = LINK_LEFT;
				diff1 = diff2;
			}
		}
	}

	if( ( obj1->AllowLink() & LINK_TOP ) )
	{
		start = obj1->GetLinkPosition( LINK_TOP );
		if( ( obj2->AllowLink() & LINK_START ) && ( obj2->AllowLink() & LINK_END ))
		{
			end = obj2->GetLinkPosition( LINK_START );
			diff2 = Dist( start, end );
			if( diff2 < diff1 && start.y > end.y )
			{
				fromtype = LINK_TOP;
				totype = LINK_START;
				diff1 = diff2;
			}
			end = obj2->GetLinkPosition( LINK_END );
			diff2 = Dist( start, end );
			if( diff2 < diff1 && start.y > end.y )
			{
				fromtype = LINK_TOP;
				totype = LINK_END;
				diff1 = diff2;
			}
		}
		else
		{
			end = obj2->GetLinkPosition( LINK_BOTTOM );
			diff2 = Dist( start, end );
			if( diff2 < diff1 && start.y > end.y )
			{
				fromtype = LINK_TOP;
				totype = LINK_BOTTOM;
				diff1 = diff2;
			}
		}
	}

	if( ( obj1->AllowLink() & LINK_BOTTOM ) )
	{
		start = obj1->GetLinkPosition( LINK_BOTTOM );
		if( ( obj2->AllowLink() & LINK_START ) && ( obj2->AllowLink() & LINK_END ))
		{
			end = obj2->GetLinkPosition( LINK_START );
			diff2 = Dist( start, end );
			if( diff2 <= diff1 && end.y > start.y )
			{
				fromtype = LINK_BOTTOM;
				totype = LINK_START;
				diff1 = diff2;
			}
			end = obj2->GetLinkPosition( LINK_END );
			diff2 = Dist( start, end );
			if( diff2 <= diff1 && end.y > start.y )
			{
				fromtype = LINK_BOTTOM;
				totype = LINK_END;
				diff1 = diff2;
			}
		}
		else
		{
			end = obj2->GetLinkPosition( LINK_TOP );
			diff2 = Dist( start, end );
			if( diff2 <= diff1 && end.y > start.y )
			{
				fromtype = LINK_BOTTOM;
				totype = LINK_TOP;
				diff1 = diff2;
			}
		}
	}

	int sum2 = 0;
	if( ( obj1->AllowLink() & LINK_START ) )
	{
		start = obj1->GetLinkPosition( LINK_START );

		if( obj2->AllowLink() & LINK_START )
		{
			end = obj2->GetLinkPosition( LINK_START );
			diff2 = Dist( start, end );
			if( diff2 < diff1 )
			{
				fromtype = LINK_START;
				totype = LINK_START;
				diff1 = diff2;
			}
		}

		if( obj2->AllowLink() & LINK_END )
		{
			end = obj2->GetLinkPosition( LINK_END );
			diff2 = Dist( start, end );
			if( diff2 < diff1 )
			{
				fromtype = LINK_START;
				totype = LINK_END;
				diff1 = diff2;
			}
		}

		if( obj2->AllowLink() & LINK_LEFT )
		{
			end = obj2->GetLinkPosition( LINK_LEFT );
			diff2 = Dist( start, end );
			if( diff2 < diff1 && start.x <= end.x)
			{
				fromtype = LINK_START;
				totype = LINK_LEFT;
				diff1 = diff2;
			}
		}

		if( obj2->AllowLink() & LINK_RIGHT )
		{
			end = obj2->GetLinkPosition( LINK_RIGHT );
			diff2 = Dist( start, end );
			if( diff2 < diff1 && start.x >= end.x )
			{
				fromtype = LINK_START;
				totype = LINK_RIGHT;
				diff1 = diff2;
			}
		}

		if( obj2->AllowLink() & LINK_TOP )
		{
			end = obj2->GetLinkPosition( LINK_TOP );
			diff2 = Dist( start, end );
			if( diff2 < diff1 && start.y <= end.y )
			{
				fromtype = LINK_START;
				totype = LINK_TOP;
				diff1 = diff2;
			}
		}

		if( obj2->AllowLink() & LINK_BOTTOM )
		{
			end = obj2->GetLinkPosition( LINK_BOTTOM );
			diff2 = Dist( start, end );
			if( diff2 < diff1 && start.y >= end.y )
			{
				fromtype = LINK_START;
				totype = LINK_BOTTOM;
				diff1 = diff2;
			}
		}

	}

	if( ( obj1->AllowLink() & LINK_END ) )
	{
		start = obj1->GetLinkPosition( LINK_END );
		if( obj2->AllowLink() & LINK_START )
		{
			end = obj2->GetLinkPosition( LINK_START );
			diff2 = Dist( start, end );
			if( diff2 < diff1 )
			{
				fromtype = LINK_END;
				totype = LINK_START;
				diff1 = diff2;
			}
		}

		if( obj2->AllowLink() & LINK_END )
		{
			end = obj2->GetLinkPosition( LINK_END );
			diff2 = Dist( start, end );
			if( diff2 < diff1 )
			{
				fromtype = LINK_END;
				totype = LINK_END;
				diff1 = diff2;
			}
		}

		if( obj2->AllowLink() & LINK_LEFT )
		{
			end = obj2->GetLinkPosition( LINK_LEFT );
			diff2 = Dist( start, end );
			if( diff2 < diff1 && start.x <= end.x )
			{
				fromtype = LINK_END;
				totype = LINK_LEFT;
				diff1 = diff2;
			}
		}

		if( obj2->AllowLink() & LINK_RIGHT )
		{
			end = obj2->GetLinkPosition( LINK_RIGHT );
			diff2 = Dist( start, end );
			if( diff2 < diff1 && start.x >= end.x )
			{
				fromtype = LINK_END;
				totype = LINK_RIGHT;
				diff1 = diff2;
			}
		}

		if( obj2->AllowLink() & LINK_TOP )
		{
			end = obj2->GetLinkPosition( LINK_TOP );
			diff2 = Dist( start, end );
			if( diff2 < diff1 && start.y <= end.y )
			{
				fromtype = LINK_END;
				totype = LINK_TOP;
				diff1 = diff2;
			}
		}

		if( obj2->AllowLink() & LINK_BOTTOM )
		{
			end = obj2->GetLinkPosition( LINK_BOTTOM );
			diff2 = Dist( start, end );
			if( diff2 < diff1 && start.y >= end.y )
			{
				fromtype = LINK_END;
				totype = LINK_BOTTOM;
				diff1 = diff2;
			}
		}

	}

	// To be really, really sure
	if( !( obj1->AllowLink() & fromtype ) )
	{
		result = FALSE;
		fromtype = 0;
	}

	if( !( obj2->AllowLink() & totype ) )
	{
		result = FALSE;
		totype = 0;
	}

	return result;

}

CFlowchartLink* CFlowchartEntityContainer::GetLinkAt( int index )
/* ============================================================
	Function :		CFlowchartEntityContainer::GetLinkAt
	Description :	Returns the CFlowchartLink object at 
					position index in the internal data array.
					
	Return :		CFlowchartLink*	-	Object at index. NULL 
										if not a CFlowchartLink 
										or out of bounds.
	Parameters :	int index		-	The index in the data 
										array.
					
	Usage :			Call to get the object at index, or to check 
					if the object is a CFlowchartLink-object.

   ============================================================*/
{

	CFlowchartLink* result = NULL;
	if( index < GetLinks() )
		result = static_cast< CFlowchartLink* >( m_links[ index ] );

	return result;

}

int CFlowchartEntityContainer::GetLinks()
/* ============================================================
	Function :		CFlowchartEntityContainer::GetLinks
	Description :	Returns the number of links in the link 
					array.
					
	Return :		int		-	The current number of links.
	Parameters :	none

	Usage :			Call to get the current number of links.

   ============================================================*/
{

	return m_links.GetSize();

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
《视频一区视频二区| 激情综合网av| 韩国v欧美v日本v亚洲v| 99久久精品国产观看| 日韩视频在线你懂得| 国产精品你懂的在线| 美女视频一区二区| 色老汉一区二区三区| 国产欧美日韩中文久久| 亚洲成人精品一区| 99re热这里只有精品视频| 久久色中文字幕| 麻豆精品新av中文字幕| 欧美日韩电影一区| 亚洲女人小视频在线观看| 国产999精品久久久久久| 日韩午夜在线观看| 免费在线观看一区二区三区| 一本在线高清不卡dvd| 中文字幕一区二区三区在线播放 | 中文一区一区三区高中清不卡| 免费观看久久久4p| 3d动漫精品啪啪一区二区竹菊| 亚洲蜜桃精久久久久久久| 国产成人精品免费网站| 日韩免费视频线观看| 日韩av电影一区| 欧美日韩国产天堂| 视频一区二区不卡| 欧美熟乱第一页| 亚洲主播在线播放| 欧洲生活片亚洲生活在线观看| 日韩国产欧美三级| 欧美视频一区在线| 亚洲国产成人av| 欧美巨大另类极品videosbest| 亚洲成人一区二区在线观看| 欧美亚洲国产怡红院影院| 亚洲一区二区影院| 欧美老肥妇做.爰bbww| 日本亚洲一区二区| 精品国产一区久久| 国产盗摄视频一区二区三区| 国产欧美一区二区精品秋霞影院| 成人综合激情网| 综合分类小说区另类春色亚洲小说欧美| 日韩午夜av电影| 精品中文av资源站在线观看| 国产亚洲一区二区三区在线观看| 国产精品一区二区果冻传媒| 中文字幕制服丝袜一区二区三区| 91电影在线观看| 久久99精品久久久久久久久久久久| 久久久久久久性| 色综合久久久网| 免费看日韩a级影片| 日本一区二区三区在线不卡| 91蜜桃网址入口| 蜜臀91精品一区二区三区| 国产亚洲精品资源在线26u| av在线播放成人| 天堂一区二区在线| 国产午夜精品在线观看| 在线免费观看视频一区| 美女爽到高潮91| 1000精品久久久久久久久| 91国偷自产一区二区开放时间 | 精品av久久707| av亚洲精华国产精华精华| 无码av免费一区二区三区试看| 亚洲精品一区二区三区影院 | 久久福利资源站| 亚洲人吸女人奶水| 日韩免费电影网站| 91黄色免费网站| 国产成人免费视频| 三级影片在线观看欧美日韩一区二区| 国产午夜久久久久| 欧美精品 国产精品| 成人av网址在线观看| 日韩电影一区二区三区| 国产精品麻豆视频| 欧美videofree性高清杂交| 色88888久久久久久影院按摩| 国产一区二区精品久久| 国产成人在线观看| 亚洲大尺度视频在线观看| 中文文精品字幕一区二区| 日韩欧美自拍偷拍| 欧美日本一区二区三区四区| aaa国产一区| 国产精品夜夜嗨| 日本不卡不码高清免费观看| 一区二区三区蜜桃网| 国产午夜久久久久| 欧美成va人片在线观看| 欧美日韩综合一区| 日本高清无吗v一区| 成人综合婷婷国产精品久久免费| 蜜臀91精品一区二区三区| 五月天欧美精品| 亚洲va欧美va人人爽| 亚洲精品国产a| 亚洲色图一区二区三区| 中文字幕中文字幕在线一区| 久久久精品国产免大香伊| 精品国产一区二区在线观看| 欧美一级日韩不卡播放免费| 欧美日韩一区二区电影| 欧美优质美女网站| 欧美在线观看禁18| 在线亚洲人成电影网站色www| 99re视频精品| 91国偷自产一区二区使用方法| 色婷婷av一区二区| 欧美视频中文字幕| 欧美无砖专区一中文字| 欧美日韩大陆一区二区| 欧美人与性动xxxx| 欧美一级理论性理论a| 欧美一区二区三区在线| 日韩欧美成人激情| 久久先锋影音av鲁色资源网| 日韩av在线免费观看不卡| 亚洲国产你懂的| 婷婷丁香久久五月婷婷| 免费成人在线观看| 国产在线精品不卡| fc2成人免费人成在线观看播放| jiyouzz国产精品久久| 色综合视频在线观看| 欧美性感一区二区三区| 欧美一级黄色片| 国产亚洲一区二区在线观看| 日韩一区在线看| 午夜日韩在线电影| 国产一区中文字幕| 一本大道av一区二区在线播放| 在线日韩国产精品| 日韩精品在线一区| 国产精品灌醉下药二区| 亚洲国产一区视频| 加勒比av一区二区| 色悠悠久久综合| 日韩欧美一级片| 国产精品不卡一区二区三区| 婷婷亚洲久悠悠色悠在线播放| 韩国精品一区二区| 91丝袜美女网| 欧美成人精品二区三区99精品| 国产精品色哟哟网站| 天使萌一区二区三区免费观看| 国产露脸91国语对白| 91福利视频网站| 久久精品免费在线观看| 一级精品视频在线观看宜春院| 理论电影国产精品| 91精品办公室少妇高潮对白| 精品欧美一区二区久久| 一区二区三区精品| 国产精品主播直播| 69堂亚洲精品首页| 亚洲精品水蜜桃| 国产成人午夜片在线观看高清观看| 欧美性猛片aaaaaaa做受| 久久久夜色精品亚洲| 五月婷婷久久综合| 成人黄色一级视频| 欧美白人最猛性xxxxx69交| 亚洲免费观看高清| 国产不卡高清在线观看视频| 在线播放国产精品二区一二区四区| 国产精品嫩草99a| 国产露脸91国语对白| 666欧美在线视频| 亚洲一区视频在线| 91老师片黄在线观看| 欧美激情一区二区在线| 精品一区二区三区av| 欧美日韩国产综合草草| 亚洲免费在线观看| 99久久精品一区| 中文字幕乱码日本亚洲一区二区| 精品一区二区在线播放| 91精品国产欧美一区二区| 亚洲一区二区三区四区五区中文| av一区二区久久| 成人欧美一区二区三区在线播放| 国产精品自拍三区| 久久久久9999亚洲精品| 国模大尺度一区二区三区| 日韩三级在线观看| 日本美女一区二区三区视频| 欧美精品电影在线播放| 性做久久久久久| 制服丝袜在线91| 蜜臀av性久久久久蜜臀aⅴ四虎 | 日本中文在线一区| 欧美一区二区三区小说| 青青草国产成人av片免费|