Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / wpf / src / Core / CSharp / MS / Internal / Automation / ElementProxy.cs / 1 / ElementProxy.cs
//----------------------------------------------------------------------------
//
//
// Copyright (C) Microsoft Corporation. All rights reserved.
//
//
//
// Description: UIAutomation/Visual bridge
//
// History:
// 07/15/2003 : BrendanM Ported to WCP
//
//---------------------------------------------------------------------------
using System;
using System.Collections;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Automation;
using System.Windows.Automation.Provider;
using System.Windows.Automation.Peers;
using System.Diagnostics;
using System.Windows.Input;
using System.Windows.Interop;
using System.Windows.Media;
using System.Windows.Threading;
using System.Security;
using System.Security.Permissions;
using MS.Internal.PresentationCore;
using MS.Win32;
using SR=MS.Internal.PresentationCore.SR;
using SRID=MS.Internal.PresentationCore.SRID;
namespace MS.Internal.Automation
{
// Automation Proxy for WCP elements - exposes WCP tree
// and properties to Automation.
//
// Currently builds tree based on Visual tree; many later incorporate
// parts of logical tree.
//
// Currently exposes just BoundingRectangle, ClassName, IsEnabled
// and IsKeyboardFocused properties.
internal class ElementProxy: IRawElementProviderFragmentRoot, IRawElementProviderAdviseEvents
{
//-----------------------------------------------------
//
// Constructors
//
//-----------------------------------------------------
#region Constructors
// private ctor - the Wrap() pseudo-ctor is used instead.
private ElementProxy(AutomationPeer peer)
{
_peer = peer;
}
#endregion Constructors
//------------------------------------------------------
//
// Interface IRawElementProviderFragmentRoot
//
//------------ ------------------------------------------
#region Interface IRawElementProviderFragmentRoot
// Implementation of the interface that exposes this
// to UIAutomation.
//
// Interface IRawElementProviderFragmentRoot 'derives' from
// IRawElementProviderSimple and IRawElementProviderFragment,
// methods from those appear first below.
//
// Most of the interface methods on this interface need
// to get onto the Visual's context before they can access it,
// so use Dispatcher.Invoke to call a private method (in the
// private methods section of this class) that does the real work.
// IRawElementProviderSimple methods...
public object GetPatternProvider ( int pattern )
{
return ElementUtil.Invoke( _peer, new DispatcherOperationCallback( InContextGetPatternProvider ), pattern);
}
public object GetPropertyValue(int property)
{
return ElementUtil.Invoke(_peer, new DispatcherOperationCallback( InContextGetPropertyValue ), property);
}
public ProviderOptions ProviderOptions
{
get { return (ProviderOptions)ElementUtil.Invoke(_peer, new DispatcherOperationCallback( InContextGetProviderOptions ), null); }
}
public IRawElementProviderSimple HostRawElementProvider
{
get
{
IRawElementProviderSimple host = null;
HostedWindowWrapper hwndWrapper = null;
hwndWrapper = (HostedWindowWrapper)ElementUtil.Invoke(
_peer,
new DispatcherOperationCallback(InContextGetHostRawElementProvider),
null);
if(hwndWrapper != null)
host = GetHostHelper(hwndWrapper);
return host;
}
}
///
/// Critical - Calls critical HostedWindowWrapper.Handle.
/// TreatAsSafe - Critical data is used internally and not explosed
///
[SecurityCritical, SecurityTreatAsSafe]
private IRawElementProviderSimple GetHostHelper(HostedWindowWrapper hwndWrapper)
{
return AutomationInteropProvider.HostProviderFromHandle(hwndWrapper.Handle);
}
// IRawElementProviderFragment methods...
public IRawElementProviderFragment Navigate( NavigateDirection direction )
{
return (IRawElementProviderFragment)ElementUtil.Invoke(_peer, new DispatcherOperationCallback(InContextNavigate), direction);
}
public int [ ] GetRuntimeId()
{
return (int []) ElementUtil.Invoke( _peer, new DispatcherOperationCallback( InContextGetRuntimeId ), null );
}
public Rect BoundingRectangle
{
get { return (Rect)ElementUtil.Invoke(_peer, new DispatcherOperationCallback(InContextBoundingRectangle), null); }
}
public IRawElementProviderSimple [] GetEmbeddedFragmentRoots()
{
return null;
}
public void SetFocus()
{
ElementUtil.Invoke(_peer, new DispatcherOperationCallback( InContextSetFocus ), null);
}
public IRawElementProviderFragmentRoot FragmentRoot
{
get { return (IRawElementProviderFragmentRoot) ElementUtil.Invoke( _peer, new DispatcherOperationCallback( InContextFragmentRoot ), null ); }
}
// IRawElementProviderFragmentRoot methods..
public IRawElementProviderFragment ElementProviderFromPoint( double x, double y )
{
return (IRawElementProviderFragment) ElementUtil.Invoke( _peer, new DispatcherOperationCallback( InContextElementProviderFromPoint ), new Point( x, y ) );
}
public IRawElementProviderFragment GetFocus()
{
return (IRawElementProviderFragment) ElementUtil.Invoke( _peer, new DispatcherOperationCallback( InContextGetFocus ), null );
}
// Event support...
public void AdviseEventAdded(int eventID, int[] properties)
{
ElementUtil.Invoke( _peer, new DispatcherOperationCallback( InContextAdviseEventAdded ), new object [] { eventID, properties } );
}
public void AdviseEventRemoved(int eventID, int[] properties)
{
ElementUtil.Invoke( _peer, new DispatcherOperationCallback( InContextAdviseEventRemoved ), new object [] { eventID, properties } );
}
#endregion Interface IRawElementProviderFragmentRoot
//-----------------------------------------------------
//
// Internal Methods
//
//------------------------------------------------------
#region Internal Methods
// Wrap the found peer before shipping it over process boundary.
private ElementProxy Wrap(AutomationPeer peer)
{
//_peer is well-connected, since UIA is asking us using it,
//so it's ok to pass it as the referencePeer to StaticWrap
return StaticWrap(peer, _peer);
}
// Wrap the found peer before shipping it over process boundary - static version for use outside ElementProxy.
internal static ElementProxy StaticWrap(AutomationPeer peer, AutomationPeer referencePeer)
{
ElementProxy result = null;
if (peer != null)
{
//referencePeer is well-connected, since UIA is asking us using it.
//However we are trying to return the peer that is possibly just created on some
//element in the middle of un-walked tree and we need to make sure it is fully
//"connected" or initialized before we return it to UIA.
//This method ensures it has the right _parent and other hookup.
peer = peer.ValidateConnected(referencePeer);
if (peer != null)
{
result = new ElementProxy(peer);
}
}
return result;
}
// Needed to enable access from AutomationPeer.PeerFromProvider
internal AutomationPeer Peer
{
get { return _peer; }
}
#endregion Internal Methods
//------------------------------------------------------
//
// Private Methods
//
//-----------------------------------------------------
#region Private Methods
// The signature of most of the folling methods is "object func( object arg )",
// since that's what the Conmtext.Invoke delegate requires.
// Return the element at specified coords.
private object InContextElementProviderFromPoint( object arg )
{
Point point = (Point)arg;
AutomationPeer peer = _peer.GetPeerFromPoint(point);
return Wrap(peer);
}
// Return proxy representing currently focused element (if any)
private object InContextGetFocus( object unused )
{
//
AutomationPeer peer = AutomationPeer.AutomationPeerFromInputElement(Keyboard.FocusedElement);
return Wrap(peer);
}
// redirect to AutomationPeer
private object InContextGetPatternProvider(object arg)
{
return _peer.GetWrappedPattern((int)arg);
}
// Return proxy representing element in specified direction (parent/next/firstchild/etc.)
private object InContextNavigate( object arg )
{
NavigateDirection direction = (NavigateDirection) arg;
AutomationPeer dest;
switch( direction )
{
case NavigateDirection.Parent:
dest = _peer.GetParent();
break;
case NavigateDirection.FirstChild:
if (!_peer.IsInteropPeer)
{
dest = _peer.GetFirstChild();
}
else
{
return _peer.GetInteropChild();
}
break;
case NavigateDirection.LastChild:
if (!_peer.IsInteropPeer)
{
dest = _peer.GetLastChild();
}
else
{
return _peer.GetInteropChild();
}
break;
case NavigateDirection.NextSibling:
dest = _peer.GetNextSibling();
break;
case NavigateDirection.PreviousSibling:
dest = _peer.GetPreviousSibling();
break;
default:
dest = null;
break;
}
return Wrap(dest);
}
// Return value for specified property; or null if not supported
private object InContextGetProviderOptions( object arg )
{
ProviderOptions options = ProviderOptions.ServerSideProvider;
if(_peer.IsHwndHost)
options |= ProviderOptions.OverrideProvider;
return options;
}
// Return value for specified property; or null if not supported
private object InContextGetPropertyValue ( object arg )
{
return _peer.GetPropertyValue((int)arg);
}
/// Returns whether this is the Root of the WCP tree or not
private object InContextGetHostRawElementProvider( object unused )
{
return _peer.GetHostRawElementProvider();
}
// Return unique ID for this element...
private object InContextGetRuntimeId( object unused )
{
return _peer.GetRuntimeId();
}
// Return bounding rectangle (screen coords) for this element...
private object InContextBoundingRectangle(object unused)
{
return _peer.GetBoundingRectangle();
}
// Set focus to this element...
private object InContextSetFocus( object unused )
{
_peer.SetFocus();
return null;
}
// Return proxy representing the root of this WCP tree...
private object InContextFragmentRoot( object unused )
{
AutomationPeer root = _peer;
while(true)
{
AutomationPeer parent = root.GetParent();
if(parent == null) break;
root = parent;
}
return Wrap(root);
}
private object InContextAdviseEventAdded(object arg)
{
object [] args = (object [])arg;
int eventId = (int)args[0];
EventMap.AddEvent(eventId);
return null;
}
private object InContextAdviseEventRemoved(object arg)
{
object [] args = (object [])arg;
int eventId = (int)args[0];
EventMap.RemoveEvent(eventId);
return null;
}
#endregion Private Methods
//------------------------------------------------------
//
// Private Fields
//
//-----------------------------------------------------
#region Private Fields
private AutomationPeer _peer;
#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: UIAutomation/Visual bridge
//
// History:
// 07/15/2003 : BrendanM Ported to WCP
//
//---------------------------------------------------------------------------
using System;
using System.Collections;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Automation;
using System.Windows.Automation.Provider;
using System.Windows.Automation.Peers;
using System.Diagnostics;
using System.Windows.Input;
using System.Windows.Interop;
using System.Windows.Media;
using System.Windows.Threading;
using System.Security;
using System.Security.Permissions;
using MS.Internal.PresentationCore;
using MS.Win32;
using SR=MS.Internal.PresentationCore.SR;
using SRID=MS.Internal.PresentationCore.SRID;
namespace MS.Internal.Automation
{
// Automation Proxy for WCP elements - exposes WCP tree
// and properties to Automation.
//
// Currently builds tree based on Visual tree; many later incorporate
// parts of logical tree.
//
// Currently exposes just BoundingRectangle, ClassName, IsEnabled
// and IsKeyboardFocused properties.
internal class ElementProxy: IRawElementProviderFragmentRoot, IRawElementProviderAdviseEvents
{
//-----------------------------------------------------
//
// Constructors
//
//-----------------------------------------------------
#region Constructors
// private ctor - the Wrap() pseudo-ctor is used instead.
private ElementProxy(AutomationPeer peer)
{
_peer = peer;
}
#endregion Constructors
//------------------------------------------------------
//
// Interface IRawElementProviderFragmentRoot
//
//------------ ------------------------------------------
#region Interface IRawElementProviderFragmentRoot
// Implementation of the interface that exposes this
// to UIAutomation.
//
// Interface IRawElementProviderFragmentRoot 'derives' from
// IRawElementProviderSimple and IRawElementProviderFragment,
// methods from those appear first below.
//
// Most of the interface methods on this interface need
// to get onto the Visual's context before they can access it,
// so use Dispatcher.Invoke to call a private method (in the
// private methods section of this class) that does the real work.
// IRawElementProviderSimple methods...
public object GetPatternProvider ( int pattern )
{
return ElementUtil.Invoke( _peer, new DispatcherOperationCallback( InContextGetPatternProvider ), pattern);
}
public object GetPropertyValue(int property)
{
return ElementUtil.Invoke(_peer, new DispatcherOperationCallback( InContextGetPropertyValue ), property);
}
public ProviderOptions ProviderOptions
{
get { return (ProviderOptions)ElementUtil.Invoke(_peer, new DispatcherOperationCallback( InContextGetProviderOptions ), null); }
}
public IRawElementProviderSimple HostRawElementProvider
{
get
{
IRawElementProviderSimple host = null;
HostedWindowWrapper hwndWrapper = null;
hwndWrapper = (HostedWindowWrapper)ElementUtil.Invoke(
_peer,
new DispatcherOperationCallback(InContextGetHostRawElementProvider),
null);
if(hwndWrapper != null)
host = GetHostHelper(hwndWrapper);
return host;
}
}
///
/// Critical - Calls critical HostedWindowWrapper.Handle.
/// TreatAsSafe - Critical data is used internally and not explosed
///
[SecurityCritical, SecurityTreatAsSafe]
private IRawElementProviderSimple GetHostHelper(HostedWindowWrapper hwndWrapper)
{
return AutomationInteropProvider.HostProviderFromHandle(hwndWrapper.Handle);
}
// IRawElementProviderFragment methods...
public IRawElementProviderFragment Navigate( NavigateDirection direction )
{
return (IRawElementProviderFragment)ElementUtil.Invoke(_peer, new DispatcherOperationCallback(InContextNavigate), direction);
}
public int [ ] GetRuntimeId()
{
return (int []) ElementUtil.Invoke( _peer, new DispatcherOperationCallback( InContextGetRuntimeId ), null );
}
public Rect BoundingRectangle
{
get { return (Rect)ElementUtil.Invoke(_peer, new DispatcherOperationCallback(InContextBoundingRectangle), null); }
}
public IRawElementProviderSimple [] GetEmbeddedFragmentRoots()
{
return null;
}
public void SetFocus()
{
ElementUtil.Invoke(_peer, new DispatcherOperationCallback( InContextSetFocus ), null);
}
public IRawElementProviderFragmentRoot FragmentRoot
{
get { return (IRawElementProviderFragmentRoot) ElementUtil.Invoke( _peer, new DispatcherOperationCallback( InContextFragmentRoot ), null ); }
}
// IRawElementProviderFragmentRoot methods..
public IRawElementProviderFragment ElementProviderFromPoint( double x, double y )
{
return (IRawElementProviderFragment) ElementUtil.Invoke( _peer, new DispatcherOperationCallback( InContextElementProviderFromPoint ), new Point( x, y ) );
}
public IRawElementProviderFragment GetFocus()
{
return (IRawElementProviderFragment) ElementUtil.Invoke( _peer, new DispatcherOperationCallback( InContextGetFocus ), null );
}
// Event support...
public void AdviseEventAdded(int eventID, int[] properties)
{
ElementUtil.Invoke( _peer, new DispatcherOperationCallback( InContextAdviseEventAdded ), new object [] { eventID, properties } );
}
public void AdviseEventRemoved(int eventID, int[] properties)
{
ElementUtil.Invoke( _peer, new DispatcherOperationCallback( InContextAdviseEventRemoved ), new object [] { eventID, properties } );
}
#endregion Interface IRawElementProviderFragmentRoot
//-----------------------------------------------------
//
// Internal Methods
//
//------------------------------------------------------
#region Internal Methods
// Wrap the found peer before shipping it over process boundary.
private ElementProxy Wrap(AutomationPeer peer)
{
//_peer is well-connected, since UIA is asking us using it,
//so it's ok to pass it as the referencePeer to StaticWrap
return StaticWrap(peer, _peer);
}
// Wrap the found peer before shipping it over process boundary - static version for use outside ElementProxy.
internal static ElementProxy StaticWrap(AutomationPeer peer, AutomationPeer referencePeer)
{
ElementProxy result = null;
if (peer != null)
{
//referencePeer is well-connected, since UIA is asking us using it.
//However we are trying to return the peer that is possibly just created on some
//element in the middle of un-walked tree and we need to make sure it is fully
//"connected" or initialized before we return it to UIA.
//This method ensures it has the right _parent and other hookup.
peer = peer.ValidateConnected(referencePeer);
if (peer != null)
{
result = new ElementProxy(peer);
}
}
return result;
}
// Needed to enable access from AutomationPeer.PeerFromProvider
internal AutomationPeer Peer
{
get { return _peer; }
}
#endregion Internal Methods
//------------------------------------------------------
//
// Private Methods
//
//-----------------------------------------------------
#region Private Methods
// The signature of most of the folling methods is "object func( object arg )",
// since that's what the Conmtext.Invoke delegate requires.
// Return the element at specified coords.
private object InContextElementProviderFromPoint( object arg )
{
Point point = (Point)arg;
AutomationPeer peer = _peer.GetPeerFromPoint(point);
return Wrap(peer);
}
// Return proxy representing currently focused element (if any)
private object InContextGetFocus( object unused )
{
//
AutomationPeer peer = AutomationPeer.AutomationPeerFromInputElement(Keyboard.FocusedElement);
return Wrap(peer);
}
// redirect to AutomationPeer
private object InContextGetPatternProvider(object arg)
{
return _peer.GetWrappedPattern((int)arg);
}
// Return proxy representing element in specified direction (parent/next/firstchild/etc.)
private object InContextNavigate( object arg )
{
NavigateDirection direction = (NavigateDirection) arg;
AutomationPeer dest;
switch( direction )
{
case NavigateDirection.Parent:
dest = _peer.GetParent();
break;
case NavigateDirection.FirstChild:
if (!_peer.IsInteropPeer)
{
dest = _peer.GetFirstChild();
}
else
{
return _peer.GetInteropChild();
}
break;
case NavigateDirection.LastChild:
if (!_peer.IsInteropPeer)
{
dest = _peer.GetLastChild();
}
else
{
return _peer.GetInteropChild();
}
break;
case NavigateDirection.NextSibling:
dest = _peer.GetNextSibling();
break;
case NavigateDirection.PreviousSibling:
dest = _peer.GetPreviousSibling();
break;
default:
dest = null;
break;
}
return Wrap(dest);
}
// Return value for specified property; or null if not supported
private object InContextGetProviderOptions( object arg )
{
ProviderOptions options = ProviderOptions.ServerSideProvider;
if(_peer.IsHwndHost)
options |= ProviderOptions.OverrideProvider;
return options;
}
// Return value for specified property; or null if not supported
private object InContextGetPropertyValue ( object arg )
{
return _peer.GetPropertyValue((int)arg);
}
/// Returns whether this is the Root of the WCP tree or not
private object InContextGetHostRawElementProvider( object unused )
{
return _peer.GetHostRawElementProvider();
}
// Return unique ID for this element...
private object InContextGetRuntimeId( object unused )
{
return _peer.GetRuntimeId();
}
// Return bounding rectangle (screen coords) for this element...
private object InContextBoundingRectangle(object unused)
{
return _peer.GetBoundingRectangle();
}
// Set focus to this element...
private object InContextSetFocus( object unused )
{
_peer.SetFocus();
return null;
}
// Return proxy representing the root of this WCP tree...
private object InContextFragmentRoot( object unused )
{
AutomationPeer root = _peer;
while(true)
{
AutomationPeer parent = root.GetParent();
if(parent == null) break;
root = parent;
}
return Wrap(root);
}
private object InContextAdviseEventAdded(object arg)
{
object [] args = (object [])arg;
int eventId = (int)args[0];
EventMap.AddEvent(eventId);
return null;
}
private object InContextAdviseEventRemoved(object arg)
{
object [] args = (object [])arg;
int eventId = (int)args[0];
EventMap.RemoveEvent(eventId);
return null;
}
#endregion Private Methods
//------------------------------------------------------
//
// Private Fields
//
//-----------------------------------------------------
#region Private Fields
private AutomationPeer _peer;
#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
- AsyncResult.cs
- SmiEventSink.cs
- DesignerActionUIService.cs
- ListViewCancelEventArgs.cs
- ConfigXmlAttribute.cs
- WorkflowNamespace.cs
- XmlCharType.cs
- TypeSystemHelpers.cs
- Int16AnimationUsingKeyFrames.cs
- ClientSettingsStore.cs
- Int32.cs
- EntityDataSourceContextCreatingEventArgs.cs
- FolderBrowserDialogDesigner.cs
- ParsedAttributeCollection.cs
- SqlTriggerAttribute.cs
- ContainerSelectorBehavior.cs
- ActivationArguments.cs
- FixedSOMSemanticBox.cs
- HMACSHA512.cs
- XsltContext.cs
- EventPrivateKey.cs
- UDPClient.cs
- StubHelpers.cs
- ProfessionalColorTable.cs
- EpmContentDeSerializer.cs
- EntityStoreSchemaGenerator.cs
- DetailsViewUpdateEventArgs.cs
- GatewayDefinition.cs
- Padding.cs
- SetStoryboardSpeedRatio.cs
- HtmlWindow.cs
- StyleModeStack.cs
- HyperLinkField.cs
- IdentityHolder.cs
- ProgressBarHighlightConverter.cs
- ImageMapEventArgs.cs
- UnicastIPAddressInformationCollection.cs
- UpdateCompiler.cs
- ConfigurationException.cs
- DataGridViewCellStyleChangedEventArgs.cs
- PolicyManager.cs
- SystemIPAddressInformation.cs
- ImageInfo.cs
- PageThemeParser.cs
- CompositeDataBoundControl.cs
- GifBitmapEncoder.cs
- SQLByteStorage.cs
- Internal.cs
- UrlRoutingModule.cs
- DataGridViewCellCancelEventArgs.cs
- KeySpline.cs
- HtmlInputSubmit.cs
- OdbcEnvironmentHandle.cs
- PropertyDescriptorGridEntry.cs
- ServicesExceptionNotHandledEventArgs.cs
- XmlDataImplementation.cs
- NetNamedPipeBindingCollectionElement.cs
- XPathPatternParser.cs
- DuplicateWaitObjectException.cs
- Reference.cs
- VSWCFServiceContractGenerator.cs
- OrderedDictionaryStateHelper.cs
- NonVisualControlAttribute.cs
- NamedObject.cs
- RuleRefElement.cs
- Expression.cs
- RTTrackingProfile.cs
- FontCollection.cs
- FileVersion.cs
- ToolboxComponentsCreatingEventArgs.cs
- SizeChangedInfo.cs
- AttributeUsageAttribute.cs
- DesignerLoader.cs
- FilterableData.cs
- MessageQueueCriteria.cs
- AdRotatorDesigner.cs
- ScrollBar.cs
- Localizer.cs
- ManipulationInertiaStartingEventArgs.cs
- XmlProcessingInstruction.cs
- ReliableChannelFactory.cs
- wmiprovider.cs
- RepeaterCommandEventArgs.cs
- ExpressionConverter.cs
- SmtpNtlmAuthenticationModule.cs
- XmlConvert.cs
- ViewManagerAttribute.cs
- ToolStripDropTargetManager.cs
- SimpleWorkerRequest.cs
- RegexReplacement.cs
- ApplicationTrust.cs
- EventlogProvider.cs
- FileIOPermission.cs
- PerformanceCountersBase.cs
- Style.cs
- HostingEnvironmentSection.cs
- ControllableStoryboardAction.cs
- RenderData.cs
- ValidatorCollection.cs
- AssemblyResourceLoader.cs