Ejemplo n.º 1
0
        public void AddEdge(IEdge edge)
        {
            if (IsEdgeExcluded(edge))
            {
                return;
            }

            String edgeRealizerName = edgeRealizerOverride ?? realizers.GetEdgeRealizer(edge.Type, dumpInfo);

            String edgeName = graph.GetElementName(edge);
            String srcName  = graph.GetElementName(edge.Source);
            String tgtName  = graph.GetElementName(edge.Target);

            if (edge.Source != edge.Target)
            {
                GroupNodeType srcGroupNodeType = dumpInfo.GetGroupNodeType(edge.Source.Type);
                GroupNodeType tgtGroupNodeType = dumpInfo.GetGroupNodeType(edge.Target.Type);
                INode         groupNodeFirst = null, groupNodeSecond = null;
                if (tgtGroupNodeType != null)
                {
                    groupNodeFirst = edge.Target;
                }
                if (srcGroupNodeType != null)
                {
                    if (groupNodeFirst == null)
                    {
                        groupNodeFirst = edge.Source;
                    }
                    else if (srcGroupNodeType.Priority > tgtGroupNodeType.Priority)
                    {
                        groupNodeSecond = groupNodeFirst;
                        groupNodeFirst  = edge.Source;
                    }
                    else
                    {
                        groupNodeSecond = edge.Source;
                    }
                }

                GroupMode grpMode = GroupMode.None;
                bool      groupedNode = false;
                if (groupNodeFirst != null)
                {
                    groupedNode = TryGroupNode(groupNodeFirst, edge, srcName, tgtName, srcGroupNodeType, tgtGroupNodeType, ref grpMode);
                    if (!groupedNode && groupNodeSecond != null)
                    {
                        groupedNode = TryGroupNode(groupNodeSecond, edge, srcName, tgtName, srcGroupNodeType, tgtGroupNodeType, ref grpMode);
                    }
                }

                // If no grouping rule applies, grpMode is GroupMode.None (= 0)
                if ((grpMode & GroupMode.Hidden) != 0)
                {
                    hiddenEdges[edge] = true;
                    isDirty           = true;
                    isLayoutDirty     = true;
                    return;
                }
            }

            ycompStream.Write("addEdge \"e" + edgeName + "\" \"n" + srcName + "\" \"n" + tgtName
                              + "\" \"" + edgeRealizerName + "\" \"" + GetElemLabel(edge) + "\"\n");
            foreach (AttributeType attrType in edge.Type.AttributeTypes)
            {
                string attrTypeString;
                string attrValueString;
                EncodeAttr(attrType, edge, out attrTypeString, out attrValueString);
                ycompStream.Write("changeEdgeAttr \"e" + edgeName + "\" \"" + attrType.OwnerType.Name + "::" + attrType.Name + " : "
                                  + attrTypeString + "\" \"" + attrValueString + "\"\n");
            }
            isDirty       = true;
            isLayoutDirty = true;
        }