245 lines
7.6 KiB
C#
245 lines
7.6 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Windows;
|
|
using System.Windows.Controls;
|
|
using System.Windows.Input;
|
|
using System.Windows.Media;
|
|
using AxCopilot.Services;
|
|
|
|
namespace AxCopilot.Views;
|
|
|
|
public class DiffViewerPanel : Border
|
|
{
|
|
private readonly string _filePath;
|
|
|
|
private readonly string _oldContent;
|
|
|
|
private readonly string _newContent;
|
|
|
|
private readonly List<DiffService.DiffLine> _diffLines;
|
|
|
|
public event EventHandler? Accepted;
|
|
|
|
public event EventHandler? Rejected;
|
|
|
|
public DiffViewerPanel(string filePath, string oldContent, string newContent)
|
|
{
|
|
_filePath = filePath;
|
|
_oldContent = oldContent;
|
|
_newContent = newContent;
|
|
_diffLines = DiffService.ComputeDiff(oldContent, newContent);
|
|
base.CornerRadius = new CornerRadius(10.0);
|
|
base.Background = new SolidColorBrush(Color.FromRgb(250, 250, byte.MaxValue));
|
|
base.BorderBrush = new SolidColorBrush(Color.FromRgb(224, 224, 236));
|
|
base.BorderThickness = new Thickness(1.0);
|
|
base.Padding = new Thickness(0.0);
|
|
base.Margin = new Thickness(0.0, 8.0, 0.0, 8.0);
|
|
Child = BuildContent();
|
|
}
|
|
|
|
private UIElement BuildContent()
|
|
{
|
|
StackPanel stackPanel = new StackPanel();
|
|
Border border = new Border
|
|
{
|
|
Background = new SolidColorBrush(Color.FromRgb(240, 242, byte.MaxValue)),
|
|
CornerRadius = new CornerRadius(10.0, 10.0, 0.0, 0.0),
|
|
Padding = new Thickness(14.0, 10.0, 14.0, 10.0)
|
|
};
|
|
Grid grid = new Grid();
|
|
grid.ColumnDefinitions.Add(new ColumnDefinition
|
|
{
|
|
Width = new GridLength(1.0, GridUnitType.Star)
|
|
});
|
|
grid.ColumnDefinitions.Add(new ColumnDefinition
|
|
{
|
|
Width = GridLength.Auto
|
|
});
|
|
string summary = DiffService.GetSummary(_diffLines);
|
|
StackPanel stackPanel2 = new StackPanel
|
|
{
|
|
Orientation = Orientation.Horizontal
|
|
};
|
|
stackPanel2.Children.Add(new TextBlock
|
|
{
|
|
Text = "\ue89a",
|
|
FontFamily = new FontFamily("Segoe MDL2 Assets"),
|
|
FontSize = 13.0,
|
|
Foreground = new SolidColorBrush(Color.FromRgb(75, 94, 252)),
|
|
VerticalAlignment = VerticalAlignment.Center,
|
|
Margin = new Thickness(0.0, 0.0, 8.0, 0.0)
|
|
});
|
|
stackPanel2.Children.Add(new TextBlock
|
|
{
|
|
Text = Path.GetFileName(_filePath),
|
|
FontSize = 13.0,
|
|
FontWeight = FontWeights.SemiBold,
|
|
Foreground = new SolidColorBrush(Color.FromRgb(26, 27, 46)),
|
|
VerticalAlignment = VerticalAlignment.Center
|
|
});
|
|
stackPanel2.Children.Add(new TextBlock
|
|
{
|
|
Text = " · " + summary,
|
|
FontSize = 11.0,
|
|
Foreground = new SolidColorBrush(Color.FromRgb(136, 136, 170)),
|
|
VerticalAlignment = VerticalAlignment.Center
|
|
});
|
|
Grid.SetColumn(stackPanel2, 0);
|
|
grid.Children.Add(stackPanel2);
|
|
StackPanel stackPanel3 = new StackPanel
|
|
{
|
|
Orientation = Orientation.Horizontal
|
|
};
|
|
Button button = CreateButton("적용", Color.FromRgb(16, 124, 16), Colors.White);
|
|
button.Click += delegate
|
|
{
|
|
this.Accepted?.Invoke(this, EventArgs.Empty);
|
|
};
|
|
stackPanel3.Children.Add(button);
|
|
Button button2 = CreateButton("취소", Colors.Transparent, Color.FromRgb(197, 15, 31));
|
|
button2.Click += delegate
|
|
{
|
|
this.Rejected?.Invoke(this, EventArgs.Empty);
|
|
};
|
|
stackPanel3.Children.Add(button2);
|
|
Grid.SetColumn(stackPanel3, 1);
|
|
grid.Children.Add(stackPanel3);
|
|
border.Child = grid;
|
|
stackPanel.Children.Add(border);
|
|
ScrollViewer scrollViewer = new ScrollViewer
|
|
{
|
|
MaxHeight = 300.0,
|
|
VerticalScrollBarVisibility = ScrollBarVisibility.Auto,
|
|
HorizontalScrollBarVisibility = ScrollBarVisibility.Auto
|
|
};
|
|
StackPanel stackPanel4 = new StackPanel
|
|
{
|
|
Margin = new Thickness(0.0)
|
|
};
|
|
foreach (DiffService.DiffLine diffLine in _diffLines)
|
|
{
|
|
DiffService.DiffType type = diffLine.Type;
|
|
if (1 == 0)
|
|
{
|
|
}
|
|
(Color, Color, string) tuple = type switch
|
|
{
|
|
DiffService.DiffType.Added => (Color.FromRgb(230, byte.MaxValue, 237), Color.FromRgb(22, 108, 52), "+"),
|
|
DiffService.DiffType.Removed => (Color.FromRgb(byte.MaxValue, 235, 233), Color.FromRgb(207, 34, 46), "-"),
|
|
_ => (Color.FromRgb(byte.MaxValue, byte.MaxValue, byte.MaxValue), Color.FromRgb(102, 102, 136), " "),
|
|
};
|
|
if (1 == 0)
|
|
{
|
|
}
|
|
(Color, Color, string) tuple2 = tuple;
|
|
Color item = tuple2.Item1;
|
|
Color item2 = tuple2.Item2;
|
|
string item3 = tuple2.Item3;
|
|
string text = diffLine.OldLineNo?.ToString() ?? "";
|
|
string text2 = diffLine.NewLineNo?.ToString() ?? "";
|
|
Border border2 = new Border
|
|
{
|
|
Background = new SolidColorBrush(item),
|
|
Padding = new Thickness(8.0, 1.0, 8.0, 1.0)
|
|
};
|
|
Grid grid2 = new Grid();
|
|
grid2.ColumnDefinitions.Add(new ColumnDefinition
|
|
{
|
|
Width = new GridLength(36.0)
|
|
});
|
|
grid2.ColumnDefinitions.Add(new ColumnDefinition
|
|
{
|
|
Width = new GridLength(36.0)
|
|
});
|
|
grid2.ColumnDefinitions.Add(new ColumnDefinition
|
|
{
|
|
Width = new GridLength(16.0)
|
|
});
|
|
grid2.ColumnDefinitions.Add(new ColumnDefinition
|
|
{
|
|
Width = new GridLength(1.0, GridUnitType.Star)
|
|
});
|
|
TextBlock element = new TextBlock
|
|
{
|
|
Text = text,
|
|
FontSize = 10.0,
|
|
FontFamily = new FontFamily("Consolas"),
|
|
Foreground = new SolidColorBrush(Color.FromRgb(170, 170, 204)),
|
|
HorizontalAlignment = HorizontalAlignment.Right,
|
|
Margin = new Thickness(0.0, 0.0, 4.0, 0.0)
|
|
};
|
|
Grid.SetColumn(element, 0);
|
|
grid2.Children.Add(element);
|
|
TextBlock element2 = new TextBlock
|
|
{
|
|
Text = text2,
|
|
FontSize = 10.0,
|
|
FontFamily = new FontFamily("Consolas"),
|
|
Foreground = new SolidColorBrush(Color.FromRgb(170, 170, 204)),
|
|
HorizontalAlignment = HorizontalAlignment.Right,
|
|
Margin = new Thickness(0.0, 0.0, 4.0, 0.0)
|
|
};
|
|
Grid.SetColumn(element2, 1);
|
|
grid2.Children.Add(element2);
|
|
TextBlock element3 = new TextBlock
|
|
{
|
|
Text = item3,
|
|
FontSize = 11.0,
|
|
FontFamily = new FontFamily("Consolas"),
|
|
Foreground = new SolidColorBrush(item2),
|
|
FontWeight = FontWeights.Bold
|
|
};
|
|
Grid.SetColumn(element3, 2);
|
|
grid2.Children.Add(element3);
|
|
TextBlock element4 = new TextBlock
|
|
{
|
|
Text = diffLine.Content,
|
|
FontSize = 11.0,
|
|
FontFamily = new FontFamily("Consolas"),
|
|
Foreground = new SolidColorBrush(item2),
|
|
TextWrapping = TextWrapping.NoWrap
|
|
};
|
|
Grid.SetColumn(element4, 3);
|
|
grid2.Children.Add(element4);
|
|
border2.Child = grid2;
|
|
stackPanel4.Children.Add(border2);
|
|
}
|
|
scrollViewer.Content = stackPanel4;
|
|
stackPanel.Children.Add(scrollViewer);
|
|
return stackPanel;
|
|
}
|
|
|
|
private static Button CreateButton(string text, Color bg, Color fg)
|
|
{
|
|
Button button = new Button
|
|
{
|
|
Cursor = Cursors.Hand,
|
|
Margin = new Thickness(4.0, 0.0, 0.0, 0.0)
|
|
};
|
|
ControlTemplate controlTemplate = new ControlTemplate(typeof(Button));
|
|
FrameworkElementFactory frameworkElementFactory = new FrameworkElementFactory(typeof(Border));
|
|
frameworkElementFactory.SetValue(Border.BackgroundProperty, new SolidColorBrush(bg));
|
|
frameworkElementFactory.SetValue(Border.CornerRadiusProperty, new CornerRadius(6.0));
|
|
frameworkElementFactory.SetValue(Border.PaddingProperty, new Thickness(12.0, 5.0, 12.0, 5.0));
|
|
if (bg == Colors.Transparent)
|
|
{
|
|
frameworkElementFactory.SetValue(Border.BorderBrushProperty, new SolidColorBrush(fg));
|
|
frameworkElementFactory.SetValue(Border.BorderThicknessProperty, new Thickness(1.0));
|
|
}
|
|
FrameworkElementFactory frameworkElementFactory2 = new FrameworkElementFactory(typeof(ContentPresenter));
|
|
frameworkElementFactory2.SetValue(FrameworkElement.HorizontalAlignmentProperty, HorizontalAlignment.Center);
|
|
frameworkElementFactory.AppendChild(frameworkElementFactory2);
|
|
controlTemplate.VisualTree = frameworkElementFactory;
|
|
button.Template = controlTemplate;
|
|
button.Content = new TextBlock
|
|
{
|
|
Text = text,
|
|
FontSize = 11.0,
|
|
Foreground = new SolidColorBrush(fg),
|
|
FontWeight = FontWeights.SemiBold
|
|
};
|
|
return button;
|
|
}
|
|
}
|