using System;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Input;
using LocalizationTool.Models;
using LocalizationTool.Services;
using LocalizationTool.ViewModels;
namespace LocalizationTool
{
/// 主窗口:只负责视图(动态列、下拉同步、浏览对话框),业务全在 MainViewModel。
public partial class MainWindow
{
private readonly MainViewModel _vm;
private bool _suppressLangSync;
public MainWindow()
{
InitializeComponent();
Icon = App.AppIcon;
_vm = new MainViewModel();
DataContext = _vm;
_vm.LangOptionsChanged += RefreshLangCombo;
_vm.SelectedLangsChanged += RebuildGrid;
if (!Translation.Provider.IsConfigured)
_vm.Stats = "提示:未配置翻译 API Key,可在“翻译设置”填写后再使用自动翻译。";
}
/// 语言下拉选项变化:填充并默认全选(抑制回环触发)。
private void RefreshLangCombo()
{
_suppressLangSync = true;
CmbTargetLangs.SelectedItems.Clear();
foreach (var o in _vm.LangOptions) CmbTargetLangs.SelectedItems.Add(o);
_suppressLangSync = false;
}
/// 勾选变化 → 同步 ViewModel(表格列由 VM 的 SelectedLangsChanged 事件驱动重建)。
private void CmbTargetLangs_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (_suppressLangSync) return;
_vm.SetSelectedLangs(CmbTargetLangs.SelectedItems
.OfType()
.Select(o => o.LanguageCode));
}
private void BtnBrowse_Click(object sender, RoutedEventArgs e)
{
var dlg = new System.Windows.Forms.FolderBrowserDialog();
if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
_vm.LoadDirectory(dlg.SelectedPath);
}
/// 右键点击行时自动选中它(若点击行已在多选集合内则保留多选,供"删除选中行"批量使用)。
private void Grid_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
var row = ItemsControl.ContainerFromElement(Grid, e.OriginalSource as DependencyObject) as DataGridRow;
if (row != null && !Grid.SelectedItems.Contains(row.Item))
Grid.SelectedItem = row.Item;
}
/// 按勾选的语言动态生成表格列(序号 + 中文源文 + 语言列 + 缺译概览)。
private void RebuildGrid()
{
Grid.Columns.Clear();
Grid.Columns.Add(new DataGridTextColumn
{
Header = "#",
Binding = new Binding(nameof(RowVm.Index)) { Mode = BindingMode.OneWay },
Width = DataGridLength.Auto,
CanUserResize = false,
IsReadOnly = true,
});
Grid.Columns.Add(new DataGridTextColumn
{
Header = "中文源文",
Binding = new Binding(nameof(RowVm.Key)) { Mode = BindingMode.OneWay },
Width = new DataGridLength(280),
IsReadOnly = true,
});
foreach (var lang in _vm.SelectedLangs)
{
var code = lang.LanguageCode;
var column = new DataGridTextColumn
{
Header = $"{lang.LanguageName} ({code})",
Binding = new Binding($"Cells[{code}].Value") { Mode = BindingMode.TwoWay },
Width = new DataGridLength(220),
};
// 必须 BasedOn 全局(HandyControl)隐式样式,否则该列会退化成 WPF 原生模板,
// 表现为译文文字靠上而不是像中文列那样垂直居中
var cellStyle = new Style(typeof(DataGridCell), Grid.TryFindResource(typeof(DataGridCell)) as Style);
var trigger = new DataTrigger
{
Binding = new Binding($"Cells[{code}].HasIssue"),
Value = true,
};
trigger.Setters.Add(new Setter(DataGridCell.BorderBrushProperty, System.Windows.Media.Brushes.Red));
trigger.Setters.Add(new Setter(DataGridCell.BorderThicknessProperty, new Thickness(2)));
cellStyle.Triggers.Add(trigger);
column.CellStyle = cellStyle;
var elementStyle = new Style(typeof(TextBlock), Grid.TryFindResource(typeof(TextBlock)) as Style);
elementStyle.Setters.Add(new Setter(TextBlock.VerticalAlignmentProperty, VerticalAlignment.Center));
elementStyle.Setters.Add(new Setter(
System.Windows.Controls.ToolTipService.ToolTipProperty,
new Binding($"Cells[{code}].IssueMessage")));
column.ElementStyle = elementStyle;
Grid.Columns.Add(column);
}
Grid.Columns.Add(new DataGridTextColumn
{
Header = "缺译",
Binding = new Binding(nameof(RowVm.MissingText)) { Mode = BindingMode.OneWay },
Width = new DataGridLength(70),
CanUserResize = false,
IsReadOnly = true,
});
}
}
}