/// <summary>
        /// Constuctor.
        /// </summary>
        /// <param name="viewModelStore">The store this view model belongs to.</param>
        public ModelContextViewModel(ViewModelStore viewModelStore, BaseModelContext baseModelContext, bool isLocked)
            : base(viewModelStore)
        {
            this.modelContext = baseModelContext;
            
            this.copyCommand = new DelegateCommand(CopyCommand_Executed, CopyCommand_CanExecute);
            this.pasteCommand = new DelegateCommand(PasteCommand_Executed, PasteCommand_CanExecute);
            this.copyAllTreeCommand = new DelegateCommand(CopyAllTreeCommand_Executed, CopyAllTreeCommand_CanExecute);
            this.copyEmbeddingTreeCommand = new DelegateCommand(CopyEmbeddingTreeCommand_Executed, CopyAllTreeCommand_CanExecute);
            this.copyReferenceTreeCommand = new DelegateCommand(CopyReferenceTreeCommand_Executed, CopyAllTreeCommand_CanExecute);
            //this.cutCommand = new DelegateCommand(CutCommand_Executed, CutCommand_CanExecute);
            this.optimizeCommand = new DelegateCommand(OptimizeCommand_Executed);

            if (baseModelContext is ModelContext)
            {
                ModelContext modelContext = baseModelContext as ModelContext;

                this.modelTreeViewModel = new ModelTreeViewModel(viewModelStore, this, modelContext.ViewContext.DomainModelTreeView);
                this.modelTreeViewModel.IsLocked = isLocked;
                this.diagramViewModel = new DiagramViewModel(viewModelStore, this, modelContext.ViewContext.DiagramView);
                this.serializationViewModel = new SerializationViewModel(viewModelStore, modelContext.SerializationModel);

                this.modelContextType = ModelContextViewType.ModelContext;
            }
            else if( baseModelContext is ExternModelContext)
            {
                ExternModelContext modelContext = baseModelContext as ExternModelContext;
                if (modelContext.ModelContext != null)
                {
                    this.AddModelContext(modelContext.ModelContext);
                }

            	this.EventManager.GetEvent<ModelElementLinkAddedEvent>().Subscribe(this.Store.DomainDataDirectory.GetDomainRelationship(ExternModelContextReferencesModelContext.DomainClassId),
                	true, this.modelContext.Id, new System.Action<ElementAddedEventArgs>(OnModelContextAdded));
                this.EventManager.GetEvent<ModelElementLinkDeletedEvent>().Subscribe(this.Store.DomainDataDirectory.GetDomainRelationship(ExternModelContextReferencesModelContext.DomainClassId),
                	true, this.modelContext.Id, new System.Action<ElementDeletedEventArgs>(OnModelContextRemoved));
                this.EventManager.GetEvent<ModelRolePlayerChangedEvent>().Subscribe(this.Store.DomainDataDirectory.GetDomainRole(ExternModelContextReferencesModelContext.ExternModelContextDomainRoleId),
                	new System.Action<RolePlayerChangedEventArgs>(OnModelContextChanged));
                this.EventManager.GetEvent<ModelRolePlayerChangedEvent>().Subscribe(this.Store.DomainDataDirectory.GetDomainRole(ExternModelContextReferencesModelContext.ModelContextDomainRoleId),
                	new System.Action<RolePlayerChangedEventArgs>(OnModelContextChanged));                

                this.modelContextType = ModelContextViewType.ExternModelContext;
                
            }
            else if (baseModelContext is LibraryModelContext)
            {
                LibraryModelContext modelContext = baseModelContext as LibraryModelContext;
                this.modelTreeViewModel = new ModelTreeViewModel(viewModelStore, this, modelContext.ViewContext.DomainModelTreeView);
                this.modelTreeViewModel.IsLocked = isLocked;
                this.diagramViewModel = new DiagramViewModel(viewModelStore, this, modelContext.ViewContext.DiagramView);
                this.modelContextType = ModelContextViewType.LibraryContext;
                this.serializationViewModel = new SerializationViewModel(viewModelStore, modelContext.SerializationModel);
            }

            this.selectedItem = this.ModelTreeViewModel;

            if( this.ModelContext != null )
                this.EventManager.GetEvent<ModelElementPropertyChangedEvent>().Subscribe(
                    this.Store.DomainDataDirectory.GetDomainProperty(BaseModelContext.NameDomainPropertyId), this.ModelContext.Id, new System.Action<ElementPropertyChangedEventArgs>(NamePropertyChanged));
        }
        /// <summary>
        /// Constuctor.
        /// </summary>
        /// <param name="viewModelStore">The store this view model belongs to.</param>
        /// <param name="diagramClass">Element to be hosted by this view model.</param>
        public DiagramClassViewModel(ViewModelStore viewModelStore, DiagramClassView diagramClassView, DiagramViewModel parent)
            : base(viewModelStore, diagramClassView.DiagramClass)
        {
            this.diagramClassView = diagramClassView;
            this.parent = parent;

            this.rootNodeVMs = new ObservableCollection<RootDiagramNodeViewModel>();
            this.rootNodeVMsRO = new ReadOnlyObservableCollection<RootDiagramNodeViewModel>(this.rootNodeVMs);

            this.includedDCVMs = new ObservableCollection<IncludedDiagramClassViewModel>();
            this.includedDCVMsRO = new ReadOnlyObservableCollection<IncludedDiagramClassViewModel>(includedDCVMs);

            this.importedDCCVMs = new ObservableCollection<ImportedDiagramClassViewModel>();
            this.importedDCCVMsRO = new ReadOnlyObservableCollection<ImportedDiagramClassViewModel>(importedDCCVMs);

            if (this.DiagramClassView != null)
            {
                this.EventManager.GetEvent<ModelElementPropertyChangedEvent>().Subscribe(this.DiagramClassView.Id, new Action<ElementPropertyChangedEventArgs>(OnElementPropertyChanged));
                
                if (this.DiagramClassView.DiagramClass != null)
                    this.EventManager.GetEvent<ModelElementPropertyChangedEvent>().Subscribe(this.DiagramClassView.DiagramClass.Id, new Action<ElementPropertyChangedEventArgs>(OnElementPropertyChanged));

                this.EventManager.GetEvent<ModelElementLinkAddedEvent>().Subscribe(this.Store.DomainDataDirectory.GetDomainRelationship(DiagramClassViewHasRootDiagramNodes.DomainClassId),
                    true, this.DiagramClassView.Id, new Action<ElementAddedEventArgs>(OnRootDiagramNodeAdded));

                this.EventManager.GetEvent<ModelElementLinkDeletedEvent>().Subscribe(this.Store.DomainDataDirectory.GetDomainRelationship(DiagramClassViewHasRootDiagramNodes.DomainClassId),
                    true, this.DiagramClassView.Id, new Action<ElementDeletedEventArgs>(OnRootDiagramNodeRemoved));

                this.EventManager.GetEvent<ModelRolePlayerMovedEvent>().Subscribe(this.Store.DomainDataDirectory.GetDomainRelationship(DiagramClassViewHasRootDiagramNodes.DomainClassId),
                    this.DiagramClassView.Id, new Action<RolePlayerOrderChangedEventArgs>(OnRootDiagramNodeMoved));

                this.EventManager.GetEvent<ModelRolePlayerChangedEvent>().Subscribe(this.Store.DomainDataDirectory.GetDomainRole(DiagramClassViewHasRootDiagramNodes.DiagramClassViewDomainRoleId),
                    new Action<RolePlayerChangedEventArgs>(OnRootDiagramNodeChanged));
            }

            if (this.GetHostedElement() is DesignerDiagramClass)
            {
                this.EventManager.GetEvent<ModelElementLinkAddedEvent>().Subscribe(this.Store.DomainDataDirectory.GetDomainRelationship(DesignerDiagramClassReferencesIncludedDiagramClasses.DomainClassId),
                    true, this.GetHostedElement().Id, new Action<ElementAddedEventArgs>(OnIncludedDDCAdded));

                this.EventManager.GetEvent<ModelElementLinkDeletedEvent>().Subscribe(this.Store.DomainDataDirectory.GetDomainRelationship(DesignerDiagramClassReferencesIncludedDiagramClasses.DomainClassId),
                    true, this.GetHostedElement().Id, new Action<ElementDeletedEventArgs>(OnIncludedDDCRemoved));

                this.EventManager.GetEvent<ModelElementLinkAddedEvent>().Subscribe(this.Store.DomainDataDirectory.GetDomainRelationship(DesignerDiagramClassReferencesImportedDiagramClasses.DomainClassId),
                    true, this.GetHostedElement().Id, new Action<ElementAddedEventArgs>(OnImportedDCAdded));

                this.EventManager.GetEvent<ModelElementLinkDeletedEvent>().Subscribe(this.Store.DomainDataDirectory.GetDomainRelationship(DesignerDiagramClassReferencesImportedDiagramClasses.DomainClassId),
                    true, this.GetHostedElement().Id, new Action<ElementDeletedEventArgs>(OnImportedDCRemoved));
            }
        }
        /// <summary>
        /// Constuctor.
        /// </summary>
        /// <param name="viewModelStore">The store this view model belongs to.</param>
        /// <param name="diagramClass">Element to be hosted by this view model.</param>
        public ModalDiagramViewModel(ViewModelStore viewModelStore, DiagramClassView diagramClassView, DiagramViewModel parent)
            : base(viewModelStore, diagramClassView, parent)
        {
            ModalDiagram diagramClass = diagramClassView.DiagramClass as ModalDiagram;
            if (diagramClass.DomainClass != null)
            {
                this.ReferenceVM = new BaseModelElementViewModel(this.ViewModelStore, diagramClass, true);
            }

            this.EventManager.GetEvent<ModelElementLinkAddedEvent>().Subscribe(this.Store.DomainDataDirectory.GetDomainRelationship(ModalDiagramReferencesDomainClass.DomainClassId),
                true, diagramClass.Id, new Action<ElementAddedEventArgs>(OnReferenceAdded));

            this.EventManager.GetEvent<ModelElementLinkDeletedEvent>().Subscribe(this.Store.DomainDataDirectory.GetDomainRelationship(ModalDiagramReferencesDomainClass.DomainClassId),
                true, diagramClass.Id, new Action<ElementDeletedEventArgs>(OnReferenceRemoved));

            this.EventManager.GetEvent<ModelRolePlayerChangedEvent>().Subscribe(this.Store.DomainDataDirectory.GetDomainRole(ModalDiagramReferencesDomainClass.DomainClassDomainRoleId),
                new Action<RolePlayerChangedEventArgs>(OnReferenceChanged));
        }
        /// <summary>
        /// Constuctor.
        /// </summary>
        /// <param name="viewModelStore">The store this view model belongs to.</param>
        /// <param name="diagramClass">Element to be hosted by this view model.</param>
        public SpecificElementsDiagramViewModel(ViewModelStore viewModelStore, DiagramClassView diagramClassView, DiagramViewModel parent)
            : base(viewModelStore, diagramClassView, parent)
        {
            this.referenceVMs = new ObservableCollection<BaseModelElementViewModel>();
            this.deleteCommand = new DelegateCommand<BaseModelElementViewModel>(DeleteCommand_Executed);

            SpecificElementsDiagram diagramClass = diagramClassView.DiagramClass as SpecificElementsDiagram;
            foreach (DomainClass d in diagramClass.DomainClasses)
                this.AddReference(d);

            this.EventManager.GetEvent<ModelElementLinkAddedEvent>().Subscribe(this.Store.DomainDataDirectory.GetDomainRelationship(SpecificElementsDiagramReferencesDomainClasses.DomainClassId),
                true, diagramClass.Id, new Action<ElementAddedEventArgs>(OnReferenceAdded));

            this.EventManager.GetEvent<ModelElementLinkDeletedEvent>().Subscribe(this.Store.DomainDataDirectory.GetDomainRelationship(SpecificElementsDiagramReferencesDomainClasses.DomainClassId),
                true, diagramClass.Id, new Action<ElementDeletedEventArgs>(OnReferenceRemoved));

            this.EventManager.GetEvent<ModelRolePlayerChangedEvent>().Subscribe(this.Store.DomainDataDirectory.GetDomainRole(SpecificElementsDiagramReferencesDomainClasses.DomainClassDomainRoleId),
                new Action<RolePlayerChangedEventArgs>(OnReferenceChanged));
            this.EventManager.GetEvent<ModelRolePlayerChangedEvent>().Subscribe(this.Store.DomainDataDirectory.GetDomainRole(SpecificElementsDiagramReferencesDomainClasses.SpecificElementsDiagramDomainRoleId),
                new Action<RolePlayerChangedEventArgs>(OnReferenceChanged));
        }
 /// <summary>
 /// Constuctor.
 /// </summary>
 /// <param name="viewModelStore">The store this view model belongs to.</param>
 /// <param name="diagramClass">Element to be hosted by this view model.</param>
 public SpecificDependencyDiagramViewModel(ViewModelStore viewModelStore, DiagramClassView diagramClassView, DiagramViewModel parent)
     : base(viewModelStore, diagramClassView, parent)
 {
 }