using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Linq; using System.Text; using System.Xml.Serialization; namespace RainmeterStudio.Core.Model { public interface IProperty : INotifyPropertyChanged { /// /// Gets the name of the property /// string Name { get; } /// /// Gets or sets the value of the property /// object Value { get; set; } /// /// Gets the data type of the property /// Type Type { get; } /// /// Gets the children of this property /// ObservableCollection Children { get; } } /// /// Represents a property /// public class Property : IProperty { #region Name property /// /// Gets the name of the property /// public virtual string Name { get; private set; } #endregion #region Value property private object _value; /// /// Gets or sets the value of the property /// public virtual object Value { get { return _value; } set { // Test if type changed bool typeChanged; if (_value == null || value == null) typeChanged = (_value != null) || (value != null); else typeChanged = (_value.GetType() != value.GetType()); // Set value _value = value; // Trigger event if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs("Value")); if (typeChanged) PropertyChanged(this, new PropertyChangedEventArgs("Type")); } } } #endregion #region Type property /// /// Gets the type of the property /// public virtual Type Type { get { return Value.GetType(); } } #endregion #region Children property /// /// Gets the children of this property /// public ObservableCollection Children { get; private set; } #endregion #region Property changed event /// /// Triggered when a property changes /// public virtual event PropertyChangedEventHandler PropertyChanged; #endregion #region Constructors /// /// Initializes this property /// /// Name of the property public Property(string name) { Name = name; Value = null; Children = new ObservableCollection(); } /// /// Initializes this property /// /// Name of the property /// Value of the property public Property(string name, object value) { Name = name; Value = value; Children = new ObservableCollection(); } #endregion } namespace Generic { /// /// Generic property /// /// Type of property public class Property : IProperty { #region Value property private T _value; /// /// Gets or sets the value of this property /// public T Value { get { return _value; } set { // Set value _value = value; // Trigger event if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Value")); } } /// /// Gets or sets the value of this property. Overriden from the generic property. /// /// Thrown if value is not of the right type. object IProperty.Value { get { return _value; } set { this.Value = (T)value; } } #endregion #region Type property /// /// Gets the type of this property /// public Type Type { get { return typeof(T); } } #endregion #region Property changed event /// /// Triggered when a property changes /// public event PropertyChangedEventHandler PropertyChanged; #endregion #region Constructors /// /// Initializes this property /// /// Name of the property public Property(string name) { Name = name; Value = default(T); Children = new ObservableCollection(); } /// /// Initializes this property /// /// Name of the property /// Value of the property public Property(string name, T value) { Name = name; Value = value; Children = new ObservableCollection(); } #endregion /// /// Gets the name of the property /// public string Name { get; private set; } /// /// Gets the children of this property /// public ObservableCollection Children { get; private set; } } } }