private void RouteChangeListener(string alg, IMNodeInternal target, IMLink oldRoute, IMLink newRoute, float oldDist, float dist)
        {
            Logger.Debug(Name + " changing route to " + target.Name + ". " + (oldRoute == null ? "No old route" : "Old route: " + oldRoute.Name) + ". " + (newRoute == null ? "No new route" : "New route: " + newRoute.Name));
            if (OnForwardingTableChange != null && (oldRoute == null || newRoute == null || !oldRoute.Equals(newRoute) || oldDist != dist))
                OnForwardingTableChange(ID, ForwardingTableList);

            //If not highlighting or not highlighting the route that was changed quit
            if ((oldRoute != null && newRoute != null && oldRoute.Equals(newRoute)) ||
                !GlobalHighlighting ||
                !target.Equals(_globalHighlightTarget) ||
                (GlobalHighlightingSingle && !HighlightingSingle && !Equals(_globalHighlightRoot)))
                return;

            if (oldRoute != null) {
                oldRoute.Reset();
                if (HighlightingSingle)
                    oldRoute.OtherEnd(this).ResetHighlight(this);
            }

            if (newRoute != null) {
                newRoute.Colour = _globalHighlightColour;
                if (GlobalHighlightingSingle) {
                    _highlightState = HighlghtState.HighlightingSingle;
                    newRoute.OtherEnd(this).Highlight(this);
                }
            } else
                _highlightState = HighlghtState.NotHighlighting;

            _highlightedLink = newRoute;
        }
        /// <inhertidoc />
        public void TriggerHighlightAll(string alg)
        {
            if (Equals(_globalHighlightTarget)) {
                TriggerHighlightReset();
                return;
            }

            ClearOld();

            _globalTargetKey = ID;
            _globalHighlightTarget = this;
            _globalHighlightRoot = null;
            _globalHighlightColour = Colour;
            _globalHighlightState = HighlghtState.HighlightingAll;

            HighlightAll(this);
        }
 /// <inhertidoc />
 public void TriggerHighlightReset()
 {
     if (OnHighlightReset != null)
         OnHighlightReset();
     _globalHighlightRoot = null;
     _globalHighlightTarget = null;
     _globalHighlightState = HighlghtState.NotHighlighting;
 }
        /// <inhertidoc />
        public void TriggerHighlight(string alg, IMNodeInternal target)
        {
            if (Equals(_globalHighlightTarget) || Equals(_globalHighlightRoot)) {
                TriggerHighlightReset();
                return;
            }

            ClearOld();

            _globalTargetKey = target.ID;
            _globalHighlightTarget = (IMNode)target;
            _globalHighlightRoot = this;
            _globalHighlightColour = Colour;
            _globalHighlightState = HighlghtState.HighlightingSingle;
            _highlightState = HighlghtState.HighlightingSingle;

            //If there is a route
            if (ForwardingTable.ContainsKey(_globalTargetKey)) {
                lock (HighlightLock) {
                    _highlightedLink = ForwardingTable[_globalTargetKey];
                    _highlightedLink.Colour = _globalHighlightColour;
                    IMNode node = ForwardingTable[_globalTargetKey].OtherEnd(this);
                    node.Highlight(this);
                }
            } else
                _highlightedLink = null;
        }
        public void ResetHighlightAll()
        {
            _highlightState = HighlghtState.NotHighlighting;

            if (_highlightedLink != null) {
                _highlightedLink.Reset();
                _highlightedLink = null;
            }
        }
        public void ResetHighlight(IMNodeInternal hop)
        {
            if (Equals(_globalHighlightTarget) ||
                !Highlighting ||
                (_highlightedLink != null && _highlightedLink.OtherEnd(this).Equals(hop)))
                return;

            lock (HighlightLock) {
                _highlightState = HighlghtState.NotHighlighting;

                if (_highlightedLink != null) {
                    _highlightedLink.Reset();
                    _highlightedLink.OtherEnd(this).ResetHighlight(this);
                    _highlightedLink = null;
                }
            }
        }
        /// <summary>
        ///   What to do when a packet relevant to the highlight flooding algorithm is received
        /// 
        ///   If the node has not already received one of the highlight flooding packets flood highlight packets along all links and send a new
        ///   highlight all packet back towards the source of the received packet
        /// </summary>
        /// <param name = "packet"></param>
        public void HighlightAll(IMNodeInternal hop)
        {
            if (HighlightingAll) return;

            lock (HighlightLock) {
                _highlightedLink = ForwardingTable.ContainsKey(_globalTargetKey) ? ForwardingTable[_globalTargetKey] : null;
                _highlightState = HighlghtState.HighlightingAll;

                if (_highlightedLink != null)
                    _highlightedLink.Colour = _globalHighlightColour;

                foreach (IMLink l in _links) {
                    IMNode neighbour = l.OtherEnd(this);
                    if (!neighbour.Equals(hop))
                        neighbour.HighlightAll(this);
                }
            }
        }
        /// <summary>
        ///   What to do when notified that it should highlight
        /// 
        ///   Will highlight the link and forward the packet on if necessary
        /// </summary>
        /// <param name = "packet">The packet received</param>
        public void Highlight(IMNodeInternal hop)
        {
            _highlightedLink = ForwardingTable.ContainsKey(_globalTargetKey) ? ForwardingTable[_globalTargetKey] : null;

            if (HighlightingSingle ||
                (_highlightedLink != null && _highlightedLink.OtherEnd(this).Equals(hop)))
                return;

            lock (HighlightLock) {
                _highlightState = HighlghtState.HighlightingSingle;

                if (_highlightedLink != null) {
                    _highlightedLink.Colour = _globalHighlightColour;
                    _highlightedLink.OtherEnd(this).Highlight(this);
                }
            }
        }