예제 #1
0
        private void BFS_FinishVertex(SENode vertex)
        {
            IEnumerable <SEEdge> edges = null;

            if (GraphControl.Graph.TryGetOutEdges(vertex, out edges))
            {
                if (edges.Count() > 0)
                {
                    foreach (var edge in edges)
                    {
                        currentSubtreeRoot.CollapsedSubtreeEdges.Add(edge);
                    }
                }
            }

            if (!currentSubtreeRoot.Equals(vertex))
            {
                if (vertex.IsSelected)
                {
                    vertex.Deselect();
                }
                vertex.IsCollapsed = true;
                currentSubtreeRoot.CollapsedSubtreeNodes.Add(vertex);
            }
        }
예제 #2
0
        private void Node_OnRightClick(object sender, RoutedEventArgs e)
        {
            currentSubtreeRoot = ((sender as VertexControl).Vertex as SENode);

            if (currentSubtreeRoot.IsCollapsed)
            {
                return;
            }

            if (currentSubtreeRoot.CollapsedSubtreeNodes.Count == 0)
            {
                // In order to revert to original color!
                if (currentSubtreeRoot.IsSelected)
                {
                    currentSubtreeRoot.Deselect();
                    DecorateVertexBackground(currentSubtreeRoot);
                }

                // Collapsing
                // If there are edges going out of it
                IEnumerable <SEEdge> edges = null;
                if (GraphControl.Graph.TryGetOutEdges(currentSubtreeRoot, out edges))
                {
                    if (edges.Count() == 0)
                    {
                        // Has no out edges --> leaf node --> select the nodes of the matching run of the leaf node
                        var vm = (SEGraphViewModel)DataContext;
                        SelectNodesVisually(GetNodesOfRun(currentSubtreeRoot.Runs));
                    }
                }

                var search = new BreadthFirstSearchAlgorithm <SENode, SEEdge>(GraphControl.Graph);
                search.SetRootVertex(currentSubtreeRoot);
                search.FinishVertex += BFS_FinishVertex;
                search.Finished     += (p, args) =>
                {
                    if (currentSubtreeRoot.CollapsedSubtreeEdges.Count > 0 && currentSubtreeRoot.CollapsedSubtreeNodes.Count > 0)
                    {
                        foreach (var edge in currentSubtreeRoot.CollapsedSubtreeEdges)
                        {
                            GraphControl.Graph.HideEdge(edge);
                        }
                        foreach (var node in currentSubtreeRoot.CollapsedSubtreeNodes)
                        {
                            GraphControl.Graph.HideVertex(node);
                        }
                        SelectNodeWithProperties(currentSubtreeRoot);
                        currentSubtreeRoot.Collapse();
                        DecorateVerticesBackground();
                    }
                };

                search.Compute();
            }
            else
            {
                // Expanding
                foreach (var vertex in ((sender as VertexControl).Vertex as SENode).CollapsedSubtreeNodes)
                {
                    GraphControl.Graph.UnhideVertex(vertex);
                    vertex.IsCollapsed = false;
                }
                currentSubtreeRoot.CollapsedSubtreeNodes.Clear();

                GraphControl.Graph.UnhideEdges(((sender as VertexControl).Vertex as SENode).CollapsedSubtreeEdges);
                currentSubtreeRoot.CollapsedSubtreeEdges.Clear();

                currentSubtreeRoot.Expand();

                DecorateVerticesBackground();
            }
        }