# HG changeset patch # User Steven Hollidge # Date 1335218853 -3600 # Node ID 62889c14148ec486b0ec983a47161fd720cd794c # Parent 5172a9b9800cfa5be40245a3a8e5230ab6c29793 clear rubbish diff -r 5172a9b9800c -r 62889c14148e SilverlightGlimpse/FloatableWindow/FloatableWindow.cs --- a/SilverlightGlimpse/FloatableWindow/FloatableWindow.cs Mon Apr 23 23:07:23 2012 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1620 +0,0 @@ -// 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.Collections; -using System.ComponentModel; -using System.Diagnostics; -using System.Windows.Automation; -using System.Windows.Automation.Peers; -using System.Windows.Controls.Primitives; -using System.Windows.Input; -using System.Windows.Media; -using System.Windows.Media.Animation; - -namespace System.Windows.Controls -{ - /// - /// Provides a window that can be displayed over a parent window and blocks - /// interaction with the parent window. - /// - /// Preview - [TemplatePart(Name = PART_Chrome, Type = typeof(FrameworkElement))] - [TemplatePart(Name = PART_CloseButton, Type = typeof(ButtonBase))] - [TemplatePart(Name = PART_ContentPresenter, Type = typeof(FrameworkElement))] - [TemplatePart(Name = PART_ContentRoot, Type = typeof(FrameworkElement))] - [TemplatePart(Name = PART_Overlay, Type = typeof(Panel))] - [TemplatePart(Name = PART_Root, Type = typeof(FrameworkElement))] - [TemplateVisualState(Name = VSMSTATE_StateClosed, GroupName = VSMGROUP_Window)] - [TemplateVisualState(Name = VSMSTATE_StateOpen, GroupName = VSMGROUP_Window)] - public class FloatableWindow : ContentControl - { - #region Static Fields and Constants - - /// - /// The name of the Chrome template part. - /// - private const string PART_Chrome = "Chrome"; - - /// - /// The name of the CloseButton template part. - /// - private const string PART_CloseButton = "CloseButton"; - - /// - /// The name of the ContentPresenter template part. - /// - private const string PART_ContentPresenter = "ContentPresenter"; - - /// - /// The name of the ContentRoot template part. - /// - private const string PART_ContentRoot = "ContentRoot"; - - /// - /// The name of the Overlay template part. - /// - private const string PART_Overlay = "Overlay"; - - /// - /// The name of the Root template part. - /// - private const string PART_Root = "Root"; - - /// - /// The name of the WindowStates VSM group. - /// - private const string VSMGROUP_Window = "WindowStates"; - - /// - /// The name of the Closing VSM state. - /// - private const string VSMSTATE_StateClosed = "Closed"; - - /// - /// The name of the Opening VSM state. - /// - private const string VSMSTATE_StateOpen = "Open"; - - #region public bool HasCloseButton - - /// - /// Gets or sets a value indicating whether the - /// has a close - /// button. - /// - /// - /// True if the child window has a close button; otherwise, false. The - /// default is true. - /// - public bool HasCloseButton - { - get { return (bool)GetValue(HasCloseButtonProperty); } - set { SetValue(HasCloseButtonProperty, value); } - } - - /// - /// Identifies the - /// - /// dependency property. - /// - /// - /// The identifier for the - /// - /// dependency property. - /// - public static readonly DependencyProperty HasCloseButtonProperty = - DependencyProperty.Register( - "HasCloseButton", - typeof(bool), - typeof(FloatableWindow), - new PropertyMetadata(true, OnHasCloseButtonPropertyChanged)); - - /// - /// HasCloseButtonProperty PropertyChangedCallback call back static function. - /// - /// FloatableWindow object whose HasCloseButton property is changed. - /// DependencyPropertyChangedEventArgs which contains the old and new values. - private static void OnHasCloseButtonPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) - { - FloatableWindow cw = (FloatableWindow)d; - - if (cw.CloseButton != null) - { - if ((bool)e.NewValue) - { - cw.CloseButton.Visibility = Visibility.Visible; - } - else - { - cw.CloseButton.Visibility = Visibility.Collapsed; - } - } - } - - #endregion public bool HasCloseButton - - #region public Brush OverlayBrush - - /// - /// Gets or sets the visual brush that is used to cover the parent - /// window when the child window is open. - /// - /// - /// The visual brush that is used to cover the parent window when the - /// is open. The - /// default is null. - /// - public Brush OverlayBrush - { - get { return (Brush)GetValue(OverlayBrushProperty); } - set { SetValue(OverlayBrushProperty, value); } - } - - /// - /// Identifies the - /// - /// dependency property. - /// - /// - /// The identifier for the - /// - /// dependency property. - /// - public static readonly DependencyProperty OverlayBrushProperty = - DependencyProperty.Register( - "OverlayBrush", - typeof(Brush), - typeof(FloatableWindow), - new PropertyMetadata(OnOverlayBrushPropertyChanged)); - - /// - /// OverlayBrushProperty PropertyChangedCallback call back static function. - /// - /// FloatableWindow object whose OverlayBrush property is changed. - /// DependencyPropertyChangedEventArgs which contains the old and new values. - private static void OnOverlayBrushPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) - { - FloatableWindow cw = (FloatableWindow)d; - - if (cw.Overlay != null) - { - cw.Overlay.Background = (Brush)e.NewValue; - } - } - - #endregion public Brush OverlayBrush - - #region public double OverlayOpacity - - /// - /// Gets or sets the opacity of the overlay brush that is used to cover - /// the parent window when the child window is open. - /// - /// - /// The opacity of the overlay brush that is used to cover the parent - /// window when the - /// is open. The default is 1.0. - /// - public double OverlayOpacity - { - get { return (double)GetValue(OverlayOpacityProperty); } - set { SetValue(OverlayOpacityProperty, value); } - } - - /// - /// Identifies the - /// - /// dependency property. - /// - /// - /// The identifier for the - /// - /// dependency property. - /// - public static readonly DependencyProperty OverlayOpacityProperty = - DependencyProperty.Register( - "OverlayOpacity", - typeof(double), - typeof(FloatableWindow), - new PropertyMetadata(OnOverlayOpacityPropertyChanged)); - - /// - /// OverlayOpacityProperty PropertyChangedCallback call back static function. - /// - /// FloatableWindow object whose OverlayOpacity property is changed. - /// DependencyPropertyChangedEventArgs which contains the old and new values. - private static void OnOverlayOpacityPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) - { - FloatableWindow cw = (FloatableWindow)d; - - if (cw.Overlay != null) - { - cw.Overlay.Opacity = (double)e.NewValue; - } - } - - #endregion public double OverlayOpacity - - #region private static Control RootVisual - - /// - /// Gets the root visual element. - /// - private static Control RootVisual - { - get - { - return Application.Current == null ? null : (Application.Current.RootVisual as Control); - } - } - - #endregion private static Control RootVisual - - #region public object Title - - /// - /// Gets or sets the title that is displayed in the frame of the - /// . - /// - /// - /// The title displayed at the top of the window. The default is null. - /// - public object Title - { - get { return GetValue(TitleProperty); } - set { SetValue(TitleProperty, value); } - } - - /// - /// Identifies the - /// - /// dependency property. - /// - /// - /// The identifier for the - /// - /// dependency property. - /// - public static readonly DependencyProperty TitleProperty = - DependencyProperty.Register( - "Title", - typeof(object), - typeof(FloatableWindow), - null); - - #endregion public object Title - - #endregion Static Fields and Constants - - #region Member Fields - /// - /// Set in the overloaded Show method. Offsets the Popup vertically from the top left corner of the browser window by this amount. - /// - private double _verticalOffset; - - /// - /// Set in the overloaded Show method. Offsets the Popup horizontally from the top left corner of the browser window by this amount. - /// - private double _horizontalOffset; - - /// - /// Private accessor for the Resizer. - /// - private FrameworkElement _resizer; - - /// - /// Private accessor for the IsModal - /// - [DefaultValue(false)] - private bool _modal; - - /// - /// Private accessor for the Chrome. - /// - private FrameworkElement _chrome; - - /// - /// Private accessor for the click point on the chrome. - /// - private Point _clickPoint; - - /// - /// Private accessor for the Closing storyboard. - /// - private Storyboard _closed; - - /// - /// Private accessor for the ContentPresenter. - /// - private FrameworkElement _contentPresenter; - - /// - /// Private accessor for the translate transform that needs to be applied on to the ContentRoot. - /// - private TranslateTransform _contentRootTransform; - - /// - /// Content area desired width. - /// - private double _desiredContentWidth; - - /// - /// Content area desired height. - /// - private double _desiredContentHeight; - - /// - /// Desired margin for the window. - /// - private Thickness _desiredMargin; - - /// - /// Private accessor for the Dialog Result property. - /// - private bool? _dialogresult; - - /// - /// Private accessor for the FloatableWindow InteractionState. - /// - private WindowInteractionState _interactionState; - - /// - /// Boolean value that specifies whether the application is exit or not. - /// - private bool _isAppExit; - - /// - /// Boolean value that specifies whether the window is in closing state or not. - /// - private bool _isClosing; - - /// - /// Boolean value that specifies whether the window is opened. - /// - private bool _isOpen; - - /// - /// Private accessor for the Opening storyboard. - /// - private Storyboard _opened; - - /// - /// Boolean value that specifies whether the mouse is captured or not. - /// - private bool _isMouseCaptured; - - /// - /// Private accessor for the Root of the window. - /// - private FrameworkElement _root; - - /// - /// Private accessor for the position of the window with respect to RootVisual. - /// - private Point _windowPosition; - - private static int z; - - #endregion Member Fields - - #region Constructors - - /// - /// Initializes a new instance of the - /// class. - /// - public FloatableWindow() - { - this.DefaultStyleKey = typeof(FloatableWindow); - this.InteractionState = WindowInteractionState.NotResponding; - } - - #endregion Constructors - - #region Events - - /// - /// Occurs when the - /// is closed. - /// - public event EventHandler Closed; - - /// - /// Occurs when the - /// is closing. - /// - public event EventHandler Closing; - - #endregion Events - - #region Properties - - private Panel _parentLayoutRoot; - public Panel ParentLayoutRoot - { - get { return _parentLayoutRoot; } - set { _parentLayoutRoot = value; } - } - - /// - /// Gets the internal accessor for the ContentRoot of the window. - /// - internal FrameworkElement ContentRoot - { - get; - private set; - } - - /// - /// Setting for the horizontal positioning offset for start position - /// - public double HorizontalOffset - { - get { return _horizontalOffset; } - set { _horizontalOffset = value; } - } - - /// - /// Setting for the vertical positioning offset for start position - /// - public double VerticalOffset - { - get { return _verticalOffset; } - set { _verticalOffset = value; } - } - - /// - /// Gets the internal accessor for the modal of the window. - /// - public bool IsModal - { - get - { - return _modal; - } - } - - /// - /// Gets or sets a value indicating whether the - /// was accepted or - /// canceled. - /// - /// - /// True if the child window was accepted; false if the child window was - /// canceled. The default is null. - /// - [TypeConverter(typeof(NullableBoolConverter))] - public bool? DialogResult - { - get - { - return this._dialogresult; - } - - set - { - if (this._dialogresult != value) - { - this._dialogresult = value; - this.Close(); - } - } - } - - /// - /// Gets the internal accessor for the PopUp of the window. - /// - internal Popup ChildWindowPopup - { - get; - private set; - } - - /// - /// Gets the internal accessor for the close button of the window. - /// - internal ButtonBase CloseButton - { - get; - private set; - } - - /// - /// Gets the InteractionState for the FloatableWindow. - /// - internal WindowInteractionState InteractionState - { - get - { - return this._interactionState; - } - private set - { - if (this._interactionState != value) - { - WindowInteractionState oldValue = this._interactionState; - this._interactionState = value; - FloatableWindowAutomationPeer peer = FloatableWindowAutomationPeer.FromElement(this) as FloatableWindowAutomationPeer; - - if (peer != null) - { - peer.RaiseInteractionStatePropertyChangedEvent(oldValue, this._interactionState); - } - } - } - } - - /// - /// Gets a value indicating whether the PopUp is open or not. - /// - private bool IsOpen - { - get - { - return (this.ChildWindowPopup != null && this.ChildWindowPopup.IsOpen) || - ((ParentLayoutRoot != null) && (ParentLayoutRoot.Children.Contains(this))); - } - } - - /// - /// Gets the internal accessor for the overlay of the window. - /// - internal Panel Overlay - { - get; - private set; - } - - #endregion Properties - - #region Static Methods - - /// - /// Inverts the input matrix. - /// - /// The matrix values that is to be inverted. - /// Returns a value indicating whether the inversion was successful or not. - private static bool InvertMatrix(ref Matrix matrix) - { - double determinant = (matrix.M11 * matrix.M22) - (matrix.M12 * matrix.M21); - - if (determinant == 0.0) - { - return false; - } - - Matrix matCopy = matrix; - matrix.M11 = matCopy.M22 / determinant; - matrix.M12 = -1 * matCopy.M12 / determinant; - matrix.M21 = -1 * matCopy.M21 / determinant; - matrix.M22 = matCopy.M11 / determinant; - matrix.OffsetX = ((matCopy.OffsetY * matCopy.M21) - (matCopy.OffsetX * matCopy.M22)) / determinant; - matrix.OffsetY = ((matCopy.OffsetX * matCopy.M12) - (matCopy.OffsetY * matCopy.M11)) / determinant; - - return true; - } - - #endregion Static Methods - - #region Methods - - /// - /// Executed when the application is exited. - /// - /// The sender. - /// Event args. - internal void Application_Exit(object sender, EventArgs e) - { - if (this.IsOpen) - { - this._isAppExit = true; - try - { - this.Close(); - } - finally - { - this._isAppExit = false; - } - } - } - - /// - /// Executed when focus is given to the window via a click. Attempts to bring current - /// window to the front in the event there are more windows. - /// - internal void BringToFront() - { - z++; - Canvas.SetZIndex(this, z); -#if DEBUG - this.Title = z.ToString(); -#endif - } - - /// - /// Changes the visual state of the FloatableWindow. - /// - private void ChangeVisualState() - { - if (this._isClosing) - { - VisualStateManager.GoToState(this, VSMSTATE_StateClosed, true); - } - else - { - VisualStateManager.GoToState(this, VSMSTATE_StateOpen, true); - BringToFront(); - } - } - - /// - /// Executed when FloatableWindow size is changed. - /// - /// Sender object. - /// Size changed event args. - private void ChildWindow_SizeChanged(object sender, SizeChangedEventArgs e) - { - if (_modal) - { - if (this.Overlay != null) - { - if (e.NewSize.Height != this.Overlay.Height) - { - this._desiredContentHeight = e.NewSize.Height; - } - - if (e.NewSize.Width != this.Overlay.Width) - { - this._desiredContentWidth = e.NewSize.Width; - } - } - - if (this.IsOpen) - { - this.UpdateOverlaySize(); - } - } - } - - /// - /// Closes a . - /// - public void Close() - { - // AutomationPeer returns "Closing" when Close() is called - // but the window is not closed completely: - this.InteractionState = WindowInteractionState.Closing; - CancelEventArgs e = new CancelEventArgs(); - this.OnClosing(e); - - // On ApplicationExit, close() cannot be cancelled - if (!e.Cancel || this._isAppExit) - { - if (RootVisual != null) - { - RootVisual.IsEnabled = true; - } - - // Close Popup - if (this.IsOpen) - { - if (this._closed != null) - { - // Popup will be closed when the storyboard ends - this._isClosing = true; - try - { - var sb = GetVisualStateStoryboard("WindowStates", "Closed"); - sb.Completed += (s, args) => - { - this.ParentLayoutRoot.Children.Remove(this); - this.OnClosed(EventArgs.Empty); - this.UnSubscribeFromEvents(); - this.UnsubscribeFromTemplatePartEvents(); - - if (Application.Current.RootVisual != null) - { - Application.Current.RootVisual.GotFocus -= new RoutedEventHandler(this.RootVisual_GotFocus); - } - }; - this.ChangeVisualState(); - } - finally - { - this._isClosing = false; - } - } - else - { - // If no closing storyboard is defined, close the Popup - this.ChildWindowPopup.IsOpen = false; - } - - if (!this._dialogresult.HasValue) - { - // If close action is not happening because of DialogResult property change action, - // Dialogresult is always false: - this._dialogresult = false; - } - - //this.OnClosed(EventArgs.Empty); - //this.UnSubscribeFromEvents(); - //this.UnsubscribeFromTemplatePartEvents(); - - //if (Application.Current.RootVisual != null) - //{ - // Application.Current.RootVisual.GotFocus -= new RoutedEventHandler(this.RootVisual_GotFocus); - //} - } - } - else - { - // If the Close is cancelled, DialogResult should always be NULL: - this._dialogresult = null; - this.InteractionState = WindowInteractionState.Running; - } - } - - /// - /// Brings the window to the front of others - /// - /// - /// - internal void ContentRoot_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) - { - BringToFront(); - } - - /// - /// Executed when the CloseButton is clicked. - /// - /// Sender object. - /// Routed event args. - internal void CloseButton_Click(object sender, RoutedEventArgs e) - { - this.Close(); - } - - /// - /// Executed when the Closing storyboard ends. - /// - /// Sender object. - /// Event args. - private void Closing_Completed(object sender, EventArgs e) - { - if (this.ChildWindowPopup != null) - { - this.ChildWindowPopup.IsOpen = false; - } - - // AutomationPeer returns "NotResponding" when the FloatableWindow is closed: - this.InteractionState = WindowInteractionState.NotResponding; - - if (this._closed != null) - { - this._closed.Completed -= new EventHandler(this.Closing_Completed); - } - } - - /// - /// Executed when the a key is presses when the window is open. - /// - /// Sender object. - /// Key event args. - private void ChildWindow_KeyDown(object sender, KeyEventArgs e) - { - FloatableWindow ew = sender as FloatableWindow; - Debug.Assert(ew != null, "FloatableWindow instance is null."); - - // Ctrl+Shift+F4 closes the FloatableWindow - if (e != null && !e.Handled && e.Key == Key.F4 && - ((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control) && - ((Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift)) - { - ew.Close(); - e.Handled = true; - } - } - - /// - /// Executed when the window loses focus. - /// - /// Sender object. - /// Routed event args. - private void ChildWindow_LostFocus(object sender, RoutedEventArgs e) - { - // If the FloatableWindow loses focus but the popup is still open, - // it means another popup is opened. To get the focus back when the - // popup is closed, we handle GotFocus on the RootVisual - // TODO: Something else could get focus and handle the GotFocus event right. - // Try listening to routed events that were Handled (new SL 3 feature) - // Blocked by Jolt bug #29419 - if (this.IsOpen && Application.Current != null && Application.Current.RootVisual != null) - { - this.InteractionState = WindowInteractionState.BlockedByModalWindow; - Application.Current.RootVisual.GotFocus += new RoutedEventHandler(this.RootVisual_GotFocus); - } - } - - /// - /// Executed when mouse left button is down on the chrome. - /// - /// Sender object. - /// Mouse button event args. - private void Chrome_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) - { - if (this._chrome != null) - { - e.Handled = true; - - if (this.CloseButton != null && !this.CloseButton.IsTabStop) - { - this.CloseButton.IsTabStop = true; - try - { - this.Focus(); - } - finally - { - this.CloseButton.IsTabStop = false; - } - } - else - { - this.Focus(); - } - this._chrome.CaptureMouse(); - this._isMouseCaptured = true; - this._clickPoint = e.GetPosition(sender as UIElement); -#if DEBUG - this.Title = string.Format("X:{0},Y:{1}", this._clickPoint.X.ToString(), this._clickPoint.Y.ToString()); -#endif - } - } - - /// - /// Executed when mouse left button is up on the chrome. - /// - /// Sender object. - /// Mouse button event args. - private void Chrome_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) - { - if (this._chrome != null) - { - //e.Handled = true; - this._chrome.ReleaseMouseCapture(); - this._isMouseCaptured = false; - } - } - - /// - /// Executed when mouse moves on the chrome. - /// - /// Sender object. - /// Mouse event args. - private void Chrome_MouseMove(object sender, MouseEventArgs e) - { - #region New ChildWindow Code not working - //if (this._isMouseCaptured && this.ContentRoot != null && Application.Current != null && Application.Current.RootVisual != null) - //{ - // Point position = e.GetPosition(Application.Current.RootVisual); - - // GeneralTransform gt = this.ContentRoot.TransformToVisual(Application.Current.RootVisual); - - // if (gt != null) - // { - // Point p = gt.Transform(this._clickPoint); - // this._windowPosition = gt.Transform(new Point(0, 0)); - - // if (position.X < 0) - // { - // double Y = FindPositionY(p, position, 0); - // position = new Point(0, Y); - // } - - // if (position.X > this.Width) - // { - // double Y = FindPositionY(p, position, this.Width); - // position = new Point(this.Width, Y); - // } - - // if (position.Y < 0) - // { - // double X = FindPositionX(p, position, 0); - // position = new Point(X, 0); - // } - - // if (position.Y > this.Height) - // { - // double X = FindPositionX(p, position, this.Height); - // position = new Point(X, this.Height); - // } - - // double x = position.X - p.X; - // double y = position.Y - p.Y; - // UpdateContentRootTransform(x, y); - // } - //} - #endregion - if (this._isMouseCaptured && this.ContentRoot != null) - { - // If the child window is dragged out of the page, return - if (Application.Current != null && Application.Current.RootVisual != null && - (e.GetPosition(Application.Current.RootVisual).X < 0 || e.GetPosition(Application.Current.RootVisual).Y < 0)) - { - return; - } - - TransformGroup transformGroup = this.ContentRoot.RenderTransform as TransformGroup; - - if (transformGroup == null) - { - transformGroup = new TransformGroup(); - transformGroup.Children.Add(this.ContentRoot.RenderTransform); - } - - TranslateTransform t = new TranslateTransform(); - t.X = e.GetPosition(this.ContentRoot).X - this._clickPoint.X; - t.Y = e.GetPosition(this.ContentRoot).Y - this._clickPoint.Y; - if (transformGroup != null) - { - transformGroup.Children.Add(t); - this.ContentRoot.RenderTransform = transformGroup; - } - } - } - - /// - /// Finds the X coordinate of a point that is defined by a line. - /// - /// Starting point of the line. - /// Ending point of the line. - /// Y coordinate of the point. - /// X coordinate of the point. - private static double FindPositionX(Point p1, Point p2, double y) - { - if (y == p1.Y || p1.X == p2.X) - { - return p2.X; - } - - Debug.Assert(p1.Y != p2.Y, "Unexpected equal Y coordinates"); - - return (((y - p1.Y) * (p1.X - p2.X)) / (p1.Y - p2.Y)) + p1.X; - } - - /// - /// Finds the Y coordinate of a point that is defined by a line. - /// - /// Starting point of the line. - /// Ending point of the line. - /// X coordinate of the point. - /// Y coordinate of the point. - private static double FindPositionY(Point p1, Point p2, double x) - { - if (p1.Y == p2.Y || x == p1.X) - { - return p2.Y; - } - - Debug.Assert(p1.X != p2.X, "Unexpected equal X coordinates"); - - return (((p1.Y - p2.Y) * (x - p1.X)) / (p1.X - p2.X)) + p1.Y; - } - - /// - /// Builds the visual tree for the - /// control when a - /// new template is applied. - /// - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity", Justification = "No need to split the code into two parts.")] - public override void OnApplyTemplate() - { - this.UnsubscribeFromTemplatePartEvents(); - - base.OnApplyTemplate(); - - this.CloseButton = GetTemplateChild(PART_CloseButton) as ButtonBase; - - if (this.CloseButton != null) - { - if (this.HasCloseButton) - { - this.CloseButton.Visibility = Visibility.Visible; - } - else - { - this.CloseButton.Visibility = Visibility.Collapsed; - } - } - - if (this._closed != null) - { - this._closed.Completed -= new EventHandler(this.Closing_Completed); - } - - if (this._opened != null) - { - this._opened.Completed -= new EventHandler(this.Opening_Completed); - } - - this._root = GetTemplateChild(PART_Root) as FrameworkElement; - - if (this._root != null) - { - IList groups = VisualStateManager.GetVisualStateGroups(this._root); - - if (groups != null) - { - IList states = null; - - foreach (VisualStateGroup vsg in groups) - { - if (vsg.Name == FloatableWindow.VSMGROUP_Window) - { - states = vsg.States; - break; - } - } - - if (states != null) - { - foreach (VisualState state in states) - { - if (state.Name == FloatableWindow.VSMSTATE_StateClosed) - { - this._closed = state.Storyboard; - } - - if (state.Name == FloatableWindow.VSMSTATE_StateOpen) - { - this._opened = state.Storyboard; - } - } - } - } - //TODO: Figure out why I can't wire up the event below in SubscribeToTemplatePartEvents - this._root.MouseLeftButtonDown += new MouseButtonEventHandler(this.ContentRoot_MouseLeftButtonDown); - } - - this.ContentRoot = GetTemplateChild(PART_ContentRoot) as FrameworkElement; - - this._chrome = GetTemplateChild(PART_Chrome) as FrameworkElement; - - this.Overlay = GetTemplateChild(PART_Overlay) as Panel; - - this._contentPresenter = GetTemplateChild(PART_ContentPresenter) as FrameworkElement; - - this.SubscribeToTemplatePartEvents(); - this.SubscribeToStoryBoardEvents(); - this._desiredMargin = this.Margin; - this.Margin = new Thickness(0); - - // Update overlay size - if (this.IsOpen && (this.ChildWindowPopup != null)) - { - this._desiredContentHeight = this.Height; - this._desiredContentWidth = this.Width; - this.UpdateOverlaySize(); - this.UpdateRenderTransform(); - this.ChangeVisualState(); - } - } - - - /// - /// Raises the - /// event. - /// - /// The event data. - protected virtual void OnClosed(EventArgs e) - { - EventHandler handler = this.Closed; - - if (null != handler) - { - handler(this, e); - } - - this._isOpen = false; - if (!_modal) - { - this.ParentLayoutRoot.Children.Remove(this); - } - } - - /// - /// Raises the - /// event. - /// - /// The event data. - protected virtual void OnClosing(CancelEventArgs e) - { - EventHandler handler = this.Closing; - - if (null != handler) - { - handler(this, e); - } - } - - /// - /// Returns a - /// - /// for use by the Silverlight automation infrastructure. - /// - /// - /// - /// for the object. - /// - protected override AutomationPeer OnCreateAutomationPeer() - { - return new FloatableWindowAutomationPeer(this); - } - - /// - /// This method is called every time a - /// is displayed. - /// - protected virtual void OnOpened() - { - this.UpdatePosition(); - this._isOpen = true; - - if (this.Overlay != null) - { - this.Overlay.Opacity = this.OverlayOpacity; - this.Overlay.Background = this.OverlayBrush; - } - - if (!this.Focus()) - { - // If the Focus() fails it means there is no focusable element in the - // FloatableWindow. In this case we set IsTabStop to true to have the keyboard functionality - this.IsTabStop = true; - this.Focus(); - } - } - - /// - /// Executed when the opening storyboard finishes. - /// - /// Sender object. - /// Event args. - private void Opening_Completed(object sender, EventArgs e) - { - if (this._opened != null) - { - this._opened.Completed -= new EventHandler(this.Opening_Completed); - } - // AutomationPeer returns "ReadyForUserInteraction" when the FloatableWindow - // is open and all animations have been completed. - this.InteractionState = WindowInteractionState.ReadyForUserInteraction; - this.OnOpened(); - } - - /// - /// Executed when the page resizes. - /// - /// Sender object. - /// Event args. - private void Page_Resized(object sender, EventArgs e) - { - if (this.ChildWindowPopup != null) - { - this.UpdateOverlaySize(); - } - } - - /// - /// Executed when the root visual gets focus. - /// - /// Sender object. - /// Routed event args. - private void RootVisual_GotFocus(object sender, RoutedEventArgs e) - { - this.Focus(); - this.InteractionState = WindowInteractionState.ReadyForUserInteraction; - } - - public void Show() - { - ShowWindow(false); - } - - public void ShowDialog() - { - _verticalOffset = 0; - _horizontalOffset = 0; - ShowWindow(true); - } - - public void Show(double horizontalOffset, double verticalOffset) - { - _horizontalOffset = horizontalOffset; - _verticalOffset = verticalOffset; - ShowWindow(false); - } - - /// - /// Opens a and - /// returns without waiting for the - /// to close. - /// - /// - /// The child window is already in the visual tree. - /// - internal void ShowWindow(bool isModal) - { - _modal = isModal; - - // AutomationPeer returns "Running" when Show() is called - // but the FloatableWindow is not ready for user interaction: - this.InteractionState = WindowInteractionState.Running; - - this.SubscribeToEvents(); - this.SubscribeToTemplatePartEvents(); - this.SubscribeToStoryBoardEvents(); - - - // MaxHeight and MinHeight properties should not be overwritten: - this.MaxHeight = double.PositiveInfinity; - this.MaxWidth = double.PositiveInfinity; - - if (_modal) - { - if (this.ChildWindowPopup == null) - { - this.ChildWindowPopup = new Popup(); - - try - { - this.ChildWindowPopup.Child = this; - } - catch (ArgumentException) - { - // If the FloatableWindow is already in the visualtree, we cannot set it to be the child of the popup - // we are throwing a friendlier exception for this case: - this.InteractionState = WindowInteractionState.NotResponding; - throw new InvalidOperationException(Properties.Resources.ChildWindow_InvalidOperation); - } - } - - if (this.ChildWindowPopup != null && Application.Current.RootVisual != null) - { - this.ChildWindowPopup.IsOpen = true; - - this.ChildWindowPopup.HorizontalOffset = _horizontalOffset; - this.ChildWindowPopup.VerticalOffset = _verticalOffset; - - // while the FloatableWindow is open, the DialogResult is always NULL: - this._dialogresult = null; - } - } - else - { - if (ParentLayoutRoot != null) - { - this.SetValue(Canvas.TopProperty, _verticalOffset); - this.SetValue(Canvas.LeftProperty, _horizontalOffset); - this.ParentLayoutRoot.Children.Add(this); - this.BringToFront(); - } - else - { - throw new ArgumentNullException("ParentLayoutRoot", "You need to specify a root Panel element to add the window elements to."); - } - } - - // disable the underlying UI - if (RootVisual != null && _modal) - { - RootVisual.IsEnabled = false; - } - - // if the template is already loaded, display loading visuals animation - if (this.ContentRoot == null) - { - this.Loaded += (s, args) => - { - if (this.ContentRoot != null) - { - this.ChangeVisualState(); - } - }; - } - else - { - this.ChangeVisualState(); - } - } - - /// - /// Subscribes to events when the FloatableWindow is opened. - /// - private void SubscribeToEvents() - { - if (Application.Current != null && Application.Current.Host != null && Application.Current.Host.Content != null) - { - Application.Current.Exit += new EventHandler(this.Application_Exit); - Application.Current.Host.Content.Resized += new EventHandler(this.Page_Resized); - } - - this.KeyDown += new KeyEventHandler(this.ChildWindow_KeyDown); - if (_modal) - { - this.LostFocus += new RoutedEventHandler(this.ChildWindow_LostFocus); - } - this.SizeChanged += new SizeChangedEventHandler(this.ChildWindow_SizeChanged); - } - - /// - /// Subscribes to events that are on the storyboards. - /// Unsubscribing from these events happen in the event handlers individually. - /// - private void SubscribeToStoryBoardEvents() - { - if (this._closed != null) - { - this._closed.Completed += new EventHandler(this.Closing_Completed); - } - - if (this._opened != null) - { - this._opened.Completed += new EventHandler(this.Opening_Completed); - } - } - - /// - /// Subscribes to events on the template parts. - /// - private void SubscribeToTemplatePartEvents() - { - if (this.CloseButton != null) - { - this.CloseButton.Click += new RoutedEventHandler(this.CloseButton_Click); - } - - if (this._chrome != null) - { - this._chrome.MouseLeftButtonDown += new MouseButtonEventHandler(this.Chrome_MouseLeftButtonDown); - this._chrome.MouseLeftButtonUp += new MouseButtonEventHandler(this.Chrome_MouseLeftButtonUp); - this._chrome.MouseMove += new MouseEventHandler(this.Chrome_MouseMove); - } - - } - - /// - /// Unsubscribe from events when the FloatableWindow is closed. - /// - private void UnSubscribeFromEvents() - { - if (Application.Current != null && Application.Current.Host != null && Application.Current.Host.Content != null) - { - Application.Current.Exit -= new EventHandler(this.Application_Exit); - Application.Current.Host.Content.Resized -= new EventHandler(this.Page_Resized); - } - - this.KeyDown -= new KeyEventHandler(this.ChildWindow_KeyDown); - if (_modal) - { - this.LostFocus -= new RoutedEventHandler(this.ChildWindow_LostFocus); - } - this.SizeChanged -= new SizeChangedEventHandler(this.ChildWindow_SizeChanged); - } - - /// - /// Unsubscribe from the events that are subscribed on the template part elements. - /// - private void UnsubscribeFromTemplatePartEvents() - { - if (this.CloseButton != null) - { - this.CloseButton.Click -= new RoutedEventHandler(this.CloseButton_Click); - } - - if (this._chrome != null) - { - this._chrome.MouseLeftButtonDown -= new MouseButtonEventHandler(this.Chrome_MouseLeftButtonDown); - this._chrome.MouseLeftButtonUp -= new MouseButtonEventHandler(this.Chrome_MouseLeftButtonUp); - this._chrome.MouseMove -= new MouseEventHandler(this.Chrome_MouseMove); - } - } - - /// - /// Updates the size of the overlay of the window. - /// - private void UpdateOverlaySize() - { - if (_modal) - { - if (this.Overlay != null && Application.Current != null && Application.Current.Host != null && Application.Current.Host.Content != null) - { - this.Height = Application.Current.Host.Content.ActualHeight; - this.Width = Application.Current.Host.Content.ActualWidth; - this.Overlay.Height = this.Height; - this.Overlay.Width = this.Width; - - if (this.ContentRoot != null) - { - this.ContentRoot.Width = this._desiredContentWidth; - this.ContentRoot.Height = this._desiredContentHeight; - this.ContentRoot.Margin = this._desiredMargin; - } - } - } - else - { - if (this.Overlay != null) - { - this.Overlay.Visibility = Visibility.Collapsed; - } - } - } - - /// - /// Updates the position of the window in case the size of the content changes. - /// This allows FloatableWindow only scale from right and bottom. - /// - private void UpdatePosition() - { - if (this.ContentRoot != null && Application.Current != null && Application.Current.RootVisual != null) - { - GeneralTransform gt = this.ContentRoot.TransformToVisual(Application.Current.RootVisual); - - if (gt != null) - { - this._windowPosition = gt.Transform(new Point(0, 0)); - } - } - } - - /// - /// Updates the render transform applied on the overlay. - /// - private void UpdateRenderTransform() - { - if (this._root != null && this.ContentRoot != null) - { - // The Overlay part should not be affected by the render transform applied on the - // FloatableWindow. In order to achieve this, we adjust an identity matrix to represent - // the _root's transformation, invert it, apply the inverted matrix on the _root, so that - // nothing is affected by the rendertransform, and apply the original transform only on the Content - GeneralTransform gt = this._root.TransformToVisual(null); - if (gt != null) - { - Point p10 = new Point(1, 0); - Point p01 = new Point(0, 1); - Point transform10 = gt.Transform(p10); - Point transform01 = gt.Transform(p01); - - Matrix transformToRootMatrix = Matrix.Identity; - transformToRootMatrix.M11 = transform10.X; - transformToRootMatrix.M12 = transform10.Y; - transformToRootMatrix.M21 = transform01.X; - transformToRootMatrix.M22 = transform01.Y; - - MatrixTransform original = new MatrixTransform(); - original.Matrix = transformToRootMatrix; - - InvertMatrix(ref transformToRootMatrix); - MatrixTransform mt = new MatrixTransform(); - mt.Matrix = transformToRootMatrix; - - TransformGroup tg = this._root.RenderTransform as TransformGroup; - - if (tg != null) - { - tg.Children.Add(mt); - } - else - { - this._root.RenderTransform = mt; - } - - tg = this.ContentRoot.RenderTransform as TransformGroup; - - if (tg != null) - { - tg.Children.Add(original); - } - else - { - this.ContentRoot.RenderTransform = original; - } - } - } - } - - /// - /// Updates the ContentRootTranslateTransform. - /// - /// X coordinate of the transform. - /// Y coordinate of the transform. - private void UpdateContentRootTransform(double X, double Y) - { - if (this._contentRootTransform == null) - { - this._contentRootTransform = new TranslateTransform(); - this._contentRootTransform.X = X; - this._contentRootTransform.Y = Y; - - TransformGroup transformGroup = this.ContentRoot.RenderTransform as TransformGroup; - - if (transformGroup == null) - { - transformGroup = new TransformGroup(); - transformGroup.Children.Add(this.ContentRoot.RenderTransform); - } - transformGroup.Children.Add(this._contentRootTransform); - this.ContentRoot.RenderTransform = transformGroup; - } - else - { - this._contentRootTransform.X += X; - this._contentRootTransform.Y += Y; - } - } - - private void Resizer_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e) - { - this._resizer.CaptureMouse(); - this._isMouseCaptured = true; - this._clickPoint = e.GetPosition(sender as UIElement); - -#if DEBUG - this.Title = string.Format("X:{0},Y:{1}", this._clickPoint.X.ToString(), this._clickPoint.Y.ToString()); -#endif - } - - private void Resizer_MouseLeftButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e) - { - this._resizer.ReleaseMouseCapture(); - this._isMouseCaptured = false; - this._resizer.Opacity = 0.25; - } - - private void Resizer_MouseMove(object sender, System.Windows.Input.MouseEventArgs e) - { - if (this._isMouseCaptured && this.ContentRoot != null) - { - // If the child window is dragged out of the page, return - if (Application.Current != null && Application.Current.RootVisual != null && - (e.GetPosition(Application.Current.RootVisual).X < 0 || e.GetPosition(Application.Current.RootVisual).Y < 0)) - { - return; - } - -#if DEBUG - this.Title = string.Format("X:{0},Y:{1}", this._clickPoint.X.ToString(), this._clickPoint.Y.ToString()); -#endif - - Point p = e.GetPosition(this.ContentRoot); - - if ((p.X > this._clickPoint.X) && (p.Y > this._clickPoint.Y)) - { - this.Width = (double)(p.X - (12 - this._clickPoint.X)); - this.Height = (double)(p.Y - (12 - this._clickPoint.Y)); - } - } - } - - private Storyboard GetVisualStateStoryboard(string visualStateGroupName, string visualStateName) - { - foreach (VisualStateGroup g in VisualStateManager.GetVisualStateGroups((FrameworkElement)this.ContentRoot.Parent)) - { - if (g.Name != visualStateGroupName) continue; - foreach (VisualState s in g.States) - { - if (s.Name != visualStateName) continue; - return s.Storyboard; - } - } - return null; - } - - #endregion Methods - } -} \ No newline at end of file diff -r 5172a9b9800c -r 62889c14148e SilverlightGlimpse/FloatableWindow/FloatableWindow.csproj --- a/SilverlightGlimpse/FloatableWindow/FloatableWindow.csproj Mon Apr 23 23:07:23 2012 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,107 +0,0 @@ - - - - v3.5 - - - Debug - AnyCPU - 9.0.30729 - 2.0 - {D47E6045-91BB-4CD0-942F-FF015F10F7F2} - {A1591282-1198-4647-A2B1-27E5FF5F6F3B};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} - Library - Properties - FloatableWindow - FloatableWindow - v5.0 - false - true - true - false - - - - - - - - - - - Silverlight - $(TargetFrameworkVersion) - - - - - 4.0 - - - true - full - false - Bin\Debug - DEBUG;TRACE;SILVERLIGHT - true - true - prompt - 4 - true - AllRules.ruleset - - - pdbonly - true - Bin\Release - TRACE;SILVERLIGHT - true - true - prompt - 4 - AllRules.ruleset - - - - - - - - - - - - - - - - - - - Designer - MSBuild:MarkupCompilePass1 - MSBuild:Compile - Designer - MSBuild:Compile - Designer - - - - - - - - - - - - - - - \ No newline at end of file diff -r 5172a9b9800c -r 62889c14148e SilverlightGlimpse/FloatableWindow/FloatableWindow.sln --- a/SilverlightGlimpse/FloatableWindow/FloatableWindow.sln Mon Apr 23 23:07:23 2012 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FloatableWindow", "FloatableWindow.csproj", "{D47E6045-91BB-4CD0-942F-FF015F10F7F2}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {D47E6045-91BB-4CD0-942F-FF015F10F7F2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D47E6045-91BB-4CD0-942F-FF015F10F7F2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D47E6045-91BB-4CD0-942F-FF015F10F7F2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D47E6045-91BB-4CD0-942F-FF015F10F7F2}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff -r 5172a9b9800c -r 62889c14148e SilverlightGlimpse/FloatableWindow/FloatableWindowAutomationPeer.cs --- a/SilverlightGlimpse/FloatableWindow/FloatableWindowAutomationPeer.cs Mon Apr 23 23:07:23 2012 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,414 +0,0 @@ -// (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 -{ - public class FloatableWindowAutomationPeer : FrameworkElementAutomationPeer, IWindowProvider, ITransformProvider - { - #region Data - - /// - /// Specifies whether the FloatableWindow is the top most element. - /// - private bool _isTopMost; - - #endregion Data - - #region Properties - - /// - /// Gets or sets a value indicating whether the FloatableWindow is the top most element. - /// - private bool IsTopMostPrivate - { - get - { - return this._isTopMost; - } - set - { - if (this._isTopMost != value) - { - this._isTopMost = value; - this.RaisePropertyChangedEvent(WindowPatternIdentifiers.IsTopmostProperty, !this._isTopMost, this._isTopMost); - } - } - } - - /// - /// Gets the owning FloatableWindow. - /// - private FloatableWindow OwningFloatableWindow - { - get - { - return (FloatableWindow)Owner; - } - } - - #endregion Properties - - public FloatableWindowAutomationPeer(FloatableWindow owner) - : base(owner) - { - if (owner == null) - { - throw new ArgumentNullException("owner"); - } - this.RefreshIsTopMostProperty(); - } - - #region AutomationPeer overrides - - /// - /// Gets the control pattern for this - /// . - /// - /// - /// One of the enumeration values. - /// - /// - /// The object that implements the pattern interface, or null if the - /// specified pattern interface is not implemented by this peer. - /// - public override object GetPattern(PatternInterface patternInterface) - { - if (patternInterface == PatternInterface.Transform || patternInterface == PatternInterface.Window) - { - return this; - } - - return base.GetPattern(patternInterface); - } - - /// - /// Gets the - /// - /// for the element associated with this - /// . - /// Called by - /// . - /// - /// A value of the enumeration. - protected override AutomationControlType GetAutomationControlTypeCore() - { - return AutomationControlType.Window; - } - - /// - /// Gets the name of the class for the object associated with this - /// . - /// Called by - /// . - /// - /// - /// A string value that represents the type of the child window. - /// - protected override string GetClassNameCore() - { - return this.Owner.GetType().Name; - } - - /// - /// Gets the text label of the - /// that is - /// associated with this - /// . - /// Called by - /// . - /// - /// - /// The text label of the element that is associated with this - /// automation peer. - /// - 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 - - /// - /// Gets the interaction state of the window. - /// - /// - /// The interaction state of the control, as a value of the enumeration. - /// - WindowInteractionState IWindowProvider.InteractionState - { - get - { - return this.OwningFloatableWindow.InteractionState; - } - } - - /// - /// Gets a value indicating whether the window is modal. - /// - /// - /// True in all cases. - /// - bool IWindowProvider.IsModal - { - get { return true; } - } - - /// - /// Gets a value indicating whether the window is the topmost - /// element in the z-order of layout. - /// - /// - /// True if the window is topmost; otherwise, false. - /// - bool IWindowProvider.IsTopmost - { - get - { - return this.IsTopMostPrivate; - } - } - - /// - /// Gets a value indicating whether the window can be maximized. - /// - /// False in all cases. - bool IWindowProvider.Maximizable - { - get { return false; } - } - - /// - /// Gets a value indicating whether the window can be minimized. - /// - /// False in all cases. - bool IWindowProvider.Minimizable - { - get { return false; } - } - - /// - /// Gets the visual state of the window. - /// - /// - /// - /// in all cases. - /// - WindowVisualState IWindowProvider.VisualState - { - get - { - return WindowVisualState.Normal; - } - } - - /// - /// Closes the window. - /// - void IWindowProvider.Close() - { - this.OwningFloatableWindow.Close(); - } - - /// - /// Changes the visual state of the window (such as minimizing or - /// maximizing it). - /// - /// - /// The visual state of the window to change to, as a value of the - /// enumeration. - /// - void IWindowProvider.SetVisualState(WindowVisualState state) - { - } - - /// - /// Blocks the calling code for the specified time or until the - /// associated process enters an idle state, whichever completes first. - /// - /// - /// The amount of time, in milliseconds, to wait for the associated - /// process to become idle. - /// - /// - /// True if the window has entered the idle state; false if the timeout - /// occurred. - /// - bool IWindowProvider.WaitForInputIdle(int milliseconds) - { - return false; - } - - #endregion IWindowProvider - - #region ITransformProvider - - /// - /// Moves the control. - /// - /// - /// The absolute screen coordinates of the left side of the control. - /// - /// - /// The absolute screen coordinates of the top of the control. - /// - 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; - } - } - } - } - - /// - /// Resizes the control. - /// - /// The new width of the window, in pixels. - /// - /// The new height of the window, in pixels. - /// - void ITransformProvider.Resize(double width, double height) - { - } - - /// - /// Rotates the control. - /// - /// - /// The number of degrees to rotate the control. A positive number - /// rotates the control clockwise. A negative number rotates the - /// control counterclockwise. - /// - void ITransformProvider.Rotate(double degrees) - { - } - - /// - /// Gets a value indicating whether the element can be moved. - /// - /// True in all cases. - bool ITransformProvider.CanMove - { - get { return true; } - } - - /// - /// Gets a value indicating whether the element can be resized. - /// - /// False in all cases. - bool ITransformProvider.CanResize - { - get { return false; } - } - - /// - /// Gets a value indicating whether the element can be rotated. - /// - /// False in all cases. - bool ITransformProvider.CanRotate - { - get { return false; } - } - - #endregion ITransformProvider - - #region Methods - - /// - /// Returns if the FloatableWindow is the top most element. - /// - /// Bool value. - private bool GetIsTopMostCore() - { - return !(this.OwningFloatableWindow.InteractionState == WindowInteractionState.BlockedByModalWindow); - } - - /// - /// Raises PropertyChangedEvent for WindowInteractionStateProperty. - /// - /// Old WindowInteractionStateProperty. - /// New WindowInteractionStateProperty. - internal void RaiseInteractionStatePropertyChangedEvent(WindowInteractionState oldValue, WindowInteractionState newValue) - { - this.RaisePropertyChangedEvent(WindowPatternIdentifiers.WindowInteractionStateProperty, oldValue, newValue); - this.RefreshIsTopMostProperty(); - } - - /// - /// Updates the IsTopMostPrivate property. - /// - private void RefreshIsTopMostProperty() - { - this.IsTopMostPrivate = this.GetIsTopMostCore(); - } - - #endregion Methods - } -} - diff -r 5172a9b9800c -r 62889c14148e SilverlightGlimpse/FloatableWindow/Properties/AssemblyInfo.cs --- a/SilverlightGlimpse/FloatableWindow/Properties/AssemblyInfo.cs Mon Apr 23 23:07:23 2012 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,24 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Resources; -using System; -using System.Windows.Markup; - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("e26dd271-436d-483d-91e2-de61b3ffe0af")] -[assembly: AssemblyTitle("System.Windows.Controls")] -[assembly: AssemblyDescription("FloatableWindow Silverlight Control")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Tim Heuer")] -[assembly: AssemblyProduct("FloatableWindow")] -[assembly: AssemblyCopyright("Licensed under Ms-PL")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] -[assembly: NeutralResourcesLanguage("en-US")] -[assembly: ComVisible(false)] -[assembly: AssemblyVersion("2.0.5.0")] -[assembly: AssemblyFileVersion("3.0.40624.4")] -[assembly: CLSCompliant(true)] -[assembly: XmlnsPrefix("clr-namespace:System.Windows.Controls;assembly=FloatableWindow", "windows")] -[assembly: XmlnsDefinitionAttribute("clr-namespace:System.Windows.Controls;assembly=FloatableWindow", "System.Windows.Controls")] \ No newline at end of file diff -r 5172a9b9800c -r 62889c14148e SilverlightGlimpse/FloatableWindow/Properties/Resources.Designer.cs --- a/SilverlightGlimpse/FloatableWindow/Properties/Resources.Designer.cs Mon Apr 23 23:07:23 2012 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,396 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:2.0.50727.4918 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace System.Windows.Controls.Properties { - using System; - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("System.Windows.Controls.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - - /// - /// Looks up a localized string similar to Cannot perform operation.. - /// - internal static string Automation_OperationCannotBePerformed { - get { - return ResourceManager.GetString("Automation_OperationCannotBePerformed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The SelectedDates collection can be changed only in a multiple selection mode. Use the SelectedDate in a single selection mode.. - /// - internal static string Calendar_CheckSelectionMode_InvalidOperation { - get { - return ResourceManager.GetString("Calendar_CheckSelectionMode_InvalidOperation", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to next button. - /// - internal static string Calendar_NextButtonName { - get { - return ResourceManager.GetString("Calendar_NextButtonName", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to DisplayMode value is not valid.. - /// - internal static string Calendar_OnDisplayModePropertyChanged_InvalidValue { - get { - return ResourceManager.GetString("Calendar_OnDisplayModePropertyChanged_InvalidValue", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to FirstDayOfWeek value is not valid.. - /// - internal static string Calendar_OnFirstDayOfWeekChanged_InvalidValue { - get { - return ResourceManager.GetString("Calendar_OnFirstDayOfWeekChanged_InvalidValue", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The SelectedDate property cannot be set when the selection mode is None.. - /// - internal static string Calendar_OnSelectedDateChanged_InvalidOperation { - get { - return ResourceManager.GetString("Calendar_OnSelectedDateChanged_InvalidOperation", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SelectedDate value is not valid.. - /// - internal static string Calendar_OnSelectedDateChanged_InvalidValue { - get { - return ResourceManager.GetString("Calendar_OnSelectedDateChanged_InvalidValue", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SelectionMode value is not valid.. - /// - internal static string Calendar_OnSelectionModeChanged_InvalidValue { - get { - return ResourceManager.GetString("Calendar_OnSelectionModeChanged_InvalidValue", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to previous button. - /// - internal static string Calendar_PreviousButtonName { - get { - return ResourceManager.GetString("Calendar_PreviousButtonName", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Value is not valid.. - /// - internal static string Calendar_UnSelectableDates { - get { - return ResourceManager.GetString("Calendar_UnSelectableDates", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Blackout Day - {0}. - /// - internal static string CalendarAutomationPeer_BlackoutDayHelpText { - get { - return ResourceManager.GetString("CalendarAutomationPeer_BlackoutDayHelpText", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to calendar button. - /// - internal static string CalendarAutomationPeer_CalendarButtonLocalizedControlType { - get { - return ResourceManager.GetString("CalendarAutomationPeer_CalendarButtonLocalizedControlType", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to day button. - /// - internal static string CalendarAutomationPeer_DayButtonLocalizedControlType { - get { - return ResourceManager.GetString("CalendarAutomationPeer_DayButtonLocalizedControlType", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Decade. - /// - internal static string CalendarAutomationPeer_DecadeMode { - get { - return ResourceManager.GetString("CalendarAutomationPeer_DecadeMode", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Month. - /// - internal static string CalendarAutomationPeer_MonthMode { - get { - return ResourceManager.GetString("CalendarAutomationPeer_MonthMode", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Year. - /// - internal static string CalendarAutomationPeer_YearMode { - get { - return ResourceManager.GetString("CalendarAutomationPeer_YearMode", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to This type of Collection does not support changes to its SourceCollection from a thread different from the Dispatcher thread.. - /// - internal static string CalendarCollection_MultiThreadedCollectionChangeNotSupported { - get { - return ResourceManager.GetString("CalendarCollection_MultiThreadedCollectionChangeNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Cannot call Show() on a ChildWindow that is in the visual tree. ChildWindow should be the top-most element in the .xaml file.. - /// - internal static string ChildWindow_InvalidOperation { - get { - return ResourceManager.GetString("ChildWindow_InvalidOperation", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Show Calendar. - /// - internal static string DatePicker_DropDownButtonName { - get { - return ResourceManager.GetString("DatePicker_DropDownButtonName", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to DatePickerFormat value is not valid.. - /// - internal static string DatePicker_OnSelectedDateFormatChanged_InvalidValue { - get { - return ResourceManager.GetString("DatePicker_OnSelectedDateFormatChanged_InvalidValue", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to <{0}>. - /// - internal static string DatePicker_WatermarkText { - get { - return ResourceManager.GetString("DatePicker_WatermarkText", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to date picker. - /// - internal static string DatePickerAutomationPeer_LocalizedControlType { - get { - return ResourceManager.GetString("DatePickerAutomationPeer_LocalizedControlType", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Cannot Throw Null Exception. - /// - internal static string DatePickerDateValidationErrorEventArgs_ThrowException_NoException { - get { - return ResourceManager.GetString("DatePickerDateValidationErrorEventArgs_ThrowException_NoException", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to <enter text here>. - /// - internal static string DatePickerTextBox_DefaultWatermarkText { - get { - return ResourceManager.GetString("DatePickerTextBox_DefaultWatermarkText", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The template part {0} is not an instance of {1}.. - /// - internal static string DatePickerTextBox_TemplatePartIsOfIncorrectType { - get { - return ResourceManager.GetString("DatePickerTextBox_TemplatePartIsOfIncorrectType", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to DateTime value is in the wrong format.. - /// - internal static string DateTimeTypeConverter_FormatException { - get { - return ResourceManager.GetString("DateTimeTypeConverter_FormatException", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to ConstructorParameters cannot be changed because ObjectDataProvider is using a user-assigned ObjectInstance.. - /// - internal static string ParameterCollection_EnsureCanChangeCollection_IsReadOnly { - get { - return ResourceManager.GetString("ParameterCollection_EnsureCanChangeCollection_IsReadOnly", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The elementName should not be empty.. - /// - internal static string ResolveElementNameEventArgs_ctor_ElementNameEmpty { - get { - return ResourceManager.GetString("ResolveElementNameEventArgs_ctor_ElementNameEmpty", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The RoutedPropertyChangingEvent cannot be canceled!. - /// - internal static string RoutedPropertyChangingEventArgs_CancelSet_InvalidOperation { - get { - return ResourceManager.GetString("RoutedPropertyChangingEventArgs_CancelSet_InvalidOperation", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to cast object of type '{0}' to type 'System.Windows.Controls.TabItem'.. - /// - internal static string TabControl_InvalidChild { - get { - return ResourceManager.GetString("TabControl_InvalidChild", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to '{0}' is not a valid value for property 'SelectedIndex'. - /// - internal static string TabControl_InvalidIndex { - get { - return ResourceManager.GetString("TabControl_InvalidIndex", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Cannot set read-only property SelectedItem.. - /// - internal static string TreeView_OnSelectedItemPropertyChanged_InvalidWrite { - get { - return ResourceManager.GetString("TreeView_OnSelectedItemPropertyChanged_InvalidWrite", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Cannot set read-only property SelectedValue.. - /// - internal static string TreeView_OnSelectedValuePropertyChanged_InvalidWrite { - get { - return ResourceManager.GetString("TreeView_OnSelectedValuePropertyChanged_InvalidWrite", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Cannot set read-only property HasItems.. - /// - internal static string TreeViewItem_OnHasItemsPropertyChanged_InvalidWrite { - get { - return ResourceManager.GetString("TreeViewItem_OnHasItemsPropertyChanged_InvalidWrite", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Cannot set read-only property IsSelectionActive.. - /// - internal static string TreeViewItem_OnIsSelectionActivePropertyChanged_InvalidWrite { - get { - return ResourceManager.GetString("TreeViewItem_OnIsSelectionActivePropertyChanged_InvalidWrite", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to '{0}' is unable to convert '{1}' to '{2}'.. - /// - internal static string TypeConverters_Convert_CannotConvert { - get { - return ResourceManager.GetString("TypeConverters_Convert_CannotConvert", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to '{0}' cannot convert from '{1}'.. - /// - internal static string TypeConverters_ConvertFrom_CannotConvertFromType { - get { - return ResourceManager.GetString("TypeConverters_ConvertFrom_CannotConvertFromType", resourceCulture); - } - } - } -} diff -r 5172a9b9800c -r 62889c14148e SilverlightGlimpse/FloatableWindow/Properties/Resources.resx --- a/SilverlightGlimpse/FloatableWindow/Properties/Resources.resx Mon Apr 23 23:07:23 2012 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,128 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Cannot perform operation. - Exception thrown by automation peers. - - - Cannot call Show() on a ChildWindow that is in the visual tree. ChildWindow should be the top-most element in the .xaml file. - Exception thrown when the ChildWindow is in the visual tree and Show() is called on it. - - \ No newline at end of file diff -r 5172a9b9800c -r 62889c14148e SilverlightGlimpse/FloatableWindow/themes/generic.xaml --- a/SilverlightGlimpse/FloatableWindow/themes/generic.xaml Mon Apr 23 23:07:23 2012 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,352 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -