Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / Orcas / SP / wpf / src / Base / MS / Internal / FreezableDefaultValueFactory.cs / 1 / FreezableDefaultValueFactory.cs
//---------------------------------------------------------------------------- // //// Copyright (C) Microsoft Corporation. All rights reserved. // // // Description: DefaultvalueFactory for Freezables // // History: // 2005/11/08 : jordanpa - Created from PresentationCore's old // MutableDefaultPropertyMetadata // //--------------------------------------------------------------------------- using MS.Internal.WindowsBase; using System; using System.Diagnostics; using System.Windows; namespace MS.Internal { //// FreezableDefaultValueFactory is a DefaultValueFactory implementation which // is inserted by the property system for any DP registered with a default // value of type Freezable. The user’s given default value is frozen and // used as a template to create unfrozen copies on a per DP per DO basis. If // the default value is modified it is automatically promoted from default to // local. // [FriendAccessAllowed] // built into Base, used by Core + Framework internal class FreezableDefaultValueFactory : DefaultValueFactory { ////// Stores a frozen copy of defaultValue /// internal FreezableDefaultValueFactory(Freezable defaultValue) { Debug.Assert(defaultValue != null, "Null can not be made mutable. Do not use FreezableDefaultValueFactory."); Debug.Assert(defaultValue.CanFreeze, "The defaultValue prototype must be freezable."); _defaultValuePrototype = defaultValue.GetAsFrozen(); } ////// Returns our frozen sentinel /// internal override object DefaultValue { get { Debug.Assert(_defaultValuePrototype.IsFrozen); return _defaultValuePrototype; } } ////// If the DO is frozen, we'll return our frozen sentinel. Otherwise we'll make /// an unfrozen copy. /// internal override object CreateDefaultValue(DependencyObject owner, DependencyProperty property) { Debug.Assert(owner != null && property != null, "It is the caller responsibility to ensure that owner and property are non-null."); Freezable result = _defaultValuePrototype; Freezable ownerFreezable = owner as Freezable; // If the owner is frozen, just return the frozen prototype. if (ownerFreezable != null && ownerFreezable.IsFrozen) { return result; } result = _defaultValuePrototype.Clone(); // Wire up a FreezableDefaultPromoter to observe the default value we // just created and automatically promote it to local if it is modified. FreezableDefaultPromoter promoter = new FreezableDefaultPromoter(owner, property); promoter.SetFreezableDefaultValue(result); result.Changed += promoter.OnDefaultValueChanged; return result; } // This is the prototype that CreateDefaultValue copies to create the // mutable default value for this property. See also the ctor. private readonly Freezable _defaultValuePrototype; ////// The FreezableDefaultPromoter observes the mutable defaults we hand out /// for changed events. If the default is ever modified this class will /// promote it to a local value by writing it to the local store and /// clear the cached default value so we will generate a new default /// the next time the property system is asked for one. /// private class FreezableDefaultPromoter { internal FreezableDefaultPromoter(DependencyObject owner, DependencyProperty property) { Debug.Assert(owner != null && property != null, "Caller is responsible for ensuring that owner and property are non-null."); Debug.Assert(!(owner is Freezable) || !((Freezable)owner).IsFrozen, "We should not be observing mutables on a frozen owner."); Debug.Assert(property.GetMetadata(owner.DependencyObjectType).UsingDefaultValueFactory, "How did we end up observing a mutable if we were not registered for the factory pattern?"); // We hang on to the property and owner so we can write the default // value back to the local store if it changes. See also // OnDefaultValueChanged. _owner = owner; _property = property; } internal void OnDefaultValueChanged(object sender, EventArgs e) { Debug.Assert(_mutableDefaultValue != null, "Promoter's creator should have called SetFreezableDefaultValue."); PropertyMetadata metadata = _property.GetMetadata(_owner.DependencyObjectType); // Remove this value from the DefaultValue cache so we stop // handing it out as the default value now that it has changed. metadata.ClearCachedDefaultValue(_owner, _property); // Since Changed is raised when the user freezes the default // value, we need to check before removing our handler. // (If the value is frozen, it will remove it's own handlers.) if (!_mutableDefaultValue.IsFrozen) { _mutableDefaultValue.Changed -= OnDefaultValueChanged; } // If someone else hasn't already written a local local value, // promote the default value to local. if (_owner.ReadLocalValue(_property) == DependencyProperty.UnsetValue) { _owner.SetMutableDefaultValue(_property, _mutableDefaultValue); } } private readonly DependencyObject _owner; private readonly DependencyProperty _property; #region DefaultValue // The creator of a FreezableDefaultValuePromoter should call this method // so that we can verify that the changed sender is the mutable default // value we handed out. internal void SetFreezableDefaultValue(Freezable mutableDefaultValue) { _mutableDefaultValue = mutableDefaultValue; } private Freezable _mutableDefaultValue; #endregion DefaultValue } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. //---------------------------------------------------------------------------- // //// Copyright (C) Microsoft Corporation. All rights reserved. // // // Description: DefaultvalueFactory for Freezables // // History: // 2005/11/08 : jordanpa - Created from PresentationCore's old // MutableDefaultPropertyMetadata // //--------------------------------------------------------------------------- using MS.Internal.WindowsBase; using System; using System.Diagnostics; using System.Windows; namespace MS.Internal { //// FreezableDefaultValueFactory is a DefaultValueFactory implementation which // is inserted by the property system for any DP registered with a default // value of type Freezable. The user’s given default value is frozen and // used as a template to create unfrozen copies on a per DP per DO basis. If // the default value is modified it is automatically promoted from default to // local. // [FriendAccessAllowed] // built into Base, used by Core + Framework internal class FreezableDefaultValueFactory : DefaultValueFactory { ////// Stores a frozen copy of defaultValue /// internal FreezableDefaultValueFactory(Freezable defaultValue) { Debug.Assert(defaultValue != null, "Null can not be made mutable. Do not use FreezableDefaultValueFactory."); Debug.Assert(defaultValue.CanFreeze, "The defaultValue prototype must be freezable."); _defaultValuePrototype = defaultValue.GetAsFrozen(); } ////// Returns our frozen sentinel /// internal override object DefaultValue { get { Debug.Assert(_defaultValuePrototype.IsFrozen); return _defaultValuePrototype; } } ////// If the DO is frozen, we'll return our frozen sentinel. Otherwise we'll make /// an unfrozen copy. /// internal override object CreateDefaultValue(DependencyObject owner, DependencyProperty property) { Debug.Assert(owner != null && property != null, "It is the caller responsibility to ensure that owner and property are non-null."); Freezable result = _defaultValuePrototype; Freezable ownerFreezable = owner as Freezable; // If the owner is frozen, just return the frozen prototype. if (ownerFreezable != null && ownerFreezable.IsFrozen) { return result; } result = _defaultValuePrototype.Clone(); // Wire up a FreezableDefaultPromoter to observe the default value we // just created and automatically promote it to local if it is modified. FreezableDefaultPromoter promoter = new FreezableDefaultPromoter(owner, property); promoter.SetFreezableDefaultValue(result); result.Changed += promoter.OnDefaultValueChanged; return result; } // This is the prototype that CreateDefaultValue copies to create the // mutable default value for this property. See also the ctor. private readonly Freezable _defaultValuePrototype; ////// The FreezableDefaultPromoter observes the mutable defaults we hand out /// for changed events. If the default is ever modified this class will /// promote it to a local value by writing it to the local store and /// clear the cached default value so we will generate a new default /// the next time the property system is asked for one. /// private class FreezableDefaultPromoter { internal FreezableDefaultPromoter(DependencyObject owner, DependencyProperty property) { Debug.Assert(owner != null && property != null, "Caller is responsible for ensuring that owner and property are non-null."); Debug.Assert(!(owner is Freezable) || !((Freezable)owner).IsFrozen, "We should not be observing mutables on a frozen owner."); Debug.Assert(property.GetMetadata(owner.DependencyObjectType).UsingDefaultValueFactory, "How did we end up observing a mutable if we were not registered for the factory pattern?"); // We hang on to the property and owner so we can write the default // value back to the local store if it changes. See also // OnDefaultValueChanged. _owner = owner; _property = property; } internal void OnDefaultValueChanged(object sender, EventArgs e) { Debug.Assert(_mutableDefaultValue != null, "Promoter's creator should have called SetFreezableDefaultValue."); PropertyMetadata metadata = _property.GetMetadata(_owner.DependencyObjectType); // Remove this value from the DefaultValue cache so we stop // handing it out as the default value now that it has changed. metadata.ClearCachedDefaultValue(_owner, _property); // Since Changed is raised when the user freezes the default // value, we need to check before removing our handler. // (If the value is frozen, it will remove it's own handlers.) if (!_mutableDefaultValue.IsFrozen) { _mutableDefaultValue.Changed -= OnDefaultValueChanged; } // If someone else hasn't already written a local local value, // promote the default value to local. if (_owner.ReadLocalValue(_property) == DependencyProperty.UnsetValue) { _owner.SetMutableDefaultValue(_property, _mutableDefaultValue); } } private readonly DependencyObject _owner; private readonly DependencyProperty _property; #region DefaultValue // The creator of a FreezableDefaultValuePromoter should call this method // so that we can verify that the changed sender is the mutable default // value we handed out. internal void SetFreezableDefaultValue(Freezable mutableDefaultValue) { _mutableDefaultValue = mutableDefaultValue; } private Freezable _mutableDefaultValue; #endregion DefaultValue } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- QuaternionRotation3D.cs
- SqlPersonalizationProvider.cs
- SimpleWebHandlerParser.cs
- ModelTreeManager.cs
- WriteStateInfoBase.cs
- Codec.cs
- ExpressionBuilder.cs
- XmlTextReaderImplHelpers.cs
- HitTestWithPointDrawingContextWalker.cs
- XmlReflectionImporter.cs
- AsyncOperationManager.cs
- RequestBringIntoViewEventArgs.cs
- TimeSpanOrInfiniteValidator.cs
- FocusTracker.cs
- SqlTopReducer.cs
- PropertyChange.cs
- QilName.cs
- TrackPointCollection.cs
- RecipientInfo.cs
- XmlSchemaResource.cs
- BasicCommandTreeVisitor.cs
- TraceInternal.cs
- FixedMaxHeap.cs
- MenuItemBindingCollection.cs
- SessionStateContainer.cs
- VectorCollectionValueSerializer.cs
- HtmlGenericControl.cs
- SessionStateItemCollection.cs
- CreateUserWizard.cs
- _NegoStream.cs
- FilePrompt.cs
- StyleXamlParser.cs
- CoTaskMemHandle.cs
- StackSpiller.Temps.cs
- MemberListBinding.cs
- MemberHolder.cs
- MatrixIndependentAnimationStorage.cs
- OdbcHandle.cs
- SmtpMail.cs
- OdbcConnection.cs
- ProfessionalColors.cs
- BinaryObjectWriter.cs
- StringFreezingAttribute.cs
- SqlRowUpdatingEvent.cs
- TimeSpanStorage.cs
- WebPartAuthorizationEventArgs.cs
- TransactionTraceIdentifier.cs
- RegexRunner.cs
- HitTestParameters3D.cs
- Transaction.cs
- DataGridViewAutoSizeModeEventArgs.cs
- PrintPreviewDialog.cs
- _NegoState.cs
- SocketAddress.cs
- XmlValidatingReader.cs
- TextTreeInsertUndoUnit.cs
- MissingMemberException.cs
- JournalNavigationScope.cs
- DesignerToolStripControlHost.cs
- PagerSettings.cs
- FontFamilyConverter.cs
- RootBuilder.cs
- URI.cs
- MultipleViewPattern.cs
- TrustSection.cs
- CodeSnippetExpression.cs
- FilterElement.cs
- AuthenticationService.cs
- XmlSchemaSimpleContent.cs
- ConvertEvent.cs
- CommandLineParser.cs
- Metafile.cs
- SafeFileMappingHandle.cs
- DataGridTableCollection.cs
- UIElementParagraph.cs
- SqlProfileProvider.cs
- TableRow.cs
- GroupItem.cs
- BuiltInExpr.cs
- SmtpClient.cs
- EllipseGeometry.cs
- ISO2022Encoding.cs
- GridSplitterAutomationPeer.cs
- WebProxyScriptElement.cs
- DetailsViewInsertEventArgs.cs
- Metadata.cs
- ExternalException.cs
- IdnElement.cs
- XmlObjectSerializerReadContextComplex.cs
- CustomValidator.cs
- FieldDescriptor.cs
- IDispatchConstantAttribute.cs
- XmlWrappingReader.cs
- AVElementHelper.cs
- GenerateHelper.cs
- UpdatePanelTrigger.cs
- RoleService.cs
- SelectManyQueryOperator.cs
- SerializationHelper.cs
- UIEndRequest.cs