0f0c63a64656d1e7f377831be6c87c483e798a9e
[mono.git] / mcs / class / referencesource / System.Activities.Presentation / System.Activities.Core.Presentation / System / Activities / Core / Presentation / FlowchartExpressionAdorner.cs
1 //----------------------------------------------------------------
2 // Copyright (c) Microsoft Corporation.  All rights reserved.
3 //----------------------------------------------------------------
4
5 namespace System.Activities.Core.Presentation
6 {
7     using System.Activities.Presentation;
8     using System.Activities.Presentation.Model;
9     using System.Activities.Presentation.View;
10     using System.Runtime;
11     using System.Windows;
12     using System.Windows.Controls;
13     using System.Windows.Documents;
14     using System.Windows.Media;
15     using System.Windows.Media.Effects;
16
17     class FlowchartExpressionAdorner : Adorner
18     {
19         string expressionString;
20         bool isTextRightToLeft;
21
22         public FlowchartExpressionAdorner(UIElement adornedElement)
23             : base(adornedElement)
24         {
25             expressionString = GetExpressionString();
26             this.isTextRightToLeft = FreeFormPanelUtilities.IsRightToLeft(adornedElement);
27         }
28
29         protected override void OnRender(DrawingContext drawingContext)
30         {
31             Transform transform = isTextRightToLeft ? new MatrixTransform(-1, 0, 0, 1, 0, 0) : Transform.Identity;
32             Border tooltip = new Border
33             {
34                 Background = new SolidColorBrush(Colors.White),
35                 BorderBrush = new SolidColorBrush(WorkflowDesignerColors.WorkflowViewElementBorderColor),
36                 BorderThickness = new Thickness(1),
37                 CornerRadius = new CornerRadius(4),
38                 Margin = new Thickness(10),
39                 Child = new TextBlock
40                 {
41                     Margin = new Thickness(4, 0, 4, 0),
42                     MaxHeight = 100,
43                     Text = expressionString,
44                 },
45                 Effect = new DropShadowEffect
46                 {
47                     Color = Colors.Black,
48                     BlurRadius = 4,
49                     Opacity = 0.5
50                 },
51                 RenderTransform = transform
52             };
53             tooltip.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));
54
55             VisualBrush brush = new VisualBrush()
56             {
57                 Visual = tooltip
58             };
59
60             Rect adornedElementRect = new Rect(this.AdornedElement.DesiredSize);
61             Rect tooltipRect = new Rect(adornedElementRect.TopLeft + new Vector(adornedElementRect.Width, -tooltip.DesiredSize.Height), tooltip.DesiredSize);
62             Pen renderPen = new Pen();
63             drawingContext.DrawRectangle(brush, renderPen, tooltipRect);
64         }        
65
66         public static string GetExpressionString(UIElement adornedElement)
67         {
68             string expressionPropertyName;
69             ModelItem modelItem;
70             if (adornedElement is FlowDecisionDesigner)
71             {
72                 expressionPropertyName = "Condition";
73                 modelItem = ((FlowDecisionDesigner)adornedElement).ModelItem;
74             }
75             else
76             {
77                 Fx.Assert(adornedElement is FlowSwitchDesigner, "this.AdornedElement is either FlowDecisionDesigner or FlowSwitchDesigner");
78                 expressionPropertyName = "Expression";
79                 modelItem = ((FlowSwitchDesigner)adornedElement).ModelItem;
80             }
81             Activity expressionActivity = modelItem.Properties[expressionPropertyName].ComputedValue as Activity;
82             return ExpressionHelper.GetExpressionString(expressionActivity, modelItem);
83         }
84
85         string GetExpressionString()
86         {
87             return GetExpressionString(this.AdornedElement);
88         }
89     }
90 }