diff --git a/src/Umbraco.Core/Models/Content.cs b/src/Umbraco.Core/Models/Content.cs index d7a6cfd0a4..41ceaf9b90 100644 --- a/src/Umbraco.Core/Models/Content.cs +++ b/src/Umbraco.Core/Models/Content.cs @@ -103,8 +103,11 @@ namespace Umbraco.Core.Models } set { - _template = value; - OnPropertyChanged(TemplateSelector); + SetPropertyValueAndDetectChanges(o => + { + _template = value; + return _template; + }, _template, TemplateSelector); } } @@ -142,8 +145,11 @@ namespace Umbraco.Core.Models get { return _published; } internal set { - _published = value; - OnPropertyChanged(PublishedSelector); + SetPropertyValueAndDetectChanges(o => + { + _published = value; + return _published; + }, _published, PublishedSelector); } } @@ -159,8 +165,11 @@ namespace Umbraco.Core.Models get { return _language; } set { - _language = value; - OnPropertyChanged(LanguageSelector); + SetPropertyValueAndDetectChanges(o => + { + _language = value; + return _language; + }, _language, LanguageSelector); } } @@ -173,8 +182,11 @@ namespace Umbraco.Core.Models get { return _releaseDate; } set { - _releaseDate = value; - OnPropertyChanged(ReleaseDateSelector); + SetPropertyValueAndDetectChanges(o => + { + _releaseDate = value; + return _releaseDate; + }, _releaseDate, ReleaseDateSelector); } } @@ -187,8 +199,11 @@ namespace Umbraco.Core.Models get { return _expireDate; } set { - _expireDate = value; - OnPropertyChanged(ExpireDateSelector); + SetPropertyValueAndDetectChanges(o => + { + _expireDate = value; + return _expireDate; + }, _expireDate, ExpireDateSelector); } } @@ -201,8 +216,11 @@ namespace Umbraco.Core.Models get { return _writer; } set { - _writer = value; - OnPropertyChanged(WriterSelector); + SetPropertyValueAndDetectChanges(o => + { + _writer = value; + return _writer; + }, _writer, WriterSelector); } } @@ -217,8 +235,11 @@ namespace Umbraco.Core.Models get { return _nodeName; } set { - _nodeName = value; - OnPropertyChanged(NodeNameSelector); + SetPropertyValueAndDetectChanges(o => + { + _nodeName = value; + return _nodeName; + }, _nodeName, NodeNameSelector); } } diff --git a/src/Umbraco.Core/Models/ContentBase.cs b/src/Umbraco.Core/Models/ContentBase.cs index 3ddf71308e..4c00831cae 100644 --- a/src/Umbraco.Core/Models/ContentBase.cs +++ b/src/Umbraco.Core/Models/ContentBase.cs @@ -120,8 +120,11 @@ namespace Umbraco.Core.Models get { return _name; } set { - _name = value; - OnPropertyChanged(NameSelector); + SetPropertyValueAndDetectChanges(o => + { + _name = value; + return _name; + }, _name, NameSelector); } } @@ -134,8 +137,11 @@ namespace Umbraco.Core.Models get { return _sortOrder; } set { - _sortOrder = value; - OnPropertyChanged(SortOrderSelector); + SetPropertyValueAndDetectChanges(o => + { + _sortOrder = value; + return _sortOrder; + }, _sortOrder, SortOrderSelector); } } @@ -148,8 +154,11 @@ namespace Umbraco.Core.Models get { return _level; } set { - _level = value; - OnPropertyChanged(LevelSelector); + SetPropertyValueAndDetectChanges(o => + { + _level = value; + return _level; + }, _level, LevelSelector); } } @@ -162,8 +171,11 @@ namespace Umbraco.Core.Models get { return _path; } set { - _path = value; - OnPropertyChanged(PathSelector); + SetPropertyValueAndDetectChanges(o => + { + _path = value; + return _path; + }, _path, PathSelector); } } @@ -176,8 +188,11 @@ namespace Umbraco.Core.Models get { return _creatorId; } set { - _creatorId = value; - OnPropertyChanged(CreatorIdSelector); + SetPropertyValueAndDetectChanges(o => + { + _creatorId = value; + return _creatorId; + }, _creatorId, CreatorIdSelector); } } @@ -192,8 +207,11 @@ namespace Umbraco.Core.Models get { return _trashed; } internal set { - _trashed = value; - OnPropertyChanged(TrashedSelector); + SetPropertyValueAndDetectChanges(o => + { + _trashed = value; + return _trashed; + }, _trashed, TrashedSelector); } } @@ -212,8 +230,11 @@ namespace Umbraco.Core.Models get { return _contentTypeId; } protected set { - _contentTypeId = value; - OnPropertyChanged(DefaultContentTypeIdSelector); + SetPropertyValueAndDetectChanges(o => + { + _contentTypeId = value; + return _contentTypeId; + }, _contentTypeId, DefaultContentTypeIdSelector); } } diff --git a/src/Umbraco.Core/Models/ContentType.cs b/src/Umbraco.Core/Models/ContentType.cs index f10e939489..581c11ce41 100644 --- a/src/Umbraco.Core/Models/ContentType.cs +++ b/src/Umbraco.Core/Models/ContentType.cs @@ -48,8 +48,11 @@ namespace Umbraco.Core.Models get { return _defaultTemplate; } set { - _defaultTemplate = value; - OnPropertyChanged(DefaultTemplateSelector); + SetPropertyValueAndDetectChanges(o => + { + _defaultTemplate = value; + return _defaultTemplate; + }, _defaultTemplate, DefaultTemplateSelector); } } @@ -62,8 +65,11 @@ namespace Umbraco.Core.Models get { return _allowedTemplates; } set { - _allowedTemplates = value; - OnPropertyChanged(AllowedTemplatesSelector); + SetPropertyValueAndDetectChanges(o => + { + _allowedTemplates = value; + return _allowedTemplates; + }, _allowedTemplates, AllowedTemplatesSelector); } } diff --git a/src/Umbraco.Core/Models/DataTypeDefinition.cs b/src/Umbraco.Core/Models/DataTypeDefinition.cs index 7d42a7e6b4..f7068a3b6e 100644 --- a/src/Umbraco.Core/Models/DataTypeDefinition.cs +++ b/src/Umbraco.Core/Models/DataTypeDefinition.cs @@ -53,8 +53,11 @@ namespace Umbraco.Core.Models get { return _parentId; } set { - _parentId = value; - OnPropertyChanged(ParentIdSelector); + SetPropertyValueAndDetectChanges(o => + { + _parentId = value; + return _parentId; + }, _parentId, ParentIdSelector); } } @@ -67,8 +70,11 @@ namespace Umbraco.Core.Models get { return _name; } set { - _name = value; - OnPropertyChanged(NameSelector); + SetPropertyValueAndDetectChanges(o => + { + _name = value; + return _name; + }, _name, NameSelector); } } @@ -81,8 +87,11 @@ namespace Umbraco.Core.Models get { return _sortOrder; } set { - _sortOrder = value; - OnPropertyChanged(SortOrderSelector); + SetPropertyValueAndDetectChanges(o => + { + _sortOrder = value; + return _sortOrder; + }, _sortOrder, SortOrderSelector); } } @@ -95,8 +104,11 @@ namespace Umbraco.Core.Models get { return _level; } set { - _level = value; - OnPropertyChanged(LevelSelector); + SetPropertyValueAndDetectChanges(o => + { + _level = value; + return _level; + }, _level, LevelSelector); } } @@ -109,8 +121,11 @@ namespace Umbraco.Core.Models get { return _path; } set { - _path = value; - OnPropertyChanged(PathSelector); + SetPropertyValueAndDetectChanges(o => + { + _path = value; + return _path; + }, _path, PathSelector); } } @@ -123,8 +138,11 @@ namespace Umbraco.Core.Models get { return _creatorId; } set { - _creatorId = value; - OnPropertyChanged(UserIdSelector); + SetPropertyValueAndDetectChanges(o => + { + _creatorId = value; + return _creatorId; + }, _creatorId, UserIdSelector); } } @@ -137,8 +155,11 @@ namespace Umbraco.Core.Models get { return _trashed; } internal set { - _trashed = value; - OnPropertyChanged(TrashedSelector); + SetPropertyValueAndDetectChanges(o => + { + _trashed = value; + return _trashed; + }, _trashed, TrashedSelector); } } @@ -150,9 +171,12 @@ namespace Umbraco.Core.Models { get { return _controlId; } private set - { - _controlId = value; - OnPropertyChanged(ControlIdSelector); + { + SetPropertyValueAndDetectChanges(o => + { + _controlId = value; + return _controlId; + }, _controlId, ControlIdSelector); } } @@ -164,9 +188,12 @@ namespace Umbraco.Core.Models { get { return _databaseType; } set - { - _databaseType = value; - OnPropertyChanged(DatabaseTypeSelector); + { + SetPropertyValueAndDetectChanges(o => + { + _databaseType = value; + return _databaseType; + }, _databaseType, DatabaseTypeSelector); } } diff --git a/src/Umbraco.Core/Models/DictionaryItem.cs b/src/Umbraco.Core/Models/DictionaryItem.cs index 77fda51466..db3f47ba13 100644 --- a/src/Umbraco.Core/Models/DictionaryItem.cs +++ b/src/Umbraco.Core/Models/DictionaryItem.cs @@ -42,8 +42,11 @@ namespace Umbraco.Core.Models get { return _parentId; } set { - _parentId = value; - OnPropertyChanged(ParentIdSelector); + SetPropertyValueAndDetectChanges(o => + { + _parentId = value; + return _parentId; + }, _parentId, ParentIdSelector); } } @@ -56,8 +59,11 @@ namespace Umbraco.Core.Models get { return _itemKey; } set { - _itemKey = value; - OnPropertyChanged(ItemKeySelector); + SetPropertyValueAndDetectChanges(o => + { + _itemKey = value; + return _itemKey; + }, _itemKey, ItemKeySelector); } } @@ -70,8 +76,11 @@ namespace Umbraco.Core.Models get { return _translations; } set { - _translations = value; - OnPropertyChanged(TranslationsSelector); + SetPropertyValueAndDetectChanges(o => + { + _translations = value; + return _translations; + }, _translations, TranslationsSelector); } } diff --git a/src/Umbraco.Core/Models/DictionaryTranslation.cs b/src/Umbraco.Core/Models/DictionaryTranslation.cs index 532d762cd3..5f8f5ebc25 100644 --- a/src/Umbraco.Core/Models/DictionaryTranslation.cs +++ b/src/Umbraco.Core/Models/DictionaryTranslation.cs @@ -41,8 +41,11 @@ namespace Umbraco.Core.Models get { return _language; } set { - _language = value; - OnPropertyChanged(LanguageSelector); + SetPropertyValueAndDetectChanges(o => + { + _language = value; + return _language; + }, _language, LanguageSelector); } } @@ -55,8 +58,11 @@ namespace Umbraco.Core.Models get { return _value; } set { - _value = value; - OnPropertyChanged(ValueSelector); + SetPropertyValueAndDetectChanges(o => + { + _value = value; + return _value; + }, _value, ValueSelector); } } } diff --git a/src/Umbraco.Core/Models/EntityBase/Entity.cs b/src/Umbraco.Core/Models/EntityBase/Entity.cs index 8443576424..3c58b61695 100644 --- a/src/Umbraco.Core/Models/EntityBase/Entity.cs +++ b/src/Umbraco.Core/Models/EntityBase/Entity.cs @@ -1,9 +1,5 @@ using System; -using System.Collections.Generic; -using System.ComponentModel; using System.Diagnostics; -using System.Linq; -using System.Reflection; using System.Runtime.Serialization; namespace Umbraco.Core.Models.EntityBase @@ -14,7 +10,7 @@ namespace Umbraco.Core.Models.EntityBase [Serializable] [DataContract(IsReference = true)] [DebuggerDisplay("Id: {Id}")] - public abstract class Entity : IEntity, IRememberBeingDirty, ICanBeDirty + public abstract class Entity : TracksChangesEntityBase, IEntity, IRememberBeingDirty, ICanBeDirty { private bool _hasIdentity; private int? _hash; @@ -68,25 +64,6 @@ namespace Umbraco.Core.Models.EntityBase [DataMember] public DateTime UpdateDate { get; set; } - /// - /// Property changed event - /// - public event PropertyChangedEventHandler PropertyChanged; - - /// - /// Method to call on a property setter. - /// - /// The property info. - protected virtual void OnPropertyChanged(PropertyInfo propertyInfo) - { - _propertyChangedInfo[propertyInfo.Name] = true; - - if (PropertyChanged != null) - { - PropertyChanged(this, new PropertyChangedEventArgs(propertyInfo.Name)); - } - } - internal virtual void ResetIdentity() { _hasIdentity = false; @@ -110,120 +87,6 @@ namespace Umbraco.Core.Models.EntityBase UpdateDate = DateTime.Now; } - /// - /// Tracks the properties that have changed - /// - private readonly IDictionary _propertyChangedInfo = new Dictionary(); - - /// - /// Tracks the properties that we're changed before the last commit (or last call to ResetDirtyProperties) - /// - private IDictionary _lastPropertyChangedInfo = null; - - /// - /// Indicates whether a specific property on the current entity is dirty. - /// - /// Name of the property to check - /// True if Property is dirty, otherwise False - public virtual bool IsPropertyDirty(string propertyName) - { - return _propertyChangedInfo.Any(x => x.Key == propertyName); - } - - /// - /// Indicates whether the current entity is dirty. - /// - /// True if entity is dirty, otherwise False - public virtual bool IsDirty() - { - return _propertyChangedInfo.Any(); - } - - /// - /// Indicates that the entity had been changed and the changes were committed - /// - /// - public bool WasDirty() - { - return _lastPropertyChangedInfo != null && _lastPropertyChangedInfo.Any(); - } - - /// - /// Indicates whether a specific property on the current entity was changed and the changes were committed - /// - /// Name of the property to check - /// True if Property was changed, otherwise False. Returns false if the entity had not been previously changed. - public virtual bool WasPropertyDirty(string propertyName) - { - return WasDirty() && _lastPropertyChangedInfo.Any(x => x.Key == propertyName); - } - - /// - /// Resets the remembered dirty properties from before the last commit - /// - public void ForgetPreviouslyDirtyProperties() - { - _lastPropertyChangedInfo.Clear(); - } - - /// - /// Resets dirty properties by clearing the dictionary used to track changes. - /// - /// - /// Please note that resetting the dirty properties could potentially - /// obstruct the saving of a new or updated entity. - /// - public virtual void ResetDirtyProperties() - { - ResetDirtyProperties(true); - } - - /// - /// Resets dirty properties by clearing the dictionary used to track changes. - /// - /// - /// true if we are to remember the last changes made after resetting - /// - /// - /// Please note that resetting the dirty properties could potentially - /// obstruct the saving of a new or updated entity. - /// - internal void ResetDirtyProperties(bool rememberPreviouslyChangedProperties) - { - if (rememberPreviouslyChangedProperties) - { - //copy the changed properties to the last changed properties - _lastPropertyChangedInfo = _propertyChangedInfo.ToDictionary(v => v.Key, v => v.Value); - } - - _propertyChangedInfo.Clear(); - } - - /// - /// Used by inheritors to set the value of properties, this will detect if the property value actually changed and if it did - /// it will ensure that the property has a dirty flag set. - /// - /// - /// - /// - /// returns true if the value changed - /// - /// This is required because we don't want a property to show up as "dirty" if the value is the same. For example, when we - /// save a document type, nearly all properties are flagged as dirty just because we've 'reset' them, but they are all set - /// to the same value, so it's really not dirty. - /// - internal bool SetPropertyValueAndDetectChanges(Func setValue, T value, PropertyInfo propertySelector) - { - var initVal = value; - var newVal = setValue(value); - if (!Equals(initVal, newVal)) - { - OnPropertyChanged(propertySelector); - return true; - } - return false; - } - /// /// Indicates whether the current entity has an identity, eg. Id. /// diff --git a/src/Umbraco.Core/Models/EntityBase/TracksChangesEntityBase.cs b/src/Umbraco.Core/Models/EntityBase/TracksChangesEntityBase.cs new file mode 100644 index 0000000000..74562bc250 --- /dev/null +++ b/src/Umbraco.Core/Models/EntityBase/TracksChangesEntityBase.cs @@ -0,0 +1,147 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Reflection; + +namespace Umbraco.Core.Models.EntityBase +{ + /// + /// A base class for use to implement IRememberBeingDirty/ICanBeDirty + /// + public abstract class TracksChangesEntityBase : IRememberBeingDirty + { + /// + /// Tracks the properties that have changed + /// + private readonly IDictionary _propertyChangedInfo = new Dictionary(); + + /// + /// Tracks the properties that we're changed before the last commit (or last call to ResetDirtyProperties) + /// + private IDictionary _lastPropertyChangedInfo = null; + + /// + /// Property changed event + /// + public event PropertyChangedEventHandler PropertyChanged; + + /// + /// Method to call on a property setter. + /// + /// The property info. + protected virtual void OnPropertyChanged(PropertyInfo propertyInfo) + { + _propertyChangedInfo[propertyInfo.Name] = true; + + if (PropertyChanged != null) + { + PropertyChanged(this, new PropertyChangedEventArgs(propertyInfo.Name)); + } + } + + /// + /// Indicates whether a specific property on the current entity is dirty. + /// + /// Name of the property to check + /// True if Property is dirty, otherwise False + public virtual bool IsPropertyDirty(string propertyName) + { + return _propertyChangedInfo.Any(x => x.Key == propertyName); + } + + /// + /// Indicates whether the current entity is dirty. + /// + /// True if entity is dirty, otherwise False + public virtual bool IsDirty() + { + return _propertyChangedInfo.Any(); + } + + /// + /// Indicates that the entity had been changed and the changes were committed + /// + /// + public bool WasDirty() + { + return _lastPropertyChangedInfo != null && _lastPropertyChangedInfo.Any(); + } + + /// + /// Indicates whether a specific property on the current entity was changed and the changes were committed + /// + /// Name of the property to check + /// True if Property was changed, otherwise False. Returns false if the entity had not been previously changed. + public virtual bool WasPropertyDirty(string propertyName) + { + return WasDirty() && _lastPropertyChangedInfo.Any(x => x.Key == propertyName); + } + + /// + /// Resets the remembered dirty properties from before the last commit + /// + public void ForgetPreviouslyDirtyProperties() + { + _lastPropertyChangedInfo.Clear(); + } + + /// + /// Resets dirty properties by clearing the dictionary used to track changes. + /// + /// + /// Please note that resetting the dirty properties could potentially + /// obstruct the saving of a new or updated entity. + /// + public virtual void ResetDirtyProperties() + { + ResetDirtyProperties(true); + } + + /// + /// Resets dirty properties by clearing the dictionary used to track changes. + /// + /// + /// true if we are to remember the last changes made after resetting + /// + /// + /// Please note that resetting the dirty properties could potentially + /// obstruct the saving of a new or updated entity. + /// + internal void ResetDirtyProperties(bool rememberPreviouslyChangedProperties) + { + if (rememberPreviouslyChangedProperties) + { + //copy the changed properties to the last changed properties + _lastPropertyChangedInfo = _propertyChangedInfo.ToDictionary(v => v.Key, v => v.Value); + } + + _propertyChangedInfo.Clear(); + } + + /// + /// Used by inheritors to set the value of properties, this will detect if the property value actually changed and if it did + /// it will ensure that the property has a dirty flag set. + /// + /// + /// + /// + /// returns true if the value changed + /// + /// This is required because we don't want a property to show up as "dirty" if the value is the same. For example, when we + /// save a document type, nearly all properties are flagged as dirty just because we've 'reset' them, but they are all set + /// to the same value, so it's really not dirty. + /// + internal bool SetPropertyValueAndDetectChanges(Func setValue, T value, PropertyInfo propertySelector) + { + var initVal = value; + var newVal = setValue(value); + if (!Equals(initVal, newVal)) + { + OnPropertyChanged(propertySelector); + return true; + } + return false; + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Models/File.cs b/src/Umbraco.Core/Models/File.cs index 34f844a5b3..7fefddfaed 100644 --- a/src/Umbraco.Core/Models/File.cs +++ b/src/Umbraco.Core/Models/File.cs @@ -1,5 +1,6 @@ using System; using System.IO; +using System.Reflection; using System.Runtime.Serialization; using Umbraco.Core.Models.EntityBase; @@ -12,11 +13,17 @@ namespace Umbraco.Core.Models [DataContract(IsReference = true)] public abstract class File : Entity, IFile { + private string _path; + private string _content; + protected File(string path) { - Path = path; + _path = path; } + private static readonly PropertyInfo ContentSelector = ExpressionHelper.GetPropertyInfo(x => x.Content); + private static readonly PropertyInfo PathSelector = ExpressionHelper.GetPropertyInfo(x => x.Path); + /// /// Gets or sets the Name of the File including extension /// @@ -48,13 +55,35 @@ namespace Umbraco.Core.Models /// Gets or sets the Path to the File from the root of the site /// [DataMember] - public virtual string Path { get; set; } + public virtual string Path + { + get { return _path; } + set + { + SetPropertyValueAndDetectChanges(o => + { + _path = value; + return _path; + }, _path, PathSelector); + } + } /// /// Gets or sets the Content of a File /// [DataMember] - public virtual string Content { get; set; } + public virtual string Content + { + get { return _content; } + set + { + SetPropertyValueAndDetectChanges(o => + { + _content = value; + return _content; + }, _content, ContentSelector); + } + } /// /// Boolean indicating whether the file could be validated diff --git a/src/Umbraco.Core/Models/Language.cs b/src/Umbraco.Core/Models/Language.cs index eec4558a8a..6986fae027 100644 --- a/src/Umbraco.Core/Models/Language.cs +++ b/src/Umbraco.Core/Models/Language.cs @@ -34,8 +34,11 @@ namespace Umbraco.Core.Models get { return _isoCode; } set { - _isoCode = value; - OnPropertyChanged(IsoCodeSelector); + SetPropertyValueAndDetectChanges(o => + { + _isoCode = value; + return _isoCode; + }, _isoCode, IsoCodeSelector); } } @@ -48,8 +51,11 @@ namespace Umbraco.Core.Models get { return _cultureName; } set { - _cultureName = value; - OnPropertyChanged(CultureNameSelector); + SetPropertyValueAndDetectChanges(o => + { + _cultureName = value; + return _cultureName; + }, _cultureName, CultureNameSelector); } } diff --git a/src/Umbraco.Core/Models/Macro.cs b/src/Umbraco.Core/Models/Macro.cs index 904cb05d66..2fe0a2ab60 100644 --- a/src/Umbraco.Core/Models/Macro.cs +++ b/src/Umbraco.Core/Models/Macro.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Reflection; using System.Runtime.Serialization; using Umbraco.Core.Models.EntityBase; @@ -12,81 +13,240 @@ namespace Umbraco.Core.Models [DataContract(IsReference = true)] internal class Macro : Entity, IMacro { + private string _alias; + private string _name; + private bool _useInEditor; + private int _cacheDuration; + private bool _cacheByPage; + private bool _cacheByMember; + private bool _dontRender; + private string _scriptFile; + private string _scriptAssembly; + private string _python; + private string _xslt; + private List _properties; + + private static readonly PropertyInfo AliasSelector = ExpressionHelper.GetPropertyInfo(x => x.Alias); + private static readonly PropertyInfo NameSelector = ExpressionHelper.GetPropertyInfo(x => x.Name); + private static readonly PropertyInfo UseInEditorSelector = ExpressionHelper.GetPropertyInfo(x => x.UseInEditor); + private static readonly PropertyInfo CacheDurationSelector = ExpressionHelper.GetPropertyInfo(x => x.CacheDuration); + private static readonly PropertyInfo CacheByPageSelector = ExpressionHelper.GetPropertyInfo(x => x.CacheByPage); + private static readonly PropertyInfo CacheByMemberSelector = ExpressionHelper.GetPropertyInfo(x => x.CacheByMember); + private static readonly PropertyInfo DontRenderSelector = ExpressionHelper.GetPropertyInfo(x => x.DontRender); + private static readonly PropertyInfo ScriptFileSelector = ExpressionHelper.GetPropertyInfo(x => x.ScriptFile); + private static readonly PropertyInfo ScriptAssemblySelector = ExpressionHelper.GetPropertyInfo(x => x.ScriptAssembly); + private static readonly PropertyInfo PythonSelector = ExpressionHelper.GetPropertyInfo(x => x.Python); + private static readonly PropertyInfo XsltSelector = ExpressionHelper.GetPropertyInfo(x => x.Xslt); + private static readonly PropertyInfo PropertiesSelector = ExpressionHelper.GetPropertyInfo>(x => x.Properties); + /// /// Gets or sets the alias of the Macro /// [DataMember] - public string Alias { get; set; } + public string Alias + { + get { return _alias; } + set + { + SetPropertyValueAndDetectChanges(o => + { + _alias = value; + return _alias; + }, _alias, AliasSelector); + } + } /// /// Gets or sets the name of the Macro /// [DataMember] - public string Name { get; set; } + public string Name + { + get { return _name; } + set + { + SetPropertyValueAndDetectChanges(o => + { + _name = value; + return _name; + }, _name, NameSelector); + } + } /// /// Gets or sets a boolean indicating whether the Macro can be used in an Editor /// [DataMember] - public bool UseInEditor { get; set; } + public bool UseInEditor + { + get { return _useInEditor; } + set + { + SetPropertyValueAndDetectChanges(o => + { + _useInEditor = value; + return _useInEditor; + }, _useInEditor, UseInEditorSelector); + } + } /// /// Gets or sets the Cache Duration for the Macro /// [DataMember] - public int CacheDuration { get; set; } + public int CacheDuration + { + get { return _cacheDuration; } + set + { + SetPropertyValueAndDetectChanges(o => + { + _cacheDuration = value; + return _cacheDuration; + }, _cacheDuration, CacheDurationSelector); + } + } /// /// Gets or sets a boolean indicating whether the Macro should be Cached by Page /// [DataMember] - public bool CacheByPage { get; set; } + public bool CacheByPage + { + get { return _cacheByPage; } + set + { + SetPropertyValueAndDetectChanges(o => + { + _cacheByPage = value; + return _cacheByPage; + }, _cacheByPage, CacheByPageSelector); + } + } /// /// Gets or sets a boolean indicating whether the Macro should be Cached Personally /// [DataMember] - public bool CacheByMember { get; set; } + public bool CacheByMember + { + get { return _cacheByMember; } + set + { + SetPropertyValueAndDetectChanges(o => + { + _cacheByMember = value; + return _cacheByMember; + }, _cacheByMember, CacheByMemberSelector); + } + } /// /// Gets or sets a boolean indicating whether the Macro should be rendered in an Editor /// [DataMember] - public bool DontRender { get; set; } + public bool DontRender + { + get { return _dontRender; } + set + { + SetPropertyValueAndDetectChanges(o => + { + _dontRender = value; + return _dontRender; + }, _dontRender, DontRenderSelector); + } + } /// /// Gets or sets the path to the script file in use /// /// Optional: Can only be one of three Script, Python or Xslt [DataMember] - public string ScriptFile { get; set; } + public string ScriptFile + { + get { return _scriptFile; } + set + { + SetPropertyValueAndDetectChanges(o => + { + _scriptFile = value; + return _scriptFile; + }, _scriptFile, ScriptFileSelector); + } + } /// /// Gets or sets the name of the assembly, which should be used by the Macro /// /// Will usually only be filled if the ScriptFile is a Usercontrol [DataMember] - public string ScriptAssembly { get; set; } + public string ScriptAssembly + { + get { return _scriptAssembly; } + set + { + SetPropertyValueAndDetectChanges(o => + { + _scriptAssembly = value; + return _scriptAssembly; + }, _scriptAssembly, ScriptAssemblySelector); + } + } /// /// Gets or set the path to the Python file in use /// /// Optional: Can only be one of three Script, Python or Xslt [DataMember] - public string Python { get; set; } + public string Python + { + get { return _python; } + set + { + SetPropertyValueAndDetectChanges(o => + { + _python = value; + return _python; + }, _python, PythonSelector); + } + } /// /// Gets or sets the path to the Xslt file in use /// /// Optional: Can only be one of three Script, Python or Xslt [DataMember] - public string Xslt { get; set; } + public string Xslt + { + get { return _xslt; } + set + { + SetPropertyValueAndDetectChanges(o => + { + _xslt = value; + return _xslt; + }, _xslt, XsltSelector); + } + } + //TODO: This needs to be changed to a custom collection class so we can track the dirtyness of each property! /// /// Gets or sets a list of Macro Properties /// [DataMember] - public List Properties { get; set; } + public List Properties + { + get { return _properties; } + set + { + SetPropertyValueAndDetectChanges(o => + { + _properties = value; + return _properties; + }, _properties, PropertiesSelector); + } + } /// /// Overridden this method in order to set a random Id diff --git a/src/Umbraco.Core/Models/MacroProperty.cs b/src/Umbraco.Core/Models/MacroProperty.cs index f86f1c4aa1..4202acce1e 100644 --- a/src/Umbraco.Core/Models/MacroProperty.cs +++ b/src/Umbraco.Core/Models/MacroProperty.cs @@ -1,5 +1,7 @@ using System; +using System.Reflection; using System.Runtime.Serialization; +using Umbraco.Core.Models.EntityBase; namespace Umbraco.Core.Models { @@ -8,25 +10,68 @@ namespace Umbraco.Core.Models /// [Serializable] [DataContract(IsReference = true)] - internal class MacroProperty : IMacroProperty + internal class MacroProperty : TracksChangesEntityBase, IMacroProperty, IRememberBeingDirty { + private string _alias; + private string _name; + private int _sortOrder; + private IMacroPropertyType _propertyType; + + private static readonly PropertyInfo AliasSelector = ExpressionHelper.GetPropertyInfo(x => x.Alias); + private static readonly PropertyInfo NameSelector = ExpressionHelper.GetPropertyInfo(x => x.Name); + private static readonly PropertyInfo SortOrderSelector = ExpressionHelper.GetPropertyInfo(x => x.SortOrder); + private static readonly PropertyInfo PropertyTypeSelector = ExpressionHelper.GetPropertyInfo(x => x.PropertyType); + /// /// Gets or sets the Alias of the Property /// [DataMember] - public string Alias { get; set; } + public string Alias + { + get { return _alias; } + set + { + SetPropertyValueAndDetectChanges(o => + { + _alias = value; + return _alias; + }, _alias, AliasSelector); + } + } /// /// Gets or sets the Name of the Property /// [DataMember] - public string Name { get; set; } + public string Name + { + get { return _name; } + set + { + SetPropertyValueAndDetectChanges(o => + { + _name = value; + return _name; + }, _name, NameSelector); + } + } /// /// Gets or sets the Sort Order of the Property /// [DataMember] - public int SortOrder { get; set; } + public int SortOrder + { + get { return _sortOrder; } + set + { + SetPropertyValueAndDetectChanges(o => + { + _sortOrder = value; + return _sortOrder; + }, _sortOrder, SortOrderSelector); + } + } /// /// Gets or sets the Type for this Property @@ -36,6 +81,18 @@ namespace Umbraco.Core.Models /// All types was previously contained in the database, but has been ported to code. /// [DataMember] - public IMacroPropertyType PropertyType { get; set; } + public IMacroPropertyType PropertyType + + { + get { return _propertyType; } + set + { + SetPropertyValueAndDetectChanges(o => + { + _propertyType = value; + return _propertyType; + }, _propertyType, PropertyTypeSelector); + } + } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Models/Property.cs b/src/Umbraco.Core/Models/Property.cs index 7ac301f807..d6298d9da2 100644 --- a/src/Umbraco.Core/Models/Property.cs +++ b/src/Umbraco.Core/Models/Property.cs @@ -83,8 +83,11 @@ namespace Umbraco.Core.Models get { return _version; } set { - _version = value; - OnPropertyChanged(VersionSelector); + SetPropertyValueAndDetectChanges(o => + { + _version = value; + return _version; + }, _version, VersionSelector); } } @@ -109,8 +112,11 @@ namespace Umbraco.Core.Models "Type validation failed. The value type: '{0}' does not match the DataType in PropertyType with alias: '{1}'", value == null ? "null" : value.GetType().Name, Alias)); - _value = value; - OnPropertyChanged(ValueSelector); + SetPropertyValueAndDetectChanges(o => + { + _value = value; + return _value; + }, _value, ValueSelector); } } diff --git a/src/Umbraco.Core/Models/PropertyGroup.cs b/src/Umbraco.Core/Models/PropertyGroup.cs index 395d0b7992..b17f7246c3 100644 --- a/src/Umbraco.Core/Models/PropertyGroup.cs +++ b/src/Umbraco.Core/Models/PropertyGroup.cs @@ -46,8 +46,11 @@ namespace Umbraco.Core.Models get { return _name; } set { - _name = value; - OnPropertyChanged(NameSelector); + SetPropertyValueAndDetectChanges(o => + { + _name = value; + return _name; + }, _name, NameSelector); } } @@ -64,8 +67,11 @@ namespace Umbraco.Core.Models get { return _parentId; } set { - _parentId = value; - OnPropertyChanged(ParentIdSelector); + SetPropertyValueAndDetectChanges(o => + { + _parentId = value; + return _parentId; + }, _parentId, ParentIdSelector); } } @@ -78,8 +84,11 @@ namespace Umbraco.Core.Models get { return _sortOrder; } set { - _sortOrder = value; - OnPropertyChanged(SortOrderSelector); + SetPropertyValueAndDetectChanges(o => + { + _sortOrder = value; + return _sortOrder; + }, _sortOrder, SortOrderSelector); } } diff --git a/src/Umbraco.Core/Models/PropertyType.cs b/src/Umbraco.Core/Models/PropertyType.cs index b670693519..2db3d4bd1c 100644 --- a/src/Umbraco.Core/Models/PropertyType.cs +++ b/src/Umbraco.Core/Models/PropertyType.cs @@ -73,8 +73,11 @@ namespace Umbraco.Core.Models get { return _name; } set { - _name = value; - OnPropertyChanged(NameSelector); + SetPropertyValueAndDetectChanges(o => + { + _name = value; + return _name; + }, _name, NameSelector); } } @@ -87,8 +90,11 @@ namespace Umbraco.Core.Models get { return _alias; } set { - _alias = value; - OnPropertyChanged(AliasSelector); + SetPropertyValueAndDetectChanges(o => + { + _alias = value; + return _alias; + }, _alias, AliasSelector); } } @@ -101,8 +107,11 @@ namespace Umbraco.Core.Models get { return _description; } set { - _description = value; - OnPropertyChanged(DescriptionSelector); + SetPropertyValueAndDetectChanges(o => + { + _description = value; + return _description; + }, _description, DescriptionSelector); } } @@ -116,8 +125,11 @@ namespace Umbraco.Core.Models get { return _dataTypeDefinitionId; } set { - _dataTypeDefinitionId = value; - OnPropertyChanged(DataTypeDefinitionIdSelector); + SetPropertyValueAndDetectChanges(o => + { + _dataTypeDefinitionId = value; + return _dataTypeDefinitionId; + }, _dataTypeDefinitionId, DataTypeDefinitionIdSelector); } } @@ -131,8 +143,11 @@ namespace Umbraco.Core.Models get { return _dataTypeId; } internal set { - _dataTypeId = value; - OnPropertyChanged(DataTypeControlIdSelector); + SetPropertyValueAndDetectChanges(o => + { + _dataTypeId = value; + return _dataTypeId; + }, _dataTypeId, DataTypeControlIdSelector); } } @@ -145,8 +160,11 @@ namespace Umbraco.Core.Models get { return _dataTypeDatabaseType; } set { - _dataTypeDatabaseType = value; - OnPropertyChanged(DataTypeDatabaseTypeSelector); + SetPropertyValueAndDetectChanges(o => + { + _dataTypeDatabaseType = value; + return _dataTypeDatabaseType; + }, _dataTypeDatabaseType, DataTypeDatabaseTypeSelector); } } @@ -159,8 +177,11 @@ namespace Umbraco.Core.Models get { return _propertyGroupId; } set { - _propertyGroupId = value; - OnPropertyChanged(PropertyGroupIdSelector); + SetPropertyValueAndDetectChanges(o => + { + _propertyGroupId = value; + return _propertyGroupId; + }, _propertyGroupId, PropertyGroupIdSelector); } } @@ -173,8 +194,11 @@ namespace Umbraco.Core.Models get { return _mandatory; } set { - _mandatory = value; - OnPropertyChanged(MandatorySelector); + SetPropertyValueAndDetectChanges(o => + { + _mandatory = value; + return _mandatory; + }, _mandatory, MandatorySelector); } } @@ -187,8 +211,11 @@ namespace Umbraco.Core.Models get { return _helpText; } set { - _helpText = value; - OnPropertyChanged(HelpTextSelector); + SetPropertyValueAndDetectChanges(o => + { + _helpText = value; + return _helpText; + }, _helpText, HelpTextSelector); } } @@ -201,8 +228,11 @@ namespace Umbraco.Core.Models get { return _sortOrder; } set { - _sortOrder = value; - OnPropertyChanged(SortOrderSelector); + SetPropertyValueAndDetectChanges(o => + { + _sortOrder = value; + return _sortOrder; + }, _sortOrder, SortOrderSelector); } } @@ -215,8 +245,11 @@ namespace Umbraco.Core.Models get { return _validationRegExp; } set { - _validationRegExp = value; - OnPropertyChanged(ValidationRegExpSelector); + SetPropertyValueAndDetectChanges(o => + { + _validationRegExp = value; + return _validationRegExp; + }, _validationRegExp, ValidationRegExpSelector); } } //Note that Validation should eventually come from PropertyEditors like in v5 diff --git a/src/Umbraco.Core/Models/Relation.cs b/src/Umbraco.Core/Models/Relation.cs index 2dc1bd877e..edcca14d82 100644 --- a/src/Umbraco.Core/Models/Relation.cs +++ b/src/Umbraco.Core/Models/Relation.cs @@ -40,8 +40,11 @@ namespace Umbraco.Core.Models get { return _parentId; } set { - _parentId = value; - OnPropertyChanged(ParentIdSelector); + SetPropertyValueAndDetectChanges(o => + { + _parentId = value; + return _parentId; + }, _parentId, ParentIdSelector); } } @@ -54,8 +57,11 @@ namespace Umbraco.Core.Models get { return _childId; } set { - _childId = value; - OnPropertyChanged(ChildIdSelector); + SetPropertyValueAndDetectChanges(o => + { + _childId = value; + return _childId; + }, _childId, ChildIdSelector); } } @@ -68,8 +74,11 @@ namespace Umbraco.Core.Models get { return _relationType; } set { - _relationType = value; - OnPropertyChanged(RelationTypeSelector); + SetPropertyValueAndDetectChanges(o => + { + _relationType = value; + return _relationType; + }, _relationType, RelationTypeSelector); } } @@ -82,8 +91,11 @@ namespace Umbraco.Core.Models get { return _comment; } set { - _comment = value; - OnPropertyChanged(CommentSelector); + SetPropertyValueAndDetectChanges(o => + { + _comment = value; + return _comment; + }, _comment, CommentSelector); } } diff --git a/src/Umbraco.Core/Models/RelationType.cs b/src/Umbraco.Core/Models/RelationType.cs index e7f9dcbd76..cf3448c62d 100644 --- a/src/Umbraco.Core/Models/RelationType.cs +++ b/src/Umbraco.Core/Models/RelationType.cs @@ -41,8 +41,11 @@ namespace Umbraco.Core.Models get { return _name; } set { - _name = value; - OnPropertyChanged(NameSelector); + SetPropertyValueAndDetectChanges(o => + { + _name = value; + return _name; + }, _name, NameSelector); } } @@ -55,8 +58,11 @@ namespace Umbraco.Core.Models get { return _alias; } set { - _alias = value; - OnPropertyChanged(AliasSelector); + SetPropertyValueAndDetectChanges(o => + { + _alias = value; + return _alias; + }, _alias, AliasSelector); } } @@ -69,8 +75,11 @@ namespace Umbraco.Core.Models get { return _isBidrectional; } set { - _isBidrectional = value; - OnPropertyChanged(IsBidirectionalSelector); + SetPropertyValueAndDetectChanges(o => + { + _isBidrectional = value; + return _isBidrectional; + }, _isBidrectional, IsBidirectionalSelector); } } @@ -84,8 +93,11 @@ namespace Umbraco.Core.Models get { return _parentObjectType; } set { - _parentObjectType = value; - OnPropertyChanged(ParentObjectTypeSelector); + SetPropertyValueAndDetectChanges(o => + { + _parentObjectType = value; + return _parentObjectType; + }, _parentObjectType, ParentObjectTypeSelector); } } @@ -99,8 +111,11 @@ namespace Umbraco.Core.Models get { return _childObjectType; } set { - _childObjectType = value; - OnPropertyChanged(ChildObjectTypeSelector); + SetPropertyValueAndDetectChanges(o => + { + _childObjectType = value; + return _childObjectType; + }, _childObjectType, ChildObjectTypeSelector); } } } diff --git a/src/Umbraco.Core/Models/ServerRegistration.cs b/src/Umbraco.Core/Models/ServerRegistration.cs index 32282b4f79..877e00c25f 100644 --- a/src/Umbraco.Core/Models/ServerRegistration.cs +++ b/src/Umbraco.Core/Models/ServerRegistration.cs @@ -1,4 +1,5 @@ using System; +using System.Reflection; using Umbraco.Core.Models.EntityBase; using Umbraco.Core.Persistence.Mappers; using Umbraco.Core.Sync; @@ -7,6 +8,14 @@ namespace Umbraco.Core.Models { internal class ServerRegistration : Entity, IServerAddress, IAggregateRoot { + private string _serverAddress; + private string _computerName; + private bool _isActive; + + private static readonly PropertyInfo ServerAddressSelector = ExpressionHelper.GetPropertyInfo(x => x.ServerAddress); + private static readonly PropertyInfo ComputerNameSelector = ExpressionHelper.GetPropertyInfo(x => x.ComputerName); + private static readonly PropertyInfo IsActiveSelector = ExpressionHelper.GetPropertyInfo(x => x.IsActive); + public ServerRegistration() { @@ -45,8 +54,43 @@ namespace Umbraco.Core.Models ComputerName = computerName; } - public string ServerAddress { get; set; } - public string ComputerName { get; set; } - public bool IsActive { get; set; } + public string ServerAddress + { + get { return _serverAddress; } + set + { + SetPropertyValueAndDetectChanges(o => + { + _serverAddress = value; + return _serverAddress; + }, _serverAddress, ServerAddressSelector); + } + } + + public string ComputerName + { + get { return _computerName; } + set + { + SetPropertyValueAndDetectChanges(o => + { + _computerName = value; + return _computerName; + }, _computerName, ComputerNameSelector); + } + } + + public bool IsActive + { + get { return _isActive; } + set + { + SetPropertyValueAndDetectChanges(o => + { + _isActive = value; + return _isActive; + }, _isActive, IsActiveSelector); + } + } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Models/Stylesheet.cs b/src/Umbraco.Core/Models/Stylesheet.cs index b4a5ad1ff8..2bed225361 100644 --- a/src/Umbraco.Core/Models/Stylesheet.cs +++ b/src/Umbraco.Core/Models/Stylesheet.cs @@ -5,7 +5,6 @@ using System.Runtime.Serialization; using System.Text; using Umbraco.Core.IO; using Umbraco.Core.Models.Css; -using Umbraco.Core.Models.EntityBase; namespace Umbraco.Core.Models { @@ -159,25 +158,4 @@ namespace Umbraco.Core.Models get { return string.IsNullOrEmpty(Path) == false; } } } - - /// - /// Represents a Stylesheet Property - /// - /// - /// Properties are always formatted to have a single selector, so it can be used in the backoffice - /// - [Serializable] - [DataContract(IsReference = true)] - public class StylesheetProperty : IValueObject - { - public StylesheetProperty(string @alias, string value) - { - Alias = alias; - Value = value; - } - - public string Alias { get; set; } - public string Value { get; set; } - public bool IsPartOfAtRule { get; set; } - } } \ No newline at end of file diff --git a/src/Umbraco.Core/Models/StylesheetProperty.cs b/src/Umbraco.Core/Models/StylesheetProperty.cs new file mode 100644 index 0000000000..6053f75bd6 --- /dev/null +++ b/src/Umbraco.Core/Models/StylesheetProperty.cs @@ -0,0 +1,27 @@ +using System; +using System.Runtime.Serialization; +using Umbraco.Core.Models.EntityBase; + +namespace Umbraco.Core.Models +{ + /// + /// Represents a Stylesheet Property + /// + /// + /// Properties are always formatted to have a single selector, so it can be used in the backoffice + /// + [Serializable] + [DataContract(IsReference = true)] + public class StylesheetProperty : IValueObject + { + public StylesheetProperty(string @alias, string value) + { + Alias = alias; + Value = value; + } + + public string Alias { get; set; } + public string Value { get; set; } + public bool IsPartOfAtRule { get; set; } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Models/Task.cs b/src/Umbraco.Core/Models/Task.cs index 88a86dcb44..86370c00bb 100644 --- a/src/Umbraco.Core/Models/Task.cs +++ b/src/Umbraco.Core/Models/Task.cs @@ -40,8 +40,11 @@ namespace Umbraco.Core.Models get { return _closed; } set { - _closed = value; - OnPropertyChanged(ClosedSelector); + SetPropertyValueAndDetectChanges(o => + { + _closed = value; + return _closed; + }, _closed, ClosedSelector); } } @@ -54,8 +57,11 @@ namespace Umbraco.Core.Models get { return _taskType; } set { - _taskType = value; - OnPropertyChanged(TaskTypeSelector); + SetPropertyValueAndDetectChanges(o => + { + _taskType = value; + return _taskType; + }, _taskType, TaskTypeSelector); } } @@ -68,8 +74,11 @@ namespace Umbraco.Core.Models get { return _entityId; } set { - _entityId = value; - OnPropertyChanged(EntityIdSelector); + SetPropertyValueAndDetectChanges(o => + { + _entityId = value; + return _entityId; + }, _entityId, EntityIdSelector); } } @@ -82,8 +91,11 @@ namespace Umbraco.Core.Models get { return _ownerUserId; } set { - _ownerUserId = value; - OnPropertyChanged(OwnerUserIdSelector); + SetPropertyValueAndDetectChanges(o => + { + _ownerUserId = value; + return _ownerUserId; + }, _ownerUserId, OwnerUserIdSelector); } } @@ -96,8 +108,11 @@ namespace Umbraco.Core.Models get { return _assigneeUserId; } set { - _assigneeUserId = value; - OnPropertyChanged(AssigneeUserIdSelector); + SetPropertyValueAndDetectChanges(o => + { + _assigneeUserId = value; + return _assigneeUserId; + }, _assigneeUserId, AssigneeUserIdSelector); } } @@ -110,8 +125,11 @@ namespace Umbraco.Core.Models get { return _comment; } set { - _comment = value; - OnPropertyChanged(CommentSelector); + SetPropertyValueAndDetectChanges(o => + { + _comment = value; + return _comment; + }, _comment, CommentSelector); } } } diff --git a/src/Umbraco.Core/Models/TaskType.cs b/src/Umbraco.Core/Models/TaskType.cs index 4789683292..3f753f5ad9 100644 --- a/src/Umbraco.Core/Models/TaskType.cs +++ b/src/Umbraco.Core/Models/TaskType.cs @@ -30,8 +30,11 @@ namespace Umbraco.Core.Models get { return _alias; } set { - _alias = value; - OnPropertyChanged(AliasSelector); + SetPropertyValueAndDetectChanges(o => + { + _alias = value; + return _alias; + }, _alias, AliasSelector); } } } diff --git a/src/Umbraco.Core/Models/Template.cs b/src/Umbraco.Core/Models/Template.cs index 360dc01833..63062eee84 100644 --- a/src/Umbraco.Core/Models/Template.cs +++ b/src/Umbraco.Core/Models/Template.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Reflection; using System.Runtime.Serialization; using Umbraco.Core.Configuration; using Umbraco.Core.IO; @@ -15,6 +16,22 @@ namespace Umbraco.Core.Models { private readonly string _alias; private readonly string _name; + private int _creatorId; + private int _level; + private int _sortOrder; + private int _parentId; + private string _nodePath; + private int _masterTemplateId; + private string _masterTemplateAlias; + + private static readonly PropertyInfo CreatorIdSelector = ExpressionHelper.GetPropertyInfo(x => x.CreatorId); + private static readonly PropertyInfo LevelSelector = ExpressionHelper.GetPropertyInfo(x => x.Level); + private static readonly PropertyInfo SortOrderSelector = ExpressionHelper.GetPropertyInfo(x => x.SortOrder); + private static readonly PropertyInfo ParentIdSelector = ExpressionHelper.GetPropertyInfo(x => x.ParentId); + private static readonly PropertyInfo NodePathSelector = ExpressionHelper.GetPropertyInfo(x => x.NodePath); + private static readonly PropertyInfo MasterTemplateIdSelector = ExpressionHelper.GetPropertyInfo(x => x.MasterTemplateId); + private static readonly PropertyInfo MasterTemplateAliasSelector = ExpressionHelper.GetPropertyInfo(x => x.MasterTemplateAlias); + internal Template(string path) : base(path) @@ -37,25 +54,102 @@ namespace Umbraco.Core.Models } [DataMember] - internal int CreatorId { get; set; } + internal int CreatorId + { + get { return _creatorId; } + set + { + SetPropertyValueAndDetectChanges(o => + { + _creatorId = value; + return _creatorId; + }, _creatorId, CreatorIdSelector); + } + } [DataMember] - internal int Level { get; set; } + internal int Level + { + get { return _level; } + set + { + SetPropertyValueAndDetectChanges(o => + { + _level = value; + return _level; + }, _level, LevelSelector); + } + } [DataMember] - internal int SortOrder { get; set; } + internal int SortOrder + { + get { return _sortOrder; } + set + { + SetPropertyValueAndDetectChanges(o => + { + _sortOrder = value; + return _sortOrder; + }, _sortOrder, SortOrderSelector); + } + } [DataMember] - internal int ParentId { get; set; } + internal int ParentId + { + get { return _parentId; } + set + { + SetPropertyValueAndDetectChanges(o => + { + _parentId = value; + return _parentId; + }, _parentId, ParentIdSelector); + } + } [DataMember] - internal string NodePath { get; set; } + internal string NodePath + { + get { return _nodePath; } + set + { + SetPropertyValueAndDetectChanges(o => + { + _nodePath = value; + return _nodePath; + }, _nodePath, NodePathSelector); + } + } [DataMember] - internal int MasterTemplateId { get; set; } + internal int MasterTemplateId + { + get { return _masterTemplateId; } + set + { + SetPropertyValueAndDetectChanges(o => + { + _masterTemplateId = value; + return _masterTemplateId; + }, _masterTemplateId, MasterTemplateIdSelector); + } + } [DataMember] - internal string MasterTemplateAlias { get; set; } + internal string MasterTemplateAlias + { + get { return _masterTemplateAlias; } + set + { + SetPropertyValueAndDetectChanges(o => + { + _masterTemplateAlias = value; + return _masterTemplateAlias; + }, _masterTemplateAlias, MasterTemplateAliasSelector); + } + } [DataMember] public override string Alias diff --git a/src/Umbraco.Core/Models/UmbracoEntity.cs b/src/Umbraco.Core/Models/UmbracoEntity.cs index 6e29dda984..ebb4477557 100644 --- a/src/Umbraco.Core/Models/UmbracoEntity.cs +++ b/src/Umbraco.Core/Models/UmbracoEntity.cs @@ -1,4 +1,5 @@ using System; +using System.Reflection; using Umbraco.Core.Models.EntityBase; namespace Umbraco.Core.Models @@ -8,6 +9,28 @@ namespace Umbraco.Core.Models /// internal class UmbracoEntity : Entity, IUmbracoEntity { + private int _creatorId; + private int _level; + private string _name; + private int _parentId; + private string _path; + private int _sortOrder; + private bool _trashed; + private bool _hasChildren; + private bool _isPublished; + private Guid _nodeObjectTypeId; + + private static readonly PropertyInfo CreatorIdSelector = ExpressionHelper.GetPropertyInfo(x => x.CreatorId); + private static readonly PropertyInfo LevelSelector = ExpressionHelper.GetPropertyInfo(x => x.Level); + private static readonly PropertyInfo NameSelector = ExpressionHelper.GetPropertyInfo(x => x.Name); + private static readonly PropertyInfo ParentIdSelector = ExpressionHelper.GetPropertyInfo(x => x.ParentId); + private static readonly PropertyInfo PathSelector = ExpressionHelper.GetPropertyInfo(x => x.Path); + private static readonly PropertyInfo SortOrderSelector = ExpressionHelper.GetPropertyInfo(x => x.SortOrder); + private static readonly PropertyInfo TrashedSelector = ExpressionHelper.GetPropertyInfo(x => x.Trashed); + private static readonly PropertyInfo HasChildrenSelector = ExpressionHelper.GetPropertyInfo(x => x.HasChildren); + private static readonly PropertyInfo IsPublishedSelector = ExpressionHelper.GetPropertyInfo(x => x.IsPublished); + private static readonly PropertyInfo NodeObjectTypeIdSelector = ExpressionHelper.GetPropertyInfo(x => x.NodeObjectTypeId); + public UmbracoEntity() { } @@ -17,24 +40,134 @@ namespace Umbraco.Core.Models Trashed = trashed; } - public int CreatorId { get; set; } + public int CreatorId + { + get { return _creatorId; } + set + { + SetPropertyValueAndDetectChanges(o => + { + _creatorId = value; + return _creatorId; + }, _creatorId, CreatorIdSelector); + } + } - public int Level { get; set; } + public int Level + { + get { return _level; } + set + { + SetPropertyValueAndDetectChanges(o => + { + _level = value; + return _level; + }, _level, LevelSelector); + } + } - public string Name { get; set; } + public string Name + { + get { return _name; } + set + { + SetPropertyValueAndDetectChanges(o => + { + _name = value; + return _name; + }, _name, NameSelector); + } + } - public int ParentId { get; set; } + public int ParentId + { + get { return _parentId; } + set + { + SetPropertyValueAndDetectChanges(o => + { + _parentId = value; + return _parentId; + }, _parentId, ParentIdSelector); + } + } - public string Path { get; set; } + public string Path + { + get { return _path; } + set + { + SetPropertyValueAndDetectChanges(o => + { + _path = value; + return _path; + }, _path, PathSelector); + } + } - public int SortOrder { get; set; } + public int SortOrder + { + get { return _sortOrder; } + set + { + SetPropertyValueAndDetectChanges(o => + { + _sortOrder = value; + return _sortOrder; + }, _sortOrder, SortOrderSelector); + } + } - public bool Trashed { get; private set; } + public bool Trashed + { + get { return _trashed; } + private set + { + SetPropertyValueAndDetectChanges(o => + { + _trashed = value; + return _trashed; + }, _trashed, TrashedSelector); + } + } - public bool HasChildren { get; set; } + public bool HasChildren + { + get { return _hasChildren; } + set + { + SetPropertyValueAndDetectChanges(o => + { + _hasChildren = value; + return _hasChildren; + }, _hasChildren, HasChildrenSelector); + } + } - public bool IsPublished { get; set; } + public bool IsPublished + { + get { return _isPublished; } + set + { + SetPropertyValueAndDetectChanges(o => + { + _isPublished = value; + return _isPublished; + }, _isPublished, IsPublishedSelector); + } + } - public Guid NodeObjectTypeId { get; set; } + public Guid NodeObjectTypeId + { + get { return _nodeObjectTypeId; } + set + { + SetPropertyValueAndDetectChanges(o => + { + _nodeObjectTypeId = value; + return _nodeObjectTypeId; + }, _nodeObjectTypeId, NodeObjectTypeIdSelector); + } + } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index d6b8f1c3b1..930c94dc72 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -175,6 +175,7 @@ + @@ -211,6 +212,7 @@ +