Example #1
0
        public bool IsSegmentExist(IpFlowIpSegmentFinder segmentFinder)
        {
            foreach (var s in ipSegments)
            {
                if (s.SegmentFinder.Equals(segmentFinder))
                {
                    return(true);
                }
            }

            return(false);
        }
        public bool Equals(IpFlowIpSegmentFinder segmentFinder)
        {
            if (segmentFinder == null)
            {
                return(false);
            }

            if (Index == segmentFinder.Index && IsSource == segmentFinder.IsSource && Segment == segmentFinder.Segment)
            {
                return(true);
            }
            else
            {
                return(false);
            }
        }
        public void HighlightingNode(IpFlowIpSegmentFinder segmentFinder, IReadOnlyList <IpFlowNode> nodes)
        {
            if (segmentFinder == null && diagram.HighlightNode == null || nodes == null || nodes.Count == 0)
            {
                return;
            }

            // reset each element's brush first
            RecoverHighlights(nodes, false);

            if (segmentFinder == null || !nodes.ToList().Exists(node => node.SourceIpNode.IsSegmentExist(segmentFinder) || node.DestinationIpNode.IsSegmentExist(segmentFinder)))
            {
                return;
            }

            // reset highlight if highlighting the same node twice
            if ((from node in nodes where node.HighlightSegment != null && node.HighlightSegment.Equals(diagram.HighlightNode) && node.IsHighlight select node).Count() > 0 && segmentFinder.Equals(diagram.HighlightNode))
            {
                RecoverHighlights(nodes);
                diagram.SetCurrentValue(IpFlowDiagram.HighlightNodeProperty, null);

                return;
            }

            var highlightLinkFillOpacity = diagram.LinkFill.Opacity / diagram.LinkStroke.Opacity * diagram.HighlightOpacity;

            // ensure minimize same element once && not minmize hightlight element
            var minimizedSegments = new HashSet <IpFlowIpSegment>();
            var highlightSegments = new HashSet <IpFlowIpSegment>();
            var minimizedLinks    = new HashSet <IpFlowLinkBase>();
            var highlightLinks    = new HashSet <IpFlowLinkBase>();

            foreach (var node in nodes)
            {
                #region highlight

                var highlight = segmentFinder.IsSource ? node.SourceIpNode.IsSegmentExist(segmentFinder) : node.DestinationIpNode.IsSegmentExist(segmentFinder);

                if (highlight)
                {
                    for (var index = 0; index < 4; index++)
                    {
                        var srcNode  = node.SourceIpNode.GetSegment(index);
                        var destNode = node.DestinationIpNode.GetSegment(index);
                        srcNode.Color.Opacity  = diagram.HighlightOpacity;
                        destNode.Color.Opacity = diagram.HighlightOpacity;
                        highlightSegments.Add(srcNode);
                        highlightSegments.Add(destNode);
                    }

                    foreach (var link in node.Links)
                    {
                        link.SourceIpToPortLink.Shape.Fill.Opacity            = highlightLinkFillOpacity;
                        link.DestinationIpToPortLink.Shape.Fill.Opacity       = highlightLinkFillOpacity;
                        link.SourceToDestinationPortLink.Shape.Fill.Opacity   = highlightLinkFillOpacity;
                        link.SourceIpToPortLink.Shape.Stroke.Opacity          = diagram.HighlightOpacity;
                        link.DestinationIpToPortLink.Shape.Stroke.Opacity     = diagram.HighlightOpacity;
                        link.SourceToDestinationPortLink.Shape.Stroke.Opacity = diagram.HighlightOpacity;
                        highlightLinks.Add(link.SourceIpToPortLink);
                        highlightLinks.Add(link.DestinationIpToPortLink);
                        highlightLinks.Add(link.SourceToDestinationPortLink);
                    }

                    node.IsHighlight      = true;
                    node.HighlightSegment = segmentFinder;

                    #endregion
                }
                else
                {
                    #region minimize

                    var l = node.Links[0];
                    var minimizeFillOpacity   = l.SourceIpToPortLink.Shape.Fill.Opacity - diagram.LoweredOpacity < 0 ? 0 : l.SourceIpToPortLink.Shape.Fill.Opacity - diagram.LoweredOpacity;
                    var minimizeStrokeOpacity = l.SourceIpToPortLink.Shape.Stroke.Opacity - diagram.LoweredOpacity < 0 ? 0 : l.SourceIpToPortLink.Shape.Stroke.Opacity - diagram.LoweredOpacity;

                    foreach (var link in node.Links)
                    {
                        if (!minimizedLinks.Contains(link.SourceIpToPortLink) && !highlightLinks.Contains(link.SourceIpToPortLink))
                        {
                            link.SourceIpToPortLink.Shape.Fill.Opacity   = minimizeFillOpacity;
                            link.SourceIpToPortLink.Shape.Stroke.Opacity = minimizeStrokeOpacity;
                            minimizedLinks.Add(link.SourceIpToPortLink);
                        }

                        if (!minimizedLinks.Contains(link.DestinationIpToPortLink) && !highlightLinks.Contains(link.DestinationIpToPortLink))
                        {
                            link.DestinationIpToPortLink.Shape.Fill.Opacity   = minimizeFillOpacity;
                            link.DestinationIpToPortLink.Shape.Stroke.Opacity = minimizeStrokeOpacity;
                            minimizedLinks.Add(link.DestinationIpToPortLink);
                        }

                        if (!minimizedLinks.Contains(link.SourceToDestinationPortLink) && !highlightLinks.Contains(link.SourceToDestinationPortLink))
                        {
                            link.SourceToDestinationPortLink.Shape.Fill.Opacity   = minimizeFillOpacity;
                            link.SourceToDestinationPortLink.Shape.Stroke.Opacity = minimizeStrokeOpacity;
                            minimizedLinks.Add(link.SourceToDestinationPortLink);
                        }
                    }

                    for (var index = 0; index < 4; index++)
                    {
                        var srcNode  = node.SourceIpNode.GetSegment(index);
                        var destNode = node.DestinationIpNode.GetSegment(index);

                        if (!minimizedSegments.Contains(srcNode) && !highlightSegments.Contains(srcNode))
                        {
                            var minimizeSrcOpacity = srcNode.Color.Opacity - diagram.LoweredOpacity < 0 ? 0 : srcNode.Color.Opacity - diagram.LoweredOpacity;
                            srcNode.Color.Opacity = minimizeSrcOpacity;
                            minimizedSegments.Add(srcNode);
                        }

                        if (!minimizedSegments.Contains(destNode) && !highlightSegments.Contains(destNode))
                        {
                            var minimizeDestOpacity = destNode.Color.Opacity - diagram.LoweredOpacity < 0 ? 0 : destNode.Color.Opacity - diagram.LoweredOpacity;
                            destNode.Color.Opacity = minimizeDestOpacity;
                            minimizedSegments.Add(destNode);
                        }
                    }

                    node.IsHighlight      = false;
                    node.HighlightSegment = null;

                    #endregion
                }
            }
        }