aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/CodeCompletion/InsightWindow.xaml
blob: 6b5a673884afbb1cd765c41906ccb89018e129ff (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
	xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
	xmlns:cc="clr-namespace:Tango.Scripting.Editors.CodeCompletion"
>
	<cc:InsightWindowTemplateSelector x:Key="templateSelector" />
	
	<!-- Template for InsightWindow. Based on the template for ToolTip. -->
	<Style TargetType="{x:Type cc:InsightWindow}">
		<Setter Property="SizeToContent" Value="WidthAndHeight" />
		
		<Setter Property="BorderThickness" Value="1" />
		<Setter Property="BorderBrush" Value="{DynamicResource {x:Static SystemColors.WindowFrameBrushKey}}" />
		<Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.InfoBrushKey}}" />
		<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.InfoTextBrushKey}}" />
		<Setter Property="FontFamily" Value="{DynamicResource {x:Static SystemFonts.StatusFontFamilyKey}}" />
		<Setter Property="FontSize" Value="{DynamicResource {x:Static SystemFonts.StatusFontSizeKey}}" />
		<Setter Property="FontStyle" Value="{DynamicResource {x:Static SystemFonts.StatusFontStyleKey}}" />
		<Setter Property="FontWeight" Value="{DynamicResource {x:Static SystemFonts.StatusFontWeightKey}}" />
		<Setter Property="Padding" Value="1,1,3,1" />
		<Setter Property="HorizontalContentAlignment" Value="Left" />
		<Setter Property="VerticalContentAlignment" Value="Center" />
		<Setter Property="Template">
			<Setter.Value>
				<ControlTemplate TargetType="{x:Type cc:InsightWindow}">
					<Border BorderThickness="{TemplateBinding Border.BorderThickness}"
					        Padding="{TemplateBinding Control.Padding}"
					        CornerRadius="2,2,2,2"
					        BorderBrush="{TemplateBinding Border.BorderBrush}"
					        Background="{TemplateBinding Panel.Background}">
						<AdornerDecorator>
							<ContentPresenter
								Content="{TemplateBinding ContentControl.Content}"
								ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}"
								ContentStringFormat="{TemplateBinding ContentControl.ContentStringFormat}"
								HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}"
								VerticalAlignment="{TemplateBinding Control.VerticalContentAlignment}"
								SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />
						</AdornerDecorator>
					</Border>
				</ControlTemplate>
			</Setter.Value>
		</Setter>
	</Style>
	
	<!-- Template for OverloadViewer. -->
	<Style TargetType="{x:Type cc:OverloadViewer}">
		<Setter Property="Template">
			<Setter.Value>
				<ControlTemplate TargetType="{x:Type cc:OverloadViewer}">
					<Grid>
						<Grid.Resources>
							<cc:CollapseIfSingleOverloadConverter x:Key="collapseIfSingleOverloadConverter"/>
							
							<!-- Style of the UpDownButton -->
							<Style TargetType="{x:Type Button}" x:Key="upDownButtonStyle">
								<Style.Setters>
									<Setter Property="Background" Value="LightGray"/>
									<Setter Property="Padding" Value="2,2,2,2"/>
									<Setter Property="Width" Value="9"/>
									<Setter Property="Height" Value="9"/>
									<Setter Property="SnapsToDevicePixels" Value="True"/>
									<Setter Property="OverridesDefaultStyle" Value="True"/>
									<Setter Property="Template">
										<Setter.Value>
											<ControlTemplate TargetType="{x:Type Button}">
												<Border Name="bd"
												        Background="{TemplateBinding Background}" CornerRadius="2">
													<ContentControl Margin="{TemplateBinding Padding}"
													                Content="{TemplateBinding Content}"/>
												</Border>
												<ControlTemplate.Triggers>
													<Trigger Property="IsMouseOver" Value="true">
														<Setter TargetName="bd" Property="Background" Value="LightBlue"/>
													</Trigger>
												</ControlTemplate.Triggers>
											</ControlTemplate>
										</Setter.Value>
									</Setter>
								</Style.Setters>
							</Style>
						
							<DataTemplate x:Key="TextBlockTemplate">
								<TextBlock TextWrapping="Wrap" Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content}" />
							</DataTemplate>
						</Grid.Resources>
						
						<Grid.ColumnDefinitions>
							<ColumnDefinition Width="Auto"/>
							<ColumnDefinition Width="1*"/>
						</Grid.ColumnDefinitions>
						<Grid.RowDefinitions>
							<RowDefinition Height="Auto"/>
							<RowDefinition Height="1*"/>
						</Grid.RowDefinitions>
						
						<StackPanel Grid.Row="0" Grid.Column="0"
						            Margin="0,0,4,0"
						            Orientation="Horizontal"
						            Visibility="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Provider.Count, Converter={StaticResource collapseIfSingleOverloadConverter}}">
							<Button Name="PART_UP" Style="{StaticResource upDownButtonStyle}">
								<Path Stroke="Black" Fill="Black" Data="M 0,0.866 L 1,0.866 L 0.5,0 Z" Stretch="UniformToFill" />
							</Button>
							<TextBlock Margin="2,0,2,0"
							           Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Provider.CurrentIndexText}"/>
							<Button Name="PART_DOWN" Style="{StaticResource upDownButtonStyle}">
								<Path Stroke="Black" Fill="Black" Data="M 0,0 L 1,0 L 0.5,0.866 Z" Stretch="UniformToFill" />
							</Button>
						</StackPanel>
						<ContentPresenter Grid.Row="0" Grid.Column="1" ContentTemplateSelector="{StaticResource templateSelector}"
						                  Content="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Provider.CurrentHeader}" />
						<ContentPresenter Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" ContentTemplateSelector="{StaticResource templateSelector}"
						                  Content="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Provider.CurrentContent}" />
					</Grid>
				</ControlTemplate>
			</Setter.Value>
		</Setter>
	</Style>
</ResourceDictionary>
public class JobOutlineControl : Control { #region members private Size _sizeControl = new Size(0, 0); ScrollViewer _parentScrollViewer = null; public struct LevelOffset { public const double level_0 = 0.0; public const double level_1 = 10.0; public const double level_2 = 20.0; public const double level_3 = 37.0; public const double level_4 = 50.0; public const double level_5 = 60.0; public const double level_6 = 77.0; public const double level_7 = 90.0; public const double level_8 = 100.0; } private double _verticalOffset = 0; private double _viewportHeight = 0; private const double HEADER_FONT_HEIGHT = 35; private const double TITLE_FONT_HEIGHT = 22; private const double SUB_TITLE_FONT_HEIGHT = 19; private const double NORMAL_FONT_HEIGHT = 17; private const double WIDTH = 330; #endregion members public JobOutlineControl() : base() { Unloaded += JobOutlineControl_Unloaded; DataContextChanged += JobOutlineControl_DataContextChanged; Width = WIDTH; } private void JobOutlineControl_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e) { if (_parentScrollViewer != null) { _parentScrollViewer.ScrollToTop(); } InvalidateVisual(); } #region events private void JobOutlineControl_Unloaded(object sender, RoutedEventArgs e) { if (_parentScrollViewer == null) { _parentScrollViewer.ScrollChanged -= ScrollViewer_ScrollChanged; } } private void ScrollViewer_ScrollChanged(object sender, ScrollChangedEventArgs e) { if (e.VerticalChange == 0.0) return; _verticalOffset = _parentScrollViewer.VerticalOffset; _viewportHeight = _parentScrollViewer.ViewportHeight; InvalidateVisual(); } #endregion events #region render protected override void OnRender(DrawingContext drawingContext) { base.OnRender(drawingContext); if (!(DataContext is JobTicket job)) return; if (_parentScrollViewer == null) { _parentScrollViewer = this.FindAncestor<ScrollViewer>(); _parentScrollViewer.ScrollChanged += ScrollViewer_ScrollChanged; } else if (_viewportHeight == 0) { _viewportHeight = _parentScrollViewer.ActualHeight; } _sizeControl = new Size(); _sizeControl.Height += 10; DrawHeaderText(drawingContext, "JOB OUTLINE", 30, LevelOffset.level_0); _sizeControl.Height += HEADER_FONT_HEIGHT; _sizeControl.Height += 20; DrawHeaderText(drawingContext, "BASIC", 17, LevelOffset.level_0); _sizeControl.Height += TITLE_FONT_HEIGHT; _sizeControl.Height += 5.0; var basicProps = GetNameValueList(job); foreach (var prop in basicProps) { DrawNameValueText(drawingContext, prop, LevelOffset.level_1, PackIconKind.Pencil); _sizeControl.Height += NORMAL_FONT_HEIGHT; } //JobTicket.Spool if (job.Spool != null) { _sizeControl.Height += 20; DrawHeaderText(drawingContext, "SPOOL", 17, LevelOffset.level_0); _sizeControl.Height += TITLE_FONT_HEIGHT; _sizeControl.Height += 5.0; basicProps = GetNameValueList(job.Spool); foreach (var prop in basicProps) { DrawNameValueText(drawingContext, prop, LevelOffset.level_1, PackIconKind.Pencil); _sizeControl.Height += NORMAL_FONT_HEIGHT; } } //JobTicket.ProcessParameters if (job.ProcessParameters != null) { _sizeControl.Height += 20; DrawHeaderText(drawingContext, "PROCESS PARAMETERS", 17, LevelOffset.level_0); _sizeControl.Height += TITLE_FONT_HEIGHT; _sizeControl.Height += 5.0; basicProps = GetNameValueList(job.ProcessParameters); foreach (var prop in basicProps) { DrawNameValueText(drawingContext, prop, LevelOffset.level_1, PackIconKind.Settings); _sizeControl.Height += NORMAL_FONT_HEIGHT; } } //JobTicket.Segments if (job.Segments != null) { _sizeControl.Height += 20; DrawHeaderText(drawingContext, "SEGMENTS", 17, LevelOffset.level_0); _sizeControl.Height += TITLE_FONT_HEIGHT; _sizeControl.Height += 10.0; int index = 0; foreach (JobSegment seg in job.Segments) { DrawHeaderText(drawingContext, string.Format("#{0} SEGMENT", ++index), 14, LevelOffset.level_1); _sizeControl.Height += SUB_TITLE_FONT_HEIGHT; basicProps = GetNameValueList(seg); foreach (var prop in basicProps) { DrawNameValueText(drawingContext, prop, LevelOffset.level_2, PackIconKind.Pencil); _sizeControl.Height += NORMAL_FONT_HEIGHT; } //BrushStops DrawHeaderText(drawingContext, "BRUSH STOPS", 12, LevelOffset.level_3); _sizeControl.Height += NORMAL_FONT_HEIGHT; int indexBrush = 0; foreach (JobBrushStop brushstop in seg.BrushStops) { _sizeControl.Height += 5.0; DrawHeaderText(drawingContext, string.Format("#{0} STOP", ++indexBrush), 11, LevelOffset.level_4); _sizeControl.Height += NORMAL_FONT_HEIGHT; var brushStops = GetNameValueList(brushstop); foreach (var brushstopprop in brushStops) { DrawNameValueText(drawingContext, brushstopprop, LevelOffset.level_5, PackIconKind.Pencil); _sizeControl.Height += NORMAL_FONT_HEIGHT; } DrawHeaderText(drawingContext, "DISPENSERS", 12, LevelOffset.level_6); _sizeControl.Height += NORMAL_FONT_HEIGHT; _sizeControl.Height += 5.0; int indexDispenser = 0; foreach (JobDispenser disp in brushstop.Dispensers) { DrawHeaderText(drawingContext, string.Format("#{0} DISPENSER", ++indexDispenser), 11, LevelOffset.level_6); _sizeControl.Height += NORMAL_FONT_HEIGHT; var dispProperties = GetNameValueList(disp); foreach (var dispprop in dispProperties) { DrawNameValueText(drawingContext, dispprop, LevelOffset.level_7, PackIconKind.ArrowRightBoldCircle); _sizeControl.Height += NORMAL_FONT_HEIGHT; } } } } } if (Height != _sizeControl.Height) { Height = _sizeControl.Height; } } public IEnumerable<Tuple<String, String>> GetNameValueList(object value) { if (value != null) { var properties = value.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance).Where(x => (!x.PropertyType.IsClass && !typeof(IEnumerable).IsAssignableFrom(x.PropertyType)) || x.PropertyType == typeof(String)).ToList(); return properties.Select(x => new Tuple<string, string>(x.Name, x.GetValue(value).ToString())); } else { return null; } } #endregion render #region drawing protected void DrawNameValueText(DrawingContext drawingContext, Tuple<string, string> text, double levelOfOffset, PackIconKind? icon) { if (IsInViewPort()) { FormattedText formattedName = new FormattedText(text.Item1 + ": ", System.Globalization.CultureInfo.InvariantCulture, System.Windows.FlowDirection.LeftToRight, new Typeface(this.FontFamily, FontStyles.Normal, FontWeights.Normal, FontStretches.Normal), 12, Foreground); DrawIconTextIfVisible(drawingContext, levelOfOffset, formattedName, icon); double widthOfNameText = formattedName.WidthIncludingTrailingWhitespace + 17 + levelOfOffset;//17 pix for draw icon before text FormattedText formattedValue = new FormattedText(text.Item2, System.Globalization.CultureInfo.InvariantCulture, System.Windows.FlowDirection.LeftToRight, new Typeface(this.FontFamily, FontStyles.Normal, FontWeights.SemiBold, FontStretches.Normal), 12, Foreground); DrawIconTextIfVisible(drawingContext, widthOfNameText, formattedValue); _sizeControl.Width = Math.Max(_sizeControl.Width, (widthOfNameText + formattedValue.WidthIncludingTrailingWhitespace)); } } private bool IsInViewPort() { return (_sizeControl.Height >= _verticalOffset && _sizeControl.Height <= (_verticalOffset + _viewportHeight + 5)); } protected void DrawHeaderText(DrawingContext drawingContext, string text, int fontSize, double levelOfOffset) { if (IsInViewPort()) { FormattedText formattedtext = new FormattedText(text, System.Globalization.CultureInfo.InvariantCulture, System.Windows.FlowDirection.LeftToRight, new Typeface(this.FontFamily, FontStyles.Normal, FontWeights.SemiBold, FontStretches.Normal), fontSize, Foreground); DrawIconTextIfVisible(drawingContext, levelOfOffset, formattedtext); _sizeControl.Width = Math.Max(_sizeControl.Width, (formattedtext.Width + levelOfOffset)); } } private void DrawIconTextIfVisible(DrawingContext drawingContext, double levelOfOffset, FormattedText formattedText, PackIconKind? icon = null) { if (icon is PackIconKind) { DrawIcon(drawingContext, (PackIconKind)icon, new Point(levelOfOffset, _sizeControl.Height)); levelOfOffset += 17; } drawingContext.DrawText(formattedText, new Point(levelOfOffset, _sizeControl.Height)); } private void DrawIcon(DrawingContext drawingContext, PackIconKind kind, Point point) { GeometryGroup group = GetGeometryByIcon(kind); SetGeometryPosition(group, point); drawingContext.DrawGeometry(Foreground, new Pen(Brushes.White, 1), group); } private GeometryGroup GetGeometryByIcon(PackIconKind kind) { PackIcon icon = new PackIcon { Kind = kind }; Geometry geometry = Geometry.Parse(icon.Data); GeometryGroup group = new GeometryGroup(); group.Children.Add(geometry); TransformGroup tg = new TransformGroup(); tg.Children.Add(new ScaleTransform() { ScaleX = 10d / geometry.Bounds.Width, ScaleY = 10d / geometry.Bounds.Height, }); tg.Children.Add(new TranslateTransform() { }); group.Transform = tg; return group; } private void SetGeometryPosition(GeometryGroup group, Point point) { TransformGroup tg = group.Transform as TransformGroup; (tg.Children[1] as TranslateTransform).X = point.X; (tg.Children[1] as TranslateTransform).Y = point.Y + 1; } #endregion drawing } }