/// <summary> /// Finalize. This method is called on each copied element once all the elements and links are processed. /// </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> public virtual void ModelFinalize(ModelProtoElement protoElement, ModelProtoGroupMerger groupMerger) { if (protoElement.CustomArguments is DiagramModelMergeOptions) { DiagramModelMergeOptions options = protoElement.CustomArguments as DiagramModelMergeOptions; Guid elementID = options.ElementId; ModelProtoElement elementP = groupMerger.GetElementById(elementID); if (elementP != null) { (this.Element as IModelMergeElements).ModelFinalize(elementP, groupMerger); } NodeShape shape = this.Store.ElementDirectory.FindElement( groupMerger.GetIdMapping(protoElement.ElementId)) as NodeShape; // restore layout Store store = new Microsoft.VisualStudio.Modeling.Store(typeof(DiagramsDSLDomainModel)); LayoutInfo info; using (Transaction t = store.TransactionManager.BeginTransaction()) { info = options.GetLayoutInfo(store); t.Commit(); } LayoutHelper.ApplyLayout(this, this.Diagram, info); store.Dispose(); if (!shape.IsRelativeChildShape) { shape.SetLocation(new PointD(RelativePastePoint.X + options.RelativeLocation.X, RelativePastePoint.Y + options.RelativeLocation.Y)); } } }
/// <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(ModelProtoElement protoElement, ModelProtoGroupMerger groupMerger, bool isRoot) { if (protoElement.CustomArguments is DiagramModelMergeOptions) { DiagramModelMergeOptions options = protoElement.CustomArguments as DiagramModelMergeOptions; Guid elementID = options.ElementId; ModelProtoElement elementP = groupMerger.GetElementById(elementID); if (elementP != null) { (this.Element as IModelMergeElements).ModelMerge(elementP, groupMerger, isRoot); } ModelElement copiedElement = this.Store.ElementDirectory.FindElement(groupMerger.GetIdMapping(options.ElementId)); // create shape for that element this.FixUpMissingShapes(); NodeShape shape = DiagramHelper.FindShape(this.Store, options.ShapeDomainClassId, copiedElement.Id) as NodeShape; if (shape != null) { groupMerger.SetIdMapping(protoElement.ElementId, shape.Id); } } }
/// <summary> /// Decides whether the element that is represented by the proto element can be pasted or not. /// </summary> /// <param name="protoElement">Proto element representation of the element.</param> /// <param name="protoGroup">Proto group the proto element belongs to.</param> /// <returns>True if the element can be pasted. False otherwise.</returns> public virtual bool ModelCanMerge(ModelProtoElement protoElement, ModelProtoGroup protoGroup) { if (protoGroup.Operation == ModelProtoGroupOperation.Move) { return(false); } if (protoElement.CustomArguments is DiagramModelMergeOptions) { DiagramModelMergeOptions options = protoElement.CustomArguments as DiagramModelMergeOptions; return(this.CanHostShape(options.ShapeDomainClassId)); } return(false); }
/// <summary> /// Decides whether the element that is represented by the proto element can be pasted or not. /// </summary> /// <param name="protoElement">Proto element representation of the element.</param> /// <param name="protoGroup">Proto group the proto element belongs to.</param> /// <returns>True if the element can be pasted. False otherwise.</returns> public virtual bool ModelCanMerge(ModelProtoElement protoElement, ModelProtoGroup protoGroup) { if (protoGroup.Operation == ModelProtoGroupOperation.Move) { return(false); } if (protoElement.CustomArguments is DiagramModelMergeOptions) { DiagramModelMergeOptions options = protoElement.CustomArguments as DiagramModelMergeOptions; Guid elementID = options.ElementId; ModelProtoElement elementP = protoGroup.GetProtoElementFor(elementID, this.Partition); if (elementP != null) { return((this.Element as IModelMergeElements).ModelCanMerge(elementP, protoGroup)); } } return(false); }
/// <summary> /// Processes a proto element representation of the element and adds required proto links. /// This method is called on base classes from derived classes. /// /// Hint: Properties do not need to be added in this method. /// </summary> /// <param name="protoElement">Proto element representation of the element.</param> /// <param name="protoGroup">Proto group the proto element belongs to.</param> public virtual void ModelProcessMergeCopy(ModelProtoElement protoElement, ModelProtoGroup protoGroup) { if (protoGroup.Operation == ModelProtoGroupOperation.Copy) { (this.Element as IModelMergeElements).ModelCreateMergeCopy(protoGroup); } else { (this.Element as IModelMergeElements).ModelCreateMoveCopy(protoGroup); } // TODO: get parent element. this.Store.UndoManager.UndoState = UndoState.DisabledNoFlush; using (Transaction t = this.Store.TransactionManager.BeginTransaction()) { DiagramModelMergeOptions operations = new DiagramModelMergeOptions(LayoutHelper.CreateLayoutInfo( this, this.Diagram), this.Element.Id, this.Element.GetDomainClass().Id, this.GetDomainClass().Id); PointD relativeLocation = this.Location; if (!this.IsRelativeChildShape) { if (RelativeMinCopyPoint.X <= relativeLocation.X) { relativeLocation.X -= RelativeMinCopyPoint.X; } if (RelativeMinCopyPoint.Y <= relativeLocation.Y) { relativeLocation.Y -= RelativeMinCopyPoint.Y; } operations.RelativeLocation = relativeLocation; protoElement.CustomArguments = operations; } t.Commit(); } this.Store.UndoManager.UndoState = UndoState.Enabled; }
/// <summary> /// Processes a proto element representation of the element and adds required proto links. /// This method is called on base classes from derived classes. /// /// Hint: Properties do not need to be added in this method. /// </summary> /// <param name="protoElement">Proto element representation of the element.</param> /// <param name="protoGroup">Proto group the proto element belongs to.</param> public virtual void ModelProcessMergeCopy(ModelProtoElement protoElement, ModelProtoGroup protoGroup) { if( protoGroup.Operation == ModelProtoGroupOperation.Copy ) (this.Element as IModelMergeElements).ModelCreateMergeCopy(protoGroup); else (this.Element as IModelMergeElements).ModelCreateMoveCopy(protoGroup); // TODO: get parent element. this.Store.UndoManager.UndoState = UndoState.DisabledNoFlush; using (Transaction t = this.Store.TransactionManager.BeginTransaction()) { DiagramModelMergeOptions operations = new DiagramModelMergeOptions(LayoutHelper.CreateLayoutInfo( this, this.Diagram), this.Element.Id, this.Element.GetDomainClass().Id, this.GetDomainClass().Id); PointD relativeLocation = this.Location; if (!this.IsRelativeChildShape) { if (RelativeMinCopyPoint.X <= relativeLocation.X) relativeLocation.X -= RelativeMinCopyPoint.X; if (RelativeMinCopyPoint.Y <= relativeLocation.Y) relativeLocation.Y -= RelativeMinCopyPoint.Y; operations.RelativeLocation = relativeLocation; protoElement.CustomArguments = operations; } t.Commit(); } this.Store.UndoManager.UndoState = UndoState.Enabled; }