Multiprocotol Terminalprogram (BAT)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
MultiTerm/MultiTerm.Wpf/View/ShellView.xaml

352 lines
22 KiB

<UserControl x:Class="MultiTerm.Wpf.View.ShellView"
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:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:conv="clr-namespace:MultiTerm.Wpf.ValueConverters"
xmlns:controls="clr-namespace:MultiTerm.Wpf.Controls"
xmlns:custom_controls="clr-namespace:MultiTerm.Wpf.CustomControl;assembly=MultiTerm.Wpf.CustomControl"
xmlns:vm="clr-namespace:MultiTerm.Core.ViewModel;assembly=MultiTerm.Core"
xmlns:v="clr-namespace:MultiTerm.Wpf.View"
xmlns:behaviours="clr-namespace:MultiTerm.Wpf.Behaviours"
xmlns:types="clr-namespace:MultiTerm.Core.Types;assembly=MultiTerm.Core"
xmlns:protocol_types="clr-namespace:MultiTerm.Protocols.Types;assembly=MultiTerm.Protocols"
xmlns:helpers="clr-namespace:MultiTerm.Wpf.Helpers"
mc:Ignorable="d"
KeyDown="UserControl_KeyDown"
d:DesignHeight="600" d:DesignWidth="1200">
<UserControl.Resources>
<!-- Value Converters -->
<conv:EnumDescriptionToMenuItemConverter x:Key="EnumDescriptionToMenuItemConverter"/>
<conv:EnumValueToEnumDescriptionConverter x:Key="EnumValToDescConv"/>
<conv:MessageImportanceToBrushConverter x:Key="MsgImportanceBrushConverter"/>
<conv:MessageImportanceToFontWeightConverter x:Key="MsgImportanceFontWeightConverter"/>
<conv:ProtocolTypeToIconConverter x:Key="ProtocolTypeIconConverter"/>
<conv:ProtocolConnectionStateToBrushConverter x:Key="PrtclConnectionStateBrushConverter"/>
<!-- Data Sources -->
<ObjectDataProvider x:Key="NewlineSeparatorTypeValues"
ObjectType="{x:Type sys:Enum}"
MethodName="GetValues">
<ObjectDataProvider.MethodParameters>
<x:Type TypeName="types:NewlineSeparatorType" />
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
<ObjectDataProvider x:Key="TerminalViewTypeValues"
ObjectType="{x:Type sys:Enum}"
MethodName="GetValues">
<ObjectDataProvider.MethodParameters>
<x:Type TypeName="types:TerminalViewType" />
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
<ObjectDataProvider x:Key="ProtocolTypeValues"
ObjectType="{x:Type sys:Enum}"
MethodName="GetValues">
<ObjectDataProvider.MethodParameters>
<x:Type TypeName="protocol_types:ProtocolType" />
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</UserControl.Resources>
<DockPanel>
<Menu DockPanel.Dock="Top" FontSize="14">
<!--<MenuItem Header="_File"/>-->
<!--<MenuItem Header="_Edit">
<MenuItem Header="_Copy" InputGestureText="Ctrl + C">
--><!-- <MenuItem.Icon> // TODO
<Image Width="16" Height="16" Source="copy.png"/>
</MenuItem.Icon>--><!--
</MenuItem>
<MenuItem Header="_Paste" InputGestureText="Ctrl + P">
--><!-- <MenuItem.Icon> // TODO
<Image Width="16" Height="16" Source="paste.png"/>
</MenuItem.Icon>--><!--
</MenuItem>
</MenuItem>-->
<MenuItem Header="_Settings">
<controls:SingleSelectSubMenu Title="Default Data Display Newline Separator" HorizontalContentAlignment="Left" VerticalContentAlignment="Top"
OptionsSource="{Binding Source={StaticResource NewlineSeparatorTypeValues}}"
SelectedMenuItem="{Binding DefaultReceiveNewlineSeparator, Mode=TwoWay, Converter={StaticResource EnumDescriptionToMenuItemConverter}}">
</controls:SingleSelectSubMenu>
<controls:SingleSelectSubMenu Title="Default Newline Separator on Send"
OptionsSource="{Binding Source={StaticResource NewlineSeparatorTypeValues}}"
SelectedMenuItem="{Binding DefaultSendNewlineSeparator, Mode=TwoWay, Converter={StaticResource EnumDescriptionToMenuItemConverter}}">
</controls:SingleSelectSubMenu>
</MenuItem>
<!--<MenuItem Header="_View"/>-->
<MenuItem Header="_Help">
<MenuItem Header="Logfiles" Click="MenuItem_Logfiles_Click"/>
<!--<MenuItem Header="About MultiTerm"/>-->
</MenuItem>
</Menu>
<!-- Bottom status bar with separator -->
<StatusBar DockPanel.Dock="Bottom" Height="30">
<StatusBarItem>
<ProgressBar Height="20" Width="40" Margin="3 0 0 0"
behaviours:ProgressBarSmoother.SmoothValue="{Binding Path=StatusBarMessageDurationPercentage}"
Foreground="{Binding Path=StatusBarMessageImportance, Converter={StaticResource MsgImportanceBrushConverter}}"
Opacity="0.6" BorderBrush="Transparent" Background="Transparent" FlowDirection="RightToLeft"/>
</StatusBarItem>
<Separator/>
<StatusBarItem VerticalContentAlignment="Center">
<TextBlock Text="{Binding StatusBarMessage}" FontSize="15" VerticalAlignment="Bottom"
Foreground="{Binding Path=StatusBarMessageImportance, Converter={StaticResource MsgImportanceBrushConverter}}"
FontWeight="{Binding Path=StatusBarMessageImportance, Converter={StaticResource MsgImportanceFontWeightConverter}}"/>
</StatusBarItem>
</StatusBar>
<Separator DockPanel.Dock="Bottom" Margin="0 5 0 5"/>
<!-- Grid to contain hidden add Tab Button, and the tab control -->
<Grid DockPanel.Dock="Right">
<Grid.RowDefinitions>
<RowDefinition Height="0"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*"/>
<ColumnDefinition Width="6*" MinWidth="1200"/>
</Grid.ColumnDefinitions>
<Grid.Resources>
<!-- Binding Proxy to provide DataContext to elements within ContextMenu -->
<helpers:BindingProxy x:Key="proxy" Data="{Binding}"/>
</Grid.Resources>
<!-- Button with context menu that is never visible -->
<Button Visibility="Collapsed" Grid.Row="0" Grid.Column="0">
<Button.ContextMenu>
<ContextMenu x:Name="AddTabContextMenu" PlacementRectangle="{Binding RelativeSource={RelativeSource Self}}">
<!-- View types -->
<controls:SingleSelectSubMenu Title="View type"
OptionsSource="{Binding Source={StaticResource TerminalViewTypeValues}}"
SelectedMenuItem="{Binding Data.SelectedTerminalViewType, Mode=TwoWay, Source={StaticResource proxy},
Converter={StaticResource EnumDescriptionToMenuItemConverter}}">
</controls:SingleSelectSubMenu>
<Separator/>
<!-- Protocol types -->
<controls:CommandableSubMenu Title="Protocol"
OptionsSource="{Binding Source={StaticResource ProtocolTypeValues}}"
Command="{Binding Data.AppendTerminalWithSelectedViewTypeCommand, Source={StaticResource proxy}}"
CommandParameterType="{x:Type protocol_types:ProtocolType}">
</controls:CommandableSubMenu>
</ContextMenu>
</Button.ContextMenu>
</Button>
<!-- Left Panel that holds History and Command Sets -->
<DockPanel Grid.Row="0" Grid.RowSpan="2" Grid.Column="0" Width="Auto">
<GroupBox Header="Send History" DockPanel.Dock="Top">
<!-- History -->
<ListView x:Name="historyListView"
Height="{Binding Path=ActualHeight, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type StackPanel}}}"
ItemsSource="{Binding Path=SelectedTerminalViewModel.SentMessagesHistory}"
VerticalContentAlignment="Top"
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
ScrollViewer.VerticalScrollBarVisibility="Auto"
ScrollViewer.CanContentScroll="True">
<!-- Hide ListView if there are no items -->
<ListView.Style>
<Style TargetType="{x:Type ListView}">
<Setter Property="Visibility" Value="Visible"/>
<Style.Triggers>
<!-- Collapsed when no history available (0 items, fallback 1, to not hide it on error) -->
<DataTrigger Binding="{Binding Path=SelectedTerminalViewModel.SentMessagesHistory.Count, FallbackValue=1, TargetNullValue=1}" Value="0">
<Setter Property="Visibility" Value="Collapsed"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ListView.Style>
<!-- Make items non-selectable and stretch -->
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="Focusable" Value="false"/>
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
</Style>
</ListView.ItemContainerStyle>
<!-- Template for item -->
<ListView.ItemTemplate>
<DataTemplate>
<DockPanel LastChildFill="False" HorizontalAlignment="Stretch">
<TextBlock DockPanel.Dock="Left" Text="{Binding DisplayText}"
VerticalAlignment="Center"/>
<!-- Button Command binds with DataContext of historyListView, CommandParameter binds with the item -->
<Button DockPanel.Dock="Right" ToolTip="Insert"
Command="{Binding Path=DataContext.SelectedTerminalViewModel.InsertElementFromHistoryCommand, ElementName=historyListView}"
CommandParameter="{Binding}">
<Image Source="/Assets/mdi-import.png" Width="20" Margin="0"/>
</Button>
</DockPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</GroupBox>
</DockPanel>
<!-- Splitter between two parts of UI -->
<GridSplitter Grid.Column="0" Grid.RowSpan="2" Width="2.5" Background="LightGray"/>
<!-- Tab control -->
<custom_controls:ExtendedTabControl Grid.Row="1" Grid.Column="1" Panel.ZIndex="0"
x:Name="terminalTabControl"
IsSynchronizedWithCurrentItem="True"
behaviours:TabContent.IsCached="True"
ItemsSource="{Binding TerminalViewModels}"
SelectedItem="{Binding SelectedTerminalViewModel}">
<!-- View Model Types -->
<custom_controls:ExtendedTabControl.Resources>
<DataTemplate DataType="{x:Type vm:SendReceiveViewModel}">
<v:SendReceiveView/>
</DataTemplate>
<DataTemplate DataType="{x:Type vm:ConsoleViewModel}">
<v:ConsoleView/>
</DataTemplate>
</custom_controls:ExtendedTabControl.Resources>
<!-- Content of tab with special caching behaviour -->
<behaviours:TabContent.Template>
<DataTemplate>
<ContentControl Content="{Binding}"/>
</DataTemplate>
</behaviours:TabContent.Template>
<!-- Tab Header Template -->
<custom_controls:ExtendedTabControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Ellipse Width="16" Height="16" Margin="0 0 8 0"
Stroke="Black" StrokeThickness="0.7"
Fill="{Binding Path=CommunicationProtocolConnectionState, Converter={StaticResource PrtclConnectionStateBrushConverter}}"
ToolTip="{Binding Path=CommunicationProtocolConnectionState, Converter={StaticResource EnumValToDescConv}}"
ToolTipService.InitialShowDelay="200"/>
<Image Height="17" Stretch="Fill" Margin="0 0 8 0"
Source="{Binding Path=ProtocolType, Converter={StaticResource ProtocolTypeIconConverter}}"
ToolTip="{Binding Path=ProtocolType,Converter={StaticResource EnumValToDescConv}}"
ToolTipService.InitialShowDelay="200"/>
<TextBlock Text="{Binding Title, Mode=OneWay}"
ToolTip="{Binding Path=CommunicationProtocolLongIdentifier}"
ToolTipService.InitialShowDelay="200"/>
<Button Command="{Binding CloseRequestCommand}" Width="20" Padding="0" Margin="8 0 0 0" Content="X">
<Button.Style>
<Style TargetType="Button" x:Name="CloseButtonStyle">
<Setter Property="Visibility" Value="Visible"/>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="BorderBrush" Value="Transparent"/>
</Style>
</Button.Style>
</Button>
</StackPanel>
</DataTemplate>
</custom_controls:ExtendedTabControl.ItemTemplate>
<custom_controls:ExtendedTabControl.Triggers>
<!-- Trigger that opens the context menu, listening on custom routed event AddButtonClicked -->
<EventTrigger RoutedEvent="custom_controls:ExtendedTabControl.AddButtonClicked">
<BeginStoryboard>
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="AddTabContextMenu" Storyboard.TargetProperty="(ContextMenu.IsOpen)">
<DiscreteObjectKeyFrame KeyTime="0:0:0">
<DiscreteObjectKeyFrame.Value>
<sys:Boolean>True</sys:Boolean>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</custom_controls:ExtendedTabControl.Triggers>
</custom_controls:ExtendedTabControl>
<!-- Start Menu -->
<Border Grid.Row="1" Grid.Column="1" Width="400" Height="300"
BorderThickness="1" BorderBrush="Black" CornerRadius="10"
Panel.ZIndex="1">
<Border.Style>
<Style TargetType="{x:Type Border}">
<Setter Property="Visibility" Value="Collapsed"/>
<Style.Triggers>
<!-- Visible only when no tabs are available (0 items, fallback 0, to hide it on error) -->
<DataTrigger Binding="{Binding Path=TerminalViewModels.Count, FallbackValue=0, TargetNullValue=0}" Value="0">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
<!-- Content -->
<DockPanel LastChildFill="False">
<!-- Intro -->
<StackPanel DockPanel.Dock="Top" Margin="10"
Orientation="Vertical">
<TextBlock Text="Start menu"
FontSize="20" FontWeight="SemiBold"/>
<TextBlock Text="Welcome to MultiTerm. To open a Terminal, please select View type and Protocol below."
TextWrapping="Wrap"/>
</StackPanel>
<!-- Left side-->
<StackPanel Orientation="Vertical" DockPanel.Dock="Left" VerticalAlignment="Center" Margin="40 10">
<Label Content="View type:"/>
<!-- Terminal View Types as ListBox, styled as RadioButton -->
<ListBox BorderBrush="Transparent"
ItemsSource="{Binding Source={StaticResource TerminalViewTypeValues}, Converter={StaticResource EnumValToDescConv}}"
SelectedItem="{Binding SelectedTerminalViewType, Mode=TwoWay, Converter={StaticResource EnumValToDescConv}}">
<ListBox.Resources>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<RadioButton
Content="{TemplateBinding ContentPresenter.Content}"
IsChecked="{Binding Path=IsSelected,
RelativeSource={RelativeSource TemplatedParent},
Mode=TwoWay}"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.Resources>
</ListBox>
</StackPanel>
<!-- Right side-->
<StackPanel Orientation="Vertical" DockPanel.Dock="Right" VerticalAlignment="Center" Margin="40 10">
<Label Content="Protocol type:"/>
<!-- ListBox with Protocol types-->
<ListBox BorderBrush="Transparent"
ItemsSource="{Binding Source={StaticResource ProtocolTypeValues}}"
SelectionMode="Single"
x:Name="listBoxStartMenuProtocols">
<ListBox.Resources>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Button Margin="0 2" Width="Auto" HorizontalContentAlignment="Stretch"
Command="{Binding Path=Data.AppendTerminalWithSelectedViewTypeCommand, Source={StaticResource proxy}}"
CommandParameter="{Binding Path=.}">
<DockPanel LastChildFill="False">
<Image DockPanel.Dock="Left"
Height="17" Stretch="Fill" Margin="5 0 0 0"
Source="{Binding Path=., Converter={StaticResource ProtocolTypeIconConverter}}"
ToolTip="{Binding Path=., Converter={StaticResource EnumValToDescConv}}"
ToolTipService.InitialShowDelay="200"/>
<TextBlock DockPanel.Dock="Left" Margin="10 0 10 0"
Text="{Binding Path=., Converter={StaticResource EnumValToDescConv}}"/>
</DockPanel>
</Button>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.Resources>
</ListBox>
</StackPanel>
</DockPanel>
</Border>
</Grid>
</DockPanel>
</UserControl>