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;
            }

            ReferenceRelationship referenceRelationship = e.ModelElement as ReferenceRelationship;

            if (referenceRelationship != null)
            {
                if (referenceRelationship.ReferenceRSNode != null)
                {
                    referenceRelationship.ReferenceRSNode.Delete();
                }
            }

            EmbeddingRelationship embeddingRelationship = e.ModelElement as EmbeddingRelationship;

            if (embeddingRelationship != null)
            {
                if (embeddingRelationship.EmbeddingRSNode != null)
                {
                    embeddingRelationship.EmbeddingRSNode.Delete();
                }
            }

            DomainClassReferencesBaseClass inhRelationship = e.ModelElement as DomainClassReferencesBaseClass;

            if (inhRelationship != null)
            {
                InheritanceNode node = inhRelationship.Store.ElementDirectory.FindElement(inhRelationship.InhNodeId) as InheritanceNode;
                if (node != null)
                {
                    if (node.IsElementHolder)
                    {
                        RootNode rootNode = new RootNode(node.Store);
                        rootNode.DomainElement = node.DomainElement;

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

                        // 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;
                        }

                        node.DomainElement.ParentModelContext.ViewContext.DomainModelTreeView.RootNodes.Add(rootNode);
                        node.DomainElement.ParentModelContext.ViewContext.DomainModelTreeView.ModelTreeNodes.Add(rootNode);
                    }

                    // connection was deleted using the property window and not the menu item, so delete the rs and the
                    // node here
                    //if (inhNode.IsElementHolder)
                    //    TreeOperations.SplitTree(inhNode);

                    node.Delete();
                }
            }
        }
        public override void RolePlayerChanged(RolePlayerChangedEventArgs e)
        {
            if (e.ElementLink != null)
            {
                if (e.ElementLink.Store.TransactionManager.CurrentTransaction != null)
                {
                    if (e.ElementLink.Store.TransactionManager.CurrentTransaction.IsSerializing)
                    {
                        return;
                    }
                }
            }

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

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

            DomainClassReferencesBaseClass con = e.ElementLink as DomainClassReferencesBaseClass;

            if (con != null)
            {
                if (con.BaseClass != null)
                {
                    TreeNode elementHolderNode = null;
                    foreach (TreeNode node in con.BaseClass.DomainModelTreeNodes)
                    {
                        if (node.IsElementHolder)
                        {
                            elementHolderNode = node;
                            break;
                        }
                    }

                    if (elementHolderNode == null)
                    {
                        throw new ArgumentNullException("elementHolderNode");
                    }

                    // we need to delte the old inheritance node and add a new one for the changed inheritance relationship
                    InheritanceNode inhNodeOld = con.Store.ElementDirectory.FindElement(con.InhNodeId) as InheritanceNode;
                    if (inhNodeOld == null)
                    {
                        return;
                    }

                    // create new inheritance node
                    InheritanceNode inhNode = new InheritanceNode(con.Store);
                    inhNode.DomainElement              = con.DerivedClass;
                    inhNode.IsElementHolder            = inhNodeOld.IsElementHolder;
                    inhNode.IsExpanded                 = inhNodeOld.IsExpanded;
                    inhNode.InhRelationshipId          = con.Id;
                    inhNode.IsEmbeddingTreeExpanded    = inhNodeOld.IsEmbeddingTreeExpanded;
                    inhNode.IsInheritanceTreeExpanded  = inhNodeOld.IsInheritanceTreeExpanded;
                    inhNode.IsReferenceTreeExpanded    = inhNodeOld.IsReferenceTreeExpanded;
                    inhNode.IsShapeMappingTreeExpanded = inhNodeOld.IsShapeMappingTreeExpanded;
                    con.InhNodeId = inhNode.Id;

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

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

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

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

                    elementHolderNode.InheritanceNodes.Add(inhNode);
                    con.DerivedClass.ModelContext.ViewContext.DomainModelTreeView.ModelTreeNodes.Add(inhNode);

                    inhNodeOld.Delete();
                }
            }
        }