// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // // Description: AutomationPeer associated with FlowDocumentReader. // using System.Windows.Automation.Provider; // IMultipleViewProvider using System.Windows.Controls; // FlowDocumentReader using System.Windows.Documents; // FlowDocument using MS.Internal; // Invariant namespace System.Windows.Automation.Peers { /// <summary> /// AutomationPeer associated with FlowDocumentScrollViewer. /// </summary> public class FlowDocumentReaderAutomationPeer : FrameworkElementAutomationPeer, IMultipleViewProvider { /// <summary> /// Constructor. /// </summary> /// <param name="owner">Owner of the AutomationPeer.</param> public FlowDocumentReaderAutomationPeer(FlowDocumentReader owner) : base(owner) { } /// <summary> /// <see cref="AutomationPeer.GetPattern"/> /// </summary> public override object GetPattern(PatternInterface patternInterface) { object returnValue = null; if (patternInterface == PatternInterface.MultipleView) { returnValue = this; } else { returnValue = base.GetPattern(patternInterface); } return returnValue; } /// <summary> /// <see cref="AutomationPeer.GetChildrenCore"/> /// </summary> /// <remarks> /// AutomationPeer associated with FlowDocumentScrollViewer returns an AutomationPeer /// for hosted Document and for elements in the style. /// </remarks> protected override List<AutomationPeer> GetChildrenCore() { // Get children for all elements in the style. List<AutomationPeer> children = base.GetChildrenCore(); // Add AutomationPeer associated with the document. // Make it the first child of the collection. FlowDocument document = ((FlowDocumentReader)Owner).Document; if (document != null) { AutomationPeer documentPeer = ContentElementAutomationPeer.CreatePeerForElement(document); if (_documentPeer != documentPeer) { _documentPeer?.OnDisconnected(); _documentPeer = documentPeer as DocumentAutomationPeer; } if (documentPeer != null) { if (children == null) { children = new List<AutomationPeer>(); } children.Add(documentPeer); } } return children; } /// <summary> /// <see cref="AutomationPeer.GetClassNameCore"/> /// </summary> protected override string GetClassNameCore() { return "FlowDocumentReader"; } /// <summary> /// This helper synchronously fires automation PropertyChange event /// in responce to current view mode change. /// </summary> // BUG 1555137: Never inline, as we don't want to unnecessarily link the automation DLL [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)] internal void RaiseCurrentViewChangedEvent(FlowDocumentReaderViewingMode newMode, FlowDocumentReaderViewingMode oldMode) { if (newMode != oldMode) { RaisePropertyChangedEvent(MultipleViewPatternIdentifiers.CurrentViewProperty, ConvertModeToViewId(newMode), ConvertModeToViewId(oldMode)); } } /// <summary> /// This helper synchronously fires automation PropertyChange event /// in responce to supported views change. /// </summary> // BUG 1555137: Never inline, as we don't want to unnecessarily link the automation DLL [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)] internal void RaiseSupportedViewsChangedEvent(DependencyPropertyChangedEventArgs e) { bool newSingle, oldSingle, newFacing, oldFacing, newScroll, oldScroll; if (e.Property == FlowDocumentReader.IsPageViewEnabledProperty) { newSingle = (bool)e.NewValue; oldSingle = (bool)e.OldValue; newFacing = oldFacing = FlowDocumentReader.IsTwoPageViewEnabled; newScroll = oldScroll = FlowDocumentReader.IsScrollViewEnabled; } else if (e.Property == FlowDocumentReader.IsTwoPageViewEnabledProperty) { newSingle = oldSingle = FlowDocumentReader.IsPageViewEnabled; newFacing = (bool)e.NewValue; oldFacing = (bool)e.OldValue; newScroll = oldScroll = FlowDocumentReader.IsScrollViewEnabled; } else// if (e.Property == FlowDocumentReader.IsScrollViewEnabledProperty) { newSingle = oldSingle = FlowDocumentReader.IsPageViewEnabled; newFacing = oldFacing = FlowDocumentReader.IsTwoPageViewEnabled; newScroll = (bool)e.NewValue; oldScroll = (bool)e.OldValue; } if (newSingle != oldSingle || newFacing != oldFacing || newScroll != oldScroll) { int[] newViews = GetSupportedViews(newSingle, newFacing, newScroll); int[] oldViews = GetSupportedViews(oldSingle, oldFacing, oldScroll); RaisePropertyChangedEvent(MultipleViewPatternIdentifiers.SupportedViewsProperty, newViews, oldViews); } } //------------------------------------------------------------------- // // Private Members // //------------------------------------------------------------------- #region Private Members private int[] GetSupportedViews(bool single, bool facing, bool scroll) { int count = 0; if (single) { count++; } if (facing) { count++; } if (scroll) { count++; } int[] views = count > 0 ? new int[count] : null; count = 0; if (single) { views[count++] = ConvertModeToViewId(FlowDocumentReaderViewingMode.Page); } if (facing) { views[count++] = ConvertModeToViewId(FlowDocumentReaderViewingMode.TwoPage); } if (scroll) { views[count++] = ConvertModeToViewId(FlowDocumentReaderViewingMode.Scroll); } return views; } /// <summary> /// Converts viewing mode to view id. /// </summary> private int ConvertModeToViewId(FlowDocumentReaderViewingMode mode) { return (int)mode; } /// <summary> /// Converts view id to viewing mode. /// </summary> private FlowDocumentReaderViewingMode ConvertViewIdToMode(int viewId) { Invariant.Assert(viewId >= 0 && viewId <= 2); return (FlowDocumentReaderViewingMode)viewId; } /// <summary> /// FlowDocumentReader associated with the peer. /// </summary> private FlowDocumentReader FlowDocumentReader { get { return (FlowDocumentReader)Owner; } } private DocumentAutomationPeer _documentPeer; #endregion Private Members //------------------------------------------------------------------- // // IMultipleViewProvider Members // //------------------------------------------------------------------- #region IMultipleViewProvider Members /// <summary> /// <see cref="IMultipleViewProvider.GetViewName"/> /// </summary> string IMultipleViewProvider.GetViewName(int viewId) { string name = string.Empty; if (viewId >= 0 && viewId <= 2) { FlowDocumentReaderViewingMode mode = ConvertViewIdToMode(viewId); if (mode == FlowDocumentReaderViewingMode.Page) { name = SR.FlowDocumentReader_MultipleViewProvider_PageViewName; } else if (mode == FlowDocumentReaderViewingMode.TwoPage) { name = SR.FlowDocumentReader_MultipleViewProvider_TwoPageViewName; } else if (mode == FlowDocumentReaderViewingMode.Scroll) { name = SR.FlowDocumentReader_MultipleViewProvider_ScrollViewName; } } return name; } /// <summary> /// <see cref="IMultipleViewProvider.SetCurrentView"/> /// </summary> void IMultipleViewProvider.SetCurrentView(int viewId) { if (viewId >= 0 && viewId <= 2) { FlowDocumentReader.ViewingMode = ConvertViewIdToMode(viewId); } } /// <summary> /// <see cref="IMultipleViewProvider.CurrentView"/> /// </summary> int IMultipleViewProvider.CurrentView { get { return ConvertModeToViewId(FlowDocumentReader.ViewingMode); } } /// <summary> /// <see cref="IMultipleViewProvider.GetSupportedViews"/> /// </summary> int[] IMultipleViewProvider.GetSupportedViews() { return GetSupportedViews( FlowDocumentReader.IsPageViewEnabled, FlowDocumentReader.IsTwoPageViewEnabled, FlowDocumentReader.IsScrollViewEnabled); } #endregion IMultipleViewProvider Members } } |