ksj09406 fadc000081 10차 F-3: 폴더 비교 "주석만 다름" 을 "다름(코드는 같음)" 으로
주석 · 공백을 걷어내고 견주는 판정이라 BOM · 줄끝 · 인코딩 · 끝 공백 · 빈 줄 · 들여쓰기만
다른 파일도 "주석만 다름" 이었다. 사용자: "이름을 바꿔줘". 판정 · 수는 그대로.

- 목록 · 범례(설명 붙임) · 요약 "다름 N(코드는 같음 M)" · 비교 결과 보고서
- 웹 문서의 이름도 바꿈(지난 기록은 그대로, 발행은 E-2)
- 하네스 FolderTest +1 (78건), 22벌 1,147건 통과, 빌드 경고 0 오류 0

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 16:05:13 +09:00

439 lines
28 KiB
XML

<UserControl x:Class="MergeHub.Views.FolderView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="clr-namespace:MergeHub.ViewModels"
xmlns:svc="clr-namespace:MergeHub.Services"
xmlns:ctl="clr-namespace:MergeHub.Views.Controls"
AllowDrop="True" DragOver="View_DragOver" Drop="View_Drop">
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/MergeHub;component/Views/Controls/AppStyles.xaml"/>
</ResourceDictionary.MergedDictionaries>
<BooleanToVisibilityConverter x:Key="BoolToVis"/>
<ctl:FolderStatusBrushConverter x:Key="StatusBrush"/>
<ctl:FolderFilterNameConverter x:Key="FolderFilterName"/>
<!-- 파일 비교 화면과 같은 글자 스타일. 두 화면이 따로 노는 것처럼 보이지 않게 값을 맞춰 둔다. -->
<Style x:Key="Muted" TargetType="TextBlock">
<Setter Property="Foreground" Value="{DynamicResource Ubisam.Brush.Muted}"/>
<Setter Property="VerticalAlignment" Value="Center"/>
</Style>
<!--
트리 한 줄. 이름 / 상태 / 왼쪽 정보 / 오른쪽 정보 를 고정 폭으로 늘어놓아
깊이가 달라도 상태 칸이 같은 자리에 오게 한다.
-->
<HierarchicalDataTemplate x:Key="NodeTemplate" ItemsSource="{Binding Children}">
<!--
줄 배경을 오른쪽 끝까지 채운다.
TreeViewItem 의 기본 템플릿은 머리 부분을 Auto 폭으로 잡아서
HorizontalContentAlignment 를 Stretch 로 줘도 늘어나지 않는다.
템플릿을 통째로 갈아끼우면 플랫폼 테마(펼침 표시·선택 색)를 잃으므로,
배경 띠 자체에 트리 폭만큼 최소 폭을 주고 넘치는 부분은 잘리게 둔다.
-->
<Border Padding="2,1" Background="{Binding DisplayStatus, Converter={StaticResource StatusBrush}}"
MinWidth="{Binding ActualWidth, RelativeSource={RelativeSource AncestorType=TreeView}}">
<!--
칸 폭을 고정한다. TreeView 는 깊이마다 왼쪽으로 들여쓰기 때문에 star 폭을 쓰면
줄마다 상태 칸이 다른 자리에 오고 머리글과도 어긋난다. 고정 폭이면
들여쓰기만큼(한 단계 약 19px)만 밀려서 눈으로 읽을 수 있다.
-->
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="420"/>
<ColumnDefinition Width="200"/>
<ColumnDefinition Width="190"/>
<ColumnDefinition Width="190"/>
<!-- 남는 폭을 먹는 빈 칸. 이게 없으면 줄 배경이 글자 끝에서 잘려
넓은 화면에서 색 띠가 중간에 끊겨 보인다. -->
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0" Orientation="Horizontal">
<TextBlock Text="📁" FontSize="11" Margin="0,0,4,0"
Visibility="{Binding IsDirectory, Converter={StaticResource BoolToVis}}"/>
<TextBlock Text="{Binding Name}" FontFamily="Consolas" FontSize="12"
ToolTip="{Binding RelativePath}"/>
</StackPanel>
<TextBlock Grid.Column="1" Text="{Binding StatusText}" FontSize="11" FontWeight="Bold"/>
<TextBlock Grid.Column="2" Text="{Binding LeftInfo}" FontSize="11"
Style="{StaticResource Muted}"/>
<TextBlock Grid.Column="3" Text="{Binding RightInfo}" FontSize="11"
Style="{StaticResource Muted}"/>
</Grid>
</Border>
</HierarchicalDataTemplate>
<Style x:Key="NodeItemStyle" TargetType="TreeViewItem">
<Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}"/>
<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"/>
<!-- 줄 배경이 오른쪽 끝까지 가도록 항목을 가로로 늘린다. -->
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
</Style>
</ResourceDictionary>
</UserControl.Resources>
<Grid Margin="10">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<!-- ① 폴더 두 개 -->
<Border Grid.Row="0" Padding="8" BorderThickness="1" Margin="0,0,0,6"
BorderBrush="{DynamicResource Ubisam.Brush.Input.Border}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Button Grid.Column="0" Content="왼쪽 폴더..." Command="{Binding PickLeftFolderCommand}"
Height="28" Padding="10,2" FontSize="11" Margin="0,0,6,0"/>
<TextBox Grid.Column="1" Text="{Binding LeftFolder, UpdateSourceTrigger=PropertyChanged}"
AllowDrop="True" PreviewDragOver="View_DragOver" PreviewDrop="LeftFolder_Drop"
FontFamily="Consolas" FontSize="11" Height="28" VerticalContentAlignment="Center"
Margin="0,0,14,0" ToolTip="비교 기준이 되는 폴더"/>
<Button Grid.Column="2" Content="오른쪽 폴더..." Command="{Binding PickRightFolderCommand}"
Height="28" Padding="10,2" FontSize="11" Margin="0,0,6,0"/>
<TextBox Grid.Column="3" Text="{Binding RightFolder, UpdateSourceTrigger=PropertyChanged}"
AllowDrop="True" PreviewDragOver="View_DragOver" PreviewDrop="RightFolder_Drop"
FontFamily="Consolas" FontSize="11" Height="28" VerticalContentAlignment="Center"
ToolTip="견줄 폴더"/>
<TextBlock Grid.Column="4" Text="최근" VerticalAlignment="Center" Style="{StaticResource Muted}"
FontSize="11" Margin="14,0,4,0"/>
<ComboBox x:Name="RecentBox" ItemsSource="{Binding RecentFolders}"
SelectionChanged="Recent_SelectionChanged"
Width="200" Height="28" FontSize="11" Grid.Column="5" Margin="0"
VerticalContentAlignment="Center"
ToolTip="최근에 견준 짝. 고르면 바로 엽니다">
<ComboBox.ItemTemplate>
<DataTemplate>
<!-- 자리를 옮겼거나 지워진 짝은 흐리게. 목록에서 지우지는 않는다 -
네트워크 드라이브나 USB 는 잠깐 안 보일 뿐이다. -->
<TextBlock Text="{Binding Label}" ToolTip="{Binding Tip}" FontSize="11">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Style.Triggers>
<DataTrigger Binding="{Binding Exists}" Value="False">
<Setter Property="Opacity" Value="0.45"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox> </Grid>
</Border>
<!-- ② 비교 방식 · 필터 -->
<Border Grid.Row="1" Padding="8" BorderThickness="1" Margin="0,0,0,6"
BorderBrush="{DynamicResource Ubisam.Brush.Input.Border}">
<WrapPanel Orientation="Horizontal">
<CheckBox Content="빠른 비교 (크기·수정일만)" IsChecked="{Binding QuickCompare}"
VerticalAlignment="Center" Margin="0,0,16,0"
ToolTip="내용을 읽지 않습니다. 파일이 아주 많거나 네트워크 드라이브일 때 씁니다"/>
<CheckBox Content="하위 폴더 포함" IsChecked="{Binding IncludeSubfolders}"
VerticalAlignment="Center" Margin="0,0,16,0"/>
<!-- 보기 필터는 다시 비교하지 않고 목록만 다시 그린다. -->
<TextBlock Text="보기" VerticalAlignment="Center" Style="{StaticResource Muted}"
FontSize="11" Margin="0,0,4,0"/>
<ComboBox ItemsSource="{Binding Filters}" SelectedItem="{Binding Filter}"
Width="110" Height="26" FontSize="11" Margin="0,0,16,0"
VerticalContentAlignment="Center"
ToolTip="파일이 수백 개면 눈으로 고르는 것이 제일 느립니다">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Converter={StaticResource FolderFilterName}}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
<TextBlock Text="포함" VerticalAlignment="Center" Style="{StaticResource Muted}"
FontSize="11" Margin="0,0,4,0"/>
<TextBox Text="{Binding IncludePattern, UpdateSourceTrigger=PropertyChanged}"
Width="150" Height="26" FontFamily="Consolas" FontSize="11"
VerticalContentAlignment="Center" Margin="0,0,12,0"
ToolTip="정규식. 비우면 전부 포함합니다 (예: \.cs$)"/>
<TextBlock Text="제외" VerticalAlignment="Center" Style="{StaticResource Muted}"
FontSize="11" Margin="0,0,4,0"/>
<TextBox Text="{Binding ExcludePattern, UpdateSourceTrigger=PropertyChanged}"
Width="260" Height="26" FontFamily="Consolas" FontSize="11"
VerticalContentAlignment="Center" Margin="0,0,16,0"
ToolTip="정규식. 포함 규칙보다 우선합니다"/>
<Button Content="비교" Command="{Binding CompareCommand}" Height="28" MinWidth="80"
Margin="0,0,6,0"
Style="{StaticResource FilledButton}"
Background="{DynamicResource Ubisam.Brush.Accent.Fill}"
Foreground="{DynamicResource Ubisam.Brush.Accent.OnFill}" FontWeight="Bold"/>
<!-- 큰 폴더를 잘못 고르면 기다리는 수밖에 없었다. 비교하는 동안에만 켜진다. -->
<Button Content="취소" Command="{Binding CancelCompareCommand}" Height="28" MinWidth="60"
ToolTip="비교를 멈춥니다. 앞서 본 결과는 그대로 남습니다"/>
</WrapPanel>
</Border>
<!--
③ 폴더 전체 검색.
폴더 비교는 "무엇이 다른가"에 답하지만 "이 함수를 쓰는 곳이 어디인가"에는 답하지 못한다.
그때마다 다른 도구를 켜는 대신 여기서 찾고 결과를 눌러 바로 그 줄로 넘어간다.
-->
<Border Grid.Row="2" Padding="8" BorderThickness="1" Margin="0,0,0,6"
BorderBrush="{DynamicResource Ubisam.Brush.Input.Border}">
<WrapPanel Orientation="Horizontal">
<TextBlock Text="폴더 안 찾기" VerticalAlignment="Center" FontSize="11" FontWeight="Bold"
Margin="0,0,8,0"/>
<TextBox x:Name="SearchBox"
Text="{Binding SearchQuery, UpdateSourceTrigger=PropertyChanged}"
KeyDown="SearchBox_KeyDown"
Width="220" Height="26" FontFamily="Consolas" FontSize="11"
VerticalContentAlignment="Center" Margin="0,0,12,0"
ToolTip="찾을 글자. Enter 를 눌러도 찾습니다"/>
<CheckBox Content="대소문자 구분" IsChecked="{Binding SearchMatchCase}"
VerticalAlignment="Center" Margin="0,0,12,0"/>
<TextBlock Text="확장자" VerticalAlignment="Center" Style="{StaticResource Muted}"
FontSize="11" Margin="0,0,4,0"/>
<TextBox Text="{Binding SearchExtensions, UpdateSourceTrigger=PropertyChanged}"
Width="140" Height="26" FontFamily="Consolas" FontSize="11"
VerticalContentAlignment="Center" Margin="0,0,12,0"
ToolTip="*.cs;*.h 처럼 적습니다. 비우면 전부 봅니다"/>
<CheckBox Content="오른쪽 폴더도" IsChecked="{Binding SearchBothSides}"
VerticalAlignment="Center" Margin="0,0,12,0"
ToolTip="양쪽에 똑같이 있는 줄은 한 번만 나오고 '양쪽'으로 적힙니다"/>
<Button Content="찾기" Command="{Binding SearchCommand}" Height="28" MinWidth="70"
Margin="0,0,6,0" FontWeight="Bold"/>
<Button Content="검색 취소" Command="{Binding CancelSearchCommand}" Height="28" MinWidth="70"
Margin="0,0,6,0"
ToolTip="검색을 멈춥니다. 여기까지 찾은 것은 그대로 남습니다"/>
<Button Content="찾은 줄 열기" Command="{Binding OpenHitCommand}" Height="28" MinWidth="90"
Margin="0,0,6,0"
ToolTip="고른 줄을 '파일 비교' 탭에서 그 자리에 서서 엽니다. 더블클릭·Enter 도 같습니다"/>
<Button Content="결과 닫기" Command="{Binding ClearSearchCommand}" Height="28" MinWidth="70"
Margin="0,0,12,0"
ToolTip="결과 칸을 접고 목록에 자리를 돌려줍니다"/>
<TextBlock Text="{Binding SearchSummary}" VerticalAlignment="Center" FontSize="11"
Style="{StaticResource Muted}" TextTrimming="CharacterEllipsis" MaxWidth="520"/>
</WrapPanel>
</Border>
<!--
④ 색 뜻풀이. 색만 칠해 두면 무슨 뜻인지 아무도 모른다 -
파일 비교 화면의 "색 구분" 줄과 같은 성격이다.
-->
<Border Grid.Row="3" Padding="8,4" BorderThickness="1,1,1,0" Margin="0,0,0,0"
BorderBrush="{DynamicResource Ubisam.Brush.Input.Border}">
<WrapPanel Orientation="Horizontal">
<TextBlock Text="색 구분" Style="{StaticResource Muted}" FontSize="11" Margin="0,0,10,0"
VerticalAlignment="Center"/>
<Border Width="12" Height="12" Margin="0,0,4,0" VerticalAlignment="Center"
Background="{Binding Source={x:Static svc:FolderEntryStatus.Different},
Converter={StaticResource StatusBrush}}"
BorderThickness="1" BorderBrush="{DynamicResource Ubisam.Brush.Input.Border}"/>
<TextBlock Text="다름" FontSize="11" Margin="0,0,14,0" VerticalAlignment="Center"/>
<Border Width="12" Height="12" Margin="0,0,4,0" VerticalAlignment="Center"
Background="{Binding Source={x:Static svc:FolderEntryStatus.CommentOnly},
Converter={StaticResource StatusBrush}}"
BorderThickness="1" BorderBrush="{DynamicResource Ubisam.Brush.Input.Border}"/>
<TextBlock Text="다름(코드는 같음)" FontSize="11" Margin="0,0,14,0" VerticalAlignment="Center"
ToolTip="코드는 같고 주석 · 공백 · 빈 줄 · 줄끝 · BOM · 인코딩만 다른 파일입니다"/>
<Border Width="12" Height="12" Margin="0,0,4,0" VerticalAlignment="Center"
Background="{Binding Source={x:Static svc:FolderEntryStatus.LeftOnly},
Converter={StaticResource StatusBrush}}"
BorderThickness="1" BorderBrush="{DynamicResource Ubisam.Brush.Input.Border}"/>
<TextBlock Text="왼쪽에만" FontSize="11" Margin="0,0,14,0" VerticalAlignment="Center"/>
<Border Width="12" Height="12" Margin="0,0,4,0" VerticalAlignment="Center"
Background="{Binding Source={x:Static svc:FolderEntryStatus.RightOnly},
Converter={StaticResource StatusBrush}}"
BorderThickness="1" BorderBrush="{DynamicResource Ubisam.Brush.Input.Border}"/>
<TextBlock Text="오른쪽에만" FontSize="11" Margin="0,0,14,0" VerticalAlignment="Center"/>
<Border Width="12" Height="12" Margin="0,0,4,0" VerticalAlignment="Center"
Background="{Binding Source={x:Static svc:FolderEntryStatus.Binary},
Converter={StaticResource StatusBrush}}"
BorderThickness="1" BorderBrush="{DynamicResource Ubisam.Brush.Input.Border}"/>
<TextBlock Text="다름(이진)" FontSize="11" VerticalAlignment="Center"/>
</WrapPanel>
</Border>
<!-- ③ 목록 머리글. 트리 항목의 칸 폭과 같은 값을 쓴다. -->
<Border Grid.Row="4" Padding="8,4" BorderThickness="1,1,1,0"
Background="{DynamicResource Ubisam.Brush.Sidebar.Background}"
BorderBrush="{DynamicResource Ubisam.Brush.Input.Border}">
<Grid Margin="26,0,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="420"/>
<ColumnDefinition Width="200"/>
<ColumnDefinition Width="190"/>
<ColumnDefinition Width="190"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="이름" FontSize="11" FontWeight="Bold"/>
<TextBlock Grid.Column="1" Text="상태" FontSize="11" FontWeight="Bold"/>
<TextBlock Grid.Column="2" Text="왼쪽 (크기 · 수정일)" FontSize="11" FontWeight="Bold"/>
<TextBlock Grid.Column="3" Text="오른쪽 (크기 · 수정일)" FontSize="11" FontWeight="Bold"/>
</Grid>
</Border>
<!--
④ 트리.
가로 스크롤을 켜 두면 항목이 "보이는 폭"이 아니라 "내용 폭"으로 측정돼
채움 칸(*)이 0 이 되고 줄 배경이 글자 끝에서 끊긴다. 칸 폭이 고정이라
가로로 넘칠 일이 없으므로 꺼 두는 편이 맞다.
-->
<Grid Grid.Row="5">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TreeView Grid.Row="0" x:Name="Tree" BorderThickness="1"
BorderBrush="{DynamicResource Ubisam.Brush.Input.Border}"
ItemsSource="{Binding Nodes}"
ItemTemplate="{StaticResource NodeTemplate}"
ItemContainerStyle="{StaticResource NodeItemStyle}"
SelectedItemChanged="Tree_SelectedItemChanged"
MouseDoubleClick="Tree_MouseDoubleClick"
KeyDown="Tree_KeyDown"
HorizontalContentAlignment="Stretch"
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
VirtualizingPanel.IsVirtualizing="True"
VirtualizingPanel.VirtualizationMode="Recycling"/>
<!--
찾은 줄. 검색하기 전에는 접혀 있어 목록이 자리를 다 쓴다.
높이를 묶어 두는 까닭 - 결과가 수천 줄이어도 목록을 화면 밖으로 밀면 안 된다.
-->
<Grid Grid.Row="1"
Visibility="{Binding HasSearched, Converter={StaticResource BoolToVis}}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<!-- 결과 칸 머리글. 위 목록과 같은 짜임이라 여기도 무슨 칸인지 적어 준다. -->
<Border Grid.Row="0" Padding="8,4" BorderThickness="1,1,1,0"
Background="{DynamicResource Ubisam.Brush.Sidebar.Background}"
BorderBrush="{DynamicResource Ubisam.Brush.Input.Border}">
<Grid Margin="6,0,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="52"/>
<ColumnDefinition Width="280"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="어디" FontSize="11" FontWeight="Bold"
ToolTip="양쪽 = 두 폴더에 똑같이 있는 줄"/>
<TextBlock Grid.Column="1" Text="파일 · 줄" FontSize="11" FontWeight="Bold"/>
<TextBlock Grid.Column="2" Text="찾은 줄" FontSize="11" FontWeight="Bold"/>
</Grid>
</Border>
<Border Grid.Row="1" BorderThickness="1,0,1,1"
BorderBrush="{DynamicResource Ubisam.Brush.Input.Border}">
<ListBox x:Name="HitList" ItemsSource="{Binding SearchHits}"
SelectedItem="{Binding SelectedHit}"
MinHeight="90" MaxHeight="260" BorderThickness="0"
MouseDoubleClick="HitList_MouseDoubleClick"
KeyDown="HitList_KeyDown"
HorizontalContentAlignment="Stretch"
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
VirtualizingPanel.IsVirtualizing="True"
VirtualizingPanel.VirtualizationMode="Recycling">
<!-- 기본 여백을 그대로 두면 줄이 성기게 벌어져 위 목록과 딴판으로 보인다. -->
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="Padding" Value="6,1"/>
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
</Style>
</ListBox.ItemContainerStyle>
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="52"/>
<ColumnDefinition Width="280"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="{Binding SideText}" FontSize="11"
FontWeight="Bold"/>
<TextBlock Grid.Column="1" Text="{Binding Where}" FontFamily="Consolas"
FontSize="11" TextTrimming="CharacterEllipsis"
ToolTip="{Binding RelativePath}"/>
<TextBlock Grid.Column="2" Text="{Binding Preview}" FontFamily="Consolas"
FontSize="11" TextTrimming="CharacterEllipsis"/>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Border>
</Grid>
</Grid>
<!-- ⑤ 요약 · 동작 -->
<Border Grid.Row="6" Padding="8" BorderThickness="1,0,1,1" Margin="0,0,0,0"
BorderBrush="{DynamicResource Ubisam.Brush.Input.Border}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0" VerticalAlignment="Center">
<TextBlock Text="{Binding Summary}" FontSize="12" FontWeight="Bold"/>
<TextBlock Text="파일을 더블클릭하거나 Enter 를 누르면 &quot;파일 비교&quot; 탭에서 줄 단위로 엽니다. 한쪽에만 있는 파일도 열립니다."
Style="{StaticResource Muted}" FontSize="11"/>
</StackPanel>
<WrapPanel Grid.Column="1" Orientation="Horizontal">
<Button Content="결과 내보내기" Command="{Binding ExportReportCommand}"
Height="28" Padding="10,2" FontSize="11" Margin="0,0,14,0"
ToolTip="비교 결과를 글로 뽑아 파일에 저장합니다. 메일이나 결재에 그대로 붙일 수 있습니다"/>
<Button Content="줄 단위 비교" Command="{Binding OpenInDiffCommand}"
Height="28" Padding="10,2" FontSize="11" Margin="0,0,6,0"/>
<Button Content="→ 오른쪽으로 복사" Command="{Binding CopyToRightCommand}"
Height="28" Padding="10,2" FontSize="11" Margin="0,0,6,0"
ToolTip="왼쪽을 오른쪽으로 덮어씁니다. 폴더를 고르면 폴더째 (확인을 묻습니다)"/>
<Button Content="← 왼쪽으로 복사" Command="{Binding CopyToLeftCommand}"
Height="28" Padding="10,2" FontSize="11" Margin="0,0,14,0"
ToolTip="오른쪽을 왼쪽으로 덮어씁니다. 폴더를 고르면 폴더째 (확인을 묻습니다)"/>
<Button Content="왼쪽 삭제" Command="{Binding DeleteLeftCommand}"
Height="28" Padding="10,2" FontSize="11" Margin="0,0,6,0"
Foreground="{DynamicResource Ubisam.Brush.Danger}"
ToolTip="파일 또는 폴더째. 되돌릴 수 없습니다 (확인을 묻습니다)"/>
<Button Content="오른쪽 삭제" Command="{Binding DeleteRightCommand}"
Height="28" Padding="10,2" FontSize="11"
Foreground="{DynamicResource Ubisam.Brush.Danger}"
ToolTip="파일 또는 폴더째. 되돌릴 수 없습니다 (확인을 묻습니다)"/>
</WrapPanel>
</Grid>
</Border>
</Grid>
</UserControl>