// 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 for a particular data object. /// public class PropertyInfo { /// /// Gets or sets the type of the data to create properties for. /// public Type DataType { get; set; } /// /// Gets or sets the type of object properties to create. /// public Type PropertyObjectType { get; set; } /// /// Gets or sets the optional function used to determine if this instance is relevant /// given a data object. /// /// /// 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; } /// /// Gets or sets the optional function that allows a data object to be converted /// to another data object that should be used as the property object instead. /// /// /// As an example, you could implement this as follows: /// var propertyInfo = new PropertyInfo <ModelImplementation, ModelImplementationProperties> { GetObjectPropertiesData = o => o.RunParameters }; /// public Func GetObjectPropertiesData { get; set; } /// /// Gets or sets the optional function that allows for post-creation logic to be /// executed on the newly created 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 for a particular data object. /// /// The type of the object to create object properties for. /// The type of the object properties to create. public class PropertyInfo where TProperty : IObjectProperties { /// /// Gets the type of the data to create properties for. /// public Type DataType { get { return typeof(TObject); } } /// /// Gets the type of object properties to create. /// public Type PropertyObjectType { get { return typeof(TProperty); } } /// /// Gets or sets the optional function used to determine if this instance is relevant /// given a data object. /// /// /// 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; } /// /// Gets or sets the optional function that allows a data object to be converted /// to another data object that should be used as the property object instead. /// /// /// As an example, you could implement this as follows: /// var propertyInfo = new PropertyInfo <ModelImplementation, ModelImplementationProperties> { GetObjectPropertiesData = o => o.RunParameters }; /// public Func GetObjectPropertiesData { get; set; } /// /// Gets or sets the optional function that allows for post-creation logic to be /// executed on the newly created 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; } /// /// Performs an implicit conversion from to . /// /// The property information to convert. /// The result of the conversion. public static implicit operator PropertyInfo(PropertyInfo propertyInfo) { return new PropertyInfo { DataType = typeof(TObject), PropertyObjectType = typeof(TProperty), AdditionalDataCheck = propertyInfo.AdditionalDataCheck != null ? o => propertyInfo.AdditionalDataCheck((TObject) o) : (Func) null, GetObjectPropertiesData = propertyInfo.GetObjectPropertiesData != null ? o => propertyInfo.GetObjectPropertiesData((TObject) o) : (Func) null, AfterCreate = propertyInfo.AfterCreate != null ? op => propertyInfo.AfterCreate((TProperty) op) : (Action) null }; } } }