<UserControl xmlns="https://github.com/avaloniaui"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:m="using:SourceGit.Models"
             xmlns:vm="using:SourceGit.ViewModels"
             xmlns:v="using:SourceGit.Views"
             xmlns:c="using:SourceGit.Converters"
             mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
             x:Class="SourceGit.Views.Repository"
             x:DataType="vm:Repository">
  <Grid RowDefinitions="36,*" Background="{DynamicResource Brush.Window}">
    <!-- Toolbar -->
    <Border Grid.Row="0" BorderBrush="{DynamicResource Brush.Border0}" BorderThickness="0,0,0,1" Background="{DynamicResource Brush.ToolBar}">
      <Grid ColumnDefinitions="*,Auto,*">
        <StackPanel Grid.Column="0" Orientation="Horizontal" Margin="4,0,0,0">
          <Button Classes="icon_button" Width="32" Command="{Binding OpenInFileManager}" ToolTip.Tip="{DynamicResource Text.Repository.Explore}">
            <Path Width="15" Height="13" Data="{StaticResource Icons.Folder.Open}" Margin="0,1,0,0"/>
          </Button>
          
          <Button Classes="icon_button" Width="32" Command="{Binding OpenInTerminal}" ToolTip.Tip="{DynamicResource Text.Repository.Terminal}">
            <Path Width="13" Height="13" Data="{StaticResource Icons.Terminal}"/>
          </Button>

          <Button Classes="icon_button" Width="32" Click="OpenWithExternalTools" ToolTip.Tip="{DynamicResource Text.Repository.OpenWithExternalTools}">
            <Path Width="13" Height="13" Data="{StaticResource Icons.OpenWith}"/>
          </Button>
          
          <ToggleButton Width="32"
                        Background="Transparent"
                        IsChecked="{Binding IsSearching, Mode=TwoWay}">
            <ToolTip.Tip>
              <StackPanel Orientation="Horizontal" VerticalAlignment="Center">
                <TextBlock Text="{DynamicResource Text.Repository.Search}" VerticalAlignment="Center"/>
                <TextBlock Margin="16,0,0,0" Text="{OnPlatform Ctrl+F, macOS=⌘+F}" Opacity=".6" FontSize="11" VerticalAlignment="Center"/>
              </StackPanel>
            </ToolTip.Tip>
            <Path Width="14" Height="14" Data="{StaticResource Icons.Search}"/>
          </ToggleButton>
        </StackPanel>

        <StackPanel Grid.Column="1" Orientation="Horizontal">
          <Button Classes="icon_button" Width="32" Command="{Binding Fetch}" ToolTip.Tip="{DynamicResource Text.Fetch}">
            <Path Width="14" Height="14" Data="{StaticResource Icons.Fetch}"/>
          </Button>

          <Button Classes="icon_button" Width="32" Margin="16,0,0,0" Command="{Binding Pull}" ToolTip.Tip="{DynamicResource Text.Pull}">
            <Path Width="14" Height="14" Data="{StaticResource Icons.Pull}"/>
          </Button>

          <Button Classes="icon_button" Width="32" Margin="16,0,0,0" Command="{Binding Push}" ToolTip.Tip="{DynamicResource Text.Push}">
            <Path Width="14" Height="14" Data="{StaticResource Icons.Push}"/>
          </Button>

          <Button Classes="icon_button" Width="32" Margin="16,0,0,0" Command="{Binding StashAll}" ToolTip.Tip="{DynamicResource Text.Stash}">
            <Path Width="14" Height="14" Data="{StaticResource Icons.Stashes}"/>
          </Button>

          <Button Classes="icon_button" Width="32" Margin="16,0,0,0" Command="{Binding ApplyPatch}" ToolTip.Tip="{DynamicResource Text.Apply}">
            <Path Width="14" Height="14" Data="{StaticResource Icons.Diff}"/>
          </Button>

          <Rectangle Width="1" Height="16"
                     Margin="16,0,0,0"
                     VerticalAlignment="Center"
                     Fill="{DynamicResource Brush.Border2}"/>

          <Button Classes="icon_button" Width="32" Margin="16,0,0,0" Command="{Binding CreateNewBranch}" ToolTip.Tip="{DynamicResource Text.Repository.NewBranch}">
            <Path Width="14" Height="14" Data="{StaticResource Icons.Branch.Add}"/>
          </Button>

          <Button Classes="icon_button" Width="32" Margin="8,0,0,0" Click="OpenGitFlowMenu" ToolTip.Tip="{DynamicResource Text.GitFlow}">
            <Path Width="14" Height="14" Data="{StaticResource Icons.Flow}"/>
          </Button>
        </StackPanel>

        <StackPanel Grid.Column="2" Orientation="Horizontal" HorizontalAlignment="Right" Margin="0,0,4,0">          
          <ToggleButton Classes="layout_direction"
                        Width="32" Height="26"
                        IsChecked="{Binding Source={x:Static vm:Preference.Instance}, Path=UseTwoColumnsLayoutInHistories, Mode=TwoWay}"
                        IsVisible="{Binding SelectedViewIndex, Converter={x:Static c:IntConverters.IsZero}}"
                        ToolTip.Tip="{DynamicResource Text.Histories.DisplayMode}"/>

          <Button Classes="icon_button" Width="32" Command="{Binding NavigateToCurrentHead}" ToolTip.Tip="{DynamicResource Text.Repository.NavigateToCurrentHead}">
            <Path Width="14" Height="14" Data="{StaticResource Icons.Target}"/>
          </Button>

          <Button Classes="icon_button" Width="32" Command="{Binding Cleanup}" ToolTip.Tip="{DynamicResource Text.Repository.Clean}">
            <Path Width="14" Height="14" Data="{StaticResource Icons.Clean}"/>
          </Button>

          <Button Classes="icon_button" Width="32" Click="OpenStatistics" ToolTip.Tip="{DynamicResource Text.Repository.Statistics}">
            <Path Width="14" Height="14" Data="{StaticResource Icons.Statistics}"/>
          </Button>

          <Button Classes="icon_button" Width="32" Command="{Binding OpenConfigure}" ToolTip.Tip="{DynamicResource Text.Repository.Configure}">
            <Path Width="15" Height="15" Data="{StaticResource Icons.Settings1}"/>
          </Button>
        </StackPanel>
      </Grid>
    </Border>

    <!-- Body -->
    <Grid Grid.Row="1">
      <Grid.ColumnDefinitions>
        <ColumnDefinition Width="{Binding Source={x:Static vm:Preference.Instance}, Path=Layout.RepositorySidebarWidth, Mode=TwoWay}" MinWidth="200" MaxWidth="400"/>
        <ColumnDefinition Width="3"/>
        <ColumnDefinition Width="*"/>
      </Grid.ColumnDefinitions>

      <!-- Left Normal Mode -->
      <Grid Grid.Column="0" Classes="repository_leftpanel" RowDefinitions="28,Auto,5,28,28,Auto,28,*,28,Auto,28,Auto" Margin="0,0,0,4" IsVisible="{Binding !IsSearching}">
        <!-- WorkingCopy -->
        <TextBlock Grid.Row="0" Classes="group_header_label" Text="{DynamicResource Text.Repository.Workspace}"/>
        <ListBox Grid.Row="1" Classes="page_switcher" Background="Transparent" SelectedIndex="{Binding SelectedViewIndex, Mode=TwoWay}">
          <ListBox.ItemsPanel>
            <ItemsPanelTemplate>
              <StackPanel Orientation="Vertical"/>
            </ItemsPanelTemplate>
          </ListBox.ItemsPanel>

          <ListBoxItem Height="28">
            <Grid Margin="16,0,0,0" Height="28" ColumnDefinitions="20,*">
              <Path Grid.Column="0" Width="12" Height="12" HorizontalAlignment="Left" Data="{StaticResource Icons.Histories}"/>
              <TextBlock Grid.Column="1" Classes="monospace" Text="{DynamicResource Text.Histories}"/>
            </Grid>
          </ListBoxItem>

          <ListBoxItem Height="28">
            <Grid Margin="16,0,0,0" Height="28" ColumnDefinitions="20,*,Auto">
              <Path Grid.Column="0" Width="12" Height="12" HorizontalAlignment="Left" Data="{StaticResource Icons.Send}"/>
              <TextBlock Grid.Column="1" Classes="monospace" Text="{DynamicResource Text.WorkingCopy}"/>
              <Border Grid.Column="2"
                      Margin="6,0"
                      Height="18"
                      CornerRadius="9"
                      VerticalAlignment="Center"
                      Background="{DynamicResource Brush.Badge}"
                      IsVisible="{Binding WorkingCopyChangesCount, Converter={x:Static c:IntConverters.IsGreaterThanZero}}">
                <TextBlock Classes="monospace" FontSize="10" HorizontalAlignment="Center" Margin="9,0" Text="{Binding WorkingCopyChangesCount}"/>
              </Border>
            </Grid>
          </ListBoxItem>

          <ListBoxItem Height="28">
            <Grid Margin="16,0,0,0" Height="28" ColumnDefinitions="20,*,Auto">
              <Path Grid.Column="0" Width="12" Height="12" HorizontalAlignment="Left" Data="{StaticResource Icons.Stashes}"/>
              <TextBlock Grid.Column="1" Classes="monospace" Text="{DynamicResource Text.Stashes}"/>
              <Border Grid.Column="2"
                      Margin="6,0"
                      Height="18"
                      CornerRadius="9"
                      VerticalAlignment="Center"
                      Background="{DynamicResource Brush.Badge}"
                      IsVisible="{Binding StashesCount, Converter={x:Static c:IntConverters.IsGreaterThanZero}}">
                <TextBlock Classes="monospace" FontSize="10" HorizontalAlignment="Center" Margin="9,0" Text="{Binding StashesCount}"/>
              </Border>
            </Grid>
          </ListBoxItem>
        </ListBox>

        <!-- Filter Branches -->
        <Rectangle Grid.Row="2" Height=".65" HorizontalAlignment="Stretch" VerticalAlignment="Center" Fill="{DynamicResource Brush.Border2}"/>
        <TextBox Grid.Row="3"
                 Margin="4,2,1,0"
                 Height="24"
                 BorderThickness="1"
                 CornerRadius="3"
                 BorderBrush="{DynamicResource Brush.Border2}"
                 Background="{DynamicResource Brush.Contents}"
                 Watermark="{DynamicResource Text.Repository.FilterBranchTip}"
                 Text="{Binding SearchBranchFilter, Mode=TwoWay}"
                 VerticalContentAlignment="Center">
          <TextBox.InnerLeftContent>
            <Path Width="14" Height="14"
                  Margin="6,0,0,0"
                  Fill="{DynamicResource Brush.FG2}"
                  Data="{StaticResource Icons.Search}"/>
          </TextBox.InnerLeftContent>

          <TextBox.InnerRightContent>
            <Button Classes="icon_button"
                    Width="16"
                    Margin="0,0,6,0"
                    Command="{Binding ClearSearchBranchFilter}"
                    IsVisible="{Binding SearchBranchFilter, Converter={x:Static StringConverters.IsNotNullOrEmpty}}"
                    HorizontalAlignment="Right">
              <Path Width="14" Height="14"
                    Margin="0,1,0,0"
                    Fill="{DynamicResource Brush.FG1}"
                    Data="{StaticResource Icons.Clear}"/>
            </Button>
          </TextBox.InnerRightContent>
        </TextBox>
        
        <!-- Local Branches -->
        <TextBlock Grid.Row="4" Classes="group_header_label" Text="{DynamicResource Text.Repository.LocalBranches}"/>
        <TreeView Grid.Row="5"
                  x:Name="localBranchTree"
                  MaxHeight="400"
                  Margin="4,0,2,0"
                  SelectionMode="Multiple"
                  ItemsSource="{Binding LocalBranchTrees}"
                  ScrollViewer.HorizontalScrollBarVisibility="Disabled"
                  ScrollViewer.VerticalScrollBarVisibility="Auto"
                  ContextRequested="OnLocalBranchContextMenuRequested"
                  SelectionChanged="OnLocalBranchTreeSelectionChanged">
          <TreeView.Styles>
            <Style Selector="TreeViewItem" x:DataType="vm:BranchTreeNode">
              <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}"/>
              <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"/>
              <Setter Property="CornerRadius" Value="{Binding CornerRadius}"/>
            </Style>

            <Style Selector="Grid.repository_leftpanel TreeViewItem /template/ Border#PART_LayoutRoot:pointerover Border#PART_Background">
              <Setter Property="Background" Value="{DynamicResource Brush.AccentHovered}" />
              <Setter Property="Opacity" Value=".65"/>
            </Style>
            <Style Selector="Grid.repository_leftpanel TreeViewItem:selected /template/ Border#PART_LayoutRoot Border#PART_Background">
              <Setter Property="Background" Value="{DynamicResource Brush.AccentHovered}" />
              <Setter Property="Opacity" Value="1"/>
            </Style>
            <Style Selector="Grid.repository_leftpanel:focus-within TreeViewItem:selected /template/ Border#PART_LayoutRoot Border#PART_Background">
              <Setter Property="Background" Value="{DynamicResource Brush.Accent}" />
              <Setter Property="Opacity" Value=".65"/>
            </Style>
            <Style Selector="Grid.repository_leftpanel:focus-within TreeViewItem:selected /template/ Border#PART_LayoutRoot:pointerover Border#PART_Background">
              <Setter Property="Background" Value="{DynamicResource Brush.Accent}" />
              <Setter Property="Opacity" Value=".8"/>
            </Style>
          </TreeView.Styles>
          <TreeView.ItemTemplate>
            <TreeDataTemplate ItemsSource="{Binding Children}" x:DataType="{x:Type vm:BranchTreeNode}">
              <Grid Height="24" ColumnDefinitions="20,*,Auto,Auto" Background="Transparent" DoubleTapped="OnDoubleTappedBranchNode">
                <Path Grid.Column="0" Classes="folder_icon" Width="12" Height="12" HorizontalAlignment="Left" Margin="0,1,0,0" IsVisible="{Binding IsFolder}"/>
                <Path Grid.Column="0" Width="12" Height="12" HorizontalAlignment="Left" Margin="0,2,0,0" Data="{StaticResource Icons.Check}" IsVisible="{Binding IsCurrent}" VerticalAlignment="Center"/>
                <Path Grid.Column="0" Width="12" Height="12" HorizontalAlignment="Left" Margin="2,0,0,0" Data="{StaticResource Icons.Branch}" VerticalAlignment="Center">
                  <Path.IsVisible>
                    <MultiBinding Converter="{x:Static BoolConverters.And}">
                      <Binding Path="!IsFolder"/>
                      <Binding Path="!IsCurrent"/>
                    </MultiBinding>
                  </Path.IsVisible>
                </Path>
                
                <TextBlock Grid.Column="1" Text="{Binding Name}" Classes="monospace" FontWeight="{Binding IsCurrent, Converter={x:Static c:BoolConverters.BoldIfTrue}}"/>

                <Border Grid.Column="2" Margin="8,0" Height="18" CornerRadius="9" VerticalAlignment="Center" Background="{DynamicResource Brush.Badge}" IsVisible="{Binding IsUpstreamTrackStatusVisible}">
                  <TextBlock Classes="monospace" FontSize="10" HorizontalAlignment="Center" Margin="9,0" Text="{Binding UpstreamTrackStatus}"/>
                </Border>

                <ToggleButton Grid.Column="3"
                              Classes="filter"
                              Margin="0,0,8,0"
                              Background="Transparent"
                              IsVisible="{Binding IsBranch}"
                              Checked="OnToggleFilter"
                              Unchecked="OnToggleFilter"
                              IsChecked="{Binding IsFiltered}"/>
              </Grid>
            </TreeDataTemplate>
          </TreeView.ItemTemplate>
        </TreeView>

        <!-- Remotes -->
        <Grid Grid.Row="6" ColumnDefinitions="*,Auto">
          <TextBlock Grid.Column="0" Classes="group_header_label" Text="{DynamicResource Text.Repository.Remotes}"/>
          <Button Grid.Column="1" Classes="icon_button" Width="14" Margin="8,0" Command="{Binding AddRemote}" ToolTip.Tip="{DynamicResource Text.Repository.Remotes.Add}">
            <Path Width="12" Height="12" Data="{StaticResource Icons.Remote.Add}"/>
          </Button>
        </Grid>
        <TreeView Grid.Row="7"
                  x:Name="remoteBranchTree"
                  Margin="4,0,2,0"
                  SelectionMode="Multiple"
                  ItemsSource="{Binding RemoteBranchTrees}"
                  ScrollViewer.HorizontalScrollBarVisibility="Disabled"
                  ScrollViewer.VerticalScrollBarVisibility="Auto"
                  ContextRequested="OnRemoteBranchContextMenuRequested"
                  SelectionChanged="OnRemoteBranchTreeSelectionChanged">
          <TreeView.Styles>
            <Style Selector="TreeViewItem" x:DataType="vm:BranchTreeNode">
              <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}"/>
              <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"/>
              <Setter Property="CornerRadius" Value="{Binding CornerRadius}"/>
            </Style>

            <Style Selector="Grid.repository_leftpanel TreeViewItem /template/ Border#PART_LayoutRoot:pointerover Border#PART_Background">
              <Setter Property="Background" Value="{DynamicResource Brush.AccentHovered}" />
              <Setter Property="Opacity" Value=".65"/>
            </Style>
            <Style Selector="Grid.repository_leftpanel TreeViewItem:selected /template/ Border#PART_LayoutRoot Border#PART_Background">
              <Setter Property="Background" Value="{DynamicResource Brush.AccentHovered}" />
              <Setter Property="Opacity" Value="1"/>
            </Style>
            <Style Selector="Grid.repository_leftpanel:focus-within TreeViewItem:selected /template/ Border#PART_LayoutRoot Border#PART_Background">
              <Setter Property="Background" Value="{DynamicResource Brush.Accent}" />
              <Setter Property="Opacity" Value=".65"/>
            </Style>
            <Style Selector="Grid.repository_leftpanel:focus-within TreeViewItem:selected /template/ Border#PART_LayoutRoot:pointerover Border#PART_Background">
              <Setter Property="Background" Value="{DynamicResource Brush.Accent}" />
              <Setter Property="Opacity" Value=".8"/>
            </Style>
          </TreeView.Styles>

          <TreeView.ItemTemplate>
            <TreeDataTemplate ItemsSource="{Binding Children}" x:DataType="{x:Type vm:BranchTreeNode}">
              <Grid Height="24" ColumnDefinitions="20,*,Auto" Background="Transparent" DoubleTapped="OnDoubleTappedBranchNode">
                <Path Grid.Column="0" Classes="folder_icon" Width="10" Height="10" HorizontalAlignment="Left" Margin="0,2,0,0" IsVisible="{Binding IsFolder}" VerticalAlignment="Center"/>
                <Path Grid.Column="0" Width="12" Height="12" HorizontalAlignment="Left" Margin="0,2,0,0" Data="{StaticResource Icons.Remote}" IsVisible="{Binding IsRemote}" VerticalAlignment="Center"/>
                <Path Grid.Column="0" Width="12" Height="12" HorizontalAlignment="Left" Margin="2,0,0,0" Data="{StaticResource Icons.Branch}" IsVisible="{Binding IsBranch}" VerticalAlignment="Center"/>

                <TextBlock Grid.Column="1" Text="{Binding Name}" Classes="monospace"/>

                <ToggleButton Grid.Column="2"
                              Classes="filter"
                              Margin="0,0,8,0"
                              Background="Transparent"
                              Checked="OnToggleFilter"
                              Unchecked="OnToggleFilter"
                              IsVisible="{Binding IsBranch}"
                              IsChecked="{Binding IsFiltered}"/>
              </Grid>
            </TreeDataTemplate>
          </TreeView.ItemTemplate>
        </TreeView>

        <!-- Tags -->
        <ToggleButton Grid.Row="8" Classes="group_expander" IsChecked="{Binding IsTagGroupExpanded, Mode=TwoWay}">
          <Grid ColumnDefinitions="Auto,*,Auto">
            <TextBlock Grid.Column="0" Classes="group_header_label" Margin="4,0,0,0" Text="{DynamicResource Text.Repository.Tags}"/>
            <TextBlock Grid.Column="1" Text="{Binding Tags, Converter={x:Static c:ListConverters.ToCount}}" Foreground="{DynamicResource Brush.FG2}" FontWeight="Bold"/>
            <Button Grid.Column="2" Classes="icon_button" Width="14" Margin="8,0" Command="{Binding CreateNewTag}" ToolTip.Tip="{DynamicResource Text.Repository.Tags.Add}">
              <Path Width="12" Height="12" Data="{StaticResource Icons.Tag.Add}"/>
            </Button>
          </Grid>
        </ToggleButton>
        <DataGrid Grid.Row="9"
                  x:Name="tagsList"
                  MaxHeight="200"
                  Margin="4,0,2,0"
                  Background="Transparent"
                  ItemsSource="{Binding Tags}"
                  SelectionMode="Single"
                  CanUserReorderColumns="False"
                  CanUserResizeColumns="False"
                  CanUserSortColumns="False"
                  IsReadOnly="True"
                  HeadersVisibility="None"
                  Focusable="False"
                  RowHeight="24"
                  HorizontalScrollBarVisibility="Disabled"
                  VerticalScrollBarVisibility="Auto"
                  IsVisible="{Binding IsTagGroupExpanded, Mode=OneWay}"
                  SelectionChanged="OnTagDataGridSelectionChanged"
                  ContextRequested="OnTagContextRequested">
          <DataGrid.Styles>
            <Style Selector="DataGridRow">
              <Setter Property="CornerRadius" Value="4" />              
            </Style>
            
            <Style Selector="DataGridRow /template/ Border#RowBorder">
              <Setter Property="ClipToBounds" Value="True" />
            </Style>

            <Style Selector="Grid.repository_leftpanel DataGridRow:pointerover /template/ Rectangle#BackgroundRectangle">
              <Setter Property="Fill" Value="{DynamicResource Brush.AccentHovered}" />
              <Setter Property="Opacity" Value=".5"/>
            </Style>
            <Style Selector="Grid.repository_leftpanel DataGridRow:selected /template/ Rectangle#BackgroundRectangle">
              <Setter Property="Fill" Value="{DynamicResource Brush.AccentHovered}" />
              <Setter Property="Opacity" Value="1"/>
            </Style>
            <Style Selector="Grid.repository_leftpanel:focus-within DataGridRow:selected /template/ Rectangle#BackgroundRectangle">
              <Setter Property="Fill" Value="{DynamicResource Brush.Accent}" />
              <Setter Property="Opacity" Value=".65"/>
            </Style>
            <Style Selector="Grid.repository_leftpanel:focus-within DataGridRow:selected:pointerover /template/ Rectangle#BackgroundRectangle">
              <Setter Property="Fill" Value="{DynamicResource Brush.Accent}" />
              <Setter Property="Opacity" Value=".8"/>
            </Style>
          </DataGrid.Styles>
          
          <DataGrid.Columns>
            <DataGridTemplateColumn Header="ICON">
              <DataGridTemplateColumn.CellTemplate>
                <DataTemplate x:DataType="{x:Type m:Tag}">
                  <Path Width="10" Height="10" Margin="16,0,8,0" Data="{StaticResource Icons.Tag}"/>
                </DataTemplate>
              </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

            <DataGridTemplateColumn Width="*" Header="NAME">
              <DataGridTemplateColumn.CellTemplate>
                <DataTemplate x:DataType="{x:Type m:Tag}">
                  <TextBlock Text="{Binding Name}" Classes="monospace" TextTrimming="CharacterEllipsis" />
                </DataTemplate>
              </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

            <DataGridTemplateColumn Header="FILTER">
              <DataGridTemplateColumn.CellTemplate>
                <DataTemplate x:DataType="{x:Type m:Tag}">
                  <ToggleButton Classes="filter"
                                Margin="0,0,8,0"
                                Background="Transparent"
                                Checked="OnToggleFilter"
                                Unchecked="OnToggleFilter"
                                IsChecked="{Binding IsFiltered}"/>
                </DataTemplate>
              </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
          </DataGrid.Columns>
        </DataGrid>

        <!-- Submodules -->
        <ToggleButton Grid.Row="10" Classes="group_expander" IsChecked="{Binding IsSubmoduleGroupExpanded, Mode=TwoWay}">
          <Grid ColumnDefinitions="Auto,*,Auto,Auto">
            <TextBlock Grid.Column="0" Classes="group_header_label" Margin="4,0,0,0" Text="{DynamicResource Text.Repository.Submodules}"/>
            <TextBlock Grid.Column="1" Text="{Binding Submodules, Converter={x:Static c:ListConverters.ToCount}}" Foreground="{DynamicResource Brush.FG2}" FontWeight="Bold"/>
            <Button Grid.Column="2"
                    Classes="icon_button"
                    Width="14"
                    Margin="8,0"
                    Command="{Binding UpdateSubmodules}"
                    IsVisible="{Binding Submodules, Converter={x:Static c:ListConverters.IsNotNullOrEmpty}}"
                    ToolTip.Tip="{DynamicResource Text.Repository.Submodules.Update}">
              <Path x:Name="iconSubmoduleUpdate" Width="12" Height="12" Data="{StaticResource Icons.Loading}"/>
            </Button>
            <Button Grid.Column="3" 
                    Classes="icon_button" 
                    Width="14" 
                    Margin="0,0,8,0" 
                    Command="{Binding AddSubmodule}" 
                    ToolTip.Tip="{DynamicResource Text.Repository.Submodules.Add}">
              <Path Width="12" Height="12" Data="{StaticResource Icons.Submodule.Add}"/>
            </Button>
          </Grid>
        </ToggleButton>
        <DataGrid Grid.Row="11"
                  MaxHeight="200"
                  Margin="4,0,6,0"
                  Background="Transparent"
                  ItemsSource="{Binding Submodules}"
                  SelectionMode="Single"
                  CanUserReorderColumns="False"
                  CanUserResizeColumns="False"
                  CanUserSortColumns="False"
                  IsReadOnly="True"
                  HeadersVisibility="None"
                  Focusable="False"
                  RowHeight="26"
                  HorizontalScrollBarVisibility="Disabled"
                  VerticalScrollBarVisibility="Auto"
                  ContextRequested="OnSubmoduleContextRequested"
                  IsVisible="{Binding IsSubmoduleGroupExpanded, Mode=OneWay}">
          <DataGrid.Styles>
            <Style Selector="DataGridRow">
              <Setter Property="CornerRadius" Value="4" />
            </Style>

            <Style Selector="DataGridRow /template/ Border#RowBorder">
              <Setter Property="ClipToBounds" Value="True" />
            </Style>

            <Style Selector="DataGridRow:pointerover /template/ Rectangle#BackgroundRectangle">
              <Setter Property="Fill" Value="{DynamicResource Brush.AccentHovered}" />
            </Style>

            <Style Selector="DataGridRow:selected /template/ Rectangle#BackgroundRectangle">
              <Setter Property="Fill" Value="{DynamicResource Brush.Accent}" />
            </Style>
          </DataGrid.Styles>
          
          <DataGrid.Columns>
            <DataGridTemplateColumn Header="ICON">
              <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                  <Path Width="10" Height="10" Margin="16,0,8,0" Data="{StaticResource Icons.Submodule}"/>
                </DataTemplate>
              </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

            <DataGridTemplateColumn Width="*" Header="NAME">
              <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                  <TextBlock Text="{Binding}" ClipToBounds="True" Classes="monospace"/>
                </DataTemplate>
              </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
          </DataGrid.Columns>
        </DataGrid>
      </Grid>

      <!-- Left Search Mode -->
      <Grid Grid.Column="0" RowDefinitions="32,32,*" IsVisible="{Binding IsSearching}" PropertyChanged="OnSearchCommitPanelPropertyChanged">
        <!-- Search -->
        <TextBox Grid.Row="0"
                 x:Name="txtSearchCommitsBox"
                 Margin="4,2,4,0"
                 Height="24"
                 BorderThickness="1"
                 BorderBrush="{DynamicResource Brush.Border2}"
                 Background="{DynamicResource Brush.Contents}"
                 CornerRadius="4"
                 Watermark="{DynamicResource Text.Repository.Search}"
                 Text="{Binding SearchCommitFilter, Mode=TwoWay}"
                 VerticalContentAlignment="Center"
                 KeyDown="OnSearchKeyDown">
          <TextBox.InnerLeftContent>
            <Path Width="14" Height="14"
                  Margin="6,0,0,0"
                  Fill="{DynamicResource Brush.FG2}"
                  Data="{StaticResource Icons.Search}"/>
          </TextBox.InnerLeftContent>

          <TextBox.InnerRightContent>
            <Button Classes="icon_button"
                    Width="16"
                    Margin="0,0,6,0"
                    Command="{Binding ClearSearchCommitFilter}"
                    IsVisible="{Binding SearchCommitFilter, Converter={x:Static StringConverters.IsNotNullOrEmpty}}"
                    HorizontalAlignment="Right">
              <Path Width="14" Height="14"
                    Margin="0,1,0,0"
                    Fill="{DynamicResource Brush.FG1}"
                    Data="{StaticResource Icons.Clear}"/>
            </Button>
          </TextBox.InnerRightContent>
        </TextBox>

        <Grid Grid.Row="1" ColumnDefinitions="Auto,*" Margin="4,0">
          <TextBlock Grid.Column="0"
                     Text="{DynamicResource Text.Repository.Search.By}"
                     Foreground="{DynamicResource Brush.FG2}"
                     Margin="2,0,0,0"/>
          
          <ComboBox Grid.Column="1"
                    MinHeight="24" Height="24"
                    Padding="8,0"
                    Background="{DynamicResource Brush.Contents}"
                    BorderBrush="{DynamicResource Brush.Border2}"
                    HorizontalAlignment="Right"
                    SelectedIndex="{Binding SearchCommitFilterType, Mode=TwoWay}">
            <ComboBox.Items>
              <TextBlock Text="{DynamicResource Text.Repository.Search.ByBaseInfo}" FontSize="12"/>
              <TextBlock Text="{DynamicResource Text.Repository.Search.ByFile}" FontSize="12"/>
            </ComboBox.Items>
          </ComboBox>
        </Grid>

        <DataGrid Grid.Row="2"
                  ItemsSource="{Binding SearchedCommits}"
                  SelectionMode="Single"
                  SelectedItem="{Binding SearchResultSelectedCommit, Mode=OneWay}"
                  CanUserReorderColumns="False"
                  CanUserResizeColumns="False"
                  CanUserSortColumns="False"
                  IsReadOnly="True"
                  HeadersVisibility="None"
                  Focusable="False"
                  RowHeight="50"
                  BorderThickness="1"
                  BorderBrush="{DynamicResource Brush.Border2}"
                  Background="{DynamicResource Brush.Contents}"
                  Margin="4,0,4,4"
                  CornerRadius="4"
                  HorizontalScrollBarVisibility="Disabled"
                  VerticalScrollBarVisibility="Auto"
                  SelectionChanged="OnSearchResultDataGridSelectionChanged">
          <DataGrid.Columns>
            <DataGridTemplateColumn Width="*">
              <DataGridTemplateColumn.CellTemplate>
                <DataTemplate DataType="m:Commit">
                  <Border BorderBrush="{DynamicResource Brush.Border2}" BorderThickness="0,0,0,1" Padding="4">
                    <Grid RowDefinitions="Auto,*">
                      <Grid Grid.Row="0" ColumnDefinitions="Auto,*,Auto,Auto">
                        <v:Avatar Width="16" Height="16"
                                  VerticalAlignment="Center"
                                  IsHitTestVisible="False"
                                  User="{Binding Author}"/>
                        <TextBlock Grid.Column="1" Classes="monospace" Text="{Binding Author.Name}" Margin="8,0,0,0"/>
                        <TextBlock Grid.Column="2" Classes="monospace" Text="{Binding SHA, Converter={x:Static c:StringConverters.ToShortSHA}}" Foreground="DarkOrange" Margin="8,0,0,0"/>
                        <TextBlock Grid.Column="3" Classes="monospace" Text="{Binding AuthorTimeShortStr}" Foreground="{DynamicResource Brush.FG2}" Margin="8,0,0,0"/>
                      </Grid>

                      <TextBlock Grid.Row="1" Text="{Binding Subject}" VerticalAlignment="Bottom"/>
                    </Grid>
                  </Border>
                </DataTemplate>
              </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
          </DataGrid.Columns>
        </DataGrid>

        <Path Grid.Row="2"
              HorizontalAlignment="Center" VerticalAlignment="Center"
              Width="48" Height="48"
              Data="{StaticResource Icons.Empty}"
              Fill="{DynamicResource Brush.FG2}"
              IsVisible="{Binding SearchedCommits.Count, Converter={x:Static c:IntConverters.IsZero}}"/>
      </Grid>

      <!-- Splitter -->
      <GridSplitter Grid.Column="1"
                    MinWidth="1"
                    HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
                    Background="Transparent"
                    BorderThickness="0,0,1,0"
                    BorderBrush="{DynamicResource Brush.Border0}"/>

      <!-- Right -->
      <Grid Grid.Column="2" RowDefinitions="Auto,*"> 
        <Grid Grid.Row="0" Height="26" ColumnDefinitions="*,Auto,Auto,Auto" Background="{DynamicResource Brush.Conflict}" IsVisible="{Binding InProgressContext, Converter={x:Static ObjectConverters.IsNotNull}}">
          <ContentControl Grid.Column="0" Margin="8,0" Content="{Binding InProgressContext}">
            <ContentControl.DataTemplates>
              <DataTemplate DataType="vm:CherryPickInProgress">
                <TextBlock FontWeight="Bold" Foreground="{DynamicResource Brush.ConflictForeground}" Text="{DynamicResource Text.InProgress.CherryPick}"/>
              </DataTemplate>

              <DataTemplate DataType="vm:RebaseInProgress">
                <TextBlock FontWeight="Bold" Foreground="{DynamicResource Brush.ConflictForeground}" Text="{DynamicResource Text.InProgress.Rebase}"/>
              </DataTemplate>

              <DataTemplate DataType="vm:RevertInProgress">
                <TextBlock FontWeight="Bold" Foreground="{DynamicResource Brush.ConflictForeground}" Text="{DynamicResource Text.InProgress.Revert}"/>
              </DataTemplate>

              <DataTemplate DataType="vm:MergeInProgress">
                <TextBlock FontWeight="Bold" Foreground="{DynamicResource Brush.ConflictForeground}" Text="{DynamicResource Text.InProgress.Merge}"/>
              </DataTemplate>
            </ContentControl.DataTemplates>
          </ContentControl>

          <Button Grid.Column="1" Classes="flat" FontWeight="Regular" Content="{DynamicResource Text.Repository.Resolve}" Height="20" Padding="8,0" Margin="4,0" Command="{Binding GotoResolve}">
            <Button.IsVisible>
              <Binding Path="SelectedViewIndex" Converter="{x:Static c:IntConverters.IsNotOne}"/>
            </Button.IsVisible>
          </Button>

          <Button Grid.Column="2" Classes="flat primary" FontWeight="Regular" Content="{DynamicResource Text.Repository.Continue}" Height="20" Padding="8,0" Margin="4,0" Command="{Binding ContinueMerge}" IsVisible="{Binding !HasUnsolvedConflicts}"/>
          <Button Grid.Column="3" Classes="flat" FontWeight="Regular" Content="{DynamicResource Text.Repository.Abort}" Height="20" Padding="8,0" Margin="4,0" Command="{Binding AbortMerge}"/>
        </Grid>

        <ContentControl Grid.Row="1" Content="{Binding SelectedView}">
          <ContentControl.DataTemplates>
            <DataTemplate DataType="vm:Histories">
              <v:Histories NavigationId="{Binding NavigationId}"/>
            </DataTemplate>

            <DataTemplate DataType="vm:WorkingCopy">
              <v:WorkingCopy/>
            </DataTemplate>

            <DataTemplate DataType="vm:StashesPage">
              <v:StashesPage/>
            </DataTemplate>
          </ContentControl.DataTemplates>
        </ContentControl>
      </Grid>
    </Grid>
  </Grid>
</UserControl>
