Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / wpf / src / Core / CSharp / MS / Internal / Automation / EventPropertyMap.cs / 1305600 / EventPropertyMap.cs
//----------------------------------------------------------------------------
//
//
// Copyright (C) Microsoft Corporation. All rights reserved.
//
//
//
// Description:
// Accessibility event map classes are used to determine if, and how many
// listeners there are for events and property changes.
//
// History:
// 07/23/2003 : BrendanM Ported to WCP
//
//---------------------------------------------------------------------------
using System;
using System.Collections;
using System.Windows;
using System.Diagnostics;
namespace MS.Internal.Automation
{
// Manages the property map that is used to determine if there are
// Automation clients interested in properties.
internal class EventPropertyMap
{
//-----------------------------------------------------
//
// Constructors
//
//-----------------------------------------------------
#region Constructors
// static class, private ctor to prevent creation
private EventPropertyMap()
{
}
#endregion Constructors
//------------------------------------------------------
//
// Internal Methods
//
//-----------------------------------------------------
#region Internal Methods
// Called during queueing of property change events to check if there are any
// listeners that are interested in this property. Returns true if there are
// else false. This function could be called frequently; it must be fast.
internal static bool IsInterestingDP(DependencyProperty dp)
{
using (_propertyLock.ReadLock)
{
if (_propertyTable != null && _propertyTable.ContainsKey(dp))
{
return true;
}
}
return false;
}
// Updates the list of DynamicProperties that are currently being listened to.
// Called by AccEvent class when certain events are added.
//
// Returns: true if the event property map was created during this call and
// false if the property map was not created during this call.
internal static bool AddPropertyNotify(DependencyProperty [] properties)
{
if (properties == null)
return false;
bool createdMap = false;
using (_propertyLock.WriteLock)
{
// If it doesn't exist, create the property map (key=dp value=listener count)
if (_propertyTable == null)
{
// Up to 20 properties before resize and
// small load factor optimizes for speed
_propertyTable = new Hashtable(20, .1f);
createdMap = true;
}
int cDPStart = _propertyTable.Count;
// properties is an array of the properties one listener is interested in
foreach (DependencyProperty dp in properties)
{
if (dp == null)
continue;
int cDP = 0;
// If the property is in the table, increment it's count
if (_propertyTable.ContainsKey(dp))
{
cDP = (int)_propertyTable[dp];
}
cDP++;
_propertyTable[dp] = cDP;
}
}
return createdMap;
}
// Updates the list of DynamicProperties that are currently being listened to.
// Called by AccEvent class when removing certain events.
// Returns: true if the property table is empty after this operation.
internal static bool RemovePropertyNotify(DependencyProperty [] properties)
{
Debug.Assert(properties != null);
bool isEmpty = false;
using (_propertyLock.WriteLock)
{
if (_propertyTable != null)
{
int cDPStart = _propertyTable.Count;
// properties is an array of the properties one listener is no longer interested in
foreach (DependencyProperty dp in properties)
{
if (_propertyTable.ContainsKey(dp))
{
int cDP = (int)_propertyTable[dp];
// Update or remove the entry based on remaining listeners
cDP--;
if (cDP > 0)
{
_propertyTable[dp] = cDP;
}
else
{
_propertyTable.Remove(dp);
}
}
}
// If there are no more properties in the map then delete it; the idea is if there
// are no listeners, don't make the property system do extra work.
if (_propertyTable.Count == 0)
{
_propertyTable = null;
}
}
isEmpty = (_propertyTable == null);
}
return isEmpty;
}
#endregion Internal Methods
//------------------------------------------------------
//
// Private Fields
//
//------------------------------------------------------
#region Private Fields
// static class, no instance data...
private static ReaderWriterLockWrapper _propertyLock = new ReaderWriterLockWrapper();
private static Hashtable _propertyTable; // key=DP, data=listener count
#endregion Private Fields
}
}
// 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
- RelationshipManager.cs
- NamespaceEmitter.cs
- WebPartUserCapability.cs
- IgnoreSectionHandler.cs
- PermissionSetTriple.cs
- LogManagementAsyncResult.cs
- RuleSettings.cs
- NamedPipeProcessProtocolHandler.cs
- BuildProviderAppliesToAttribute.cs
- EpmContentDeSerializer.cs
- XhtmlMobileTextWriter.cs
- UrlMappingCollection.cs
- ExpressionConverter.cs
- Vector3DIndependentAnimationStorage.cs
- QilChoice.cs
- PlatformNotSupportedException.cs
- XmlSignatureManifest.cs
- XD.cs
- ModelServiceImpl.cs
- DecimalStorage.cs
- SharedUtils.cs
- UserControlParser.cs
- ConfigurationSettings.cs
- DependentList.cs
- DesignerTransactionCloseEvent.cs
- MSAAWinEventWrap.cs
- XpsFilter.cs
- HtmlShim.cs
- RegistryExceptionHelper.cs
- AddInSegmentDirectoryNotFoundException.cs
- PointCollectionConverter.cs
- SqlConnection.cs
- CodeTypeReferenceCollection.cs
- ErrorTableItemStyle.cs
- Wizard.cs
- HttpRequest.cs
- Int32Animation.cs
- XsltLoader.cs
- Soap12ProtocolReflector.cs
- TablePattern.cs
- HuffModule.cs
- LambdaExpression.cs
- Configuration.cs
- CachingHintValidation.cs
- ScopedMessagePartSpecification.cs
- XmlWellformedWriter.cs
- WebZoneDesigner.cs
- WebPartCancelEventArgs.cs
- IntSecurity.cs
- ExpressionBinding.cs
- RequestCachingSection.cs
- IsolatedStoragePermission.cs
- ReferenceEqualityComparer.cs
- DrawingContextWalker.cs
- StringFunctions.cs
- BitmapEffectInputData.cs
- DataGridViewCellValidatingEventArgs.cs
- ZipFileInfo.cs
- InstancePersistenceEvent.cs
- ProtocolsConfiguration.cs
- followingquery.cs
- MarshalByRefObject.cs
- JsonUriDataContract.cs
- BinaryReader.cs
- HMAC.cs
- InvalidAsynchronousStateException.cs
- configsystem.cs
- CheckBoxFlatAdapter.cs
- PropertyTab.cs
- TraceContext.cs
- ExpandSegment.cs
- BamlBinaryWriter.cs
- TextEditorCharacters.cs
- AccessDataSource.cs
- XmlAggregates.cs
- InstancePersistenceContext.cs
- BindingCollection.cs
- PageSetupDialog.cs
- ToolStripTextBox.cs
- SaveFileDialog.cs
- AdRotatorDesigner.cs
- MemberExpressionHelper.cs
- XPathMessageFilterElement.cs
- AssemblyHash.cs
- PathFigureCollection.cs
- ObjectListCommandEventArgs.cs
- CryptoStream.cs
- HtmlToClrEventProxy.cs
- DoubleAnimationClockResource.cs
- Memoizer.cs
- UniformGrid.cs
- PropertyPath.cs
- FileLoadException.cs
- TypeListConverter.cs
- ObservableCollectionDefaultValueFactory.cs
- DBBindings.cs
- UpdateDelegates.Generated.cs
- StringWriter.cs
- CommonXSendMessage.cs
- ListViewSortEventArgs.cs