<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>
    <Grid.ColumnDefinitions>
      <ColumnDefinition Width="{Binding Source={x:Static vm:Preference.Instance}, Path=Layout.RepositorySidebarWidth, Mode=TwoWay}" MinWidth="200" MaxWidth="500"/>
      <ColumnDefinition Width="3"/>
      <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>

    <!-- Left Panel -->
    <Grid Grid.Column="0" RowDefinitions="Auto,*">
      <!-- Page Switcher for Left Contents (Dashboard or CommitSearch) -->
      <StackPanel Grid.Row="0" Margin="0,6" Height="24" HorizontalAlignment="Center" Orientation="Horizontal">
        <RadioButton Classes="switch_button"
                     Width="48"
                     GroupName="SearchGroup"
                     IsChecked="{Binding !IsSearching, Mode=OneWay}">
          <Path Width="12" Height="12" Stretch="Fill" HorizontalAlignment="Center" Data="{StaticResource Icons.Home}"/>
        </RadioButton>

        <RadioButton Classes="switch_button"
                     Width="48"
                     GroupName="SearchGroup"
                     IsChecked="{Binding IsSearching, Mode=TwoWay}">
          <Path Width="12" Height="12" Stretch="Fill" HorizontalAlignment="Center" Data="{StaticResource Icons.Search}"/>
        </RadioButton>
      </StackPanel>

      <!-- Dashboard -->
      <Grid Grid.Row="1" Margin="0,0,0,8" RowDefinitions="Auto,Auto,*" IsVisible="{Binding !IsSearching}">
        <!-- Page Switcher for Right Panel -->
        <Border Grid.Row="0" Margin="8,0,4,0" BorderThickness="1" BorderBrush="{DynamicResource Brush.Border2}" CornerRadius="6">
          <Border CornerRadius="6" ClipToBounds="True">
            <ListBox Background="Transparent" SelectedIndex="{Binding SelectedViewIndex, Mode=TwoWay}">
              <ListBox.Styles>
                <Style Selector="Path.icon">
                  <Setter Property="Width" Value="12"/>
                  <Setter Property="Height" Value="12"/>
                  <Setter Property="Margin" Value="8,0,6,0"/>
                  <Setter Property="Fill" Value="{DynamicResource Brush.FG2}"/>
                </Style>
                <Style Selector="TextBlock.header">
                  <Setter Property="Foreground" Value="{DynamicResource Brush.FG2}"/>
                  <Setter Property="FontWeight" Value="Bold"/>
                </Style>
                <Style Selector="ListBoxItem">
                  <Setter Property="Height" Value="28"/>
                  <Setter Property="Margin" Value="0"/>
                  <Setter Property="Padding" Value="0"/>
                  <Setter Property="BorderThickness" Value="0,0,0,1"/>
                  <Setter Property="BorderBrush" Value="{DynamicResource Brush.Border2}"/>
                </Style>
                <Style Selector="ListBoxItem:nth-last-child(1)">
                  <Setter Property="BorderThickness" Value="0"/>
                </Style>
                <Style Selector="ListBoxItem:pointerover /template/ ContentPresenter#PART_ContentPresenter, ListBoxItem:selected /template/ ContentPresenter#PART_ContentPresenter">
                  <Setter Property="Background" Value="Transparent"/>
                </Style>
                <Style Selector="ListBoxItem:selected Grid.view_mode">
                  <Setter Property="Background" Value="{DynamicResource Brush.AccentHovered}"/>
                </Style>
                <Style Selector="ListBoxItem:selected TextBlock.header">
                  <Setter Property="Foreground" Value="{DynamicResource Brush.FG1}"/>
                </Style>
                <Style Selector="ListBoxItem:selected Path.icon">
                  <Setter Property="Fill" Value="{DynamicResource Brush.FG1}"/>
                </Style>
              </ListBox.Styles>

              <ListBox.ItemsPanel>
                <ItemsPanelTemplate>
                  <StackPanel Orientation="Vertical"/>
                </ItemsPanelTemplate>
              </ListBox.ItemsPanel>

              <ListBoxItem>
                <Grid Classes="view_mode" ColumnDefinitions="Auto,*,Auto,Auto,Auto,Auto">
                  <Path Grid.Column="0" Classes="icon" Data="{StaticResource Icons.Histories}"/>
                  <TextBlock Grid.Column="1" Classes="header" Text="{DynamicResource Text.Histories}"/>
                  <ToggleButton Grid.Column="2"
                                Classes="layout_direction"
                                Width="28" Height="26"
                                IsChecked="{Binding Source={x:Static vm:Preference.Instance}, Path=UseTwoColumnsLayoutInHistories, Mode=TwoWay}"
                                ToolTip.Tip="{DynamicResource Text.Histories.DisplayMode}"/>
                  <ToggleButton Grid.Column="3"
                                Classes="line_path"
                                Width="28" Height="26"
                                Background="Transparent"
                                IsChecked="{Binding EnableReflog, Mode=TwoWay}"
                                ToolTip.Tip="{DynamicResource Text.Repository.EnableReflog}">
                    <Path Width="12" Height="12" Data="{StaticResource Icons.Reference}"/>
                  </ToggleButton>
                  <ToggleButton Grid.Column="4"
                                Classes="line_path"
                                Width="28" Height="26"
                                Background="Transparent"
                                IsChecked="{Binding EnableFirstParentInHistories, Mode=TwoWay}"
                                ToolTip.Tip="{DynamicResource Text.Repository.FirstParentFilterToggle}">
                    <Path Width="12" Height="12" Data="{StaticResource Icons.FirstParentFilter}"/>
                  </ToggleButton>
                  <Button Grid.Column="5"
                          Classes="icon_button"
                          Width="28" Height="26"
                          Click="OnSwitchHistoriesOrderClicked"
                          ToolTip.Tip="{DynamicResource Text.Repository.HistoriesOrder}">
                    <Path Width="12" Height="12" Margin="0,2,0,0" Data="{StaticResource Icons.Order}"/>
                  </Button>
                </Grid>
              </ListBoxItem>

              <ListBoxItem>
                <Grid Classes="view_mode" ColumnDefinitions="Auto,*,Auto">
                  <Path Grid.Column="0" Classes="icon" Data="{StaticResource Icons.Changes}"/>
                  <TextBlock Grid.Column="1" Classes="header" Text="{DynamicResource Text.WorkingCopy}"/>
                  <v:CounterPresenter Grid.Column="2"
                                      Margin="6,0"
                                      VerticalAlignment="Center"
                                      Count="{Binding LocalChangesCount}"
                                      FontFamily="{DynamicResource Fonts.Monospace}"
                                      FontSize="10"
                                      Foreground="{DynamicResource Brush.BadgeFG}"
                                      Background="{DynamicResource Brush.Badge}"/>
                </Grid>
              </ListBoxItem>

              <ListBoxItem>
                <Grid Classes="view_mode" ColumnDefinitions="Auto,*,Auto">
                  <Path Grid.Column="0" Classes="icon" Data="{StaticResource Icons.Stashes}"/>
                  <TextBlock Grid.Column="1" Classes="header" Text="{DynamicResource Text.Stashes}"/>
                  <v:CounterPresenter Grid.Column="2"
                                      Margin="6,0"
                                      VerticalAlignment="Center"
                                      Count="{Binding StashesCount}"
                                      FontFamily="{DynamicResource Fonts.Monospace}"
                                      FontSize="10"
                                      Foreground="{DynamicResource Brush.BadgeFG}"
                                      Background="{DynamicResource Brush.Badge}"/>
                </Grid>
              </ListBoxItem>
            </ListBox>
          </Border>
        </Border>
        
        <!-- Filter Branches/Tags/Submodules -->
        <TextBox Grid.Row="1"
                 Height="26"
                 Margin="8,6,4,0"
                 BorderThickness="1"
                 CornerRadius="4"
                 BorderBrush="{DynamicResource Brush.Border2}"
                 Watermark="{DynamicResource Text.Repository.Filter}"
                 Text="{Binding Filter, 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 ClearFilter}"
                    IsVisible="{Binding Filter, 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="2" x:Name="LeftSidebarGroups" Margin="0,4,0,0" RowDefinitions="28,Auto,28,Auto,28,Auto,28,Auto,28,Auto" SizeChanged="OnLeftSidebarSizeChanged">
          <!-- Local Branches -->
          <ToggleButton Grid.Row="0" Classes="group_expander" IsChecked="{Binding IsLocalBranchGroupExpanded, Mode=TwoWay}">
            <Grid ColumnDefinitions="16,*">
              <Path Grid.Column="0" Width="11" Height="11" HorizontalAlignment="Left" Data="{StaticResource Icons.Local}" Fill="{DynamicResource Brush.FG2}"/>
              <TextBlock Grid.Column="1" Classes="group_header_label" Margin="0" Text="{DynamicResource Text.Repository.LocalBranches}"/>
            </Grid>
          </ToggleButton>
          <v:BranchTree Grid.Row="1"
                        x:Name="LocalBranchTree"
                        Height="0"
                        Margin="8,0,4,0"
                        Nodes="{Binding LocalBranchTrees}"
                        IsVisible="{Binding IsLocalBranchGroupExpanded}"
                        SelectionChanged="OnLocalBranchTreeSelectionChanged"
                        RowsChanged="OnBranchTreeRowsChanged"/>

          <!-- Remotes -->
          <ToggleButton Grid.Row="2" Classes="group_expander" IsChecked="{Binding IsRemoteGroupExpanded, Mode=TwoWay}">
            <Grid ColumnDefinitions="16,*,Auto">
              <Path Grid.Column="0" Width="12" Height="12" HorizontalAlignment="Left" Data="{StaticResource Icons.Remotes}" Fill="{DynamicResource Brush.FG2}"/>
              <TextBlock Grid.Column="1" Classes="group_header_label" Margin="0" Text="{DynamicResource Text.Repository.Remotes}"/>
              <Button Grid.Column="2" 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>
          </ToggleButton>
          <v:BranchTree Grid.Row="3"
                        x:Name="RemoteBranchTree"
                        Height="0"
                        Margin="8,0,4,0"
                        Nodes="{Binding RemoteBranchTrees}"
                        IsVisible="{Binding IsRemoteGroupExpanded}"
                        SelectionChanged="OnRemoteBranchTreeSelectionChanged"
                        RowsChanged="OnBranchTreeRowsChanged"/>

          <!-- Tags -->
          <ToggleButton Grid.Row="4" Classes="group_expander" IsChecked="{Binding IsTagGroupExpanded, Mode=TwoWay}">
            <Grid ColumnDefinitions="16,Auto,*,Auto,Auto">
              <Path Grid.Column="0" Width="11" Height="11" Margin="2,1,0,0" HorizontalAlignment="Left" Data="{StaticResource Icons.Tags}" Fill="{DynamicResource Brush.FG2}"/>
              <TextBlock Grid.Column="1" Classes="group_header_label" Margin="0" Text="{DynamicResource Text.Repository.Tags}"/>
              <TextBlock Grid.Column="2" Text="{Binding Tags, Converter={x:Static c:ListConverters.ToCount}}" Foreground="{DynamicResource Brush.FG2}" FontWeight="Bold"/>
              <ToggleButton Grid.Column="3" 
                            Classes="tag_display_mode" 
                            Width="14" 
                            IsChecked="{Binding Source={x:Static vm:Preference.Instance}, Path=ShowTagsAsTree, Mode=TwoWay}"
                            ToolTip.Tip="{DynamicResource Text.Repository.ShowTagsAsTree}"/>
              <Button Grid.Column="4" 
                      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>
          <v:TagsView Grid.Row="5"
                      x:Name="TagsList"
                      Height="0"
                      Margin="8,0,4,0"
                      Background="Transparent"
                      ShowTagsAsTree="{Binding Source={x:Static vm:Preference.Instance}, Path=ShowTagsAsTree, Mode=OneWay}"
                      Tags="{Binding VisibleTags}"
                      Focusable="False"
                      IsVisible="{Binding IsTagGroupExpanded, Mode=OneWay}"
                      SelectionChanged="OnTagsSelectionChanged"
                      RowsChanged="OnTagsRowsChanged"/>

          <!-- Submodules -->
          <ToggleButton Grid.Row="6" Classes="group_expander" IsChecked="{Binding IsSubmoduleGroupExpanded, Mode=TwoWay}">
            <Grid ColumnDefinitions="16,Auto,*,Auto,Auto">
              <Path Grid.Column="0" Width="10" Height="10" Margin="2,0,0,0" HorizontalAlignment="Left" Data="{StaticResource Icons.Submodules}" Fill="{DynamicResource Brush.FG2}"/>
              <TextBlock Grid.Column="1" Classes="group_header_label" Margin="0" Text="{DynamicResource Text.Repository.Submodules}"/>
              <TextBlock Grid.Column="2" Text="{Binding Submodules, Converter={x:Static c:ListConverters.ToCount}}" Foreground="{DynamicResource Brush.FG2}" FontWeight="Bold"/>
              <Button Grid.Column="3"
                      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 Width="12" Height="12" Data="{StaticResource Icons.Loading}"/>
              </Button>
              <Button Grid.Column="4"
                      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>
          <ListBox Grid.Row="7"
                   x:Name="SubmoduleList"
                   Height="0"
                   Margin="12,0,4,0"
                   Classes="repo_left_content_list"
                   ItemsSource="{Binding VisibleSubmodules}"
                   SelectionMode="Single"
                   ContextRequested="OnSubmoduleContextRequested"
                   DoubleTapped="OnDoubleTappedSubmodule"
                   PropertyChanged="OnLeftSidebarListBoxPropertyChanged"
                   IsVisible="{Binding IsSubmoduleGroupExpanded, Mode=OneWay}">
            <ListBox.Styles>
              <Style Selector="ListBoxItem">
                <Setter Property="CornerRadius" Value="4"/>
              </Style>
            </ListBox.Styles>
            <ListBox.ItemTemplate>
              <DataTemplate DataType="m:Submodule">
                <Grid ColumnDefinitions="Auto,*,8">
                  <Path Grid.Column="0" Width="10" Height="10" Margin="8,0" Data="{StaticResource Icons.Submodule}"/>
                  <TextBlock Grid.Column="1" Text="{Binding Path}" ClipToBounds="True" Classes="primary" TextTrimming="CharacterEllipsis"/>
                  <Path Grid.Column="2"
                        Width="8" Height="8"
                        Fill="Goldenrod"
                        Data="{StaticResource Icons.Modified}"
                        IsVisible="{Binding IsDirty}"/>
                </Grid>
              </DataTemplate>
            </ListBox.ItemTemplate>
          </ListBox>

          <!-- Worktrees -->
          <ToggleButton Grid.Row="8" Classes="group_expander" IsChecked="{Binding IsWorktreeGroupExpanded, Mode=TwoWay}">
            <Grid ColumnDefinitions="16,Auto,*,Auto,Auto">
              <Path Grid.Column="0" Width="11" Height="11" Margin="1,0,0,0" HorizontalAlignment="Left" Data="{StaticResource Icons.Worktrees}" Fill="{DynamicResource Brush.FG2}"/>
              <TextBlock Grid.Column="1" Classes="group_header_label" Margin="0" Text="{DynamicResource Text.Repository.Worktrees}"/>
              <TextBlock Grid.Column="2" Text="{Binding Worktrees, Converter={x:Static c:ListConverters.ToCount}}" Foreground="{DynamicResource Brush.FG2}" FontWeight="Bold"/>
              <Button Grid.Column="3"
                      Classes="icon_button"
                      Width="14"
                      Margin="8,0"
                      Command="{Binding PruneWorktrees}"
                      IsVisible="{Binding Worktrees, Converter={x:Static c:ListConverters.IsNotNullOrEmpty}}"
                      ToolTip.Tip="{DynamicResource Text.Repository.Worktrees.Prune}">
                <Path Width="12" Height="12" Data="{StaticResource Icons.Loading}"/>
              </Button>
              <Button Grid.Column="4"
                      Classes="icon_button"
                      Width="14"
                      Margin="0,0,9,0"
                      Command="{Binding AddWorktree}"
                      ToolTip.Tip="{DynamicResource Text.Repository.Worktrees.Add}">
                <Path Width="11" Height="11" Data="{StaticResource Icons.Worktree.Add}"/>
              </Button>
            </Grid>
          </ToggleButton>
          <ListBox Grid.Row="9"
                   x:Name="WorktreeList"
                   Height="0"
                   Margin="12,0,4,0"
                   Classes="repo_left_content_list"
                   ItemsSource="{Binding Worktrees}"
                   SelectionMode="Single"
                   ContextRequested="OnWorktreeContextRequested"
                   DoubleTapped="OnDoubleTappedWorktree"
                   PropertyChanged="OnLeftSidebarListBoxPropertyChanged"
                   IsVisible="{Binding IsWorktreeGroupExpanded, Mode=OneWay}">
            <ListBox.Styles>
              <Style Selector="ListBoxItem">
                <Setter Property="CornerRadius" Value="4"/>
              </Style>
            </ListBox.Styles>
            <ListBox.ItemTemplate>
              <DataTemplate DataType="m:Worktree">
                <Grid ColumnDefinitions="Auto,*,22">
                  <Path Grid.Column="0" Width="10" Height="10" Margin="8,0,0,0" Data="{StaticResource Icons.Worktree}"/>
                  <TextBlock Grid.Column="1" Classes="primary" Margin="8,0,0,0" TextTrimming="CharacterEllipsis">
                    <Run Text="{Binding FullPath}"/>
                    <Run Text="{Binding Name}" Foreground="{DynamicResource Brush.FG2}"/>
                  </TextBlock>
                  <Path Grid.Column="2" Width="10" Height="10" Margin="4,0,0,0" Data="{StaticResource Icons.Lock}" Fill="{DynamicResource Brush.FG2}" IsVisible="{Binding IsLocked}"/>
                </Grid>
              </DataTemplate>
            </ListBox.ItemTemplate>
          </ListBox>
        </Grid>
      </Grid>

      <!-- Commit Search Panel -->
      <Grid Grid.Row="1" RowDefinitions="Auto,26,*" Margin="8,0,4,8" IsVisible="{Binding IsSearching}" PropertyChanged="OnSearchCommitPanelPropertyChanged">
        <!-- Search Input Box -->
        <Grid Grid.Row="0" Height="26" Margin="0,4,0,0">
          <TextBox x:Name="TxtSearchCommitsBox"
                   Height="24"
                   BorderThickness="1"
                   BorderBrush="{DynamicResource Brush.Border2}"
                   Background="{DynamicResource Brush.Contents}"
                   CornerRadius="12"
                   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>

          <Popup PlacementTarget="{Binding #TxtSearchCommitsBox}"
                 Placement="BottomEdgeAlignedLeft"
                 HorizontalOffset="-8" VerticalAlignment="-8"
                 IsOpen="{Binding IsSearchCommitSuggestionOpen}">
            <Border Margin="8" VerticalAlignment="Top" Effect="drop-shadow(0 0 8 #80000000)">
              <Border Background="{DynamicResource Brush.Popup}" CornerRadius="4" Padding="4" BorderThickness="0.65" BorderBrush="{DynamicResource Brush.Accent}">
                <ListBox x:Name="SearchSuggestionBox"
                         Background="Transparent"
                         SelectionMode="Single"
                         ItemsSource="{Binding SearchCommitFilterSuggestion}"
                         MaxHeight="400"
                         Focusable="True"
                         KeyDown="OnSearchSuggestionBoxKeyDown">
                  <ListBox.Styles>
                    <Style Selector="ListBoxItem">
                      <Setter Property="Padding" Value="0"/>
                      <Setter Property="MinHeight" Value="26"/>
                      <Setter Property="CornerRadius" Value="4"/>
                    </Style>

                    <Style Selector="ListBox">
                      <Setter Property="FocusAdorner">
                        <FocusAdornerTemplate>
                          <Grid/>
                        </FocusAdornerTemplate>
                      </Setter>
                    </Style>
                  </ListBox.Styles>

                  <ListBox.ItemsPanel>
                    <ItemsPanelTemplate>
                      <StackPanel Orientation="Vertical"/>
                    </ItemsPanelTemplate>
                  </ListBox.ItemsPanel>

                  <ListBox.ItemTemplate>
                    <DataTemplate DataType="x:String">
                      <StackPanel Background="Transparent" Orientation="Vertical" Margin="8,4" DoubleTapped="OnSearchSuggestionDoubleTapped">
                        <StackPanel Orientation="Horizontal">
                          <Path Width="12" Height="12" Data="{StaticResource Icons.File}"/>
                          <TextBlock Classes="primary" Margin="6,0,0,0" Text="{Binding Converter={x:Static c:PathConverters.PureFileName}}"/>
                        </StackPanel>
                        <TextBlock Classes="primary" FontSize="12" Margin="18,2,0,0" Foreground="{DynamicResource Brush.FG2}" Text="{Binding Converter={x:Static c:PathConverters.PureDirectoryName}}"/>
                      </StackPanel>
                    </DataTemplate>
                  </ListBox.ItemTemplate>
                </ListBox>
              </Border>
            </Border>
          </Popup>
        </Grid>

        <StackPanel Grid.Row="1" Orientation="Horizontal">
          <ComboBox MinHeight="24" Height="24"
                    Padding="4,0"
                    Background="Transparent"
                    BorderThickness="0"
                    SelectedIndex="{Binding SearchCommitFilterType, Mode=TwoWay}">
            <ComboBox.Items>
              <TextBlock Text="{DynamicResource Text.Repository.Search.BySHA}" FontSize="12"/>
              <TextBlock Text="{DynamicResource Text.Repository.Search.ByUser}" FontSize="12"/>
              <TextBlock Text="{DynamicResource Text.Repository.Search.ByMessage}" FontSize="12"/>
              <TextBlock Text="{DynamicResource Text.Repository.Search.ByFile}" FontSize="12"/>
            </ComboBox.Items>
          </ComboBox>

          <CheckBox Height="24"
                    Margin="4,0,0,0"
                    IsChecked="{Binding OnlySearchCommitsInCurrentBranch, Mode=TwoWay}"
                    IsVisible="{Binding SearchCommitFilterType, Converter={x:Static c:IntConverters.IsGreaterThanZero}}">
            <TextBlock Text="{DynamicResource Text.Repository.Search.InCurrentBranch}" FontSize="12"/>
          </CheckBox>
        </StackPanel>

        <ListBox Grid.Row="2"
                 Margin="0,8,0,0"
                 ItemsSource="{Binding SearchedCommits}"
                 SelectionMode="Single"
                 SelectedItem="{Binding SearchResultSelectedCommit, Mode=TwoWay}"
                 BorderThickness="1"
                 BorderBrush="{DynamicResource Brush.Border2}"
                 Background="{DynamicResource Brush.Contents}"
                 CornerRadius="4"
                 ScrollViewer.HorizontalScrollBarVisibility="Disabled"
                 ScrollViewer.VerticalScrollBarVisibility="Auto">
          <ListBox.Styles>
            <Style Selector="ListBoxItem">
              <Setter Property="Margin" Value="0"/>
              <Setter Property="Padding" Value="0"/>
              <Setter Property="Height" Value="50"/>
            </Style>
          </ListBox.Styles>

          <ListBox.ItemsPanel>
            <ItemsPanelTemplate>
              <VirtualizingStackPanel Orientation="Vertical"/>
            </ItemsPanelTemplate>
          </ListBox.ItemsPanel>

          <ListBox.ItemTemplate>
            <DataTemplate DataType="m:Commit">
              <Border BorderBrush="{DynamicResource Brush.Border2}" BorderThickness="0,0,0,1" Padding="4" Background="Transparent">
                <Grid RowDefinitions="Auto,*">
                  <Grid Grid.Row="0" ColumnDefinitions="Auto,*,Auto,Auto">
                    <v:Avatar Grid.Column="0" Width="16" Height="16" VerticalAlignment="Center" IsHitTestVisible="False" User="{Binding Author}"/>
                    <TextBlock Grid.Column="1" Classes="primary" Text="{Binding Author.Name}" Margin="8,0,0,0" ClipToBounds="True"/>
                    <TextBlock Grid.Column="2" Classes="primary" Text="{Binding SHA, Converter={x:Static c:StringConverters.ToShortSHA}}" Foreground="DarkOrange" Margin="8,0,0,0"/>
                    <TextBlock Grid.Column="3" Classes="primary" Text="{Binding AuthorTimeShortStr}" Foreground="{DynamicResource Brush.FG2}" Margin="8,0,0,0"/>
                  </Grid>

                  <TextBlock Grid.Row="1" Classes="primary" Text="{Binding Subject}" VerticalAlignment="Bottom"/>
                </Grid>
              </Border>
            </DataTemplate>
          </ListBox.ItemTemplate>
        </ListBox>

        <Path Grid.Row="2"
              HorizontalAlignment="Center" VerticalAlignment="Center"
              Width="48" Height="48"
              Data="{StaticResource Icons.Empty}"
              Fill="{DynamicResource Brush.FG2}">
          <Path.IsVisible>
            <MultiBinding Converter="{x:Static BoolConverters.And}">
              <Binding Path="SearchedCommits.Count" Converter="{x:Static c:IntConverters.IsZero}"/>
              <Binding Path="IsSearchLoadingVisible" Converter="{x:Static BoolConverters.Not}"/>
            </MultiBinding>
          </Path.IsVisible>
        </Path>
        
        <v:LoadingIcon Grid.Row="2"
                       Width="48" Height="48"
                       HorizontalAlignment="Center" VerticalAlignment="Center"
                       IsVisible="{Binding IsSearchLoadingVisible}"/>
      </Grid>
    </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,Auto,*">
      <Grid Grid.Row="0" Height="28" ColumnDefinitions="*,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="m:Commit">
              <StackPanel MinWidth="400" Orientation="Vertical">
                <Grid ColumnDefinitions="Auto,*,Auto">
                  <v:Avatar Grid.Column="0" Width="16" Height="16" VerticalAlignment="Center" IsHitTestVisible="False" User="{Binding Author}"/>
                  <TextBlock Grid.Column="1" Classes="primary" Text="{Binding Author.Name}" Margin="8,0,0,0"/>
                  <TextBlock Grid.Column="2" Classes="primary" Text="{Binding CommitterTimeStr}" Foreground="{DynamicResource Brush.FG2}" Margin="8,0,0,0"/>
                </Grid>

                <TextBlock Classes="primary" Margin="0,8,0,0" Text="{Binding Subject}" TextWrapping="Wrap"/>
              </StackPanel>
            </DataTemplate>
            
            <DataTemplate DataType="vm:CherryPickInProgress">
              <Grid ColumnDefinitions="*,Auto">
                <StackPanel Grid.Column="0" Orientation="Horizontal">
                  <TextBlock FontWeight="Bold" Foreground="{DynamicResource Brush.ConflictForeground}" Text="{DynamicResource Text.InProgress.CherryPick}"/>
                  <TextBlock FontWeight="Bold" Margin="4,0,0,0" Foreground="{DynamicResource Brush.ConflictForeground}" Text="{DynamicResource Text.InProgress.CherryPick.Head}"/>
                  <TextBlock FontWeight="Bold" Margin="4,0,0,0" Foreground="DarkOrange" Text="{Binding Head.SHA, Converter={x:Static c:StringConverters.ToShortSHA}}" ToolTip.Tip="{Binding Head}"/>
                </StackPanel>

                <Button Grid.Column="1" Classes="flat" FontWeight="Regular" BorderThickness="0" Content="{DynamicResource Text.Repository.Skip}" Padding="8,2" Click="OnSkipInProgress"/>
              </Grid>
            </DataTemplate>

            <DataTemplate DataType="vm:RebaseInProgress">
              <Grid ColumnDefinitions="*,Auto">
                <StackPanel Grid.Column="0" Orientation="Horizontal">
                  <TextBlock FontWeight="Bold" Foreground="{DynamicResource Brush.ConflictForeground}" Text="{DynamicResource Text.InProgress.Rebase}"/>
                  <TextBlock FontWeight="Bold" Margin="4,0,0,0" Foreground="{DynamicResource Brush.ConflictForeground}" Text="{DynamicResource Text.InProgress.Rebase.StoppedAt}"/>
                  <TextBlock FontWeight="Bold" Margin="4,0,0,0" Foreground="DarkOrange" Text="{Binding StoppedAt.SHA, Converter={x:Static c:StringConverters.ToShortSHA}}" ToolTip.Tip="{Binding StoppedAt}"/>
                </StackPanel>

                <Button Grid.Column="1" Classes="flat" FontWeight="Regular" BorderThickness="0" Content="{DynamicResource Text.Repository.Skip}" Padding="8,2" Click="OnSkipInProgress"/>
              </Grid>
            </DataTemplate>

            <DataTemplate DataType="vm:RevertInProgress">
              <Grid ColumnDefinitions="*,Auto">
                <StackPanel Grid.Column="0" Orientation="Horizontal">
                  <TextBlock FontWeight="Bold" Foreground="{DynamicResource Brush.ConflictForeground}" Text="{DynamicResource Text.InProgress.Revert}"/>
                  <TextBlock FontWeight="Bold" Margin="4,0,0,0" Foreground="{DynamicResource Brush.ConflictForeground}" Text="{DynamicResource Text.InProgress.Revert.Head}"/>
                  <TextBlock FontWeight="Bold" Margin="4,0,0,0" Foreground="DarkOrange" Text="{Binding Head.SHA, Converter={x:Static c:StringConverters.ToShortSHA}}" ToolTip.Tip="{Binding Head}"/>
                </StackPanel>

                <Button Grid.Column="1" Classes="flat" FontWeight="Regular" BorderThickness="0" Content="{DynamicResource Text.Repository.Skip}" Padding="8,2" Click="OnSkipInProgress"/>
              </Grid>
            </DataTemplate>

            <DataTemplate DataType="vm:MergeInProgress">
              <StackPanel Orientation="Horizontal">
                <TextBlock FontWeight="Bold" Foreground="{DynamicResource Brush.ConflictForeground}" Text="{DynamicResource Text.InProgress.Merge}"/>
                <TextBlock FontWeight="Bold" Margin="4,0,0,0" Foreground="{DynamicResource Brush.ConflictForeground}" Text="{DynamicResource Text.InProgress.Merge.Operating}"/>
                <TextBlock FontWeight="Bold" Margin="4,0,0,0" Foreground="DarkOrange" Text="{Binding SourceName}" ToolTip.Tip="{Binding Source}"/>
                <TextBlock FontWeight="Bold" Margin="4,0,0,0" Foreground="{DynamicResource Brush.ConflictForeground}" Text="→"/>
                <TextBlock FontWeight="Bold" Margin="4,0,0,0" Foreground="DarkOrange" Text="{Binding Current}"/>
              </StackPanel>
            </DataTemplate>
          </ContentControl.DataTemplates>
        </ContentControl>
        
        <Button Grid.Column="1"
                Classes="flat"
                FontWeight="Regular"
                BorderThickness="0"
                Content="{DynamicResource Text.Repository.Abort}"
                Padding="8,2" Margin="0,0,8,0"
                Command="{Binding AbortMerge}"/>
      </Grid>

      <Border Grid.Row="1" Background="{DynamicResource Brush.ToolBar}" BorderThickness="0,0,0,1" BorderBrush="{DynamicResource Brush.Border0}">
        <Border.IsVisible>
          <MultiBinding Converter="{x:Static BoolConverters.And}">
            <Binding Path="SelectedViewIndex" Converter="{x:Static c:IntConverters.IsZero}"/>
            <Binding Path="Settings.HistoriesFilters.Count" Converter="{x:Static c:IntConverters.IsGreaterThanZero}"/>
          </MultiBinding>
        </Border.IsVisible>

        <Grid Height="28" ColumnDefinitions="Auto,*,Auto">
          <Path Grid.Column="0"
                Margin="8,0,0,0"
                Width="12" Height="12"
                Data="{StaticResource Icons.Filter}"
                Fill="{DynamicResource Brush.FG2}"
                IsVisible="{Binding HistoriesFilterMode, Converter={x:Static ObjectConverters.Equal}, ConverterParameter={x:Static m:FilterMode.Included}}"/>
          <Path Grid.Column="0"
                Margin="8,0,0,0"
                Width="12" Height="12"
                Data="{StaticResource Icons.EyeClose}"
                Fill="{DynamicResource Brush.FG2}"
                IsVisible="{Binding HistoriesFilterMode, Converter={x:Static ObjectConverters.Equal}, ConverterParameter={x:Static m:FilterMode.Excluded}}"/>
          
          <ItemsControl Grid.Column="1" Margin="8,0,0,0" ItemsSource="{Binding Settings.HistoriesFilters}">
            <ItemsControl.ItemsPanel>
              <ItemsPanelTemplate>
                <VirtualizingStackPanel Orientation="Horizontal" VerticalAlignment="Center"/>
              </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            
            <ItemsControl.ItemTemplate>
              <DataTemplate DataType="m:Filter">
                <Border Height="20"
                        Margin="0,0,6,0"
                        CornerRadius="12"
                        BorderThickness="1"
                        BorderBrush="{Binding Mode, Converter={x:Static c:FilterModeConverters.ToBorderBrush}}">
                  <StackPanel Orientation="Horizontal" Margin="8,0">
                    <Path Width="10" Height="10" Data="{StaticResource Icons.Branch}" IsVisible="{Binding IsBranch}"/>
                    <Path Width="10" Height="10" Data="{StaticResource Icons.Tag}" IsVisible="{Binding !IsBranch}"/>
                    <TextBlock Classes="primary" Text="{Binding Pattern, Converter={x:Static c:StringConverters.TrimRefsPrefix}}" Margin="4,0,0,0"/>
                  </StackPanel>
                </Border>
              </DataTemplate>
            </ItemsControl.ItemTemplate>
          </ItemsControl>
          
          <Button Grid.Column="2" Classes="icon_button" Command="{Binding ClearHistoriesFilter}" ToolTip.Tip="{DynamicResource Text.Repository.ClearAllCommitsFilter}">
            <Path Width="14" Height="14" Margin="16,0,8,0" Data="{StaticResource Icons.RemoveAll}"/>
          </Button>
        </Grid>
      </Border>

      <ContentControl Grid.Row="2" Content="{Binding SelectedView}">
        <ContentControl.DataTemplates>
          <DataTemplate DataType="vm:Histories">
            <v:Histories CurrentBranch="{Binding Repo.CurrentBranch}"
                         AuthorNameColumnWidth="{Binding Source={x:Static vm:Preference.Instance}, Path=Layout.HistoriesAuthorColumnWidth, Mode=TwoWay}"
                         IssueTrackerRules="{Binding Repo.Settings.IssueTrackerRules}"
                         NavigationId="{Binding NavigationId}"/>
          </DataTemplate>

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

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

    <!-- Right (Auto-Fetch) -->
    <Border Grid.Column="2" Margin="12" HorizontalAlignment="Center" VerticalAlignment="Center" Effect="drop-shadow(0 0 12 #A0000000)" IsVisible="{Binding IsAutoFetching}">
      <Border Background="{DynamicResource Brush.Popup}" CornerRadius="6">
        <StackPanel Orientation="Vertical" Margin="16,8">
          <TextBlock Text="{DynamicResource Text.Repository.AutoFetching}"/>
          <ProgressBar Margin="0,8,0,0"
                       HorizontalAlignment="Stretch"
                       IsIndeterminate="{Binding IsAutoFetching}"
                       Background="{DynamicResource Brush.FG2}" Foreground="{DynamicResource Brush.Accent}"
                       Minimum="0" Maximum="100"/>
        </StackPanel>
      </Border>
    </Border>
  </Grid>
</UserControl>
