// Copyright (C) Josh Smith - January 2007
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Documents;
using System.Windows;
using System.Windows.Media;
using System.Windows.Shapes;
using System.Windows.Media.Animation;
using System.Windows.Controls;
namespace GeekDesk.Util
{
///
/// Renders a visual which can follow the mouse cursor,
/// such as during a drag-and-drop operation.
///
public class DragAdorner : Adorner
{
#region Data
private Rectangle child = null;
private double offsetLeft = 0;
private double offsetTop = 0;
#endregion // Data
#region Constructor
///
/// Initializes a new instance of DragVisualAdorner.
///
/// The element being adorned.
/// The size of the adorner.
/// A brush to with which to paint the adorner.
public DragAdorner( UIElement adornedElement, Size size, Brush brush )
: base( adornedElement )
{
Rectangle rect = new Rectangle();
rect.Fill = brush;
rect.Width = size.Width;
rect.Height = size.Height;
rect.IsHitTestVisible = false;
this.child = rect;
}
#endregion // Constructor
#region Public Interface
#region GetDesiredTransform
///
/// Override.
///
///
///
public override GeneralTransform GetDesiredTransform( GeneralTransform transform )
{
GeneralTransformGroup result = new GeneralTransformGroup();
result.Children.Add( base.GetDesiredTransform( transform ) );
result.Children.Add( new TranslateTransform( this.offsetLeft, this.offsetTop ) );
return result;
}
#endregion // GetDesiredTransform
#region OffsetLeft
///
/// Gets/sets the horizontal offset of the adorner.
///
public double OffsetLeft
{
get { return this.offsetLeft; }
set
{
this.offsetLeft = value;
UpdateLocation();
}
}
#endregion // OffsetLeft
#region SetOffsets
///
/// Updates the location of the adorner in one atomic operation.
///
///
///
public void SetOffsets( double left, double top )
{
this.offsetLeft = left;
this.offsetTop = top;
this.UpdateLocation();
}
#endregion // SetOffsets
#region OffsetTop
///
/// Gets/sets the vertical offset of the adorner.
///
public double OffsetTop
{
get { return this.offsetTop; }
set
{
this.offsetTop = value;
UpdateLocation();
}
}
#endregion // OffsetTop
#endregion // Public Interface
#region Protected Overrides
///
/// Override.
///
///
///
protected override Size MeasureOverride( Size constraint )
{
this.child.Measure( constraint );
return this.child.DesiredSize;
}
///
/// Override.
///
///
///
protected override Size ArrangeOverride( Size finalSize )
{
this.child.Arrange( new Rect( finalSize ) );
return finalSize;
}
///
/// Override.
///
///
///
protected override Visual GetVisualChild( int index )
{
return this.child;
}
///
/// Override. Always returns 1.
///
protected override int VisualChildrenCount
{
get { return 1; }
}
#endregion // Protected Overrides
#region Private Helpers
private void UpdateLocation()
{
AdornerLayer adornerLayer = this.Parent as AdornerLayer;
if( adornerLayer != null )
adornerLayer.Update( this.AdornedElement );
}
#endregion // Private Helpers
}
}