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