// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using Windows.Win32.System.Variant; using Windows.Win32.UI.Accessibility; using IScrollProvider = Windows.Win32.UI.Accessibility.IScrollProvider; using ScrollAmount = Windows.Win32.UI.Accessibility.ScrollAmount; namespace System.Windows.Forms; public partial class PrintPreviewControl { internal sealed class PrintPreviewControlAccessibleObject : ControlAccessibleObject, IScrollProvider.Interface { public PrintPreviewControlAccessibleObject(PrintPreviewControl owner) : base(owner) { } internal override VARIANT GetPropertyValue(UIA_PROPERTY_ID propertyID) => !this.TryGetOwnerAs(out PrintPreviewControl? owner) ? default : propertyID switch { UIA_PROPERTY_ID.UIA_AutomationIdPropertyId => (VARIANT)owner.Name, UIA_PROPERTY_ID.UIA_HasKeyboardFocusPropertyId => (VARIANT)owner.Focused, UIA_PROPERTY_ID.UIA_IsKeyboardFocusablePropertyId => (VARIANT)State.HasFlag(AccessibleStates.Focusable), _ => base.GetPropertyValue(propertyID) }; public override int GetChildCount() { if (!this.TryGetOwnerAs(out PrintPreviewControl? owner)) { return 0; } return owner._vScrollBar.Visible ? owner._hScrollBar.Visible ? 2 : 1 : owner._hScrollBar.Visible ? 1 : 0; } public override AccessibleObject? GetChild(int index) { if (!this.TryGetOwnerAs(out PrintPreviewControl? owner)) { return null; } return index switch { 0 => owner._vScrollBar.Visible ? owner._vScrollBar.AccessibilityObject : owner._hScrollBar.Visible ? owner._hScrollBar.AccessibilityObject : null, 1 => owner._vScrollBar.Visible && owner._hScrollBar.Visible ? owner._hScrollBar.AccessibilityObject : null, _ => null }; } private protected override bool IsInternal => true; internal override bool IsPatternSupported(UIA_PATTERN_ID patternId) => patternId switch { UIA_PATTERN_ID.UIA_ScrollPatternId => this.TryGetOwnerAs(out PrintPreviewControl? owner) && (owner._vScrollBar.Visible || owner._hScrollBar.Visible), _ => base.IsPatternSupported(patternId) }; internal override IRawElementProviderFragmentRoot.Interface FragmentRoot => this; internal override IRawElementProviderFragment.Interface? FragmentNavigate(NavigateDirection direction) { if (!this.TryGetOwnerAs(out PrintPreviewControl? owner)) { return base.FragmentNavigate(direction); } return direction switch { NavigateDirection.NavigateDirection_FirstChild => owner._vScrollBar.Visible ? owner._vScrollBar.AccessibilityObject : owner._hScrollBar.Visible ? owner._hScrollBar.AccessibilityObject : null, NavigateDirection.NavigateDirection_LastChild => owner._hScrollBar.Visible ? owner._hScrollBar.AccessibilityObject : owner._vScrollBar.Visible ? owner._vScrollBar.AccessibilityObject : null, _ => base.FragmentNavigate(direction), }; } HRESULT IScrollProvider.Interface.Scroll(ScrollAmount horizontalAmount, ScrollAmount verticalAmount) { if (!this.TryGetOwnerAs(out PrintPreviewControl? owner)) { return HRESULT.E_FAIL; } int scrollValue; if (owner._hScrollBar.Visible && horizontalAmount != ScrollAmount.ScrollAmount_NoAmount) { switch (horizontalAmount) { case ScrollAmount.ScrollAmount_LargeIncrement: scrollValue = owner._hScrollBar.Value + owner._hScrollBar.LargeChange; owner._hScrollBar.Value = (scrollValue > owner._hScrollBar.Maximum ? owner._hScrollBar.Maximum : scrollValue); break; case ScrollAmount.ScrollAmount_SmallIncrement: scrollValue = owner._hScrollBar.Value + owner._hScrollBar.SmallChange; owner._hScrollBar.Value = (scrollValue > owner._hScrollBar.Maximum ? owner._hScrollBar.Maximum : scrollValue); break; case ScrollAmount.ScrollAmount_LargeDecrement: scrollValue = owner._hScrollBar.Value - owner._hScrollBar.LargeChange; owner._hScrollBar.Value = (scrollValue < owner._hScrollBar.Minimum ? owner._hScrollBar.Minimum : scrollValue); break; case ScrollAmount.ScrollAmount_SmallDecrement: scrollValue = owner._hScrollBar.Value - owner._hScrollBar.SmallChange; owner._hScrollBar.Value = (scrollValue < owner._hScrollBar.Minimum ? owner._hScrollBar.Minimum : scrollValue); break; } } if (owner._vScrollBar.Visible && verticalAmount != ScrollAmount.ScrollAmount_NoAmount) { switch (verticalAmount) { case ScrollAmount.ScrollAmount_LargeIncrement: scrollValue = owner._vScrollBar.Value + owner._vScrollBar.LargeChange; owner._vScrollBar.Value = (scrollValue > owner._vScrollBar.Maximum ? owner._vScrollBar.Maximum : scrollValue); break; case ScrollAmount.ScrollAmount_SmallIncrement: scrollValue = owner._vScrollBar.Value + owner._vScrollBar.SmallChange; owner._vScrollBar.Value = (scrollValue > owner._vScrollBar.Maximum ? owner._vScrollBar.Maximum : scrollValue); break; case ScrollAmount.ScrollAmount_LargeDecrement: scrollValue = owner._vScrollBar.Value - owner._vScrollBar.LargeChange; owner._vScrollBar.Value = (scrollValue < owner._vScrollBar.Minimum ? owner._vScrollBar.Minimum : scrollValue); break; case ScrollAmount.ScrollAmount_SmallDecrement: scrollValue = owner._vScrollBar.Value - owner._vScrollBar.SmallChange; owner._vScrollBar.Value = (scrollValue < owner._vScrollBar.Minimum ? owner._vScrollBar.Minimum : scrollValue); break; } } return HRESULT.S_OK; } HRESULT IScrollProvider.Interface.SetScrollPercent(double horizontalPercent, double verticalPercent) { if (!this.TryGetOwnerAs(out PrintPreviewControl? owner)) { return HRESULT.E_FAIL; } int scrollValue; if (owner._hScrollBar.Visible && horizontalPercent >= 0 && horizontalPercent <= 100) { scrollValue = owner._hScrollBar.Minimum + (int)((owner._hScrollBar.Maximum - owner._hScrollBar.Minimum) * horizontalPercent); owner._hScrollBar.Value = scrollValue; } if (owner._vScrollBar.Visible && verticalPercent >= 0 && verticalPercent <= 100) { scrollValue = owner._vScrollBar.Minimum + (int)((owner._vScrollBar.Maximum - owner._vScrollBar.Minimum) * verticalPercent); owner._vScrollBar.Value = scrollValue; } return HRESULT.S_OK; } public double HorizontalScrollPercent { get { if (this.TryGetOwnerAs(out PrintPreviewControl? owner) && owner._hScrollBar.Visible) { double percent = owner._hScrollBar.Value * 100.0 / (owner._hScrollBar.Maximum - owner._hScrollBar.LargeChange); return percent > 100 ? 100 : percent; } return 0; } } public double VerticalScrollPercent { get { if (this.TryGetOwnerAs(out PrintPreviewControl? owner) && owner._vScrollBar.Visible) { double percent = owner._vScrollBar.Value * 100.0 / (owner._vScrollBar.Maximum - owner._vScrollBar.LargeChange); return percent > 100 ? 100 : percent; } return 0; } } public double HorizontalViewSize => this.TryGetOwnerAs(out PrintPreviewControl? owner) && owner._hScrollBar.Visible ? owner.HorizontalViewSize : 100; public double VerticalViewSize => this.TryGetOwnerAs(out PrintPreviewControl? owner) && owner._vScrollBar.Visible ? owner.VerticalViewSize : 100; BOOL IScrollProvider.Interface.HorizontallyScrollable => this.TryGetOwnerAs(out PrintPreviewControl? owner) && owner._hScrollBar.Visible; BOOL IScrollProvider.Interface.VerticallyScrollable => this.TryGetOwnerAs(out PrintPreviewControl? owner) && owner._vScrollBar.Visible; } }