Mercurial > silverbladetech
diff SilverlightGlimpse/FloatableWindow/FloatableWindowAutomationPeer.cs @ 62:810116cd6b8e
ErrorWindow working
author | Steven Hollidge <stevenhollidge@hotmail.com> |
---|---|
date | Sun, 22 Apr 2012 09:01:20 +0100 |
parents | |
children | a0bcd783e612 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SilverlightGlimpse/FloatableWindow/FloatableWindowAutomationPeer.cs Sun Apr 22 09:01:20 2012 +0100 @@ -0,0 +1,429 @@ +// (c) Copyright Microsoft Corporation. +// This source is subject to the Microsoft Public License (Ms-PL). +// Please see http://go.microsoft.com/fwlink/?LinkID=131993 for details. +// All other rights reserved. + +using System.Windows.Automation.Provider; +using System.Windows.Controls; +using System.Windows.Media; + +namespace System.Windows.Automation.Peers +{ + /// <summary> + /// Exposes <see cref="T:System.Windows.Controls.FloatableWindow" /> types to UI + /// automation. + /// </summary> + /// <QualityBand>Preview</QualityBand> + public class FloatableWindowAutomationPeer : FrameworkElementAutomationPeer, IWindowProvider, ITransformProvider + { + #region Data + + /// <summary> + /// Specifies whether the FloatableWindow is the top most element. + /// </summary> + private bool _isTopMost; + + #endregion Data + + #region Properties + + /// <summary> + /// Gets or sets a value indicating whether the FloatableWindow is the top most element. + /// </summary> + private bool IsTopMostPrivate + { + get + { + return this._isTopMost; + } + set + { + if (this._isTopMost != value) + { + this._isTopMost = value; + this.RaisePropertyChangedEvent(WindowPatternIdentifiers.IsTopmostProperty, !this._isTopMost, this._isTopMost); + } + } + } + + /// <summary> + /// Gets the owning FloatableWindow. + /// </summary> + private FloatableWindow OwningFloatableWindow + { + get + { + return (FloatableWindow)Owner; + } + } + + #endregion Properties + + /// <summary> + /// Initializes a new instance of the + /// <see cref="T:System.Windows.Automation.Peers.FloatableWindowAutomationPeer" /> + /// class. + /// </summary> + /// <param name="owner"> + /// The <see cref="T:System.Windows.Controls.FloatableWindow" /> to + /// associate with this + /// <see cref="T:System.Windows.Automation.Peers.FloatableWindowAutomationPeer" />. + /// </param> + public FloatableWindowAutomationPeer(FloatableWindow owner) + : base(owner) + { + if (owner == null) + { + throw new ArgumentNullException("owner"); + } + this.RefreshIsTopMostProperty(); + } + + #region AutomationPeer overrides + + /// <summary> + /// Gets the control pattern for this + /// <see cref="T:System.Windows.Automation.Peers.FloatableWindowAutomationPeer" />. + /// </summary> + /// <param name="patternInterface"> + /// One of the enumeration values. + /// </param> + /// <returns> + /// The object that implements the pattern interface, or null if the + /// specified pattern interface is not implemented by this peer. + /// </returns> + public override object GetPattern(PatternInterface patternInterface) + { + if (patternInterface == PatternInterface.Transform || patternInterface == PatternInterface.Window) + { + return this; + } + + return base.GetPattern(patternInterface); + } + + /// <summary> + /// Gets the + /// <see cref="T:System.Windows.Automation.Peers.AutomationControlType" /> + /// for the element associated with this + /// <see cref="T:System.Windows.Automation.Peers.FloatableWindowAutomationPeer" />. + /// Called by + /// <see cref="M:System.Windows.Automation.Peers.AutomationPeer.GetAutomationControlType" />. + /// </summary> + /// <returns>A value of the enumeration.</returns> + protected override AutomationControlType GetAutomationControlTypeCore() + { + return AutomationControlType.Window; + } + + /// <summary> + /// Gets the name of the class for the object associated with this + /// <see cref="T:System.Windows.Automation.Peers.FloatableWindowAutomationPeer" />. + /// Called by + /// <see cref="M:System.Windows.Automation.Peers.AutomationPeer.GetClassName" />. + /// </summary> + /// <returns> + /// A string value that represents the type of the child window. + /// </returns> + protected override string GetClassNameCore() + { + return this.Owner.GetType().Name; + } + + /// <summary> + /// Gets the text label of the + /// <see cref="T:System.Windows.Controls.FloatableWindow" /> that is + /// associated with this + /// <see cref="T:System.Windows.Automation.Peers.FloatableWindowAutomationPeer" />. + /// Called by + /// <see cref="M:System.Windows.Automation.Peers.AutomationPeer.GetName" />. + /// </summary> + /// <returns> + /// The text label of the element that is associated with this + /// automation peer. + /// </returns> + protected override string GetNameCore() + { + string name = base.GetNameCore(); + if (string.IsNullOrEmpty(name)) + { + AutomationPeer labeledBy = GetLabeledByCore(); + if (labeledBy != null) + { + name = labeledBy.GetName(); + } + + if (string.IsNullOrEmpty(name) && this.OwningFloatableWindow.Title != null) + { + name = this.OwningFloatableWindow.Title.ToString(); + } + } + return name; + } + + #endregion AutomationPeer overrides + + #region IWindowProvider + + /// <summary> + /// Gets the interaction state of the window. + /// </summary> + /// <value> + /// The interaction state of the control, as a value of the enumeration. + /// </value> + WindowInteractionState IWindowProvider.InteractionState + { + get + { + return this.OwningFloatableWindow.InteractionState; + } + } + + /// <summary> + /// Gets a value indicating whether the window is modal. + /// </summary> + /// <value> + /// True in all cases. + /// </value> + bool IWindowProvider.IsModal + { + get { return true; } + } + + /// <summary> + /// Gets a value indicating whether the window is the topmost + /// element in the z-order of layout. + /// </summary> + /// <value> + /// True if the window is topmost; otherwise, false. + /// </value> + bool IWindowProvider.IsTopmost + { + get + { + return this.IsTopMostPrivate; + } + } + + /// <summary> + /// Gets a value indicating whether the window can be maximized. + /// </summary> + /// <value>False in all cases.</value> + bool IWindowProvider.Maximizable + { + get { return false; } + } + + /// <summary> + /// Gets a value indicating whether the window can be minimized. + /// </summary> + /// <value>False in all cases.</value> + bool IWindowProvider.Minimizable + { + get { return false; } + } + + /// <summary> + /// Gets the visual state of the window. + /// </summary> + /// <value> + /// <see cref="F:System.Windows.Automation.WindowVisualState.Normal" /> + /// in all cases. + /// </value> + WindowVisualState IWindowProvider.VisualState + { + get + { + return WindowVisualState.Normal; + } + } + + /// <summary> + /// Closes the window. + /// </summary> + void IWindowProvider.Close() + { + this.OwningFloatableWindow.Close(); + } + + /// <summary> + /// Changes the visual state of the window (such as minimizing or + /// maximizing it). + /// </summary> + /// <param name="state"> + /// The visual state of the window to change to, as a value of the + /// enumeration. + /// </param> + void IWindowProvider.SetVisualState(WindowVisualState state) + { + } + + /// <summary> + /// Blocks the calling code for the specified time or until the + /// associated process enters an idle state, whichever completes first. + /// </summary> + /// <param name="milliseconds"> + /// The amount of time, in milliseconds, to wait for the associated + /// process to become idle. + /// </param> + /// <returns> + /// True if the window has entered the idle state; false if the timeout + /// occurred. + /// </returns> + bool IWindowProvider.WaitForInputIdle(int milliseconds) + { + return false; + } + + #endregion IWindowProvider + + #region ITransformProvider + + /// <summary> + /// Moves the control. + /// </summary> + /// <param name="x"> + /// The absolute screen coordinates of the left side of the control. + /// </param> + /// <param name="y"> + /// The absolute screen coordinates of the top of the control. + /// </param> + void ITransformProvider.Move(double x, double y) + { + if (x < 0) + { + x = 0; + } + + if (y < 0) + { + y = 0; + } + + if (x > this.OwningFloatableWindow.Width) + { + x = this.OwningFloatableWindow.Width; + } + + if (y > this.OwningFloatableWindow.Height) + { + y = this.OwningFloatableWindow.Height; + } + + FrameworkElement contentRoot = this.OwningFloatableWindow.ContentRoot; + + if (contentRoot != null) + { + GeneralTransform gt = contentRoot.TransformToVisual(null); + + if (gt != null) + { + Point p = gt.Transform(new Point(0, 0)); + + TransformGroup transformGroup = contentRoot.RenderTransform as TransformGroup; + + if (transformGroup == null) + { + transformGroup = new TransformGroup(); + transformGroup.Children.Add(contentRoot.RenderTransform); + } + + TranslateTransform t = new TranslateTransform(); + t.X = x - p.X; + t.Y = y - p.Y; + + if (transformGroup != null) + { + transformGroup.Children.Add(t); + contentRoot.RenderTransform = transformGroup; + } + } + } + } + + /// <summary> + /// Resizes the control. + /// </summary> + /// <param name="width">The new width of the window, in pixels.</param> + /// <param name="height"> + /// The new height of the window, in pixels. + /// </param> + void ITransformProvider.Resize(double width, double height) + { + } + + /// <summary> + /// Rotates the control. + /// </summary> + /// <param name="degrees"> + /// The number of degrees to rotate the control. A positive number + /// rotates the control clockwise. A negative number rotates the + /// control counterclockwise. + /// </param> + void ITransformProvider.Rotate(double degrees) + { + } + + /// <summary> + /// Gets a value indicating whether the element can be moved. + /// </summary> + /// <value>True in all cases.</value> + bool ITransformProvider.CanMove + { + get { return true; } + } + + /// <summary> + /// Gets a value indicating whether the element can be resized. + /// </summary> + /// <value>False in all cases.</value> + bool ITransformProvider.CanResize + { + get { return false; } + } + + /// <summary> + /// Gets a value indicating whether the element can be rotated. + /// </summary> + /// <value>False in all cases.</value> + bool ITransformProvider.CanRotate + { + get { return false; } + } + + #endregion ITransformProvider + + #region Methods + + /// <summary> + /// Returns if the FloatableWindow is the top most element. + /// </summary> + /// <returns>Bool value.</returns> + private bool GetIsTopMostCore() + { + return !(this.OwningFloatableWindow.InteractionState == WindowInteractionState.BlockedByModalWindow); + } + + /// <summary> + /// Raises PropertyChangedEvent for WindowInteractionStateProperty. + /// </summary> + /// <param name="oldValue">Old WindowInteractionStateProperty.</param> + /// <param name="newValue">New WindowInteractionStateProperty.</param> + internal void RaiseInteractionStatePropertyChangedEvent(WindowInteractionState oldValue, WindowInteractionState newValue) + { + this.RaisePropertyChangedEvent(WindowPatternIdentifiers.WindowInteractionStateProperty, oldValue, newValue); + this.RefreshIsTopMostProperty(); + } + + /// <summary> + /// Updates the IsTopMostPrivate property. + /// </summary> + private void RefreshIsTopMostProperty() + { + this.IsTopMostPrivate = this.GetIsTopMostCore(); + } + + #endregion Methods + } +} +