using Google.Protobuf;
using Google.Protobuf.Reflection;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using Tango.PMR.Common;
using Tango.PMR.Integration;
/// <summary>
/// Contains PMR extension methods.
/// </summary>
public static class ExtensionMethods
{
/// <summary>
/// Gets the protobuf <see cref="OriginalNameAttribute"/> attribute value from the message type.
/// </summary>
/// <param name="value">The value.</param>
/// <returns></returns>
public static String ToOriginalName(this MessageType value)
{
FieldInfo fi = value.GetType().GetField(value.ToString());
OriginalNameAttribute[] attributes = (OriginalNameAttribute[])fi.GetCustomAttributes(typeof(OriginalNameAttribute), false);
if (attributes != null &&
attributes.Length > 0)
return attributes[0].Name;
else
return value.ToString();
}
/// <summary>
/// Gets the message parser.
/// </summary>
/// <param name="message">The message.</param>
/// <returns></returns>
public static MessageParser GetParser(this IMessage message)
{
MessageParser parser = message.GetType().GetProperty("Parser").GetValue(message) as MessageParser;
return parser;
}
/// <summary>
/// Determines whether the specified intent requires a password.
/// </summary>
/// <param name="intent">The intent.</param>
/// <returns></returns>
public static bool RequiresPassword(this ExternalBridgeLoginIntent intent)
{
return
intent == ExternalBridgeLoginIntent.Diagnostics
||
intent == ExternalBridgeLoginIntent.FullControl;
}
/// <summary>
/// Gets the name of the generic request type.
/// </summary>
/// <param name="request">The request.</param>
/// <returns></returns>
public static String GetTypeName(this GenericRequest request)
{
try
{
return request.Type.Split(',').First().Split('.').Last();
}
catch
{
return request.Type;
}
}
/// <summary>
/// Gets the name of the generic response type.
/// </summary>
/// <param name="response">The response.</param>
/// <returns></returns>
public static String GetTypeName(this GenericResponse response)
{
try
{
return response.Type.Split(',').First().Split('.').Last();
}
catch
{
return response.Type;
}
}
}
nt; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */<UserControl x:Class="Tango.MachineStudio.Technician.Views.MachineTechView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:vm="clr-namespace:Tango.MachineStudio.Technician.ViewModels"
xmlns:global="clr-namespace:Tango.MachineStudio.Technician"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:fa="http://schemas.fontawesome.io/icons/"
xmlns:editors="clr-namespace:Tango.Editors;assembly=Tango.Editors"
xmlns:techItems="clr-namespace:Tango.MachineStudio.Technician.TechItems"
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
xmlns:mahapps="http://metro.mahapps.com/winfx/xaml/controls"
xmlns:templates="clr-namespace:Tango.MachineStudio.Technician.PropertiesTemplates"
xmlns:items="clr-namespace:Tango.MachineStudio.Technician.TechItems"
xmlns:converters="clr-namespace:Tango.SharedUI.Converters;assembly=Tango.SharedUI"
xmlns:localConverters="clr-namespace:Tango.MachineStudio.Technician.Converters"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Tango.MachineStudio.Technician.Views"
mc:Ignorable="d"
d:DesignHeight="720" d:DesignWidth="1920" d:DataContext="{d:DesignInstance Type=vm:MachineTechViewVM, IsDesignTimeCreatable=False}" DataContext="{x:Static global:ViewModelLocator.MachineTechViewVM}">
<UserControl.Resources>
<converters:BooleanToVisibilityInverseConverter x:Key="BooleanToVisibilityInverseConverter" />
<converters:NumberToFileSizeConverter x:Key="NumberToFileSizeConverter" />
<localConverters:SecondsToTimeSpanConverter x:Key="SecondsToTimeSpanConverter" />
<DataTemplate x:Key="TabTemplate">
<Grid>
<Grid.Style>
<Style TargetType="Grid">
<Setter Property="Visibility" Value="Visible"></Setter>
<Style.Triggers>
<DataTrigger Binding="{Binding IsSelected}" Value="False">
<Setter Property="Visibility" Value="Hidden"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Style>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<editors:ElementsEditor
x:Name="editor"
Elements="{Binding Elements}"
Loaded="Editor_Loaded"
ElementCreation="ElementsEditor_ElementCreation"
ElementsRemoved="ElementsEditor_ElementsRemoved"
AfterPaste="ElementsEditor_AfterPaste"
RulerHeight="32"
EditorWidth="1920"
EditorHeight="1080"
FontSize="10"
Background="#7EFFFFFF"
EditorBackground="#70FFFFFF"
RulerBackground="Transparent"
Foreground="#1EA9FF"
SelectionFillBrush="#338D8D8D"
SelectionStrokeBrush="#1EA9FF"
BorderBrush="#1EA9FF"
BorderThickness="1">
<editors:ElementsEditor.Style>
<Style TargetType="editors:ElementsEditor">
<Setter Property="IsEditable" Value="True"></Setter>
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=listMode,Path=SelectedIndex}" Value="1">
<Setter Property="IsEditable" Value="False"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</editors:ElementsEditor.Style>
<editors:ElementsEditor.ContextMenu>
<ContextMenu DataContext="{Binding Path=PlacementTarget, RelativeSource={RelativeSource Self}}">
<MenuItem Header="Cut (Ctrl+X)" Command="{Binding CutCommand}" MinWidth="210">
<MenuItem.Icon>
<fa:ImageAwesome Icon="Cut" Width="16" />
</MenuItem.Icon>
</MenuItem>
<MenuItem Header="Copy (Ctrl+C)" Command="{Binding CopyCommand}">
<MenuItem.Icon>
<fa:ImageAwesome Icon="Copy" Width="16" />
</MenuItem.Icon>
</MenuItem>
<MenuItem Header="Paste (Ctrl+V)" Command="{Binding PasteCommand}">
<MenuItem.Icon>
<fa:ImageAwesome Icon="Paste" Width="16" />
</MenuItem.Icon>
</MenuItem>
<Separator/>
<MenuItem Header="Undo (Ctrl+Z)" Command="{Binding UndoCommand}">
<MenuItem.Icon>
<fa:ImageAwesome Icon="Undo" Width="16" />
</MenuItem.Icon>
</MenuItem>
<MenuItem Header="Redo (Ctrl+Y)" Command="{Binding RedoCommand}">
<MenuItem.Icon>
<fa:ImageAwesome Icon="RotateRight" Width="16"></fa:ImageAwesome>
</MenuItem.Icon>
</MenuItem>
<Separator/>
<MenuItem Header="Delete (DELETE)" Command="{Binding DeleteCommand}">
<MenuItem.Icon>
<fa:ImageAwesome Icon="Recycle" Width="16" />
</MenuItem.Icon>
</MenuItem>
<Separator/>
<MenuItem Header="Select All (Ctrl+A)" Command="{Binding SelectAllCommand}">
<MenuItem.Icon>
<fa:ImageAwesome Icon="Th" Width="16" />
</MenuItem.Icon>
</MenuItem>
</ContextMenu>
</editors:ElementsEditor.ContextMenu>
</editors:ElementsEditor>
<Slider Grid.Column="1" Orientation="Vertical" Margin="5" Maximum="3" Minimum="0.2" Value="{Binding ElementName=editor,Path=ScaleFactor}"></Slider>
</Grid>
</DataTemplate>
</UserControl.Resources>
<Grid>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="150"/>
<RowDefinition Height="199*"/>
</Grid.RowDefinitions>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="1*"/>
</Grid.RowDefinitions>
<Menu Padding="5" Background="#C6ECECEC" Visibility="{Binding HideMenu,Converter={StaticResource BooleanToVisibilityInverseConverter}}">
<MenuItem Header="File">
<MenuItem Command="{Binding NewProjectCommand}" MinWidth="180" Header="New" VerticalContentAlignment="Center">
<MenuItem.Icon>
<fa:ImageAwesome Icon="File" Width="16" />
</MenuItem.Icon>
</MenuItem>
<Separator/>
<MenuItem Command="{Binding OpenProjectCommand}" MinWidth="180" Header="Open" VerticalContentAlignment="Center">
<MenuItem.Icon>
<fa:ImageAwesome Icon="FolderOpen" Width="16" />
</MenuItem.Icon>
</MenuItem>
<MenuItem MinWidth="180" Header="Import" VerticalContentAlignment="Center">
<MenuItem.Icon>
<fa:ImageAwesome Icon="ArrowRight" Width="16" />
</MenuItem.Icon>
<MenuItem Header="Import Project Tabs" VerticalContentAlignment="Center" Command="{Binding ImportProjectTabsCommand}">
<MenuItem.Icon>
<fa:ImageAwesome Icon="Table" Width="16" />
</MenuItem.Icon>
</MenuItem>
</MenuItem>
<Separator/>
<MenuItem Header="Save" Command="{Binding SaveProjectCommand}">
<MenuItem.Icon>
<fa:ImageAwesome Icon="Save" Width="16" />
</MenuItem.Icon>
</MenuItem>
<MenuItem Header="Save as" Command="{Binding SaveAsProjectCommand}">
<MenuItem.Icon>
<fa:ImageAwesome Icon="Save" Width="16" />
</MenuItem.Icon>
</MenuItem>
</MenuItem>
<MenuItem Header="Edit">
<MenuItem Header="Cut (Ctrl+X)" Command="{Binding SelectedTab.Editor.CutCommand}" MinWidth="210">
<MenuItem.Icon>
<fa:ImageAwesome Icon="Cut" Width="16" />
</MenuItem.Icon>
</MenuItem>
<MenuItem Header="Copy (Ctrl+C)" Command="{Binding SelectedTab.Editor.CopyCommand}">
<MenuItem.Icon>
<fa:ImageAwesome Icon="Copy" Width="16" />
</MenuItem.Icon>
</MenuItem>
<MenuItem Header="Paste (Ctrl+V)" Command="{Binding SelectedTab.Editor.PasteCommand}">
<MenuItem.Icon>
<fa:ImageAwesome Icon="Paste" Width="16" />
</MenuItem.Icon>
</MenuItem>
<Separator/>
<MenuItem Header="Undo (Ctrl+Z)" Command="{Binding SelectedTab.Editor.UndoCommand}">
<MenuItem.Icon>
<fa:ImageAwesome Icon="Undo" Width="16" />
</MenuItem.Icon>
</MenuItem>
<MenuItem Header="Redo (Ctrl+Y)" Command="{Binding SelectedTab.Editor.RedoCommand}">
<MenuItem.Icon>
<fa:ImageAwesome Icon="RotateRight" Width="16"></fa:ImageAwesome>
</MenuItem.Icon>
</MenuItem>
<Separator/>
<MenuItem Header="Delete (DELETE)" Command="{Binding SelectedTab.Editor.DeleteCommand}">
<MenuItem.Icon>
<fa:ImageAwesome Icon="Recycle" Width="16" />
</MenuItem.Icon>
</MenuItem>
<Separator/>
<MenuItem Header="Select All (Ctrl+A)" Command="{Binding SelectedTab.Editor.SelectAllCommand}">
<MenuItem.Icon>
<fa:ImageAwesome Icon="Th" Width="16" />
</MenuItem.Icon>
</MenuItem>
</MenuItem>
<MenuItem Header="View">
<MenuItem Header="Zoom In" Command="{Binding SelectedTab.Editor.ZoomCommand}" CommandParameter="0.1">
<MenuItem.Icon>
<fa:ImageAwesome Icon="SearchPlus" Width="16" />
</MenuItem.Icon>
</MenuItem>
<MenuItem Header="Zoom Out" Command="{Binding SelectedTab.Editor.ZoomCommand}" CommandParameter="-0.1">
<MenuItem.Icon>
<fa:ImageAwesome Icon="SearchMinus" Width="16" />
</MenuItem.Icon>
</MenuItem>
<Separator/>
<MenuItem Header="Reset Zoom" Command="{Binding SelectedTab.Editor.ResetZoomCommand}">
<MenuItem.Icon>
<fa:ImageAwesome Icon="Search" Width="16" />
</MenuItem.Icon>
</MenuItem>
</MenuItem>
<MenuItem Header="Tools">
<MenuItem Header="Upload partial hardware configuration" Command="{Binding UploadPartialHardwareConfigurationCommand}">
<MenuItem.Icon>
<fa:ImageAwesome Icon="Upload" Width="16" />
</MenuItem.Icon>
</MenuItem>
<MenuItem Header="Reset all graphs" Command="{Binding ResetGraphsCommand}">
<MenuItem.Icon>
<fa:ImageAwesome Icon="Refresh" Width="16" />
</MenuItem.Icon>
</MenuItem>
</MenuItem>
<MenuItem Header="Components">
<MenuItem.ItemContainerStyle>
<Style TargetType="MenuItem" BasedOn="{x:Null}">
<Setter Property="Background" Value="Transparent"></Setter>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="Transparent"></Setter>
</Trigger>
</Style.Triggers>
</Style>
</MenuItem.ItemContainerStyle>
<ListBox Margin="-27 0 -22 0" MinWidth="180" ScrollViewer.VerticalScrollBarVisibility="Disabled" ScrollViewer.HorizontalScrollBarVisibility="Disabled" ItemsSource="{Binding AvailableTechItems}" SelectedItem="{Binding SelectedTechItem}" HorizontalContentAlignment="Stretch">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Border Width="24" Height="24" BorderThickness="1" CornerRadius="100">
<Border.Style>
<Style TargetType="Border">
<Setter Property="Background" Value="Transparent"></Setter>
<Setter Property="BorderBrush" Value="{StaticResource AccentColorBrush}"></Setter>
<Setter Property="BorderThickness" Value="1"></Setter>
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=ListBoxItem},Path=IsSelected}" Value="True">
<Setter Property="Background" Value="White"></Setter>
<Setter Property="BorderBrush" Value="#FF7575"></Setter>
<Setter Property="BorderThickness" Value="2"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
<Image Source="{Binding Image}" RenderOptions.BitmapScalingMode="Fant"></Image>
</Border>
<TextBlock Margin="5 0 0 0" VerticalAlignment="Center" Text="{Binding Name}"></TextBlock>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</MenuItem>
</Menu>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right" VerticalAlignment="Bottom" Margin="0 0 5 10" Height="40">
<Button Height="Auto" Margin="0 0 10 0" FontSize="12" Command="{Binding ResetHardwareConfigurationCommand}" ToolTip="Reset all visual elements to the hardware configuration defined for the current machine">
<StackPanel Orientation="Horizontal">
<materialDesign:PackIcon Margin="0 0 2 0" Width="24" Height="24" Kind="Refresh"/>
<TextBlock VerticalAlignment="Center">RESET</TextBlock>
</StackPanel>
</Button>
<Button Height="Auto" Margin="0 0 10 0" FontSize="12" Command="{Binding SyncHardwareConfigurationCommand}" IsEnabled="{Binding ApplicationManager.IsMachineConnected}" ToolTip="Sync all visual elements to the current hardware configuration stored on the machine (last uploaded)">
<StackPanel Orientation="Horizontal">
<materialDesign:PackIcon Margin="0 0 0 0" Width="24" Height="24" Kind="ArrowDownBold"/>
<TextBlock VerticalAlignment="Center">SYNC HW CONFIG</TextBlock>
</StackPanel>
</Button>
<Button Height="Auto" FontSize="12" Command="{Binding UploadHardwareConfigurationCommand}" IsEnabled="{Binding ApplicationManager.IsMachineConnected}" ToolTip="Create a hardware configuration from the visual elements and upload that configuration">
<StackPanel Orientation="Horizontal">
<TextBlock VerticalAlignment="Center">UPLOAD HW CONFIG</TextBlock>
<materialDesign:PackIcon Margin="10 0 0 0" Width="24" Height="24" Kind="ArrowRightBold"/>
</StackPanel>
</Button>
</StackPanel>
<Grid Grid.Row="1">
<StackPanel HorizontalAlignment="Left" Orientation="Horizontal" Margin="20 0 0 0">
<ListBox ItemContainerStyle="{StaticResource basicListBoxItem}" ItemsSource="{Binding AvailableTechItems}" SelectedItem="{Binding SelectedTechItem,Mode=TwoWay}" HorizontalContentAlignment="Stretch" ScrollViewer.HorizontalScrollBarVisibility="Disabled" ScrollViewer.VerticalScrollBarVisibility="Disabled">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"></StackPanel>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate DataType="{x:Type techItems:TechItem}">
<Border Cursor="Hand" ToolTip="{Binding Description}" RenderTransformOrigin="0.5,0.5" Width="52" Height="52" Padding="10" Margin="5" BorderThickness="1" CornerRadius="100">
<Border.Style>
<Style TargetType="Border">
<Setter Property="RenderTransform">
<Setter.Value>
<ScaleTransform ScaleX="1" ScaleY="1"></ScaleTransform>
</Setter.Value>
</Setter>
<Setter Property="Background" Value="Transparent"></Setter>
<Setter Property="BorderBrush" Value="{StaticResource AccentColorBrush}"></Setter>
<Setter Property="BorderThickness" Value="1"></Setter>
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=ListBoxItem},Path=IsSelected}" Value="True">
<Setter Property="Background" Value="White"></Setter>
<Setter Property="BorderBrush" Value="#FF7575"></Setter>
<Setter Property="BorderThickness" Value="2"></Setter>
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="RenderTransform.ScaleX" To="1.1" Duration="00:00:0.2"></DoubleAnimation>
<DoubleAnimation Storyboard.TargetProperty="RenderTransform.ScaleY" To="1.1" Duration="00:00:0.2"></DoubleAnimation>
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
<DataTrigger.ExitActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="RenderTransform.ScaleX" To="1" Duration="00:00:0.2"></DoubleAnimation>
<DoubleAnimation Storyboard.TargetProperty="RenderTransform.ScaleY" To="1" Duration="00:00:0.2"></DoubleAnimation>
</Storyboard>
</BeginStoryboard>
</DataTrigger.ExitActions>
</DataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
<Image Source="{Binding Image}" RenderOptions.BitmapScalingMode="Fant"></Image>
</Border>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
<StackPanel HorizontalAlignment="Right" Orientation="Horizontal" Margin="0 0 335 10" VerticalAlignment="Bottom">
<ListBox x:Name="listMode" SelectedIndex="0" Style="{StaticResource MaterialDesignToolToggleListBox}">
<ListBoxItem Height="40" Width="60" HorizontalContentAlignment="Center" ToolTip="Edit Mode">
<materialDesign:PackIcon HorizontalAlignment="Center" Width="30" Height="30" Kind="Pencil" />
</ListBoxItem>
<ListBoxItem Height="40" Width="60" HorizontalContentAlignment="Center" ToolTip="Action Mode" MouseUp="OnActionModeClicked">
<materialDesign:PackIcon HorizontalAlignment="Center" Width="30" Height="30" Kind="HandPointingRight" />
</ListBoxItem>
</ListBox>
</StackPanel>
</Grid>
</Grid>
<Grid Grid.Row="1">
<Grid.RowDefinitions>
<RowDefinition Height="30"/>
<RowDefinition Height="1*"/>
</Grid.RowDefinitions>
<StackPanel Orientation="Horizontal" Margin="35 0 0 0">
<ListBox Style="{x:Null}" HorizontalAlignment="Left" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" ItemContainerStyle="{StaticResource basicListBoxItem}" ScrollViewer.HorizontalScrollBarVisibility="Disabled" ScrollViewer.VerticalScrollBarVisibility="Disabled" Background="Transparent" BorderThickness="0" ItemsSource="{Binding Tabs}" SelectedItem="{Binding SelectedTab}">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel HorizontalAlignment="Left" Orientation="Horizontal"></StackPanel>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate>
<Border Padding="5 5" Width="160" CornerRadius="10 10 0 0" Margin="1 0" Tag="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=DataContext}">
<Border.ContextMenu>
<ContextMenu DataContext="{Binding Path=PlacementTarget.Tag, RelativeSource={RelativeSource Self}}">
<MenuItem Header="Rename" Command="{Binding RenameTabCommand}" MinWidth="210">
<MenuItem.Icon>
<fa:ImageAwesome Icon="Pencil" Width="16" />
</MenuItem.Icon>
</MenuItem>
</ContextMenu>
</Border.ContextMenu>
<Border.Style>
<Style TargetType="Border">
<Setter Property="Background" Value="#CBCBCB"></Setter>
<Setter Property="TextElement.Foreground" Value="#202020"></Setter>
<Style.Triggers>
<DataTrigger Binding="{Binding IsSelected}" Value="True">
<Setter Property="Background" Value="{StaticResource AccentColorBrush}"></Setter>
<Setter Property="TextElement.Foreground" Value="White"></Setter>
</DataTrigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Opacity" Value="0.8"></Setter>
</Trigger>
</Style.Triggers>
</Style>
</Border.Style>
<DockPanel VerticalAlignment="Center">
<Button Cursor="Hand" Command="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=DataContext.RemoveTabCommand}" CommandParameter="{Binding}" DockPanel.Dock="Right" Margin="5 0 0 0" Style="{StaticResource MaterialDesignFlatButton}" Padding="2" Height="Auto">
<materialDesign:PackIcon Kind="Close">
<materialDesign:PackIcon.Style>
<Style TargetType="materialDesign:PackIcon">
<Setter Property="Foreground" Value="#202020"></Setter>
<Style.Triggers>
<DataTrigger Binding="{Binding IsSelected}" Value="True">
<Setter Property="Foreground" Value="White"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</materialDesign:PackIcon.Style>
</materialDesign:PackIcon>
</Button>
<TextBlock Text="{Binding Name}" VerticalAlignment="Center" TextAlignment="Center" TextTrimming="CharacterEllipsis" FontSize="11"></TextBlock>
</DockPanel>
</Border>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<Button Margin="10 0 0 0" Style="{StaticResource MaterialDesignFlatButton}" Padding="2" Height="24" Cursor="Hand" Command="{Binding AddTabCommand}" ToolTip="New tab">
<materialDesign:PackIcon Width="20" Height="20" Kind="Plus" Foreground="{StaticResource AccentColorBrush}" />
</Button>
</StackPanel>
<Grid Margin="5 0 5 5" Grid.Row="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*"/>
<ColumnDefinition Width="300"/>
</Grid.ColumnDefinitions>
<ItemsControl ItemsSource="{Binding Tabs}" ItemTemplate="{StaticResource TabTemplate}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Grid/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
<Grid Grid.Column="1">
<DockPanel>
<TextBlock DockPanel.Dock="Top" Margin="0 -30 0 0" Text="{Binding SelectedTab.Editor.SelectedElement.HostedElement.TechName}" FontSize="16" FontWeight="Bold" FontStyle="Italic"></TextBlock>
<ScrollViewer VerticalScrollBarVisibility="Auto">
<StackPanel>
<GroupBox DockPanel.Dock="Top" Header="BOUNDS" Padding="5">
<StackPanel>
<!--Position-->
<UniformGrid Columns="2" Margin="0 5 0 0">
<StackPanel Margin="0 0 5 0">
<TextBlock>Left</TextBlock>
<mahapps:NumericUpDown HasDecimals="False" HorizontalContentAlignment="Center" BorderBrush="Gainsboro" Foreground="Gray" Margin="0 5 0 0" Minimum="0" Maximum="{Binding SelectedTab.Editor.EditorWidth}" Value="{Binding SelectedTab.Editor.SelectedElement.Left}"></mahapps:NumericUpDown>
</StackPanel>
<StackPanel Margin="5 0 0 0">
<TextBlock>Top</TextBlock>
<mahapps:NumericUpDown HasDecimals="False" HorizontalContentAlignment="Center" BorderBrush="Gainsboro" Foreground="Gray" Margin="0 5 0 0" Minimum="0" Maximum="{Binding SelectedTab.Editor.EditorHeight}" Value="{Binding SelectedTab.Editor.SelectedElement.Top}"></mahapps:NumericUpDown>
</StackPanel>
</UniformGrid>
<!--Size-->
<UniformGrid Columns="2" Margin="0 20 0 0">
<StackPanel Margin="0 0 5 0">
<TextBlock>Width</TextBlock>
<mahapps:NumericUpDown HasDecimals="False" HorizontalContentAlignment="Center" BorderBrush="Gainsboro" Foreground="Gray" Margin="0 5 0 0" Minimum="10" Maximum="{Binding SelectedTab.Editor.EditorWidth}" Value="{Binding SelectedTab.Editor.SelectedElement.Width}"></mahapps:NumericUpDown>
</StackPanel>
<StackPanel Margin="5 0 0 0">
<TextBlock>Height</TextBlock>
<mahapps:NumericUpDown HasDecimals="False" HorizontalContentAlignment="Center" BorderBrush="Gainsboro" Foreground="Gray" Margin="0 5 0 0" Minimum="10" Maximum="{Binding SelectedTab.Editor.EditorHeight}" Value="{Binding SelectedTab.Editor.SelectedElement.Height}"></mahapps:NumericUpDown>
</StackPanel>
</UniformGrid>
<!--<Angle-->
<Grid Margin="0 20 0 0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="22*"></ColumnDefinition>
<ColumnDefinition Width="20*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<TextBlock VerticalAlignment="Center" Margin="0 0 10 0" HorizontalAlignment="Left">Angle</TextBlock>
<mahapps:NumericUpDown Grid.Column="1" HorizontalContentAlignment="Center" BorderBrush="Gainsboro" Foreground="Gray" Maximum="360" Minimum="-360" HasDecimals="False" Margin="0 5 0 0" Value="{Binding SelectedTab.Editor.SelectedElement.Angle}"></mahapps:NumericUpDown>
</Grid>
</StackPanel>
</GroupBox>
<ContentControl Margin="0 10 0 0" DataContext="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=DataContext.SelectedTab.Editor.SelectedElement.HostedElement}" Content="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=DataContext.SelectedTab.Editor.SelectedElement.HostedElement}">
<ContentControl.Resources>
<DataTemplate DataType="{x:Type sys:Nullable}">
</DataTemplate>
<DataTemplate DataType="{x:Type items:ValveItem}">
<templates:ValveTemplate/>
</DataTemplate>
<DataTemplate DataType="{x:Type items:MonitorRecorderItem}">
<templates:MonitorRecorderTemplate/>
</DataTemplate>
<DataTemplate DataType="{x:Type items:HeaterItem}">
<templates:HeaterTemplate/>
</DataTemplate>
<DataTemplate DataType="{x:Type items:TextItem}">
<templates:TextTemplate/>
</DataTemplate>
<DataTemplate DataType="{x:Type items:JobRunnerItem}">
<templates:JobRunnerTemplate/>
</DataTemplate>
<DataTemplate DataType="{x:Type items:ProcessParametersItem}">
<templates:ProcessParametersTemplate/>
</DataTemplate>
<DataTemplate DataType="{x:Type items:BreakSensorItem}">
<templates:BreakSensorTemplate/>
</DataTemplate>
<DataTemplate DataType="{x:Type items:BlowerItem}">
<templates:BlowerTemplate/>
</DataTemplate>
<DataTemplate DataType="{x:Type items:SpeedSensorItem}">
<templates:SpeedSensorTemplate/>
</DataTemplate>
<DataTemplate DataType="{x:Type items:DancerItem}">
<templates:DancerTemplate/>
</DataTemplate>
<DataTemplate DataType="{x:Type items:WinderItem}">
<templates:WinderTemplate/>
</DataTemplate>
<DataTemplate DataType="{x:Type items:PidItem}">
<templates:PidTemplate/>
</DataTemplate>
<DataTemplate DataType="{x:Type items:ControllerItem}">
<templates:ControllerTemplate/>
</DataTemplate>
<DataTemplate DataType="{x:Type items:MonitorItem}">
<templates:MonitorTemplate/>
</DataTemplate>
<DataTemplate DataType="{x:Type items:DigitalInItem}">
<templates:DigitalInTemplate/>
</DataTemplate>
<DataTemplate DataType="{x:Type items:MotorGroupItem}">
<templates:MotorGroupTemplate/>
</DataTemplate>
<DataTemplate DataType="{x:Type items:ThreadMotionItem}">
<templates:ThreadMotionTemplate/>
</DataTemplate>
<DataTemplate DataType="{x:Type items:DigitalOutItem}">
<templates:DigitalOutTemplate/>
</DataTemplate>
<DataTemplate DataType="{x:Type items:DispenserItem}">
<templates:DispenserTemplate/>
</DataTemplate>
<DataTemplate DataType="{x:Type items:MotorItem}">
<templates:MotorTemplate/>
</DataTemplate>
<DataTemplate DataType="{x:Type items:MeterItem}">
<templates:MeterTemplate/>
</DataTemplate>
<DataTemplate DataType="{x:Type items:SingleGraphItem}">
<templates:SingleGraphTemplate/>
</DataTemplate>
<DataTemplate DataType="{x:Type items:MultiGraphItem}">
<templates:MultiGraphTemplate/>
</DataTemplate>
</ContentControl.Resources>
</ContentControl>
</StackPanel>
</ScrollViewer>
</DockPanel>
</Grid>
</Grid>
</Grid>
</Grid>
</Grid>
</UserControl>