5 changed files with 258 additions and 41 deletions
@ -0,0 +1,35 @@
@@ -0,0 +1,35 @@
|
||||
using System; |
||||
using System.Collections.Generic; |
||||
using System.Linq; |
||||
using System.Text; |
||||
using System.Windows; |
||||
using System.Windows.Controls; |
||||
using System.Windows.Controls.Primitives; |
||||
using System.Windows.Input; |
||||
using System.Windows.Media; |
||||
using ICSharpCode.WpfDesign.Adorners; |
||||
using ICSharpCode.WpfDesign.Designer.Extensions; |
||||
|
||||
namespace ICSharpCode.WpfDesign.Designer.Controls |
||||
{ |
||||
public class RotateThumb : ResizeThumb |
||||
{ |
||||
private double initialAngle; |
||||
private RotateTransform rotateTransform; |
||||
private Vector startVector; |
||||
private Point centerPoint; |
||||
private Control designerItem; |
||||
private Panel canvas; |
||||
private AdornerPanel parent; |
||||
|
||||
static RotateThumb() |
||||
{ |
||||
DefaultStyleKeyProperty.OverrideMetadata(typeof(RotateThumb), new FrameworkPropertyMetadata(typeof(RotateThumb))); |
||||
} |
||||
|
||||
public RotateThumb() |
||||
{ |
||||
this.ResizeThumbVisible = true; |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,165 @@
@@ -0,0 +1,165 @@
|
||||
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
|
||||
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
|
||||
|
||||
using System; |
||||
using System.Diagnostics; |
||||
using System.Windows; |
||||
using System.Windows.Controls.Primitives; |
||||
using System.Windows.Input; |
||||
using System.Windows.Media; |
||||
using ICSharpCode.WpfDesign.Adorners; |
||||
using ICSharpCode.WpfDesign.Designer.Controls; |
||||
using ICSharpCode.WpfDesign.Extensions; |
||||
using System.Collections.Generic; |
||||
|
||||
namespace ICSharpCode.WpfDesign.Designer.Extensions |
||||
{ |
||||
/// <summary>
|
||||
/// The resize thumb around a component.
|
||||
/// </summary>
|
||||
[ExtensionFor(typeof(FrameworkElement))] |
||||
public sealed class RotateThumbExtension : SelectionAdornerProvider |
||||
{ |
||||
readonly AdornerPanel adornerPanel; |
||||
readonly Thumb thumb; |
||||
/// <summary>An array containing this.ExtendedItem as only element</summary>
|
||||
readonly DesignItem[] extendedItemArray = new DesignItem[1]; |
||||
IPlacementBehavior resizeBehavior; |
||||
PlacementOperation operation; |
||||
ChangeGroup changeGroup; |
||||
|
||||
bool _isResizing; |
||||
|
||||
/// <summary>
|
||||
/// Gets whether this extension is resizing any element.
|
||||
/// </summary>
|
||||
public bool IsResizing{ |
||||
get { return _isResizing; } |
||||
} |
||||
|
||||
public RotateThumbExtension() |
||||
{ |
||||
adornerPanel = new AdornerPanel(); |
||||
adornerPanel.Order = AdornerOrder.Foreground; |
||||
this.Adorners.Add(adornerPanel); |
||||
|
||||
thumb = CreateRotateThumb(); |
||||
} |
||||
|
||||
ResizeThumb CreateRotateThumb() |
||||
{ |
||||
ResizeThumb rotateThumb = new RotateThumb(); |
||||
rotateThumb.Cursor = Cursors.Hand; |
||||
rotateThumb.Cursor = ZoomControl.GetCursor("Images/rotate.cur"); |
||||
rotateThumb.Alignment = PlacementAlignment.Top; |
||||
AdornerPanel.SetPlacement(rotateThumb, |
||||
new RelativePlacement(HorizontalAlignment.Center, VerticalAlignment.Top) { WidthRelativeToContentWidth = 1, HeightOffset = 0 }); |
||||
adornerPanel.Children.Add(rotateThumb); |
||||
|
||||
DragListener drag = new DragListener(rotateThumb); |
||||
drag.Started += drag_Rotate_Started; |
||||
drag.Changed += drag_Rotate_Changed; |
||||
return rotateThumb; |
||||
} |
||||
|
||||
Size oldSize; |
||||
|
||||
#region Rotate
|
||||
|
||||
private Point centerPoint; |
||||
private UIElement parent; |
||||
private Vector startVector; |
||||
private RotateTransform rotateTransform; |
||||
private double initialAngle; |
||||
private DesignItem rtTransform; |
||||
private double angle; |
||||
|
||||
private void drag_Rotate_Started(DragListener drag) |
||||
{ |
||||
var designerItem = this.ExtendedItem.Component as FrameworkElement; |
||||
this.parent = VisualTreeHelper.GetParent(designerItem) as UIElement; |
||||
this.centerPoint = designerItem.TranslatePoint( |
||||
new Point(designerItem.ActualWidth*designerItem.RenderTransformOrigin.X, |
||||
designerItem.ActualHeight*designerItem.RenderTransformOrigin.Y), |
||||
this.parent); |
||||
|
||||
Point startPoint = Mouse.GetPosition(this.parent); |
||||
this.startVector = Point.Subtract(startPoint, this.centerPoint); |
||||
|
||||
if (this.rotateTransform == null) |
||||
{ |
||||
this.initialAngle = 0; |
||||
} |
||||
else |
||||
{ |
||||
this.initialAngle = this.rotateTransform.Angle; |
||||
} |
||||
|
||||
rtTransform = this.ExtendedItem.Properties[FrameworkElement.RenderTransformProperty].Value; |
||||
|
||||
operation = PlacementOperation.Start(extendedItemArray, PlacementType.Resize); |
||||
} |
||||
|
||||
private void drag_Rotate_Changed(DragListener drag) |
||||
{ |
||||
Point currentPoint = Mouse.GetPosition(this.parent); |
||||
Vector deltaVector = Point.Subtract(currentPoint, this.centerPoint); |
||||
|
||||
double angle = Vector.AngleBetween(this.startVector, deltaVector); |
||||
|
||||
var destAngle = this.initialAngle + Math.Round(angle, 0); |
||||
|
||||
if (!Keyboard.IsKeyDown(Key.LeftCtrl)) |
||||
destAngle = ((int)destAngle / 15) * 15; |
||||
|
||||
if (destAngle == 0) |
||||
{ |
||||
this.ExtendedItem.Properties.GetProperty(FrameworkElement.RenderTransformProperty).Reset(); |
||||
rtTransform = null; |
||||
rotateTransform = null; |
||||
} |
||||
else |
||||
{ |
||||
if (rtTransform == null) |
||||
{ |
||||
if (this.rotateTransform == null) |
||||
this.rotateTransform = new RotateTransform(0); |
||||
this.ExtendedItem.Properties.GetProperty(FrameworkElement.RenderTransformProperty).SetValue(rotateTransform); |
||||
rtTransform = this.ExtendedItem.Properties[FrameworkElement.RenderTransformProperty].Value; |
||||
} |
||||
rtTransform.Properties["Angle"].SetValue(destAngle); |
||||
this.angle = destAngle * Math.PI / 180.0; |
||||
} |
||||
} |
||||
|
||||
#endregion
|
||||
|
||||
protected override void OnInitialized() |
||||
{ |
||||
base.OnInitialized(); |
||||
extendedItemArray[0] = this.ExtendedItem; |
||||
this.ExtendedItem.PropertyChanged += OnPropertyChanged; |
||||
this.Services.Selection.PrimarySelectionChanged += OnPrimarySelectionChanged; |
||||
resizeBehavior = PlacementOperation.GetPlacementBehavior(extendedItemArray); |
||||
OnPrimarySelectionChanged(null, null); |
||||
} |
||||
|
||||
void OnPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) |
||||
{ } |
||||
|
||||
protected override void OnRemove() |
||||
{ |
||||
this.ExtendedItem.PropertyChanged -= OnPropertyChanged; |
||||
this.Services.Selection.PrimarySelectionChanged -= OnPrimarySelectionChanged; |
||||
base.OnRemove(); |
||||
} |
||||
|
||||
void OnPrimarySelectionChanged(object sender, EventArgs e) |
||||
{ |
||||
bool isPrimarySelection = this.Services.Selection.PrimarySelection == this.ExtendedItem; |
||||
foreach (RotateThumb g in adornerPanel.Children) { |
||||
g.IsPrimarySelection = isPrimarySelection; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
After Width: | Height: | Size: 4.2 KiB |
Loading…
Reference in new issue