Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / wpf / src / Core / CSharp / System / Windows / GlobalEventManager.cs / 1305600 / GlobalEventManager.cs
using System; using System.Collections; using System.Diagnostics; using MS.Utility; using SR=MS.Internal.PresentationCore.SR; using SRID=MS.Internal.PresentationCore.SRID; namespace System.Windows { internal static class GlobalEventManager { #region Operations // Registers a RoutedEvent with the given details // NOTE: The Name must be unique within the given OwnerType internal static RoutedEvent RegisterRoutedEvent( string name, RoutingStrategy routingStrategy, Type handlerType, Type ownerType) { Debug.Assert(GetRoutedEventFromName(name, ownerType, false) == null, "RoutedEvent name must be unique within a given OwnerType"); lock (Synchronized) { // Create a new RoutedEvent // Requires GlobalLock to access _countRoutedEvents RoutedEvent routedEvent = new RoutedEvent( name, routingStrategy, handlerType, ownerType); // Increment the count for registered RoutedEvents // Requires GlobalLock to access _countRoutedEvents _countRoutedEvents++; AddOwner(routedEvent, ownerType); return routedEvent; } } // Register a Class Handler // NOTE: Handler Type must be the // same as the one specified when // registering the corresponding RoutedEvent internal static void RegisterClassHandler( Type classType, RoutedEvent routedEvent, Delegate handler, bool handledEventsToo) { Debug.Assert( typeof(UIElement).IsAssignableFrom(classType) || typeof(ContentElement).IsAssignableFrom(classType) || typeof(UIElement3D).IsAssignableFrom(classType), "Class Handlers can be registered only for UIElement/ContentElement/UIElement3D and their sub types"); Debug.Assert(routedEvent.IsLegalHandler(handler), "Handler Type mismatch"); ClassHandlersStore classListenersLists; int index; // We map the classType to a DType use DTypeMap for storage DependencyObjectType dType = DependencyObjectType.FromSystemTypeInternal(classType); // Get the updated EventHandlersStore for the given DType GetDTypedClassListeners(dType, routedEvent, out classListenersLists, out index); // Reuired to update storage lock (Synchronized) { // Add new routed event handler and get the updated set of handlers RoutedEventHandlerInfoList updatedClassListeners = classListenersLists.AddToExistingHandlers(index, handler, handledEventsToo); // Update Sub Classes ItemStructListkeys = _dTypedClassListeners.ActiveDTypes; for (int i=0; i keys = _dTypedRoutedEventList.ActiveDTypes; int destIndex = 0; for (int i=0; i dTypedRoutedEventList = (FrugalObjectList )_dTypedRoutedEventList[keys.List[i]]; for(int j = 0; j < dTypedRoutedEventList.Count; j++) { RoutedEvent routedEvent = dTypedRoutedEventList[j]; if(Array.IndexOf(routedEvents, routedEvent) < 0) { routedEvents[destIndex++] = routedEvent; } } } // Enumerate through all of the RoutedEvents in the Hashtable // Requires GlobalLock to access _ownerTypedRoutedEventList IDictionaryEnumerator htEnumerator = _ownerTypedRoutedEventList.GetEnumerator(); while(htEnumerator.MoveNext() == true) { FrugalObjectList ownerRoutedEventList = (FrugalObjectList )htEnumerator.Value; for(int j = 0; j < ownerRoutedEventList.Count; j++) { RoutedEvent routedEvent = ownerRoutedEventList[j]; if(Array.IndexOf(routedEvents, routedEvent) < 0) { routedEvents[destIndex++] = routedEvent; } } } } return routedEvents; } internal static void AddOwner(RoutedEvent routedEvent, Type ownerType) { // If the ownerType is a subclass of DependencyObject // we map it to a DType use DTypeMap for storage else // we use the more generic Hashtable. if ((ownerType == typeof(DependencyObject)) || ownerType.IsSubclassOf(typeof(DependencyObject))) { DependencyObjectType dType = DependencyObjectType.FromSystemTypeInternal(ownerType); // Get the ItemList of RoutedEvents for the given OwnerType // Requires GlobalLock to access _dTypedRoutedEventList object ownerRoutedEventListObj = _dTypedRoutedEventList[dType]; FrugalObjectList ownerRoutedEventList; if (ownerRoutedEventListObj == null) { // Create an ItemList of RoutedEvents for the // given OwnerType if one does not already exist ownerRoutedEventList = new FrugalObjectList (1); _dTypedRoutedEventList[dType] = ownerRoutedEventList; } else { ownerRoutedEventList = (FrugalObjectList )ownerRoutedEventListObj; } // Add the newly created // RoutedEvent to the ItemList // Requires GlobalLock to access ownerRoutedEventList if(!ownerRoutedEventList.Contains(routedEvent)) { ownerRoutedEventList.Add(routedEvent); } } else { // Get the ItemList of RoutedEvents for the given OwnerType // Requires GlobalLock to access _ownerTypedRoutedEventList object ownerRoutedEventListObj = _ownerTypedRoutedEventList[ownerType]; FrugalObjectList ownerRoutedEventList; if (ownerRoutedEventListObj == null) { // Create an ItemList of RoutedEvents for the // given OwnerType if one does not already exist ownerRoutedEventList = new FrugalObjectList (1); _ownerTypedRoutedEventList[ownerType] = ownerRoutedEventList; } else { ownerRoutedEventList = (FrugalObjectList )ownerRoutedEventListObj; } // Add the newly created // RoutedEvent to the ItemList // Requires GlobalLock to access ownerRoutedEventList if(!ownerRoutedEventList.Contains(routedEvent)) { ownerRoutedEventList.Add(routedEvent); } } } // Returns a RoutedEvents that match // the ownerType input param // If not found returns null internal static RoutedEvent[] GetRoutedEventsForOwner(Type ownerType) { if ((ownerType == typeof(DependencyObject)) || ownerType.IsSubclassOf(typeof(DependencyObject))) { // Search DTypeMap DependencyObjectType dType = DependencyObjectType.FromSystemTypeInternal(ownerType); // Get the ItemList of RoutedEvents for the given DType FrugalObjectList ownerRoutedEventList = (FrugalObjectList )_dTypedRoutedEventList[dType]; if (ownerRoutedEventList != null) { return ownerRoutedEventList.ToArray(); } } else // Search Hashtable { // Get the ItemList of RoutedEvents for the given OwnerType FrugalObjectList ownerRoutedEventList = (FrugalObjectList )_ownerTypedRoutedEventList[ownerType]; if (ownerRoutedEventList != null) { return ownerRoutedEventList.ToArray(); } } // No match found return null; } // Returns a RoutedEvents that match // the name and ownerType input params // If not found returns null internal static RoutedEvent GetRoutedEventFromName( string name, Type ownerType, bool includeSupers) { if ((ownerType == typeof(DependencyObject)) || ownerType.IsSubclassOf(typeof(DependencyObject))) { // Search DTypeMap DependencyObjectType dType = DependencyObjectType.FromSystemTypeInternal(ownerType); while (dType != null) { // Get the ItemList of RoutedEvents for the given DType FrugalObjectList ownerRoutedEventList = (FrugalObjectList )_dTypedRoutedEventList[dType]; if (ownerRoutedEventList != null) { // Check for RoutedEvent with matching name in the ItemList for (int i=0; i ownerRoutedEventList = (FrugalObjectList )_ownerTypedRoutedEventList[ownerType]; if (ownerRoutedEventList != null) { // Check for RoutedEvent with matching name in the ItemList for (int i=0; i = Int32.MaxValue) { throw new InvalidOperationException(SR.Get(SRID.TooManyRoutedEvents)); } index = _globalIndexToEventMap.Add(value); } return index; } // Must be called from within a lock of GlobalEventManager.Synchronized internal static object EventFromGlobalIndex(int globalIndex) { return _globalIndexToEventMap[globalIndex]; } // must be used within a lock of GlobalEventManager.Synchronized private static ArrayList _globalIndexToEventMap = new ArrayList(100); // #endregion #region Data // This is an efficient Hashtable of ItemLists keyed on DType // Each ItemList holds the registered RoutedEvents for that OwnerType private static DTypeMap _dTypedRoutedEventList = new DTypeMap(10); // Initialization sizes based on typical MSN scenario // This is a Hashtable of ItemLists keyed on OwnerType // Each ItemList holds the registered RoutedEvents for that OwnerType private static Hashtable _ownerTypedRoutedEventList = new Hashtable(10); // Initialization sizes based on typical MSN scenario // This member keeps a count of the total number of Routed Events registered so far // The member also serves as the internally used ComputedEventIndex that indexes // EventListenersListss that store class handler information for a class type private static int _countRoutedEvents = 0; // This is an efficient Hashtable of ItemLists keyed on DType // Each ItemList holds the registered RoutedEvent class handlers for that ClassType private static DTypeMap _dTypedClassListeners = new DTypeMap(100); // Initialization sizes based on typical Expression Blend startup scenario // This is the cached value for the DType of DependencyObject private static DependencyObjectType _dependencyObjectType = DependencyObjectType.FromSystemTypeInternal(typeof(DependencyObject)); internal static object Synchronized = new object(); #endregion Data } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. using System; using System.Collections; using System.Diagnostics; using MS.Utility; using SR=MS.Internal.PresentationCore.SR; using SRID=MS.Internal.PresentationCore.SRID; namespace System.Windows { internal static class GlobalEventManager { #region Operations // Registers a RoutedEvent with the given details // NOTE: The Name must be unique within the given OwnerType internal static RoutedEvent RegisterRoutedEvent( string name, RoutingStrategy routingStrategy, Type handlerType, Type ownerType) { Debug.Assert(GetRoutedEventFromName(name, ownerType, false) == null, "RoutedEvent name must be unique within a given OwnerType"); lock (Synchronized) { // Create a new RoutedEvent // Requires GlobalLock to access _countRoutedEvents RoutedEvent routedEvent = new RoutedEvent( name, routingStrategy, handlerType, ownerType); // Increment the count for registered RoutedEvents // Requires GlobalLock to access _countRoutedEvents _countRoutedEvents++; AddOwner(routedEvent, ownerType); return routedEvent; } } // Register a Class Handler // NOTE: Handler Type must be the // same as the one specified when // registering the corresponding RoutedEvent internal static void RegisterClassHandler( Type classType, RoutedEvent routedEvent, Delegate handler, bool handledEventsToo) { Debug.Assert( typeof(UIElement).IsAssignableFrom(classType) || typeof(ContentElement).IsAssignableFrom(classType) || typeof(UIElement3D).IsAssignableFrom(classType), "Class Handlers can be registered only for UIElement/ContentElement/UIElement3D and their sub types"); Debug.Assert(routedEvent.IsLegalHandler(handler), "Handler Type mismatch"); ClassHandlersStore classListenersLists; int index; // We map the classType to a DType use DTypeMap for storage DependencyObjectType dType = DependencyObjectType.FromSystemTypeInternal(classType); // Get the updated EventHandlersStore for the given DType GetDTypedClassListeners(dType, routedEvent, out classListenersLists, out index); // Reuired to update storage lock (Synchronized) { // Add new routed event handler and get the updated set of handlers RoutedEventHandlerInfoList updatedClassListeners = classListenersLists.AddToExistingHandlers(index, handler, handledEventsToo); // Update Sub Classes ItemStructList keys = _dTypedClassListeners.ActiveDTypes; for (int i=0; i keys = _dTypedRoutedEventList.ActiveDTypes; int destIndex = 0; for (int i=0; i dTypedRoutedEventList = (FrugalObjectList )_dTypedRoutedEventList[keys.List[i]]; for(int j = 0; j < dTypedRoutedEventList.Count; j++) { RoutedEvent routedEvent = dTypedRoutedEventList[j]; if(Array.IndexOf(routedEvents, routedEvent) < 0) { routedEvents[destIndex++] = routedEvent; } } } // Enumerate through all of the RoutedEvents in the Hashtable // Requires GlobalLock to access _ownerTypedRoutedEventList IDictionaryEnumerator htEnumerator = _ownerTypedRoutedEventList.GetEnumerator(); while(htEnumerator.MoveNext() == true) { FrugalObjectList ownerRoutedEventList = (FrugalObjectList )htEnumerator.Value; for(int j = 0; j < ownerRoutedEventList.Count; j++) { RoutedEvent routedEvent = ownerRoutedEventList[j]; if(Array.IndexOf(routedEvents, routedEvent) < 0) { routedEvents[destIndex++] = routedEvent; } } } } return routedEvents; } internal static void AddOwner(RoutedEvent routedEvent, Type ownerType) { // If the ownerType is a subclass of DependencyObject // we map it to a DType use DTypeMap for storage else // we use the more generic Hashtable. if ((ownerType == typeof(DependencyObject)) || ownerType.IsSubclassOf(typeof(DependencyObject))) { DependencyObjectType dType = DependencyObjectType.FromSystemTypeInternal(ownerType); // Get the ItemList of RoutedEvents for the given OwnerType // Requires GlobalLock to access _dTypedRoutedEventList object ownerRoutedEventListObj = _dTypedRoutedEventList[dType]; FrugalObjectList ownerRoutedEventList; if (ownerRoutedEventListObj == null) { // Create an ItemList of RoutedEvents for the // given OwnerType if one does not already exist ownerRoutedEventList = new FrugalObjectList (1); _dTypedRoutedEventList[dType] = ownerRoutedEventList; } else { ownerRoutedEventList = (FrugalObjectList )ownerRoutedEventListObj; } // Add the newly created // RoutedEvent to the ItemList // Requires GlobalLock to access ownerRoutedEventList if(!ownerRoutedEventList.Contains(routedEvent)) { ownerRoutedEventList.Add(routedEvent); } } else { // Get the ItemList of RoutedEvents for the given OwnerType // Requires GlobalLock to access _ownerTypedRoutedEventList object ownerRoutedEventListObj = _ownerTypedRoutedEventList[ownerType]; FrugalObjectList ownerRoutedEventList; if (ownerRoutedEventListObj == null) { // Create an ItemList of RoutedEvents for the // given OwnerType if one does not already exist ownerRoutedEventList = new FrugalObjectList (1); _ownerTypedRoutedEventList[ownerType] = ownerRoutedEventList; } else { ownerRoutedEventList = (FrugalObjectList )ownerRoutedEventListObj; } // Add the newly created // RoutedEvent to the ItemList // Requires GlobalLock to access ownerRoutedEventList if(!ownerRoutedEventList.Contains(routedEvent)) { ownerRoutedEventList.Add(routedEvent); } } } // Returns a RoutedEvents that match // the ownerType input param // If not found returns null internal static RoutedEvent[] GetRoutedEventsForOwner(Type ownerType) { if ((ownerType == typeof(DependencyObject)) || ownerType.IsSubclassOf(typeof(DependencyObject))) { // Search DTypeMap DependencyObjectType dType = DependencyObjectType.FromSystemTypeInternal(ownerType); // Get the ItemList of RoutedEvents for the given DType FrugalObjectList ownerRoutedEventList = (FrugalObjectList )_dTypedRoutedEventList[dType]; if (ownerRoutedEventList != null) { return ownerRoutedEventList.ToArray(); } } else // Search Hashtable { // Get the ItemList of RoutedEvents for the given OwnerType FrugalObjectList ownerRoutedEventList = (FrugalObjectList )_ownerTypedRoutedEventList[ownerType]; if (ownerRoutedEventList != null) { return ownerRoutedEventList.ToArray(); } } // No match found return null; } // Returns a RoutedEvents that match // the name and ownerType input params // If not found returns null internal static RoutedEvent GetRoutedEventFromName( string name, Type ownerType, bool includeSupers) { if ((ownerType == typeof(DependencyObject)) || ownerType.IsSubclassOf(typeof(DependencyObject))) { // Search DTypeMap DependencyObjectType dType = DependencyObjectType.FromSystemTypeInternal(ownerType); while (dType != null) { // Get the ItemList of RoutedEvents for the given DType FrugalObjectList ownerRoutedEventList = (FrugalObjectList )_dTypedRoutedEventList[dType]; if (ownerRoutedEventList != null) { // Check for RoutedEvent with matching name in the ItemList for (int i=0; i ownerRoutedEventList = (FrugalObjectList )_ownerTypedRoutedEventList[ownerType]; if (ownerRoutedEventList != null) { // Check for RoutedEvent with matching name in the ItemList for (int i=0; i = Int32.MaxValue) { throw new InvalidOperationException(SR.Get(SRID.TooManyRoutedEvents)); } index = _globalIndexToEventMap.Add(value); } return index; } // Must be called from within a lock of GlobalEventManager.Synchronized internal static object EventFromGlobalIndex(int globalIndex) { return _globalIndexToEventMap[globalIndex]; } // must be used within a lock of GlobalEventManager.Synchronized private static ArrayList _globalIndexToEventMap = new ArrayList(100); // #endregion #region Data // This is an efficient Hashtable of ItemLists keyed on DType // Each ItemList holds the registered RoutedEvents for that OwnerType private static DTypeMap _dTypedRoutedEventList = new DTypeMap(10); // Initialization sizes based on typical MSN scenario // This is a Hashtable of ItemLists keyed on OwnerType // Each ItemList holds the registered RoutedEvents for that OwnerType private static Hashtable _ownerTypedRoutedEventList = new Hashtable(10); // Initialization sizes based on typical MSN scenario // This member keeps a count of the total number of Routed Events registered so far // The member also serves as the internally used ComputedEventIndex that indexes // EventListenersListss that store class handler information for a class type private static int _countRoutedEvents = 0; // This is an efficient Hashtable of ItemLists keyed on DType // Each ItemList holds the registered RoutedEvent class handlers for that ClassType private static DTypeMap _dTypedClassListeners = new DTypeMap(100); // Initialization sizes based on typical Expression Blend startup scenario // This is the cached value for the DType of DependencyObject private static DependencyObjectType _dependencyObjectType = DependencyObjectType.FromSystemTypeInternal(typeof(DependencyObject)); internal static object Synchronized = new object(); #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
- SettingsSavedEventArgs.cs
- ETagAttribute.cs
- ControlOperationInvoker.cs
- PageCodeDomTreeGenerator.cs
- ToolStripContainer.cs
- ContainerParaClient.cs
- WebPartsSection.cs
- MetadataSection.cs
- WorkflowTimerService.cs
- DeploymentSectionCache.cs
- CqlParserHelpers.cs
- TextTreeRootNode.cs
- SourceFileInfo.cs
- RenderCapability.cs
- SafeNativeMethodsMilCoreApi.cs
- HwndSourceKeyboardInputSite.cs
- MailHeaderInfo.cs
- SqlBulkCopyColumnMapping.cs
- ListViewItemEventArgs.cs
- EastAsianLunisolarCalendar.cs
- PseudoWebRequest.cs
- RepeaterCommandEventArgs.cs
- EditCommandColumn.cs
- CollectionDataContractAttribute.cs
- EventSinkHelperWriter.cs
- XslAst.cs
- IgnoreSection.cs
- errorpatternmatcher.cs
- EntityDataSourceChangedEventArgs.cs
- TableLayoutStyleCollection.cs
- HyperlinkAutomationPeer.cs
- WorkflowViewManager.cs
- ObjectReferenceStack.cs
- RecognizerInfo.cs
- ErrorTableItemStyle.cs
- URIFormatException.cs
- AuthenticationManager.cs
- Slider.cs
- _SafeNetHandles.cs
- StateRuntime.cs
- ViewManager.cs
- RenderDataDrawingContext.cs
- DataListItemEventArgs.cs
- NumberSubstitution.cs
- MultiByteCodec.cs
- InternalConfigSettingsFactory.cs
- DataServiceProcessingPipeline.cs
- SoapObjectWriter.cs
- HttpResponse.cs
- ModelFactory.cs
- WpfSharedXamlSchemaContext.cs
- CheckBox.cs
- GridViewRow.cs
- ExpandSegment.cs
- Psha1DerivedKeyGenerator.cs
- DataGridViewColumnDividerDoubleClickEventArgs.cs
- TheQuery.cs
- SecureUICommand.cs
- DynamicValidatorEventArgs.cs
- HtmlInputFile.cs
- PolyLineSegment.cs
- BounceEase.cs
- ExceptionHelpers.cs
- StorageEntityContainerMapping.cs
- ObjectSet.cs
- ObjectAnimationBase.cs
- TextBoxView.cs
- RegionIterator.cs
- SqlBooleanizer.cs
- GPStream.cs
- IdentityReference.cs
- ListViewDesigner.cs
- DrawingContextDrawingContextWalker.cs
- DoubleAnimationClockResource.cs
- TransportConfigurationTypeElement.cs
- SerialStream.cs
- TableColumnCollectionInternal.cs
- ReliabilityContractAttribute.cs
- EntityProviderServices.cs
- RootDesignerSerializerAttribute.cs
- CodeNamespaceCollection.cs
- ProxyAttribute.cs
- WindowsEditBox.cs
- Scene3D.cs
- MemoryRecordBuffer.cs
- Directory.cs
- ReservationNotFoundException.cs
- GroupStyle.cs
- SmtpNetworkElement.cs
- SingleAnimationBase.cs
- CacheEntry.cs
- DataGridTableStyleMappingNameEditor.cs
- ActiveXSite.cs
- SchemaObjectWriter.cs
- DefaultValueTypeConverter.cs
- Page.cs
- InkPresenterAutomationPeer.cs
- RightNameExpirationInfoPair.cs
- UnionExpr.cs
- EdmTypeAttribute.cs