public static LinkDirection GetClosestDirectionPoints(LinkDrawing linkDrawing)
        {
            ILinkableDrawing destinationDrawing = linkDrawing.DestinationDrawing;
            ILinkableDrawing sourceDrawing = linkDrawing.SourceDrawing;
            CardinalDirection[] directionsArray = new CardinalDirection[] {
                CardinalDirection.North,
                CardinalDirection.South,
                CardinalDirection.West,
                CardinalDirection.East
            };

            List<CardinalDirection> directions = new List<CardinalDirection>(directionsArray);

            CardinalDirection from = CardinalDirection.None;
            CardinalDirection to = CardinalDirection.None;

            if (destinationDrawing.LinkAttachMode == LinkAttachMode.LEFT_RIGHT) {
                if (destinationDrawing.Location.X > sourceDrawing.Location.X + sourceDrawing.Size.Width / 2) {
                    to = CardinalDirection.West;
                } else {
                    to = CardinalDirection.East;
                }
            } else if (destinationDrawing.LinkAttachMode == LinkAttachMode.ALL) {
                if (destinationDrawing.Location.Y > sourceDrawing.Location.Y + sourceDrawing.Size.Height) {
                    to = CardinalDirection.South;
                } else if (destinationDrawing.Location.Y + destinationDrawing.Size.Height < sourceDrawing.Location.Y) {
                    to = CardinalDirection.North;
                } else if (destinationDrawing.Location.X > sourceDrawing.Location.X + sourceDrawing.Size.Width) {
                    to = CardinalDirection.East;
                } else if (destinationDrawing.Location.X + destinationDrawing.Size.Width < sourceDrawing.Location.X) {
                    to = CardinalDirection.West;
                }
            }

            if (sourceDrawing.LinkAttachMode == LinkAttachMode.ALL) {
                if (sourceDrawing.Location.Y > destinationDrawing.Location.Y + destinationDrawing.Size.Height) {
                    from = CardinalDirection.South;
                } else if (sourceDrawing.Location.Y + sourceDrawing.Size.Height < destinationDrawing.Location.Y) {
                    from = CardinalDirection.North;
                } else if (sourceDrawing.Location.X > destinationDrawing.Location.X + destinationDrawing.Size.Width) {
                    from = CardinalDirection.East;
                } else if (sourceDrawing.Location.X + sourceDrawing.Size.Width < destinationDrawing.Location.X) {
                    from = CardinalDirection.West;
                }
            } else if (sourceDrawing.LinkAttachMode == LinkAttachMode.LEFT_RIGHT) {
                if (sourceDrawing.Location.X > destinationDrawing.Location.X + destinationDrawing.Size.Width / 2) {
                    from = CardinalDirection.East;
                } else {
                    from = CardinalDirection.West;
                }
            }
            return new LinkDirection(from, to);
        }
        Rectangle getLinkInvalidatedRegion(LinkDrawing linkDrawing)
        {
            MergeableRectangle rectangle = new MergeableRectangle(linkDrawing.Bounds);
            linkDrawing.Invalidated = true;
            ILinkableDrawing sourceDrawing = linkDrawing.SourceDrawing;
            ILinkableDrawing destinationDrawing = linkDrawing.DestinationDrawing;
            sourceDrawing.Invalidated = true;
            destinationDrawing.Invalidated = true;
            rectangle.Merge(sourceDrawing.InvalidatedRegion);
            rectangle.Merge(sourceDrawing.InvalidatedRegion);

            foreach (IDrawing drawing in containerDrawer.Drawings) {
                if (drawing.Bounds.IntersectsWith(rectangle.Bounds)) {
                    drawing.Invalidated = true;
                    rectangle.Merge(drawing.Bounds);
                }
            }
            return rectangle.Bounds;
        }
 public LinkDrawing CreateLink(ILink link, int lineWidth, int selectedLineWidth, LinkStyle linkStyle)
 {
     LinkDrawing linkDrawing = new LinkDrawing(link, lineWidth, selectedLineWidth, linkStyle);
     return linkDrawing;
 }
        private void OnLinkDirectionChanged(LinkDrawing link, LinkDirection previousDirection, LinkDirection newDirection)
        {
            IDrawing sourceDrawing = link.SourceDrawing;
            IDrawing destinationDrawing = link.DestinationDrawing;

            link.Invalidated = true;
            NSWEDrawing source = virtualMapping[sourceDrawing];
            NSWEDrawing destination = virtualMapping[destinationDrawing];

            switch (previousDirection.From) {
                case CardinalDirection.None:
                    source.LinkPointsNone.Remove(link.SourcePoint);
                    source.LinksNone.Remove(link);
                    break;
                case CardinalDirection.North:
                    source.LinkPointsSouth.Remove(link.SourcePoint);
                    source.LinksSouth.Remove(link);
                    break;
                case CardinalDirection.South:
                    source.LinkPointsNorth.Remove(link.SourcePoint);
                    source.LinksNorth.Remove(link);
                    break;
                case CardinalDirection.West:
                    source.LinkPointsEast.Remove(link.SourcePoint);
                    source.LinksEast.Remove(link);
                    break;
                case CardinalDirection.East:
                    source.LinkPointsWest.Remove(link.SourcePoint);
                    source.LinksWest.Remove(link);
                    break;
            }

            switch (previousDirection.To) {
                case CardinalDirection.None:
                    destination.LinkPointsNone.Remove(link.DestinationPoint);
                    destination.LinksNone.Remove(link);
                    break;
                case CardinalDirection.South:
                    destination.LinkPointsNorth.Remove(link.DestinationPoint);
                    destination.LinksNorth.Remove(link);
                    break;
                case CardinalDirection.North:
                    destination.LinkPointsSouth.Remove(link.DestinationPoint);
                    destination.LinksSouth.Remove(link);
                    break;
                case CardinalDirection.East:
                    destination.LinkPointsWest.Remove(link.DestinationPoint);
                    destination.LinksWest.Remove(link);
                    break;
                case CardinalDirection.West:
                    destination.LinkPointsEast.Remove(link.DestinationPoint);
                    destination.LinksEast.Remove(link);
                    break;
            }

            switch (newDirection.From) {
                case CardinalDirection.None:
                    source.LinkPointsNone.Add(link.SourcePoint);
                    source.LinksNone.Add(link);
                    break;
                case CardinalDirection.North:
                    source.LinkPointsSouth.Add(link.SourcePoint);
                    source.LinksSouth.Add(link);
                    break;
                case CardinalDirection.South:
                    source.LinkPointsNorth.Add(link.SourcePoint);
                    source.LinksNorth.Add(link);
                    break;
                case CardinalDirection.West:
                    source.LinkPointsEast.Add(link.SourcePoint);
                    source.LinksEast.Add(link);
                    break;
                case CardinalDirection.East:
                    source.LinkPointsWest.Add(link.SourcePoint);
                    source.LinksWest.Add(link);
                    break;
            }

            switch (newDirection.To) {
                case CardinalDirection.None:
                    destination.LinkPointsNone.Add(link.DestinationPoint);
                    destination.LinksNone.Add(link);
                    break;
                case CardinalDirection.North:
                    destination.LinkPointsSouth.Add(link.DestinationPoint);
                    destination.LinksSouth.Add(link);
                    break;
                case CardinalDirection.South:
                    destination.LinkPointsNorth.Add(link.DestinationPoint);
                    destination.LinksNorth.Add(link);
                    break;
                case CardinalDirection.West:
                    destination.LinkPointsEast.Add(link.DestinationPoint);
                    destination.LinksEast.Add(link);
                    break;
                case CardinalDirection.East:
                    destination.LinkPointsWest.Add(link.DestinationPoint);
                    destination.LinksWest.Add(link);
                    break;
            }

            if (this.LinkDirectionChangedEvent != null)
                LinkDirectionChangedEvent(link, new LinkDirectionChangedArg(link, newDirection, link.Direction));
        }
        public void RegisterLink(LinkDrawing link)
        {
            NSWEDrawing nsweDestination = registerDrawing(link.DestinationDrawing);
            NSWEDrawing nsweSource = registerDrawing(link.SourceDrawing);

            nsweSource.OutputLinkList.Add(link);
            nsweDestination.InputLinkList.Add(link);

            nsweSource.Links.Add(link);
            nsweDestination.Links.Add(link);
        }
 public void AddLinkDrawing(ILinkableDrawing source, ILinkableDrawing destination)
 {
     LinkDrawing linkDrawing = new LinkDrawing(source, destination, 1.0f, 3.0f, LinkStyle.StreightLines);
     ContainerDrawer.LinkOrchestrator.AddLinkDrawing(linkDrawing);
 }
        public static Point[] GetLinePoints(LinkDrawing linkDrawing)
        {
            Point[] points = {
                linkDrawing.SourcePoint.Location,
                linkDrawing.DestinationPoint.Location
            };

            if (AreOpposite(linkDrawing.Direction.From, linkDrawing.Direction.To)) {
                if (linkDrawing.Direction.From == CardinalDirection.South
                    || linkDrawing.Direction.From == CardinalDirection.North) {
                    Point p1 = new Point(linkDrawing.DestinationPoint.X,
                                   (linkDrawing.DestinationPoint.Y + linkDrawing.SourcePoint.Y) / 2);
                    Point p2 = new Point(linkDrawing.SourcePoint.X,
                                   (linkDrawing.DestinationPoint.Y + linkDrawing.SourcePoint.Y) / 2);
                    return new Point[] {
                        linkDrawing.DestinationPoint.Location, p1, p2, linkDrawing.SourcePoint.Location
                    };
                } else {
                    Point p1 = new Point((linkDrawing.DestinationPoint.X + linkDrawing.SourcePoint.X) / 2,
                                   linkDrawing.DestinationPoint.Y);
                    Point p2 = new Point((linkDrawing.DestinationPoint.X + linkDrawing.SourcePoint.X) / 2,
                                   linkDrawing.SourcePoint.Y);
                    return new Point[] {
                        linkDrawing.DestinationPoint.Location, p1, p2, linkDrawing.SourcePoint.Location
                    };
                }
            }

            if (AreOrthogonal(linkDrawing.Direction.From, linkDrawing.Direction.To)) {
                Point p1 = new Point();
                if (linkDrawing.Direction.From == CardinalDirection.West ||
                    linkDrawing.Direction.From == CardinalDirection.East) {
                    p1 = new Point(linkDrawing.DestinationPoint.X, linkDrawing.SourcePoint.Y);
                } else if (linkDrawing.Direction.To == CardinalDirection.West ||
                     linkDrawing.Direction.To == CardinalDirection.East) {
                    p1 = new Point(linkDrawing.SourcePoint.X, linkDrawing.DestinationPoint.Y);
                }
                return new Point[] {
                    linkDrawing.SourcePoint.Location,
                    p1,
                    linkDrawing.DestinationPoint.Location
                };
            }

            return points;
        }
Beispiel #8
0
 public LinkPoint(LinkDrawing linkDrawing)
 {
     this.linkDrawing = linkDrawing;
 }
        void InvalidateLinkDrawing(LinkDrawing linkDrawing)
        {
            MergeableRectangle newRectangleToInvalidate = new MergeableRectangle(linkDrawing.Bounds);
            newRectangleToInvalidate.Merge(getLinkInvalidatedRegion(linkDrawing));
            newRectangleToInvalidate.Merge(
                getStructureInvalidatedRegion(linkDrawing.SourceDrawing));
            newRectangleToInvalidate.Merge(
                getStructureInvalidatedRegion(linkDrawing.DestinationDrawing));
            Rectangle auxRectangle = newRectangleToInvalidate.Bounds;
            invalidateOverlappingDrawings(previouslyInvalidatedRectangle);
            newRectangleToInvalidate.Merge(previouslyInvalidatedRectangle);
            invalidateOverlappingDrawings(newRectangleToInvalidate.Bounds);
            previouslyInvalidatedRectangle = auxRectangle;

            int scaleFactor = containerDrawer.DiagramContainer.ZoomFactor / 100;
            Rectangle r = new Rectangle(newRectangleToInvalidate.Bounds.X * scaleFactor,
                              newRectangleToInvalidate.Bounds.Y * scaleFactor,
                              newRectangleToInvalidate.Bounds.Width * scaleFactor,
                              newRectangleToInvalidate.Bounds.Height * scaleFactor);
            containerDrawer.DiagramContainer.Invalidate(r);
            previouslyInvalidatedRectangle = newRectangleToInvalidate.Bounds;
        }
 public void AddLinkDrawing(LinkDrawing linkDrawing)
 {
     RegisterLink(linkDrawing);
 }
        private void RegisterLink(LinkDrawing linkDrawing)
        {
            ILinkableDrawing sourceDrawing = linkDrawing.SourceDrawing;
            ILinkableDrawing destinationDrawing = linkDrawing.DestinationDrawing;

            sourceDrawing.DrawingLinks.Add(linkDrawing);
            destinationDrawing.DrawingLinks.Add(linkDrawing);

            containerDrawer.Drawings.Insert(0, linkDrawing);
            linkStrategy.RegisterLink(linkDrawing);
            links.Add(linkDrawing);

            linkStrategy.DirectLinks(sourceDrawing);
            linkStrategy.DirectLinks(destinationDrawing);
        }
 public CardinalLinkPoint(LinkDrawing linkDrawing)
     : base(linkDrawing)
 {
     this.direction = CardinalDirection.None;
 }
 public LinkDirectionChangedArg(LinkDrawing link, LinkDirection newDirection, LinkDirection prevDirection)
 {
     this.link = link;
     this.newDirection = newDirection;
     this.prevDirection = prevDirection;
 }