internal DCluster(DObject parent, DrawingCluster drawingCluster) : base(parent, drawingCluster) { Node.Attr.FillColor = Drawing.Color.White; }
private void CreateMSAGLGraphAndPopulatePanelWithAssociatedControls() { if (Graph == null) { return; } Children.Clear(); idGenerator = new ObjectIDGenerator(); var edgeVMs = Graph.Edges.ToArray(); var nodeVMs = edgeVMs.Select(e => e.Head).Concat(edgeVMs.Select(e => e.Tail)).Distinct().Select(nvm => new NodeWrapper(nvm, idGenerator)).ToDictionary(nw => nw.VM, nw => nw); var parentVMs = nodeVMs.Select(kv => Graph.Parent[kv.Key]).Where(pvm => pvm != null).Distinct().Select(pvm => nodeVMs[pvm]).ToArray(); var leafVMs = nodeVMs.Values.Except(parentVMs).ToArray(); graph = new Microsoft.Msagl.Drawing.Graph { LayoutAlgorithmSettings = CurrentLayoutSettings }; graph.RootSubgraph.IsVisible = false; vmOfCtrl = new Dictionary <IControl, Wrapper>(); foreach (var sgvm in parentVMs) { var sg = new Microsoft.Msagl.Drawing.Subgraph(sgvm.ID); sgvm.DNode = sg; var ctrl = CreateControl(sgvm.VM, n => new TextSticker { Text = n.ToString(), HorizontalAlignment = Avalonia.Layout.HorizontalAlignment.Stretch, VerticalAlignment = Avalonia.Layout.VerticalAlignment.Stretch }, 1); vmOfCtrl[ctrl] = sgvm; } foreach (var sgvm in parentVMs) { var parent = Graph.Parent[sgvm.VM]; var pGraph = (parent == null) ? graph.RootSubgraph : (Microsoft.Msagl.Drawing.Subgraph)nodeVMs[parent].DNode; pGraph.AddSubgraph((Microsoft.Msagl.Drawing.Subgraph)sgvm.DNode); } foreach (var evm in edgeVMs) { var dEdge = graph.AddEdge(nodeVMs[evm.Tail].ID, nodeVMs[evm.Head].ID); dEdge.Attr.ArrowheadAtSource = Edge.GetArrowStyle(evm.TailSymbol); dEdge.Attr.ArrowheadAtTarget = Edge.GetArrowStyle(evm.HeadSymbol); dEdge.LabelText = "x"; evm.DEdge = dEdge; CreateControl(evm, _ => new Connection(), 2); } foreach (var nvm in leafVMs) { var dNode = graph.FindNode(nvm.ID); nvm.DNode = dNode; var ctrl = CreateControl(nvm.VM, n => new TextSticker { Text = n.ToString() }, 4); vmOfCtrl[ctrl] = nvm; var parent = Graph.Parent[nvm.VM]; if (parent != null) { var pw = nodeVMs[parent]; ((Microsoft.Msagl.Drawing.Subgraph)pw.DNode).AddNode(dNode); } } graph.Attr.LayerDirection = (Graph.Orientation == Graph.Orientations.Vertical) ? Microsoft.Msagl.Drawing.LayerDirection.TB : Microsoft.Msagl.Drawing.LayerDirection.LR; var flowOrder = (Graph.Orientation == Graph.Orientations.Vertical) ? Graph.VerticalOrder : Graph.HorizontalOrder; var otherOrder = (Graph.Orientation == Graph.Orientations.Vertical) ? Graph.HorizontalOrder : Graph.VerticalOrder; IEnumerable <(NodeWrapper, NodeWrapper)> ComputeConstraints(Func <object, object, int> comparison) => (from n1 in nodeVMs from n2 in nodeVMs let order = comparison(n1.Key, n2.Key) where order != 0 select(order < 0) ? (n1.Value, n2.Value) : (n2.Value, n1.Value)).Distinct(); foreach (var flowConstraint in ComputeConstraints(flowOrder)) { graph.LayerConstraints.AddUpDownConstraint(flowConstraint.Item1.DNode, flowConstraint.Item2.DNode); } foreach (var otherConstraint in ComputeConstraints(otherOrder)) { graph.LayerConstraints.AddLeftRightConstraint(otherConstraint.Item1.DNode, otherConstraint.Item2.DNode); } graph.CreateGeometryGraph(); graph.GeometryGraph.RootCluster.RectangularBoundary = new Microsoft.Msagl.Core.Geometry.RectangularClusterBoundary(); foreach (var evm in edgeVMs) { if (!evm.Label.Equals(string.Empty)) { var ctrl = CreateControl(evm.Label, l => new TextBlock { Text = l.ToString(), FontSize = 6 }, 3); vmOfCtrl[ctrl] = new LabelWrapper(evm.Label, idGenerator, evm.DEdge.Label); } } }