Skip to content
This repository was archived by the owner on Oct 16, 2020. It is now read-only.

Commit 20d75cd

Browse files
Merge pull request #446 from jogibear9988/master
Many small fixes & Extensions for the WPF Designer
2 parents fadbc15 + 1220ef6 commit 20d75cd

16 files changed

Lines changed: 511 additions & 70 deletions

src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Controls/AdornerLayer.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -221,11 +221,11 @@ protected override Size MeasureOverride(Size availableSize)
221221

222222
protected override Size ArrangeOverride(Size finalSize)
223223
{
224-
foreach (AdornerPanel adorner in this.Children) {
225-
adorner.Arrange(new Rect(new Point(0, 0), adorner.DesiredSize));
224+
foreach (AdornerPanel adorner in this.Children) {
226225
if (adorner.AdornedElement.IsDescendantOf(_designPanel)) {
227226
adorner.RenderTransform = (Transform)adorner.AdornedElement.TransformToAncestor(_designPanel);
228227
}
228+
adorner.Arrange(new Rect(new Point(0, 0), adorner.DesiredSize));
229229
}
230230
return finalSize;
231231
}

src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Controls/PanelMoveAdorner.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public PanelMoveAdorner(DesignItem item)
5454
protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
5555
{
5656
e.Handled = true;
57-
item.Services.Selection.SetSelectedComponents(new DesignItem [] { item }, SelectionTypes.Auto);
57+
//item.Services.Selection.SetSelectedComponents(new DesignItem [] { item }, SelectionTypes.Auto);
5858
new DragMoveMouseGesture(item, false).Start(item.Services.DesignPanel, e);
5959
}
6060

src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Extensions/CanvasPositionExtension.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
namespace ICSharpCode.WpfDesign.Designer.Extensions
2929
{
3030
[ExtensionFor(typeof(FrameworkElement))]
31-
[ExtensionServer(typeof(PrimarySelectionExtensionServer))]
31+
[ExtensionServer(typeof(OnlyOneItemSelectedExtensionServer))]
3232
public class CanvasPositionExtension : AdornerProvider
3333
{
3434
private MarginHandle[] _handles;

src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Extensions/QuickOperationMenuExtension.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions
3131
/// <summary>
3232
/// Extends the Quick operation menu for the designer.
3333
/// </summary>
34+
[ExtensionServer(typeof(OnlyOneItemSelectedExtensionServer))]
3435
[ExtensionFor(typeof (FrameworkElement))]
3536
class QuickOperationMenuExtension : PrimarySelectionAdornerProvider
3637
{

src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Extensions/RenderTransformOriginExtension.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232

3333
namespace ICSharpCode.WpfDesign.Designer.Extensions
3434
{
35+
[ExtensionServer(typeof(OnlyOneItemSelectedExtensionServer))]
3536
[ExtensionFor(typeof(FrameworkElement))]
3637
public class RenderTransformOriginExtension : SelectionAdornerProvider
3738
{

src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Extensions/ResizeThumbExtension.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions
3232
/// <summary>
3333
/// The resize thumb around a component.
3434
/// </summary>
35+
[ExtensionServer(typeof(OnlyOneItemSelectedExtensionServer))]
3536
[ExtensionFor(typeof(FrameworkElement))]
3637
public sealed class ResizeThumbExtension : SelectionAdornerProvider
3738
{

src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Extensions/RightClickContextMenuExtension.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions
3030
/// <summary>
3131
///
3232
/// </summary>
33+
[ExtensionServer(typeof(OnlyOneItemSelectedExtensionServer))]
3334
[ExtensionFor(typeof(UIElement))]
3435
public sealed class RightClickContextMenuExtension : PrimarySelectionAdornerProvider
3536
{

src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Extensions/RotateThumbExtension.cs

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions
3232
/// <summary>
3333
/// The resize thumb around a component.
3434
/// </summary>
35+
[ExtensionServer(typeof(OnlyOneItemSelectedExtensionServer))]
3536
[ExtensionFor(typeof(FrameworkElement))]
3637
public sealed class RotateThumbExtension : SelectionAdornerProvider
3738
{
@@ -41,6 +42,7 @@ public sealed class RotateThumbExtension : SelectionAdornerProvider
4142
readonly DesignItem[] extendedItemArray = new DesignItem[1];
4243
IPlacementBehavior resizeBehavior;
4344
PlacementOperation operation;
45+
private AdornerLayer _adornerLayer;
4446

4547
public RotateThumbExtension()
4648
{
@@ -64,6 +66,7 @@ ResizeThumb CreateRotateThumb()
6466
DragListener drag = new DragListener(rotateThumb);
6567
drag.Started += drag_Rotate_Started;
6668
drag.Changed += drag_Rotate_Changed;
69+
drag.Completed += drag_Rotate_Completed;
6770
return rotateThumb;
6871
}
6972

@@ -75,10 +78,11 @@ ResizeThumb CreateRotateThumb()
7578
private RotateTransform rotateTransform;
7679
private double initialAngle;
7780
private DesignItem rtTransform;
78-
private double angle;
79-
81+
8082
private void drag_Rotate_Started(DragListener drag)
8183
{
84+
_adornerLayer = this.adornerPanel.TryFindParent<AdornerLayer>();
85+
8286
var designerItem = this.ExtendedItem.Component as FrameworkElement;
8387
this.parent = VisualTreeHelper.GetParent(designerItem) as UIElement;
8488
this.centerPoint = designerItem.TranslatePoint(
@@ -135,10 +139,16 @@ private void drag_Rotate_Changed(DragListener drag)
135139
rtTransform = this.ExtendedItem.Properties[FrameworkElement.RenderTransformProperty].Value;
136140
}
137141
rtTransform.Properties["Angle"].SetValue(destAngle);
138-
this.angle = destAngle * Math.PI / 180.0;
142+
143+
_adornerLayer.UpdateAdornersForElement(this.ExtendedItem.View, true);
139144
}
140145
}
141146

147+
void drag_Rotate_Completed(ICSharpCode.WpfDesign.Designer.Controls.DragListener drag)
148+
{
149+
operation.Commit();
150+
}
151+
142152
#endregion
143153

144154
protected override void OnInitialized()
@@ -154,9 +164,6 @@ protected override void OnInitialized()
154164

155165
var designerItem = this.ExtendedItem.Component as FrameworkElement;
156166
this.rotateTransform = designerItem.RenderTransform as RotateTransform;
157-
158-
if (rotateTransform != null)
159-
angle = rotateTransform.Angle;
160167
}
161168

162169
void OnPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
Lines changed: 248 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,248 @@
1+
// Copyright (c) 2014 AlphaSierraPapa for the SharpDevelop Team
2+
//
3+
// Permission is hereby granted, free of charge, to any person obtaining a copy of this
4+
// software and associated documentation files (the "Software"), to deal in the Software
5+
// without restriction, including without limitation the rights to use, copy, modify, merge,
6+
// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
7+
// to whom the Software is furnished to do so, subject to the following conditions:
8+
//
9+
// The above copyright notice and this permission notice shall be included in all copies or
10+
// substantial portions of the Software.
11+
//
12+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
13+
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
14+
// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
15+
// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
16+
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
17+
// DEALINGS IN THE SOFTWARE.
18+
19+
using System;
20+
using System.Diagnostics;
21+
using System.Windows;
22+
using System.Windows.Controls.Primitives;
23+
using System.Windows.Input;
24+
using System.Windows.Media;
25+
using System.Windows.Shapes;
26+
using ICSharpCode.WpfDesign.Adorners;
27+
using ICSharpCode.WpfDesign.Designer.Controls;
28+
using ICSharpCode.WpfDesign.Extensions;
29+
using System.Collections.Generic;
30+
31+
namespace ICSharpCode.WpfDesign.Designer.Extensions
32+
{
33+
[ExtensionServer(typeof(OnlyOneItemSelectedExtensionServer))]
34+
[ExtensionFor(typeof(FrameworkElement))]
35+
public sealed class SkewThumbExtension : SelectionAdornerProvider
36+
{
37+
readonly AdornerPanel adornerPanel;
38+
readonly DesignItem[] extendedItemArray = new DesignItem[1];
39+
40+
private AdornerLayer _adornerLayer;
41+
42+
public SkewThumbExtension()
43+
{
44+
adornerPanel = new AdornerPanel();
45+
adornerPanel.Order = AdornerOrder.BeforeForeground;
46+
this.Adorners.Add(adornerPanel);
47+
}
48+
49+
#region Skew
50+
51+
private Point startPoint;
52+
private UIElement parent;
53+
private SkewTransform skewTransform;
54+
private double skewX;
55+
private double skewY;
56+
private DesignItem rtTransform;
57+
private Thumb thumb1;
58+
private Thumb thumb2;
59+
PlacementOperation operation;
60+
61+
private void dragX_Started(DragListener drag)
62+
{
63+
_adornerLayer = this.adornerPanel.TryFindParent<AdornerLayer>();
64+
65+
var designerItem = this.ExtendedItem.Component as FrameworkElement;
66+
this.parent = VisualTreeHelper.GetParent(designerItem) as UIElement;
67+
68+
startPoint = Mouse.GetPosition(this.parent);
69+
70+
if (this.skewTransform == null)
71+
{
72+
this.skewX = 0;
73+
this.skewY = 0;
74+
}
75+
else
76+
{
77+
this.skewX = this.skewTransform.AngleX;
78+
this.skewY = this.skewTransform.AngleY;
79+
}
80+
81+
rtTransform = this.ExtendedItem.Properties[FrameworkElement.RenderTransformProperty].Value;
82+
83+
operation = PlacementOperation.Start(extendedItemArray, PlacementType.Resize);
84+
}
85+
86+
private void dragX_Changed(DragListener drag)
87+
{
88+
Point currentPoint = Mouse.GetPosition(this.parent);
89+
Vector deltaVector = Point.Subtract(currentPoint, this.startPoint);
90+
91+
var destAngle = (-0.5*deltaVector.X) + skewX;
92+
93+
if (destAngle == 0 && skewY == 0)
94+
{
95+
this.ExtendedItem.Properties.GetProperty(FrameworkElement.RenderTransformProperty).Reset();
96+
rtTransform = null;
97+
skewTransform = null;
98+
}
99+
else
100+
{
101+
if (rtTransform == null)
102+
{
103+
if (!this.ExtendedItem.Properties.GetProperty(FrameworkElement.RenderTransformOriginProperty).IsSet) {
104+
this.ExtendedItem.Properties.GetProperty(FrameworkElement.RenderTransformOriginProperty).SetValue(new Point(0.5,0.5));
105+
}
106+
107+
if (this.skewTransform == null)
108+
this.skewTransform = new SkewTransform(0, 0);
109+
this.ExtendedItem.Properties.GetProperty(FrameworkElement.RenderTransformProperty).SetValue(skewTransform);
110+
rtTransform = this.ExtendedItem.Properties[FrameworkElement.RenderTransformProperty].Value;
111+
}
112+
rtTransform.Properties["AngleX"].SetValue(destAngle);
113+
}
114+
115+
_adornerLayer.UpdateAdornersForElement(this.ExtendedItem.View, true);
116+
}
117+
118+
void dragX_Completed(ICSharpCode.WpfDesign.Designer.Controls.DragListener drag)
119+
{
120+
operation.Commit();
121+
}
122+
123+
private void dragY_Started(DragListener drag)
124+
{
125+
_adornerLayer = this.adornerPanel.TryFindParent<AdornerLayer>();
126+
127+
var designerItem = this.ExtendedItem.Component as FrameworkElement;
128+
this.parent = VisualTreeHelper.GetParent(designerItem) as UIElement;
129+
130+
startPoint = Mouse.GetPosition(this.parent);
131+
132+
if (this.skewTransform == null)
133+
{
134+
this.skewX = 0;
135+
this.skewY = 0;
136+
}
137+
else
138+
{
139+
this.skewX = this.skewTransform.AngleX;
140+
this.skewY = this.skewTransform.AngleY;
141+
}
142+
143+
rtTransform = this.ExtendedItem.Properties[FrameworkElement.RenderTransformProperty].Value;
144+
145+
operation = PlacementOperation.Start(extendedItemArray, PlacementType.Resize);
146+
}
147+
148+
private void dragY_Changed(DragListener drag)
149+
{
150+
Point currentPoint = Mouse.GetPosition(this.parent);
151+
Vector deltaVector = Point.Subtract(currentPoint, this.startPoint);
152+
153+
var destAngle = (-0.5*deltaVector.Y) + skewY;
154+
155+
if (destAngle == 0 && skewX == 0)
156+
{
157+
this.ExtendedItem.Properties.GetProperty(FrameworkElement.RenderTransformProperty).Reset();
158+
rtTransform = null;
159+
skewTransform = null;
160+
}
161+
else
162+
{
163+
if (rtTransform == null)
164+
{
165+
if (!this.ExtendedItem.Properties.GetProperty(FrameworkElement.RenderTransformOriginProperty).IsSet)
166+
{
167+
this.ExtendedItem.Properties.GetProperty(FrameworkElement.RenderTransformOriginProperty).SetValue(new Point(0.5, 0.5));
168+
}
169+
170+
if (this.skewTransform == null)
171+
this.skewTransform = new SkewTransform(0, 0);
172+
this.ExtendedItem.Properties.GetProperty(FrameworkElement.RenderTransformProperty).SetValue(skewTransform);
173+
rtTransform = this.ExtendedItem.Properties[FrameworkElement.RenderTransformProperty].Value;
174+
}
175+
rtTransform.Properties["AngleY"].SetValue(destAngle);
176+
}
177+
178+
_adornerLayer.UpdateAdornersForElement(this.ExtendedItem.View, true);
179+
}
180+
181+
void dragY_Completed(ICSharpCode.WpfDesign.Designer.Controls.DragListener drag)
182+
{
183+
operation.Commit();
184+
}
185+
186+
#endregion
187+
188+
protected override void OnInitialized()
189+
{
190+
191+
if (this.ExtendedItem.Component is WindowClone)
192+
return;
193+
base.OnInitialized();
194+
195+
extendedItemArray[0] = this.ExtendedItem;
196+
this.ExtendedItem.PropertyChanged += OnPropertyChanged;
197+
198+
var designerItem = this.ExtendedItem.Component as FrameworkElement;
199+
this.skewTransform = designerItem.RenderTransform as SkewTransform;
200+
201+
if (skewTransform != null)
202+
{
203+
skewX = skewTransform.AngleX;
204+
skewY = skewTransform.AngleY;
205+
}
206+
207+
thumb1 = new Thumb() { Cursor = Cursors.ScrollWE, Height = 14, Width = 4, Opacity = 1 };
208+
thumb2 = new Thumb() { Cursor = Cursors.ScrollNS, Width = 14, Height = 4, Opacity = 1 };
209+
210+
OnPropertyChanged(null, null);
211+
212+
adornerPanel.Children.Add(thumb1);
213+
adornerPanel.Children.Add(thumb2);
214+
215+
DragListener drag1 = new DragListener(thumb1);
216+
drag1.Started += dragX_Started;
217+
drag1.Changed += dragX_Changed;
218+
drag1.Completed += dragX_Completed;
219+
DragListener drag2 = new DragListener(thumb2);
220+
drag2.Started += dragY_Started;
221+
drag2.Changed += dragY_Changed;
222+
drag2.Completed += dragY_Completed;
223+
}
224+
225+
void OnPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
226+
{
227+
if (sender == null || e.PropertyName == "Width" || e.PropertyName == "Height") {
228+
AdornerPanel.SetPlacement(thumb1,
229+
new RelativePlacement(HorizontalAlignment.Center, VerticalAlignment.Top) {
230+
YOffset = 0,
231+
XOffset = -1 * ((FrameworkElement)ExtendedItem.View).ActualWidth / 4
232+
});
233+
234+
AdornerPanel.SetPlacement(thumb2,
235+
new RelativePlacement(HorizontalAlignment.Left, VerticalAlignment.Center) {
236+
YOffset = -1 * ((FrameworkElement)ExtendedItem.View).ActualHeight / 4,
237+
XOffset = 0
238+
});
239+
}
240+
}
241+
242+
protected override void OnRemove()
243+
{
244+
this.ExtendedItem.PropertyChanged -= OnPropertyChanged;
245+
base.OnRemove();
246+
}
247+
}
248+
}

0 commit comments

Comments
 (0)