/// <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));
 }