1 //----------------------------------------------------------------
2 // Copyright (c) Microsoft Corporation. All rights reserved.
3 //----------------------------------------------------------------
5 namespace System.Activities.Core.Presentation
7 using System.Activities.Presentation;
8 using System.Activities.Presentation.FreeFormEditing;
9 using System.Activities.Presentation.View;
10 using System.Collections.Generic;
11 using System.Diagnostics;
13 using System.Windows.Documents;
14 using System.Windows.Input;
15 using System.Windows.Media;
18 internal class FlowchartConnectionPointsAdorner : ConnectionPointsAdorner
20 private bool isTextRightToLeft;
22 public FlowchartConnectionPointsAdorner(UIElement adornedElement, List<ConnectionPoint> connectionPointsToShow, bool isParentShapeSelected, bool isTextRightToLeft)
23 : base(adornedElement, connectionPointsToShow, isParentShapeSelected)
25 this.isTextRightToLeft = isTextRightToLeft;
26 this.FlowDirection = isTextRightToLeft ? FlowDirection.RightToLeft : FlowDirection.LeftToRight;
29 protected override void OnRender(DrawingContext drawingContext)
31 const int textCulture = 9;
33 ConnectionPoint trueConnectionPoint = null;
34 ConnectionPoint falseConnectionPoint = null;
36 if (this.connectionPoints.Contains(FlowchartDesigner.GetTrueConnectionPoint(this.AdornedElement)))
38 trueConnectionPoint = FlowchartDesigner.GetTrueConnectionPoint(this.AdornedElement);
40 if (this.connectionPoints.Contains(FlowchartDesigner.GetFalseConnectionPoint(this.AdornedElement)))
42 falseConnectionPoint = FlowchartDesigner.GetFalseConnectionPoint(this.AdornedElement);
45 Point origin = FreeFormPanel.GetLocation(AdornedElement);
46 Thickness margin = ((FrameworkElement)AdornedElement).Margin;
47 origin.X += margin.Left;
48 origin.Y += margin.Top;
50 foreach (ConnectionPoint connPoint in this.connectionPoints)
52 actualPoint = new Point(connPoint.Location.X - origin.X, connPoint.Location.Y - origin.Y);
53 this.DrawConnectionPoint(connPoint, actualPoint, drawingContext);
56 if (trueConnectionPoint != null)
58 string trueLabelText = String.Empty;
60 VirtualizedContainerService.VirtualizingContainer virtualizingContainer = (VirtualizedContainerService.VirtualizingContainer)trueConnectionPoint.ParentDesigner;
61 if (virtualizingContainer != null && virtualizingContainer.ModelItem != null)
63 trueLabelText = (string)virtualizingContainer.ModelItem.Properties["TrueLabel"].ComputedValue;
66 actualPoint = new Point(trueConnectionPoint.Location.X - origin.X, trueConnectionPoint.Location.Y - origin.Y);
67 FormattedText trueMarkerFormattedText = new FormattedText(trueLabelText, new System.Globalization.CultureInfo(textCulture),
68 this.FlowDirection, FlowchartDesigner.FlowElementCaptionTypeface, FlowchartDesigner.FlowNodeCaptionFontSize,
69 new SolidColorBrush(WorkflowDesignerColors.WorkflowViewElementCaptionColor));
70 actualPoint.Y += ConnectionPoint.DrawingLargeSide / 2;
71 actualPoint.X -= trueMarkerFormattedText.WidthIncludingTrailingWhitespace;
75 this.isTextRightToLeft,
76 // Mirror the left side text to the right side by using this axis when RTL.
80 drawingContext.DrawText(trueMarkerFormattedText, actualPoint);
84 if (falseConnectionPoint != null)
86 string falseLabelText = String.Empty;
88 VirtualizedContainerService.VirtualizingContainer virtualizingContainer = (VirtualizedContainerService.VirtualizingContainer)falseConnectionPoint.ParentDesigner;
89 if (virtualizingContainer != null && virtualizingContainer.ModelItem != null)
91 falseLabelText = (string)virtualizingContainer.ModelItem.Properties["FalseLabel"].ComputedValue;
94 actualPoint = new Point(falseConnectionPoint.Location.X - origin.X, falseConnectionPoint.Location.Y - origin.Y);
95 actualPoint.Y += ConnectionPoint.DrawingLargeSide / 2;
97 FormattedText falseMarkerFormattedText = new FormattedText(falseLabelText, new System.Globalization.CultureInfo(textCulture),
98 this.FlowDirection, FlowchartDesigner.FlowElementCaptionTypeface, FlowchartDesigner.FlowNodeCaptionFontSize,
99 new SolidColorBrush(WorkflowDesignerColors.WorkflowViewElementCaptionColor));
103 this.isTextRightToLeft,
104 // Mirror the left side text to the right side by using this axis when RTL.
108 drawingContext.DrawText(falseMarkerFormattedText, actualPoint);
112 base.OnRender(drawingContext);
115 private static void DrawtWithTransform(DrawingContext drawingContext, bool isRightToLeft, double axis, Action doDraw)
119 /* We hope to mirror the Text using yAxis as axis, like from (a) to (b)
121 * | ==>= =>==> | <==<= =<==
122 * |--------|------> x |----------|--------> x
123 * y axis (a) y axis (b)
125 * So we do it in three steps:
126 * 1) move text so that axis and y are coincident
128 * | ==>= =>==> ==>=|=>==>
129 * |--------|------> x ----------|---------> x
134 * ==>=|=>==> <=<=|=<==
135 * --------|------> x ----------|---------> x
140 * <=<=|=<== | <=<= =<==
141 * --------|------> x |---------|----------> x
145 * | 1 0 0 | | -1 0 0 | | 1 0 0 | | -1 0 0 |
146 * transform = | 0 1 0 | x | 0 1 0 | x | 0 1 0 | = | 0 1 0 |
147 * | axis 0 1 | | 0 0 1 | | -axis 0 0 | | 2*axis 0 1 |
150 MatrixTransform transform = new MatrixTransform(-1, 0, 0, 1, 2 * axis, 0);
151 drawingContext.PushTransform(transform);
153 drawingContext.Pop();