using System;
using System.ComponentModel;
namespace DevComponents.Tree
{
	/// 
	/// Represents a description of linked node and any connector points that link nodes.
	/// 
	public class LinkedNode
	{
		#region Private Variables
		private ConnectorPointsCollection m_ConnectorPoints=null;
		private Node m_Node=null;
		private Node m_Parent=null;
		#endregion
		
		#region Internal Implementation
		/// 
		/// Creates new instance of the object.
		/// 
		public LinkedNode()
		{
			m_ConnectorPoints=new ConnectorPointsCollection();
		}
		
		/// 
		/// Creates new instance of the object.
		/// 
		/// Linkded node to initialize new instace with.
		public LinkedNode(Node linkedNode) : this()
		{
			this.Node = linkedNode;
		}
		
		/// 
		/// Creates new instance of the object.
		/// 
		/// Linkded node to initialize new instace with.
		/// Connector points collection to initialize new instance with.
		public LinkedNode(Node linkedNode, ConnectorPointsCollection connectorPoints) : this()
		{
			this.Node = linkedNode;
			if(connectorPoints!=null)
			{
				m_ConnectorPoints = connectorPoints;
				m_ConnectorPoints.SetParentNode(m_Parent);
			}
		}
		
		/// 
		/// Gets or sets reference to linked node.
		/// 
		/// 
		/// Linked nodes are nodes that are related to given node but do not have strict
		/// parent child relationship with the node. Each linked node must be already added as
		/// child node to some other node or it will not be displayed. Linked nodes are used in Map
		/// and Diagram layout styles to indicates relationships between nodes. Also See TreeGX.LinkConnector property.
		/// 
		[Browsable(true), DefaultValue(null)]
		public Node Node
		{
			get { return m_Node;}
			set { m_Node = value;}
		}
		
		/// 
		/// Gets the collection of the link connector line relative points. If a node has a link to this node through LinkedNodes collection
		/// this these points outline the path connector will be drawn through from this node to it's parent linked node. By default this collection is empty which indicates that
		/// connector line is drawn using predefined path. Points added here are the points through which the connector line will travel to the
		/// parent node. The point coordinates added to this collection are relative from the top-left corner of this node.
		/// 
		[Browsable(true),Category("Connectors"),DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
		public ConnectorPointsCollection ConnectorPoints
		{
			get {return m_ConnectorPoints;}
		}
		
		/// 
		/// Gets the Node this linked node description is attached to.
		/// 
		[Browsable(false)]
		public Node Parent
		{
			get { return m_Parent;}
		}
		
		/// 
		/// Sets the parent node.
		/// 
		/// Reference to parent node.
		internal void SetParent(Node node)
		{
			m_Parent = node;
			m_ConnectorPoints.SetParentNode(node);
		}
		#endregion
	}
}