using AddInPlugin; using AddInPlugin.Util; using CommunityToolkit.Mvvm.ComponentModel; using Microsoft.Win32; using OpenTap; using OpenTap.Addin; using OpenTap.Addin.Util; using OpenTap.Diagnostic; using OpenTap.Tui.Views; using OpenTapEditor.UI; using System.Collections.ObjectModel; using System.IO; using System.Reflection; using System.Security.Cryptography; using System.Windows; using System.Windows.Controls; using UtilLib; namespace OpenTapEditor; /// /// Interaction logic for MainWindow.xaml /// [ObservableObject] public partial class MainWindow : Window { [ObservableProperty] private ObservableCollection fileItems; [ObservableProperty] private ObservableCollection tabItems = new ObservableCollection(); [ObservableProperty] private ObservableCollection fileMenuItems = new ObservableCollection(); [ObservableProperty] private TabItemData selectedTab; public MainWindow() { InitializeComponent(); RefreshFileMenuItems(); ResultSettings.Current.Add(new UIListener(this)); Log.AddListener(logControl); PostUIMsgHandler.OnPostUIMsg += PostUIMsgHandler_OnPostUIMsg; StationGlobalsManager.Register(UIStationGlobalsManager.Instance); VariableResolver.Register(new DefaultVariableResolver()); } private void PostUIMsgHandler_OnPostUIMsg(object? sender, PostUIMsg e) { logControl.EventsLogged(new List { new Event{ Message = $"string:{e.StringData} bool:{e.BoolData} number:{e.NumberData}" } }); } private void LoadRecentFiles() { historyFile.Clear(); try { var list = XmlHelper.DeserializeFromXml>(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Config", "RecentFiles.xml")); if (list != null) { foreach (var file in list) { historyFile.Enqueue(file); } } } catch { historyFile = new Queue(10); } } private void RefreshFileMenuItems() { FileMenuItems.Clear(); var child = new MenuItem() { Header = "新建", }; child.Click += (sender, e) => { var testPlan = new TestPlan() { VisualPath = new Guid().ToString() }; var tabItem = new TabItemData { Content = new SequencePanel("New Seq.TapPlan", testPlan) }; TabItems.Add(tabItem); SelectedTab = tabItem; }; FileMenuItems.Add(child); child = new MenuItem() { Header = "打开", }; child.Click += MenuItem_Click; FileMenuItems.Add(child); var panel = SelectedTab?.Content as SequencePanel; if (panel != null) { child = new MenuItem() { Header = $"保存{panel.TabName}", }; child.Click += (sender, e) => { panel.TrySaveTestStep(); }; } else { child = new MenuItem() { Header = $"保存", IsEnabled = false }; } FileMenuItems.Add(child); if (panel != null) { child = new MenuItem() { Header = $"另存{panel.TabName}", }; child.Click += (sender, e) => { panel.TrySaveAs(); }; } else { child = new MenuItem() { Header = $"另存", IsEnabled = false }; } FileMenuItems.Add(child); } private void SaveRecentFiles() { var dir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Config"); if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } var path = Path.Combine(dir, "RecentFiles.xml"); XmlHelper.SerializeToXml(path, historyFile); } private Queue historyFile = new Queue(10); public static Type GetEnumerableElementType(Type enumType) { if (enumType.IsArray) return enumType.GetElementType(); var ienumInterface = enumType.GetInterface("IEnumerable`1") ?? enumType; if (ienumInterface != null) return ienumInterface.GetGenericArguments().FirstOrDefault(); return typeof(object); } private void OpenStepSettingWin() { var win = new StepWindow() { Owner = Window.GetWindow(this) }; if (win.ShowDialog() == true) { } } private void MenuItem_Click(object sender, RoutedEventArgs e) { var item = sender as MenuItem; if (item?.Tag?.ToString() == "UISetting") { UISettiingWin win = new UISettiingWin { Owner = this }; win.ShowDialog(); return; } switch (item?.Header) { case "打开": TryOpenTestPlanNew(); break; case "保存": // TrySaveTestStep(); break; case "另存": break; case "自定义测试步骤": OpenStepSettingWin(); break; case "openSetting": var setting = new SettingWin() { Owner = this }; setting.ShowDialog(); break; default: break; } } private void self_Closing(object sender, System.ComponentModel.CancelEventArgs e) { /// 保存一下StationGlobals变量 UIStationGlobalsManager.Instance.WriteToLocal(UIStationGlobalsManager.Instance.Datasource); } private void CloseTabItem_Click(object sender, RoutedEventArgs e) { try { if (sender is Button button && button.Tag is TabItemData tabItem) { if (tabItem.Content.HasChanged) { if (SelectedTab != tabItem) { SelectedTab = tabItem; } var res = MessageBox.Show("是否保存?", "提示", MessageBoxButton.YesNoCancel); if (res == MessageBoxResult.Cancel) { return; } if (res == MessageBoxResult.Yes) { var panel = (SequencePanel)tabItem.Content; if (!panel.TrySaveTestStep()) { return; } } } TabItems.Remove(tabItem); } } catch (Exception ex) { } } private void TryOpenTestPlanNew() { OpenFileDialog ofd = new OpenFileDialog() { Filter = "Test Plan|*.TapPlan", DefaultExt = ".TapPlan" }; if (ofd.ShowDialog() == true) { try { var testPlan = TestPlan.Load(ofd.FileName); var tabItem = new TabItemData { Content = new SequencePanel(Path.GetFileName(ofd.FileName), testPlan) }; TabItems.Add(tabItem); SelectedTab = tabItem; // historyFile.Enqueue(ofd.FileName); // SaveRecentFiles(); } catch (Exception ex) { MessageBox.Show($"打开测试计划失败: {ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error); } } } partial void OnSelectedTabChanged(TabItemData value) { RefreshFileMenuItems(); } }