Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / wpf / src / Framework / System / Windows / ResourcesChangeInfo.cs / 1305600 / ResourcesChangeInfo.cs
//----------------------------------------------------------------------------
//
// File: ResourcesChangeInfo.cs
//
// Description:
// This data-structure is used
// 1. As the data that is passed around by the DescendentsWalker
// during a resources change tree-walk.
//
// Copyright (C) by Microsoft Corporation. All rights reserved.
//
//---------------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Diagnostics;
namespace System.Windows
{
///
/// This is the data that is passed through the DescendentsWalker
/// during a resources change tree-walk.
///
internal struct ResourcesChangeInfo
{
#region Constructors
///
/// This constructor is used for notifying changes to individual
/// entries in a ResourceDictionary
///
internal ResourcesChangeInfo(object key)
{
_oldDictionaries = null;
_newDictionaries = null;
_key = key;
_container = null;
_flags = 0;
}
///
/// This constructor is used for notifying changes in Application.Resources,
/// [FE/FCE].Resources, ResourceDictionary.EndInit
///
internal ResourcesChangeInfo(ResourceDictionary oldDictionary, ResourceDictionary newDictionary)
{
_oldDictionaries = null;
if (oldDictionary != null)
{
_oldDictionaries = new List(1);
_oldDictionaries.Add(oldDictionary);
}
_newDictionaries = null;
if (newDictionary != null)
{
_newDictionaries = new List(1);
_newDictionaries.Add(newDictionary);
}
_key = null;
_container = null;
_flags = 0;
}
///
/// This constructor is used for notifying changes in Style.Resources,
/// Template.Resources, ThemeStyle.Resources
///
internal ResourcesChangeInfo(
List oldDictionaries,
List newDictionaries,
bool isStyleResourcesChange,
bool isTemplateResourcesChange,
DependencyObject container)
{
_oldDictionaries = oldDictionaries;
_newDictionaries = newDictionaries;
_key = null;
_container = container;
_flags = 0;
IsStyleResourcesChange = isStyleResourcesChange;
IsTemplateResourcesChange = isTemplateResourcesChange;
}
#endregion Constructors
#region Operations
///
/// This is a static accessor for a ResourcesChangeInfo that is used
/// for theme change notifications
///
internal static ResourcesChangeInfo ThemeChangeInfo
{
get
{
ResourcesChangeInfo info = new ResourcesChangeInfo();
info.IsThemeChange = true;
return info;
}
}
///
/// This is a static accessor for a ResourcesChangeInfo that is used
/// for tree change notifications
///
internal static ResourcesChangeInfo TreeChangeInfo
{
get
{
ResourcesChangeInfo info = new ResourcesChangeInfo();
info.IsTreeChange = true;
return info;
}
}
///
/// This is a static accessor for a ResourcesChangeInfo that is used
/// for system colors or settings change notifications
///
internal static ResourcesChangeInfo SysColorsOrSettingsChangeInfo
{
get
{
ResourcesChangeInfo info = new ResourcesChangeInfo();
info.IsSysColorsOrSettingsChange = true;
return info;
}
}
///
/// This is a static accessor for a ResourcesChangeInfo that is used
/// for any ResourceDictionary operations that we aren't able to provide
/// the precise 'key that changed' information
///
internal static ResourcesChangeInfo CatastrophicDictionaryChangeInfo
{
get
{
ResourcesChangeInfo info = new ResourcesChangeInfo();
info.IsCatastrophicDictionaryChange = true;
return info;
}
}
// This flag is used to indicate that a theme change has occured
internal bool IsThemeChange
{
get { return ReadPrivateFlag(PrivateFlags.IsThemeChange); }
set { WritePrivateFlag(PrivateFlags.IsThemeChange, value); }
}
// This flag is used to indicate that a tree change has occured
internal bool IsTreeChange
{
get { return ReadPrivateFlag(PrivateFlags.IsTreeChange); }
set { WritePrivateFlag(PrivateFlags.IsTreeChange, value); }
}
// This flag is used to indicate that a style has changed
internal bool IsStyleResourcesChange
{
get { return ReadPrivateFlag(PrivateFlags.IsStyleResourceChange); }
set { WritePrivateFlag(PrivateFlags.IsStyleResourceChange, value); }
}
// This flag is used to indicate that this resource change was triggered from a Template change
internal bool IsTemplateResourcesChange
{
get {return ReadPrivateFlag(PrivateFlags.IsTemplateResourceChange); }
set { WritePrivateFlag(PrivateFlags.IsTemplateResourceChange, value); }
}
// This flag is used to indicate that a system color or settings change has occured
internal bool IsSysColorsOrSettingsChange
{
get {return ReadPrivateFlag(PrivateFlags.IsSysColorsOrSettingsChange); }
set { WritePrivateFlag(PrivateFlags.IsSysColorsOrSettingsChange, value); }
}
// This flag is used to indicate that a catastrophic dictionary change has occured
internal bool IsCatastrophicDictionaryChange
{
get {return ReadPrivateFlag(PrivateFlags.IsCatastrophicDictionaryChange); }
set { WritePrivateFlag(PrivateFlags.IsCatastrophicDictionaryChange, value); }
}
// This flag is used to indicate if the current operation is an effective add operation
internal bool IsResourceAddOperation
{
get { return _key != null || (_newDictionaries != null && _newDictionaries.Count > 0); }
}
// This member is used to identify the container when a style change happens
internal DependencyObject Container
{
get { return _container; }
}
// Says if either the old or the new dictionaries contain the given key
internal bool Contains(object key, bool isImplicitStyleKey)
{
if (IsTreeChange || IsCatastrophicDictionaryChange)
{
return true;
}
else if (IsThemeChange || IsSysColorsOrSettingsChange)
{
// Implicit Styles are not fetched from the Themes.
// So we do not need to respond to theme changes.
// This is a performance optimization.
return !isImplicitStyleKey;
}
Debug.Assert(_oldDictionaries != null || _newDictionaries != null || _key != null, "Must have a dictionary or a key that has changed");
if (_key != null)
{
if (Object.Equals(_key, key))
{
return true;
}
}
if (_oldDictionaries != null)
{
for (int i=0; i<_oldDictionaries.Count; i++)
{
if (_oldDictionaries[i].Contains(key))
{
return true;
}
}
}
if (_newDictionaries != null)
{
for (int i=0; i<_newDictionaries.Count; i++)
{
if (_newDictionaries[i].Contains(key))
{
return true;
}
}
}
return false;
}
#endregion Operations
#region PrivateMethods
private void WritePrivateFlag(PrivateFlags bit, bool value)
{
if (value)
{
_flags |= bit;
}
else
{
_flags &= ~bit;
}
}
private bool ReadPrivateFlag(PrivateFlags bit)
{
return (_flags & bit) != 0;
}
#endregion PrivateMethods
#region PrivateDataStructures
private enum PrivateFlags : byte
{
IsThemeChange = 0x01,
IsTreeChange = 0x02,
IsStyleResourceChange = 0x04,
IsTemplateResourceChange = 0x08,
IsSysColorsOrSettingsChange = 0x10,
IsCatastrophicDictionaryChange = 0x20,
}
#endregion PrivateDataStructures
#region Data
private List _oldDictionaries;
private List _newDictionaries;
private object _key;
private DependencyObject _container;
private PrivateFlags _flags;
#endregion Data
}
}
// 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
- LogEntrySerialization.cs
- FigureParagraph.cs
- XmlNodeReader.cs
- SrgsElementFactory.cs
- TextEndOfLine.cs
- TimelineCollection.cs
- Classification.cs
- Label.cs
- XmlAnyAttributeAttribute.cs
- HttpCacheVary.cs
- COM2TypeInfoProcessor.cs
- SkipStoryboardToFill.cs
- BordersPage.cs
- ReadWriteObjectLock.cs
- RegistryConfigurationProvider.cs
- SetterTriggerConditionValueConverter.cs
- MemberJoinTreeNode.cs
- SignatureHelper.cs
- _KerberosClient.cs
- CodePropertyReferenceExpression.cs
- CompareValidator.cs
- ColumnHeaderConverter.cs
- HitTestWithPointDrawingContextWalker.cs
- FontResourceCache.cs
- SoapExtensionTypeElement.cs
- _TransmitFileOverlappedAsyncResult.cs
- TextEditorContextMenu.cs
- sqlnorm.cs
- XmlSchemaAttribute.cs
- TypedReference.cs
- ThemeDirectoryCompiler.cs
- AppliesToBehaviorDecisionTable.cs
- DocumentViewerBaseAutomationPeer.cs
- DocumentManager.cs
- PackageRelationshipSelector.cs
- DataServiceConfiguration.cs
- Pen.cs
- PartManifestEntry.cs
- ByeMessageCD1.cs
- OrderedHashRepartitionEnumerator.cs
- BaseAddressElementCollection.cs
- RegisteredArrayDeclaration.cs
- XmlDataLoader.cs
- InvokeHandlers.cs
- CrossContextChannel.cs
- HttpFileCollectionBase.cs
- XmlChoiceIdentifierAttribute.cs
- FontFamily.cs
- XmlRawWriter.cs
- DesignerVerbCollection.cs
- SoapServerMessage.cs
- ColumnHeader.cs
- GCHandleCookieTable.cs
- ClockController.cs
- MembershipPasswordException.cs
- CodeIdentifiers.cs
- XmlElementAttribute.cs
- Guid.cs
- ProcessHostFactoryHelper.cs
- ReferencedAssembly.cs
- Int32CAMarshaler.cs
- ServerIdentity.cs
- CanonicalFontFamilyReference.cs
- EditorOptionAttribute.cs
- RsaKeyIdentifierClause.cs
- _SslStream.cs
- ContractCodeDomInfo.cs
- PropertyEmitterBase.cs
- SHA256Managed.cs
- Wildcard.cs
- ColorConverter.cs
- CertificateManager.cs
- DataGridViewHitTestInfo.cs
- OracleRowUpdatedEventArgs.cs
- Permission.cs
- ConnectionAcceptor.cs
- FontFaceLayoutInfo.cs
- ButtonColumn.cs
- FontStyle.cs
- DetailsView.cs
- BitmapSizeOptions.cs
- MultiAsyncResult.cs
- RuleValidation.cs
- PageCache.cs
- ASCIIEncoding.cs
- PaintEvent.cs
- OutputCacheProfileCollection.cs
- WebBaseEventKeyComparer.cs
- DataTableExtensions.cs
- HybridObjectCache.cs
- WebPartZone.cs
- ClientEventManager.cs
- XmlNodeReader.cs
- Signature.cs
- TypeReference.cs
- SwitchExpression.cs
- SelectionWordBreaker.cs
- ExpressionBinding.cs
- JournalEntryListConverter.cs
- ToolStripTextBox.cs