Ejemplo n.º 1
0
        /// 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);
        }
Ejemplo n.º 3
0
        /// 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);
        }
Ejemplo n.º 4
0
        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);
        }