379 lines
23 KiB
XML
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>
|