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.
263 lines
16 KiB
263 lines
16 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="EnumDescriptionConverter"/>
|
|
<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 EnumDescriptionConverter}}">
|
|
</controls:SingleSelectSubMenu>
|
|
<controls:SingleSelectSubMenu Title="Default Newline Separator on Send"
|
|
OptionsSource="{Binding Source={StaticResource NewlineSeparatorTypeValues}}"
|
|
SelectedMenuItem="{Binding DefaultSendNewlineSeparator, Mode=TwoWay, Converter={StaticResource EnumDescriptionConverter}}">
|
|
</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 EnumDescriptionConverter}}">
|
|
</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"
|
|
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 EnumDescriptionConverter}}"
|
|
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 EnumDescriptionConverter}}"
|
|
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>
|
|
</Grid>
|
|
</DockPanel>
|
|
</UserControl>
|
|
|