Пример #1
0
        public override void ElementDeleting(ElementDeletingEventArgs e)
        {
            if (e.ModelElement != null)
            {
                if (e.ModelElement.Store.TransactionManager.CurrentTransaction != null)
                {
                    if (e.ModelElement.Store.TransactionManager.CurrentTransaction.IsSerializing)
                    {
                        return;
                    }
                }
            }

            if (e.ModelElement == null)
            {
                return;
            }

            if (ImmutabilityExtensionMethods.GetLocks(e.ModelElement) != Locks.None)
            {
                return;
            }

            TreeNodeReferencesReferenceRSNodes con = e.ModelElement as TreeNodeReferencesReferenceRSNodes;

            if (con != null)
            {
                ReferenceRSNode rsNode = con.ReferenceRSNode;
                if (rsNode != null)
                {
                    ReferenceNode node = rsNode.ReferenceNode;
                    if (node != null)
                    {
                        // since this node still exists, it isnt included in the deletion process
                        // --> move to root node if this node is the element holder, as its parent has been deleted
                        if (node.IsElementHolder)
                        {
                            RootNode rootNode = new RootNode(node.Store);
                            rootNode.DomainElement = node.DomainElement;

                            node.EmbeddingModelTreeViewModel.RootNodes.Add(rootNode);
                            node.EmbeddingModelTreeViewModel.ModelTreeNodes.Add(rootNode);

                            // copy sub tree
                            for (int i = node.EmbeddingRSNodes.Count - 1; i >= 0; i--)
                            {
                                node.EmbeddingRSNodes[i].TreeNode = rootNode;
                            }

                            for (int i = node.ReferenceRSNodes.Count - 1; i >= 0; i--)
                            {
                                node.ReferenceRSNodes[i].TreeNode = rootNode;
                            }

                            for (int i = node.InheritanceNodes.Count - 1; i >= 0; i--)
                            {
                                node.InheritanceNodes[i].TreeNode = rootNode;
                            }

                            for (int i = node.ShapeClassNodes.Count - 1; i >= 0; i--)
                            {
                                node.ShapeClassNodes[i].TreeNode = rootNode;
                            }

                            rootNode.IsElementHolder         = true;
                            rootNode.IsEmbeddingTreeExpanded = node.IsEmbeddingTreeExpanded;
                            rootNode.IsExpanded = true;
                            rootNode.IsInheritanceTreeExpanded  = node.IsInheritanceTreeExpanded;
                            rootNode.IsReferenceTreeExpanded    = node.IsReferenceTreeExpanded;
                            rootNode.IsShapeMappingTreeExpanded = node.IsShapeMappingTreeExpanded;
                        }

                        node.Delete();
                    }

                    rsNode.Delete();
                }
            }
        }