/// <summary> /// Adds a proto element to the current element. /// </summary> /// <param name="protoElement">Proto element representation of the element that is to be added.</param> /// <param name="groupMerger"> /// Group merger class used to track id mapping, merge errors/warnings and /// postprocess merging by rebuilding reference relationships. /// </param> /// <param name="isRoot">Root element?</param> public virtual void ModelMerge(DslEditorModeling::ModelProtoElement protoElement, DslEditorModeling::ModelProtoGroupMerger groupMerger, bool isRoot) { if( !ModelIsPasteAllowed(groupMerger.ProtoGroup.Operation) ) { // add warning message groupMerger.MergeResult.AddMessage(new DslEditorModeling::ValidationMessage("ModelMergePasteDisallowedId", DslEditorModeling.ModelValidationViolationType.Warning, "Element couldn't be addded to DiagramClassView because paste is not allowed.")); return; } if (protoElement != null) { DslModeling::DomainClassInfo elementDomainInfo = this.Partition.DomainDataDirectory.GetDomainClass(protoElement.DomainClassId); if (elementDomainInfo.IsDerivedFrom(global::Tum.PDE.LanguageDSL.RootDiagramNode.DomainClassId)) { // get element id System.Guid newElementId = System.Guid.NewGuid(); // create property assignments DslModeling::PropertyAssignment[] propertyAssignemnts = protoElement.GetPropertyAssignments(this.Store.DefaultPartition, newElementId); // create the actual model element global::Tum.PDE.LanguageDSL.RootDiagramNode element = null; if( global::Tum.PDE.LanguageDSL.RootDiagramNode.DomainClassId == elementDomainInfo.Id ) element = new global::Tum.PDE.LanguageDSL.RootDiagramNode(this.Store, propertyAssignemnts); if( element == null ) throw new System.ArgumentNullException("Element is null in ModelMerge: " + elementDomainInfo.Name); if( !element.ModelIsPasteAllowed(groupMerger.ProtoGroup.Operation) ) { // add warning message groupMerger.MergeResult.AddMessage(new DslEditorModeling.ValidationMessage("ModelMergePasteDisallowedId", DslEditorModeling.ModelValidationViolationType.Warning, "Element couldn't be addded to DiagramClassView because paste is not allowed.")); element.Delete(); return; } if( isRoot && groupMerger.ProtoGroup.Operation != DslEditorModeling.ModelProtoGroupOperation.Move) { //element.Name = "Copy of " + element.Name; } // update id mapping groupMerger.SetIdMapping(protoElement.ElementId, newElementId); // add child element GetRoleCollection<DslModeling::LinkedElementCollection<global::Tum.PDE.LanguageDSL.RootDiagramNode>, global::Tum.PDE.LanguageDSL.RootDiagramNode>(global::Tum.PDE.LanguageDSL.DiagramClassViewHasRootDiagramNodes.DiagramClassViewDomainRoleId).Add(element); // continue with child elements (Embedding Relationship) System.Collections.Generic.List<DslEditorModeling::ModelProtoElement> embeddedProtoElements = groupMerger.GetEmbeddedElements(this.Store.DefaultPartition, protoElement); if( embeddedProtoElements.Count > 0 ) { foreach (DslEditorModeling::ModelProtoElement p in embeddedProtoElements) (element as DslEditorModeling::IModelMergeElements).ModelMerge(p, groupMerger, false); } } } }