/// <summary> /// Draws a node (place or transition) on the given canvas and returns the Thumb /// </summary> /// <param name="canvas"></param> /// <param name="node"></param> /// <param name="isDragAndDropAllowed"></param> /// <returns></returns> /// <author>Jannik Arndt, Thomas Meents, Krystian Zielonka</author> private Thumb DrawNode(Canvas canvas, Node node, bool isDragAndDropAllowed) { // 1. get the specifics (transition or place?) ExtendedThumb nodeThumb; if (node.GetType() == typeof (Place)) nodeThumb = DrawPlace((Place) node); else if (node.GetType() == typeof (Transition)) nodeThumb = DrawTransition((Transition) node); else throw new PetriNetVisualizerException("Node is neither Place nor Transition."); // 2. do what they have in common if (node.DiffStatus == DiffState.Added) nodeThumb.Background = Settings.Default.AddedNodeColor; else if (node.DiffStatus == DiffState.Changed) nodeThumb.Background = Settings.Default.ChangedNodeColor; else if (node.DiffStatus == DiffState.Deleted) nodeThumb.Background = Settings.Default.DeletedNodeColor; else nodeThumb.Background = Settings.Default.DefaultBackgroundColor; nodeThumb.BorderBrush = Settings.Default.DefaultBorderColor; nodeThumb.BaseNode = node; if (isDragAndDropAllowed) { nodeThumb.DragDelta += DragAndDropThumb; nodeThumb.Cursor = Settings.Default.DefaultMoveCursor; } Canvas.SetTop(nodeThumb, node.PositionY); Canvas.SetLeft(nodeThumb, node.PositionX); if (node.PositionX > canvas.Width) canvas.Width = node.PositionX + nodeThumb.Width + Settings.Default.PositionCorrection; if (node.PositionY > canvas.Height) canvas.Height = node.PositionY + nodeThumb.Height + Settings.Default.PositionCorrection; canvas.Children.Add(nodeThumb); return nodeThumb; }
/// <summary> /// Remove a given node. A node can be a place or a transition. /// Version 2: Now also removes the connections in the nodes before and after. /// </summary> /// <param name="nodeToRemove"></param> /// <author>Roman Bauer, Jannik Arndt</author> public void RemoveNodeAndConnections(Node nodeToRemove) { if (nodeToRemove.GetType() == typeof(Place)) { Place placeToRemove = nodeToRemove as Place; if (placeToRemove != null) { foreach (Transition transition in placeToRemove.IncomingTransitions) transition.OutgoingPlaces.Remove(placeToRemove); foreach (Transition transition in placeToRemove.OutgoingTransitions) transition.IncomingPlaces.Remove(placeToRemove); Places.Remove(placeToRemove); } } if (nodeToRemove.GetType() == typeof(Transition)) { Transition transitionToRemove = nodeToRemove as Transition; if (transitionToRemove != null) { foreach (Place place in transitionToRemove.IncomingPlaces) place.OutgoingTransitions.Remove(transitionToRemove); foreach (Place place in transitionToRemove.OutgoingPlaces) place.IncomingTransitions.Remove(transitionToRemove); Transitions.Remove(transitionToRemove); } } }
/// <summary> /// Searches the GlobalColumnList if a Node is contained in any column /// </summary> /// <param name="node">The node you are looking for</param> /// <returns></returns> /// <author>Jannik Arndt</author> private static bool NodeAlreadyIsInColumns(Node node) { return GlobalColumnList.Any(column => column.HashSetOfNodes.Contains(node)); }
/// <summary> /// Remove a given node. A node can be a place or a transition. /// </summary> /// <param name="nodeToRemove"></param> /// <author>Roman Bauer</author> public void RemoveNode(Node nodeToRemove) { if (nodeToRemove.GetType() == typeof(Place)) Places.Remove((Place)nodeToRemove); if (nodeToRemove.GetType() == typeof(Transition)) Transitions.Remove((Transition)nodeToRemove); }
/// <summary> /// Searches the GlobalColumnList for the specified node and returns the first column the node is in /// </summary> /// <param name="node">The node you are looking for</param> /// <returns></returns> /// <author>Jannik Arndt</author> private static Column FindNode(Node node) { return GlobalColumnList.FirstOrDefault(column => column.HashSetOfNodes.Contains(node)); }