Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / Orcas / SP / 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
- OnOperation.cs
- RelatedImageListAttribute.cs
- IpcServerChannel.cs
- WebPartConnectionsConnectVerb.cs
- SpecularMaterial.cs
- CustomPopupPlacement.cs
- BreakRecordTable.cs
- DateTimeUtil.cs
- ToolboxCategoryItems.cs
- WindowsTokenRoleProvider.cs
- PostBackTrigger.cs
- WinFormsUtils.cs
- UnsafeNativeMethods.cs
- DbDataReader.cs
- ModelTreeEnumerator.cs
- SiteMapNodeItemEventArgs.cs
- OdbcConnectionString.cs
- UrlAuthorizationModule.cs
- SelectionUIService.cs
- MemoryMappedView.cs
- NonBatchDirectoryCompiler.cs
- FixedTextContainer.cs
- ScriptManagerProxy.cs
- HttpClientCertificate.cs
- ScrollProperties.cs
- Keyboard.cs
- AppDomain.cs
- DynamicRendererThreadManager.cs
- AxHost.cs
- ISO2022Encoding.cs
- DrawingGroupDrawingContext.cs
- TypeSemantics.cs
- RootBrowserWindowProxy.cs
- ContactManager.cs
- WorkflowOwnerAsyncResult.cs
- HttpModuleActionCollection.cs
- ConcurrentDictionary.cs
- Win32SafeHandles.cs
- UpdatePanelControlTrigger.cs
- filewebresponse.cs
- TextEncodedRawTextWriter.cs
- XmlNode.cs
- TemplateBindingExpression.cs
- ThreadStaticAttribute.cs
- XsltSettings.cs
- InternalControlCollection.cs
- ThaiBuddhistCalendar.cs
- ColumnTypeConverter.cs
- ItemContainerGenerator.cs
- CmsInterop.cs
- SafeTimerHandle.cs
- ConfigurationStrings.cs
- StrongTypingException.cs
- WebDisplayNameAttribute.cs
- IOException.cs
- ComponentEditorPage.cs
- ToolStripSeparator.cs
- StateMachine.cs
- TopClause.cs
- ListenerChannelContext.cs
- GreenMethods.cs
- AccessViolationException.cs
- TreeNodeSelectionProcessor.cs
- contentDescriptor.cs
- HtmlForm.cs
- Clause.cs
- CommonObjectSecurity.cs
- Sorting.cs
- PageCopyCount.cs
- XsdBuildProvider.cs
- ArrayList.cs
- CollectionViewProxy.cs
- XmlRootAttribute.cs
- linebase.cs
- ResourceDescriptionAttribute.cs
- ClientUIRequest.cs
- CursorInteropHelper.cs
- KeyValueInternalCollection.cs
- ByteAnimationBase.cs
- AuthenticationSection.cs
- XPathSingletonIterator.cs
- CompressionTransform.cs
- WebPartDisplayMode.cs
- HostedHttpTransportManager.cs
- SimpleWebHandlerParser.cs
- wgx_render.cs
- FragmentNavigationEventArgs.cs
- RequestCachePolicy.cs
- WebPartRestoreVerb.cs
- HeaderedContentControl.cs
- RegionInfo.cs
- ReaderWriterLockWrapper.cs
- ListBase.cs
- EdmError.cs
- DataFormat.cs
- SmtpNtlmAuthenticationModule.cs
- TextEditorThreadLocalStore.cs
- NamedPipeChannelListener.cs
- FormsAuthenticationTicket.cs
- Timeline.cs