/// <summary> /// Values are non-default if they differ from the refined parent /// </summary> public override bool ShouldSerializeValue(object component) { NameGenerator generator = (NameGenerator)component; NameGenerator parentGenerator = generator.RefinesGenerator; return((parentGenerator != null) ? !DomainPropertyInfo.GetValue(parentGenerator).Equals(DomainPropertyInfo.GetValue(generator)) : base.ShouldSerializeValue(component)); }
private static void PropagateChange(NameGenerator parentGenerator, DomainPropertyInfo propertyInfo, object oldValue, object newValue) { foreach (NameGenerator refinement in parentGenerator.RefinedByGeneratorCollection) { if (propertyInfo.GetValue(refinement).Equals(oldValue)) { propertyInfo.SetValue(refinement, newValue); PropagateChange(refinement, propertyInfo, oldValue, newValue); } } }
/// <summary> /// Reset the value to the value of the refined generator /// </summary> public override void ResetValue(object component) { NameGenerator generator = (NameGenerator)component; NameGenerator parentGenerator = generator.RefinesGenerator; if (parentGenerator != null) { // This gives a different transaction name that the default ResetValue, but // the correct string is not accessible and the duplication is not worth the effort base.SetValue(component, DomainPropertyInfo.GetValue(parentGenerator)); } else { base.ResetValue(component); } }
private static void PropagateChange(NameGenerator parentGenerator, DomainPropertyInfo propertyInfo, object oldValue, object newValue, Type nameUsageType) { foreach (NameGenerator refinement in parentGenerator.RefinedByGeneratorCollection) { Type refinementUsage = refinement.NameUsageType; if (refinementUsage == null) { // Make sure we skip the level to get the corresponding usages PropagateChange(refinement, propertyInfo, oldValue, newValue, nameUsageType); } else if (refinementUsage == nameUsageType && propertyInfo.GetValue(refinement).Equals(oldValue)) { propertyInfo.SetValue(refinement, newValue); PropagateChange(refinement, propertyInfo, oldValue, newValue, nameUsageType); } } }
/// <summary>Notify each model element in a collection that a tracked property has changed.</summary> /// <param name="store">The store for the model.</param> /// <param name="collection">The collection of model elements that contain the tracking property.</param> /// <param name="propertyId">The ID of the tracking property.</param> /// <param name="trackingPropertyId">The ID of the property that indicates whether the tracking property is tracking.</param> internal static void UpdateTrackingCollectionProperty( Store store, IEnumerable collection, Guid propertyId, Guid trackingPropertyId) { DomainPropertyInfo propInfo = store.DomainDataDirectory.GetDomainProperty(propertyId); DomainPropertyInfo trackingPropInfo = store.DomainDataDirectory.GetDomainProperty(trackingPropertyId); Debug.Assert(propInfo != null); Debug.Assert(trackingPropInfo != null); Debug.Assert(trackingPropInfo.PropertyType == typeof(bool), "Tracking property not specified as a boolean"); // If the tracking property is currently tracking, then notify // it that the tracked property has changed. foreach (ModelElement element in collection.Cast <ModelElement>() .Where(element => element.GetDomainClass() == trackingPropInfo.DomainClass && (bool)trackingPropInfo.GetValue(element))) { propInfo.NotifyValueChange(element); } }