/// <inheritdoc />
        public override void ElementDeleting(ElementDeletingEventArgs e)
        {
            base.ElementDeleting(e);

            ModelDiagramData element = (ModelDiagramData)e.ModelElement;
            Store            store   = element.Store;
            Transaction      current = store.TransactionManager.CurrentTransaction;

            if (current.IsSerializing || ModelRoot.BatchUpdating)
            {
                return;
            }

            if (BooleanQuestionDisplay.Show($"About to permanently delete diagram named {element.Name} - are you sure?") != true)
            {
                current.Rollback();

                return;
            }

            EFModelDiagram diagram = element.GetDiagram();

            ModelDiagramData.CloseDiagram?.Invoke(diagram);
            diagram.Delete();
        }
        public override void ElementPropertyChanged(ElementPropertyChangedEventArgs e)
        {
            base.ElementPropertyChanged(e);

            ModelDiagramData element = (ModelDiagramData)e.ModelElement;

            if (element.IsDeleted)
            {
                return;
            }

            Store       store = element.Store;
            Transaction currentTransaction = store.TransactionManager.CurrentTransaction;

            if (currentTransaction.IsSerializing)
            {
                return;
            }

            if (Equals(e.NewValue, e.OldValue))
            {
                return;
            }

            List <string> errorMessages = new List <string>();

            switch (e.DomainProperty.Name)
            {
            case "Name":
                if (string.IsNullOrWhiteSpace(e.NewValue?.ToString()))
                {
                    errorMessages.Add("Diagram must have a name");
                    break;
                }

                if (store.ElementDirectory.AllElements.OfType <ModelDiagramData>().Where(d => d != element).Any(d => d.Name == e.NewValue.ToString()))
                {
                    errorMessages.Add("Diagram must have a unique name");
                    break;
                }

                EFModelDiagram diagram = element.GetDiagram();
                if (diagram != null)
                {
                    ModelDiagramData.CloseDiagram?.Invoke(diagram);
                    diagram.Name = element.Name = e.NewValue.ToString();
                }
                break;
            }

            errorMessages = errorMessages.Where(m => m != null).ToList();

            if (errorMessages.Any())
            {
                currentTransaction.Rollback();
                ErrorDisplay.Show(string.Join("\n", errorMessages));
            }
        }
        public override void ElementAdded(ElementAddedEventArgs e)
        {
            base.ElementAdded(e);

            ModelDiagramData element = (ModelDiagramData)e.ModelElement;
            Store            store   = element.Store;
            Transaction      current = store.TransactionManager.CurrentTransaction;

            if (current.IsSerializing || ModelRoot.BatchUpdating)
            {
                return;
            }

            ModelDiagramData.OpenDiagram?.Invoke(element.Name);
        }
        public override void ElementAdded(ElementAddedEventArgs e)
        {
            base.ElementAdded(e);

            ModelDiagramData element = (ModelDiagramData)e.ModelElement;
            Store            store   = element.Store;
            Transaction      current = store.TransactionManager.CurrentTransaction;

            if (current.IsSerializing || ModelRoot.BatchUpdating)
            {
                return;
            }

            ModelDiagramData.OpenDiagram?.Invoke(element);
            element.SetDiagram(store.ElementDirectory.AllElements.OfType <EFModelDiagram>().FirstOrDefault(d => d.Name == element.Name));
        }
        /// <summary>
        /// public virtual method for the client to have his own user-defined delete rule class
        /// </summary>
        /// <param name="e"></param>
        public override void ElementDeleted(ElementDeletedEventArgs e)
        {
            base.ElementDeleted(e);
            ModelDiagramData element = (ModelDiagramData)e.ModelElement;
            Store            store   = element.Store;
            Transaction      current = store.TransactionManager.CurrentTransaction;

            if (current.IsSerializing || ModelRoot.BatchUpdating)
            {
                return;
            }

            EFModelDiagram diagram = element.GetDiagram();

            ModelDiagramData.CloseDiagram?.Invoke(diagram);
            diagram.Delete();
        }
Exemple #6
0
        public override void ElementAdded(ElementAddedEventArgs e)
        {
            base.ElementAdded(e);

            ModelDiagramData element = (ModelDiagramData)e.ModelElement;
            Store            store   = element.Store;
            Transaction      current = store.TransactionManager.CurrentTransaction;

            if (current.IsSerializing || ModelRoot.BatchUpdating)
            {
                return;
            }

            ModelDiagramData.OpenDiagram?.Invoke(element);
            if (element.GetDiagram() == null)
            {
                element.SetDiagram(store.GetAll <EFModelDiagram>().FirstOrDefault(d => d.Name == store.ModelRoot().GetFileName()));
            }
        }
        public virtual ModelRoot LoadModelAndDiagrams(DslModeling::SerializationResult serializationResult, DslModeling::Partition modelPartition, string modelFileName, DslModeling::Partition diagramsPartition, string diagramsFileName, DslModeling::ISchemaResolver schemaResolver, DslValidation::ValidationController validationController, DslModeling::ISerializerLocator serializerLocator)
        {
            #region Check Parameters
            if (serializationResult == null)
            {
                throw new global::System.ArgumentNullException("serializationResult");
            }
            if (modelPartition == null)
            {
                throw new global::System.ArgumentNullException("modelPartition");
            }
            if (diagramsPartition == null)
            {
                throw new global::System.ArgumentNullException("diagramsPartition");
            }
            if (string.IsNullOrEmpty(diagramsFileName))
            {
                throw new global::System.ArgumentNullException("diagramsFileName");
            }
            #endregion

            ModelRoot modelRoot;

            // Ensure there is an outer transaction spanning both model and diagram load, so moniker resolution works properly.
            if (!diagramsPartition.Store.TransactionActive)
            {
                throw new global::System.InvalidOperationException(EFModelDomainModel.SingletonResourceManager.GetString("MissingTransaction"));
            }

            modelRoot = this.LoadModel(serializationResult, modelPartition, modelFileName, schemaResolver, validationController, serializerLocator);
            ModelDiagramData data = null;

            if (serializationResult.Failed)
            {
                // don't try to deserialize diagram data if model load failed.
                return(modelRoot);
            }

            if (IsValid(diagramsFileName))
            {
                using (var pkgOutputDoc = global::System.IO.Packaging.Package.Open(diagramsFileName, global::System.IO.FileMode.Open, global::System.IO.FileAccess.Read))
                {
                    foreach (var packagePart in pkgOutputDoc.GetParts())
                    {
                        EFModelDiagram diagram = this.LoadDiagram(serializationResult
                                                                  , modelPartition
                                                                  , modelFileName
                                                                  , diagramsFileName
                                                                  , modelRoot
                                                                  , diagramsPartition
                                                                  , packagePart.GetStream(global::System.IO.FileMode.Open, global::System.IO.FileAccess.Read)
                                                                  , schemaResolver
                                                                  , validationController
                                                                  , serializerLocator) as EFModelDiagram;

                        if (diagram != null)
                        {
                            data = FixupDiagramData(diagram);
                        }

                        if (diagram.Name == Path.GetFileNameWithoutExtension(diagramsFileName).Split(new[] { '.' }, StringSplitOptions.RemoveEmptyEntries).First())
                        {
                            data.SetLocks(Locks.All);
                        }
                    }
                }
            }
            else
            {
                // missing diagram file indicates we should create a new diagram.
                EFModelDiagram diagram = this.LoadDiagram(serializationResult
                                                          , modelPartition
                                                          , modelFileName
                                                          , diagramsFileName
                                                          , modelRoot
                                                          , diagramsPartition
                                                          , global::System.IO.Stream.Null
                                                          , schemaResolver
                                                          , validationController
                                                          , serializerLocator) as EFModelDiagram;
                if (diagram != null)
                {
                    data = FixupDiagramData(diagram);
                }

                if (diagram.Name == Path.GetFileNameWithoutExtension(diagramsFileName))
                {
                    data.SetLocks(Locks.All);
                }
            }

            modelRoot.Store
            .GetAll <ModelDiagramData>()
            .Where(d => d.GetDiagram() == null)
            .ToList()
            .ForEach(d => modelRoot.Diagrams.Remove(d));

            return(modelRoot);

            ModelDiagramData FixupDiagramData(EFModelDiagram diagram)
            {
                ModelDiagramData diagramData = modelRoot.Store
                                               .GetAll <ModelDiagramData>()
                                               .FirstOrDefault(d => d.Name == diagram.Name);

                if (diagramData == null)
                {
                    modelRoot.Diagrams.Add(diagramData = new ModelDiagramData(modelRoot.Store.DefaultPartition
                                                                              , new DslModeling.PropertyAssignment(ModelDiagramData.NameDomainPropertyId, diagram.Name)));
                }

                diagramData.SetDiagram(diagram);
                return(diagramData);
            }
        }