/// <summary>
        /// Converts the property value and returns the converted value.
        /// </summary>
        /// <returns>Converted property value.</returns>
        public override object GetPropertyValue()
        {
            global::Tum.VModellXT.Referenzmodell model = this.Elements[0] as global::Tum.VModellXT.Referenzmodell;

            if (model.VModell == null)
            {
                return("");
            }

            DslEditorModeling::IParentModelElement parent = model.GetDomainModelServices().ElementParentProvider.GetParentModelElement(model);

            if (parent == null)
            {
                throw new System.ArgumentNullException("Parent of element " + model.ToString() + " can not be null");
            }

            string path             = parent.DomainFilePath;
            string vModellDirectory = new System.IO.FileInfo(path).DirectoryName;

            global::Tum.VModellXT.VModell refModel = model.VModell;
            string curPath = Tum.PDE.ToolFramework.Modeling.Visualization.VMXExtensions.Path.PathHelper.EvaluateRelativePath(
                vModellDirectory, (refModel as DslEditorModeling::IParentModelElement).DomainFilePath);

            return(curPath);
        }
        /// <summary>
        /// Loads the model from the given file path and sets it to its appropriate element.
        /// </summary>
        /// <param name="filePath">File path to load the model from. Can be null to indicate that there is no referenced domain model.</param>
        protected override void SetReferencedModel(string filePath)
        {
            using (new Tum.PDE.ToolFramework.Modeling.Visualization.ViewModel.UI.WaitCursor())
            {
                global::Tum.VModellXT.Referenzmodell model = this.Elements[0] as global::Tum.VModellXT.Referenzmodell;
                string file = filePath;

                DslEditorModeling::IParentModelElement parent = model.GetDomainModelServices().ElementParentProvider.GetParentModelElement(model);
                if (parent == null)
                {
                    throw new System.ArgumentNullException("Parent of element " + model.ToString() + " can not be null");
                }

                string path             = parent.DomainFilePath;
                string vModellDirectory = new System.IO.FileInfo(path).DirectoryName;
                //string curPath = Tum.PDE.ToolFramework.Modeling.Visualization.VMXExtensions.Path.PathHelper.EvaluateRelativePath(
                //	vModellDirectory, file);

                // load model
                try
                {
                    if (!System.IO.File.Exists(file))
                    {
                        System.IO.FileStream s = System.IO.File.Create(file);
                        s.Close();
                    }

                    using (DslModeling::Transaction transaction = this.Store.TransactionManager.BeginTransaction("Set referenced model"))
                    {
                        global::Tum.VModellXT.VModellXTDocumentData data = this.ViewModelStore.ModelData as global::Tum.VModellXT.VModellXTDocumentData;
                        global::Tum.VModellXT.VModell referenceModel     = data.ModelContextVModellXT.LoadInternal(file) as  global::Tum.VModellXT.VModell;
                        model.VModell = referenceModel;

                        transaction.Commit();
                    }
                }
                catch (System.Exception ex)
                {
                    DslEditorViewModelServices::IMessageBoxService messageBox = this.GlobalServiceProvider.Resolve <DslEditorViewModelServices::IMessageBoxService>();
                    messageBox.ShowError(ex.Message);
                }

                this.ModelData.FlushUndoRedoStacks();
            }
        }
        /// <summary>
        /// Ensures that the user truly wants to remove a reference to a domain model.
        /// </summary>
        /// <returns>True to remove; False otherwise.</returns>
        protected override bool EnsureClosing()
        {
            if (!IsReferencedModelSet)
            {
                return(true);
            }

            global::Tum.VModellXT.Referenzmodell refModel = this.Elements[0] as global::Tum.VModellXT.Referenzmodell;

            // we need to gather references that will be deleted if the referenced model is removed

            // 1. gather excluded domain models
            System.Collections.Generic.List <DslModeling::ModelElement> excludedDomainModels = new System.Collections.Generic.List <DslModeling::ModelElement>();
            foreach (DslModeling::ModelElement domainModel in this.Store.ElementDirectory.FindElements(global::Tum.VModellXT.Referenzmodell.DomainClassId))
            {
                if (domainModel == refModel)
                {
                    continue;
                }

                DslModeling::ModelElement parent = domainModel;
                while (parent != null)
                {
                    parent = VModellXTElementParentProvider.Instance.GetParentModelElement(parent) as DslModeling::ModelElement;
                    if (parent == refModel)
                    {
                        excludedDomainModels.Add(parent);
                        break;
                    }
                }
            }

            // 2. add elements of those excluded domain models to get existing dependencies on them to
            // the actual domain models
            System.Collections.Generic.List <DslModeling::ModelElement> elements = VModellXTElementChildrenProvider.Instance.GetChildren(refModel.VModell, false);

            // 3. ensure user wants to continue
            using (DslEditorViewModelDeletion::DeletionViewModel vm = new DslEditorViewModelDeletion::DeletionViewModel(this.ViewModelStore))
            {
                vm.Set(elements, new RetrivalOptions(excludedDomainModels));
                vm.Description = "Attention: This deletion can not be undone! \r\n \r\n" + vm.Description;

                bool?result = this.GlobalServiceProvider.Resolve <DslEditorViewModelServices::IUIVisualizerService>().ShowDialog("DeleteElementsPopup", vm);
                if (!result == true)
                {
                    return(false);
                }
            }
            System.GC.Collect();

            // 4. delete referenced model and flush undo/redo stacks
            using (new Tum.PDE.ToolFramework.Modeling.Visualization.ViewModel.UI.WaitCursor())
            {
                using (DslModeling::Transaction transaction = this.Store.TransactionManager.BeginTransaction("Delete referenced model"))
                {
                    refModel.VModell.Delete();
                    transaction.Commit();
                }
            }
            this.ModelData.FlushUndoRedoStacks();

            return(true);
        }