Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / wpf / src / Core / CSharp / MS / Internal / SynchronizedInputHelper.cs / 1305600 / SynchronizedInputHelper.cs
using System.Diagnostics; using System.Windows; using System.Windows.Media; using System.Windows.Media.Media3D; using System.Windows.Input; using System.Windows.Automation; using System.Windows.Automation.Peers; using MS.Internal.PresentationCore; namespace MS.Internal { internal static class SynchronizedInputHelper { internal static DependencyObject GetUIParentCore(DependencyObject o) { UIElement e = o as UIElement; if (e != null) { return e.GetUIParentCore(); } else { ContentElement ce = o as ContentElement; if (ce != null) { return ce.GetUIParentCore(); } else { UIElement3D e3D = o as UIElement3D; if (e3D != null) { return e3D.GetUIParentCore(); } } return null; } } // Check whether this element is listening for input. internal static bool IsListening(DependencyObject o, RoutedEventArgs args) { if ((InputManager.ListeningElement == o) && (args.RoutedEvent == InputManager.SynchronizedInputEvent)) { return true; } else { return false; } } // Add a preopportunity handler for the logical parent incase of templated element. internal static void AddParentPreOpportunityHandler(DependencyObject o, EventRoute route, RoutedEventArgs args) { // If the logical parent is different from visual parent then add handler on behalf of the // parent into the route. This is to cover the templated elements, where event could be // handled by one of the child visual element but we should consider it as if event is handled by // parent element ( logical parent). DependencyObject visualParent = null; if(o is Visual || o is Visual3D) { visualParent = UIElementHelper.GetUIParent(o); } DependencyObject logicalParent = SynchronizedInputHelper.GetUIParentCore(o); if (logicalParent != null && logicalParent != visualParent) { UIElement e = logicalParent as UIElement; if (e != null) { e.AddSynchronizedInputPreOpportunityHandler(route, args); } else { ContentElement ce = logicalParent as ContentElement; if (ce != null) { ce.AddSynchronizedInputPreOpportunityHandler(route, args); } else { UIElement3D e3D = logicalParent as UIElement3D; if (e3D != null) { e3D.AddSynchronizedInputPreOpportunityHandler(route, args); } } } } } // If the routed event type matches one the element listening on then add handler to the event route. internal static void AddHandlerToRoute(DependencyObject o, EventRoute route, RoutedEventHandler eventHandler, bool handledToo) { // Add a synchronized input handler to the route. route.Add(o, eventHandler, handledToo); } // If this handler is invoked then it indicates the element had the opportunity to handle event. internal static void PreOpportunityHandler(object sender, RoutedEventArgs args) { KeyboardEventArgs kArgs = args as KeyboardEventArgs; // if it's the keyboard event then we have 1:1 mapping between handlers & events, // so no remapping required. if (kArgs != null) { InputManager.SynchronizedInputState = SynchronizedInputStates.HadOpportunity; } else { // If this is an mouse event then we have handlers only for generic MouseDown & MouseUp events, // so we need additional logic here to decide between Mouse left and right button events. MouseButtonEventArgs mbArgs = args as MouseButtonEventArgs; if (mbArgs != null) { Debug.Assert(mbArgs != null); switch (mbArgs.ChangedButton) { case MouseButton.Left: if (InputManager.SynchronizeInputType == SynchronizedInputType.MouseLeftButtonDown || InputManager.SynchronizeInputType == SynchronizedInputType.MouseLeftButtonUp) { InputManager.SynchronizedInputState = SynchronizedInputStates.HadOpportunity; } break; case MouseButton.Right: if (InputManager.SynchronizeInputType == SynchronizedInputType.MouseRightButtonDown || InputManager.SynchronizeInputType == SynchronizedInputType.MouseRightButtonUp) { InputManager.SynchronizedInputState = SynchronizedInputStates.HadOpportunity; } break; default: break; } } } } // This handler will be called after all class and instance handlers are called, here we // decide whether the event is handled by this element or some other element. internal static void PostOpportunityHandler(object sender, RoutedEventArgs args) { KeyboardEventArgs kArgs = args as KeyboardEventArgs; // if it's the keyboard event then we have 1:1 mapping between handlers & events, // so no remapping required. if (kArgs != null) { InputManager.SynchronizedInputState = SynchronizedInputStates.Handled; } else { // If this is an mouse event then we have handlers only for generic MouseDown & MouseUp events, // so we need additional logic here to decide between Mouse left and right button events. MouseButtonEventArgs mbArgs = args as MouseButtonEventArgs; Debug.Assert(mbArgs != null); if (mbArgs != null) { switch (mbArgs.ChangedButton) { case MouseButton.Left: if (InputManager.SynchronizeInputType == SynchronizedInputType.MouseLeftButtonDown || InputManager.SynchronizeInputType == SynchronizedInputType.MouseLeftButtonUp) { InputManager.SynchronizedInputState = SynchronizedInputStates.Handled; } break; case MouseButton.Right: if (InputManager.SynchronizeInputType == SynchronizedInputType.MouseRightButtonDown || InputManager.SynchronizeInputType == SynchronizedInputType.MouseRightButtonUp) { InputManager.SynchronizedInputState = SynchronizedInputStates.Handled; } break; default: break; } } } } // Map a Synchronized input type received from automation client to routed event internal static RoutedEvent MapInputTypeToRoutedEvent(SynchronizedInputType inputType) { RoutedEvent e = null; switch (inputType) { case SynchronizedInputType.KeyUp: e = Keyboard.KeyUpEvent; break; case SynchronizedInputType.KeyDown: e = Keyboard.KeyDownEvent; break; case SynchronizedInputType.MouseLeftButtonDown: case SynchronizedInputType.MouseRightButtonDown: e = Mouse.MouseDownEvent; break; case SynchronizedInputType.MouseLeftButtonUp: case SynchronizedInputType.MouseRightButtonUp: e = Mouse.MouseUpEvent; break; default: Debug.Assert(false); e = null; break; } return e; } internal static void RaiseAutomationEvents() { if (InputElement.IsUIElement(InputManager.ListeningElement)) { UIElement e = (UIElement)InputManager.ListeningElement; //Raise InputDiscarded automation event SynchronizedInputHelper.RaiseAutomationEvent(e.GetAutomationPeer()); } else if (InputElement.IsContentElement(InputManager.ListeningElement)) { ContentElement ce = (ContentElement)InputManager.ListeningElement; //Raise InputDiscarded automation event SynchronizedInputHelper.RaiseAutomationEvent(ce.GetAutomationPeer()); } else if (InputElement.IsUIElement3D(InputManager.ListeningElement)) { UIElement3D e3D = (UIElement3D)InputManager.ListeningElement; //Raise InputDiscarded automation event SynchronizedInputHelper.RaiseAutomationEvent(e3D.GetAutomationPeer()); } } // Raise synchronized input automation events here. internal static void RaiseAutomationEvent(AutomationPeer peer) { if (peer != null) { switch (InputManager.SynchronizedInputState) { case SynchronizedInputStates.Handled: peer.RaiseAutomationEvent(AutomationEvents.InputReachedTarget); break; case SynchronizedInputStates.Discarded: peer.RaiseAutomationEvent(AutomationEvents.InputDiscarded); break; default: peer.RaiseAutomationEvent(AutomationEvents.InputReachedOtherElement); break; } } } // Checks whether listening element is in event route internal static bool IsElementInEventRoute(DependencyObject listeningElement, DependencyObject source) { DependencyObject d = source; while (d != null) { //listening element found in event route if (d == listeningElement) { return true; } UIElement e = d as UIElement; if (e != null) { d = e.GetUIParent(); } else { ContentElement ce = d as ContentElement; if (ce != null) { d = ce.GetUIParent(); } else { UIElement3D e3D = d as UIElement3D; if (e3D != null) { d = e3D.GetUIParent(false); } else { d = null; } } } } return false; } } internal enum SynchronizedInputStates { NoOpportunity = 0x01, HadOpportunity = 0x02, Handled = 0x04, Discarded = 0x08 }; } // 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
- QueryConverter.cs
- CodeComment.cs
- ExpressionEditorSheet.cs
- TrimSurroundingWhitespaceAttribute.cs
- ThousandthOfEmRealPoints.cs
- DataObjectPastingEventArgs.cs
- IISMapPath.cs
- TaskExceptionHolder.cs
- HttpProfileBase.cs
- ObjectParameterCollection.cs
- BindStream.cs
- WaitForChangedResult.cs
- ToolBar.cs
- ExpressionCopier.cs
- HttpBrowserCapabilitiesWrapper.cs
- RoutedUICommand.cs
- Attachment.cs
- InvokeMethodActivity.cs
- mediapermission.cs
- EdmMember.cs
- OdbcException.cs
- SQLString.cs
- HierarchicalDataBoundControlAdapter.cs
- WsdlInspector.cs
- TransactionScope.cs
- PropertyGridEditorPart.cs
- FigureHelper.cs
- WorkflowViewStateService.cs
- BaseValidator.cs
- SequenceNumber.cs
- CookielessHelper.cs
- ControlEvent.cs
- XPathNodeIterator.cs
- OutputChannelBinder.cs
- Converter.cs
- StylusLogic.cs
- SyntaxCheck.cs
- MaskedTextBoxDesigner.cs
- GridViewColumn.cs
- HttpCookie.cs
- UICuesEvent.cs
- TheQuery.cs
- OutputCacheSettings.cs
- Pair.cs
- PasswordBox.cs
- HuffmanTree.cs
- SR.cs
- SerialPort.cs
- CompositeDuplexBindingElementImporter.cs
- SqlMethodTransformer.cs
- AcceptorSessionSymmetricTransportSecurityProtocol.cs
- AnnotationAuthorChangedEventArgs.cs
- LayoutSettings.cs
- CommunicationObject.cs
- DbConnectionPoolGroupProviderInfo.cs
- UniqueTransportManagerRegistration.cs
- MetadataArtifactLoaderCompositeResource.cs
- CachedTypeface.cs
- AuthorizationContext.cs
- D3DImage.cs
- XmlParserContext.cs
- BackgroundWorker.cs
- EmulateRecognizeCompletedEventArgs.cs
- sqlpipe.cs
- StandardBindingReliableSessionElement.cs
- TranslateTransform3D.cs
- MailAddressCollection.cs
- FontNameEditor.cs
- BrowserCapabilitiesCodeGenerator.cs
- CaseDesigner.xaml.cs
- ThreadStartException.cs
- TextBoxBase.cs
- SelectionRange.cs
- MembershipUser.cs
- CommandConverter.cs
- ClockGroup.cs
- SendingRequestEventArgs.cs
- ContainerTracking.cs
- XmlDigitalSignatureProcessor.cs
- Rss20ItemFormatter.cs
- PropertyGridEditorPart.cs
- SerializationInfoEnumerator.cs
- MessagePropertyAttribute.cs
- IProvider.cs
- TransportBindingElement.cs
- GraphicsContext.cs
- TreeNodeBinding.cs
- ContainerControl.cs
- XmlSchemaCompilationSettings.cs
- AudioException.cs
- ObjectListComponentEditor.cs
- AxisAngleRotation3D.cs
- Trace.cs
- TearOffProxy.cs
- MethodCallConverter.cs
- ResolveInfo.cs
- SortedList.cs
- HttpHostedTransportConfiguration.cs
- DataGridViewCellFormattingEventArgs.cs
- AnnotationAuthorChangedEventArgs.cs