protected ComplexLine(SerializationInfo info, StreamingContext context): base(info,context)
		{
			SuspendEvents = true;
			mSegments = (Segments) info.GetValue("Segments",typeof(Segments));
			if (Serialize.Contains(info,"AllowExpand")) mAllowExpand = info.GetBoolean("AllowExpand");
			
			SuspendEvents = false;
		}
		public ComplexLine(Port start,Port end): base(start,end)
		{
			mSegments = new Segments();
			Segment segment = new Segment(Start,End);
			Segments.Add(segment);
			segment.SegmentInvalid += new EventHandler(segment_SegmentInvalid);

			AllowExpand = true;
		}
		public ComplexLine(ComplexLine prototype): base (prototype)
		{
			mSegments = new Segments();
			Segment segment = new Segment(Start, End);
			Segments.Add(segment);
			segment.SegmentInvalid += new EventHandler(segment_SegmentInvalid);

			//Set up segments
			for (int i = 0; i < prototype.Segments.Count-1; i++)
			{
				segment = AddSegment(i+1,new Origin((PointF) prototype.Points[i+1])); 
				segment.Start.Marker = prototype.Segments[i+1].Start.Marker;
			}
			DrawPath();

			AllowExpand = prototype.AllowExpand;
		}
        public ComplexLine(ComplexLine prototype) : base(prototype)
        {
            mSegments = new Segments();
            Segment segment = new Segment(Start, End);

            Segments.Add(segment);
            segment.SegmentInvalid += new EventHandler(segment_SegmentInvalid);

            //Set up segments
            for (int i = 0; i < prototype.Segments.Count - 1; i++)
            {
                segment = AddSegment(i + 1, new Origin((PointF)prototype.Points[i + 1]));
                segment.Start.Marker = prototype.Segments[i + 1].Start.Marker;
            }
            DrawPath();

            AllowExpand = prototype.AllowExpand;
        }
        public virtual void RemoveSegment(int position)
        {
            //Valid the position
            if (position < 1)
            {
                throw new ArgumentException("Position must be greater than zero.", "position");
            }
            if (position > Segments.Count)
            {
                throw new ArgumentException("Position can be greater than the total number of segments.", "position");
            }

            Origin end = Segments[position].End;

            Segments.RemoveAt(position);
            Segments[position - 1].SetEnd(end);

            DrawPath();
            OnElementInvalid();
        }
		protected internal void SetSegments(Segments segments)
		{
			if (mSegments != null)
			{
				foreach (Segment segment in mSegments)
				{
					segment.SegmentInvalid -= new EventHandler(segment_SegmentInvalid);
				
					if (segment.End != End) segment.End.OriginInvalid -=new EventHandler(Origin_OriginInvalid);
				}
			}

			mSegments = segments;
			foreach (Segment segment in segments)
			{
				segment.SegmentInvalid += new EventHandler(segment_SegmentInvalid);
				
				if (segment.End != End) segment.End.OriginInvalid +=new EventHandler(Origin_OriginInvalid);
			}
		}