private ProviderElementWrapper GetWrapperFromPoint( ProviderElementWrapper root, double px, double py, bool checkRoot) { if (checkRoot && (root.IsOffscreen || !root.BoundingRectangle.Contains(px, py))) { return(null); } var child = root.FirstChild; while (child != null) { var ret = GetWrapperFromPoint(child, px, py, true); if (ret != null) { return(ret); } child = child.NextSibling; } return(root); }
private ProviderElementWrapper GetWrapperFromPoint ( ProviderElementWrapper root, double px, double py, bool checkRoot) { if (checkRoot && (root.IsOffscreen || !root.BoundingRectangle.Contains (px, py))) return null; var child = root.FirstChild; while (child != null) { var ret = GetWrapperFromPoint (child, px, py, true); if (ret != null) return ret; child = child.NextSibling; } return root; }
public void RaiseStructureChangedEvent (object provider, StructureChangedEventArgs e) { IRawElementProviderSimple simpleProvider = provider as IRawElementProviderSimple; if (e.StructureChangeType == StructureChangeType.ChildAdded) { if (simpleProvider == null) return; object providerHandleObj = simpleProvider.GetPropertyValue (AEIds.NativeWindowHandleProperty.Id); IntPtr providerHandle = providerHandleObj != null ? (IntPtr) providerHandleObj : IntPtr.Zero; bool isRootWindow = false; if (ControlType.Window.Id == (int) simpleProvider.GetPropertyValue (AEIds.ControlTypeProperty.Id)) { var fragmentProvider = simpleProvider as IRawElementProviderFragment; isRootWindow = fragmentProvider != null && fragmentProvider == fragmentProvider.Navigate (NavigateDirection.Parent); } ProviderElementWrapper element = new ProviderElementWrapper (simpleProvider); element.Register (SessionBus); lock (providerWrapperMapping) providerWrapperMapping [simpleProvider] = element; if (providerHandle != IntPtr.Zero) lock (pointerProviderMapping) { #if DEBUG if (pointerProviderMapping.ContainsKey (providerHandle)) { Log.Error ("Duplicate provider handle, {0}, {1}", simpleProvider.GetPropertyValue (AEIds.NameProperty.Id), simpleProvider.GetPropertyValue (AEIds.LocalizedControlTypeProperty.Id)); } #endif pointerProviderMapping [providerHandle] = simpleProvider; } if (isRootWindow) app.AddRootElement (element); //The event shall be raised after the provider is added to providerWrapperMapping app.RaiseStructureChangedEvent (simpleProvider, e); } else if (e.StructureChangeType == StructureChangeType.ChildRemoved) { //The event shall be raised before the provider is deleted from providerWrapperMapping app.RaiseStructureChangedEvent (simpleProvider, e); HandleTotalElementRemoval (simpleProvider); } else { app.RaiseStructureChangedEvent (simpleProvider, e); } }