| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815 | using System;using System.Collections.Generic;using System.Collections.ObjectModel;using System.Diagnostics;using System.Drawing;using System.IO;using System.Linq;using System.Net;using System.Net.Sockets;using System.Reflection;using System.Text;using System.Text.RegularExpressions;using System.Windows;using System.Windows.Controls;using System.Windows.Forms;using System.Windows.Input;using System.Windows.Media;using Comal.Classes;using InABox.Clients;using InABox.Configuration;using InABox.Core;using InABox.DynamicGrid;using InABox.Wpf;using InABox.WPF;using PRSServer;using WindowsShortcutFactory;using Button = System.Windows.Controls.Button;using Color = System.Windows.Media.Color;using ColorConverter = System.Windows.Media.ColorConverter;using Image = System.Windows.Controls.Image;using KeyEventArgs = System.Windows.Input.KeyEventArgs;using MessageBox = System.Windows.MessageBox;//using IWshRuntimeLibrary;namespace PRSDesktop{    /// <summary>    ///     Interaction logic for DataBaseConfiguration.xaml    /// </summary>    public partial class DataBaseConfiguration : ThemableWindow    {        private string _current = "";        private Dictionary<string, DatabaseSettings> _settings;        private bool bLoading = true;        private List<string> startscreens = new();        private Dictionary<string, Server> _servers;        public DataBaseConfiguration()        {            InitializeComponent();            Help.Content = new Image { Source = PRSDesktop.Resources.help.AsBitmapImage() };            AutoUpdate.Content = new Image { Source = PRSDesktop.Resources.autoupdate.AsBitmapImage() };            ExportSettings.Content = new Image { Source = PRSDesktop.Resources.download.AsBitmapImage() };            ImportSettings.Content = new Image { Source = PRSDesktop.Resources.upload.AsBitmapImage() };            var version = CoreUtils.GetVersion();            var debug = string.Equals(version, "???");            var hasLocal = HasLocalServer();            if (!debug)            {                StandaloneHeader.Height = new GridLength(0, GridUnitType.Pixel);                StandalonePath.Height = new GridLength(0, GridUnitType.Pixel);                JobPrefixHeader.Height = new GridLength(0, GridUnitType.Pixel);                JobPrefixContent.Height = new GridLength(0, GridUnitType.Pixel);                POPrefixHeader.Height = new GridLength(0, GridUnitType.Pixel);                POPrefixContent.Height = new GridLength(0, GridUnitType.Pixel);            }            if (!hasLocal)            {                LocalHeader.Height = new GridLength(0, GridUnitType.Pixel);                LocalSelectionRow.Height = new GridLength(0, GridUnitType.Pixel);            }            else            {                var servers = GetLocalServerConfiguration().LoadAll();                LocalServerName.Items.Clear();                _servers = servers                    .Select(x => x.Value.CreateServer(x.Key))                    .Where(x => x.Type == ServerType.Database)                    .ToDictionary(x => x.Key, x => x);                LocalServerName.ItemsSource = _servers;                LocalServerName.DisplayMemberPath = "Value";            }            if (!debug && !hasLocal)            {                NetworkHeader.Height = new GridLength(0, GridUnitType.Pixel);                NetworkPath.SetValue(Grid.ColumnProperty, 0);                NetworkPath.SetValue(Grid.ColumnSpanProperty, 2);            }            AddProfile.Background = new ImageBrush(PRSDesktop.Resources.add.AsBitmapImage());            DeleteProfile.Background = new ImageBrush(PRSDesktop.Resources.delete.AsBitmapImage());            _settings = new LocalConfiguration<DatabaseSettings>().LoadAll();        }        public override void OnApplyTemplate()        {            base.OnApplyTemplate();            Setup();            bLoading = false;        }        //private String GetVersion()        //{        //    String curfile = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "version.txt");        //    //MessageBox.Show(curfile);        //    if (System.IO.File.Exists(curfile))        //        return System.IO.File.ReadAllText(curfile);        //    return "???";        //}        private LocalConfiguration<ServerSettings> GetLocalServerConfiguration(string? section = null)        {            return new LocalConfiguration<ServerSettings>(CoreUtils.GetCommonAppData("PRSServer"), section ?? "");        }        private bool HasLocalServer()        {            var configuration = GetLocalServerConfiguration();            return File.Exists(configuration.GetFileName());        }        private void Setup()        {            Profiles.ItemsSource = new ObservableCollection<string>(_settings.Keys);            _current = _settings.Keys.FirstOrDefault();            Profiles.SelectedItem = _current;            ProfileName.Text = _current;            LoadSettings();            Profiles.Focus();        }        private void Profiles_SelectionChanged(object sender, SelectionChangedEventArgs e)        {            _current = Profiles.SelectedItem as string;            if (!bLoading)            {                bLoading = true;                ProfileName.Text = _current;                LoadSettings();                bLoading = false;            }            Focus();        }        private void AddProfile_MouseUp(object sender, MouseButtonEventArgs e)        {            var name = "PRS";            var i = 1;            while (_settings.ContainsKey(name))                name = string.Format("PRS ({0})", i++);            _settings[name] = new DatabaseSettings();            var options = Profiles.ItemsSource as ObservableCollection<string>;            options.Add(name);            Profiles.SelectedItem = name;        }        private void DeleteProfile_MouseUp(object sender, MouseButtonEventArgs e)        {            if (_settings.Keys.Count > 1)            {                if (ShortcutExists(_current))                    DeleteShortcut(_current);                _settings.Remove(_current);                var options = Profiles.ItemsSource as ObservableCollection<string>;                var index = options.IndexOf(_current);                options.RemoveAt(index);                Profiles.SelectedItem = options[Math.Min(index, Profiles.Items.Count - 1)];            }        }        private void LoadSettings()        {            if (_current == null || !_settings.ContainsKey(_current))                return;            bLoading = true;            var settings = _settings[_current];            if (ShortcutExists(_current))                CreateLink.Content = "Delete Link";            else                CreateLink.Content = "Create Link";            IsActiveCheck.IsChecked = settings.IsActive;            SplashSelect.Tag = settings.Logo;                        try            {                ColorScheme.SelectedColor = (System.Windows.Media.Color)ColorConverter.ConvertFromString(settings.ColorScheme);            }            catch            {                ColorScheme.SelectedColor = Colors.CornflowerBlue;            }                                    var debug = string.Equals(CoreUtils.GetVersion(), "???");            var hasLocal = HasLocalServer();            var databaseType = settings.DatabaseType;            if (!debug && databaseType == DatabaseType.Standalone)                 databaseType = DatabaseType.Networked;            if (!hasLocal && databaseType == DatabaseType.Local)                 databaseType = DatabaseType.Local;                        StandaloneOption.IsChecked = databaseType == DatabaseType.Standalone;            if (StandaloneOption.IsChecked == true)            {                DBLocation.Text = settings.FileName;                ServerURLs.Text = "";                Protocol.SelectedIndex = -1;                LocalServerName.SelectedItem = null;            }            NetworkOption.IsChecked = databaseType == DatabaseType.Networked;            if (NetworkOption.IsChecked == true)            {                DBLocation.Text = "";                ServerURLs.Text = String.Join(";",settings.URLs);                var prot = Math.Max(0, Math.Min((int)settings.Protocol, Protocol.Items.Count - 1));                Protocol.SelectedIndex = prot;                LocalServerName.SelectedItem = null;            }            LocalOption.IsChecked = databaseType == DatabaseType.Local;            if (LocalOption.IsChecked == true)            {                DBLocation.Text = "";                ServerURLs.Text = "";                Protocol.SelectedIndex = -1;                LocalServerName.SelectedItem = _servers.Where(x => x.Key == settings.LocalServerName).FirstOrDefault();            }                        SelectOption(databaseType);            LoginType.SelectedIndex = (int)settings.LoginType;            SelectLogin(settings.LoginType);            UserID.Text = settings.LoginType == Comal.Classes.LoginType.UserID ? settings.UserID : "";            Password.Password = settings.LoginType == Comal.Classes.LoginType.UserID ? settings.Password : "";            AutoLogin.IsChecked = settings.LoginType == Comal.Classes.LoginType.UserID ? settings.Autologin : false;                        //UpdateType.SelectedIndex = settings.UpdateType == AutoUpdateType.Url ? 0 : 1;            //UpdateLocation.Text = settings.UpdateLocation;            //UpdateAdmin.SelectedIndex = settings.UpdateAdmin ? 0 : 1;            //UpdateChannel.SelectedIndex = settings.UpdateChannel == Comal.Classes.AutoUpdateChannel.Stable ? 0 : 1;            LibraryLocation.Text = settings.LibraryLocation;            GoogleAPIKey.Text = settings.GoogleAPIKey;            JobPrefix.Text = settings.JobPrefix;            PurchaseorderPrefix.Text = settings.PurchaseOrderPrefix;            bLoading = false;        }        private static string MakeValidFileName(string name)        {            var invalidChars = Regex.Escape(new string(Path.GetInvalidFileNameChars()));            var invalidRegStr = string.Format(@"([{0}]*\.+$)|([{0}]+)", invalidChars);            return Regex.Replace(name, invalidRegStr, "_");        }        private bool ShortcutExists(string profile)        {            var filename = Path.Combine(                Environment.GetFolderPath(Environment.SpecialFolder.Desktop),                string.Format("{0}.lnk", MakeValidFileName(profile))            );            return File.Exists(filename);        }        private void DeleteShortcut(string profile)        {            var filename = Path.Combine(                Environment.GetFolderPath(Environment.SpecialFolder.Desktop),                string.Format("{0}.lnk", MakeValidFileName(profile))            );            if (File.Exists(filename))                File.Delete(filename);        }        private void CreateShortcut(string profile)        {            string filename = Path.Combine(                Environment.GetFolderPath(Environment.SpecialFolder.Desktop),                String.Format("{0}.lnk", MakeValidFileName(profile))            );                        if (System.IO.File.Exists(filename))                return;                          using var shortcut = new WindowsShortcut            {                Path = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName,                Arguments = String.Format("/profile=\"{0}\"", profile),                Description = String.Format("PRS - {0}",profile)            };            shortcut.Save(filename);                        //MessageBox.Show("Not Yet Implemented in .NET6!");            // string filename = Path.Combine(            //     Environment.GetFolderPath(Environment.SpecialFolder.Desktop),            //     String.Format("{0}.lnk", MakeValidFileName(profile))            // );            //            // if (System.IO.File.Exists(filename))            //     return;            //            // WshShell shell = new WshShell();            //            // IWshShortcut shortcut = (IWshShortcut)shell.CreateShortcut(filename);            // shortcut.Description = String.Format("PRS - {0}",profile);            // shortcut.TargetPath = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;            // shortcut.Arguments = String.Format("/profile=\"{0}\"", profile);            // shortcut.Save();        }        private void UnloadSettings()        {            if (bLoading)                return;            if (!_settings.ContainsKey(_current))                return;            var settings = _settings[_current];            settings.IsActive = IsActiveCheck.IsChecked == true;            settings.Logo = (byte[])SplashSelect.Tag;            settings.ColorScheme = ColorScheme.SelectedColor.ToString();            settings.DatabaseType = StandaloneOption.IsChecked == true ? DatabaseType.Standalone :                NetworkOption.IsChecked == true ? DatabaseType.Networked :                LocalOption.IsChecked == true ? DatabaseType.Local :                DatabaseType.Networked;            settings.FileName = DBLocation.Text;            settings.URLs = ServerURLs.Text.Split(';');            settings.Protocol = (SerializerProtocol)Protocol.SelectedIndex;            settings.LocalServerName = LocalServerName.SelectedItem != null ? ((KeyValuePair<string, Server>)LocalServerName.SelectedItem).Key : "";            settings.LoginType = (LoginType)LoginType.SelectedIndex;            settings.Autologin = settings.LoginType == Comal.Classes.LoginType.UserID ? AutoLogin.IsChecked == true : false;            settings.UserID = settings.LoginType == Comal.Classes.LoginType.UserID ? UserID.Text : "";            settings.Password = settings.LoginType == Comal.Classes.LoginType.UserID ? Password.Password : "";            //settings.UpdateType = UpdateType.SelectedIndex == 0 ? AutoUpdateType.Url : AutoUpdateType.File;            //settings.UpdateLocation = UpdateLocation.Text;            //settings.UpdateAdmin = UpdateAdmin.SelectedIndex < 1;            //settings.UpdateChannel = UpdateChannel.SelectedIndex < 1 ? Comal.Classes.AutoUpdateChannel.Stable : Comal.Classes.AutoUpdateChannel.PreRelease;            settings.LibraryLocation = LibraryLocation.Text;            settings.Provider = DatabaseProvider.SQLite;            settings.GoogleAPIKey = GoogleAPIKey.Text;            settings.JobPrefix = JobPrefix.Text;            settings.PurchaseOrderPrefix = PurchaseorderPrefix.Text;        }        private void ProfileName_TextChanged(object sender, TextChangedEventArgs e)        {            if (bLoading)                return;            bLoading = true;            var defset = _settings[_current];            _settings.Remove(_current);            _settings[ProfileName.Text] = defset;            var options = Profiles.ItemsSource as ObservableCollection<string>;            var cur = options.IndexOf(_current);            options[cur] = ProfileName.Text;            if (_current != null && ShortcutExists(_current))            {                DeleteShortcut(_current);                CreateShortcut(ProfileName.Text);            }            _current = ProfileName.Text;            bLoading = false;        }        #region DatabaseSettings        private void SelectOption(DatabaseType databaseType)        {            DBLocation.IsEnabled = databaseType == DatabaseType.Standalone; // && (DbProvider.SelectedIndex == 1);            DBButton.IsEnabled = databaseType == DatabaseType.Standalone; // && (DbProvider.SelectedIndex != 1);            ColorScheme.IsEnabled = databaseType == DatabaseType.Standalone;            SplashView.IsEnabled = databaseType == DatabaseType.Standalone;            SplashSelect.IsEnabled = databaseType == DatabaseType.Standalone;            ServerURLs.IsEnabled = databaseType == DatabaseType.Networked;            Protocol.IsEnabled = databaseType == DatabaseType.Networked;            LocalServerName.IsEnabled = databaseType == DatabaseType.Local;        }        private void DBButton_Click(object sender, RoutedEventArgs e)        {            using (var sfd = new SaveFileDialog())            {                //var provider = (DatabaseProvider)DbProvider.SelectedIndex;                //if (provider == DatabaseProvider.SQLite)                //{                sfd.Filter = "SQLite Database Files (*.dbs)|*.dbs";                sfd.DefaultExt = "dbs";                //}                //else                //{                //    ofd.Filter = "LiteDB Database Files (*.db; *.dbl)|*.db;*.dbl";                //    ofd.DefaultExt = "dbl";                //}                sfd.InitialDirectory = Path.GetDirectoryName(DBLocation.Text);                sfd.FileName = Path.GetFileName(DBLocation.Text);                sfd.CheckFileExists = false;                var result = sfd.ShowDialog();                if (result == System.Windows.Forms.DialogResult.OK && !string.IsNullOrWhiteSpace(sfd.FileName))                {                    DBLocation.Text = sfd.FileName;                    UnloadSettings();                }            }        }        private void Option_Checked(object sender, RoutedEventArgs e)        {            var databaseType = sender == StandaloneOption ? DatabaseType.Standalone :                sender == NetworkOption ? DatabaseType.Networked :                DatabaseType.Local;            SelectOption(databaseType);            UnloadSettings();        }        private void StandaloneLabel_Click(object sender, MouseButtonEventArgs e)        {            StandaloneOption.IsChecked = true;        }        private void NetworkLabel_Click(object sender, MouseButtonEventArgs e)        {            NetworkOption.IsChecked = true;        }        private void LocalLabel_Click(object sender, MouseButtonEventArgs e)        {            LocalOption.IsChecked = true;        }        private void LocalServerName_SelectionChanged(object sender, SelectionChangedEventArgs e)        {            UnloadSettings();        }        private void ServerPort_TextChanged(object sender, TextChangedEventArgs e)        {            UnloadSettings();        }        private void ServerURL_TextChanged(object sender, TextChangedEventArgs e)        {            UnloadSettings();        }        private void Protocol_SelectionChanged(object sender, SelectionChangedEventArgs e)        {            UnloadSettings();        }        #endregion        private void SelectLogin(LoginType Login)        {            UserID.IsEnabled = Login == Comal.Classes.LoginType.UserID;            Password.IsEnabled = Login == Comal.Classes.LoginType.UserID;            AutoLogin.IsEnabled = Login == Comal.Classes.LoginType.UserID;        }        //private void UpdateButton_Click(object sender, RoutedEventArgs e)        //{        //    if (UpdateType.SelectedIndex != 1)        //        return;        //    using (var ofd = new OpenFileDialog())        //    {        //        ofd.Filter = "Executable Files (*.exe)|*.exe";        //        ofd.InitialDirectory = !String.IsNullOrEmpty(UpdateLocation.Text) ? Path.GetDirectoryName(UpdateLocation.Text) : "";        //        ofd.FileName = UpdateLocation.Text;        //        ofd.Multiselect = false;        //        ofd.CheckFileExists = false;        //        DialogResult result = ofd.ShowDialog();        //        if ((result == System.Windows.Forms.DialogResult.OK) && (!string.IsNullOrWhiteSpace(ofd.FileName)))        //        {        //            UpdateLocation.Text = ofd.FileName;        //            UnloadSettings();        //        }        //    }        //}        private void AutoDiscover_Click(object sender, RoutedEventArgs e)        {            Progress.Show("Looking for available Servers...");            try            {                var Client = new UdpClient();                Client.Client.SendTimeout = 10000;                Client.Client.ReceiveTimeout = 20000;                var RequestData = Encoding.ASCII.GetBytes("");                var ServerEp = new IPEndPoint(IPAddress.Any, 0);                Client.EnableBroadcast = true;                Client.Send(RequestData, RequestData.Length, new IPEndPoint(IPAddress.Broadcast, 8888));                Progress.SetMessage("Scanning local network...");                var ServerResponseData = Client.Receive(ref ServerEp);                var ServerResponse = Encoding.ASCII.GetString(ServerResponseData);                var autodiscover = Serialization.Deserialize<AutoDiscoverySettings>(ServerResponse);                ProfileName.Text = autodiscover.Name;                IsActiveCheck.IsChecked = true;                SplashSelect.Tag = autodiscover.Logo;                StandaloneOption.IsChecked = false;                DBLocation.Text = "";                NetworkOption.IsChecked = true;                Protocol.SelectedIndex = Math.Max(0, Math.Min((int)autodiscover.Protocol, Protocol.Items.Count - 1));                ServerURLs.Text = String.Join(";",autodiscover.URLs);                //UpdateType.SelectedIndex = autodiscover.UpdateType == AutoUpdateType.Url ? 0 : 1;                //UpdateLocation.Text = autodiscover.UpdateLocation;                //UpdateAdmin.SelectedIndex = autodiscover.UpdateAdmin ? 0 : 1;                //UpdateChannel.SelectedIndex = autodiscover.UpdateChannel == Comal.Classes.AutoUpdateChannel.Stable ? 0 : 1;                LibraryLocation.Text = autodiscover.LibraryLocation;                GoogleAPIKey.Text = autodiscover.GoogleAPIKey;                Client.Close();                Progress.Close();                MessageBox.Show(String.Format("Server found at {0}", String.Join(";",autodiscover.URLs)));                UnloadSettings();            }            catch (Exception err)            {                Progress.Close();                MessageBox.Show("No Server Found!");            }        }        private void LoginType_SelectionChanged(object sender, SelectionChangedEventArgs e)        {            SelectLogin((LoginType)LoginType.SelectedIndex);            UnloadSettings();        }        private void LibraryButton_Click(object sender, RoutedEventArgs e)        {            using (var ofd = new FolderBrowserDialog())            {                if (Directory.Exists(LibraryLocation.Text))                    ofd.SelectedPath = LibraryLocation.Text;                var result = ofd.ShowDialog();                if (result == System.Windows.Forms.DialogResult.OK && !string.IsNullOrWhiteSpace(ofd.SelectedPath))                {                    LibraryLocation.Text = ofd.SelectedPath;                    UnloadSettings();                }            }        }        //private void UpdateType_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)        //{        //    UpdateButton.Visibility = UpdateType.SelectedIndex == 1 ? Visibility.Visible : Visibility.Collapsed;        //    UnloadSettings();        //}        //private void UpdateAdmin_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)        //{        //    UnloadSettings();        //}        //private void UpdateChannel_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)        //{        //    UnloadSettings();        //}        private void IsActive_Checked(object sender, RoutedEventArgs e)        {            UnloadSettings();        }        private void UserID_TextChanged(object sender, TextChangedEventArgs e)        {            UnloadSettings();        }        private void Password_KeyUp(object sender, KeyEventArgs e)        {            UnloadSettings();        }        private void AutoLogin_Checked(object sender, RoutedEventArgs e)        {            UnloadSettings();        }        //private void UpdateLocation_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)        //{        //    UnloadSettings();        //}        private void LibraryLocation_TextChanged(object sender, TextChangedEventArgs e)        {            UnloadSettings();        }        private void UpdateAdmin_Checked(object sender, RoutedEventArgs e)        {            UnloadSettings();        }        private void GoogleAPIKey_TextChanged(object sender, TextChangedEventArgs e)        {            UnloadSettings();        }        private void JobPrefix_TextChanged(object sender, TextChangedEventArgs e)        {            UnloadSettings();        }        private void PurchaseOrderPrefix_TextChanged(object sender, TextChangedEventArgs e)        {            UnloadSettings();        }                private void ColorScheme_OnSelectedColorChanged(object sender, RoutedPropertyChangedEventArgs<Color?> e)        {            UnloadSettings();        }        private void SplashSelect_Click(object sender, RoutedEventArgs e)        {            using (var ofd = new OpenFileDialog())            {                ofd.Filter = "Image Files (*.bmp; *.jpg; *.jpeg; *.png)|*.bmp;*.jpg;*.jpeg;*.png";                ofd.DefaultExt = "png";                ofd.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);                ofd.Multiselect = false;                ofd.CheckFileExists = true;                var result = ofd.ShowDialog();                if (result == System.Windows.Forms.DialogResult.OK && !string.IsNullOrWhiteSpace(ofd.FileName))                {                    var image = System.Drawing.Image.FromFile(ofd.FileName);                    var size = image.Size.Adjust(450, 450);                    image = new Bitmap(image, size);                    SplashSelect.Tag = new ImageConverter().ConvertTo(image, typeof(byte[]));                    UnloadSettings();                }            }        }        private void SplashView_Click(object sender, RoutedEventArgs e)        {            var data = SplashSelect.Tag != null ? (byte[])SplashSelect.Tag : null;            if (data == null || !data.Any())                return;            var type = ImageUtils.GetImageType(data);            var file = Path.ChangeExtension(Path.GetTempFileName(), type.ToString());            File.WriteAllBytes(file, data);            var gsProcessInfo = new ProcessStartInfo();            gsProcessInfo.Verb = "open";            gsProcessInfo.WindowStyle = ProcessWindowStyle.Normal;            gsProcessInfo.FileName = file;            gsProcessInfo.UseShellExecute = true;            Process.Start(gsProcessInfo);        }        private void CreateLink_Click(object sender, RoutedEventArgs e)        {            var button = sender as Button;            var action = button.Content as string;            if (string.Equals("Delete Link", action))            {                DeleteShortcut(_current);                button.Content = "Create Link";            }            else            {                CreateShortcut(_current);                button.Content = "Delete Link";            }        }        private void OKButton_Click(object sender, RoutedEventArgs e)        {            // Delete All             var olds = new LocalConfiguration<DatabaseSettings>().Sections();            foreach (var old in olds)                new LocalConfiguration<DatabaseSettings>(old).Delete();            foreach (var key in _settings.Keys)                new LocalConfiguration<DatabaseSettings>(key).Save(_settings[key]);            DialogResult = true;            Close();        }        private void CancelButton_Click(object sender, RoutedEventArgs e)        {            DialogResult = false;            Close();        }        private void Export_Click(object sender, RoutedEventArgs e)        {            using (var sfd = new SaveFileDialog())            {                sfd.Filter = "Settings Files (*.settings)|*.settings";                sfd.DefaultExt = "settings";                sfd.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);                var result = sfd.ShowDialog();                if (result == System.Windows.Forms.DialogResult.OK && !string.IsNullOrWhiteSpace(sfd.FileName))                {                    var json = Serialization.Serialize(_settings);                    File.WriteAllText(sfd.FileName, json);                    MessageBox.Show("Settings exported!");                }            }        }        private void Import_Click(object sender, RoutedEventArgs e)        {            using (var ofd = new OpenFileDialog())            {                ofd.Filter = "Settings Files (*.settings)|*.settings";                ofd.DefaultExt = "settings";                ofd.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);                ofd.Multiselect = false;                ofd.CheckFileExists = true;                var result = ofd.ShowDialog();                if (result == System.Windows.Forms.DialogResult.OK && !string.IsNullOrWhiteSpace(ofd.FileName))                {                    var json = File.ReadAllText(ofd.FileName);                    _settings = Serialization.Deserialize<Dictionary<string, DatabaseSettings>>(json);                    Setup();                }            }        }        private void AutoUpdate_Click(object sender, RoutedEventArgs e)        {            var editable = App.AutoUpdateSettings.ToEditable();            var buttons = new DynamicEditorButtons()            {                new DynamicEditorButton(                    "",                    PRSDesktop.Resources.help.AsBitmapImage(),                    null,                    (o, e) => ShowHelp("Automatic_Updates"))            };            var propertyEditor = new DynamicEditorForm(typeof(EditableAutoUpdateSettings), null, buttons);            propertyEditor.OnDefineLookups += editor =>            {                var values = (editor.EditorDefinition as ILookupEditor).Values(editor.ColumnName);                editor.LoadLookups(values);            };            propertyEditor.OnDefineEditor += PropertyEditor_OnDefineEditor;            propertyEditor.Items = new BaseObject[] { editable };            if (propertyEditor.ShowDialog() == true)            {                App.AutoUpdateSettings.FromEditable(editable);                new LocalConfiguration<AutoUpdateSettings>().Save(App.AutoUpdateSettings);            }        }        private BaseEditor? PropertyEditor_OnDefineEditor(object item, DynamicGridColumn column)        {            if (!string.Equals(column.ColumnName, "Elevated"))                return new NullEditor();            return null;        }        private void ShowHelp(string slug)        {            Process.Start(new ProcessStartInfo("https://prsdigital.com.au/wiki/index.php/" + slug) { UseShellExecute = true });        }        private void ShowHelp_OnClick(object sender, RoutedEventArgs e)        {            ShowHelp("Database_Configuration");        }            }}
 |