/// sort the diagram elements /// First all diagram elements that do not represent a classifier /// If both of them are classifiers then the target of the directed /// relationships should be first private List <UML.Diagrams.DiagramElement> sortDiagramElements (List <UML.Diagrams.DiagramElement> diagramElements) { List <UML.Diagrams.DiagramElement> sortedDiagramElements = new List <UML.Diagrams.DiagramElement>(); foreach (UML.Diagrams.DiagramElement diagramElement in diagramElements) { if (sortedDiagramElements.Count == 0) { sortedDiagramElements.Add(diagramElement); } else { bool inserted = false; for (int i = 0; i < sortedDiagramElements.Count; i++) { UML.Diagrams.DiagramElement sortedDiagramElement = sortedDiagramElements[i]; if (!inserted) { if (!inserted && sortedDiagramElement.element is UML.Classes.Kernel.Relationship && !(diagramElement.element is UML.Classes.Kernel.Relationship)) { sortedDiagramElements.Insert(i, diagramElement); inserted = true; } else if (!inserted && sortedDiagramElement.element is UML.Classes.Kernel.Classifier && diagramElement.element is UML.Classes.Kernel.Classifier) { // check if the diagramelement.element is in the targets of // the directed relationships of the sorted element foreach (UML.Classes.Kernel.DirectedRelationship relation in sortedDiagramElement.element.getRelationships <UML.Classes.Kernel.DirectedRelationship>()) { if (diagramElement.element.Equals(relation.target)) { sortedDiagramElements.Insert(i, diagramElement); inserted = true; } } } if (i == sortedDiagramElements.Count - 1) { //if we reached the end then just add the element to the end sortedDiagramElements.Add(diagramElement); inserted = true; } } } } } return(sortedDiagramElements); }
public HashSet <UML.Diagrams.DiagramElement> createDiagramElements (List <UML.Classes.Kernel.Element> elements, Diagram diagram) { HashSet <UML.Diagrams.DiagramElement> returnedDiagramElements = new HashSet <UML.Diagrams.DiagramElement>(); foreach (UML.Classes.Kernel.Element element in elements) { UML.Diagrams.DiagramElement diagramElement = null; if (element is ConnectorWrapper) { diagramElement = new DiagramLinkWrapper (this.model as Model, element as ConnectorWrapper, diagram); // don't return isHidden relations if (((DiagramLinkWrapper)diagramElement).isHidden) { diagramElement = null; } } else if (element is ElementWrapper) { diagramElement = new DiagramObjectWrapper (this.model as Model, element as ElementWrapper, diagram); } if (diagramElement != null) { returnedDiagramElements.Add(diagramElement); } } return(returnedDiagramElements); }
/// clones a diagram cloning all diagramElements and their related /// elements public UML.Diagrams.Diagram cloneDiagram(UML.Classes.Kernel.Element owner, UML.Diagrams.Diagram diagram) { Dictionary <UML.Diagrams.DiagramElement, UML.Diagrams.DiagramElement> diagramElementsMap = new Dictionary <UML.Diagrams.DiagramElement, UML.Diagrams.DiagramElement>(); Dictionary <UML.Classes.Kernel.Element, UML.Classes.Kernel.Element> elementsMap = new Dictionary <UML.Classes.Kernel.Element, UML.Classes.Kernel.Element>(); UML.Diagrams.Diagram clonedDiagram = null; if (diagram is UML.Diagrams.ClassDiagram) { clonedDiagram = this.createNewDiagram <UML.Diagrams.ClassDiagram>(owner, diagram.name); } else if (diagram is UML.Diagrams.SequenceDiagram) { clonedDiagram = this.createNewDiagram <UML.Diagrams.SequenceDiagram>(owner, diagram.name); } clonedDiagram.name = diagram.name; clonedDiagram.width = diagram.width; clonedDiagram.height = diagram.height; clonedDiagram.comment = diagram.comment; List <UML.Diagrams.DiagramElement> diagramElements = diagram.diagramElements.ToList(); diagramElements = this.sortDiagramElements(diagramElements); foreach (UML.Diagrams.DiagramElement diagramElement in diagramElements) { UML.Diagrams.DiagramElement clonedDiagramElement = this.cloneDiagramElement(clonedDiagram, diagramElement, elementsMap); if (clonedDiagramElement != null) { diagramElementsMap.Add(diagramElement, clonedDiagramElement); elementsMap.Add(diagramElement.element, clonedDiagramElement.element); } } foreach (UML.Classes.Kernel.Element element in elementsMap.Keys) { foreach (UML.Classes.Kernel.Element subElement in element.ownedElements) { this.cloneElement(elementsMap[element], subElement, elementsMap, true); } } return(clonedDiagram); }
public UML.Diagrams.DiagramElement cloneDiagramElement (UML.Diagrams.Diagram ownerDiagram, UML.Diagrams.DiagramElement diagramElement, Dictionary <UML.Classes.Kernel.Element, UML.Classes.Kernel.Element> clonedElementsMap) { // clone the element itself UML.Classes.Kernel.Element clonedElement = this.cloneElement(ownerDiagram.owner, diagramElement.element, clonedElementsMap, false); // create the new DiagramElement UML.Diagrams.DiagramElement clonedDiagramElement = this.createNewDiagramElement(ownerDiagram, clonedElement); if (clonedDiagramElement != null) { // copy the attributes clonedDiagramElement.xPosition = diagramElement.xPosition; clonedDiagramElement.yPosition = diagramElement.yPosition; } return(clonedDiagramElement); }