Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / wpf / src / Core / CSharp / MS / Internal / Automation / EventPropertyMap.cs / 1 / 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.
//----------------------------------------------------------------------------
//
//
// 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
- RIPEMD160.cs
- CustomPopupPlacement.cs
- ProxyHelper.cs
- ApplicationDirectory.cs
- DictionaryTraceRecord.cs
- Confirm.cs
- ListViewTableRow.cs
- Wrapper.cs
- MatrixTransform.cs
- VBIdentifierName.cs
- StackBuilderSink.cs
- TimeStampChecker.cs
- FunctionDetailsReader.cs
- DataTrigger.cs
- SqlCommandBuilder.cs
- TransformValueSerializer.cs
- OleDbWrapper.cs
- KerberosRequestorSecurityToken.cs
- GridEntryCollection.cs
- AutomationIdentifierGuids.cs
- Membership.cs
- SafeEventLogReadHandle.cs
- NameNode.cs
- DataFieldCollectionEditor.cs
- Renderer.cs
- ParamArrayAttribute.cs
- PeerPresenceInfo.cs
- ThrowHelper.cs
- Substitution.cs
- ImageAttributes.cs
- QueryCursorEventArgs.cs
- ImportCatalogPart.cs
- Paragraph.cs
- StylusDownEventArgs.cs
- Empty.cs
- TypeBuilderInstantiation.cs
- BinarySerializer.cs
- CaseInsensitiveHashCodeProvider.cs
- IIS7UserPrincipal.cs
- DataGridDetailsPresenter.cs
- MenuItemCollectionEditor.cs
- SystemInformation.cs
- SspiSecurityTokenProvider.cs
- SocketElement.cs
- PeerTransportListenAddressValidator.cs
- SqlClientMetaDataCollectionNames.cs
- GradientStop.cs
- Journal.cs
- DesignerMetadata.cs
- InstanceCreationEditor.cs
- CollectionDataContractAttribute.cs
- WorkflowService.cs
- FormClosedEvent.cs
- TreeNode.cs
- XmlSequenceWriter.cs
- AsymmetricKeyExchangeFormatter.cs
- DataBindingsDialog.cs
- BatchServiceHost.cs
- PeerNearMe.cs
- EnumType.cs
- SequentialOutput.cs
- DelegatingTypeDescriptionProvider.cs
- NonClientArea.cs
- DoubleIndependentAnimationStorage.cs
- RangeValuePattern.cs
- RemotingConfiguration.cs
- SignatureHelper.cs
- ChoiceConverter.cs
- ScrollableControl.cs
- CommandBinding.cs
- BuildProvidersCompiler.cs
- NamedPermissionSet.cs
- ProgramNode.cs
- XmlParserContext.cs
- OdbcRowUpdatingEvent.cs
- COM2IDispatchConverter.cs
- FileRegion.cs
- UrlMappingCollection.cs
- DBCSCodePageEncoding.cs
- PolyBezierSegment.cs
- MetadataPropertyAttribute.cs
- BaseValidator.cs
- SizeKeyFrameCollection.cs
- MediaElement.cs
- LexicalChunk.cs
- ExpressionBuilderContext.cs
- WebEventCodes.cs
- CodeTypeDelegate.cs
- PageRanges.cs
- TextDecoration.cs
- PageWrapper.cs
- DataSourceXmlSubItemAttribute.cs
- RouteValueExpressionBuilder.cs
- SafeRightsManagementHandle.cs
- ModifyActivitiesPropertyDescriptor.cs
- FormattedTextSymbols.cs
- OdbcErrorCollection.cs
- formatter.cs
- InfiniteTimeSpanConverter.cs
- ObjectTokenCategory.cs