using ServerManagerTool.Common.Attibutes; using ServerManagerTool.Common.Extensions; using ServerManagerTool.Common.Utils; using ServerManagerTool.Lib; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using WPFSharp.Globalizer; namespace ServerManagerTool { /// /// Interaction logic for FindSettingWindow.xaml /// public partial class FindSettingWindow : Window { private static List<(string setting, string profileProperty)> _profileSettings = null; private static List<(string setting, Control control)> _settingControls = null; private readonly GlobalizedApplication _globalizer = GlobalizedApplication.Instance; private int _controlIndex = -1; private ServerSettingsControl _serverSettingsControl; public static readonly DependencyProperty FindSettingStringProperty = DependencyProperty.Register(nameof(FindSettingString), typeof(string), typeof(FindSettingWindow), new PropertyMetadata("")); public FindSettingWindow(ServerSettingsControl control) { InitializeComponent(); WindowUtils.RemoveDefaultResourceDictionary(this, Config.Default.DefaultGlobalizationFile); _serverSettingsControl = control; LoadSettings(control.Settings); LoadControls(control); this.DataContext = this; } public string FindSettingString { get { return (string)GetValue(FindSettingStringProperty); } set { SetValue(FindSettingStringProperty, value); } } private async void Find_Click(object sender, RoutedEventArgs e) { if (string.IsNullOrWhiteSpace(FindSettingString)) return; var cursor = this.Cursor; try { Application.Current.Dispatcher.Invoke(() => this.Cursor = Cursors.Wait); await Task.Delay(100); _serverSettingsControl.UnselectControl(); var findSettingString = FindSettingString.Trim(); var foundControls = _settingControls .Where(s => s.setting.Contains(findSettingString, StringComparison.OrdinalIgnoreCase)) .Select(s => s.control) .ToArray(); if (foundControls.Length == 0) { MessageBox.Show(string.Format(_globalizer.GetResourceString("FindSettingWindow_NotFoundErrorLabel"), FindSettingString), _globalizer.GetResourceString("FindSettingWindow_Title"), MessageBoxButton.OK, MessageBoxImage.Information); return; } var oldIndex = _controlIndex; var newIndex = oldIndex; while (true) { newIndex += 1; if (newIndex >= foundControls.Length) { _controlIndex = -1; MessageBox.Show(string.Format(_globalizer.GetResourceString("FindSettingWindow_NotFoundErrorLabel"), FindSettingString), _globalizer.GetResourceString("FindSettingWindow_Title"), MessageBoxButton.OK, MessageBoxImage.Information); return; } var selected = _serverSettingsControl.SelectControl(foundControls[newIndex]); if (selected) { _controlIndex = newIndex; break; } } } catch (Exception ex) { MessageBox.Show(ex.Message, _globalizer.GetResourceString("FindSettingWindow_Title"), MessageBoxButton.OK, MessageBoxImage.Error); } finally { Application.Current.Dispatcher.Invoke(() => this.Cursor = cursor); } } private void LoadControls(DependencyObject parent) { if (_settingControls != null) return; try { _settingControls = WindowUtils.GetLogicalTreeControls(parent); for (int i = 0; i < _settingControls.Count; i++) { var item = _settingControls[i]; var setting = _profileSettings .FirstOrDefault(x => x.profileProperty.Equals(item.setting, StringComparison.OrdinalIgnoreCase)) .setting; if (setting != null && !setting.Equals(item.setting, StringComparison.OrdinalIgnoreCase)) { _settingControls[i] = (setting, item.control); } #if DEBUG Debug.WriteLine($"{_settingControls[i].setting}; {_settingControls[i].control.GetType().FullName}"); #endif } } catch (Exception ex) { MessageBox.Show(ex.Message, _globalizer.GetResourceString("FindSettingWindow_Title"), MessageBoxButton.OK, MessageBoxImage.Error); } } private void LoadSettings(ServerProfile profile) { if (_profileSettings != null) return; try { _profileSettings = new List<(string setting, string profileProperty)>(); var fields = profile?.GetType() .GetProperties() .Where(f => f.IsDefined(typeof(BaseIniFileEntryAttribute), false)); foreach (var field in fields) { var attributes = field .GetCustomAttributes(typeof(BaseIniFileEntryAttribute), false) .OfType(); foreach (var attr in attributes) { _profileSettings.Add((string.IsNullOrWhiteSpace(attr.Key) ? field.Name : attr.Key, field.Name)); } } } catch (Exception ex) { MessageBox.Show(ex.Message, _globalizer.GetResourceString("FindSettingWindow_Title"), MessageBoxButton.OK, MessageBoxImage.Error); } } private void FindSettingString_SourceUpdated(object sender, System.Windows.Data.DataTransferEventArgs e) { _serverSettingsControl.UnselectControl(); _controlIndex = -1; } } }