// Copyright (C) Stichting Deltares 2016. All rights reserved. // // This file is part of Ringtoets. // // Ringtoets is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with this program. If not, see . // // All names, logos, and references to "Deltares" are registered trademarks of // Stichting Deltares and remain full property of Stichting Deltares at all times. // All rights reserved. using System; using Core.Common.Gui.PropertyBag; namespace Core.Common.Gui.Plugin { /// /// Information for creating object properties /// public class PropertyInfo { /// /// The type of the object to create properties for /// public Type ObjectType { get; set; } /// /// The type of object properties to create /// public Type PropertyType { get; set; } /// /// Function for determining whether or not the property information is relevant in a specfic context /// /// /// As an example, you could implement this as follows: /// var propertyInfo = new PropertyInfo < Folder, ModelImplementationFolderProperties} { AdditionalDataCheck = o => GetParent(o) is ModelImplementation }; /// /// /// This property breaks the single responsibility principle; besides and an additional method is /// introduced to determine whether or not property information is relevant in a specfic context. /// public Func AdditionalDataCheck { get; set; } /// /// Function for obtaining the data that should be set while creating object properties /// /// /// As an example, you could implement this as follows: /// var propertyInfo = new PropertyInfo <ModelImplementation, ModelImplementationProperties> { GetObjectPropertiesData = o => o.RunParameters }; /// public Func GetObjectPropertiesData { get; set; } /// /// Action that must be performed after creating object properties /// /// /// As an example, you could implement this as follows: /// var propertyInfo = new PropertyInfo < ModelImplementation, ModelImplementationProperties > { AfterCreate = op => op.AdditionalBooleanProperty = true }; /// public Action AfterCreate { get; set; } } /// /// Information for creating object properties /// /// The type of the object to create object properties for /// The type of the object properties to create public class PropertyInfo where TProperty : IObjectProperties { /// /// The type of the object to create properties for /// public Type ObjectType { get { return typeof(TObject); } } /// /// The type of object properties to create /// public Type PropertyType { get { return typeof(TProperty); } } /// /// Function for determining whether or not the property information is relevant in a specfic context /// /// /// As an example, you could implement this as follows: /// /// var propertyInfo = new PropertyInfo < Folder, ModelImplementationFolderProperties> { AdditionalDataCheck = o => GetParent(o) is ModelImplementation }; /// /// /// /// This property breaks the single responsibility principle; besides and an additional method is /// introduced to determine whether or not property information is relevant in a specfic context. /// public Func AdditionalDataCheck { get; set; } /// /// Function for obtaining the data that should be set while creating object properties /// /// /// As an example, you could implement this as follows: /// /// var propertyInfo = new PropertyInfo <ModelImplementation, ModelImplementationProperties> { GetObjectPropertiesData = o => o.RunParameters }; /// public Func GetObjectPropertiesData { get; set; } /// /// Action that must be performed after creating object properties /// /// /// As an example, you could implement this as follows: /// var propertyInfo = new PropertyInfo< ModelImplementation, ModelImplementationProperties> { AfterCreate = op => op.AdditionalBooleanProperty = true }; /// public Action AfterCreate { get; set; } public static implicit operator PropertyInfo(PropertyInfo pi) { return new PropertyInfo { ObjectType = typeof(TObject), PropertyType = typeof(TProperty), AdditionalDataCheck = pi.AdditionalDataCheck != null ? o => pi.AdditionalDataCheck((TObject) o) : (Func) null, GetObjectPropertiesData = pi.GetObjectPropertiesData != null ? o => pi.GetObjectPropertiesData((TObject) o) : (Func) null, AfterCreate = pi.AfterCreate != null ? op => pi.AfterCreate((TProperty) op) : (Action) null }; } } }