JD2022-TU1/main/tools/apps/DataFileAnalyzer/DataFileAnalyzerView.xaml

379 lines
23 KiB
XML

<UserControl x:Class="DataFileAnalyzer.DataFileAnalyzerView"
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:system="clr-namespace:System;assembly=mscorlib"
xmlns:my="clr-namespace:DataFileAnalyzer"
xmlns:uafConverters="clr-namespace:UAF.WPF.Converters;assembly=UAF.WPF"
xmlns:wpfctrl="clr-namespace:UAF.WPF.Controls;assembly=UAF.WPF"
xmlns:command="clr-namespace:DataFileAnalyzer.Commands"
xmlns:converters="clr-namespace:UAF.WPF.Converters;assembly=UAF.WPF.Serialization"
mc:Ignorable="d"
d:DesignHeight="355" d:DesignWidth="485">
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="DataFileAnalyzerResources.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
<DockPanel>
<DockPanel.Resources>
<converters:PlatformListToStringConverter x:Key="MyPlatformListToStringConverter"/>
<uafConverters:TimeSpanToStringConverter x:Key="MyTimeSpanToStringConverter"/>
<my:DataFileErrorListToStringConverter x:Key="MyErrorListToStringConverter"/>
<my:DataFileToErrorListConverter x:Key="MyDataFileToErrorListConverter"/>
<my:StatusToColorConverter x:Key="MyStatusToColorConverter"/>
<command:RefreshCommand x:Key="RefreshCommand" />
</DockPanel.Resources>
<Expander DockPanel.Dock="Top" >
<Expander.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Style="{DynamicResource TextBlockBaseStyle}" Background="Transparent" Width="16" />
<TextBlock Style="{DynamicResource TextBlockBaseStyle}" Background="Transparent" Text="File updater status : " />
<TextBlock Style="{DynamicResource TextBlockBaseStyle}" Background="Transparent" Text="{Binding Path=Status, Converter={StaticResource EnumToStringConverter}}" Foreground="{Binding Path=Status, Converter={StaticResource MyStatusToColorConverter}}" FontWeight="Bold"/>
</StackPanel>
</Expander.Header>
<DockPanel>
<!--Panel displaying various info-->
<Grid DockPanel.Dock="Top" Margin="5,5,5,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<!--General info about the Library state-->
<StackPanel Grid.Column="0">
<!--File count-->
<TextBlock
Style="{DynamicResource TextBlockBaseStyle}"
HorizontalAlignment="Left"
Text="{Binding Path=FileCount, StringFormat='Total file count: {0}'}"/>
<!--Run duration-->
<TextBlock
Style="{DynamicResource TextBlockBaseStyle}" HorizontalAlignment="Left"
Text="{Binding Path=UpdaterState.RunningDuration, StringFormat='Running duration: {0}', Converter={StaticResource MyTimeSpanToStringConverter}}"/>
<!--Update duration-->
<TextBlock
Style="{DynamicResource TextBlockBaseStyle}" HorizontalAlignment="Left"
Text="{Binding Path=UpdaterState.UpdateDuration, StringFormat='Update duration: {0}', Converter={StaticResource MyTimeSpanToStringConverter}}"/>
<!--Resolve ref duration-->
<TextBlock
Style="{DynamicResource TextBlockBaseStyle}" HorizontalAlignment="Left"
Text="{Binding Path=ResolveDependenciesDuration, StringFormat='ResolveDependencies duration: {0}', Converter={StaticResource MyTimeSpanToStringConverter}}"/>
</StackPanel>
<!--Update status-->
<StackPanel Grid.Column="1">
<!--Status (Running, stopped, finished...)-->
<TextBlock
Style="{DynamicResource TextBlockBaseStyle}"
HorizontalAlignment="Left"
Text="{Binding Path=Status}"
FontWeight="Bold"
Foreground="{Binding Path=Status, Converter={StaticResource MyStatusToColorConverter}}"/>
<!--Pending operations count-->
<TextBlock
Style="{DynamicResource TextBlockBaseStyle}" HorizontalAlignment="Left"
Text="{Binding Path=UpdaterState.PendingCount, StringFormat='Pending operations count: {0}'}"/>
<!--Running operations count-->
<TextBlock
Style="{DynamicResource TextBlockBaseStyle}" HorizontalAlignment="Left"
Text="{Binding Path=UpdaterState.RunningCount, StringFormat='Running operations count: {0}'}"/>
<!--Waiting for update operations count-->
<TextBlock
Style="{DynamicResource TextBlockBaseStyle}" HorizontalAlignment="Left"
Text="{Binding Path=UpdaterState.WaitingUpdateCount, StringFormat='Waiting for update operations count: {0}'}"/>
<!--Finished operations count-->
<TextBlock
Style="{DynamicResource TextBlockBaseStyle}" HorizontalAlignment="Left"
Text="{Binding Path=UpdaterState.FinishedCount, StringFormat='Finished operations count: {0}'}"/>
</StackPanel>
</Grid>
<!--Buttons line-->
<DockPanel DockPanel.Dock="Top" Margin="5,5,5,0">
<DockPanel.Resources>
<my:StatusToPauseButtonTextConverter x:Key="StatusToPauseButtonConverter"/>
</DockPanel.Resources>
<!--Save button-->
<Button DockPanel.Dock="Right" Content="Save" Width="80" Click="SaveFileListClick"/>
<!--Pause/Resume button-->
<Button DockPanel.Dock="Right" Content="{Binding Path=Status, Converter={StaticResource StatusToPauseButtonConverter}}" Width="100" Click="PauseUpdateClick"/>
<CheckBox DockPanel.Dock="Left" IsChecked="{Binding IsPerforceEnabled, Mode=TwoWay}">Enable Perforce (not recommended on large Perforce bases) </CheckBox>
<!--Refresh button-->
<Button Content="Refresh" Width="80" Margin="0,0,280,0" Command="{StaticResource RefreshCommand}" />
</DockPanel>
</DockPanel>
</Expander>
<!--Filter line-->
<DockPanel DockPanel.Dock="Top" Margin="5,2,5,0">
<DockPanel DockPanel.Dock="Top">
<TextBlock Style="{DynamicResource TextBlockBaseStyle}" Text="Filter:"/>
<ComboBox DockPanel.Dock="Right" MinWidth="300" Margin="8,0,0,0" Style="{StaticResource ComboBoxBaseStyle}"
SelectedIndex="{Binding FilterType, Converter={StaticResource EnumToIntConverter}, Mode=TwoWay}" >
<ComboBoxItem Tag="{x:Static my:DataFileAnalyzerModel+FilterSearchType.SearchInPath}" >Search in Full Path</ComboBoxItem>
<ComboBoxItem Tag="{x:Static my:DataFileAnalyzerModel+FilterSearchType.SearchInPathAndDisplayFiles}" >Search in Full Path (Show Only Results Children)</ComboBoxItem>
<ComboBoxItem Tag="{x:Static my:DataFileAnalyzerModel+FilterSearchType.SearchInFileName}" >Search in File Name</ComboBoxItem>
</ComboBox>
<TextBox Margin="3,0,0,0" Text="{Binding Path=FilterString, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
</DockPanel>
<StackPanel Orientation="Horizontal" Height="24" VerticalAlignment="Center" Margin="0,2,0,0">
<wpfctrl:HistoryNavigator Margin="0,0,6,0" DataContext="{Binding FileHistory}" />
<CheckBox Content="Show Valid Files" Margin="0,0,16,0" IsChecked="{Binding DisplayValidFiles, Mode=TwoWay}" />
<CheckBox Content="Show Missing Files" Margin="0,0,16,0" IsChecked="{Binding DisplayMissingFiles, Mode=TwoWay}" />
<CheckBox Content="Show Files with Missing Dependencies" Margin="0,0,16,0" IsChecked="{Binding DisplayFilesWithMissingDependencies, Mode=TwoWay}" />
<CheckBox Content="Show Non-Computed Files" Margin="0,0,16,0" IsChecked="{Binding DisplayNonComputedFiles, Mode=TwoWay}" />
<CheckBox Content="Show Orphan Files" Margin="0,0,16,0" IsChecked="{Binding DisplayOrphanFiles, Mode=TwoWay}" />
</StackPanel>
</DockPanel>
<!--Lower part where you can see the files and their dependencies-->
<Grid Margin="0,2,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
<RowDefinition Height="*" />
<RowDefinition Height="auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<!--The list of all the data files-->
<ListView
Name="uiFileList" ItemsSource="{Binding Path=CurrentDataFiles}"
SelectionMode="Extended"
Grid.Column="0" Grid.RowSpan="5"
wpfctrl:GridViewSort.AutoSort="True"
VirtualizingStackPanel.IsVirtualizing="True"
SelectedItem="{Binding SelectedFile, Mode=TwoWay}"
GotFocus="FileList_GotFocus" LostFocus="FileList_LostFocus" PreviewMouseDown="FileList_PreviewMouseDown">
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem" BasedOn="{StaticResource ListViewItemWithSelectionBaseStyle}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=DependenciesUpToDate}" Value="False">
<Setter Property="Foreground" Value="{DynamicResource LightGrayBrush}" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=AbsentFromPerforce}" Value="True">
<Setter Property="Foreground" Value="{DynamicResource YellowBrush}" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=IsOrphan}" Value="True">
<Setter Property="Foreground" Value="{DynamicResource CyanBrush}" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=HasMissingDependencies}" Value="True">
<Setter Property="Foreground" Value="{DynamicResource OrangeBrush}" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=IsMissing}" Value="True">
<Setter Property="Foreground" Value="{DynamicResource RedBrush}" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=ComputeDependenciesError}" Value="True">
<Setter Property="Foreground" Value="{DynamicResource RedBrush}" />
</DataTrigger>
</Style.Triggers>
<Setter Property="ToolTip" Value="{Binding Converter={StaticResource MyDataFileToErrorListConverter}}" />
</Style>
</ListView.ItemContainerStyle>
<ListView.View>
<GridView>
<GridViewColumn Header="Key" wpfctrl:GridViewSort.PropertyName="Key">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path='Key', StringFormat='0x{0}'}"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="Path" wpfctrl:GridViewSort.PropertyName="FilePath">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path='FilePath'}"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="File Size" wpfctrl:GridViewSort.PropertyName="Length">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path='Length'}"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="Last Modification" wpfctrl:GridViewSort.PropertyName="LastModificationTime">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path='LastModificationTime'}"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="Last Check" wpfctrl:GridViewSort.PropertyName="LastCheckTime">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path='LastCheckTime'}"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="Last Dependencies Check" wpfctrl:GridViewSort.PropertyName="LastDependenciesCheckTime">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path='LastDependenciesCheckTime'}"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
<ListView.ContextMenu>
<wpfctrl:FrameworkContextMenu ItemsSource="{Binding FileListContextMenu}" />
</ListView.ContextMenu>
</ListView>
<GridSplitter Grid.Column="1" Grid.RowSpan="5" Style="{DynamicResource VerticalGridSplitterBaseStyle}"/>
<!--Error and warnings of the currently selected file-->
<Grid Grid.Column="2" Grid.Row="0">
<Border
Name="ErrorInfoBorder"
DataContext="{Binding ElementName=uiFileList, Path=SelectedItem}"
Height="48"
HorizontalAlignment="Stretch"
>
<Border.Style>
<Style TargetType="Border">
<Setter Property="Background" Value="{DynamicResource BackgroundBrush}" />
<Setter Property="Visibility" Value="Collapsed" />
<Style.Triggers>
<DataTrigger Binding="{Binding HasWarnings}" Value="True">
<Setter Property="Background" Value="{DynamicResource OrangeBrush}" />
<Setter Property="Visibility" Value="Visible" />
</DataTrigger>
<DataTrigger Binding="{Binding HasErrors}" Value="True">
<Setter Property="Background" Value="{DynamicResource RedBrush}" />
<Setter Property="Visibility" Value="Visible" />
</DataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
<TextBlock
HorizontalAlignment="Center"
VerticalAlignment="Center"
Text="{Binding Converter={StaticResource MyDataFileToErrorListConverter}}"
FontSize="20"
>
<TextBlock.Style>
<Style TargetType="TextBlock">
</Style>
</TextBlock.Style>
</TextBlock>
</Border>
</Grid>
<GridSplitter Grid.Column="2" Grid.Row="1" Style="{DynamicResource HorizontalGridSplitterBaseStyle}"/>
<!--The list of the files referenced by the current selection-->
<ListView
Name="uiReferencedFileList"
ItemsSource="{Binding ElementName=uiFileList, Path=SelectedItem.Children}"
SelectionMode="Extended"
wpfctrl:GridViewSort.AutoSort="True"
Grid.Column="2" Grid.Row="2"
GotFocus="ReferencedFileList_GotFocus" LostFocus="ReferencedFileList_LostFocus" PreviewMouseDown="ReferencedFileList_PreviewMouseDown">
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem" BasedOn="{StaticResource ListViewItemWithSelectionBaseStyle}">
<EventSetter Event="MouseDoubleClick" Handler="OnReferencedFileDoubleClick" />
<Style.Triggers>
<DataTrigger Binding="{Binding Path=IsValid}" Value="False">
<Setter Property="Foreground" Value="{DynamicResource RedBrush}" />
</DataTrigger>
</Style.Triggers>
</Style>
</ListView.ItemContainerStyle>
<ListView.View>
<GridView>
<GridViewColumn Header="Files referenced by this one:" wpfctrl:GridViewSort.PropertyName="Path">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path='Path'}"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="Keys:" wpfctrl:GridViewSort.PropertyName="Key">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path='Key'}"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="Platforms:" wpfctrl:GridViewSort.PropertyName="Platforms">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path='Platforms', Converter={StaticResource MyPlatformListToStringConverter}}"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
<ListView.ContextMenu>
<wpfctrl:FrameworkContextMenu ItemsSource="{Binding DependenciesContextMenu}" />
</ListView.ContextMenu>
</ListView>
<GridSplitter Grid.Column="2" Grid.Row="3" Style="{DynamicResource HorizontalGridSplitterBaseStyle}"/>
<!--The list of the files that references the current selection-->
<ListView
Name="uiReferencingFileList"
ItemsSource="{Binding ElementName=uiFileList, Path=SelectedItem.Parents}"
SelectionMode="Extended"
wpfctrl:GridViewSort.AutoSort="True"
Grid.Column="2" Grid.Row="4"
GotFocus="ReferencingFileList_GotFocus" LostFocus="ReferencingFileList_LostFocus" PreviewMouseDown="ReferencingFileList_PreviewMouseDown">
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem" BasedOn="{StaticResource ListViewItemWithSelectionBaseStyle}">
<EventSetter Event="MouseDoubleClick" Handler="OnReferencingFileDoubleClick" />
<Style.Triggers>
<DataTrigger Binding="{Binding Path=IsValid}" Value="False">
<Setter Property="Foreground" Value="#FFB34040" />
</DataTrigger>
</Style.Triggers>
</Style>
</ListView.ItemContainerStyle>
<ListView.View>
<GridView>
<GridViewColumn Header="Files referencing this one:" wpfctrl:GridViewSort.PropertyName="Path">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path='Path'}"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="Keys:" wpfctrl:GridViewSort.PropertyName="Key">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path='Key'}"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="Platforms:" wpfctrl:GridViewSort.PropertyName="Platforms">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path='Platforms', Converter={StaticResource MyPlatformListToStringConverter}}"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
<ListView.ContextMenu>
<wpfctrl:FrameworkContextMenu ItemsSource="{Binding DependenciesContextMenu}" />
</ListView.ContextMenu>
</ListView>
</Grid>
</DockPanel>
</UserControl>